Google Analytics - Version 2.1.2

Version Description

  • Fixed authentication error issue experienced by some users.
  • Added re-authentication button for easier changing or relinking of Google Analytics accounts.
  • Added Send Debug button for faster technical troubleshooting.
  • Added refresh button for Google Analytics within dashboard.
  • Included new alert for missing Google Analytics account.
  • Included new alert for unsupported PHP version.
Download this release

Release Info

Developer ShareThis
Plugin Icon wp plugin Google Analytics
Version 2.1.2
Comparing to
See all releases

Code changes from version 2.1 to 2.1.2

class/Ga_Admin.php CHANGED
@@ -23,7 +23,7 @@ class Ga_Admin {
23
  const NOTICE_ERROR = 'error';
24
  const GA_SHARETHIS_API_ALIAS = 'sharethis';
25
  const GA_DISABLE_ALL_FEATURES = 'googleanalytics_disable_all_features';
26
- const GA_HEARTBEAT_API_CACHE_UPDATE = true;
27
 
28
  /**
29
  * Instantiate API client.
@@ -82,6 +82,7 @@ class Ga_Admin {
82
  delete_option( self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME );
83
  delete_option( self::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME );
84
  delete_option( self::GA_DISABLE_ALL_FEATURES );
 
85
  Ga_Cache::delete_cache_options();
86
  }
87
 
@@ -254,7 +255,9 @@ class Ga_Admin {
254
  if ( !Ga_Helper::is_wp_version_valid() || !Ga_Helper::is_php_version_valid() ) {
255
  return false;
256
  }
257
-
 
 
258
  /**
259
  * Keeps data to be extracted as variables in the view.
260
  *
@@ -285,9 +288,12 @@ class Ga_Admin {
285
 
286
  if ( Ga_Helper::is_authorized() ) {
287
  $data[ 'ga_accounts_selector' ] = self::get_accounts_selector();
 
288
  } else {
289
  $data[ 'popup_url' ] = self::get_auth_popup_url();
 
290
  }
 
291
  if ( !empty( $_GET[ 'err' ] ) ) {
292
  switch ( $_GET[ 'err' ] ) {
293
  case 1:
@@ -320,9 +326,12 @@ class Ga_Admin {
320
  */
321
  public static function get_accounts_selector() {
322
  $selected = Ga_Helper::get_selected_account_data();
323
-
 
 
 
324
  return Ga_View_Core::load( 'ga_accounts_selector', array(
325
- 'selector' => json_decode( get_option( self::GA_ACCOUNT_DATA_OPTION_NAME ), true ),
326
  'selected' => $selected ? implode( "_", $selected ) : null,
327
  'add_manually_enabled' => Ga_Helper::is_code_manually_enabled() || Ga_Helper::is_all_feature_disabled()
328
  ), true );
@@ -332,7 +341,7 @@ class Ga_Admin {
332
  * Adds JS scripts for the settings page.
333
  */
334
  public static function enqueue_ga_scripts() {
335
- wp_register_script( GA_NAME . '-page-js', GA_PLUGIN_URL . '/js/' . GA_NAME . '_page.js', array(
336
  'jquery'
337
  ) );
338
  wp_enqueue_script( GA_NAME . '-page-js' );
@@ -342,15 +351,15 @@ class Ga_Admin {
342
  * Adds CSS plugin's scripts.
343
  */
344
  public static function enqueue_ga_css() {
345
- wp_register_style( GA_NAME . '-css', GA_PLUGIN_URL . '/css/' . GA_NAME . '.css', false, null, 'all' );
346
- wp_register_style( GA_NAME . '-additional-css', GA_PLUGIN_URL . '/css/ga_additional.css', false, null, 'all' );
347
  wp_enqueue_style( GA_NAME . '-css' );
348
  wp_enqueue_style( GA_NAME . '-additional-css' );
349
  if ( Ga_Helper::is_wp_old() ) {
350
- wp_register_style( GA_NAME . '-old-wp-support-css', GA_PLUGIN_URL . '/css/ga_old_wp_support.css', false, null, 'all' );
351
  wp_enqueue_style( GA_NAME . '-old-wp-support-css' );
352
  }
353
- wp_register_style( GA_NAME . '-modal-css', GA_PLUGIN_URL . '/css/ga_modal.css', false, null, 'all' );
354
  wp_enqueue_style( GA_NAME . '-modal-css' );
355
  }
356
 
@@ -358,9 +367,9 @@ class Ga_Admin {
358
  * Enqueues dashboard JS scripts.
359
  */
360
  private static function enqueue_dashboard_scripts() {
361
- wp_register_script( GA_NAME . '-dashboard-js', GA_PLUGIN_URL . '/js/' . GA_NAME . '_dashboard.js', array(
362
  'jquery'
363
- ) );
364
  wp_enqueue_script( GA_NAME . '-dashboard-js' );
365
  }
366
 
@@ -369,9 +378,9 @@ class Ga_Admin {
369
  */
370
  public static function enqueue_scripts() {
371
  if ( Ga_Helper::is_dashboard_page() || Ga_Helper::is_plugin_page() ) {
372
- wp_register_script( GA_NAME . '-js', GA_PLUGIN_URL . '/js/' . GA_NAME . '.js', array(
373
  'jquery'
374
- ) );
375
  wp_enqueue_script( GA_NAME . '-js' );
376
 
377
  wp_register_script( 'googlecharts', 'https://www.gstatic.com/charts/loader.js', null, null, false );
@@ -478,7 +487,7 @@ class Ga_Admin {
478
  add_action( 'wp_ajax_ga_ajax_data_change', 'Ga_Admin::ga_ajax_data_change' );
479
  add_action( 'admin_notices', 'Ga_Admin::admin_notice_googleanalytics' );
480
  add_action( 'heartbeat_tick', 'Ga_Admin::run_heartbeat_jobs' );
481
-
482
  if ( !get_option( self::GA_SHARETHIS_TERMS_OPTION_NAME ) && !get_option( self::GA_HIDE_TERMS_OPTION_NAME ) ) {
483
  add_action( 'wp_ajax_googleanalytics_hide_terms', 'Ga_Admin::admin_notice_hide_googleanalytics' );
484
  }
@@ -496,9 +505,9 @@ class Ga_Admin {
496
  self::api_client()->set_disable_cache( true );
497
 
498
  // Try to regenerate cache if needed
499
- self::generate_stats_data();
 
500
  }
501
- }
502
 
503
  /**
504
  * Adds plugin's filters
@@ -528,7 +537,7 @@ class Ga_Admin {
528
 
529
  $code = Ga_Helper::get_option( self::GA_OAUTH_AUTH_CODE_OPTION_NAME );
530
 
531
- if ( !Ga_Helper::is_authorized() && !empty( $code ) ) {
532
  Ga_Helper::update_option( self::GA_OAUTH_AUTH_CODE_OPTION_NAME, "" );
533
 
534
  // Get access token
@@ -541,10 +550,10 @@ class Ga_Admin {
541
  $param = '&err=1';
542
  } else {
543
  self::api_client()->set_access_token( $response->getData() );
544
-
545
  // Get accounts data
546
  $account_summaries = self::api_client()->call( 'ga_api_account_summaries' );
547
  self::save_ga_account_summaries( $account_summaries->getData() );
 
548
  }
549
 
550
  wp_redirect( admin_url( Ga_Helper::GA_SETTINGS_PAGE_URL . $param ) );
@@ -611,9 +620,11 @@ class Ga_Admin {
611
  }
612
 
613
  update_option( self::GA_ACCOUNT_DATA_OPTION_NAME, wp_json_encode( $return ) );
614
- update_option( self::GA_WEB_PROPERTY_ID_OPTION_NAME, "" );
615
  }
616
-
 
 
 
617
  return $return;
618
  }
619
 
@@ -621,12 +632,16 @@ class Ga_Admin {
621
  * Handle AJAX data for the GA dashboard widget.
622
  */
623
  public static function ga_ajax_data_change() {
624
- $date_range = !empty( $_POST[ 'date_range' ] ) ? $_POST[ 'date_range' ] : null;
625
- $metric = !empty( $_POST[ 'metric' ] ) ? $_POST[ 'metric' ] : null;
626
- echo Ga_Helper::get_ga_dashboard_widget_data_json( $date_range, $metric, false, true );
 
 
 
 
627
  wp_die();
628
  }
629
-
630
  /**
631
  * Displays API error messages.
632
  */
@@ -670,5 +685,29 @@ class Ga_Admin {
670
 
671
  return array( $chart, $boxes, $labels, $sources );
672
  }
 
 
 
 
 
 
673
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
674
  }
23
  const NOTICE_ERROR = 'error';
24
  const GA_SHARETHIS_API_ALIAS = 'sharethis';
25
  const GA_DISABLE_ALL_FEATURES = 'googleanalytics_disable_all_features';
26
+ const GA_HEARTBEAT_API_CACHE_UPDATE = false;
27
 
28
  /**
29
  * Instantiate API client.
82
  delete_option( self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME );
83
  delete_option( self::GA_WEB_PROPERTY_ID_MANUALLY_VALUE_OPTION_NAME );
84
  delete_option( self::GA_DISABLE_ALL_FEATURES );
85
+ delete_option( Ga_SupportLogger::LOG_OPTION );
86
  Ga_Cache::delete_cache_options();
87
  }
88
 
255
  if ( !Ga_Helper::is_wp_version_valid() || !Ga_Helper::is_php_version_valid() ) {
256
  return false;
257
  }
258
+ if ( Ga_Helper::are_features_enabled() && Ga_Helper::is_curl_disabled() ) {
259
+ echo Ga_Helper::ga_wp_notice( _( 'Looks like cURL is not configured on your server. In order to authenticate your Google Analytics account and display statistics, cURL is required. Please contact your server administrator to enable it, or manually enter your Tracking ID.' ), self::NOTICE_WARNING );
260
+ }
261
  /**
262
  * Keeps data to be extracted as variables in the view.
263
  *
288
 
289
  if ( Ga_Helper::is_authorized() ) {
290
  $data[ 'ga_accounts_selector' ] = self::get_accounts_selector();
291
+ $data[ 'auth_button' ] = self::get_auth_button( 'Re-authenticate with Google' );
292
  } else {
293
  $data[ 'popup_url' ] = self::get_auth_popup_url();
294
+ $data[ 'auth_button' ] = self::get_auth_button( 'Authenticate with Google' );
295
  }
296
+ $data['debug_modal'] = self::get_debug_modal();
297
  if ( !empty( $_GET[ 'err' ] ) ) {
298
  switch ( $_GET[ 'err' ] ) {
299
  case 1:
326
  */
327
  public static function get_accounts_selector() {
328
  $selected = Ga_Helper::get_selected_account_data();
329
+ $selector = json_decode( get_option( self::GA_ACCOUNT_DATA_OPTION_NAME ), true );
330
+ if ( !Ga_Helper::is_code_manually_enabled() && empty( $selector ) ) {
331
+ echo Ga_Helper::ga_wp_notice( "Hi there! It seems like we weren't able to locate a Google Analytics account attached to your email account. Can you please register for Google Analytics and then deactivate and reactivate the plugin?", self::NOTICE_WARNING );
332
+ }
333
  return Ga_View_Core::load( 'ga_accounts_selector', array(
334
+ 'selector' => $selector,
335
  'selected' => $selected ? implode( "_", $selected ) : null,
336
  'add_manually_enabled' => Ga_Helper::is_code_manually_enabled() || Ga_Helper::is_all_feature_disabled()
337
  ), true );
341
  * Adds JS scripts for the settings page.
342
  */
343
  public static function enqueue_ga_scripts() {
344
+ wp_register_script( GA_NAME . '-page-js', Ga_Helper::get_plugin_url_with_correct_protocol() . '/js/' . GA_NAME . '_page.js', array(
345
  'jquery'
346
  ) );
347
  wp_enqueue_script( GA_NAME . '-page-js' );
351
  * Adds CSS plugin's scripts.
352
  */
353
  public static function enqueue_ga_css() {
354
+ wp_register_style( GA_NAME . '-css', Ga_Helper::get_plugin_url_with_correct_protocol() . '/css/' . GA_NAME . '.css', false, GOOGLEANALYTICS_VERSION, 'all' );
355
+ wp_register_style( GA_NAME . '-additional-css', Ga_Helper::get_plugin_url_with_correct_protocol(). '/css/ga_additional.css', false, GOOGLEANALYTICS_VERSION, 'all' );
356
  wp_enqueue_style( GA_NAME . '-css' );
357
  wp_enqueue_style( GA_NAME . '-additional-css' );
358
  if ( Ga_Helper::is_wp_old() ) {
359
+ wp_register_style( GA_NAME . '-old-wp-support-css', Ga_Helper::get_plugin_url_with_correct_protocol() . '/css/ga_old_wp_support.css', false, GOOGLEANALYTICS_VERSION, 'all' );
360
  wp_enqueue_style( GA_NAME . '-old-wp-support-css' );
361
  }
362
+ wp_register_style( GA_NAME . '-modal-css', Ga_Helper::get_plugin_url_with_correct_protocol() . '/css/ga_modal.css', false, GOOGLEANALYTICS_VERSION, 'all' );
363
  wp_enqueue_style( GA_NAME . '-modal-css' );
364
  }
365
 
367
  * Enqueues dashboard JS scripts.
368
  */
369
  private static function enqueue_dashboard_scripts() {
370
+ wp_register_script( GA_NAME . '-dashboard-js', Ga_Helper::get_plugin_url_with_correct_protocol() . '/js/' . GA_NAME . '_dashboard.js', array(
371
  'jquery'
372
+ ), GOOGLEANALYTICS_VERSION );
373
  wp_enqueue_script( GA_NAME . '-dashboard-js' );
374
  }
375
 
378
  */
379
  public static function enqueue_scripts() {
380
  if ( Ga_Helper::is_dashboard_page() || Ga_Helper::is_plugin_page() ) {
381
+ wp_register_script( GA_NAME . '-js', Ga_Helper::get_plugin_url_with_correct_protocol() . '/js/' . GA_NAME . '.js', array(
382
  'jquery'
383
+ ), GOOGLEANALYTICS_VERSION );
384
  wp_enqueue_script( GA_NAME . '-js' );
385
 
386
  wp_register_script( 'googlecharts', 'https://www.gstatic.com/charts/loader.js', null, null, false );
487
  add_action( 'wp_ajax_ga_ajax_data_change', 'Ga_Admin::ga_ajax_data_change' );
488
  add_action( 'admin_notices', 'Ga_Admin::admin_notice_googleanalytics' );
489
  add_action( 'heartbeat_tick', 'Ga_Admin::run_heartbeat_jobs' );
490
+ add_action( 'wp_ajax_googleanalytics_send_debug_email', 'Ga_SupportLogger::send_email' );
491
  if ( !get_option( self::GA_SHARETHIS_TERMS_OPTION_NAME ) && !get_option( self::GA_HIDE_TERMS_OPTION_NAME ) ) {
492
  add_action( 'wp_ajax_googleanalytics_hide_terms', 'Ga_Admin::admin_notice_hide_googleanalytics' );
493
  }
505
  self::api_client()->set_disable_cache( true );
506
 
507
  // Try to regenerate cache if needed
508
+ self::generate_stats_data();
509
+ }
510
  }
 
511
 
512
  /**
513
  * Adds plugin's filters
537
 
538
  $code = Ga_Helper::get_option( self::GA_OAUTH_AUTH_CODE_OPTION_NAME );
539
 
540
+ if ( !empty( $code ) ) {
541
  Ga_Helper::update_option( self::GA_OAUTH_AUTH_CODE_OPTION_NAME, "" );
542
 
543
  // Get access token
550
  $param = '&err=1';
551
  } else {
552
  self::api_client()->set_access_token( $response->getData() );
 
553
  // Get accounts data
554
  $account_summaries = self::api_client()->call( 'ga_api_account_summaries' );
555
  self::save_ga_account_summaries( $account_summaries->getData() );
556
+ update_option( self::GA_SELECTED_ACCOUNT, "" );
557
  }
558
 
559
  wp_redirect( admin_url( Ga_Helper::GA_SETTINGS_PAGE_URL . $param ) );
620
  }
621
 
622
  update_option( self::GA_ACCOUNT_DATA_OPTION_NAME, wp_json_encode( $return ) );
 
623
  }
624
+ else{
625
+ update_option( self::GA_ACCOUNT_DATA_OPTION_NAME, "" );
626
+ }
627
+ update_option( self::GA_WEB_PROPERTY_ID_OPTION_NAME, "" );
628
  return $return;
629
  }
630
 
632
  * Handle AJAX data for the GA dashboard widget.
633
  */
634
  public static function ga_ajax_data_change() {
635
+ if ( Ga_Admin_Controller::validate_ajax_data_change_post( $_POST ) ) {
636
+ $date_range = !empty( $_POST[ 'date_range' ] ) ? $_POST[ 'date_range' ] : null;
637
+ $metric = !empty( $_POST[ 'metric' ] ) ? $_POST[ 'metric' ] : null;
638
+ echo Ga_Helper::get_ga_dashboard_widget_data_json( $date_range, $metric, false, true );
639
+ } else {
640
+ echo wp_json_encode( array( 'error' => _( 'Invalid request.' ) ) );
641
+ }
642
  wp_die();
643
  }
644
+
645
  /**
646
  * Displays API error messages.
647
  */
685
 
686
  return array( $chart, $boxes, $labels, $sources );
687
  }
688
+ /**
689
+ * Returns auth or re-auth button
690
+ *
691
+ * @return string
692
+ */
693
+ public static function get_auth_button( $label ) {
694
 
695
+ return Ga_View_Core::load( 'ga_auth_button', array(
696
+ 'label' => $label,
697
+ 'url' => self::get_auth_popup_url(),
698
+ 'manually_id' => get_option( self::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME )
699
+ ), true );
700
+ }
701
+
702
+ /**
703
+ * Returns debug modal
704
+ *
705
+ * @return string
706
+ */
707
+ public static function get_debug_modal( ) {
708
+
709
+ return Ga_View_Core::load( 'ga_debug_modal', array(
710
+ 'debug_info' => Ga_SupportLogger::$debug_info
711
+ ), true );
712
+ }
713
  }
class/Ga_Helper.php CHANGED
@@ -161,7 +161,7 @@ class Ga_Helper {
161
  * Dashboard widget hook.
162
  */
163
  public static function add_ga_dashboard_widget() {
164
- echo self::get_ga_dashboard_widget();
165
  }
166
 
167
  /**
@@ -173,24 +173,37 @@ class Ga_Helper {
173
  *
174
  * @return null | string HTML dashboard widget code.
175
  */
176
- public static function get_ga_dashboard_widget( $date_range = null, $text_mode = false, $ajax = false ) {
177
  if ( empty( $date_range ) ) {
178
  $date_range = '30daysAgo';
179
  }
180
 
181
- // Get chart and boxes data
182
- $data = self::get_dashboard_widget_data( $date_range );
 
183
 
184
- if ( $text_mode ) {
185
- return self::get_chart_page( 'ga_dashboard_widget' . ( $ajax ? "_ajax" : "" ), array(
186
- 'chart' => $data[ 'chart' ],
187
- 'boxes' => $data[ 'boxes' ]
188
- ) );
 
 
 
 
 
 
 
 
 
189
  } else {
190
  echo self::get_chart_page( 'ga_dashboard_widget' . ( $ajax ? "_ajax" : "" ), array(
191
- 'chart' => $data[ 'chart' ],
192
- 'boxes' => $data[ 'boxes' ],
193
- 'more_details_url' => admin_url( self::GA_STATISTICS_PAGE_URL )
 
 
 
194
  ) );
195
  }
196
 
@@ -485,6 +498,16 @@ class Ga_Helper {
485
  return $data;
486
  }
487
 
 
 
 
 
 
 
 
 
 
 
488
  /**
489
  * Create base64 url message
490
  *
@@ -561,5 +584,14 @@ class Ga_Helper {
561
 
562
  return ! empty( $account_id[0] ) ? $account_id[0] : '';
563
  }
 
 
 
 
564
 
 
 
 
 
 
565
  }
161
  * Dashboard widget hook.
162
  */
163
  public static function add_ga_dashboard_widget() {
164
+ echo self::get_ga_dashboard_widget( null, false, false, true );
165
  }
166
 
167
  /**
173
  *
174
  * @return null | string HTML dashboard widget code.
175
  */
176
+ public static function get_ga_dashboard_widget( $date_range = null, $text_mode = false, $ajax = false, $trigger_request = false ) {
177
  if ( empty( $date_range ) ) {
178
  $date_range = '30daysAgo';
179
  }
180
 
181
+ if ( !$trigger_request ) {
182
+ // Get chart and boxes data
183
+ $data = self::get_dashboard_widget_data( $date_range );
184
 
185
+ if ( $text_mode ) {
186
+ return self::get_chart_page( 'ga_dashboard_widget' . ( $ajax ? "_ajax" : "" ), array(
187
+ 'chart' => $data[ 'chart' ],
188
+ 'boxes' => $data[ 'boxes' ]
189
+ ) );
190
+ } else {
191
+ echo self::get_chart_page( 'ga_dashboard_widget' . ( $ajax ? "_ajax" : "" ), array(
192
+ 'chart' => $data[ 'chart' ],
193
+ 'boxes' => $data[ 'boxes' ],
194
+ 'more_details_url' => admin_url( self::GA_STATISTICS_PAGE_URL ),
195
+ 'ga_nonce' => wp_create_nonce( 'ga_ajax_data_change' ),
196
+ 'ga_nonce_name' => Ga_Admin_Controller::GA_NONCE_FIELD_NAME
197
+ ) );
198
+ }
199
  } else {
200
  echo self::get_chart_page( 'ga_dashboard_widget' . ( $ajax ? "_ajax" : "" ), array(
201
+ 'chart' => array(),
202
+ 'boxes' => Ga_Stats::get_empty_boxes_structure(),
203
+ 'more_details_url' => admin_url( self::GA_STATISTICS_PAGE_URL ),
204
+ 'show_trigger_button' => true,
205
+ 'ga_nonce' => wp_create_nonce( 'ga_ajax_data_change' ),
206
+ 'ga_nonce_name' => Ga_Admin_Controller::GA_NONCE_FIELD_NAME
207
  ) );
208
  }
209
 
498
  return $data;
499
  }
500
 
501
+ public static function get_url_message_text() {
502
+ $ga_msg = '';
503
+ $invite_result = json_decode( base64_decode( $_GET[ 'ga_msg' ] ), true );
504
+ if ( !empty( $invite_result[ 'status' ] ) && !empty( $invite_result[ 'message' ] ) ) {
505
+ $ga_msg = $invite_result[ 'message' ];
506
+ }
507
+
508
+ return $ga_msg;
509
+ }
510
+
511
  /**
512
  * Create base64 url message
513
  *
584
 
585
  return ! empty( $account_id[0] ) ? $account_id[0] : '';
586
  }
587
+
588
+ public static function is_curl_disabled(){
589
+ return ! function_exists( 'curl_version' );
590
+ }
591
 
592
+
593
+ public static function get_plugin_url_with_correct_protocol() {
594
+ $url = parse_url( GA_PLUGIN_URL );
595
+ return ( ( is_ssl() ) ? 'https://' : 'http://' ) . $url['host'] . $url['path'];
596
+ }
597
  }
class/Ga_Stats.php CHANGED
@@ -701,4 +701,34 @@ class Ga_Stats {
701
  }
702
  }
703
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
704
  }
701
  }
702
  }
703
 
704
+ public static function get_empty_boxes_structure() {
705
+ $boxes_data = array();
706
+ $boxes_data[ 'Sessions' ] = array(
707
+ 'label' => 'Visits',
708
+ 'value' => 0,
709
+ );
710
+ $boxes_data[ 'Pageviews' ] = array(
711
+ 'label' => 'Pageviews',
712
+ 'value' => 0,
713
+ );
714
+ $boxes_data[ 'pageviewsPerSession' ] = array(
715
+ 'label' => 'Pages / Visit',
716
+ 'value' => self::number_format_clean( 0, 2, '.', ',' ),
717
+ );
718
+ $boxes_data[ 'BounceRate' ] = array(
719
+ 'label' => 'Bounce Rate',
720
+ 'value' => self::number_format_clean( 0, 2, '.', ',' ) . '%',
721
+ );
722
+ $boxes_data[ 'avgTimeOnPage' ] = array(
723
+ 'label' => 'Avg. Time on Site',
724
+ 'value' => gmdate( "H:i:s", 0 ),
725
+ );
726
+ $boxes_data[ 'percentNewSessions' ] = array(
727
+ 'label' => '% of New Visits',
728
+ 'value' => self::number_format_clean( 0, 2, '.', ',' ),
729
+ );
730
+
731
+ return $boxes_data;
732
+ }
733
+
734
  }
class/controller/Ga_Admin_Controller.php CHANGED
@@ -29,8 +29,6 @@ class Ga_Admin_Controller extends Ga_Controller_Core {
29
  public static function ga_action_sharethis_invite() {
30
 
31
  if ( self::verify_nonce( self::ACTION_SHARETHIS_INVITE ) ) {
32
- $msg = Ga_Helper::create_url_msg( _( 'Invalid request.' ), Ga_Admin::NOTICE_ERROR );
33
- } else {
34
  $email = !empty( $_POST[ 'sharethis_invite_email' ] ) ? $_POST[ 'sharethis_invite_email' ] : null;
35
  $response = null;
36
  if ( !empty( $email ) ) {
@@ -55,6 +53,8 @@ class Ga_Admin_Controller extends Ga_Controller_Core {
55
  $msg = Ga_Helper::create_url_msg( _( 'An invite was sent to this email' ), Ga_Admin::NOTICE_SUCCESS );
56
  }
57
  }
 
 
58
  }
59
 
60
  wp_redirect( admin_url( Ga_Helper::create_url( Ga_Helper::GA_TRENDING_PAGE_URL, array( 'ga_msg' => $msg ) ) ) );
@@ -90,5 +90,30 @@ class Ga_Admin_Controller extends Ga_Controller_Core {
90
 
91
  wp_redirect( $url );
92
  }
 
 
 
 
 
 
 
 
 
 
 
 
93
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
  }
29
  public static function ga_action_sharethis_invite() {
30
 
31
  if ( self::verify_nonce( self::ACTION_SHARETHIS_INVITE ) ) {
 
 
32
  $email = !empty( $_POST[ 'sharethis_invite_email' ] ) ? $_POST[ 'sharethis_invite_email' ] : null;
33
  $response = null;
34
  if ( !empty( $email ) ) {
53
  $msg = Ga_Helper::create_url_msg( _( 'An invite was sent to this email' ), Ga_Admin::NOTICE_SUCCESS );
54
  }
55
  }
56
+ } else {
57
+ $msg = Ga_Helper::create_url_msg( _( 'Invalid request.' ), Ga_Admin::NOTICE_ERROR );
58
  }
59
 
60
  wp_redirect( admin_url( Ga_Helper::create_url( Ga_Helper::GA_TRENDING_PAGE_URL, array( 'ga_msg' => $msg ) ) ) );
90
 
91
  wp_redirect( $url );
92
  }
93
+
94
+ public static function validate_ajax_data_change_post( $post ) {
95
+ $error = 0;
96
+
97
+ if ( self::verify_nonce( 'ga_ajax_data_change' ) ) {
98
+ if ( !empty( $post[ 'date_range' ] ) ) {
99
+ if ( !is_string( $post[ 'date_range' ] ) ) {
100
+ $error ++;
101
+ }
102
+ } else {
103
+ $error ++;
104
+ }
105
 
106
+ if ( !empty( $post[ 'metric' ] ) ) {
107
+ if ( !is_string( $post[ 'metric' ] ) ) {
108
+ $error ++;
109
+ }
110
+ } else {
111
+ $error ++;
112
+ }
113
+ } else {
114
+ $error ++;
115
+ }
116
+
117
+ return $error == 0;
118
+ }
119
  }
class/core/Ga_Controller_Core.php CHANGED
@@ -35,6 +35,6 @@ class Ga_Controller_Core {
35
  * @return bool
36
  */
37
  protected static function verify_nonce( $action ) {
38
- return !isset( $_POST[ self::GA_NONCE_FIELD_NAME ] ) || !wp_verify_nonce( $_POST[ self::GA_NONCE_FIELD_NAME ], $action );
39
  }
40
  }
35
  * @return bool
36
  */
37
  protected static function verify_nonce( $action ) {
38
+ return isset( $_POST[ self::GA_NONCE_FIELD_NAME ] ) && wp_verify_nonce( $_POST[ self::GA_NONCE_FIELD_NAME ], $action );
39
  }
40
  }
css/ga_additional.css CHANGED
@@ -262,6 +262,13 @@
262
  border-radius: 4px;
263
  }
264
 
 
 
 
 
 
 
 
265
  .ga-alert-warning {
266
  color: #8a6d3b;
267
  background-color: #fcf8e3;
262
  border-radius: 4px;
263
  }
264
 
265
+ .ga-alert-success {
266
+ color: #3c763d;
267
+ background-color: #dff0d8;
268
+ border-color: #d6e9c6;
269
+ max-width: 95%;
270
+ }
271
+
272
  .ga-alert-warning {
273
  color: #8a6d3b;
274
  background-color: #fcf8e3;
css/googleanalytics.css CHANGED
@@ -239,4 +239,22 @@ label.ga_checkbox_label {
239
  font-size: 12pt;
240
  height: 65px;
241
  float: left;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
242
  }
239
  font-size: 12pt;
240
  height: 65px;
241
  float: left;
242
+ }
243
+
244
+ .ga-debug-form-div{
245
+ margin:5px;
246
+ }
247
+
248
+ .ga-debug-form-label {
249
+ vertical-align: top;
250
+ display: inline-block;
251
+ width: 20%;
252
+ }
253
+
254
+ .ga-debug-form-field {
255
+ width: 50%;
256
+ }
257
+
258
+ .ga-debug-form-loader {
259
+ width: 20%;
260
  }
googleanalytics.php CHANGED
@@ -4,7 +4,7 @@
4
  * Plugin Name: Google Analytics
5
  * Plugin URI: http://wordpress.org/extend/plugins/googleanalytics/
6
  * Description: Use Google Analytics on your Wordpress site without touching any code, and view visitor reports right in your Wordpress admin dashboard!
7
- * Version: 2.1
8
  * Author: ShareThis
9
  * Author URI: http://sharethis.com
10
  */
@@ -36,9 +36,20 @@ if ( !defined( 'GA_SHARETHIS_SCRIPTS_INCLUDED' ) ) {
36
  define( 'GA_SHARETHIS_SCRIPTS_INCLUDED', 0 );
37
  }
38
 
39
- define( 'GOOGLEANALYTICS_VERSION', '2.1' );
 
 
 
 
 
 
 
 
 
 
40
  include_once GA_PLUGIN_DIR . '/overwrite/ga_overwrite.php';
41
  include_once GA_PLUGIN_DIR . '/class/Ga_Autoloader.php';
 
42
  Ga_Autoloader::register();
43
  Ga_Hook::add_hooks( GA_MAIN_FILE_PATH );
44
 
4
  * Plugin Name: Google Analytics
5
  * Plugin URI: http://wordpress.org/extend/plugins/googleanalytics/
6
  * Description: Use Google Analytics on your Wordpress site without touching any code, and view visitor reports right in your Wordpress admin dashboard!
7
+ * Version: 2.1.2
8
  * Author: ShareThis
9
  * Author URI: http://sharethis.com
10
  */
36
  define( 'GA_SHARETHIS_SCRIPTS_INCLUDED', 0 );
37
  }
38
 
39
+ /**
40
+ * Prevent to launch the plugin within different plugin dir name
41
+ */
42
+ if ( !preg_match( '/(\/|\\\)' . GA_NAME . '(\/|\\\)/', realpath( __FILE__ ), $test ) ) {
43
+ echo _( 'Invalid plugin installation directory. Please verify if the plugin\'s dir name is equal to "' . GA_NAME . '".' );
44
+
45
+ // To make able the message above to be displayed in the activation error notice.
46
+ die();
47
+ }
48
+
49
+ define( 'GOOGLEANALYTICS_VERSION', '2.1.2' );
50
  include_once GA_PLUGIN_DIR . '/overwrite/ga_overwrite.php';
51
  include_once GA_PLUGIN_DIR . '/class/Ga_Autoloader.php';
52
+ include_once GA_PLUGIN_DIR . '/tools/class-support-logging.php';
53
  Ga_Autoloader::register();
54
  Ga_Hook::add_hooks( GA_MAIN_FILE_PATH );
55
 
js/googleanalytics_dashboard.js CHANGED
@@ -6,12 +6,16 @@
6
 
7
  ga_dashboard = {
8
  chartData: [],
9
- init: function (dataArr) {
10
- ga_loader.show();
 
 
11
  google.charts.load('current', {'packages': ['corechart']});
12
  google.charts.setOnLoadCallback(function () {
13
- ga_dashboard.drawChart(dataArr);
14
- ga_dashboard.setChartData(dataArr);
 
 
15
  });
16
  },
17
  events: function (data) {
@@ -23,29 +27,39 @@
23
 
24
  ga_loader.show();
25
 
 
 
 
 
 
 
26
  $.ajax({
27
  type: "post",
28
  dataType: "json",
29
  url: ajaxurl,
30
- data: {action: "ga_ajax_data_change", date_range: selected, metric: selected_metric},
31
  success: function (response) {
32
 
33
  ga_loader.hide();
34
 
35
- var dataT = [['Day', selected_name]];
36
- $.each(response.chart, function (k, v) {
37
- dataT.push([v.day, parseInt(v.current)]);
38
- });
 
 
 
39
 
40
- $.each(response.boxes, function (k, v) {
41
- $('#ga_box_dashboard_label_' + k).html(v.label)
42
- $('#ga_box_dashboard_value_' + k).html(v.value);
43
- });
44
 
45
- ga_dashboard.drawChart(dataT, selected_name);
46
 
47
- // Set new data
48
- ga_dashboard.setChartData(dataT);
 
49
  }
50
  });
51
  });
@@ -57,21 +71,77 @@
57
 
58
  ga_loader.show();
59
 
 
 
 
 
 
 
60
  $.ajax({
61
  type: "post",
62
  dataType: "json",
63
  url: ajaxurl,
64
- data: {action: "ga_ajax_data_change", metric: selected, date_range: selected_range},
65
  success: function (response) {
66
  ga_loader.hide();
67
- var dataT = [['Day', selected_name]];
68
- $.each(response.chart, function (k, v) {
69
- dataT.push([v.day, parseInt(v.current)]);
70
- });
71
- ga_dashboard.drawChart(dataT, selected_name);
72
-
73
- // Set new data
74
- ga_dashboard.setChartData(dataT);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  }
76
  });
77
  });
@@ -102,32 +172,36 @@
102
  title = 'Pageviews';
103
  }
104
 
105
- const data = google.visualization.arrayToDataTable(dataArr);
106
-
107
- const options = {
108
- /*title: title,*/
109
- legend: 'top',
110
- lineWidth: 2,
111
- chartArea: {
112
- left: 10,
113
- top: 60,
114
- bottom: 50,
115
- right: 10
116
-
117
- },
118
- width: '95%',
119
- height: 300,
120
- hAxis: {title: 'Day', titleTextStyle: {color: '#333'}, direction: 1},
121
- vAxis: {minValue: 0},
122
- pointSize: 5
123
- };
124
-
125
- var chart = new google.visualization.AreaChart(chart_dom_element);
126
- google.visualization.events.addListener(chart, 'ready', function () {
127
- ga_loader.hide();
128
- });
129
- chart.draw(data, options);
 
 
 
 
130
  }
131
  };
132
 
133
- })(jQuery);
6
 
7
  ga_dashboard = {
8
  chartData: [],
9
+ init: function (dataArr, showLoader) {
10
+ if (showLoader) {
11
+ ga_loader.show();
12
+ }
13
  google.charts.load('current', {'packages': ['corechart']});
14
  google.charts.setOnLoadCallback(function () {
15
+ if (dataArr) {
16
+ ga_dashboard.drawChart(dataArr);
17
+ ga_dashboard.setChartData(dataArr);
18
+ }
19
  });
20
  },
21
  events: function (data) {
27
 
28
  ga_loader.show();
29
 
30
+ var dataObj = {};
31
+ dataObj['action'] = "ga_ajax_data_change";
32
+ dataObj['date_range'] = selected;
33
+ dataObj['metric'] = selected_metric;
34
+ dataObj[GA_NONCE_FIELD] = GA_NONCE;
35
+
36
  $.ajax({
37
  type: "post",
38
  dataType: "json",
39
  url: ajaxurl,
40
+ data: dataObj,
41
  success: function (response) {
42
 
43
  ga_loader.hide();
44
 
45
+ if (typeof response.error !== "undefined") {
46
+ $('#ga_widget_error').show().html(response.error);
47
+ } else {
48
+ var dataT = [['Day', selected_name]];
49
+ $.each(response.chart, function (k, v) {
50
+ dataT.push([v.day, parseInt(v.current)]);
51
+ });
52
 
53
+ $.each(response.boxes, function (k, v) {
54
+ $('#ga_box_dashboard_label_' + k).html(v.label)
55
+ $('#ga_box_dashboard_value_' + k).html(v.value);
56
+ });
57
 
58
+ ga_dashboard.drawChart(dataT, selected_name);
59
 
60
+ // Set new data
61
+ ga_dashboard.setChartData(dataT);
62
+ }
63
  }
64
  });
65
  });
71
 
72
  ga_loader.show();
73
 
74
+ var dataObj = {};
75
+ dataObj['action'] = "ga_ajax_data_change";
76
+ dataObj['metric'] = selected;
77
+ dataObj['date_range'] = selected_range;
78
+ dataObj[GA_NONCE_FIELD] = GA_NONCE;
79
+
80
  $.ajax({
81
  type: "post",
82
  dataType: "json",
83
  url: ajaxurl,
84
+ data: dataObj,
85
  success: function (response) {
86
  ga_loader.hide();
87
+
88
+ if (typeof response.error !== "undefined") {
89
+ $('#ga_widget_error').show().html(response.error);
90
+ } else {
91
+ var dataT = [['Day', selected_name]];
92
+ $.each(response.chart, function (k, v) {
93
+ dataT.push([v.day, parseInt(v.current)]);
94
+ });
95
+
96
+ ga_dashboard.drawChart(dataT, selected_name);
97
+
98
+ // Set new data
99
+ ga_dashboard.setChartData(dataT);
100
+ }
101
+ }
102
+ });
103
+ });
104
+
105
+ $('#ga-widget-trigger').on('click', function () {
106
+ const selected_name = $('#metrics-selector option:selected').html();
107
+ const selected_metric = $('#metrics-selector option:selected').val() || null;
108
+ const selected_range = $('#range-selector option:selected').val() || null;
109
+
110
+ ga_loader.show();
111
+
112
+ var dataObj = {};
113
+ dataObj['action'] = "ga_ajax_data_change";
114
+ dataObj['metric'] = selected_metric;
115
+ dataObj['date_range'] = selected_range;
116
+ dataObj[GA_NONCE_FIELD] = GA_NONCE;
117
+
118
+ $.ajax({
119
+ type: "post",
120
+ dataType: "json",
121
+ url: ajaxurl,
122
+ data: dataObj,
123
+ success: function (response) {
124
+
125
+ ga_loader.hide();
126
+
127
+ if (typeof response.error !== "undefined") {
128
+ $('#ga_widget_error').show().html(response.error);
129
+ } else {
130
+ var dataT = [['Day', selected_name]];
131
+ $.each(response.chart, function (k, v) {
132
+ dataT.push([v.day, parseInt(v.current)]);
133
+ });
134
+
135
+ $.each(response.boxes, function (k, v) {
136
+ $('#ga_box_dashboard_label_' + k).html(v.label)
137
+ $('#ga_box_dashboard_value_' + k).html(v.value);
138
+ });
139
+
140
+ ga_dashboard.drawChart(dataT, selected_name);
141
+
142
+ // Set new data
143
+ ga_dashboard.setChartData(dataT);
144
+ }
145
  }
146
  });
147
  });
172
  title = 'Pageviews';
173
  }
174
 
175
+ if (dataArr.length > 1) {
176
+ const data = google.visualization.arrayToDataTable(dataArr);
177
+
178
+ const options = {
179
+ /*title: title,*/
180
+ legend: 'top',
181
+ lineWidth: 2,
182
+ chartArea: {
183
+ left: 10,
184
+ top: 60,
185
+ bottom: 50,
186
+ right: 10
187
+
188
+ },
189
+ width: '95%',
190
+ height: 300,
191
+ hAxis: {title: 'Day', titleTextStyle: {color: '#333'}, direction: 1},
192
+ vAxis: {minValue: 0},
193
+ pointSize: 5
194
+ };
195
+
196
+ var chart = new google.visualization.AreaChart(chart_dom_element);
197
+ google.visualization.events.addListener(chart, 'ready', function () {
198
+ ga_loader.hide();
199
+ });
200
+ chart.draw(data, options);
201
+ } else {
202
+ $('#ga_widget_error').show().html('No data available for selected range.');
203
+ }
204
  }
205
  };
206
 
207
+ })(jQuery);
js/googleanalytics_page.js CHANGED
@@ -1,4 +1,8 @@
1
  const GA_ACCESS_CODE_MODAL_ID = "ga_access_code_modal";
 
 
 
 
2
  const GA_ACCESS_CODE_TMP_ID = "ga_access_code_tmp";
3
  const GA_ACCESS_CODE_ID = "ga_access_code";
4
  const GA_FORM_ID = "ga_form";
@@ -40,6 +44,7 @@ const GA_SAVE_ACCESS_CODE_BTN_ID = 'ga_save_access_code';
40
  ga_modal = {
41
  hide: function () {
42
  $('#' + GA_ACCESS_CODE_MODAL_ID).hide();
 
43
  ga_loader.hide();
44
  $('#' + GA_SAVE_ACCESS_CODE_BTN_ID).removeAttr('disabled');
45
  }
@@ -75,9 +80,12 @@ const GA_SAVE_ACCESS_CODE_BTN_ID = 'ga_save_access_code';
75
  $('#' + GA_ACCESS_CODE_TMP_ID).focus();
76
  });
77
 
78
- $('#' + GA_MODAL_CLOSE_ID + ', #' + GA_MODAL_BTN_CLOSE_ID).on('click', function () {
79
  ga_modal.hide();
80
  });
 
 
 
81
  }
82
  };
83
 
@@ -190,4 +198,38 @@ const GA_SAVE_ACCESS_CODE_BTN_ID = 'ga_save_access_code';
190
  chart.draw(data, options);
191
  }
192
  };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
193
  })(jQuery);
1
  const GA_ACCESS_CODE_MODAL_ID = "ga_access_code_modal";
2
+ const GA_DEBUG_MODAL_ID = "ga_debug_modal";
3
+ const GA_DEBUG_MODAL_CONTENT_ID = "ga_debug_modal_content";
4
+ const GA_DEBUG_EMAIL = "ga_debug_email";
5
+ const GA_DEBUG_DESCRIPTION = "ga_debug_description";
6
  const GA_ACCESS_CODE_TMP_ID = "ga_access_code_tmp";
7
  const GA_ACCESS_CODE_ID = "ga_access_code";
8
  const GA_FORM_ID = "ga_form";
44
  ga_modal = {
45
  hide: function () {
46
  $('#' + GA_ACCESS_CODE_MODAL_ID).hide();
47
+ $('#' + GA_DEBUG_MODAL_ID).hide();
48
  ga_loader.hide();
49
  $('#' + GA_SAVE_ACCESS_CODE_BTN_ID).removeAttr('disabled');
50
  }
80
  $('#' + GA_ACCESS_CODE_TMP_ID).focus();
81
  });
82
 
83
+ $('#' + GA_MODAL_CLOSE_ID + ', #' + GA_MODAL_BTN_CLOSE_ID + ', #' + GA_DEBUG_MODAL_ID ).on('click', function () {
84
  ga_modal.hide();
85
  });
86
+ $('#' + GA_DEBUG_MODAL_CONTENT_ID ).click(function(event){
87
+ event.stopPropagation();
88
+ });
89
  }
90
  };
91
 
198
  chart.draw(data, options);
199
  }
200
  };
201
+ ga_debug = {
202
+ url: '',
203
+ open_modal: function (e) {
204
+ e.preventDefault();
205
+ $('#' + GA_DEBUG_MODAL_ID).appendTo("body").show();
206
+ $('#ga-send-debug-email').removeAttr('disabled');
207
+ $('#ga_debug_error').hide();
208
+ $('#ga_debug_success').hide();
209
+ },
210
+ send_email: function (e) {
211
+ e.preventDefault();
212
+ ga_loader.show();
213
+ var dataObj = {};
214
+ dataObj['action'] = "googleanalytics_send_debug_email";
215
+ dataObj['email'] = $('#' + GA_DEBUG_EMAIL).val();
216
+ dataObj['description'] = $('#' + GA_DEBUG_DESCRIPTION).val();
217
+ $.ajax({
218
+ type: "post",
219
+ dataType: "json",
220
+ url: ajaxurl,
221
+ data: dataObj,
222
+ success: function (response) {
223
+ ga_loader.hide();
224
+ if (typeof response.error !== "undefined") {
225
+ $('#ga_debug_error').show().html(response.error);
226
+ } else if (typeof response.success !== "undefined"){
227
+ $('#ga_debug_error').hide();
228
+ $('#ga-send-debug-email').attr('disabled','disabled');
229
+ $('#ga_debug_success').show().html(response.success);
230
+ }
231
+ }
232
+ });
233
+ }
234
+ };
235
  })(jQuery);
lib/Ga_Lib_Api_Client.php CHANGED
@@ -60,6 +60,7 @@ abstract class Ga_Lib_Api_Client {
60
  */
61
  protected function add_error( Exception $e ) {
62
  $this->errors[ $e->getCode() ] = array( 'class' => get_class( $e ), 'message' => $e->getMessage() );
 
63
  }
64
 
65
  public function add_own_error( $code, $message, $class = '' ) {
@@ -69,5 +70,5 @@ abstract class Ga_Lib_Api_Client {
69
  }
70
 
71
  class Ga_Lib_Api_Client_Exception extends Exception {
72
-
73
  }
60
  */
61
  protected function add_error( Exception $e ) {
62
  $this->errors[ $e->getCode() ] = array( 'class' => get_class( $e ), 'message' => $e->getMessage() );
63
+ do_action( 'st_support_save_error', $e );
64
  }
65
 
66
  public function add_own_error( $code, $message, $class = '' ) {
70
  }
71
 
72
  class Ga_Lib_Api_Client_Exception extends Exception {
73
+
74
  }
lib/Ga_Lib_Api_Request.php CHANGED
@@ -11,10 +11,10 @@ class Ga_Lib_Api_Request {
11
  const USER_AGENT = 'googleanalytics-wordpress-plugin';
12
 
13
  private $headers = array();
14
-
15
  // Whether to cache or not
16
  private $cache = false;
17
-
18
  private $appendix = '';
19
 
20
  private function __construct( $cache = false, $appendix = '' ) {
@@ -59,23 +59,23 @@ class Ga_Lib_Api_Request {
59
  * @return string Response
60
  * @throws Exception
61
  */
62
- public function make_request( $url, $rawPostBody = null, $json = false, $force_no_cache = false) {
63
 
64
  // Return cached data if exist
65
  if ( ! $force_no_cache ) {
66
- if ( $this->cache ) {
67
  $wp_transient_name = Ga_Cache::get_transient_name( $url, $rawPostBody, $this->appendix );
68
 
69
- if ( $cached = Ga_Cache::get_cached_result( $wp_transient_name ) ) {
70
  if ( ! Ga_Cache::is_data_cache_outdated( $wp_transient_name, $this->appendix ) ) {
71
- return $cached;
72
- }
73
- }
74
 
75
  // Check if the next request after error is allowed
76
  if ( false === Ga_Cache::is_next_request_allowed( $wp_transient_name ) ) {
77
- throw new Ga_Lib_Api_Client_Exception( _( 'There are temporary connection issues, please try again later.' ) );
78
- }
79
  }
80
  }
81
 
@@ -92,7 +92,6 @@ class Ga_Lib_Api_Request {
92
 
93
  $ch = curl_init( $url );
94
  $headers = $this->headers;
95
- curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
96
 
97
  $curl_timeout = self::TIMEOUT;
98
  $php_execution_time = ini_get( 'max_execution_time' );
@@ -122,7 +121,15 @@ class Ga_Lib_Api_Request {
122
  curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $curl_timeout );
123
  curl_setopt( $ch, CURLOPT_TIMEOUT, $curl_timeout );
124
  curl_setopt( $ch, CURLOPT_HEADER, true );
 
 
 
 
 
 
 
125
  curl_setopt( $ch, CURLINFO_HEADER_OUT, true );
 
126
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
127
  curl_setopt( $ch, CURLOPT_USERAGENT, self::USER_AGENT );
128
  if ( defined( 'CURLOPT_IPRESOLVE' ) && defined( 'CURL_IPRESOLVE_V4' ) ) {
@@ -132,7 +139,7 @@ class Ga_Lib_Api_Request {
132
  // POST body
133
  if ( !empty( $rawPostBody ) ) {
134
  curl_setopt( $ch, CURLOPT_POST, true );
135
- curl_setopt( $ch, CURLOPT_POSTFIELDS, ( $json ? $rawPostBody : http_build_query( $rawPostBody ) ) );
136
  }
137
 
138
  // Execute request
@@ -145,8 +152,8 @@ class Ga_Lib_Api_Request {
145
  // Store last cache time when unsuccessful
146
  if ( false === $force_no_cache ) {
147
  if ( true === $this->cache ) {
148
- Ga_Cache::set_last_cache_time( $wp_transient_name );
149
- Ga_Cache::set_last_time_attempt();
150
  }
151
  }
152
 
@@ -161,8 +168,8 @@ class Ga_Lib_Api_Request {
161
  // Store last cache time when unsuccessful
162
  if ( false === $force_no_cache ) {
163
  if ( true === $this->cache ) {
164
- Ga_Cache::set_last_cache_time( $wp_transient_name );
165
- Ga_Cache::set_last_time_attempt();
166
  }
167
  }
168
 
@@ -175,9 +182,9 @@ class Ga_Lib_Api_Request {
175
 
176
  // Cache result
177
  if ( false === $force_no_cache ) {
178
- if (true === $this->cache) {
179
- Ga_Cache::set_cache( $wp_transient_name, $response_data );
180
- }
181
  }
182
 
183
 
@@ -185,6 +192,10 @@ class Ga_Lib_Api_Request {
185
  }
186
  }
187
 
 
 
 
 
188
  }
189
 
190
  class Ga_Lib_Api_Request_Exception extends Exception {
11
  const USER_AGENT = 'googleanalytics-wordpress-plugin';
12
 
13
  private $headers = array();
14
+
15
  // Whether to cache or not
16
  private $cache = false;
17
+
18
  private $appendix = '';
19
 
20
  private function __construct( $cache = false, $appendix = '' ) {
59
  * @return string Response
60
  * @throws Exception
61
  */
62
+ public function make_request( $url, $rawPostBody = null, $json = false, $force_no_cache = false ) {
63
 
64
  // Return cached data if exist
65
  if ( ! $force_no_cache ) {
66
+ if ( $this->cache ) {
67
  $wp_transient_name = Ga_Cache::get_transient_name( $url, $rawPostBody, $this->appendix );
68
 
69
+ if ( $cached = Ga_Cache::get_cached_result( $wp_transient_name ) ) {
70
  if ( ! Ga_Cache::is_data_cache_outdated( $wp_transient_name, $this->appendix ) ) {
71
+ return $cached;
72
+ }
73
+ }
74
 
75
  // Check if the next request after error is allowed
76
  if ( false === Ga_Cache::is_next_request_allowed( $wp_transient_name ) ) {
77
+ throw new Ga_Lib_Api_Client_Exception( _( 'There are temporary connection issues, please try again later.' ) );
78
+ }
79
  }
80
  }
81
 
92
 
93
  $ch = curl_init( $url );
94
  $headers = $this->headers;
 
95
 
96
  $curl_timeout = self::TIMEOUT;
97
  $php_execution_time = ini_get( 'max_execution_time' );
121
  curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $curl_timeout );
122
  curl_setopt( $ch, CURLOPT_TIMEOUT, $curl_timeout );
123
  curl_setopt( $ch, CURLOPT_HEADER, true );
124
+ curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, true );
125
+ curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 2 );
126
+
127
+ if ( !function_exists( 'ini_get' ) || ! ini_get( 'curl.cainfo' ) ) {
128
+ curl_setopt( $ch, CURLOPT_CAINFO, $this->get_cert_path() );
129
+ }
130
+
131
  curl_setopt( $ch, CURLINFO_HEADER_OUT, true );
132
+ curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
133
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
134
  curl_setopt( $ch, CURLOPT_USERAGENT, self::USER_AGENT );
135
  if ( defined( 'CURLOPT_IPRESOLVE' ) && defined( 'CURL_IPRESOLVE_V4' ) ) {
139
  // POST body
140
  if ( !empty( $rawPostBody ) ) {
141
  curl_setopt( $ch, CURLOPT_POST, true );
142
+ curl_setopt( $ch, CURLOPT_POSTFIELDS, ( $json ? $rawPostBody : http_build_query( $rawPostBody , null, '&' ) ) );
143
  }
144
 
145
  // Execute request
152
  // Store last cache time when unsuccessful
153
  if ( false === $force_no_cache ) {
154
  if ( true === $this->cache ) {
155
+ Ga_Cache::set_last_cache_time( $wp_transient_name );
156
+ Ga_Cache::set_last_time_attempt();
157
  }
158
  }
159
 
168
  // Store last cache time when unsuccessful
169
  if ( false === $force_no_cache ) {
170
  if ( true === $this->cache ) {
171
+ Ga_Cache::set_last_cache_time( $wp_transient_name );
172
+ Ga_Cache::set_last_time_attempt();
173
  }
174
  }
175
 
182
 
183
  // Cache result
184
  if ( false === $force_no_cache ) {
185
+ if ( true === $this->cache ) {
186
+ Ga_Cache::set_cache( $wp_transient_name, $response_data );
187
+ }
188
  }
189
 
190
 
192
  }
193
  }
194
 
195
+ private function get_cert_path() {
196
+ return GA_PLUGIN_DIR . '/lib/cert/cacerts.pem';
197
+ }
198
+
199
  }
200
 
201
  class Ga_Lib_Api_Request_Exception extends Exception {
lib/Ga_Lib_Google_Api_Client.php CHANGED
@@ -53,7 +53,7 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
53
  return self::$instance;
54
  }
55
 
56
- public function set_disable_cache($value) {
57
  $this->disable_cache = $value;
58
  }
59
 
@@ -113,7 +113,7 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
113
  'approval_prompt' => urlencode( $this->config['approval_prompt'] )
114
  );
115
 
116
- return self::OAUTH2_AUTH_ENDPOINT . "?" . http_build_query( $params );
117
  }
118
 
119
  /**
@@ -133,7 +133,7 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
133
  );
134
  try {
135
  $response = Ga_Lib_Api_Request::get_instance()->make_request( self::OAUTH2_TOKEN_ENDPOINT,
136
- $request, false, true);
137
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
138
  throw new Ga_Lib_Google_Api_Client_AuthCode_Exception( $e->getMessage() );
139
  }
@@ -157,9 +157,9 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
157
  );
158
 
159
  try {
160
- $response = Ga_Lib_Api_Request::get_instance()->make_request( self::OAUTH2_TOKEN_ENDPOINT,
161
- $request, false, true );
162
- } catch (Ga_Lib_Api_Request_Exception $e) {
163
  throw new Ga_Lib_Google_Api_Client_RefreshToken_Exception( $e->getMessage() );
164
  }
165
 
@@ -175,8 +175,8 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
175
  $request = Ga_Lib_Api_Request::get_instance();
176
  $request = $this->sign( $request );
177
  try {
178
- $response = $request->make_request( self::GA_ACCOUNT_SUMMARIES_ENDPOINT, null, false, true );
179
- } catch (Ga_Lib_Api_Request_Exception $e) {
180
  throw new Ga_Lib_Google_Api_Client_AccountSummaries_Exception( $e->getMessage() );
181
  }
182
 
@@ -302,7 +302,6 @@ class Ga_Lib_Google_Api_Client extends Ga_Lib_Api_Client {
302
  public function is_cache_enabled() {
303
  return self::USE_CACHE && ! $this->disable_cache;
304
  }
305
-
306
  }
307
 
308
  class Ga_Lib_Google_Api_Client_Exception extends Ga_Lib_Api_Client_Exception {
@@ -350,8 +349,15 @@ class Ga_Lib_Google_Api_Client_Exception extends Ga_Lib_Api_Client_Exception {
350
  */
351
  protected function get_error_response_data( $response ) {
352
  $data = json_decode( $response, true );
353
- if ( ! empty( $data['error'] ) && ! empty( $data['error']['message'] ) && ! empty( $data['error']['code'] ) ) {
354
  return $data;
 
 
 
 
 
 
 
355
  } else {
356
  return array(
357
  'error' => array(
@@ -371,10 +377,10 @@ class Ga_Lib_Google_Api_Client_AuthCode_Exception extends Ga_Lib_Google_Api_Clie
371
 
372
  protected function get_error_response_data( $response ) {
373
  $data = json_decode( $response, true );
374
- if ( ! empty( $data['error'] ) && ! empty( $data['error_description'] ) ) {
375
  return array(
376
  'error' => array(
377
- 'message' => '[' . $data['error'] . ']' . $data['error_description'],
378
  'code' => 500
379
  )
380
  );
53
  return self::$instance;
54
  }
55
 
56
+ public function set_disable_cache( $value ) {
57
  $this->disable_cache = $value;
58
  }
59
 
113
  'approval_prompt' => urlencode( $this->config['approval_prompt'] )
114
  );
115
 
116
+ return self::OAUTH2_AUTH_ENDPOINT . "?" . http_build_query( $params, null, '&' );
117
  }
118
 
119
  /**
133
  );
134
  try {
135
  $response = Ga_Lib_Api_Request::get_instance()->make_request( self::OAUTH2_TOKEN_ENDPOINT,
136
+ $request, false, true );
137
  } catch ( Ga_Lib_Api_Request_Exception $e ) {
138
  throw new Ga_Lib_Google_Api_Client_AuthCode_Exception( $e->getMessage() );
139
  }
157
  );
158
 
159
  try {
160
+ $response = Ga_Lib_Api_Request::get_instance()->make_request( self::OAUTH2_TOKEN_ENDPOINT,
161
+ $request, false, true );
162
+ } catch ( Ga_Lib_Api_Request_Exception $e ) {
163
  throw new Ga_Lib_Google_Api_Client_RefreshToken_Exception( $e->getMessage() );
164
  }
165
 
175
  $request = Ga_Lib_Api_Request::get_instance();
176
  $request = $this->sign( $request );
177
  try {
178
+ $response = $request->make_request( self::GA_ACCOUNT_SUMMARIES_ENDPOINT, null, false, true );
179
+ } catch ( Ga_Lib_Api_Request_Exception $e ) {
180
  throw new Ga_Lib_Google_Api_Client_AccountSummaries_Exception( $e->getMessage() );
181
  }
182
 
302
  public function is_cache_enabled() {
303
  return self::USE_CACHE && ! $this->disable_cache;
304
  }
 
305
  }
306
 
307
  class Ga_Lib_Google_Api_Client_Exception extends Ga_Lib_Api_Client_Exception {
349
  */
350
  protected function get_error_response_data( $response ) {
351
  $data = json_decode( $response, true );
352
+ if ( is_array( $data['error'] ) && ! empty( $data['error'] ) && ! empty( $data['error']['message'] ) && ! empty( $data['error']['code'] ) ) {
353
  return $data;
354
+ } elseif ( ! empty( $data['error'] ) ) {
355
+ return array(
356
+ 'error' => array(
357
+ 'message' => $data['error'],
358
+ 'code' => 500
359
+ )
360
+ );
361
  } else {
362
  return array(
363
  'error' => array(
377
 
378
  protected function get_error_response_data( $response ) {
379
  $data = json_decode( $response, true );
380
+ if ( ! empty( $data['error'] ) ) {
381
  return array(
382
  'error' => array(
383
+ 'message' => $data['error'],
384
  'code' => 500
385
  )
386
  );
lib/cert/cacerts.pem ADDED
@@ -0,0 +1,738 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Certifcate Authority certificates for validating SSL connections.
2
+ #
3
+ # This file contains PEM format certificates generated from
4
+ # http://mxr.mozilla.org/seamonkey/source/security/nss/lib/ckfw/builtins/certdata.txt
5
+ #
6
+ # ***** BEGIN LICENSE BLOCK *****
7
+ # Version: MPL 1.1/GPL 2.0/LGPL 2.1
8
+ #
9
+ # The contents of this file are subject to the Mozilla Public License Version
10
+ # 1.1 (the "License"); you may not use this file except in compliance with
11
+ # the License. You may obtain a copy of the License at
12
+ # http://www.mozilla.org/MPL/
13
+ #
14
+ # Software distributed under the License is distributed on an "AS IS" basis,
15
+ # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
16
+ # for the specific language governing rights and limitations under the
17
+ # License.
18
+ #
19
+ # The Original Code is the Netscape security libraries.
20
+ #
21
+ # The Initial Developer of the Original Code is
22
+ # Netscape Communications Corporation.
23
+ # Portions created by the Initial Developer are Copyright (C) 1994-2000
24
+ # the Initial Developer. All Rights Reserved.
25
+ #
26
+ # Contributor(s):
27
+ #
28
+ # Alternatively, the contents of this file may be used under the terms of
29
+ # either the GNU General Public License Version 2 or later (the "GPL"), or
30
+ # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
31
+ # in which case the provisions of the GPL or the LGPL are applicable instead
32
+ # of those above. If you wish to allow use of your version of this file only
33
+ # under the terms of either the GPL or the LGPL, and not to allow others to
34
+ # use your version of this file under the terms of the MPL, indicate your
35
+ # decision by deleting the provisions above and replace them with the notice
36
+ # and other provisions required by the GPL or the LGPL. If you do not delete
37
+ # the provisions above, a recipient may use your version of this file under
38
+ # the terms of any one of the MPL, the GPL or the LGPL.
39
+ #
40
+ # ***** END LICENSE BLOCK *****
41
+
42
+ Verisign/RSA Secure Server CA
43
+ =============================
44
+
45
+ -----BEGIN CERTIFICATE-----
46
+ MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG
47
+ A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
48
+ VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0
49
+ MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV
50
+ BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy
51
+ dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ
52
+ ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII
53
+ 0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI
54
+ uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI
55
+ hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3
56
+ YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc
57
+ 1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
58
+ -----END CERTIFICATE-----
59
+
60
+ Thawte Personal Basic CA
61
+ ========================
62
+
63
+ -----BEGIN CERTIFICATE-----
64
+ MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx
65
+ FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
66
+ VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
67
+ ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj
68
+ IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X
69
+ DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw
70
+ EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE
71
+ ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy
72
+ dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD
73
+ QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN
74
+ BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53
75
+ dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK
76
+ wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7
77
+ G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF
78
+ AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7
79
+ c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P
80
+ 9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ==
81
+ -----END CERTIFICATE-----
82
+
83
+ Thawte Personal Premium CA
84
+ ==========================
85
+
86
+ -----BEGIN CERTIFICATE-----
87
+ MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx
88
+ FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
89
+ VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
90
+ ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p
91
+ dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv
92
+ bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa
93
+ QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY
94
+ BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u
95
+ IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl
96
+ bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu
97
+ Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs
98
+ Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI
99
+ Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD
100
+ ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
101
+ SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH
102
+ b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh
103
+ KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ
104
+ -----END CERTIFICATE-----
105
+
106
+ Thawte Personal Freemail CA
107
+ ===========================
108
+
109
+ -----BEGIN CERTIFICATE-----
110
+ MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx
111
+ FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
112
+ VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
113
+ ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt
114
+ YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu
115
+ Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT
116
+ AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa
117
+ MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp
118
+ b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG
119
+ cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh
120
+ d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY
121
+ DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E
122
+ rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq
123
+ uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN
124
+ BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP
125
+ MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa
126
+ /RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei
127
+ gQ==
128
+ -----END CERTIFICATE-----
129
+
130
+ Thawte Server CA
131
+ ================
132
+
133
+ -----BEGIN CERTIFICATE-----
134
+ MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
135
+ FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
136
+ VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
137
+ biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
138
+ MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx
139
+ MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
140
+ DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3
141
+ dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl
142
+ cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3
143
+ DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
144
+ gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91
145
+ yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX
146
+ L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj
147
+ EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG
148
+ 7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
149
+ QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ
150
+ qdq5snUb9kLy78fyGPmJvKP/iiMucEc=
151
+ -----END CERTIFICATE-----
152
+
153
+ Thawte Premium Server CA
154
+ ========================
155
+
156
+ -----BEGIN CERTIFICATE-----
157
+ MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
158
+ FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
159
+ VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
160
+ biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
161
+ dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
162
+ MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
163
+ MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
164
+ A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
165
+ b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
166
+ cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
167
+ bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
168
+ VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
169
+ ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
170
+ uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
171
+ 9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
172
+ hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
173
+ pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
174
+ -----END CERTIFICATE-----
175
+
176
+ Equifax Secure CA
177
+ =================
178
+
179
+ -----BEGIN CERTIFICATE-----
180
+ MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
181
+ UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
182
+ dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
183
+ MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
184
+ dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
185
+ AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
186
+ BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
187
+ cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
188
+ AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
189
+ MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
190
+ aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
191
+ ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
192
+ IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
193
+ MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
194
+ A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
195
+ 7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
196
+ 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
197
+ -----END CERTIFICATE-----
198
+
199
+ Verisign Class 1 Public Primary Certification Authority
200
+ =======================================================
201
+
202
+ -----BEGIN CERTIFICATE-----
203
+ MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ
204
+ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh
205
+ c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05
206
+ NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD
207
+ VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp
208
+ bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB
209
+ jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N
210
+ H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR
211
+ 4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN
212
+ BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo
213
+ EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5
214
+ FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx
215
+ lA==
216
+ -----END CERTIFICATE-----
217
+
218
+ Verisign Class 2 Public Primary Certification Authority
219
+ =======================================================
220
+
221
+ -----BEGIN CERTIFICATE-----
222
+ MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG
223
+ A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
224
+ cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
225
+ MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
226
+ BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt
227
+ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
228
+ ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh
229
+ YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7
230
+ FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G
231
+ CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg
232
+ J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc
233
+ r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY
234
+ -----END CERTIFICATE-----
235
+
236
+ Verisign Class 3 Public Primary Certification Authority
237
+ =======================================================
238
+
239
+ -----BEGIN CERTIFICATE-----
240
+ MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
241
+ A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
242
+ cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
243
+ MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
244
+ BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
245
+ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
246
+ ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
247
+ BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
248
+ I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
249
+ CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
250
+ lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
251
+ AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
252
+ -----END CERTIFICATE-----
253
+
254
+ Verisign Class 1 Public Primary Certification Authority - G2
255
+ ============================================================
256
+
257
+ -----BEGIN CERTIFICATE-----
258
+ MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
259
+ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
260
+ c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
261
+ MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
262
+ emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
263
+ DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
264
+ FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg
265
+ UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
266
+ YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
267
+ MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
268
+ AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK
269
+ VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm
270
+ Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID
271
+ AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J
272
+ h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul
273
+ uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68
274
+ DzFc6PLZ
275
+ -----END CERTIFICATE-----
276
+
277
+ Verisign Class 2 Public Primary Certification Authority - G2
278
+ ============================================================
279
+
280
+ -----BEGIN CERTIFICATE-----
281
+ MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw
282
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns
283
+ YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
284
+ MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
285
+ aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe
286
+ Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX
287
+ MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj
288
+ IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx
289
+ KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
290
+ eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B
291
+ AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM
292
+ HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw
293
+ DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC
294
+ AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji
295
+ nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX
296
+ rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn
297
+ jBJ7xUS0rg==
298
+ -----END CERTIFICATE-----
299
+
300
+ Verisign Class 3 Public Primary Certification Authority - G2
301
+ ============================================================
302
+
303
+ -----BEGIN CERTIFICATE-----
304
+ MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
305
+ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
306
+ c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
307
+ MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
308
+ emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
309
+ DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
310
+ FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
311
+ UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
312
+ YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
313
+ MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
314
+ AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
315
+ pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
316
+ 13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
317
+ AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
318
+ U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
319
+ F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
320
+ oJ2daZH9
321
+ -----END CERTIFICATE-----
322
+
323
+ Verisign Class 4 Public Primary Certification Authority - G2
324
+ ============================================================
325
+
326
+ -----BEGIN CERTIFICATE-----
327
+ MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
328
+ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
329
+ c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
330
+ MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
331
+ emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
332
+ DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
333
+ FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg
334
+ UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
335
+ YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
336
+ MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
337
+ AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM
338
+ HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK
339
+ qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID
340
+ AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj
341
+ cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y
342
+ cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP
343
+ T8qAkbYp
344
+ -----END CERTIFICATE-----
345
+
346
+ Verisign Class 1 Public Primary Certification Authority - G3
347
+ ============================================================
348
+
349
+ -----BEGIN CERTIFICATE-----
350
+ MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw
351
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
352
+ cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
353
+ LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
354
+ aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
355
+ dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
356
+ VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
357
+ aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
358
+ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
359
+ IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
360
+ LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4
361
+ nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO
362
+ 8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV
363
+ ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb
364
+ PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2
365
+ 6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr
366
+ n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a
367
+ qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4
368
+ wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
369
+ ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs
370
+ pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4
371
+ E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
372
+ -----END CERTIFICATE-----
373
+
374
+ Verisign Class 2 Public Primary Certification Authority - G3
375
+ ============================================================
376
+
377
+ -----BEGIN CERTIFICATE-----
378
+ MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ
379
+ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy
380
+ aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s
381
+ IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp
382
+ Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
383
+ eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV
384
+ BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp
385
+ Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu
386
+ Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g
387
+ Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
388
+ IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU
389
+ J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO
390
+ JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY
391
+ wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o
392
+ koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN
393
+ qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E
394
+ Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe
395
+ xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u
396
+ 7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
397
+ sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI
398
+ sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP
399
+ cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
400
+ -----END CERTIFICATE-----
401
+
402
+ Verisign Class 3 Public Primary Certification Authority - G3
403
+ ============================================================
404
+
405
+ -----BEGIN CERTIFICATE-----
406
+ MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
407
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
408
+ cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
409
+ LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
410
+ aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
411
+ dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
412
+ VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
413
+ aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
414
+ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
415
+ IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
416
+ LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
417
+ N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
418
+ KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
419
+ kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
420
+ CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
421
+ Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
422
+ imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
423
+ 2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
424
+ DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
425
+ /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
426
+ F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
427
+ TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
428
+ -----END CERTIFICATE-----
429
+
430
+ Verisign Class 4 Public Primary Certification Authority - G3
431
+ ============================================================
432
+
433
+ -----BEGIN CERTIFICATE-----
434
+ MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
435
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
436
+ cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
437
+ LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
438
+ aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
439
+ dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
440
+ VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
441
+ aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
442
+ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
443
+ IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
444
+ LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1
445
+ GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ
446
+ +mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd
447
+ U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm
448
+ NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
449
+ ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/
450
+ ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1
451
+ CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq
452
+ g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
453
+ fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c
454
+ 2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/
455
+ bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
456
+ -----END CERTIFICATE-----
457
+
458
+ Equifax Secure Global eBusiness CA
459
+ ==================================
460
+
461
+ -----BEGIN CERTIFICATE-----
462
+ MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
463
+ MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
464
+ ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
465
+ MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
466
+ dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
467
+ c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
468
+ UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
469
+ 58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
470
+ o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
471
+ MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
472
+ aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
473
+ A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
474
+ Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
475
+ 8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
476
+ -----END CERTIFICATE-----
477
+
478
+ Equifax Secure eBusiness CA 1
479
+ =============================
480
+
481
+ -----BEGIN CERTIFICATE-----
482
+ MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc
483
+ MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT
484
+ ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw
485
+ MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j
486
+ LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ
487
+ KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo
488
+ RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu
489
+ WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw
490
+ Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD
491
+ AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK
492
+ eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM
493
+ zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+
494
+ WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN
495
+ /Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==
496
+ -----END CERTIFICATE-----
497
+
498
+ Equifax Secure eBusiness CA 2
499
+ =============================
500
+
501
+ -----BEGIN CERTIFICATE-----
502
+ MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
503
+ UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj
504
+ dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0
505
+ NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD
506
+ VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B
507
+ AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G
508
+ vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/
509
+ BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C
510
+ AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX
511
+ MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl
512
+ IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw
513
+ NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq
514
+ y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF
515
+ MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
516
+ A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy
517
+ 0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1
518
+ E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN
519
+ -----END CERTIFICATE-----
520
+
521
+ Thawte Time Stamping CA
522
+ =======================
523
+
524
+ -----BEGIN CERTIFICATE-----
525
+ MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx
526
+ FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN
527
+ BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd
528
+ BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN
529
+ MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g
530
+ Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG
531
+ A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l
532
+ c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT
533
+ 6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa
534
+ Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL
535
+ 8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB
536
+ Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC
537
+ 9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ
538
+ pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ
539
+ CayJSdM=
540
+ -----END CERTIFICATE-----
541
+
542
+ thawte Primary Root CA
543
+ ======================
544
+
545
+ -----BEGIN CERTIFICATE-----
546
+ MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
547
+ qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
548
+ Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
549
+ MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
550
+ BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
551
+ NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
552
+ LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
553
+ A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
554
+ IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
555
+ SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
556
+ W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
557
+ 3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
558
+ 6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
559
+ Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
560
+ NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
561
+ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
562
+ r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
563
+ DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
564
+ YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
565
+ xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
566
+ /qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
567
+ LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
568
+ jVaMaA==
569
+ -----END CERTIFICATE-----
570
+
571
+ VeriSign Class 3 Public Primary Certification Authority - G5
572
+ ============================================================
573
+
574
+ -----BEGIN CERTIFICATE-----
575
+ MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
576
+ yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
577
+ ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
578
+ U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
579
+ ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
580
+ aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
581
+ MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
582
+ ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
583
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
584
+ U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
585
+ aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
586
+ nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
587
+ t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
588
+ SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
589
+ BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
590
+ rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
591
+ NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
592
+ BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
593
+ BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
594
+ aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
595
+ MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
596
+ p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
597
+ 5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
598
+ WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
599
+ 4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
600
+ hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
601
+ -----END CERTIFICATE-----
602
+
603
+ Entrust.net Secure Server Certification Authority
604
+ =================================================
605
+
606
+ -----BEGIN CERTIFICATE-----
607
+ MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
608
+ VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
609
+ ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
610
+ KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
611
+ ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
612
+ MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
613
+ ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
614
+ b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
615
+ bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
616
+ U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
617
+ A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
618
+ I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
619
+ wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
620
+ AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
621
+ oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
622
+ BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
623
+ dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
624
+ MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
625
+ b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
626
+ dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
627
+ MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
628
+ E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
629
+ MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
630
+ hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
631
+ 95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
632
+ 2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
633
+ -----END CERTIFICATE-----
634
+
635
+ Go Daddy Certification Authority Root Certificate Bundle
636
+ ========================================================
637
+
638
+ -----BEGIN CERTIFICATE-----
639
+ MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
640
+ ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
641
+ RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw
642
+ MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH
643
+ QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j
644
+ b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j
645
+ b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj
646
+ YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN
647
+ AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H
648
+ KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm
649
+ VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR
650
+ SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT
651
+ cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ
652
+ 6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu
653
+ MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS
654
+ kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB
655
+ BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f
656
+ BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv
657
+ c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH
658
+ AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO
659
+ BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG
660
+ OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU
661
+ A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o
662
+ 0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX
663
+ RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH
664
+ qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
665
+ U+4=
666
+ -----END CERTIFICATE-----
667
+ -----BEGIN CERTIFICATE-----
668
+ MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh
669
+ bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu
670
+ Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g
671
+ QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe
672
+ BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDYyMFoX
673
+ DTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBE
674
+ YWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgMiBDZXJ0
675
+ aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC
676
+ ggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
677
+ 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+q
678
+ N1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiO
679
+ r18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lN
680
+ f4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEH
681
+ U1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ4EFgQU0sSw0pHU
682
+ TBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBuzEkMCIGA1UEBxMb
683
+ VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQKEw5WYWxpQ2VydCwg
684
+ SW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2xpY3kgVmFsaWRhdGlv
685
+ biBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudmFsaWNlcnQuY29tLzEg
686
+ MB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CAQEwDwYDVR0TAQH/BAUw
687
+ AwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmdv
688
+ ZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jZXJ0aWZpY2F0ZXMu
689
+ Z29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybDBLBgNVHSAERDBCMEAGBFUd
690
+ IAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNv
691
+ bS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOBgQC1
692
+ QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+Sn1eocSxI0YGyeR+sBjUZsE4O
693
+ WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf
694
+ SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw==
695
+ -----END CERTIFICATE-----
696
+ -----BEGIN CERTIFICATE-----
697
+ MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
698
+ IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
699
+ BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
700
+ aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
701
+ 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
702
+ NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
703
+ azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
704
+ YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
705
+ Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
706
+ cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
707
+ dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
708
+ WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
709
+ v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
710
+ UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
711
+ IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
712
+ W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
713
+ -----END CERTIFICATE-----
714
+
715
+ GeoTrust Global CA
716
+ ==================
717
+
718
+ -----BEGIN CERTIFICATE-----
719
+ MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
720
+ MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
721
+ aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw
722
+ WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE
723
+ AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
724
+ CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m
725
+ OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu
726
+ T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c
727
+ JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR
728
+ Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz
729
+ PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm
730
+ aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM
731
+ TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g
732
+ LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO
733
+ BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv
734
+ dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB
735
+ AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL
736
+ NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W
737
+ b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S
738
+ -----END CERTIFICATE-----
overwrite/ga_overwrite.php CHANGED
File without changes
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: ShareThis
3
  Tags: analytics, dashboard, google, google analytics, google analytics plugin, javascript, marketing, pageviews, statistics, stats, tracking, visits, web stats, widget, analytics dashboard, google analytics dashboard, google analytics widget, google analytics dashboard
4
  Requires at least: 3.8
5
  Tested up to: 4.7.2
6
- Stable tag: 2.1
7
 
8
  Use Google Analytics on your Wordpress site without touching any code, and view visitor reports right in your Wordpress admin dashboard!
9
 
@@ -33,7 +33,7 @@ If you don't have a Google Analytics account, you can sign up for free here: htt
33
  By downloading and installing this plugin you are agreeing to the <a href="http://www.sharethis.com/privacy/" target="_blank">Privacy Policy</a> and <a href="http://www.sharethis.com/publisher-terms-of-use/" target="_blank">Terms of Service</a>.
34
 
35
  = Support =
36
- If you have any questions please let us know directly at support@googleanalytics.zendesk.com or create a new topic within our support portal here: (https://googleanalytics.zendesk.com/hc/en-us/community/posts/new)
37
 
38
  == Installation ==
39
 
@@ -57,7 +57,8 @@ This is likely caused by AdBlocker that is blocking anything related to "google
57
  It learns about your traffic patterns to spot "spikes" of visitors and then sends an alert. If your website doesn't have good amount of visitors you might not see any Trending Content Alerts because the algorithm needs more data to see "trends".
58
 
59
  = I have other questions, where I can get support or provide feedback? =
60
- If you have any questions please let us know directly at support@googleanalytics.zendesk.com or create a new topic within our support portal here: (https://googleanalytics.zendesk.com/hc/en-us/community/posts/new) We are always happy to help.
 
61
 
62
  == Screenshots ==
63
 
@@ -70,6 +71,17 @@ If you have any questions please let us know directly at support@googleanalytics
70
 
71
  == Changelog ==
72
 
 
 
 
 
 
 
 
 
 
 
 
73
  = 2.1 =
74
  * NEW: Trending Content - trending content shows you a list of content that is performing better than average
75
  * NEW: Alerts - option to sign up for alerts via email or Slack when your content is taking off
3
  Tags: analytics, dashboard, google, google analytics, google analytics plugin, javascript, marketing, pageviews, statistics, stats, tracking, visits, web stats, widget, analytics dashboard, google analytics dashboard, google analytics widget, google analytics dashboard
4
  Requires at least: 3.8
5
  Tested up to: 4.7.2
6
+ Stable tag: 2.1.2
7
 
8
  Use Google Analytics on your Wordpress site without touching any code, and view visitor reports right in your Wordpress admin dashboard!
9
 
33
  By downloading and installing this plugin you are agreeing to the <a href="http://www.sharethis.com/privacy/" target="_blank">Privacy Policy</a> and <a href="http://www.sharethis.com/publisher-terms-of-use/" target="_blank">Terms of Service</a>.
34
 
35
  = Support =
36
+ If you have any questions please let us know directly at support@googleanalytics.zendesk.com or create a new topic within our support portal here: <a href=”https://googleanalytics.zendesk.com/hc/en-us/community/posts/new> https://googleanalytics.zendesk.com/hc/en-us/community/posts/new</a>
37
 
38
  == Installation ==
39
 
57
  It learns about your traffic patterns to spot "spikes" of visitors and then sends an alert. If your website doesn't have good amount of visitors you might not see any Trending Content Alerts because the algorithm needs more data to see "trends".
58
 
59
  = I have other questions, where I can get support or provide feedback? =
60
+ If you have any questions please let us know directly at support@googleanalytics.zendesk.com or create a new topic within our support portal here: <a href=”https://googleanalytics.zendesk.com/hc/en-us/community/posts/new> https://googleanalytics.zendesk.com/hc/en-us/community/posts/new</a>
61
+ We are always happy to help.
62
 
63
  == Screenshots ==
64
 
71
 
72
  == Changelog ==
73
 
74
+ = 2.1.2 =
75
+ * Fixed authentication error issue experienced by some users.
76
+ * Added re-authentication button for easier changing or relinking of Google Analytics accounts.
77
+ * Added “Send Debug” button for faster technical troubleshooting.
78
+ * Added refresh button for Google Analytics within dashboard.
79
+ * Included new alert for missing Google Analytics account.
80
+ * Included new alert for unsupported PHP version.
81
+
82
+ = 2.1.1 =
83
+ * Reduced requests to Google API to help with Google Analytics quotas
84
+
85
  = 2.1 =
86
  * NEW: Trending Content - trending content shows you a list of content that is performing better than average
87
  * NEW: Alerts - option to sign up for alerts via email or Slack when your content is taking off
screenshot-3.png CHANGED
File without changes
screenshot-4.png CHANGED
File without changes
screenshot-5.png CHANGED
File without changes
tools/class-support-logging.php ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ class Ga_SupportLogger {
5
+
6
+ const EMAIL = 'support@googleanalytics.zendesk.com';
7
+ const LOG_OPTION = 'googleanalytics_sherethis_error_log';
8
+
9
+ static $debug_info;
10
+ /**
11
+ * Constructor.
12
+ * @return void
13
+ */
14
+ public function __construct() {
15
+ add_action( 'st_support_show_button', array( $this, 'display_button' ) );
16
+ add_action( 'st_support_save_error', array( $this, 'save_error' ) );
17
+ $this->get_debug_body();
18
+ }
19
+
20
+ public static function send_email() {
21
+ $email = !empty( $_POST[ 'email' ] ) ? sanitize_text_field( $_POST[ 'email' ] ) : '';
22
+ $description = !empty( $_POST[ 'description' ] ) ? __( 'Description of the issue:' ). PHP_EOL . PHP_EOL . sanitize_text_field( $_POST[ 'description' ] ) . PHP_EOL . PHP_EOL : '';
23
+
24
+ if ( !is_email( $email ) ) {
25
+ $response['error'] = 'Don\'t forget to provide your email address!';
26
+ }
27
+ else if ( wp_mail( self::EMAIL, __( 'Debug Report' ), $description . self::$debug_info, 'From: ' . $email ) ) {
28
+ $response['success'] = 'Success! Thank you for sending your debug report, you should receive a confirmation email from us. If you don\'t, please email us directly at <a href="mailto:support@googleanalytics.zendesk.com">support@googleanalytics.zendesk.com</a>.';
29
+ } else {
30
+ $response['error'] = 'Oops! Looks like we weren\'t able to send the email. Please copy and paste the "debug info" into your favorite email client to: <a href="mailto:support@googleanalytics.zendesk.com">support@googleanalytics.zendesk.com</a>. We hope to help soon!';
31
+ }
32
+
33
+ echo wp_json_encode( $response );
34
+ wp_die();
35
+ }
36
+
37
+ /**
38
+ * Displays a button to email the debugging info.
39
+ * @return void
40
+ */
41
+ public function display_button() {
42
+ printf(
43
+ '<a href="%s" class="button button-secondary" target="_blank">Send Debugging Info</a>',
44
+ esc_url( $this->get_mail_link() )
45
+ );
46
+ }
47
+
48
+
49
+ /**
50
+ * Saves an error to the log.
51
+ * @param Exception $err Error to save.
52
+ * @return void
53
+ */
54
+ public function save_error( Exception $err ) {
55
+ $cur_log = get_option( self::LOG_OPTION, array() );
56
+
57
+ // Creates the error object.
58
+ $new_log = array(
59
+ 'message' => $err->getMessage(),
60
+ 'stack' => $err->getTraceAsString(),
61
+ 'date' => current_time( 'r' ),
62
+ );
63
+
64
+ if ( method_exists( $err, 'get_google_error_response' ) ) {
65
+ $new_log['response'] = $err->get_google_error_response();
66
+ }
67
+
68
+ $cur_log[] = $new_log;
69
+
70
+ // Cap the log at 20 entries for space purposes.
71
+ if ( count( $cur_log ) > 20 ) {
72
+ array_pop( $cur_log );
73
+ }
74
+
75
+ // Save.
76
+ update_option( self::LOG_OPTION, $cur_log );
77
+ }
78
+
79
+ public function get_debug_body(){
80
+ $body = 'Debug Info:' . PHP_EOL . PHP_EOL;
81
+ $body .= implode( $this->get_debug_info(), PHP_EOL );
82
+ $body .= PHP_EOL . PHP_EOL . 'Error Log:' . PHP_EOL . PHP_EOL;
83
+ $body .= $this->get_formatted_log();
84
+ self::$debug_info = $body;
85
+ }
86
+
87
+ /**
88
+ * Returns a string used for providing an email link.
89
+ * @return string
90
+ */
91
+ private function get_mail_link() {
92
+
93
+ $body = 'DESCRIBE ISSUE HERE:' . str_repeat( '%0A', 10 );
94
+ $body .= 'Debug Info:%0A%0A';
95
+ $body .= implode( $this->get_debug_info(), '%0A' );
96
+ $body .= '%0A%0AError Log:%0A%0A';
97
+ $body .= str_replace( "\n", '%0A', $this->get_formatted_log() );
98
+
99
+ return add_query_arg( array(
100
+ 'subject' => __( 'Debug Report' ),
101
+ 'body' => $body,
102
+ ), 'mailto:' . self::EMAIL );
103
+ }
104
+
105
+
106
+ /**
107
+ * Gets an array of debugging information about the current system.
108
+ * @return array
109
+ */
110
+ private function get_debug_info() {
111
+ $theme = wp_get_theme();
112
+ $plugins = wp_get_active_and_valid_plugins();
113
+
114
+ $data = array(
115
+ 'Plugin Version' => GOOGLEANALYTICS_VERSION,
116
+ 'WordPress Version' => get_bloginfo( 'version' ),
117
+ 'PHP Version' => phpversion(),
118
+ 'Site URL' => get_bloginfo( 'wpurl' ),
119
+ 'Theme Name' => $theme->get( 'Name' ),
120
+ 'Theme URL' => $theme->get( 'ThemeURI' ),
121
+ 'Theme Version' => $theme->get( 'Version' ),
122
+ 'Active Plugins' => implode( $plugins, ', ' ),
123
+ 'Operating System' => php_uname(),
124
+ 'Web Server' => $_SERVER['SERVER_SOFTWARE'],
125
+ 'Current Time' => current_time( 'r' ),
126
+ 'Browser' => $_SERVER['HTTP_USER_AGENT'],
127
+ );
128
+ $formatted = array();
129
+ foreach ( $data as $text => $value ) {
130
+ $formatted[] = sprintf(
131
+ __( $text ) . ': %s',
132
+ $value
133
+ );
134
+ }
135
+ return $formatted;
136
+ }
137
+
138
+
139
+ /**
140
+ * Gets a string of formatted error log entries.
141
+ * @return string
142
+ */
143
+ private function get_formatted_log() {
144
+ $log = get_option( self::LOG_OPTION );
145
+ if ( ! $log ) {
146
+ return 'None';
147
+ }
148
+
149
+ $text = '';
150
+ foreach ( $log as $error ) {
151
+ foreach ( $error as $key => $value ) {
152
+ $text .= ucwords( $key ) . ': ' . $value . "\n";
153
+ }
154
+ }
155
+
156
+ return $text;
157
+ }
158
+
159
+ }
160
+
161
+ new Ga_SupportLogger();
view/ga_auth_button.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <button id="ga_authorize_with_google_button" class="button-primary"
2
+ <?php if ( Ga_Helper::are_features_enabled() ) : ?>
3
+ onclick="ga_popup.authorize( event, '<?php echo esc_attr( $url ); ?>' )"
4
+ <?php endif; ?>
5
+ <?php echo( ( esc_attr( $manually_id ) || ! Ga_Helper::are_features_enabled() || Ga_Helper::is_curl_disabled() ) ? 'disabled="disabled"' : '' ); ?>
6
+ ><?php _e( $label ) ?>
7
+ </button>
view/ga_dashboard_widget.php CHANGED
@@ -21,25 +21,36 @@
21
  </div>
22
 
23
  <div>
24
- <div id="chart_div" style="width: 100%;"></div>
 
 
 
 
 
 
 
 
 
 
 
25
  <div>
26
  <div id="boxes-container">
27
  <div class="ga-box-row">
28
- <?php if ( ! empty( $boxes ) ) : ?>
29
- <?php $iter = 1; ?>
30
- <?php foreach ( $boxes as $k => $v ) : ?>
31
  <div class="ga-box-column ga-box-dashboard">
32
  <div style="color: grey; font-size: 13px;"
33
  id="ga_box_dashboard_label_<?php echo $k; ?>"><?php echo $v['label'] ?></div>
34
  <div style="font-size: 15px;"
35
  id="ga_box_dashboard_value_<?php echo $k; ?>"><?php echo $v['value'] ?></div>
36
  </div>
37
- <?php if ( ( ( $iter ++ ) % 3 ) == 0 ) : ?>
38
  </div>
39
  <div class="ga-box-row">
40
- <?php endif; ?>
41
- <?php endforeach; ?>
42
- <?php endif; ?>
43
  </div>
44
  </div>
45
  </div>
@@ -50,20 +61,28 @@
50
  </div>
51
 
52
  <script type="text/javascript">
 
 
 
53
  <?php if ( ! empty( $chart ) ) : ?>
54
  dataArr = [['Day', 'Pageviews'],<?php
55
- $arr = "";
56
- foreach ( $chart as $row ) {
57
- if ( $arr ) {
58
- $arr .= ",";
59
- }
60
- $arr .= "['" . $row['day'] . "'," . $row['current'] . "]";
61
- }
62
 
63
- echo $arr;
64
- ?>];
65
 
66
- ga_dashboard.init(dataArr);
67
  ga_dashboard.events(dataArr);
68
  <?php endif; ?>
 
 
 
 
 
69
  </script>
21
  </div>
22
 
23
  <div>
24
+ <div id="chart_div" style="width: 100%;">
25
+ <?php if ( $show_trigger_button ): ?>
26
+ <div style="text-align: center">
27
+ <div style="margin: 20px auto;">
28
+ <button id="ga-widget-trigger" style="border: 1px solid #cccccc;width: 60%; padding: 10px"
29
+ class="button-link">Click here to get data
30
+ </button>
31
+ </div>
32
+ </div>
33
+ <?php endif; ?>
34
+ </div>
35
+ <div id="ga_widget_error" class="notice notice-warning" style="display: none;"></div>
36
  <div>
37
  <div id="boxes-container">
38
  <div class="ga-box-row">
39
+ <?php if ( ! empty( $boxes ) ) : ?>
40
+ <?php $iter = 1; ?>
41
+ <?php foreach ( $boxes as $k => $v ) : ?>
42
  <div class="ga-box-column ga-box-dashboard">
43
  <div style="color: grey; font-size: 13px;"
44
  id="ga_box_dashboard_label_<?php echo $k; ?>"><?php echo $v['label'] ?></div>
45
  <div style="font-size: 15px;"
46
  id="ga_box_dashboard_value_<?php echo $k; ?>"><?php echo $v['value'] ?></div>
47
  </div>
48
+ <?php if ( ( ( $iter ++ ) % 3 ) == 0 ) : ?>
49
  </div>
50
  <div class="ga-box-row">
51
+ <?php endif; ?>
52
+ <?php endforeach; ?>
53
+ <?php endif; ?>
54
  </div>
55
  </div>
56
  </div>
61
  </div>
62
 
63
  <script type="text/javascript">
64
+ const GA_NONCE = '<?php echo $ga_nonce; ?>';
65
+ const GA_NONCE_FIELD = '<?php echo Ga_Admin_Controller::GA_NONCE_FIELD_NAME; ?>';
66
+ <?php if ( empty( $show_trigger_button ) ): ?>
67
  <?php if ( ! empty( $chart ) ) : ?>
68
  dataArr = [['Day', 'Pageviews'],<?php
69
+ $arr = "";
70
+ foreach ( $chart as $row ) {
71
+ if ( $arr ) {
72
+ $arr .= ",";
73
+ }
74
+ $arr .= "['" . $row['day'] . "'," . $row['current'] . "]";
75
+ }
76
 
77
+ echo $arr;
78
+ ?>];
79
 
80
+ ga_dashboard.init(dataArr, true);
81
  ga_dashboard.events(dataArr);
82
  <?php endif; ?>
83
+ <?php else: ?>
84
+ dataArr = [['Day', 'Pageviews'], []];
85
+ ga_dashboard.init(false, false);
86
+ ga_dashboard.events();
87
+ <?php endif; ?>
88
  </script>
view/ga_debug_modal.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="ga_debug_modal" class="ga-modal" tabindex="-1">
2
+ <div class="ga-modal-dialog">
3
+ <div id="ga_debug_modal_content" class="ga-modal-content">
4
+ <div class="ga-modal-header">
5
+ <span id="ga_close" class="ga-close">&times;</span>
6
+ <h4 class="ga-modal-title"><?php _e( 'Please send debug info:' ) ?></h4>
7
+ </div>
8
+ <div class="ga-modal-body">
9
+ <div id="ga_debug_error" class="ga-alert ga-alert-danger" style="display: none;"></div>
10
+ <div id="ga_debug_success" class="ga-alert ga-alert-success" style="display: none;"></div>
11
+ <div class="ga-loader-wrapper">
12
+ <div class="ga-loader"></div>
13
+ </div>
14
+ <div class="ga-debug-form-div">
15
+ <label for="ga_debug_email" class="ga-debug-form-label"><strong><?php _e( 'Your Email' ); ?></strong>:</label>
16
+ <input id="ga_debug_email" class="ga-debug-form-field" type="text" placeholder="<?php _e( 'Type your email here' ) ?>"/>
17
+ </div>
18
+ <div class="ga-debug-form-div">
19
+ <label id="ga_debug_description_label" for="ga_debug_description" class="ga-debug-form-label"><strong><?php _e( 'Description of the issue' ); ?></strong>:</label>
20
+ <textarea id="ga_debug_description" class="ga-debug-form-field" rows="4" cols="50"></textarea>
21
+ </div>
22
+ <div class="ga-debug-form-div">
23
+ <label for="ga_debug_info" class="ga-debug-form-label"><strong><?php _e( 'Debug info' ); ?></strong>:</label>
24
+ <textarea id="ga_debug_info" class="ga-debug-form-field" rows="8" cols="50"><?php echo $debug_info ?></textarea>
25
+ </div>
26
+ </div>
27
+ <div class="ga-modal-footer">
28
+ <button id="ga_btn_close" type="button" class="button">Close</button>
29
+ <button type="button" class="button-primary"
30
+ id="ga-send-debug-email"
31
+ onclick="ga_debug.send_email( event )"><?php _e( 'Send' ); ?></button>
32
+ </div>
33
+ </div><!-- /.modal-content -->
34
+ </div><!-- /.modal-dialog -->
35
+ </div><!-- /.modal -->
view/page.php CHANGED
@@ -22,7 +22,7 @@
22
  </div><!-- /.modal-content -->
23
  </div><!-- /.modal-dialog -->
24
  </div><!-- /.modal -->
25
-
26
  <div class="wrap ga-wrap">
27
  <h2>Google Analytics - <?php _e( 'Settings' ); ?></h2>
28
  <div class="ga_container">
@@ -43,14 +43,7 @@
43
  </label>
44
  </th>
45
  <td <?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'class="ga-tooltip"' : ''; ?>>
46
- <button id="ga_authorize_with_google_button" class="button-primary"
47
- <?php if ( Ga_Helper::are_features_enabled() ) : ?>
48
- onclick="ga_popup.authorize( event, '<?php echo esc_attr( $data['popup_url'] ); ?>' )"
49
- <?php endif; ?>
50
- <?php echo( ( esc_attr( $data[ Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME ] ) || ! Ga_Helper::are_features_enabled() ) ? 'disabled="disabled"' : '' ); ?>
51
- ><?php _e( 'Authenticate
52
- with Google' ) ?>
53
- </button>
54
  <span class="ga-tooltiptext"><?php _e( $tooltip ); ?></span>
55
  <?php if ( ! empty( $data[ Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME ] ) ): ?>
56
  <div class="ga_warning">
@@ -62,7 +55,9 @@
62
 
63
  <?php if ( ! empty( $data['ga_accounts_selector'] ) ): ?>
64
  <th scope="row"><?php echo _e( 'Google Analytics Account' ) ?>:</th>
65
- <td><?php echo $data['ga_accounts_selector']; ?></td>
 
 
66
  <?php endif; ?>
67
 
68
  </tr>
@@ -146,6 +141,13 @@
146
 
147
  </td>
148
  </tr>
 
 
 
 
 
 
 
149
  <tr valign="top">
150
  <th scope="row"><?php _e( 'Disable all features' ) ?>:</th>
151
  <td>
@@ -164,9 +166,6 @@
164
  </p>
165
  </form>
166
  </div>
167
- <p class="ga-love-text"><?php _e( 'Experiencing a problem or have feedback for us?' ); ?> <a
168
- href="https://googleanalytics.zendesk.com/hc/en-us"><?php _e( 'We\'d love to hear from you!' ); ?> </a>
169
- </p>
170
  <p class="ga-love-text"><?php _e( 'Love this plugin?' ); ?> <a
171
  href="https://wordpress.org/support/plugin/googleanalytics/reviews/#new-post"><?php _e( ' Please help spread the word by leaving a 5-star review!' ); ?> </a>
172
  </p>
22
  </div><!-- /.modal-content -->
23
  </div><!-- /.modal-dialog -->
24
  </div><!-- /.modal -->
25
+ <?php echo $data[ 'debug_modal' ] ?>
26
  <div class="wrap ga-wrap">
27
  <h2>Google Analytics - <?php _e( 'Settings' ); ?></h2>
28
  <div class="ga_container">
43
  </label>
44
  </th>
45
  <td <?php echo ( ! Ga_Helper::are_features_enabled() ) ? 'class="ga-tooltip"' : ''; ?>>
46
+ <?php echo $data[ 'auth_button' ] ?>
 
 
 
 
 
 
 
47
  <span class="ga-tooltiptext"><?php _e( $tooltip ); ?></span>
48
  <?php if ( ! empty( $data[ Ga_Admin::GA_WEB_PROPERTY_ID_MANUALLY_OPTION_NAME ] ) ): ?>
49
  <div class="ga_warning">
55
 
56
  <?php if ( ! empty( $data['ga_accounts_selector'] ) ): ?>
57
  <th scope="row"><?php echo _e( 'Google Analytics Account' ) ?>:</th>
58
+ <td><?php echo $data['ga_accounts_selector']; ?>
59
+ <div class="wrap"><?php echo $data[ 'auth_button' ] ?></div>
60
+ </td>
61
  <?php endif; ?>
62
 
63
  </tr>
141
 
142
  </td>
143
  </tr>
144
+ <tr valign="top">
145
+ <td colspan="2">
146
+ <p>If you experience an issue with this plugin, we are here to help! You can visit our <a href="https://googleanalytics.zendesk.com/hc/en-us">support portal</a> to find answers to the most frequently asked questions and to submit a support request. We aim to respond to everyone within one business day.</p>
147
+ <p>If your issue is difficult to debug, click the button below to automatically send us your error logs and debugging info.</p>
148
+ <p><button id="ga_debug_button" class="button button-secondary" onclick="ga_debug.open_modal( event )" >Send Debugging Info</button></p>
149
+ </td>
150
+ </tr>
151
  <tr valign="top">
152
  <th scope="row"><?php _e( 'Disable all features' ) ?>:</th>
153
  <td>
166
  </p>
167
  </form>
168
  </div>
 
 
 
169
  <p class="ga-love-text"><?php _e( 'Love this plugin?' ); ?> <a
170
  href="https://wordpress.org/support/plugin/googleanalytics/reviews/#new-post"><?php _e( ' Please help spread the word by leaving a 5-star review!' ); ?> </a>
171
  </p>
view/statistics.php CHANGED
File without changes