UpdraftPlus WordPress Backup Plugin - Version 1.13.12

Version Description

  • 25/Oct/2017 =

  • FEATURE: Warn the user if their .htaccess seems to contain a redirect (or any other reference) to the old site after migration.

  • FEATURE: When importing a database, warn the user if the current MySQL server does not support a used collation, and offer to replace it

  • FIX: Saving of S3 settings had taken a dislike to buckets beginning with a capital 'B'

  • FIX: UpdraftCentral users' module was failing to handle loading a very large number of users

  • TWEAK: Allows the installation and/or activation of the WP-Optimize plugin from UpdraftCentral

  • TWEAK: Add multisite attribute to the error response object for the create user, delete user and edit user actions.

  • TWEAK: All remote storage methods are ported over to using configuration templates internally

  • TWEAK: Include a method to add a manifest file inside each backup archive

  • TWEAK: All code relating to the now-dead Dropbox APIv1 removed (N.B. If you've not updated UpdraftPlus since November 2016 and were using Dropbox, it won't be working - https://blogs.dropbox.com/developers/2017/09/api-v1-shutdown-details/)

  • TWEAK: Prevent a PHP log notice upon database backup restore when using Google Drive without a client ID

  • TWEAK: Prevent the final 'Restore' button being pressed a second time

  • TWEAK: Improvements to the UpdraftCentral wizard

  • TWEAK: Update to trunk version of plugin updater (paid versions), restoring the ability to work on older WP versions (3.8 and before)

  • TWEAK: Add lbakut_activity_log to the list of large log tables

  • TWEAK: Updater in paid versions now requests JSON as response format for responses when claiming entitlements

  • TWEAK: Resolve: Backup labels could end up with extraneous slashes in output

  • TWEAK: Updater in paid versions can now receive and process update information in respond to entitlement claim - one less HTTP round-trip

  • TWEAK: Improve Google Cloud authentication success message for bucket name is not defined

  • TWEAK: UpdraftVault commands now pass an instance identifier

Download this release

Release Info

Developer DavidAnderson
Plugin Icon 128x128 UpdraftPlus WordPress Backup Plugin
Version 1.13.12
Comparing to
See all releases

Code changes from version 1.13.11 to 1.13.12

Files changed (42) hide show
  1. admin.php +634 -424
  2. backup.php +484 -270
  3. central/bootstrap.php +36 -25
  4. central/commands.php +1 -1
  5. central/listener.php +4 -4
  6. central/modules/analytics.php +1 -1
  7. central/modules/comments.php +1 -1
  8. central/modules/core.php +33 -18
  9. central/modules/plugin.php +184 -0
  10. central/modules/updates.php +4 -4
  11. central/modules/updraftvault.php +0 -42
  12. central/modules/users.php +125 -57
  13. class-updraftplus.php +339 -74
  14. css/admin.css +10 -4
  15. css/admin.min.css +1 -1
  16. css/admin.min.css.map +1 -1
  17. images/addons-images/backblaze.png +0 -0
  18. images/notices/metaslider_logo.png +0 -0
  19. includes/Dropbox/API.php +0 -594
  20. includes/Dropbox/Exception.php +0 -28
  21. includes/Dropbox/OAuth/Consumer/ConsumerAbstract.php +0 -433
  22. includes/Dropbox/OAuth/Consumer/Curl.php +0 -249
  23. includes/Dropbox/OAuth/Consumer/WordPress.php +0 -80
  24. includes/Dropbox/OAuth/Storage/Encrypter.php +0 -109
  25. includes/Dropbox/OAuth/Storage/StorageInterface.php +0 -30
  26. includes/Dropbox/OAuth/Storage/WordPress.php +0 -195
  27. includes/Dropbox2/OAuth/Consumer/ConsumerAbstract.php +3 -1
  28. includes/Dropbox2/OAuth/Consumer/Curl.php +2 -1
  29. includes/class-commands.php +28 -14
  30. includes/class-wpadmin-commands.php +69 -0
  31. includes/handlebars/LICENSE +1 -1
  32. includes/handlebars/handlebars.js +3 -3
  33. includes/handlebars/handlebars.min.js +3 -3
  34. includes/handlebars/handlebars.runtime.js +3 -3
  35. includes/handlebars/handlebars.runtime.min.js +3 -3
  36. includes/updraft-admin.js +129 -91
  37. includes/updraft-admin.min.js +3 -3
  38. includes/updraftplus-notices.php +1 -1
  39. includes/updraftvault.php +46 -0
  40. languages/updraftplus-af.po +1203 -1122
  41. languages/updraftplus-ar.mo +0 -0
  42. languages/updraftplus-ar.po +431 -343
admin.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- if (!defined ('UPDRAFTPLUS_DIR')) die('No direct access allowed');
4
 
5
  // Admin-area code lives here. This gets called in admin_menu, earlier than admin_init
6
 
@@ -15,6 +15,8 @@ class UpdraftPlus_Admin {
15
 
16
  private $backups_instance_ids;
17
 
 
 
18
  public function __construct() {
19
  $this->admin_init();
20
  }
@@ -31,14 +33,15 @@ class UpdraftPlus_Admin {
31
  return $path;
32
  }
33
 
 
 
 
 
 
34
  public function get_templates_dir() {
35
  return apply_filters('updraftplus_templates_dir', $this->wp_normalize_path(UPDRAFTPLUS_DIR.'/templates'));
36
  }
37
 
38
- public function get_templates_url() {
39
- return apply_filters('updraftplus_templates_url', UPDRAFTPLUS_DIR.'/templates');
40
- }
41
-
42
  private function register_template_directories() {
43
 
44
  $template_directories = array();
@@ -118,11 +121,17 @@ class UpdraftPlus_Admin {
118
  $clientid = $storage_options['clientid'];
119
  $token = empty($storage_options['token']) ? '' : $storage_options['token'];
120
  }
121
- if (!empty($clientid) && '' == $token) add_action('all_admin_notices', array($this, 'show_admin_warning_googledrive'));
 
 
 
122
  unset($clientid);
123
  unset($token);
124
  } else {
125
- if (empty($storage_options['user_id'])) add_action('all_admin_notices', array($this, 'show_admin_warning_googledrive'));
 
 
 
126
  }
127
  }
128
  }
@@ -140,7 +149,10 @@ class UpdraftPlus_Admin {
140
  $clientid = $storage_options['clientid'];
141
  $token = (empty($storage_options['token'])) ? '' : $storage_options['token'];
142
 
143
- if (!empty($clientid) && empty($token)) add_action('all_admin_notices', array($this,'show_admin_warning_googlecloud'));
 
 
 
144
  }
145
  }
146
  }
@@ -156,7 +168,8 @@ class UpdraftPlus_Admin {
156
  } elseif (!empty($settings['settings'])) {
157
  foreach ($settings['settings'] as $instance_id => $storage_options) {
158
  if (empty($storage_options['tk_access_token'])) {
159
- add_action('all_admin_notices', array($this, 'show_admin_warning_dropbox'));
 
160
  }
161
  }
162
  }
@@ -172,14 +185,19 @@ class UpdraftPlus_Admin {
172
  $updraftplus->log_wp_error($settings, true, true);
173
  } elseif (!empty($settings['settings'])) {
174
  foreach ($settings['settings'] as $instance_id => $storage_options) {
175
- if((defined('UPDRAFTPLUS_CUSTOM_ONEDRIVE_APP') && UPDRAFTPLUS_CUSTOM_ONEDRIVE_APP)){
176
- if(!empty($storage_options['clientid']) && !empty($storage_options['secret']) && empty($storage_options['refresh_token'])) {
177
- add_action('all_admin_notices', array($this,'show_admin_warning_onedrive'));
 
178
  } elseif (empty($storage_options['refresh_token'])) {
179
- add_action('all_admin_notices', array($this,'show_admin_warning_onedrive'));
 
 
 
 
 
 
180
  }
181
- } else{
182
- if(empty($storage_options['refresh_token']))add_action('all_admin_notices', array($this,'show_admin_warning_onedrive'));
183
  }
184
  }
185
  }
@@ -196,7 +214,7 @@ class UpdraftPlus_Admin {
196
  } elseif (!empty($settings['settings'])) {
197
  foreach ($settings['settings'] as $instance_id => $storage_options) {
198
  if (empty($storage_options['token']) && empty($storage_options['email'])) {
199
- add_action('all_admin_notices', array($this,'show_admin_warning_updraftvault'));
200
  }
201
  }
202
  }
@@ -205,7 +223,7 @@ class UpdraftPlus_Admin {
205
  if ($this->disk_space_check(1048576*35) === false) add_action('all_admin_notices', array($this, 'show_admin_warning_diskspace'));
206
  }
207
 
208
- private function setup_all_admin_notices_udonly($service, $override = false){
209
  global $wp_version;
210
 
211
  if (UpdraftPlus_Options::user_can_manage() && defined('DISABLE_WP_CRON') && DISABLE_WP_CRON && (!defined('UPDRAFTPLUS_DISABLE_WP_CRON_NOTICE') || !UPDRAFTPLUS_DISABLE_WP_CRON_NOTICE)) {
@@ -213,7 +231,7 @@ class UpdraftPlus_Admin {
213
  }
214
 
215
  if (UpdraftPlus_Options::get_updraft_option('updraft_debug_mode')) {
216
- @ini_set('display_errors',1);
217
  @error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
218
  add_action('all_admin_notices', array($this, 'show_admin_debug_warning'));
219
  }
@@ -223,9 +241,9 @@ class UpdraftPlus_Admin {
223
  $this->no_settings_warning = true;
224
  }
225
 
226
- # Avoid false positives, by attempting to raise the limit (as happens when we actually do a backup)
227
  @set_time_limit(UPDRAFTPLUS_SET_TIME_LIMIT);
228
- $max_execution_time = (int)@ini_get('max_execution_time');
229
  if ($max_execution_time>0 && $max_execution_time<20) {
230
  add_action('all_admin_notices', array($this, 'show_admin_warning_execution_time'));
231
  }
@@ -240,20 +258,10 @@ class UpdraftPlus_Admin {
240
  if (version_compare($wp_version, '3.2', '<')) add_action('all_admin_notices', array($this, 'show_admin_warning_wordpressversion'));
241
  }
242
 
243
- /*
244
- private function reset_all_updraft_admin_notices() {
245
-
246
- $actions_to_remove = array('show_admin_warning_googledrive', 'show_admin_warning_googlecloud', 'show_admin_warning_dropbox', 'show_admin_warning_onedrive', 'show_admin_warning_updraftvault', 'show_admin_warning_diskspace', 'show_admin_warning_disabledcron', 'show_admin_debug_warning', 'show_admin_warning_execution_time', 'show_admin_warning_litespeed', 'show_admin_warning_wordpressversion');
247
-
248
- foreach ($actions_to_remove as $action) {
249
- remove_action('all_admin_notices', $action);
250
- }
251
-
252
- }
253
- */
254
-
255
- //Used to output the information for the next scheduled backup
256
- //**// moved to function for the ajax saves
257
  public function next_scheduled_backups_output() {
258
  // UNIX timestamp
259
  $next_scheduled_backup = wp_next_scheduled('updraft_backup');
@@ -262,14 +270,14 @@ class UpdraftPlus_Admin {
262
  $next_scheduled_backup_gmt = gmdate('Y-m-d H:i:s', $next_scheduled_backup);
263
  // Convert to blog time zone
264
  $next_scheduled_backup = get_date_from_gmt($next_scheduled_backup_gmt, 'D, F j, Y H:i');
265
- // $next_scheduled_backup = date_i18n('D, F j, Y H:i', $next_scheduled_backup);
266
  } else {
267
  $next_scheduled_backup = __('Nothing currently scheduled', 'updraftplus');
268
  $files_not_scheduled = true;
269
  }
270
 
271
  $next_scheduled_backup_database = wp_next_scheduled('updraft_backup_database');
272
- if (UpdraftPlus_Options::get_updraft_option('updraft_interval_database',UpdraftPlus_Options::get_updraft_option('updraft_interval')) == UpdraftPlus_Options::get_updraft_option('updraft_interval')) {
273
  if (isset($files_not_scheduled)) {
274
  $next_scheduled_backup_database = $next_scheduled_backup;
275
  $database_not_scheduled = true;
@@ -283,7 +291,7 @@ class UpdraftPlus_Admin {
283
  $next_scheduled_backup_database_gmt = gmdate('Y-m-d H:i:s', $next_scheduled_backup_database);
284
  // Convert to blog time zone
285
  $next_scheduled_backup_database = get_date_from_gmt($next_scheduled_backup_database_gmt, 'D, F j, Y H:i');
286
- // $next_scheduled_backup_database = date_i18n('D, F j, Y H:i', $next_scheduled_backup_database);
287
  } else {
288
  $next_scheduled_backup_database = __('Nothing currently scheduled', 'updraftplus');
289
  $database_not_scheduled = true;
@@ -305,13 +313,16 @@ class UpdraftPlus_Admin {
305
  }
306
  }
307
 
 
 
 
308
  private function admin_init() {
309
 
310
  add_action('core_upgrade_preamble', array($this, 'core_upgrade_preamble'));
311
  add_action('admin_action_upgrade-plugin', array($this, 'admin_action_upgrade_pluginortheme'));
312
  add_action('admin_action_upgrade-theme', array($this, 'admin_action_upgrade_pluginortheme'));
313
 
314
- add_action('admin_head', array($this,'admin_head'));
315
  add_filter((is_multisite() ? 'network_admin_' : '').'plugin_action_links', array($this, 'plugin_action_links'), 10, 2);
316
  add_action('wp_ajax_updraft_download_backup', array($this, 'updraft_download_backup'));
317
  add_action('wp_ajax_updraft_ajax', array($this, 'updraft_ajax_handler'));
@@ -326,8 +337,8 @@ class UpdraftPlus_Admin {
326
  // Add a new Ajax action for saving settings
327
  add_action('wp_ajax_updraft_savesettings', array($this, 'updraft_ajax_savesettings'));
328
 
329
- // Ajax for settings import and export
330
- add_action('wp_ajax_updraft_importsettings', array($this, 'updraft_ajax_importsettings'));
331
 
332
  // UpdraftPlus templates
333
  $this->register_template_directories();
@@ -346,7 +357,7 @@ class UpdraftPlus_Admin {
346
 
347
  // Main dashboard page advert
348
  // Since our nonce is printed, make sure they have sufficient credentials
349
- if ($pagenow == 'index.php' && current_user_can('update_plugins') && (!file_exists(UPDRAFTPLUS_DIR.'/udaddons') || (defined('UPDRAFTPLUS_FORCE_DASHNOTICE') && UPDRAFTPLUS_FORCE_DASHNOTICE))) {
350
 
351
  $dismissed_until = UpdraftPlus_Options::get_updraft_option('updraftplus_dismisseddashnotice', 0);
352
 
@@ -355,17 +366,17 @@ class UpdraftPlus_Admin {
355
  $installed = @filemtime($backup_dir.'/index.html');
356
  $installed_for = time() - $installed;
357
 
358
- if (($installed && time() > $dismissed_until && $installed_for > 28*86400 && !defined('UPDRAFTPLUS_NOADS_B')) || (defined('UPDRAFTPLUS_FORCE_DASHNOTICE') && UPDRAFTPLUS_FORCE_DASHNOTICE)) {
359
  add_action('all_admin_notices', array($this, 'show_admin_notice_upgradead'));
360
  }
361
  }
362
 
363
- //Moved out for use with Ajax saving
364
  $this->setup_all_admin_notices_global($service);
365
  }
366
 
367
  // Next, the actions that only come on the UpdraftPlus page
368
- if ($pagenow != UpdraftPlus_Options::admin_page() || empty($_REQUEST['page']) || 'updraftplus' != $_REQUEST['page']) return;
369
  $this->setup_all_admin_notices_udonly($service);
370
 
371
  add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts'), 99999);
@@ -374,9 +385,8 @@ class UpdraftPlus_Admin {
374
  /**
375
  * Sets up what is needed to allow an in-page backup to be run. Will enqueue scripts and output appropriate HTML (so, should be run when at a suitable place). Not intended for use on the UpdraftPlus settings page.
376
  *
377
- * @param string $title Text to use for the title of the modal
378
  * @param callable $callback Callable function to output the contents of the updraft_inpage_prebackup element - i.e. what shows in the modal before a backup beings.
379
- *
380
  */
381
  public function add_backup_scaffolding($title, $callback) {
382
  $this->admin_enqueue_scripts();
@@ -424,7 +434,7 @@ class UpdraftPlus_Admin {
424
  die();
425
  }
426
 
427
- $restore_nonce = (string)$_POST['restorenonce'];
428
 
429
  if (empty($_POST['ajaxauth'])) {
430
  echo json_encode(array('e' => 'Illegitimate data sent (2)'));
@@ -461,15 +471,15 @@ class UpdraftPlus_Admin {
461
  $updraftplus->backup_time_nonce($restore_nonce);
462
  $updraftplus->logfile_open($restore_nonce);
463
 
464
- $timestamp = empty($_POST['timestamp']) ? false : (int)$_POST['timestamp'];
465
- $multisite = empty($_POST['multisite']) ? false : (bool)$_POST['multisite'];
466
- $created_by_version = empty($_POST['created_by_version']) ? false : (int)$_POST['created_by_version'];
467
 
468
  // TODO: We need to know about first_one (not yet sent), as well as last_one
469
 
470
  // TODO: Verify the values of these
471
- $type = empty($_POST['type']) ? false : (int)$_POST['type'];
472
- $backupfile = empty($_POST['backupfile']) ? false : (string)$_POST['backupfile'];
473
 
474
  $updraftplus->log("Deferred restore resumption: $type: $backupfile (timestamp=$timestamp, last_one=$last_one)");
475
 
@@ -557,18 +567,15 @@ class UpdraftPlus_Admin {
557
  'id' => 'updraft_admin_node_premium',
558
  'title' => 'UpdraftPlus Premium',
559
  'parent' => 'updraft_admin_node',
560
- 'href' => apply_filters('updraftplus_com_link','https://updraftplus.com/shop/updraftplus-premium/')
561
  );
562
  $wp_admin_bar->add_node($args);
563
  }
564
  }
565
 
566
- // // Defeat other plugins/themes which dump their jQuery UI CSS onto our settings page
567
- // public function style_loader_tag($link, $handle) {
568
- // if ('jquery-ui' != $handle || false === strpos) return $link;
569
- // return "<link rel='stylesheet' id='$handle-css' $title href='$href' type='text/css' media='$media' />\n";
570
- // }
571
-
572
  public function show_admin_notice_upgradead() {
573
  $this->include_template('wp-admin/notices/thanks-for-using-main-dash.php');
574
  }
@@ -593,7 +600,9 @@ class UpdraftPlus_Admin {
593
 
594
  }
595
 
596
- // This is also called directly from the auto-backup add-on
 
 
597
  public function admin_enqueue_scripts() {
598
 
599
  global $updraftplus, $wp_locale;
@@ -604,10 +613,10 @@ class UpdraftPlus_Admin {
604
  // Defeat other plugins/themes which dump their jQuery UI CSS onto our settings page
605
  wp_deregister_style('jquery-ui');
606
  $jquery_ui_css_enqueue_version = (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) ? '1.11.4'.'.'.time() : '1.11.4';
607
- wp_enqueue_style('jquery-ui', UPDRAFTPLUS_URL.'/includes/jquery-ui.custom'.$min_or_not.'.css', array(), $jquery_ui_css_enqueue_version);
608
 
609
  wp_enqueue_style('updraft-admin-css', UPDRAFTPLUS_URL.'/css/admin'.$min_or_not.'.css', array(), $enqueue_version);
610
- // add_filter('style_loader_tag', array($this, 'style_loader_tag'), 10, 2);
611
 
612
  $this->ensure_sufficient_jquery_and_enqueue();
613
  $jquery_blockui_enqueue_version = (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) ? '2.70.0'.'.'.time() : '2.70.0';
@@ -624,14 +633,14 @@ class UpdraftPlus_Admin {
624
 
625
  $day_selector = '';
626
  for ($day_index = 0; $day_index <= 6; $day_index++) {
627
- // $selected = ($opt == $day_index) ? 'selected="selected"' : '';
628
  $selected = '';
629
  $day_selector .= "\n\t<option value='" . $day_index . "' $selected>" . $wp_locale->get_weekday($day_index) . '</option>';
630
  }
631
 
632
  $mday_selector = '';
633
  for ($mday_index = 1; $mday_index <= 28; $mday_index++) {
634
- // $selected = ($opt == $mday_index) ? 'selected="selected"' : '';
635
  $selected = '';
636
  $mday_selector .= "\n\t<option value='" . $mday_index . "' $selected>" . $mday_index . '</option>';
637
  }
@@ -646,7 +655,7 @@ class UpdraftPlus_Admin {
646
  'excludedeverything' => __('If you exclude both the database and the files, then you have excluded everything!', 'updraftplus'),
647
  'nofileschosen' => __('You have chosen to backup files, but no file entities have been selected', 'updraftplus'),
648
  'notableschosen' => __('You have chosen to backup a database, but no tables have been selected', 'updraftplus'),
649
- 'restoreproceeding' => __('The restore operation has begun. Do not press stop or close your browser until it reports itself as having finished.', 'updraftplus'),
650
  'unexpectedresponse' => __('Unexpected response:', 'updraftplus'),
651
  'servererrorcode' => __('The web server returned an error code (try again, or check your web server logs)', 'updraftplus'),
652
  'newuserpass' => __("The new user's RackSpace console password is (this will not be shown again):", 'updraftplus'),
@@ -705,13 +714,13 @@ class UpdraftPlus_Admin {
705
  'updatequotacount' => __('Update quota count', 'updraftplus'),
706
  'addingsite' => __('Adding...', 'updraftplus'),
707
  'addsite' => __('Add site', 'updraftplus'),
708
- // 'resetting' => __('Resetting...', 'updraftplus'),
709
  'creating_please_allow' => __('Creating...', 'updraftplus').(function_exists('openssl_encrypt') ? '' : ' ('.__('your PHP install lacks the openssl module; as a result, this can take minutes; if nothing has happened by then, then you should either try a smaller key size, or ask your web hosting company how to enable this PHP module on your setup.', 'updraftplus').')'),
710
  'sendtosite' => __('Send to site:', 'updraftplus'),
711
  'checkrpcsetup' => sprintf(__('You should check that the remote site is online, not firewalled, does not have security modules that may be blocking access, has UpdraftPlus version %s or later active and that the keys have been entered correctly.', 'updraftplus'), '2.10.3'),
712
  'pleasenamekey' => __('Please give this key a name (e.g. indicate the site it is for):', 'updraftplus'),
713
  'key' => __('Key', 'updraftplus'),
714
- 'nokeynamegiven' => sprintf(__("Failure: No %s was given.",'updraftplus'), __('key name', 'updraftplus')),
715
  'deleting' => __('Deleting...', 'updraftplus'),
716
  'enter_mothership_url' => __('Please enter a valid URL', 'updraftplus'),
717
  'delete_response_not_understood' => __("We requested to delete the file, but could not understand the server's response", 'updraftplus'),
@@ -739,8 +748,8 @@ class UpdraftPlus_Admin {
739
  'settings_test_result' => __('%s settings test result:', 'updraftplus'),
740
  'nothing_yet_logged' => __('Nothing yet logged', 'updraftplus'),
741
  'import_select_file' => __('You have not yet selected a file to import.', 'updraftplus'),
742
- 'import_invalid_json_file' => __('Error: The chosen file is corrupt. Please choose a valid UpdraftPlus export file.', 'updraftplus'),
743
- 'updraft_settings_url' => UpdraftPlus_Options::admin_page_url().'?page=updraftplus',
744
  'network_site_url' => network_site_url(),
745
  'importing' => __('Importing...', 'updraftplus'),
746
  'importing_data_from' => __('This will import data from:', 'updraftplus'),
@@ -758,11 +767,13 @@ class UpdraftPlus_Admin {
758
  'loading_log_file' => __('Loading log file', 'updraftplus'),
759
  'updraftplus_version' => $updraftplus->version,
760
  'updraftcentral_wizard_empty_url' => __('Please enter the URL where your UpdraftCentral dashboard is hosted.'),
761
- 'updraftcentral_wizard_invalid_url' => __('Please enter a valid URL e.g http://example.com', 'updraftplus')
762
- ) );
763
  }
764
 
765
- // Despite the name, this fires irrespective of what capabilities the user has (even none - so be careful)
 
 
766
  public function core_upgrade_preamble() {
767
  // They need to be able to perform backups, and to perform updates
768
  if (!UpdraftPlus_Options::user_can_manage() || (!current_user_can('update_core') && !current_user_can('update_plugins') && !current_user_can('update_themes'))) return;
@@ -772,18 +783,18 @@ class UpdraftPlus_Admin {
772
  }
773
 
774
  ?>
775
- <?php
776
  if (!class_exists('UpdraftPlus_Addon_Autobackup')) {
777
- if (!class_exists('UpdraftPlus_Notices')) require_once(UPDRAFTPLUS_DIR.'/includes/updraftplus-notices.php');
778
  global $updraftplus_notices;
779
- echo apply_filters('updraftplus_autobackup_blurb', $updraftplus_notices->do_notice('autobackup', 'autobackup', true));
780
  } else {
781
  echo '<div class="updraft-ad-container updated">';
782
  echo '<h3 style="margin-top: 2px;">'. __('Be safe with an automatic backup', 'updraftplus').'</h3>';
783
- echo apply_filters('updraftplus_autobackup_blurb', '');
784
  echo '</div>';
785
  }
786
- ?>
787
  <script>
788
  jQuery(document).ready(function() {
789
  jQuery('.updraft-ad-container').appendTo('.wrap p:first');
@@ -792,16 +803,19 @@ class UpdraftPlus_Admin {
792
  <?php
793
  }
794
 
 
 
 
795
  public function admin_head() {
796
 
797
  global $pagenow;
798
 
799
- if ($pagenow != UpdraftPlus_Options::admin_page() || !isset($_REQUEST['page']) || 'updraftplus' != $_REQUEST['page'] || !UpdraftPlus_Options::user_can_manage()) return;
800
 
801
- $chunk_size = min(wp_max_upload_size()-1024, 1048576*2);
802
 
803
- # The multiple_queues argument is ignored in plupload 2.x (WP3.9+) - http://make.wordpress.org/core/2014/04/11/plupload-2-x-in-wordpress-3-9/
804
- # max_file_size is also in filters as of plupload 2.x, but in its default position is still supported for backwards-compatibility. Likewise, our use of filters.extensions below is supported by a backwards-compatibility option (the current way is filters.mime-types.extensions
805
 
806
  $plupload_init = array(
807
  'runtimes' => 'html5,flash,silverlight,html4',
@@ -822,16 +836,8 @@ class UpdraftPlus_Admin {
822
  'action' => 'plupload_action'
823
  )
824
  );
825
- // 'flash_swf_url' => includes_url('js/plupload/plupload.flash.swf'),
826
- // 'silverlight_xap_url' => includes_url('js/plupload/plupload.silverlight.xap'),
827
-
828
- // We want to receive -db files also...
829
- // if (1) {
830
- // $plupload_init['filters'] = array(array('title' => __('Allowed Files'), 'extensions' => 'zip,tar,gz,bz2,crypt,sql,txt'));
831
- // } else {
832
- // }
833
 
834
- # WP 3.9 updated to plupload 2.0 - https://core.trac.wordpress.org/ticket/25663
835
  if (is_file(ABSPATH.WPINC.'/js/plupload/Moxie.swf')) {
836
  $plupload_init['flash_swf_url'] = includes_url('js/plupload/Moxie.swf');
837
  } else {
@@ -845,11 +851,11 @@ class UpdraftPlus_Admin {
845
  }
846
 
847
  ?><script>
848
- var updraft_credentialtest_nonce='<?php echo wp_create_nonce('updraftplus-credentialtest-nonce');?>';
849
- var updraftplus_settings_nonce='<?php echo wp_create_nonce('updraftplus-settings-nonce');?>';
850
  var updraft_siteurl = '<?php echo esc_js(site_url('', 'relative'));?>';
851
- var updraft_plupload_config=<?php echo json_encode($plupload_init); ?>;
852
- var updraft_download_nonce='<?php echo wp_create_nonce('updraftplus_download');?>';
853
  var updraft_accept_archivename = <?php echo apply_filters('updraftplus_accept_archivename_js', "[]");?>;
854
  <?php
855
  $plupload_init['browse_button'] = 'plupload-browse-button2';
@@ -858,45 +864,49 @@ class UpdraftPlus_Admin {
858
  $plupload_init['multipart_params']['action'] = 'plupload_action2';
859
  $plupload_init['filters'] = array(array('title' => __('Allowed Files'), 'extensions' => 'crypt'));
860
  ?>
861
- var updraft_plupload_config2=<?php echo json_encode($plupload_init); ?>;
862
  var updraft_downloader_nonce = '<?php wp_create_nonce("updraftplus_download"); ?>'
863
  <?php
864
  $overdue = $this->howmany_overdue_crons();
865
- if ($overdue >= 4) { ?>
866
- jQuery(document).ready(function(){
867
- setTimeout(function(){updraft_check_overduecrons();}, 11000);
 
868
  });
869
  <?php } ?>
870
  </script>
871
  <?php
872
  }
873
 
874
-
875
  private function disk_space_check($space) {
876
  global $updraftplus;
877
  $updraft_dir = $updraftplus->backups_dir_location();
878
  $disk_free_space = @disk_free_space($updraft_dir);
879
- if ($disk_free_space == false) return -1;
880
  return ($disk_free_space > $space) ? true : false;
881
  }
882
 
883
- # Adds the settings link under the plugin on the plugin screen.
 
 
 
 
 
 
884
  public function plugin_action_links($links, $file) {
885
- if (is_array($links) && $file == 'updraftplus/updraftplus.php'){
886
  $settings_link = '<a href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus">'.__("Settings", "updraftplus").'</a>';
887
  array_unshift($links, $settings_link);
888
- // $settings_link = '<a href="http://david.dw-perspective.org.uk/donate">'.__("Donate","UpdraftPlus").'</a>';
889
- // array_unshift($links, $settings_link);
890
- $settings_link = '<a href="'.apply_filters('updraftplus_com_link', "https://updraftplus.com/").'">'.__("Add-Ons / Pro Support","updraftplus").'</a>';
891
  array_unshift($links, $settings_link);
892
  }
893
  return $links;
894
  }
895
 
896
  public function admin_action_upgrade_pluginortheme() {
897
- if (isset($_GET['action']) && ($_GET['action'] == 'upgrade-plugin' || $_GET['action'] == 'upgrade-theme') && !class_exists('UpdraftPlus_Addon_Autobackup') && !defined('UPDRAFTPLUS_NOADS_B')) {
898
 
899
- if ($_GET['action'] == 'upgrade-plugin') {
900
  if (!current_user_can('update_plugins')) return;
901
  } else {
902
  if (!current_user_can('update_themes')) return;
@@ -915,34 +925,33 @@ class UpdraftPlus_Admin {
915
  $submenu_file = 'themes.php';
916
  }
917
 
918
- require_once(ABSPATH.'wp-admin/admin-header.php');
919
 
920
- if (!class_exists('UpdraftPlus_Notices')) require_once(UPDRAFTPLUS_DIR.'/includes/updraftplus-notices.php');
921
  global $updraftplus_notices;
922
  $updraftplus_notices->do_notice('autobackup', 'autobackup');
923
  }
924
  }
925
 
926
- public function show_admin_warning($message, $class = "updated") {
927
  echo '<div class="updraftmessage '.$class.'">'."<p>$message</p></div>";
928
  }
929
 
930
- //
931
  public function show_admin_warning_multiple_storage_options() {
932
  $this->show_admin_warning('<strong>UpdraftPlus:</strong> '.__('An error occurred when fetching storage module options: ', 'updraftplus').htmlspecialchars($this->storage_module_option_errors), 'error');
933
  }
934
 
935
- public function show_admin_warning_unwritable(){
936
  $unwritable_mess = htmlspecialchars(__("The 'Backup Now' button is disabled as your backup directory is not writable (go to the 'Settings' tab and find the relevant option).", 'updraftplus'));
937
  $this->show_admin_warning($unwritable_mess, "error");
938
- }
939
 
940
  public function show_admin_nosettings_warning() {
941
  $this->show_admin_warning('<strong>'.__('Welcome to UpdraftPlus!', 'updraftplus').'</strong> '.__('To make a backup, just press the Backup Now button.', 'updraftplus').' <a href="#" id="updraft-navtab-settings2">'.__('To change any of the default settings of what is backed up, to configure scheduled backups, to send your backups to remote storage (recommended), and more, go to the settings tab.', 'updraftplus').'</a>', 'updated notice is-dismissible');
942
  }
943
 
944
  public function show_admin_warning_execution_time() {
945
- $this->show_admin_warning('<strong>'.__('Warning', 'updraftplus').':</strong> '.sprintf(__('The amount of time allowed for WordPress plugins to run is very low (%s seconds) - you should increase it to avoid backup failures due to time-outs (consult your web hosting company for more help - it is the max_execution_time PHP setting; the recommended value is %s seconds or more)', 'updraftplus'), (int)@ini_get('max_execution_time'), 90));
946
  }
947
 
948
  public function show_admin_warning_disabledcron() {
@@ -950,7 +959,7 @@ class UpdraftPlus_Admin {
950
  }
951
 
952
  public function show_admin_warning_diskspace() {
953
- $this->show_admin_warning('<strong>'.__('Warning', 'updraftplus').':</strong> '.sprintf(__('You have less than %s of free disk space on the disk which UpdraftPlus is configured to use to create backups. UpdraftPlus could well run out of space. Contact your the operator of your server (e.g. your web hosting company) to resolve this issue.', 'updraftplus'),'35 MB'));
954
  }
955
 
956
  public function show_admin_warning_wordpressversion() {
@@ -958,7 +967,7 @@ class UpdraftPlus_Admin {
958
  }
959
 
960
  public function show_admin_warning_litespeed() {
961
- $this->show_admin_warning('<strong>'.__('Warning', 'updraftplus').':</strong> '.sprintf(__('Your website is hosted using the %s web server.', 'updraftplus'),'LiteSpeed').' <a href="'.apply_filters('updraftplus_com_link', "https://updraftplus.com/faqs/i-am-having-trouble-backing-up-and-my-web-hosting-company-uses-the-litespeed-webserver/").'">'.__('Please consult this FAQ if you have problems backing up.', 'updraftplus').'</a>');
962
  }
963
 
964
  public function show_admin_debug_warning() {
@@ -972,38 +981,58 @@ class UpdraftPlus_Admin {
972
  return $ret;
973
  }
974
 
975
- //checking remote storage
 
 
976
  public function show_admin_warning_dropbox() {
977
- $this->show_admin_warning('<strong>'.__('UpdraftPlus notice:', 'updraftplus').'</strong> <a class="updraft_authlink" href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus&action=updraftmethod-dropbox-auth&updraftplus_dropboxauth=doit">'.sprintf(__('Follow this link to authorize access to your %s account (you will not be able to back up to %s without it).', 'updraftplus'), 'Dropbox', 'Dropbox').'</a>', 'updated updraft_authenticate_dropbox');
 
 
978
  }
979
 
 
 
 
980
  public function show_admin_warning_onedrive() {
981
- $this->show_admin_warning('<strong>'.__('UpdraftPlus notice:', 'updraftplus').'</strong> <a class="updraft_authlink" href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus&action=updraftmethod-onedrive-auth&updraftplus_onedriveauth=doit">'.sprintf(__('Follow this link to authorize access to your %s account (you will not be able to back up to %s without it).', 'updraftplus'), 'OneDrive', 'OneDrive').'</a>', 'updated updraft_authenticate_onedrive');
 
 
982
  }
983
 
984
  public function show_admin_warning_updraftvault() {
985
  $this->show_admin_warning('<strong>'.__('UpdraftPlus notice:', 'updraftplus').'</strong> '.sprintf(__('%s has been chosen for remote storage, but you are not currently connected.', 'updraftplus'), 'UpdraftPlus Vault').' '.__('Go to the remote storage settings in order to connect.', 'updraftplus'), 'updated');
986
  }
987
 
 
 
 
988
  public function show_admin_warning_googledrive() {
989
- $this->show_admin_warning('<strong>'.__('UpdraftPlus notice:', 'updraftplus').'</strong> <a class="updraft_authlink" href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus&action=updraftmethod-googledrive-auth&updraftplus_googleauth=doit">'.sprintf(__('Follow this link to authorize access to your %s account (you will not be able to back up to %s without it).', 'updraftplus'), 'Google Drive', 'Google Drive').'</a>', 'updated updraft_authenticate_googledrive');
 
 
990
  }
991
 
 
 
 
992
  public function show_admin_warning_googlecloud() {
993
- $this->show_admin_warning('<strong>'.__('UpdraftPlus notice:', 'updraftplus').'</strong> <a class="updraft_authlink" href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus&action=updraftmethod-googlecloud-auth&updraftplus_googleauth=doit">'.sprintf(__('Follow this link to authorize access to your %s account (you will not be able to back up to %s without it).', 'updraftplus'), 'Google Cloud', 'Google Cloud').'</a>', 'updated updraft_authenticate_googlecloud');
 
 
994
  }
995
 
996
- // This options filter removes ABSPATH off the front of updraft_dir, if it is given absolutely and contained within it
 
 
 
 
 
997
  public function prune_updraft_dir_prefix($updraft_dir) {
998
  if ('/' == substr($updraft_dir, 0, 1) || "\\" == substr($updraft_dir, 0, 1) || preg_match('/^[a-zA-Z]:/', $updraft_dir)) {
999
  $wcd = trailingslashit(WP_CONTENT_DIR);
1000
  if (strpos($updraft_dir, $wcd) === 0) {
1001
  $updraft_dir = substr($updraft_dir, strlen($wcd));
1002
  }
1003
- # Legacy
1004
- // if (strpos($updraft_dir, ABSPATH) === 0) {
1005
- // $updraft_dir = substr($updraft_dir, strlen(ABSPATH));
1006
- // }
1007
  }
1008
  return $updraft_dir;
1009
  }
@@ -1017,7 +1046,7 @@ class UpdraftPlus_Admin {
1017
 
1018
  if (empty($_REQUEST['timestamp']) || !is_numeric($_REQUEST['timestamp']) || empty($_REQUEST['type'])) exit;
1019
 
1020
- $findex = empty($_REQUEST['findex']) ? 0 : (int)$_REQUEST['findex'];
1021
  $stage = empty($_REQUEST['stage']) ? '' : $_REQUEST['stage'];
1022
  $file_path = empty($_REQUEST['filepath']) ? '' : $_REQUEST['filepath'];
1023
 
@@ -1132,14 +1161,14 @@ class UpdraftPlus_Admin {
1132
  $needs_downloading = false;
1133
 
1134
  if (!file_exists($fullpath)) {
1135
- //if the file doesn't exist and they're using one of the cloud options, fetch it down from the cloud.
1136
  $needs_downloading = true;
1137
  $updraftplus->log('File does not yet exist locally - needs downloading');
1138
  } elseif ($known_size > 0 && filesize($fullpath) < $known_size) {
1139
  $updraftplus->log("The file was found locally (".filesize($fullpath).") but did not match the size in the backup history ($known_size) - will resume downloading");
1140
  $needs_downloading = true;
1141
  } elseif ($known_size > 0) {
1142
- $updraftplus->log('The file was found locally and matched the recorded size from the backup history ('.round($known_size/1024,1).' KB)');
1143
  } else {
1144
  $updraftplus->log('No file size was found recorded in the backup history. We will assume the local one is complete.');
1145
  $known_size = filesize($fullpath);
@@ -1222,14 +1251,14 @@ class UpdraftPlus_Admin {
1222
 
1223
  if ($restore) {
1224
  $service_description = empty($updraftplus->backup_methods[$service]) ? $service : $updraftplus->backup_methods[$service];
1225
- $updraftplus->log(__("File is not locally present - needs retrieving from remote storage",'updraftplus')." ($service_description)", 'notice-restore');
1226
  }
1227
 
1228
  $object = $storage_objects_and_ids[$service]['object'];
1229
 
1230
- if (!$object->supports_feature('multi_options')) {
1231
- error_log("UpdraftPlus_Admin::get_remote_file(): Multi-options not supported by: ".$service);
1232
- continue;
1233
  }
1234
 
1235
  $instance_ids = $storage_objects_and_ids[$service]['instance_settings'];
@@ -1273,12 +1302,11 @@ class UpdraftPlus_Admin {
1273
  /**
1274
  * Downloads a specified file into UD's directory
1275
  *
1276
- * @param String $file - The name of the file
1277
- * @param UpdraftPlus_BackupModule $object - The object of the service to use to download with.
1278
- *
1279
  * @return Boolean - Whether the operation succeeded. Inherited from the storage module's download() method. N.B. At the time of writing it looks like not all modules necessarily return true upon success; but false can be relied upon for detecting failure.
1280
  */
1281
- private function download_file($file, $object) {
1282
 
1283
  global $updraftplus;
1284
 
@@ -1318,7 +1346,11 @@ class UpdraftPlus_Admin {
1318
 
1319
  }
1320
 
1321
- // This is used as a callback
 
 
 
 
1322
  public function _updraftplus_background_operation_started($msg) {
1323
  global $updraftplus;
1324
  // The extra spaces are because of a bug seen on one server in handling of non-ASCII characters; see HS#11739
@@ -1348,7 +1380,7 @@ class UpdraftPlus_Admin {
1348
  $data_in_get = array('get_log', 'get_fragment');
1349
 
1350
  // UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands - i.e. all commands are in there
1351
- if (!class_exists('UpdraftPlus_WPAdmin_Commands')) require_once(UPDRAFTPLUS_DIR.'/includes/class-wpadmin-commands.php');
1352
  $commands = new UpdraftPlus_WPAdmin_Commands($this);
1353
 
1354
  if (method_exists($commands, $subaction)) {
@@ -1407,9 +1439,8 @@ class UpdraftPlus_Admin {
1407
  /**
1408
  * Run a credentials test for the indicated remote storage module
1409
  *
1410
- * @param Array $test_settings - the test parameters, including the method itself indicated in the key 'method'
1411
- * @param Boolean $return_instead_of_echo - whether to return or echo the results. N.B. More than just the results to echo will be returned
1412
- *
1413
  * @return Array|Void - the results, if they are being returned (rather than echoed). Keys: 'output' (the output), 'data' (other data)
1414
  */
1415
  public function do_credentials_test($test_settings, $return_instead_of_echo = false) {
@@ -1419,7 +1450,7 @@ class UpdraftPlus_Admin {
1419
  $objname = "UpdraftPlus_BackupModule_$method";
1420
 
1421
  $this->logged = array();
1422
- # TODO: Add action for WP HTTP SSL stuff
1423
  set_error_handler(array($this, 'get_php_errors'), E_ALL & ~E_STRICT);
1424
 
1425
  if (!class_exists($objname)) include_once(UPDRAFTPLUS_DIR."/methods/$method.php");
@@ -1427,7 +1458,7 @@ class UpdraftPlus_Admin {
1427
  $ret = '';
1428
  $data = null;
1429
 
1430
- # TODO: Add action for WP HTTP SSL stuff
1431
  if (method_exists($objname, "credentials_test")) {
1432
  $obj = new $objname;
1433
  if ($return_instead_of_echo) ob_start();
@@ -1452,9 +1483,7 @@ class UpdraftPlus_Admin {
1452
  * Delete a backup set, whilst respecting limits on how much to delete in one go
1453
  *
1454
  * @uses remove_backup_set_cleanup()
1455
- *
1456
  * @param Array $opts - deletion options; with keys backup_timestamp, delete_remote, [remote_delete_limit]
1457
- *
1458
  * @return Array - as from remove_backup_set_cleanup()
1459
  */
1460
  public function delete_set($opts) {
@@ -1462,9 +1491,9 @@ class UpdraftPlus_Admin {
1462
  global $updraftplus;
1463
 
1464
  $backups = UpdraftPlus_Backup_History::get_history();
1465
- $timestamps = (string)$opts['backup_timestamp'];
1466
 
1467
- $remote_delete_limit = (isset($opts['remote_delete_limit']) && $opts['remote_delete_limit'] > 0) ? (int)$opts['remote_delete_limit'] : PHP_INT_MAX;
1468
 
1469
  $timestamps = explode(',', $timestamps);
1470
  $delete_remote = empty($opts['delete_remote']) ? false : true;
@@ -1504,7 +1533,7 @@ class UpdraftPlus_Admin {
1504
  $services = is_string($backups[$timestamp]['service']) ? array($backups[$timestamp]['service']) : $backups[$timestamp]['service'];
1505
  if (is_array($services)) {
1506
  foreach ($services as $service) {
1507
- if ($service && $service != 'none' && $service != 'email') $delete_from_service[] = $service;
1508
  }
1509
  }
1510
  }
@@ -1517,7 +1546,7 @@ class UpdraftPlus_Admin {
1517
  }
1518
  }
1519
  // Delete DB
1520
- foreach ($backups[$timestamp] as $key => $value){
1521
  if ('db' == strtolower(substr($key, 0, 2)) && '-size' != substr($key, -5, 5)) {
1522
  $files_to_delete[$key] = $backups[$timestamp][$key];
1523
  }
@@ -1572,12 +1601,12 @@ class UpdraftPlus_Admin {
1572
  $deleted = $remote_obj->delete($file);
1573
 
1574
  if (-1 === $deleted) {
1575
- //echo __('Did not know how to delete from this cloud service.', 'updraftplus');
1576
  } elseif (false !== $deleted) {
1577
  $remote_deleted++;
1578
  }
1579
 
1580
- $itext = $index ? (string)$index : '';
1581
  if ($was_string) {
1582
  unset($backups[$timestamp][$key]);
1583
  if ('db' == strtolower(substr($key, 0, 2))) unset($backups[$timestamp][$key][$index.'-size']);
@@ -1612,9 +1641,9 @@ class UpdraftPlus_Admin {
1612
  /**
1613
  * This function sorts the array of instance ids currently saved so that any instance id that is in both the saved settings and the backup history move to the top of the array, as these are likely to work. Then values that don't appear in the backup history move to the bottom.
1614
  *
1615
- * @param String $a - the first instance id
1616
- * @param String $b - the second instance id
1617
- * @return Integer - returns an integer to indicate what position the $b value should be moved in
1618
  */
1619
  public function instance_ids_sort($a, $b) {
1620
  if (in_array($a, $this->backups_instance_ids)) {
@@ -1702,6 +1731,13 @@ class UpdraftPlus_Admin {
1702
  ));
1703
  }
1704
 
 
 
 
 
 
 
 
1705
  public function get_disk_space_used($entity) {
1706
  global $updraftplus;
1707
  if ('updraft' == $entity) {
@@ -1711,7 +1747,7 @@ class UpdraftPlus_Admin {
1711
  if ('all' == $entity) {
1712
  $total_size = 0;
1713
  foreach ($backupable_entities as $entity => $data) {
1714
- # Might be an array
1715
  $basedir = $backupable_entities[$entity];
1716
  $dirs = apply_filters('updraftplus_dirlist_'.$entity, $basedir);
1717
  $size = $this->recursive_directory_size($dirs, $updraftplus->get_exclude($entity), $basedir, 'numeric');
@@ -1719,7 +1755,7 @@ class UpdraftPlus_Admin {
1719
  }
1720
  return $updraftplus->convert_numeric_size_to_text($total_size);
1721
  } elseif (!empty($backupable_entities[$entity])) {
1722
- # Might be an array
1723
  $basedir = $backupable_entities[$entity];
1724
  $dirs = apply_filters('updraftplus_dirlist_'.$entity, $basedir);
1725
  return $this->recursive_directory_size($dirs, $updraftplus->get_exclude($entity), $basedir);
@@ -1728,6 +1764,13 @@ class UpdraftPlus_Admin {
1728
  return __('Error', 'updraftplus');
1729
  }
1730
 
 
 
 
 
 
 
 
1731
  public function activejobs_delete($job_id) {
1732
 
1733
  if (preg_match("/^[0-9a-f]{12}$/", $job_id)) {
@@ -1757,14 +1800,19 @@ class UpdraftPlus_Admin {
1757
 
1758
  }
1759
 
1760
- // Input: an array of items
1761
- // Each item is in the format: <base>,<timestamp>,<type>(,<findex>)
1762
- // The 'base' is not for us: we just pass it straight back
 
 
 
 
 
1763
  public function get_download_statuses($downloaders) {
1764
  global $updraftplus;
1765
  $download_status = array();
1766
  foreach ($downloaders as $downloader) {
1767
- # prefix, timestamp, entity, index
1768
  if (preg_match('/^([^,]+),(\d+),([-a-z]+|db[0-9]+),(\d+)$/', $downloader, $matches)) {
1769
  $findex = (empty($matches[4])) ? '0' : $matches[4];
1770
  $updraftplus->nonce = dechex($matches[2]).$findex.substr(md5($matches[3]), 0, 3);
@@ -1786,7 +1834,7 @@ class UpdraftPlus_Admin {
1786
 
1787
  global $updraftplus;
1788
 
1789
- $download_status = empty($request['downloaders']) ? array(): $this->get_download_statuses(explode(':', $request['downloaders']));
1790
 
1791
  if (!empty($request['oneshot'])) {
1792
  $job_id = get_site_option('updraft_oneshotnonce', false);
@@ -1880,7 +1928,7 @@ class UpdraftPlus_Admin {
1880
 
1881
  $potential_log_file = $updraft_dir."/log.".$nonce.".txt";
1882
 
1883
- if (is_readable($potential_log_file)){
1884
 
1885
  $templog_array = array();
1886
  $log_file = fopen($potential_log_file, "r");
@@ -1916,6 +1964,11 @@ class UpdraftPlus_Admin {
1916
  return $ret_array;
1917
  }
1918
 
 
 
 
 
 
1919
  public function howmany_overdue_crons() {
1920
  $how_many_overdue = 0;
1921
  if (function_exists('_get_cron_array') || (is_file(ABSPATH.WPINC.'/cron.php') && include_once(ABSPATH.WPINC.'/cron.php') && function_exists('_get_cron_array'))) {
@@ -1923,9 +1976,7 @@ class UpdraftPlus_Admin {
1923
  if (is_array($crons)) {
1924
  $timenow = time();
1925
  foreach ($crons as $jt => $job) {
1926
- if ($jt < $timenow) {
1927
- $how_many_overdue++;
1928
- }
1929
  }
1930
  }
1931
  }
@@ -1937,7 +1988,7 @@ class UpdraftPlus_Admin {
1937
  if (0 == error_reporting()) return true;
1938
  $logline = $updraftplus->php_error_to_logline($errno, $errstr, $errfile, $errline);
1939
  if (false !== $logline) $this->logged[] = $logline;
1940
- # Don't pass it up the chain (since it's going to be output to the user always)
1941
  return true;
1942
  }
1943
 
@@ -1963,14 +2014,14 @@ class UpdraftPlus_Admin {
1963
  } elseif (preg_match('/^downloaded:(\d+):(.*)$/', $file, $matches) && file_exists($matches[2])) {
1964
  $response['p'] = 100;
1965
  $response['f'] = $matches[2];
1966
- $response['s'] = (int)$matches[1];
1967
- $response['t'] = (int)$matches[1];
1968
  $response['m'] = __('File ready.', 'updraftplus');
1969
  if ('db' != substr($type, 0, 2)) $response['can_show_contents'] = true;
1970
  } elseif (preg_match('/^downloading:(\d+):(.*)$/', $file, $matches) && file_exists($matches[2])) {
1971
  // Convert to bytes
1972
  $response['f'] = $matches[2];
1973
- $total_size = (int)max($matches[1], 1);
1974
  $cur_size = filesize($matches[2]);
1975
  $response['s'] = $cur_size;
1976
  $file_age = time() - filemtime($matches[2]);
@@ -1995,7 +2046,14 @@ class UpdraftPlus_Admin {
1995
  return $uploads;
1996
  }
1997
 
1998
- // We do actually want to over-write
 
 
 
 
 
 
 
1999
  public function unique_filename_callback($dir, $name, $ext) {
2000
  return $name.$ext;
2001
  }
@@ -2047,7 +2105,7 @@ class UpdraftPlus_Admin {
2047
  }
2048
 
2049
  // If this was the chunk, then we should instead be concatenating onto the final file
2050
- if (isset($_POST['chunks']) && isset($_POST['chunk']) && preg_match('/^[0-9]+$/',$_POST['chunk'])) {
2051
  $final_file = basename($_POST['name']);
2052
  if (!rename($status['file'], $updraft_dir.'/'.$final_file.'.'.$_POST['chunk'].'.zip.tmp')) {
2053
  @unlink($status['file']);
@@ -2059,10 +2117,12 @@ class UpdraftPlus_Admin {
2059
  // Final chunk? If so, then stich it all back together
2060
  if ($_POST['chunk'] == $_POST['chunks']-1) {
2061
  if ($wh = fopen($updraft_dir.'/'.$final_file, 'wb')) {
2062
- for ($i=0 ; $i<$_POST['chunks']; $i++) {
2063
  $rf = $updraft_dir.'/'.$final_file.'.'.$i.'.zip.tmp';
2064
  if ($rh = fopen($rf, 'rb')) {
2065
- while ($line = fread($rh, 32768)) fwrite($wh, $line);
 
 
2066
  fclose($rh);
2067
  @unlink($rf);
2068
  }
@@ -2098,7 +2158,7 @@ class UpdraftPlus_Admin {
2098
  $response['dm'] = sprintf(__('This backup was created by %s, and can be imported.', 'updraftplus'), $accepted);
2099
  } else {
2100
  @unlink($status['file']);
2101
- echo json_encode(array('e' => sprintf(__('Error: %s', 'updraftplus'),__('Bad filename format - this does not look like a file created by UpdraftPlus', 'updraftplus'))));
2102
  exit;
2103
  }
2104
  } else {
@@ -2106,7 +2166,7 @@ class UpdraftPlus_Admin {
2106
  $type = isset($matches[3]) ? $matches[3] : '';
2107
  if (!preg_match('/^log\.[a-f0-9]{12}\.txt/', $file) && 'db' != $type && !isset($backupable_entities[$type])) {
2108
  @unlink($status['file']);
2109
- echo json_encode(array('e' => sprintf(__('Error: %s', 'updraftplus'),sprintf(__('This looks like a file created by UpdraftPlus, but this install does not know about this type of object: %s. Perhaps you need to install an add-on?', 'updraftplus'), htmlspecialchars($type)))));
2110
  exit;
2111
  }
2112
  }
@@ -2118,7 +2178,9 @@ class UpdraftPlus_Admin {
2118
  exit;
2119
  }
2120
 
2121
- # Database decrypter
 
 
2122
  public function plupload_action2() {
2123
 
2124
  @set_time_limit(UPDRAFTPLUS_SET_TIME_LIMIT);
@@ -2141,8 +2203,8 @@ class UpdraftPlus_Admin {
2141
  $farray['type'] = 'application/octet-stream';
2142
 
2143
  if (isset($_POST['chunks'])) {
2144
- // $farray['ext'] = 'zip';
2145
- // $farray['type'] = 'application/zip';
2146
  } else {
2147
  $farray['unique_filename_callback'] = array($this, 'unique_filename_callback');
2148
  }
@@ -2160,7 +2222,7 @@ class UpdraftPlus_Admin {
2160
  }
2161
 
2162
  // If this was the chunk, then we should instead be concatenating onto the final file
2163
- if (isset($_POST['chunks']) && isset($_POST['chunk']) && preg_match('/^[0-9]+$/',$_POST['chunk'])) {
2164
  $final_file = basename($_POST['name']);
2165
  rename($status['file'], $updraft_dir.'/'.$final_file.'.'.$_POST['chunk'].'.zip.tmp');
2166
  $status['file'] = $updraft_dir.'/'.$final_file.'.'.$_POST['chunk'].'.zip.tmp';
@@ -2168,10 +2230,12 @@ class UpdraftPlus_Admin {
2168
  // Final chunk? If so, then stich it all back together
2169
  if ($_POST['chunk'] == $_POST['chunks']-1) {
2170
  if ($wh = fopen($updraft_dir.'/'.$final_file, 'wb')) {
2171
- for ($i=0 ; $i<$_POST['chunks']; $i++) {
2172
  $rf = $updraft_dir.'/'.$final_file.'.'.$i.'.zip.tmp';
2173
  if ($rh = fopen($rf, 'rb')) {
2174
- while ($line = fread($rh, 32768)) fwrite($wh, $line);
 
 
2175
  fclose($rh);
2176
  @unlink($rf);
2177
  }
@@ -2195,11 +2259,13 @@ class UpdraftPlus_Admin {
2195
  }
2196
 
2197
  // send the uploaded file url in response
2198
- // echo 'OK:'.$status['url'];
2199
  echo 'OK:'.$file;
2200
  exit;
2201
  }
2202
 
 
 
 
2203
  public function settings_header() {
2204
  $this->include_template('wp-admin/settings/header.php');
2205
  }
@@ -2215,13 +2281,10 @@ class UpdraftPlus_Admin {
2215
 
2216
  global $updraftplus;
2217
 
2218
- /*
2219
- we use request here because the initial restore is triggered by a POSTed form. we then may need to obtain credentials
2220
- for the WP_Filesystem. to do this WP outputs a form, but we don't pass our parameters via that. So the values are
2221
- passed back in as GET parameters.
2222
- */
2223
-
2224
- if (isset($_REQUEST['action']) && (($_REQUEST['action'] == 'updraft_restore' && isset($_REQUEST['backup_timestamp'])) || ('updraft_restore_continue' == $_REQUEST['action'] && !empty($_REQUEST['restoreid'])))) {
2225
 
2226
  $is_continuation = ('updraft_restore_continue' == $_REQUEST['action']) ? true : false;
2227
 
@@ -2253,8 +2316,8 @@ class UpdraftPlus_Admin {
2253
  $backup_success = false;
2254
  }
2255
 
2256
- if (empty($updraftplus->errors) && $backup_success === true) {
2257
- // TODO: Deal with the case of some of the work having been deferred
2258
  // If we restored the database, then that will have out-of-date information which may confuse the user - so automatically re-scan for them.
2259
  UpdraftPlus_Backup_History::rebuild();
2260
  echo '<p><strong>';
@@ -2281,7 +2344,7 @@ class UpdraftPlus_Admin {
2281
  echo '<strong>'.__('Actions', 'updraftplus').':</strong> <a href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus">'.__('Return to UpdraftPlus Configuration', 'updraftplus').'</a>';
2282
  return;
2283
  } elseif (false === $backup_success) {
2284
- # This means, "not yet - but stay on the page because we may be able to do it later, e.g. if the user types in the requested information"
2285
  echo '<p>';
2286
  $updraftplus->log_e('Restore failed...');
2287
  echo '</p>';
@@ -2317,7 +2380,7 @@ class UpdraftPlus_Admin {
2317
 
2318
  if (isset($_GET['message'])) $this->show_admin_warning(htmlspecialchars($_GET['message']));
2319
 
2320
- if (isset($_GET['action']) && $_GET['action'] == 'updraft_create_backup_dir' && isset($_GET['nonce']) && wp_verify_nonce($_GET['nonce'], 'create_backup_dir')) {
2321
  $created = $this->create_backup_dir();
2322
  if (is_wp_error($created)) {
2323
  echo '<p>'.__('Backup directory could not be created', 'updraftplus').'...<br>';
@@ -2326,7 +2389,7 @@ class UpdraftPlus_Admin {
2326
  echo '<li>'.htmlspecialchars($msg).'</li>';
2327
  }
2328
  echo '</ul></p>';
2329
- } elseif ($created !== false) {
2330
  echo '<p>'.__('Backup directory successfully created.', 'updraftplus').'</p><br>';
2331
  }
2332
  echo '<b>'.__('Actions', 'updraftplus').':</b> <a href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus">'.__('Return to UpdraftPlus Configuration', 'updraftplus').'</a>';
@@ -2362,40 +2425,39 @@ class UpdraftPlus_Admin {
2362
  // Opens a div, which needs closing later
2363
  if (isset($_GET['updraft_restore_success'])) {
2364
 
2365
- if (get_template() === 'optimizePressTheme' || is_plugin_active('optimizePressPlugin') || is_plugin_active_for_network('optimizePressPlugin')){
2366
- $this->show_admin_warning("<a href='https://optimizepress.zendesk.com/hc/en-us/articles/203699826-Update-URL-References-after-moving-domain' target='_blank'>" . __("OptimizePress 2.0 encodes its contents, so search/replace does not work.","updraftplus") . ' ' . __("To fix this problem go here.","updraftplus") . "</a>", "notice notice-warning");
2367
  }
2368
- $success_advert = (isset($_GET['pval']) && 0 == $_GET['pval'] && !$updraftplus->have_addons) ? '<p>'.__('For even more features and personal support, check out ', 'updraftplus').'<strong><a href="'.apply_filters("updraftplus_com_link",'https://updraftplus.com/shop/updraftplus-premium/').'" target="_blank">UpdraftPlus Premium</a>.</strong></p>' : "";
2369
 
2370
  echo "<div class=\"updated backup-restored\"><span><strong>".__('Your backup has been restored.', 'updraftplus').'</strong></span><br>';
2371
  // Unnecessary - will be advised of this below
2372
- // if (2 == $_GET['updraft_restore_success']) echo ' '.__('Your old (themes, uploads, plugins, whatever) directories have been retained with "-old" appended to their name. Remove them when you are satisfied that the backup worked properly.');
2373
  echo $success_advert;
2374
  $include_deleteform_div = false;
2375
 
2376
  }
2377
 
2378
- // $this->print_restore_in_progress_box_if_needed();
2379
-
2380
  if ($this->scan_old_dirs(true)) $this->print_delete_old_dirs_form(true, $include_deleteform_div);
2381
 
2382
  // Close the div opened by the earlier section
2383
  if (isset($_GET['updraft_restore_success'])) echo '</div>';
2384
 
2385
- if(empty($success_advert) && empty($this->no_settings_warning)) {
2386
 
2387
- if (!class_exists('UpdraftPlus_Notices')) require_once(UPDRAFTPLUS_DIR.'/includes/updraftplus-notices.php');
2388
  global $updraftplus_notices;
2389
  $updraftplus_notices->do_notice();
2390
  }
2391
 
2392
  if (!$updraftplus->memory_check(64)) {
2393
- // HS8390 - A case where UpdraftPlus::memory_check_current() returns -1
2394
- $memory_check_current = $updraftplus->memory_check_current();
2395
- if ($memory_check_current > 0) { ?>
2396
- <div class="updated memory-limit"><?php _e('Your PHP memory limit (set by your web hosting company) is very low. UpdraftPlus attempted to raise it but was unsuccessful. This plugin may struggle with a memory limit of less than 64 Mb - especially if you have very large files uploaded (though on the other hand, many sites will be successful with a 32Mb limit - your experience may vary).', 'updraftplus');?> <?php _e('Current limit is:', 'updraftplus');?> <?php echo $updraftplus->memory_check_current(); ?> MB</div>
2397
- <?php }
2398
- }
 
2399
 
2400
 
2401
  if (!empty($updraftplus->errors)) {
@@ -2413,18 +2475,29 @@ class UpdraftPlus_Admin {
2413
 
2414
  ?>
2415
 
2416
- <?php
2417
 
2418
  $tabflag = 1;
2419
 
2420
- if (isset($_REQUEST['tab'])){
2421
- switch($_REQUEST['tab']) {
2422
- case 'status': $tabflag = 1; break;
2423
- case 'backups': $tabflag = 2; break;
2424
- case 'settings': $tabflag = 3; break;
2425
- case 'expert': $tabflag = 4; break;
2426
- case 'addons': $tabflag = 5; break;
2427
- default : $tabflag = 1;
 
 
 
 
 
 
 
 
 
 
 
2428
  }
2429
  }
2430
 
@@ -2500,7 +2573,7 @@ class UpdraftPlus_Admin {
2500
  }
2501
 
2502
  $restore_jobdata = $this->restore_in_progress_jobdata;
2503
- $seconds_ago = time() - (int)$restore_jobdata['job_time_ms'];
2504
  $minutes_ago = floor($seconds_ago/60);
2505
  $seconds_ago = $seconds_ago - $minutes_ago*60;
2506
  $time_ago = sprintf(__("%s minutes, %s seconds", 'updraftplus'), $minutes_ago, $seconds_ago);
@@ -2518,13 +2591,13 @@ class UpdraftPlus_Admin {
2518
 
2519
  }
2520
 
 
 
 
 
 
2521
  public function backupnow_modal_contents() {
2522
-
2523
- $ret = $this->backup_now_widgetry();
2524
-
2525
- // $ret .= '<p>'.__('Does nothing happen when you attempt backups?', 'updraftplus').' <a href="https://updraftplus.com/faqs/my-scheduled-backups-and-pressing-backup-now-does-nothing-however-pressing-debug-backup-does-produce-a-backup/">'.__('Go here for help.', 'updraftplus').'</a></p>';
2526
-
2527
- return $ret;
2528
  }
2529
 
2530
  private function backup_now_widgetry() {
@@ -2537,7 +2610,7 @@ class UpdraftPlus_Admin {
2537
 
2538
  $ret .= '<div id="backupnow_database_moreoptions" class="updraft-hidden" style="display:none;">';
2539
 
2540
- $premium_link = apply_filters('updraftplus_com_link','https://updraftplus.com/landing/updraftplus-premium');
2541
 
2542
  $free_ret = '<em>'.__('All WordPress tables will be backed up.', 'updraftplus').' <a href="'.$premium_link.'">'. __('With UpdraftPlus Premium, you can choose to backup non-WordPress tables, backup only specified tables, and backup other databases too.', 'updraftplus').'</a></em>';
2543
 
@@ -2556,15 +2629,25 @@ class UpdraftPlus_Admin {
2556
  return $ret;
2557
  }
2558
 
2559
- // Also used by the auto-backups add-on
 
 
 
 
 
 
2560
  public function render_active_jobs_and_log_table($wide_format = false, $print_active_jobs = true) {
2561
  ?>
2562
  <table class="form-table" id="updraft_activejobs_table">
2563
 
2564
  <?php $active_jobs = ($print_active_jobs) ? $this->print_active_jobs() : '';?>
2565
  <tr id="updraft_activejobsrow" class="<?php
2566
- if (!$active_jobs && !$wide_format) { echo 'hidden'; }
2567
- if ($wide_format) { echo ".minimum-height"; }
 
 
 
 
2568
  ?>">
2569
  <?php if ($wide_format) { ?>
2570
  <td id="updraft_activejobs" colspan="2">
@@ -2594,7 +2677,7 @@ class UpdraftPlus_Admin {
2594
  </tr>
2595
 
2596
  <?php
2597
- # Currently disabled - not sure who we want to show this to
2598
  if (1==0 && !defined('UPDRAFTPLUS_NOADS_B')) {
2599
  $feed = $updraftplus->get_updraftplus_rssfeed();
2600
  if (is_a($feed, 'SimplePie')) {
@@ -2604,7 +2687,7 @@ class UpdraftPlus_Admin {
2604
  echo '<li>';
2605
  echo '<a href="'.esc_attr($item->get_permalink()).'">';
2606
  echo htmlspecialchars($item->get_title());
2607
- # D, F j, Y H:i
2608
  echo "</a> (".htmlspecialchars($item->get_date('j F Y')).")";
2609
  echo '</li>';
2610
  }
@@ -2616,13 +2699,16 @@ class UpdraftPlus_Admin {
2616
  <?php
2617
  }
2618
 
 
 
 
2619
  private function most_recently_modified_log_link() {
2620
 
2621
  global $updraftplus;
2622
  list($mod_time, $log_file, $nonce) = $updraftplus->last_modified_log();
2623
 
2624
  ?>
2625
- <a href="?page=updraftplus&amp;action=downloadlatestmodlog&amp;wpnonce=<?php echo wp_create_nonce('updraftplus_download') ?>" <?php if (!$mod_time) echo 'style="display:none;"'; ?> class="updraft-log-link" onclick="event.preventDefault(); updraft_popuplog('');"><?php _e('Download most recently modified log file', 'updraftplus');?></a>
2626
  <?php
2627
  }
2628
 
@@ -2639,7 +2725,7 @@ class UpdraftPlus_Admin {
2639
  }
2640
 
2641
  private function print_delete_old_dirs_form($include_blurb = true, $include_div = true) {
2642
- if ($include_blurb) {
2643
  if ($include_div) {
2644
  echo '<div id="updraft_delete_old_dirs_pagediv" class="updated delete-old-directories">';
2645
  }
@@ -2655,36 +2741,45 @@ class UpdraftPlus_Admin {
2655
  if ($include_blurb && $include_div) echo '</div>';
2656
  }
2657
 
 
 
 
 
 
 
 
2658
  public function get_cron($job_id = false) {
2659
-
2660
  $cron = get_option('cron');
2661
  if (!is_array($cron)) $cron = array();
2662
  if (false === $job_id) return $cron;
2663
 
2664
  foreach ($cron as $time => $job) {
2665
- if (isset($job['updraft_backup_resume'])) {
2666
- foreach ($job['updraft_backup_resume'] as $hook => $info) {
2667
- if (isset($info['args'][1]) && $job_id == $info['args'][1]) {
2668
- global $updraftplus;
2669
- $jobdata = $updraftplus->jobdata_getarray($job_id);
2670
- return (!is_array($jobdata)) ? false : array($time, $jobdata);
2671
- }
2672
  }
2673
  }
2674
  }
2675
  }
2676
 
2677
- // A value for $this_job_only also causes something to always be returned (to allow detection of the job having started on the front-end)
 
 
 
 
 
2678
  private function print_active_jobs($this_job_only = false) {
2679
  $cron = $this->get_cron();
2680
- // $found_jobs = 0;
2681
  $ret = '';
2682
 
2683
  foreach ($cron as $time => $job) {
2684
  if (isset($job['updraft_backup_resume'])) {
2685
  foreach ($job['updraft_backup_resume'] as $hook => $info) {
2686
  if (isset($info['args'][1])) {
2687
- // $found_jobs++;
2688
  $job_id = $info['args'][1];
2689
  if (false === $this_job_only || $job_id == $this_job_only) {
2690
  $ret .= $this->print_active_job($job_id, false, $time, $info['args'][0]);
@@ -2703,7 +2798,6 @@ class UpdraftPlus_Admin {
2703
  }
2704
  }
2705
 
2706
- // if (0 == $found_jobs) $ret .= '<p><em>'.__('(None)', 'updraftplus').'</em></p>';
2707
  return $ret;
2708
  }
2709
 
@@ -2716,21 +2810,20 @@ class UpdraftPlus_Admin {
2716
 
2717
  if (false == apply_filters('updraftplus_print_active_job_continue', true, $is_oneshot, $next_resumption, $jobdata)) return '';
2718
 
2719
- #if (!is_array($jobdata)) $jobdata = array();
2720
  if (!isset($jobdata['backup_time'])) return '';
2721
 
2722
  $backupable_entities = $updraftplus->get_backupable_file_entities(true, true);
2723
 
2724
- $began_at = (isset($jobdata['backup_time'])) ? get_date_from_gmt(gmdate('Y-m-d H:i:s', (int)$jobdata['backup_time']), 'D, F j, Y H:i') : '?';
2725
 
2726
  $jobstatus = empty($jobdata['jobstatus']) ? 'unknown' : $jobdata['jobstatus'];
2727
  $stage = 0;
2728
  switch ($jobstatus) {
2729
- # Stage 0
2730
  case 'begun':
2731
  $curstage = __('Backup begun', 'updraftplus');
2732
- break;
2733
- # Stage 1
2734
  case 'filescreating':
2735
  $stage = 1;
2736
  $curstage = __('Creating file backup zips', 'updraftplus');
@@ -2740,44 +2833,42 @@ class UpdraftPlus_Admin {
2740
  if (strlen($sdescrip) > 20 && isset($jobdata['filecreating_substatus']['e']) && is_array($jobdata['filecreating_substatus']['e']) && isset($backupable_entities[$jobdata['filecreating_substatus']['e']]['shortdescription'])) $sdescrip = $backupable_entities[$jobdata['filecreating_substatus']['e']]['shortdescription'];
2741
  $curstage .= ' ('.$sdescrip.')';
2742
  if (isset($jobdata['filecreating_substatus']['i']) && isset($jobdata['filecreating_substatus']['t'])) {
2743
- $stage = min(2, 1 + ($jobdata['filecreating_substatus']['i']/max($jobdata['filecreating_substatus']['t'],1)));
2744
  }
2745
  }
2746
- break;
2747
  case 'filescreated':
2748
  $stage = 2;
2749
  $curstage = __('Created file backup zips', 'updraftplus');
2750
- break;
2751
-
2752
- # Stage 4
2753
  case 'clouduploading':
2754
  $stage = 4;
2755
  $curstage = __('Uploading files to remote storage', 'updraftplus');
2756
  if (isset($jobdata['uploading_substatus']['t']) && isset($jobdata['uploading_substatus']['i'])) {
2757
- $t = max((int)$jobdata['uploading_substatus']['t'], 1);
2758
  $i = min($jobdata['uploading_substatus']['i']/$t, 1);
2759
  $p = min($jobdata['uploading_substatus']['p'], 1);
2760
  $pd = $i + $p/$t;
2761
  $stage = 4 + $pd;
2762
  $curstage .= ' '.sprintf(__('(%s%%, file %s of %s)', 'updraftplus'), floor(100*$pd), $jobdata['uploading_substatus']['i']+1, $t);
2763
  }
2764
- break;
2765
  case 'pruning':
2766
  $stage = 5;
2767
  $curstage = __('Pruning old backup sets', 'updraftplus');
2768
- break;
2769
  case 'resumingforerrors':
2770
  $stage = -1;
2771
  $curstage = __('Waiting until scheduled time to retry because of errors', 'updraftplus');
2772
- break;
2773
- # Stage 6
2774
  case 'finished':
2775
  $stage = 6;
2776
  $curstage = __('Backup finished', 'updraftplus');
2777
- break;
2778
  default:
2779
-
2780
- # Database creation and encryption occupies the space from 2 to 4. Databases are created then encrypted, then the next databae is created/encrypted, etc.
2781
  if ('dbcreated' == substr($jobstatus, 0, 9)) {
2782
  $jobstatus = 'dbcreated';
2783
  $whichdb = substr($jobstatus, 9);
@@ -2802,7 +2893,7 @@ class UpdraftPlus_Admin {
2802
  if (!empty($jobdata['dbcreating_substatus']['t'])) {
2803
  $curstage .= ' ('.sprintf(__('table: %s', 'updraftplus'), $jobdata['dbcreating_substatus']['t']).')';
2804
  if (!empty($jobdata['dbcreating_substatus']['i']) && !empty($jobdata['dbcreating_substatus']['a'])) {
2805
- $substage = max(0.001, ($jobdata['dbcreating_substatus']['i'] / max($jobdata['dbcreating_substatus']['a'],1)));
2806
  $stage += $substage * $perdbspace * 0.5;
2807
  }
2808
  }
@@ -2834,12 +2925,12 @@ class UpdraftPlus_Admin {
2834
  foreach ($time_passed as $run => $passed) {
2835
  if (isset($runs_started[$run])) {
2836
  $time_ago = microtime(true) - ($runs_started[$run] + $time_passed[$run]);
2837
- if ($time_ago < $last_checkin_ago || $last_checkin_ago == -1) $last_checkin_ago = $time_ago;
2838
  }
2839
  }
2840
  }
2841
 
2842
- $next_res_after = (int)$time-time();
2843
  $next_res_txt = ($is_oneshot) ? '' : ' - '.sprintf(__("next resumption: %d (after %ss)", 'updraftplus'), $next_resumption, $next_res_after). ' ';
2844
  $last_activity_txt = ($last_checkin_ago >= 0) ? ' - '.sprintf(__('last activity: %ss ago', 'updraftplus'), floor($last_checkin_ago)).' ' : '';
2845
 
@@ -2856,7 +2947,7 @@ class UpdraftPlus_Admin {
2856
 
2857
  if (!empty($jobdata['is_autobackup'])) $ret .= ' isautobackup';
2858
 
2859
- $ret .= '" data-jobid="'.$job_id.'" data-lastactivity="'.(int)$last_checkin_ago.'" data-nextresumption="'.$next_resumption.'" data-nextresumptionafter="'.$next_res_after.'" title="'.esc_attr(sprintf(__('Job ID: %s', 'updraftplus'), $job_id)).$title_info.'">'.$began_at.'</span> ';
2860
 
2861
  $ret .= $show_inline_info;
2862
  $ret .= '- <a data-jobid="'.$job_id.'" href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus&action=downloadlog&updraftplus_backup_nonce='.$job_id.'" class="updraft-log-link">'.__('show log', 'updraftplus').'</a>';
@@ -2875,7 +2966,7 @@ class UpdraftPlus_Admin {
2875
 
2876
  $ret .= '<div class="curstage">';
2877
  $ret .= htmlspecialchars($curstage);
2878
- //we need to add this data-progress attribute in order to be able to update the progress bar in UDC
2879
  $ret .= '<div class="updraft_percentage" data-info="'.esc_attr($curstage).'" data-progress="'.(($stage>0) ? (ceil((100/6)*$stage)) : '0').'" style="height: 100%; width:'.(($stage>0) ? (ceil((100/6)*$stage)) : '0').'%"></div>';
2880
  $ret .= '</div></div>';
2881
 
@@ -2886,7 +2977,7 @@ class UpdraftPlus_Admin {
2886
  }
2887
 
2888
  private function delete_old_dirs_go($show_return = true) {
2889
- echo ($show_return) ? '<h1>UpdraftPlus - '.__('Remove old directories', 'updraftplus').'</h1>' : '<h2>'.__('Remove old directories', 'updraftplus').'</h2>';
2890
 
2891
  if ($this->delete_old_dirs()) {
2892
  echo '<p>'.__('Old directories successfully removed.', 'updraftplus').'</p><br>';
@@ -2896,36 +2987,38 @@ class UpdraftPlus_Admin {
2896
  if ($show_return) echo '<b>'.__('Actions', 'updraftplus').':</b> <a href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus">'.__('Return to UpdraftPlus Configuration', 'updraftplus').'</a>';
2897
  }
2898
 
2899
- //deletes the -old directories that are created when a backup is restored.
 
 
 
 
2900
  private function delete_old_dirs() {
2901
  global $wp_filesystem, $updraftplus;
2902
- $credentials = request_filesystem_credentials(wp_nonce_url(UpdraftPlus_Options::admin_page_url()."?page=updraftplus&action=updraft_delete_old_dirs", 'updraftplus-credentialtest-nonce'));
2903
  WP_Filesystem($credentials);
2904
- if ($wp_filesystem->errors->get_error_code()) {
2905
- foreach ($wp_filesystem->errors->get_error_messages() as $message)
2906
- show_message($message);
2907
- exit;
2908
  }
2909
  // From WP_CONTENT_DIR - which contains 'themes'
2910
  $ret = $this->delete_old_dirs_dir($wp_filesystem->wp_content_dir());
2911
 
2912
  $updraft_dir = $updraftplus->backups_dir_location();
2913
  if ($updraft_dir) {
2914
- $ret4 = ($updraft_dir) ? $this->delete_old_dirs_dir($updraft_dir, false) : true;
2915
  } else {
2916
  $ret4 = true;
2917
  }
2918
 
2919
- // $ret2 = $this->delete_old_dirs_dir($wp_filesystem->abspath());
2920
  $plugs = untrailingslashit($wp_filesystem->wp_plugins_dir());
2921
  if ($wp_filesystem->is_dir($plugs.'-old')) {
2922
- print "<strong>".__('Delete', 'updraftplus').": </strong>plugins-old: ";
2923
  if (!$wp_filesystem->delete($plugs.'-old', true)) {
2924
  $ret3 = false;
2925
- print "<strong>".__('Failed', 'updraftplus')."</strong><br>";
2926
  } else {
2927
  $ret3 = true;
2928
- print "<strong>".__('OK', 'updraftplus')."</strong><br>";
2929
  }
2930
  } else {
2931
  $ret3 = true;
@@ -2951,7 +3044,7 @@ class UpdraftPlus_Admin {
2951
  foreach ($list as $item) {
2952
  $name = (is_array($item)) ? $item['name'] : $item;
2953
  if ("-old" == substr($name, -4, 4)) {
2954
- //recursively delete
2955
  print "<strong>".__('Delete', 'updraftplus').": </strong>".htmlspecialchars($name).": ";
2956
 
2957
  if ($wpfs) {
@@ -2974,7 +3067,11 @@ class UpdraftPlus_Admin {
2974
  return $ret;
2975
  }
2976
 
2977
- // The aim is to get a directory that is writable by the webserver, because that's the only way we can create zip files
 
 
 
 
2978
  private function create_backup_dir() {
2979
 
2980
  global $wp_filesystem, $updraftplus;
@@ -2997,11 +3094,11 @@ class UpdraftPlus_Admin {
2997
 
2998
  if (!$wp_filesystem->is_dir($default_backup_dir) && !$wp_filesystem->mkdir($default_backup_dir, 0775)) {
2999
  $wperr = new WP_Error;
3000
- if ($wp_filesystem->errors->get_error_code()) {
3001
  foreach ($wp_filesystem->errors->get_error_messages() as $message) {
3002
  $wperr->add('mkdir_error', $message);
3003
  }
3004
- return $wperr;
3005
  } else {
3006
  return new WP_Error('mkdir_error', __('The request to the filesystem to create the directory failed.', 'updraftplus'));
3007
  }
@@ -3029,7 +3126,12 @@ class UpdraftPlus_Admin {
3029
  return true;
3030
  }
3031
 
3032
- //scans the content dir to see if any -old dirs are present
 
 
 
 
 
3033
  private function scan_old_dirs($print_as_comment = false) {
3034
  global $updraftplus;
3035
  $dirs = scandir(untrailingslashit(WP_CONTENT_DIR));
@@ -3042,7 +3144,7 @@ class UpdraftPlus_Admin {
3042
  return true;
3043
  }
3044
  }
3045
- # No need to scan ABSPATH - we don't backup there
3046
  if (is_dir(untrailingslashit(WP_PLUGIN_DIR).'-old')) {
3047
  if ($print_as_comment) echo '<!--'.htmlspecialchars(untrailingslashit(WP_PLUGIN_DIR).'-old').'-->';
3048
  return true;
@@ -3052,9 +3154,10 @@ class UpdraftPlus_Admin {
3052
 
3053
  /**
3054
  * Outputs html for a storage method using the parameters passed in, this version should be removed when all remote storages use the multi version
3055
- * @param [String] $classes - a list of classes to be used when
3056
- * @param [String] $header - the table header content
3057
- * @param [String] $contents - the table contents
 
3058
  */
3059
  public function storagemethod_row($method, $header, $contents) {
3060
  ?>
@@ -3066,10 +3169,11 @@ class UpdraftPlus_Admin {
3066
  }
3067
 
3068
  /**
3069
- * Outputs html for a storage method using the parameters passed in. This version of the method is compatible with multi storage options
3070
- * @param String $classes - a list of classes to be used when
3071
- * @param String $header - the table header content
3072
- * @param String $contents - the table contents
 
3073
  */
3074
  public function storagemethod_row_multi($classes, $header, $contents) {
3075
  ?>
@@ -3079,7 +3183,27 @@ class UpdraftPlus_Admin {
3079
  </tr>
3080
  <?php
3081
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3082
 
 
 
 
 
 
3083
  public function last_backup_html() {
3084
 
3085
  global $updraftplus;
@@ -3089,16 +3213,14 @@ class UpdraftPlus_Admin {
3089
  if ($updraft_last_backup) {
3090
 
3091
  // Convert to GMT, then to blog time
3092
- $backup_time = (int)$updraft_last_backup['backup_time'];
3093
 
3094
  $print_time = get_date_from_gmt(gmdate('Y-m-d H:i:s', $backup_time), 'D, F j, Y H:i');
3095
- // $print_time = date_i18n('D, F j, Y H:i', $backup_time);
3096
 
3097
  if (empty($updraft_last_backup['backup_time_incremental'])) {
3098
  $last_backup_text = "<span style=\"color:".(($updraft_last_backup['success']) ? 'green' : 'black').";\">".$print_time.'</span>';
3099
  } else {
3100
  $inc_time = get_date_from_gmt(gmdate('Y-m-d H:i:s', $updraft_last_backup['backup_time_incremental']), 'D, F j, Y H:i');
3101
- // $inc_time = date_i18n('D, F j, Y H:i', $updraft_last_backup['backup_time_incremental']);
3102
  $last_backup_text = "<span style=\"color:".(($updraft_last_backup['success']) ? 'green' : 'black').";\">$inc_time</span> (".sprintf(__('incremental backup; base backup: %s', 'updraftplus'), $print_time).')';
3103
  }
3104
 
@@ -3129,13 +3251,18 @@ class UpdraftPlus_Admin {
3129
  }
3130
 
3131
  } else {
3132
- $last_backup_text = "<span style=\"color:blue;\">".__('No backup has been completed', 'updraftplus')."</span>";
3133
  }
3134
 
3135
  return $last_backup_text;
3136
 
3137
  }
3138
 
 
 
 
 
 
3139
  public function get_intervals() {
3140
  return apply_filters('updraftplus_backup_intervals', array(
3141
  'manual' => _x("Manual", 'i.e. Non-automatic', 'updraftplus'),
@@ -3149,7 +3276,7 @@ class UpdraftPlus_Admin {
3149
  ));
3150
  }
3151
 
3152
- public function really_writable_message($really_is_writable, $updraft_dir){
3153
  if ($really_is_writable) {
3154
  $dir_info = '<span style="color:green;">'.__('Backup directory specified is writable, which is good.', 'updraftplus').'</span>';
3155
  } else {
@@ -3164,6 +3291,11 @@ class UpdraftPlus_Admin {
3164
  return $dir_info;
3165
  }
3166
 
 
 
 
 
 
3167
  public function settings_formcontents($options = array()) {
3168
  $this->include_template('wp-admin/settings/form-contents.php', false, array('options' => $options));
3169
  }
@@ -3205,14 +3337,21 @@ class UpdraftPlus_Admin {
3205
  return $ret;
3206
  }
3207
 
3208
- // $include_more can be (bool) or (string)"sometimes"
 
 
 
 
 
 
 
3209
  public function files_selector_widgetry($prefix = '', $show_exclusion_options = true, $include_more = true) {
3210
 
3211
  $ret = '';
3212
 
3213
  global $updraftplus;
3214
  $backupable_entities = $updraftplus->get_backupable_file_entities(true, true);
3215
- # The true (default value if non-existent) here has the effect of forcing a default of on.
3216
  $include_more_paths = UpdraftPlus_Options::get_updraft_option('updraft_include_more_path');
3217
  foreach ($backupable_entities as $key => $info) {
3218
  $included = (UpdraftPlus_Options::get_updraft_option("updraft_include_$key", apply_filters("updraftplus_defaultoption_include_".$key, true))) ? 'checked="checked"' : "";
@@ -3238,7 +3377,7 @@ class UpdraftPlus_Admin {
3238
 
3239
  } else {
3240
 
3241
- if ($key != 'more' || true === $include_more || ('sometimes' === $include_more && !empty($include_more_paths))) {
3242
 
3243
  $data_toggle_exclude_field = $show_exclusion_options ? 'data-toggle_exclude_field="'.$key.'"' : '';
3244
 
@@ -3253,6 +3392,15 @@ class UpdraftPlus_Admin {
3253
  return $ret;
3254
  }
3255
 
 
 
 
 
 
 
 
 
 
3256
  public function show_double_warning($text, $extraclass = '', $echo = true) {
3257
 
3258
  $ret = "<div class=\"error updraftplusmethod $extraclass\"><p>$text</p></div>";
@@ -3264,20 +3412,17 @@ class UpdraftPlus_Admin {
3264
  }
3265
 
3266
  public function optionfilter_split_every($value) {
3267
- $value = absint($value);
3268
- if ($value < UPDRAFTPLUS_SPLIT_MIN) $value = UPDRAFTPLUS_SPLIT_MIN;
3269
- return $value;
3270
  }
3271
 
3272
  /**
3273
  * Check if curl exists; if not, print or return appropriate error messages
3274
  *
3275
- * @param String $service - the service description (used only for user-visible messages - so, use the description)
3276
- * @param Boolean $has_fallback - set as true if the lack of Curl only affects the ability to connect over SSL
3277
- * @param String $extraclass - an extra CSS class for any resulting message, passed on to show_double_warning()
3278
- * @param Boolean $echo_instead_of_return - whether the result should be echoed or returned
3279
- *
3280
- * @returns String|Void - any resulting message, if $echo_instead_of_return was set
3281
  */
3282
  public function curl_check($service, $has_fallback = false, $extraclass = '', $echo_instead_of_return = true) {
3283
 
@@ -3293,12 +3438,12 @@ class UpdraftPlus_Admin {
3293
  $curl_ssl_supported= ($curl_version['features'] & CURL_VERSION_SSL);
3294
  if (!$curl_ssl_supported) {
3295
  if ($has_fallback) {
3296
- $ret .= '<p><strong>'.__('Warning', 'updraftplus').':</strong> '.sprintf(__("Your web server's PHP/Curl installation does not support https access. Communications with %s will be unencrypted. Ask your web host to install Curl/SSL in order to gain the ability for encryption (via an add-on).",'updraftplus'), $service).'</p>';
3297
  } else {
3298
- $ret .= $this->show_double_warning('<p><strong>'.__('Warning', 'updraftplus').':</strong> '.sprintf(__("Your web server's PHP/Curl installation does not support https access. We cannot access %s without this support. Please contact your web hosting provider's support. %s <strong>requires</strong> Curl+https. Please do not file any support requests; there is no alternative.",'updraftplus'), $service, $service).'</p>', $extraclass, false);
3299
  }
3300
  } else {
3301
- $ret .= '<p><em>'.sprintf(__("Good news: Your site's communications with %s can be encrypted. If you see any errors to do with encryption, then look in the 'Expert Settings' for more help.", 'updraftplus'),$service).'</em></p>';
3302
  }
3303
  }
3304
  if ($echo_instead_of_return) {
@@ -3308,22 +3453,29 @@ class UpdraftPlus_Admin {
3308
  }
3309
  }
3310
 
3311
- # If $basedirs is passed as an array, then $directorieses must be too
3312
- # Note: Reason $directorieses is being used because $directories is used within the foreach-within-a-foreach further down
3313
- private function recursive_directory_size($directorieses, $exclude = array(), $basedirs = '', $format='text') {
 
 
 
 
 
 
 
 
3314
 
3315
-
3316
  $size = 0;
3317
 
3318
- if (is_string($directorieses)) {
3319
- $basedirs = $directorieses;
3320
- $directorieses = array($directorieses);
3321
  }
3322
 
3323
  if (is_string($basedirs)) $basedirs = array($basedirs);
3324
 
3325
- foreach ($directorieses as $ind => $directories) {
3326
- if (!is_array($directories)) $directories=array($directories);
3327
 
3328
  $basedir = empty($basedirs[$ind]) ? $basedirs[0] : $basedirs[$ind];
3329
 
@@ -3349,14 +3501,14 @@ class UpdraftPlus_Admin {
3349
 
3350
  $directory = $prefix_directory.('' == $suffix_directory ? '' : '/'.$suffix_directory);
3351
  $size = 0;
3352
- if (substr($directory, -1) == '/') $directory = substr($directory,0,-1);
3353
 
3354
  if (!file_exists($directory) || !is_dir($directory) || !is_readable($directory)) return -1;
3355
  if (file_exists($directory.'/.donotbackup')) return 0;
3356
 
3357
  if ($handle = opendir($directory)) {
3358
  while (($file = readdir($handle)) !== false) {
3359
- if ($file != '.' && $file != '..') {
3360
  $spath = ('' == $suffix_directory) ? $file : $suffix_directory.'/'.$file;
3361
  if (false !== ($fkey = array_search($spath, $exclude))) {
3362
  unset($exclude[$fkey]);
@@ -3367,7 +3519,9 @@ class UpdraftPlus_Admin {
3367
  $size += filesize($path);
3368
  } elseif (is_dir($path)) {
3369
  $handlesize = $this->recursive_directory_size_raw($prefix_directory, $exclude, $suffix_directory.('' == $suffix_directory ? '' : '/').$file);
3370
- if ($handlesize >= 0) { $size += $handlesize; }# else { return -1; }
 
 
3371
  }
3372
  }
3373
  }
@@ -3384,7 +3538,7 @@ class UpdraftPlus_Admin {
3384
 
3385
  $backup = $backup_history[$key];
3386
 
3387
- $pretty_date = get_date_from_gmt(gmdate('Y-m-d H:i:s', (int)$key), 'M d, Y G:i');
3388
 
3389
  $rawbackup = "<h2 title=\"$key\">$pretty_date</h2>";
3390
 
@@ -3406,12 +3560,6 @@ class UpdraftPlus_Admin {
3406
  if (!isset($backup[$type])) continue;
3407
 
3408
  $rawbackup .= $updraftplus->printfile($info['description'], $backup, $type, $checksums, $jd, true);
3409
-
3410
- // $rawbackup .= '<h3>'.$info['description'].'</h3>';
3411
- // $files = is_string($backup[$type]) ? array($backup[$type]) : $backup[$type];
3412
- // foreach ($files as $index => $file) {
3413
- // $rawbackup .= $file.'<br>';
3414
- // }
3415
  }
3416
 
3417
  $total_size = 0;
@@ -3446,7 +3594,7 @@ class UpdraftPlus_Admin {
3446
 
3447
  $rawbackup .= $show_services;
3448
 
3449
- if ($total_size !== false) {
3450
  $rawbackup .= '</p><strong>'.__('Total backup size:', 'updraftplus').'</strong> '.$updraftplus->convert_numeric_size_to_text($total_size).'<p>';
3451
  }
3452
 
@@ -3507,7 +3655,16 @@ class UpdraftPlus_Admin {
3507
  return $ret;
3508
  }
3509
 
3510
- // Go through each of the file entities
 
 
 
 
 
 
 
 
 
3511
  public function download_buttons($backup, $key, $accept, &$entities, $esc_pretty_date) {
3512
  global $updraftplus;
3513
  $ret = '';
@@ -3538,7 +3695,7 @@ class UpdraftPlus_Admin {
3538
  if ('wpcore' == $type) $wpcore_restore_descrip = $sdescrip;
3539
  }
3540
  if (isset($backup[$type])) {
3541
- if (!is_array($backup[$type])) $backup[$type]=array($backup[$type]);
3542
  $howmanyinset = count($backup[$type]);
3543
  $expected_index = 0;
3544
  $index_missing = false;
@@ -3547,7 +3704,7 @@ class UpdraftPlus_Admin {
3547
  $whatfiles = $backup[$type];
3548
  ksort($whatfiles);
3549
  foreach ($whatfiles as $findex => $bfile) {
3550
- $set_contents .= ($set_contents == '') ? $findex : ",$findex";
3551
  if ($findex != $expected_index) $index_missing = true;
3552
  $expected_index++;
3553
  }
@@ -3572,10 +3729,9 @@ class UpdraftPlus_Admin {
3572
  }
3573
 
3574
  if (!$first_entity) {
3575
- // $ret .= ', ';
3576
  } else {
3577
  $first_entity = false;
3578
- }
3579
 
3580
  $ret .= $this->download_button($type, $key, $findex, $info, $ide, $pdescrip, $esc_pretty_date, $set_contents);
3581
 
@@ -3591,11 +3747,10 @@ class UpdraftPlus_Admin {
3591
  }
3592
 
3593
  public function date_label($pretty_date, $key, $backup, $jobdata, $nonce, $simple_format = false) {
3594
- // $ret = apply_filters('updraftplus_showbackup_date', '<strong>'.$pretty_date.'</strong>', $backup, $jobdata, (int)$key);
3595
 
3596
  $pretty_date = $simple_format ? $pretty_date : '<div class="clear-right">'.$pretty_date.'</div>';
3597
 
3598
- $ret = apply_filters('updraftplus_showbackup_date', $pretty_date, $backup, $jobdata, (int)$key, $simple_format);
3599
  if (is_array($jobdata) && !empty($jobdata['resume_interval']) && (empty($jobdata['jobstatus']) || 'finished' != $jobdata['jobstatus'])) {
3600
  if ($simple_format) {
3601
  $ret .= ' '.__('(Not finished)', 'updraftplus');
@@ -3634,20 +3789,28 @@ class UpdraftPlus_Admin {
3634
  return $ret;
3635
  }
3636
 
3637
- public function delete_button($key, $nonce, $backup) {
3638
- $sval = (!empty($backup['service']) && $backup['service'] != 'email' && $backup['service'] != 'none' && $backup['service'] !== array('email') && $backup['service'] !== array('none')) ? '1' : '0';
 
 
 
 
 
 
 
 
 
3639
  return '<div class="updraftplus-remove" style="float: left; clear: none;" data-hasremote="'.$sval.'">
3640
- <a data-hasremote="'.$sval.'" data-nonce="'.$nonce.'" data-key="'.$key.'" class="no-decoration updraft-delete-link" href="#" title="'.esc_attr(__('Delete this backup set', 'updraftplus')).'">'.__('Delete', 'updraftplus').'</a>
3641
- </div>';
3642
  }
3643
 
3644
  public function log_button($backup) {
3645
  global $updraftplus;
3646
  $updraft_dir = $updraftplus->backups_dir_location();
3647
  $ret = '';
3648
- if (isset($backup['nonce']) && preg_match("/^[0-9a-f]{12}$/",$backup['nonce']) && is_readable($updraft_dir.'/log.'.$backup['nonce'].'.txt')) {
3649
  $nval = $backup['nonce'];
3650
- // $lt = esc_attr(__('View Log', 'updraftplus'));
3651
  $lt = __('View Log', 'updraftplus');
3652
  $url = esc_attr(UpdraftPlus_Options::admin_page()."?page=updraftplus&action=downloadlog&amp;updraftplus_backup_nonce=$nval");
3653
  $ret .= <<<ENDHERE
@@ -3672,10 +3835,9 @@ ENDHERE;
3672
  /**
3673
  * Carry out the restore process
3674
  *
3675
- * @param Integer $timestamp - identifying the backup to be restored
3676
- * @param Array|Null $continuation_data - for continuing a multi-stage restore (code believed to be incomplete)
3677
- *
3678
- * @return Boolean|WP_Error - WP_Error indicates a terminal failure; false indicates not-yet complete (not necessarily terminal); true indicates complete.
3679
  */
3680
  private function restore_backup($timestamp, $continuation_data = null) {
3681
 
@@ -3715,24 +3877,23 @@ ENDHERE;
3715
 
3716
  $credentials = request_filesystem_credentials(UpdraftPlus_Options::admin_page()."?page=updraftplus&action=updraft_restore&backup_timestamp=$timestamp", '', false, false, $extra_fields);
3717
  WP_Filesystem($credentials);
3718
- if ($wp_filesystem->errors->get_error_code()) {
3719
  echo '<p><em><a href="'.apply_filters('updraftplus_com_link', "https://updraftplus.com/faqs/asked-ftp-details-upon-restorationmigration-updates/").'">'.__('Why am I seeing this?', 'updraftplus').'</a></em></p>';
3720
- foreach ($wp_filesystem->errors->get_error_messages() as $message) show_message($message);
3721
  exit;
3722
  }
3723
 
3724
  // If we make it this far then WP_Filesystem has been instantiated and is functional
3725
 
3726
- # Set up logging
3727
  $updraftplus->backup_time_nonce();
3728
  $updraftplus->jobdata_set('job_type', 'restore');
3729
  $updraftplus->jobdata_set('job_time_ms', $updraftplus->job_time_ms);
3730
  $updraftplus->logfile_open($updraftplus->nonce);
3731
 
3732
- # Provide download link for the log file
3733
-
3734
- # TODO: Automatic purging of old log files
3735
- # TODO: Provide option to auto-email the log file
3736
 
3737
  echo '<h1>'.__('UpdraftPlus Restoration: Progress', 'updraftplus').'</h1><div id="updraft-restore-progress">';
3738
 
@@ -3800,7 +3961,7 @@ ENDHERE;
3800
  parse_str(stripslashes($_POST['updraft_restorer_restore_options']), $restore_options);
3801
  }
3802
  $restore_options['updraft_restorer_replacesiteurl'] = empty($_POST['updraft_restorer_replacesiteurl']) ? false : true;
3803
- $restore_options['updraft_encryptionphrase'] = empty($_POST['updraft_encryptionphrase']) ? '' : (string)stripslashes($_POST['updraft_encryptionphrase']);
3804
  $restore_options['updraft_restorer_wpcore_includewpconfig'] = empty($_POST['updraft_restorer_wpcore_includewpconfig']) ? false : true;
3805
  $updraftplus->jobdata_set('restore_options', $restore_options);
3806
  }
@@ -3821,7 +3982,7 @@ ENDHERE;
3821
  $backupable_entities = apply_filters('updraft_backupable_file_entities_on_restore', $backupable_entities, $restore_options, $backup_set);
3822
 
3823
  // We use a single object for each entity, because we want to store information about the backup set
3824
- require_once(UPDRAFTPLUS_DIR.'/restorer.php');
3825
 
3826
  global $updraftplus_restorer;
3827
 
@@ -3851,14 +4012,14 @@ ENDHERE;
3851
  foreach ($backup_set as $type => $files) {
3852
  // All restorable entities must be given explicitly, as we can store other arbitrary data in the history array
3853
  if (!isset($backupable_entities[$type]) && 'db' != $type) continue;
3854
- if (isset($backupable_entities[$type]['restorable']) && $backupable_entities[$type]['restorable'] == false) continue;
3855
 
3856
  if (!isset($entities_to_download[$type])) continue;
3857
  if ('wpcore' == $type && is_multisite() && 0 === $updraftplus_restorer->ud_backup_is_multisite) {
3858
  echo "<p>$type: <strong>";
3859
  $updraftplus->log(__('Skipping restoration of WordPress core when importing a single site into a multisite installation. If you had anything necessary in your WordPress directory then you will need to re-add it manually from the zip file.', 'updraftplus'), 'notice-restore');
3860
- #TODO
3861
- #$updraftplus->log_e('Skipping restoration of WordPress core when importing a single site into a multisite installation. If you had anything necessary in your WordPress directory then you will need to re-add it manually from the zip file.');
3862
  echo "</strong></p>";
3863
  continue;
3864
  }
@@ -3879,11 +4040,11 @@ ENDHERE;
3879
 
3880
  $this->get_remote_file($service, $file, $timestamp, true);
3881
 
3882
- $index = ($ind == 0) ? '' : $ind;
3883
  // If a file size is stored in the backup data, then verify correctness of the local file
3884
  if (isset($backup_set[$type.$index.'-size'])) {
3885
  $fs = $backup_set[$type.$index.'-size'];
3886
- $print_message = __("Archive is expected to be size:",'updraftplus')." ".round($fs/1024, 1)." KB: ";
3887
  $as = @filesize($fullpath);
3888
  if ($as == $fs) {
3889
  $updraftplus->log($print_message.__('OK', 'updraftplus'), 'notice-restore');
@@ -3891,7 +4052,7 @@ ENDHERE;
3891
  $updraftplus->log($print_message.__('Error:', 'updraftplus')." ".__('file is size:', 'updraftplus')." ".round($as/1024)." ($fs, $as)", 'warning-restore');
3892
  }
3893
  } else {
3894
- $updraftplus->log(__("The backup records do not contain information about the proper size of this file.",'updraftplus'), 'notice-restore');
3895
  }
3896
  if (!is_readable($fullpath)) {
3897
  $updraftplus->log(__('Could not find one of the files for restoration', 'updraftplus')." ($file)", 'warning-restore');
@@ -3923,11 +4084,11 @@ ENDHERE;
3923
  foreach ($val->get_error_codes() as $code) {
3924
  if ('already_exists' == $code) $this->print_delete_old_dirs_form(false);
3925
  }
3926
- echo '</div>'; //close the updraft_restore_progress div even if we error
3927
  restore_error_handler();
3928
  return $val;
3929
  } elseif (false === $val) {
3930
- echo '</div>'; //close the updraft_restore_progress div even if we error
3931
  restore_error_handler();
3932
  return false;
3933
  }
@@ -4023,12 +4184,12 @@ ENDHERE;
4023
  }
4024
  }
4025
  }
4026
- echo '</div>'; //close the updraft_restore_progress div even if we error
4027
  restore_error_handler();
4028
  return $val;
4029
  }
4030
  } elseif (false === $val) {
4031
- echo '</div>'; //close the updraft_restore_progress div even if we error
4032
  restore_error_handler();
4033
  return false;
4034
  }
@@ -4056,11 +4217,11 @@ ENDHERE;
4056
  // Clear any cached pages after the restore
4057
  $updraftplus_restorer->clear_cache();
4058
 
4059
- if (!function_exists('validate_current_theme')) require_once(ABSPATH.WPINC.'/themes');
4060
 
4061
  // Have seen a case where the current theme in the DB began with a capital, but not on disk - and this breaks migrating from Windows to a case-sensitive system
4062
  $template = get_option('template');
4063
- if (!empty($template) && $template != WP_DEFAULT_THEME && $template != strtolower($template)) {
4064
 
4065
  $theme_root = get_theme_root($template);
4066
  $theme_root2 = get_theme_root(strtolower($template));
@@ -4085,13 +4246,25 @@ ENDHERE;
4085
  return true;
4086
  }
4087
 
4088
- public function option_filter_template($val) { global $updraftplus; return $updraftplus->option_filter_get('template'); }
 
 
 
4089
 
4090
- public function option_filter_stylesheet($val) { global $updraftplus; return $updraftplus->option_filter_get('stylesheet'); }
 
 
 
4091
 
4092
- public function option_filter_template_root($val) { global $updraftplus; return $updraftplus->option_filter_get('template_root'); }
 
 
 
4093
 
4094
- public function option_filter_stylesheet_root($val) { global $updraftplus; return $updraftplus->option_filter_get('stylesheet_root'); }
 
 
 
4095
 
4096
  public function sort_restoration_entities($a, $b) {
4097
  if ($a == $b) return 0;
@@ -4129,15 +4302,15 @@ ENDHERE;
4129
  die;
4130
  }
4131
 
4132
- public function updraft_ajax_importsettings() {
4133
- global $updraftplus;
4134
-
4135
- if (empty($_POST) || empty($_POST['subaction']) || 'importsettings' != $_POST['subaction'] || !isset($_POST['nonce']) || !is_user_logged_in() || !UpdraftPlus_Options::user_can_manage() || !wp_verify_nonce($_POST['nonce'], 'updraftplus-settings-nonce')) die('Security check');
4136
-
4137
- if (empty($_POST['settings']) || !is_string($_POST['settings'])) die('Invalid data');
4138
 
4139
  $this->import_settings($_POST);
4140
- }
4141
 
4142
  /**
4143
  * This method handles the imported json settings it will convert them into a readable format for the existing save settings function, it will also update some of the options to match the new remote storage options format (Apr 2017)
@@ -4177,9 +4350,9 @@ ENDHERE;
4177
  if (empty($posted_settings['updraft_azure']['settings'])) $posted_settings['updraft_azure'] = $updraftplus->wrap_remote_storage_options($posted_settings['updraft_azure']);
4178
  if (empty($posted_settings['updraft_dropbox']['settings'])) $posted_settings['updraft_dropbox'] = $updraftplus->wrap_remote_storage_options($posted_settings['updraft_dropbox']);
4179
 
4180
- echo json_encode($this->save_settings($posted_settings));
4181
 
4182
- die;
4183
  }
4184
 
4185
  private function backup_now_remote_message() {
@@ -4197,12 +4370,13 @@ ENDHERE;
4197
  return '<input type="checkbox" id="backupnow_includecloud" checked="checked"> <label for="backupnow_includecloud">'.__("Send this backup to remote storage", 'updraftplus').'</label>';
4198
  }
4199
  }
4200
-
4201
- /**
4202
- * This method works through the passed in settings array and saves the settings to the database clearing old data and setting up a return array with content to update the page via ajax
4203
- * @param [Array] $settings - an array of settings taking from the admin page ready to be saved to the database
4204
- * @return [Array] - an array response containing the status of the update along with content to be used to update the admin page.
4205
- */
 
4206
  public function save_settings($settings) {
4207
 
4208
  global $updraftplus;
@@ -4218,11 +4392,11 @@ ENDHERE;
4218
 
4219
  $add_to_post_keys = array('updraft_interval', 'updraft_interval_database', 'updraft_starttime_files', 'updraft_starttime_db', 'updraft_startday_files', 'updraft_startday_db');
4220
 
4221
- //If database and files are on same schedule, override the db day/time settings
4222
  if (isset($settings['updraft_interval_database']) && isset($settings['updraft_interval_database']) && $settings['updraft_interval_database'] == $settings['updraft_interval'] && isset($settings['updraft_starttime_files'])) {
4223
  $settings['updraft_starttime_db'] = $settings['updraft_starttime_files'];
4224
  $settings['updraft_startday_db'] = $settings['updraft_startday_files'];
4225
- }
4226
  foreach ($add_to_post_keys as $key) {
4227
  // For add-ons that look at $_POST to find saved settings, add the relevant keys to $_POST so that they find them there
4228
  if (isset($settings[$key])) {
@@ -4257,14 +4431,14 @@ ENDHERE;
4257
  foreach ($settings as $key => $value) {
4258
 
4259
  if (in_array($key, $relevant_keys)) {
4260
- if ($key == 'updraft_service' && is_array($value)){
4261
- foreach ($value as $subkey => $subvalue){
4262
- if ($subvalue == '0') unset($value[$subkey]);
4263
  }
4264
  }
4265
 
4266
  // This flag indicates that either the stored database option was changed, or that the supplied option was changed before being stored. It isn't comprehensive - it's only used to update some UI elements with invalid input.
4267
- $updated = empty($mass_updated) ? (is_string($value) && $value != UpdraftPlus_Options::get_updraft_option($key)) : (is_string($value) && (!isset($original_settings[$key]) || $original_settings[$key] != $value));
4268
 
4269
  $db_updated = empty($mass_updated) ? UpdraftPlus_Options::update_updraft_option($key, $value) : true;
4270
 
@@ -4274,10 +4448,12 @@ ENDHERE;
4274
  $value = UpdraftPlus_Options::get_updraft_option($key);
4275
  if (is_string($value)) $return_array['changed'][$key] = $value;
4276
  }
4277
-
4278
  } else {
 
 
4279
  // When last active, it was catching: option_page, action, _wpnonce, _wp_http_referer, updraft_s3_endpoint, updraft_dreamobjects_endpoint. The latter two are empty; probably don't need to be in the page at all.
4280
- //error_log("Non-UD key when saving from POSTed data: ".$key);
4281
  }
4282
  }
4283
  } else {
@@ -4296,13 +4472,13 @@ ENDHERE;
4296
 
4297
  // Check if $more_files_path_updated is true, is so then there's a change and we should update the backup modal
4298
  if ($more_files_path_updated) {
4299
- $return_array['updraft_include_more_path'] = $this->files_selector_widgetry('backupnow_files_', false, 'sometimes');
4300
  }
4301
 
4302
- //Because of the single AJAX call, we need to remove the existing UD messages from the 'all_admin_notices' action
4303
  remove_all_actions('all_admin_notices');
4304
 
4305
- //Moving from 2 to 1 ajax call
4306
  ob_start();
4307
 
4308
  $service = UpdraftPlus_Options::get_updraft_option('updraft_service');
@@ -4312,7 +4488,7 @@ ENDHERE;
4312
 
4313
  do_action('all_admin_notices');
4314
 
4315
- if (!$really_is_writable) { //Check if writable
4316
  $this->show_admin_warning_unwritable();
4317
  }
4318
 
@@ -4338,16 +4514,16 @@ ENDHERE;
4338
  $return_array['messages'] = $messages_output;
4339
  $return_array['scheduled'] = $scheduled_output;
4340
 
4341
- //*** Add the updated options to the return message, so we can update on screen ***\\
4342
-
4343
-
4344
  return $return_array;
4345
 
4346
  }
4347
 
4348
  /**
4349
  * A method to remove UpdraftPlus settings from the options table.
 
4350
  * @param boolean $wipe_all_settings Set to true as default as we want to remove all options, set to false if calling from UpdraftCentral, as we do not want to remove the UpdraftCentral key or we will lose connection to the site.
 
4351
  */
4352
  public function updraft_wipe_settings($wipe_all_settings = true) {
4353
 
@@ -4374,15 +4550,37 @@ ENDHERE;
4374
 
4375
  return true;
4376
  }
4377
-
4378
- //this get the details for updraft vault and to be used globally
4379
- public function get_updraftvault() {
4380
- require_once(UPDRAFTPLUS_DIR.'/methods/updraftvault.php');
4381
- $vault = new UpdraftPlus_BackupModule_updraftvault();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4382
  return $vault;
4383
  }
4384
 
4385
- // http_get will allow the HTTP Fetch execute available in advanced tools
 
 
 
 
 
 
4386
  public function http_get($uri = null, $curl = false) {
4387
 
4388
  if (!preg_match('/^https?/', $uri)) return json_encode(array('e' => 'Non-http URL specified'));
@@ -4398,7 +4596,7 @@ ENDHERE;
4398
  curl_setopt($ch, CURLOPT_FAILONERROR, true);
4399
  curl_setopt($ch, CURLOPT_HEADER, false);
4400
  curl_setopt($ch, CURLOPT_VERBOSE, true);
4401
- curl_setopt($ch, CURLOPT_STDERR, $output=fopen('php://temp', "w+"));
4402
  $response = curl_exec($ch);
4403
  $error = curl_error($ch);
4404
  $getinfo = curl_getinfo($ch);
@@ -4415,13 +4613,12 @@ ENDHERE;
4415
 
4416
  if (!empty($verb)) $resp['r'] = htmlspecialchars($verb)."\n\n".$resp['r'];
4417
 
4418
- //extra info returned for Central
4419
  $resp['verb'] = $verb;
4420
  $resp['response'] = $response;
4421
  $resp['status'] = $getinfo;
4422
 
4423
  return json_encode($resp);
4424
- // echo json_encode(array('r' => htmlspecialchars(substr($response, 0, 2048))));
4425
  } else {
4426
  $response = wp_remote_get($uri, array('timeout' => 10));
4427
  if (is_wp_error($response)) {
@@ -4454,7 +4651,7 @@ ENDHERE;
4454
  ob_start();
4455
  $history = UpdraftPlus_Backup_History::get_history();
4456
  var_dump($history);
4457
- $response["html"] .= ob_get_clean();
4458
  $response['html'] .= '</pre>';
4459
 
4460
  $response['html'] .= '<h3 id="ud-debuginfo-files">'.__('Files', 'updraftplus').'</h3><pre>';
@@ -4478,7 +4675,11 @@ ENDHERE;
4478
  }
4479
  @$d->close();
4480
  krsort($raw_output, SORT_NUMERIC);
4481
- foreach ($raw_output as $line){ $response['html'] .= $line; }
 
 
 
 
4482
  $response['html'] .= '</pre>';
4483
 
4484
  $response['html'] .= '<h3 id="ud-debuginfo-options">'.__('Options (raw)', 'updraftplus').'</h3>';
@@ -4496,14 +4697,20 @@ ENDHERE;
4496
  $response['html'] .= ob_get_clean();
4497
 
4498
  if (true == $no_pre_tags) {
4499
- $response['html'] = str_replace('<pre>','',$response['html']);
4500
- $response['html'] = str_replace('</pre>','',$response['html']);
4501
  }
4502
 
4503
  return $response;
4504
  }
4505
 
4506
- // This will call any wp_action
 
 
 
 
 
 
4507
  public function call_wp_action($data = null, $close_connection_callable = false) {
4508
  global $updraftplus;
4509
 
@@ -4527,7 +4734,7 @@ ENDHERE;
4527
 
4528
  $ret = ob_get_clean();
4529
 
4530
- //need to add this as the close browser should only work for UDP
4531
  if ($close_connection_callable) {
4532
  if (is_callable($close_connection_callable)) {
4533
  call_user_func($close_connection_callable, array('r' => $res));
@@ -4553,22 +4760,25 @@ ENDHERE;
4553
  $response['response'] = $res;
4554
  $response['log'] = $output;
4555
 
4556
- //Check if response is empty
4557
  if (!empty($returned)) $response['status'] = $returned;
4558
 
4559
  return $response;
4560
  }
4561
 
 
 
 
4562
  public function enqueue_jstree() {
4563
 
4564
  static $already_enqueued = false;
4565
  if ($already_enqueued) return;
4566
 
4567
- $already_enqueued = true;
4568
  $jstree_enqueue_version = (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) ? '3.3'.'.'.time() : '3.3';
4569
  $min_or_not = (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) ? '' : '.min';
4570
- // Include jstree components
4571
  wp_enqueue_script('jstree', UPDRAFTPLUS_URL.'/includes/jstree/jstree'.$min_or_not.'.js', array('jquery'), $jstree_enqueue_version);
4572
- wp_enqueue_style('jstree', UPDRAFTPLUS_URL.'/includes/jstree/themes/default/style'.$min_or_not.'.css', array(), $jstree_enqueue_version);
4573
  }
4574
  }
1
  <?php
2
 
3
+ if (!defined('UPDRAFTPLUS_DIR')) die('No direct access allowed');
4
 
5
  // Admin-area code lives here. This gets called in admin_menu, earlier than admin_init
6
 
15
 
16
  private $backups_instance_ids;
17
 
18
+ private $auth_instance_ids = array('dropbox' => array(), 'onedrive' => array(), 'googledrive' => array(), 'googlecloud' => array());
19
+
20
  public function __construct() {
21
  $this->admin_init();
22
  }
33
  return $path;
34
  }
35
 
36
+ /**
37
+ * Get the path to the UI templates directory
38
+ *
39
+ * @return String - a filesystem directory path
40
+ */
41
  public function get_templates_dir() {
42
  return apply_filters('updraftplus_templates_dir', $this->wp_normalize_path(UPDRAFTPLUS_DIR.'/templates'));
43
  }
44
 
 
 
 
 
45
  private function register_template_directories() {
46
 
47
  $template_directories = array();
121
  $clientid = $storage_options['clientid'];
122
  $token = empty($storage_options['token']) ? '' : $storage_options['token'];
123
  }
124
+ if (!empty($clientid) && '' == $token) {
125
+ if (!in_array($instance_id, $this->auth_instance_ids['googledrive'])) $this->auth_instance_ids['googledrive'][] = $instance_id;
126
+ if (false === has_action('all_admin_notices', array($this, 'show_admin_warning_googledrive'))) add_action('all_admin_notices', array($this, 'show_admin_warning_googledrive'));
127
+ }
128
  unset($clientid);
129
  unset($token);
130
  } else {
131
+ if (empty($storage_options['user_id'])) {
132
+ if (!in_array($instance_id, $this->auth_instance_ids['googledrive'])) $this->auth_instance_ids['googledrive'][] = $instance_id;
133
+ if (false === has_action('all_admin_notices', array($this, 'show_admin_warning_googledrive'))) add_action('all_admin_notices', array($this, 'show_admin_warning_googledrive'));
134
+ }
135
  }
136
  }
137
  }
149
  $clientid = $storage_options['clientid'];
150
  $token = (empty($storage_options['token'])) ? '' : $storage_options['token'];
151
 
152
+ if (!empty($clientid) && empty($token)) {
153
+ if (!in_array($instance_id, $this->auth_instance_ids['googlecloud'])) $this->auth_instance_ids['googlecloud'][] = $instance_id;
154
+ if (false === has_action('all_admin_notices', array($this, 'show_admin_warning_googlecloud'))) add_action('all_admin_notices', array($this, 'show_admin_warning_googlecloud'));
155
+ }
156
  }
157
  }
158
  }
168
  } elseif (!empty($settings['settings'])) {
169
  foreach ($settings['settings'] as $instance_id => $storage_options) {
170
  if (empty($storage_options['tk_access_token'])) {
171
+ if (!in_array($instance_id, $this->auth_instance_ids['dropbox'])) $this->auth_instance_ids['dropbox'][] = $instance_id;
172
+ if (false === has_action('all_admin_notices', array($this, 'show_admin_warning_dropbox'))) add_action('all_admin_notices', array($this, 'show_admin_warning_dropbox'));
173
  }
174
  }
175
  }
185
  $updraftplus->log_wp_error($settings, true, true);
186
  } elseif (!empty($settings['settings'])) {
187
  foreach ($settings['settings'] as $instance_id => $storage_options) {
188
+ if ((defined('UPDRAFTPLUS_CUSTOM_ONEDRIVE_APP') && UPDRAFTPLUS_CUSTOM_ONEDRIVE_APP)) {
189
+ if (!empty($storage_options['clientid']) && !empty($storage_options['secret']) && empty($storage_options['refresh_token'])) {
190
+ if (!in_array($instance_id, $this->auth_instance_ids['onedrive'])) $this->auth_instance_ids['onedrive'][] = $instance_id;
191
+ if (false === has_action('all_admin_notices', array($this, 'show_admin_warning_onedrive'))) add_action('all_admin_notices', array($this, 'show_admin_warning_onedrive'));
192
  } elseif (empty($storage_options['refresh_token'])) {
193
+ if (!in_array($instance_id, $this->auth_instance_ids['onedrive'])) $this->auth_instance_ids['onedrive'][] = $instance_id;
194
+ if (false === has_action('all_admin_notices', array($this, 'show_admin_warning_onedrive'))) add_action('all_admin_notices', array($this, 'show_admin_warning_onedrive'));
195
+ }
196
+ } else {
197
+ if (empty($storage_options['refresh_token'])) {
198
+ if (!in_array($instance_id, $this->auth_instance_ids['onedrive'])) $this->auth_instance_ids['onedrive'][] = $instance_id;
199
+ if (false === has_action('all_admin_notices', array($this, 'show_admin_warning_onedrive'))) add_action('all_admin_notices', array($this, 'show_admin_warning_onedrive'));
200
  }
 
 
201
  }
202
  }
203
  }
214
  } elseif (!empty($settings['settings'])) {
215
  foreach ($settings['settings'] as $instance_id => $storage_options) {
216
  if (empty($storage_options['token']) && empty($storage_options['email'])) {
217
+ add_action('all_admin_notices', array($this, 'show_admin_warning_updraftvault'));
218
  }
219
  }
220
  }
223
  if ($this->disk_space_check(1048576*35) === false) add_action('all_admin_notices', array($this, 'show_admin_warning_diskspace'));
224
  }
225
 
226
+ private function setup_all_admin_notices_udonly($service, $override = false) {
227
  global $wp_version;
228
 
229
  if (UpdraftPlus_Options::user_can_manage() && defined('DISABLE_WP_CRON') && DISABLE_WP_CRON && (!defined('UPDRAFTPLUS_DISABLE_WP_CRON_NOTICE') || !UPDRAFTPLUS_DISABLE_WP_CRON_NOTICE)) {
231
  }
232
 
233
  if (UpdraftPlus_Options::get_updraft_option('updraft_debug_mode')) {
234
+ @ini_set('display_errors', 1);
235
  @error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
236
  add_action('all_admin_notices', array($this, 'show_admin_debug_warning'));
237
  }
241
  $this->no_settings_warning = true;
242
  }
243
 
244
+ // Avoid false positives, by attempting to raise the limit (as happens when we actually do a backup)
245
  @set_time_limit(UPDRAFTPLUS_SET_TIME_LIMIT);
246
+ $max_execution_time = (int) @ini_get('max_execution_time');
247
  if ($max_execution_time>0 && $max_execution_time<20) {
248
  add_action('all_admin_notices', array($this, 'show_admin_warning_execution_time'));
249
  }
258
  if (version_compare($wp_version, '3.2', '<')) add_action('all_admin_notices', array($this, 'show_admin_warning_wordpressversion'));
259
  }
260
 
261
+ /**
262
+ * Used to output the information for the next scheduled backup.
263
+ * moved to function for the ajax saves
264
+ */
 
 
 
 
 
 
 
 
 
 
265
  public function next_scheduled_backups_output() {
266
  // UNIX timestamp
267
  $next_scheduled_backup = wp_next_scheduled('updraft_backup');
270
  $next_scheduled_backup_gmt = gmdate('Y-m-d H:i:s', $next_scheduled_backup);
271
  // Convert to blog time zone
272
  $next_scheduled_backup = get_date_from_gmt($next_scheduled_backup_gmt, 'D, F j, Y H:i');
273
+ // $next_scheduled_backup = date_i18n('D, F j, Y H:i', $next_scheduled_backup);
274
  } else {
275
  $next_scheduled_backup = __('Nothing currently scheduled', 'updraftplus');
276
  $files_not_scheduled = true;
277
  }
278
 
279
  $next_scheduled_backup_database = wp_next_scheduled('updraft_backup_database');
280
+ if (UpdraftPlus_Options::get_updraft_option('updraft_interval_database', UpdraftPlus_Options::get_updraft_option('updraft_interval')) == UpdraftPlus_Options::get_updraft_option('updraft_interval')) {
281
  if (isset($files_not_scheduled)) {
282
  $next_scheduled_backup_database = $next_scheduled_backup;
283
  $database_not_scheduled = true;
291
  $next_scheduled_backup_database_gmt = gmdate('Y-m-d H:i:s', $next_scheduled_backup_database);
292
  // Convert to blog time zone
293
  $next_scheduled_backup_database = get_date_from_gmt($next_scheduled_backup_database_gmt, 'D, F j, Y H:i');
294
+ // $next_scheduled_backup_database = date_i18n('D, F j, Y H:i', $next_scheduled_backup_database);
295
  } else {
296
  $next_scheduled_backup_database = __('Nothing currently scheduled', 'updraftplus');
297
  $database_not_scheduled = true;
313
  }
314
  }
315
 
316
+ /**
317
+ * Run upon the WP admin_init action
318
+ */
319
  private function admin_init() {
320
 
321
  add_action('core_upgrade_preamble', array($this, 'core_upgrade_preamble'));
322
  add_action('admin_action_upgrade-plugin', array($this, 'admin_action_upgrade_pluginortheme'));
323
  add_action('admin_action_upgrade-theme', array($this, 'admin_action_upgrade_pluginortheme'));
324
 
325
+ add_action('admin_head', array($this, 'admin_head'));
326
  add_filter((is_multisite() ? 'network_admin_' : '').'plugin_action_links', array($this, 'plugin_action_links'), 10, 2);
327
  add_action('wp_ajax_updraft_download_backup', array($this, 'updraft_download_backup'));
328
  add_action('wp_ajax_updraft_ajax', array($this, 'updraft_ajax_handler'));
337
  // Add a new Ajax action for saving settings
338
  add_action('wp_ajax_updraft_savesettings', array($this, 'updraft_ajax_savesettings'));
339
 
340
+ // Ajax for settings import and export
341
+ add_action('wp_ajax_updraft_importsettings', array($this, 'updraft_ajax_importsettings'));
342
 
343
  // UpdraftPlus templates
344
  $this->register_template_directories();
357
 
358
  // Main dashboard page advert
359
  // Since our nonce is printed, make sure they have sufficient credentials
360
+ if ('index.php' == $pagenow && current_user_can('update_plugins') && (!file_exists(UPDRAFTPLUS_DIR.'/udaddons') || (defined('UPDRAFTPLUS_FORCE_DASHNOTICE') && UPDRAFTPLUS_FORCE_DASHNOTICE))) {
361
 
362
  $dismissed_until = UpdraftPlus_Options::get_updraft_option('updraftplus_dismisseddashnotice', 0);
363
 
366
  $installed = @filemtime($backup_dir.'/index.html');
367
  $installed_for = time() - $installed;
368
 
369
+ if (($installed && time() > $dismissed_until && $installed_for > 28*86400 && !defined('UPDRAFTPLUS_NOADS_B')) || (defined('UPDRAFTPLUS_FORCE_DASHNOTICE') && UPDRAFTPLUS_FORCE_DASHNOTICE)) {
370
  add_action('all_admin_notices', array($this, 'show_admin_notice_upgradead'));
371
  }
372
  }
373
 
374
+ // Moved out for use with Ajax saving
375
  $this->setup_all_admin_notices_global($service);
376
  }
377
 
378
  // Next, the actions that only come on the UpdraftPlus page
379
+ if (UpdraftPlus_Options::admin_page() != $pagenow || empty($_REQUEST['page']) || 'updraftplus' != $_REQUEST['page']) return;
380
  $this->setup_all_admin_notices_udonly($service);
381
 
382
  add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts'), 99999);
385
  /**
386
  * Sets up what is needed to allow an in-page backup to be run. Will enqueue scripts and output appropriate HTML (so, should be run when at a suitable place). Not intended for use on the UpdraftPlus settings page.
387
  *
388
+ * @param string $title Text to use for the title of the modal
389
  * @param callable $callback Callable function to output the contents of the updraft_inpage_prebackup element - i.e. what shows in the modal before a backup beings.
 
390
  */
391
  public function add_backup_scaffolding($title, $callback) {
392
  $this->admin_enqueue_scripts();
434
  die();
435
  }
436
 
437
+ $restore_nonce = (string) $_POST['restorenonce'];
438
 
439
  if (empty($_POST['ajaxauth'])) {
440
  echo json_encode(array('e' => 'Illegitimate data sent (2)'));
471
  $updraftplus->backup_time_nonce($restore_nonce);
472
  $updraftplus->logfile_open($restore_nonce);
473
 
474
+ $timestamp = empty($_POST['timestamp']) ? false : (int) $_POST['timestamp'];
475
+ $multisite = empty($_POST['multisite']) ? false : (bool) $_POST['multisite'];
476
+ $created_by_version = empty($_POST['created_by_version']) ? false : (int) $_POST['created_by_version'];
477
 
478
  // TODO: We need to know about first_one (not yet sent), as well as last_one
479
 
480
  // TODO: Verify the values of these
481
+ $type = empty($_POST['type']) ? false : (int) $_POST['type'];
482
+ $backupfile = empty($_POST['backupfile']) ? false : (string) $_POST['backupfile'];
483
 
484
  $updraftplus->log("Deferred restore resumption: $type: $backupfile (timestamp=$timestamp, last_one=$last_one)");
485
 
567
  'id' => 'updraft_admin_node_premium',
568
  'title' => 'UpdraftPlus Premium',
569
  'parent' => 'updraft_admin_node',
570
+ 'href' => apply_filters('updraftplus_com_link', 'https://updraftplus.com/shop/updraftplus-premium/')
571
  );
572
  $wp_admin_bar->add_node($args);
573
  }
574
  }
575
 
576
+ /**
577
+ * Output HTML for a dashboard notice highlighting the benefits of upgrading to Premium
578
+ */
 
 
 
579
  public function show_admin_notice_upgradead() {
580
  $this->include_template('wp-admin/notices/thanks-for-using-main-dash.php');
581
  }
600
 
601
  }
602
 
603
+ /**
604
+ * This is also called directly from the auto-backup add-on
605
+ */
606
  public function admin_enqueue_scripts() {
607
 
608
  global $updraftplus, $wp_locale;
613
  // Defeat other plugins/themes which dump their jQuery UI CSS onto our settings page
614
  wp_deregister_style('jquery-ui');
615
  $jquery_ui_css_enqueue_version = (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) ? '1.11.4'.'.'.time() : '1.11.4';
616
+ wp_enqueue_style('jquery-ui', UPDRAFTPLUS_URL.'/includes/jquery-ui.custom'.$min_or_not.'.css', array(), $jquery_ui_css_enqueue_version);
617
 
618
  wp_enqueue_style('updraft-admin-css', UPDRAFTPLUS_URL.'/css/admin'.$min_or_not.'.css', array(), $enqueue_version);
619
+ // add_filter('style_loader_tag', array($this, 'style_loader_tag'), 10, 2);
620
 
621
  $this->ensure_sufficient_jquery_and_enqueue();
622
  $jquery_blockui_enqueue_version = (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) ? '2.70.0'.'.'.time() : '2.70.0';
633
 
634
  $day_selector = '';
635
  for ($day_index = 0; $day_index <= 6; $day_index++) {
636
+ // $selected = ($opt == $day_index) ? 'selected="selected"' : '';
637
  $selected = '';
638
  $day_selector .= "\n\t<option value='" . $day_index . "' $selected>" . $wp_locale->get_weekday($day_index) . '</option>';
639
  }
640
 
641
  $mday_selector = '';
642
  for ($mday_index = 1; $mday_index <= 28; $mday_index++) {
643
+ // $selected = ($opt == $mday_index) ? 'selected="selected"' : '';
644
  $selected = '';
645
  $mday_selector .= "\n\t<option value='" . $mday_index . "' $selected>" . $mday_index . '</option>';
646
  }
655
  'excludedeverything' => __('If you exclude both the database and the files, then you have excluded everything!', 'updraftplus'),
656
  'nofileschosen' => __('You have chosen to backup files, but no file entities have been selected', 'updraftplus'),
657
  'notableschosen' => __('You have chosen to backup a database, but no tables have been selected', 'updraftplus'),
658
+ 'restore_proceeding' => __('The restore operation has begun. Do not press stop or close your browser until it reports itself as having finished.', 'updraftplus'),
659
  'unexpectedresponse' => __('Unexpected response:', 'updraftplus'),
660
  'servererrorcode' => __('The web server returned an error code (try again, or check your web server logs)', 'updraftplus'),
661
  'newuserpass' => __("The new user's RackSpace console password is (this will not be shown again):", 'updraftplus'),
714
  'updatequotacount' => __('Update quota count', 'updraftplus'),
715
  'addingsite' => __('Adding...', 'updraftplus'),
716
  'addsite' => __('Add site', 'updraftplus'),
717
+ // 'resetting' => __('Resetting...', 'updraftplus'),
718
  'creating_please_allow' => __('Creating...', 'updraftplus').(function_exists('openssl_encrypt') ? '' : ' ('.__('your PHP install lacks the openssl module; as a result, this can take minutes; if nothing has happened by then, then you should either try a smaller key size, or ask your web hosting company how to enable this PHP module on your setup.', 'updraftplus').')'),
719
  'sendtosite' => __('Send to site:', 'updraftplus'),
720
  'checkrpcsetup' => sprintf(__('You should check that the remote site is online, not firewalled, does not have security modules that may be blocking access, has UpdraftPlus version %s or later active and that the keys have been entered correctly.', 'updraftplus'), '2.10.3'),
721
  'pleasenamekey' => __('Please give this key a name (e.g. indicate the site it is for):', 'updraftplus'),
722
  'key' => __('Key', 'updraftplus'),
723
+ 'nokeynamegiven' => sprintf(__("Failure: No %s was given.", 'updraftplus'), __('key name', 'updraftplus')),
724
  'deleting' => __('Deleting...', 'updraftplus'),
725
  'enter_mothership_url' => __('Please enter a valid URL', 'updraftplus'),
726
  'delete_response_not_understood' => __("We requested to delete the file, but could not understand the server's response", 'updraftplus'),
748
  'settings_test_result' => __('%s settings test result:', 'updraftplus'),
749
  'nothing_yet_logged' => __('Nothing yet logged', 'updraftplus'),
750
  'import_select_file' => __('You have not yet selected a file to import.', 'updraftplus'),
751
+ 'import_invalid_json_file' => __('Error: The chosen file is corrupt. Please choose a valid UpdraftPlus export file.', 'updraftplus'),
752
+ 'updraft_settings_url' => UpdraftPlus_Options::admin_page_url().'?page=updraftplus',
753
  'network_site_url' => network_site_url(),
754
  'importing' => __('Importing...', 'updraftplus'),
755
  'importing_data_from' => __('This will import data from:', 'updraftplus'),
767
  'loading_log_file' => __('Loading log file', 'updraftplus'),
768
  'updraftplus_version' => $updraftplus->version,
769
  'updraftcentral_wizard_empty_url' => __('Please enter the URL where your UpdraftCentral dashboard is hosted.'),
770
+ 'updraftcentral_wizard_invalid_url' => __('Please enter a valid URL e.g http://example.com', 'updraftplus')
771
+ ));
772
  }
773
 
774
+ /**
775
+ * Despite the name, this fires irrespective of what capabilities the user has (even none - so be careful)
776
+ */
777
  public function core_upgrade_preamble() {
778
  // They need to be able to perform backups, and to perform updates
779
  if (!UpdraftPlus_Options::user_can_manage() || (!current_user_can('update_core') && !current_user_can('update_plugins') && !current_user_can('update_themes'))) return;
783
  }
784
 
785
  ?>
786
+ <?php
787
  if (!class_exists('UpdraftPlus_Addon_Autobackup')) {
788
+ if (!class_exists('UpdraftPlus_Notices')) include_once(UPDRAFTPLUS_DIR.'/includes/updraftplus-notices.php');
789
  global $updraftplus_notices;
790
+ echo apply_filters('updraftplus_autobackup_blurb', $updraftplus_notices->do_notice('autobackup', 'autobackup', true));
791
  } else {
792
  echo '<div class="updraft-ad-container updated">';
793
  echo '<h3 style="margin-top: 2px;">'. __('Be safe with an automatic backup', 'updraftplus').'</h3>';
794
+ echo apply_filters('updraftplus_autobackup_blurb', '');
795
  echo '</div>';
796
  }
797
+ ?>
798
  <script>
799
  jQuery(document).ready(function() {
800
  jQuery('.updraft-ad-container').appendTo('.wrap p:first');
803
  <?php
804
  }
805
 
806
+ /**
807
+ * Run upon the WP admin_head action
808
+ */
809
  public function admin_head() {
810
 
811
  global $pagenow;
812
 
813
+ if (UpdraftPlus_Options::admin_page() != $pagenow || !isset($_REQUEST['page']) || 'updraftplus' != $_REQUEST['page'] || !UpdraftPlus_Options::user_can_manage()) return;
814
 
815
+ $chunk_size = min(wp_max_upload_size()-1024, 1048576*2);
816
 
817
+ // The multiple_queues argument is ignored in plupload 2.x (WP3.9+) - http://make.wordpress.org/core/2014/04/11/plupload-2-x-in-wordpress-3-9/
818
+ // max_file_size is also in filters as of plupload 2.x, but in its default position is still supported for backwards-compatibility. Likewise, our use of filters.extensions below is supported by a backwards-compatibility option (the current way is filters.mime-types.extensions
819
 
820
  $plupload_init = array(
821
  'runtimes' => 'html5,flash,silverlight,html4',
836
  'action' => 'plupload_action'
837
  )
838
  );
 
 
 
 
 
 
 
 
839
 
840
+ // WP 3.9 updated to plupload 2.0 - https://core.trac.wordpress.org/ticket/25663
841
  if (is_file(ABSPATH.WPINC.'/js/plupload/Moxie.swf')) {
842
  $plupload_init['flash_swf_url'] = includes_url('js/plupload/Moxie.swf');
843
  } else {
851
  }
852
 
853
  ?><script>
854
+ var updraft_credentialtest_nonce = '<?php echo wp_create_nonce('updraftplus-credentialtest-nonce');?>';
855
+ var updraftplus_settings_nonce = '<?php echo wp_create_nonce('updraftplus-settings-nonce');?>';
856
  var updraft_siteurl = '<?php echo esc_js(site_url('', 'relative'));?>';
857
+ var updraft_plupload_config = <?php echo json_encode($plupload_init); ?>;
858
+ var updraft_download_nonce = '<?php echo wp_create_nonce('updraftplus_download');?>';
859
  var updraft_accept_archivename = <?php echo apply_filters('updraftplus_accept_archivename_js', "[]");?>;
860
  <?php
861
  $plupload_init['browse_button'] = 'plupload-browse-button2';
864
  $plupload_init['multipart_params']['action'] = 'plupload_action2';
865
  $plupload_init['filters'] = array(array('title' => __('Allowed Files'), 'extensions' => 'crypt'));
866
  ?>
867
+ var updraft_plupload_config2 = <?php echo json_encode($plupload_init); ?>;
868
  var updraft_downloader_nonce = '<?php wp_create_nonce("updraftplus_download"); ?>'
869
  <?php
870
  $overdue = $this->howmany_overdue_crons();
871
+ if ($overdue >= 4) {
872
+ ?>
873
+ jQuery(document).ready(function() {
874
+ setTimeout(function(){ updraft_check_overduecrons(); }, 11000);
875
  });
876
  <?php } ?>
877
  </script>
878
  <?php
879
  }
880
 
 
881
  private function disk_space_check($space) {
882
  global $updraftplus;
883
  $updraft_dir = $updraftplus->backups_dir_location();
884
  $disk_free_space = @disk_free_space($updraft_dir);
885
+ if (false == $disk_free_space) return -1;
886
  return ($disk_free_space > $space) ? true : false;
887
  }
888
 
889
+ /**
890
+ * Adds the settings link under the plugin on the plugin screen.
891
+ *
892
+ * @param Array $links Set of links for the plugin, before being filtered
893
+ * @param String $file File name (relative to the plugin directory)
894
+ * @return Array filtered results
895
+ */
896
  public function plugin_action_links($links, $file) {
897
+ if (is_array($links) && 'updraftplus/updraftplus.php' == $file) {
898
  $settings_link = '<a href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus">'.__("Settings", "updraftplus").'</a>';
899
  array_unshift($links, $settings_link);
900
+ $settings_link = '<a href="'.apply_filters('updraftplus_com_link', "https://updraftplus.com/").'">'.__("Add-Ons / Pro Support", "updraftplus").'</a>';
 
 
901
  array_unshift($links, $settings_link);
902
  }
903
  return $links;
904
  }
905
 
906
  public function admin_action_upgrade_pluginortheme() {
907
+ if (isset($_GET['action']) && ('upgrade-plugin' == $_GET['action'] || 'upgrade-theme' == $_GET['action']) && !class_exists('UpdraftPlus_Addon_Autobackup') && !defined('UPDRAFTPLUS_NOADS_B')) {
908
 
909
+ if ('upgrade-plugin' == $_GET['action']) {
910
  if (!current_user_can('update_plugins')) return;
911
  } else {
912
  if (!current_user_can('update_themes')) return;
925
  $submenu_file = 'themes.php';
926
  }
927
 
928
+ include_once(ABSPATH.'wp-admin/admin-header.php');
929
 
930
+ if (!class_exists('UpdraftPlus_Notices')) include_once(UPDRAFTPLUS_DIR.'/includes/updraftplus-notices.php');
931
  global $updraftplus_notices;
932
  $updraftplus_notices->do_notice('autobackup', 'autobackup');
933
  }
934
  }
935
 
936
+ public function show_admin_warning($message, $class = 'updated') {
937
  echo '<div class="updraftmessage '.$class.'">'."<p>$message</p></div>";
938
  }
939
 
 
940
  public function show_admin_warning_multiple_storage_options() {
941
  $this->show_admin_warning('<strong>UpdraftPlus:</strong> '.__('An error occurred when fetching storage module options: ', 'updraftplus').htmlspecialchars($this->storage_module_option_errors), 'error');
942
  }
943
 
944
+ public function show_admin_warning_unwritable() {
945
  $unwritable_mess = htmlspecialchars(__("The 'Backup Now' button is disabled as your backup directory is not writable (go to the 'Settings' tab and find the relevant option).", 'updraftplus'));
946
  $this->show_admin_warning($unwritable_mess, "error");
947
+ }
948
 
949
  public function show_admin_nosettings_warning() {
950
  $this->show_admin_warning('<strong>'.__('Welcome to UpdraftPlus!', 'updraftplus').'</strong> '.__('To make a backup, just press the Backup Now button.', 'updraftplus').' <a href="#" id="updraft-navtab-settings2">'.__('To change any of the default settings of what is backed up, to configure scheduled backups, to send your backups to remote storage (recommended), and more, go to the settings tab.', 'updraftplus').'</a>', 'updated notice is-dismissible');
951
  }
952
 
953
  public function show_admin_warning_execution_time() {
954
+ $this->show_admin_warning('<strong>'.__('Warning', 'updraftplus').':</strong> '.sprintf(__('The amount of time allowed for WordPress plugins to run is very low (%s seconds) - you should increase it to avoid backup failures due to time-outs (consult your web hosting company for more help - it is the max_execution_time PHP setting; the recommended value is %s seconds or more)', 'updraftplus'), (int) @ini_get('max_execution_time'), 90));
955
  }
956
 
957
  public function show_admin_warning_disabledcron() {
959
  }
960
 
961
  public function show_admin_warning_diskspace() {
962
+ $this->show_admin_warning('<strong>'.__('Warning', 'updraftplus').':</strong> '.sprintf(__('You have less than %s of free disk space on the disk which UpdraftPlus is configured to use to create backups. UpdraftPlus could well run out of space. Contact your the operator of your server (e.g. your web hosting company) to resolve this issue.', 'updraftplus'), '35 MB'));
963
  }
964
 
965
  public function show_admin_warning_wordpressversion() {
967
  }
968
 
969
  public function show_admin_warning_litespeed() {
970
+ $this->show_admin_warning('<strong>'.__('Warning', 'updraftplus').':</strong> '.sprintf(__('Your website is hosted using the %s web server.', 'updraftplus'), 'LiteSpeed').' <a href="'.apply_filters('updraftplus_com_link', "https://updraftplus.com/faqs/i-am-having-trouble-backing-up-and-my-web-hosting-company-uses-the-litespeed-webserver/").'">'.__('Please consult this FAQ if you have problems backing up.', 'updraftplus').'</a>');
971
  }
972
 
973
  public function show_admin_debug_warning() {
981
  return $ret;
982
  }
983
 
984
+ /**
985
+ * Output authorisation links for any un-authorised Dropbox settings instances
986
+ */
987
  public function show_admin_warning_dropbox() {
988
+ foreach ($this->auth_instance_ids['dropbox'] as $instance_id) {
989
+ $this->show_admin_warning('<strong>'.__('UpdraftPlus notice:', 'updraftplus').'</strong> <a class="updraft_authlink" href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus&action=updraftmethod-dropbox-auth&updraftplus_dropboxauth=doit&updraftplus_instance='.$instance_id.'">'.sprintf(__('Follow this link to authorize access to your %s account (you will not be able to back up to %s without it).', 'updraftplus'), 'Dropbox', 'Dropbox').'</a>', 'updated updraft_authenticate_dropbox');
990
+ }
991
  }
992
 
993
+ /**
994
+ * Output authorisation links for any un-authorised OneDrive settings instances
995
+ */
996
  public function show_admin_warning_onedrive() {
997
+ foreach ($this->auth_instance_ids['onedrive'] as $instance_id) {
998
+ $this->show_admin_warning('<strong>'.__('UpdraftPlus notice:', 'updraftplus').'</strong> <a class="updraft_authlink" href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus&action=updraftmethod-onedrive-auth&updraftplus_onedriveauth=doit&updraftplus_instance='.$instance_id.'">'.sprintf(__('Follow this link to authorize access to your %s account (you will not be able to back up to %s without it).', 'updraftplus'), 'OneDrive', 'OneDrive').'</a>', 'updated updraft_authenticate_onedrive');
999
+ }
1000
  }
1001
 
1002
  public function show_admin_warning_updraftvault() {
1003
  $this->show_admin_warning('<strong>'.__('UpdraftPlus notice:', 'updraftplus').'</strong> '.sprintf(__('%s has been chosen for remote storage, but you are not currently connected.', 'updraftplus'), 'UpdraftPlus Vault').' '.__('Go to the remote storage settings in order to connect.', 'updraftplus'), 'updated');
1004
  }
1005
 
1006
+ /**
1007
+ * Output authorisation links for any un-authorised Google Drive settings instances
1008
+ */
1009
  public function show_admin_warning_googledrive() {
1010
+ foreach ($this->auth_instance_ids['googledrive'] as $instance_id) {
1011
+ $this->show_admin_warning('<strong>'.__('UpdraftPlus notice:', 'updraftplus').'</strong> <a class="updraft_authlink" href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus&action=updraftmethod-googledrive-auth&updraftplus_googleauth=doit&updraftplus_instance='.$instance_id.'">'.sprintf(__('Follow this link to authorize access to your %s account (you will not be able to back up to %s without it).', 'updraftplus'), 'Google Drive', 'Google Drive').'</a>', 'updated updraft_authenticate_googledrive');
1012
+ }
1013
  }
1014
 
1015
+ /**
1016
+ * Output authorisation links for any un-authorised Google Cloud settings instances
1017
+ */
1018
  public function show_admin_warning_googlecloud() {
1019
+ foreach ($this->auth_instance_ids['googlecloud'] as $instance_id) {
1020
+ $this->show_admin_warning('<strong>'.__('UpdraftPlus notice:', 'updraftplus').'</strong> <a class="updraft_authlink" href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus&action=updraftmethod-googlecloud-auth&updraftplus_googleauth=doit&updraftplus_instance='.$instance_id.'">'.sprintf(__('Follow this link to authorize access to your %s account (you will not be able to back up to %s without it).', 'updraftplus'), 'Google Cloud', 'Google Cloud').'</a>', 'updated updraft_authenticate_googlecloud');
1021
+ }
1022
  }
1023
 
1024
+ /**
1025
+ * This options filter removes ABSPATH off the front of updraft_dir, if it is given absolutely and contained within it
1026
+ *
1027
+ * @param string $updraft_dir Directory
1028
+ * @return string
1029
+ */
1030
  public function prune_updraft_dir_prefix($updraft_dir) {
1031
  if ('/' == substr($updraft_dir, 0, 1) || "\\" == substr($updraft_dir, 0, 1) || preg_match('/^[a-zA-Z]:/', $updraft_dir)) {
1032
  $wcd = trailingslashit(WP_CONTENT_DIR);
1033
  if (strpos($updraft_dir, $wcd) === 0) {
1034
  $updraft_dir = substr($updraft_dir, strlen($wcd));
1035
  }
 
 
 
 
1036
  }
1037
  return $updraft_dir;
1038
  }
1046
 
1047
  if (empty($_REQUEST['timestamp']) || !is_numeric($_REQUEST['timestamp']) || empty($_REQUEST['type'])) exit;
1048
 
1049
+ $findex = empty($_REQUEST['findex']) ? 0 : (int) $_REQUEST['findex'];
1050
  $stage = empty($_REQUEST['stage']) ? '' : $_REQUEST['stage'];
1051
  $file_path = empty($_REQUEST['filepath']) ? '' : $_REQUEST['filepath'];
1052
 
1161
  $needs_downloading = false;
1162
 
1163
  if (!file_exists($fullpath)) {
1164
+ // If the file doesn't exist and they're using one of the cloud options, fetch it down from the cloud.
1165
  $needs_downloading = true;
1166
  $updraftplus->log('File does not yet exist locally - needs downloading');
1167
  } elseif ($known_size > 0 && filesize($fullpath) < $known_size) {
1168
  $updraftplus->log("The file was found locally (".filesize($fullpath).") but did not match the size in the backup history ($known_size) - will resume downloading");
1169
  $needs_downloading = true;
1170
  } elseif ($known_size > 0) {
1171
+ $updraftplus->log('The file was found locally and matched the recorded size from the backup history ('.round($known_size/1024, 1).' KB)');
1172
  } else {
1173
  $updraftplus->log('No file size was found recorded in the backup history. We will assume the local one is complete.');
1174
  $known_size = filesize($fullpath);
1251
 
1252
  if ($restore) {
1253
  $service_description = empty($updraftplus->backup_methods[$service]) ? $service : $updraftplus->backup_methods[$service];
1254
+ $updraftplus->log(__("File is not locally present - needs retrieving from remote storage", 'updraftplus')." ($service_description)", 'notice-restore');
1255
  }
1256
 
1257
  $object = $storage_objects_and_ids[$service]['object'];
1258
 
1259
+ if (!$object->supports_feature('multi_options')) {
1260
+ error_log("UpdraftPlus_Admin::get_remote_file(): Multi-options not supported by: ".$service);
1261
+ continue;
1262
  }
1263
 
1264
  $instance_ids = $storage_objects_and_ids[$service]['instance_settings'];
1302
  /**
1303
  * Downloads a specified file into UD's directory
1304
  *
1305
+ * @param String $file The name of the file
1306
+ * @param array $object The object of the service to use to download with. UpdraftPlus_BackupModule.
 
1307
  * @return Boolean - Whether the operation succeeded. Inherited from the storage module's download() method. N.B. At the time of writing it looks like not all modules necessarily return true upon success; but false can be relied upon for detecting failure.
1308
  */
1309
+ private function download_file($file, $object) {
1310
 
1311
  global $updraftplus;
1312
 
1346
 
1347
  }
1348
 
1349
+ /**
1350
+ * This is used as a callback
1351
+ *
1352
+ * @param Mixed $msg The data to be JSON encoded and sent back
1353
+ */
1354
  public function _updraftplus_background_operation_started($msg) {
1355
  global $updraftplus;
1356
  // The extra spaces are because of a bug seen on one server in handling of non-ASCII characters; see HS#11739
1380
  $data_in_get = array('get_log', 'get_fragment');
1381
 
1382
  // UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands - i.e. all commands are in there
1383
+ if (!class_exists('UpdraftPlus_WPAdmin_Commands')) include_once(UPDRAFTPLUS_DIR.'/includes/class-wpadmin-commands.php');
1384
  $commands = new UpdraftPlus_WPAdmin_Commands($this);
1385
 
1386
  if (method_exists($commands, $subaction)) {
1439
  /**
1440
  * Run a credentials test for the indicated remote storage module
1441
  *
1442
+ * @param Array $test_settings The test parameters, including the method itself indicated in the key 'method'
1443
+ * @param Boolean $return_instead_of_echo Whether to return or echo the results. N.B. More than just the results to echo will be returned
 
1444
  * @return Array|Void - the results, if they are being returned (rather than echoed). Keys: 'output' (the output), 'data' (other data)
1445
  */
1446
  public function do_credentials_test($test_settings, $return_instead_of_echo = false) {
1450
  $objname = "UpdraftPlus_BackupModule_$method";
1451
 
1452
  $this->logged = array();
1453
+ // TODO: Add action for WP HTTP SSL stuff
1454
  set_error_handler(array($this, 'get_php_errors'), E_ALL & ~E_STRICT);
1455
 
1456
  if (!class_exists($objname)) include_once(UPDRAFTPLUS_DIR."/methods/$method.php");
1458
  $ret = '';
1459
  $data = null;
1460
 
1461
+ // TODO: Add action for WP HTTP SSL stuff
1462
  if (method_exists($objname, "credentials_test")) {
1463
  $obj = new $objname;
1464
  if ($return_instead_of_echo) ob_start();
1483
  * Delete a backup set, whilst respecting limits on how much to delete in one go
1484
  *
1485
  * @uses remove_backup_set_cleanup()
 
1486
  * @param Array $opts - deletion options; with keys backup_timestamp, delete_remote, [remote_delete_limit]
 
1487
  * @return Array - as from remove_backup_set_cleanup()
1488
  */
1489
  public function delete_set($opts) {
1491
  global $updraftplus;
1492
 
1493
  $backups = UpdraftPlus_Backup_History::get_history();
1494
+ $timestamps = (string) $opts['backup_timestamp'];
1495
 
1496
+ $remote_delete_limit = (isset($opts['remote_delete_limit']) && $opts['remote_delete_limit'] > 0) ? (int) $opts['remote_delete_limit'] : PHP_INT_MAX;
1497
 
1498
  $timestamps = explode(',', $timestamps);
1499
  $delete_remote = empty($opts['delete_remote']) ? false : true;
1533
  $services = is_string($backups[$timestamp]['service']) ? array($backups[$timestamp]['service']) : $backups[$timestamp]['service'];
1534
  if (is_array($services)) {
1535
  foreach ($services as $service) {
1536
+ if ($service && 'none' != $service && 'email' != $service) $delete_from_service[] = $service;
1537
  }
1538
  }
1539
  }
1546
  }
1547
  }
1548
  // Delete DB
1549
+ foreach ($backups[$timestamp] as $key => $value) {
1550
  if ('db' == strtolower(substr($key, 0, 2)) && '-size' != substr($key, -5, 5)) {
1551
  $files_to_delete[$key] = $backups[$timestamp][$key];
1552
  }
1601
  $deleted = $remote_obj->delete($file);
1602
 
1603
  if (-1 === $deleted) {
1604
+ // echo __('Did not know how to delete from this cloud service.', 'updraftplus');
1605
  } elseif (false !== $deleted) {
1606
  $remote_deleted++;
1607
  }
1608
 
1609
+ $itext = $index ? (string) $index : '';
1610
  if ($was_string) {
1611
  unset($backups[$timestamp][$key]);
1612
  if ('db' == strtolower(substr($key, 0, 2))) unset($backups[$timestamp][$key][$index.'-size']);
1641
  /**
1642
  * This function sorts the array of instance ids currently saved so that any instance id that is in both the saved settings and the backup history move to the top of the array, as these are likely to work. Then values that don't appear in the backup history move to the bottom.
1643
  *
1644
+ * @param String $a - the first instance id
1645
+ * @param String $b - the second instance id
1646
+ * @return Integer - returns an integer to indicate what position the $b value should be moved in
1647
  */
1648
  public function instance_ids_sort($a, $b) {
1649
  if (in_array($a, $this->backups_instance_ids)) {
1731
  ));
1732
  }
1733
 
1734
+ /**
1735
+ * Get information on disk space used by an entity, or by UD's internal directory. Returns as a human-readable string.
1736
+ *
1737
+ * @param String $entity - the entity (e.g. 'plugins'; 'all' for all entities, or 'ud' for UD's internal directory)
1738
+ *
1739
+ * @return String
1740
+ */
1741
  public function get_disk_space_used($entity) {
1742
  global $updraftplus;
1743
  if ('updraft' == $entity) {
1747
  if ('all' == $entity) {
1748
  $total_size = 0;
1749
  foreach ($backupable_entities as $entity => $data) {
1750
+ // Might be an array
1751
  $basedir = $backupable_entities[$entity];
1752
  $dirs = apply_filters('updraftplus_dirlist_'.$entity, $basedir);
1753
  $size = $this->recursive_directory_size($dirs, $updraftplus->get_exclude($entity), $basedir, 'numeric');
1755
  }
1756
  return $updraftplus->convert_numeric_size_to_text($total_size);
1757
  } elseif (!empty($backupable_entities[$entity])) {
1758
+ // Might be an array
1759
  $basedir = $backupable_entities[$entity];
1760
  $dirs = apply_filters('updraftplus_dirlist_'.$entity, $basedir);
1761
  return $this->recursive_directory_size($dirs, $updraftplus->get_exclude($entity), $basedir);
1764
  return __('Error', 'updraftplus');
1765
  }
1766
 
1767
+ /**
1768
+ * Stop an active backup job
1769
+ *
1770
+ * @param String $job_id - job ID of the job to stop
1771
+ *
1772
+ * @return Array - information on the outcome of the attempt
1773
+ */
1774
  public function activejobs_delete($job_id) {
1775
 
1776
  if (preg_match("/^[0-9a-f]{12}$/", $job_id)) {
1800
 
1801
  }
1802
 
1803
+ /**
1804
+ * Input: an array of items
1805
+ * Each item is in the format: <base>,<timestamp>,<type>(,<findex>)
1806
+ * The 'base' is not for us: we just pass it straight back
1807
+ *
1808
+ * @param array $downloaders Array of Items to download
1809
+ * @return array
1810
+ */
1811
  public function get_download_statuses($downloaders) {
1812
  global $updraftplus;
1813
  $download_status = array();
1814
  foreach ($downloaders as $downloader) {
1815
+ // prefix, timestamp, entity, index
1816
  if (preg_match('/^([^,]+),(\d+),([-a-z]+|db[0-9]+),(\d+)$/', $downloader, $matches)) {
1817
  $findex = (empty($matches[4])) ? '0' : $matches[4];
1818
  $updraftplus->nonce = dechex($matches[2]).$findex.substr(md5($matches[3]), 0, 3);
1834
 
1835
  global $updraftplus;
1836
 
1837
+ $download_status = empty($request['downloaders']) ? array() : $this->get_download_statuses(explode(':', $request['downloaders']));
1838
 
1839
  if (!empty($request['oneshot'])) {
1840
  $job_id = get_site_option('updraft_oneshotnonce', false);
1928
 
1929
  $potential_log_file = $updraft_dir."/log.".$nonce.".txt";
1930
 
1931
+ if (is_readable($potential_log_file)) {
1932
 
1933
  $templog_array = array();
1934
  $log_file = fopen($potential_log_file, "r");
1964
  return $ret_array;
1965
  }
1966
 
1967
+ /**
1968
+ * Get a count for the number of overdue cron jobs
1969
+ *
1970
+ * @return Integer - how many cron jobs are overdue
1971
+ */
1972
  public function howmany_overdue_crons() {
1973
  $how_many_overdue = 0;
1974
  if (function_exists('_get_cron_array') || (is_file(ABSPATH.WPINC.'/cron.php') && include_once(ABSPATH.WPINC.'/cron.php') && function_exists('_get_cron_array'))) {
1976
  if (is_array($crons)) {
1977
  $timenow = time();
1978
  foreach ($crons as $jt => $job) {
1979
+ if ($jt < $timenow) $how_many_overdue++;
 
 
1980
  }
1981
  }
1982
  }
1988
  if (0 == error_reporting()) return true;
1989
  $logline = $updraftplus->php_error_to_logline($errno, $errstr, $errfile, $errline);
1990
  if (false !== $logline) $this->logged[] = $logline;
1991
+ // Don't pass it up the chain (since it's going to be output to the user always)
1992
  return true;
1993
  }
1994
 
2014
  } elseif (preg_match('/^downloaded:(\d+):(.*)$/', $file, $matches) && file_exists($matches[2])) {
2015
  $response['p'] = 100;
2016
  $response['f'] = $matches[2];
2017
+ $response['s'] = (int) $matches[1];
2018
+ $response['t'] = (int) $matches[1];
2019
  $response['m'] = __('File ready.', 'updraftplus');
2020
  if ('db' != substr($type, 0, 2)) $response['can_show_contents'] = true;
2021
  } elseif (preg_match('/^downloading:(\d+):(.*)$/', $file, $matches) && file_exists($matches[2])) {
2022
  // Convert to bytes
2023
  $response['f'] = $matches[2];
2024
+ $total_size = (int) max($matches[1], 1);
2025
  $cur_size = filesize($matches[2]);
2026
  $response['s'] = $cur_size;
2027
  $file_age = time() - filemtime($matches[2]);
2046
  return $uploads;
2047
  }
2048
 
2049
+ /**
2050
+ * We do actually want to over-write
2051
+ *
2052
+ * @param String $dir Directory
2053
+ * @param String $name Name
2054
+ * @param String $ext File extension
2055
+ * @return String
2056
+ */
2057
  public function unique_filename_callback($dir, $name, $ext) {
2058
  return $name.$ext;
2059
  }
2105
  }
2106
 
2107
  // If this was the chunk, then we should instead be concatenating onto the final file
2108
+ if (isset($_POST['chunks']) && isset($_POST['chunk']) && preg_match('/^[0-9]+$/', $_POST['chunk'])) {
2109
  $final_file = basename($_POST['name']);
2110
  if (!rename($status['file'], $updraft_dir.'/'.$final_file.'.'.$_POST['chunk'].'.zip.tmp')) {
2111
  @unlink($status['file']);
2117
  // Final chunk? If so, then stich it all back together
2118
  if ($_POST['chunk'] == $_POST['chunks']-1) {
2119
  if ($wh = fopen($updraft_dir.'/'.$final_file, 'wb')) {
2120
+ for ($i=0; $i<$_POST['chunks']; $i++) {
2121
  $rf = $updraft_dir.'/'.$final_file.'.'.$i.'.zip.tmp';
2122
  if ($rh = fopen($rf, 'rb')) {
2123
+ while ($line = fread($rh, 32768)) {
2124
+ fwrite($wh, $line);
2125
+ }
2126
  fclose($rh);
2127
  @unlink($rf);
2128
  }
2158
  $response['dm'] = sprintf(__('This backup was created by %s, and can be imported.', 'updraftplus'), $accepted);
2159
  } else {
2160
  @unlink($status['file']);
2161
+ echo json_encode(array('e' => sprintf(__('Error: %s', 'updraftplus'), __('Bad filename format - this does not look like a file created by UpdraftPlus', 'updraftplus'))));
2162
  exit;
2163
  }
2164
  } else {
2166
  $type = isset($matches[3]) ? $matches[3] : '';
2167
  if (!preg_match('/^log\.[a-f0-9]{12}\.txt/', $file) && 'db' != $type && !isset($backupable_entities[$type])) {
2168
  @unlink($status['file']);
2169
+ echo json_encode(array('e' => sprintf(__('Error: %s', 'updraftplus'), sprintf(__('This looks like a file created by UpdraftPlus, but this install does not know about this type of object: %s. Perhaps you need to install an add-on?', 'updraftplus'), htmlspecialchars($type)))));
2170
  exit;
2171
  }
2172
  }
2178
  exit;
2179
  }
2180
 
2181
+ /**
2182
+ * Database decrypter
2183
+ */
2184
  public function plupload_action2() {
2185
 
2186
  @set_time_limit(UPDRAFTPLUS_SET_TIME_LIMIT);
2203
  $farray['type'] = 'application/octet-stream';
2204
 
2205
  if (isset($_POST['chunks'])) {
2206
+ // $farray['ext'] = 'zip';
2207
+ // $farray['type'] = 'application/zip';
2208
  } else {
2209
  $farray['unique_filename_callback'] = array($this, 'unique_filename_callback');
2210
  }
2222
  }
2223
 
2224
  // If this was the chunk, then we should instead be concatenating onto the final file
2225
+ if (isset($_POST['chunks']) && isset($_POST['chunk']) && preg_match('/^[0-9]+$/', $_POST['chunk'])) {
2226
  $final_file = basename($_POST['name']);
2227
  rename($status['file'], $updraft_dir.'/'.$final_file.'.'.$_POST['chunk'].'.zip.tmp');
2228
  $status['file'] = $updraft_dir.'/'.$final_file.'.'.$_POST['chunk'].'.zip.tmp';
2230
  // Final chunk? If so, then stich it all back together
2231
  if ($_POST['chunk'] == $_POST['chunks']-1) {
2232
  if ($wh = fopen($updraft_dir.'/'.$final_file, 'wb')) {
2233
+ for ($i=0; $i<$_POST['chunks']; $i++) {
2234
  $rf = $updraft_dir.'/'.$final_file.'.'.$i.'.zip.tmp';
2235
  if ($rh = fopen($rf, 'rb')) {
2236
+ while ($line = fread($rh, 32768)) {
2237
+ fwrite($wh, $line);
2238
+ }
2239
  fclose($rh);
2240
  @unlink($rf);
2241
  }
2259
  }
2260
 
2261
  // send the uploaded file url in response
 
2262
  echo 'OK:'.$file;
2263
  exit;
2264
  }
2265
 
2266
+ /**
2267
+ * Include the settings header template
2268
+ */
2269
  public function settings_header() {
2270
  $this->include_template('wp-admin/settings/header.php');
2271
  }
2281
 
2282
  global $updraftplus;
2283
 
2284
+ /**
2285
+ * We use request here because the initial restore is triggered by a POSTed form. we then may need to obtain credential for the WP_Filesystem. to do this WP outputs a form, but we don't pass our parameters via that. So the values are passed back in as GET parameters.
2286
+ */
2287
+ if (isset($_REQUEST['action']) && (('updraft_restore' == $_REQUEST['action'] && isset($_REQUEST['backup_timestamp'])) || ('updraft_restore_continue' == $_REQUEST['action'] && !empty($_REQUEST['restoreid'])))) {
 
 
 
2288
 
2289
  $is_continuation = ('updraft_restore_continue' == $_REQUEST['action']) ? true : false;
2290
 
2316
  $backup_success = false;
2317
  }
2318
 
2319
+ if (empty($updraftplus->errors) && true === $backup_success) {
2320
+ // TODO: Deal with the case of some of the work having been deferred
2321
  // If we restored the database, then that will have out-of-date information which may confuse the user - so automatically re-scan for them.
2322
  UpdraftPlus_Backup_History::rebuild();
2323
  echo '<p><strong>';
2344
  echo '<strong>'.__('Actions', 'updraftplus').':</strong> <a href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus">'.__('Return to UpdraftPlus Configuration', 'updraftplus').'</a>';
2345
  return;
2346
  } elseif (false === $backup_success) {
2347
+ // This means, "not yet - but stay on the page because we may be able to do it later, e.g. if the user types in the requested information"
2348
  echo '<p>';
2349
  $updraftplus->log_e('Restore failed...');
2350
  echo '</p>';
2380
 
2381
  if (isset($_GET['message'])) $this->show_admin_warning(htmlspecialchars($_GET['message']));
2382
 
2383
+ if (isset($_GET['action']) && 'updraft_create_backup_dir' == $_GET['action'] && isset($_GET['nonce']) && wp_verify_nonce($_GET['nonce'], 'create_backup_dir')) {
2384
  $created = $this->create_backup_dir();
2385
  if (is_wp_error($created)) {
2386
  echo '<p>'.__('Backup directory could not be created', 'updraftplus').'...<br>';
2389
  echo '<li>'.htmlspecialchars($msg).'</li>';
2390
  }
2391
  echo '</ul></p>';
2392
+ } elseif (false !== $created) {
2393
  echo '<p>'.__('Backup directory successfully created.', 'updraftplus').'</p><br>';
2394
  }
2395
  echo '<b>'.__('Actions', 'updraftplus').':</b> <a href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus">'.__('Return to UpdraftPlus Configuration', 'updraftplus').'</a>';
2425
  // Opens a div, which needs closing later
2426
  if (isset($_GET['updraft_restore_success'])) {
2427
 
2428
+ if (get_template() === 'optimizePressTheme' || is_plugin_active('optimizePressPlugin') || is_plugin_active_for_network('optimizePressPlugin')) {
2429
+ $this->show_admin_warning("<a href='https://optimizepress.zendesk.com/hc/en-us/articles/203699826-Update-URL-References-after-moving-domain' target='_blank'>" . __("OptimizePress 2.0 encodes its contents, so search/replace does not work.", "updraftplus") . ' ' . __("To fix this problem go here.", "updraftplus") . "</a>", "notice notice-warning");
2430
  }
2431
+ $success_advert = (isset($_GET['pval']) && 0 == $_GET['pval'] && !$updraftplus->have_addons) ? '<p>'.__('For even more features and personal support, check out ', 'updraftplus').'<strong><a href="'.apply_filters("updraftplus_com_link", 'https://updraftplus.com/shop/updraftplus-premium/').'" target="_blank">UpdraftPlus Premium</a>.</strong></p>' : "";
2432
 
2433
  echo "<div class=\"updated backup-restored\"><span><strong>".__('Your backup has been restored.', 'updraftplus').'</strong></span><br>';
2434
  // Unnecessary - will be advised of this below
2435
+ // if (2 == $_GET['updraft_restore_success']) echo ' '.__('Your old (themes, uploads, plugins, whatever) directories have been retained with "-old" appended to their name. Remove them when you are satisfied that the backup worked properly.');
2436
  echo $success_advert;
2437
  $include_deleteform_div = false;
2438
 
2439
  }
2440
 
 
 
2441
  if ($this->scan_old_dirs(true)) $this->print_delete_old_dirs_form(true, $include_deleteform_div);
2442
 
2443
  // Close the div opened by the earlier section
2444
  if (isset($_GET['updraft_restore_success'])) echo '</div>';
2445
 
2446
+ if (empty($success_advert) && empty($this->no_settings_warning)) {
2447
 
2448
+ if (!class_exists('UpdraftPlus_Notices')) include_once(UPDRAFTPLUS_DIR.'/includes/updraftplus-notices.php');
2449
  global $updraftplus_notices;
2450
  $updraftplus_notices->do_notice();
2451
  }
2452
 
2453
  if (!$updraftplus->memory_check(64)) {
2454
+ // HS8390 - A case where UpdraftPlus::memory_check_current() returns -1
2455
+ $memory_check_current = $updraftplus->memory_check_current();
2456
+ if ($memory_check_current > 0) {
2457
+ ?>
2458
+ <div class="updated memory-limit"><?php _e('Your PHP memory limit (set by your web hosting company) is very low. UpdraftPlus attempted to raise it but was unsuccessful. This plugin may struggle with a memory limit of less than 64 Mb - especially if you have very large files uploaded (though on the other hand, many sites will be successful with a 32Mb limit - your experience may vary).', 'updraftplus');?> <?php _e('Current limit is:', 'updraftplus');?> <?php echo $updraftplus->memory_check_current(); ?> MB</div>
2459
+ <?php }
2460
+ }
2461
 
2462
 
2463
  if (!empty($updraftplus->errors)) {
2475
 
2476
  ?>
2477
 
2478
+ <?php
2479
 
2480
  $tabflag = 1;
2481
 
2482
+ if (isset($_REQUEST['tab'])) {
2483
+ switch ($_REQUEST['tab']) {
2484
+ case 'status':
2485
+ $tabflag = 1;
2486
+ break;
2487
+ case 'backups':
2488
+ $tabflag = 2;
2489
+ break;
2490
+ case 'settings':
2491
+ $tabflag = 3;
2492
+ break;
2493
+ case 'expert':
2494
+ $tabflag = 4;
2495
+ break;
2496
+ case 'addons':
2497
+ $tabflag = 5;
2498
+ break;
2499
+ default:
2500
+ $tabflag = 1;
2501
  }
2502
  }
2503
 
2573
  }
2574
 
2575
  $restore_jobdata = $this->restore_in_progress_jobdata;
2576
+ $seconds_ago = time() - (int) $restore_jobdata['job_time_ms'];
2577
  $minutes_ago = floor($seconds_ago/60);
2578
  $seconds_ago = $seconds_ago - $minutes_ago*60;
2579
  $time_ago = sprintf(__("%s minutes, %s seconds", 'updraftplus'), $minutes_ago, $seconds_ago);
2591
 
2592
  }
2593
 
2594
+ /**
2595
+ * Return widgetry for the 'backup now' modal
2596
+ *
2597
+ * @return String
2598
+ */
2599
  public function backupnow_modal_contents() {
2600
+ return $this->backup_now_widgetry();
 
 
 
 
 
2601
  }
2602
 
2603
  private function backup_now_widgetry() {
2610
 
2611
  $ret .= '<div id="backupnow_database_moreoptions" class="updraft-hidden" style="display:none;">';
2612
 
2613
+ $premium_link = apply_filters('updraftplus_com_link', 'https://updraftplus.com/landing/updraftplus-premium');
2614
 
2615
  $free_ret = '<em>'.__('All WordPress tables will be backed up.', 'updraftplus').' <a href="'.$premium_link.'">'. __('With UpdraftPlus Premium, you can choose to backup non-WordPress tables, backup only specified tables, and backup other databases too.', 'updraftplus').'</a></em>';
2616
 
2629
  return $ret;
2630
  }
2631
 
2632
+ /**
2633
+ * Also used by the auto-backups add-on
2634
+ *
2635
+ * @param Boolean $wide_format Whether to return data in a wide format
2636
+ * @param Boolean $print_active_jobs Whether to include currently active jobs
2637
+ * @return String - the HTML output
2638
+ */
2639
  public function render_active_jobs_and_log_table($wide_format = false, $print_active_jobs = true) {
2640
  ?>
2641
  <table class="form-table" id="updraft_activejobs_table">
2642
 
2643
  <?php $active_jobs = ($print_active_jobs) ? $this->print_active_jobs() : '';?>
2644
  <tr id="updraft_activejobsrow" class="<?php
2645
+ if (!$active_jobs && !$wide_format) {
2646
+ echo 'hidden';
2647
+ }
2648
+ if ($wide_format) {
2649
+ echo ".minimum-height";
2650
+ }
2651
  ?>">
2652
  <?php if ($wide_format) { ?>
2653
  <td id="updraft_activejobs" colspan="2">
2677
  </tr>
2678
 
2679
  <?php
2680
+ // Currently disabled - not sure who we want to show this to
2681
  if (1==0 && !defined('UPDRAFTPLUS_NOADS_B')) {
2682
  $feed = $updraftplus->get_updraftplus_rssfeed();
2683
  if (is_a($feed, 'SimplePie')) {
2687
  echo '<li>';
2688
  echo '<a href="'.esc_attr($item->get_permalink()).'">';
2689
  echo htmlspecialchars($item->get_title());
2690
+ // D, F j, Y H:i
2691
  echo "</a> (".htmlspecialchars($item->get_date('j F Y')).")";
2692
  echo '</li>';
2693
  }
2699
  <?php
2700
  }
2701
 
2702
+ /**
2703
+ * Output directly a link allowing download of the most recently modified log file
2704
+ */
2705
  private function most_recently_modified_log_link() {
2706
 
2707
  global $updraftplus;
2708
  list($mod_time, $log_file, $nonce) = $updraftplus->last_modified_log();
2709
 
2710
  ?>
2711
+ <a href="?page=updraftplus&amp;action=downloadlatestmodlog&amp;wpnonce=<?php echo wp_create_nonce('updraftplus_download'); ?>" <?php if (!$mod_time) echo 'style="display:none;"'; ?> class="updraft-log-link" onclick="event.preventDefault(); updraft_popuplog('');"><?php _e('Download most recently modified log file', 'updraftplus');?></a>
2712
  <?php
2713
  }
2714
 
2725
  }
2726
 
2727
  private function print_delete_old_dirs_form($include_blurb = true, $include_div = true) {
2728
+ if ($include_blurb) {
2729
  if ($include_div) {
2730
  echo '<div id="updraft_delete_old_dirs_pagediv" class="updated delete-old-directories">';
2731
  }
2741
  if ($include_blurb && $include_div) echo '</div>';
2742
  }
2743
 
2744
+ /**
2745
+ * Return cron status information about a specified in-progress job
2746
+ *
2747
+ * @param Boolean|String $job_id - the job to get information about; or, if not specified, all jobs
2748
+ *
2749
+ * @return Array|Boolean - the requested information, or false if it was not found. Format differs depending on whether info on all jobs, or a single job, was requested.
2750
+ */
2751
  public function get_cron($job_id = false) {
2752
+
2753
  $cron = get_option('cron');
2754
  if (!is_array($cron)) $cron = array();
2755
  if (false === $job_id) return $cron;
2756
 
2757
  foreach ($cron as $time => $job) {
2758
+ if (!isset($job['updraft_backup_resume'])) continue;
2759
+ foreach ($job['updraft_backup_resume'] as $hook => $info) {
2760
+ if (isset($info['args'][1]) && $job_id == $info['args'][1]) {
2761
+ global $updraftplus;
2762
+ $jobdata = $updraftplus->jobdata_getarray($job_id);
2763
+ return is_array($jobdata) ? array($time, $jobdata) : false;
 
2764
  }
2765
  }
2766
  }
2767
  }
2768
 
2769
+ /**
2770
+ * Print active Jobs
2771
+ *
2772
+ * @param boolean $this_job_only A value for $this_job_only also causes something to always be returned (to allow detection of the job having started on the front-end)
2773
+ * @return [type] [description]
2774
+ */
2775
  private function print_active_jobs($this_job_only = false) {
2776
  $cron = $this->get_cron();
 
2777
  $ret = '';
2778
 
2779
  foreach ($cron as $time => $job) {
2780
  if (isset($job['updraft_backup_resume'])) {
2781
  foreach ($job['updraft_backup_resume'] as $hook => $info) {
2782
  if (isset($info['args'][1])) {
 
2783
  $job_id = $info['args'][1];
2784
  if (false === $this_job_only || $job_id == $this_job_only) {
2785
  $ret .= $this->print_active_job($job_id, false, $time, $info['args'][0]);
2798
  }
2799
  }
2800
 
 
2801
  return $ret;
2802
  }
2803
 
2810
 
2811
  if (false == apply_filters('updraftplus_print_active_job_continue', true, $is_oneshot, $next_resumption, $jobdata)) return '';
2812
 
 
2813
  if (!isset($jobdata['backup_time'])) return '';
2814
 
2815
  $backupable_entities = $updraftplus->get_backupable_file_entities(true, true);
2816
 
2817
+ $began_at = (isset($jobdata['backup_time'])) ? get_date_from_gmt(gmdate('Y-m-d H:i:s', (int) $jobdata['backup_time']), 'D, F j, Y H:i') : '?';
2818
 
2819
  $jobstatus = empty($jobdata['jobstatus']) ? 'unknown' : $jobdata['jobstatus'];
2820
  $stage = 0;
2821
  switch ($jobstatus) {
2822
+ // Stage 0
2823
  case 'begun':
2824
  $curstage = __('Backup begun', 'updraftplus');
2825
+ break;
2826
+ // Stage 1
2827
  case 'filescreating':
2828
  $stage = 1;
2829
  $curstage = __('Creating file backup zips', 'updraftplus');
2833
  if (strlen($sdescrip) > 20 && isset($jobdata['filecreating_substatus']['e']) && is_array($jobdata['filecreating_substatus']['e']) && isset($backupable_entities[$jobdata['filecreating_substatus']['e']]['shortdescription'])) $sdescrip = $backupable_entities[$jobdata['filecreating_substatus']['e']]['shortdescription'];
2834
  $curstage .= ' ('.$sdescrip.')';
2835
  if (isset($jobdata['filecreating_substatus']['i']) && isset($jobdata['filecreating_substatus']['t'])) {
2836
+ $stage = min(2, 1 + ($jobdata['filecreating_substatus']['i']/max($jobdata['filecreating_substatus']['t'], 1)));
2837
  }
2838
  }
2839
+ break;
2840
  case 'filescreated':
2841
  $stage = 2;
2842
  $curstage = __('Created file backup zips', 'updraftplus');
2843
+ break;
2844
+ // Stage 4
 
2845
  case 'clouduploading':
2846
  $stage = 4;
2847
  $curstage = __('Uploading files to remote storage', 'updraftplus');
2848
  if (isset($jobdata['uploading_substatus']['t']) && isset($jobdata['uploading_substatus']['i'])) {
2849
+ $t = max((int) $jobdata['uploading_substatus']['t'], 1);
2850
  $i = min($jobdata['uploading_substatus']['i']/$t, 1);
2851
  $p = min($jobdata['uploading_substatus']['p'], 1);
2852
  $pd = $i + $p/$t;
2853
  $stage = 4 + $pd;
2854
  $curstage .= ' '.sprintf(__('(%s%%, file %s of %s)', 'updraftplus'), floor(100*$pd), $jobdata['uploading_substatus']['i']+1, $t);
2855
  }
2856
+ break;
2857
  case 'pruning':
2858
  $stage = 5;
2859
  $curstage = __('Pruning old backup sets', 'updraftplus');
2860
+ break;
2861
  case 'resumingforerrors':
2862
  $stage = -1;
2863
  $curstage = __('Waiting until scheduled time to retry because of errors', 'updraftplus');
2864
+ break;
2865
+ // Stage 6
2866
  case 'finished':
2867
  $stage = 6;
2868
  $curstage = __('Backup finished', 'updraftplus');
2869
+ break;
2870
  default:
2871
+ // Database creation and encryption occupies the space from 2 to 4. Databases are created then encrypted, then the next databae is created/encrypted, etc.
 
2872
  if ('dbcreated' == substr($jobstatus, 0, 9)) {
2873
  $jobstatus = 'dbcreated';
2874
  $whichdb = substr($jobstatus, 9);
2893
  if (!empty($jobdata['dbcreating_substatus']['t'])) {
2894
  $curstage .= ' ('.sprintf(__('table: %s', 'updraftplus'), $jobdata['dbcreating_substatus']['t']).')';
2895
  if (!empty($jobdata['dbcreating_substatus']['i']) && !empty($jobdata['dbcreating_substatus']['a'])) {
2896
+ $substage = max(0.001, ($jobdata['dbcreating_substatus']['i'] / max($jobdata['dbcreating_substatus']['a'], 1)));
2897
  $stage += $substage * $perdbspace * 0.5;
2898
  }
2899
  }
2925
  foreach ($time_passed as $run => $passed) {
2926
  if (isset($runs_started[$run])) {
2927
  $time_ago = microtime(true) - ($runs_started[$run] + $time_passed[$run]);
2928
+ if ($time_ago < $last_checkin_ago || -1 == $last_checkin_ago) $last_checkin_ago = $time_ago;
2929
  }
2930
  }
2931
  }
2932
 
2933
+ $next_res_after = (int) $time-time();
2934
  $next_res_txt = ($is_oneshot) ? '' : ' - '.sprintf(__("next resumption: %d (after %ss)", 'updraftplus'), $next_resumption, $next_res_after). ' ';
2935
  $last_activity_txt = ($last_checkin_ago >= 0) ? ' - '.sprintf(__('last activity: %ss ago', 'updraftplus'), floor($last_checkin_ago)).' ' : '';
2936
 
2947
 
2948
  if (!empty($jobdata['is_autobackup'])) $ret .= ' isautobackup';
2949
 
2950
+ $ret .= '" data-jobid="'.$job_id.'" data-lastactivity="'.(int) $last_checkin_ago.'" data-nextresumption="'.$next_resumption.'" data-nextresumptionafter="'.$next_res_after.'" title="'.esc_attr(sprintf(__('Job ID: %s', 'updraftplus'), $job_id)).$title_info.'">'.$began_at.'</span> ';
2951
 
2952
  $ret .= $show_inline_info;
2953
  $ret .= '- <a data-jobid="'.$job_id.'" href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus&action=downloadlog&updraftplus_backup_nonce='.$job_id.'" class="updraft-log-link">'.__('show log', 'updraftplus').'</a>';
2966
 
2967
  $ret .= '<div class="curstage">';
2968
  $ret .= htmlspecialchars($curstage);
2969
+ // we need to add this data-progress attribute in order to be able to update the progress bar in UDC
2970
  $ret .= '<div class="updraft_percentage" data-info="'.esc_attr($curstage).'" data-progress="'.(($stage>0) ? (ceil((100/6)*$stage)) : '0').'" style="height: 100%; width:'.(($stage>0) ? (ceil((100/6)*$stage)) : '0').'%"></div>';
2971
  $ret .= '</div></div>';
2972
 
2977
  }
2978
 
2979
  private function delete_old_dirs_go($show_return = true) {
2980
+ echo $show_return ? '<h1>UpdraftPlus - '.__('Remove old directories', 'updraftplus').'</h1>' : '<h2>'.__('Remove old directories', 'updraftplus').'</h2>';
2981
 
2982
  if ($this->delete_old_dirs()) {
2983
  echo '<p>'.__('Old directories successfully removed.', 'updraftplus').'</p><br>';
2987
  if ($show_return) echo '<b>'.__('Actions', 'updraftplus').':</b> <a href="'.UpdraftPlus_Options::admin_page_url().'?page=updraftplus">'.__('Return to UpdraftPlus Configuration', 'updraftplus').'</a>';
2988
  }
2989
 
2990
+ /**
2991
+ * deletes the -old directories that are created when a backup is restored.
2992
+ *
2993
+ * @return String. Can also exit (something we ought to probably review)
2994
+ */
2995
  private function delete_old_dirs() {
2996
  global $wp_filesystem, $updraftplus;
2997
+ $credentials = request_filesystem_credentials(wp_nonce_url(UpdraftPlus_Options::admin_page_url()."?page=updraftplus&action=updraft_delete_old_dirs", 'updraftplus-credentialtest-nonce'));
2998
  WP_Filesystem($credentials);
2999
+ if ($wp_filesystem->errors->get_error_code()) {
3000
+ foreach ($wp_filesystem->errors->get_error_messages() as $message) show_message($message);
3001
+ exit;
 
3002
  }
3003
  // From WP_CONTENT_DIR - which contains 'themes'
3004
  $ret = $this->delete_old_dirs_dir($wp_filesystem->wp_content_dir());
3005
 
3006
  $updraft_dir = $updraftplus->backups_dir_location();
3007
  if ($updraft_dir) {
3008
+ $ret4 = $updraft_dir ? $this->delete_old_dirs_dir($updraft_dir, false) : true;
3009
  } else {
3010
  $ret4 = true;
3011
  }
3012
 
 
3013
  $plugs = untrailingslashit($wp_filesystem->wp_plugins_dir());
3014
  if ($wp_filesystem->is_dir($plugs.'-old')) {
3015
+ echo "<strong>".__('Delete', 'updraftplus').": </strong>plugins-old: ";
3016
  if (!$wp_filesystem->delete($plugs.'-old', true)) {
3017
  $ret3 = false;
3018
+ echo "<strong>".__('Failed', 'updraftplus')."</strong><br>";
3019
  } else {
3020
  $ret3 = true;
3021
+ echo "<strong>".__('OK', 'updraftplus')."</strong><br>";
3022
  }
3023
  } else {
3024
  $ret3 = true;
3044
  foreach ($list as $item) {
3045
  $name = (is_array($item)) ? $item['name'] : $item;
3046
  if ("-old" == substr($name, -4, 4)) {
3047
+ // recursively delete
3048
  print "<strong>".__('Delete', 'updraftplus').": </strong>".htmlspecialchars($name).": ";
3049
 
3050
  if ($wpfs) {
3067
  return $ret;
3068
  }
3069
 
3070
+ /**
3071
+ * The aim is to get a directory that is writable by the webserver, because that's the only way we can create zip files
3072
+ *
3073
+ * @return Boolean|WP_Error true if successful, otherwise false or a WP_Error
3074
+ */
3075
  private function create_backup_dir() {
3076
 
3077
  global $wp_filesystem, $updraftplus;
3094
 
3095
  if (!$wp_filesystem->is_dir($default_backup_dir) && !$wp_filesystem->mkdir($default_backup_dir, 0775)) {
3096
  $wperr = new WP_Error;
3097
+ if ($wp_filesystem->errors->get_error_code()) {
3098
  foreach ($wp_filesystem->errors->get_error_messages() as $message) {
3099
  $wperr->add('mkdir_error', $message);
3100
  }
3101
+ return $wperr;
3102
  } else {
3103
  return new WP_Error('mkdir_error', __('The request to the filesystem to create the directory failed.', 'updraftplus'));
3104
  }
3126
  return true;
3127
  }
3128
 
3129
+ /**
3130
+ * scans the content dir to see if any -old dirs are present
3131
+ *
3132
+ * @param Boolean $print_as_comment Echo information in an HTML comment
3133
+ * @return Boolean
3134
+ */
3135
  private function scan_old_dirs($print_as_comment = false) {
3136
  global $updraftplus;
3137
  $dirs = scandir(untrailingslashit(WP_CONTENT_DIR));
3144
  return true;
3145
  }
3146
  }
3147
+ // No need to scan ABSPATH - we don't backup there
3148
  if (is_dir(untrailingslashit(WP_PLUGIN_DIR).'-old')) {
3149
  if ($print_as_comment) echo '<!--'.htmlspecialchars(untrailingslashit(WP_PLUGIN_DIR).'-old').'-->';
3150
  return true;
3154
 
3155
  /**
3156
  * Outputs html for a storage method using the parameters passed in, this version should be removed when all remote storages use the multi version
3157
+ *
3158
+ * @param String $method a list of methods to be used when
3159
+ * @param String $header the table header content
3160
+ * @param String $contents the table contents
3161
  */
3162
  public function storagemethod_row($method, $header, $contents) {
3163
  ?>
3169
  }
3170
 
3171
  /**
3172
+ * Outputs html for a storage method using the parameters passed in, this version of the method is compatible with multi storage options
3173
+ *
3174
+ * @param string $classes a list of classes to be used when
3175
+ * @param string $header the table header content
3176
+ * @param string $contents the table contents
3177
  */
3178
  public function storagemethod_row_multi($classes, $header, $contents) {
3179
  ?>
3183
  </tr>
3184
  <?php
3185
  }
3186
+
3187
+ /**
3188
+ * Returns html for a storage method using the parameters passed in, this version of the method is compatible with multi storage options
3189
+ *
3190
+ * @param string $classes a list of classes to be used when
3191
+ * @param string $header the table header content
3192
+ * @param string $contents the table contents
3193
+ * @return string handlebars html template
3194
+ */
3195
+ public function get_storagemethod_row_multi_configuration_template($classes, $header, $contents) {
3196
+ return '<tr class="'.esc_attr($classes).'">
3197
+ <th>'.$header.'</th>
3198
+ <td>'.$contents.'</td>
3199
+ </tr>';
3200
+ }
3201
 
3202
+ /**
3203
+ * Get HTML suitable for the admin area for the status of the last backup
3204
+ *
3205
+ * @return String
3206
+ */
3207
  public function last_backup_html() {
3208
 
3209
  global $updraftplus;
3213
  if ($updraft_last_backup) {
3214
 
3215
  // Convert to GMT, then to blog time
3216
+ $backup_time = (int) $updraft_last_backup['backup_time'];
3217
 
3218
  $print_time = get_date_from_gmt(gmdate('Y-m-d H:i:s', $backup_time), 'D, F j, Y H:i');
 
3219
 
3220
  if (empty($updraft_last_backup['backup_time_incremental'])) {
3221
  $last_backup_text = "<span style=\"color:".(($updraft_last_backup['success']) ? 'green' : 'black').";\">".$print_time.'</span>';
3222
  } else {
3223
  $inc_time = get_date_from_gmt(gmdate('Y-m-d H:i:s', $updraft_last_backup['backup_time_incremental']), 'D, F j, Y H:i');
 
3224
  $last_backup_text = "<span style=\"color:".(($updraft_last_backup['success']) ? 'green' : 'black').";\">$inc_time</span> (".sprintf(__('incremental backup; base backup: %s', 'updraftplus'), $print_time).')';
3225
  }
3226
 
3251
  }
3252
 
3253
  } else {
3254
+ $last_backup_text = "<span style=\"color:blue;\">".__('No backup has been completed', 'updraftplus')."</span>";
3255
  }
3256
 
3257
  return $last_backup_text;
3258
 
3259
  }
3260
 
3261
+ /**
3262
+ * Get a list of backup intervals
3263
+ *
3264
+ * @return Array - keys are used as identifiers in the UI drop-down; values are user-displayed text describing the interval
3265
+ */
3266
  public function get_intervals() {
3267
  return apply_filters('updraftplus_backup_intervals', array(
3268
  'manual' => _x("Manual", 'i.e. Non-automatic', 'updraftplus'),
3276
  ));
3277
  }
3278
 
3279
+ public function really_writable_message($really_is_writable, $updraft_dir) {
3280
  if ($really_is_writable) {
3281
  $dir_info = '<span style="color:green;">'.__('Backup directory specified is writable, which is good.', 'updraftplus').'</span>';
3282
  } else {
3291
  return $dir_info;
3292
  }
3293
 
3294
+ /**
3295
+ * Directly output the settings form (suitable for the admin area)
3296
+ *
3297
+ * @param Array $options - current options (passed on to the template)
3298
+ */
3299
  public function settings_formcontents($options = array()) {
3300
  $this->include_template('wp-admin/settings/form-contents.php', false, array('options' => $options));
3301
  }
3337
  return $ret;
3338
  }
3339
 
3340
+ /**
3341
+ * This is the files selector widget
3342
+ *
3343
+ * @param string $prefix Prefix for the ID
3344
+ * @param boolean $show_exclusion_options True or False for exclusion options
3345
+ * @param boolean $include_more $include_more can be (bool) or (string)"sometimes"
3346
+ * @return string
3347
+ */
3348
  public function files_selector_widgetry($prefix = '', $show_exclusion_options = true, $include_more = true) {
3349
 
3350
  $ret = '';
3351
 
3352
  global $updraftplus;
3353
  $backupable_entities = $updraftplus->get_backupable_file_entities(true, true);
3354
+ // The true (default value if non-existent) here has the effect of forcing a default of on.
3355
  $include_more_paths = UpdraftPlus_Options::get_updraft_option('updraft_include_more_path');
3356
  foreach ($backupable_entities as $key => $info) {
3357
  $included = (UpdraftPlus_Options::get_updraft_option("updraft_include_$key", apply_filters("updraftplus_defaultoption_include_".$key, true))) ? 'checked="checked"' : "";
3377
 
3378
  } else {
3379
 
3380
+ if ('more' != $key || true === $include_more || ('sometimes' === $include_more && !empty($include_more_paths))) {
3381
 
3382
  $data_toggle_exclude_field = $show_exclusion_options ? 'data-toggle_exclude_field="'.$key.'"' : '';
3383
 
3392
  return $ret;
3393
  }
3394
 
3395
+ /**
3396
+ * Output or echo HTML for an error condition relating to a remote storage method
3397
+ *
3398
+ * @param String $text - the text of the message; this should already be escaped (no more is done)
3399
+ * @param String $extraclass - a CSS class for the resulting DOM node
3400
+ * @param Integer $echo - if set, then the results will be echoed as well as returned
3401
+ *
3402
+ * @return String - the results
3403
+ */
3404
  public function show_double_warning($text, $extraclass = '', $echo = true) {
3405
 
3406
  $ret = "<div class=\"error updraftplusmethod $extraclass\"><p>$text</p></div>";
3412
  }
3413
 
3414
  public function optionfilter_split_every($value) {
3415
+ return max(absint($value), UPDRAFTPLUS_SPLIT_MIN);
 
 
3416
  }
3417
 
3418
  /**
3419
  * Check if curl exists; if not, print or return appropriate error messages
3420
  *
3421
+ * @param String $service the service description (used only for user-visible messages - so, use the description)
3422
+ * @param Boolean $has_fallback set as true if the lack of Curl only affects the ability to connect over SSL
3423
+ * @param String $extraclass an extra CSS class for any resulting message, passed on to show_double_warning()
3424
+ * @param Boolean $echo_instead_of_return whether the result should be echoed or returned
3425
+ * @return String any resulting message, if $echo_instead_of_return was set
 
3426
  */
3427
  public function curl_check($service, $has_fallback = false, $extraclass = '', $echo_instead_of_return = true) {
3428
 
3438
  $curl_ssl_supported= ($curl_version['features'] & CURL_VERSION_SSL);
3439
  if (!$curl_ssl_supported) {
3440
  if ($has_fallback) {
3441
+ $ret .= '<p><strong>'.__('Warning', 'updraftplus').':</strong> '.sprintf(__("Your web server's PHP/Curl installation does not support https access. Communications with %s will be unencrypted. Ask your web host to install Curl/SSL in order to gain the ability for encryption (via an add-on).", 'updraftplus'), $service).'</p>';
3442
  } else {
3443
+ $ret .= $this->show_double_warning('<p><strong>'.__('Warning', 'updraftplus').':</strong> '.sprintf(__("Your web server's PHP/Curl installation does not support https access. We cannot access %s without this support. Please contact your web hosting provider's support. %s <strong>requires</strong> Curl+https. Please do not file any support requests; there is no alternative.", 'updraftplus'), $service, $service).'</p>', $extraclass, false);
3444
  }
3445
  } else {
3446
+ $ret .= '<p><em>'.sprintf(__("Good news: Your site's communications with %s can be encrypted. If you see any errors to do with encryption, then look in the 'Expert Settings' for more help.", 'updraftplus'), $service).'</em></p>';
3447
  }
3448
  }
3449
  if ($echo_instead_of_return) {
3453
  }
3454
  }
3455
 
3456
+ /**
3457
+ * If $basedirs is passed as an array, then $directorieses must be too
3458
+ * Note: Reason $directorieses is being used because $directories is used within the foreach-within-a-foreach further down
3459
+ *
3460
+ * @param Array|String $directorieses List of of directories, or a single one
3461
+ * @param Array $exclude An exclusion array of directories
3462
+ * @param Array|String $basedirs A list of base directories, or a single one
3463
+ * @param String $format Return format - 'text' or 'numeric'
3464
+ * @return String|Integer
3465
+ */
3466
+ private function recursive_directory_size($directorieses, $exclude = array(), $basedirs = '', $format = 'text') {
3467
 
 
3468
  $size = 0;
3469
 
3470
+ if (is_string($directorieses)) {
3471
+ $basedirs = $directorieses;
3472
+ $directorieses = array($directorieses);
3473
  }
3474
 
3475
  if (is_string($basedirs)) $basedirs = array($basedirs);
3476
 
3477
+ foreach ($directorieses as $ind => $directories) {
3478
+ if (!is_array($directories)) $directories = array($directories);
3479
 
3480
  $basedir = empty($basedirs[$ind]) ? $basedirs[0] : $basedirs[$ind];
3481
 
3501
 
3502
  $directory = $prefix_directory.('' == $suffix_directory ? '' : '/'.$suffix_directory);
3503
  $size = 0;
3504
+ if (substr($directory, -1) == '/') $directory = substr($directory, 0, -1);
3505
 
3506
  if (!file_exists($directory) || !is_dir($directory) || !is_readable($directory)) return -1;
3507
  if (file_exists($directory.'/.donotbackup')) return 0;
3508
 
3509
  if ($handle = opendir($directory)) {
3510
  while (($file = readdir($handle)) !== false) {
3511
+ if ('.' != $file && '..' != $file) {
3512
  $spath = ('' == $suffix_directory) ? $file : $suffix_directory.'/'.$file;
3513
  if (false !== ($fkey = array_search($spath, $exclude))) {
3514
  unset($exclude[$fkey]);
3519
  $size += filesize($path);
3520
  } elseif (is_dir($path)) {
3521
  $handlesize = $this->recursive_directory_size_raw($prefix_directory, $exclude, $suffix_directory.('' == $suffix_directory ? '' : '/').$file);
3522
+ if ($handlesize >= 0) {
3523
+ $size += $handlesize;
3524
+ }
3525
  }
3526
  }
3527
  }
3538
 
3539
  $backup = $backup_history[$key];
3540
 
3541
+ $pretty_date = get_date_from_gmt(gmdate('Y-m-d H:i:s', (int) $key), 'M d, Y G:i');
3542
 
3543
  $rawbackup = "<h2 title=\"$key\">$pretty_date</h2>";
3544
 
3560
  if (!isset($backup[$type])) continue;
3561
 
3562
  $rawbackup .= $updraftplus->printfile($info['description'], $backup, $type, $checksums, $jd, true);
 
 
 
 
 
 
3563
  }
3564
 
3565
  $total_size = 0;
3594
 
3595
  $rawbackup .= $show_services;
3596
 
3597
+ if (false !== $total_size) {
3598
  $rawbackup .= '</p><strong>'.__('Total backup size:', 'updraftplus').'</strong> '.$updraftplus->convert_numeric_size_to_text($total_size).'<p>';
3599
  }
3600
 
3655
  return $ret;
3656
  }
3657
 
3658
+ /**
3659
+ * Go through each of the file entities
3660
+ *
3661
+ * @param Array $backup An array of meta information
3662
+ * @param Integer $key Backup timestamp (epoch time)
3663
+ * @param Array $accept An array of values to be accepted from vaules within $backup
3664
+ * @param String $entities Entities to be added
3665
+ * @param String $esc_pretty_date Whether the button needs to escape the pretty date format
3666
+ * @return String - the resulting HTML
3667
+ */
3668
  public function download_buttons($backup, $key, $accept, &$entities, $esc_pretty_date) {
3669
  global $updraftplus;
3670
  $ret = '';
3695
  if ('wpcore' == $type) $wpcore_restore_descrip = $sdescrip;
3696
  }
3697
  if (isset($backup[$type])) {
3698
+ if (!is_array($backup[$type])) $backup[$type] = array($backup[$type]);
3699
  $howmanyinset = count($backup[$type]);
3700
  $expected_index = 0;
3701
  $index_missing = false;
3704
  $whatfiles = $backup[$type];
3705
  ksort($whatfiles);
3706
  foreach ($whatfiles as $findex => $bfile) {
3707
+ $set_contents .= ('' == $set_contents) ? $findex : ",$findex";
3708
  if ($findex != $expected_index) $index_missing = true;
3709
  $expected_index++;
3710
  }
3729
  }
3730
 
3731
  if (!$first_entity) {
 
3732
  } else {
3733
  $first_entity = false;
3734
+ }
3735
 
3736
  $ret .= $this->download_button($type, $key, $findex, $info, $ide, $pdescrip, $esc_pretty_date, $set_contents);
3737
 
3747
  }
3748
 
3749
  public function date_label($pretty_date, $key, $backup, $jobdata, $nonce, $simple_format = false) {
 
3750
 
3751
  $pretty_date = $simple_format ? $pretty_date : '<div class="clear-right">'.$pretty_date.'</div>';
3752
 
3753
+ $ret = apply_filters('updraftplus_showbackup_date', $pretty_date, $backup, $jobdata, (int) $key, $simple_format);
3754
  if (is_array($jobdata) && !empty($jobdata['resume_interval']) && (empty($jobdata['jobstatus']) || 'finished' != $jobdata['jobstatus'])) {
3755
  if ($simple_format) {
3756
  $ret .= ' '.__('(Not finished)', 'updraftplus');
3789
  return $ret;
3790
  }
3791
 
3792
+ /**
3793
+ * Get HTML for the 'Delete' button for a particular backup in the 'Existing Backups' tab
3794
+ *
3795
+ * @param Integer $backup_time - backup timestamp (epoch time)
3796
+ * @param String $nonce - backup nonce
3797
+ * @param Array $backup - backup information array
3798
+ *
3799
+ * @return String - the resulting HTML
3800
+ */
3801
+ public function delete_button($backup_time, $nonce, $backup) {
3802
+ $sval = (!empty($backup['service']) && 'email' != $backup['service'] && 'none' != $backup['service'] && array('email') !== $backup['service'] && array('none') !== $backup['service']) ? '1' : '0';
3803
  return '<div class="updraftplus-remove" style="float: left; clear: none;" data-hasremote="'.$sval.'">
3804
+ <a data-hasremote="'.$sval.'" data-nonce="'.$nonce.'" data-key="'.$backup_time.'" class="no-decoration updraft-delete-link" href="#" title="'.esc_attr(__('Delete this backup set', 'updraftplus')).'">'.__('Delete', 'updraftplus').'</a>
3805
+ </div>';
3806
  }
3807
 
3808
  public function log_button($backup) {
3809
  global $updraftplus;
3810
  $updraft_dir = $updraftplus->backups_dir_location();
3811
  $ret = '';
3812
+ if (isset($backup['nonce']) && preg_match("/^[0-9a-f]{12}$/", $backup['nonce']) && is_readable($updraft_dir.'/log.'.$backup['nonce'].'.txt')) {
3813
  $nval = $backup['nonce'];
 
3814
  $lt = __('View Log', 'updraftplus');
3815
  $url = esc_attr(UpdraftPlus_Options::admin_page()."?page=updraftplus&action=downloadlog&amp;updraftplus_backup_nonce=$nval");
3816
  $ret .= <<<ENDHERE
3835
  /**
3836
  * Carry out the restore process
3837
  *
3838
+ * @param Integer $timestamp Identifying the backup to be restored
3839
+ * @param Array|null $continuation_data For continuing a multi-stage restore (code believed to be incomplete)
3840
+ * @return Boolean|WP_Error WP_Error indicates a terminal failure; false indicates not-yet complete (not necessarily terminal); true indicates complete.
 
3841
  */
3842
  private function restore_backup($timestamp, $continuation_data = null) {
3843
 
3877
 
3878
  $credentials = request_filesystem_credentials(UpdraftPlus_Options::admin_page()."?page=updraftplus&action=updraft_restore&backup_timestamp=$timestamp", '', false, false, $extra_fields);
3879
  WP_Filesystem($credentials);
3880
+ if ($wp_filesystem->errors->get_error_code()) {
3881
  echo '<p><em><a href="'.apply_filters('updraftplus_com_link', "https://updraftplus.com/faqs/asked-ftp-details-upon-restorationmigration-updates/").'">'.__('Why am I seeing this?', 'updraftplus').'</a></em></p>';
3882
+ foreach ($wp_filesystem->errors->get_error_messages() as $message) show_message($message);
3883
  exit;
3884
  }
3885
 
3886
  // If we make it this far then WP_Filesystem has been instantiated and is functional
3887
 
3888
+ // Set up logging
3889
  $updraftplus->backup_time_nonce();
3890
  $updraftplus->jobdata_set('job_type', 'restore');
3891
  $updraftplus->jobdata_set('job_time_ms', $updraftplus->job_time_ms);
3892
  $updraftplus->logfile_open($updraftplus->nonce);
3893
 
3894
+ // Provide download link for the log file
3895
+ // TODO: Automatic purging of old log files
3896
+ // TODO: Provide option to auto-email the log file
 
3897
 
3898
  echo '<h1>'.__('UpdraftPlus Restoration: Progress', 'updraftplus').'</h1><div id="updraft-restore-progress">';
3899
 
3961
  parse_str(stripslashes($_POST['updraft_restorer_restore_options']), $restore_options);
3962
  }
3963
  $restore_options['updraft_restorer_replacesiteurl'] = empty($_POST['updraft_restorer_replacesiteurl']) ? false : true;
3964
+ $restore_options['updraft_encryptionphrase'] = empty($_POST['updraft_encryptionphrase']) ? '' : (string) stripslashes($_POST['updraft_encryptionphrase']);
3965
  $restore_options['updraft_restorer_wpcore_includewpconfig'] = empty($_POST['updraft_restorer_wpcore_includewpconfig']) ? false : true;
3966
  $updraftplus->jobdata_set('restore_options', $restore_options);
3967
  }
3982
  $backupable_entities = apply_filters('updraft_backupable_file_entities_on_restore', $backupable_entities, $restore_options, $backup_set);
3983
 
3984
  // We use a single object for each entity, because we want to store information about the backup set
3985
+ include_once(UPDRAFTPLUS_DIR.'/restorer.php');
3986
 
3987
  global $updraftplus_restorer;
3988
 
4012
  foreach ($backup_set as $type => $files) {
4013
  // All restorable entities must be given explicitly, as we can store other arbitrary data in the history array
4014
  if (!isset($backupable_entities[$type]) && 'db' != $type) continue;
4015
+ if (isset($backupable_entities[$type]['restorable']) && false == $backupable_entities[$type]['restorable']) continue;
4016
 
4017
  if (!isset($entities_to_download[$type])) continue;
4018
  if ('wpcore' == $type && is_multisite() && 0 === $updraftplus_restorer->ud_backup_is_multisite) {
4019
  echo "<p>$type: <strong>";
4020
  $updraftplus->log(__('Skipping restoration of WordPress core when importing a single site into a multisite installation. If you had anything necessary in your WordPress directory then you will need to re-add it manually from the zip file.', 'updraftplus'), 'notice-restore');
4021
+ // TODO
4022
+ // $updraftplus->log_e('Skipping restoration of WordPress core when importing a single site into a multisite installation. If you had anything necessary in your WordPress directory then you will need to re-add it manually from the zip file.');
4023
  echo "</strong></p>";
4024
  continue;
4025
  }
4040
 
4041
  $this->get_remote_file($service, $file, $timestamp, true);
4042
 
4043
+ $index = (0 == $ind) ? '' : $ind;
4044
  // If a file size is stored in the backup data, then verify correctness of the local file
4045
  if (isset($backup_set[$type.$index.'-size'])) {
4046
  $fs = $backup_set[$type.$index.'-size'];
4047
+ $print_message = __("Archive is expected to be size:", 'updraftplus')." ".round($fs/1024, 1)." KB: ";
4048
  $as = @filesize($fullpath);
4049
  if ($as == $fs) {
4050
  $updraftplus->log($print_message.__('OK', 'updraftplus'), 'notice-restore');
4052
  $updraftplus->log($print_message.__('Error:', 'updraftplus')." ".__('file is size:', 'updraftplus')." ".round($as/1024)." ($fs, $as)", 'warning-restore');
4053
  }
4054
  } else {
4055
+ $updraftplus->log(__("The backup records do not contain information about the proper size of this file.", 'updraftplus'), 'notice-restore');
4056
  }
4057
  if (!is_readable($fullpath)) {
4058
  $updraftplus->log(__('Could not find one of the files for restoration', 'updraftplus')." ($file)", 'warning-restore');
4084
  foreach ($val->get_error_codes() as $code) {
4085
  if ('already_exists' == $code) $this->print_delete_old_dirs_form(false);
4086
  }
4087
+ echo '</div>'; // close the updraft_restore_progress div even if we error
4088
  restore_error_handler();
4089
  return $val;
4090
  } elseif (false === $val) {
4091
+ echo '</div>'; // close the updraft_restore_progress div even if we error
4092
  restore_error_handler();
4093
  return false;
4094
  }
4184
  }
4185
  }
4186
  }
4187
+ echo '</div>'; // close the updraft_restore_progress div even if we error
4188
  restore_error_handler();
4189
  return $val;
4190
  }
4191
  } elseif (false === $val) {
4192
+ echo '</div>'; // close the updraft_restore_progress div even if we error
4193
  restore_error_handler();
4194
  return false;
4195
  }
4217
  // Clear any cached pages after the restore
4218
  $updraftplus_restorer->clear_cache();
4219
 
4220
+ if (!function_exists('validate_current_theme')) include_once(ABSPATH.WPINC.'/themes');
4221
 
4222
  // Have seen a case where the current theme in the DB began with a capital, but not on disk - and this breaks migrating from Windows to a case-sensitive system
4223
  $template = get_option('template');
4224
+ if (!empty($template) && WP_DEFAULT_THEME != $template && strtolower($template) != $template) {
4225
 
4226
  $theme_root = get_theme_root($template);
4227
  $theme_root2 = get_theme_root(strtolower($template));
4246
  return true;
4247
  }
4248
 
4249
+ public function option_filter_template($val) {
4250
+ global $updraftplus;
4251
+ return $updraftplus->option_filter_get('template');
4252
+ }
4253
 
4254
+ public function option_filter_stylesheet($val) {
4255
+ global $updraftplus;
4256
+ return $updraftplus->option_filter_get('stylesheet');
4257
+ }
4258
 
4259
+ public function option_filter_template_root($val) {
4260
+ global $updraftplus;
4261
+ return $updraftplus->option_filter_get('template_root');
4262
+ }
4263
 
4264
+ public function option_filter_stylesheet_root($val) {
4265
+ global $updraftplus;
4266
+ return $updraftplus->option_filter_get('stylesheet_root');
4267
+ }
4268
 
4269
  public function sort_restoration_entities($a, $b) {
4270
  if ($a == $b) return 0;
4302
  die;
4303
  }
4304
 
4305
+ public function updraft_ajax_importsettings() {
4306
+ global $updraftplus;
4307
+
4308
+ if (empty($_POST) || empty($_POST['subaction']) || 'importsettings' != $_POST['subaction'] || !isset($_POST['nonce']) || !is_user_logged_in() || !UpdraftPlus_Options::user_can_manage() || !wp_verify_nonce($_POST['nonce'], 'updraftplus-settings-nonce')) die('Security check');
4309
+
4310
+ if (empty($_POST['settings']) || !is_string($_POST['settings'])) die('Invalid data');
4311
 
4312
  $this->import_settings($_POST);
4313
+ }
4314
 
4315
  /**
4316
  * This method handles the imported json settings it will convert them into a readable format for the existing save settings function, it will also update some of the options to match the new remote storage options format (Apr 2017)
4350
  if (empty($posted_settings['updraft_azure']['settings'])) $posted_settings['updraft_azure'] = $updraftplus->wrap_remote_storage_options($posted_settings['updraft_azure']);
4351
  if (empty($posted_settings['updraft_dropbox']['settings'])) $posted_settings['updraft_dropbox'] = $updraftplus->wrap_remote_storage_options($posted_settings['updraft_dropbox']);
4352
 
4353
+ echo json_encode($this->save_settings($posted_settings));
4354
 
4355
+ die;
4356
  }
4357
 
4358
  private function backup_now_remote_message() {
4370
  return '<input type="checkbox" id="backupnow_includecloud" checked="checked"> <label for="backupnow_includecloud">'.__("Send this backup to remote storage", 'updraftplus').'</label>';
4371
  }
4372
  }
4373
+
4374
+ /**
4375
+ * This method works through the passed in settings array and saves the settings to the database clearing old data and setting up a return array with content to update the page via ajax
4376
+ *
4377
+ * @param array $settings An array of settings taking from the admin page ready to be saved to the database
4378
+ * @return array An array response containing the status of the update along with content to be used to update the admin page.
4379
+ */
4380
  public function save_settings($settings) {
4381
 
4382
  global $updraftplus;
4392
 
4393
  $add_to_post_keys = array('updraft_interval', 'updraft_interval_database', 'updraft_starttime_files', 'updraft_starttime_db', 'updraft_startday_files', 'updraft_startday_db');
4394
 
4395
+ // If database and files are on same schedule, override the db day/time settings
4396
  if (isset($settings['updraft_interval_database']) && isset($settings['updraft_interval_database']) && $settings['updraft_interval_database'] == $settings['updraft_interval'] && isset($settings['updraft_starttime_files'])) {
4397
  $settings['updraft_starttime_db'] = $settings['updraft_starttime_files'];
4398
  $settings['updraft_startday_db'] = $settings['updraft_startday_files'];
4399
+ }
4400
  foreach ($add_to_post_keys as $key) {
4401
  // For add-ons that look at $_POST to find saved settings, add the relevant keys to $_POST so that they find them there
4402
  if (isset($settings[$key])) {
4431
  foreach ($settings as $key => $value) {
4432
 
4433
  if (in_array($key, $relevant_keys)) {
4434
+ if ('updraft_service' == $key && is_array($value)) {
4435
+ foreach ($value as $subkey => $subvalue) {
4436
+ if ('0' == $subvalue) unset($value[$subkey]);
4437
  }
4438
  }
4439
 
4440
  // This flag indicates that either the stored database option was changed, or that the supplied option was changed before being stored. It isn't comprehensive - it's only used to update some UI elements with invalid input.
4441
+ $updated = empty($mass_updated) ? (is_string($value) && UpdraftPlus_Options::get_updraft_option($key) != $value) : (is_string($value) && (!isset($original_settings[$key]) || $original_settings[$key] != $value));
4442
 
4443
  $db_updated = empty($mass_updated) ? UpdraftPlus_Options::update_updraft_option($key, $value) : true;
4444
 
4448
  $value = UpdraftPlus_Options::get_updraft_option($key);
4449
  if (is_string($value)) $return_array['changed'][$key] = $value;
4450
  }
4451
+ // @codingStandardsIgnoreLine
4452
  } else {
4453
+ // This section is ignored by CI otherwise it will complain the ELSE is empty.
4454
+
4455
  // When last active, it was catching: option_page, action, _wpnonce, _wp_http_referer, updraft_s3_endpoint, updraft_dreamobjects_endpoint. The latter two are empty; probably don't need to be in the page at all.
4456
+ // error_log("Non-UD key when saving from POSTed data: ".$key);
4457
  }
4458
  }
4459
  } else {
4472
 
4473
  // Check if $more_files_path_updated is true, is so then there's a change and we should update the backup modal
4474
  if ($more_files_path_updated) {
4475
+ $return_array['updraft_include_more_path'] = $this->files_selector_widgetry('backupnow_files_', false, 'sometimes');
4476
  }
4477
 
4478
+ // Because of the single AJAX call, we need to remove the existing UD messages from the 'all_admin_notices' action
4479
  remove_all_actions('all_admin_notices');
4480
 
4481
+ // Moving from 2 to 1 ajax call
4482
  ob_start();
4483
 
4484
  $service = UpdraftPlus_Options::get_updraft_option('updraft_service');
4488
 
4489
  do_action('all_admin_notices');
4490
 
4491
+ if (!$really_is_writable) { // Check if writable
4492
  $this->show_admin_warning_unwritable();
4493
  }
4494
 
4514
  $return_array['messages'] = $messages_output;
4515
  $return_array['scheduled'] = $scheduled_output;
4516
 
4517
+ // Add the updated options to the return message, so we can update on screen
 
 
4518
  return $return_array;
4519
 
4520
  }
4521
 
4522
  /**
4523
  * A method to remove UpdraftPlus settings from the options table.
4524
+ *
4525
  * @param boolean $wipe_all_settings Set to true as default as we want to remove all options, set to false if calling from UpdraftCentral, as we do not want to remove the UpdraftCentral key or we will lose connection to the site.
4526
+ * @return boolean
4527
  */
4528
  public function updraft_wipe_settings($wipe_all_settings = true) {
4529
 
4550
 
4551
  return true;
4552
  }
4553
+
4554
+ /**
4555
+ * This get the details for updraft vault and to be used globally
4556
+ *
4557
+ * @param string $instance_id - the instance_id of the current instance being used
4558
+ * @return object - the UpdraftVault option setup to use the passed in instance id or if one wasn't passed then use the default set of options
4559
+ */
4560
+ public function get_updraftvault($instance_id = '') {
4561
+ global $updraftplus;
4562
+
4563
+ $storage_objects_and_ids = $updraftplus->get_storage_objects_and_ids(array('updraftvault'));
4564
+
4565
+ if (isset($storage_objects_and_ids['updraftvault']['instance_settings'][$instance_id])) {
4566
+ $opts = $storage_objects_and_ids['updraftvault']['instance_settings'][$instance_id];
4567
+ $vault = $storage_objects_and_ids['updraftvault']['object'];
4568
+ $vault->set_options($opts, false, $instance_id);
4569
+ } else {
4570
+ include_once(UPDRAFTPLUS_DIR.'/methods/updraftvault.php');
4571
+ $vault = new UpdraftPlus_BackupModule_updraftvault();
4572
+ }
4573
+
4574
  return $vault;
4575
  }
4576
 
4577
+ /**
4578
+ * http_get will allow the HTTP Fetch execute available in advanced tools
4579
+ *
4580
+ * @param String $uri Specific URL passed to curl
4581
+ * @param Boolean $curl True or False if cURL is to be used
4582
+ * @return String - JSON encoded results
4583
+ */
4584
  public function http_get($uri = null, $curl = false) {
4585
 
4586
  if (!preg_match('/^https?/', $uri)) return json_encode(array('e' => 'Non-http URL specified'));
4596
  curl_setopt($ch, CURLOPT_FAILONERROR, true);
4597
  curl_setopt($ch, CURLOPT_HEADER, false);
4598
  curl_setopt($ch, CURLOPT_VERBOSE, true);
4599
+ curl_setopt($ch, CURLOPT_STDERR, $output = fopen('php://temp', "w+"));
4600
  $response = curl_exec($ch);
4601
  $error = curl_error($ch);
4602
  $getinfo = curl_getinfo($ch);
4613
 
4614
  if (!empty($verb)) $resp['r'] = htmlspecialchars($verb)."\n\n".$resp['r'];
4615
 
4616
+ // Extra info returned for Central
4617
  $resp['verb'] = $verb;
4618
  $resp['response'] = $response;
4619
  $resp['status'] = $getinfo;
4620
 
4621
  return json_encode($resp);
 
4622
  } else {
4623
  $response = wp_remote_get($uri, array('timeout' => 10));
4624
  if (is_wp_error($response)) {
4651
  ob_start();
4652
  $history = UpdraftPlus_Backup_History::get_history();
4653
  var_dump($history);
4654
+ $response["html"] .= ob_get_clean();
4655
  $response['html'] .= '</pre>';
4656
 
4657
  $response['html'] .= '<h3 id="ud-debuginfo-files">'.__('Files', 'updraftplus').'</h3><pre>';
4675
  }
4676
  @$d->close();
4677
  krsort($raw_output, SORT_NUMERIC);
4678
+
4679
+ foreach ($raw_output as $line) {
4680
+ $response['html'] .= $line;
4681
+ }
4682
+
4683
  $response['html'] .= '</pre>';
4684
 
4685
  $response['html'] .= '<h3 id="ud-debuginfo-options">'.__('Options (raw)', 'updraftplus').'</h3>';
4697
  $response['html'] .= ob_get_clean();
4698
 
4699
  if (true == $no_pre_tags) {
4700
+ $response['html'] = str_replace('<pre>', '', $response['html']);
4701
+ $response['html'] = str_replace('</pre>', '', $response['html']);
4702
  }
4703
 
4704
  return $response;
4705
  }
4706
 
4707
+ /**
4708
+ * This will call any wp_action
4709
+ *
4710
+ * @param Array $data The array of data with the vaules for wpaction
4711
+ * @param Callable|Boolean $close_connection_callable A callable to call to close the browser connection, or true for a default suitable for internal use, or false for none
4712
+ * @return Array - results
4713
+ */
4714
  public function call_wp_action($data = null, $close_connection_callable = false) {
4715
  global $updraftplus;
4716
 
4734
 
4735
  $ret = ob_get_clean();
4736
 
4737
+ // Need to add this as the close browser should only work for UDP
4738
  if ($close_connection_callable) {
4739
  if (is_callable($close_connection_callable)) {
4740
  call_user_func($close_connection_callable, array('r' => $res));
4760
  $response['response'] = $res;
4761
  $response['log'] = $output;
4762
 
4763
+ // Check if response is empty
4764
  if (!empty($returned)) $response['status'] = $returned;
4765
 
4766
  return $response;
4767
  }
4768
 
4769
+ /**
4770
+ * Enqueue JSTree JavaScript and CSS, taking into account whether it is already enqueued, and current debug settings
4771
+ */
4772
  public function enqueue_jstree() {
4773
 
4774
  static $already_enqueued = false;
4775
  if ($already_enqueued) return;
4776
 
4777
+ $already_enqueued = true;
4778
  $jstree_enqueue_version = (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) ? '3.3'.'.'.time() : '3.3';
4779
  $min_or_not = (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) ? '' : '.min';
4780
+
4781
  wp_enqueue_script('jstree', UPDRAFTPLUS_URL.'/includes/jstree/jstree'.$min_or_not.'.js', array('jquery'), $jstree_enqueue_version);
4782
+ wp_enqueue_style('jstree', UPDRAFTPLUS_URL.'/includes/jstree/themes/default/style'.$min_or_not.'.css', array(), $jstree_enqueue_version);
4783
  }
4784
  }
backup.php CHANGED
@@ -3,42 +3,62 @@
3
  if (!defined('UPDRAFTPLUS_DIR')) die('No direct access allowed');
4
  if (!class_exists('UpdraftPlus_PclZip')) require_once(UPDRAFTPLUS_DIR.'/class-zip.php');
5
 
6
- // This file contains functions that are only needed/loaded when a backup is running (reduces memory usage on other pages)
7
-
 
8
  class UpdraftPlus_Backup {
9
 
10
  public $index = 0;
11
 
 
 
12
  private $zipfiles_added;
 
13
  private $zipfiles_added_thisrun = 0;
 
14
  public $zipfiles_dirbatched;
 
15
  public $zipfiles_batched;
 
16
  public $zipfiles_skipped_notaltered;
17
- private $zip_split_every = 419430400; # 400MB
 
 
18
  private $zip_last_ratio = 1;
 
19
  private $whichone;
 
20
  private $zip_basename = '';
 
21
  private $backup_basename = '';
 
22
  private $zipfiles_lastwritetime;
 
23
  // 0 = unknown; false = failed
24
  public $binzip = 0;
25
 
26
  private $dbhandle;
 
27
  private $dbhandle_isgz;
28
 
29
- # Array of entities => times
30
  private $altered_since = -1;
31
- # Time for the current entity
 
32
  private $makezip_if_altered_since = -1;
33
 
34
  private $excluded_extensions = false;
35
 
36
  private $use_zip_object = 'UpdraftPlus_ZipArchive';
 
37
  public $debug = false;
38
 
39
  public $updraft_dir;
 
40
  private $blog_name;
 
41
  private $wpdb_obj;
 
42
  private $job_file_entities = array();
43
 
44
  private $first_run = 0;
@@ -60,20 +80,20 @@ class UpdraftPlus_Backup {
60
  global $updraftplus;
61
 
62
  // Get the blog name and rip out known-problematic characters. Remember that we may need to be able to upload this to any FTP server or cloud storage, where filename support may be unknown
63
- $blog_name = str_replace('__', '_', preg_replace('/[^A-Za-z0-9_]/','', str_replace(' ','_', substr(get_bloginfo(), 0, 32))));
64
  if (!$blog_name || preg_match('#^_+$#', $blog_name)) {
65
  // Try again...
66
  $parsed_url = parse_url(home_url(), PHP_URL_HOST);
67
  $parsed_subdir = untrailingslashit(parse_url(home_url(), PHP_URL_PATH));
68
  if ($parsed_subdir && '/' != $parsed_subdir) $parsed_url .= str_replace(array('/', '\\'), '_', $parsed_subdir);
69
- $blog_name = str_replace('__', '_', preg_replace('/[^A-Za-z0-9_]/','', str_replace(' ','_', substr($parsed_url, 0, 32))));
70
  if (!$blog_name || preg_match('#^_+$#', $blog_name)) $blog_name = 'WordPress_Backup';
71
  }
72
 
73
  // Allow an over-ride. Careful about introducing characters not supported by your filesystem or cloud storage.
74
  $this->blog_name = apply_filters('updraftplus_blog_name', $blog_name);
75
 
76
- # Decide which zip engine to begin with
77
  $this->debug = UpdraftPlus_Options::get_updraft_option('updraft_debug_mode');
78
  $this->updraft_dir = $updraftplus->backups_dir_location();
79
  $this->updraft_dir_realpath = realpath($this->updraft_dir);
@@ -91,13 +111,13 @@ class UpdraftPlus_Backup {
91
 
92
  // false means 'tried + failed'; whereas 0 means 'not yet tried'
93
  // Disallow binzip on OpenVZ when we're not sure there's plenty of memory
94
- if ($this->binzip === 0 && (!defined('UPDRAFTPLUS_PREFERPCLZIP') || UPDRAFTPLUS_PREFERPCLZIP != true) && (!defined('UPDRAFTPLUS_NO_BINZIP') || !UPDRAFTPLUS_NO_BINZIP) && $updraftplus->current_resumption <9) {
95
 
96
  if (@file_exists('/proc/user_beancounters') && @file_exists('/proc/meminfo') && @is_readable('/proc/meminfo')) {
97
  $meminfo = @file_get_contents('/proc/meminfo', false, null, -1, 200);
98
  if (is_string($meminfo) && preg_match('/MemTotal:\s+(\d+) kB/', $meminfo, $matches)) {
99
  $memory_mb = $matches[1]/1024;
100
- # If the report is of a large amount, then we're probably getting the total memory on the hypervisor (this has been observed), and don't really know the VPS's memory
101
  $vz_log = "OpenVZ; reported memory: ".round($memory_mb, 1)." MB";
102
  if ($memory_mb < 1024 || $memory_mb > 8192) {
103
  $openvz_lowmem = true;
@@ -117,8 +137,8 @@ class UpdraftPlus_Backup {
117
  }
118
  }
119
 
120
- # In tests, PclZip was found to be 25% slower than ZipArchive
121
- if ($this->use_zip_object != 'UpdraftPlus_PclZip' && empty($this->binzip) && ((defined('UPDRAFTPLUS_PREFERPCLZIP') && UPDRAFTPLUS_PREFERPCLZIP == true) || !class_exists('ZipArchive') || !class_exists('UpdraftPlus_ZipArchive') || (!extension_loaded('zip') && !method_exists('ZipArchive', 'AddFile')))) {
122
  global $updraftplus;
123
  $updraftplus->log("Zip engine: ZipArchive is not available or is disabled (will use PclZip if needed)");
124
  $this->use_zip_object = 'UpdraftPlus_PclZip';
@@ -130,7 +150,16 @@ class UpdraftPlus_Backup {
130
  $this->remotestorage_extrainfo[$service] = array('pretty' => $info_html, 'plain' => $info_plain);
131
  }
132
 
133
- // Public, because called from the 'More Files' add-on
 
 
 
 
 
 
 
 
 
134
  public function create_zip($create_from_dir, $whichone, $backup_file_basename, $index, $first_linked_index = false) {
135
  // Note: $create_from_dir can be an array or a string
136
  @set_time_limit(UPDRAFTPLUS_SET_TIME_LIMIT);
@@ -142,15 +171,15 @@ class UpdraftPlus_Backup {
142
 
143
  global $updraftplus;
144
 
145
- $this->zip_split_every = max((int)$updraftplus->jobdata_get('split_every'), UPDRAFTPLUS_SPLIT_MIN)*1048576;
146
 
147
- if ('others' != $whichone) $updraftplus->log("Beginning creation of dump of $whichone (split every: ".round($this->zip_split_every/1048576,1)." MB)");
148
 
149
  if (is_string($create_from_dir) && !file_exists($create_from_dir)) {
150
  $flag_error = true;
151
  $updraftplus->log("Does not exist: $create_from_dir");
152
  if ('mu-plugins' == $whichone) {
153
- if (!function_exists('get_mu_plugins')) require_once(ABSPATH.'wp-admin/includes/plugin.php');
154
  $mu_plugins = get_mu_plugins();
155
  if (count($mu_plugins) == 0) {
156
  $updraftplus->log("There appear to be no mu-plugins to back up. Will not raise an error.");
@@ -166,19 +195,19 @@ class UpdraftPlus_Backup {
166
  $full_path = $this->updraft_dir.'/'.$base_path;
167
  $time_now = time();
168
 
169
- # This is compatible with filenames which indicate increments, as it is looking only for the current increment
170
  if (file_exists($full_path)) {
171
- # Gather any further files that may also exist
172
  $files_existing = array();
173
  while (file_exists($full_path)) {
174
  $files_existing[] = $base_path;
175
- $time_mod = (int)@filemtime($full_path);
176
- $updraftplus->log($base_path.": this file has already been created (age: ".round($time_now-$time_mod,1)." s)");
177
  if ($time_mod>100 && ($time_now-$time_mod)<30) {
178
  $updraftplus->terminate_due_to_activity($base_path, $time_now, $time_mod);
179
  }
180
  $index++;
181
- # This is compatible with filenames which indicate increments, as it is looking only for the current increment
182
  $base_path = $backup_file_basename.'-'.$whichone.($index+1).'.zip';
183
  $full_path = $this->updraft_dir.'/'.$base_path;
184
  }
@@ -191,7 +220,7 @@ class UpdraftPlus_Backup {
191
 
192
  // Firstly, make sure that the temporary file is not already being written to - which can happen if a resumption takes place whilst an old run is still active
193
  $zip_name = $full_path.'.tmp';
194
- $time_mod = (int)@filemtime($zip_name);
195
  if (file_exists($zip_name) && $time_mod>100 && ($time_now-$time_mod)<30) {
196
  $updraftplus->terminate_due_to_activity($zip_name, $time_now, $time_mod);
197
  }
@@ -216,8 +245,8 @@ class UpdraftPlus_Backup {
216
  clearstatcache();
217
 
218
  if (isset($files_existing)) {
219
- # Because of zip-splitting, the mere fact that files exist is not enough to indicate that the entity is finished. For that, we need to also see that no subsequent file has been started.
220
- # Q. What if the previous runner died in between zips, and it is our job to start the next one? A. The next temporary file is created before finishing the former zip, so we are safe (and we are also safe-guarded by the updated value of the index being stored in the database).
221
  return $files_existing;
222
  }
223
 
@@ -225,12 +254,12 @@ class UpdraftPlus_Backup {
225
 
226
  $this->zip_microtime_start = microtime(true);
227
 
228
- # The paths in the zip should then begin with '$whichone', having removed WP_CONTENT_DIR from the front
229
  $zipcode = $this->make_zipfile($create_from_dir, $backup_file_basename, $whichone);
230
- if ($zipcode !== true) {
231
  $updraftplus->log("ERROR: Zip failure: Could not create $whichone zip (".$this->index." / $index)");
232
- $updraftplus->log(sprintf(__("Could not create %s zip. Consult the log file for more information.",'updraftplus'),$whichone), 'error');
233
- # The caller is required to update $index from $this->index
234
  return false;
235
  } else {
236
  $itext = (empty($this->index)) ? '' : ($this->index+1);
@@ -258,12 +287,12 @@ class UpdraftPlus_Backup {
258
  $timetaken = max(microtime(true)-$this->zip_microtime_start, 0.000001);
259
  $kbsize = filesize($full_path)/1024;
260
  $rate = round($kbsize/$timetaken, 1);
261
- $updraftplus->log("Created $whichone zip (".$this->index.") - ".round($kbsize,1)." KB in ".round($timetaken,1)." s ($rate KB/s) ($checksum_description)");
262
  // We can now remove any left-over temporary files from this job
263
  }
264
  } elseif ($this->index > $original_index) {
265
  $updraftplus->log("Did not create $whichone zip (".$this->index.") - not needed (2)");
266
- # Added 12-Feb-2014 (to help multiple morefiles)
267
  $this->index--;
268
  } else {
269
  $updraftplus->log("Looked-for $whichone zip (".$this->index.") was not found (".basename($full_path).".tmp)", 'warning');
@@ -274,7 +303,7 @@ class UpdraftPlus_Backup {
274
  // Remove cache list files as well, if there are any
275
  $updraftplus->clean_temporary_files('_'.$updraftplus->nonce."-$whichone", 0, true);
276
 
277
- # Create the results array to send back (just the new ones, not any prior ones)
278
  $files_existing = array();
279
  $res_index = 0;
280
  for ($i = $original_index; $i<= $this->index; $i++) {
@@ -288,7 +317,9 @@ class UpdraftPlus_Backup {
288
  return $files_existing;
289
  }
290
 
291
- // This method is for calling outside of a cloud_backup() context. It constructs a list of services for which prune operations should be attempted, and then calls prune_retained_backups() if necessary upon them.
 
 
292
  public function do_prune_standalone() {
293
  global $updraftplus;
294
 
@@ -298,11 +329,11 @@ class UpdraftPlus_Backup {
298
  $prune_services = array();
299
 
300
  foreach ($services as $ind => $service) {
301
- if ($service == "none" || '' == $service) continue;
302
 
303
  $objname = "UpdraftPlus_BackupModule_${service}";
304
  if (!class_exists($objname) && file_exists(UPDRAFTPLUS_DIR.'/methods/'.$service.'.php')) {
305
- require_once(UPDRAFTPLUS_DIR.'/methods/'.$service.'.php');
306
  }
307
  if (class_exists($objname)) {
308
  $remote_obj = new $objname;
@@ -317,7 +348,11 @@ class UpdraftPlus_Backup {
317
  if (!empty($prune_services)) $this->prune_retained_backups($prune_services);
318
  }
319
 
320
- // Dispatch to the relevant function
 
 
 
 
321
  public function cloud_backup($backup_array) {
322
 
323
  global $updraftplus;
@@ -340,7 +375,7 @@ class UpdraftPlus_Backup {
340
 
341
  $do_prune = array();
342
 
343
- # If there was no check-in last time, then attempt a different service first - in case a time-out on the attempted service leads to no activity and everything stopping
344
  if (count($services) >1 && !empty($updraftplus->no_checkin_last_time)) {
345
  $updraftplus->log('No check-in last time: will try a different remote service first');
346
  array_push($services, array_shift($services));
@@ -352,9 +387,9 @@ class UpdraftPlus_Backup {
352
  $errors_before_uploads = $updraftplus->error_count();
353
 
354
  foreach ($services as $ind => $service) {
355
- # Used for logging by record_upload_chunk()
356
  $this->current_service = $service;
357
- # Used when deciding whether to delete the local file
358
  $this->last_service = ($ind+1 >= count($services) && $errors_before_uploads == $updraftplus->error_count()) ? true : false;
359
 
360
  $log_extra = ($this->last_service) ? ' (last)' : '';
@@ -362,11 +397,11 @@ class UpdraftPlus_Backup {
362
  @set_time_limit(UPDRAFTPLUS_SET_TIME_LIMIT);
363
 
364
  $method_include = UPDRAFTPLUS_DIR.'/methods/'.$service.'.php';
365
- if (file_exists($method_include)) require_once($method_include);
366
 
367
- if ($service == "none" || '' == $service) {
368
  $updraftplus->log("No remote despatch: user chose no remote backup service");
369
- # Still want to mark as "uploaded", to signal that nothing more needs doing. (Important on incremental runs with no cloud storage).
370
  foreach ($backup_array as $bind => $file) {
371
  if ($updraftplus->is_uploaded($file)) {
372
  $updraftplus->log("Already uploaded: $file");
@@ -465,8 +500,8 @@ class UpdraftPlus_Backup {
465
  return;
466
  }
467
 
468
- // $updraftplus->jobdata_set('jobstatus', 'pruning');
469
- // $updraftplus->jobdata_set('prune', 'begun');
470
  call_user_func_array(array($updraftplus, 'jobdata_set_multi'), array('jobstatus', 'pruning', 'prune', 'begun'));
471
 
472
  // Number of backups to retain - files
@@ -737,11 +772,11 @@ class UpdraftPlus_Backup {
737
 
738
  $backup_to_examine = $this->remove_backup_set_if_empty($backup_to_examine, $backup_datestamp, $backupable_entities, $backup_history);
739
  if (empty($backup_to_examine)) {
740
- // unset($functional_backup_history[$backup_datestamp]);
741
  unset($backup_history[$backup_datestamp]);
742
  $this->maybe_save_backup_history_and_reschedule($backup_history);
743
  } else {
744
- // $functional_backup_history[$backup_datestamp] = $backup_to_examine;
745
  $backup_history[$backup_datestamp] = $backup_to_examine;
746
  }
747
 
@@ -813,7 +848,7 @@ class UpdraftPlus_Backup {
813
  } else {
814
  $updraftplus->log("No nonce record found in the backup set, so cannot delete any remaining log file");
815
  }
816
- // unset($backup_history[$backup_datestamp]);
817
  return false;
818
  } else {
819
  $updraftplus->log("This backup set remains non-empty (f=$contains_files/d=$contains_db); will retain in history");
@@ -822,10 +857,18 @@ class UpdraftPlus_Backup {
822
 
823
  }
824
 
825
- # $dofiles: An array of files (or a single string for one file)
 
 
 
 
 
 
 
 
826
  private function prune_file($service, $dofiles, $method_object = null, $object_passback = null, $file_sizes = array()) {
827
  global $updraftplus;
828
- if (!is_array($dofiles)) $dofiles=array($dofiles);
829
 
830
  if (!apply_filters('updraftplus_prune_file', true, $dofiles, $service, $method_object, $object_passback, $file_sizes)) {
831
  $updraftplus->log("Prune: service=$service: skipped via filter");
@@ -845,7 +888,12 @@ class UpdraftPlus_Backup {
845
  if (!is_null($method_object)) $method_object->delete($dofiles, $object_passback, $file_sizes);
846
  }
847
 
848
- # The jobdata is passed in instead of fetched, because the live jobdata may now differ from that which should be reported on (e.g. an incremental run was subsequently scheduled)
 
 
 
 
 
849
  public function send_results_email($final_message, $jobdata) {
850
 
851
  global $updraftplus;
@@ -870,10 +918,10 @@ class UpdraftPlus_Backup {
870
  } elseif ('finished' == $backup_files && ('finished' == $backup_db || 'encrypted' == $backup_db)) {
871
  $backup_contains = __("Files and database", 'updraftplus')." ($backup_type)";
872
  } elseif ('finished' == $backup_files) {
873
- $backup_contains = ($backup_db == "begun") ? __("Files (database backup has not completed)", 'updraftplus') : __("Files only (database was not part of this particular schedule)", 'updraftplus');
874
  $backup_contains .= " ($backup_type)";
875
- } elseif ($backup_db == 'finished' || $backup_db == 'encrypted') {
876
- $backup_contains = ($backup_files == "begun") ? __("Database (files backup has not completed)", 'updraftplus') : __("Database only (files were not part of this particular schedule)", 'updraftplus');
877
  } else {
878
  $updraftplus->log('Unknown/unexpected status: '.serialize($backup_files).'/'.serialize($backup_db));
879
  $backup_contains = __("Unknown/unexpected error - please raise a support request", 'updraftplus');
@@ -899,7 +947,7 @@ class UpdraftPlus_Backup {
899
  }
900
  $error_count++;
901
  }
902
- $append_log.="\r\n";
903
  }
904
  $warnings = (isset($jobdata['warnings'])) ? $jobdata['warnings'] : array();
905
  if (is_array($warnings) && count($warnings) >0) {
@@ -908,7 +956,7 @@ class UpdraftPlus_Backup {
908
  foreach ($warnings as $err) {
909
  $append_log .= "* ".rtrim($err)."\r\n";
910
  }
911
- $append_log.="\r\n";
912
  }
913
 
914
  if ($debug_mode && '' != $updraftplus->logfile_name && !in_array($updraftplus->logfile_name, $attachments)) {
@@ -920,7 +968,7 @@ class UpdraftPlus_Backup {
920
 
921
  $subject = apply_filters('updraft_report_subject', sprintf(__('Backed up: %s', 'updraftplus'), get_bloginfo('name')).' (UpdraftPlus '.$updraftplus->version.') '.get_date_from_gmt(gmdate('Y-m-d H:i:s', time()), 'Y-m-d H:i'), $error_count, count($warnings));
922
 
923
- # The class_exists() check here is a micro-optimization to prevent a possible HTTP call whose results may be disregarded by the filter
924
  $feed = '';
925
  if (!class_exists('UpdraftPlus_Addon_Reporting') && !defined('UPDRAFTPLUS_NOADS_B') && !defined('UPDRAFTPLUS_NONEWSFEED')) {
926
  $updraftplus->log('Fetching RSS news feed');
@@ -932,7 +980,7 @@ class UpdraftPlus_Backup {
932
  $feed .= '* ';
933
  $feed .= $item->get_title();
934
  $feed .= " (".$item->get_date('j F Y').")";
935
- #$feed .= ' - '.$item->get_permalink();
936
  $feed .= "\r\n";
937
  }
938
  }
@@ -954,7 +1002,7 @@ class UpdraftPlus_Backup {
954
  // Make it available to the filter
955
  $jobdata['remotestorage_extrainfo'] = $this->remotestorage_extrainfo;
956
 
957
- if (!class_exists('UpdraftPlus_Notices')) require_once(UPDRAFTPLUS_DIR.'/includes/updraftplus-notices.php');
958
  global $updraftplus_notices;
959
  $ws_advert = $updraftplus_notices->do_notice(false, 'report-plain', true);
960
 
@@ -968,7 +1016,11 @@ class UpdraftPlus_Backup {
968
  $feed.
969
  $ws_advert."\r\n".
970
  $append_log,
971
- $final_message, $backup_contains, $updraftplus->errors, $warnings, $jobdata);
 
 
 
 
972
 
973
  $this->attachments = apply_filters('updraft_report_attachments', $attachments);
974
 
@@ -1022,7 +1074,13 @@ class UpdraftPlus_Backup {
1022
 
1023
  }
1024
 
1025
- // The purpose of this function is to make sure that the options table is put in the database first, then the users table, then the site + blogs tables (if present - multisite), then the usermeta table; and after that the core WP tables - so that when restoring we restore the core tables first
 
 
 
 
 
 
1026
  private function backup_db_sorttables($a_arr, $b_arr) {
1027
 
1028
  $a = $a_arr['name'];
@@ -1040,15 +1098,15 @@ class UpdraftPlus_Backup {
1040
  if ($a == $b) return 0;
1041
  $our_table_prefix = $this->table_prefix_raw;
1042
  if ($a == $our_table_prefix.'options') return -1;
1043
- if ($b == $our_table_prefix.'options') return 1;
1044
  if ($a == $our_table_prefix.'site') return -1;
1045
- if ($b == $our_table_prefix.'site') return 1;
1046
  if ($a == $our_table_prefix.'blogs') return -1;
1047
- if ($b == $our_table_prefix.'blogs') return 1;
1048
  if ($a == $our_table_prefix.'users') return -1;
1049
- if ($b == $our_table_prefix.'users') return 1;
1050
  if ($a == $our_table_prefix.'usermeta') return -1;
1051
- if ($b == $our_table_prefix.'usermeta') return 1;
1052
 
1053
  if (empty($our_table_prefix)) return strcmp($a, $b);
1054
 
@@ -1069,7 +1127,7 @@ class UpdraftPlus_Backup {
1069
  }
1070
 
1071
  private function log_account_space() {
1072
- # Don't waste time if space is huge
1073
  if (!empty($this->account_space_oodles)) return;
1074
  global $updraftplus;
1075
  $hosting_bytes_free = $updraftplus->get_hosting_disk_quota_free();
@@ -1079,7 +1137,12 @@ class UpdraftPlus_Backup {
1079
  }
1080
  }
1081
 
1082
- // Returns the basename up to and including the nonce (but not the entity)
 
 
 
 
 
1083
  private function get_backup_file_basename_from_time($use_time) {
1084
  global $updraftplus;
1085
  return 'backup_'.get_date_from_gmt(gmdate('Y-m-d H:i:s', $use_time), 'Y-m-d-Hi').'_'.$this->blog_name.'_'.$updraftplus->nonce;
@@ -1089,12 +1152,12 @@ class UpdraftPlus_Backup {
1089
  $zips = array();
1090
  if ($handle = opendir($dir)) {
1091
  while (false !== ($entry = readdir($handle))) {
1092
- if ($entry != "." && $entry != "..") {
1093
  if (preg_match('/^backup_(\d{4})-(\d{2})-(\d{2})-(\d{2})(\d{2})_.*_([0-9a-f]{12})-([\-a-z]+)([0-9]+)?\.zip$/i', $entry, $matches)) {
1094
  if ($matches[6] !== $match_nonce) continue;
1095
  $timestamp = mktime($matches[4], $matches[5], 0, $matches[2], $matches[3], $matches[1]);
1096
  $entity = $matches[7];
1097
- $index = empty($matches[8]) ? '0': $matches[8];
1098
  $zips[$entity][$index] = array($timestamp, $entry);
1099
  }
1100
  }
@@ -1103,7 +1166,14 @@ class UpdraftPlus_Backup {
1103
  return $zips;
1104
  }
1105
 
1106
- // $files should be an array as returned by find_existing_zips()
 
 
 
 
 
 
 
1107
  private function file_exists($files, $entity, $index = 0) {
1108
  if (isset($files[$entity]) && isset($files[$entity][$index])) {
1109
  $file = $files[$entity][$index];
@@ -1114,7 +1184,12 @@ class UpdraftPlus_Backup {
1114
  }
1115
  }
1116
 
1117
- // This function is resumable
 
 
 
 
 
1118
  private function backup_dirs($job_status) {
1119
 
1120
  global $updraftplus;
@@ -1129,9 +1204,9 @@ class UpdraftPlus_Backup {
1129
  $possible_backups = $updraftplus->get_backupable_file_entities(true);
1130
 
1131
  // Was there a check-in last time? If not, then reduce the amount of data attempted
1132
- if ($job_status != 'finished' && $updraftplus->current_resumption >= 2) {
1133
 
1134
- # NOTYET: Possible amendment to original algorithm; not just no check-in, but if the check in was very early (can happen if we get a very early checkin for some trivial operation, then attempt something too big)
1135
 
1136
 
1137
  // 03-Sep-2015 - came across a case (HS#2052) where there apparently was a check-in 'last time', but no resumption was scheduled because the 'useful_checkin' jobdata was *not* last time - which must indicate dying at a very unfortunate/unlikely point in the code. As a result, the split was not auto-reduced. Consequently, we've added !$updraftplus->newresumption_scheduled as a condition on the first check here (it was already on the second), as if no resumption is scheduled then whatever checkin there was last time was only partial. This was on GoDaddy, for which a number of curious I/O event combinations have been seen in recent months - their platform appears to have some odd behaviour when PHP is killed off.
@@ -1142,7 +1217,7 @@ class UpdraftPlus_Backup {
1142
  $this->try_split = true;
1143
  } elseif ($updraftplus->current_resumption<=10) {
1144
  $maxzipbatch = $updraftplus->jobdata_get('maxzipbatch', 26214400);
1145
- if ((int)$maxzipbatch < 1) $maxzipbatch = 26214400;
1146
 
1147
  $new_maxzipbatch = max(floor($maxzipbatch * 0.75), 20971520);
1148
  if ($new_maxzipbatch < $maxzipbatch) {
@@ -1154,34 +1229,34 @@ class UpdraftPlus_Backup {
1154
  }
1155
  }
1156
 
1157
- if($job_status != 'finished' && !$updraftplus->really_is_writable($this->updraft_dir)) {
1158
  $updraftplus->log("Backup directory (".$this->updraft_dir.") is not writable, or does not exist");
1159
  $updraftplus->log(sprintf(__("Backup directory (%s) is not writable, or does not exist.", 'updraftplus'), $this->updraft_dir), 'error');
1160
  return array();
1161
  }
1162
 
1163
  $this->job_file_entities = $updraftplus->jobdata_get('job_file_entities');
1164
- # This is just used for the visual feedback (via the 'substatus' key)
1165
  $which_entity = 0;
1166
- # e.g. plugins, themes, uploads, others
1167
- # $whichdir might be an array (if $youwhat is 'more')
1168
 
1169
- # Returns an array (keyed off the entity) of ($timestamp, $filename) arrays
1170
  $existing_zips = $this->find_existing_zips($this->updraft_dir, $updraftplus->nonce);
1171
 
1172
  foreach ($possible_backups as $youwhat => $whichdir) {
1173
 
1174
  if (isset($this->job_file_entities[$youwhat])) {
1175
 
1176
- $index = (int)$this->job_file_entities[$youwhat]['index'];
1177
  if (empty($index)) $index=0;
1178
  $indextext = (0 == $index) ? '' : (1+$index);
1179
 
1180
  $zip_file = $this->updraft_dir.'/'.$backup_file_basename.'-'.$youwhat.$indextext.'.zip';
1181
 
1182
- # Split needed?
1183
- $split_every = max((int)$updraftplus->jobdata_get('split_every'), 250);
1184
- //if (file_exists($zip_file) && filesize($zip_file) > $split_every*1048576) {
1185
  if (false != ($existing_file = $this->file_exists($existing_zips, $youwhat, $index)) && filesize($this->updraft_dir.'/'.$existing_file) > $split_every*1048576) {
1186
  $index++;
1187
  $this->job_file_entities[$youwhat]['index'] = $index;
@@ -1215,7 +1290,7 @@ class UpdraftPlus_Backup {
1215
  if ($index > 0) {
1216
  $zip_file = (isset($this->backup_files_array[$youwhat]) && isset($this->backup_files_array[$youwhat][$index])) ? $this->backup_files_array[$youwhat][$index] : $backup_file_basename.'-'.$youwhat.($index+1).'.zip';
1217
 
1218
- //$fbase = $backup_file_basename.'-'.$youwhat.($index+1).'.zip';
1219
  $z = $this->updraft_dir.'/'.$zip_file;
1220
  $fs_key = $youwhat.$index.'-size';
1221
  if (file_exists($z)) {
@@ -1244,9 +1319,9 @@ class UpdraftPlus_Backup {
1244
 
1245
  if ('others' == $youwhat) $updraftplus->log("Beginning backup of other directories found in the content directory (index: $index)");
1246
 
1247
- # Apply a filter to allow add-ons to provide their own method for creating a zip of the entity
1248
  $created = apply_filters('updraftplus_backup_makezip_'.$youwhat, $whichdir, $backup_file_basename, $index);
1249
- # If the filter did not lead to something being created, then use the default method
1250
  if ($created === $whichdir) {
1251
 
1252
  // http://www.phpconcept.net/pclzip/user-guide/53
@@ -1264,12 +1339,12 @@ class UpdraftPlus_Backup {
1264
  $dirlist = $updraftplus->backup_uploads_dirlist(true);
1265
  } else {
1266
  $dirlist = $whichdir;
1267
- if (is_array($dirlist)) $dirlist=array_shift($dirlist);
1268
  }
1269
 
1270
  if (count($dirlist)>0) {
1271
  $created = $this->create_zip($dirlist, $youwhat, $backup_file_basename, $index);
1272
- # Now, store the results
1273
  if (!is_string($created) && !is_array($created)) $updraftplus->log("$youwhat: create_zip returned an error");
1274
  } else {
1275
  $updraftplus->log("No backup of $youwhat: there was nothing found to back up");
@@ -1277,10 +1352,10 @@ class UpdraftPlus_Backup {
1277
  }
1278
 
1279
  if ($created != $whichdir && (is_string($created) || is_array($created))) {
1280
- if (is_string($created)) $created=array($created);
1281
  foreach ($created as $findex => $fname) {
1282
  $backup_array[$youwhat][$index] = $fname;
1283
- $itext = ($index == 0) ? '' : $index;
1284
  $index++;
1285
  $backup_array[$youwhat.$itext.'-size'] = filesize($this->updraft_dir.'/'.$fname);
1286
  }
@@ -1298,18 +1373,24 @@ class UpdraftPlus_Backup {
1298
  return $backup_array;
1299
  }
1300
 
1301
- // This uses a saved status indicator; its only purpose is to indicate *total* completion; there is no actual danger, just wasted time, in resuming when it was not needed. So the saved status indicator just helps save resources.
 
 
 
 
 
1302
  public function resumable_backup_of_files($resumption_no) {
1303
  global $updraftplus;
1304
  // Backup directories and return a numerically indexed array of file paths to the backup files
1305
  $bfiles_status = $updraftplus->jobdata_get('backup_files');
1306
- $this->backup_files_array = $updraftplus->jobdata_get('backup_files_array');;
 
1307
  if (!is_array($this->backup_files_array)) $this->backup_files_array = array();
1308
  if ('finished' == $bfiles_status) {
1309
  $updraftplus->log("Creation of backups of directories: already finished");
1310
- # Check for recent activity
1311
  foreach ($this->backup_files_array as $files) {
1312
- if (!is_array($files)) $files=array($files);
1313
  foreach ($files as $file) $updraftplus->check_recent_modification($this->updraft_dir.'/'.$file);
1314
  }
1315
  } elseif ('begun' == $bfiles_status) {
@@ -1325,7 +1406,7 @@ class UpdraftPlus_Backup {
1325
  $updraftplus->jobdata_set('backup_files', 'finished');
1326
  $updraftplus->jobdata_set('jobstatus', 'filescreated');
1327
  } else {
1328
- # This is not necessarily a backup run which is meant to contain files at all
1329
  $updraftplus->log('This backup run is not intended for files - skipping');
1330
  return array();
1331
  }
@@ -1357,12 +1438,17 @@ class UpdraftPlus_Backup {
1357
  return $this->backup_files_array;
1358
  }
1359
 
1360
- /* This function is resumable, using the following method:
1361
- - Each table is written out to ($final_filename).table.tmp
1362
- - When the writing finishes, it is renamed to ($final_filename).table
1363
- - When all tables are finished, they are concatenated into the final file
1364
- */
1365
- // dbinfo is only used when whichdb != 'wp'; and the keys should be: user, pass, name, host, prefix
 
 
 
 
 
1366
  public function backup_db($already_done = 'begun', $whichdb = 'wp', $dbinfo = array()) {
1367
 
1368
  global $updraftplus, $wpdb;
@@ -1375,9 +1461,9 @@ class UpdraftPlus_Backup {
1375
 
1376
  if ('wp' == $this->whichdb) {
1377
  $this->wpdb_obj = $wpdb;
1378
- # The table prefix after being filtered - i.e. what filters what we'll actually back up
1379
  $this->table_prefix = $updraftplus->get_table_prefix(true);
1380
- # The unfiltered table prefix - i.e. the real prefix that things are relative to
1381
  $this->table_prefix_raw = $updraftplus->get_table_prefix(false);
1382
  $dbinfo['host'] = DB_HOST;
1383
  $dbinfo['name'] = DB_NAME;
@@ -1385,7 +1471,7 @@ class UpdraftPlus_Backup {
1385
  $dbinfo['pass'] = DB_PASSWORD;
1386
  } else {
1387
  if (!is_array($dbinfo) || empty($dbinfo['host'])) return false;
1388
- # The methods that we may use: check_connection (WP>=3.9), get_results, get_row, query
1389
  $this->wpdb_obj = new UpdraftPlus_WPDB_OtherDB($dbinfo['user'], $dbinfo['pass'], $dbinfo['name'], $dbinfo['host']);
1390
  if (!empty($this->wpdb_obj->error)) {
1391
  $updraftplus->log($dbinfo['user'].'@'.$dbinfo['host'].'/'.$dbinfo['name'].' : database connection attempt failed');
@@ -1413,7 +1499,7 @@ class UpdraftPlus_Backup {
1413
 
1414
  $total_tables = 0;
1415
 
1416
- # WP 3.9 onwards - https://core.trac.wordpress.org/browser/trunk/src/wp-includes/wp-db.php?rev=27925 - check_connection() allows us to get the database connection back if it had dropped
1417
  if ('wp' == $whichdb && method_exists($this->wpdb_obj, 'check_connection') && (!defined('UPDRAFTPLUS_SUPPRESS_CONNECTION_CHECKS') || !UPDRAFTPLUS_SUPPRESS_CONNECTION_CHECKS)) {
1418
  if (!$this->wpdb_obj->check_connection(false)) {
1419
  $updraftplus->reschedule(60);
@@ -1433,7 +1519,7 @@ class UpdraftPlus_Backup {
1433
  $all_tables = array_map(array($this, 'cb_get_name_type'), $all_tables);
1434
  }
1435
 
1436
- # If this is not the WP database, then we do not consider it a fatal error if there are no tables
1437
  if ('wp' == $whichdb && 0 == count($all_tables)) {
1438
  $extra = ($updraftplus->newresumption_scheduled) ? ' - '.__('please wait for the rescheduled attempt', 'updraftplus') : '';
1439
  $updraftplus->log("Error: No WordPress database tables found (SHOW TABLES returned nothing)".$extra);
@@ -1449,10 +1535,10 @@ class UpdraftPlus_Backup {
1449
  if (!$updraftplus->really_is_writable($this->updraft_dir)) {
1450
  $updraftplus->log("The backup directory (".$this->updraft_dir.") could not be written to (could be account/disk space full, or wrong permissions).");
1451
  $updraftplus->log($this->updraft_dir.": ".__('The backup directory is not writable (or disk space is full) - the database backup is expected to shortly fail.', 'updraftplus'), 'warning');
1452
- # Why not just fail now? We saw a bizarre case when the results of really_is_writable() changed during the run.
1453
  }
1454
 
1455
- # This check doesn't strictly get all possible duplicates; it's only designed for the case that can happen when moving between deprecated Windows setups and Linux
1456
  $this->duplicate_tables_exist = false;
1457
  foreach ($all_table_names as $table) {
1458
  if (strtolower($table) != $table && in_array(strtolower($table), $all_table_names)) {
@@ -1488,7 +1574,7 @@ class UpdraftPlus_Backup {
1488
  $stitch_files[] = $table_file_prefix;
1489
  } else {
1490
  // === is needed, otherwise 'false' matches (i.e. prefix does not match)
1491
- if (empty($this->table_prefix) || ($this->duplicate_tables_exist == false && stripos($table, $this->table_prefix) === 0 ) || ($this->duplicate_tables_exist == true && strpos($table, $this->table_prefix) === 0)) {
1492
 
1493
  if (!apply_filters('updraftplus_backup_table', true, $table, $this->table_prefix, $whichdb, $dbinfo)) {
1494
  $updraftplus->log("Skipping table (filtered): $table");
@@ -1516,7 +1602,7 @@ class UpdraftPlus_Backup {
1516
  if (false === $opened) return false;
1517
 
1518
  // Create the SQL statements
1519
- $this->stow("# " . sprintf('Table: %s' ,$updraftplus->backquote($table)) . "\n");
1520
  $updraftplus->jobdata_set('dbcreating_substatus', array('t' => $table, 'i' => $total_tables, 'a' => $how_many_tables));
1521
 
1522
  $table_status = $this->wpdb_obj->get_row("SHOW TABLE STATUS WHERE Name='$table'");
@@ -1531,7 +1617,7 @@ class UpdraftPlus_Backup {
1531
  }
1532
 
1533
  // Don't include the job data for any backups - so that when the database is restored, it doesn't continue an apparently incomplete backup
1534
- if ('wp' == $this->whichdb && (!empty($this->table_prefix) && strtolower($this->table_prefix.'sitemeta') == strtolower($table))) {
1535
  $where = 'meta_key NOT LIKE "updraft_jobdata_%"';
1536
  } elseif ('wp' == $this->whichdb && (!empty($this->table_prefix) && strtolower($this->table_prefix.'options') == strtolower($table))) {
1537
  if (strtolower(substr(PHP_OS, 0, 3)) == 'win') {
@@ -1550,7 +1636,7 @@ class UpdraftPlus_Backup {
1550
  // If no check-in last time, then we could in future try the other method (but - any point in retrying slow method on large tables??)
1551
 
1552
  // New Jul 2014: This attempt to use bindump instead at a lower threshold is quite conservative - only if the last successful run was exactly two resumptions ago - may be useful to expand
1553
- $bindump_threshold = (!$updraftplus->something_useful_happened && !empty($updraftplus->current_resumption) && ($updraftplus->current_resumption - $updraftplus->last_successful_resumption == 2)) ? 1000 : 8000;
1554
 
1555
  $bindump = (isset($rows) && ($rows>$bindump_threshold || (defined('UPDRAFTPLUS_ALWAYS_TRY_MYSQLDUMP') && UPDRAFTPLUS_ALWAYS_TRY_MYSQLDUMP)) && is_string($binsqldump)) ? $this->backup_table_bindump($binsqldump, $table, $where) : false;
1556
  if (true !== $bindump) $this->backup_table($table, $where, 'none', $table_type);
@@ -1582,8 +1668,8 @@ class UpdraftPlus_Backup {
1582
  }
1583
  $time_this_run = time()-$updraftplus->opened_log_time;
1584
  if ($time_this_run > 2000) {
1585
- # Have seen this happen; not sure how, but it was apparently deterministic; if the current process had been running for a long time, then apparently all database commands silently failed.
1586
- # If we have been running that long, then the resumption may be far off; bring it closer
1587
  $updraftplus->reschedule(60);
1588
  $updraftplus->log("Have been running very long, and it seems the database went away; scheduling a resumption and terminating for now");
1589
  $updraftplus->record_still_alive();
@@ -1597,7 +1683,7 @@ class UpdraftPlus_Backup {
1597
  // Race detection - with zip files now being resumable, these can more easily occur, with two running side-by-side
1598
  $backup_final_file_name = $backup_file_base.'-db'.$this->whichdb_suffix.'.gz';
1599
  $time_now = time();
1600
- $time_mod = (int)@filemtime($backup_final_file_name);
1601
  if (file_exists($backup_final_file_name) && $time_mod>100 && ($time_now-$time_mod)<30) {
1602
  $updraftplus->terminate_due_to_activity($backup_final_file_name, $time_now, $time_mod);
1603
  }
@@ -1629,13 +1715,15 @@ class UpdraftPlus_Backup {
1629
  $updraftplus->log(__("Failed to open database file for reading:", 'updraftplus').' '.$table_file.'.gz', 'error');
1630
  $errors++;
1631
  } else {
1632
- while ($line = gzgets($handle, 65536)) { $this->stow($line); }
 
 
1633
  gzclose($handle);
1634
  $unlink_files[] = $this->updraft_dir.'/'.$table_file.'.gz';
1635
  }
1636
  $sind++;
1637
  // Came across a database with 7600 tables... adding them all took over 500 seconds; and so when the resumption started up, no activity was detected
1638
- if ($sind % 100 == 0) $updraftplus->something_useful_happened();
1639
  }
1640
 
1641
  if (defined('DB_CHARSET') && DB_CHARSET) {
@@ -1685,13 +1773,13 @@ class UpdraftPlus_Backup {
1685
 
1686
  // Deal with Windows/old MySQL setups with erroneous table prefixes differing in case
1687
  // Can't get binary mysqldump to make this transformation
1688
- // $dump_as_table = ($this->duplicate_tables_exist == false && stripos($table, $this->table_prefix) === 0 && strpos($table, $this->table_prefix) !== 0) ? $this->table_prefix.substr($table, strlen($this->table_prefix)) : $table;
1689
 
1690
  $pfile = md5(time().rand()).'.tmp';
1691
  file_put_contents($this->updraft_dir.'/'.$pfile, "[mysqldump]\npassword=".$this->dbinfo['pass']."\n");
1692
 
1693
  // Note: escapeshellarg() adds quotes around the string
1694
- if ($where) $where="--where=".escapeshellarg($where);
1695
 
1696
  if (strtolower(substr(PHP_OS, 0, 3)) == 'win') {
1697
  $exec = "cd ".escapeshellarg(str_replace('/', '\\', $this->updraft_dir))." & ";
@@ -1715,12 +1803,12 @@ class UpdraftPlus_Backup {
1715
  }
1716
  }
1717
  $ret = pclose($handle);
1718
- if ($ret != 0) {
1719
  $updraftplus->log("Binary mysqldump: error (code: $ret)");
1720
  // Keep counter of failures? Change value of binsqldump?
1721
  } else {
1722
  if ($any_output) {
1723
- $updraftplus->log("Table $table_name: binary mysqldump finished (writes: $writes) in ".sprintf("%.02f",max(microtime(true)-$microtime,0.00001))." seconds");
1724
  $ret = true;
1725
  }
1726
  }
@@ -1736,16 +1824,15 @@ class UpdraftPlus_Backup {
1736
  }
1737
 
1738
  /**
1739
- * Taken partially from phpMyAdmin and partially from
1740
- * Alain Wolf, Zurich - Switzerland
1741
  * Website: http://restkultur.ch/personal/wolf/scripts/db_backup/
1742
- * Modified by Scott Merrill (http://www.skippy.net/)
1743
- * to use the WordPress $wpdb object
1744
- * @param String $table
1745
- * @param String $where
1746
- * @param String $segment
1747
- * @param String $table_type
1748
- * @return void
1749
  */
1750
  private function backup_table($table, $where = '', $segment = 'none', $table_type = 'BASE TABLE') {
1751
  global $updraftplus;
@@ -1754,15 +1841,15 @@ class UpdraftPlus_Backup {
1754
  $total_rows = 0;
1755
 
1756
  // Deal with Windows/old MySQL setups with erroneous table prefixes differing in case
1757
- $dump_as_table = ($this->duplicate_tables_exist == false && stripos($table, $this->table_prefix) === 0 && strpos($table, $this->table_prefix) !== 0) ? $this->table_prefix.substr($table, strlen($this->table_prefix)) : $table;
1758
 
1759
  $table_structure = $this->wpdb_obj->get_results("DESCRIBE ".$updraftplus->backquote($table));
1760
  if (!$table_structure) {
1761
- //$updraftplus->log(__('Error getting table details','wp-db-backup') . ": $table", 'error');
1762
  return false;
1763
  }
1764
 
1765
- if ('none' == $segment|| 0 == $segment) {
1766
  // Add SQL statement to drop existing table
1767
  $this->stow("\n# Delete any existing table ".$updraftplus->backquote($table)."\n\n");
1768
  $this->stow("DROP TABLE IF EXISTS " . $updraftplus->backquote($dump_as_table) . ";\n");
@@ -1781,12 +1868,12 @@ class UpdraftPlus_Backup {
1781
  $create_table = $this->wpdb_obj->get_results("SHOW CREATE TABLE ".$updraftplus->backquote($table), ARRAY_N);
1782
  if (false === $create_table) {
1783
  $err_msg ='Error with SHOW CREATE TABLE for '.$table;
1784
- //$updraftplus->log($err_msg, 'error');
1785
  $this->stow("#\n# $err_msg\n#\n");
1786
  }
1787
  $create_line = $updraftplus->str_lreplace('TYPE=', 'ENGINE=', $create_table[0][1]);
1788
 
1789
- # Remove PAGE_CHECKSUM parameter from MyISAM - was internal, undocumented, later removed (so causes errors on import)
1790
  if (preg_match('/ENGINE=([^\s;]+)/', $create_line, $eng_match)) {
1791
  $engine = $eng_match[1];
1792
  if ('myisam' == strtolower($engine)) {
@@ -1808,7 +1895,7 @@ class UpdraftPlus_Backup {
1808
 
1809
  }
1810
 
1811
- # Some tables have optional data, and should be skipped if they do not work
1812
  $table_sans_prefix = substr($table, strlen($this->table_prefix_raw));
1813
  $data_optional_tables = ('wp' == $this->whichdb) ? apply_filters('updraftplus_data_optional_tables', explode(',', UPDRAFTPLUS_DATA_OPTIONAL_TABLES)) : array();
1814
  if (in_array($table_sans_prefix, $data_optional_tables)) {
@@ -1819,13 +1906,14 @@ class UpdraftPlus_Backup {
1819
  }
1820
 
1821
  // In UpdraftPlus, segment is always 'none'
1822
- if ('VIEW' != $table_type && ('none' == $segment|| 0 <= $segment)) {
1823
  $defs = array();
1824
  $integer_fields = array();
1825
  // $table_structure was from "DESCRIBE $table"
1826
  foreach ($table_structure as $struct) {
1827
- if ((0 === strpos($struct->Type, 'tinyint')) || (0 === strpos(strtolower($struct->Type), 'smallint')) ||
1828
- (0 === strpos(strtolower($struct->Type), 'mediumint')) || (0 === strpos(strtolower($struct->Type), 'int')) || (0 === strpos(strtolower($struct->Type), 'bigint')) ) {
 
1829
  $defs[strtolower($struct->Field)] = (null === $struct->Default ) ? 'NULL' : $struct->Default;
1830
  $integer_fields[strtolower($struct->Field)] = "1";
1831
  }
@@ -1835,7 +1923,7 @@ class UpdraftPlus_Backup {
1835
 
1836
  $increment = 1000;
1837
  if (!$updraftplus->something_useful_happened && !empty($updraftplus->current_resumption) && ($updraftplus->current_resumption - $updraftplus->last_successful_resumption > 1)) {
1838
- # This used to be fixed at 500; but we (after a long time) saw a case that looked like an out-of-memory even at this level. We must be careful about going too low, though - otherwise we increase the risks of timeouts.
1839
  $increment = ($updraftplus->current_resumption - $updraftplus->last_successful_resumption > 2) ? 350 : 500;
1840
  }
1841
 
@@ -1857,8 +1945,8 @@ class UpdraftPlus_Backup {
1857
 
1858
  $table_data = $this->wpdb_obj->get_results("SELECT * FROM ".$updraftplus->backquote($table)." $where LIMIT {$row_start}, {$row_inc}", ARRAY_A);
1859
  $entries = 'INSERT INTO '.$updraftplus->backquote($dump_as_table).' VALUES ';
1860
- // \x08\\x09, not required
1861
- if($table_data) {
1862
  $thisentry = "";
1863
  foreach ($table_data as $row) {
1864
  $total_rows++;
@@ -1888,17 +1976,22 @@ class UpdraftPlus_Backup {
1888
  } while (count($table_data) > 0 && 'none' == $segment);
1889
  }
1890
 
1891
- if ($segment == 'none' || $segment < 0) {
1892
  // Create footer/closing comment in SQL-file
1893
  $this->stow("\n# End of data contents of table ".$updraftplus->backquote($table)."\n\n");
1894
  }
1895
- $updraftplus->log("Table $table: Total rows added: $total_rows in ".sprintf("%.02f", max(microtime(true)-$microtime, 0.00001))." seconds");
1896
 
1897
  }
1898
 
1899
  /*END OF WP-DB-BACKUP BLOCK */
1900
 
1901
- // Encrypts the file if the option is set; returns the basename of the file (according to whether it was encrypted or nto)
 
 
 
 
 
1902
  public function encrypt_file($file) {
1903
  global $updraftplus;
1904
  $encryption = UpdraftPlus_Options::get_updraft_option('updraft_encryptionphrase');
@@ -1925,8 +2018,8 @@ class UpdraftPlus_Backup {
1925
  die();
1926
  }
1927
  if (null === $result) {
1928
- // $updraftplus->log(sprintf(__("As previously warned (see: %s), encryption is no longer a feature of the free edition of UpdraftPlus", 'updraftplus'), 'https://updraftplus.com/next-updraftplus-release-ready-testing/ + https://updraftplus.com/shop/updraftplus-premium/'), 'warning', 'needpremiumforcrypt');
1929
- // UpdraftPlus_Options::update_updraft_option('updraft_encryptionphrase', '');
1930
  return basename($file);
1931
  }
1932
  return $result;
@@ -1939,19 +2032,25 @@ class UpdraftPlus_Backup {
1939
  return ($this->dbhandle_isgz) ? gzclose($this->dbhandle) : fclose($this->dbhandle);
1940
  }
1941
 
1942
- // Open a file, store its filehandle
 
 
 
 
 
 
1943
  public function backup_db_open($file, $allow_gz = true) {
1944
- if (function_exists('gzopen') && $allow_gz == true) {
1945
  $this->dbhandle = @gzopen($file, 'w');
1946
  $this->dbhandle_isgz = true;
1947
  } else {
1948
  $this->dbhandle = @fopen($file, 'w');
1949
  $this->dbhandle_isgz = false;
1950
  }
1951
- if(false === $this->dbhandle) {
1952
  global $updraftplus;
1953
  $updraftplus->log("ERROR: $file: Could not open the backup file for writing");
1954
- $updraftplus->log($file.": ".__("Could not open the backup file for writing",'updraftplus'), 'error');
1955
  }
1956
  return $this->dbhandle;
1957
  }
@@ -1966,11 +2065,11 @@ class UpdraftPlus_Backup {
1966
  public function stow($query_line) {
1967
  if ($this->dbhandle_isgz) {
1968
  if (false == ($ret = @gzwrite($this->dbhandle, $query_line))) {
1969
- //$updraftplus->log(__('There was an error writing a line to the backup script:','wp-db-backup').' '.$query_line.' '.$php_errormsg, 'error');
1970
  }
1971
  } else {
1972
  if (false == ($ret = @fwrite($this->dbhandle, $query_line))) {
1973
- //$updraftplus->log(__('There was an error writing a line to the backup script:','wp-db-backup').' '.$query_line.' '.$php_errormsg, 'error');
1974
  }
1975
  }
1976
  return $ret;
@@ -1982,7 +2081,7 @@ class UpdraftPlus_Backup {
1982
  include(ABSPATH.WPINC.'/version.php');
1983
 
1984
  $mysql_version = $this->wpdb_obj->db_version();
1985
- # (function_exists('mysql_get_server_info')) ? @mysql_get_server_info() : '?';
1986
 
1987
  if ('wp' == $this->whichdb) {
1988
  $wp_upload_dir = wp_upload_dir();
@@ -2010,8 +2109,7 @@ class UpdraftPlus_Backup {
2010
  $label = $updraftplus->jobdata_get('label');
2011
  if (!empty($label)) $this->stow("# Label: $label\n");
2012
 
2013
- $this->stow("#\n");
2014
- $this->stow("# Generated: ".date("l j. F Y H:i T")."\n");
2015
  $this->stow("# Hostname: ".$this->dbinfo['host']."\n");
2016
  $this->stow("# Database: ".$updraftplus->backquote($this->dbinfo['name'])."\n");
2017
 
@@ -2034,6 +2132,7 @@ class UpdraftPlus_Backup {
2034
  $this->stow("/*!40101 SET foreign_key_checks = 0 */;\n\n");
2035
  }
2036
 
 
2037
  public function phpmailer_init($phpmailer) {
2038
  global $updraftplus;
2039
  if (empty($this->attachments) || !is_array($this->attachments)) return;
@@ -2047,11 +2146,19 @@ class UpdraftPlus_Backup {
2047
  }
2048
  }
2049
 
2050
- // This function recursively packs the zip, dereferencing symlinks but packing into a single-parent tree for universal unpacking
2051
- // $exclude is passed by reference so that we can remove elements as they are matched - saves time checking against already-dealt-with objects
 
 
 
 
 
 
 
 
2052
  private function makezip_recursive_add($fullpath, $use_path_when_storing, $original_fullpath, $startlevels = 1, &$exclude) {
2053
 
2054
- // $zipfile = $this->zip_basename.(($this->index == 0) ? '' : ($this->index+1)).'.zip.tmp';
2055
 
2056
  global $updraftplus;
2057
 
@@ -2068,11 +2175,11 @@ class UpdraftPlus_Backup {
2068
  // Is the place we've ended up above the original base? That leads to infinite recursion
2069
  if (($fullpath !== $original_fullpath && strpos($original_fullpath, $fullpath) === 0) || ($original_fullpath == $fullpath && ((1== $startlevels && strpos($use_path_when_storing, '/') !== false) || (2 == $startlevels && substr_count($use_path_when_storing, '/') >1)))) {
2070
  $updraftplus->log("Infinite recursion: symlink led us to $fullpath, which is within $original_fullpath");
2071
- $updraftplus->log(__("Infinite recursion: consult your log for more information",'updraftplus'), 'error');
2072
  return false;
2073
  }
2074
 
2075
- # This is sufficient for the ones we have exclude options for - uploads, others, wpcore
2076
  $stripped_storage_path = (1 == $startlevels) ? $use_path_when_storing : substr($use_path_when_storing, strpos($use_path_when_storing, '/') + 1);
2077
  if (false !== ($fkey = array_search($stripped_storage_path, $exclude))) {
2078
  $updraftplus->log("Entity excluded by configuration option: $stripped_storage_path");
@@ -2095,7 +2202,7 @@ class UpdraftPlus_Backup {
2095
  if ($mtime > 0 && $mtime > $if_altered_since) {
2096
  $this->zipfiles_batched[$fullpath] = $key;
2097
  $this->makezip_recursive_batchedbytes += @filesize($fullpath);
2098
- #@touch($zipfile);
2099
  } else {
2100
  $this->zipfiles_skipped_notaltered[$fullpath] = $key;
2101
  }
@@ -2123,7 +2230,7 @@ class UpdraftPlus_Backup {
2123
 
2124
  if (!$dir_handle = @opendir($fullpath)) {
2125
  $updraftplus->log("Failed to open directory: $fullpath");
2126
- $updraftplus->log(sprintf(__("Failed to open directory (check the file permissions and ownership): %s",'updraftplus'), $fullpath), 'error');
2127
  return false;
2128
  }
2129
 
@@ -2149,7 +2256,7 @@ class UpdraftPlus_Backup {
2149
  if ($mtime > 0 && $mtime > $if_altered_since) {
2150
  $this->zipfiles_batched[$deref] = $use_path_when_storing.'/'.$e;
2151
  $this->makezip_recursive_batchedbytes += @filesize($deref);
2152
- #@touch($zipfile);
2153
  } else {
2154
  $this->zipfiles_skipped_notaltered[$deref] = $use_path_when_storing.'/'.$e;
2155
  }
@@ -2160,8 +2267,8 @@ class UpdraftPlus_Backup {
2160
  }
2161
  } elseif (is_dir($deref)) {
2162
 
2163
- // $link_target = readlink($deref);
2164
- // $updraftplus->log("Symbolic link $use_path_when_storing/$e -> $link_target");
2165
 
2166
  $this->makezip_recursive_add($deref, $use_path_when_storing.'/'.$e, $original_fullpath, $startlevels, $exclude);
2167
  }
@@ -2278,8 +2385,17 @@ class UpdraftPlus_Backup {
2278
  return unserialize($var);
2279
  }
2280
 
2281
- // Caution: $source is allowed to be an array, not just a filename
2282
- // $destination is the temporary file (ending in .tmp)
 
 
 
 
 
 
 
 
 
2283
  private function make_zipfile($source, $backup_file_basename, $whichone, $retry_on_error = true) {
2284
 
2285
  global $updraftplus;
@@ -2291,7 +2407,7 @@ class UpdraftPlus_Backup {
2291
  $destination = $this->updraft_dir.'/'.$destination_base;
2292
 
2293
  // Legacy/redundant
2294
- //if (empty($whichone) && is_string($whichone)) $whichone = basename($source);
2295
 
2296
  // When to prefer PCL:
2297
  // - We were asked to
@@ -2300,21 +2416,21 @@ class UpdraftPlus_Backup {
2300
 
2301
  // We need meta-info about $whichone
2302
  $backupable_entities = $updraftplus->get_backupable_file_entities(true, false);
2303
- # This is only used by one corner-case in BinZip
2304
- #$this->make_zipfile_source = (isset($backupable_entities[$whichone])) ? $backupable_entities[$whichone] : $source;
2305
  $this->make_zipfile_source = (is_array($source) && isset($backupable_entities[$whichone])) ? (('uploads' == $whichone) ? dirname($backupable_entities[$whichone]) : $backupable_entities[$whichone]) : dirname($source);
2306
 
2307
  $this->existing_files = array();
2308
- # Used for tracking compression ratios
2309
  $this->existing_files_rawsize = 0;
2310
  $this->existing_zipfiles_size = 0;
2311
 
2312
  // Enumerate existing files
2313
  // Usually first_linked_index is zero; the exception being with more files, where previous zips' contents are irrelevant
2314
  for ($j=$this->first_linked_index; $j<=$this->index; $j++) {
2315
- $jtext = ($j == 0) ? '' : ($j+1);
2316
- # This is, in a non-obvious way, compatible with filenames which indicate increments
2317
- # $j does not need to start at zero; it should start at the index which the current entity split at. However, this is not directly known, and can only be deduced from examining the filenames. And, for other indexes from before the current increment, the searched-for filename won't exist (even if there is no cloud storage). So, this indirectly results in the desired outcome when we start from $j=0.
2318
  $examine_zip = $this->updraft_dir.'/'.$backup_file_basename.'-'.$whichone.$jtext.'.zip'.(($j == $this->index) ? '.tmp' : '');
2319
 
2320
  // This comes from https://wordpress.org/support/topic/updraftplus-not-moving-all-files-to-remote-server - where it appears that the jobdata's record of the split was done (i.e. database write), but the *earlier* rename of the .tmp file was not done (i.e. I/O lost). i.e. In theory, this should be impossible; but, the sychnronicity apparently cannot be fully relied upon in some setups. The check for the index being one behind is being conservative - there's no inherent reason why it couldn't be done for other indexes.
@@ -2341,8 +2457,7 @@ class UpdraftPlus_Backup {
2341
  $updraftplus->log("Could not open zip file to examine (".$zip->last_error."); will remove: ".basename($examine_zip));
2342
  @unlink($examine_zip);
2343
  } else {
2344
-
2345
- # Don't put this in the for loop, or the magic __get() method gets called and opens the zip file every time the loop goes round
2346
  $numfiles = $zip->numFiles;
2347
 
2348
  for ($i=0; $i < $numfiles; $i++) {
@@ -2357,17 +2472,17 @@ class UpdraftPlus_Backup {
2357
 
2358
  $updraftplus->log(basename($examine_zip).": Zip file already exists, with ".count($this->existing_files)." files");
2359
 
2360
- # try_split is set if there have been no check-ins recently - or if it needs to be split anyway
2361
  if ($j == $this->index) {
2362
  if (isset($this->try_split)) {
2363
  if (filesize($examine_zip) > 50*1048576) {
2364
- # We could, as a future enhancement, save this back to the job data, if we see a case that needs it
2365
  $this->zip_split_every = max(
2366
- (int)$this->zip_split_every/2,
2367
  UPDRAFTPLUS_SPLIT_MIN*1048576,
2368
  min(filesize($examine_zip)-1048576, $this->zip_split_every)
2369
  );
2370
- $updraftplus->jobdata_set('split_every', (int)($this->zip_split_every/1048576));
2371
  $updraftplus->log("No check-in on last two runs; bumping index and reducing zip split to: ".round($this->zip_split_every/1048576, 1)." MB");
2372
  $do_bump_index = true;
2373
  }
@@ -2398,10 +2513,10 @@ class UpdraftPlus_Backup {
2398
 
2399
  $error_occurred = false;
2400
 
2401
- # Store this in its original form
2402
  $this->source = $source;
2403
 
2404
- # Reset. This counter is used only with PcLZip, to decide if it's better to do it all-in-one
2405
  $this->makezip_recursive_batchedbytes = 0;
2406
  if (!is_array($source)) $source=array($source);
2407
 
@@ -2427,7 +2542,9 @@ class UpdraftPlus_Backup {
2427
  // Cache files exist; shall we use them?
2428
  $mtime = filemtime($cache_file_base.'-zfd.gz.tmp');
2429
  // Require < 30 minutes old
2430
- if (time() - $mtime < 1800) { $use_cache_files = true; }
 
 
2431
  $any_failures = false;
2432
  if ($use_cache_files) {
2433
  $var = $this->unserialize_gz_cache_file($cache_file_base.'-zfd.gz.tmp');
@@ -2440,7 +2557,7 @@ class UpdraftPlus_Backup {
2440
  $var = maybe_unserialize(file_get_contents($cache_file_base.'-info.tmp'));
2441
  if (is_array($var) && isset($var['makezip_recursive_batchedbytes'])) {
2442
  $this->makezip_recursive_batchedbytes = $var['makezip_recursive_batchedbytes'];
2443
- if (file_exists($cache_file_base.'-zfs.gz.tmp')) {~
2444
  $var = $this->unserialize_gz_cache_file($cache_file_base.'-zfs.gz.tmp');
2445
  if (is_array($var)) {
2446
  $this->zipfiles_skipped_notaltered = $var;
@@ -2481,7 +2598,7 @@ class UpdraftPlus_Backup {
2481
  $this->excluded_prefixes = $this->get_excluded_prefixes($exclude);
2482
 
2483
  foreach ($source as $element) {
2484
- #makezip_recursive_add($fullpath, $use_path_when_storing, $original_fullpath, $startlevels = 1, $exclude_array)
2485
  if ('uploads' == $whichone) {
2486
  if (empty($got_uploads_from_cache)) {
2487
  $dirname = dirname($element);
@@ -2504,13 +2621,15 @@ class UpdraftPlus_Backup {
2504
 
2505
  // Cache the file scan, if it looks like it'll be useful
2506
  // We use gzip to reduce the size as on hosts which limit disk I/O, the cacheing may make things worse
2507
- // || 'others' == $whichone
2508
- if (('uploads' == $whichone|| 'others' == $whichone) && !$error_occurred && function_exists('gzopen') && function_exists('gzwrite')) {
2509
  $cache_file_base = $this->zip_basename.'-cachelist-'.$this->makezip_if_altered_since;
2510
 
2511
  // Just approximate - we're trying to avoid an otherwise-unpredictable PHP fatal error. Cacheing only happens if file enumeration took a long time - so presumably there are very many.
2512
  $memory_needed_estimate = 0;
2513
- foreach ($this->zipfiles_batched as $k => $v) { $memory_needed_estimate += strlen($k)+strlen($v)+12; }
 
 
2514
 
2515
  // We haven't bothered to check if we just fetched the files from cache, as that shouldn't take a long time and so shouldn't trigger this
2516
  // Let us suppose we need 15% overhead for gzipping
@@ -2536,9 +2655,9 @@ class UpdraftPlus_Backup {
2536
  $final = gzwrite($whandle, $buf);
2537
  unset($buf);
2538
 
2539
- // $serialised = serialize($this->zipfiles_batched);
2540
- // $updraftplus->log("Actual uncompressed bytes: ".round(strlen($serialised)/1024, 1)." Kb");
2541
- // if (!gzwrite($whandle, $serialised)) {
2542
  if (!$final) {
2543
  @unlink($cache_file_base.'-zfb.gz.tmp');
2544
  @gzclose($whandle);
@@ -2576,6 +2695,7 @@ class UpdraftPlus_Backup {
2576
  @unlink($cache_file_base.'-zfd.gz.tmp');
2577
  @unlink($cache_file_base.'-zfb.gz.tmp');
2578
  @unlink($cache_file_base.'-info.tmp');
 
2579
  } else {
2580
  // Success.
2581
  }
@@ -2606,7 +2726,7 @@ class UpdraftPlus_Backup {
2606
 
2607
  if (count($this->zipfiles_dirbatched) > 0 || count($this->zipfiles_batched) > 0) {
2608
 
2609
- $updraftplus->log(sprintf("Total entities for the zip file: %d directories, %d files (%d skipped as non-modified), %s MB", count($this->zipfiles_dirbatched), count($this->zipfiles_batched), count($this->zipfiles_skipped_notaltered), round($this->makezip_recursive_batchedbytes/1048576,1)));
2610
 
2611
  // No need to warn if we're going to retry anyway. (And if we get killed, the zip will be rescanned for its contents upon resumption).
2612
  $warn_on_failures = ($retry_on_error) ? false : true;
@@ -2644,8 +2764,8 @@ class UpdraftPlus_Backup {
2644
 
2645
  // zipfiles_added > 0 means that $zip->close() has been called. i.e. An attempt was made to add something: something _should_ be there.
2646
  // Why return true even if $error_occurred may be set? 1) Because in that case, a warning has already been logged. 2) Because returning false causes an error to be logged, which means it'll all be retried again. Also 3) this has been the pattern of the code for a long time, and the algorithm has been proven in the real-world: don't change what's not broken.
2647
- // (file_exists($destination) || $this->index == $original_index) might be an alternative to $this->zipfiles_added > 0 - ? But, don't change what's not broken.
2648
- if ($error_occurred == false || $this->zipfiles_added > 0) {
2649
  return true;
2650
  } else {
2651
  $updraftplus->log("makezip failure: zipfiles_added=".$this->zipfiles_added.", error_occurred=".$error_occurred." (method=".$this->use_zip_object.")");
@@ -2655,7 +2775,7 @@ class UpdraftPlus_Backup {
2655
  }
2656
 
2657
  private function basename($element) {
2658
- # This function is an ugly, conservative workaround for https://bugs.php.net/bug.php?id=62119. It does not aim to always work-around, but to ensure that nothing is made worse.
2659
  $dirname = dirname($element);
2660
  $basename_manual = preg_replace('#^[\\/]+#', '', substr($element, strlen($dirname)));
2661
  $basename = basename($element);
@@ -2680,73 +2800,162 @@ class UpdraftPlus_Backup {
2680
  return false;
2681
  }
2682
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2683
  // Q. Why don't we only open and close the zip file just once?
2684
  // A. Because apparently PHP doesn't write out until the final close, and it will return an error if anything file has vanished in the meantime. So going directory-by-directory reduces our chances of hitting an error if the filesystem is changing underneath us (which is very possible if dealing with e.g. 1GB of files)
2685
 
2686
- // We batch up the files, rather than do them one at a time. So we are more efficient than open,one-write,close.
2687
- // To call into here, the array $this->zipfiles_batched must be populated (keys=paths, values=add-to-zip-as values). It gets reset upon exit from here.
 
 
 
 
 
2688
  private function makezip_addfiles($warn_on_failures) {
2689
 
2690
  global $updraftplus;
2691
 
2692
- # Used to detect requests to bump the size
2693
  $bump_index = false;
2694
  $ret = true;
2695
 
2696
- $zipfile = $this->zip_basename.(($this->index == 0) ? '' : ($this->index+1)).'.zip.tmp';
2697
 
2698
  $maxzipbatch = $updraftplus->jobdata_get('maxzipbatch', 26214400);
2699
- if ((int)$maxzipbatch < 1024) $maxzipbatch = 26214400;
2700
 
2701
  // Short-circuit the null case, because we want to detect later if something useful happenned
2702
  if (count($this->zipfiles_dirbatched) == 0 && count($this->zipfiles_batched) == 0) return true;
2703
 
2704
- # If on PclZip, then if possible short-circuit to a quicker method (makes a huge time difference - on a folder of 1500 small files, 2.6s instead of 76.6)
2705
- # This assumes that makezip_addfiles() is only called once so that we know about all needed files (the new style)
2706
- # This is rather conservative - because it assumes zero compression. But we can't know that in advance.
2707
  $force_allinone = false;
2708
  if (0 == $this->index && $this->makezip_recursive_batchedbytes < $this->zip_split_every) {
2709
- # So far, we only have a processor for this for PclZip; but that check can be removed - need to address the below items
2710
- # TODO: Is this really what we want? Always go all-in-one for < 500MB???? Should be more conservative? Or, is it always faster to go all-in-one? What about situations where we might want to auto-split because of slowness - check that that is still working.
2711
- # TODO: Test this new method for PclZip - are we still getting the performance gains? Test for ZipArchive too.
2712
  if ('UpdraftPlus_PclZip' == $this->use_zip_object && ($this->makezip_recursive_batchedbytes < 512*1048576 || (defined('UPDRAFTPLUS_PCLZIP_FORCEALLINONE') && UPDRAFTPLUS_PCLZIP_FORCEALLINONE == true && 'UpdraftPlus_PclZip' == $this->use_zip_object))) {
2713
  $updraftplus->log("Only one archive required (".$this->use_zip_object.") - will attempt to do in single operation (data: ".round($this->makezip_recursive_batchedbytes/1024, 1)." KB, split: ".round($this->zip_split_every/1024, 1)." KB)");
2714
- // $updraftplus->log("PclZip, and only one archive required - will attempt to do in single operation (data: ".round($this->makezip_recursive_batchedbytes/1024, 1)." KB, split: ".round($this->zip_split_every/1024, 1)." KB)");
2715
  $force_allinone = true;
2716
- // if(!class_exists('PclZip')) require_once(ABSPATH.'/wp-admin/includes/class-pclzip.php');
2717
- // $zip = new PclZip($zipfile);
2718
- // $remove_path = ($this->whichone == 'wpcore') ? untrailingslashit(ABSPATH) : WP_CONTENT_DIR;
2719
- // $add_path = false;
2720
- // // Remove prefixes
2721
- // $backupable_entities = $updraftplus->get_backupable_file_entities(true);
2722
- // if (isset($backupable_entities[$this->whichone])) {
2723
- // if ('plugins' == $this->whichone || 'themes' == $this->whichone || 'uploads' == $this->whichone) {
2724
- // $remove_path = dirname($backupable_entities[$this->whichone]);
2725
- // # To normalise instead of removing (which binzip doesn't support, so we don't do it), you'd remove the dirname() in the above line, and uncomment the below one.
2726
- // #$add_path = $this->whichone;
2727
- // } else {
2728
- // $remove_path = $backupable_entities[$this->whichone];
2729
- // }
2730
- // }
2731
- // if ($add_path) {
2732
- // $zipcode = $zip->create($this->source, PCLZIP_OPT_REMOVE_PATH, $remove_path, PCLZIP_OPT_ADD_PATH, $add_path);
2733
- // } else {
2734
- // $zipcode = $zip->create($this->source, PCLZIP_OPT_REMOVE_PATH, $remove_path);
2735
- // }
2736
- // if ($zipcode == 0) {
2737
- // $updraftplus->log("PclZip Error: ".$zip->errorInfo(true), 'warning');
2738
- // return $zip->errorCode();
2739
- // } else {
2740
- // $updraftplus->something_useful_happened();
2741
- // return true;
2742
- // }
2743
  }
2744
  }
2745
 
2746
  // 05-Mar-2013 - added a new check on the total data added; it appears that things fall over if too much data is contained in the cumulative total of files that were addFile'd without a close-open cycle; presumably data is being stored in memory. In the case in question, it was a batch of MP3 files of around 100MB each - 25 of those equals 2.5GB!
2747
 
2748
  $data_added_since_reopen = 0;
2749
- # The following array is used only for error reporting if ZipArchive::close fails (since that method itself reports no error messages - we have to track manually what we were attempting to add)
2750
  $files_zipadded_since_open = array();
2751
 
2752
  $zip = new $this->use_zip_object;
@@ -2760,12 +2969,16 @@ class UpdraftPlus_Backup {
2760
  $original_size = 0;
2761
  }
2762
 
2763
- if ($opencode !== true) return new WP_Error('no_open', sprintf(__('Failed to open the zip file (%s) - %s', 'updraftplus'),$zipfile, $zip->last_error));
2764
- # TODO: This action isn't being called for the all-in-one case - should be, I think
2765
- do_action("updraftplus_makezip_addfiles_prepack", $this, $this->whichone);
 
 
2766
 
2767
  // Make sure all directories are created before we start creating files
2768
- while ($dir = array_pop($this->zipfiles_dirbatched)) $zip->addEmptyDir($dir);
 
 
2769
  $zipfiles_added_thisbatch = 0;
2770
 
2771
  // Go through all those batched files
@@ -2810,8 +3023,8 @@ class UpdraftPlus_Backup {
2810
  - more than 500 files batched (should perhaps intelligently lower this as the zip file gets bigger - not yet needed)
2811
  */
2812
 
2813
- # Add 10% margin. It only really matters when the OS has a file size limit, exceeding which causes failure (e.g. 2GB on 32-bit)
2814
- # Since we don't test before the file has been created (so that zip_last_ratio has meaningful data), we rely on max_zip_batch being less than zip_split_every - which should always be the case
2815
  $reaching_split_limit = ($this->zip_last_ratio > 0 && $original_size>0 && ($original_size + 1.1*$data_added_since_reopen*$this->zip_last_ratio) > $this->zip_split_every) ? true : false;
2816
 
2817
  if (!$force_allinone && ($zipfiles_added_thisbatch > UPDRAFTPLUS_MAXBATCHFILES || $reaching_split_limit || $data_added_since_reopen > $maxzipbatch || (time() - $this->zipfiles_lastwritetime) > 2)) {
@@ -2821,13 +3034,13 @@ class UpdraftPlus_Backup {
2821
 
2822
  if ($data_added_since_reopen > $maxzipbatch) {
2823
  $something_useful_sizetest = true;
2824
- $updraftplus->log("Adding batch to zip file (".$this->use_zip_object."): over ".round($maxzipbatch/1048576,1)." MB added on this batch (".round($data_added_since_reopen/1048576,1)." MB, ".count($this->zipfiles_batched)." files batched, $zipfiles_added_thisbatch (".$this->zipfiles_added_thisrun.") added so far); re-opening (prior size: ".round($original_size/1024, 1).' KB)');
2825
  } elseif ($zipfiles_added_thisbatch > UPDRAFTPLUS_MAXBATCHFILES) {
2826
- $updraftplus->log("Adding batch to zip file (".$this->use_zip_object."): over ".UPDRAFTPLUS_MAXBATCHFILES." files added on this batch (".round($data_added_since_reopen/1048576,1)." MB, ".count($this->zipfiles_batched)." files batched, $zipfiles_added_thisbatch (".$this->zipfiles_added_thisrun.") added so far); re-opening (prior size: ".round($original_size/1024, 1).' KB)');
2827
  } elseif (!$reaching_split_limit) {
2828
- $updraftplus->log("Adding batch to zip file (".$this->use_zip_object."): over 2.0 seconds have passed since the last write (".round($data_added_since_reopen/1048576,1)." MB, $zipfiles_added_thisbatch (".$this->zipfiles_added_thisrun.") files added so far); re-opening (prior size: ".round($original_size/1024, 1).' KB)');
2829
  } else {
2830
- $updraftplus->log("Adding batch to zip file (".$this->use_zip_object."): possibly approaching split limit (".round($data_added_since_reopen/1048576,1)." MB, $zipfiles_added_thisbatch (".$this->zipfiles_added_thisrun.") files added so far); last ratio: ".round($this->zip_last_ratio,4)."; re-opening (prior size: ".round($original_size/1024, 1).' KB)');
2831
  }
2832
 
2833
  if (!$zip->close()) {
@@ -2838,28 +3051,28 @@ class UpdraftPlus_Backup {
2838
 
2839
  $zipfiles_added_thisbatch = 0;
2840
 
2841
- # This triggers a re-open, later
2842
  unset($zip);
2843
  $files_zipadded_since_open = array();
2844
  // Call here, in case we've got so many big files that we don't complete the whole routine
2845
  if (filesize($zipfile) > $original_size) {
2846
 
2847
- # It is essential that this does not go above 1, even though in reality (and this can happen at the start, if just 1 file is added (e.g. due to >2.0s detection) the 'compressed' zip file may be *bigger* than the files stored in it. When that happens, if the ratio is big enough, it can then fire the "approaching split limit" detection (very) prematurely
2848
  $this->zip_last_ratio = ($data_added_since_reopen > 0) ? min((filesize($zipfile) - $original_size)/$data_added_since_reopen, 1) : 1;
2849
 
2850
- # We need a rolling update of this
2851
  $original_size = filesize($zipfile);
2852
 
2853
- # Move on to next zip?
2854
  if ($reaching_split_limit || filesize($zipfile) > $this->zip_split_every) {
2855
  $bump_index = true;
2856
- # Take the filesize now because later we wanted to know we did clearstatcache()
2857
  $bumped_at = round(filesize($zipfile)/1048576, 1);
2858
  }
2859
 
2860
- # Need to make sure that something_useful_happened() is always called
2861
 
2862
- # How long since the current run began? If it's taken long (and we're in danger of not making it at all), or if that is forseeable in future because of general slowness, then we should reduce the parameters.
2863
  if (!$something_useful_sizetest) {
2864
  $updraftplus->something_useful_happened();
2865
  } else {
@@ -2901,12 +3114,9 @@ class UpdraftPlus_Backup {
2901
  // How much can we increase it by?
2902
  if ($normalised_time_since_began <6) {
2903
  if ($run_times_known > 0 && $max_time >0) {
2904
- $new_maxzipbatch = min(floor(max(
2905
- $maxzipbatch*6/$normalised_time_since_began, $maxzipbatch*((0.6*$max_time)/$normalised_time_since_began))),
2906
- 200*1024*1024
2907
- );
2908
  } else {
2909
- # Maximum of 200MB in a batch
2910
  $new_maxzipbatch = min(floor($maxzipbatch*6/$normalised_time_since_began), 200*1024*1024);
2911
  }
2912
  } else {
@@ -2914,15 +3124,15 @@ class UpdraftPlus_Backup {
2914
  $new_maxzipbatch = min(floor($maxzipbatch*((0.6*$max_time)/$normalised_time_since_began)), 200*1024*1024);
2915
  }
2916
 
2917
- # Throttle increases - don't increase by more than 2x in one go - ???
2918
- # $new_maxzipbatch = floor(min(2*$maxzipbatch, $new_maxzipbatch));
2919
- # Also don't allow anything that is going to be more than 18 seconds - actually, that's harmful because of the basically fixed time taken to copy the file
2920
- # $new_maxzipbatch = floor(min(18*$rate ,$new_maxzipbatch));
2921
 
2922
- # Don't go above the split amount (though we expect that to be higher anyway, unless sending via email)
2923
  $new_maxzipbatch = min($new_maxzipbatch, $this->zip_split_every);
2924
 
2925
- # Don't raise it above a level that failed on a previous run
2926
  $maxzipbatch_ceiling = $updraftplus->jobdata_get('maxzipbatch_ceiling');
2927
  if (is_numeric($maxzipbatch_ceiling) && $maxzipbatch_ceiling > 20*1024*1024 && $new_maxzipbatch > $maxzipbatch_ceiling) {
2928
  $updraftplus->log("Was going to raise maxzipbytes to $new_maxzipbatch, but this is too high: a previous failure led to the ceiling being set at $maxzipbatch_ceiling, which we will use instead");
@@ -2973,7 +3183,7 @@ class UpdraftPlus_Backup {
2973
  }
2974
  $data_added_since_reopen = 0;
2975
  } else {
2976
- # ZipArchive::close() can take a very long time, which we want to know about
2977
  $updraftplus->record_still_alive();
2978
  }
2979
 
@@ -3014,26 +3224,30 @@ class UpdraftPlus_Backup {
3014
  $original_size = 0;
3015
  }
3016
 
3017
- if ($opencode !== true) return new WP_Error('no_open', sprintf(__('Failed to open the zip file (%s) - %s', 'updraftplus'), $zipfile, $zip->last_error));
3018
  }
3019
 
3020
  }
3021
 
3022
- # Reset array
3023
  $this->zipfiles_batched = array();
3024
  $this->zipfiles_skipped_notaltered = array();
3025
 
3026
  if (false == ($nret = $zip->close())) $this->record_zip_error($files_zipadded_since_open, $zip->last_error, $warn_on_failures);
3027
 
3028
- do_action("updraftplus_makezip_addfiles_finished", $this, $this->whichone);
 
 
 
 
3029
 
3030
  $this->zipfiles_lastwritetime = time();
3031
- # May not exist if the last thing we did was bump
3032
  if (file_exists($zipfile) && filesize($zipfile) > $original_size) $updraftplus->something_useful_happened();
3033
 
3034
- # Move on to next archive?
3035
  if (file_exists($zipfile) && filesize($zipfile) > $this->zip_split_every) {
3036
- $updraftplus->log(sprintf("Zip size has gone over split limit (%s, %s) - bumping index (%d)", round(filesize($zipfile)/1048576,1), round($this->zip_split_every/1048576, 1), $this->index));
3037
  $this->bump_index();
3038
  }
3039
 
3
  if (!defined('UPDRAFTPLUS_DIR')) die('No direct access allowed');
4
  if (!class_exists('UpdraftPlus_PclZip')) require_once(UPDRAFTPLUS_DIR.'/class-zip.php');
5
 
6
+ /**
7
+ * This file contains functions that are only needed/loaded when a backup is running (reduces memory usage on other pages)
8
+ */
9
  class UpdraftPlus_Backup {
10
 
11
  public $index = 0;
12
 
13
+ private $manifest_path;
14
+
15
  private $zipfiles_added;
16
+
17
  private $zipfiles_added_thisrun = 0;
18
+
19
  public $zipfiles_dirbatched;
20
+
21
  public $zipfiles_batched;
22
+
23
  public $zipfiles_skipped_notaltered;
24
+
25
+ private $zip_split_every = 419430400; // 400MB
26
+
27
  private $zip_last_ratio = 1;
28
+
29
  private $whichone;
30
+
31
  private $zip_basename = '';
32
+
33
  private $backup_basename = '';
34
+
35
  private $zipfiles_lastwritetime;
36
+
37
  // 0 = unknown; false = failed
38
  public $binzip = 0;
39
 
40
  private $dbhandle;
41
+
42
  private $dbhandle_isgz;
43
 
44
+ // Array of entities => times
45
  private $altered_since = -1;
46
+
47
+ // Time for the current entity
48
  private $makezip_if_altered_since = -1;
49
 
50
  private $excluded_extensions = false;
51
 
52
  private $use_zip_object = 'UpdraftPlus_ZipArchive';
53
+
54
  public $debug = false;
55
 
56
  public $updraft_dir;
57
+
58
  private $blog_name;
59
+
60
  private $wpdb_obj;
61
+
62
  private $job_file_entities = array();
63
 
64
  private $first_run = 0;
80
  global $updraftplus;
81
 
82
  // Get the blog name and rip out known-problematic characters. Remember that we may need to be able to upload this to any FTP server or cloud storage, where filename support may be unknown
83
+ $blog_name = str_replace('__', '_', preg_replace('/[^A-Za-z0-9_]/', '', str_replace(' ', '_', substr(get_bloginfo(), 0, 32))));
84
  if (!$blog_name || preg_match('#^_+$#', $blog_name)) {
85
  // Try again...
86
  $parsed_url = parse_url(home_url(), PHP_URL_HOST);
87
  $parsed_subdir = untrailingslashit(parse_url(home_url(), PHP_URL_PATH));
88
  if ($parsed_subdir && '/' != $parsed_subdir) $parsed_url .= str_replace(array('/', '\\'), '_', $parsed_subdir);
89
+ $blog_name = str_replace('__', '_', preg_replace('/[^A-Za-z0-9_]/', '', str_replace(' ', '_', substr($parsed_url, 0, 32))));
90
  if (!$blog_name || preg_match('#^_+$#', $blog_name)) $blog_name = 'WordPress_Backup';
91
  }
92
 
93
  // Allow an over-ride. Careful about introducing characters not supported by your filesystem or cloud storage.
94
  $this->blog_name = apply_filters('updraftplus_blog_name', $blog_name);
95
 
96
+ // Decide which zip engine to begin with
97
  $this->debug = UpdraftPlus_Options::get_updraft_option('updraft_debug_mode');
98
  $this->updraft_dir = $updraftplus->backups_dir_location();
99
  $this->updraft_dir_realpath = realpath($this->updraft_dir);
111
 
112
  // false means 'tried + failed'; whereas 0 means 'not yet tried'
113
  // Disallow binzip on OpenVZ when we're not sure there's plenty of memory
114
+ if (0 === $this->binzip && (!defined('UPDRAFTPLUS_PREFERPCLZIP') || UPDRAFTPLUS_PREFERPCLZIP != true) && (!defined('UPDRAFTPLUS_NO_BINZIP') || !UPDRAFTPLUS_NO_BINZIP) && $updraftplus->current_resumption <9) {
115
 
116
  if (@file_exists('/proc/user_beancounters') && @file_exists('/proc/meminfo') && @is_readable('/proc/meminfo')) {
117
  $meminfo = @file_get_contents('/proc/meminfo', false, null, -1, 200);
118
  if (is_string($meminfo) && preg_match('/MemTotal:\s+(\d+) kB/', $meminfo, $matches)) {
119
  $memory_mb = $matches[1]/1024;
120
+ // If the report is of a large amount, then we're probably getting the total memory on the hypervisor (this has been observed), and don't really know the VPS's memory
121
  $vz_log = "OpenVZ; reported memory: ".round($memory_mb, 1)." MB";
122
  if ($memory_mb < 1024 || $memory_mb > 8192) {
123
  $openvz_lowmem = true;
137
  }
138
  }
139
 
140
+ // In tests, PclZip was found to be 25% slower than ZipArchive
141
+ if ('UpdraftPlus_PclZip' != $this->use_zip_object && empty($this->binzip) && ((defined('UPDRAFTPLUS_PREFERPCLZIP') && UPDRAFTPLUS_PREFERPCLZIP == true) || !class_exists('ZipArchive') || !class_exists('UpdraftPlus_ZipArchive') || (!extension_loaded('zip') && !method_exists('ZipArchive', 'AddFile')))) {
142
  global $updraftplus;
143
  $updraftplus->log("Zip engine: ZipArchive is not available or is disabled (will use PclZip if needed)");
144
  $this->use_zip_object = 'UpdraftPlus_PclZip';
150
  $this->remotestorage_extrainfo[$service] = array('pretty' => $info_html, 'plain' => $info_plain);
151
  }
152
 
153
+ /**
154
+ * Public, because called from the 'More Files' add-on
155
+ *
156
+ * @param String $create_from_dir Directory to create the zip
157
+ * @param String $whichone Entity being backed up (e.g. 'plugins', 'uploads')
158
+ * @param String $backup_file_basename Name of backup file
159
+ * @param Integer $index Index of zip in the sequence
160
+ * @param Integer|Boolean $first_linked_index First linked index in the sequence, or false
161
+ * @return Boolean
162
+ */
163
  public function create_zip($create_from_dir, $whichone, $backup_file_basename, $index, $first_linked_index = false) {
164
  // Note: $create_from_dir can be an array or a string
165
  @set_time_limit(UPDRAFTPLUS_SET_TIME_LIMIT);
171
 
172
  global $updraftplus;
173
 
174
+ $this->zip_split_every = max((int) $updraftplus->jobdata_get('split_every'), UPDRAFTPLUS_SPLIT_MIN)*1048576;
175
 
176
+ if ('others' != $whichone) $updraftplus->log("Beginning creation of dump of $whichone (split every: ".round($this->zip_split_every/1048576, 1)." MB)");
177
 
178
  if (is_string($create_from_dir) && !file_exists($create_from_dir)) {
179
  $flag_error = true;
180
  $updraftplus->log("Does not exist: $create_from_dir");
181
  if ('mu-plugins' == $whichone) {
182
+ if (!function_exists('get_mu_plugins')) include_once(ABSPATH.'wp-admin/includes/plugin.php');
183
  $mu_plugins = get_mu_plugins();
184
  if (count($mu_plugins) == 0) {
185
  $updraftplus->log("There appear to be no mu-plugins to back up. Will not raise an error.");
195
  $full_path = $this->updraft_dir.'/'.$base_path;
196
  $time_now = time();
197
 
198
+ // This is compatible with filenames which indicate increments, as it is looking only for the current increment
199
  if (file_exists($full_path)) {
200
+ // Gather any further files that may also exist
201
  $files_existing = array();
202
  while (file_exists($full_path)) {
203
  $files_existing[] = $base_path;
204
+ $time_mod = (int) @filemtime($full_path);
205
+ $updraftplus->log($base_path.": this file has already been created (age: ".round($time_now-$time_mod, 1)." s)");
206
  if ($time_mod>100 && ($time_now-$time_mod)<30) {
207
  $updraftplus->terminate_due_to_activity($base_path, $time_now, $time_mod);
208
  }
209
  $index++;
210
+ // This is compatible with filenames which indicate increments, as it is looking only for the current increment
211
  $base_path = $backup_file_basename.'-'.$whichone.($index+1).'.zip';
212
  $full_path = $this->updraft_dir.'/'.$base_path;
213
  }
220
 
221
  // Firstly, make sure that the temporary file is not already being written to - which can happen if a resumption takes place whilst an old run is still active
222
  $zip_name = $full_path.'.tmp';
223
+ $time_mod = (int) @filemtime($zip_name);
224
  if (file_exists($zip_name) && $time_mod>100 && ($time_now-$time_mod)<30) {
225
  $updraftplus->terminate_due_to_activity($zip_name, $time_now, $time_mod);
226
  }
245
  clearstatcache();
246
 
247
  if (isset($files_existing)) {
248
+ // Because of zip-splitting, the mere fact that files exist is not enough to indicate that the entity is finished. For that, we need to also see that no subsequent file has been started.
249
+ // Q. What if the previous runner died in between zips, and it is our job to start the next one? A. The next temporary file is created before finishing the former zip, so we are safe (and we are also safe-guarded by the updated value of the index being stored in the database).
250
  return $files_existing;
251
  }
252
 
254
 
255
  $this->zip_microtime_start = microtime(true);
256
 
257
+ // The paths in the zip should then begin with '$whichone', having removed WP_CONTENT_DIR from the front
258
  $zipcode = $this->make_zipfile($create_from_dir, $backup_file_basename, $whichone);
259
+ if (true !== $zipcode) {
260
  $updraftplus->log("ERROR: Zip failure: Could not create $whichone zip (".$this->index." / $index)");
261
+ $updraftplus->log(sprintf(__("Could not create %s zip. Consult the log file for more information.", 'updraftplus'), $whichone), 'error');
262
+ // The caller is required to update $index from $this->index
263
  return false;
264
  } else {
265
  $itext = (empty($this->index)) ? '' : ($this->index+1);
287
  $timetaken = max(microtime(true)-$this->zip_microtime_start, 0.000001);
288
  $kbsize = filesize($full_path)/1024;
289
  $rate = round($kbsize/$timetaken, 1);
290
+ $updraftplus->log("Created $whichone zip (".$this->index.") - ".round($kbsize, 1)." KB in ".round($timetaken, 1)." s ($rate KB/s) ($checksum_description)");
291
  // We can now remove any left-over temporary files from this job
292
  }
293
  } elseif ($this->index > $original_index) {
294
  $updraftplus->log("Did not create $whichone zip (".$this->index.") - not needed (2)");
295
+ // Added 12-Feb-2014 (to help multiple morefiles)
296
  $this->index--;
297
  } else {
298
  $updraftplus->log("Looked-for $whichone zip (".$this->index.") was not found (".basename($full_path).".tmp)", 'warning');
303
  // Remove cache list files as well, if there are any
304
  $updraftplus->clean_temporary_files('_'.$updraftplus->nonce."-$whichone", 0, true);
305
 
306
+ // Create the results array to send back (just the new ones, not any prior ones)
307
  $files_existing = array();
308
  $res_index = 0;
309
  for ($i = $original_index; $i<= $this->index; $i++) {
317
  return $files_existing;
318
  }
319
 
320
+ /**
321
+ * This method is for calling outside of a cloud_backup() context. It constructs a list of services for which prune operations should be attempted, and then calls prune_retained_backups() if necessary upon them.
322
+ */
323
  public function do_prune_standalone() {
324
  global $updraftplus;
325
 
329
  $prune_services = array();
330
 
331
  foreach ($services as $ind => $service) {
332
+ if ("none" == $service || '' == $service) continue;
333
 
334
  $objname = "UpdraftPlus_BackupModule_${service}";
335
  if (!class_exists($objname) && file_exists(UPDRAFTPLUS_DIR.'/methods/'.$service.'.php')) {
336
+ include_once(UPDRAFTPLUS_DIR.'/methods/'.$service.'.php');
337
  }
338
  if (class_exists($objname)) {
339
  $remote_obj = new $objname;
348
  if (!empty($prune_services)) $this->prune_retained_backups($prune_services);
349
  }
350
 
351
+ /**
352
+ * Dispatch to the relevant function
353
+ *
354
+ * @param Array $backup_array List of archives for the backup
355
+ */
356
  public function cloud_backup($backup_array) {
357
 
358
  global $updraftplus;
375
 
376
  $do_prune = array();
377
 
378
+ // If there was no check-in last time, then attempt a different service first - in case a time-out on the attempted service leads to no activity and everything stopping
379
  if (count($services) >1 && !empty($updraftplus->no_checkin_last_time)) {
380
  $updraftplus->log('No check-in last time: will try a different remote service first');
381
  array_push($services, array_shift($services));
387
  $errors_before_uploads = $updraftplus->error_count();
388
 
389
  foreach ($services as $ind => $service) {
390
+ // Used for logging by record_upload_chunk()
391
  $this->current_service = $service;
392
+ // Used when deciding whether to delete the local file
393
  $this->last_service = ($ind+1 >= count($services) && $errors_before_uploads == $updraftplus->error_count()) ? true : false;
394
 
395
  $log_extra = ($this->last_service) ? ' (last)' : '';
397
  @set_time_limit(UPDRAFTPLUS_SET_TIME_LIMIT);
398
 
399
  $method_include = UPDRAFTPLUS_DIR.'/methods/'.$service.'.php';
400
+ if (file_exists($method_include)) include_once($method_include);
401
 
402
+ if ("none" == $service || '' == $service) {
403
  $updraftplus->log("No remote despatch: user chose no remote backup service");
404
+ // Still want to mark as "uploaded", to signal that nothing more needs doing. (Important on incremental runs with no cloud storage).
405
  foreach ($backup_array as $bind => $file) {
406
  if ($updraftplus->is_uploaded($file)) {
407
  $updraftplus->log("Already uploaded: $file");
500
  return;
501
  }
502
 
503
+ // $updraftplus->jobdata_set('jobstatus', 'pruning');
504
+ // $updraftplus->jobdata_set('prune', 'begun');
505
  call_user_func_array(array($updraftplus, 'jobdata_set_multi'), array('jobstatus', 'pruning', 'prune', 'begun'));
506
 
507
  // Number of backups to retain - files
772
 
773
  $backup_to_examine = $this->remove_backup_set_if_empty($backup_to_examine, $backup_datestamp, $backupable_entities, $backup_history);
774
  if (empty($backup_to_examine)) {
775
+ // unset($functional_backup_history[$backup_datestamp]);
776
  unset($backup_history[$backup_datestamp]);
777
  $this->maybe_save_backup_history_and_reschedule($backup_history);
778
  } else {
779
+ // $functional_backup_history[$backup_datestamp] = $backup_to_examine;
780
  $backup_history[$backup_datestamp] = $backup_to_examine;
781
  }
782
 
848
  } else {
849
  $updraftplus->log("No nonce record found in the backup set, so cannot delete any remaining log file");
850
  }
851
+ // unset($backup_history[$backup_datestamp]);
852
  return false;
853
  } else {
854
  $updraftplus->log("This backup set remains non-empty (f=$contains_files/d=$contains_db); will retain in history");
857
 
858
  }
859
 
860
+ /**
861
+ * Prune files from local or remote storage
862
+ *
863
+ * @param String $service Service to prune
864
+ * @param Array $dofiles An array of files (or a single string for one file)
865
+ * @param Array $method_object specific method object
866
+ * @param Array $object_passback specific passback object
867
+ * @param Array $file_sizes size of files
868
+ */
869
  private function prune_file($service, $dofiles, $method_object = null, $object_passback = null, $file_sizes = array()) {
870
  global $updraftplus;
871
+ if (!is_array($dofiles)) $dofiles =array($dofiles);
872
 
873
  if (!apply_filters('updraftplus_prune_file', true, $dofiles, $service, $method_object, $object_passback, $file_sizes)) {
874
  $updraftplus->log("Prune: service=$service: skipped via filter");
888
  if (!is_null($method_object)) $method_object->delete($dofiles, $object_passback, $file_sizes);
889
  }
890
 
891
+ /**
892
+ * The jobdata is passed in instead of fetched, because the live jobdata may now differ from that which should be reported on (e.g. an incremental run was subsequently scheduled)
893
+ *
894
+ * @param String $final_message The final message to be sent
895
+ * @param Array $jobdata Full job data
896
+ */
897
  public function send_results_email($final_message, $jobdata) {
898
 
899
  global $updraftplus;
918
  } elseif ('finished' == $backup_files && ('finished' == $backup_db || 'encrypted' == $backup_db)) {
919
  $backup_contains = __("Files and database", 'updraftplus')." ($backup_type)";
920
  } elseif ('finished' == $backup_files) {
921
+ $backup_contains = ('begun' == $backup_db) ? __("Files (database backup has not completed)", 'updraftplus') : __("Files only (database was not part of this particular schedule)", 'updraftplus');
922
  $backup_contains .= " ($backup_type)";
923
+ } elseif ('finished' == $backup_db || 'encrypted' == $backup_db) {
924
+ $backup_contains = ('begun' == $backup_files) ? __("Database (files backup has not completed)", 'updraftplus') : __("Database only (files were not part of this particular schedule)", 'updraftplus');
925
  } else {
926
  $updraftplus->log('Unknown/unexpected status: '.serialize($backup_files).'/'.serialize($backup_db));
927
  $backup_contains = __("Unknown/unexpected error - please raise a support request", 'updraftplus');
947
  }
948
  $error_count++;
949
  }
950
+ $append_log .="\r\n";
951
  }
952
  $warnings = (isset($jobdata['warnings'])) ? $jobdata['warnings'] : array();
953
  if (is_array($warnings) && count($warnings) >0) {
956
  foreach ($warnings as $err) {
957
  $append_log .= "* ".rtrim($err)."\r\n";
958
  }
959
+ $append_log .="\r\n";
960
  }
961
 
962
  if ($debug_mode && '' != $updraftplus->logfile_name && !in_array($updraftplus->logfile_name, $attachments)) {
968
 
969
  $subject = apply_filters('updraft_report_subject', sprintf(__('Backed up: %s', 'updraftplus'), get_bloginfo('name')).' (UpdraftPlus '.$updraftplus->version.') '.get_date_from_gmt(gmdate('Y-m-d H:i:s', time()), 'Y-m-d H:i'), $error_count, count($warnings));
970
 
971
+ // The class_exists() check here is a micro-optimization to prevent a possible HTTP call whose results may be disregarded by the filter
972
  $feed = '';
973
  if (!class_exists('UpdraftPlus_Addon_Reporting') && !defined('UPDRAFTPLUS_NOADS_B') && !defined('UPDRAFTPLUS_NONEWSFEED')) {
974
  $updraftplus->log('Fetching RSS news feed');
980
  $feed .= '* ';
981
  $feed .= $item->get_title();
982
  $feed .= " (".$item->get_date('j F Y').")";
983
+ // $feed .= ' - '.$item->get_permalink();
984
  $feed .= "\r\n";
985
  }
986
  }
1002
  // Make it available to the filter
1003
  $jobdata['remotestorage_extrainfo'] = $this->remotestorage_extrainfo;
1004
 
1005
+ if (!class_exists('UpdraftPlus_Notices')) include_once(UPDRAFTPLUS_DIR.'/includes/updraftplus-notices.php');
1006
  global $updraftplus_notices;
1007
  $ws_advert = $updraftplus_notices->do_notice(false, 'report-plain', true);
1008
 
1016
  $feed.
1017
  $ws_advert."\r\n".
1018
  $append_log,
1019
+ $final_message,
1020
+ $backup_contains,
1021
+ $updraftplus->errors,
1022
+ $warnings,
1023
+ $jobdata);
1024
 
1025
  $this->attachments = apply_filters('updraft_report_attachments', $attachments);
1026
 
1074
 
1075
  }
1076
 
1077
+ /**
1078
+ * The purpose of this function is to make sure that the options table is put in the database first, then the users table, then the site + blogs tables (if present - multisite), then the usermeta table; and after that the core WP tables - so that when restoring we restore the core tables first
1079
+ *
1080
+ * @param Array $a_arr First array to be compared
1081
+ * @param Array $b_arr Second array to be compared
1082
+ * @return Integer - according to the rules of usort()
1083
+ */
1084
  private function backup_db_sorttables($a_arr, $b_arr) {
1085
 
1086
  $a = $a_arr['name'];
1098
  if ($a == $b) return 0;
1099
  $our_table_prefix = $this->table_prefix_raw;
1100
  if ($a == $our_table_prefix.'options') return -1;
1101
+ if ($b == $our_table_prefix.'options') return 1;
1102
  if ($a == $our_table_prefix.'site') return -1;
1103
+ if ($b == $our_table_prefix.'site') return 1;
1104
  if ($a == $our_table_prefix.'blogs') return -1;
1105
+ if ($b == $our_table_prefix.'blogs') return 1;
1106
  if ($a == $our_table_prefix.'users') return -1;
1107
+ if ($b == $our_table_prefix.'users') return 1;
1108
  if ($a == $our_table_prefix.'usermeta') return -1;
1109
+ if ($b == $our_table_prefix.'usermeta') return 1;
1110
 
1111
  if (empty($our_table_prefix)) return strcmp($a, $b);
1112
 
1127
  }
1128
 
1129
  private function log_account_space() {
1130
+ // Don't waste time if space is huge
1131
  if (!empty($this->account_space_oodles)) return;
1132
  global $updraftplus;
1133
  $hosting_bytes_free = $updraftplus->get_hosting_disk_quota_free();
1137
  }
1138
  }
1139
 
1140
+ /**
1141
+ * Returns the basename up to and including the nonce (but not the entity)
1142
+ *
1143
+ * @param Integer $use_time epoch time to use
1144
+ * @return String
1145
+ */
1146
  private function get_backup_file_basename_from_time($use_time) {
1147
  global $updraftplus;
1148
  return 'backup_'.get_date_from_gmt(gmdate('Y-m-d H:i:s', $use_time), 'Y-m-d-Hi').'_'.$this->blog_name.'_'.$updraftplus->nonce;
1152
  $zips = array();
1153
  if ($handle = opendir($dir)) {
1154
  while (false !== ($entry = readdir($handle))) {
1155
+ if ("." != $entry && ".." != $entry) {
1156
  if (preg_match('/^backup_(\d{4})-(\d{2})-(\d{2})-(\d{2})(\d{2})_.*_([0-9a-f]{12})-([\-a-z]+)([0-9]+)?\.zip$/i', $entry, $matches)) {
1157
  if ($matches[6] !== $match_nonce) continue;
1158
  $timestamp = mktime($matches[4], $matches[5], 0, $matches[2], $matches[3], $matches[1]);
1159
  $entity = $matches[7];
1160
+ $index = empty($matches[8]) ? '0' : $matches[8];
1161
  $zips[$entity][$index] = array($timestamp, $entry);
1162
  }
1163
  }
1166
  return $zips;
1167
  }
1168
 
1169
+ /**
1170
+ * Get information on whether a particular file exists in a set
1171
+ *
1172
+ * @param Array $files should be an array as returned by find_existing_zips()]
1173
+ * @param String $entity entty of the file (e.g. 'plugins')
1174
+ * @param Integer $index Index within the files array
1175
+ * @return String|Boolean - false if the file does not exist; otherwise, the basename
1176
+ */
1177
  private function file_exists($files, $entity, $index = 0) {
1178
  if (isset($files[$entity]) && isset($files[$entity][$index])) {
1179
  $file = $files[$entity][$index];
1184
  }
1185
  }
1186
 
1187
+ /**
1188
+ * This function is resumable
1189
+ *
1190
+ * @param String $job_status Current status
1191
+ * @return Array - array of backed-up files
1192
+ */
1193
  private function backup_dirs($job_status) {
1194
 
1195
  global $updraftplus;
1204
  $possible_backups = $updraftplus->get_backupable_file_entities(true);
1205
 
1206
  // Was there a check-in last time? If not, then reduce the amount of data attempted
1207
+ if ('finished' != $job_status && $updraftplus->current_resumption >= 2) {
1208
 
1209
+ // NOTYET: Possible amendment to original algorithm; not just no check-in, but if the check in was very early (can happen if we get a very early checkin for some trivial operation, then attempt something too big)
1210
 
1211
 
1212
  // 03-Sep-2015 - came across a case (HS#2052) where there apparently was a check-in 'last time', but no resumption was scheduled because the 'useful_checkin' jobdata was *not* last time - which must indicate dying at a very unfortunate/unlikely point in the code. As a result, the split was not auto-reduced. Consequently, we've added !$updraftplus->newresumption_scheduled as a condition on the first check here (it was already on the second), as if no resumption is scheduled then whatever checkin there was last time was only partial. This was on GoDaddy, for which a number of curious I/O event combinations have been seen in recent months - their platform appears to have some odd behaviour when PHP is killed off.
1217
  $this->try_split = true;
1218
  } elseif ($updraftplus->current_resumption<=10) {
1219
  $maxzipbatch = $updraftplus->jobdata_get('maxzipbatch', 26214400);
1220
+ if ((int) $maxzipbatch < 1) $maxzipbatch = 26214400;
1221
 
1222
  $new_maxzipbatch = max(floor($maxzipbatch * 0.75), 20971520);
1223
  if ($new_maxzipbatch < $maxzipbatch) {
1229
  }
1230
  }
1231
 
1232
+ if ('finished' != $job_status && !$updraftplus->really_is_writable($this->updraft_dir)) {
1233
  $updraftplus->log("Backup directory (".$this->updraft_dir.") is not writable, or does not exist");
1234
  $updraftplus->log(sprintf(__("Backup directory (%s) is not writable, or does not exist.", 'updraftplus'), $this->updraft_dir), 'error');
1235
  return array();
1236
  }
1237
 
1238
  $this->job_file_entities = $updraftplus->jobdata_get('job_file_entities');
1239
+ // This is just used for the visual feedback (via the 'substatus' key)
1240
  $which_entity = 0;
1241
+ // e.g. plugins, themes, uploads, others
1242
+ // $whichdir might be an array (if $youwhat is 'more')
1243
 
1244
+ // Returns an array (keyed off the entity) of ($timestamp, $filename) arrays
1245
  $existing_zips = $this->find_existing_zips($this->updraft_dir, $updraftplus->nonce);
1246
 
1247
  foreach ($possible_backups as $youwhat => $whichdir) {
1248
 
1249
  if (isset($this->job_file_entities[$youwhat])) {
1250
 
1251
+ $index = (int) $this->job_file_entities[$youwhat]['index'];
1252
  if (empty($index)) $index=0;
1253
  $indextext = (0 == $index) ? '' : (1+$index);
1254
 
1255
  $zip_file = $this->updraft_dir.'/'.$backup_file_basename.'-'.$youwhat.$indextext.'.zip';
1256
 
1257
+ // Split needed?
1258
+ $split_every = max((int) $updraftplus->jobdata_get('split_every'), 250);
1259
+ // if (file_exists($zip_file) && filesize($zip_file) > $split_every*1048576) {
1260
  if (false != ($existing_file = $this->file_exists($existing_zips, $youwhat, $index)) && filesize($this->updraft_dir.'/'.$existing_file) > $split_every*1048576) {
1261
  $index++;
1262
  $this->job_file_entities[$youwhat]['index'] = $index;
1290
  if ($index > 0) {
1291
  $zip_file = (isset($this->backup_files_array[$youwhat]) && isset($this->backup_files_array[$youwhat][$index])) ? $this->backup_files_array[$youwhat][$index] : $backup_file_basename.'-'.$youwhat.($index+1).'.zip';
1292
 
1293
+ // $fbase = $backup_file_basename.'-'.$youwhat.($index+1).'.zip';
1294
  $z = $this->updraft_dir.'/'.$zip_file;
1295
  $fs_key = $youwhat.$index.'-size';
1296
  if (file_exists($z)) {
1319
 
1320
  if ('others' == $youwhat) $updraftplus->log("Beginning backup of other directories found in the content directory (index: $index)");
1321
 
1322
+ // Apply a filter to allow add-ons to provide their own method for creating a zip of the entity
1323
  $created = apply_filters('updraftplus_backup_makezip_'.$youwhat, $whichdir, $backup_file_basename, $index);
1324
+ // If the filter did not lead to something being created, then use the default method
1325
  if ($created === $whichdir) {
1326
 
1327
  // http://www.phpconcept.net/pclzip/user-guide/53
1339
  $dirlist = $updraftplus->backup_uploads_dirlist(true);
1340
  } else {
1341
  $dirlist = $whichdir;
1342
+ if (is_array($dirlist)) $dirlist =array_shift($dirlist);
1343
  }
1344
 
1345
  if (count($dirlist)>0) {
1346
  $created = $this->create_zip($dirlist, $youwhat, $backup_file_basename, $index);
1347
+ // Now, store the results
1348
  if (!is_string($created) && !is_array($created)) $updraftplus->log("$youwhat: create_zip returned an error");
1349
  } else {
1350
  $updraftplus->log("No backup of $youwhat: there was nothing found to back up");
1352
  }
1353
 
1354
  if ($created != $whichdir && (is_string($created) || is_array($created))) {
1355
+ if (is_string($created)) $created =array($created);
1356
  foreach ($created as $findex => $fname) {
1357
  $backup_array[$youwhat][$index] = $fname;
1358
+ $itext = (0 == $index) ? '' : $index;
1359
  $index++;
1360
  $backup_array[$youwhat.$itext.'-size'] = filesize($this->updraft_dir.'/'.$fname);
1361
  }
1373
  return $backup_array;
1374
  }
1375
 
1376
+ /**
1377
+ * This uses a saved status indicator; its only purpose is to indicate *total* completion; there is no actual danger, just wasted time, in resuming when it was not needed. So the saved status indicator just helps save resources.
1378
+ *
1379
+ * @param integer $resumption_no Check for first run
1380
+ * @return array
1381
+ */
1382
  public function resumable_backup_of_files($resumption_no) {
1383
  global $updraftplus;
1384
  // Backup directories and return a numerically indexed array of file paths to the backup files
1385
  $bfiles_status = $updraftplus->jobdata_get('backup_files');
1386
+ $this->backup_files_array = $updraftplus->jobdata_get('backup_files_array');
1387
+
1388
  if (!is_array($this->backup_files_array)) $this->backup_files_array = array();
1389
  if ('finished' == $bfiles_status) {
1390
  $updraftplus->log("Creation of backups of directories: already finished");
1391
+ // Check for recent activity
1392
  foreach ($this->backup_files_array as $files) {
1393
+ if (!is_array($files)) $files =array($files);
1394
  foreach ($files as $file) $updraftplus->check_recent_modification($this->updraft_dir.'/'.$file);
1395
  }
1396
  } elseif ('begun' == $bfiles_status) {
1406
  $updraftplus->jobdata_set('backup_files', 'finished');
1407
  $updraftplus->jobdata_set('jobstatus', 'filescreated');
1408
  } else {
1409
+ // This is not necessarily a backup run which is meant to contain files at all
1410
  $updraftplus->log('This backup run is not intended for files - skipping');
1411
  return array();
1412
  }
1438
  return $this->backup_files_array;
1439
  }
1440
 
1441
+ /**
1442
+ * This function is resumable, using the following method:
1443
+ * Each table is written out to ($final_filename).table.tmp
1444
+ * When the writing finishes, it is renamed to ($final_filename).table
1445
+ * When all tables are finished, they are concatenated into the final file
1446
+ *
1447
+ * @param String $already_done Status of backup
1448
+ * @param String $whichdb Indicated which database is being backed up
1449
+ * @param Array $dbinfo is only used when whichdb != 'wp'; and the keys should be: user, pass, name, host, prefix
1450
+ * @return Boolean|String - the basename of the database backup, or false for failure
1451
+ */
1452
  public function backup_db($already_done = 'begun', $whichdb = 'wp', $dbinfo = array()) {
1453
 
1454
  global $updraftplus, $wpdb;
1461
 
1462
  if ('wp' == $this->whichdb) {
1463
  $this->wpdb_obj = $wpdb;
1464
+ // The table prefix after being filtered - i.e. what filters what we'll actually back up
1465
  $this->table_prefix = $updraftplus->get_table_prefix(true);
1466
+ // The unfiltered table prefix - i.e. the real prefix that things are relative to
1467
  $this->table_prefix_raw = $updraftplus->get_table_prefix(false);
1468
  $dbinfo['host'] = DB_HOST;
1469
  $dbinfo['name'] = DB_NAME;
1471
  $dbinfo['pass'] = DB_PASSWORD;
1472
  } else {
1473
  if (!is_array($dbinfo) || empty($dbinfo['host'])) return false;
1474
+ // The methods that we may use: check_connection (WP>=3.9), get_results, get_row, query
1475
  $this->wpdb_obj = new UpdraftPlus_WPDB_OtherDB($dbinfo['user'], $dbinfo['pass'], $dbinfo['name'], $dbinfo['host']);
1476
  if (!empty($this->wpdb_obj->error)) {
1477
  $updraftplus->log($dbinfo['user'].'@'.$dbinfo['host'].'/'.$dbinfo['name'].' : database connection attempt failed');
1499
 
1500
  $total_tables = 0;
1501
 
1502
+ // WP 3.9 onwards - https://core.trac.wordpress.org/browser/trunk/src/wp-includes/wp-db.php?rev=27925 - check_connection() allows us to get the database connection back if it had dropped
1503
  if ('wp' == $whichdb && method_exists($this->wpdb_obj, 'check_connection') && (!defined('UPDRAFTPLUS_SUPPRESS_CONNECTION_CHECKS') || !UPDRAFTPLUS_SUPPRESS_CONNECTION_CHECKS)) {
1504
  if (!$this->wpdb_obj->check_connection(false)) {
1505
  $updraftplus->reschedule(60);
1519
  $all_tables = array_map(array($this, 'cb_get_name_type'), $all_tables);
1520
  }
1521
 
1522
+ // If this is not the WP database, then we do not consider it a fatal error if there are no tables
1523
  if ('wp' == $whichdb && 0 == count($all_tables)) {
1524
  $extra = ($updraftplus->newresumption_scheduled) ? ' - '.__('please wait for the rescheduled attempt', 'updraftplus') : '';
1525
  $updraftplus->log("Error: No WordPress database tables found (SHOW TABLES returned nothing)".$extra);
1535
  if (!$updraftplus->really_is_writable($this->updraft_dir)) {
1536
  $updraftplus->log("The backup directory (".$this->updraft_dir.") could not be written to (could be account/disk space full, or wrong permissions).");
1537
  $updraftplus->log($this->updraft_dir.": ".__('The backup directory is not writable (or disk space is full) - the database backup is expected to shortly fail.', 'updraftplus'), 'warning');
1538
+ // Why not just fail now? We saw a bizarre case when the results of really_is_writable() changed during the run.
1539
  }
1540
 
1541
+ // This check doesn't strictly get all possible duplicates; it's only designed for the case that can happen when moving between deprecated Windows setups and Linux
1542
  $this->duplicate_tables_exist = false;
1543
  foreach ($all_table_names as $table) {
1544
  if (strtolower($table) != $table && in_array(strtolower($table), $all_table_names)) {
1574
  $stitch_files[] = $table_file_prefix;
1575
  } else {
1576
  // === is needed, otherwise 'false' matches (i.e. prefix does not match)
1577
+ if (empty($this->table_prefix) || (false == $this->duplicate_tables_exist && stripos($table, $this->table_prefix) === 0 ) || (true == $this->duplicate_tables_exist && strpos($table, $this->table_prefix) === 0)) {
1578
 
1579
  if (!apply_filters('updraftplus_backup_table', true, $table, $this->table_prefix, $whichdb, $dbinfo)) {
1580
  $updraftplus->log("Skipping table (filtered): $table");
1602
  if (false === $opened) return false;
1603
 
1604
  // Create the SQL statements
1605
+ $this->stow("# " . sprintf('Table: %s', $updraftplus->backquote($table)) . "\n");
1606
  $updraftplus->jobdata_set('dbcreating_substatus', array('t' => $table, 'i' => $total_tables, 'a' => $how_many_tables));
1607
 
1608
  $table_status = $this->wpdb_obj->get_row("SHOW TABLE STATUS WHERE Name='$table'");
1617
  }
1618
 
1619
  // Don't include the job data for any backups - so that when the database is restored, it doesn't continue an apparently incomplete backup
1620
+ if ('wp' == $this->whichdb && (!empty($this->table_prefix) && strtolower($this->table_prefix.'sitemeta') == strtolower($table))) {
1621
  $where = 'meta_key NOT LIKE "updraft_jobdata_%"';
1622
  } elseif ('wp' == $this->whichdb && (!empty($this->table_prefix) && strtolower($this->table_prefix.'options') == strtolower($table))) {
1623
  if (strtolower(substr(PHP_OS, 0, 3)) == 'win') {
1636
  // If no check-in last time, then we could in future try the other method (but - any point in retrying slow method on large tables??)
1637
 
1638
  // New Jul 2014: This attempt to use bindump instead at a lower threshold is quite conservative - only if the last successful run was exactly two resumptions ago - may be useful to expand
1639
+ $bindump_threshold = (!$updraftplus->something_useful_happened && !empty($updraftplus->current_resumption) && (2 == $updraftplus->current_resumption - $updraftplus->last_successful_resumption)) ? 1000 : 8000;
1640
 
1641
  $bindump = (isset($rows) && ($rows>$bindump_threshold || (defined('UPDRAFTPLUS_ALWAYS_TRY_MYSQLDUMP') && UPDRAFTPLUS_ALWAYS_TRY_MYSQLDUMP)) && is_string($binsqldump)) ? $this->backup_table_bindump($binsqldump, $table, $where) : false;
1642
  if (true !== $bindump) $this->backup_table($table, $where, 'none', $table_type);
1668
  }
1669
  $time_this_run = time()-$updraftplus->opened_log_time;
1670
  if ($time_this_run > 2000) {
1671
+ // Have seen this happen; not sure how, but it was apparently deterministic; if the current process had been running for a long time, then apparently all database commands silently failed.
1672
+ // If we have been running that long, then the resumption may be far off; bring it closer
1673
  $updraftplus->reschedule(60);
1674
  $updraftplus->log("Have been running very long, and it seems the database went away; scheduling a resumption and terminating for now");
1675
  $updraftplus->record_still_alive();
1683
  // Race detection - with zip files now being resumable, these can more easily occur, with two running side-by-side
1684
  $backup_final_file_name = $backup_file_base.'-db'.$this->whichdb_suffix.'.gz';
1685
  $time_now = time();
1686
+ $time_mod = (int) @filemtime($backup_final_file_name);
1687
  if (file_exists($backup_final_file_name) && $time_mod>100 && ($time_now-$time_mod)<30) {
1688
  $updraftplus->terminate_due_to_activity($backup_final_file_name, $time_now, $time_mod);
1689
  }
1715
  $updraftplus->log(__("Failed to open database file for reading:", 'updraftplus').' '.$table_file.'.gz', 'error');
1716
  $errors++;
1717
  } else {
1718
+ while ($line = gzgets($handle, 65536)) {
1719
+ $this->stow($line);
1720
+ }
1721
  gzclose($handle);
1722
  $unlink_files[] = $this->updraft_dir.'/'.$table_file.'.gz';
1723
  }
1724
  $sind++;
1725
  // Came across a database with 7600 tables... adding them all took over 500 seconds; and so when the resumption started up, no activity was detected
1726
+ if (0 == $sind % 100) $updraftplus->something_useful_happened();
1727
  }
1728
 
1729
  if (defined('DB_CHARSET') && DB_CHARSET) {
1773
 
1774
  // Deal with Windows/old MySQL setups with erroneous table prefixes differing in case
1775
  // Can't get binary mysqldump to make this transformation
1776
+ // $dump_as_table = ($this->duplicate_tables_exist == false && stripos($table, $this->table_prefix) === 0 && strpos($table, $this->table_prefix) !== 0) ? $this->table_prefix.substr($table, strlen($this->table_prefix)) : $table;
1777
 
1778
  $pfile = md5(time().rand()).'.tmp';
1779
  file_put_contents($this->updraft_dir.'/'.$pfile, "[mysqldump]\npassword=".$this->dbinfo['pass']."\n");
1780
 
1781
  // Note: escapeshellarg() adds quotes around the string
1782
+ if ($where) $where = "--where=".escapeshellarg($where);
1783
 
1784
  if (strtolower(substr(PHP_OS, 0, 3)) == 'win') {
1785
  $exec = "cd ".escapeshellarg(str_replace('/', '\\', $this->updraft_dir))." & ";
1803
  }
1804
  }
1805
  $ret = pclose($handle);
1806
+ if (0 != $ret) {
1807
  $updraftplus->log("Binary mysqldump: error (code: $ret)");
1808
  // Keep counter of failures? Change value of binsqldump?
1809
  } else {
1810
  if ($any_output) {
1811
+ $updraftplus->log("Table $table_name: binary mysqldump finished (writes: $writes) in ".sprintf("%.02f", max(microtime(true)-$microtime, 0.00001))." seconds");
1812
  $ret = true;
1813
  }
1814
  }
1824
  }
1825
 
1826
  /**
1827
+ * Taken partially from phpMyAdmin and partially from Alain Wolf, Zurich - Switzerland to use the WordPress $wpdb object
 
1828
  * Website: http://restkultur.ch/personal/wolf/scripts/db_backup/
1829
+ * Modified by Scott Merrill (http://www.skippy.net/)
1830
+ *
1831
+ * @param String $table Table to backup
1832
+ * @param String $where If there is a where clause to use
1833
+ * @param String $segment Specify a segment (not used in UD)
1834
+ * @param String $table_type Table type
1835
+ * @return Boolean
1836
  */
1837
  private function backup_table($table, $where = '', $segment = 'none', $table_type = 'BASE TABLE') {
1838
  global $updraftplus;
1841
  $total_rows = 0;
1842
 
1843
  // Deal with Windows/old MySQL setups with erroneous table prefixes differing in case
1844
+ $dump_as_table = (false == $this->duplicate_tables_exist && stripos($table, $this->table_prefix) === 0 && strpos($table, $this->table_prefix) !== 0) ? $this->table_prefix.substr($table, strlen($this->table_prefix)) : $table;
1845
 
1846
  $table_structure = $this->wpdb_obj->get_results("DESCRIBE ".$updraftplus->backquote($table));
1847
  if (!$table_structure) {
1848
+ // $updraftplus->log(__('Error getting table details','wp-db-backup') . ": $table", 'error');
1849
  return false;
1850
  }
1851
 
1852
+ if ('none' == $segment || 0 == $segment) {
1853
  // Add SQL statement to drop existing table
1854
  $this->stow("\n# Delete any existing table ".$updraftplus->backquote($table)."\n\n");
1855
  $this->stow("DROP TABLE IF EXISTS " . $updraftplus->backquote($dump_as_table) . ";\n");
1868
  $create_table = $this->wpdb_obj->get_results("SHOW CREATE TABLE ".$updraftplus->backquote($table), ARRAY_N);
1869
  if (false === $create_table) {
1870
  $err_msg ='Error with SHOW CREATE TABLE for '.$table;
1871
+ // $updraftplus->log($err_msg, 'error');
1872
  $this->stow("#\n# $err_msg\n#\n");
1873
  }
1874
  $create_line = $updraftplus->str_lreplace('TYPE=', 'ENGINE=', $create_table[0][1]);
1875
 
1876
+ // Remove PAGE_CHECKSUM parameter from MyISAM - was internal, undocumented, later removed (so causes errors on import)
1877
  if (preg_match('/ENGINE=([^\s;]+)/', $create_line, $eng_match)) {
1878
  $engine = $eng_match[1];
1879
  if ('myisam' == strtolower($engine)) {
1895
 
1896
  }
1897
 
1898
+ // Some tables have optional data, and should be skipped if they do not work
1899
  $table_sans_prefix = substr($table, strlen($this->table_prefix_raw));
1900
  $data_optional_tables = ('wp' == $this->whichdb) ? apply_filters('updraftplus_data_optional_tables', explode(',', UPDRAFTPLUS_DATA_OPTIONAL_TABLES)) : array();
1901
  if (in_array($table_sans_prefix, $data_optional_tables)) {
1906
  }
1907
 
1908
  // In UpdraftPlus, segment is always 'none'
1909
+ if ('VIEW' != $table_type && ('none' == $segment || 0 <= $segment)) {
1910
  $defs = array();
1911
  $integer_fields = array();
1912
  // $table_structure was from "DESCRIBE $table"
1913
  foreach ($table_structure as $struct) {
1914
+ if ((0 === strpos($struct->Type, 'tinyint')) || (0 === strpos(strtolower($struct->Type), 'smallint'))
1915
+ || (0 === strpos(strtolower($struct->Type), 'mediumint')) || (0 === strpos(strtolower($struct->Type), 'int')) || (0 === strpos(strtolower($struct->Type), 'bigint'))
1916
+ ) {
1917
  $defs[strtolower($struct->Field)] = (null === $struct->Default ) ? 'NULL' : $struct->Default;
1918
  $integer_fields[strtolower($struct->Field)] = "1";
1919
  }
1923
 
1924
  $increment = 1000;
1925
  if (!$updraftplus->something_useful_happened && !empty($updraftplus->current_resumption) && ($updraftplus->current_resumption - $updraftplus->last_successful_resumption > 1)) {
1926
+ // This used to be fixed at 500; but we (after a long time) saw a case that looked like an out-of-memory even at this level. We must be careful about going too low, though - otherwise we increase the risks of timeouts.
1927
  $increment = ($updraftplus->current_resumption - $updraftplus->last_successful_resumption > 2) ? 350 : 500;
1928
  }
1929
 
1945
 
1946
  $table_data = $this->wpdb_obj->get_results("SELECT * FROM ".$updraftplus->backquote($table)." $where LIMIT {$row_start}, {$row_inc}", ARRAY_A);
1947
  $entries = 'INSERT INTO '.$updraftplus->backquote($dump_as_table).' VALUES ';
1948
+ // \x08\\x09, not required
1949
+ if ($table_data) {
1950
  $thisentry = "";
1951
  foreach ($table_data as $row) {
1952
  $total_rows++;
1976
  } while (count($table_data) > 0 && 'none' == $segment);
1977
  }
1978
 
1979
+ if ('none' == $segment || $segment < 0) {
1980
  // Create footer/closing comment in SQL-file
1981
  $this->stow("\n# End of data contents of table ".$updraftplus->backquote($table)."\n\n");
1982
  }
1983
+ $updraftplus->log("Table $table: Total rows added: $total_rows in ".sprintf("%.02f", max(microtime(true)-$microtime, 0.00001))." seconds");
1984
 
1985
  }
1986
 
1987
  /*END OF WP-DB-BACKUP BLOCK */
1988
 
1989
+ /**
1990
+ * Encrypts the file if the option is set; returns the basename of the file (according to whether it was encrypted or nto)
1991
+ *
1992
+ * @param string $file file to encrypt
1993
+ * @return array
1994
+ */
1995
  public function encrypt_file($file) {
1996
  global $updraftplus;
1997
  $encryption = UpdraftPlus_Options::get_updraft_option('updraft_encryptionphrase');
2018
  die();
2019
  }
2020
  if (null === $result) {
2021
+ // $updraftplus->log(sprintf(__("As previously warned (see: %s), encryption is no longer a feature of the free edition of UpdraftPlus", 'updraftplus'), 'https://updraftplus.com/next-updraftplus-release-ready-testing/ + https://updraftplus.com/shop/updraftplus-premium/'), 'warning', 'needpremiumforcrypt');
2022
+ // UpdraftPlus_Options::update_updraft_option('updraft_encryptionphrase', '');
2023
  return basename($file);
2024
  }
2025
  return $result;
2032
  return ($this->dbhandle_isgz) ? gzclose($this->dbhandle) : fclose($this->dbhandle);
2033
  }
2034
 
2035
+ /**
2036
+ * Open a file, store its filehandle
2037
+ *
2038
+ * @param String $file Full path to the file to open
2039
+ * @param Boolean $allow_gz Use gzopen() if available, instead of fopen()
2040
+ * @return Resource - the opened file handle
2041
+ */
2042
  public function backup_db_open($file, $allow_gz = true) {
2043
+ if (function_exists('gzopen') && true == $allow_gz) {
2044
  $this->dbhandle = @gzopen($file, 'w');
2045
  $this->dbhandle_isgz = true;
2046
  } else {
2047
  $this->dbhandle = @fopen($file, 'w');
2048
  $this->dbhandle_isgz = false;
2049
  }
2050
+ if (false === $this->dbhandle) {
2051
  global $updraftplus;
2052
  $updraftplus->log("ERROR: $file: Could not open the backup file for writing");
2053
+ $updraftplus->log($file.": ".__("Could not open the backup file for writing", 'updraftplus'), 'error');
2054
  }
2055
  return $this->dbhandle;
2056
  }
2065
  public function stow($query_line) {
2066
  if ($this->dbhandle_isgz) {
2067
  if (false == ($ret = @gzwrite($this->dbhandle, $query_line))) {
2068
+ // $updraftplus->log(__('There was an error writing a line to the backup script:','wp-db-backup').' '.$query_line.' '.$php_errormsg, 'error');
2069
  }
2070
  } else {
2071
  if (false == ($ret = @fwrite($this->dbhandle, $query_line))) {
2072
+ // $updraftplus->log(__('There was an error writing a line to the backup script:','wp-db-backup').' '.$query_line.' '.$php_errormsg, 'error');
2073
  }
2074
  }
2075
  return $ret;
2081
  include(ABSPATH.WPINC.'/version.php');
2082
 
2083
  $mysql_version = $this->wpdb_obj->db_version();
2084
+ // (function_exists('mysql_get_server_info')) ? @mysql_get_server_info() : '?';
2085
 
2086
  if ('wp' == $this->whichdb) {
2087
  $wp_upload_dir = wp_upload_dir();
2109
  $label = $updraftplus->jobdata_get('label');
2110
  if (!empty($label)) $this->stow("# Label: $label\n");
2111
 
2112
+ $this->stow("\n# Generated: ".date("l j. F Y H:i T")."\n");
 
2113
  $this->stow("# Hostname: ".$this->dbinfo['host']."\n");
2114
  $this->stow("# Database: ".$updraftplus->backquote($this->dbinfo['name'])."\n");
2115
 
2132
  $this->stow("/*!40101 SET foreign_key_checks = 0 */;\n\n");
2133
  }
2134
 
2135
+
2136
  public function phpmailer_init($phpmailer) {
2137
  global $updraftplus;
2138
  if (empty($this->attachments) || !is_array($this->attachments)) return;
2146
  }
2147
  }
2148
 
2149
+ /**
2150
+ * This function recursively packs the zip, dereferencing symlinks but packing into a single-parent tree for universal unpacking
2151
+ *
2152
+ * @param String $fullpath Full path
2153
+ * @param String $use_path_when_storing Controls the path to use when storing in the zip file
2154
+ * @param String $original_fullpath Original path
2155
+ * @param Integer $startlevels How deep within the directory structure the recursive operation has gone
2156
+ * @param Array $exclude passed by reference so that we can remove elements as they are matched - saves time checking against already-dealt-with objects]
2157
+ * @return Boolean
2158
+ */
2159
  private function makezip_recursive_add($fullpath, $use_path_when_storing, $original_fullpath, $startlevels = 1, &$exclude) {
2160
 
2161
+ // $zipfile = $this->zip_basename.(($this->index == 0) ? '' : ($this->index+1)).'.zip.tmp';
2162
 
2163
  global $updraftplus;
2164
 
2175
  // Is the place we've ended up above the original base? That leads to infinite recursion
2176
  if (($fullpath !== $original_fullpath && strpos($original_fullpath, $fullpath) === 0) || ($original_fullpath == $fullpath && ((1== $startlevels && strpos($use_path_when_storing, '/') !== false) || (2 == $startlevels && substr_count($use_path_when_storing, '/') >1)))) {
2177
  $updraftplus->log("Infinite recursion: symlink led us to $fullpath, which is within $original_fullpath");
2178
+ $updraftplus->log(__("Infinite recursion: consult your log for more information", 'updraftplus'), 'error');
2179
  return false;
2180
  }
2181
 
2182
+ // This is sufficient for the ones we have exclude options for - uploads, others, wpcore
2183
  $stripped_storage_path = (1 == $startlevels) ? $use_path_when_storing : substr($use_path_when_storing, strpos($use_path_when_storing, '/') + 1);
2184
  if (false !== ($fkey = array_search($stripped_storage_path, $exclude))) {
2185
  $updraftplus->log("Entity excluded by configuration option: $stripped_storage_path");
2202
  if ($mtime > 0 && $mtime > $if_altered_since) {
2203
  $this->zipfiles_batched[$fullpath] = $key;
2204
  $this->makezip_recursive_batchedbytes += @filesize($fullpath);
2205
+ // @touch($zipfile);
2206
  } else {
2207
  $this->zipfiles_skipped_notaltered[$fullpath] = $key;
2208
  }
2230
 
2231
  if (!$dir_handle = @opendir($fullpath)) {
2232
  $updraftplus->log("Failed to open directory: $fullpath");
2233
+ $updraftplus->log(sprintf(__("Failed to open directory (check the file permissions and ownership): %s", 'updraftplus'), $fullpath), 'error');
2234
  return false;
2235
  }
2236
 
2256
  if ($mtime > 0 && $mtime > $if_altered_since) {
2257
  $this->zipfiles_batched[$deref] = $use_path_when_storing.'/'.$e;
2258
  $this->makezip_recursive_batchedbytes += @filesize($deref);
2259
+ // @touch($zipfile);
2260
  } else {
2261
  $this->zipfiles_skipped_notaltered[$deref] = $use_path_when_storing.'/'.$e;
2262
  }
2267
  }
2268
  } elseif (is_dir($deref)) {
2269
 
2270
+ // $link_target = readlink($deref);
2271
+ // $updraftplus->log("Symbolic link $use_path_when_storing/$e -> $link_target");
2272
 
2273
  $this->makezip_recursive_add($deref, $use_path_when_storing.'/'.$e, $original_fullpath, $startlevels, $exclude);
2274
  }
2385
  return unserialize($var);
2386
  }
2387
 
2388
+
2389
+
2390
+ /**
2391
+ * Make Zip File. $destination is the temporary file (ending in .tmp)
2392
+ *
2393
+ * @param Array|String $source Caution: $source is allowed to be an array, not just a filename
2394
+ * @param String $backup_file_basename Name of backup file
2395
+ * @param String $whichone Backup entity type (e.g. 'plugins')
2396
+ * @param Boolean $retry_on_error Set to retry upon error
2397
+ * @return Boolean
2398
+ */
2399
  private function make_zipfile($source, $backup_file_basename, $whichone, $retry_on_error = true) {
2400
 
2401
  global $updraftplus;
2407
  $destination = $this->updraft_dir.'/'.$destination_base;
2408
 
2409
  // Legacy/redundant
2410
+ // if (empty($whichone) && is_string($whichone)) $whichone = basename($source);
2411
 
2412
  // When to prefer PCL:
2413
  // - We were asked to
2416
 
2417
  // We need meta-info about $whichone
2418
  $backupable_entities = $updraftplus->get_backupable_file_entities(true, false);
2419
+ // This is only used by one corner-case in BinZip
2420
+ // $this->make_zipfile_source = (isset($backupable_entities[$whichone])) ? $backupable_entities[$whichone] : $source;
2421
  $this->make_zipfile_source = (is_array($source) && isset($backupable_entities[$whichone])) ? (('uploads' == $whichone) ? dirname($backupable_entities[$whichone]) : $backupable_entities[$whichone]) : dirname($source);
2422
 
2423
  $this->existing_files = array();
2424
+ // Used for tracking compression ratios
2425
  $this->existing_files_rawsize = 0;
2426
  $this->existing_zipfiles_size = 0;
2427
 
2428
  // Enumerate existing files
2429
  // Usually first_linked_index is zero; the exception being with more files, where previous zips' contents are irrelevant
2430
  for ($j=$this->first_linked_index; $j<=$this->index; $j++) {
2431
+ $jtext = (0 == $j) ? '' : ($j+1);
2432
+ // This is, in a non-obvious way, compatible with filenames which indicate increments
2433
+ // $j does not need to start at zero; it should start at the index which the current entity split at. However, this is not directly known, and can only be deduced from examining the filenames. And, for other indexes from before the current increment, the searched-for filename won't exist (even if there is no cloud storage). So, this indirectly results in the desired outcome when we start from $j=0.
2434
  $examine_zip = $this->updraft_dir.'/'.$backup_file_basename.'-'.$whichone.$jtext.'.zip'.(($j == $this->index) ? '.tmp' : '');
2435
 
2436
  // This comes from https://wordpress.org/support/topic/updraftplus-not-moving-all-files-to-remote-server - where it appears that the jobdata's record of the split was done (i.e. database write), but the *earlier* rename of the .tmp file was not done (i.e. I/O lost). i.e. In theory, this should be impossible; but, the sychnronicity apparently cannot be fully relied upon in some setups. The check for the index being one behind is being conservative - there's no inherent reason why it couldn't be done for other indexes.
2457
  $updraftplus->log("Could not open zip file to examine (".$zip->last_error."); will remove: ".basename($examine_zip));
2458
  @unlink($examine_zip);
2459
  } else {
2460
+ // Don't put this in the for loop, or the magic __get() method gets called and opens the zip file every time the loop goes round
 
2461
  $numfiles = $zip->numFiles;
2462
 
2463
  for ($i=0; $i < $numfiles; $i++) {
2472
 
2473
  $updraftplus->log(basename($examine_zip).": Zip file already exists, with ".count($this->existing_files)." files");
2474
 
2475
+ // try_split is set if there have been no check-ins recently - or if it needs to be split anyway
2476
  if ($j == $this->index) {
2477
  if (isset($this->try_split)) {
2478
  if (filesize($examine_zip) > 50*1048576) {
2479
+ // We could, as a future enhancement, save this back to the job data, if we see a case that needs it
2480
  $this->zip_split_every = max(
2481
+ (int) $this->zip_split_every/2,
2482
  UPDRAFTPLUS_SPLIT_MIN*1048576,
2483
  min(filesize($examine_zip)-1048576, $this->zip_split_every)
2484
  );
2485
+ $updraftplus->jobdata_set('split_every', (int) ($this->zip_split_every/1048576));
2486
  $updraftplus->log("No check-in on last two runs; bumping index and reducing zip split to: ".round($this->zip_split_every/1048576, 1)." MB");
2487
  $do_bump_index = true;
2488
  }
2513
 
2514
  $error_occurred = false;
2515
 
2516
+ // Store this in its original form
2517
  $this->source = $source;
2518
 
2519
+ // Reset. This counter is used only with PcLZip, to decide if it's better to do it all-in-one
2520
  $this->makezip_recursive_batchedbytes = 0;
2521
  if (!is_array($source)) $source=array($source);
2522
 
2542
  // Cache files exist; shall we use them?
2543
  $mtime = filemtime($cache_file_base.'-zfd.gz.tmp');
2544
  // Require < 30 minutes old
2545
+ if (time() - $mtime < 1800) {
2546
+ $use_cache_files = true;
2547
+ }
2548
  $any_failures = false;
2549
  if ($use_cache_files) {
2550
  $var = $this->unserialize_gz_cache_file($cache_file_base.'-zfd.gz.tmp');
2557
  $var = maybe_unserialize(file_get_contents($cache_file_base.'-info.tmp'));
2558
  if (is_array($var) && isset($var['makezip_recursive_batchedbytes'])) {
2559
  $this->makezip_recursive_batchedbytes = $var['makezip_recursive_batchedbytes'];
2560
+ if (file_exists($cache_file_base.'-zfs.gz.tmp')) {
2561
  $var = $this->unserialize_gz_cache_file($cache_file_base.'-zfs.gz.tmp');
2562
  if (is_array($var)) {
2563
  $this->zipfiles_skipped_notaltered = $var;
2598
  $this->excluded_prefixes = $this->get_excluded_prefixes($exclude);
2599
 
2600
  foreach ($source as $element) {
2601
+ // makezip_recursive_add($fullpath, $use_path_when_storing, $original_fullpath, $startlevels = 1, $exclude_array)
2602
  if ('uploads' == $whichone) {
2603
  if (empty($got_uploads_from_cache)) {
2604
  $dirname = dirname($element);
2621
 
2622
  // Cache the file scan, if it looks like it'll be useful
2623
  // We use gzip to reduce the size as on hosts which limit disk I/O, the cacheing may make things worse
2624
+ // || 'others' == $whichone
2625
+ if (('uploads' == $whichone || 'others' == $whichone) && !$error_occurred && function_exists('gzopen') && function_exists('gzwrite')) {
2626
  $cache_file_base = $this->zip_basename.'-cachelist-'.$this->makezip_if_altered_since;
2627
 
2628
  // Just approximate - we're trying to avoid an otherwise-unpredictable PHP fatal error. Cacheing only happens if file enumeration took a long time - so presumably there are very many.
2629
  $memory_needed_estimate = 0;
2630
+ foreach ($this->zipfiles_batched as $k => $v) {
2631
+ $memory_needed_estimate += strlen($k)+strlen($v)+12;
2632
+ }
2633
 
2634
  // We haven't bothered to check if we just fetched the files from cache, as that shouldn't take a long time and so shouldn't trigger this
2635
  // Let us suppose we need 15% overhead for gzipping
2655
  $final = gzwrite($whandle, $buf);
2656
  unset($buf);
2657
 
2658
+ // $serialised = serialize($this->zipfiles_batched);
2659
+ // $updraftplus->log("Actual uncompressed bytes: ".round(strlen($serialised)/1024, 1)." Kb");
2660
+ // if (!gzwrite($whandle, $serialised)) {
2661
  if (!$final) {
2662
  @unlink($cache_file_base.'-zfb.gz.tmp');
2663
  @gzclose($whandle);
2695
  @unlink($cache_file_base.'-zfd.gz.tmp');
2696
  @unlink($cache_file_base.'-zfb.gz.tmp');
2697
  @unlink($cache_file_base.'-info.tmp');
2698
+ // @codingStandardsIgnoreLine
2699
  } else {
2700
  // Success.
2701
  }
2726
 
2727
  if (count($this->zipfiles_dirbatched) > 0 || count($this->zipfiles_batched) > 0) {
2728
 
2729
+ $updraftplus->log(sprintf("Total entities for the zip file: %d directories, %d files (%d skipped as non-modified), %s MB", count($this->zipfiles_dirbatched), count($this->zipfiles_batched), count($this->zipfiles_skipped_notaltered), round($this->makezip_recursive_batchedbytes/1048576, 1)));
2730
 
2731
  // No need to warn if we're going to retry anyway. (And if we get killed, the zip will be rescanned for its contents upon resumption).
2732
  $warn_on_failures = ($retry_on_error) ? false : true;
2764
 
2765
  // zipfiles_added > 0 means that $zip->close() has been called. i.e. An attempt was made to add something: something _should_ be there.
2766
  // Why return true even if $error_occurred may be set? 1) Because in that case, a warning has already been logged. 2) Because returning false causes an error to be logged, which means it'll all be retried again. Also 3) this has been the pattern of the code for a long time, and the algorithm has been proven in the real-world: don't change what's not broken.
2767
+ // (file_exists($destination) || $this->index == $original_index) might be an alternative to $this->zipfiles_added > 0 - ? But, don't change what's not broken.
2768
+ if (false == $error_occurred || $this->zipfiles_added > 0) {
2769
  return true;
2770
  } else {
2771
  $updraftplus->log("makezip failure: zipfiles_added=".$this->zipfiles_added.", error_occurred=".$error_occurred." (method=".$this->use_zip_object.")");
2775
  }
2776
 
2777
  private function basename($element) {
2778
+ // This function is an ugly, conservative workaround for https://bugs.php.net/bug.php?id=62119. It does not aim to always work-around, but to ensure that nothing is made worse.
2779
  $dirname = dirname($element);
2780
  $basename_manual = preg_replace('#^[\\/]+#', '', substr($element, strlen($dirname)));
2781
  $basename = basename($element);
2800
  return false;
2801
  }
2802
 
2803
+ /**
2804
+ * This method will add a manifest file to the backup zip
2805
+ *
2806
+ * @param String $whichone - the type of backup (e.g. 'plugins', 'themes')
2807
+ *
2808
+ * @return Boolean - success/failure status
2809
+ */
2810
+ private function updraftplus_include_manifest($whichone) {
2811
+ global $updraftplus;
2812
+
2813
+ if ('incremental' != $updraftplus->jobdata_get('job_type')) return;
2814
+
2815
+ $manifest_name = "updraftplus-manifest.json";
2816
+ $manifest = trailingslashit($this->updraft_dir).$manifest_name;
2817
+
2818
+ $updraftplus->log(sprintf("Creating file manifest ($manifest_name) for incremental backup (included: %d, skipped: %d)", count($this->zipfiles_batched), count($this->zipfiles_skipped_notaltered)));
2819
+
2820
+ if (false === ($handle = fopen($manifest, 'w+'))) return $updraftplus->log("Failed to open manifest file ($manifest_name)");
2821
+
2822
+ $this->manifest_path = $manifest;
2823
+
2824
+ $version = 1;
2825
+
2826
+ $go_to_levels = array(
2827
+ 'plugins' => 2,
2828
+ 'themes' => 2,
2829
+ 'uploads' => 3,
2830
+ 'others' => 3
2831
+ );
2832
+
2833
+ $go_to_levels = apply_filters('updraftplus_manifest_go_to_level', $go_to_levels, $whichone);
2834
+
2835
+ $go_to_level = isset($go_to_levels[$whichone]) ? $go_to_levels[$whichone] : 'all';
2836
+
2837
+ if (false === fwrite($handle, '{"version":'.$version.',"type":"'.$whichone.'","listed_levels":"'.$go_to_level.'","contents":{"directories":[')) $updraftplus->log("First write to manifest file failed ($manifest_name)");
2838
+
2839
+ // First loop: find out which is the last entry, so that we don't write the comma after it
2840
+ $last_file_index = false;
2841
+ foreach ($this->zipfiles_dirbatched as $index => $dir) {
2842
+ if ('all' !== $go_to_level && substr_count($dir, '/') > $go_to_level - 1) continue;
2843
+ $last_file_index = $index;
2844
+ }
2845
+
2846
+ // Second loop: write out the entry
2847
+ foreach ($this->zipfiles_dirbatched as $index => $dir) {
2848
+ if ('all' !== $go_to_level && substr_count($dir, '/') > $go_to_level - 1) continue;
2849
+ fwrite($handle, json_encode($dir).(($index != $last_file_index) ? ',' : ''));
2850
+ }
2851
+
2852
+ // Now do the same for files
2853
+ fwrite($handle, '],"files":[');
2854
+
2855
+ $last_file_index = false;
2856
+ foreach ($this->zipfiles_batched as $index => $dir) {
2857
+ if ('all' !== $go_to_level && substr_count($dir, '/') > $go_to_level - 1) continue;
2858
+ $last_file_index = $index;
2859
+ }
2860
+
2861
+ foreach ($this->zipfiles_batched as $index => $dir) {
2862
+ if ('all' !== $go_to_level && substr_count($dir, '/') > $go_to_level - 1) continue;
2863
+ fwrite($handle, json_encode($dir).(($index != $last_file_index) ? ',' : ''));
2864
+ }
2865
+
2866
+ $last_file_index = false;
2867
+ foreach ($this->zipfiles_skipped_notaltered as $index => $dir) {
2868
+ if ('all' !== $go_to_level && substr_count($dir, '/') > $go_to_level - 1) continue;
2869
+ $last_file_index = $index;
2870
+ }
2871
+
2872
+ foreach ($this->zipfiles_skipped_notaltered as $index => $dir) {
2873
+ if ('all' !== $go_to_level && substr_count($dir, '/') > $go_to_level - 1) continue;
2874
+ fwrite($handle, json_encode($dir).(($index != $last_file_index) ? ',' : ''));
2875
+ }
2876
+
2877
+ fwrite($handle, ']}}');
2878
+ fclose($handle);
2879
+
2880
+ $this->zipfiles_batched[$manifest] = $manifest_name;
2881
+
2882
+ $updraftplus->log("Successfully created file manifest (size: ".filesize($manifest).")");
2883
+
2884
+ return true;
2885
+ }
2886
+
2887
  // Q. Why don't we only open and close the zip file just once?
2888
  // A. Because apparently PHP doesn't write out until the final close, and it will return an error if anything file has vanished in the meantime. So going directory-by-directory reduces our chances of hitting an error if the filesystem is changing underneath us (which is very possible if dealing with e.g. 1GB of files)
2889
 
2890
+ /**
2891
+ * We batch up the files, rather than do them one at a time. So we are more efficient than open,one-write,close.
2892
+ * To call into here, the array $this->zipfiles_batched must be populated (keys=paths, values=add-to-zip-as values). It gets reset upon exit from here.
2893
+ *
2894
+ * @param Boolean $warn_on_failures See if it warns on faliures or not
2895
+ * @return Boolean|WP_Error
2896
+ */
2897
  private function makezip_addfiles($warn_on_failures) {
2898
 
2899
  global $updraftplus;
2900
 
2901
+ // Used to detect requests to bump the size
2902
  $bump_index = false;
2903
  $ret = true;
2904
 
2905
+ $zipfile = $this->zip_basename.((0 == $this->index) ? '' : ($this->index+1)).'.zip.tmp';
2906
 
2907
  $maxzipbatch = $updraftplus->jobdata_get('maxzipbatch', 26214400);
2908
+ if ((int) $maxzipbatch < 1024) $maxzipbatch = 26214400;
2909
 
2910
  // Short-circuit the null case, because we want to detect later if something useful happenned
2911
  if (count($this->zipfiles_dirbatched) == 0 && count($this->zipfiles_batched) == 0) return true;
2912
 
2913
+ // If on PclZip, then if possible short-circuit to a quicker method (makes a huge time difference - on a folder of 1500 small files, 2.6s instead of 76.6)
2914
+ // This assumes that makezip_addfiles() is only called once so that we know about all needed files (the new style)
2915
+ // This is rather conservative - because it assumes zero compression. But we can't know that in advance.
2916
  $force_allinone = false;
2917
  if (0 == $this->index && $this->makezip_recursive_batchedbytes < $this->zip_split_every) {
2918
+ // So far, we only have a processor for this for PclZip; but that check can be removed - need to address the below items
2919
+ // TODO: Is this really what we want? Always go all-in-one for < 500MB???? Should be more conservative? Or, is it always faster to go all-in-one? What about situations where we might want to auto-split because of slowness - check that that is still working.
2920
+ // TODO: Test this new method for PclZip - are we still getting the performance gains? Test for ZipArchive too.
2921
  if ('UpdraftPlus_PclZip' == $this->use_zip_object && ($this->makezip_recursive_batchedbytes < 512*1048576 || (defined('UPDRAFTPLUS_PCLZIP_FORCEALLINONE') && UPDRAFTPLUS_PCLZIP_FORCEALLINONE == true && 'UpdraftPlus_PclZip' == $this->use_zip_object))) {
2922
  $updraftplus->log("Only one archive required (".$this->use_zip_object.") - will attempt to do in single operation (data: ".round($this->makezip_recursive_batchedbytes/1024, 1)." KB, split: ".round($this->zip_split_every/1024, 1)." KB)");
2923
+ // $updraftplus->log("PclZip, and only one archive required - will attempt to do in single operation (data: ".round($this->makezip_recursive_batchedbytes/1024, 1)." KB, split: ".round($this->zip_split_every/1024, 1)." KB)");
2924
  $force_allinone = true;
2925
+ // if(!class_exists('PclZip')) require_once(ABSPATH.'/wp-admin/includes/class-pclzip.php');
2926
+ // $zip = new PclZip($zipfile);
2927
+ // $remove_path = ($this->whichone == 'wpcore') ? untrailingslashit(ABSPATH) : WP_CONTENT_DIR;
2928
+ // $add_path = false;
2929
+ // Remove prefixes
2930
+ // $backupable_entities = $updraftplus->get_backupable_file_entities(true);
2931
+ // if (isset($backupable_entities[$this->whichone])) {
2932
+ // if ('plugins' == $this->whichone || 'themes' == $this->whichone || 'uploads' == $this->whichone) {
2933
+ // $remove_path = dirname($backupable_entities[$this->whichone]);
2934
+ // To normalise instead of removing (which binzip doesn't support, so we don't do it), you'd remove the dirname() in the above line, and uncomment the below one.
2935
+ // #$add_path = $this->whichone;
2936
+ // } else {
2937
+ // $remove_path = $backupable_entities[$this->whichone];
2938
+ // }
2939
+ // }
2940
+ // if ($add_path) {
2941
+ // $zipcode = $zip->create($this->source, PCLZIP_OPT_REMOVE_PATH, $remove_path, PCLZIP_OPT_ADD_PATH, $add_path);
2942
+ // } else {
2943
+ // $zipcode = $zip->create($this->source, PCLZIP_OPT_REMOVE_PATH, $remove_path);
2944
+ // }
2945
+ // if ($zipcode == 0) {
2946
+ // $updraftplus->log("PclZip Error: ".$zip->errorInfo(true), 'warning');
2947
+ // return $zip->errorCode();
2948
+ // } else {
2949
+ // $updraftplus->something_useful_happened();
2950
+ // return true;
2951
+ // }
2952
  }
2953
  }
2954
 
2955
  // 05-Mar-2013 - added a new check on the total data added; it appears that things fall over if too much data is contained in the cumulative total of files that were addFile'd without a close-open cycle; presumably data is being stored in memory. In the case in question, it was a batch of MP3 files of around 100MB each - 25 of those equals 2.5GB!
2956
 
2957
  $data_added_since_reopen = 0;
2958
+ // The following array is used only for error reporting if ZipArchive::close fails (since that method itself reports no error messages - we have to track manually what we were attempting to add)
2959
  $files_zipadded_since_open = array();
2960
 
2961
  $zip = new $this->use_zip_object;
2969
  $original_size = 0;
2970
  }
2971
 
2972
+ if (true !== $opencode) return new WP_Error('no_open', sprintf(__('Failed to open the zip file (%s) - %s', 'updraftplus'), $zipfile, $zip->last_error));
2973
+
2974
+ if (apply_filters('updraftplus_include_manifest', false, $this->whichone, $this)) {
2975
+ $this->updraftplus_include_manifest($this->whichone);
2976
+ }
2977
 
2978
  // Make sure all directories are created before we start creating files
2979
+ while ($dir = array_pop($this->zipfiles_dirbatched)) {
2980
+ $zip->addEmptyDir($dir);
2981
+ }
2982
  $zipfiles_added_thisbatch = 0;
2983
 
2984
  // Go through all those batched files
3023
  - more than 500 files batched (should perhaps intelligently lower this as the zip file gets bigger - not yet needed)
3024
  */
3025
 
3026
+ // Add 10% margin. It only really matters when the OS has a file size limit, exceeding which causes failure (e.g. 2GB on 32-bit)
3027
+ // Since we don't test before the file has been created (so that zip_last_ratio has meaningful data), we rely on max_zip_batch being less than zip_split_every - which should always be the case
3028
  $reaching_split_limit = ($this->zip_last_ratio > 0 && $original_size>0 && ($original_size + 1.1*$data_added_since_reopen*$this->zip_last_ratio) > $this->zip_split_every) ? true : false;
3029
 
3030
  if (!$force_allinone && ($zipfiles_added_thisbatch > UPDRAFTPLUS_MAXBATCHFILES || $reaching_split_limit || $data_added_since_reopen > $maxzipbatch || (time() - $this->zipfiles_lastwritetime) > 2)) {
3034
 
3035
  if ($data_added_since_reopen > $maxzipbatch) {
3036
  $something_useful_sizetest = true;
3037
+ $updraftplus->log("Adding batch to zip file (".$this->use_zip_object."): over ".round($maxzipbatch/1048576, 1)." MB added on this batch (".round($data_added_since_reopen/1048576, 1)." MB, ".count($this->zipfiles_batched)." files batched, $zipfiles_added_thisbatch (".$this->zipfiles_added_thisrun.") added so far); re-opening (prior size: ".round($original_size/1024, 1).' KB)');
3038
  } elseif ($zipfiles_added_thisbatch > UPDRAFTPLUS_MAXBATCHFILES) {
3039
+ $updraftplus->log("Adding batch to zip file (".$this->use_zip_object."): over ".UPDRAFTPLUS_MAXBATCHFILES." files added on this batch (".round($data_added_since_reopen/1048576, 1)." MB, ".count($this->zipfiles_batched)." files batched, $zipfiles_added_thisbatch (".$this->zipfiles_added_thisrun.") added so far); re-opening (prior size: ".round($original_size/1024, 1).' KB)');
3040
  } elseif (!$reaching_split_limit) {
3041
+ $updraftplus->log("Adding batch to zip file (".$this->use_zip_object."): over 2.0 seconds have passed since the last write (".round($data_added_since_reopen/1048576, 1)." MB, $zipfiles_added_thisbatch (".$this->zipfiles_added_thisrun.") files added so far); re-opening (prior size: ".round($original_size/1024, 1).' KB)');
3042
  } else {
3043
+ $updraftplus->log("Adding batch to zip file (".$this->use_zip_object."): possibly approaching split limit (".round($data_added_since_reopen/1048576, 1)." MB, $zipfiles_added_thisbatch (".$this->zipfiles_added_thisrun.") files added so far); last ratio: ".round($this->zip_last_ratio, 4)."; re-opening (prior size: ".round($original_size/1024, 1).' KB)');
3044
  }
3045
 
3046
  if (!$zip->close()) {
3051
 
3052
  $zipfiles_added_thisbatch = 0;
3053
 
3054
+ // This triggers a re-open, later
3055
  unset($zip);
3056
  $files_zipadded_since_open = array();
3057
  // Call here, in case we've got so many big files that we don't complete the whole routine
3058
  if (filesize($zipfile) > $original_size) {
3059
 
3060
+ // It is essential that this does not go above 1, even though in reality (and this can happen at the start, if just 1 file is added (e.g. due to >2.0s detection) the 'compressed' zip file may be *bigger* than the files stored in it. When that happens, if the ratio is big enough, it can then fire the "approaching split limit" detection (very) prematurely
3061
  $this->zip_last_ratio = ($data_added_since_reopen > 0) ? min((filesize($zipfile) - $original_size)/$data_added_since_reopen, 1) : 1;
3062
 
3063
+ // We need a rolling update of this
3064
  $original_size = filesize($zipfile);
3065
 
3066
+ // Move on to next zip?
3067
  if ($reaching_split_limit || filesize($zipfile) > $this->zip_split_every) {
3068
  $bump_index = true;
3069
+ // Take the filesize now because later we wanted to know we did clearstatcache()
3070
  $bumped_at = round(filesize($zipfile)/1048576, 1);
3071
  }
3072
 
3073
+ // Need to make sure that something_useful_happened() is always called
3074
 
3075
+ // How long since the current run began? If it's taken long (and we're in danger of not making it at all), or if that is forseeable in future because of general slowness, then we should reduce the parameters.
3076
  if (!$something_useful_sizetest) {
3077
  $updraftplus->something_useful_happened();
3078
  } else {
3114
  // How much can we increase it by?
3115
  if ($normalised_time_since_began <6) {
3116
  if ($run_times_known > 0 && $max_time >0) {
3117
+ $new_maxzipbatch = min(floor(max($maxzipbatch*6/$normalised_time_since_began, $maxzipbatch*((0.6*$max_time)/$normalised_time_since_began))), 200*1024*1024);
 
 
 
3118
  } else {
3119
+ // Maximum of 200MB in a batch
3120
  $new_maxzipbatch = min(floor($maxzipbatch*6/$normalised_time_since_began), 200*1024*1024);
3121
  }
3122
  } else {
3124
  $new_maxzipbatch = min(floor($maxzipbatch*((0.6*$max_time)/$normalised_time_since_began)), 200*1024*1024);
3125
  }
3126
 
3127
+ // Throttle increases - don't increase by more than 2x in one go - ???
3128
+ // $new_maxzipbatch = floor(min(2*$maxzipbatch, $new_maxzipbatch));
3129
+ // Also don't allow anything that is going to be more than 18 seconds - actually, that's harmful because of the basically fixed time taken to copy the file
3130
+ // $new_maxzipbatch = floor(min(18*$rate ,$new_maxzipbatch));
3131
 
3132
+ // Don't go above the split amount (though we expect that to be higher anyway, unless sending via email)
3133
  $new_maxzipbatch = min($new_maxzipbatch, $this->zip_split_every);
3134
 
3135
+ // Don't raise it above a level that failed on a previous run
3136
  $maxzipbatch_ceiling = $updraftplus->jobdata_get('maxzipbatch_ceiling');
3137
  if (is_numeric($maxzipbatch_ceiling) && $maxzipbatch_ceiling > 20*1024*1024 && $new_maxzipbatch > $maxzipbatch_ceiling) {
3138
  $updraftplus->log("Was going to raise maxzipbytes to $new_maxzipbatch, but this is too high: a previous failure led to the ceiling being set at $maxzipbatch_ceiling, which we will use instead");
3183
  }
3184
  $data_added_since_reopen = 0;
3185
  } else {
3186
+ // ZipArchive::close() can take a very long time, which we want to know about
3187
  $updraftplus->record_still_alive();
3188
  }
3189
 
3224
  $original_size = 0;
3225
  }
3226
 
3227
+ if (true !== $opencode) return new WP_Error('no_open', sprintf(__('Failed to open the zip file (%s) - %s', 'updraftplus'), $zipfile, $zip->last_error));
3228
  }
3229
 
3230
  }
3231
 
3232
+ // Reset array
3233
  $this->zipfiles_batched = array();
3234
  $this->zipfiles_skipped_notaltered = array();
3235
 
3236
  if (false == ($nret = $zip->close())) $this->record_zip_error($files_zipadded_since_open, $zip->last_error, $warn_on_failures);
3237
 
3238
+ if (apply_filters('updraftplus_include_manifest', false, $this->whichone, $this)) {
3239
+ if (!empty($this->manifest_path) && file_exists($this->manifest_path)) {
3240
+ $updraftplus->log('Removing manifest file: '.basename($this->manifest_path).': '.(@unlink($this->manifest_path) ? 'OK' : 'failed'));
3241
+ }
3242
+ }
3243
 
3244
  $this->zipfiles_lastwritetime = time();
3245
+ // May not exist if the last thing we did was bump
3246
  if (file_exists($zipfile) && filesize($zipfile) > $original_size) $updraftplus->something_useful_happened();
3247
 
3248
+ // Move on to next archive?
3249
  if (file_exists($zipfile) && filesize($zipfile) > $this->zip_split_every) {
3250
+ $updraftplus->log(sprintf("Zip size has gone over split limit (%s, %s) - bumping index (%d)", round(filesize($zipfile)/1048576, 1), round($this->zip_split_every/1048576, 1), $this->index));
3251
  $this->bump_index();
3252
  }
3253
 
central/bootstrap.php CHANGED
@@ -2,6 +2,10 @@
2
 
3
  if (!defined('UPDRAFTPLUS_DIR')) die('No access.');
4
 
 
 
 
 
5
  // This file is included during plugins_loaded
6
 
7
  // Load the listener class that we rely on to pick up messages
@@ -24,8 +28,8 @@ class UpdraftPlus_UpdraftCentral_Main {
24
  'updates' => 'UpdraftCentral_Updates_Commands',
25
  'users' => 'UpdraftCentral_Users_Commands',
26
  'comments' => 'UpdraftCentral_Comments_Commands',
27
- 'updraftvault' => 'UpdraftCentral_UpdraftVault_Commands',
28
- 'analytics' => 'UpdraftCentral_Analytics_Commands'
29
  ));
30
 
31
  // If nothing was sent, then there is no incoming message, so no need to set up a listener (or CORS request, etc.). This avoids a DB SELECT query on the option below in the case where it didn't get autoloaded, which is the case when there are no keys.
@@ -233,7 +237,7 @@ class UpdraftPlus_UpdraftCentral_Main {
233
  $created['keys_guide'] = '<h2 class="updraftcentral_wizard_success">'. __('UpdraftCentral key created successfully') .'</h2>';
234
 
235
  if ('__updraftpluscom' != $where_send) {
236
- $created['keys_guide'] .= '<div class="updraftcentral_wizard_success"><p>'.sprintf(__('You now need to copy the key below and enter it at your %s.', 'updraftplus'), '<a href="'.$where_send.'">UpdraftCentral dashboard</a>').'</p><p>'.sprintf(__('Detailed instructions for this can be found at %s', 'updraftplus'), '<a target="_blank" href="https://updraftplus.com/updraftcentral-how-to-add-a-site/">UpdraftPlus.com</a>').'</p></div>';
237
  } else {
238
  $created['keys_guide'] .= '<div class="updraftcentral_wizard_success"><p>'. sprintf(__('You can now control this site via your UpdraftCentral dashboard at %s.', 'updraftplus'), '<a target="_blank" href="http://updraftplus.com/my-account/remote-control/">UpdraftPlus.com</a>').'</p></div>';
239
  }
@@ -446,7 +450,7 @@ class UpdraftPlus_UpdraftCentral_Main {
446
 
447
  ob_start();
448
  ?>
449
- <div id="updraftcentral_keys_content">
450
  <?php if (!empty($our_keys)) { ?>
451
  <a href="#" class="updraftcentral_keys_show hidden-in-updraftcentral"><?php printf(__('Manage existing keys (%d)...', 'updraftplus'), count($our_keys)); ?></a>
452
  <?php } ?>
@@ -470,36 +474,43 @@ class UpdraftPlus_UpdraftCentral_Main {
470
  return ob_get_clean();
471
  }
472
 
473
- private function create_key_markup(){
474
  ob_start();
475
  ?>
476
  <div class="create_key_container">
477
  <h4 class="updraftcentral_wizard_stage1"> <?php _e('Connect this site to an UpdraftCentral dashboard found at...', 'updraftplus'); ?></h4>
478
- <table style="width: auto; table-layout:fixed;">
479
  <thead></thead>
480
  <tbody>
481
- <tr class="updraft_debugrow updraftcentral_wizard_stage1">
482
  <td>
483
- <label>
484
- <input checked="checked" type="radio" name="updraftcentral_mothership" id="updraftcentral_mothership_updraftpluscom">
485
- UpdraftPlus.Com (<?php printf(__('i.e. if you have %s there', 'updraftplus'), '<a target="_blank" href="https://updraftplus.com/my-account/">'.__('an account', 'updraftplus').'</a>'); ?>)
486
- </label>
487
- <br>
488
- <label>
489
- <input type="radio" name="updraftcentral_mothership" id="updraftcentral_mothership_other">
490
- <?php echo __('On my own website on which I have installed', 'updraftplus').' <a target="_blank" href="https://wordpress.org/plugins/updraftcentral/">'.__('the UpdraftCentral dashboard plugin', 'updraftplus').'</a>'; ?>
491
- </label>
492
- <br>
493
- <input disabled="disabled" id="updraftcentral_keycreate_mothership" type="text" size="40" placeholder="<?php _e('URL of mothership', 'updraftplus'); ?>" value="">
494
- <br>
495
- <button style="margin-top: 5px;" type="button" class="button button-primary" id="updraftcentral_stage2_go"><?php _e('Next', 'updraftplus'); ?></button>
496
- <p style="font-size: 13px;" id="updraftcentral_wizard_stage1_error"></p>
 
 
 
 
 
 
 
497
  </td>
498
  </tr>
499
 
500
  <tr class="updraft_debugrow updraftcentral_wizard_stage2" style="display: none;">
501
  <h4 class="updraftcentral_wizard_stage2" style="display: none;"><?php _e('UpdraftCentral dashboard connection details', 'updraftplus'); ?></h4>
502
- <td>
503
  <?php _e('Description', 'updraftplus'); ?>:
504
  <input id="updraftcentral_keycreate_description" type="text" size="20" placeholder="<?php _e('Enter any description', 'updraftplus'); ?>" value="" >
505
  </td>
@@ -547,12 +558,12 @@ class UpdraftPlus_UpdraftCentral_Main {
547
  return ob_get_clean();
548
  }
549
 
550
- private function create_log_markup(){
551
  ob_start();
552
  ?>
553
- <div id="updraftcentral_view_log_container">
554
  <a href="#" id="updraftcentral_view_log"><?php _e('View recent UpdraftCentral log events', 'updraftplus'); ?>...</a><br>
555
- <pre id="updraftcentral_view_log_contents" style="padding: 0 4px;">
556
  </pre>
557
  </div>
558
  <?php
2
 
3
  if (!defined('UPDRAFTPLUS_DIR')) die('No access.');
4
 
5
+ if (defined('UPDRAFTCENTRAL_CLIENT_DIR')) return;
6
+
7
+ define('UPDRAFTCENTRAL_CLIENT_DIR', dirname(__FILE__));
8
+
9
  // This file is included during plugins_loaded
10
 
11
  // Load the listener class that we rely on to pick up messages
28
  'updates' => 'UpdraftCentral_Updates_Commands',
29
  'users' => 'UpdraftCentral_Users_Commands',
30
  'comments' => 'UpdraftCentral_Comments_Commands',
31
+ 'analytics' => 'UpdraftCentral_Analytics_Commands',
32
+ 'plugin' => 'UpdraftCentral_Plugin_Commands'
33
  ));
34
 
35
  // If nothing was sent, then there is no incoming message, so no need to set up a listener (or CORS request, etc.). This avoids a DB SELECT query on the option below in the case where it didn't get autoloaded, which is the case when there are no keys.
237
  $created['keys_guide'] = '<h2 class="updraftcentral_wizard_success">'. __('UpdraftCentral key created successfully') .'</h2>';
238
 
239
  if ('__updraftpluscom' != $where_send) {
240
+ $created['keys_guide'] .= '<div class="updraftcentral_wizard_success"><p>'.sprintf(__('You now need to copy the key below and enter it at your %s.', 'updraftplus'), '<a href="'.$where_send.'" target="_blank">UpdraftCentral dashboard</a>').'</p><p>'.__('At your UpdraftCentral dashboard you should press the "Add Site" button then paste the key in the input box.', 'updraftplus').'</p><p>'.sprintf(__('Detailed instructions for this can be found at %s', 'updraftplus'), '<a target="_blank" href="https://updraftplus.com/updraftcentral-how-to-add-a-site/">UpdraftPlus.com</a>').'</p></div>';
241
  } else {
242
  $created['keys_guide'] .= '<div class="updraftcentral_wizard_success"><p>'. sprintf(__('You can now control this site via your UpdraftCentral dashboard at %s.', 'updraftplus'), '<a target="_blank" href="http://updraftplus.com/my-account/remote-control/">UpdraftPlus.com</a>').'</p></div>';
243
  }
450
 
451
  ob_start();
452
  ?>
453
+ <div id="updraftcentral_keys_content" style="margin: 10px 0;">
454
  <?php if (!empty($our_keys)) { ?>
455
  <a href="#" class="updraftcentral_keys_show hidden-in-updraftcentral"><?php printf(__('Manage existing keys (%d)...', 'updraftplus'), count($our_keys)); ?></a>
456
  <?php } ?>
474
  return ob_get_clean();
475
  }
476
 
477
+ private function create_key_markup() {
478
  ob_start();
479
  ?>
480
  <div class="create_key_container">
481
  <h4 class="updraftcentral_wizard_stage1"> <?php _e('Connect this site to an UpdraftCentral dashboard found at...', 'updraftplus'); ?></h4>
482
+ <table style="width: 100%; table-layout:fixed;">
483
  <thead></thead>
484
  <tbody>
485
+ <tr class="updraftcentral_wizard_stage1">
486
  <td>
487
+ <div class="updraftcentral_wizard_mothership updraftcentral_wizard_option">
488
+ <label class="button-primary">
489
+ <input checked="checked" type="radio" name="updraftcentral_mothership" id="updraftcentral_mothership_updraftpluscom" style="display: none;">
490
+ <?php _e('UpdraftPlus.Com', 'updraftplus');?>
491
+ </label><br>
492
+ <div><?php printf(__('i.e. if you have %s there', 'updraftplus'), '<a target="_blank" href="https://updraftplus.com/my-account/">'.__('an account', 'updraftplus').'</a>'); ?></div>
493
+
494
+ </div>
495
+ <div class="updraftcentral_wizard_self_hosted_stage1 updraftcentral_wizard_option">
496
+ <label class="button-primary">
497
+ <input type="radio" name="updraftcentral_mothership" id="updraftcentral_mothership_other" style="display: none;">
498
+ <?php _e('Self-hosted dashboard', 'updraftplus');?>
499
+ </label><br>
500
+ <div><?php printf(__('A website where you have installed %s', 'updraftplus'), '<a target="_blank" href="https://wordpress.org/plugins/updraftcentral/">UpdraftCentral</a>'); ?></div>
501
+ </div>
502
+ <div class="updraftcentral_wizard_self_hosted_stage2" style="float:left; clear:left;display:none;">
503
+ <p style="font-size: 13px;"><?php echo __('Enter the URL where your self-hosted install of UpdraftCentral is located:', 'updraftplus');?></p>
504
+ <p style="font-size: 13px;" id="updraftcentral_wizard_stage1_error"></p>
505
+ <input disabled="disabled" id="updraftcentral_keycreate_mothership" type="text" size="40" placeholder="<?php _e('URL for the site of your UpdraftCentral dashboard', 'updraftplus'); ?>" value="">
506
+ <button type="button" class="button button-primary" id="updraftcentral_stage2_go"><?php _e('Next', 'updraftplus'); ?></button>
507
+ </div>
508
  </td>
509
  </tr>
510
 
511
  <tr class="updraft_debugrow updraftcentral_wizard_stage2" style="display: none;">
512
  <h4 class="updraftcentral_wizard_stage2" style="display: none;"><?php _e('UpdraftCentral dashboard connection details', 'updraftplus'); ?></h4>
513
+ <td class="updraftcentral_keycreate_description">
514
  <?php _e('Description', 'updraftplus'); ?>:
515
  <input id="updraftcentral_keycreate_description" type="text" size="20" placeholder="<?php _e('Enter any description', 'updraftplus'); ?>" value="" >
516
  </td>
558
  return ob_get_clean();
559
  }
560
 
561
+ private function create_log_markup() {
562
  ob_start();
563
  ?>
564
+ <div id="updraftcentral_view_log_container" style="margin: 10px 0;">
565
  <a href="#" id="updraftcentral_view_log"><?php _e('View recent UpdraftCentral log events', 'updraftplus'); ?>...</a><br>
566
+ <pre id="updraftcentral_view_log_contents" style="min-height: 110px; padding: 0 4px;">
567
  </pre>
568
  </div>
569
  <?php
central/commands.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- if (!defined('UPDRAFTPLUS_DIR')) die('No access.');
4
 
5
  /**
6
  * - A container for all the RPC commands implemented. Commands map exactly onto method names (and hence this class should not implement anything else, beyond the constructor, and private methods)
1
  <?php
2
 
3
+ if (!defined('UPDRAFTCENTRAL_CLIENT_DIR')) die('No access.');
4
 
5
  /**
6
  * - A container for all the RPC commands implemented. Commands map exactly onto method names (and hence this class should not implement anything else, beyond the constructor, and private methods)
central/listener.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- if (!defined('UPDRAFTPLUS_DIR')) die('No access.');
4
 
5
  /**
6
  * This class is the basic glue between the lower-level UpdraftPlus_Remote_Communications (UDRPC) class, and UpdraftPlus. It does not contain actual commands themselves; the class names to use for actual commands are passed in as a parameter to the constructor.
@@ -125,7 +125,7 @@ class UpdraftPlus_UpdraftCentral_Listener {
125
 
126
  $command_php_class = $this->command_classes[$class_prefix];
127
 
128
- $command_base_class_at = apply_filters('updraftcentral_command_base_class_at', UPDRAFTPLUS_DIR.'/central/commands.php');
129
 
130
  if (!class_exists('UpdraftCentral_Commands')) include_once($command_base_class_at);
131
 
@@ -133,8 +133,8 @@ class UpdraftPlus_UpdraftCentral_Listener {
133
  do_action('updraftcentral_command_class_wanted', $command_php_class);
134
 
135
  if (!class_exists($command_php_class)) {
136
- if (file_exists(UPDRAFTPLUS_DIR.'/central/modules/'.$class_prefix.'.php')) {
137
- include_once(UPDRAFTPLUS_DIR.'/central/modules/'.$class_prefix.'.php');
138
  }
139
  }
140
 
1
  <?php
2
 
3
+ if (!defined('UPDRAFTCENTRAL_CLIENT_DIR')) die('No access.');
4
 
5
  /**
6
  * This class is the basic glue between the lower-level UpdraftPlus_Remote_Communications (UDRPC) class, and UpdraftPlus. It does not contain actual commands themselves; the class names to use for actual commands are passed in as a parameter to the constructor.
125
 
126
  $command_php_class = $this->command_classes[$class_prefix];
127
 
128
+ $command_base_class_at = apply_filters('updraftcentral_command_base_class_at', UPDRAFTCENTRAL_CLIENT_DIR.'/commands.php');
129
 
130
  if (!class_exists('UpdraftCentral_Commands')) include_once($command_base_class_at);
131
 
133
  do_action('updraftcentral_command_class_wanted', $command_php_class);
134
 
135
  if (!class_exists($command_php_class)) {
136
+ if (file_exists(UPDRAFTCENTRAL_CLIENT_DIR.'/modules/'.$class_prefix.'.php')) {
137
+ include_once(UPDRAFTCENTRAL_CLIENT_DIR.'/modules/'.$class_prefix.'.php');
138
  }
139
  }
140
 
central/modules/analytics.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- if (!defined('UPDRAFTPLUS_DIR')) die('No access.');
4
 
5
  /**
6
  * Handles Analytics Commands
1
  <?php
2
 
3
+ if (!defined('UPDRAFTCENTRAL_CLIENT_DIR')) die('No access.');
4
 
5
  /**
6
  * Handles Analytics Commands
central/modules/comments.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- if (!defined('UPDRAFTPLUS_DIR')) die('No access.');
4
 
5
  class UpdraftCentral_Comments_Commands extends UpdraftCentral_Commands {
6
 
1
  <?php
2
 
3
+ if (!defined('UPDRAFTCENTRAL_CLIENT_DIR')) die('No access.');
4
 
5
  class UpdraftCentral_Comments_Commands extends UpdraftCentral_Commands {
6
 
central/modules/core.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- if (!defined('UPDRAFTPLUS_DIR')) die('No access.');
4
 
5
  /**
6
  * - A container for RPC commands (core UpdraftCentral commands). Commands map exactly onto method names (and hence this class should not implement anything else, beyond the constructor, and private methods)
@@ -168,16 +168,16 @@ class UpdraftCentral_Core_Commands extends UpdraftCentral_Commands {
168
  if (is_array($redirect_to) && !empty($redirect_to['module'])) {
169
  switch ($redirect_to['module']) {
170
  case 'updraftplus':
171
- if ('initiate_restore' == $redirect_to['action'] && class_exists('UpdraftPlus_Options')) {
172
  $redirect_url = UpdraftPlus_Options::admin_page_url().'?page=updraftplus&udaction=initiate_restore&entities='.urlencode($redirect_to['data']['entities']).'&showdata='.urlencode($redirect_to['data']['showdata']).'&backup_timestamp='.(int) $redirect_to['data']['backup_timestamp'];
173
- } elseif ('download_file' == $redirect_to['action']) {
174
- $findex = empty($redirect_to['data']['findex']) ? 0 : (int) $redirect_to['data']['findex'];
175
- // e.g. ?udcentral_action=dl&action=updraftplus_spool_file&backup_timestamp=1455101696&findex=0&what=plugins
176
- $redirect_url = site_url().'?udcentral_action=spool_file&action=updraftplus_spool_file&findex='.$findex.'&what='.urlencode($redirect_to['data']['what']).'&backup_timestamp='.(int) $redirect_to['data']['backup_timestamp'];
177
- }
178
  break;
179
  case 'direct_url':
180
- $redirect_url = $redirect_to['url'];
181
  break;
182
  }
183
  }
@@ -200,6 +200,11 @@ class UpdraftCentral_Core_Commands extends UpdraftCentral_Commands {
200
  }
201
  }
202
 
 
 
 
 
 
203
  public function phpinfo() {
204
  $phpinfo = $this->_get_phpinfo_array();
205
 
@@ -209,14 +214,12 @@ class UpdraftCentral_Core_Commands extends UpdraftCentral_Commands {
209
 
210
  return $this->_generic_error_response('phpinfo_fail');
211
  }
212
-
213
-
214
 
215
  /**
216
- * This is intended to be short-lived. Hence, there's no intention other than that it is random and only used once - only the most recent one is valid.
217
  *
218
- * @param string $user_id Specific user ID to get the autologin key
219
- * @return array
220
  */
221
  public function _get_autologin_key($user_id) {
222
  $secure_auth_key = defined('SECURE_AUTH_KEY') ? SECURE_AUTH_KEY : hash('sha256', DB_PASSWORD).'_'.rand(0, 999999999);
@@ -254,7 +257,7 @@ class UpdraftCentral_Core_Commands extends UpdraftCentral_Commands {
254
  * @param array $data Array of Data to be used within call_wp_action
255
  * @return array
256
  */
257
- public function call_wordpress_action($data){
258
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return $this->_generic_error_response('no_updraftplus');
259
 
260
  $response = $updraftplus_admin->call_wp_action($data);
@@ -270,7 +273,17 @@ class UpdraftCentral_Core_Commands extends UpdraftCentral_Commands {
270
  ));
271
  }
272
 
273
- public function count($entity){
 
 
 
 
 
 
 
 
 
 
274
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return $this->_generic_error_response('no_updraftplus');
275
 
276
  $response = $updraftplus_admin->get_disk_space_used($entity);
@@ -278,9 +291,6 @@ class UpdraftCentral_Core_Commands extends UpdraftCentral_Commands {
278
  return $this->_response($response);
279
  }
280
 
281
-
282
- /*Private Functions*/
283
-
284
  /**
285
  * https://secure.php.net/phpinfo
286
  *
@@ -310,6 +320,11 @@ class UpdraftCentral_Core_Commands extends UpdraftCentral_Commands {
310
  return false;
311
  }
312
 
 
 
 
 
 
313
  private function _load_ud_admin() {
314
  if (!defined('UPDRAFTPLUS_DIR') || !is_file(UPDRAFTPLUS_DIR.'/admin.php')) return false;
315
  include_once(UPDRAFTPLUS_DIR.'/admin.php');
1
  <?php
2
 
3
+ if (!defined('UPDRAFTCENTRAL_CLIENT_DIR')) die('No access.');
4
 
5
  /**
6
  * - A container for RPC commands (core UpdraftCentral commands). Commands map exactly onto method names (and hence this class should not implement anything else, beyond the constructor, and private methods)
168
  if (is_array($redirect_to) && !empty($redirect_to['module'])) {
169
  switch ($redirect_to['module']) {
170
  case 'updraftplus':
171
+ if ('initiate_restore' == $redirect_to['action'] && class_exists('UpdraftPlus_Options')) {
172
  $redirect_url = UpdraftPlus_Options::admin_page_url().'?page=updraftplus&udaction=initiate_restore&entities='.urlencode($redirect_to['data']['entities']).'&showdata='.urlencode($redirect_to['data']['showdata']).'&backup_timestamp='.(int) $redirect_to['data']['backup_timestamp'];
173
+ } elseif ('download_file' == $redirect_to['action']) {
174
+ $findex = empty($redirect_to['data']['findex']) ? 0 : (int) $redirect_to['data']['findex'];
175
+ // e.g. ?udcentral_action=dl&action=updraftplus_spool_file&backup_timestamp=1455101696&findex=0&what=plugins
176
+ $redirect_url = site_url().'?udcentral_action=spool_file&action=updraftplus_spool_file&findex='.$findex.'&what='.urlencode($redirect_to['data']['what']).'&backup_timestamp='.(int) $redirect_to['data']['backup_timestamp'];
177
+ }
178
  break;
179
  case 'direct_url':
180
+ $redirect_url = $redirect_to['url'];
181
  break;
182
  }
183
  }
200
  }
201
  }
202
 
203
+ /**
204
+ * Get information derived from phpinfo()
205
+ *
206
+ * @return Array
207
+ */
208
  public function phpinfo() {
209
  $phpinfo = $this->_get_phpinfo_array();
210
 
214
 
215
  return $this->_generic_error_response('phpinfo_fail');
216
  }
 
 
217
 
218
  /**
219
+ * The key obtained is only intended to be short-lived. Hence, there's no intention other than that it is random and only used once - only the most recent one is valid.
220
  *
221
+ * @param Integer $user_id Specific user ID to get the autologin key
222
+ * @return Array
223
  */
224
  public function _get_autologin_key($user_id) {
225
  $secure_auth_key = defined('SECURE_AUTH_KEY') ? SECURE_AUTH_KEY : hash('sha256', DB_PASSWORD).'_'.rand(0, 999999999);
257
  * @param array $data Array of Data to be used within call_wp_action
258
  * @return array
259
  */
260
+ public function call_wordpress_action($data) {
261
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return $this->_generic_error_response('no_updraftplus');
262
 
263
  $response = $updraftplus_admin->call_wp_action($data);
273
  ));
274
  }
275
 
276
+ /**
277
+ * Get disk space used
278
+ *
279
+ * @uses UpdraftPlus_Admin::get_disk_space_used()
280
+ *
281
+ * @param String $entity - the entity to count (e.g. 'plugins', 'themes')
282
+ *
283
+ * @return Array - response
284
+ */
285
+ public function count($entity) {
286
+
287
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return $this->_generic_error_response('no_updraftplus');
288
 
289
  $response = $updraftplus_admin->get_disk_space_used($entity);
291
  return $this->_response($response);
292
  }
293
 
 
 
 
294
  /**
295
  * https://secure.php.net/phpinfo
296
  *
320
  return false;
321
  }
322
 
323
+ /**
324
+ * Return an UpdraftPlus_Admin object
325
+ *
326
+ * @return UpdraftPlus_Admin|Boolean - false in case of failure
327
+ */
328
  private function _load_ud_admin() {
329
  if (!defined('UPDRAFTPLUS_DIR') || !is_file(UPDRAFTPLUS_DIR.'/admin.php')) return false;
330
  include_once(UPDRAFTPLUS_DIR.'/admin.php');
central/modules/plugin.php ADDED
@@ -0,0 +1,184 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (!defined('UPDRAFTPLUS_DIR')) die('No access.');
4
+
5
+ /**
6
+ * Handles UpdraftCentral Plugin Commands which basically handles
7
+ * the installation and activation of a plugin
8
+ */
9
+ class UpdraftCentral_Plugin_Commands extends UpdraftCentral_Commands {
10
+
11
+ /**
12
+ * Constructor
13
+ */
14
+ public function __construct() {
15
+ $this->_admin_include('plugin.php', 'file.php', 'template.php', 'class-wp-upgrader.php', 'plugin-install.php');
16
+ }
17
+
18
+ /**
19
+ * Checks whether the plugin is currently installed and activated.
20
+ *
21
+ * @param array $query Parameter array containing the name of the plugin to check
22
+ * @return array Contains the result of the current process
23
+ */
24
+ public function is_plugin_installed($query) {
25
+
26
+ if (!isset($query['plugin']))
27
+ return $this->_response(array('error' => true, 'message' => 'plugin_name_required', 'values' => array()));
28
+
29
+
30
+ $result = $this->get_plugin_info($query['plugin']);
31
+ return $this->_response($result);
32
+ }
33
+
34
+ /**
35
+ * Activates the plugin
36
+ *
37
+ * @param array $query Parameter array containing the name of the plugin to activate
38
+ * @return array Contains the result of the current process
39
+ */
40
+ public function activate_plugin($query) {
41
+
42
+ if (!isset($query['plugin']))
43
+ return $this->_response(array('error' => true, 'message' => 'plugin_name_required', 'values' => array()));
44
+
45
+ if (!current_user_can('activate_plugins'))
46
+ return $this->_response(array('error' => true, 'message' => 'plugin_insufficient_permission', 'values' => array()));
47
+
48
+
49
+ $info = $this->get_plugin_info($query['plugin']);
50
+ if ($info['installed']) {
51
+ $activate = activate_plugin($info['plugin_path']);
52
+
53
+ if (is_wp_error($activate)) {
54
+ $result = array('error' => true, 'message' => 'generic_response_error', 'values' => array($activate->get_error_message()));
55
+ } else {
56
+ $result = array('activated' => true);
57
+ }
58
+ } else {
59
+ $result = array('error' => true, 'message' => 'plugin_not_installed', 'values' => array());
60
+ }
61
+
62
+ return $this->_response($result);
63
+ }
64
+
65
+ /**
66
+ * Download, install and activates the plugin
67
+ *
68
+ * @param array $query Parameter array containing the filesystem credentials entered by the user along with the plugin name and slug
69
+ * @return array Contains the result of the current process
70
+ */
71
+ public function install_activate_plugin($query) {
72
+
73
+ if (!isset($query['plugin']))
74
+ return $this->_response(array('error' => true, 'message' => 'plugin_name_required', 'values' => array()));
75
+
76
+ if (!isset($query['slug']))
77
+ return $this->_response(array('error' => true, 'message' => 'plugin_slug_required', 'values' => array()));
78
+
79
+ if (!current_user_can('install_plugins') || !current_user_can('activate_plugins'))
80
+ return $this->_response(array('error' => true, 'message' => 'plugin_insufficient_permission', 'values' => array()));
81
+
82
+
83
+ if (!empty($query) && isset($query['filesystem_credentials'])) {
84
+ parse_str($query['filesystem_credentials'], $filesystem_credentials);
85
+ if (is_array($filesystem_credentials)) {
86
+ foreach ($filesystem_credentials as $key => $value) {
87
+ // Put them into $_POST, which is where request_filesystem_credentials() checks for them.
88
+ $_POST[$key] = $value;
89
+ }
90
+ }
91
+ }
92
+
93
+ $api = plugins_api('plugin_information', array(
94
+ 'slug' => $query['slug'],
95
+ 'fields' => array(
96
+ 'short_description' => false,
97
+ 'sections' => false,
98
+ 'requires' => false,
99
+ 'rating' => false,
100
+ 'ratings' => false,
101
+ 'downloaded' => false,
102
+ 'last_updated' => false,
103
+ 'added' => false,
104
+ 'tags' => false,
105
+ 'compatibility' => false,
106
+ 'homepage' => false,
107
+ 'donate_link' => false,
108
+ )
109
+ ));
110
+
111
+ if (is_wp_error($api)) {
112
+ $result = array('error' => true, 'message' => 'generic_response_error', 'values' => array($api->get_error_message()));
113
+ } else {
114
+ $info = $this->get_plugin_info($query['plugin']);
115
+ $installed = $info['installed'];
116
+
117
+ if (!$installed) {
118
+ // WP < 3.7
119
+ if (!class_exists('Automatic_Upgrader_Skin')) include_once(UPDRAFTPLUS_DIR.'/central/classes/class-automatic-upgrader-skin.php');
120
+
121
+ $skin = new Automatic_Upgrader_Skin();
122
+ $upgrader = new Plugin_Upgrader($skin);
123
+
124
+ $download_link = $api->download_link;
125
+ $installed = $upgrader->install($download_link);
126
+ }
127
+
128
+ if (!$installed) {
129
+ $result = array('error' => true, 'message' => 'plugin_install_failed', 'values' => array());
130
+ } else {
131
+ // Here, we're pulling the information one more time to verify the installation and to
132
+ // extract the plugin_path that will be used to activate the plugin in case it did not
133
+ // get activated after the installation.
134
+ $info = $this->get_plugin_info($query['plugin']);
135
+
136
+ if (!$info['active']) {
137
+ $activate = activate_plugin($info['plugin_path']);
138
+
139
+ if (is_wp_error($activate)) {
140
+ $result = array('error' => true, 'message' => 'generic_response_error', 'values' => array($activate->get_error_message()));
141
+ } else {
142
+ $result = array('installed' => true);
143
+ }
144
+ } else {
145
+ $result = array('installed' => true);
146
+ }
147
+ }
148
+ }
149
+
150
+ return $this->_response($result);
151
+ }
152
+
153
+ /**
154
+ * Gets the plugin information along with its active and install status
155
+ *
156
+ * @internal
157
+ * @param array $plugin The name of the plugin to pull the information from
158
+ * @return array Contains the plugin information
159
+ */
160
+ private function get_plugin_info($plugin) {
161
+
162
+ $info = array(
163
+ 'active' => false,
164
+ 'installed' => false
165
+ );
166
+
167
+ // Gets all plugins available.
168
+ $get_plugins = get_plugins();
169
+
170
+ // Loops around each plugin available.
171
+ foreach ($get_plugins as $key => $value) {
172
+ // If the plugin name matches that of the specified name, it will gather details.
173
+ if ($value['Name'] === $plugin) {
174
+ $info['installed'] = true;
175
+ $info['active'] = is_plugin_active($key);
176
+ $info['plugin_path'] = $key;
177
+ $info['data'] = $value;
178
+ break;
179
+ }
180
+ }
181
+
182
+ return $info;
183
+ }
184
+ }
central/modules/updates.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- if (!defined('UPDRAFTPLUS_DIR')) die('No access.');
4
 
5
  class UpdraftCentral_Updates_Commands extends UpdraftCentral_Commands {
6
 
@@ -100,7 +100,7 @@ class UpdraftCentral_Updates_Commands extends UpdraftCentral_Commands {
100
  wp_update_plugins();
101
 
102
  // WP < 3.7
103
- if (!class_exists('Automatic_Upgrader_Skin')) include_once(UPDRAFTPLUS_DIR.'/central/classes/class-automatic-upgrader-skin.php');
104
 
105
  $skin = new Automatic_Upgrader_Skin();
106
  $upgrader = new Plugin_Upgrader($skin);
@@ -215,7 +215,7 @@ class UpdraftCentral_Updates_Commands extends UpdraftCentral_Commands {
215
  $update = $get_core_updates[$core_update_key];
216
 
217
  // WP < 3.7
218
- if (!class_exists('Automatic_Upgrader_Skin')) include_once(UPDRAFTPLUS_DIR.'/central/classes/class-automatic-upgrader-skin.php');
219
 
220
  $skin = new Automatic_Upgrader_Skin();
221
  $upgrader = new Core_Upgrader($skin);
@@ -288,7 +288,7 @@ class UpdraftCentral_Updates_Commands extends UpdraftCentral_Commands {
288
  wp_update_themes();
289
 
290
  // WP < 3.7
291
- if (!class_exists('Automatic_Upgrader_Skin')) include_once(UPDRAFTPLUS_DIR.'/central/classes/class-automatic-upgrader-skin.php');
292
 
293
  $skin = new Automatic_Upgrader_Skin();
294
  $upgrader = new Theme_Upgrader($skin);
1
  <?php
2
 
3
+ if (!defined('UPDRAFTCENTRAL_CLIENT_DIR')) die('No access.');
4
 
5
  class UpdraftCentral_Updates_Commands extends UpdraftCentral_Commands {
6
 
100
  wp_update_plugins();
101
 
102
  // WP < 3.7
103
+ if (!class_exists('Automatic_Upgrader_Skin')) include_once(UPDRAFTCENTRAL_CLIENT_DIR.'/classes/class-automatic-upgrader-skin.php');
104
 
105
  $skin = new Automatic_Upgrader_Skin();
106
  $upgrader = new Plugin_Upgrader($skin);
215
  $update = $get_core_updates[$core_update_key];
216
 
217
  // WP < 3.7
218
+ if (!class_exists('Automatic_Upgrader_Skin')) include_once(UPDRAFTCENTRAL_CLIENT_DIR.'/classes/class-automatic-upgrader-skin.php');
219
 
220
  $skin = new Automatic_Upgrader_Skin();
221
  $upgrader = new Core_Upgrader($skin);
288
  wp_update_themes();
289
 
290
  // WP < 3.7
291
+ if (!class_exists('Automatic_Upgrader_Skin')) include_once(UPDRAFTCENTRAL_CLIENT_DIR.'/classes/class-automatic-upgrader-skin.php');
292
 
293
  $skin = new Automatic_Upgrader_Skin();
294
  $upgrader = new Theme_Upgrader($skin);
central/modules/updraftvault.php DELETED
@@ -1,42 +0,0 @@
1
- <?php
2
-
3
- if (!defined('UPDRAFTPLUS_DIR')) die('No access.');
4
- require_once(UPDRAFTPLUS_DIR.'/methods/updraftvault.php');
5
-
6
- /**
7
- * Handles UpdraftVault Commands to pull Amazon S3 Bucket credentials
8
- * from user's UpdraftVault and some default filters for per page display
9
- *
10
- * @method array get_credentials()
11
- */
12
- class UpdraftCentral_UpdraftVault_Commands extends UpdraftCentral_Commands {
13
-
14
- /**
15
- * Gets the Amazon S3 Credentials
16
- *
17
- * Extract the needed credentials to connect to the user's Amazon S3 Bucket
18
- * by pulling this info from the UpdraftVault server.
19
- *
20
- * @return array $result - An array containing the Amazon S3 settings/config if successful,
21
- * otherwise, it will contain the error details/info of the generated error.
22
- */
23
- public function get_credentials() {
24
-
25
- $vault = new UpdraftPlus_BackupModule_updraftvault();
26
- $result = $vault->get_config();
27
-
28
- if (isset($result['error']) && !empty($result['error'])) {
29
- $result = array('error' => true, 'message' => $result['error']['message'], 'values' => $result['error']['values']);
30
- }
31
-
32
- return $this->_response($result);
33
- }
34
-
35
- /**
36
- * Builds a list of options out from an array of preset items
37
- * that will serve as a "results per page" option for selection
38
- * on the frontend.
39
- *
40
- * @return array
41
- */
42
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
central/modules/users.php CHANGED
@@ -1,9 +1,35 @@
1
  <?php
2
 
3
- if (!defined('UPDRAFTPLUS_DIR')) die('No access.');
4
 
 
 
 
5
  class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  private function _search_users($query) {
8
  $this->_admin_include('user.php');
9
  $query1 = new WP_User_Query(array(
@@ -11,6 +37,7 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
11
  'order' => 'ASC',
12
  'role'=> $query["role"],
13
  'search' => '*' . esc_attr($query["search"]) . '*',
 
14
  ));
15
  $query2 = new WP_User_Query(array(
16
  'orderby' => 'ID',
@@ -31,49 +58,47 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
31
  )
32
  ));
33
 
34
- if (empty($query1->results)) {
35
- $query1->results = array();
36
- }
37
- if (empty($query2->results)) {
38
- $query2->results = array();
39
- }
40
  if (empty($query1->results) && empty($query2->results)) {
41
  return array("message" => "users_not_found");
42
- }
43
-
44
- $found_users = array_merge($query1->results, $query2->results);
45
- $users = array();
46
- foreach ($found_users as $new_user) {
47
- $new = true;
48
- foreach ($users as $user) {
49
- if ($new_user == $user) {
50
- $new = false;
51
  }
52
  };
53
- if ($new) {
54
- array_push($users, $new_user);
55
- }
56
- };
57
-
58
- return $users;
 
 
 
 
 
 
 
59
  }
60
 
61
- private function _calculate_pages($query) {
62
-
 
 
 
 
 
 
 
 
63
  $per_page_options = array(10, 20, 30, 40, 50);
64
 
65
  if (!empty($query)) {
66
 
67
- if (!empty($query['search'])) {
68
- return array(
69
- page_count => 1,
70
- page_no => 1
71
- );
72
- }
73
-
74
  $pages = array();
75
- $page_query = new WP_User_Query(array('role' => $query["role"]));
76
- $page_count = ceil($page_query->total_users / $query["per_page"]);
77
  if ($page_count > 1) {
78
 
79
  for ($i = 0; $i < $page_count; $i++) {
@@ -118,7 +143,7 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
118
  "pages" => $pages,
119
  "page_next" => $page_next,
120
  "page_prev" => $page_prev,
121
- "total_results" => $page_query->total_users,
122
  "per_page_options" => $per_page_options
123
  );
124
 
@@ -127,7 +152,7 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
127
  "page_no" => $query['page_no'],
128
  "per_page" => $query["per_page"],
129
  "page_count" => $page_count,
130
- "total_results" => $page_query->total_users,
131
  "per_page_options" => $per_page_options
132
  );
133
  }
@@ -138,6 +163,12 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
138
  }
139
  }
140
 
 
 
 
 
 
 
141
  public function check_username($params) {
142
  $this->_admin_include('user.php');
143
  $username = $params['user_name'];
@@ -180,7 +211,7 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
180
  * If the site is a multisite, then sites under the network
181
  * will be pulled, otherwise, it will return an empty array.
182
  *
183
- * @returns Array - an array of sites
184
  */
185
  private function _get_blog_sites() {
186
 
@@ -223,6 +254,12 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
223
  return $sites;
224
  }
225
 
 
 
 
 
 
 
226
  public function check_email($params) {
227
  $this->_admin_include('user.php');
228
  $email = $params['email'];
@@ -267,13 +304,12 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
267
  * based on the current search parameters/filters. Please see _search_users
268
  * for the breakdown of these parameters.
269
  *
270
- * @param array $query
271
- * @return array
272
  */
273
  public function get_users($query) {
274
  $this->_admin_include('user.php');
275
 
276
- $users;
277
  // Here, we're getting the current blog id. If blog id
278
  // is passed along with the parameters then we override
279
  // that current (default) value with the parameter blog id value.
@@ -288,20 +324,29 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
288
  if (function_exists('switch_to_blog')) {
289
  $switched = switch_to_blog($blog_id);
290
  }
291
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
292
  if (!empty($query["search"])) {
293
- $users = $this->_search_users($query);
294
- } else {
295
- if (empty($query["per_page"])) {
296
- $query["per_page"] = 10;
297
- }
298
- if (empty($query['page_no'])) {
299
- $query['page_no'] = 1;
300
- }
301
- if (empty($query["role"])) {
302
- $query["role"] = "";
303
  }
304
-
305
  $user_query = new WP_User_Query(array(
306
  'orderby' => 'ID',
307
  'order' => 'ASC',
@@ -316,6 +361,7 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
316
  }
317
 
318
  $users = $user_query->results;
 
319
  }
320
 
321
  foreach ($users as &$user) {
@@ -333,7 +379,7 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
333
 
334
  $result = array(
335
  "users"=>$users,
336
- "paging" => $this->_calculate_pages($query)
337
  );
338
 
339
  // Here, we're restoring to the current (default) blog before we
@@ -344,7 +390,13 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
344
  }
345
  return $this->_response($result);
346
  }
347
-
 
 
 
 
 
 
348
  public function add_user($user) {
349
  $this->_admin_include('user.php');
350
  // Here, we're getting the current blog id. If blog id
@@ -365,7 +417,7 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
365
  }
366
 
367
  if (!current_user_can('create_users') && !is_super_admin()) {
368
- $result = array("error" => true, "message" => "user_create_no_permission");
369
  return $this->_response($result);
370
  }
371
  if (is_email($user["user_email"]) === false) {
@@ -447,7 +499,7 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
447
  }
448
 
449
  if (!current_user_can('delete_users') && !is_super_admin()) {
450
- $result = array("error" => true, "message" => "user_delete_no_permission");
451
  return $this->_response($result);
452
  }
453
  if (get_userdata($user_id) === false) {
@@ -471,6 +523,12 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
471
  return $this->_response($result);
472
  }
473
 
 
 
 
 
 
 
474
  public function edit_user($user) {
475
  $this->_admin_include('user.php');
476
 
@@ -490,7 +548,7 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
490
  }
491
 
492
  if (!current_user_can('edit_users') && !is_super_admin() && get_current_user_id() !== $user["ID"]) {
493
- $result = array("error" => true, "message" => "user_edit_no_permission");
494
  return $this->_response($result);
495
  }
496
 
@@ -542,12 +600,22 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
542
  return $this->_response($result);
543
  }
544
 
 
 
 
 
 
545
  public function get_roles() {
546
  $this->_admin_include('user.php');
547
  $roles = array_reverse(get_editable_roles());
548
  return $this->_response($roles);
549
  }
550
 
 
 
 
 
 
551
  public function get_user_filters() {
552
  $this->_admin_include('user.php');
553
 
@@ -557,7 +625,7 @@ class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
557
  $result = array(
558
  "sites" => $sites,
559
  "roles" => array_reverse(get_editable_roles()),
560
- "paging" => $this->_calculate_pages(null),
561
  );
562
  return $this->_response($result);
563
  }
1
  <?php
2
 
3
+ if (!defined('UPDRAFTCENTRAL_CLIENT_DIR')) die('No access.');
4
 
5
+ /**
6
+ * Handles Users Commands
7
+ */
8
  class UpdraftCentral_Users_Commands extends UpdraftCentral_Commands {
9
 
10
+ /**
11
+ * Compares two user object whether one is lesser than, equal to, greater than the other
12
+ *
13
+ * @internal
14
+ * @param array $a First user in the comparison
15
+ * @param array $b Second user in the comparison
16
+ * @return integer Comparison results (0 = equal, -1 = less than, 1 = greater than)
17
+ */
18
+ private function compare_user_id($a, $b) {
19
+ if ($a->ID === $b->ID) {
20
+ return 0;
21
+ }
22
+
23
+ return ($a->ID < $b->ID) ? -1 : 1;
24
+ }
25
+
26
+ /**
27
+ * Searches users based from the keyword submitted
28
+ *
29
+ * @internal
30
+ * @param array $query Parameter array containing the filter and keyword fields
31
+ * @return array Contains the list of users found as well as the total users count
32
+ */
33
  private function _search_users($query) {
34
  $this->_admin_include('user.php');
35
  $query1 = new WP_User_Query(array(
37
  'order' => 'ASC',
38
  'role'=> $query["role"],
39
  'search' => '*' . esc_attr($query["search"]) . '*',
40
+ 'search_columns' => array('user_login', 'user_email')
41
  ));
42
  $query2 = new WP_User_Query(array(
43
  'orderby' => 'ID',
58
  )
59
  ));
60
 
 
 
 
 
 
 
61
  if (empty($query1->results) && empty($query2->results)) {
62
  return array("message" => "users_not_found");
63
+ } else {
64
+ $found_users = array_merge($query1->results, $query2->results);
65
+ $temp = array();
66
+ foreach ($found_users as $new_user) {
67
+ if (!isset($temp[$new_user->ID])) {
68
+ $temp[$new_user->ID] = $new_user;
 
 
 
69
  }
70
  };
71
+
72
+ $users = array_values($temp);
73
+
74
+ // Sort users:
75
+ usort($users, array($this, 'compare_user_id'));
76
+ $offset = (intval($query['page_no']) * intval($query['per_page'])) - intval($query['per_page']);
77
+ $user_list = array_slice($users, $offset, $query['per_page']);
78
+
79
+ return array(
80
+ 'users' => $user_list,
81
+ 'total_users' => count($users)
82
+ );
83
+ }
84
  }
85
 
86
+ /**
87
+ * Calculates the number of pages needed to construct the pagination links
88
+ *
89
+ * @internal
90
+ * @param array $query
91
+ * @param array $total_users The total number of users found from the WP_User_Query query
92
+ * @return array Contains information needed to construct the pagination links
93
+ */
94
+ private function _calculate_pages($query, $total_users) {
95
+
96
  $per_page_options = array(10, 20, 30, 40, 50);
97
 
98
  if (!empty($query)) {
99
 
 
 
 
 
 
 
 
100
  $pages = array();
101
+ $page_count = ceil($total_users / $query["per_page"]);
 
102
  if ($page_count > 1) {
103
 
104
  for ($i = 0; $i < $page_count; $i++) {
143
  "pages" => $pages,
144
  "page_next" => $page_next,
145
  "page_prev" => $page_prev,
146
+ "total_results" => $total_users,
147
  "per_page_options" => $per_page_options
148
  );
149
 
152
  "page_no" => $query['page_no'],
153
  "per_page" => $query["per_page"],
154
  "page_count" => $page_count,
155
+ "total_results" => $total_users,
156
  "per_page_options" => $per_page_options
157
  );
158
  }
163
  }
164
  }
165
 
166
+ /**
167
+ * Validates whether the username exists
168
+ *
169
+ * @param array $params Contains the user name to check and validate
170
+ * @return array An array containing the result of the current process
171
+ */
172
  public function check_username($params) {
173
  $this->_admin_include('user.php');
174
  $username = $params['user_name'];
211
  * If the site is a multisite, then sites under the network
212
  * will be pulled, otherwise, it will return an empty array.
213
  *
214
+ * @return Array - an array of sites
215
  */
216
  private function _get_blog_sites() {
217
 
254
  return $sites;
255
  }
256
 
257
+ /**
258
+ * Validates whether the email exists
259
+ *
260
+ * @param array $params Contains the email to check and validate
261
+ * @return array An array containing the result of the current process
262
+ */
263
  public function check_email($params) {
264
  $this->_admin_include('user.php');
265
  $email = $params['email'];
304
  * based on the current search parameters/filters. Please see _search_users
305
  * for the breakdown of these parameters.
306
  *
307
+ * @param array $query Parameter array containing the filter and keyword fields
308
+ * @return array An array containing the result of the current process
309
  */
310
  public function get_users($query) {
311
  $this->_admin_include('user.php');
312
 
 
313
  // Here, we're getting the current blog id. If blog id
314
  // is passed along with the parameters then we override
315
  // that current (default) value with the parameter blog id value.
324
  if (function_exists('switch_to_blog')) {
325
  $switched = switch_to_blog($blog_id);
326
  }
327
+
328
+ // Set default:
329
+ if (empty($query["per_page"])) {
330
+ $query["per_page"] = 10;
331
+ }
332
+ if (empty($query['page_no'])) {
333
+ $query['page_no'] = 1;
334
+ }
335
+ if (empty($query["role"])) {
336
+ $query["role"] = "";
337
+ }
338
+
339
+ $users = array();
340
+ $total_users = 0;
341
+
342
  if (!empty($query["search"])) {
343
+ $search_results = $this->_search_users($query);
344
+
345
+ if (isset($search_results['users'])) {
346
+ $users = $search_results['users'];
347
+ $total_users = $search_results['total_users'];
 
 
 
 
 
348
  }
349
+ } else {
350
  $user_query = new WP_User_Query(array(
351
  'orderby' => 'ID',
352
  'order' => 'ASC',
361
  }
362
 
363
  $users = $user_query->results;
364
+ $total_users = $user_query->get_total();
365
  }
366
 
367
  foreach ($users as &$user) {
379
 
380
  $result = array(
381
  "users"=>$users,
382
+ "paging" => $this->_calculate_pages($query, $total_users)
383
  );
384
 
385
  // Here, we're restoring to the current (default) blog before we
390
  }
391
  return $this->_response($result);
392
  }
393
+
394
+ /**
395
+ * Creates new user for the current blog
396
+ *
397
+ * @param array $user User information to add
398
+ * @return array An array containing the result of the current process
399
+ */
400
  public function add_user($user) {
401
  $this->_admin_include('user.php');
402
  // Here, we're getting the current blog id. If blog id
417
  }
418
 
419
  if (!current_user_can('create_users') && !is_super_admin()) {
420
+ $result = array('error' => true, 'message' => 'user_create_no_permission', 'data' => array('multisite' => is_multisite()));
421
  return $this->_response($result);
422
  }
423
  if (is_email($user["user_email"]) === false) {
499
  }
500
 
501
  if (!current_user_can('delete_users') && !is_super_admin()) {
502
+ $result = array('error' => true, 'message' => 'user_delete_no_permission', 'data' => array('multisite' => is_multisite()));
503
  return $this->_response($result);
504
  }
505
  if (get_userdata($user_id) === false) {
523
  return $this->_response($result);
524
  }
525
 
526
+ /**
527
+ * Edits existing user information
528
+ *
529
+ * @param array $user User information to save
530
+ * @return array An array containing the result of the current process
531
+ */
532
  public function edit_user($user) {
533
  $this->_admin_include('user.php');
534
 
548
  }
549
 
550
  if (!current_user_can('edit_users') && !is_super_admin() && get_current_user_id() !== $user["ID"]) {
551
+ $result = array('error' => true, 'message' => 'user_edit_no_permission', 'data' => array('multisite' => is_multisite()));
552
  return $this->_response($result);
553
  }
554
 
600
  return $this->_response($result);
601
  }
602
 
603
+ /**
604
+ * Retrieves available roles to be used as filter options
605
+ *
606
+ * @return array An array containing all available roles
607
+ */
608
  public function get_roles() {
609
  $this->_admin_include('user.php');
610
  $roles = array_reverse(get_editable_roles());
611
  return $this->_response($roles);
612
  }
613
 
614
+ /**
615
+ * Retrieves information to be use as filters
616
+ *
617
+ * @return array An array containing the filter fields and their data
618
+ */
619
  public function get_user_filters() {
620
  $this->_admin_include('user.php');
621
 
625
  $result = array(
626
  "sites" => $sites,
627
  "roles" => array_reverse(get_editable_roles()),
628
+ "paging" => $this->_calculate_pages(null, 0),
629
  );
630
  return $this->_response($result);
631
  }
class-updraftplus.php CHANGED
@@ -455,11 +455,29 @@ class UpdraftPlus {
455
  $_GET['page'] = 'updraftplus';
456
  $_REQUEST['page'] = 'updraftplus';
457
  $method = $matches[1];
458
- include_once(UPDRAFTPLUS_DIR.'/methods/'.$method.'.php');
459
- $call_class = "UpdraftPlus_BackupModule_".$method;
460
  $call_method = "action_".$matches[2];
461
- $backup_obj = new $call_class;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
462
  $this->register_wp_http_option_hooks();
 
463
  try {
464
  if (method_exists($backup_obj, $call_method)) {
465
  call_user_func(array($backup_obj, $call_method));
@@ -594,6 +612,7 @@ class UpdraftPlus {
594
  */
595
  public function updraftplus_remotecontrol_command_classes($command_classes) {
596
  if (is_array($command_classes)) $command_classes['updraftplus'] = 'UpdraftCentral_UpdraftPlus_Commands';
 
597
  return $command_classes;
598
  }
599
 
@@ -605,6 +624,8 @@ class UpdraftPlus {
605
  public function updraftcentral_command_class_wanted($command_php_class) {
606
  if ('UpdraftCentral_UpdraftPlus_Commands' == $command_php_class) {
607
  include_once(UPDRAFTPLUS_DIR.'/includes/class-updraftcentral-updraftplus-commands.php');
 
 
608
  }
609
  }
610
 
@@ -647,7 +668,7 @@ class UpdraftPlus {
647
  $files_deleted = 0;
648
  if ($handle = opendir($updraft_dir)) {
649
  while (false !== ($entry = readdir($handle))) {
650
- $manifest_match = preg_match("/^udmanifest$match\.json$/i", $entry);
651
  // This match is for files created internally by zipArchive::addFile
652
  $ziparchive_match = preg_match("/$match([0-9]+)?\.zip\.tmp\.([A-Za-z0-9]){6}?$/i", $entry);
653
  // zi followed by 6 characters is the pattern used by /usr/bin/zip on Linux systems. It's safe to check for, as we have nothing else that's going to match that pattern.
@@ -3454,13 +3475,15 @@ class UpdraftPlus {
3454
  /**
3455
  * Replace last occurence
3456
  *
3457
- * @param string $search
3458
- * @param string $replace
3459
- * @param string $subject
 
 
3460
  * @return string
3461
  */
3462
- public function str_lreplace($search, $replace, $subject) {
3463
- $pos = strrpos($subject, $search);
3464
  if (false !== $pos) $subject = substr_replace($subject, $replace, $pos, strlen($search));
3465
  return $subject;
3466
  }
@@ -3746,7 +3769,7 @@ class UpdraftPlus {
3746
  $old_client_id = (empty($opts['settings'][$instance_id]['clientid'])) ? '' : $opts['settings'][$instance_id]['clientid'];
3747
  $old_client_secret = (empty($opts['settings'][$instance_id]['secret'])) ? '' : $opts['settings'][$instance_id]['secret'];
3748
 
3749
- if ($old_client_id == $google['settings'][$instance_id]['clientid'] && $old_client_secret == $google['settings'][$instance_id]['secret']) {
3750
  $google['settings'][$instance_id]['token'] = $old_token;
3751
  }
3752
  if (!empty($opts['settings'][$instance_id]['token']) && $old_client_id != $google['settings'][$instance_id]['clientid']) {
@@ -3779,7 +3802,7 @@ class UpdraftPlus {
3779
  if (is_array($settings) && !empty($settings['version']) && !empty($settings['settings'])) {
3780
  foreach ($settings['settings'] as $instance_id => $instance_settings) {
3781
  if (!empty($instance_settings['host']) && preg_match('#ftp(es|s)?://(.*)#i', $instance_settings['host'], $matches)) {
3782
- $settings['settings'][$instance_id]['host'] = rtrim($matches[2], "/ \t\n\r\0\x0B");
3783
  }
3784
  if (isset($instance_settings['pass'])) {
3785
  $settings['settings'][$instance_id]['pass'] = trim($instance_settings['pass'], "\n\r\0\x0B");
@@ -4260,7 +4283,6 @@ class UpdraftPlus {
4260
  $warn = array();
4261
  $err = array();
4262
  $info = array();
4263
-
4264
  $wp_version = $this->get_wordpress_version();
4265
  global $wpdb;
4266
 
@@ -4348,12 +4370,18 @@ class UpdraftPlus {
4348
  @set_time_limit($dbscan_timeout);
4349
 
4350
  // We limit the time that we spend scanning the file for character sets
4351
- $db_charset_scan_timeout = (defined('UPDRAFTPLUS_DB_CHARSET_SCAN_TIMEOUT') && is_numeric(UPDRAFTPLUS_DB_CHARSET_SCAN_TIMEOUT)) ? UPDRAFTPLUS_DB_CHARSET_SCAN_TIMEOUT : 10;
4352
  $charset_scan_start_time = microtime(true);
4353
  $db_supported_character_sets_res = $GLOBALS['wpdb']->get_results('SHOW CHARACTER SET', OBJECT_K);
4354
  $db_supported_character_sets = (null !== $db_supported_character_sets_res) ? $db_supported_character_sets_res : array();
4355
  $db_charsets_found = array();
4356
- while ((($is_plain && !feof($dbhandle)) || (!$is_plain && !gzeof($dbhandle))) && ($line<100 || (!$header_only && count($wanted_tables)>0) || ((microtime(true) - $charset_scan_start_time) < $db_charset_scan_timeout && !empty($db_supported_character_sets)))) {
 
 
 
 
 
 
4357
  $line++;
4358
  // Up to 1MB
4359
  $buffer = ($is_plain) ? rtrim(fgets($dbhandle, 1048576)) : rtrim(gzgets($dbhandle, 1048576));
@@ -4388,11 +4416,11 @@ class UpdraftPlus {
4388
  }
4389
  // Explicitly set it, allowing the consumer to detect when the result was unknown
4390
  $info['same_url'] = false;
4391
-
4392
  if ($this->mod_rewrite_unavailable(false)) {
4393
  $warn[] = sprintf(__('You are using the %s webserver, but do not seem to have the %s module loaded.', 'updraftplus'), 'Apache', 'mod_rewrite').' '.sprintf(__('You should enable %s to make any pretty permalinks (e.g. %s) work', 'updraftplus'), 'mod_rewrite', 'http://example.com/my-page/');
4394
  }
4395
-
4396
  } else {
4397
  $info['same_url'] = true;
4398
  }
@@ -4434,14 +4462,14 @@ class UpdraftPlus {
4434
  if (isset($old_siteinfo['multisite']) && !$old_siteinfo['multisite'] && is_multisite()) {
4435
  // Just need to check that you're crazy
4436
  // if (!defined('UPDRAFTPLUS_EXPERIMENTAL_IMPORTINTOMULTISITE') || !UPDRAFTPLUS_EXPERIMENTAL_IMPORTINTOMULTISITE) {
4437
- // $err[] = sprintf(__('Error: %s', 'updraftplus'), __('You are running on WordPress multisite - but your backup is not of a multisite site.', 'updraftplus'));
4438
- // return array($mess, $warn, $err, $info);
4439
  // } else {
4440
- $warn[] = __('You are running on WordPress multisite - but your backup is not of a multisite site.', 'updraftplus').' '.__('It will be imported as a new site.', 'updraftplus').' <a href="https://updraftplus.com/information-on-importing-a-single-site-wordpress-backup-into-a-wordpress-network-i-e-multisite/">'.__('Please read this link for important information on this process.', 'updraftplus').'</a>';
4441
  // }
4442
  // Got the needed code?
4443
  if (!class_exists('UpdraftPlusAddOn_MultiSite') || !class_exists('UpdraftPlus_Addons_Migrator')) {
4444
- $err[] = sprintf(__('Error: %s', 'updraftplus'), sprintf(__('To import an ordinary WordPress site into a multisite installation requires %s.', 'updraftplus'), 'UpdraftPlus Premium'));
4445
  return array($mess, $warn, $err, $info);
4446
  }
4447
  } elseif (isset($old_siteinfo['multisite']) && $old_siteinfo['multisite'] && !is_multisite()) {
@@ -4470,12 +4498,43 @@ class UpdraftPlus {
4470
  $wanted_tables = array_diff($wanted_tables, array($table));
4471
  }
4472
  }
4473
- if (substr($buffer, -1, 1) != ';') $processing_create = true;
 
 
 
4474
  } elseif ($processing_create) {
4475
- if (!empty($db_supported_character_sets) && preg_match('/ CHARSET=([^\s;]+)/i', $buffer, $charset_match)) {
4476
- $db_charsets_found[] = $charset_match[1];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4477
  }
4478
- if (substr($buffer, -1, 1) == ';') $processing_create = false;
4479
  static $mysql_version_warned = false;
4480
  if (!$mysql_version_warned && version_compare($db_version, '5.2.0', '<') && preg_match('/(CHARSET|COLLATE)[= ]utf8mb4/', $buffer)) {
4481
  $mysql_version_warned = true;
@@ -4500,18 +4559,21 @@ class UpdraftPlus {
4500
  }
4501
  if ($db_charset_forbidden) {
4502
  $db_unsupported_charset_unique = array_unique($db_unsupported_charset);
4503
- $warn[] = sprintf(_n("The database server that this WordPress site is running on doesn't support the character set (%s) which you are trying to import.", "The database server that this WordPress site is running on doesn't support the character sets (%s) which you are trying to import.", count($db_unsupported_charset_unique), 'updraftplus'), implode(', ', $db_unsupported_charset_unique)).' '.__('You can choose another suitable character set instead and continue with the restoration at your own risk.', 'updraftplus').' <a target="_blank" href="https://updraftplus.com/faqs/implications-changing-tables-character-set/">'.__('Go here for more information.', 'updraftplus').'</a>';
4504
  $db_supported_character_sets = array_keys($db_supported_character_sets);
4505
- $similar_type_charset = $this->get_matching_str_from_array_elems($db_unsupported_charset_unique, $db_supported_character_sets);
4506
  if (empty($similar_type_charset)) {
4507
  $row = $GLOBALS['wpdb']->get_row('show variables like "character_set_database"');
4508
  $similar_type_charset = (null !== $row) ? $row->Value : '';
4509
  }
 
 
 
4510
  $charset_select_html = '<label>'.__('Your chosen character set to use instead:', 'updraftplus').'</label> ';
4511
  $charset_select_html .= '<select name="updraft_restorer_charset" id="updraft_restorer_charset">';
4512
  if (is_array($db_supported_character_sets)) {
4513
  foreach ($db_supported_character_sets as $character_set) {
4514
- $charset_select_html .= '<option value="'.esc_attr($character_set).'" '.selected($character_set, $similar_type_charset).'>'.esc_html($character_set).'</option>';
4515
  }
4516
  }
4517
  $charset_select_html .= '</select>';
@@ -4519,25 +4581,86 @@ class UpdraftPlus {
4519
  $info['addui'] .= $charset_select_html;
4520
  }
4521
  }
4522
- /* $blog_tables = "CREATE TABLE $wpdb->terms (
4523
- CREATE TABLE $wpdb->term_taxonomy (
4524
- CREATE TABLE $wpdb->term_relationships (
4525
- CREATE TABLE $wpdb->commentmeta (
4526
- CREATE TABLE $wpdb->comments (
4527
- CREATE TABLE $wpdb->links (
4528
- CREATE TABLE $wpdb->options (
4529
- CREATE TABLE $wpdb->postmeta (
4530
- CREATE TABLE $wpdb->posts (
4531
- $users_single_table = "CREATE TABLE $wpdb->users (
4532
- $users_multi_table = "CREATE TABLE $wpdb->users (
4533
- $usermeta_table = "CREATE TABLE $wpdb->usermeta (
4534
- $ms_global_tables = "CREATE TABLE $wpdb->blogs (
4535
- CREATE TABLE $wpdb->blog_versions (
4536
- CREATE TABLE $wpdb->registration_log (
4537
- CREATE TABLE $wpdb->site (
4538
- CREATE TABLE $wpdb->sitemeta (
4539
- CREATE TABLE $wpdb->signups (
4540
- */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4541
  if (!isset($skipped_tables)) $skipped_tables = array();
4542
  $missing_tables = array();
4543
  if ($old_table_prefix) {
@@ -4570,53 +4693,195 @@ CREATE TABLE $wpdb->signups (
4570
  // //need to make sure that we reset the file back to .crypt before clean temp files
4571
  // $db_file = $decrypted_file['fullpath'].'.crypt';
4572
  // unlink($decrypted_file['fullpath']);
4573
-
4574
  return array($mess, $warn, $err, $info);
4575
  }
4576
-
4577
  /**
4578
  * Find matching string from $str_arr1 and $str_arr2
4579
  *
4580
- * @param array $str_arr1 array of strings
4581
- * @param array $str_arr2 array of strings
 
4582
  * @return string matching str which will be best for replacement
4583
  */
4584
- private function get_matching_str_from_array_elems($str_arr1, $str_arr2) {
4585
  $matching_str = '';
4586
- $str_partial_arr = array();
4587
- foreach ($str_arr1 as $str1) {
4588
- $str1_str_length = strlen($str1);
4589
- $temp_str1_chars = str_split($str1);
4590
- $temp_partial_str = '';
4591
- // The flag is for whether non-numeric character passed after numeric character occurence in str1. For ex. str1 is utf8mb4, the flag wil be true when parsing m after utf8.
4592
- $numeric_char_pass_flag = false;
4593
- $char_position_in_str1 = 0;
4594
- while ($char_position_in_str1 <= $str1_str_length) {
4595
- if ($numeric_char_pass_flag && !is_numeric($temp_str1_chars[$char_position_in_str1])) {
 
 
 
 
 
 
 
 
 
 
 
 
 
4596
  break;
4597
  }
4598
- if (is_numeric($temp_str1_chars[$char_position_in_str1])) {
4599
- $numeric_char_pass_flag = true;
 
 
 
4600
  }
4601
- $temp_partial_str .= $temp_str1_chars[$char_position_in_str1];
4602
- $char_position_in_str1++;
4603
  }
4604
- $str_partial_arr[] = $temp_partial_str;
4605
- }
4606
- foreach ($str_partial_arr as $str_partial) {
4607
- if (!empty($matching_str)) {
4608
- break;
 
 
 
 
 
 
 
 
 
 
 
4609
  }
4610
- foreach ($str_arr2 as $str2) {
4611
- if (0 === stripos($str2, $str_partial)) {
4612
- $matching_str = $str2;
4613
  break;
4614
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4615
  }
4616
  }
4617
  return $matching_str;
4618
  }
4619
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4620
  private function gzopen_for_read($file, &$warn, &$err) {
4621
  if (!function_exists('gzopen') || !function_exists('gzread')) {
4622
  $missing = '';
455
  $_GET['page'] = 'updraftplus';
456
  $_REQUEST['page'] = 'updraftplus';
457
  $method = $matches[1];
 
 
458
  $call_method = "action_".$matches[2];
459
+ $storage_objects_and_ids = $this->get_storage_objects_and_ids(array($method));
460
+
461
+ $instance_id = isset($_GET['updraftplus_instance']) ? $_GET['updraftplus_instance'] : '';
462
+
463
+ // If we don't have an instance_id but the state is set then we are coming back to finish the auth and should extract the instance_id from the state
464
+ if ('' == $instance_id && isset($_GET['state']) && false !== strpos($_GET['state'], ':')) {
465
+ $parts = explode(':', $_GET['state']);
466
+ $instance_id = $parts[1];
467
+ }
468
+
469
+ if (isset($storage_objects_and_ids[$method]['instance_settings'][$instance_id])) {
470
+ $opts = $storage_objects_and_ids[$method]['instance_settings'][$instance_id];
471
+ $backup_obj = $storage_objects_and_ids[$method]['object'];
472
+ $backup_obj->set_options($opts, false, $instance_id);
473
+ } else {
474
+ include_once(UPDRAFTPLUS_DIR.'/methods/'.$method.'.php');
475
+ $call_class = "UpdraftPlus_BackupModule_".$method;
476
+ $backup_obj = new $call_class;
477
+ }
478
+
479
  $this->register_wp_http_option_hooks();
480
+
481
  try {
482
  if (method_exists($backup_obj, $call_method)) {
483
  call_user_func(array($backup_obj, $call_method));
612
  */
613
  public function updraftplus_remotecontrol_command_classes($command_classes) {
614
  if (is_array($command_classes)) $command_classes['updraftplus'] = 'UpdraftCentral_UpdraftPlus_Commands';
615
+ if (is_array($command_classes)) $command_classes['updraftvault'] = 'UpdraftCentral_UpdraftVault_Commands';
616
  return $command_classes;
617
  }
618
 
624
  public function updraftcentral_command_class_wanted($command_php_class) {
625
  if ('UpdraftCentral_UpdraftPlus_Commands' == $command_php_class) {
626
  include_once(UPDRAFTPLUS_DIR.'/includes/class-updraftcentral-updraftplus-commands.php');
627
+ } elseif ('UpdraftCentral_UpdraftVault_Commands' == $command_php_class) {
628
+ include_once(UPDRAFTPLUS_DIR.'/includes/updraftvault.php');
629
  }
630
  }
631
 
668
  $files_deleted = 0;
669
  if ($handle = opendir($updraft_dir)) {
670
  while (false !== ($entry = readdir($handle))) {
671
+ $manifest_match = preg_match("/updraftplus-manifest.json/", $entry);
672
  // This match is for files created internally by zipArchive::addFile
673
  $ziparchive_match = preg_match("/$match([0-9]+)?\.zip\.tmp\.([A-Za-z0-9]){6}?$/i", $entry);
674
  // zi followed by 6 characters is the pattern used by /usr/bin/zip on Linux systems. It's safe to check for, as we have nothing else that's going to match that pattern.
3475
  /**
3476
  * Replace last occurence
3477
  *
3478
+ * @param string $search The value being searched for, otherwise known as the needle
3479
+ * @param string $replace The replacement value that replaces found search values
3480
+ * @param string $subject The string or array being searched and replaced on, otherwise known as the haystack
3481
+ * @param boolean $case_sensitive whether replacement do in case seitively otr not
3482
+ *
3483
  * @return string
3484
  */
3485
+ public function str_lreplace($search, $replace, $subject, $case_sensitive = true) {
3486
+ $pos = $case_sensitive ? strrpos($subject, $search) : strripos($subject, $search);
3487
  if (false !== $pos) $subject = substr_replace($subject, $replace, $pos, strlen($search));
3488
  return $subject;
3489
  }
3769
  $old_client_id = (empty($opts['settings'][$instance_id]['clientid'])) ? '' : $opts['settings'][$instance_id]['clientid'];
3770
  $old_client_secret = (empty($opts['settings'][$instance_id]['secret'])) ? '' : $opts['settings'][$instance_id]['secret'];
3771
 
3772
+ if (isset($google['settings'][$instance_id]['clientid']) && $old_client_id == $google['settings'][$instance_id]['clientid'] && $old_client_secret == $google['settings'][$instance_id]['secret']) {
3773
  $google['settings'][$instance_id]['token'] = $old_token;
3774
  }
3775
  if (!empty($opts['settings'][$instance_id]['token']) && $old_client_id != $google['settings'][$instance_id]['clientid']) {
3802
  if (is_array($settings) && !empty($settings['version']) && !empty($settings['settings'])) {
3803
  foreach ($settings['settings'] as $instance_id => $instance_settings) {
3804
  if (!empty($instance_settings['host']) && preg_match('#ftp(es|s)?://(.*)#i', $instance_settings['host'], $matches)) {
3805
+ $settings['settings'][$instance_id]['host'] = rtrim($matches[2], "/ \t\n\r\0x0B");
3806
  }
3807
  if (isset($instance_settings['pass'])) {
3808
  $settings['settings'][$instance_id]['pass'] = trim($instance_settings['pass'], "\n\r\0\x0B");
4283
  $warn = array();
4284
  $err = array();
4285
  $info = array();
 
4286
  $wp_version = $this->get_wordpress_version();
4287
  global $wpdb;
4288
 
4370
  @set_time_limit($dbscan_timeout);
4371
 
4372
  // We limit the time that we spend scanning the file for character sets
4373
+ $db_charset_collate_scan_timeout = (defined('UPDRAFTPLUS_DB_CHARSET_COLLATE_SCAN_TIMEOUT') && is_numeric(UPDRAFTPLUS_DB_CHARSET_COLLATE_SCAN_TIMEOUT)) ? UPDRAFTPLUS_DB_CHARSET_COLLATE_SCAN_TIMEOUT : 10;
4374
  $charset_scan_start_time = microtime(true);
4375
  $db_supported_character_sets_res = $GLOBALS['wpdb']->get_results('SHOW CHARACTER SET', OBJECT_K);
4376
  $db_supported_character_sets = (null !== $db_supported_character_sets_res) ? $db_supported_character_sets_res : array();
4377
  $db_charsets_found = array();
4378
+ $db_supported_collations_res = $GLOBALS['wpdb']->get_results('SHOW COLLATION', OBJECT_K);
4379
+ $db_supported_collations = (null !== $db_supported_collations_res) ? $db_supported_collations_res : array();
4380
+ $db_charsets_found = array();
4381
+ $db_collates_found = array();
4382
+ $db_supported_charset_related_to_unsupported_collation = false;
4383
+ $db_supported_charsets_related_to_unsupported_collations = array();
4384
+ while ((($is_plain && !feof($dbhandle)) || (!$is_plain && !gzeof($dbhandle))) && ($line<100 || (!$header_only && count($wanted_tables)>0) || ((microtime(true) - $charset_scan_start_time) < $db_charset_collate_scan_timeout && !empty($db_supported_character_sets)))) {
4385
  $line++;
4386
  // Up to 1MB
4387
  $buffer = ($is_plain) ? rtrim(fgets($dbhandle, 1048576)) : rtrim(gzgets($dbhandle, 1048576));
4416
  }
4417
  // Explicitly set it, allowing the consumer to detect when the result was unknown
4418
  $info['same_url'] = false;
4419
+
4420
  if ($this->mod_rewrite_unavailable(false)) {
4421
  $warn[] = sprintf(__('You are using the %s webserver, but do not seem to have the %s module loaded.', 'updraftplus'), 'Apache', 'mod_rewrite').' '.sprintf(__('You should enable %s to make any pretty permalinks (e.g. %s) work', 'updraftplus'), 'mod_rewrite', 'http://example.com/my-page/');
4422
  }
4423
+
4424
  } else {
4425
  $info['same_url'] = true;
4426
  }
4462
  if (isset($old_siteinfo['multisite']) && !$old_siteinfo['multisite'] && is_multisite()) {
4463
  // Just need to check that you're crazy
4464
  // if (!defined('UPDRAFTPLUS_EXPERIMENTAL_IMPORTINTOMULTISITE') || !UPDRAFTPLUS_EXPERIMENTAL_IMPORTINTOMULTISITE) {
4465
+ // $err[] = sprintf(__('Error: %s', 'updraftplus'), __('You are running on WordPress multisite - but your backup is not of a multisite site.', 'updraftplus'));
4466
+ // return array($mess, $warn, $err, $info);
4467
  // } else {
4468
+ $warn[] = __('You are running on WordPress multisite - but your backup is not of a multisite site.', 'updraftplus').' '.__('It will be imported as a new site.', 'updraftplus').' <a href="https://updraftplus.com/information-on-importing-a-single-site-wordpress-backup-into-a-wordpress-network-i-e-multisite/">'.__('Please read this link for important information on this process.', 'updraftplus').'</a>';
4469
  // }
4470
  // Got the needed code?
4471
  if (!class_exists('UpdraftPlusAddOn_MultiSite') || !class_exists('UpdraftPlus_Addons_Migrator')) {
4472
+ $err[] = sprintf(__('Error: %s', 'updraftplus'), sprintf(__('To import an ordinary WordPress site into a multisite installation requires %s.', 'updraftplus'), 'UpdraftPlus Premium'));
4473
  return array($mess, $warn, $err, $info);
4474
  }
4475
  } elseif (isset($old_siteinfo['multisite']) && $old_siteinfo['multisite'] && !is_multisite()) {
4498
  $wanted_tables = array_diff($wanted_tables, array($table));
4499
  }
4500
  }
4501
+ if (';' != substr($buffer, -1, 1)) {
4502
+ $processing_create = true;
4503
+ $db_supported_charset_related_to_unsupported_collation = true;
4504
+ }
4505
  } elseif ($processing_create) {
4506
+ if (!empty($db_supported_collations)) {
4507
+ if (preg_match('/ COLLATE=([^\s;]+)/i', $buffer, $collate_match)) {
4508
+ $db_collates_found[] = $collate_match[1];
4509
+ if (!isset($db_supported_collations[$collate_match[1]])) {
4510
+ $db_supported_charset_related_to_unsupported_collation = true;
4511
+ }
4512
+ }
4513
+ if (preg_match('/ COLLATE ([a-zA-Z0-9._-]+),/i', $buffer, $collate_match)) {
4514
+ $db_collates_found[] = $collate_match[1];
4515
+ if (!isset($db_supported_collations[$collate_match[1]])) {
4516
+ $db_supported_charset_related_to_unsupported_collation = true;
4517
+ }
4518
+ }
4519
+ if (preg_match('/ COLLATE ([a-zA-Z0-9._-]+) /i', $buffer, $collate_match)) {
4520
+ $db_collates_found[] = $collate_match[1];
4521
+ if (!isset($db_supported_collations[$collate_match[1]])) {
4522
+ $db_supported_charset_related_to_unsupported_collation = true;
4523
+ }
4524
+ }
4525
+ }
4526
+ if (!empty($db_supported_character_sets)) {
4527
+ if (preg_match('/ CHARSET=([^\s;]+)/i', $buffer, $charset_match)) {
4528
+ $db_charsets_found[] = $charset_match[1];
4529
+ if ($db_supported_charset_related_to_unsupported_collation && !in_array($charset_match[1], $db_supported_charsets_related_to_unsupported_collations)) {
4530
+ $db_supported_charsets_related_to_unsupported_collations[] = $charset_match[1];
4531
+ }
4532
+ }
4533
+ }
4534
+ if (';' == substr($buffer, -1, 1)) {
4535
+ $processing_create = false;
4536
+ $db_supported_charset_related_to_unsupported_collation = false;
4537
  }
 
4538
  static $mysql_version_warned = false;
4539
  if (!$mysql_version_warned && version_compare($db_version, '5.2.0', '<') && preg_match('/(CHARSET|COLLATE)[= ]utf8mb4/', $buffer)) {
4540
  $mysql_version_warned = true;
4559
  }
4560
  if ($db_charset_forbidden) {
4561
  $db_unsupported_charset_unique = array_unique($db_unsupported_charset);
4562
+ $warn[] = sprintf(_n("The database server that this WordPress site is running on doesn't support the character set (%s) which you are trying to import.", "The database server that this WordPress site is running on doesn't support the character sets (%s) which you are trying to import.", count($db_unsupported_charset_unique), 'updraftplus'), implode(', ', $db_unsupported_charset_unique)).' '.__('You can choose another suitable character set instead and continue with the restoration at your own risk.', 'updraftplus').' <a target="_blank" href="https://updraftplus.com/faqs/implications-changing-tables-character-set/">'.__('Go here for more information.', 'updraftplus').'</a>'.' <a target="_blank" href="https://updraftplus.com/faqs/implications-changing-tables-character-set/">'.__('Go here for more information.', 'updraftplus').'</a>';
4563
  $db_supported_character_sets = array_keys($db_supported_character_sets);
4564
+ $similar_type_charset = $this->get_matching_str_from_array_elems($db_unsupported_charset_unique, $db_supported_character_sets, true);
4565
  if (empty($similar_type_charset)) {
4566
  $row = $GLOBALS['wpdb']->get_row('show variables like "character_set_database"');
4567
  $similar_type_charset = (null !== $row) ? $row->Value : '';
4568
  }
4569
+ if (empty($similar_type_charset) && !empty($db_supported_character_sets[0])) {
4570
+ $similar_type_charset = $db_supported_character_sets[0];
4571
+ }
4572
  $charset_select_html = '<label>'.__('Your chosen character set to use instead:', 'updraftplus').'</label> ';
4573
  $charset_select_html .= '<select name="updraft_restorer_charset" id="updraft_restorer_charset">';
4574
  if (is_array($db_supported_character_sets)) {
4575
  foreach ($db_supported_character_sets as $character_set) {
4576
+ $charset_select_html .= '<option value="'.esc_attr($character_set).'" '.selected($character_set, $similar_type_charset, false).'>'.esc_html($character_set).'</option>';
4577
  }
4578
  }
4579
  $charset_select_html .= '</select>';
4581
  $info['addui'] .= $charset_select_html;
4582
  }
4583
  }
4584
+ if (!empty($db_supported_collations)) {
4585
+ $db_collates_found_unique = array_unique($db_collates_found);
4586
+ $db_unsupported_collate = array();
4587
+ $db_collate_forbidden = false;
4588
+ foreach ($db_collates_found_unique as $db_collate) {
4589
+ if (!isset($db_supported_collations[$db_collate])) {
4590
+ $db_unsupported_collate[] = $db_collate;
4591
+ $db_collate_forbidden = true;
4592
+ }
4593
+ }
4594
+ if ($db_collate_forbidden) {
4595
+ $db_unsupported_collate_unique = array_unique($db_unsupported_collate);
4596
+ $warn[] = sprintf(_n("The database server that this WordPress site is running on doesn't support the collation (%s) used in the database which you are trying to import.", "The database server that this WordPress site is running on doesn't support multiple collations (%s) used in the database which you are trying to import.", count($db_unsupported_collate_unique), 'updraftplus'), implode(', ', $db_unsupported_collate_unique)).' '.__('You can choose another suitable collation instead and continue with the restoration (at your own risk).', 'updraftplus');
4597
+ $similar_type_collate = '';
4598
+ if ($db_charset_forbidden && !empty($similar_type_charset)) {
4599
+ $similar_type_collate = $this->get_similar_collate_related_to_charset($db_supported_collations, $db_unsupported_collate_unique, $similar_type_charset);
4600
+ }
4601
+ if (empty($similar_type_collate) && !empty($db_supported_charsets_related_to_unsupported_collations)) {
4602
+ $db_supported_collations_related_to_charset = array();
4603
+ foreach ($db_supported_collations as $db_supported_collation => $db_supported_collations_info_obj) {
4604
+ if (isset($db_supported_collations_info_obj->Charset) && in_array($db_supported_collations_info_obj->Charset, $db_supported_charsets_related_to_unsupported_collations)) {
4605
+ $db_supported_collations_related_to_charset[] = $db_supported_collation;
4606
+ }
4607
+ }
4608
+ if (!empty($db_supported_collations_related_to_charset)) {
4609
+ $similar_type_collate = $this->get_matching_str_from_array_elems($db_unsupported_collate_unique, $db_supported_collations_related_to_charset, false);
4610
+ }
4611
+ }
4612
+ if (empty($similar_type_collate)) {
4613
+ $similar_type_collate = $this->get_similar_collate_based_on_ocuurence_count($db_collates_found, $db_supported_collations, $db_supported_charsets_related_to_unsupported_collations);
4614
+ }
4615
+ if (empty($similar_type_collate)) {
4616
+ $similar_type_collate = $this->get_matching_str_from_array_elems($db_unsupported_collate_unique, array_keys($db_supported_collations), false);
4617
+ }
4618
+
4619
+ $collate_select_html = '<label>'.__('Your chosen replacement collation', 'updraftplus').':</label>';
4620
+ $collate_select_html .= '<select name="updraft_restorer_collate" id="updraft_restorer_collate">';
4621
+ foreach ($db_supported_collations as $collate => $collate_info_obj) {
4622
+ $option_other_attr = array();
4623
+ if ($db_charset_forbidden && isset($collate_info_obj->Charset)) {
4624
+ $option_other_attr[] = 'data-charset='.esc_attr($collate_info_obj->Charset);
4625
+ if ($similar_type_charset != $collate_info_obj->Charset) {
4626
+ $option_other_attr[] = 'style="display:none;"';
4627
+ }
4628
+ }
4629
+ $collate_select_html .= '<option value="'.esc_attr($collate).'" '.selected($collate, $similar_type_collate, $echo = false).' '.implode(' ', $option_other_attr).'>'.esc_html($collate).'</option>';
4630
+ }
4631
+ $collate_select_html .= '</select>';
4632
+
4633
+ $info['addui'] = empty($info['addui']) ? $collate_select_html : $info['addui'].'<br>'.$collate_select_html;
4634
+
4635
+ if ($db_charset_forbidden) {
4636
+ $collate_change_on_charset_selection_data = array(
4637
+ 'db_supported_collations' => $db_supported_collations,
4638
+ 'db_unsupported_collate_unique' => $db_unsupported_collate_unique,
4639
+ 'db_collates_found' => $db_collates_found,
4640
+ );
4641
+ $info['addui'] .= '<input type="hidden" name="collate_change_on_charset_selection_data" id="collate_change_on_charset_selection_data" value="'.esc_attr(json_encode($collate_change_on_charset_selection_data)).'">';
4642
+ }
4643
+ }
4644
+ }
4645
+ /* $blog_tables = "CREATE TABLE $wpdb->terms (
4646
+ CREATE TABLE $wpdb->term_taxonomy (
4647
+ CREATE TABLE $wpdb->term_relationships (
4648
+ CREATE TABLE $wpdb->commentmeta (
4649
+ CREATE TABLE $wpdb->comments (
4650
+ CREATE TABLE $wpdb->links (
4651
+ CREATE TABLE $wpdb->options (
4652
+ CREATE TABLE $wpdb->postmeta (
4653
+ CREATE TABLE $wpdb->posts (
4654
+ $users_single_table = "CREATE TABLE $wpdb->users (
4655
+ $users_multi_table = "CREATE TABLE $wpdb->users (
4656
+ $usermeta_table = "CREATE TABLE $wpdb->usermeta (
4657
+ $ms_global_tables = "CREATE TABLE $wpdb->blogs (
4658
+ CREATE TABLE $wpdb->blog_versions (
4659
+ CREATE TABLE $wpdb->registration_log (
4660
+ CREATE TABLE $wpdb->site (
4661
+ CREATE TABLE $wpdb->sitemeta (
4662
+ CREATE TABLE $wpdb->signups (
4663
+ */
4664
  if (!isset($skipped_tables)) $skipped_tables = array();
4665
  $missing_tables = array();
4666
  if ($old_table_prefix) {
4693
  // //need to make sure that we reset the file back to .crypt before clean temp files
4694
  // $db_file = $decrypted_file['fullpath'].'.crypt';
4695
  // unlink($decrypted_file['fullpath']);
4696
+
4697
  return array($mess, $warn, $err, $info);
4698
  }
4699
+
4700
  /**
4701
  * Find matching string from $str_arr1 and $str_arr2
4702
  *
4703
+ * @param array $str_arr1 array of strings
4704
+ * @param array $str_arr2 array of strings
4705
+ * @param boolean $match_until_first_numeric only match until first numeric occurence
4706
  * @return string matching str which will be best for replacement
4707
  */
4708
+ private function get_matching_str_from_array_elems($str_arr1, $str_arr2, $match_until_first_numeric = true) {
4709
  $matching_str = '';
4710
+ if ($match_until_first_numeric) {
4711
+ $str_partial_arr = array();
4712
+ foreach ($str_arr1 as $str1) {
4713
+ $str1_str_length = strlen($str1);
4714
+ $temp_str1_chars = str_split($str1);
4715
+ $temp_partial_str = '';
4716
+ // The flag is for whether non-numeric character passed after numeric character occurence in str1. For ex. str1 is utf8mb4, the flag wil be true when parsing m after utf8.
4717
+ $numeric_char_pass_flag = false;
4718
+ $char_position_in_str1 = 0;
4719
+ while ($char_position_in_str1 <= $str1_str_length) {
4720
+ if ($numeric_char_pass_flag && !is_numeric($temp_str1_chars[$char_position_in_str1])) {
4721
+ break;
4722
+ }
4723
+ if (is_numeric($temp_str1_chars[$char_position_in_str1])) {
4724
+ $numeric_char_pass_flag = true;
4725
+ }
4726
+ $temp_partial_str .= $temp_str1_chars[$char_position_in_str1];
4727
+ $char_position_in_str1++;
4728
+ }
4729
+ $str_partial_arr[] = $temp_partial_str;
4730
+ }
4731
+ foreach ($str_partial_arr as $str_partial) {
4732
+ if (!empty($matching_str)) {
4733
  break;
4734
  }
4735
+ foreach ($str_arr2 as $str2) {
4736
+ if (0 === stripos($str2, $str_partial)) {
4737
+ $matching_str = $str2;
4738
+ break;
4739
+ }
4740
  }
 
 
4741
  }
4742
+ } else {
4743
+ $str1_partial_first_arr = array();
4744
+ $str1_partial_first_arr = array();
4745
+ $str1_partial_start_n_middle_arr = array();
4746
+ $str1_partial_middle_n_last_arr = array();
4747
+ $str1_partial_last_arr = array();
4748
+ foreach ($str_arr1 as $str1) {
4749
+ $str1_partial_arr = explode('_', $str1);
4750
+ $str1_parts_count = count($str1_partial_arr);
4751
+ $str1_partial_first_arr[] = $str1_partial_arr[0];
4752
+ $str1_last_part_index = $str1_parts_count - 1;
4753
+ if ($str1_last_part_index > 0) {
4754
+ $str1_partial_last_arr[] = $str1_partial_arr[$str1_last_part_index];
4755
+ $str1_partial_start_n_middle_arr[] = substr($str1, 0, stripos($str1, '_'));
4756
+ $str1_partial_middle_n_last_arr[] = substr($str1, stripos($str1, '_') + 1);
4757
+ }
4758
  }
4759
+ for ($case_no = 1; $case_no <= 5; $case_no++) {
4760
+ if (!empty($matching_str)) {
 
4761
  break;
4762
  }
4763
+ foreach ($str_arr2 as $str2) {
4764
+ switch ($case_no) {
4765
+ // Case 1: Both Start and End match
4766
+ case 1:
4767
+ $str2_partial_arr = explode('_', $str2);
4768
+ $str2_first_part = $str2_partial_arr[0];
4769
+ $str2_parts_count = count($str2_partial_arr);
4770
+ $str2_last_part_index = $str2_parts_count - 1;
4771
+ if ($str2_last_part_index > 0) {
4772
+ $str2_last_part = $str2_partial_arr[$str2_last_part_index];
4773
+ } else {
4774
+ $str2_last_part = '';
4775
+ }
4776
+ if (!empty($str2_last_part) && !empty($str1_partial_last_arr) && in_array($str2_first_part, $str1_partial_first_arr) && in_array($str2_last_part, $str1_partial_last_arr)) {
4777
+ $matching_str = $str2;
4778
+ }
4779
+ break;
4780
+ // Case 2: Start Middle Match
4781
+ case 2:
4782
+ $str2_partial_first_n_middle_parts = substr($str2, 0, stripos($str2, '_'));
4783
+ if (in_array($str2_partial_first_n_middle_parts, $str1_partial_start_n_middle_arr)) {
4784
+ $matching_str = $str2;
4785
+ }
4786
+ break;
4787
+ // Case 3: End Middle Match
4788
+ case 3:
4789
+ $str2_partial_middle_n_last_parts = stripos($str2, '_') !== false ? substr($str2, stripos($str2, '_') + 1) : '';
4790
+ if (!empty($str2_partial_middle_n_last_parts) && in_array($str2_partial_middle_n_last_parts, $str1_partial_middle_n_last_arr)) {
4791
+ $matching_str = $str2;
4792
+ }
4793
+ break;
4794
+ // Case 4: Start Match (low possibilities)
4795
+ case 4:
4796
+ $str2_partial_arr = explode('_', $str2);
4797
+ $str2_first_part = $str2_partial_arr[0];
4798
+ if (in_array($str2_first_part, $str1_partial_first_arr)) {
4799
+ $matching_str = $str2;
4800
+ }
4801
+ break;
4802
+ // Case 5: End Match (low possibilities)
4803
+ case 5:
4804
+ $str2_partial_arr = explode('_', $str2);
4805
+ $str2_parts_count = count($str2_partial_arr);
4806
+ $str2_last_part_index = $str2_parts_count - 1;
4807
+ if ($str2_last_part_index > 0) {
4808
+ $str2_last_part = $str2_partial_arr[$str2_last_part_index];
4809
+ } else {
4810
+ $str2_last_part = '';
4811
+ }
4812
+ if (!empty($str2_last_part) && in_array($str2_last_part, $str1_partial_last_arr)) {
4813
+ $matching_str = $str2;
4814
+ }
4815
+ break;
4816
+ }
4817
+ if (!empty($matching_str)) {
4818
+ break;
4819
+ }
4820
+ }
4821
  }
4822
  }
4823
  return $matching_str;
4824
  }
4825
+
4826
+ /**
4827
+ * Get default substitute similar collate related to charset
4828
+ *
4829
+ * @param array $db_supported_collations Supported collations. It should contain result of 'SHOW COLLATION' query
4830
+ * @param array $db_unsupported_collate_unique Unsupported unique collates collection
4831
+ * @param string $similar_type_charset Charset for which need to get default collate substitution
4832
+ * @return string $similar_type_collate default substitute collate which is best suitable or blank string
4833
+ */
4834
+ public function get_similar_collate_related_to_charset($db_supported_collations, $db_unsupported_collate_unique, $similar_type_charset) {
4835
+ $similar_type_collate = '';
4836
+ $db_supported_collations_related_to_charset = array();
4837
+ foreach ($db_supported_collations as $db_supported_collation => $db_supported_collations_info_obj) {
4838
+ if (isset($db_supported_collations_info_obj->Charset) && $db_supported_collations_info_obj->Charset == $similar_type_charset) {
4839
+ $db_supported_collations_related_to_charset[] = $db_supported_collation;
4840
+ }
4841
+ }
4842
+ if (!empty($db_supported_collations_related_to_charset)) {
4843
+ $similar_type_collate = $this->get_matching_str_from_array_elems($db_unsupported_collate_unique, $db_supported_collations_related_to_charset, false);
4844
+ }
4845
+ return $similar_type_collate;
4846
+ }
4847
+
4848
+ /**
4849
+ * Get default substitute similar collate based on existing supported collates count in database backup file
4850
+ *
4851
+ * @param array $db_collates_found All collates which have found in database backup file regardless whether they are supported or unsupported
4852
+ * @param array $db_supported_collations Supported collations. It should contain result of 'SHOW COLLATION' query
4853
+ * @param array $db_supported_charsets_related_to_unsupported_collations All charset which are related to unsupported collation
4854
+ *
4855
+ * @return string $similar_type_collate default substitute collate which is best suitable or blank string
4856
+ */
4857
+ public function get_similar_collate_based_on_ocuurence_count($db_collates_found, $db_supported_collations, $db_supported_charsets_related_to_unsupported_collations) {
4858
+ $similar_type_collate = '';
4859
+ $db_supported_collates_found_with_occurrence = array();
4860
+ foreach ($db_collates_found as $db_collate_found) {
4861
+ if (isset($db_supported_collations[$db_collate_found])) {
4862
+ if (isset($db_supported_collates_found_with_occurrence[$db_collate_found])) {
4863
+ $db_supported_collates_found_with_occurrence[$db_collate_found] = intval($db_supported_collates_found_with_occurrence[$db_collate_found]) + 1;
4864
+ } else {
4865
+ $db_supported_collates_found_with_occurrence[$db_collate_found] = 1;
4866
+ }
4867
+ }
4868
+ }
4869
+ if (!empty($db_supported_collates_found_with_occurrence)) {
4870
+ arsort($db_supported_collates_found_with_occurrence);
4871
+ if (!empty($db_supported_charsets_related_to_unsupported_collations)) {
4872
+ foreach ($db_supported_collates_found_with_occurrence as $db_supported_collate_with_occurrence => $occurrence_count) {
4873
+ if (isset($db_supported_collations[$db_supported_collate_with_occurrence]) && isset($db_supported_collations[$db_supported_collate_with_occurrence]->Charset) && in_array($db_supported_collations[$db_supported_collate_with_occurrence]->Charset, $db_supported_charsets_related_to_unsupported_collations)) {
4874
+ $similar_type_collate = $db_supported_collate_with_occurrence;
4875
+ break;
4876
+ }
4877
+ }
4878
+ } else {
4879
+ $similar_type_collate = array_search(max($db_supported_collates_found_with_occurrence), $db_supported_collates_found_with_occurrence);
4880
+ }
4881
+ }
4882
+ return $similar_type_collate;
4883
+ }
4884
+
4885
  private function gzopen_for_read($file, &$warn, &$err) {
4886
  if (!function_exists('gzopen') || !function_exists('gzread')) {
4887
  $missing = '';
css/admin.css CHANGED
@@ -1710,6 +1710,16 @@ div#updraft-wrap a {
1710
  cursor: pointer !important;
1711
  }
1712
 
 
 
 
 
 
 
 
 
 
 
1713
  #updraftcentral_keys_table {
1714
  display: none;
1715
  }
@@ -1721,10 +1731,6 @@ div#updraft-wrap a {
1721
  margin-bottom: 8px;
1722
  }
1723
 
1724
- #updraftcentral_keycreate_mothership {
1725
- margin-left: 24px;
1726
- }
1727
-
1728
  @media screen and (min-width: 670px) {
1729
 
1730
  .expertmode .advanced_settings_container .advanced_settings_menu {
1710
  cursor: pointer !important;
1711
  }
1712
 
1713
+ .updraftcentral_wizard_option {
1714
+ width: 45%;
1715
+ float: left;
1716
+ text-align: center;
1717
+ }
1718
+
1719
+ .updraftcentral_wizard_option label {
1720
+ margin-bottom: 8px;
1721
+ }
1722
+
1723
  #updraftcentral_keys_table {
1724
  display: none;
1725
  }
1731
  margin-bottom: 8px;
1732
  }
1733
 
 
 
 
 
1734
  @media screen and (min-width: 670px) {
1735
 
1736
  .expertmode .advanced_settings_container .advanced_settings_menu {
css/admin.min.css CHANGED
@@ -1,2 +1,2 @@
1
- .max-width-600{max-width:600px}.width-900{width:900px}.width-80{width:80%}.no-decoration{text-decoration:none}.bold{font-weight:bold}.center-align-td{text-align:center}.remove-padding{padding:0 !important}.updraft-text-center{text-align:center}.autobackup{padding:6px;margin:8px 0}ul .disc{list-style:disc inside}.dashicons-log-fix{display:inherit}input{border-radius:4px;line-height:1.42;border:1px solid #CCC;height:27px;padding:2px 6px;color:#555}input[type="text"]{font-size:14px}input[type="number"]{height:31px}select{border-radius:4px}.main-dashboard-buttons{border-width:4px;border-radius:12px;letter-spacing:0;font-size:17px;font-weight:bold;padding-left:.7em;padding-right:2em;padding:.3em 1em;line-height:1.7em;background:transparent;position:relative;border:2px solid;transition:all .2s;vertical-align:baseline;box-sizing:border-box;text-align:center;line-height:1.3em;margin-left:.3em;text-transform:none;line-height:1;text-decoration:none}.button-restore{border-color:#629ec0;color:#629ec0}.dashboard-main-sizing{border-width:4px;width:190px;line-height:1.7em}.button-restore:hover,.button-migrate:hover,.button-backup:hover,.button-view-log:hover,.button-mass-selectors:hover,.button-delete:hover,.button-entity-backup:hover,.udp-button-primary:hover{border-color:#df6926;color:#df6926}.button-migrate{color:#eea920;border-color:#eea920}.button-backup{border-color:#84ca1b;color:#84ca1b}.existing-backups-buttons{font-size:11px;line-height:1.4em;border-width:3px}.existing-backups-restore-buttons{font-size:11px;line-height:1.4em;border-width:3px}.button-delete{color:#e23900;border-color:#e23900;font-size:14px;line-height:1.4em;border-width:2px;margin-right:10px}.button-view-log,.button-mass-selectors{color:darkgrey;border-color:darkgrey;font-size:14px;line-height:1.4em;border-width:2px;margin-top:-1px}.button-view-log{width:120px}.button-existing-restore{font-size:14px;line-height:1.4em;border-width:2px;width:110px}.main-restore{margin-right:3%;margin-left:3%}.button-entity-backup{color:#555;border-color:#555;font-size:11px;line-height:1.4em;border-width:2px;margin-right:5px}.button-select-all{width:122px}.button-deselect{width:92px}#ud_massactions>.display-flex>.mass-selectors-margins{margin-right:-4px}.udp-button-primary{border-width:4px;color:#0073aa;border-color:#0073aa;font-size:14px;height:40px}#ud_massactions .button-delete{margin-right:0}.stored_local{border-radius:5px;background-color:#007fe7;padding:3px 5px 5px 5px;color:#FFF;font-size:75%}.form-table td.updraft_existingbackup_date{padding-bottom:5px}span#updraft_lastlogcontainer{word-break:break-all}.stored_icon{height:1.3em;position:relative;top:.2em}.backup_date_label .clear-right{clear:right}.udp-logo-70{width:70px;height:70px;float:left;padding-right:25px}h3 .thank-you{margin-top:0}.ws_advert{max-width:800px;font-size:140%;line-height:140%;padding:14px;clear:left}.dismiss-dash-notice{float:right;position:relative;top:-20px}#updraft_report_cell .updraft_reportbox{padding:8px;margin:8px 0;border:1px dotted;clear:left;float:left}#updraft_report_cell button.updraft_reportbox_delete{font-size:50%;float:right;padding:0 3px;position:relative;top:-4px;left:4px}#updraft-navtab-settings-content .updraft-test-button{font-size:18px !important}#updraft_report_cell .updraft_report_checkbox{margin-top:4px}#updraft_report_cell .updraft_report_email{width:300px}#updraft_report_cell .updraft_report_another_p{clear:left}#updraft-navtab-settings-content table.form-table p{max-width:700px}#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected{background-color:#CCC}.updraft_settings_sectionheading{display:none}.updraft-backupentitybutton-disabled{background-color:transparent;border:0;color:#0074a2;text-decoration:underline;cursor:pointer;clear:none;float:left}.updraft-backupentitybutton{margin-left:8px}.updraft-bigbutton{padding:2px 0 !important;margin-right:14px !important;font-size:22px !important;min-height:32px;min-width:180px}.updraft_debugrow th{float:right;text-align:right;font-weight:bold;padding-right:8px;min-width:140px}.updraft_debugrow td{min-width:300px;vertical-align:bottom}#updraft_webdav_host_error{color:red}#updraft_zip_files_jstree .jstree-container-ul>.jstree-node,#updraft_more_files_jstree .jstree-container-ul>.jstree-node{background:transparent}#updraft_zip_files_jstree .jstree-container-ul>.jstree-open>.jstree-ocl,#updraft_more_files_jstree .jstree-container-ul>.jstree-open>.jstree-ocl{background-position:-36px -4px}#updraft_zip_files_jstree .jstree-container-ul>.jstree-closed>.jstree-ocl,#updraft_more_files_jstree .jstree-container-ul>.jstree-closed>.jstree-ocl{background-position:-4px -4px}#updraft_zip_files_jstree .jstree-container-ul>.jstree-leaf>.jstree-ocl,#updraft_more_files_jstree .jstree-container-ul>.jstree-leaf>.jstree-ocl{background:transparent}#updraft_zip_files_container{position:relative;height:450px;overflow:none}#updraft_zip_info_container{position:relative;height:auto;width:100%;border:1px dotted;margin-bottom:5px}#updraft_zip_info_container p{margin:1px;padding-left:10px;font-size:14px}#updraft_zip_download_item{display:none;color:#0073aa;padding-left:10px}#updraft_zip_download_notice{padding-left:10px}#updraft_zip_files_jstree_container{position:relative;border:1px dotted;height:80%;width:100%;overflow:auto}#updraft_more_files_container{position:relative;display:none;height:300px;width:100%;border:1px dotted;margin-bottom:5px}#updraft_jstree_buttons{position:absolute;top:0;right:0}#updraft_jstree_container{height:100%;width:100%;overflow:auto}#updraft_more_files_container button{height:22px;line-height:20px}#updraft_jstree_confirm,#updraft_jstree_cancel{display:none}.updraftplus-morefiles-row-delete{cursor:pointer;color:red;font-size:23px !important}.updraftplus-morefiles-row-edit{cursor:pointer;font-size:24px !important}#updraft-wrap .form-table th{width:230px}.updraftplus-remove{background-color:#c00000;border:1px solid #c00000;height:22px;padding:4px 3px 0 3px;margin-right:6px}.updraft-viewlogdiv form{margin:0;padding:0}.updraft-viewlogdiv{background-color:#FFF;color:#000;border:1px solid #000;height:26px;padding:0;margin:0 4px 0 0;border-radius:3px;float:left}.updraft-viewlogdiv input,.updraft-viewlogdiv a{border:0;background-color:transparent;color:#000;margin:0;padding:3px 4px;font-size:16px;line-height:26px}.updraft-viewlogdiv:hover{background-color:#000;color:#FFF;border:1px solid #FFF;cursor:pointer}.updraft-viewlogdiv input:hover,.updraft-viewlogdiv a:hover{color:#FFF;cursor:pointer}.updraftplus-remove a{color:white;padding:4px 4px 0 4px}.updraftplus-remove:hover{background-color:white;border:1px solid #c00000}.updraftplus-remove a:hover{color:#c00000}.drag-drop #drag-drop-area2{border:4px dashed #DDD;height:200px}#drag-drop-area2 .drag-drop-inside{margin:36px auto 0;width:350px}#filelist,#filelist2{width:100%}#filelist .file,#filelist2 .file,.ud_downloadstatus .file,#ud_downloadstatus2 .file{padding:5px;background:#ececec;border:solid 1px #CCC;margin:4px 0}ul.updraft_premium_description_list{list-style:disc inside}ul.updraft_premium_description_list li{display:inline}ul.updraft_premium_description_list li::after{content:" | "}ul.updraft_premium_description_list li.last::after{content:""}.updraft_feature_cell{background-color:#f7d9c9 !important;padding:5px 10px}.updraft_feat_table,.updraft_feat_th,.updraft_feat_table td{border:1px solid black;border-collapse:collapse;font-size:120%;background-color:white;text-align:center}.updraft_feat_table p{padding:0 10px;margin:5px 0;font-size:16px}.updraft_feat_table h4{margin:5px 0}.updraft_feat_table .dashicons{width:25px;height:25px;font-size:25px;line-height:1}.updraft_feat_table .dashicons-yes,.updraft_feat_table .updraft-yes{color:green}.updraft_feat_table .dashicons-no-alt,.updraft_feat_table .updraft-no{color:red}.updraft_tick_cell{text-align:center}.updraft_tick_cell img{margin:4px 0;height:24px}#filelist .fileprogress,#filelist2 .fileprogress,.ud_downloadstatus .dlfileprogress,#ud_downloadstatus2 .dlfileprogress{width:0;background:#f6a828;height:5px}.ud_downloadstatus .raw,#ud_downloadstatus2 .raw{margin-top:8px;clear:left}.ud_downloadstatus .file,#ud_downloadstatus2 .file{margin-top:8px}tr.updraftplusmethod h3{margin:0}#updraft_retain_db_rules .updraft_retain_rules_delete,#updraft_retain_files_rules .updraft_retain_rules_delete{cursor:pointer;color:red;font-size:120%;font-weight:bold;border:0;border-radius:3px;padding:2px;margin:0 6px}#updraft_retain_db_rules .updraft_retain_rules_delete:hover,#updraft_retain_files_rules .updraft_retain_rules_delete:hover{cursor:pointer;color:white;background:red}#updraft_backup_started{max-width:800px;font-size:140%;line-height:140%;padding:14px;clear:left}.udp-premium-image{display:none}@media screen and (min-width:720px){.udp-premium-image{display:block;float:left;padding-right:5px}}#plupload-upload-ui2{width:80%}.backup-restored{padding:8px}.backup-restored span{font-size:120%}.memory-limit{padding:8px}.updraft_list_errors{padding:8px}.nav-tab-wrapper{margin:14px 0}#updraft-poplog-content{white-space:pre-wrap}.next-backup{border:0;padding:0;margin:0 10px 0 0}.not-scheduled{vertical-align:top !important;margin:0 !important;padding:0 !important}.next-backup .updraft_scheduled{margin:0;padding:2px 4px 2px 0}#next-backup-table-inner td{vertical-align:top}.next-backup .updraft_all-files{color:blue;margin:0;padding:2px 0 0 0}.multisite-advert-width{width:800px}.updraft_settings_sectionheading{margin-top:6px}.premium-upgrade-prompt{font-size:115%}.updraft_feat_table{margin-top:30px}.show_admin_restore_in_progress_notice{padding:8px}.show_admin_restore_in_progress_notice .unfinished-restoration{font-size:120%}#backupnow_includefiles_moreoptions,#backupnow_database_moreoptions{margin:4px 16px 6px 16px;border:1px dotted;padding:6px 10px}#backupnow_database_moreoptions{max-height:250px;overflow:auto}.form-table #updraft_activejobsrow .minimum-height{min-height:100px}#updraft_lastlogmessagerow .last-message{padding-top:20px;display:block}.updraft_simplepie{vertical-align:top}.download-backups{margin-top:8px}.download-backups .updraft_download_button{margin-right:6px;margin-top:4px}.download-backups .choose-components-button{font-size:16px}.download-backups .ud-whitespace-warning{background-color:pink;padding:8px;margin:4px;border:1px dotted}.download-backups .ul{list-style:none inside;max-width:800px;margin-top:6px;margin-bottom:12px}#updraft-plupload-modal{width:75%;margin:16px;margin-left:100px}.download-backups .upload{max-width:610px}.download-backups #plupload-upload-ui{width:70%}.ud_downloadstatus{padding:10px;background:#f1f1f1}#ud_massactions{padding:14px;position:fixed;right:25%;top:25%;border:2px solid;border-radius:4px;background:#f1f1f1;float:right}#ud_massactions .updraftplus-remove{clear:left;font-size:16px;text-align:center;border-radius:4px;margin-top:4px}#ud_massactions .updraftplus-remove a{text-decoration:none}#ud_massactions .updraft-viewlogdiv{font-size:16px;text-align:center;border-radius:4px;margin-top:4px}#ud_massactions .updraft-viewlogdiv a{text-decoration:none;position:relative;top:3px}#ud_massactions .updraft-viewlogdiv a{text-decoration:none;position:relative;top:3px}#updraft-navtab-backups-content .updraft_existing_backups{margin-bottom:12px}#updraft-message-modal-innards{padding:4px}#updraft-authenticate-modal{text-align:center;font-size:16px !important}#updraft-authenticate-modal p{font-size:16px}#updraft_delete_form p{margin-top:3px;padding-top:0}#updraft_restore_form .cannot-restore{margin:8px 0}#updraft_restorer_dboptions{padding:12px;margin:8px 0 4px 0;border:dashed 1px}#updraft_restorer_dboptions h4{margin:0 0 6px 0;padding:0}.updraft_debugrow th{vertical-align:top;padding-top:6px}.expertmode p{font-size:125%}.expertmode .call-wp-action{width:300px;height:22px}.updraftplus-lock-advert{clear:left;max-width:600px}.uncompressed-data{clear:left;max-width:600px}.delete-old-directories{padding:8px;padding-bottom:12px}.active-jobs{min-width:480px;min-height:48px;text-align:center;margin-top:4px;padding:8px;border:1px solid;float:left;clear:left}.job-id{min-width:480px;margin-top:4px;padding:8px;border:1px solid;clear:left;float:left}.next-resumption{font-weight:bold}.updraft_percentage{z-index:-1;position:absolute;left:0;top:0;text-align:center;background-color:#f6a828}.curstage{border-radius:4px;margin-top:8px;padding-top:4px;border:1px solid #AAA;width:100%;height:22px;position:relative;text-align:center;font-style:italic}.retain-files{width:48px}.backup-interval-description tr td div{max-width:670px}#updraft-manualdecrypt-modal{width:85%;margin:6px;margin-left:100px}.directory-permissions{font-size:110%;font-weight:bold}.double-warning{border:1px solid;padding:6px}.raw-backup-info{font-style:italic;font-weight:bold;font-size:120%}.updraft_existingbackup_date{width:22%;max-width:140px}.existing-backups-table{margin-top:20px;margin-left:20px;width:80%}.tr-bottom-4{margin-bottom:4px}.form-table .backup-date{width:172px;padding:0;padding-left:15px}.form-table .backup-data{width:426px;padding:0;padding-left:15px}.form-table .updraft_backup_actions{width:272px;padding:0 0 10px 15px}.existing-date{box-sizing:border-box;max-width:140px;width:25%}.line-break-tr{height:2px;padding:1px;margin:0}.line-break-td{margin:0;padding:0}.td-line-color{height:2px;background-color:#888}.raw-backup{max-width:140px}.existing-backups-actions{padding:1px;margin:0}.existing-backups-border{height:2px;padding:1px;margin:0}.existing-backups-border>td{margin:0;padding:0}.existing-backups-border>div{height:2px;background-color:#AAA}.updraft_existing_backup_date{max-width:140px}.restore-button{margin-right:6px;float:left;clear:none}.updraftplus-remove{font-size:16px;text-align:center;border-radius:4px}.before-restore-button{padding:1px;margin:0}.table-separator-tr{height:2px;padding:1px;margin:0}.table-separator-td{margin:0;padding:0}.end-of-table-div{height:2px;background-color:#AAA}.last-backup-job{padding-top:3% !important}.line-height-03{line-height:.3 !important}.line-height-13{line-height:1.3 !important}.line-height-23{line-height:2.3 !important}#updraft_diskspaceused{color:#df6926}.updraft_premium_description_list{text-align:left}#updraft_delete_old_dirs_pagediv{padding-bottom:10px}.job-id{margin:0 auto;width:20%}.updraft_all-files{color:#df6926}.fix-time{width:70px}.retain-files{width:70px}.number-input{min-width:50px;max-width:70px}.additional-rule-width{min-width:60px;max-width:70px}.dashicons{line-height:inherit;font-size:inherit}.addon-logo-150{margin-left:30px;margin-top:33px;height:125px;width:150px}.margin-bottom-50{margin-bottom:50px}.premium-container{width:80%}.main-header{background-color:#df6926;height:200px;width:100%}.button-add-to-cart{color:white;border-color:white;float:none;margin-right:17px}.button-add-to-cart:hover,.button-add-to-cart:focus,.button-add-to-cart:active{border-color:#a0a5aa;color:#a0a5aa}.addon-title{margin-top:25px}.addon-text{margin-top:75px}.image-main-div{width:25%;float:left}.text-main-div{width:60%;float:left;text-align:center;color:white;margin-top:16px}.text-main-div-title{font-weight:bold !important;color:white;text-align:center}.text-main-div-paragraph{color:white}.updraftplus-vault-cta{width:100%;text-align:center;margin-bottom:50px}.updraftplus-vault-cta h1{font-weight:bold}.updraftvault-buy{width:225px;height:225px;border:2px solid #777;display:inline-table;margin:0 auto;margin-right:50px;position:relative}.updraftplus-vault-cta>.vault-options>.center-vault{width:275px;height:275px}.updraftplus-vault-cta>.vault-options>.center-vault>a{right:21%;font-size:16px;border-width:4px !important}.updraftplus-vault-cta>.vault-options>.center-vault>p{font-size:16px}.updraftvault-buy .button-purchase{right:24%;margin-left:0;line-height:1.7em}.updraftvault-buy hr{height:2px;background-color:#777;margin-top:18px}.right{margin-right:0}.updraftvault-buy .addon-logo-100{height:100px;width:125px;margin-top:7px}.updraftvault-buy .addon-logo-large{margin-top:7px}.updraftvault-buy .button-buy-vault{font-size:12px;color:#df6926;border-color:#df6926;border-width:2px !important;position:absolute;right:29%;bottom:2%}.premium-addon-div .button-purchase{line-height:1.7em}.updraftvault-buy .button-buy-vault:hover{border-color:darkgrey;color:darkgrey}.premium-addons{margin-top:80px;width:100%;margin:0 auto;display:table}.addon-list{display:table;text-align:center}.premium-addons h1{text-align:center;font-weight:bold}.premium-addons p{text-align:center}.premium-addons .premium-addon-div{width:200px;height:250px;border:2px solid #777;display:inline-table;margin:0 auto;margin-right:25px;margin-top:25px;text-align:center;position:relative}.premium-addons .premium-addon-div p{margin-left:2px;margin-right:2px}.premium-addons .premium-addon-div img{width:auto;height:50px;margin-top:7px}.premium-addons .premium-addon-div .hr-alignment{margin-top:44px}.premium-addons .premium-addon-div .dropbox-logo{height:39px;width:150px}.premium-addons .premium-addon-div .azure-logo,.premium-addons .premium-addon-div .onedrive-logo{width:75%;height:24px}.button-purchase{font-size:12px;color:#df6926;border-color:#df6926;border-width:2px !important;position:absolute;right:25%;bottom:2%}.button-purchase:hover{color:darkgrey;border-color:darkgrey}.premium-addons .premium-addon-div hr{height:2px;background-color:#777;margin-top:18px}.premium-addon-div p{font-style:italic}.addon-list>.premium-addon-div>.onedrive-fix,.addon-list>.premium-addon-div>.azure-logo{margin-top:33px}.addon-list>.premium-addon-div>.dropbox-fix{margin-top:18px}.premium-forgotton-something{margin-top:5%}.premium-forgotton-something h1{text-align:center;font-weight:bold}.premium-forgotton-something p{text-align:center;font-weight:normal}.premium-forgotton-something .button-faq{color:#df6926;border-color:#df6926;margin:0 auto;display:table}.premium-forgotton-something .button-faq:hover{color:#777;border-color:#777}.updraftplusmethod.updraftvault #vaultlogo{padding-left:40px}.updraftplusmethod.updraftvault .vault_primary_option{float:left;width:50%;text-align:center;padding-bottom:20px}.updraftplusmethod.updraftvault .vault_primary_option div{clear:right;padding-top:20px}.updraftplusmethod.updraftvault .clear-left{clear:left}.updraftplusmethod.updraftvault .padding-top-20px{padding-top:20px}.updraftplusmethod.updraftvault .padding-top-14px{padding-top:14px}.updraftplusmethod.updraftvault #updraftvault_settings_default .button-primary,.updraftplusmethod.updraftvault #updraftvault_settings_showoptions .button-primary{font-size:18px !important;padding-bottom:20px}.updraftplusmethod.updraftvault #updraftvault_showoptions,.updraftplusmethod.updraftvault #updraftvault_connect{margin-top:8px}.updraftplusmethod.updraftvault #updraftvault_settings_connect input{margin-right:10px}.updraftplusmethod.updraftvault #updraftvault_email{width:280px}.updraftplusmethod.updraftvault #updraftvault_pass{width:200px}.updraftplusmethod.updraftvault #vault-is-connected{margin:0;padding:0}.updraftplusmethod.updraftvault #updraftvault_settings_default p{clear:left}.updraftplusmethod.updraftvault .vault-purchase-option{float:left;width:33%;text-align:center;padding-top:20px}.updraftplusmethod.updraftvault .vault-purchase-option-size{font-size:200%;font-weight:bold}.updraftplusmethod.updraftvault .vault-purchase-option-link{clear:both;font-size:150%}.updraftplusmethod.updraftvault .vault-purchase-option-or{clear:both;font-size:115%;font-style:italic}.autobackup-image{clear:left;float:left;width:110px;height:110px}.autobackup-description{width:100%}.advert-description{float:left;clear:right;padding:4px 10px 8px 10px;width:70%;clear:right;vertical-align:top}.advert-btn{display:inline-block;min-width:10%;vertical-align:top;margin-bottom:8px}.advert-btn:first-of-type{margin-top:25px}.advert-btn a{display:block;cursor:pointer}a.btn-get-started{background:#FFF;border:2px solid #df6926;border-radius:4px;color:#df6926;display:inline-block;margin-left:10px !important;margin-bottom:7px !important;font-size:18px !important;line-height:20px;min-height:28px;padding:11px 10px 5px 10px;text-transform:uppercase;text-decoration:none}.circle-dblarrow{border:1px solid #df6926;border-radius:100%;display:inline-block;font-size:17px;line-height:17px;margin-left:5px;width:20px;height:20px;text-align:center}.expertmode .advanced_settings_container{height:auto;overflow:hidden}.expertmode .advanced_settings_container .advanced_settings_menu{float:none;border-bottom:1px solid #ccc}.expertmode .advanced_settings_container .advanced_settings_content{padding-top:5px;float:none;width:auto;overflow:auto}.expertmode .advanced_settings_container .advanced_settings_content h3{margin-top:5px !important}.expertmode .advanced_settings_container .advanced_settings_content .advanced_tools{display:none}.expertmode .advanced_settings_container .advanced_settings_content .site_info{display:block}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button{display:inline-block;cursor:pointer;padding:5px;color:#000}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_text{font-size:16px}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button:hover{background-color:#eaeaea}.expertmode .advanced_settings_container .advanced_settings_menu .active{background-color:#3498db;color:#FFF}.expertmode .advanced_settings_container .advanced_settings_menu .active:hover{background-color:#72c5fd;color:#FFF}.expertmode .advanced_settings_container .advanced_settings_content input#import_settings{height:auto !important}div#updraft-wrap a{cursor:pointer !important}#updraftcentral_keys_table{display:none}.create_key_container{border:1px solid;border-radius:4px;padding:0 0 6px 6px;margin-bottom:8px}#updraftcentral_keycreate_mothership{margin-left:24px}@media screen and (min-width:670px){.expertmode .advanced_settings_container .advanced_settings_menu{float:left;width:215px;border-right:1px solid #ccc;border-bottom:0}.expertmode .advanced_settings_container .advanced_settings_content{padding-left:10px;padding-top:0}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button{display:block}}
2
  /*# sourceMappingURL=admin.min.css.map */
1
+ .max-width-600{max-width:600px}.width-900{width:900px}.width-80{width:80%}.no-decoration{text-decoration:none}.bold{font-weight:bold}.center-align-td{text-align:center}.remove-padding{padding:0 !important}.updraft-text-center{text-align:center}.autobackup{padding:6px;margin:8px 0}ul .disc{list-style:disc inside}.dashicons-log-fix{display:inherit}input{border-radius:4px;line-height:1.42;border:1px solid #CCC;height:27px;padding:2px 6px;color:#555}input[type="text"]{font-size:14px}input[type="number"]{height:31px}select{border-radius:4px}.main-dashboard-buttons{border-width:4px;border-radius:12px;letter-spacing:0;font-size:17px;font-weight:bold;padding-left:.7em;padding-right:2em;padding:.3em 1em;line-height:1.7em;background:transparent;position:relative;border:2px solid;transition:all .2s;vertical-align:baseline;box-sizing:border-box;text-align:center;line-height:1.3em;margin-left:.3em;text-transform:none;line-height:1;text-decoration:none}.button-restore{border-color:#629ec0;color:#629ec0}.dashboard-main-sizing{border-width:4px;width:190px;line-height:1.7em}.button-restore:hover,.button-migrate:hover,.button-backup:hover,.button-view-log:hover,.button-mass-selectors:hover,.button-delete:hover,.button-entity-backup:hover,.udp-button-primary:hover{border-color:#df6926;color:#df6926}.button-migrate{color:#eea920;border-color:#eea920}.button-backup{border-color:#84ca1b;color:#84ca1b}.existing-backups-buttons{font-size:11px;line-height:1.4em;border-width:3px}.existing-backups-restore-buttons{font-size:11px;line-height:1.4em;border-width:3px}.button-delete{color:#e23900;border-color:#e23900;font-size:14px;line-height:1.4em;border-width:2px;margin-right:10px}.button-view-log,.button-mass-selectors{color:darkgrey;border-color:darkgrey;font-size:14px;line-height:1.4em;border-width:2px;margin-top:-1px}.button-view-log{width:120px}.button-existing-restore{font-size:14px;line-height:1.4em;border-width:2px;width:110px}.main-restore{margin-right:3%;margin-left:3%}.button-entity-backup{color:#555;border-color:#555;font-size:11px;line-height:1.4em;border-width:2px;margin-right:5px}.button-select-all{width:122px}.button-deselect{width:92px}#ud_massactions>.display-flex>.mass-selectors-margins{margin-right:-4px}.udp-button-primary{border-width:4px;color:#0073aa;border-color:#0073aa;font-size:14px;height:40px}#ud_massactions .button-delete{margin-right:0}.stored_local{border-radius:5px;background-color:#007fe7;padding:3px 5px 5px 5px;color:#FFF;font-size:75%}.form-table td.updraft_existingbackup_date{padding-bottom:5px}span#updraft_lastlogcontainer{word-break:break-all}.stored_icon{height:1.3em;position:relative;top:.2em}.backup_date_label .clear-right{clear:right}.udp-logo-70{width:70px;height:70px;float:left;padding-right:25px}h3 .thank-you{margin-top:0}.ws_advert{max-width:800px;font-size:140%;line-height:140%;padding:14px;clear:left}.dismiss-dash-notice{float:right;position:relative;top:-20px}#updraft_report_cell .updraft_reportbox{padding:8px;margin:8px 0;border:1px dotted;clear:left;float:left}#updraft_report_cell button.updraft_reportbox_delete{font-size:50%;float:right;padding:0 3px;position:relative;top:-4px;left:4px}#updraft-navtab-settings-content .updraft-test-button{font-size:18px !important}#updraft_report_cell .updraft_report_checkbox{margin-top:4px}#updraft_report_cell .updraft_report_email{width:300px}#updraft_report_cell .updraft_report_another_p{clear:left}#updraft-navtab-settings-content table.form-table p{max-width:700px}#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected{background-color:#CCC}.updraft_settings_sectionheading{display:none}.updraft-backupentitybutton-disabled{background-color:transparent;border:0;color:#0074a2;text-decoration:underline;cursor:pointer;clear:none;float:left}.updraft-backupentitybutton{margin-left:8px}.updraft-bigbutton{padding:2px 0 !important;margin-right:14px !important;font-size:22px !important;min-height:32px;min-width:180px}.updraft_debugrow th{float:right;text-align:right;font-weight:bold;padding-right:8px;min-width:140px}.updraft_debugrow td{min-width:300px;vertical-align:bottom}#updraft_webdav_host_error{color:red}#updraft_zip_files_jstree .jstree-container-ul>.jstree-node,#updraft_more_files_jstree .jstree-container-ul>.jstree-node{background:transparent}#updraft_zip_files_jstree .jstree-container-ul>.jstree-open>.jstree-ocl,#updraft_more_files_jstree .jstree-container-ul>.jstree-open>.jstree-ocl{background-position:-36px -4px}#updraft_zip_files_jstree .jstree-container-ul>.jstree-closed>.jstree-ocl,#updraft_more_files_jstree .jstree-container-ul>.jstree-closed>.jstree-ocl{background-position:-4px -4px}#updraft_zip_files_jstree .jstree-container-ul>.jstree-leaf>.jstree-ocl,#updraft_more_files_jstree .jstree-container-ul>.jstree-leaf>.jstree-ocl{background:transparent}#updraft_zip_files_container{position:relative;height:450px;overflow:none}#updraft_zip_info_container{position:relative;height:auto;width:100%;border:1px dotted;margin-bottom:5px}#updraft_zip_info_container p{margin:1px;padding-left:10px;font-size:14px}#updraft_zip_download_item{display:none;color:#0073aa;padding-left:10px}#updraft_zip_download_notice{padding-left:10px}#updraft_zip_files_jstree_container{position:relative;border:1px dotted;height:80%;width:100%;overflow:auto}#updraft_more_files_container{position:relative;display:none;height:300px;width:100%;border:1px dotted;margin-bottom:5px}#updraft_jstree_buttons{position:absolute;top:0;right:0}#updraft_jstree_container{height:100%;width:100%;overflow:auto}#updraft_more_files_container button{height:22px;line-height:20px}#updraft_jstree_confirm,#updraft_jstree_cancel{display:none}.updraftplus-morefiles-row-delete{cursor:pointer;color:red;font-size:23px !important}.updraftplus-morefiles-row-edit{cursor:pointer;font-size:24px !important}#updraft-wrap .form-table th{width:230px}.updraftplus-remove{background-color:#c00000;border:1px solid #c00000;height:22px;padding:4px 3px 0 3px;margin-right:6px}.updraft-viewlogdiv form{margin:0;padding:0}.updraft-viewlogdiv{background-color:#FFF;color:#000;border:1px solid #000;height:26px;padding:0;margin:0 4px 0 0;border-radius:3px;float:left}.updraft-viewlogdiv input,.updraft-viewlogdiv a{border:0;background-color:transparent;color:#000;margin:0;padding:3px 4px;font-size:16px;line-height:26px}.updraft-viewlogdiv:hover{background-color:#000;color:#FFF;border:1px solid #FFF;cursor:pointer}.updraft-viewlogdiv input:hover,.updraft-viewlogdiv a:hover{color:#FFF;cursor:pointer}.updraftplus-remove a{color:white;padding:4px 4px 0 4px}.updraftplus-remove:hover{background-color:white;border:1px solid #c00000}.updraftplus-remove a:hover{color:#c00000}.drag-drop #drag-drop-area2{border:4px dashed #DDD;height:200px}#drag-drop-area2 .drag-drop-inside{margin:36px auto 0;width:350px}#filelist,#filelist2{width:100%}#filelist .file,#filelist2 .file,.ud_downloadstatus .file,#ud_downloadstatus2 .file{padding:5px;background:#ececec;border:solid 1px #CCC;margin:4px 0}ul.updraft_premium_description_list{list-style:disc inside}ul.updraft_premium_description_list li{display:inline}ul.updraft_premium_description_list li::after{content:" | "}ul.updraft_premium_description_list li.last::after{content:""}.updraft_feature_cell{background-color:#f7d9c9 !important;padding:5px 10px}.updraft_feat_table,.updraft_feat_th,.updraft_feat_table td{border:1px solid black;border-collapse:collapse;font-size:120%;background-color:white;text-align:center}.updraft_feat_table p{padding:0 10px;margin:5px 0;font-size:16px}.updraft_feat_table h4{margin:5px 0}.updraft_feat_table .dashicons{width:25px;height:25px;font-size:25px;line-height:1}.updraft_feat_table .dashicons-yes,.updraft_feat_table .updraft-yes{color:green}.updraft_feat_table .dashicons-no-alt,.updraft_feat_table .updraft-no{color:red}.updraft_tick_cell{text-align:center}.updraft_tick_cell img{margin:4px 0;height:24px}#filelist .fileprogress,#filelist2 .fileprogress,.ud_downloadstatus .dlfileprogress,#ud_downloadstatus2 .dlfileprogress{width:0;background:#f6a828;height:5px}.ud_downloadstatus .raw,#ud_downloadstatus2 .raw{margin-top:8px;clear:left}.ud_downloadstatus .file,#ud_downloadstatus2 .file{margin-top:8px}tr.updraftplusmethod h3{margin:0}#updraft_retain_db_rules .updraft_retain_rules_delete,#updraft_retain_files_rules .updraft_retain_rules_delete{cursor:pointer;color:red;font-size:120%;font-weight:bold;border:0;border-radius:3px;padding:2px;margin:0 6px}#updraft_retain_db_rules .updraft_retain_rules_delete:hover,#updraft_retain_files_rules .updraft_retain_rules_delete:hover{cursor:pointer;color:white;background:red}#updraft_backup_started{max-width:800px;font-size:140%;line-height:140%;padding:14px;clear:left}.udp-premium-image{display:none}@media screen and (min-width:720px){.udp-premium-image{display:block;float:left;padding-right:5px}}#plupload-upload-ui2{width:80%}.backup-restored{padding:8px}.backup-restored span{font-size:120%}.memory-limit{padding:8px}.updraft_list_errors{padding:8px}.nav-tab-wrapper{margin:14px 0}#updraft-poplog-content{white-space:pre-wrap}.next-backup{border:0;padding:0;margin:0 10px 0 0}.not-scheduled{vertical-align:top !important;margin:0 !important;padding:0 !important}.next-backup .updraft_scheduled{margin:0;padding:2px 4px 2px 0}#next-backup-table-inner td{vertical-align:top}.next-backup .updraft_all-files{color:blue;margin:0;padding:2px 0 0 0}.multisite-advert-width{width:800px}.updraft_settings_sectionheading{margin-top:6px}.premium-upgrade-prompt{font-size:115%}.updraft_feat_table{margin-top:30px}.show_admin_restore_in_progress_notice{padding:8px}.show_admin_restore_in_progress_notice .unfinished-restoration{font-size:120%}#backupnow_includefiles_moreoptions,#backupnow_database_moreoptions{margin:4px 16px 6px 16px;border:1px dotted;padding:6px 10px}#backupnow_database_moreoptions{max-height:250px;overflow:auto}.form-table #updraft_activejobsrow .minimum-height{min-height:100px}#updraft_lastlogmessagerow .last-message{padding-top:20px;display:block}.updraft_simplepie{vertical-align:top}.download-backups{margin-top:8px}.download-backups .updraft_download_button{margin-right:6px;margin-top:4px}.download-backups .choose-components-button{font-size:16px}.download-backups .ud-whitespace-warning{background-color:pink;padding:8px;margin:4px;border:1px dotted}.download-backups .ul{list-style:none inside;max-width:800px;margin-top:6px;margin-bottom:12px}#updraft-plupload-modal{width:75%;margin:16px;margin-left:100px}.download-backups .upload{max-width:610px}.download-backups #plupload-upload-ui{width:70%}.ud_downloadstatus{padding:10px;background:#f1f1f1}#ud_massactions{padding:14px;position:fixed;right:25%;top:25%;border:2px solid;border-radius:4px;background:#f1f1f1;float:right}#ud_massactions .updraftplus-remove{clear:left;font-size:16px;text-align:center;border-radius:4px;margin-top:4px}#ud_massactions .updraftplus-remove a{text-decoration:none}#ud_massactions .updraft-viewlogdiv{font-size:16px;text-align:center;border-radius:4px;margin-top:4px}#ud_massactions .updraft-viewlogdiv a{text-decoration:none;position:relative;top:3px}#ud_massactions .updraft-viewlogdiv a{text-decoration:none;position:relative;top:3px}#updraft-navtab-backups-content .updraft_existing_backups{margin-bottom:12px}#updraft-message-modal-innards{padding:4px}#updraft-authenticate-modal{text-align:center;font-size:16px !important}#updraft-authenticate-modal p{font-size:16px}#updraft_delete_form p{margin-top:3px;padding-top:0}#updraft_restore_form .cannot-restore{margin:8px 0}#updraft_restorer_dboptions{padding:12px;margin:8px 0 4px 0;border:dashed 1px}#updraft_restorer_dboptions h4{margin:0 0 6px 0;padding:0}.updraft_debugrow th{vertical-align:top;padding-top:6px}.expertmode p{font-size:125%}.expertmode .call-wp-action{width:300px;height:22px}.updraftplus-lock-advert{clear:left;max-width:600px}.uncompressed-data{clear:left;max-width:600px}.delete-old-directories{padding:8px;padding-bottom:12px}.active-jobs{min-width:480px;min-height:48px;text-align:center;margin-top:4px;padding:8px;border:1px solid;float:left;clear:left}.job-id{min-width:480px;margin-top:4px;padding:8px;border:1px solid;clear:left;float:left}.next-resumption{font-weight:bold}.updraft_percentage{z-index:-1;position:absolute;left:0;top:0;text-align:center;background-color:#f6a828}.curstage{border-radius:4px;margin-top:8px;padding-top:4px;border:1px solid #AAA;width:100%;height:22px;position:relative;text-align:center;font-style:italic}.retain-files{width:48px}.backup-interval-description tr td div{max-width:670px}#updraft-manualdecrypt-modal{width:85%;margin:6px;margin-left:100px}.directory-permissions{font-size:110%;font-weight:bold}.double-warning{border:1px solid;padding:6px}.raw-backup-info{font-style:italic;font-weight:bold;font-size:120%}.updraft_existingbackup_date{width:22%;max-width:140px}.existing-backups-table{margin-top:20px;margin-left:20px;width:80%}.tr-bottom-4{margin-bottom:4px}.form-table .backup-date{width:172px;padding:0;padding-left:15px}.form-table .backup-data{width:426px;padding:0;padding-left:15px}.form-table .updraft_backup_actions{width:272px;padding:0 0 10px 15px}.existing-date{box-sizing:border-box;max-width:140px;width:25%}.line-break-tr{height:2px;padding:1px;margin:0}.line-break-td{margin:0;padding:0}.td-line-color{height:2px;background-color:#888}.raw-backup{max-width:140px}.existing-backups-actions{padding:1px;margin:0}.existing-backups-border{height:2px;padding:1px;margin:0}.existing-backups-border>td{margin:0;padding:0}.existing-backups-border>div{height:2px;background-color:#AAA}.updraft_existing_backup_date{max-width:140px}.restore-button{margin-right:6px;float:left;clear:none}.updraftplus-remove{font-size:16px;text-align:center;border-radius:4px}.before-restore-button{padding:1px;margin:0}.table-separator-tr{height:2px;padding:1px;margin:0}.table-separator-td{margin:0;padding:0}.end-of-table-div{height:2px;background-color:#AAA}.last-backup-job{padding-top:3% !important}.line-height-03{line-height:.3 !important}.line-height-13{line-height:1.3 !important}.line-height-23{line-height:2.3 !important}#updraft_diskspaceused{color:#df6926}.updraft_premium_description_list{text-align:left}#updraft_delete_old_dirs_pagediv{padding-bottom:10px}.job-id{margin:0 auto;width:20%}.updraft_all-files{color:#df6926}.fix-time{width:70px}.retain-files{width:70px}.number-input{min-width:50px;max-width:70px}.additional-rule-width{min-width:60px;max-width:70px}.dashicons{line-height:inherit;font-size:inherit}.addon-logo-150{margin-left:30px;margin-top:33px;height:125px;width:150px}.margin-bottom-50{margin-bottom:50px}.premium-container{width:80%}.main-header{background-color:#df6926;height:200px;width:100%}.button-add-to-cart{color:white;border-color:white;float:none;margin-right:17px}.button-add-to-cart:hover,.button-add-to-cart:focus,.button-add-to-cart:active{border-color:#a0a5aa;color:#a0a5aa}.addon-title{margin-top:25px}.addon-text{margin-top:75px}.image-main-div{width:25%;float:left}.text-main-div{width:60%;float:left;text-align:center;color:white;margin-top:16px}.text-main-div-title{font-weight:bold !important;color:white;text-align:center}.text-main-div-paragraph{color:white}.updraftplus-vault-cta{width:100%;text-align:center;margin-bottom:50px}.updraftplus-vault-cta h1{font-weight:bold}.updraftvault-buy{width:225px;height:225px;border:2px solid #777;display:inline-table;margin:0 auto;margin-right:50px;position:relative}.updraftplus-vault-cta>.vault-options>.center-vault{width:275px;height:275px}.updraftplus-vault-cta>.vault-options>.center-vault>a{right:21%;font-size:16px;border-width:4px !important}.updraftplus-vault-cta>.vault-options>.center-vault>p{font-size:16px}.updraftvault-buy .button-purchase{right:24%;margin-left:0;line-height:1.7em}.updraftvault-buy hr{height:2px;background-color:#777;margin-top:18px}.right{margin-right:0}.updraftvault-buy .addon-logo-100{height:100px;width:125px;margin-top:7px}.updraftvault-buy .addon-logo-large{margin-top:7px}.updraftvault-buy .button-buy-vault{font-size:12px;color:#df6926;border-color:#df6926;border-width:2px !important;position:absolute;right:29%;bottom:2%}.premium-addon-div .button-purchase{line-height:1.7em}.updraftvault-buy .button-buy-vault:hover{border-color:darkgrey;color:darkgrey}.premium-addons{margin-top:80px;width:100%;margin:0 auto;display:table}.addon-list{display:table;text-align:center}.premium-addons h1{text-align:center;font-weight:bold}.premium-addons p{text-align:center}.premium-addons .premium-addon-div{width:200px;height:250px;border:2px solid #777;display:inline-table;margin:0 auto;margin-right:25px;margin-top:25px;text-align:center;position:relative}.premium-addons .premium-addon-div p{margin-left:2px;margin-right:2px}.premium-addons .premium-addon-div img{width:auto;height:50px;margin-top:7px}.premium-addons .premium-addon-div .hr-alignment{margin-top:44px}.premium-addons .premium-addon-div .dropbox-logo{height:39px;width:150px}.premium-addons .premium-addon-div .azure-logo,.premium-addons .premium-addon-div .onedrive-logo{width:75%;height:24px}.button-purchase{font-size:12px;color:#df6926;border-color:#df6926;border-width:2px !important;position:absolute;right:25%;bottom:2%}.button-purchase:hover{color:darkgrey;border-color:darkgrey}.premium-addons .premium-addon-div hr{height:2px;background-color:#777;margin-top:18px}.premium-addon-div p{font-style:italic}.addon-list>.premium-addon-div>.onedrive-fix,.addon-list>.premium-addon-div>.azure-logo{margin-top:33px}.addon-list>.premium-addon-div>.dropbox-fix{margin-top:18px}.premium-forgotton-something{margin-top:5%}.premium-forgotton-something h1{text-align:center;font-weight:bold}.premium-forgotton-something p{text-align:center;font-weight:normal}.premium-forgotton-something .button-faq{color:#df6926;border-color:#df6926;margin:0 auto;display:table}.premium-forgotton-something .button-faq:hover{color:#777;border-color:#777}.updraftplusmethod.updraftvault #vaultlogo{padding-left:40px}.updraftplusmethod.updraftvault .vault_primary_option{float:left;width:50%;text-align:center;padding-bottom:20px}.updraftplusmethod.updraftvault .vault_primary_option div{clear:right;padding-top:20px}.updraftplusmethod.updraftvault .clear-left{clear:left}.updraftplusmethod.updraftvault .padding-top-20px{padding-top:20px}.updraftplusmethod.updraftvault .padding-top-14px{padding-top:14px}.updraftplusmethod.updraftvault #updraftvault_settings_default .button-primary,.updraftplusmethod.updraftvault #updraftvault_settings_showoptions .button-primary{font-size:18px !important;padding-bottom:20px}.updraftplusmethod.updraftvault #updraftvault_showoptions,.updraftplusmethod.updraftvault #updraftvault_connect{margin-top:8px}.updraftplusmethod.updraftvault #updraftvault_settings_connect input{margin-right:10px}.updraftplusmethod.updraftvault #updraftvault_email{width:280px}.updraftplusmethod.updraftvault #updraftvault_pass{width:200px}.updraftplusmethod.updraftvault #vault-is-connected{margin:0;padding:0}.updraftplusmethod.updraftvault #updraftvault_settings_default p{clear:left}.updraftplusmethod.updraftvault .vault-purchase-option{float:left;width:33%;text-align:center;padding-top:20px}.updraftplusmethod.updraftvault .vault-purchase-option-size{font-size:200%;font-weight:bold}.updraftplusmethod.updraftvault .vault-purchase-option-link{clear:both;font-size:150%}.updraftplusmethod.updraftvault .vault-purchase-option-or{clear:both;font-size:115%;font-style:italic}.autobackup-image{clear:left;float:left;width:110px;height:110px}.autobackup-description{width:100%}.advert-description{float:left;clear:right;padding:4px 10px 8px 10px;width:70%;clear:right;vertical-align:top}.advert-btn{display:inline-block;min-width:10%;vertical-align:top;margin-bottom:8px}.advert-btn:first-of-type{margin-top:25px}.advert-btn a{display:block;cursor:pointer}a.btn-get-started{background:#FFF;border:2px solid #df6926;border-radius:4px;color:#df6926;display:inline-block;margin-left:10px !important;margin-bottom:7px !important;font-size:18px !important;line-height:20px;min-height:28px;padding:11px 10px 5px 10px;text-transform:uppercase;text-decoration:none}.circle-dblarrow{border:1px solid #df6926;border-radius:100%;display:inline-block;font-size:17px;line-height:17px;margin-left:5px;width:20px;height:20px;text-align:center}.expertmode .advanced_settings_container{height:auto;overflow:hidden}.expertmode .advanced_settings_container .advanced_settings_menu{float:none;border-bottom:1px solid #ccc}.expertmode .advanced_settings_container .advanced_settings_content{padding-top:5px;float:none;width:auto;overflow:auto}.expertmode .advanced_settings_container .advanced_settings_content h3{margin-top:5px !important}.expertmode .advanced_settings_container .advanced_settings_content .advanced_tools{display:none}.expertmode .advanced_settings_container .advanced_settings_content .site_info{display:block}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button{display:inline-block;cursor:pointer;padding:5px;color:#000}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_text{font-size:16px}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button:hover{background-color:#eaeaea}.expertmode .advanced_settings_container .advanced_settings_menu .active{background-color:#3498db;color:#FFF}.expertmode .advanced_settings_container .advanced_settings_menu .active:hover{background-color:#72c5fd;color:#FFF}.expertmode .advanced_settings_container .advanced_settings_content input#import_settings{height:auto !important}div#updraft-wrap a{cursor:pointer !important}.updraftcentral_wizard_option{width:45%;float:left;text-align:center}.updraftcentral_wizard_option label{margin-bottom:8px}#updraftcentral_keys_table{display:none}.create_key_container{border:1px solid;border-radius:4px;padding:0 0 6px 6px;margin-bottom:8px}@media screen and (min-width:670px){.expertmode .advanced_settings_container .advanced_settings_menu{float:left;width:215px;border-right:1px solid #ccc;border-bottom:0}.expertmode .advanced_settings_container .advanced_settings_content{padding-left:10px;padding-top:0}.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button{display:block}}
2
  /*# sourceMappingURL=admin.min.css.map */
css/admin.min.css.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["css/admin.css"],"names":[],"mappings":"AAAA,uBAAuB;AACvB;CACC,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb;;AAED;CACC,WAAW;CACX;;AAED,2BAA2B;;AAE3B,kBAAkB;AAClB;CACC,sBAAsB;CACtB;;AAED;CACC,kBAAkB;CAClB;;AAED,sBAAsB;AACtB,eAAe;AACf;CACC,mBAAmB;CACnB;;AAED,sBAAsB;AACtB,aAAa;AACb;CACC,sBAAsB;CACtB;;AAED,oBAAoB;;AAEpB;CACC,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,wBAAwB;CACxB;;AAED;CACC,iBAAiB;CACjB;;AAED,iBAAiB;;AAEjB;CACC,mBAAmB;CACnB,kBAAkB;CAClB,uBAAuB;CACvB,aAAa;CACb,iBAAiB;CACjB,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb;;AAED;CACC,mBAAmB;CACnB;;AAED,qBAAqB;;AAErB,kBAAkB;AAClB;CACC,kBAAkB;CAClB,oBAAoB;CACpB,oBAAoB;CACpB,gBAAgB;CAChB,kBAAkB;CAClB,oBAAoB;CACpB,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB,wBAAwB;CACxB,mBAAmB;CACnB,kBAAkB;CAClB,qBAAqB;CACrB,yBAAyB;CACzB,uBAAuB;CACvB,mBAAmB;CACnB,mBAAmB;CACnB,kBAAkB;CAClB,qBAAqB;CACrB,eAAe;CACf,sBAAsB;CACtB;;AAED;CACC,gCAAgC;CAChC,yBAAyB;CACzB;;AAED;CACC,kBAAkB;CAClB,aAAa;CACb,mBAAmB;CACnB;;AAED;;;CAGC,sBAAsB;CACtB,eAAe;CACf;;AAED;CACC,yBAAyB;CACzB,gCAAgC;CAChC;;AAED;CACC,sBAAsB;CACtB,eAAe;CACf;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,eAAe;CACf,sBAAsB;CACtB,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,mBAAmB;CACnB;;AAED;CACC,gBAAgB;CAChB,uBAAuB;CACvB,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,aAAa;CACb;;AAED;CACC,iBAAiB;CACjB,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ,mBAAmB;CACnB,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,kBAAkB;CAClB;;AAED;CACC,aAAa;CACb;;AAED;CACC,YAAY;CACZ;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,kBAAkB;CAClB,eAAe;CACf,sBAAsB;CACtB,gBAAgB;CAChB,aAAa;CACb;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,mBAAmB;CACnB,0BAA0B;CAC1B,yBAAyB;CACzB,YAAY;CACZ,eAAe;CACf;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,sBAAsB;CACtB;;AAED;CACC,cAAc;CACd,mBAAmB;CACnB,WAAW;CACX;;AAED;CACC,aAAa;CACb;;AAED,sBAAsB;;AAEtB,4BAA4B;;AAE5B;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ,oBAAoB;CACpB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,cAAc;CACd,YAAY;CACZ;;AAED;CACC,aAAa;CACb,mBAAmB;CACnB,WAAW;CACX;;AAED;CACC,aAAa;CACb,cAAc;CACd,mBAAmB;CACnB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,eAAe;CACf,aAAa;CACb,eAAe;CACf,mBAAmB;CACnB,UAAU;CACV,UAAU;CACV;;AAED;CACC,2BAA2B;CAC3B;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb;;AAED;CACC,YAAY;CACZ;;AAED,mCAAmC;;AAEnC;CACC,iBAAiB;CACjB;;AAED;CACC,uBAAuB;CACvB;;AAED;CACC,cAAc;CACd;;AAED;CACC,8BAA8B;CAC9B,aAAa;CACb,eAAe;CACf,2BAA2B;CAC3B,gBAAgB;CAChB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,4BAA4B;CAC5B,8BAA8B;CAC9B,2BAA2B;CAC3B,iBAAiB;CACjB,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,kBAAkB;CAClB,kBAAkB;CAClB,mBAAmB;CACnB,iBAAiB;CACjB;;AAED;CACC,iBAAiB;CACjB,uBAAuB;CACvB;;AAED;CACC,WAAW;CACX;;AAED,mBAAmB;;AAEnB,oEAAoE;AACpE;;CAEC,wBAAwB;CACxB;;AAED;;CAEC,gCAAgC;CAChC;;AAED;;CAEC,+BAA+B;CAC/B;;AAED;;CAEC,wBAAwB;CACxB;;AAED,+BAA+B;AAC/B;CACC,mBAAmB;CACnB,cAAc;CACd,eAAe;CACf;;AAED;CACC,mBAAmB;CACnB,aAAa;CACb,YAAY;CACZ,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ,mBAAmB;CACnB,gBAAgB;CAChB;;AAED;CACC,cAAc;CACd,eAAe;CACf,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB,mBAAmB;CACnB,YAAY;CACZ,YAAY;CACZ,eAAe;CACf;;AAED,8BAA8B;AAC9B;CACC,mBAAmB;CACnB,cAAc;CACd,cAAc;CACd,YAAY;CACZ,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB,OAAO;CACP,SAAS;CACT;;AAED;CACC,aAAa;CACb,YAAY;CACZ,eAAe;CACf;;AAED;CACC,aAAa;CACb,kBAAkB;CAClB;;AAED;CACC,cAAc;CACd;;AAED;CACC,gBAAgB;CAChB,WAAW;CACX,2BAA2B;CAC3B;;AAED;CACC,gBAAgB;CAChB,2BAA2B;CAC3B;;AAED;CACC,aAAa;CACb;;AAED;CACC,0BAA0B;CAC1B,0BAA0B;CAC1B,aAAa;CACb,uBAAuB;CACvB,kBAAkB;CAClB;;AAED;CACC,UAAU;CACV,WAAW;CACX;;AAED;CACC,uBAAuB;CACvB,YAAY;CACZ,uBAAuB;CACvB,aAAa;CACb,aAAa;CACb,kBAAkB;CAClB,mBAAmB;CACnB,YAAY;CACZ;;AAED;CACC,aAAa;CACb,8BAA8B;CAC9B,YAAY;CACZ,YAAY;CACZ,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB;;AAED;CACC,uBAAuB;CACvB,YAAY;CACZ,uBAAuB;CACvB,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb,yBAAyB;CACzB;;AAED;CACC,wBAAwB;CACxB,0BAA0B;CAC1B;;AAED;CACC,eAAe;CACf;;AAED;CACC,wBAAwB;CACxB,cAAc;CACd;;AAED;CACC,oBAAoB;CACpB,aAAa;CACb;;AAED;CACC,YAAY;CACZ;;AAED;CACC,aAAa;CACb,oBAAoB;CACpB,uBAAuB;CACvB,cAAc;CACd;;AAED;CACC,wBAAwB;CACxB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,eAAe;CACf;;AAED;CACC,YAAY;CACZ;;AAED;CACC,qCAAqC;CACrC,kBAAkB;CAClB;;AAED;CACC,wBAAwB;CACxB,0BAA0B;CAC1B,gBAAgB;CAChB,wBAAwB;CACxB,mBAAmB;CACnB;;AAED;CACC,kBAAkB;CAClB,gBAAgB;CAChB,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ,aAAa;CACb,gBAAgB;CAChB,eAAe;CACf;;AAED;CACC,aAAa;CACb;;AAED;CACC,WAAW;CACX;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,cAAc;CACd,aAAa;CACb;;AAED;CACC,UAAU;CACV,oBAAoB;CACpB,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB,WAAW;CACX,gBAAgB;CAChB,kBAAkB;CAClB,YAAY;CACZ,mBAAmB;CACnB,aAAa;CACb,cAAc;CACd;;AAED;CACC,gBAAgB;CAChB,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,cAAc;CACd,YAAY;CACZ;;AAED;CACC,cAAc;CACd;;AAED;;CAEC;EACC,eAAe;EACf,YAAY;EACZ,mBAAmB;EACnB;;CAED;;AAED,oCAAoC;AACpC;CACC,WAAW;CACX;;AAED;CACC,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb;;AAED;CACC,aAAa;CACb;;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;;AAEH;CACC,iBAAiB;CACjB;;AAED;CACC,sBAAsB;CACtB;;AAED;CACC,YAAY;CACZ,aAAa;CACb,mBAAmB;CACnB;;AAED;CACC,+BAA+B;CAC/B,uBAAuB;CACvB,wBAAwB;CACxB;;AAED;CACC,kBAAkB;CAClB,YAAY;CACZ,yBAAyB;CACzB;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,YAAY;CACZ,YAAY;CACZ,yBAAyB;CACzB;;AAED;CACC,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,0BAA0B;CAC1B,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,kBAAkB;CAClB,eAAe;CACf;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,kBAAkB;CAClB,eAAe;CACf;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,kBAAkB;CAClB,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,uBAAuB;CACvB,aAAa;CACb,YAAY;CACZ,mBAAmB;CACnB;;AAED;CACC,wBAAwB;CACxB,iBAAiB;CACjB,gBAAgB;CAChB,oBAAoB;CACpB;;AAED;CACC,WAAW;CACX,aAAa;CACb,mBAAmB;CACnB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,WAAW;CACX;;AAED;CACC,cAAc;CACd,oBAAoB;CACpB;;AAED;CACC,cAAc;CACd,gBAAgB;CAChB,WAAW;CACX,SAAS;CACT,kBAAkB;CAClB,mBAAmB;CACnB,+BAA+B;CAC/B,aAAa;CACb;;AAED;CACC,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB,mBAAmB;CACnB,gBAAgB;CAChB;;AAED;CACC,sBAAsB;CACtB;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,mBAAmB;CACnB,gBAAgB;CAChB;;AAED;CACC,sBAAsB;CACtB,mBAAmB;CACnB,SAAS;CACT;;AAED;CACC,sBAAsB;CACtB,mBAAmB;CACnB,SAAS;CACT;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,aAAa;CACb;;AAED;CACC,mBAAmB;CACnB,2BAA2B;CAC3B;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB,eAAe;CACf;;AAED;CACC,cAAc;CACd;;AAED;CACC,cAAc;CACd,oBAAoB;CACpB,mBAAmB;CACnB;;AAED;CACC,wBAAwB;CACxB,aAAa;CACb;;AAED;CACC,oBAAoB;CACpB,iBAAiB;CACjB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb,aAAa;CACb;;AAED;CACC,YAAY;CACZ,iBAAiB;CACjB;;AAED;CACC,YAAY;CACZ,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,qBAAqB;CACrB;;AAED;CACC,iBAAiB;CACjB,iBAAiB;CACjB,mBAAmB;CACnB,gBAAgB;CAChB,aAAa;CACb,kBAAkB;CAClB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,iBAAiB;CACjB,gBAAgB;CAChB,aAAa;CACb,kBAAkB;CAClB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ,mBAAmB;CACnB,UAAU;CACV,SAAS;CACT,mBAAmB;CACnB,0BAA0B;CAC1B;;AAED;CACC,mBAAmB;CACnB,gBAAgB;CAChB,iBAAiB;CACjB,uBAAuB;CACvB,YAAY;CACZ,aAAa;CACb,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,WAAW;CACX,YAAY;CACZ,mBAAmB;CACnB;;AAED;CACC,gBAAgB;CAChB,kBAAkB;CAClB;;AAED;CACC,kBAAkB;CAClB,aAAa;CACb;;AAED;CACC,mBAAmB;CACnB,kBAAkB;CAClB,gBAAgB;CAChB;;AAED;CACC,WAAW;CACX,iBAAiB;CACjB;;AAED;CACC,iBAAiB;CACjB,kBAAkB;CAClB,WAAW;CACX;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,WAAW;CACX,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,WAAW;CACX,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,uBAAuB;CACvB;;AAED;CAGC,uBAAuB;CACvB,iBAAiB;CACjB,WAAW;CACX;;AAED;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ;;AAED;CACC,UAAU;CACV,WAAW;CACX;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ;;AAED;CACC,UAAU;CACV,WAAW;CACX;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,kBAAkB;CAClB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,aAAa;CACb;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB;;AAED;CACC,2BAA2B;CAC3B;;AAED;CACC,4BAA4B;CAC5B;;AAED;CACC,4BAA4B;CAC5B;;AAED;CACC,4BAA4B;CAC5B;;AAED;CACC,eAAe;CACf;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,qBAAqB;CACrB;;AAED;;GAEG;;AAEH;CACC,eAAe;CACf,WAAW;CACX;;AAED;CACC,eAAe;CACf;;AAED,6BAA6B;AAC7B;CACC,YAAY;CACZ;;AAED;CACC,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB,gBAAgB;CAChB;;AAED,aAAa;AACb,oHAAoH;;AAEpH;CACC,qBAAqB;CACrB,mBAAmB;CACnB;;AAED;CACC,kBAAkB;CAClB,iBAAiB;CACjB,cAAc;CACd,aAAa;CACb;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,WAAW;CACX;;AAED,iBAAiB;;AAEjB;CACC,0BAA0B;CAC1B,cAAc;CACd,YAAY;CACZ;;AAED;CACC,aAAa;CACb,oBAAoB;CACpB,YAAY;CACZ,mBAAmB;CACnB;;AAED;CACC,sBAAsB;CACtB,eAAe;CACf;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,WAAW;CACX,YAAY;CACZ;;AAED;CACC,WAAW;CACX,YAAY;CACZ,mBAAmB;CACnB,aAAa;CACb,iBAAiB;CACjB;;AAED;CACC,6BAA6B;CAC7B,aAAa;CACb,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb;;AAED,qBAAqB;;AAErB,iBAAiB;;AAEjB;CACC,YAAY;CACZ,mBAAmB;CACnB,oBAAoB;CACpB;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,aAAa;CACb,cAAc;CACd,uBAAuB;CACvB,sBAAsB;CACtB,eAAe;CACf,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,cAAc;CACd;;AAED;CACC,WAAW;CACX,gBAAgB;CAChB,6BAA6B;CAC7B;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,WAAW;CACX,eAAe;CACf,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB,iBAAiB;CACjB;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,cAAc;CACd,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB,eAAe;CACf,sBAAsB;CACtB,6BAA6B;CAC7B,mBAAmB;CACnB,WAAW;CACX,WAAW;CACX;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,uBAAuB;CACvB,gBAAgB;CAChB;;AAED,qBAAqB;;AAErB,oBAAoB;;AAEpB;CACC,iBAAiB;CACjB,YAAY;CACZ,eAAe;CACf,eAAe;CACf;;AAED;CACC,wBAAwB;CACxB,eAAe;CACf,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,cAAc;CACd,uBAAuB;CACvB,sBAAsB;CACtB,eAAe;CACf,mBAAmB;CACnB,iBAAiB;CACjB,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,iBAAiB;CACjB,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,aAAa;CACb;;AAED;CACC,WAAW;CACX,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB,eAAe;CACf,sBAAsB;CACtB,6BAA6B;CAC7B,mBAAmB;CACnB,WAAW;CACX,WAAW;CACX;;AAED;CACC,gBAAgB;CAChB,uBAAuB;CACvB;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB,iBAAiB;CACjB;;AAED;CACC,mBAAmB;CACnB;;AAED;;CAEC,iBAAiB;CACjB;;AAED;CACC,iBAAiB;CACjB;;AAED,wBAAwB;;;AAGxB,mFAAmF;;AAEnF;CACC,eAAe;CACf;;AAED;CACC,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,mBAAmB;CACnB,oBAAoB;CACpB;;AAED;CACC,eAAe;CACf,sBAAsB;CACtB,eAAe;CACf,eAAe;CACf;;AAED;CACC,YAAY;CACZ,mBAAmB;CACnB;;AAED,gCAAgC;;AAEhC;CACC,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ,WAAW;CACX,mBAAmB;CACnB,qBAAqB;CACrB;;AAED;CACC,aAAa;CACb,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,2BAA2B;CAC3B,qBAAqB;CACrB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb;;AAED;CACC,aAAa;CACb;;AAED;CACC,UAAU;CACV,WAAW;CACX;;AAED;CACC,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,WAAW;CACX,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,gBAAgB;CAChB,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB;;AAED,mCAAmC;AACnC;AACA,6BAA6B;AAC7B;iBACiB;AACjB,iBAAiB;CAChB,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,cAAc;CACd;;AAED;CACC,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,aAAa;CACb,2BAA2B;CAC3B,WAAW;CACX,aAAa;CACb,oBAAoB;CACpB;;AAED;CACC,sBAAsB;CACtB,eAAe;CACf,oBAAoB;CACpB,mBAAmB;CACnB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,eAAe;CACf,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB,0BAA0B;CAC1B,mBAAmB;CACnB,eAAe;CACf,sBAAsB;CACtB,6BAA6B;CAC7B,8BAA8B;CAC9B,2BAA2B;CAC3B,kBAAkB;CAClB,iBAAiB;CACjB,4BAA4B;CAC5B,0BAA0B;CAC1B,sBAAsB;CACtB;;AAED;CACC,0BAA0B;CAC1B,oBAAoB;CACpB,sBAAsB;CACtB,gBAAgB;CAChB,kBAAkB;CAClB,iBAAiB;CACjB,YAAY;CACZ,aAAa;CACb,mBAAmB;CACnB;;AAED;AACA;;;;;;;;;IASI;CACH;;AAED,uCAAuC;AACvC,6CAA6C;AAC7C;CACC,aAAa;CACb,iBAAiB;CACjB;;AAED;CACC,YAAY;CACZ,4CAA4C;CAC5C;;AAED;CACC,iBAAiB;CACjB,YAAY;CACZ,YAAY;CACZ,eAAe;CACf;;AAED;CACC,2BAA2B;CAC3B;;AAED;CACC,cAAc;CACd;;AAED;CACC,eAAe;CACf;;AAED;CACC,sBAAsB;CACtB,gBAAgB;CAChB,aAAa;CACb,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,0BAA0B;CAC1B;;AAED;CACC,0BAA0B;CAC1B,YAAY;CACZ;;AAED;CACC,0BAA0B;CAC1B,YAAY;CACZ;;AAED;CACC,wBAAwB;CACxB;;AAED;CACC,2BAA2B;CAC3B;;AAED;CACC,cAAc;CACd;;AAED;CACC,kBAAkB;CAClB,mBAAmB;CACnB,qBAAqB;CACrB,mBAAmB;CACnB;;AAED;CACC,kBAAkB;CAClB;;AAED;;CAEC;EACC,YAAY;EACZ,aAAa;EACb,2CAA2C;EAC3C,oBAAoB;EACpB;;CAED;EACC,mBAAmB;EACnB,iBAAiB;EACjB;;CAED;EACC,eAAe;EACf;;CAED","file":"admin.min.css","sourcesContent":["/* Widths and sizing */\r\n.max-width-600 {\r\n\tmax-width: 600px;\r\n}\r\n\r\n.width-900 {\r\n\twidth: 900px;\r\n}\r\n\r\n.width-80 {\r\n\twidth: 80%;\r\n}\r\n\r\n/* End widths and sizing */\r\n\r\n/* Font styling */\r\n.no-decoration {\r\n\ttext-decoration: none;\r\n}\r\n\r\n.bold {\r\n\tfont-weight: bold;\r\n}\r\n\r\n/* End font styling */\r\n/* Alignment */\r\n.center-align-td {\r\n\ttext-align: center;\r\n}\r\n\r\n/* End of Alignment */\r\n/* Padding */\r\n.remove-padding {\r\n\tpadding: 0 !important;\r\n}\r\n\r\n/* End of padding */\r\n\r\n.updraft-text-center {\r\n\ttext-align: center;\r\n}\r\n\r\n.autobackup {\r\n\tpadding: 6px;\r\n\tmargin: 8px 0px;\r\n}\r\n\r\nul .disc {\r\n\tlist-style: disc inside;\r\n}\r\n\r\n.dashicons-log-fix {\r\n\tdisplay: inherit;\r\n}\r\n\r\n/* Input boxes */\r\n\r\ninput {\r\n\tborder-radius: 4px;\r\n\tline-height: 1.42;\r\n\tborder: 1px solid #CCC;\r\n\theight: 27px;\r\n\tpadding: 2px 6px;\r\n\tcolor: #555;\r\n}\r\n\r\ninput[type=\"text\"] {\r\n\tfont-size: 14px;\r\n}\r\n\r\ninput[type=\"number\"] {\r\n\theight: 31px;\r\n}\r\n\r\nselect {\r\n\tborder-radius: 4px;\r\n}\r\n\r\n/* End input boxes */\r\n\r\n/* Main Buttons */\r\n.main-dashboard-buttons {\r\n\tborder-width: 4px;\r\n\tborder-radius: 12px;\r\n\tletter-spacing: 0px;\r\n\tfont-size: 17px;\r\n\tfont-weight: bold;\r\n\tpadding-left: 0.7em;\r\n\tpadding-right: 2em;\r\n\tpadding: 0.3em 1em;\r\n\tline-height: 1.7em;\r\n\tbackground: transparent;\r\n\tposition: relative;\r\n\tborder: 2px solid;\r\n\ttransition: all 0.2s;\r\n\tvertical-align: baseline;\r\n\tbox-sizing: border-box;\r\n\ttext-align: center;\r\n\tline-height: 1.3em;\r\n\tmargin-left: .3em;\r\n\ttext-transform: none;\r\n\tline-height: 1;\r\n\ttext-decoration: none;\r\n}\r\n\r\n.button-restore {\r\n\tborder-color: rgb(98, 158, 192);\r\n\tcolor: rgb(98, 158, 192);\r\n}\r\n\r\n.dashboard-main-sizing {\r\n\tborder-width: 4px;\r\n\twidth: 190px;\r\n\tline-height: 1.7em;\r\n}\r\n\r\n.button-restore:hover, .button-migrate:hover, .button-backup:hover,\r\n.button-view-log:hover, .button-mass-selectors:hover,\r\n.button-delete:hover, .button-entity-backup:hover, .udp-button-primary:hover {\r\n\tborder-color: #DF6926;\r\n\tcolor: #DF6926;\r\n}\r\n\r\n.button-migrate {\r\n\tcolor: rgb(238, 169, 32);\r\n\tborder-color: rgb(238, 169, 32);\r\n}\r\n\r\n.button-backup {\r\n\tborder-color: #84CA1B;\r\n\tcolor: #84CA1B;\r\n}\r\n\r\n.existing-backups-buttons {\r\n\tfont-size: 11px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 3px;\r\n}\r\n\r\n.existing-backups-restore-buttons {\r\n\tfont-size: 11px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 3px;\r\n}\r\n\r\n.button-delete {\r\n\tcolor: #E23900;\r\n\tborder-color: #E23900;\r\n\tfont-size: 14px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 2px;\r\n\tmargin-right: 10px;\r\n}\r\n\r\n.button-view-log, .button-mass-selectors {\r\n\tcolor: darkgrey;\r\n\tborder-color: darkgrey;\r\n\tfont-size: 14px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 2px;\r\n\tmargin-top: -1px;\r\n}\r\n\r\n.button-view-log {\r\n\twidth: 120px;\r\n}\r\n\r\n.button-existing-restore {\r\n\tfont-size: 14px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 2px;\r\n\twidth: 110px;\r\n}\r\n\r\n.main-restore {\r\n\tmargin-right: 3%;\r\n\tmargin-left: 3%;\r\n}\r\n\r\n.button-entity-backup {\r\n\tcolor: #555;\r\n\tborder-color: #555;\r\n\tfont-size: 11px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 2px;\r\n\tmargin-right: 5px;\r\n}\r\n\r\n.button-select-all {\r\n\twidth: 122px;\r\n}\r\n\r\n.button-deselect {\r\n\twidth: 92px;\r\n}\r\n\r\n#ud_massactions > .display-flex > .mass-selectors-margins {\r\n\tmargin-right: -4px;\r\n}\r\n\r\n.udp-button-primary {\r\n\tborder-width: 4px;\r\n\tcolor: #0073AA;\r\n\tborder-color: #0073AA;\r\n\tfont-size: 14px;\r\n\theight: 40px;\r\n}\r\n\r\n#ud_massactions .button-delete {\r\n\tmargin-right: 0px;\r\n}\r\n\r\n.stored_local {\r\n\tborder-radius: 5px;\r\n\tbackground-color: #007FE7;\r\n\tpadding: 3px 5px 5px 5px;\r\n\tcolor: #FFF;\r\n\tfont-size: 75%;\r\n}\r\n\r\n.form-table td.updraft_existingbackup_date {\r\n\tpadding-bottom: 5px;\r\n}\r\n\r\nspan#updraft_lastlogcontainer {\r\n\tword-break: break-all;\r\n}\r\n\r\n.stored_icon {\r\n\theight: 1.3em;\r\n\tposition: relative;\r\n\ttop: 0.2em;\r\n}\r\n\r\n.backup_date_label .clear-right {\r\n\tclear: right;\r\n}\r\n\r\n/* End Main Buttons */\r\n\r\n/* End of common elements */\r\n\r\n.udp-logo-70 {\r\n\twidth: 70px;\r\n\theight: 70px;\r\n\tfloat: left;\r\n\tpadding-right: 25px;\r\n}\r\n\r\nh3 .thank-you {\r\n\tmargin-top: 0px;\r\n}\r\n\r\n.ws_advert {\r\n\tmax-width: 800px;\r\n\tfont-size: 140%;\r\n\tline-height: 140%;\r\n\tpadding: 14px;\r\n\tclear: left;\r\n}\r\n\r\n.dismiss-dash-notice {\r\n\tfloat: right;\r\n\tposition: relative;\r\n\ttop: -20px;\r\n}\r\n\r\n#updraft_report_cell .updraft_reportbox {\r\n\tpadding: 8px;\r\n\tmargin: 8px 0;\r\n\tborder: 1px dotted;\r\n\tclear: left;\r\n\tfloat: left;\r\n}\r\n\r\n#updraft_report_cell button.updraft_reportbox_delete {\r\n\tfont-size: 50%;\r\n\tfloat: right;\r\n\tpadding: 0 3px;\r\n\tposition: relative;\r\n\ttop: -4px;\r\n\tleft: 4px;\r\n}\r\n\r\n#updraft-navtab-settings-content .updraft-test-button {\r\n\tfont-size: 18px !important;\r\n}\r\n\r\n#updraft_report_cell .updraft_report_checkbox {\r\n\tmargin-top: 4px;\r\n}\r\n\r\n#updraft_report_cell .updraft_report_email {\r\n\twidth: 300px;\r\n}\r\n\r\n#updraft_report_cell .updraft_report_another_p {\r\n\tclear: left;\r\n}\r\n\r\n/* Taken straight from admin.php */\r\n\r\n#updraft-navtab-settings-content table.form-table p {\r\n\tmax-width: 700px;\r\n}\r\n\r\n#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected {\r\n\tbackground-color: #CCC;\r\n}\r\n\r\n.updraft_settings_sectionheading {\r\n\tdisplay: none;\r\n}\r\n\r\n.updraft-backupentitybutton-disabled {\r\n\tbackground-color: transparent;\r\n\tborder: none;\r\n\tcolor: #0074A2;\r\n\ttext-decoration: underline;\r\n\tcursor: pointer;\r\n\tclear: none;\r\n\tfloat: left;\r\n}\r\n\r\n.updraft-backupentitybutton {\r\n\tmargin-left: 8px;\r\n}\r\n\r\n.updraft-bigbutton {\r\n\tpadding: 2px 0px !important;\r\n\tmargin-right: 14px !important;\r\n\tfont-size: 22px !important;\r\n\tmin-height: 32px;\r\n\tmin-width: 180px;\r\n}\r\n\r\n.updraft_debugrow th {\r\n\tfloat: right;\r\n\ttext-align: right;\r\n\tfont-weight: bold;\r\n\tpadding-right: 8px;\r\n\tmin-width: 140px;\r\n}\r\n\r\n.updraft_debugrow td {\r\n\tmin-width: 300px;\r\n\tvertical-align: bottom;\r\n}\r\n\r\n#updraft_webdav_host_error {\r\n\tcolor: red;\r\n}\r\n\r\n/* jstree styles */\r\n\r\n/* these styles hide the dots from the parent but keep the arrows */\r\n#updraft_zip_files_jstree .jstree-container-ul > .jstree-node,\r\n#updraft_more_files_jstree .jstree-container-ul > .jstree-node {\r\n\tbackground: transparent;\r\n}\r\n\r\n#updraft_zip_files_jstree .jstree-container-ul > .jstree-open > .jstree-ocl,\r\n#updraft_more_files_jstree .jstree-container-ul > .jstree-open > .jstree-ocl {\r\n\tbackground-position: -36px -4px;\r\n}\r\n\r\n#updraft_zip_files_jstree .jstree-container-ul > .jstree-closed> .jstree-ocl,\r\n#updraft_more_files_jstree .jstree-container-ul > .jstree-closed> .jstree-ocl {\r\n\tbackground-position: -4px -4px;\r\n}\r\n\r\n#updraft_zip_files_jstree .jstree-container-ul > .jstree-leaf> .jstree-ocl,\r\n#updraft_more_files_jstree .jstree-container-ul > .jstree-leaf> .jstree-ocl {\r\n\tbackground: transparent;\r\n}\r\n\r\n/* zip browser jstree styles */\r\n#updraft_zip_files_container {\r\n\tposition: relative;\r\n\theight: 450px;\r\n\toverflow: none;\r\n}\r\n\r\n#updraft_zip_info_container {\r\n\tposition: relative;\r\n\theight: auto;\r\n\twidth: 100%;\r\n\tborder: 1px dotted;\r\n\tmargin-bottom: 5px;\r\n}\r\n\r\n#updraft_zip_info_container p {\r\n\tmargin: 1px;\r\n\tpadding-left: 10px;\r\n\tfont-size: 14px;\r\n}\r\n\r\n#updraft_zip_download_item {\r\n\tdisplay: none;\r\n\tcolor: #0073AA;\r\n\tpadding-left: 10px;\r\n}\r\n\r\n#updraft_zip_download_notice {\r\n\tpadding-left: 10px;\r\n}\r\n\r\n#updraft_zip_files_jstree_container {\r\n\tposition: relative;\r\n\tborder: 1px dotted;\r\n\theight: 80%;\r\n\twidth: 100%;\r\n\toverflow: auto;\r\n}\r\n\r\n/* More files jstree styles */\r\n#updraft_more_files_container {\r\n\tposition: relative;\r\n\tdisplay: none;\r\n\theight: 300px;\r\n\twidth: 100%;\r\n\tborder: 1px dotted;\r\n\tmargin-bottom: 5px;\r\n}\r\n\r\n#updraft_jstree_buttons {\r\n\tposition: absolute;\r\n\ttop: 0;\r\n\tright: 0;\r\n}\r\n\r\n#updraft_jstree_container {\r\n\theight: 100%;\r\n\twidth: 100%;\r\n\toverflow: auto;\r\n}\r\n\r\n#updraft_more_files_container button {\r\n\theight: 22px;\r\n\tline-height: 20px;\r\n}\r\n\r\n#updraft_jstree_confirm, #updraft_jstree_cancel {\r\n\tdisplay: none;\r\n}\r\n\r\n.updraftplus-morefiles-row-delete {\r\n\tcursor: pointer;\r\n\tcolor: red;\r\n\tfont-size: 23px !important;\r\n}\r\n\r\n.updraftplus-morefiles-row-edit {\r\n\tcursor: pointer;\r\n\tfont-size: 24px !important;\r\n}\r\n\r\n#updraft-wrap .form-table th {\r\n\twidth: 230px;\r\n}\r\n\r\n.updraftplus-remove {\r\n\tbackground-color: #C00000;\r\n\tborder: 1px solid #C00000;\r\n\theight: 22px;\r\n\tpadding: 4px 3px 0 3px;\r\n\tmargin-right: 6px;\r\n}\r\n\r\n.updraft-viewlogdiv form {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n}\r\n\r\n.updraft-viewlogdiv {\r\n\tbackground-color: #FFF;\r\n\tcolor: #000;\r\n\tborder: 1px solid #000;\r\n\theight: 26px;\r\n\tpadding: 0px;\r\n\tmargin: 0 4px 0 0;\r\n\tborder-radius: 3px;\r\n\tfloat: left;\r\n}\r\n\r\n.updraft-viewlogdiv input, .updraft-viewlogdiv a {\r\n\tborder: none;\r\n\tbackground-color: transparent;\r\n\tcolor: #000;\r\n\tmargin: 0px;\r\n\tpadding: 3px 4px;\r\n\tfont-size: 16px;\r\n\tline-height: 26px;\r\n}\r\n\r\n.updraft-viewlogdiv:hover {\r\n\tbackground-color: #000;\r\n\tcolor: #FFF;\r\n\tborder: 1px solid #FFF;\r\n\tcursor: pointer;\r\n}\r\n\r\n.updraft-viewlogdiv input:hover, .updraft-viewlogdiv a:hover {\r\n\tcolor: #FFF;\r\n\tcursor: pointer;\r\n}\r\n\r\n.updraftplus-remove a {\r\n\tcolor: white;\r\n\tpadding: 4px 4px 0px 4px;\r\n}\r\n\r\n.updraftplus-remove:hover {\r\n\tbackground-color: white;\r\n\tborder: 1px solid #C00000;\r\n}\r\n\r\n.updraftplus-remove a:hover {\r\n\tcolor: #C00000;\r\n}\r\n\r\n.drag-drop #drag-drop-area2 {\r\n\tborder: 4px dashed #DDD;\r\n\theight: 200px;\r\n}\r\n\r\n#drag-drop-area2 .drag-drop-inside {\r\n\tmargin: 36px auto 0;\r\n\twidth: 350px;\r\n}\r\n\r\n#filelist, #filelist2 {\r\n\twidth: 100%;\r\n}\r\n\r\n#filelist .file, #filelist2 .file, .ud_downloadstatus .file, #ud_downloadstatus2 .file {\r\n\tpadding: 5px;\r\n\tbackground: #ECECEC;\r\n\tborder: solid 1px #CCC;\r\n\tmargin: 4px 0;\r\n}\r\n\r\nul.updraft_premium_description_list {\r\n\tlist-style: disc inside;\r\n}\r\n\r\nul.updraft_premium_description_list li {\r\n\tdisplay: inline;\r\n}\r\n\r\nul.updraft_premium_description_list li::after {\r\n\tcontent: \" | \";\r\n}\r\n\r\nul.updraft_premium_description_list li.last::after {\r\n\tcontent: \"\";\r\n}\r\n\r\n.updraft_feature_cell {\r\n\tbackground-color: #F7D9C9 !important;\r\n\tpadding: 5px 10px;\r\n}\r\n\r\n.updraft_feat_table, .updraft_feat_th, .updraft_feat_table td {\r\n\tborder: 1px solid black;\r\n\tborder-collapse: collapse;\r\n\tfont-size: 120%;\r\n\tbackground-color: white;\r\n\ttext-align: center;\r\n}\r\n\r\n.updraft_feat_table p {\r\n\tpadding: 0px 10px;\r\n\tmargin: 5px 0px;\r\n\tfont-size: 16px;\r\n}\r\n\r\n.updraft_feat_table h4 {\r\n\tmargin: 5px 0px;\r\n}\r\n\r\n.updraft_feat_table .dashicons {\r\n\twidth: 25px;\r\n\theight: 25px;\r\n\tfont-size: 25px;\r\n\tline-height: 1;\r\n}\r\n\r\n.updraft_feat_table .dashicons-yes, .updraft_feat_table .updraft-yes {\r\n\tcolor: green;\r\n}\r\n\r\n.updraft_feat_table .dashicons-no-alt, .updraft_feat_table .updraft-no {\r\n\tcolor: red;\r\n}\r\n\r\n.updraft_tick_cell {\r\n\ttext-align: center;\r\n}\r\n\r\n.updraft_tick_cell img {\r\n\tmargin: 4px 0;\r\n\theight: 24px;\r\n}\r\n\r\n#filelist .fileprogress, #filelist2 .fileprogress, .ud_downloadstatus .dlfileprogress, #ud_downloadstatus2 .dlfileprogress {\r\n\twidth: 0%;\r\n\tbackground: #F6A828;\r\n\theight: 5px;\r\n}\r\n\r\n.ud_downloadstatus .raw, #ud_downloadstatus2 .raw {\r\n\tmargin-top: 8px;\r\n\tclear: left;\r\n}\r\n\r\n.ud_downloadstatus .file, #ud_downloadstatus2 .file {\r\n\tmargin-top: 8px;\r\n}\r\n\r\ntr.updraftplusmethod h3 {\r\n\tmargin: 0px;\r\n}\r\n\r\n#updraft_retain_db_rules .updraft_retain_rules_delete, #updraft_retain_files_rules .updraft_retain_rules_delete {\r\n\tcursor: pointer;\r\n\tcolor: red;\r\n\tfont-size: 120%;\r\n\tfont-weight: bold;\r\n\tborder: 0px;\r\n\tborder-radius: 3px;\r\n\tpadding: 2px;\r\n\tmargin: 0 6px;\r\n}\r\n\r\n#updraft_retain_db_rules .updraft_retain_rules_delete:hover, #updraft_retain_files_rules .updraft_retain_rules_delete:hover {\r\n\tcursor: pointer;\r\n\tcolor: white;\r\n\tbackground: red;\r\n}\r\n\r\n#updraft_backup_started {\r\n\tmax-width: 800px;\r\n\tfont-size: 140%;\r\n\tline-height: 140%;\r\n\tpadding: 14px;\r\n\tclear: left;\r\n}\r\n\r\n.udp-premium-image {\r\n\tdisplay: none;\r\n}\r\n\r\n@media screen and (min-width: 720px) {\r\n\r\n\t.udp-premium-image {\r\n\t\tdisplay: block;\r\n\t\tfloat: left;\r\n\t\tpadding-right: 5px;\r\n\t}\r\n\r\n}\r\n\r\n/* End stuff already in admin.php */\r\n#plupload-upload-ui2 {\r\n\twidth: 80%;\r\n}\r\n\r\n.backup-restored {\r\n\tpadding: 8px;\r\n}\r\n\r\n.backup-restored span {\r\n\tfont-size: 120%;\r\n}\r\n\r\n.memory-limit {\r\n\tpadding: 8px;\r\n}\r\n\r\n.updraft_list_errors {\r\n\tpadding: 8px;\r\n}\r\n\r\n/*.nav-tab {\r\n\tborder-radius: 20px 20px 0 0;\r\n\tborder-color: grey;\r\n\tborder-width: 2px;\r\n\tmargin-top: 34px;\r\n}\r\n\r\n.nav-tab:hover {\r\n\tborder-bottom: 0;\r\n}\r\n\r\n.nav-tab-active, .nav-tab-active:active {\r\n\tcolor: #df6926;\r\n\tborder-color: #D3D3D3;\r\n\tborder-width: 1px;\r\n\tborder-bottom: 0;\r\n}\r\n\r\n.nav-tab-active:focus {\r\n\tcolor: #df6926;\r\n}*/\r\n\r\n.nav-tab-wrapper {\r\n\tmargin: 14px 0px;\r\n}\r\n\r\n#updraft-poplog-content {\r\n\twhite-space: pre-wrap;\r\n}\r\n\r\n.next-backup {\r\n\tborder: 0px;\r\n\tpadding: 0px;\r\n\tmargin: 0 10px 0 0;\r\n}\r\n\r\n.not-scheduled {\r\n\tvertical-align: top !important;\r\n\tmargin: 0px !important;\r\n\tpadding: 0px !important;\r\n}\r\n\r\n.next-backup .updraft_scheduled {\r\n\t/* width: 124px;*/\r\n\tmargin: 0px;\r\n\tpadding: 2px 4px 2px 0px;\r\n}\r\n\r\n#next-backup-table-inner td {\r\n\tvertical-align: top;\r\n}\r\n\r\n.next-backup .updraft_all-files {\r\n\tcolor: blue;\r\n\tmargin: 0px;\r\n\tpadding: 2px 0px 0px 0px;\r\n}\r\n\r\n.multisite-advert-width {\r\n\twidth: 800px;\r\n}\r\n\r\n.updraft_settings_sectionheading {\r\n\tmargin-top: 6px;\r\n}\r\n\r\n.premium-upgrade-prompt {\r\n\tfont-size: 115%;\r\n}\r\n\r\n.updraft_feat_table {\r\n\tmargin-top: 30px;\r\n}\r\n\r\n.show_admin_restore_in_progress_notice {\r\n\tpadding: 8px;\r\n}\r\n\r\n.show_admin_restore_in_progress_notice .unfinished-restoration {\r\n\tfont-size: 120%;\r\n}\r\n\r\n#backupnow_includefiles_moreoptions, #backupnow_database_moreoptions {\r\n\tmargin: 4px 16px 6px 16px;\r\n\tborder: 1px dotted;\r\n\tpadding: 6px 10px;\r\n}\r\n\r\n#backupnow_database_moreoptions {\r\n\tmax-height: 250px;\r\n\toverflow: auto;\r\n}\r\n\r\n.form-table #updraft_activejobsrow .minimum-height {\r\n\tmin-height: 100px;\r\n}\r\n\r\n#updraft_lastlogmessagerow .last-message {\r\n\tpadding-top: 20px;\r\n\tdisplay: block;\r\n}\r\n\r\n.updraft_simplepie {\r\n\tvertical-align: top;\r\n}\r\n\r\n.download-backups {\r\n\tmargin-top: 8px;\r\n}\r\n\r\n.download-backups .updraft_download_button {\r\n\tmargin-right: 6px;\r\n\tmargin-top: 4px;\r\n}\r\n\r\n.download-backups .choose-components-button {\r\n\tfont-size: 16px;\r\n}\r\n\r\n.download-backups .ud-whitespace-warning {\r\n\tbackground-color: pink;\r\n\tpadding: 8px;\r\n\tmargin: 4px;\r\n\tborder: 1px dotted;\r\n}\r\n\r\n.download-backups .ul {\r\n\tlist-style: none inside;\r\n\tmax-width: 800px;\r\n\tmargin-top: 6px;\r\n\tmargin-bottom: 12px;\r\n}\r\n\r\n#updraft-plupload-modal {\r\n\twidth: 75%;\r\n\tmargin: 16px;\r\n\tmargin-left: 100px;\r\n}\r\n\r\n.download-backups .upload {\r\n\tmax-width: 610px;\r\n}\r\n\r\n.download-backups #plupload-upload-ui {\r\n\twidth: 70%;\r\n}\r\n\r\n.ud_downloadstatus {\r\n\tpadding: 10px;\r\n\tbackground: #F1F1F1;\r\n}\r\n\r\n#ud_massactions {\r\n\tpadding: 14px;\r\n\tposition: fixed;\r\n\tright: 25%;\r\n\ttop: 25%;\r\n\tborder: 2px solid;\r\n\tborder-radius: 4px;\r\n\tbackground: rgb(241, 241, 241);\r\n\tfloat: right;\r\n}\r\n\r\n#ud_massactions .updraftplus-remove {\r\n\tclear: left;\r\n\tfont-size: 16px;\r\n\ttext-align: center;\r\n\tborder-radius: 4px;\r\n\tmargin-top: 4px;\r\n}\r\n\r\n#ud_massactions .updraftplus-remove a {\r\n\ttext-decoration: none;\r\n}\r\n\r\n#ud_massactions .updraft-viewlogdiv {\r\n\tfont-size: 16px;\r\n\ttext-align: center;\r\n\tborder-radius: 4px;\r\n\tmargin-top: 4px;\r\n}\r\n\r\n#ud_massactions .updraft-viewlogdiv a {\r\n\ttext-decoration: none;\r\n\tposition: relative;\r\n\ttop: 3px;\r\n}\r\n\r\n#ud_massactions .updraft-viewlogdiv a {\r\n\ttext-decoration: none;\r\n\tposition: relative;\r\n\ttop: 3px;\r\n}\r\n\r\n#updraft-navtab-backups-content .updraft_existing_backups {\r\n\tmargin-bottom: 12px;\r\n}\r\n\r\n#updraft-message-modal-innards {\r\n\tpadding: 4px;\r\n}\r\n\r\n#updraft-authenticate-modal {\r\n\ttext-align: center;\r\n\tfont-size: 16px !important;\r\n}\r\n\r\n#updraft-authenticate-modal p {\r\n\tfont-size: 16px;\r\n}\r\n\r\n#updraft_delete_form p {\r\n\tmargin-top: 3px;\r\n\tpadding-top: 0;\r\n}\r\n\r\n#updraft_restore_form .cannot-restore {\r\n\tmargin: 8px 0;\r\n}\r\n\r\n#updraft_restorer_dboptions {\r\n\tpadding: 12px;\r\n\tmargin: 8px 0 4px 0;\r\n\tborder: dashed 1px;\r\n}\r\n\r\n#updraft_restorer_dboptions h4 {\r\n\tmargin: 0px 0px 6px 0px;\r\n\tpadding: 0px;\r\n}\r\n\r\n.updraft_debugrow th {\r\n\tvertical-align: top;\r\n\tpadding-top: 6px;\r\n}\r\n\r\n.expertmode p {\r\n\tfont-size: 125%;\r\n}\r\n\r\n.expertmode .call-wp-action {\r\n\twidth: 300px;\r\n\theight: 22px;\r\n}\r\n\r\n.updraftplus-lock-advert {\r\n\tclear: left;\r\n\tmax-width: 600px;\r\n}\r\n\r\n.uncompressed-data {\r\n\tclear: left;\r\n\tmax-width: 600px;\r\n}\r\n\r\n.delete-old-directories {\r\n\tpadding: 8px;\r\n\tpadding-bottom: 12px;\r\n}\r\n\r\n.active-jobs {\r\n\tmin-width: 480px;\r\n\tmin-height: 48px;\r\n\ttext-align: center;\r\n\tmargin-top: 4px;\r\n\tpadding: 8px;\r\n\tborder: 1px solid;\r\n\tfloat: left;\r\n\tclear: left;\r\n}\r\n\r\n.job-id {\r\n\tmin-width: 480px;\r\n\tmargin-top: 4px;\r\n\tpadding: 8px;\r\n\tborder: 1px solid;\r\n\tclear: left;\r\n\tfloat: left;\r\n}\r\n\r\n.next-resumption {\r\n\tfont-weight: bold;\r\n}\r\n\r\n.updraft_percentage {\r\n\tz-index: -1;\r\n\tposition: absolute;\r\n\tleft: 0px;\r\n\ttop: 0px;\r\n\ttext-align: center;\r\n\tbackground-color: #F6A828;\r\n}\r\n\r\n.curstage {\r\n\tborder-radius: 4px;\r\n\tmargin-top: 8px;\r\n\tpadding-top: 4px;\r\n\tborder: 1px solid #AAA;\r\n\twidth: 100%;\r\n\theight: 22px;\r\n\tposition: relative;\r\n\ttext-align: center;\r\n\tfont-style: italic;\r\n}\r\n\r\n.retain-files {\r\n\twidth: 48px;\r\n}\r\n\r\n.backup-interval-description tr td div {\r\n\tmax-width: 670px;\r\n}\r\n\r\n#updraft-manualdecrypt-modal {\r\n\twidth: 85%;\r\n\tmargin: 6px;\r\n\tmargin-left: 100px;\r\n}\r\n\r\n.directory-permissions {\r\n\tfont-size: 110%;\r\n\tfont-weight: bold;\r\n}\r\n\r\n.double-warning {\r\n\tborder: 1px solid;\r\n\tpadding: 6px;\r\n}\r\n\r\n.raw-backup-info {\r\n\tfont-style: italic;\r\n\tfont-weight: bold;\r\n\tfont-size: 120%;\r\n}\r\n\r\n.updraft_existingbackup_date {\r\n\twidth: 22%;\r\n\tmax-width: 140px;\r\n}\r\n\r\n.existing-backups-table {\r\n\tmargin-top: 20px;\r\n\tmargin-left: 20px;\r\n\twidth: 80%;\r\n}\r\n\r\n.tr-bottom-4 {\r\n\tmargin-bottom: 4px;\r\n}\r\n\r\n.form-table .backup-date {\r\n\twidth: 172px;\r\n\tpadding: 0;\r\n\tpadding-left: 15px;\r\n}\r\n\r\n.form-table .backup-data {\r\n\twidth: 426px;\r\n\tpadding: 0;\r\n\tpadding-left: 15px;\r\n}\r\n\r\n.form-table .updraft_backup_actions {\r\n\twidth: 272px;\r\n\tpadding: 0 0 10px 15px;\r\n}\r\n\r\n.existing-date {\r\n\t-webkit-box-sizing: border-box;\r\n\t-moz-box-sizing: border-box;\r\n\tbox-sizing: border-box;\r\n\tmax-width: 140px;\r\n\twidth: 25%;\r\n}\r\n\r\n.line-break-tr {\r\n\theight: 2px;\r\n\tpadding: 1px;\r\n\tmargin: 0px;\r\n}\r\n\r\n.line-break-td {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n}\r\n\r\n.td-line-color {\r\n\theight: 2px;\r\n\tbackground-color: #888;\r\n}\r\n\r\n.raw-backup {\r\n\tmax-width: 140px;\r\n}\r\n\r\n.existing-backups-actions {\r\n\tpadding: 1px;\r\n\tmargin: 0px;\r\n}\r\n\r\n.existing-backups-border {\r\n\theight: 2px;\r\n\tpadding: 1px;\r\n\tmargin: 0px;\r\n}\r\n\r\n.existing-backups-border > td {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n}\r\n\r\n.existing-backups-border > div {\r\n\theight: 2px;\r\n\tbackground-color: #AAA;\r\n}\r\n\r\n.updraft_existing_backup_date {\r\n\tmax-width: 140px;\r\n}\r\n\r\n.restore-button {\r\n\tmargin-right: 6px;\r\n\tfloat: left;\r\n\tclear: none;\r\n}\r\n\r\n.updraftplus-remove {\r\n\tfont-size: 16px;\r\n\ttext-align: center;\r\n\tborder-radius: 4px;\r\n}\r\n\r\n.before-restore-button {\r\n\tpadding: 1px;\r\n\tmargin: 0px;\r\n}\r\n\r\n.table-separator-tr {\r\n\theight: 2px;\r\n\tpadding: 1px;\r\n\tmargin: 0px;\r\n}\r\n\r\n.table-separator-td {\r\n\tmargin: 0px;\r\n\tpadding: 0px;\r\n}\r\n\r\n.end-of-table-div {\r\n\theight: 2px;\r\n\tbackground-color: #AAA;\r\n}\r\n\r\n.last-backup-job {\r\n\tpadding-top: 3% !important;\r\n}\r\n\r\n.line-height-03 {\r\n\tline-height: 0.3 !important;\r\n}\r\n\r\n.line-height-13 {\r\n\tline-height: 1.3 !important;\r\n}\r\n\r\n.line-height-23 {\r\n\tline-height: 2.3 !important;\r\n}\r\n\r\n#updraft_diskspaceused {\r\n\tcolor: #DF6926;\r\n}\r\n\r\n.updraft_premium_description_list {\r\n\ttext-align: left;\r\n}\r\n\r\n#updraft_delete_old_dirs_pagediv {\r\n\tpadding-bottom: 10px;\r\n}\r\n\r\n/*#updraft_lastlogmessagerow > td, #updraft_last_backup > td {\r\n\tpadding: 0;\r\n}*/\r\n\r\n.job-id {\r\n\tmargin: 0 auto;\r\n\twidth: 20%;\r\n}\r\n\r\n.updraft_all-files {\r\n\tcolor: #DF6926;\r\n}\r\n\r\n/* Time + scheduling add-on*/\r\n.fix-time {\r\n\twidth: 70px;\r\n}\r\n\r\n.retain-files {\r\n\twidth: 70px;\r\n}\r\n\r\n.number-input {\r\n\tmin-width: 50px;\r\n\tmax-width: 70px;\r\n}\r\n\r\n.additional-rule-width {\r\n\tmin-width: 60px;\r\n\tmax-width: 70px;\r\n}\r\n\r\n/* Add-ons */\r\n/* Want to fix the WordPress icons so that they fit inline with the text, and don't push everything out of place. */\r\n\r\n.dashicons {\r\n\tline-height: inherit;\r\n\tfont-size: inherit;\r\n}\r\n\r\n.addon-logo-150 {\r\n\tmargin-left: 30px;\r\n\tmargin-top: 33px;\r\n\theight: 125px;\r\n\twidth: 150px;\r\n}\r\n\r\n.margin-bottom-50 {\r\n\tmargin-bottom: 50px;\r\n}\r\n\r\n.premium-container {\r\n\twidth: 80%;\r\n}\r\n\r\n/* Main Header */\r\n\r\n.main-header {\r\n\tbackground-color: #DF6926;\r\n\theight: 200px;\r\n\twidth: 100%;\r\n}\r\n\r\n.button-add-to-cart {\r\n\tcolor: white;\r\n\tborder-color: white;\r\n\tfloat: none;\r\n\tmargin-right: 17px;\r\n}\r\n\r\n.button-add-to-cart:hover, .button-add-to-cart:focus, .button-add-to-cart:active {\r\n\tborder-color: #A0A5AA;\r\n\tcolor: #A0A5AA;\r\n}\r\n\r\n.addon-title {\r\n\tmargin-top: 25px;\r\n}\r\n\r\n.addon-text {\r\n\tmargin-top: 75px;\r\n}\r\n\r\n.image-main-div {\r\n\twidth: 25%;\r\n\tfloat: left;\r\n}\r\n\r\n.text-main-div {\r\n\twidth: 60%;\r\n\tfloat: left;\r\n\ttext-align: center;\r\n\tcolor: white;\r\n\tmargin-top: 16px;\r\n}\r\n\r\n.text-main-div-title {\r\n\tfont-weight: bold !important;\r\n\tcolor: white;\r\n\ttext-align: center;\r\n}\r\n\r\n.text-main-div-paragraph {\r\n\tcolor: white;\r\n}\r\n\r\n/* End main header */\r\n\r\n/* Vault icons */\r\n\r\n.updraftplus-vault-cta {\r\n\twidth: 100%;\r\n\ttext-align: center;\r\n\tmargin-bottom: 50px;\r\n}\r\n\r\n.updraftplus-vault-cta h1 {\r\n\tfont-weight: bold;\r\n}\r\n\r\n.updraftvault-buy {\r\n\twidth: 225px;\r\n\theight: 225px;\r\n\tborder: 2px solid #777;\r\n\tdisplay: inline-table;\r\n\tmargin: 0 auto;\r\n\tmargin-right: 50px;\r\n\tposition: relative;\r\n}\r\n\r\n.updraftplus-vault-cta > .vault-options > .center-vault {\r\n\twidth: 275px;\r\n\theight: 275px;\r\n}\r\n\r\n.updraftplus-vault-cta > .vault-options > .center-vault > a {\r\n\tright: 21%;\r\n\tfont-size: 16px;\r\n\tborder-width: 4px !important;\r\n}\r\n\r\n.updraftplus-vault-cta > .vault-options > .center-vault > p {\r\n\tfont-size: 16px;\r\n}\r\n\r\n.updraftvault-buy .button-purchase {\r\n\tright: 24%;\r\n\tmargin-left: 0;\r\n\tline-height: 1.7em;\r\n}\r\n\r\n.updraftvault-buy hr {\r\n\theight: 2px;\r\n\tbackground-color: #777;\r\n\tmargin-top: 18px;\r\n}\r\n\r\n.right {\r\n\tmargin-right: 0px;\r\n}\r\n\r\n.updraftvault-buy .addon-logo-100 {\r\n\theight: 100px;\r\n\twidth: 125px;\r\n\tmargin-top: 7px;\r\n}\r\n\r\n.updraftvault-buy .addon-logo-large {\r\n\tmargin-top: 7px;\r\n}\r\n\r\n.updraftvault-buy .button-buy-vault {\r\n\tfont-size: 12px;\r\n\tcolor: #DF6926;\r\n\tborder-color: #DF6926;\r\n\tborder-width: 2px !important;\r\n\tposition: absolute;\r\n\tright: 29%;\r\n\tbottom: 2%;\r\n}\r\n\r\n.premium-addon-div .button-purchase {\r\n\tline-height: 1.7em;\r\n}\r\n\r\n.updraftvault-buy .button-buy-vault:hover {\r\n\tborder-color: darkgrey;\r\n\tcolor: darkgrey;\r\n}\r\n\r\n/* End Vault icons */\r\n\r\n/* Premium addons */\r\n\r\n.premium-addons {\r\n\tmargin-top: 80px;\r\n\twidth: 100%;\r\n\tmargin: 0 auto;\r\n\tdisplay: table;\r\n}\r\n\r\n.addon-list {\r\n\t/* margin-left: 32px; */\r\n\tdisplay: table;\r\n\ttext-align: center;\r\n}\r\n\r\n.premium-addons h1 {\r\n\ttext-align: center;\r\n\tfont-weight: bold;\r\n}\r\n\r\n.premium-addons p {\r\n\ttext-align: center;\r\n}\r\n\r\n.premium-addons .premium-addon-div {\r\n\twidth: 200px;\r\n\theight: 250px;\r\n\tborder: 2px solid #777;\r\n\tdisplay: inline-table;\r\n\tmargin: 0 auto;\r\n\tmargin-right: 25px;\r\n\tmargin-top: 25px;\r\n\ttext-align: center;\r\n\tposition: relative;\r\n}\r\n\r\n.premium-addons .premium-addon-div p {\r\n\tmargin-left: 2px;\r\n\tmargin-right: 2px;\r\n}\r\n\r\n.premium-addons .premium-addon-div img {\r\n\twidth: auto;\r\n\theight: 50px;\r\n\tmargin-top: 7px;\r\n}\r\n\r\n.premium-addons .premium-addon-div .hr-alignment {\r\n\tmargin-top: 44px;\r\n}\r\n\r\n.premium-addons .premium-addon-div .dropbox-logo {\r\n\theight: 39px;\r\n\twidth: 150px;\r\n}\r\n\r\n.premium-addons .premium-addon-div .azure-logo, .premium-addons .premium-addon-div .onedrive-logo {\r\n\twidth: 75%;\r\n\theight: 24px;\r\n}\r\n\r\n.button-purchase {\r\n\tfont-size: 12px;\r\n\tcolor: #DF6926;\r\n\tborder-color: #DF6926;\r\n\tborder-width: 2px !important;\r\n\tposition: absolute;\r\n\tright: 25%;\r\n\tbottom: 2%;\r\n}\r\n\r\n.button-purchase:hover {\r\n\tcolor: darkgrey;\r\n\tborder-color: darkgrey;\r\n}\r\n\r\n.premium-addons .premium-addon-div hr {\r\n\theight: 2px;\r\n\tbackground-color: #777;\r\n\tmargin-top: 18px;\r\n}\r\n\r\n.premium-addon-div p {\r\n\tfont-style: italic;\r\n}\r\n\r\n.addon-list > .premium-addon-div > .onedrive-fix,\r\n.addon-list > .premium-addon-div > .azure-logo {\r\n\tmargin-top: 33px;\r\n}\r\n\r\n.addon-list > .premium-addon-div > .dropbox-fix {\r\n\tmargin-top: 18px;\r\n}\r\n\r\n/* End premium addons */\r\n\r\n\r\n/* Forgotton something (that is the name of the div rather than a mental note!) */\r\n\r\n.premium-forgotton-something {\r\n\tmargin-top: 5%;\r\n}\r\n\r\n.premium-forgotton-something h1 {\r\n\ttext-align: center;\r\n\tfont-weight: bold;\r\n}\r\n\r\n.premium-forgotton-something p {\r\n\ttext-align: center;\r\n\tfont-weight: normal;\r\n}\r\n\r\n.premium-forgotton-something .button-faq {\r\n\tcolor: #DF6926;\r\n\tborder-color: #DF6926;\r\n\tmargin: 0 auto;\r\n\tdisplay: table;\r\n}\r\n\r\n.premium-forgotton-something .button-faq:hover {\r\n\tcolor: #777;\r\n\tborder-color: #777;\r\n}\r\n\r\n/* End of forgotton something */\r\n\r\n.updraftplusmethod.updraftvault #vaultlogo {\r\n\tpadding-left: 40px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault_primary_option {\r\n\tfloat: left;\r\n\twidth: 50%;\r\n\ttext-align: center;\r\n\tpadding-bottom: 20px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault_primary_option div {\r\n\tclear: right;\r\n\tpadding-top: 20px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .clear-left {\r\n\tclear: left;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .padding-top-20px {\r\n\tpadding-top: 20px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .padding-top-14px {\r\n\tpadding-top: 14px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_settings_default .button-primary, .updraftplusmethod.updraftvault #updraftvault_settings_showoptions .button-primary {\r\n\tfont-size: 18px !important;\r\n\tpadding-bottom: 20px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_showoptions, .updraftplusmethod.updraftvault #updraftvault_connect {\r\n\tmargin-top: 8px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_settings_connect input {\r\n\tmargin-right: 10px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_email {\r\n\twidth: 280px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_pass {\r\n\twidth: 200px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #vault-is-connected {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_settings_default p {\r\n\tclear: left;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault-purchase-option {\r\n\tfloat: left;\r\n\twidth: 33%;\r\n\ttext-align: center;\r\n\tpadding-top: 20px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault-purchase-option-size {\r\n\tfont-size: 200%;\r\n\tfont-weight: bold;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault-purchase-option-link {\r\n\tclear: both;\r\n\tfont-size: 150%;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault-purchase-option-or {\r\n\tclear: both;\r\n\tfont-size: 115%;\r\n\tfont-style: italic;\r\n}\r\n\r\n/* Automation Backup Advert by B */\r\n.autobackup-image {\r\n/* \tdisplay: inline-block; */\r\n/*\tmin-width: 10%;\r\n\tmax-width:25%;*/\r\n/*\tfloat: left;*/\r\n\tclear: left;\r\n\tfloat: left;\r\n\twidth: 110px;\r\n\theight: 110px;\r\n}\r\n\r\n.autobackup-description {\r\n\twidth: 100%;\r\n}\r\n\r\n.advert-description {\r\n\tfloat: left;\r\n\tclear: right;\r\n\tpadding: 4px 10px 8px 10px;\r\n\twidth: 70%;\r\n\tclear: right;\r\n\tvertical-align: top;\r\n}\r\n\r\n.advert-btn {\r\n\tdisplay: inline-block;\r\n\tmin-width: 10%;\r\n\tvertical-align: top;\r\n\tmargin-bottom: 8px;\r\n}\r\n\r\n.advert-btn:first-of-type {\r\n\tmargin-top: 25px;\r\n}\r\n\r\n.advert-btn a {\r\n\tdisplay: block;\r\n\tcursor: pointer;\r\n}\r\n\r\na.btn-get-started {\r\n\tbackground: #FFF;\r\n\tborder: 2px solid #DF6926;\r\n\tborder-radius: 4px;\r\n\tcolor: #DF6926;\r\n\tdisplay: inline-block;\r\n\tmargin-left: 10px !important;\r\n\tmargin-bottom: 7px !important;\r\n\tfont-size: 18px !important;\r\n\tline-height: 20px;\r\n\tmin-height: 28px;\r\n\tpadding: 11px 10px 5px 10px;\r\n\ttext-transform: uppercase;\r\n\ttext-decoration: none;\r\n}\r\n\r\n.circle-dblarrow {\r\n\tborder: 1px solid #DF6926;\r\n\tborder-radius: 100%;\r\n\tdisplay: inline-block;\r\n\tfont-size: 17px;\r\n\tline-height: 17px;\r\n\tmargin-left: 5px;\r\n\twidth: 20px;\r\n\theight: 20px;\r\n\ttext-align: center;\r\n}\r\n\r\n@media screen and (max-width: 782px) {\r\n/*\t.advert-description {\r\n\t\tmin-width: 75%;\r\n\t\tmargin-bottom: 5px;\r\n\t}\r\n\r\n\t.advert-btn {\r\n\t\tmargin-top: 15px;\r\n\t\tmargin-left:86px;\r\n\t\tmin-width: 100%;\r\n\t}*/\r\n}\r\n\r\n/* End Automation Backup Advert by B */\r\n/* New Responsive Pretty Advanced Settings */\r\n.expertmode .advanced_settings_container {\r\n\theight: auto;\r\n\toverflow: hidden;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu {\r\n\tfloat: none;\r\n\tborder-bottom: 1px solid rgb(204, 204, 204);\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_content {\r\n\tpadding-top: 5px;\r\n\tfloat: none;\r\n\twidth: auto;\r\n\toverflow: auto;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_content h3 {\r\n\tmargin-top: 5px !important;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_content .advanced_tools {\r\n\tdisplay: none;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_content .site_info {\r\n\tdisplay: block;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button {\r\n\tdisplay: inline-block;\r\n\tcursor: pointer;\r\n\tpadding: 5px;\r\n\tcolor: #000;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_text {\r\n\tfont-size: 16px;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button:hover {\r\n\tbackground-color: #EAEAEA;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu .active {\r\n\tbackground-color: #3498DB;\r\n\tcolor: #FFF;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu .active:hover {\r\n\tbackground-color: #72C5FD;\r\n\tcolor: #FFF;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_content input#import_settings {\r\n\theight: auto !important;\r\n}\r\n\r\ndiv#updraft-wrap a {\r\n\tcursor: pointer !important;\r\n}\r\n\r\n#updraftcentral_keys_table {\r\n\tdisplay: none;\r\n}\r\n\r\n.create_key_container {\r\n\tborder: 1px solid;\r\n\tborder-radius: 4px;\r\n\tpadding: 0 0 6px 6px;\r\n\tmargin-bottom: 8px;\r\n}\r\n\r\n#updraftcentral_keycreate_mothership {\r\n\tmargin-left: 24px;\r\n}\r\n\r\n@media screen and (min-width: 670px) {\r\n\r\n\t.expertmode .advanced_settings_container .advanced_settings_menu {\r\n\t\tfloat: left;\r\n\t\twidth: 215px;\r\n\t\tborder-right: 1px solid rgb(204, 204, 204);\r\n\t\tborder-bottom: none;\r\n\t}\r\n\r\n\t.expertmode .advanced_settings_container .advanced_settings_content {\r\n\t\tpadding-left: 10px;\r\n\t\tpadding-top: 0px;\r\n\t}\r\n\r\n\t.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button {\r\n\t\tdisplay: block;\r\n\t}\r\n\r\n}\r\n"]}
1
+ {"version":3,"sources":["css/admin.css"],"names":[],"mappings":"AAAA,uBAAuB;AACvB;CACC,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb;;AAED;CACC,WAAW;CACX;;AAED,2BAA2B;;AAE3B,kBAAkB;AAClB;CACC,sBAAsB;CACtB;;AAED;CACC,kBAAkB;CAClB;;AAED,sBAAsB;AACtB,eAAe;AACf;CACC,mBAAmB;CACnB;;AAED,sBAAsB;AACtB,aAAa;AACb;CACC,sBAAsB;CACtB;;AAED,oBAAoB;;AAEpB;CACC,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,wBAAwB;CACxB;;AAED;CACC,iBAAiB;CACjB;;AAED,iBAAiB;;AAEjB;CACC,mBAAmB;CACnB,kBAAkB;CAClB,uBAAuB;CACvB,aAAa;CACb,iBAAiB;CACjB,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb;;AAED;CACC,mBAAmB;CACnB;;AAED,qBAAqB;;AAErB,kBAAkB;AAClB;CACC,kBAAkB;CAClB,oBAAoB;CACpB,oBAAoB;CACpB,gBAAgB;CAChB,kBAAkB;CAClB,oBAAoB;CACpB,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB,wBAAwB;CACxB,mBAAmB;CACnB,kBAAkB;CAClB,qBAAqB;CACrB,yBAAyB;CACzB,uBAAuB;CACvB,mBAAmB;CACnB,mBAAmB;CACnB,kBAAkB;CAClB,qBAAqB;CACrB,eAAe;CACf,sBAAsB;CACtB;;AAED;CACC,gCAAgC;CAChC,yBAAyB;CACzB;;AAED;CACC,kBAAkB;CAClB,aAAa;CACb,mBAAmB;CACnB;;AAED;;;CAGC,sBAAsB;CACtB,eAAe;CACf;;AAED;CACC,yBAAyB;CACzB,gCAAgC;CAChC;;AAED;CACC,sBAAsB;CACtB,eAAe;CACf;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,eAAe;CACf,sBAAsB;CACtB,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,mBAAmB;CACnB;;AAED;CACC,gBAAgB;CAChB,uBAAuB;CACvB,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,aAAa;CACb;;AAED;CACC,iBAAiB;CACjB,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ,mBAAmB;CACnB,gBAAgB;CAChB,mBAAmB;CACnB,kBAAkB;CAClB,kBAAkB;CAClB;;AAED;CACC,aAAa;CACb;;AAED;CACC,YAAY;CACZ;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,kBAAkB;CAClB,eAAe;CACf,sBAAsB;CACtB,gBAAgB;CAChB,aAAa;CACb;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,mBAAmB;CACnB,0BAA0B;CAC1B,yBAAyB;CACzB,YAAY;CACZ,eAAe;CACf;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,sBAAsB;CACtB;;AAED;CACC,cAAc;CACd,mBAAmB;CACnB,WAAW;CACX;;AAED;CACC,aAAa;CACb;;AAED,sBAAsB;;AAEtB,4BAA4B;;AAE5B;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ,oBAAoB;CACpB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,cAAc;CACd,YAAY;CACZ;;AAED;CACC,aAAa;CACb,mBAAmB;CACnB,WAAW;CACX;;AAED;CACC,aAAa;CACb,cAAc;CACd,mBAAmB;CACnB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,eAAe;CACf,aAAa;CACb,eAAe;CACf,mBAAmB;CACnB,UAAU;CACV,UAAU;CACV;;AAED;CACC,2BAA2B;CAC3B;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb;;AAED;CACC,YAAY;CACZ;;AAED,mCAAmC;;AAEnC;CACC,iBAAiB;CACjB;;AAED;CACC,uBAAuB;CACvB;;AAED;CACC,cAAc;CACd;;AAED;CACC,8BAA8B;CAC9B,aAAa;CACb,eAAe;CACf,2BAA2B;CAC3B,gBAAgB;CAChB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,4BAA4B;CAC5B,8BAA8B;CAC9B,2BAA2B;CAC3B,iBAAiB;CACjB,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,kBAAkB;CAClB,kBAAkB;CAClB,mBAAmB;CACnB,iBAAiB;CACjB;;AAED;CACC,iBAAiB;CACjB,uBAAuB;CACvB;;AAED;CACC,WAAW;CACX;;AAED,mBAAmB;;AAEnB,oEAAoE;AACpE;;CAEC,wBAAwB;CACxB;;AAED;;CAEC,gCAAgC;CAChC;;AAED;;CAEC,+BAA+B;CAC/B;;AAED;;CAEC,wBAAwB;CACxB;;AAED,+BAA+B;AAC/B;CACC,mBAAmB;CACnB,cAAc;CACd,eAAe;CACf;;AAED;CACC,mBAAmB;CACnB,aAAa;CACb,YAAY;CACZ,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ,mBAAmB;CACnB,gBAAgB;CAChB;;AAED;CACC,cAAc;CACd,eAAe;CACf,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB,mBAAmB;CACnB,YAAY;CACZ,YAAY;CACZ,eAAe;CACf;;AAED,8BAA8B;AAC9B;CACC,mBAAmB;CACnB,cAAc;CACd,cAAc;CACd,YAAY;CACZ,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB,OAAO;CACP,SAAS;CACT;;AAED;CACC,aAAa;CACb,YAAY;CACZ,eAAe;CACf;;AAED;CACC,aAAa;CACb,kBAAkB;CAClB;;AAED;CACC,cAAc;CACd;;AAED;CACC,gBAAgB;CAChB,WAAW;CACX,2BAA2B;CAC3B;;AAED;CACC,gBAAgB;CAChB,2BAA2B;CAC3B;;AAED;CACC,aAAa;CACb;;AAED;CACC,0BAA0B;CAC1B,0BAA0B;CAC1B,aAAa;CACb,uBAAuB;CACvB,kBAAkB;CAClB;;AAED;CACC,UAAU;CACV,WAAW;CACX;;AAED;CACC,uBAAuB;CACvB,YAAY;CACZ,uBAAuB;CACvB,aAAa;CACb,aAAa;CACb,kBAAkB;CAClB,mBAAmB;CACnB,YAAY;CACZ;;AAED;CACC,aAAa;CACb,8BAA8B;CAC9B,YAAY;CACZ,YAAY;CACZ,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB;;AAED;CACC,uBAAuB;CACvB,YAAY;CACZ,uBAAuB;CACvB,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb,yBAAyB;CACzB;;AAED;CACC,wBAAwB;CACxB,0BAA0B;CAC1B;;AAED;CACC,eAAe;CACf;;AAED;CACC,wBAAwB;CACxB,cAAc;CACd;;AAED;CACC,oBAAoB;CACpB,aAAa;CACb;;AAED;CACC,YAAY;CACZ;;AAED;CACC,aAAa;CACb,oBAAoB;CACpB,uBAAuB;CACvB,cAAc;CACd;;AAED;CACC,wBAAwB;CACxB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,eAAe;CACf;;AAED;CACC,YAAY;CACZ;;AAED;CACC,qCAAqC;CACrC,kBAAkB;CAClB;;AAED;CACC,wBAAwB;CACxB,0BAA0B;CAC1B,gBAAgB;CAChB,wBAAwB;CACxB,mBAAmB;CACnB;;AAED;CACC,kBAAkB;CAClB,gBAAgB;CAChB,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ,aAAa;CACb,gBAAgB;CAChB,eAAe;CACf;;AAED;CACC,aAAa;CACb;;AAED;CACC,WAAW;CACX;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,cAAc;CACd,aAAa;CACb;;AAED;CACC,UAAU;CACV,oBAAoB;CACpB,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB,WAAW;CACX,gBAAgB;CAChB,kBAAkB;CAClB,YAAY;CACZ,mBAAmB;CACnB,aAAa;CACb,cAAc;CACd;;AAED;CACC,gBAAgB;CAChB,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,cAAc;CACd,YAAY;CACZ;;AAED;CACC,cAAc;CACd;;AAED;;CAEC;EACC,eAAe;EACf,YAAY;EACZ,mBAAmB;EACnB;;CAED;;AAED,oCAAoC;AACpC;CACC,WAAW;CACX;;AAED;CACC,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb;;AAED;CACC,aAAa;CACb;;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;;AAEH;CACC,iBAAiB;CACjB;;AAED;CACC,sBAAsB;CACtB;;AAED;CACC,YAAY;CACZ,aAAa;CACb,mBAAmB;CACnB;;AAED;CACC,+BAA+B;CAC/B,uBAAuB;CACvB,wBAAwB;CACxB;;AAED;CACC,kBAAkB;CAClB,YAAY;CACZ,yBAAyB;CACzB;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,YAAY;CACZ,YAAY;CACZ,yBAAyB;CACzB;;AAED;CACC,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,0BAA0B;CAC1B,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,kBAAkB;CAClB,eAAe;CACf;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,kBAAkB;CAClB,eAAe;CACf;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,kBAAkB;CAClB,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,uBAAuB;CACvB,aAAa;CACb,YAAY;CACZ,mBAAmB;CACnB;;AAED;CACC,wBAAwB;CACxB,iBAAiB;CACjB,gBAAgB;CAChB,oBAAoB;CACpB;;AAED;CACC,WAAW;CACX,aAAa;CACb,mBAAmB;CACnB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,WAAW;CACX;;AAED;CACC,cAAc;CACd,oBAAoB;CACpB;;AAED;CACC,cAAc;CACd,gBAAgB;CAChB,WAAW;CACX,SAAS;CACT,kBAAkB;CAClB,mBAAmB;CACnB,+BAA+B;CAC/B,aAAa;CACb;;AAED;CACC,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB,mBAAmB;CACnB,gBAAgB;CAChB;;AAED;CACC,sBAAsB;CACtB;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,mBAAmB;CACnB,gBAAgB;CAChB;;AAED;CACC,sBAAsB;CACtB,mBAAmB;CACnB,SAAS;CACT;;AAED;CACC,sBAAsB;CACtB,mBAAmB;CACnB,SAAS;CACT;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,aAAa;CACb;;AAED;CACC,mBAAmB;CACnB,2BAA2B;CAC3B;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB,eAAe;CACf;;AAED;CACC,cAAc;CACd;;AAED;CACC,cAAc;CACd,oBAAoB;CACpB,mBAAmB;CACnB;;AAED;CACC,wBAAwB;CACxB,aAAa;CACb;;AAED;CACC,oBAAoB;CACpB,iBAAiB;CACjB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,aAAa;CACb,aAAa;CACb;;AAED;CACC,YAAY;CACZ,iBAAiB;CACjB;;AAED;CACC,YAAY;CACZ,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,qBAAqB;CACrB;;AAED;CACC,iBAAiB;CACjB,iBAAiB;CACjB,mBAAmB;CACnB,gBAAgB;CAChB,aAAa;CACb,kBAAkB;CAClB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,iBAAiB;CACjB,gBAAgB;CAChB,aAAa;CACb,kBAAkB;CAClB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ,mBAAmB;CACnB,UAAU;CACV,SAAS;CACT,mBAAmB;CACnB,0BAA0B;CAC1B;;AAED;CACC,mBAAmB;CACnB,gBAAgB;CAChB,iBAAiB;CACjB,uBAAuB;CACvB,YAAY;CACZ,aAAa;CACb,mBAAmB;CACnB,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,WAAW;CACX,YAAY;CACZ,mBAAmB;CACnB;;AAED;CACC,gBAAgB;CAChB,kBAAkB;CAClB;;AAED;CACC,kBAAkB;CAClB,aAAa;CACb;;AAED;CACC,mBAAmB;CACnB,kBAAkB;CAClB,gBAAgB;CAChB;;AAED;CACC,WAAW;CACX,iBAAiB;CACjB;;AAED;CACC,iBAAiB;CACjB,kBAAkB;CAClB,WAAW;CACX;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,WAAW;CACX,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,WAAW;CACX,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,uBAAuB;CACvB;;AAED;CAGC,uBAAuB;CACvB,iBAAiB;CACjB,WAAW;CACX;;AAED;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ;;AAED;CACC,UAAU;CACV,WAAW;CACX;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ;;AAED;CACC,UAAU;CACV,WAAW;CACX;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,kBAAkB;CAClB,YAAY;CACZ,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,aAAa;CACb,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,aAAa;CACb;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB;;AAED;CACC,2BAA2B;CAC3B;;AAED;CACC,4BAA4B;CAC5B;;AAED;CACC,4BAA4B;CAC5B;;AAED;CACC,4BAA4B;CAC5B;;AAED;CACC,eAAe;CACf;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,qBAAqB;CACrB;;AAED;;GAEG;;AAEH;CACC,eAAe;CACf,WAAW;CACX;;AAED;CACC,eAAe;CACf;;AAED,6BAA6B;AAC7B;CACC,YAAY;CACZ;;AAED;CACC,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB,gBAAgB;CAChB;;AAED,aAAa;AACb,oHAAoH;;AAEpH;CACC,qBAAqB;CACrB,mBAAmB;CACnB;;AAED;CACC,kBAAkB;CAClB,iBAAiB;CACjB,cAAc;CACd,aAAa;CACb;;AAED;CACC,oBAAoB;CACpB;;AAED;CACC,WAAW;CACX;;AAED,iBAAiB;;AAEjB;CACC,0BAA0B;CAC1B,cAAc;CACd,YAAY;CACZ;;AAED;CACC,aAAa;CACb,oBAAoB;CACpB,YAAY;CACZ,mBAAmB;CACnB;;AAED;CACC,sBAAsB;CACtB,eAAe;CACf;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,WAAW;CACX,YAAY;CACZ;;AAED;CACC,WAAW;CACX,YAAY;CACZ,mBAAmB;CACnB,aAAa;CACb,iBAAiB;CACjB;;AAED;CACC,6BAA6B;CAC7B,aAAa;CACb,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb;;AAED,qBAAqB;;AAErB,iBAAiB;;AAEjB;CACC,YAAY;CACZ,mBAAmB;CACnB,oBAAoB;CACpB;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,aAAa;CACb,cAAc;CACd,uBAAuB;CACvB,sBAAsB;CACtB,eAAe;CACf,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,cAAc;CACd;;AAED;CACC,WAAW;CACX,gBAAgB;CAChB,6BAA6B;CAC7B;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,WAAW;CACX,eAAe;CACf,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB,iBAAiB;CACjB;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,cAAc;CACd,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,gBAAgB;CAChB,eAAe;CACf,sBAAsB;CACtB,6BAA6B;CAC7B,mBAAmB;CACnB,WAAW;CACX,WAAW;CACX;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,uBAAuB;CACvB,gBAAgB;CAChB;;AAED,qBAAqB;;AAErB,oBAAoB;;AAEpB;CACC,iBAAiB;CACjB,YAAY;CACZ,eAAe;CACf,eAAe;CACf;;AAED;CACC,wBAAwB;CACxB,eAAe;CACf,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb,cAAc;CACd,uBAAuB;CACvB,sBAAsB;CACtB,eAAe;CACf,mBAAmB;CACnB,iBAAiB;CACjB,mBAAmB;CACnB,mBAAmB;CACnB;;AAED;CACC,iBAAiB;CACjB,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ,aAAa;CACb,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,aAAa;CACb,aAAa;CACb;;AAED;CACC,WAAW;CACX,aAAa;CACb;;AAED;CACC,gBAAgB;CAChB,eAAe;CACf,sBAAsB;CACtB,6BAA6B;CAC7B,mBAAmB;CACnB,WAAW;CACX,WAAW;CACX;;AAED;CACC,gBAAgB;CAChB,uBAAuB;CACvB;;AAED;CACC,YAAY;CACZ,uBAAuB;CACvB,iBAAiB;CACjB;;AAED;CACC,mBAAmB;CACnB;;AAED;;CAEC,iBAAiB;CACjB;;AAED;CACC,iBAAiB;CACjB;;AAED,wBAAwB;;;AAGxB,mFAAmF;;AAEnF;CACC,eAAe;CACf;;AAED;CACC,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,mBAAmB;CACnB,oBAAoB;CACpB;;AAED;CACC,eAAe;CACf,sBAAsB;CACtB,eAAe;CACf,eAAe;CACf;;AAED;CACC,YAAY;CACZ,mBAAmB;CACnB;;AAED,gCAAgC;;AAEhC;CACC,mBAAmB;CACnB;;AAED;CACC,YAAY;CACZ,WAAW;CACX,mBAAmB;CACnB,qBAAqB;CACrB;;AAED;CACC,aAAa;CACb,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,kBAAkB;CAClB;;AAED;CACC,2BAA2B;CAC3B,qBAAqB;CACrB;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,aAAa;CACb;;AAED;CACC,aAAa;CACb;;AAED;CACC,UAAU;CACV,WAAW;CACX;;AAED;CACC,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,WAAW;CACX,mBAAmB;CACnB,kBAAkB;CAClB;;AAED;CACC,gBAAgB;CAChB,kBAAkB;CAClB;;AAED;CACC,YAAY;CACZ,gBAAgB;CAChB;;AAED;CACC,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB;;AAED,mCAAmC;AACnC;AACA,6BAA6B;AAC7B;iBACiB;AACjB,iBAAiB;CAChB,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,cAAc;CACd;;AAED;CACC,YAAY;CACZ;;AAED;CACC,YAAY;CACZ,aAAa;CACb,2BAA2B;CAC3B,WAAW;CACX,aAAa;CACb,oBAAoB;CACpB;;AAED;CACC,sBAAsB;CACtB,eAAe;CACf,oBAAoB;CACpB,mBAAmB;CACnB;;AAED;CACC,iBAAiB;CACjB;;AAED;CACC,eAAe;CACf,gBAAgB;CAChB;;AAED;CACC,iBAAiB;CACjB,0BAA0B;CAC1B,mBAAmB;CACnB,eAAe;CACf,sBAAsB;CACtB,6BAA6B;CAC7B,8BAA8B;CAC9B,2BAA2B;CAC3B,kBAAkB;CAClB,iBAAiB;CACjB,4BAA4B;CAC5B,0BAA0B;CAC1B,sBAAsB;CACtB;;AAED;CACC,0BAA0B;CAC1B,oBAAoB;CACpB,sBAAsB;CACtB,gBAAgB;CAChB,kBAAkB;CAClB,iBAAiB;CACjB,YAAY;CACZ,aAAa;CACb,mBAAmB;CACnB;;AAED;AACA;;;;;;;;;IASI;CACH;;AAED,uCAAuC;AACvC,6CAA6C;AAC7C;CACC,aAAa;CACb,iBAAiB;CACjB;;AAED;CACC,YAAY;CACZ,4CAA4C;CAC5C;;AAED;CACC,iBAAiB;CACjB,YAAY;CACZ,YAAY;CACZ,eAAe;CACf;;AAED;CACC,2BAA2B;CAC3B;;AAED;CACC,cAAc;CACd;;AAED;CACC,eAAe;CACf;;AAED;CACC,sBAAsB;CACtB,gBAAgB;CAChB,aAAa;CACb,YAAY;CACZ;;AAED;CACC,gBAAgB;CAChB;;AAED;CACC,0BAA0B;CAC1B;;AAED;CACC,0BAA0B;CAC1B,YAAY;CACZ;;AAED;CACC,0BAA0B;CAC1B,YAAY;CACZ;;AAED;CACC,wBAAwB;CACxB;;AAED;CACC,2BAA2B;CAC3B;;AAED;CACC,WAAW;CACX,YAAY;CACZ,mBAAmB;CACnB;;AAED;CACC,mBAAmB;CACnB;;AAED;CACC,cAAc;CACd;;AAED;CACC,kBAAkB;CAClB,mBAAmB;CACnB,qBAAqB;CACrB,mBAAmB;CACnB;;AAED;;CAEC;EACC,YAAY;EACZ,aAAa;EACb,2CAA2C;EAC3C,oBAAoB;EACpB;;CAED;EACC,mBAAmB;EACnB,iBAAiB;EACjB;;CAED;EACC,eAAe;EACf;;CAED","file":"admin.min.css","sourcesContent":["/* Widths and sizing */\r\n.max-width-600 {\r\n\tmax-width: 600px;\r\n}\r\n\r\n.width-900 {\r\n\twidth: 900px;\r\n}\r\n\r\n.width-80 {\r\n\twidth: 80%;\r\n}\r\n\r\n/* End widths and sizing */\r\n\r\n/* Font styling */\r\n.no-decoration {\r\n\ttext-decoration: none;\r\n}\r\n\r\n.bold {\r\n\tfont-weight: bold;\r\n}\r\n\r\n/* End font styling */\r\n/* Alignment */\r\n.center-align-td {\r\n\ttext-align: center;\r\n}\r\n\r\n/* End of Alignment */\r\n/* Padding */\r\n.remove-padding {\r\n\tpadding: 0 !important;\r\n}\r\n\r\n/* End of padding */\r\n\r\n.updraft-text-center {\r\n\ttext-align: center;\r\n}\r\n\r\n.autobackup {\r\n\tpadding: 6px;\r\n\tmargin: 8px 0px;\r\n}\r\n\r\nul .disc {\r\n\tlist-style: disc inside;\r\n}\r\n\r\n.dashicons-log-fix {\r\n\tdisplay: inherit;\r\n}\r\n\r\n/* Input boxes */\r\n\r\ninput {\r\n\tborder-radius: 4px;\r\n\tline-height: 1.42;\r\n\tborder: 1px solid #CCC;\r\n\theight: 27px;\r\n\tpadding: 2px 6px;\r\n\tcolor: #555;\r\n}\r\n\r\ninput[type=\"text\"] {\r\n\tfont-size: 14px;\r\n}\r\n\r\ninput[type=\"number\"] {\r\n\theight: 31px;\r\n}\r\n\r\nselect {\r\n\tborder-radius: 4px;\r\n}\r\n\r\n/* End input boxes */\r\n\r\n/* Main Buttons */\r\n.main-dashboard-buttons {\r\n\tborder-width: 4px;\r\n\tborder-radius: 12px;\r\n\tletter-spacing: 0px;\r\n\tfont-size: 17px;\r\n\tfont-weight: bold;\r\n\tpadding-left: 0.7em;\r\n\tpadding-right: 2em;\r\n\tpadding: 0.3em 1em;\r\n\tline-height: 1.7em;\r\n\tbackground: transparent;\r\n\tposition: relative;\r\n\tborder: 2px solid;\r\n\ttransition: all 0.2s;\r\n\tvertical-align: baseline;\r\n\tbox-sizing: border-box;\r\n\ttext-align: center;\r\n\tline-height: 1.3em;\r\n\tmargin-left: .3em;\r\n\ttext-transform: none;\r\n\tline-height: 1;\r\n\ttext-decoration: none;\r\n}\r\n\r\n.button-restore {\r\n\tborder-color: rgb(98, 158, 192);\r\n\tcolor: rgb(98, 158, 192);\r\n}\r\n\r\n.dashboard-main-sizing {\r\n\tborder-width: 4px;\r\n\twidth: 190px;\r\n\tline-height: 1.7em;\r\n}\r\n\r\n.button-restore:hover, .button-migrate:hover, .button-backup:hover,\r\n.button-view-log:hover, .button-mass-selectors:hover,\r\n.button-delete:hover, .button-entity-backup:hover, .udp-button-primary:hover {\r\n\tborder-color: #DF6926;\r\n\tcolor: #DF6926;\r\n}\r\n\r\n.button-migrate {\r\n\tcolor: rgb(238, 169, 32);\r\n\tborder-color: rgb(238, 169, 32);\r\n}\r\n\r\n.button-backup {\r\n\tborder-color: #84CA1B;\r\n\tcolor: #84CA1B;\r\n}\r\n\r\n.existing-backups-buttons {\r\n\tfont-size: 11px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 3px;\r\n}\r\n\r\n.existing-backups-restore-buttons {\r\n\tfont-size: 11px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 3px;\r\n}\r\n\r\n.button-delete {\r\n\tcolor: #E23900;\r\n\tborder-color: #E23900;\r\n\tfont-size: 14px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 2px;\r\n\tmargin-right: 10px;\r\n}\r\n\r\n.button-view-log, .button-mass-selectors {\r\n\tcolor: darkgrey;\r\n\tborder-color: darkgrey;\r\n\tfont-size: 14px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 2px;\r\n\tmargin-top: -1px;\r\n}\r\n\r\n.button-view-log {\r\n\twidth: 120px;\r\n}\r\n\r\n.button-existing-restore {\r\n\tfont-size: 14px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 2px;\r\n\twidth: 110px;\r\n}\r\n\r\n.main-restore {\r\n\tmargin-right: 3%;\r\n\tmargin-left: 3%;\r\n}\r\n\r\n.button-entity-backup {\r\n\tcolor: #555;\r\n\tborder-color: #555;\r\n\tfont-size: 11px;\r\n\tline-height: 1.4em;\r\n\tborder-width: 2px;\r\n\tmargin-right: 5px;\r\n}\r\n\r\n.button-select-all {\r\n\twidth: 122px;\r\n}\r\n\r\n.button-deselect {\r\n\twidth: 92px;\r\n}\r\n\r\n#ud_massactions > .display-flex > .mass-selectors-margins {\r\n\tmargin-right: -4px;\r\n}\r\n\r\n.udp-button-primary {\r\n\tborder-width: 4px;\r\n\tcolor: #0073AA;\r\n\tborder-color: #0073AA;\r\n\tfont-size: 14px;\r\n\theight: 40px;\r\n}\r\n\r\n#ud_massactions .button-delete {\r\n\tmargin-right: 0px;\r\n}\r\n\r\n.stored_local {\r\n\tborder-radius: 5px;\r\n\tbackground-color: #007FE7;\r\n\tpadding: 3px 5px 5px 5px;\r\n\tcolor: #FFF;\r\n\tfont-size: 75%;\r\n}\r\n\r\n.form-table td.updraft_existingbackup_date {\r\n\tpadding-bottom: 5px;\r\n}\r\n\r\nspan#updraft_lastlogcontainer {\r\n\tword-break: break-all;\r\n}\r\n\r\n.stored_icon {\r\n\theight: 1.3em;\r\n\tposition: relative;\r\n\ttop: 0.2em;\r\n}\r\n\r\n.backup_date_label .clear-right {\r\n\tclear: right;\r\n}\r\n\r\n/* End Main Buttons */\r\n\r\n/* End of common elements */\r\n\r\n.udp-logo-70 {\r\n\twidth: 70px;\r\n\theight: 70px;\r\n\tfloat: left;\r\n\tpadding-right: 25px;\r\n}\r\n\r\nh3 .thank-you {\r\n\tmargin-top: 0px;\r\n}\r\n\r\n.ws_advert {\r\n\tmax-width: 800px;\r\n\tfont-size: 140%;\r\n\tline-height: 140%;\r\n\tpadding: 14px;\r\n\tclear: left;\r\n}\r\n\r\n.dismiss-dash-notice {\r\n\tfloat: right;\r\n\tposition: relative;\r\n\ttop: -20px;\r\n}\r\n\r\n#updraft_report_cell .updraft_reportbox {\r\n\tpadding: 8px;\r\n\tmargin: 8px 0;\r\n\tborder: 1px dotted;\r\n\tclear: left;\r\n\tfloat: left;\r\n}\r\n\r\n#updraft_report_cell button.updraft_reportbox_delete {\r\n\tfont-size: 50%;\r\n\tfloat: right;\r\n\tpadding: 0 3px;\r\n\tposition: relative;\r\n\ttop: -4px;\r\n\tleft: 4px;\r\n}\r\n\r\n#updraft-navtab-settings-content .updraft-test-button {\r\n\tfont-size: 18px !important;\r\n}\r\n\r\n#updraft_report_cell .updraft_report_checkbox {\r\n\tmargin-top: 4px;\r\n}\r\n\r\n#updraft_report_cell .updraft_report_email {\r\n\twidth: 300px;\r\n}\r\n\r\n#updraft_report_cell .updraft_report_another_p {\r\n\tclear: left;\r\n}\r\n\r\n/* Taken straight from admin.php */\r\n\r\n#updraft-navtab-settings-content table.form-table p {\r\n\tmax-width: 700px;\r\n}\r\n\r\n#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected {\r\n\tbackground-color: #CCC;\r\n}\r\n\r\n.updraft_settings_sectionheading {\r\n\tdisplay: none;\r\n}\r\n\r\n.updraft-backupentitybutton-disabled {\r\n\tbackground-color: transparent;\r\n\tborder: none;\r\n\tcolor: #0074A2;\r\n\ttext-decoration: underline;\r\n\tcursor: pointer;\r\n\tclear: none;\r\n\tfloat: left;\r\n}\r\n\r\n.updraft-backupentitybutton {\r\n\tmargin-left: 8px;\r\n}\r\n\r\n.updraft-bigbutton {\r\n\tpadding: 2px 0px !important;\r\n\tmargin-right: 14px !important;\r\n\tfont-size: 22px !important;\r\n\tmin-height: 32px;\r\n\tmin-width: 180px;\r\n}\r\n\r\n.updraft_debugrow th {\r\n\tfloat: right;\r\n\ttext-align: right;\r\n\tfont-weight: bold;\r\n\tpadding-right: 8px;\r\n\tmin-width: 140px;\r\n}\r\n\r\n.updraft_debugrow td {\r\n\tmin-width: 300px;\r\n\tvertical-align: bottom;\r\n}\r\n\r\n#updraft_webdav_host_error {\r\n\tcolor: red;\r\n}\r\n\r\n/* jstree styles */\r\n\r\n/* these styles hide the dots from the parent but keep the arrows */\r\n#updraft_zip_files_jstree .jstree-container-ul > .jstree-node,\r\n#updraft_more_files_jstree .jstree-container-ul > .jstree-node {\r\n\tbackground: transparent;\r\n}\r\n\r\n#updraft_zip_files_jstree .jstree-container-ul > .jstree-open > .jstree-ocl,\r\n#updraft_more_files_jstree .jstree-container-ul > .jstree-open > .jstree-ocl {\r\n\tbackground-position: -36px -4px;\r\n}\r\n\r\n#updraft_zip_files_jstree .jstree-container-ul > .jstree-closed> .jstree-ocl,\r\n#updraft_more_files_jstree .jstree-container-ul > .jstree-closed> .jstree-ocl {\r\n\tbackground-position: -4px -4px;\r\n}\r\n\r\n#updraft_zip_files_jstree .jstree-container-ul > .jstree-leaf> .jstree-ocl,\r\n#updraft_more_files_jstree .jstree-container-ul > .jstree-leaf> .jstree-ocl {\r\n\tbackground: transparent;\r\n}\r\n\r\n/* zip browser jstree styles */\r\n#updraft_zip_files_container {\r\n\tposition: relative;\r\n\theight: 450px;\r\n\toverflow: none;\r\n}\r\n\r\n#updraft_zip_info_container {\r\n\tposition: relative;\r\n\theight: auto;\r\n\twidth: 100%;\r\n\tborder: 1px dotted;\r\n\tmargin-bottom: 5px;\r\n}\r\n\r\n#updraft_zip_info_container p {\r\n\tmargin: 1px;\r\n\tpadding-left: 10px;\r\n\tfont-size: 14px;\r\n}\r\n\r\n#updraft_zip_download_item {\r\n\tdisplay: none;\r\n\tcolor: #0073AA;\r\n\tpadding-left: 10px;\r\n}\r\n\r\n#updraft_zip_download_notice {\r\n\tpadding-left: 10px;\r\n}\r\n\r\n#updraft_zip_files_jstree_container {\r\n\tposition: relative;\r\n\tborder: 1px dotted;\r\n\theight: 80%;\r\n\twidth: 100%;\r\n\toverflow: auto;\r\n}\r\n\r\n/* More files jstree styles */\r\n#updraft_more_files_container {\r\n\tposition: relative;\r\n\tdisplay: none;\r\n\theight: 300px;\r\n\twidth: 100%;\r\n\tborder: 1px dotted;\r\n\tmargin-bottom: 5px;\r\n}\r\n\r\n#updraft_jstree_buttons {\r\n\tposition: absolute;\r\n\ttop: 0;\r\n\tright: 0;\r\n}\r\n\r\n#updraft_jstree_container {\r\n\theight: 100%;\r\n\twidth: 100%;\r\n\toverflow: auto;\r\n}\r\n\r\n#updraft_more_files_container button {\r\n\theight: 22px;\r\n\tline-height: 20px;\r\n}\r\n\r\n#updraft_jstree_confirm, #updraft_jstree_cancel {\r\n\tdisplay: none;\r\n}\r\n\r\n.updraftplus-morefiles-row-delete {\r\n\tcursor: pointer;\r\n\tcolor: red;\r\n\tfont-size: 23px !important;\r\n}\r\n\r\n.updraftplus-morefiles-row-edit {\r\n\tcursor: pointer;\r\n\tfont-size: 24px !important;\r\n}\r\n\r\n#updraft-wrap .form-table th {\r\n\twidth: 230px;\r\n}\r\n\r\n.updraftplus-remove {\r\n\tbackground-color: #C00000;\r\n\tborder: 1px solid #C00000;\r\n\theight: 22px;\r\n\tpadding: 4px 3px 0 3px;\r\n\tmargin-right: 6px;\r\n}\r\n\r\n.updraft-viewlogdiv form {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n}\r\n\r\n.updraft-viewlogdiv {\r\n\tbackground-color: #FFF;\r\n\tcolor: #000;\r\n\tborder: 1px solid #000;\r\n\theight: 26px;\r\n\tpadding: 0px;\r\n\tmargin: 0 4px 0 0;\r\n\tborder-radius: 3px;\r\n\tfloat: left;\r\n}\r\n\r\n.updraft-viewlogdiv input, .updraft-viewlogdiv a {\r\n\tborder: none;\r\n\tbackground-color: transparent;\r\n\tcolor: #000;\r\n\tmargin: 0px;\r\n\tpadding: 3px 4px;\r\n\tfont-size: 16px;\r\n\tline-height: 26px;\r\n}\r\n\r\n.updraft-viewlogdiv:hover {\r\n\tbackground-color: #000;\r\n\tcolor: #FFF;\r\n\tborder: 1px solid #FFF;\r\n\tcursor: pointer;\r\n}\r\n\r\n.updraft-viewlogdiv input:hover, .updraft-viewlogdiv a:hover {\r\n\tcolor: #FFF;\r\n\tcursor: pointer;\r\n}\r\n\r\n.updraftplus-remove a {\r\n\tcolor: white;\r\n\tpadding: 4px 4px 0px 4px;\r\n}\r\n\r\n.updraftplus-remove:hover {\r\n\tbackground-color: white;\r\n\tborder: 1px solid #C00000;\r\n}\r\n\r\n.updraftplus-remove a:hover {\r\n\tcolor: #C00000;\r\n}\r\n\r\n.drag-drop #drag-drop-area2 {\r\n\tborder: 4px dashed #DDD;\r\n\theight: 200px;\r\n}\r\n\r\n#drag-drop-area2 .drag-drop-inside {\r\n\tmargin: 36px auto 0;\r\n\twidth: 350px;\r\n}\r\n\r\n#filelist, #filelist2 {\r\n\twidth: 100%;\r\n}\r\n\r\n#filelist .file, #filelist2 .file, .ud_downloadstatus .file, #ud_downloadstatus2 .file {\r\n\tpadding: 5px;\r\n\tbackground: #ECECEC;\r\n\tborder: solid 1px #CCC;\r\n\tmargin: 4px 0;\r\n}\r\n\r\nul.updraft_premium_description_list {\r\n\tlist-style: disc inside;\r\n}\r\n\r\nul.updraft_premium_description_list li {\r\n\tdisplay: inline;\r\n}\r\n\r\nul.updraft_premium_description_list li::after {\r\n\tcontent: \" | \";\r\n}\r\n\r\nul.updraft_premium_description_list li.last::after {\r\n\tcontent: \"\";\r\n}\r\n\r\n.updraft_feature_cell {\r\n\tbackground-color: #F7D9C9 !important;\r\n\tpadding: 5px 10px;\r\n}\r\n\r\n.updraft_feat_table, .updraft_feat_th, .updraft_feat_table td {\r\n\tborder: 1px solid black;\r\n\tborder-collapse: collapse;\r\n\tfont-size: 120%;\r\n\tbackground-color: white;\r\n\ttext-align: center;\r\n}\r\n\r\n.updraft_feat_table p {\r\n\tpadding: 0px 10px;\r\n\tmargin: 5px 0px;\r\n\tfont-size: 16px;\r\n}\r\n\r\n.updraft_feat_table h4 {\r\n\tmargin: 5px 0px;\r\n}\r\n\r\n.updraft_feat_table .dashicons {\r\n\twidth: 25px;\r\n\theight: 25px;\r\n\tfont-size: 25px;\r\n\tline-height: 1;\r\n}\r\n\r\n.updraft_feat_table .dashicons-yes, .updraft_feat_table .updraft-yes {\r\n\tcolor: green;\r\n}\r\n\r\n.updraft_feat_table .dashicons-no-alt, .updraft_feat_table .updraft-no {\r\n\tcolor: red;\r\n}\r\n\r\n.updraft_tick_cell {\r\n\ttext-align: center;\r\n}\r\n\r\n.updraft_tick_cell img {\r\n\tmargin: 4px 0;\r\n\theight: 24px;\r\n}\r\n\r\n#filelist .fileprogress, #filelist2 .fileprogress, .ud_downloadstatus .dlfileprogress, #ud_downloadstatus2 .dlfileprogress {\r\n\twidth: 0%;\r\n\tbackground: #F6A828;\r\n\theight: 5px;\r\n}\r\n\r\n.ud_downloadstatus .raw, #ud_downloadstatus2 .raw {\r\n\tmargin-top: 8px;\r\n\tclear: left;\r\n}\r\n\r\n.ud_downloadstatus .file, #ud_downloadstatus2 .file {\r\n\tmargin-top: 8px;\r\n}\r\n\r\ntr.updraftplusmethod h3 {\r\n\tmargin: 0px;\r\n}\r\n\r\n#updraft_retain_db_rules .updraft_retain_rules_delete, #updraft_retain_files_rules .updraft_retain_rules_delete {\r\n\tcursor: pointer;\r\n\tcolor: red;\r\n\tfont-size: 120%;\r\n\tfont-weight: bold;\r\n\tborder: 0px;\r\n\tborder-radius: 3px;\r\n\tpadding: 2px;\r\n\tmargin: 0 6px;\r\n}\r\n\r\n#updraft_retain_db_rules .updraft_retain_rules_delete:hover, #updraft_retain_files_rules .updraft_retain_rules_delete:hover {\r\n\tcursor: pointer;\r\n\tcolor: white;\r\n\tbackground: red;\r\n}\r\n\r\n#updraft_backup_started {\r\n\tmax-width: 800px;\r\n\tfont-size: 140%;\r\n\tline-height: 140%;\r\n\tpadding: 14px;\r\n\tclear: left;\r\n}\r\n\r\n.udp-premium-image {\r\n\tdisplay: none;\r\n}\r\n\r\n@media screen and (min-width: 720px) {\r\n\r\n\t.udp-premium-image {\r\n\t\tdisplay: block;\r\n\t\tfloat: left;\r\n\t\tpadding-right: 5px;\r\n\t}\r\n\r\n}\r\n\r\n/* End stuff already in admin.php */\r\n#plupload-upload-ui2 {\r\n\twidth: 80%;\r\n}\r\n\r\n.backup-restored {\r\n\tpadding: 8px;\r\n}\r\n\r\n.backup-restored span {\r\n\tfont-size: 120%;\r\n}\r\n\r\n.memory-limit {\r\n\tpadding: 8px;\r\n}\r\n\r\n.updraft_list_errors {\r\n\tpadding: 8px;\r\n}\r\n\r\n/*.nav-tab {\r\n\tborder-radius: 20px 20px 0 0;\r\n\tborder-color: grey;\r\n\tborder-width: 2px;\r\n\tmargin-top: 34px;\r\n}\r\n\r\n.nav-tab:hover {\r\n\tborder-bottom: 0;\r\n}\r\n\r\n.nav-tab-active, .nav-tab-active:active {\r\n\tcolor: #df6926;\r\n\tborder-color: #D3D3D3;\r\n\tborder-width: 1px;\r\n\tborder-bottom: 0;\r\n}\r\n\r\n.nav-tab-active:focus {\r\n\tcolor: #df6926;\r\n}*/\r\n\r\n.nav-tab-wrapper {\r\n\tmargin: 14px 0px;\r\n}\r\n\r\n#updraft-poplog-content {\r\n\twhite-space: pre-wrap;\r\n}\r\n\r\n.next-backup {\r\n\tborder: 0px;\r\n\tpadding: 0px;\r\n\tmargin: 0 10px 0 0;\r\n}\r\n\r\n.not-scheduled {\r\n\tvertical-align: top !important;\r\n\tmargin: 0px !important;\r\n\tpadding: 0px !important;\r\n}\r\n\r\n.next-backup .updraft_scheduled {\r\n\t/* width: 124px;*/\r\n\tmargin: 0px;\r\n\tpadding: 2px 4px 2px 0px;\r\n}\r\n\r\n#next-backup-table-inner td {\r\n\tvertical-align: top;\r\n}\r\n\r\n.next-backup .updraft_all-files {\r\n\tcolor: blue;\r\n\tmargin: 0px;\r\n\tpadding: 2px 0px 0px 0px;\r\n}\r\n\r\n.multisite-advert-width {\r\n\twidth: 800px;\r\n}\r\n\r\n.updraft_settings_sectionheading {\r\n\tmargin-top: 6px;\r\n}\r\n\r\n.premium-upgrade-prompt {\r\n\tfont-size: 115%;\r\n}\r\n\r\n.updraft_feat_table {\r\n\tmargin-top: 30px;\r\n}\r\n\r\n.show_admin_restore_in_progress_notice {\r\n\tpadding: 8px;\r\n}\r\n\r\n.show_admin_restore_in_progress_notice .unfinished-restoration {\r\n\tfont-size: 120%;\r\n}\r\n\r\n#backupnow_includefiles_moreoptions, #backupnow_database_moreoptions {\r\n\tmargin: 4px 16px 6px 16px;\r\n\tborder: 1px dotted;\r\n\tpadding: 6px 10px;\r\n}\r\n\r\n#backupnow_database_moreoptions {\r\n\tmax-height: 250px;\r\n\toverflow: auto;\r\n}\r\n\r\n.form-table #updraft_activejobsrow .minimum-height {\r\n\tmin-height: 100px;\r\n}\r\n\r\n#updraft_lastlogmessagerow .last-message {\r\n\tpadding-top: 20px;\r\n\tdisplay: block;\r\n}\r\n\r\n.updraft_simplepie {\r\n\tvertical-align: top;\r\n}\r\n\r\n.download-backups {\r\n\tmargin-top: 8px;\r\n}\r\n\r\n.download-backups .updraft_download_button {\r\n\tmargin-right: 6px;\r\n\tmargin-top: 4px;\r\n}\r\n\r\n.download-backups .choose-components-button {\r\n\tfont-size: 16px;\r\n}\r\n\r\n.download-backups .ud-whitespace-warning {\r\n\tbackground-color: pink;\r\n\tpadding: 8px;\r\n\tmargin: 4px;\r\n\tborder: 1px dotted;\r\n}\r\n\r\n.download-backups .ul {\r\n\tlist-style: none inside;\r\n\tmax-width: 800px;\r\n\tmargin-top: 6px;\r\n\tmargin-bottom: 12px;\r\n}\r\n\r\n#updraft-plupload-modal {\r\n\twidth: 75%;\r\n\tmargin: 16px;\r\n\tmargin-left: 100px;\r\n}\r\n\r\n.download-backups .upload {\r\n\tmax-width: 610px;\r\n}\r\n\r\n.download-backups #plupload-upload-ui {\r\n\twidth: 70%;\r\n}\r\n\r\n.ud_downloadstatus {\r\n\tpadding: 10px;\r\n\tbackground: #F1F1F1;\r\n}\r\n\r\n#ud_massactions {\r\n\tpadding: 14px;\r\n\tposition: fixed;\r\n\tright: 25%;\r\n\ttop: 25%;\r\n\tborder: 2px solid;\r\n\tborder-radius: 4px;\r\n\tbackground: rgb(241, 241, 241);\r\n\tfloat: right;\r\n}\r\n\r\n#ud_massactions .updraftplus-remove {\r\n\tclear: left;\r\n\tfont-size: 16px;\r\n\ttext-align: center;\r\n\tborder-radius: 4px;\r\n\tmargin-top: 4px;\r\n}\r\n\r\n#ud_massactions .updraftplus-remove a {\r\n\ttext-decoration: none;\r\n}\r\n\r\n#ud_massactions .updraft-viewlogdiv {\r\n\tfont-size: 16px;\r\n\ttext-align: center;\r\n\tborder-radius: 4px;\r\n\tmargin-top: 4px;\r\n}\r\n\r\n#ud_massactions .updraft-viewlogdiv a {\r\n\ttext-decoration: none;\r\n\tposition: relative;\r\n\ttop: 3px;\r\n}\r\n\r\n#ud_massactions .updraft-viewlogdiv a {\r\n\ttext-decoration: none;\r\n\tposition: relative;\r\n\ttop: 3px;\r\n}\r\n\r\n#updraft-navtab-backups-content .updraft_existing_backups {\r\n\tmargin-bottom: 12px;\r\n}\r\n\r\n#updraft-message-modal-innards {\r\n\tpadding: 4px;\r\n}\r\n\r\n#updraft-authenticate-modal {\r\n\ttext-align: center;\r\n\tfont-size: 16px !important;\r\n}\r\n\r\n#updraft-authenticate-modal p {\r\n\tfont-size: 16px;\r\n}\r\n\r\n#updraft_delete_form p {\r\n\tmargin-top: 3px;\r\n\tpadding-top: 0;\r\n}\r\n\r\n#updraft_restore_form .cannot-restore {\r\n\tmargin: 8px 0;\r\n}\r\n\r\n#updraft_restorer_dboptions {\r\n\tpadding: 12px;\r\n\tmargin: 8px 0 4px 0;\r\n\tborder: dashed 1px;\r\n}\r\n\r\n#updraft_restorer_dboptions h4 {\r\n\tmargin: 0px 0px 6px 0px;\r\n\tpadding: 0px;\r\n}\r\n\r\n.updraft_debugrow th {\r\n\tvertical-align: top;\r\n\tpadding-top: 6px;\r\n}\r\n\r\n.expertmode p {\r\n\tfont-size: 125%;\r\n}\r\n\r\n.expertmode .call-wp-action {\r\n\twidth: 300px;\r\n\theight: 22px;\r\n}\r\n\r\n.updraftplus-lock-advert {\r\n\tclear: left;\r\n\tmax-width: 600px;\r\n}\r\n\r\n.uncompressed-data {\r\n\tclear: left;\r\n\tmax-width: 600px;\r\n}\r\n\r\n.delete-old-directories {\r\n\tpadding: 8px;\r\n\tpadding-bottom: 12px;\r\n}\r\n\r\n.active-jobs {\r\n\tmin-width: 480px;\r\n\tmin-height: 48px;\r\n\ttext-align: center;\r\n\tmargin-top: 4px;\r\n\tpadding: 8px;\r\n\tborder: 1px solid;\r\n\tfloat: left;\r\n\tclear: left;\r\n}\r\n\r\n.job-id {\r\n\tmin-width: 480px;\r\n\tmargin-top: 4px;\r\n\tpadding: 8px;\r\n\tborder: 1px solid;\r\n\tclear: left;\r\n\tfloat: left;\r\n}\r\n\r\n.next-resumption {\r\n\tfont-weight: bold;\r\n}\r\n\r\n.updraft_percentage {\r\n\tz-index: -1;\r\n\tposition: absolute;\r\n\tleft: 0px;\r\n\ttop: 0px;\r\n\ttext-align: center;\r\n\tbackground-color: #F6A828;\r\n}\r\n\r\n.curstage {\r\n\tborder-radius: 4px;\r\n\tmargin-top: 8px;\r\n\tpadding-top: 4px;\r\n\tborder: 1px solid #AAA;\r\n\twidth: 100%;\r\n\theight: 22px;\r\n\tposition: relative;\r\n\ttext-align: center;\r\n\tfont-style: italic;\r\n}\r\n\r\n.retain-files {\r\n\twidth: 48px;\r\n}\r\n\r\n.backup-interval-description tr td div {\r\n\tmax-width: 670px;\r\n}\r\n\r\n#updraft-manualdecrypt-modal {\r\n\twidth: 85%;\r\n\tmargin: 6px;\r\n\tmargin-left: 100px;\r\n}\r\n\r\n.directory-permissions {\r\n\tfont-size: 110%;\r\n\tfont-weight: bold;\r\n}\r\n\r\n.double-warning {\r\n\tborder: 1px solid;\r\n\tpadding: 6px;\r\n}\r\n\r\n.raw-backup-info {\r\n\tfont-style: italic;\r\n\tfont-weight: bold;\r\n\tfont-size: 120%;\r\n}\r\n\r\n.updraft_existingbackup_date {\r\n\twidth: 22%;\r\n\tmax-width: 140px;\r\n}\r\n\r\n.existing-backups-table {\r\n\tmargin-top: 20px;\r\n\tmargin-left: 20px;\r\n\twidth: 80%;\r\n}\r\n\r\n.tr-bottom-4 {\r\n\tmargin-bottom: 4px;\r\n}\r\n\r\n.form-table .backup-date {\r\n\twidth: 172px;\r\n\tpadding: 0;\r\n\tpadding-left: 15px;\r\n}\r\n\r\n.form-table .backup-data {\r\n\twidth: 426px;\r\n\tpadding: 0;\r\n\tpadding-left: 15px;\r\n}\r\n\r\n.form-table .updraft_backup_actions {\r\n\twidth: 272px;\r\n\tpadding: 0 0 10px 15px;\r\n}\r\n\r\n.existing-date {\r\n\t-webkit-box-sizing: border-box;\r\n\t-moz-box-sizing: border-box;\r\n\tbox-sizing: border-box;\r\n\tmax-width: 140px;\r\n\twidth: 25%;\r\n}\r\n\r\n.line-break-tr {\r\n\theight: 2px;\r\n\tpadding: 1px;\r\n\tmargin: 0px;\r\n}\r\n\r\n.line-break-td {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n}\r\n\r\n.td-line-color {\r\n\theight: 2px;\r\n\tbackground-color: #888;\r\n}\r\n\r\n.raw-backup {\r\n\tmax-width: 140px;\r\n}\r\n\r\n.existing-backups-actions {\r\n\tpadding: 1px;\r\n\tmargin: 0px;\r\n}\r\n\r\n.existing-backups-border {\r\n\theight: 2px;\r\n\tpadding: 1px;\r\n\tmargin: 0px;\r\n}\r\n\r\n.existing-backups-border > td {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n}\r\n\r\n.existing-backups-border > div {\r\n\theight: 2px;\r\n\tbackground-color: #AAA;\r\n}\r\n\r\n.updraft_existing_backup_date {\r\n\tmax-width: 140px;\r\n}\r\n\r\n.restore-button {\r\n\tmargin-right: 6px;\r\n\tfloat: left;\r\n\tclear: none;\r\n}\r\n\r\n.updraftplus-remove {\r\n\tfont-size: 16px;\r\n\ttext-align: center;\r\n\tborder-radius: 4px;\r\n}\r\n\r\n.before-restore-button {\r\n\tpadding: 1px;\r\n\tmargin: 0px;\r\n}\r\n\r\n.table-separator-tr {\r\n\theight: 2px;\r\n\tpadding: 1px;\r\n\tmargin: 0px;\r\n}\r\n\r\n.table-separator-td {\r\n\tmargin: 0px;\r\n\tpadding: 0px;\r\n}\r\n\r\n.end-of-table-div {\r\n\theight: 2px;\r\n\tbackground-color: #AAA;\r\n}\r\n\r\n.last-backup-job {\r\n\tpadding-top: 3% !important;\r\n}\r\n\r\n.line-height-03 {\r\n\tline-height: 0.3 !important;\r\n}\r\n\r\n.line-height-13 {\r\n\tline-height: 1.3 !important;\r\n}\r\n\r\n.line-height-23 {\r\n\tline-height: 2.3 !important;\r\n}\r\n\r\n#updraft_diskspaceused {\r\n\tcolor: #DF6926;\r\n}\r\n\r\n.updraft_premium_description_list {\r\n\ttext-align: left;\r\n}\r\n\r\n#updraft_delete_old_dirs_pagediv {\r\n\tpadding-bottom: 10px;\r\n}\r\n\r\n/*#updraft_lastlogmessagerow > td, #updraft_last_backup > td {\r\n\tpadding: 0;\r\n}*/\r\n\r\n.job-id {\r\n\tmargin: 0 auto;\r\n\twidth: 20%;\r\n}\r\n\r\n.updraft_all-files {\r\n\tcolor: #DF6926;\r\n}\r\n\r\n/* Time + scheduling add-on*/\r\n.fix-time {\r\n\twidth: 70px;\r\n}\r\n\r\n.retain-files {\r\n\twidth: 70px;\r\n}\r\n\r\n.number-input {\r\n\tmin-width: 50px;\r\n\tmax-width: 70px;\r\n}\r\n\r\n.additional-rule-width {\r\n\tmin-width: 60px;\r\n\tmax-width: 70px;\r\n}\r\n\r\n/* Add-ons */\r\n/* Want to fix the WordPress icons so that they fit inline with the text, and don't push everything out of place. */\r\n\r\n.dashicons {\r\n\tline-height: inherit;\r\n\tfont-size: inherit;\r\n}\r\n\r\n.addon-logo-150 {\r\n\tmargin-left: 30px;\r\n\tmargin-top: 33px;\r\n\theight: 125px;\r\n\twidth: 150px;\r\n}\r\n\r\n.margin-bottom-50 {\r\n\tmargin-bottom: 50px;\r\n}\r\n\r\n.premium-container {\r\n\twidth: 80%;\r\n}\r\n\r\n/* Main Header */\r\n\r\n.main-header {\r\n\tbackground-color: #DF6926;\r\n\theight: 200px;\r\n\twidth: 100%;\r\n}\r\n\r\n.button-add-to-cart {\r\n\tcolor: white;\r\n\tborder-color: white;\r\n\tfloat: none;\r\n\tmargin-right: 17px;\r\n}\r\n\r\n.button-add-to-cart:hover, .button-add-to-cart:focus, .button-add-to-cart:active {\r\n\tborder-color: #A0A5AA;\r\n\tcolor: #A0A5AA;\r\n}\r\n\r\n.addon-title {\r\n\tmargin-top: 25px;\r\n}\r\n\r\n.addon-text {\r\n\tmargin-top: 75px;\r\n}\r\n\r\n.image-main-div {\r\n\twidth: 25%;\r\n\tfloat: left;\r\n}\r\n\r\n.text-main-div {\r\n\twidth: 60%;\r\n\tfloat: left;\r\n\ttext-align: center;\r\n\tcolor: white;\r\n\tmargin-top: 16px;\r\n}\r\n\r\n.text-main-div-title {\r\n\tfont-weight: bold !important;\r\n\tcolor: white;\r\n\ttext-align: center;\r\n}\r\n\r\n.text-main-div-paragraph {\r\n\tcolor: white;\r\n}\r\n\r\n/* End main header */\r\n\r\n/* Vault icons */\r\n\r\n.updraftplus-vault-cta {\r\n\twidth: 100%;\r\n\ttext-align: center;\r\n\tmargin-bottom: 50px;\r\n}\r\n\r\n.updraftplus-vault-cta h1 {\r\n\tfont-weight: bold;\r\n}\r\n\r\n.updraftvault-buy {\r\n\twidth: 225px;\r\n\theight: 225px;\r\n\tborder: 2px solid #777;\r\n\tdisplay: inline-table;\r\n\tmargin: 0 auto;\r\n\tmargin-right: 50px;\r\n\tposition: relative;\r\n}\r\n\r\n.updraftplus-vault-cta > .vault-options > .center-vault {\r\n\twidth: 275px;\r\n\theight: 275px;\r\n}\r\n\r\n.updraftplus-vault-cta > .vault-options > .center-vault > a {\r\n\tright: 21%;\r\n\tfont-size: 16px;\r\n\tborder-width: 4px !important;\r\n}\r\n\r\n.updraftplus-vault-cta > .vault-options > .center-vault > p {\r\n\tfont-size: 16px;\r\n}\r\n\r\n.updraftvault-buy .button-purchase {\r\n\tright: 24%;\r\n\tmargin-left: 0;\r\n\tline-height: 1.7em;\r\n}\r\n\r\n.updraftvault-buy hr {\r\n\theight: 2px;\r\n\tbackground-color: #777;\r\n\tmargin-top: 18px;\r\n}\r\n\r\n.right {\r\n\tmargin-right: 0px;\r\n}\r\n\r\n.updraftvault-buy .addon-logo-100 {\r\n\theight: 100px;\r\n\twidth: 125px;\r\n\tmargin-top: 7px;\r\n}\r\n\r\n.updraftvault-buy .addon-logo-large {\r\n\tmargin-top: 7px;\r\n}\r\n\r\n.updraftvault-buy .button-buy-vault {\r\n\tfont-size: 12px;\r\n\tcolor: #DF6926;\r\n\tborder-color: #DF6926;\r\n\tborder-width: 2px !important;\r\n\tposition: absolute;\r\n\tright: 29%;\r\n\tbottom: 2%;\r\n}\r\n\r\n.premium-addon-div .button-purchase {\r\n\tline-height: 1.7em;\r\n}\r\n\r\n.updraftvault-buy .button-buy-vault:hover {\r\n\tborder-color: darkgrey;\r\n\tcolor: darkgrey;\r\n}\r\n\r\n/* End Vault icons */\r\n\r\n/* Premium addons */\r\n\r\n.premium-addons {\r\n\tmargin-top: 80px;\r\n\twidth: 100%;\r\n\tmargin: 0 auto;\r\n\tdisplay: table;\r\n}\r\n\r\n.addon-list {\r\n\t/* margin-left: 32px; */\r\n\tdisplay: table;\r\n\ttext-align: center;\r\n}\r\n\r\n.premium-addons h1 {\r\n\ttext-align: center;\r\n\tfont-weight: bold;\r\n}\r\n\r\n.premium-addons p {\r\n\ttext-align: center;\r\n}\r\n\r\n.premium-addons .premium-addon-div {\r\n\twidth: 200px;\r\n\theight: 250px;\r\n\tborder: 2px solid #777;\r\n\tdisplay: inline-table;\r\n\tmargin: 0 auto;\r\n\tmargin-right: 25px;\r\n\tmargin-top: 25px;\r\n\ttext-align: center;\r\n\tposition: relative;\r\n}\r\n\r\n.premium-addons .premium-addon-div p {\r\n\tmargin-left: 2px;\r\n\tmargin-right: 2px;\r\n}\r\n\r\n.premium-addons .premium-addon-div img {\r\n\twidth: auto;\r\n\theight: 50px;\r\n\tmargin-top: 7px;\r\n}\r\n\r\n.premium-addons .premium-addon-div .hr-alignment {\r\n\tmargin-top: 44px;\r\n}\r\n\r\n.premium-addons .premium-addon-div .dropbox-logo {\r\n\theight: 39px;\r\n\twidth: 150px;\r\n}\r\n\r\n.premium-addons .premium-addon-div .azure-logo, .premium-addons .premium-addon-div .onedrive-logo {\r\n\twidth: 75%;\r\n\theight: 24px;\r\n}\r\n\r\n.button-purchase {\r\n\tfont-size: 12px;\r\n\tcolor: #DF6926;\r\n\tborder-color: #DF6926;\r\n\tborder-width: 2px !important;\r\n\tposition: absolute;\r\n\tright: 25%;\r\n\tbottom: 2%;\r\n}\r\n\r\n.button-purchase:hover {\r\n\tcolor: darkgrey;\r\n\tborder-color: darkgrey;\r\n}\r\n\r\n.premium-addons .premium-addon-div hr {\r\n\theight: 2px;\r\n\tbackground-color: #777;\r\n\tmargin-top: 18px;\r\n}\r\n\r\n.premium-addon-div p {\r\n\tfont-style: italic;\r\n}\r\n\r\n.addon-list > .premium-addon-div > .onedrive-fix,\r\n.addon-list > .premium-addon-div > .azure-logo {\r\n\tmargin-top: 33px;\r\n}\r\n\r\n.addon-list > .premium-addon-div > .dropbox-fix {\r\n\tmargin-top: 18px;\r\n}\r\n\r\n/* End premium addons */\r\n\r\n\r\n/* Forgotton something (that is the name of the div rather than a mental note!) */\r\n\r\n.premium-forgotton-something {\r\n\tmargin-top: 5%;\r\n}\r\n\r\n.premium-forgotton-something h1 {\r\n\ttext-align: center;\r\n\tfont-weight: bold;\r\n}\r\n\r\n.premium-forgotton-something p {\r\n\ttext-align: center;\r\n\tfont-weight: normal;\r\n}\r\n\r\n.premium-forgotton-something .button-faq {\r\n\tcolor: #DF6926;\r\n\tborder-color: #DF6926;\r\n\tmargin: 0 auto;\r\n\tdisplay: table;\r\n}\r\n\r\n.premium-forgotton-something .button-faq:hover {\r\n\tcolor: #777;\r\n\tborder-color: #777;\r\n}\r\n\r\n/* End of forgotton something */\r\n\r\n.updraftplusmethod.updraftvault #vaultlogo {\r\n\tpadding-left: 40px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault_primary_option {\r\n\tfloat: left;\r\n\twidth: 50%;\r\n\ttext-align: center;\r\n\tpadding-bottom: 20px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault_primary_option div {\r\n\tclear: right;\r\n\tpadding-top: 20px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .clear-left {\r\n\tclear: left;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .padding-top-20px {\r\n\tpadding-top: 20px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .padding-top-14px {\r\n\tpadding-top: 14px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_settings_default .button-primary, .updraftplusmethod.updraftvault #updraftvault_settings_showoptions .button-primary {\r\n\tfont-size: 18px !important;\r\n\tpadding-bottom: 20px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_showoptions, .updraftplusmethod.updraftvault #updraftvault_connect {\r\n\tmargin-top: 8px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_settings_connect input {\r\n\tmargin-right: 10px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_email {\r\n\twidth: 280px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_pass {\r\n\twidth: 200px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #vault-is-connected {\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n}\r\n\r\n.updraftplusmethod.updraftvault #updraftvault_settings_default p {\r\n\tclear: left;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault-purchase-option {\r\n\tfloat: left;\r\n\twidth: 33%;\r\n\ttext-align: center;\r\n\tpadding-top: 20px;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault-purchase-option-size {\r\n\tfont-size: 200%;\r\n\tfont-weight: bold;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault-purchase-option-link {\r\n\tclear: both;\r\n\tfont-size: 150%;\r\n}\r\n\r\n.updraftplusmethod.updraftvault .vault-purchase-option-or {\r\n\tclear: both;\r\n\tfont-size: 115%;\r\n\tfont-style: italic;\r\n}\r\n\r\n/* Automation Backup Advert by B */\r\n.autobackup-image {\r\n/* \tdisplay: inline-block; */\r\n/*\tmin-width: 10%;\r\n\tmax-width:25%;*/\r\n/*\tfloat: left;*/\r\n\tclear: left;\r\n\tfloat: left;\r\n\twidth: 110px;\r\n\theight: 110px;\r\n}\r\n\r\n.autobackup-description {\r\n\twidth: 100%;\r\n}\r\n\r\n.advert-description {\r\n\tfloat: left;\r\n\tclear: right;\r\n\tpadding: 4px 10px 8px 10px;\r\n\twidth: 70%;\r\n\tclear: right;\r\n\tvertical-align: top;\r\n}\r\n\r\n.advert-btn {\r\n\tdisplay: inline-block;\r\n\tmin-width: 10%;\r\n\tvertical-align: top;\r\n\tmargin-bottom: 8px;\r\n}\r\n\r\n.advert-btn:first-of-type {\r\n\tmargin-top: 25px;\r\n}\r\n\r\n.advert-btn a {\r\n\tdisplay: block;\r\n\tcursor: pointer;\r\n}\r\n\r\na.btn-get-started {\r\n\tbackground: #FFF;\r\n\tborder: 2px solid #DF6926;\r\n\tborder-radius: 4px;\r\n\tcolor: #DF6926;\r\n\tdisplay: inline-block;\r\n\tmargin-left: 10px !important;\r\n\tmargin-bottom: 7px !important;\r\n\tfont-size: 18px !important;\r\n\tline-height: 20px;\r\n\tmin-height: 28px;\r\n\tpadding: 11px 10px 5px 10px;\r\n\ttext-transform: uppercase;\r\n\ttext-decoration: none;\r\n}\r\n\r\n.circle-dblarrow {\r\n\tborder: 1px solid #DF6926;\r\n\tborder-radius: 100%;\r\n\tdisplay: inline-block;\r\n\tfont-size: 17px;\r\n\tline-height: 17px;\r\n\tmargin-left: 5px;\r\n\twidth: 20px;\r\n\theight: 20px;\r\n\ttext-align: center;\r\n}\r\n\r\n@media screen and (max-width: 782px) {\r\n/*\t.advert-description {\r\n\t\tmin-width: 75%;\r\n\t\tmargin-bottom: 5px;\r\n\t}\r\n\r\n\t.advert-btn {\r\n\t\tmargin-top: 15px;\r\n\t\tmargin-left:86px;\r\n\t\tmin-width: 100%;\r\n\t}*/\r\n}\r\n\r\n/* End Automation Backup Advert by B */\r\n/* New Responsive Pretty Advanced Settings */\r\n.expertmode .advanced_settings_container {\r\n\theight: auto;\r\n\toverflow: hidden;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu {\r\n\tfloat: none;\r\n\tborder-bottom: 1px solid rgb(204, 204, 204);\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_content {\r\n\tpadding-top: 5px;\r\n\tfloat: none;\r\n\twidth: auto;\r\n\toverflow: auto;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_content h3 {\r\n\tmargin-top: 5px !important;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_content .advanced_tools {\r\n\tdisplay: none;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_content .site_info {\r\n\tdisplay: block;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button {\r\n\tdisplay: inline-block;\r\n\tcursor: pointer;\r\n\tpadding: 5px;\r\n\tcolor: #000;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_text {\r\n\tfont-size: 16px;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button:hover {\r\n\tbackground-color: #EAEAEA;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu .active {\r\n\tbackground-color: #3498DB;\r\n\tcolor: #FFF;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_menu .active:hover {\r\n\tbackground-color: #72C5FD;\r\n\tcolor: #FFF;\r\n}\r\n\r\n.expertmode .advanced_settings_container .advanced_settings_content input#import_settings {\r\n\theight: auto !important;\r\n}\r\n\r\ndiv#updraft-wrap a {\r\n\tcursor: pointer !important;\r\n}\r\n\r\n.updraftcentral_wizard_option {\r\n\twidth: 45%;\r\n\tfloat: left;\r\n\ttext-align: center;\r\n}\r\n\r\n.updraftcentral_wizard_option label {\r\n\tmargin-bottom: 8px;\r\n}\r\n\r\n#updraftcentral_keys_table {\r\n\tdisplay: none;\r\n}\r\n\r\n.create_key_container {\r\n\tborder: 1px solid;\r\n\tborder-radius: 4px;\r\n\tpadding: 0 0 6px 6px;\r\n\tmargin-bottom: 8px;\r\n}\r\n\r\n@media screen and (min-width: 670px) {\r\n\r\n\t.expertmode .advanced_settings_container .advanced_settings_menu {\r\n\t\tfloat: left;\r\n\t\twidth: 215px;\r\n\t\tborder-right: 1px solid rgb(204, 204, 204);\r\n\t\tborder-bottom: none;\r\n\t}\r\n\r\n\t.expertmode .advanced_settings_container .advanced_settings_content {\r\n\t\tpadding-left: 10px;\r\n\t\tpadding-top: 0px;\r\n\t}\r\n\r\n\t.expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button {\r\n\t\tdisplay: block;\r\n\t}\r\n\r\n}\r\n"]}
images/addons-images/backblaze.png ADDED
Binary file
images/notices/metaslider_logo.png ADDED
Binary file
includes/Dropbox/API.php DELETED
@@ -1,594 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Dropbox API base class
5
- * @author Ben Tadiar <ben@handcraftedbyben.co.uk>
6
- * @link https://github.com/benthedesigner/dropbox
7
- * @link https://www.dropbox.com/developers
8
- * @link https://status.dropbox.com Dropbox status
9
- * @package Dropbox
10
- */
11
- class UpdraftPlus_Dropbox_API
12
- {
13
- // API Endpoints
14
- const API_URL = 'https://api.dropbox.com/1/';
15
- const API_URL_V2 = 'https://api.dropboxapi.com/2/';
16
- const CONTENT_URL = 'https://api-content.dropbox.com/1/';
17
-
18
- /**
19
- * OAuth consumer object
20
- * @var null|OAuth\Consumer
21
- */
22
- private $OAuth;
23
-
24
- /**
25
- * The root level for file paths
26
- * Either `dropbox` or `sandbox` (preferred)
27
- * @var null|string
28
- */
29
- private $root;
30
-
31
- /**
32
- * Format of the API response
33
- * @var string
34
- */
35
- private $responseFormat = 'php';
36
-
37
- /**
38
- * JSONP callback
39
- * @var string
40
- */
41
- private $callback = 'dropboxCallback';
42
-
43
- /**
44
- * Chunk size used for chunked uploads
45
- * @see \Dropbox\API::chunkedUpload()
46
- */
47
- private $chunkSize = 4194304;
48
-
49
- /**
50
- * Set the OAuth consumer object
51
- * See 'General Notes' at the link below for information on access type
52
- * @link https://www.dropbox.com/developers/reference/api
53
- * @param OAuth\Consumer\ConsumerAbstract $OAuth
54
- * @param string $root Dropbox app access type
55
- */
56
- public function __construct(Dropbox_ConsumerAbstract $OAuth, $root = 'sandbox')
57
- {
58
- $this->OAuth = $OAuth;
59
- $this->setRoot($root);
60
- }
61
-
62
- /**
63
- * Set the root level
64
- * @param mixed $root
65
- * @throws Exception
66
- * @return void
67
- */
68
- public function setRoot($root)
69
- {
70
- if ($root !== 'sandbox' && $root !== 'dropbox') {
71
- throw new Exception("Expected a root of either 'dropbox' or 'sandbox', got '$root'");
72
- } else {
73
- $this->root = $root;
74
- }
75
- }
76
-
77
- /**
78
- * Retrieves information about the user's account
79
- * @return object stdClass
80
- */
81
- public function accountInfo()
82
- {
83
- $response = $this->fetch('POST', self::API_URL, 'account/info');
84
- return $response;
85
- }
86
-
87
- /**
88
- * Uploads a physical file from disk
89
- * Dropbox impose a 150MB limit to files uploaded via the API. If the file
90
- * exceeds this limit or does not exist, an Exception will be thrown
91
- * @param string $file Absolute path to the file to be uploaded
92
- * @param string|bool $filename The destination filename of the uploaded file
93
- * @param string $path Path to upload the file to, relative to root
94
- * @param boolean $overwrite Should the file be overwritten? (Default: true)
95
- * @return object stdClass
96
- */
97
- public function putFile($file, $filename = false, $path = '', $overwrite = true)
98
- {
99
- if (file_exists($file)) {
100
- if (filesize($file) <= 157286400) {
101
- $call = 'files/' . $this->root . '/' . $this->encodePath($path);
102
- // If no filename is provided we'll use the original filename
103
- $filename = (is_string($filename)) ? $filename : basename($file);
104
- $params = array(
105
- 'filename' => $filename,
106
- 'file' => '@' . str_replace('\\', '/', $file) . ';filename=' . $filename,
107
- 'overwrite' => (int) $overwrite,
108
- );
109
- $response = $this->fetch('POST', self::CONTENT_URL, $call, $params);
110
- return $response;
111
- }
112
- throw new Exception('File exceeds 150MB upload limit');
113
- }
114
-
115
- // Throw an Exception if the file does not exist
116
- throw new Exception('Local file ' . $file . ' does not exist');
117
- }
118
-
119
- /**
120
- * Uploads file data from a stream
121
- * Note: This function is experimental and requires further testing
122
- * @todo Add filesize check
123
- * @param resource $stream A readable stream created using fopen()
124
- * @param string $filename The destination filename, including path
125
- * @param boolean $overwrite Should the file be overwritten? (Default: true)
126
- * @return array
127
- */
128
- public function putStream($stream, $filename, $overwrite = true)
129
- {
130
- $this->OAuth->setInFile($stream);
131
- $path = $this->encodePath($filename);
132
- $call = 'files_put/' . $this->root . '/' . $path;
133
- $params = array('overwrite' => (int) $overwrite);
134
- $response = $this->fetch('PUT', self::CONTENT_URL, $call, $params);
135
- return $response;
136
- }
137
-
138
- /**
139
- * Uploads large files to Dropbox in mulitple chunks
140
- * @param string $file Absolute path to the file to be uploaded
141
- * @param string|bool $filename The destination filename of the uploaded file
142
- * @param string $path Path to upload the file to, relative to root
143
- * @param boolean $overwrite Should the file be overwritten? (Default: true)
144
- * @param integer $offset position to seek to when opening the file
145
- * @param string $uploadID existing upload_id to resume an upload
146
- * @param string|array function to call back to upon each chunk
147
- * @return stdClass
148
- */
149
- public function chunkedUpload($file, $filename = false, $path = '', $overwrite = true, $offset = 0, $uploadID = null, $callback = null)
150
- {
151
- if (file_exists($file)) {
152
- if ($handle = @fopen($file, 'r')) {
153
- // Set initial upload ID and offset
154
- if ($offset > 0) {
155
- fseek($handle, $offset);
156
- }
157
-
158
- // Read from the file handle until EOF, uploading each chunk
159
- while ($data = fread($handle, $this->chunkSize)) {
160
- // Open a temporary file handle and write a chunk of data to it
161
- $chunkHandle = fopen('php://temp', 'rw');
162
- fwrite($chunkHandle, $data);
163
-
164
- // Set the file, request parameters and send the request
165
- $this->OAuth->setInFile($chunkHandle);
166
- $params = array('upload_id' => $uploadID, 'offset' => $offset);
167
- $response = $this->fetch('PUT', self::CONTENT_URL, 'chunked_upload', $params);
168
-
169
- // On subsequent chunks, use the upload ID returned by the previous request
170
- if (isset($response['body']->upload_id)) {
171
- $uploadID = $response['body']->upload_id;
172
- }
173
-
174
- if (isset($response['body']->offset)) {
175
- $offset = $response['body']->offset;
176
- if ($callback) {
177
- call_user_func($callback, $offset, $uploadID, $file);
178
- }
179
- }
180
-
181
- // Close the file handle for this chunk
182
- fclose($chunkHandle);
183
- }
184
-
185
- // Complete the chunked upload
186
- $filename = (is_string($filename)) ? $filename : basename($file);
187
- $call = 'commit_chunked_upload/' . $this->root . '/' . $this->encodePath($path . $filename);
188
- $params = array('overwrite' => (int) $overwrite, 'upload_id' => $uploadID);
189
- $response = $this->fetch('POST', self::CONTENT_URL, $call, $params);
190
- return $response;
191
- } else {
192
- throw new Exception('Could not open ' . $file . ' for reading');
193
- }
194
- }
195
-
196
- // Throw an Exception if the file does not exist
197
- throw new Exception('Local file ' . $file . ' does not exist');
198
- }
199
-
200
- /**
201
- * Downloads a file
202
- * Returns the base filename, raw file data and mime type returned by Fileinfo
203
- * @param string $file Path to file, relative to root, including path
204
- * @param string $outFile Filename to write the downloaded file to
205
- * @param string $revision The revision of the file to retrieve
206
- * @param boolean $allow_resume - append to the file if it already exists
207
- * @return array
208
- */
209
- public function getFile($file, $outFile = false, $revision = null, $allow_resume = false)
210
- {
211
- // Only allow php response format for this call
212
- if ($this->responseFormat !== 'php') {
213
- throw new Exception('This method only supports the `php` response format');
214
- }
215
-
216
- $params = array('rev' => $revision);
217
-
218
- $handle = null;
219
- if ($outFile !== false) {
220
- // Create a file handle if $outFile is specified
221
- if ($allow_resume && file_exists($outFile)) {
222
- if (!$handle = fopen($outFile, 'a')) {
223
- throw new Exception("Unable to open file handle for $outFile");
224
- } else {
225
- $this->OAuth->setOutFile($handle);
226
- $params['headers'] = array('Range: bytes='.filesize($outFile).'-');
227
- }
228
- }
229
- elseif (!$handle = fopen($outFile, 'w')) {
230
- throw new Exception("Unable to open file handle for $outFile");
231
- } else {
232
- $this->OAuth->setOutFile($handle);
233
- }
234
- }
235
-
236
- $file = $this->encodePath($file);
237
- $call = 'files/' . $this->root . '/' . $file;
238
- $response = $this->fetch('GET', self::CONTENT_URL, $call, $params);
239
-
240
- // Close the file handle if one was opened
241
- if ($handle) fclose($handle);
242
-
243
- return array(
244
- 'name' => ($outFile) ? $outFile : basename($file),
245
- 'mime' => $this->getMimeType(($outFile) ? $outFile : $response['body'], $outFile),
246
- 'meta' => json_decode($response['headers']['x-dropbox-metadata']),
247
- 'data' => $response['body'],
248
- );
249
- }
250
-
251
- /**
252
- * Retrieves file and folder metadata
253
- * @param string $path The path to the file/folder, relative to root
254
- * @param string $rev Return metadata for a specific revision (Default: latest rev)
255
- * @param int $limit Maximum number of listings to return
256
- * @param string $hash Metadata hash to compare against
257
- * @param bool $list Return contents field with response
258
- * @param bool $deleted Include files/folders that have been deleted
259
- * @return object stdClass
260
- */
261
- public function metaData($path = null, $rev = null, $limit = 10000, $hash = false, $list = true, $deleted = false)
262
- {
263
- $call = 'metadata/' . $this->root . '/' . $this->encodePath($path);
264
- $params = array(
265
- 'file_limit' => ($limit < 1) ? 1 : (($limit > 10000) ? 10000 : (int) $limit),
266
- 'hash' => (is_string($hash)) ? $hash : 0,
267
- 'list' => (int) $list,
268
- 'include_deleted' => (int) $deleted,
269
- 'rev' => (is_string($rev)) ? $rev : null,
270
- );
271
- $response = $this->fetch('POST', self::API_URL, $call, $params);
272
- return $response;
273
- }
274
-
275
- /**
276
- * Return "delta entries", intructing you how to update
277
- * your application state to match the server's state
278
- * Important: This method does not make changes to the application state
279
- * @param null|string $cursor Used to keep track of your current state
280
- * @return array Array of delta entries
281
- */
282
- public function delta($cursor = null)
283
- {
284
- $call = 'delta';
285
- $params = array('cursor' => $cursor);
286
- $response = $this->fetch('POST', self::API_URL, $call, $params);
287
- return $response;
288
- }
289
-
290
- /**
291
- * Obtains metadata for the previous revisions of a file
292
- * @param string Path to the file, relative to root
293
- * @param integer Number of revisions to return (1-1000)
294
- * @return array
295
- */
296
- public function revisions($file, $limit = 10)
297
- {
298
- $call = 'revisions/' . $this->root . '/' . $this->encodePath($file);
299
- $params = array(
300
- 'rev_limit' => ($limit < 1) ? 1 : (($limit > 1000) ? 1000 : (int) $limit),
301
- );
302
- $response = $this->fetch('GET', self::API_URL, $call, $params);
303
- return $response;
304
- }
305
-
306
- /**
307
- * Restores a file path to a previous revision
308
- * @param string $file Path to the file, relative to root
309
- * @param string $revision The revision of the file to restore
310
- * @return object stdClass
311
- */
312
- public function restore($file, $revision)
313
- {
314
- $call = 'restore/' . $this->root . '/' . $this->encodePath($file);
315
- $params = array('rev' => $revision);
316
- $response = $this->fetch('POST', self::API_URL, $call, $params);
317
- return $response;
318
- }
319
-
320
- /**
321
- * Returns metadata for all files and folders that match the search query
322
- * @param mixed $query The search string. Must be at least 3 characters long
323
- * @param string $path The path to the folder you want to search in
324
- * @param integer $limit Maximum number of results to return (1-1000)
325
- * @param boolean $deleted Include deleted files/folders in the search
326
- * @return array
327
- */
328
- public function search($query, $path = '', $limit = 1000, $deleted = false)
329
- {
330
- $call = 'search/' . $this->root . '/' . $this->encodePath($path);
331
- $params = array(
332
- 'query' => $query,
333
- 'file_limit' => ($limit < 1) ? 1 : (($limit > 1000) ? 1000 : (int) $limit),
334
- 'include_deleted' => (int) $deleted,
335
- );
336
- $response = $this->fetch('GET', self::API_URL, $call, $params);
337
- return $response;
338
- }
339
-
340
- /**
341
- * Creates and returns a shareable link to files or folders
342
- * The link returned is for a preview page from which the user an choose to
343
- * download the file if they wish. For direct download links, see media().
344
- * @param string $path The path to the file/folder you want a sharable link to
345
- * @return object stdClass
346
- */
347
- public function shares($path, $shortUrl = true)
348
- {
349
- $call = 'shares/' . $this->root . '/' .$this->encodePath($path);
350
- $params = array('short_url' => ($shortUrl) ? 1 : 0);
351
- $response = $this->fetch('POST', self::API_URL, $call, $params);
352
- return $response;
353
- }
354
-
355
- /**
356
- * Returns a link directly to a file
357
- * @param string $path The path to the media file you want a direct link to
358
- * @return object stdClass
359
- */
360
- public function media($path)
361
- {
362
- $call = 'media/' . $this->root . '/' . $this->encodePath($path);
363
- $response = $this->fetch('POST', self::API_URL, $call);
364
- return $response;
365
- }
366
-
367
- /**
368
- * Gets a thumbnail for an image
369
- * @param string $file The path to the image you wish to thumbnail
370
- * @param string $format The thumbnail format, either JPEG or PNG
371
- * @param string $size The size of the thumbnail
372
- * @return array
373
- */
374
- public function thumbnails($file, $format = 'JPEG', $size = 'small')
375
- {
376
- // Only allow php response format for this call
377
- if ($this->responseFormat !== 'php') {
378
- throw new Exception('This method only supports the `php` response format');
379
- }
380
-
381
- $format = strtoupper($format);
382
- // If $format is not 'PNG', default to 'JPEG'
383
- if ($format != 'PNG') $format = 'JPEG';
384
-
385
- $size = strtolower($size);
386
- $sizes = array('s', 'm', 'l', 'xl', 'small', 'medium', 'large');
387
- // If $size is not valid, default to 'small'
388
- if (!in_array($size, $sizes)) $size = 'small';
389
-
390
- $call = 'thumbnails/' . $this->root . '/' . $this->encodePath($file);
391
- $params = array('format' => $format, 'size' => $size);
392
- $response = $this->fetch('GET', self::CONTENT_URL, $call, $params);
393
-
394
- return array(
395
- 'name' => basename($file),
396
- 'mime' => $this->getMimeType($response['body']),
397
- 'meta' => json_decode($response['headers']['x-dropbox-metadata']),
398
- 'data' => $response['body'],
399
- );
400
- }
401
-
402
- /**
403
- * Creates and returns a copy_ref to a file
404
- * This reference string can be used to copy that file to another user's
405
- * Dropbox by passing it in as the from_copy_ref parameter on /fileops/copy
406
- * @param $path File for which ref should be created, relative to root
407
- * @return array
408
- */
409
- public function copyRef($path)
410
- {
411
- $call = 'copy_ref/' . $this->root . '/' . $this->encodePath($path);
412
- $response = $this->fetch('GET', self::API_URL, $call);
413
- return $response;
414
- }
415
-
416
- /**
417
- * Copies a file or folder to a new location
418
- * @param string $from File or folder to be copied, relative to root
419
- * @param string $to Destination path, relative to root
420
- * @param null|string $fromCopyRef Must be used instead of the from_path
421
- * @return object stdClass
422
- */
423
- public function copy($from, $to, $fromCopyRef = null)
424
- {
425
- $call = 'fileops/copy';
426
- $params = array(
427
- 'root' => $this->root,
428
- 'from_path' => $this->normalisePath($from),
429
- 'to_path' => $this->normalisePath($to),
430
- );
431
-
432
- if ($fromCopyRef) {
433
- $params['from_path'] = null;
434
- $params['from_copy_ref'] = $fromCopyRef;
435
- }
436
-
437
- $response = $this->fetch('POST', self::API_URL, $call, $params);
438
- return $response;
439
- }
440
-
441
- /**
442
- * Creates a folder
443
- * @param string New folder to create relative to root
444
- * @return object stdClass
445
- */
446
- public function create($path)
447
- {
448
- $call = 'fileops/create_folder';
449
- $params = array('root' => $this->root, 'path' => $this->normalisePath($path));
450
- $response = $this->fetch('POST', self::API_URL, $call, $params);
451
- return $response;
452
- }
453
-
454
- /**
455
- * Deletes a file or folder
456
- * @param string $path The path to the file or folder to be deleted
457
- * @return object stdClass
458
- */
459
- public function delete($path)
460
- {
461
- $call = 'fileops/delete';
462
- $params = array('root' => $this->root, 'path' => $this->normalisePath($path));
463
- $response = $this->fetch('POST', self::API_URL, $call, $params);
464
- return $response;
465
- }
466
-
467
- /**
468
- * Moves a file or folder to a new location
469
- * @param string $from File or folder to be moved, relative to root
470
- * @param string $to Destination path, relative to root
471
- * @return object stdClass
472
- */
473
- public function move($from, $to)
474
- {
475
- $call = 'fileops/move';
476
- $params = array(
477
- 'root' => $this->root,
478
- 'from_path' => $this->normalisePath($from),
479
- 'to_path' => $this->normalisePath($to),
480
- );
481
- $response = $this->fetch('POST', self::API_URL, $call, $params);
482
- return $response;
483
- }
484
-
485
- /**
486
- * Intermediate fetch function
487
- * @param string $method The HTTP method
488
- * @param string $url The API endpoint
489
- * @param string $call The API method to call
490
- * @param array $params Additional parameters
491
- * @return mixed
492
- */
493
- private function fetch($method, $url, $call, array $params = array())
494
- {
495
- // Make the API call via the consumer
496
- $response = $this->OAuth->fetch($method, $url, $call, $params);
497
-
498
- // Format the response and return
499
- switch ($this->responseFormat) {
500
- case 'json':
501
- return json_encode($response);
502
- case 'jsonp':
503
- $response = json_encode($response);
504
- return $this->callback . '(' . $response . ')';
505
- default:
506
- return $response;
507
- }
508
- }
509
-
510
- /**
511
- * Set the API response format
512
- * @param string $format One of php, json or jsonp
513
- * @return void
514
- */
515
- public function setResponseFormat($format)
516
- {
517
- $format = strtolower($format);
518
- if (!in_array($format, array('php', 'json', 'jsonp'))) {
519
- throw new Exception("Expected a format of php, json or jsonp, got '$format'");
520
- } else {
521
- $this->responseFormat = $format;
522
- }
523
- }
524
-
525
- /**
526
- * Set the chunk size for chunked uploads
527
- * If $chunkSize is empty, set to 4194304 bytes (4 MB)
528
- * @see \Dropbox\API\chunkedUpload()
529
- */
530
- public function setChunkSize($chunkSize = 4194304)
531
- {
532
- if (!is_int($chunkSize)) {
533
- throw new Exception('Expecting chunk size to be an integer, got ' . gettype($chunkSize));
534
- } elseif ($chunkSize > 157286400) {
535
- throw new Exception('Chunk size must not exceed 157286400 bytes, got ' . $chunkSize);
536
- } else {
537
- $this->chunkSize = $chunkSize;
538
- }
539
- }
540
-
541
- /**
542
- * Set the JSONP callback function
543
- * @param string $function
544
- * @return void
545
- */
546
- public function setCallback($function)
547
- {
548
- $this->callback = $function;
549
- }
550
-
551
- /**
552
- * Get the mime type of downloaded file
553
- * If the Fileinfo extension is not loaded, return false
554
- * @param string $data File contents as a string or filename
555
- * @param string $isFilename Is $data a filename?
556
- * @return boolean|string Mime type and encoding of the file
557
- */
558
- private function getMimeType($data, $isFilename = false)
559
- {
560
- if (extension_loaded('fileinfo')) {
561
- $finfo = new finfo(FILEINFO_MIME);
562
- if ($isFilename !== false) {
563
- return $finfo->file($data);
564
- }
565
- return $finfo->buffer($data);
566
- }
567
- return false;
568
- }
569
-
570
- /**
571
- * Trim the path of forward slashes and replace
572
- * consecutive forward slashes with a single slash
573
- * @param string $path The path to normalise
574
- * @return string
575
- */
576
- private function normalisePath($path)
577
- {
578
- $path = preg_replace('#/+#', '/', trim($path, '/'));
579
- return $path;
580
- }
581
-
582
- /**
583
- * Encode the path, then replace encoded slashes
584
- * with literal forward slash characters
585
- * @param string $path The path to encode
586
- * @return string
587
- */
588
- private function encodePath($path)
589
- {
590
- $path = $this->normalisePath($path);
591
- $path = str_replace('%2F', '/', rawurlencode($path));
592
- return $path;
593
- }
594
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/Dropbox/Exception.php DELETED
@@ -1,28 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Dropbox Exception class
5
- * @author Ben Tadiar <ben@handcraftedbyben.co.uk>
6
- * @link https://github.com/benthedesigner/dropbox
7
- * @package Dropbox
8
- */
9
- class Dropbox_Exception extends Exception {
10
- }
11
-
12
- class Dropbox_BadRequestException extends Exception {
13
- }
14
-
15
- class Dropbox_CurlException extends Exception {
16
- }
17
-
18
- class Dropbox_NotAcceptableException extends Exception {
19
- }
20
-
21
- class Dropbox_NotFoundException extends Exception {
22
- }
23
-
24
- class Dropbox_NotModifiedException extends Exception {
25
- }
26
-
27
- class Dropbox_UnsupportedMediaTypeException extends Exception {
28
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/Dropbox/OAuth/Consumer/ConsumerAbstract.php DELETED
@@ -1,433 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Abstract OAuth consumer
5
- * @author Ben Tadiar <ben@handcraftedbyben.co.uk>
6
- * @link https://github.com/benthedesigner/dropbox
7
- * @package Dropbox\OAuth
8
- * @subpackage Consumer
9
- */
10
-
11
- abstract class Dropbox_ConsumerAbstract
12
- {
13
- // Dropbox web endpoint
14
- const WEB_URL = 'https://www.dropbox.com/1/';
15
-
16
- // OAuth flow methods
17
- const AUTHORISE_METHOD = 'oauth2/authorize';
18
- const DEAUTHORISE_METHOD = 'disable_access_token';
19
- const ACCESS_TOKEN_METHOD = 'oauth2/token';
20
- const OAUTH_UPGRADE = 'oauth2/token_from_oauth1';
21
-
22
- /**
23
- * Signature method, either PLAINTEXT or HMAC-SHA1
24
- * @var string
25
- */
26
- private $sigMethod = 'PLAINTEXT';
27
-
28
- /**
29
- * Output file handle
30
- * @var null|resource
31
- */
32
- protected $outFile = null;
33
-
34
- /**
35
- * Input file handle
36
- * @var null|resource
37
- */
38
- protected $inFile = null;
39
-
40
- /**
41
- * Authenticate using 3-legged OAuth flow, firstly
42
- * checking we don't already have tokens to use
43
- * @return void
44
- */
45
- protected function authenticate()
46
- {
47
- global $updraftplus;
48
-
49
- $access_token = $this->storage->get('access_token');
50
- //Check if the new token type is set if not they need to be upgraded to OAuth2
51
- if (!empty($access_token) && isset($access_token->oauth_token) && !isset($access_token->token_type)) {
52
- $updraftplus->log('OAuth v1 token found: upgrading to v2');
53
- $this->upgradeOAuth();
54
- $updraftplus->log('OAuth token upgrade successful');
55
- }
56
-
57
- if (empty($access_token) || !isset($access_token->oauth_token)) {
58
- try {
59
- $this->getAccessToken();
60
- } catch(Exception $e) {
61
- $excep_class = get_class($e);
62
- // 04-Sep-2015 - Dropbox started throwing a 400, which caused a Dropbox_BadRequestException which previously wasn't being caught
63
- if ('Dropbox_BadRequestException' == $excep_class || 'Dropbox_Exception' == $excep_class) {
64
- global $updraftplus;
65
- $updraftplus->log($e->getMessage().' - need to reauthenticate this site with Dropbox (if this fails, then you can also try wiping your settings from the Expert Settings section)');
66
- //$this->getRequestToken();
67
- $this->authorise();
68
- } else {
69
- throw $e;
70
- }
71
- }
72
- }
73
- }
74
-
75
- /**
76
- * Upgrade the user's OAuth1 token to a OAuth2 token
77
- * @return void
78
- */
79
- private function upgradeOAuth()
80
- {
81
- $url = UpdraftPlus_Dropbox_API::API_URL . self::OAUTH_UPGRADE;
82
- $response = $this->fetch('POST', $url, '');
83
- $token = new stdClass();
84
- /*
85
- oauth token secret and oauth token were needed by oauth1
86
- these are replaced in oauth2 with an access token
87
- currently they are still there just in case a method somewhere is expecting them to both be set
88
- as far as I can tell only the oauth token is used
89
- after more testing token secret can be removed.
90
- */
91
-
92
- $token->oauth_token_secret = $response['body']->access_token;
93
- $token->oauth_token = $response['body']->access_token;
94
- $token->token_type = $response['body']->token_type;
95
- $this->storage->set($token, 'access_token');
96
- $this->storage->set('true','upgraded');
97
- $this->storage->do_unset('request_token');
98
- }
99
-
100
- /**
101
- * Obtain user authorisation
102
- * The user will be redirected to Dropbox' web endpoint
103
- * @link http://tools.ietf.org/html/rfc5849#section-2.2
104
- * @return void
105
- */
106
- private function authorise()
107
- {
108
- // Only redirect if not using CLI
109
- if (PHP_SAPI !== 'cli' && (!defined('DOING_CRON') || !DOING_CRON) && (!defined('DOING_AJAX') || !DOING_AJAX)) {
110
- $url = $this->getAuthoriseUrl();
111
- if (!headers_sent()) {
112
- header('Location: ' . $url);
113
- exit;
114
- } else {
115
- throw new Dropbox_Exception(sprintf(__('The %s authentication could not go ahead, because something else on your site is breaking it. Try disabling your other plugins and switching to a default theme. (Specifically, you are looking for the component that sends output (most likely PHP warnings/errors) before the page begins. Turning off any debugging settings may also help).', 'updraftplus'), 'Dropbox'));
116
- }
117
- ?><?php
118
- return false;
119
- }
120
- global $updraftplus;
121
- $updraftplus->log('Dropbox reauthorisation needed; but we are running from cron, AJAX or the CLI, so this is not possible');
122
- $this->storage->do_unset('access_token');
123
- throw new Dropbox_Exception(sprintf(__('You need to re-authenticate with %s, as your existing credentials are not working.', 'updraftplus'), 'Dropbox'));
124
- #$updraftplus->log(sprintf(__('You need to re-authenticate with %s, as your existing credentials are not working.', 'updraftplus'), 'Dropbox'), 'error');
125
- return false;
126
- }
127
-
128
- /**
129
- * Build the user authorisation URL
130
- * @return string
131
- */
132
- public function getAuthoriseUrl()
133
- {
134
- /*
135
- Generate a random key to be passed to Dropbox and stored in session to be checked to prevent CSRF
136
- Uses OpenSSL or Mcrypt or defaults to pure PHP implementaion if neither are available.
137
- */
138
-
139
- global $updraftplus;
140
- if (!function_exists('crypt_random_string')) $updraftplus->ensure_phpseclib('Crypt_Random', 'Crypt/Random');
141
-
142
- $CSRF = base64_encode(crypt_random_string(16));
143
- $this->storage->set($CSRF,'CSRF');
144
- // Prepare request parameters
145
- /*
146
- For OAuth v2 Dropbox needs to use a authorisation url that matches one that is set inside the
147
- Dropbox developer console. In order to check this it needs the client ID for the OAuth v2 app
148
- This will use the default one unless the user is using their own Dropbox App
149
-
150
- For users that use their own Dropbox App there is also no need to provide the callbackhome as
151
- part of the CSRF as there is no need to go to auth.updraftplus.com also the redirect uri can
152
- then be set to the home as default
153
-
154
- Check if the key has dropbox: if so then remove it to stop the request from being invalid
155
- */
156
- $appkey = $this->storage->get('appkey');
157
-
158
- if (!empty($appkey) && 'dropbox:' == substr($appkey, 0, 8)) {
159
- $key = substr($appkey, 8);
160
- } else if (!empty($appkey)) {
161
- $key = $appkey;
162
- }
163
-
164
- $params = array(
165
- 'client_id' => empty($key) ? $this->oauth2_id : $key,
166
- 'response_type' => 'code',
167
- 'redirect_uri' => empty($key) ? $this->callback : $this->callbackhome,
168
- 'state' => empty($key) ? $CSRF.$this->callbackhome : $CSRF,
169
- );
170
-
171
- // Build the URL and redirect the user
172
- $query = '?' . http_build_query($params, '', '&');
173
- $url = self::WEB_URL . self::AUTHORISE_METHOD . $query;
174
- return $url;
175
- }
176
-
177
- protected function deauthenticate()
178
- {
179
- $url = UpdraftPlus_Dropbox_API::API_URL . self::DEAUTHORISE_METHOD;
180
- $response = $this->fetch('POST', $url, '');
181
- $this->storage->delete();
182
- }
183
-
184
- /**
185
- * Acquire an access token
186
- * Tokens acquired at this point should be stored to
187
- * prevent having to request new tokens for each API call
188
- * @link http://tools.ietf.org/html/rfc5849#section-2.3
189
- */
190
- public function getAccessToken()
191
- {
192
-
193
- // If this is non-empty, then we just received a code. It is stored in 'code' - our next job is to put it into the proper place.
194
- $code = $this->storage->get('code');
195
- /*
196
- Checks to see if the user is using their own Dropbox App if so then they need to get
197
- a request token. If they are using our App then we just need to save these details
198
- */
199
- if (!empty($code)){
200
- $appkey = $this->storage->get('appkey');
201
- if (!empty($appkey)){
202
- // Get the signed request URL
203
- $url = UpdraftPlus_Dropbox_API::API_URL . self::ACCESS_TOKEN_METHOD;
204
- $params = array(
205
- 'code' => $code,
206
- 'grant_type' => 'authorization_code',
207
- 'redirect_uri' => $this->callbackhome,
208
- 'client_id' => $this->consumerKey,
209
- 'client_secret' => $this->consumerSecret,
210
- );
211
- $response = $this->fetch('POST', $url, '' , $params);
212
-
213
- $code = json_decode(json_encode($response['body']),true);
214
-
215
- } else {
216
- $code = base64_decode($code);
217
- $code = json_decode($code, true);
218
- }
219
-
220
- /*
221
- Again oauth token secret and oauth token were needed by oauth1
222
- these are replaced in oauth2 with an access token
223
- currently they are still there just in case a method somewhere is expecting them to both be set
224
- as far as I can tell only the oauth token is used
225
- after more testing token secret can be removed.
226
- */
227
-
228
- $token = new stdClass();
229
- $token->oauth_token_secret = $code['access_token'];
230
- $token->oauth_token = $code['access_token'];
231
- $token->account_id = $code['account_id'];
232
- $token->token_type = $code['token_type'];
233
- $token->uid = $code['uid'];
234
- $this->storage->set($token, 'access_token');
235
- $this->storage->do_unset('upgraded');
236
-
237
- //reset code
238
- $this->storage->do_unset('code');
239
- } else {
240
- throw new Dropbox_BadRequestException("No Dropbox Code found, will try to get one now", 400);
241
- }
242
- }
243
-
244
- /**
245
- * Get the request/access token
246
- * This will return the access/request token depending on
247
- * which stage we are at in the OAuth flow, or a dummy object
248
- * if we have not yet started the authentication process
249
- * @return object stdClass
250
- */
251
- private function getToken()
252
- {
253
- if (!$token = $this->storage->get('access_token')) {
254
- if (!$token = $this->storage->get('request_token')) {
255
- $token = new stdClass();
256
- $token->oauth_token = null;
257
- $token->oauth_token_secret = null;
258
- }
259
- }
260
- return $token;
261
- }
262
-
263
- /**
264
- * Generate signed request URL
265
- * See inline comments for description
266
- * @link http://tools.ietf.org/html/rfc5849#section-3.4
267
- * @param string $method HTTP request method
268
- * @param string $url API endpoint to send the request to
269
- * @param string $call API call to send
270
- * @param array $additional Additional parameters as an associative array
271
- * @return array
272
- */
273
- protected function getSignedRequest($method, $url, $call, array $additional = array())
274
- {
275
- // Get the request/access token
276
- $token = $this->getToken();
277
- // Prepare the standard request parameters differnt for OAuth1 and OAuth2, we still need OAuth1 to make the request to the upgrade token endpoint
278
- if (isset($token->token_type)) {
279
- $params = array(
280
- 'access_token' => $token->oauth_token,
281
- );
282
- } else {
283
- // Generate a random string for the request
284
- $nonce = md5(microtime(true) . uniqid('', true));
285
- $params = array(
286
- 'oauth_consumer_key' => $this->consumerKey,
287
- 'oauth_token' => $token->oauth_token,
288
- 'oauth_signature_method' => $this->sigMethod,
289
- 'oauth_version' => '1.0',
290
- // Generate nonce and timestamp if signature method is HMAC-SHA1
291
- 'oauth_timestamp' => ($this->sigMethod == 'HMAC-SHA1') ? time() : null,
292
- 'oauth_nonce' => ($this->sigMethod == 'HMAC-SHA1') ? $nonce : null,
293
- );
294
- }
295
-
296
- // Merge with the additional request parameters
297
- $params = array_merge($params, $additional);
298
- ksort($params);
299
-
300
- // URL encode each parameter to RFC3986 for use in the base string
301
- $encoded = array();
302
- foreach($params as $param => $value) {
303
- if ($value !== null) {
304
- // If the value is a file upload (prefixed with @), replace it with
305
- // the destination filename, the file path will be sent in POSTFIELDS
306
- if (isset($value[0]) && $value[0] === '@') $value = $params['filename'];
307
- # Prevent spurious PHP warning by only doing non-arrays
308
- if (!is_array($value)) $encoded[] = $this->encode($param) . '=' . $this->encode($value);
309
- } else {
310
- unset($params[$param]);
311
- }
312
- }
313
-
314
- // Build the first part of the string
315
- $base = $method . '&' . $this->encode($url . $call) . '&';
316
-
317
- // Re-encode the encoded parameter string and append to $base
318
- $base .= $this->encode(implode('&', $encoded));
319
-
320
- // Concatenate the secrets with an ampersand
321
- $key = $this->consumerSecret . '&' . $token->oauth_token_secret;
322
-
323
- // Get the signature string based on signature method
324
- $signature = $this->getSignature($base, $key);
325
- $params['oauth_signature'] = $signature;
326
-
327
- // Build the signed request URL
328
- $query = '?' . http_build_query($params, '', '&');
329
-
330
- return array(
331
- 'url' => $url . $call . $query,
332
- 'postfields' => $params,
333
- );
334
- }
335
-
336
- /**
337
- * Generate the oauth_signature for a request
338
- * @param string $base Signature base string, used by HMAC-SHA1
339
- * @param string $key Concatenated consumer and token secrets
340
- */
341
- private function getSignature($base, $key)
342
- {
343
- switch ($this->sigMethod) {
344
- case 'PLAINTEXT':
345
- $signature = $key;
346
- break;
347
- case 'HMAC-SHA1':
348
- $signature = base64_encode(hash_hmac('sha1', $base, $key, true));
349
- break;
350
- }
351
-
352
- return $signature;
353
- }
354
-
355
- /**
356
- * Set the OAuth signature method
357
- * @param string $method Either PLAINTEXT or HMAC-SHA1
358
- * @return void
359
- */
360
- public function setSignatureMethod($method)
361
- {
362
- $method = strtoupper($method);
363
-
364
- switch ($method) {
365
- case 'PLAINTEXT':
366
- case 'HMAC-SHA1':
367
- $this->sigMethod = $method;
368
- break;
369
- default:
370
- throw new Dropbox_Exception('Unsupported signature method ' . $method);
371
- }
372
- }
373
-
374
- /**
375
- * Set the output file
376
- * @param resource Resource to stream response data to
377
- * @return void
378
- */
379
- public function setOutFile($handle)
380
- {
381
- if (!is_resource($handle) || get_resource_type($handle) != 'stream') {
382
- throw new Dropbox_Exception('Outfile must be a stream resource');
383
- }
384
- $this->outFile = $handle;
385
- }
386
-
387
- /**
388
- * Set the input file
389
- * @param resource Resource to read data from
390
- * @return void
391
- */
392
- public function setInFile($handle)
393
- {
394
- if (!is_resource($handle) || get_resource_type($handle) != 'stream') {
395
- throw new Dropbox_Exception('Infile must be a stream resource');
396
- }
397
- fseek($handle, 0);
398
- $this->inFile = $handle;
399
- }
400
-
401
- /**
402
- * Parse response parameters for a token into an object
403
- * Dropbox returns tokens in the response parameters, and
404
- * not a JSON encoded object as per other API requests
405
- * @link http://oauth.net/core/1.0/#response_parameters
406
- * @param string $response
407
- * @return object stdClass
408
- */
409
- private function parseTokenString($response)
410
- {
411
- $parts = explode('&', $response);
412
- $token = new stdClass();
413
- foreach ($parts as $part) {
414
- list($k, $v) = explode('=', $part, 2);
415
- $k = strtolower($k);
416
- $token->$k = $v;
417
- }
418
- return $token;
419
- }
420
-
421
- /**
422
- * Encode a value to RFC3986
423
- * This is a convenience method to decode ~ symbols encoded
424
- * by rawurldecode. This will encode all characters except
425
- * the unreserved set, ALPHA, DIGIT, '-', '.', '_', '~'
426
- * @link http://tools.ietf.org/html/rfc5849#section-3.6
427
- * @param mixed $value
428
- */
429
- private function encode($value)
430
- {
431
- return str_replace('%7E', '~', rawurlencode($value));
432
- }
433
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/Dropbox/OAuth/Consumer/Curl.php DELETED
@@ -1,249 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * OAuth consumer using PHP cURL
5
- * @author Ben Tadiar <ben@handcraftedbyben.co.uk>
6
- * @link https://github.com/benthedesigner/dropbox
7
- * @package Dropbox\OAuth
8
- * @subpackage Consumer
9
- */
10
-
11
- class Dropbox_Curl extends Dropbox_ConsumerAbstract
12
- {
13
- /**
14
- * Default cURL options
15
- * @var array
16
- */
17
- protected $defaultOptions = array(
18
- CURLOPT_VERBOSE => true,
19
- CURLOPT_HEADER => true,
20
- CURLINFO_HEADER_OUT => false,
21
- CURLOPT_RETURNTRANSFER => true,
22
- CURLOPT_FOLLOWLOCATION => false,
23
- );
24
-
25
- /**
26
- * Store the last response form the API
27
- * @var mixed
28
- */
29
- protected $lastResponse = null;
30
-
31
- /**
32
- * Set properties and begin authentication
33
- * @param string $key
34
- * @param string $secret
35
- * @param \Dropbox\OAuth\Consumer\StorageInterface $storage
36
- * @param string $callback
37
- */
38
- public function __construct($key, $oauth2_id, $secret, Dropbox_StorageInterface $storage, $callback = null, $callbackhome = null, $deauthenticate = false)
39
- {
40
- // Check the cURL extension is loaded
41
- if (!extension_loaded('curl')) {
42
- throw new Dropbox_Exception('The cURL OAuth consumer requires the cURL extension. Please speak to your web hosting provider so that this missing PHP component can be installed.');
43
- }
44
-
45
- $this->consumerKey = $key;
46
- $this->oauth2_id = $oauth2_id;
47
- $this->consumerSecret = $secret;
48
- $this->storage = $storage;
49
- $this->callback = $callback;
50
- $this->callbackhome = $callbackhome;
51
-
52
- if ($deauthenticate) {
53
- $this->deauthenticate();
54
- } else {
55
- $this->authenticate();
56
- }
57
- }
58
-
59
- /**
60
- * Execute an API call
61
- * @todo Improve error handling
62
- * @param string $method The HTTP method
63
- * @param string $url The API endpoint
64
- * @param string $call The API method to call
65
- * @param array $additional Additional parameters
66
- * @return string|object stdClass
67
- */
68
- public function fetch($method, $url, $call, array $additional = array())
69
- {
70
- // Get the signed request URL
71
- $request = $this->getSignedRequest($method, $url, $call, $additional);
72
-
73
- // Initialise and execute a cURL request
74
- $handle = curl_init($request['url']);
75
-
76
- // Get the default options array
77
- $options = $this->defaultOptions;
78
- if (!UpdraftPlus_Options::get_updraft_option('updraft_ssl_useservercerts')) {
79
- $options[CURLOPT_CAINFO] = UPDRAFTPLUS_DIR.'/includes/cacert.pem';
80
- }
81
- if (UpdraftPlus_Options::get_updraft_option('updraft_ssl_disableverify')) {
82
- $options[CURLOPT_SSL_VERIFYPEER] = false;
83
- } else {
84
- $options[CURLOPT_SSL_VERIFYPEER] = true;
85
- }
86
-
87
- if (!class_exists('WP_HTTP_Proxy')) require_once(ABSPATH.WPINC.'/class-http.php');
88
- $proxy = new WP_HTTP_Proxy();
89
-
90
- if ($proxy->is_enabled()) {
91
- # WP_HTTP_Proxy returns empty strings if nothing is set
92
- $user = $proxy->username();
93
- $pass = $proxy->password();
94
- $host = $proxy->host();
95
- $port = (int)$proxy->port();
96
- if (empty($port)) $port = 8080;
97
- if (!empty($host) && $proxy->send_through_proxy($request['url'])) {
98
- $options[CURLOPT_PROXY] = $host;
99
- $options[CURLOPT_PROXYTYPE] = CURLPROXY_HTTP;
100
- $options[CURLOPT_PROXYPORT] = $port;
101
- if (!empty($user) && !empty($pass)) {
102
- $options[CURLOPT_PROXYAUTH] = CURLAUTH_ANY;
103
- $options[CURLOPT_PROXYUSERPWD] = sprintf('%s:%s', $user, $pass);
104
- }
105
- }
106
- }
107
-
108
- if ($method == 'GET' && $this->outFile) { // GET
109
- $options[CURLOPT_RETURNTRANSFER] = false;
110
- $options[CURLOPT_HEADER] = false;
111
- $options[CURLOPT_FILE] = $this->outFile;
112
- $options[CURLOPT_BINARYTRANSFER] = true;
113
- $options[CURLOPT_FAILONERROR] = true;
114
- if (isset($additional['headers'])) $options[CURLOPT_HTTPHEADER] = $additional['headers'];
115
- $this->outFile = null;
116
- } elseif ($method == 'POST') { // POST
117
- $options[CURLOPT_POST] = true;
118
- $options[CURLOPT_POSTFIELDS] = $request['postfields'];
119
- } elseif ($method == 'PUT' && $this->inFile) { // PUT
120
- $options[CURLOPT_PUT] = true;
121
- $options[CURLOPT_INFILE] = $this->inFile;
122
- // @todo Update so the data is not loaded into memory to get its size
123
- $options[CURLOPT_INFILESIZE] = strlen(stream_get_contents($this->inFile));
124
- fseek($this->inFile, 0);
125
- $this->inFile = null;
126
- }
127
-
128
- // Set the cURL options at once
129
- curl_setopt_array($handle, $options);
130
- // Execute, get any error and close
131
- $response = curl_exec($handle);
132
- $error = curl_error($handle);
133
- $getinfo = curl_getinfo($handle);
134
-
135
- curl_close($handle);
136
-
137
- //Check if a cURL error has occured
138
- if ($response === false) {
139
- throw new Dropbox_CurlException($error);
140
- } else {
141
- // Parse the response if it is a string
142
- if (is_string($response)) {
143
- $response = $this->parse($response);
144
- }
145
-
146
- // Set the last response
147
- $this->lastResponse = $response;
148
-
149
- $code = (!empty($response['code'])) ? $response['code'] : $getinfo['http_code'];
150
-
151
- // The API doesn't return an error message for the 304 status code...
152
- // 304's are only returned when the path supplied during metadata calls has not been modified
153
- if ($code == 304) {
154
- $response['body'] = new stdClass;
155
- $response['body']->error = 'The folder contents have not changed';
156
- }
157
-
158
- // Check if an error occurred and throw an Exception
159
- if (!empty($response['body']->error)) {
160
- // Dropbox returns error messages inconsistently...
161
- if ($response['body']->error instanceof stdClass) {
162
- $array = array_values((array) $response['body']->error);
163
- $message = $array[0];
164
- } else {
165
- $message = $response['body']->error;
166
- }
167
-
168
- // Throw an Exception with the appropriate with the appropriate message and code
169
- switch ($code) {
170
- case 304:
171
- throw new Dropbox_NotModifiedException($message, 304);
172
- case 400:
173
- throw new Dropbox_BadRequestException($message, 400);
174
- case 404:
175
- throw new Dropbox_NotFoundException($message, 404);
176
- case 406:
177
- throw new Dropbox_NotAcceptableException($message, 406);
178
- case 415:
179
- throw new Dropbox_UnsupportedMediaTypeException($message, 415);
180
- case 401:
181
- //401 means oauth token is expired continue to manually handle the exception depending on the situation
182
- continue;
183
- default:
184
- throw new Dropbox_Exception($message, $code);
185
- }
186
- }
187
-
188
- return $response;
189
- }
190
- }
191
-
192
- /**
193
- * Parse a cURL response
194
- * @param string $response
195
- * @return array
196
- */
197
- private function parse($response)
198
- {
199
- // Explode the response into headers and body parts (separated by double EOL)
200
- list($headers, $response) = explode("\r\n\r\n", $response, 2);
201
-
202
- // Explode response headers
203
- $lines = explode("\r\n", $headers);
204
-
205
- // If the status code is 100, the API server must send a final response
206
- // We need to explode the response again to get the actual response
207
- if (preg_match('#^HTTP/1.1 100#i', $lines[0])) {
208
- list($headers, $response) = explode("\r\n\r\n", $response, 2);
209
- $lines = explode("\r\n", $headers);
210
- }
211
-
212
- // Get the HTTP response code from the first line
213
- $first = array_shift($lines);
214
- $pattern = '#^HTTP/1.1 ([0-9]{3})#i';
215
- preg_match($pattern, $first, $matches);
216
- $code = $matches[1];
217
-
218
- // Parse the remaining headers into an associative array
219
- $headers = array();
220
- foreach ($lines as $line) {
221
- list($k, $v) = explode(': ', $line, 2);
222
- $headers[strtolower($k)] = $v;
223
- }
224
-
225
- // If the response body is not a JSON encoded string
226
- // we'll return the entire response body
227
- if (!$body = json_decode($response)) {
228
- $body = $response;
229
- }
230
-
231
- if (is_string($body)) {
232
- $body_lines = explode("\r\n", $body);
233
- if (preg_match('#^HTTP/1.1 100#i', $body_lines[0]) && preg_match('#^HTTP/1.#i', $body_lines[2])) {
234
- return $this->parse($body);
235
- }
236
- }
237
-
238
- return array('code' => $code, 'body' => $body, 'headers' => $headers);
239
- }
240
-
241
- /**
242
- * Return the response for the last API request
243
- * @return mixed
244
- */
245
- public function getlastResponse()
246
- {
247
- return $this->lastResponse;
248
- }
249
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/Dropbox/OAuth/Consumer/WordPress.php DELETED
@@ -1,80 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * OAuth consumer using the WordPress API
5
- * @author David Anderson <david@updraftplus.com>
6
- * @link https://github.com/DavidAnderson684/Dropbox
7
- * @package Dropbox\OAuth
8
- * @subpackage Consumer
9
- */
10
-
11
- class Dropbox_ConsumerWordPress extends Dropbox_ConsumerAbstract
12
- {
13
-
14
- /**
15
- * Set properties and begin authentication
16
- * @param string $key
17
- * @param string $secret
18
- * @param \Dropbox\OAuth\Consumer\StorageInterface $storage
19
- * @param string $callback
20
- */
21
- public function __construct($key, $secret, Dropbox_StorageInterface $storage, $callback = null)
22
- {
23
- // Check we are in a WordPress environment
24
- if (!defined('ABSPATH')) {
25
- throw new Dropbox_Exception('The WordPress OAuth consumer requires a WordPress environment');
26
- }
27
-
28
- $this->consumerKey = $key;
29
- $this->consumerSecret = $secret;
30
- $this->storage = $storage;
31
- $this->callback = $callback;
32
- $this->authenticate();
33
- }
34
-
35
- /**
36
- * Execute an API call
37
- * @param string $method The HTTP method
38
- * @param string $url The API endpoint
39
- * @param string $call The API method to call
40
- * @param array $additional Additional parameters
41
- * @return array
42
- */
43
- public function fetch($method, $url, $call, array $additional = array())
44
- {
45
- // Get the signed request URL
46
- $request = $this->getSignedRequest($method, $url, $call, $additional);
47
- if ($method == 'GET') {
48
- $args = array ( );
49
- $response = wp_remote_get($request['url'], $args);
50
- $this->outFile = null;
51
- } elseif ($method == 'POST') {
52
- $args = array( 'body' => $request['postfields'] );
53
- $response = wp_remote_post($request['url'], $args );
54
- } elseif ($method == 'PUT' && $this->inFile) {
55
- return new WP_Error('unsupported', "WordPress does not have a native HTTP PUT function");
56
- }
57
-
58
- // If the response body is not a JSON encoded string
59
- // we'll return the entire response body
60
- // Important to do this first, as the next section relies on the decoding having taken place
61
- if (!$body = json_decode(wp_remote_retrieve_body($response))) {
62
- $body = wp_remote_retrieve_body($response);
63
- }
64
-
65
- // Check if an error occurred and throw an Exception. This is part of the authentication process - don't modify.
66
- if (!empty($body->error)) {
67
- $message = $body->error . ' (Status Code: ' . wp_remote_retrieve_response_code($response) . ')';
68
- throw new Dropbox_Exception($message);
69
- }
70
-
71
- if (is_wp_error($response)) {
72
- $message = $response->get_error_message();
73
- throw new Dropbox_Exception($message);
74
- }
75
-
76
- $results = array ( 'body' => $body, 'code' => wp_remote_retrieve_response_code($response), 'headers' => $response['headers'] );
77
- return $results;
78
- }
79
-
80
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/Dropbox/OAuth/Storage/Encrypter.php DELETED
@@ -1,109 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * This class provides the functionality to encrypt
5
- * and decrypt access tokens stored by the application
6
- * @author Ben Tadiar <ben@handcraftedbyben.co.uk>
7
- * @link https://github.com/benthedesigner/dropbox
8
- * @package Dropbox\Oauth
9
- * @subpackage Storage
10
- */
11
-
12
- /* UpdraftPlus notes
13
- Using this was fairly pointless (it encrypts storage credentials at rest). But, it's implemented now, so needs supporting.
14
- Investigation shows that mcrypt and phpseclib native encryption using different padding schemes.
15
- As a result, that which is encrypted by phpseclib native can be decrypted by mcrypt, but not vice-versa. Each can (as you'd expect) decrypt the results of their own encryption.
16
- As a consequence, it makes sense to always encrypt with phpseclib native, and prefer decrypting with with mcrypt if it is available and otherwise fall back to phpseclib.
17
- We could deliberately re-encrypt all loaded information with phpseclib native, but there seems little need for that yet. There can only be a problem if mcrypt is disabled - which pre-July-2015 meant that Dropbox wouldn't work at all. Now, it will force a re-authorisation.
18
- */
19
-
20
- class Dropbox_Encrypter
21
- {
22
- // Encryption settings - default settings yield encryption to AES (256-bit) standard
23
- // @todo Provide PHPDOC for each class constant
24
- const KEY_SIZE = 32;
25
- const IV_SIZE = 16;
26
-
27
- /**
28
- * Encryption key
29
- * @var null|string
30
- */
31
- private $key = null;
32
-
33
- /**
34
- * Check Mcrypt is loaded and set the encryption key
35
- * @param string $key
36
- * @return void
37
- */
38
- public function __construct($key)
39
- {
40
- if (preg_match('/^[A-Za-z0-9]+$/', $key) && $length = strlen($key) === self::KEY_SIZE) {
41
- # Short-cut so that the mbstring extension is not required
42
- $this->key = $key;
43
- } elseif (($length = mb_strlen($key, '8bit')) !== self::KEY_SIZE) {
44
- throw new Dropbox_Exception('Expecting a ' . self::KEY_SIZE . ' byte key, got ' . $length);
45
- } else {
46
- // Set the encryption key
47
- $this->key = $key;
48
- }
49
- }
50
-
51
- /**
52
- * Encrypt the OAuth token
53
- * @param \stdClass $token Serialized token object
54
- * @return string
55
- */
56
- public function encrypt($token)
57
- {
58
-
59
- // Encryption: we always use phpseclib for this
60
-
61
- global $updraftplus;
62
- $updraftplus->ensure_phpseclib('Crypt_AES', 'Crypt/AES');
63
- $updraftplus->ensure_phpseclib('Crypt_Rijndael', 'Crypt/Rijndael');
64
-
65
- if (!function_exists('crypt_random_string')) require_once(UPDRAFTPLUS_DIR.'/vendor/phpseclib/phpseclib/phpseclib/Crypt/Random.php');
66
-
67
- $iv = crypt_random_string(self::IV_SIZE);
68
-
69
- // Defaults to CBC mode
70
- $rijndael = new Crypt_Rijndael();
71
-
72
- $rijndael->setKey($this->key);
73
-
74
- $rijndael->setIV($iv);
75
-
76
- $cipherText = $rijndael->encrypt($token);
77
-
78
- return base64_encode($iv . $cipherText);
79
- }
80
-
81
- /**
82
- * Decrypt the ciphertext
83
- * @param string $cipherText
84
- * @return object \stdClass Unserialized token
85
- */
86
- public function decrypt($cipherText)
87
- {
88
-
89
- // Decryption: prefer mcrypt, if available (since it can decrypt data encrypted by either mcrypt or phpseclib)
90
-
91
- $cipherText = base64_decode($cipherText);
92
- $iv = substr($cipherText, 0, self::IV_SIZE);
93
- $cipherText = substr($cipherText, self::IV_SIZE);
94
-
95
- if (function_exists('mcrypt_decrypt')) {
96
- $token = @mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->key, $cipherText, MCRYPT_MODE_CBC, $iv);
97
- } else {
98
- global $updraftplus;
99
- $updraftplus->ensure_phpseclib('Crypt_Rijndael', 'Crypt/Rijndael');
100
-
101
- $rijndael = new Crypt_Rijndael();
102
- $rijndael->setKey($this->key);
103
- $rijndael->setIV($iv);
104
- $token = $rijndael->decrypt($cipherText);
105
- }
106
-
107
- return $token;
108
- }
109
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/Dropbox/OAuth/Storage/StorageInterface.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * OAuth storage handler interface
5
- * @author Ben Tadiar <ben@handcraftedbyben.co.uk>
6
- * @link https://github.com/benthedesigner/dropbox
7
- * @package Dropbox\OAuth
8
- * @subpackage Storage
9
- */
10
-
11
- interface Dropbox_StorageInterface
12
- {
13
- /**
14
- * Get a token by type
15
- * @param string $type Token type to retrieve
16
- */
17
- public function get($type);
18
-
19
- /**
20
- * Set a token by type
21
- * @param \stdClass $token Token object to set
22
- * @param string $type Token type
23
- */
24
- public function set($token, $type);
25
-
26
- /**
27
- * Delete tokens for the current session/user
28
- */
29
- public function delete();
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/Dropbox/OAuth/Storage/WordPress.php DELETED
@@ -1,195 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * OAuth storage handler using WordPress options
5
- * This can only be used if you have a WordPress environment loaded, such that the (get|update|delete)_option functions are available
6
- * See an example usage in http://wordpress.org/extend/plugins/updraftplus
7
- * @author David Anderson <david@updraftplus.com>
8
- * @link https://updraftplus.com
9
- * @package Dropbox\Oauth
10
- * @subpackage Storage
11
- */
12
-
13
- class Dropbox_WordPress implements Dropbox_StorageInterface
14
- {
15
- /**
16
- * Option name
17
- * @var string
18
- */
19
- protected $option_name_prefix = 'dropbox_token';
20
-
21
- /**
22
- * Option name (array storage)
23
- * @var string
24
- */
25
- protected $option_array = '';
26
-
27
- /**
28
- * Encyption object
29
- * @var Encrypter|null
30
- */
31
- protected $encrypter = null;
32
-
33
- /**
34
- * Backup module object
35
- * @var Backup_module_object|null
36
- */
37
- protected $backup_module_object = null;
38
-
39
- /**
40
- * Check if an instance of the encrypter is passed, set the encryption object
41
- * @return void
42
- */
43
- public function __construct(Dropbox_Encrypter $encrypter = null, $option_name_prefix = 'dropbox_token', $option_array = 'dropbox', $backup_module_object)
44
- {
45
- if ($encrypter instanceof Dropbox_Encrypter) {
46
- $this->encrypter = $encrypter;
47
- }
48
-
49
- if ($backup_module_object instanceof UpdraftPlus_BackupModule) {
50
- $this->backup_module_object = $backup_module_object;
51
- }
52
-
53
- $this->option_name_prefix = $option_name_prefix;
54
- $this->option_array = $option_array;
55
-
56
- }
57
-
58
- /**
59
- * Get an entry from the Dropbox options in the database
60
- * If the encryption object is set then decrypt the token before returning
61
- * @param string $type is the key to retrieve
62
- * @return array|bool
63
- */
64
- public function get($type)
65
- {
66
- if ($type != 'request_token' && $type != 'access_token' && $type != 'appkey' && $type != 'CSRF' && $type != 'code') {
67
- throw new Dropbox_Exception("Expected a type of either 'request_token', 'access_token', 'CSRF' or 'code', got '$type'");
68
- } else {
69
- if (false !== ($opts = $this->backup_module_object->get_options())) {
70
- if ($type == 'request_token' || $type == 'access_token'){
71
- if (!empty($opts[$this->option_name_prefix.$type])) {
72
- $gettoken = $opts[$this->option_name_prefix.$type];
73
- $token = $this->decrypt($gettoken);
74
- return $token;
75
- }
76
- } else {
77
- if (!empty($opts[$type])) {
78
- return $opts[$type];
79
- }
80
- }
81
- }
82
- return false;
83
- }
84
- }
85
-
86
- /**
87
- * Set a value in the database by type
88
- * If the value is a token and the encryption object is set then encrypt the token before storing
89
- * @param \stdClass Token object to set
90
- * @param string $type Token type
91
- * @return void
92
- */
93
- public function set($token, $type)
94
- {
95
- if ($type != 'request_token' && $type != 'access_token' && $type != 'upgraded' && $type != 'CSRF' && $type != 'code') {
96
- throw new Dropbox_Exception("Expected a type of either 'request_token', 'access_token', 'CSRF', 'upgraded' or 'code', got '$type'");
97
- } else {
98
-
99
- $opts = $this->backup_module_object->get_options();
100
-
101
- if ($type == 'access_token'){
102
- $token = $this->encrypt($token);
103
- $opts[$this->option_name_prefix.$type] = $token;
104
- } else if ($type == 'request_token' ) {
105
- $opts[$this->option_name_prefix.$type] = $token;
106
- } else {
107
- $opts[$type] = $token;
108
- }
109
-
110
- $this->backup_module_object->set_options($opts, true);
111
- }
112
- }
113
-
114
- /**
115
- * Remove a value in the database by type rather than setting to null / empty
116
- * set the value to null here so that when it gets to the options filter it will
117
- * unset the value there, this avoids a bug where if the value is not set then
118
- * the option filter will take the value from the database and save that version back.
119
- *
120
- * N.B. Before PHP 7.0, you can't call a method name unset()
121
- *
122
- * @param string $type Token type
123
- * @return void
124
- */
125
- public function do_unset($type)
126
- {
127
- if ($type != 'request_token' && $type != 'access_token' && $type != 'upgraded' && $type != 'CSRF' && $type != 'code') {
128
- throw new Dropbox_Exception("Expected a type of either 'request_token', 'access_token', 'CSRF', 'upgraded' or 'code', got '$type'");
129
- } else {
130
-
131
- $opts = $this->backup_module_object->get_options();
132
-
133
- if ($type == 'access_token' || $type == 'request_token'){
134
- $opts[$this->option_name_prefix.$type] = null;
135
- } else {
136
- $opts[$type] = null;
137
- }
138
- $this->backup_module_object->set_options($opts, true);
139
- }
140
- }
141
-
142
- /**
143
- * Delete the request and access tokens currently stored in the database
144
- * @return bool
145
- */
146
- public function delete()
147
- {
148
- $opts = $this->backup_module_object->get_options();
149
- $opts[$this->option_name_prefix.'request_token'] = null;
150
- $opts[$this->option_name_prefix.'access_token'] = null;
151
- unset($opts['ownername']);
152
- unset($opts['upgraded']);
153
- $this->backup_module_object->set_options($opts, true);
154
- return true;
155
- }
156
-
157
- /**
158
- * Use the Encrypter to encrypt a token and return it
159
- * If there is not encrypter object, return just the
160
- * serialized token object for storage
161
- * @param stdClass $token OAuth token to encrypt
162
- * @return stdClass|string
163
- */
164
- protected function encrypt($token)
165
- {
166
- // Serialize the token object
167
- $token = serialize($token);
168
-
169
- // Encrypt the token if there is an Encrypter instance
170
- if ($this->encrypter instanceof Dropbox_Encrypter) {
171
- $token = $this->encrypter->encrypt($token);
172
- }
173
-
174
- // Return the token
175
- return $token;
176
- }
177
-
178
- /**
179
- * Decrypt a token using the Encrypter object and return it
180
- * If there is no Encrypter object, assume the token was stored
181
- * serialized and return the unserialized token object
182
- * @param stdClass $token OAuth token to encrypt
183
- * @return stdClass|string
184
- */
185
- protected function decrypt($token)
186
- {
187
- // Decrypt the token if there is an Encrypter instance
188
- if ($this->encrypter instanceof Dropbox_Encrypter) {
189
- $token = $this->encrypter->decrypt($token);
190
- }
191
-
192
- // Return the unserialized token
193
- return @unserialize($token);
194
- }
195
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/Dropbox2/OAuth/Consumer/ConsumerAbstract.php CHANGED
@@ -163,12 +163,14 @@ abstract class Dropbox_ConsumerAbstract
163
  } else if (!empty($appkey)) {
164
  $key = $appkey;
165
  }
 
 
166
 
167
  $params = array(
168
  'client_id' => empty($key) ? $this->oauth2_id : $key,
169
  'response_type' => 'code',
170
  'redirect_uri' => empty($key) ? $this->callback : $this->callbackhome,
171
- 'state' => empty($key) ? $CSRF.$this->callbackhome : $CSRF,
172
  );
173
 
174
  // Build the URL and redirect the user
163
  } else if (!empty($appkey)) {
164
  $key = $appkey;
165
  }
166
+
167
+ if ('' != $this->instance_id) $this->instance_id = ':'.$this->instance_id;
168
 
169
  $params = array(
170
  'client_id' => empty($key) ? $this->oauth2_id : $key,
171
  'response_type' => 'code',
172
  'redirect_uri' => empty($key) ? $this->callback : $this->callbackhome,
173
+ 'state' => empty($key) ? $CSRF.$this->instance_id.$this->callbackhome : $CSRF.$this->instance_id,
174
  );
175
 
176
  // Build the URL and redirect the user
includes/Dropbox2/OAuth/Consumer/Curl.php CHANGED
@@ -35,7 +35,7 @@ class Dropbox_Curl extends Dropbox_ConsumerAbstract
35
  * @param \Dropbox\OAuth\Consumer\StorageInterface $storage
36
  * @param string $callback
37
  */
38
- public function __construct($key, $oauth2_id, $secret, Dropbox_StorageInterface $storage, $callback = null, $callbackhome = null, $deauthenticate = false)
39
  {
40
  // Check the cURL extension is loaded
41
  if (!extension_loaded('curl')) {
@@ -48,6 +48,7 @@ class Dropbox_Curl extends Dropbox_ConsumerAbstract
48
  $this->storage = $storage;
49
  $this->callback = $callback;
50
  $this->callbackhome = $callbackhome;
 
51
 
52
  if ($deauthenticate) {
53
  $this->deauthenticate();
35
  * @param \Dropbox\OAuth\Consumer\StorageInterface $storage
36
  * @param string $callback
37
  */
38
+ public function __construct($key, $oauth2_id, $secret, Dropbox_StorageInterface $storage, $callback = null, $callbackhome = null, $deauthenticate = false, $instance_id = '')
39
  {
40
  // Check the cURL extension is loaded
41
  if (!extension_loaded('curl')) {
48
  $this->storage = $storage;
49
  $this->callback = $callback;
50
  $this->callbackhome = $callbackhome;
51
+ $this->instance_id = $instance_id;
52
 
53
  if ($deauthenticate) {
54
  $this->deauthenticate();
includes/class-commands.php CHANGED
@@ -233,26 +233,48 @@ class UpdraftPlus_Commands {
233
 
234
  }
235
 
236
- public function vault_recountquota() {
 
 
 
 
 
 
237
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return new WP_Error('no_updraftplus');
238
 
239
  if (!UpdraftPlus_Options::user_can_manage()) return new WP_Error('updraftplus_permission_denied');
240
 
241
- $vault = $updraftplus_admin->get_updraftvault();
 
 
242
 
243
  return $vault->ajax_vault_recountquota(false);
244
  }
245
 
 
 
 
 
 
 
246
  public function vault_connect($credentials) {
247
 
248
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return new WP_Error('no_updraftplus');
249
 
250
  if (!UpdraftPlus_Options::user_can_manage()) return new WP_Error('updraftplus_permission_denied');
251
 
252
- return $updraftplus_admin->get_updraftvault()->ajax_vault_connect(false, $credentials);
 
 
253
 
254
  }
255
 
 
 
 
 
 
 
256
  public function vault_disconnect($params = array()) {
257
 
258
  if (false === ($updraftplus_admin = $this->_load_ud_admin()) || false === ($updraftplus = $this->_load_ud())) return new WP_Error('no_updraftplus');
@@ -260,23 +282,15 @@ class UpdraftPlus_Commands {
260
  if (!UpdraftPlus_Options::user_can_manage()) return new WP_Error('updraftplus_permission_denied');
261
 
262
  $echo_results = empty($params['immediate_echo']) ? false : true;
 
 
263
 
264
- $results = (array) $updraftplus_admin->get_updraftvault()->ajax_vault_disconnect($echo_results);
265
 
266
  return $results;
267
 
268
  }
269
 
270
- public function vault_recount_quota() {
271
- if (false === ($updraftplus_admin = $this->_load_ud_admin()) || false === ($updraftplus = $this->_load_ud())) return new WP_Error('no_updraftplus');
272
-
273
- if (!UpdraftPlus_Options::user_can_manage()) return new WP_Error('updraftplus_permission_denied');
274
-
275
- $results = $updraftplus_admin->get_updraftvault()->ajax_vault_recountquota(false);
276
-
277
- return $results;
278
- }
279
-
280
  /**
281
  * A handler method to call the UpdraftPlus admin save settings method. It will check if the settings passed to it are in the format of a string if so it converts it to an array otherwise just pass the array
282
  *
233
 
234
  }
235
 
236
+ /**
237
+ * This method will make a call to the methods responsible for recounting the quota in the UpdraftVault account
238
+ *
239
+ * @param array $params - an array of parameters such as a instance_id
240
+ * @return string - the result of the call
241
+ */
242
+ public function vault_recountquota($params = array()) {
243
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return new WP_Error('no_updraftplus');
244
 
245
  if (!UpdraftPlus_Options::user_can_manage()) return new WP_Error('updraftplus_permission_denied');
246
 
247
+ $instance_id = empty($params['instance_id']) ? '' : $params['instance_id'];
248
+
249
+ $vault = $updraftplus_admin->get_updraftvault($instance_id);
250
 
251
  return $vault->ajax_vault_recountquota(false);
252
  }
253
 
254
+ /**
255
+ * This method will make a call to the methods responsible for creating a connection to UpdraftVault
256
+ *
257
+ * @param array $credentials - an array of parameters such as the user credentials and instance_id
258
+ * @return string - the result of the call
259
+ */
260
  public function vault_connect($credentials) {
261
 
262
  if (false === ($updraftplus_admin = $this->_load_ud_admin())) return new WP_Error('no_updraftplus');
263
 
264
  if (!UpdraftPlus_Options::user_can_manage()) return new WP_Error('updraftplus_permission_denied');
265
 
266
+ $instance_id = empty($credentials['instance_id']) ? '' : $credentials['instance_id'];
267
+
268
+ return $updraftplus_admin->get_updraftvault($instance_id)->ajax_vault_connect(false, $credentials);
269
 
270
  }
271
 
272
+ /**
273
+ * This method will make a call to the methods responsible for removing a connection to UpdraftVault
274
+ *
275
+ * @param array $params - an array of parameters such as a instance_id
276
+ * @return string - the result of the call
277
+ */
278
  public function vault_disconnect($params = array()) {
279
 
280
  if (false === ($updraftplus_admin = $this->_load_ud_admin()) || false === ($updraftplus = $this->_load_ud())) return new WP_Error('no_updraftplus');
282
  if (!UpdraftPlus_Options::user_can_manage()) return new WP_Error('updraftplus_permission_denied');
283
 
284
  $echo_results = empty($params['immediate_echo']) ? false : true;
285
+
286
+ $instance_id = empty($params['instance_id']) ? '' : $params['instance_id'];
287
 
288
+ $results = (array) $updraftplus_admin->get_updraftvault($instance_id)->ajax_vault_disconnect($echo_results);
289
 
290
  return $results;
291
 
292
  }
293
 
 
 
 
 
 
 
 
 
 
 
294
  /**
295
  * A handler method to call the UpdraftPlus admin save settings method. It will check if the settings passed to it are in the format of a string if so it converts it to an array otherwise just pass the array
296
  *
includes/class-wpadmin-commands.php CHANGED
@@ -581,4 +581,73 @@ class UpdraftPlus_WPAdmin_Commands extends UpdraftPlus_Commands {
581
  public function get_zipfile_download($params) {
582
  return apply_filters('updraftplus_command_get_zipfile_download', array('error' => 'UpdraftPlus: command (get_zipfile_download) not installed (are you missing an add-on?)'), $params);
583
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
584
  }
581
  public function get_zipfile_download($params) {
582
  return apply_filters('updraftplus_command_get_zipfile_download', array('error' => 'UpdraftPlus: command (get_zipfile_download) not installed (are you missing an add-on?)'), $params);
583
  }
584
+
585
+ /**
586
+ * Dismiss the notice which will if .htaccess have any old migrated site reference.
587
+ *
588
+ * @return boolean Return true if migration notice is dismissed
589
+ */
590
+ public function dismiss_migration_notice_for_old_site_reference() {
591
+ delete_site_option('updraftplus_migrated_site_domain');
592
+ return true;
593
+ }
594
+
595
+ /**
596
+ * When character set and collate both are unsupported at restoration time and if user change anyone substitution dropdown from both, Other substitution select box value should be change respectively. To achieve this functionality, Ajax calls comes here.
597
+ *
598
+ * @param Array $params this is an array of parameters sent via ajax it can include the following:
599
+ * collate_change_on_charset_selection_data - It is data in serialize form which is need for choose other dropdown option value. It contains below elemts data:
600
+ * db_supported_collations - All collations supported by current database. This is result of 'SHOW COLLATION' query
601
+ * db_unsupported_collate_unique - Unsupported collates unique array
602
+ * db_collates_found - All collates found in database backup file
603
+ * event_source_elem - Dropdown elemtn id which trigger the ajax request
604
+ * updraft_restorer_charset - Charset dropdown selected value option
605
+ * updraft_restorer_collate - Collate dropdown selected value option
606
+ *
607
+ * @return array - $action_data which contains following data:
608
+ * is_action_required - 1 or 0 Whether or not change other dropdown value
609
+ * elem_id - Dropdown element id which value need to change. The other dropdown element id
610
+ * elem_val - Dropdown element value which should be selected for other drodown
611
+ */
612
+ public function collate_change_on_charset_selection($params) {
613
+ $collate_change_on_charset_selection_data = json_decode(wp_unslash($params['collate_change_on_charset_selection_data']), true);
614
+ $updraft_restorer_collate = $params['updraft_restorer_collate'];
615
+ $updraft_restorer_charset = $params['updraft_restorer_charset'];
616
+
617
+ $db_supported_collations = $collate_change_on_charset_selection_data['db_supported_collations'];
618
+ $db_unsupported_collate_unique = $collate_change_on_charset_selection_data['db_unsupported_collate_unique'];
619
+ $db_collates_found = $collate_change_on_charset_selection_data['db_collates_found'];
620
+
621
+ $action_data = array(
622
+ 'is_action_required' => 0,
623
+ );
624
+ // No need to change other dropdown value
625
+ if (isset($db_supported_collations[$updraft_restorer_collate]->Charset) && $updraft_restorer_charset == $db_supported_collations[$updraft_restorer_collate]->Charset) {
626
+ return $action_data;
627
+ }
628
+ $similar_type_collate = $this->_updraftplus->get_similar_collate_related_to_charset($db_supported_collations, $db_unsupported_collate_unique, $updraft_restorer_charset);
629
+ if (empty($similar_type_collate)) {
630
+ $similar_type_collate = $this->_updraftplus->get_similar_collate_based_on_ocuurence_count($db_collates_found, $db_supported_collations, $db_supported_charsets_related_to_unsupported_collations = array($updraft_restorer_collate));
631
+ }
632
+ // Default collation for changed charcter set
633
+ if (empty($similar_type_collate)) {
634
+ $charset_row = $GLOBALS['wpdb']->get_row($GLOBALS['wpdb']->prepare("SHOW CHARACTER SET LIKE '%s'", $updraft_restorer_charset));
635
+ if (null !== $charset_row && !empty($charset_row->{'Default collation'})) {
636
+ $similar_type_collate = $charset_row->{'Default collation'};
637
+ }
638
+ }
639
+ if (empty($similar_type_collate)) {
640
+ foreach ($db_supported_collations as $db_supported_collation => $db_supported_collation_info) {
641
+ if (isset($db_supported_collation_info->Charset) && $updraft_restorer_charset == $db_supported_collation_info->Charset) {
642
+ $similar_type_collate = $db_supported_collation;
643
+ break;
644
+ }
645
+ }
646
+ }
647
+ if (!empty($similar_type_collate)) {
648
+ $action_data['is_action_required'] = 1;
649
+ $action_data['similar_type_collate'] = $similar_type_collate;
650
+ }
651
+ return $action_data;
652
+ }
653
  }
includes/handlebars/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (C) 2011-2016 by Yehuda Katz
2
 
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
  of this software and associated documentation files (the "Software"), to deal
1
+ Copyright (C) 2011-2017 by Yehuda Katz
2
 
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
  of this software and associated documentation files (the "Software"), to deal
includes/handlebars/handlebars.js CHANGED
@@ -1,9 +1,9 @@
1
  /**!
2
 
3
  @license
4
- handlebars v4.0.10
5
 
6
- Copyright (C) 2011-2016 by Yehuda Katz
7
 
8
  Permission is hereby granted, free of charge, to any person obtaining a copy
9
  of this software and associated documentation files (the "Software"), to deal
@@ -275,7 +275,7 @@ return /******/ (function(modules) { // webpackBootstrap
275
 
276
  var _logger2 = _interopRequireDefault(_logger);
277
 
278
- var VERSION = '4.0.10';
279
  exports.VERSION = VERSION;
280
  var COMPILER_REVISION = 7;
281
 
1
  /**!
2
 
3
  @license
4
+ handlebars v4.0.11
5
 
6
+ Copyright (C) 2011-2017 by Yehuda Katz
7
 
8
  Permission is hereby granted, free of charge, to any person obtaining a copy
9
  of this software and associated documentation files (the "Software"), to deal
275
 
276
  var _logger2 = _interopRequireDefault(_logger);
277
 
278
+ var VERSION = '4.0.11';
279
  exports.VERSION = VERSION;
280
  var COMPILER_REVISION = 7;
281
 
includes/handlebars/handlebars.min.js CHANGED
@@ -1,9 +1,9 @@
1
  /**!
2
 
3
  @license
4
- handlebars v4.0.10
5
 
6
- Copyright (C) 2011-2016 by Yehuda Katz
7
 
8
  Permission is hereby granted, free of charge, to any person obtaining a copy
9
  of this software and associated documentation files (the "Software"), to deal
@@ -24,6 +24,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
  THE SOFTWARE.
25
 
26
  */
27
- !function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define([],b):"object"==typeof exports?exports.Handlebars=b():a.Handlebars=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){"use strict";function d(){var a=r();return a.compile=function(b,c){return k.compile(b,c,a)},a.precompile=function(b,c){return k.precompile(b,c,a)},a.AST=i["default"],a.Compiler=k.Compiler,a.JavaScriptCompiler=m["default"],a.Parser=j.parser,a.parse=j.parse,a}var e=c(1)["default"];b.__esModule=!0;var f=c(2),g=e(f),h=c(35),i=e(h),j=c(36),k=c(41),l=c(42),m=e(l),n=c(39),o=e(n),p=c(34),q=e(p),r=g["default"].create,s=d();s.create=d,q["default"](s),s.Visitor=o["default"],s["default"]=s,b["default"]=s,a.exports=b["default"]},function(a,b){"use strict";b["default"]=function(a){return a&&a.__esModule?a:{"default":a}},b.__esModule=!0},function(a,b,c){"use strict";function d(){var a=new h.HandlebarsEnvironment;return n.extend(a,h),a.SafeString=j["default"],a.Exception=l["default"],a.Utils=n,a.escapeExpression=n.escapeExpression,a.VM=p,a.template=function(b){return p.template(b,a)},a}var e=c(3)["default"],f=c(1)["default"];b.__esModule=!0;var g=c(4),h=e(g),i=c(21),j=f(i),k=c(6),l=f(k),m=c(5),n=e(m),o=c(22),p=e(o),q=c(34),r=f(q),s=d();s.create=d,r["default"](s),s["default"]=s,b["default"]=s,a.exports=b["default"]},function(a,b){"use strict";b["default"]=function(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b},b.__esModule=!0},function(a,b,c){"use strict";function d(a,b,c){this.helpers=a||{},this.partials=b||{},this.decorators=c||{},i.registerDefaultHelpers(this),j.registerDefaultDecorators(this)}var e=c(1)["default"];b.__esModule=!0,b.HandlebarsEnvironment=d;var f=c(5),g=c(6),h=e(g),i=c(10),j=c(18),k=c(20),l=e(k),m="4.0.10";b.VERSION=m;var n=7;b.COMPILER_REVISION=n;var o={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1",7:">= 4.0.0"};b.REVISION_CHANGES=o;var p="[object Object]";d.prototype={constructor:d,logger:l["default"],log:l["default"].log,registerHelper:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple helpers");f.extend(this.helpers,a)}else this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){if(f.toString.call(a)===p)f.extend(this.partials,a);else{if("undefined"==typeof b)throw new h["default"]('Attempting to register a partial called "'+a+'" as undefined');this.partials[a]=b}},unregisterPartial:function(a){delete this.partials[a]},registerDecorator:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple decorators");f.extend(this.decorators,a)}else this.decorators[a]=b},unregisterDecorator:function(a){delete this.decorators[a]}};var q=l["default"].log;b.log=q,b.createFrame=f.createFrame,b.logger=l["default"]},function(a,b){"use strict";function c(a){return k[a]}function d(a){for(var b=1;b<arguments.length;b++)for(var c in arguments[b])Object.prototype.hasOwnProperty.call(arguments[b],c)&&(a[c]=arguments[b][c]);return a}function e(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1}function f(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return m.test(a)?a.replace(l,c):a}function g(a){return!a&&0!==a||!(!p(a)||0!==a.length)}function h(a){var b=d({},a);return b._parent=a,b}function i(a,b){return a.path=b,a}function j(a,b){return(a?a+".":"")+b}b.__esModule=!0,b.extend=d,b.indexOf=e,b.escapeExpression=f,b.isEmpty=g,b.createFrame=h,b.blockParams=i,b.appendContextPath=j;var k={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;","=":"&#x3D;"},l=/[&<>"'`=]/g,m=/[&<>"'`=]/,n=Object.prototype.toString;b.toString=n;var o=function(a){return"function"==typeof a};o(/x/)&&(b.isFunction=o=function(a){return"function"==typeof a&&"[object Function]"===n.call(a)}),b.isFunction=o;var p=Array.isArray||function(a){return!(!a||"object"!=typeof a)&&"[object Array]"===n.call(a)};b.isArray=p},function(a,b,c){"use strict";function d(a,b){var c=b&&b.loc,g=void 0,h=void 0;c&&(g=c.start.line,h=c.start.column,a+=" - "+g+":"+h);for(var i=Error.prototype.constructor.call(this,a),j=0;j<f.length;j++)this[f[j]]=i[f[j]];Error.captureStackTrace&&Error.captureStackTrace(this,d);try{c&&(this.lineNumber=g,e?Object.defineProperty(this,"column",{value:h,enumerable:!0}):this.column=h)}catch(k){}}var e=c(7)["default"];b.__esModule=!0;var f=["description","fileName","lineNumber","message","name","number","stack"];d.prototype=new Error,b["default"]=d,a.exports=b["default"]},function(a,b,c){a.exports={"default":c(8),__esModule:!0}},function(a,b,c){var d=c(9);a.exports=function(a,b,c){return d.setDesc(a,b,c)}},function(a,b){var c=Object;a.exports={create:c.create,getProto:c.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:c.getOwnPropertyDescriptor,setDesc:c.defineProperty,setDescs:c.defineProperties,getKeys:c.keys,getNames:c.getOwnPropertyNames,getSymbols:c.getOwnPropertySymbols,each:[].forEach}},function(a,b,c){"use strict";function d(a){g["default"](a),i["default"](a),k["default"](a),m["default"](a),o["default"](a),q["default"](a),s["default"](a)}var e=c(1)["default"];b.__esModule=!0,b.registerDefaultHelpers=d;var f=c(11),g=e(f),h=c(12),i=e(h),j=c(13),k=e(j),l=c(14),m=e(l),n=c(15),o=e(n),p=c(16),q=e(p),r=c(17),s=e(r)},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerHelper("blockHelperMissing",function(b,c){var e=c.inverse,f=c.fn;if(b===!0)return f(this);if(b===!1||null==b)return e(this);if(d.isArray(b))return b.length>0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):e(this);if(c.data&&c.ids){var g=d.createFrame(c.data);g.contextPath=d.appendContextPath(c.data.contextPath,c.name),c={data:g}}return f(b,c)})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(1)["default"];b.__esModule=!0;var e=c(5),f=c(6),g=d(f);b["default"]=function(a){a.registerHelper("each",function(a,b){function c(b,c,f){j&&(j.key=b,j.index=c,j.first=0===c,j.last=!!f,k&&(j.contextPath=k+b)),i+=d(a[b],{data:j,blockParams:e.blockParams([a[b],b],[k+b,null])})}if(!b)throw new g["default"]("Must pass iterator to #each");var d=b.fn,f=b.inverse,h=0,i="",j=void 0,k=void 0;if(b.data&&b.ids&&(k=e.appendContextPath(b.data.contextPath,b.ids[0])+"."),e.isFunction(a)&&(a=a.call(this)),b.data&&(j=e.createFrame(b.data)),a&&"object"==typeof a)if(e.isArray(a))for(var l=a.length;h<l;h++)h in a&&c(h,h,h===a.length-1);else{var m=void 0;for(var n in a)a.hasOwnProperty(n)&&(void 0!==m&&c(m,h-1),m=n,h++);void 0!==m&&c(m,h-1,!0)}return 0===h&&(i=f(this)),i})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(1)["default"];b.__esModule=!0;var e=c(6),f=d(e);b["default"]=function(a){a.registerHelper("helperMissing",function(){if(1!==arguments.length)throw new f["default"]('Missing helper: "'+arguments[arguments.length-1].name+'"')})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerHelper("if",function(a,b){return d.isFunction(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||d.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("log",function(){for(var b=[void 0],c=arguments[arguments.length-1],d=0;d<arguments.length-1;d++)b.push(arguments[d]);var e=1;null!=c.hash.level?e=c.hash.level:c.data&&null!=c.data.level&&(e=c.data.level),b[0]=e,a.log.apply(a,b)})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("lookup",function(a,b){return a&&a[b]})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerHelper("with",function(a,b){d.isFunction(a)&&(a=a.call(this));var c=b.fn;if(d.isEmpty(a))return b.inverse(this);var e=b.data;return b.data&&b.ids&&(e=d.createFrame(b.data),e.contextPath=d.appendContextPath(b.data.contextPath,b.ids[0])),c(a,{data:e,blockParams:d.blockParams([a],[e&&e.contextPath])})})},a.exports=b["default"]},function(a,b,c){"use strict";function d(a){g["default"](a)}var e=c(1)["default"];b.__esModule=!0,b.registerDefaultDecorators=d;var f=c(19),g=e(f)},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerDecorator("inline",function(a,b,c,e){var f=a;return b.partials||(b.partials={},f=function(e,f){var g=c.partials;c.partials=d.extend({},g,b.partials);var h=a(e,f);return c.partials=g,h}),b.partials[e.args[0]]=e.fn,f})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5),e={methodMap:["debug","info","warn","error"],level:"info",lookupLevel:function(a){if("string"==typeof a){var b=d.indexOf(e.methodMap,a.toLowerCase());a=b>=0?b:parseInt(a,10)}return a},log:function(a){if(a=e.lookupLevel(a),"undefined"!=typeof console&&e.lookupLevel(e.level)<=a){var b=e.methodMap[a];console[b]||(b="log");for(var c=arguments.length,d=Array(c>1?c-1:0),f=1;f<c;f++)d[f-1]=arguments[f];console[b].apply(console,d)}}};b["default"]=e,a.exports=b["default"]},function(a,b){"use strict";function c(a){this.string=a}b.__esModule=!0,c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=s.COMPILER_REVISION;if(b!==c){if(b<c){var d=s.REVISION_CHANGES[c],e=s.REVISION_CHANGES[b];throw new r["default"]("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new r["default"]("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){function c(c,d,e){e.hash&&(d=p.extend({},d,e.hash),e.ids&&(e.ids[0]=!0)),c=b.VM.resolvePartial.call(this,c,d,e);var f=b.VM.invokePartial.call(this,c,d,e);if(null==f&&b.compile&&(e.partials[e.name]=b.compile(c,a.compilerOptions,b),f=e.partials[e.name](d,e)),null!=f){if(e.indent){for(var g=f.split("\n"),h=0,i=g.length;h<i&&(g[h]||h+1!==i);h++)g[h]=e.indent+g[h];f=g.join("\n")}return f}throw new r["default"]("The partial "+e.name+" could not be compiled when running in runtime-only mode")}function d(b){function c(b){return""+a.main(e,b,e.helpers,e.partials,g,i,h)}var f=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],g=f.data;d._setup(f),!f.partial&&a.useData&&(g=j(b,g));var h=void 0,i=a.useBlockParams?[]:void 0;return a.useDepths&&(h=f.depths?b!=f.depths[0]?[b].concat(f.depths):f.depths:[b]),(c=k(a.main,c,e,f.depths||[],g,i))(b,f)}if(!b)throw new r["default"]("No environment passed to template");if(!a||!a.main)throw new r["default"]("Unknown template object: "+typeof a);a.main.decorator=a.main_d,b.VM.checkRevision(a.compiler);var e={strict:function(a,b){if(!(b in a))throw new r["default"]('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;d<c;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:p.escapeExpression,invokePartial:c,fn:function(b){var c=a[b];return c.decorator=a[b+"_d"],c},programs:[],program:function(a,b,c,d,e){var g=this.programs[a],h=this.fn(a);return b||e||d||c?g=f(this,a,h,b,c,d,e):g||(g=this.programs[a]=f(this,a,h)),g},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=p.extend({},b,a)),c},nullContext:l({}),noop:b.VM.noop,compilerInfo:a.compiler};return d.isTop=!0,d._setup=function(c){c.partial?(e.helpers=c.helpers,e.partials=c.partials,e.decorators=c.decorators):(e.helpers=e.merge(c.helpers,b.helpers),a.usePartial&&(e.partials=e.merge(c.partials,b.partials)),(a.usePartial||a.useDecorators)&&(e.decorators=e.merge(c.decorators,b.decorators)))},d._child=function(b,c,d,g){if(a.useBlockParams&&!d)throw new r["default"]("must pass block params");if(a.useDepths&&!g)throw new r["default"]("must pass parent depths");return f(e,b,a[b],c,0,d,g)},d}function f(a,b,c,d,e,f,g){function h(b){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],h=g;return!g||b==g[0]||b===a.nullContext&&null===g[0]||(h=[b].concat(g)),c(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),h)}return h=k(c,h,a,g,d,f),h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function g(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a="@partial-block"===c.name?c.data["partial-block"]:c.partials[c.name],a}function h(a,b,c){var d=c.data&&c.data["partial-block"];c.partial=!0,c.ids&&(c.data.contextPath=c.ids[0]||c.data.contextPath);var e=void 0;if(c.fn&&c.fn!==i&&!function(){c.data=s.createFrame(c.data);var a=c.fn;e=c.data["partial-block"]=function(b){var c=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return c.data=s.createFrame(c.data),c.data["partial-block"]=d,a(b,c)},a.partials&&(c.partials=p.extend({},c.partials,a.partials))}(),void 0===a&&e&&(a=e),void 0===a)throw new r["default"]("The partial "+c.name+" could not be found");if(a instanceof Function)return a(b,c)}function i(){return""}function j(a,b){return b&&"root"in b||(b=b?s.createFrame(b):{},b.root=a),b}function k(a,b,c,d,e,f){if(a.decorator){var g={};b=a.decorator(b,g,c,d&&d[0],e,f,d),p.extend(b,g)}return b}var l=c(23)["default"],m=c(3)["default"],n=c(1)["default"];b.__esModule=!0,b.checkRevision=d,b.template=e,b.wrapProgram=f,b.resolvePartial=g,b.invokePartial=h,b.noop=i;var o=c(5),p=m(o),q=c(6),r=n(q),s=c(4)},function(a,b,c){a.exports={"default":c(24),__esModule:!0}},function(a,b,c){c(25),a.exports=c(30).Object.seal},function(a,b,c){var d=c(26);c(27)("seal",function(a){return function(b){return a&&d(b)?a(b):b}})},function(a,b){a.exports=function(a){return"object"==typeof a?null!==a:"function"==typeof a}},function(a,b,c){var d=c(28),e=c(30),f=c(33);a.exports=function(a,b){var c=(e.Object||{})[a]||Object[a],g={};g[a]=b(c),d(d.S+d.F*f(function(){c(1)}),"Object",g)}},function(a,b,c){var d=c(29),e=c(30),f=c(31),g="prototype",h=function(a,b,c){var i,j,k,l=a&h.F,m=a&h.G,n=a&h.S,o=a&h.P,p=a&h.B,q=a&h.W,r=m?e:e[b]||(e[b]={}),s=m?d:n?d[b]:(d[b]||{})[g];m&&(c=b);for(i in c)j=!l&&s&&i in s,j&&i in r||(k=j?s[i]:c[i],r[i]=m&&"function"!=typeof s[i]?c[i]:p&&j?f(k,d):q&&s[i]==k?function(a){var b=function(b){return this instanceof a?new a(b):a(b)};return b[g]=a[g],b}(k):o&&"function"==typeof k?f(Function.call,k):k,o&&((r[g]||(r[g]={}))[i]=k))};h.F=1,h.G=2,h.S=4,h.P=8,h.B=16,h.W=32,a.exports=h},function(a,b){var c=a.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=c)},function(a,b){var c=a.exports={version:"1.2.6"};"number"==typeof __e&&(__e=c)},function(a,b,c){var d=c(32);a.exports=function(a,b,c){if(d(a),void 0===b)return a;switch(c){case 1:return function(c){return a.call(b,c)};case 2:return function(c,d){return a.call(b,c,d)};case 3:return function(c,d,e){return a.call(b,c,d,e)}}return function(){return a.apply(b,arguments)}}},function(a,b){a.exports=function(a){if("function"!=typeof a)throw TypeError(a+" is not a function!");return a}},function(a,b){a.exports=function(a){try{return!!a()}catch(b){return!0}}},function(a,b){(function(c){"use strict";b.__esModule=!0,b["default"]=function(a){var b="undefined"!=typeof c?c:window,d=b.Handlebars;a.noConflict=function(){return b.Handlebars===a&&(b.Handlebars=d),a}},a.exports=b["default"]}).call(b,function(){return this}())},function(a,b){"use strict";b.__esModule=!0;var c={helpers:{helperExpression:function(a){return"SubExpression"===a.type||("MustacheStatement"===a.type||"BlockStatement"===a.type)&&!!(a.params&&a.params.length||a.hash)},scopedId:function(a){return/^\.|this\b/.test(a.original)},simpleId:function(a){return 1===a.parts.length&&!c.helpers.scopedId(a)&&!a.depth}}};b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){if("Program"===a.type)return a;h["default"].yy=n,n.locInfo=function(a){return new n.SourceLocation(b&&b.srcName,a)};var c=new j["default"](b);return c.accept(h["default"].parse(a))}var e=c(1)["default"],f=c(3)["default"];b.__esModule=!0,b.parse=d;var g=c(37),h=e(g),i=c(38),j=e(i),k=c(40),l=f(k),m=c(5);b.parser=h["default"];var n={};m.extend(n,l)},function(a,b){"use strict";b.__esModule=!0;var c=function(){function a(){this.yy={}}var b={trace:function(){},yy:{},symbols_:{error:2,root:3,program:4,EOF:5,program_repetition0:6,statement:7,mustache:8,block:9,rawBlock:10,partial:11,partialBlock:12,content:13,COMMENT:14,CONTENT:15,openRawBlock:16,rawBlock_repetition_plus0:17,END_RAW_BLOCK:18,OPEN_RAW_BLOCK:19,helperName:20,openRawBlock_repetition0:21,openRawBlock_option0:22,CLOSE_RAW_BLOCK:23,openBlock:24,block_option0:25,closeBlock:26,openInverse:27,block_option1:28,OPEN_BLOCK:29,openBlock_repetition0:30,openBlock_option0:31,openBlock_option1:32,CLOSE:33,OPEN_INVERSE:34,openInverse_repetition0:35,openInverse_option0:36,openInverse_option1:37,openInverseChain:38,OPEN_INVERSE_CHAIN:39,openInverseChain_repetition0:40,openInverseChain_option0:41,openInverseChain_option1:42,inverseAndProgram:43,INVERSE:44,inverseChain:45,inverseChain_option0:46,OPEN_ENDBLOCK:47,OPEN:48,mustache_repetition0:49,mustache_option0:50,OPEN_UNESCAPED:51,mustache_repetition1:52,mustache_option1:53,CLOSE_UNESCAPED:54,OPEN_PARTIAL:55,partialName:56,partial_repetition0:57,partial_option0:58,openPartialBlock:59,OPEN_PARTIAL_BLOCK:60,openPartialBlock_repetition0:61,openPartialBlock_option0:62,param:63,sexpr:64,OPEN_SEXPR:65,sexpr_repetition0:66,sexpr_option0:67,CLOSE_SEXPR:68,hash:69,hash_repetition_plus0:70,hashSegment:71,ID:72,EQUALS:73,blockParams:74,OPEN_BLOCK_PARAMS:75,blockParams_repetition_plus0:76,CLOSE_BLOCK_PARAMS:77,path:78,dataName:79,STRING:80,NUMBER:81,BOOLEAN:82,UNDEFINED:83,NULL:84,DATA:85,pathSegments:86,SEP:87,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",14:"COMMENT",15:"CONTENT",18:"END_RAW_BLOCK",19:"OPEN_RAW_BLOCK",23:"CLOSE_RAW_BLOCK",29:"OPEN_BLOCK",33:"CLOSE",34:"OPEN_INVERSE",39:"OPEN_INVERSE_CHAIN",44:"INVERSE",47:"OPEN_ENDBLOCK",48:"OPEN",51:"OPEN_UNESCAPED",54:"CLOSE_UNESCAPED",55:"OPEN_PARTIAL",60:"OPEN_PARTIAL_BLOCK",65:"OPEN_SEXPR",68:"CLOSE_SEXPR",72:"ID",73:"EQUALS",75:"OPEN_BLOCK_PARAMS",77:"CLOSE_BLOCK_PARAMS",80:"STRING",81:"NUMBER",82:"BOOLEAN",83:"UNDEFINED",84:"NULL",85:"DATA",87:"SEP"},productions_:[0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[13,1],[10,3],[16,5],[9,4],[9,4],[24,6],[27,6],[38,6],[43,2],[45,3],[45,1],[26,3],[8,5],[8,5],[11,5],[12,3],[59,5],[63,1],[63,1],[64,5],[69,1],[71,3],[74,3],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[56,1],[56,1],[79,2],[78,1],[86,3],[86,1],[6,0],[6,2],[17,1],[17,2],[21,0],[21,2],[22,0],[22,1],[25,0],[25,1],[28,0],[28,1],[30,0],[30,2],[31,0],[31,1],[32,0],[32,1],[35,0],[35,2],[36,0],[36,1],[37,0],[37,1],[40,0],[40,2],[41,0],[41,1],[42,0],[42,1],[46,0],[46,1],[49,0],[49,2],[50,0],[50,1],[52,0],[52,2],[53,0],[53,1],[57,0],[57,2],[58,0],[58,1],[61,0],[61,2],[62,0],[62,1],[66,0],[66,2],[67,0],[67,1],[70,1],[70,2],[76,1],[76,2]],performAction:function(a,b,c,d,e,f,g){var h=f.length-1;switch(e){case 1:return f[h-1];case 2:this.$=d.prepareProgram(f[h]);break;case 3:this.$=f[h];break;case 4:this.$=f[h];break;case 5:this.$=f[h];break;case 6:this.$=f[h];break;case 7:this.$=f[h];break;case 8:this.$=f[h];break;case 9:this.$={type:"CommentStatement",value:d.stripComment(f[h]),strip:d.stripFlags(f[h],f[h]),loc:d.locInfo(this._$)};break;case 10:this.$={type:"ContentStatement",original:f[h],value:f[h],loc:d.locInfo(this._$)};break;case 11:this.$=d.prepareRawBlock(f[h-2],f[h-1],f[h],this._$);break;case 12:this.$={path:f[h-3],params:f[h-2],hash:f[h-1]};break;case 13:this.$=d.prepareBlock(f[h-3],f[h-2],f[h-1],f[h],!1,this._$);break;case 14:this.$=d.prepareBlock(f[h-3],f[h-2],f[h-1],f[h],!0,this._$);break;case 15:this.$={open:f[h-5],path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 16:this.$={path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 17:this.$={path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 18:this.$={strip:d.stripFlags(f[h-1],f[h-1]),program:f[h]};break;case 19:var i=d.prepareBlock(f[h-2],f[h-1],f[h],f[h],!1,this._$),j=d.prepareProgram([i],f[h-1].loc);j.chained=!0,this.$={strip:f[h-2].strip,program:j,chain:!0};break;case 20:this.$=f[h];break;case 21:this.$={path:f[h-1],strip:d.stripFlags(f[h-2],f[h])};break;case 22:this.$=d.prepareMustache(f[h-3],f[h-2],f[h-1],f[h-4],d.stripFlags(f[h-4],f[h]),this._$);break;case 23:this.$=d.prepareMustache(f[h-3],f[h-2],f[h-1],f[h-4],d.stripFlags(f[h-4],f[h]),this._$);break;case 24:this.$={type:"PartialStatement",name:f[h-3],params:f[h-2],hash:f[h-1],indent:"",strip:d.stripFlags(f[h-4],f[h]),loc:d.locInfo(this._$)};break;case 25:this.$=d.preparePartialBlock(f[h-2],f[h-1],f[h],this._$);break;case 26:this.$={path:f[h-3],params:f[h-2],hash:f[h-1],strip:d.stripFlags(f[h-4],f[h])};break;case 27:this.$=f[h];break;case 28:this.$=f[h];break;case 29:this.$={type:"SubExpression",path:f[h-3],params:f[h-2],hash:f[h-1],loc:d.locInfo(this._$)};break;case 30:this.$={type:"Hash",pairs:f[h],loc:d.locInfo(this._$)};break;case 31:this.$={type:"HashPair",key:d.id(f[h-2]),value:f[h],loc:d.locInfo(this._$)};break;case 32:this.$=d.id(f[h-1]);break;case 33:this.$=f[h];break;case 34:this.$=f[h];break;case 35:this.$={type:"StringLiteral",value:f[h],original:f[h],loc:d.locInfo(this._$)};break;case 36:this.$={type:"NumberLiteral",value:Number(f[h]),original:Number(f[h]),loc:d.locInfo(this._$)};break;case 37:this.$={type:"BooleanLiteral",value:"true"===f[h],original:"true"===f[h],loc:d.locInfo(this._$)};break;case 38:this.$={type:"UndefinedLiteral",original:void 0,value:void 0,loc:d.locInfo(this._$)};break;case 39:this.$={type:"NullLiteral",original:null,value:null,loc:d.locInfo(this._$)};break;case 40:this.$=f[h];break;case 41:this.$=f[h];break;case 42:this.$=d.preparePath(!0,f[h],this._$);break;case 43:this.$=d.preparePath(!1,f[h],this._$);break;case 44:f[h-2].push({part:d.id(f[h]),original:f[h],separator:f[h-1]}),this.$=f[h-2];break;case 45:this.$=[{part:d.id(f[h]),original:f[h]}];break;case 46:this.$=[];break;case 47:f[h-1].push(f[h]);break;case 48:this.$=[f[h]];break;case 49:f[h-1].push(f[h]);break;case 50:this.$=[];break;case 51:f[h-1].push(f[h]);break;case 58:this.$=[];break;case 59:f[h-1].push(f[h]);break;case 64:this.$=[];break;case 65:f[h-1].push(f[h]);break;case 70:this.$=[];break;case 71:f[h-1].push(f[h]);break;case 78:this.$=[];break;case 79:f[h-1].push(f[h]);break;case 82:this.$=[];break;case 83:f[h-1].push(f[h]);break;case 86:this.$=[];break;case 87:f[h-1].push(f[h]);break;case 90:this.$=[];break;case 91:f[h-1].push(f[h]);break;case 94:this.$=[];break;case 95:f[h-1].push(f[h]);break;case 98:this.$=[f[h]];break;case 99:f[h-1].push(f[h]);break;case 100:this.$=[f[h]];break;case 101:f[h-1].push(f[h])}},table:[{3:1,4:2,5:[2,46],6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:10,13:11,14:[1,12],15:[1,20],16:17,19:[1,23],24:15,27:16,29:[1,21],34:[1,22],39:[2,2],44:[2,2],47:[2,2],48:[1,13],51:[1,14],55:[1,18],59:19,60:[1,24]},{1:[2,1]},{5:[2,47],14:[2,47],15:[2,47],19:[2,47],29:[2,47],34:[2,47],39:[2,47],44:[2,47],47:[2,47],48:[2,47],51:[2,47],55:[2,47],60:[2,47]},{5:[2,3],14:[2,3],15:[2,3],19:[2,3],29:[2,3],34:[2,3],39:[2,3],44:[2,3],47:[2,3],48:[2,3],51:[2,3],55:[2,3],60:[2,3]},{5:[2,4],14:[2,4],15:[2,4],19:[2,4],29:[2,4],34:[2,4],39:[2,4],44:[2,4],47:[2,4],48:[2,4],51:[2,4],55:[2,4],60:[2,4]},{5:[2,5],14:[2,5],15:[2,5],19:[2,5],29:[2,5],34:[2,5],39:[2,5],44:[2,5],47:[2,5],48:[2,5],51:[2,5],55:[2,5],60:[2,5]},{5:[2,6],14:[2,6],15:[2,6],19:[2,6],29:[2,6],34:[2,6],39:[2,6],44:[2,6],47:[2,6],48:[2,6],51:[2,6],55:[2,6],60:[2,6]},{5:[2,7],14:[2,7],15:[2,7],19:[2,7],29:[2,7],34:[2,7],39:[2,7],44:[2,7],47:[2,7],48:[2,7],51:[2,7],55:[2,7],60:[2,7]},{5:[2,8],14:[2,8],15:[2,8],19:[2,8],29:[2,8],34:[2,8],39:[2,8],44:[2,8],47:[2,8],48:[2,8],51:[2,8],55:[2,8],60:[2,8]},{5:[2,9],14:[2,9],15:[2,9],19:[2,9],29:[2,9],34:[2,9],39:[2,9],44:[2,9],47:[2,9],48:[2,9],51:[2,9],55:[2,9],60:[2,9]},{20:25,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:36,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:37,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{4:38,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{13:40,15:[1,20],17:39},{20:42,56:41,64:43,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:45,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{5:[2,10],14:[2,10],15:[2,10],18:[2,10],19:[2,10],29:[2,10],34:[2,10],39:[2,10],44:[2,10],47:[2,10],48:[2,10],51:[2,10],55:[2,10],60:[2,10]},{20:46,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:47,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:48,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:42,56:49,64:43,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[2,78],49:50,65:[2,78],72:[2,78],80:[2,78],81:[2,78],82:[2,78],83:[2,78],84:[2,78],85:[2,78]},{23:[2,33],33:[2,33],54:[2,33],65:[2,33],68:[2,33],72:[2,33],75:[2,33],80:[2,33],81:[2,33],82:[2,33],83:[2,33],84:[2,33],85:[2,33]},{23:[2,34],33:[2,34],54:[2,34],65:[2,34],68:[2,34],72:[2,34],75:[2,34],80:[2,34],81:[2,34],82:[2,34],83:[2,34],84:[2,34],85:[2,34]},{23:[2,35],33:[2,35],54:[2,35],65:[2,35],68:[2,35],72:[2,35],75:[2,35],80:[2,35],81:[2,35],82:[2,35],83:[2,35],84:[2,35],85:[2,35]},{23:[2,36],33:[2,36],54:[2,36],65:[2,36],68:[2,36],72:[2,36],75:[2,36],80:[2,36],81:[2,36],82:[2,36],83:[2,36],84:[2,36],85:[2,36]},{23:[2,37],33:[2,37],54:[2,37],65:[2,37],68:[2,37],72:[2,37],75:[2,37],80:[2,37],81:[2,37],82:[2,37],83:[2,37],84:[2,37],85:[2,37]},{23:[2,38],33:[2,38],54:[2,38],65:[2,38],68:[2,38],72:[2,38],75:[2,38],80:[2,38],81:[2,38],82:[2,38],83:[2,38],84:[2,38],85:[2,38]},{23:[2,39],33:[2,39],54:[2,39],65:[2,39],68:[2,39],72:[2,39],75:[2,39],80:[2,39],81:[2,39],82:[2,39],83:[2,39],84:[2,39],85:[2,39]},{23:[2,43],33:[2,43],54:[2,43],65:[2,43],68:[2,43],72:[2,43],75:[2,43],80:[2,43],81:[2,43],82:[2,43],83:[2,43],84:[2,43],85:[2,43],87:[1,51]},{72:[1,35],86:52},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{52:53,54:[2,82],65:[2,82],72:[2,82],80:[2,82],81:[2,82],82:[2,82],83:[2,82],84:[2,82],85:[2,82]},{25:54,38:56,39:[1,58],43:57,44:[1,59],45:55,47:[2,54]},{28:60,43:61,44:[1,59],47:[2,56]},{13:63,15:[1,20],18:[1,62]},{15:[2,48],18:[2,48]},{33:[2,86],57:64,65:[2,86],72:[2,86],80:[2,86],81:[2,86],82:[2,86],83:[2,86],84:[2,86],85:[2,86]},{33:[2,40],65:[2,40],72:[2,40],80:[2,40],81:[2,40],82:[2,40],83:[2,40],84:[2,40],85:[2,40]},{33:[2,41],65:[2,41],72:[2,41],80:[2,41],81:[2,41],82:[2,41],83:[2,41],84:[2,41],85:[2,41]},{20:65,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:66,47:[1,67]},{30:68,33:[2,58],65:[2,58],72:[2,58],75:[2,58],80:[2,58],81:[2,58],82:[2,58],83:[2,58],84:[2,58],85:[2,58]},{33:[2,64],35:69,65:[2,64],72:[2,64],75:[2,64],80:[2,64],81:[2,64],82:[2,64],83:[2,64],84:[2,64],85:[2,64]},{21:70,23:[2,50],65:[2,50],72:[2,50],80:[2,50],81:[2,50],82:[2,50],83:[2,50],84:[2,50],85:[2,50]},{33:[2,90],61:71,65:[2,90],72:[2,90],80:[2,90],81:[2,90],82:[2,90],83:[2,90],84:[2,90],85:[2,90]},{20:75,33:[2,80],50:72,63:73,64:76,65:[1,44],69:74,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{72:[1,80]},{23:[2,42],33:[2,42],54:[2,42],65:[2,42],68:[2,42],72:[2,42],75:[2,42],80:[2,42],81:[2,42],82:[2,42],83:[2,42],84:[2,42],85:[2,42],87:[1,51]},{20:75,53:81,54:[2,84],63:82,64:76,65:[1,44],69:83,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:84,47:[1,67]},{47:[2,55]},{4:85,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{47:[2,20]},{20:86,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:87,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{26:88,47:[1,67]},{47:[2,57]},{5:[2,11],14:[2,11],15:[2,11],19:[2,11],29:[2,11],34:[2,11],39:[2,11],44:[2,11],47:[2,11],48:[2,11],51:[2,11],55:[2,11],60:[2,11]},{15:[2,49],18:[2,49]},{20:75,33:[2,88],58:89,63:90,64:76,65:[1,44],69:91,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{65:[2,94],66:92,68:[2,94],72:[2,94],80:[2,94],81:[2,94],82:[2,94],83:[2,94],84:[2,94],85:[2,94]},{5:[2,25],14:[2,25],15:[2,25],19:[2,25],29:[2,25],34:[2,25],39:[2,25],44:[2,25],47:[2,25],48:[2,25],51:[2,25],55:[2,25],60:[2,25]},{20:93,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,31:94,33:[2,60],63:95,64:76,65:[1,44],69:96,70:77,71:78,72:[1,79],75:[2,60],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,33:[2,66],36:97,63:98,64:76,65:[1,44],69:99,70:77,71:78,72:[1,79],75:[2,66],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,22:100,23:[2,52],63:101,64:76,65:[1,44],69:102,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,33:[2,92],62:103,63:104,64:76,65:[1,44],69:105,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,106]},{33:[2,79],65:[2,79],72:[2,79],80:[2,79],81:[2,79],82:[2,79],83:[2,79],84:[2,79],85:[2,79]},{33:[2,81]},{23:[2,27],33:[2,27],54:[2,27],65:[2,27],68:[2,27],72:[2,27],75:[2,27],80:[2,27],81:[2,27],82:[2,27],83:[2,27],84:[2,27],85:[2,27]},{23:[2,28],33:[2,28],54:[2,28],65:[2,28],68:[2,28],72:[2,28],75:[2,28],80:[2,28],81:[2,28],82:[2,28],83:[2,28],84:[2,28],85:[2,28]},{23:[2,30],33:[2,30],54:[2,30],68:[2,30],71:107,72:[1,108],75:[2,30]},{23:[2,98],33:[2,98],54:[2,98],68:[2,98],72:[2,98],75:[2,98]},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],73:[1,109],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{23:[2,44],33:[2,44],54:[2,44],65:[2,44],68:[2,44],72:[2,44],75:[2,44],80:[2,44],81:[2,44],82:[2,44],83:[2,44],84:[2,44],85:[2,44],87:[2,44]},{54:[1,110]},{54:[2,83],65:[2,83],72:[2,83],80:[2,83],81:[2,83],82:[2,83],83:[2,83],84:[2,83],85:[2,83]},{54:[2,85]},{5:[2,13],14:[2,13],15:[2,13],19:[2,13],29:[2,13],34:[2,13],39:[2,13],44:[2,13],47:[2,13],48:[2,13],51:[2,13],55:[2,13],60:[2,13]},{38:56,39:[1,58],43:57,44:[1,59],45:112,46:111,47:[2,76]},{33:[2,70],40:113,65:[2,70],72:[2,70],75:[2,70],80:[2,70],81:[2,70],82:[2,70],83:[2,70],84:[2,70],85:[2,70]},{47:[2,18]},{5:[2,14],14:[2,14],15:[2,14],19:[2,14],29:[2,14],34:[2,14],39:[2,14],44:[2,14],47:[2,14],48:[2,14],51:[2,14],55:[2,14],60:[2,14]},{33:[1,114]},{33:[2,87],65:[2,87],72:[2,87],80:[2,87],81:[2,87],82:[2,87],83:[2,87],84:[2,87],
28
  85:[2,87]},{33:[2,89]},{20:75,63:116,64:76,65:[1,44],67:115,68:[2,96],69:117,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,118]},{32:119,33:[2,62],74:120,75:[1,121]},{33:[2,59],65:[2,59],72:[2,59],75:[2,59],80:[2,59],81:[2,59],82:[2,59],83:[2,59],84:[2,59],85:[2,59]},{33:[2,61],75:[2,61]},{33:[2,68],37:122,74:123,75:[1,121]},{33:[2,65],65:[2,65],72:[2,65],75:[2,65],80:[2,65],81:[2,65],82:[2,65],83:[2,65],84:[2,65],85:[2,65]},{33:[2,67],75:[2,67]},{23:[1,124]},{23:[2,51],65:[2,51],72:[2,51],80:[2,51],81:[2,51],82:[2,51],83:[2,51],84:[2,51],85:[2,51]},{23:[2,53]},{33:[1,125]},{33:[2,91],65:[2,91],72:[2,91],80:[2,91],81:[2,91],82:[2,91],83:[2,91],84:[2,91],85:[2,91]},{33:[2,93]},{5:[2,22],14:[2,22],15:[2,22],19:[2,22],29:[2,22],34:[2,22],39:[2,22],44:[2,22],47:[2,22],48:[2,22],51:[2,22],55:[2,22],60:[2,22]},{23:[2,99],33:[2,99],54:[2,99],68:[2,99],72:[2,99],75:[2,99]},{73:[1,109]},{20:75,63:126,64:76,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,23],14:[2,23],15:[2,23],19:[2,23],29:[2,23],34:[2,23],39:[2,23],44:[2,23],47:[2,23],48:[2,23],51:[2,23],55:[2,23],60:[2,23]},{47:[2,19]},{47:[2,77]},{20:75,33:[2,72],41:127,63:128,64:76,65:[1,44],69:129,70:77,71:78,72:[1,79],75:[2,72],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,24],14:[2,24],15:[2,24],19:[2,24],29:[2,24],34:[2,24],39:[2,24],44:[2,24],47:[2,24],48:[2,24],51:[2,24],55:[2,24],60:[2,24]},{68:[1,130]},{65:[2,95],68:[2,95],72:[2,95],80:[2,95],81:[2,95],82:[2,95],83:[2,95],84:[2,95],85:[2,95]},{68:[2,97]},{5:[2,21],14:[2,21],15:[2,21],19:[2,21],29:[2,21],34:[2,21],39:[2,21],44:[2,21],47:[2,21],48:[2,21],51:[2,21],55:[2,21],60:[2,21]},{33:[1,131]},{33:[2,63]},{72:[1,133],76:132},{33:[1,134]},{33:[2,69]},{15:[2,12]},{14:[2,26],15:[2,26],19:[2,26],29:[2,26],34:[2,26],47:[2,26],48:[2,26],51:[2,26],55:[2,26],60:[2,26]},{23:[2,31],33:[2,31],54:[2,31],68:[2,31],72:[2,31],75:[2,31]},{33:[2,74],42:135,74:136,75:[1,121]},{33:[2,71],65:[2,71],72:[2,71],75:[2,71],80:[2,71],81:[2,71],82:[2,71],83:[2,71],84:[2,71],85:[2,71]},{33:[2,73],75:[2,73]},{23:[2,29],33:[2,29],54:[2,29],65:[2,29],68:[2,29],72:[2,29],75:[2,29],80:[2,29],81:[2,29],82:[2,29],83:[2,29],84:[2,29],85:[2,29]},{14:[2,15],15:[2,15],19:[2,15],29:[2,15],34:[2,15],39:[2,15],44:[2,15],47:[2,15],48:[2,15],51:[2,15],55:[2,15],60:[2,15]},{72:[1,138],77:[1,137]},{72:[2,100],77:[2,100]},{14:[2,16],15:[2,16],19:[2,16],29:[2,16],34:[2,16],44:[2,16],47:[2,16],48:[2,16],51:[2,16],55:[2,16],60:[2,16]},{33:[1,139]},{33:[2,75]},{33:[2,32]},{72:[2,101],77:[2,101]},{14:[2,17],15:[2,17],19:[2,17],29:[2,17],34:[2,17],39:[2,17],44:[2,17],47:[2,17],48:[2,17],51:[2,17],55:[2,17],60:[2,17]}],defaultActions:{4:[2,1],55:[2,55],57:[2,20],61:[2,57],74:[2,81],83:[2,85],87:[2,18],91:[2,89],102:[2,53],105:[2,93],111:[2,19],112:[2,77],117:[2,97],120:[2,63],123:[2,69],124:[2,12],136:[2,75],137:[2,32]},parseError:function(a,b){throw new Error(a)},parse:function(a){function b(){var a;return a=c.lexer.lex()||1,"number"!=typeof a&&(a=c.symbols_[a]||a),a}var c=this,d=[0],e=[null],f=[],g=this.table,h="",i=0,j=0,k=0;this.lexer.setInput(a),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,"undefined"==typeof this.lexer.yylloc&&(this.lexer.yylloc={});var l=this.lexer.yylloc;f.push(l);var m=this.lexer.options&&this.lexer.options.ranges;"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var n,o,p,q,r,s,t,u,v,w={};;){if(p=d[d.length-1],this.defaultActions[p]?q=this.defaultActions[p]:(null!==n&&"undefined"!=typeof n||(n=b()),q=g[p]&&g[p][n]),"undefined"==typeof q||!q.length||!q[0]){var x="";if(!k){v=[];for(s in g[p])this.terminals_[s]&&s>2&&v.push("'"+this.terminals_[s]+"'");x=this.lexer.showPosition?"Parse error on line "+(i+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+v.join(", ")+", got '"+(this.terminals_[n]||n)+"'":"Parse error on line "+(i+1)+": Unexpected "+(1==n?"end of input":"'"+(this.terminals_[n]||n)+"'"),this.parseError(x,{text:this.lexer.match,token:this.terminals_[n]||n,line:this.lexer.yylineno,loc:l,expected:v})}}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+p+", token: "+n);switch(q[0]){case 1:d.push(n),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(q[1]),n=null,o?(n=o,o=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,l=this.lexer.yylloc,k>0&&k--);break;case 2:if(t=this.productions_[q[1]][1],w.$=e[e.length-t],w._$={first_line:f[f.length-(t||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(t||1)].first_column,last_column:f[f.length-1].last_column},m&&(w._$.range=[f[f.length-(t||1)].range[0],f[f.length-1].range[1]]),r=this.performAction.call(w,h,j,i,this.yy,q[1],e,f),"undefined"!=typeof r)return r;t&&(d=d.slice(0,-1*t*2),e=e.slice(0,-1*t),f=f.slice(0,-1*t)),d.push(this.productions_[q[1]][0]),e.push(w.$),f.push(w._$),u=g[d[d.length-2]][d[d.length-1]],d.push(u);break;case 3:return!0}}return!0}},c=function(){var a={EOF:1,parseError:function(a,b){if(!this.yy.parser)throw new Error(a);this.yy.parser.parseError(a,b)},setInput:function(a){return this._input=a,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a;var b=a.match(/(?:\r\n?|\n).*/g);return b?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},unput:function(a){var b=a.length,c=a.split(/(?:\r\n?|\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-b-1),this.offset-=b;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===d.length?this.yylloc.first_column:0)+d[d.length-c.length].length-c[0].length:this.yylloc.first_column-b},this.options.ranges&&(this.yylloc.range=[e[0],e[0]+this.yyleng-b]),this},more:function(){return this._more=!0,this},less:function(a){this.unput(this.match.slice(a))},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var a=this.pastInput(),b=new Array(a.length+1).join("-");return a+this.upcomingInput()+"\n"+b+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d,e;this._more||(this.yytext="",this.match="");for(var f=this._currentRules(),g=0;g<f.length&&(c=this._input.match(this.rules[f[g]]),!c||b&&!(c[0].length>b[0].length)||(b=c,d=g,this.options.flex));g++);return b?(e=b[0].match(/(?:\r\n?|\n).*/g),e&&(this.yylineno+=e.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:e?e[e.length-1].length-e[e.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.matches=b,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],a=this.performAction.call(this,this.yy,this,f[d],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a?a:void 0):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var a=this.next();return"undefined"!=typeof a?a:this.lex()},begin:function(a){this.conditionStack.push(a)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(a){this.begin(a)}};return a.options={},a.performAction=function(a,b,c,d){function e(a,c){return b.yytext=b.yytext.substr(a,b.yyleng-c)}switch(c){case 0:if("\\\\"===b.yytext.slice(-2)?(e(0,1),this.begin("mu")):"\\"===b.yytext.slice(-1)?(e(0,1),this.begin("emu")):this.begin("mu"),b.yytext)return 15;break;case 1:return 15;case 2:return this.popState(),15;case 3:return this.begin("raw"),15;case 4:return this.popState(),"raw"===this.conditionStack[this.conditionStack.length-1]?15:(b.yytext=b.yytext.substr(5,b.yyleng-9),"END_RAW_BLOCK");case 5:return 15;case 6:return this.popState(),14;case 7:return 65;case 8:return 68;case 9:return 19;case 10:return this.popState(),this.begin("raw"),23;case 11:return 55;case 12:return 60;case 13:return 29;case 14:return 47;case 15:return this.popState(),44;case 16:return this.popState(),44;case 17:return 34;case 18:return 39;case 19:return 51;case 20:return 48;case 21:this.unput(b.yytext),this.popState(),this.begin("com");break;case 22:return this.popState(),14;case 23:return 48;case 24:return 73;case 25:return 72;case 26:return 72;case 27:return 87;case 28:break;case 29:return this.popState(),54;case 30:return this.popState(),33;case 31:return b.yytext=e(1,2).replace(/\\"/g,'"'),80;case 32:return b.yytext=e(1,2).replace(/\\'/g,"'"),80;case 33:return 85;case 34:return 82;case 35:return 82;case 36:return 83;case 37:return 84;case 38:return 81;case 39:return 75;case 40:return 77;case 41:return 72;case 42:return b.yytext=b.yytext.replace(/\\([\\\]])/g,"$1"),72;case 43:return"INVALID";case 44:return 5}},a.rules=[/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{(?=[^\/]))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]*?(?=(\{\{\{\{)))/,/^(?:[\s\S]*?--(~)?\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#>)/,/^(?:\{\{(~)?#\*?)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{(~)?!--)/,/^(?:\{\{(~)?![\s\S]*?\}\})/,/^(?:\{\{(~)?\*?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)|])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:undefined(?=([~}\s)])))/,/^(?:null(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:as\s+\|)/,/^(?:\|)/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/,/^(?:\[(\\\]|[^\]])*\])/,/^(?:.)/,/^(?:$)/],a.conditions={mu:{rules:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],inclusive:!1},emu:{rules:[2],inclusive:!1},com:{rules:[6],inclusive:!1},raw:{rules:[3,4,5],inclusive:!1},INITIAL:{rules:[0,1,44],inclusive:!0}},a}();return b.lexer=c,a.prototype=b,b.Parser=a,new a}();b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(){var a=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.options=a}function e(a,b,c){void 0===b&&(b=a.length);var d=a[b-1],e=a[b-2];return d?"ContentStatement"===d.type?(e||!c?/\r?\n\s*?$/:/(^|\r?\n)\s*?$/).test(d.original):void 0:c}function f(a,b,c){void 0===b&&(b=-1);var d=a[b+1],e=a[b+2];return d?"ContentStatement"===d.type?(e||!c?/^\s*?\r?\n/:/^\s*?(\r?\n|$)/).test(d.original):void 0:c}function g(a,b,c){var d=a[null==b?0:b+1];if(d&&"ContentStatement"===d.type&&(c||!d.rightStripped)){var e=d.value;d.value=d.value.replace(c?/^\s+/:/^[ \t]*\r?\n?/,""),d.rightStripped=d.value!==e}}function h(a,b,c){var d=a[null==b?a.length-1:b-1];if(d&&"ContentStatement"===d.type&&(c||!d.leftStripped)){var e=d.value;return d.value=d.value.replace(c?/\s+$/:/[ \t]+$/,""),d.leftStripped=d.value!==e,d.leftStripped}}var i=c(1)["default"];b.__esModule=!0;var j=c(39),k=i(j);d.prototype=new k["default"],d.prototype.Program=function(a){var b=!this.options.ignoreStandalone,c=!this.isRootSeen;this.isRootSeen=!0;for(var d=a.body,i=0,j=d.length;i<j;i++){var k=d[i],l=this.accept(k);if(l){var m=e(d,i,c),n=f(d,i,c),o=l.openStandalone&&m,p=l.closeStandalone&&n,q=l.inlineStandalone&&m&&n;l.close&&g(d,i,!0),l.open&&h(d,i,!0),b&&q&&(g(d,i),h(d,i)&&"PartialStatement"===k.type&&(k.indent=/([ \t]+$)/.exec(d[i-1].original)[1])),b&&o&&(g((k.program||k.inverse).body),h(d,i)),b&&p&&(g(d,i),h((k.inverse||k.program).body))}}return a},d.prototype.BlockStatement=d.prototype.DecoratorBlock=d.prototype.PartialBlockStatement=function(a){this.accept(a.program),this.accept(a.inverse);var b=a.program||a.inverse,c=a.program&&a.inverse,d=c,i=c;if(c&&c.chained)for(d=c.body[0].program;i.chained;)i=i.body[i.body.length-1].program;var j={open:a.openStrip.open,close:a.closeStrip.close,openStandalone:f(b.body),closeStandalone:e((d||b).body)};if(a.openStrip.close&&g(b.body,null,!0),c){var k=a.inverseStrip;k.open&&h(b.body,null,!0),k.close&&g(d.body,null,!0),a.closeStrip.open&&h(i.body,null,!0),!this.options.ignoreStandalone&&e(b.body)&&f(d.body)&&(h(b.body),g(d.body))}else a.closeStrip.open&&h(b.body,null,!0);return j},d.prototype.Decorator=d.prototype.MustacheStatement=function(a){return a.strip},d.prototype.PartialStatement=d.prototype.CommentStatement=function(a){var b=a.strip||{};return{inlineStandalone:!0,open:b.open,close:b.close}},b["default"]=d,a.exports=b["default"]},function(a,b,c){"use strict";function d(){this.parents=[]}function e(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash")}function f(a){e.call(this,a),this.acceptKey(a,"program"),this.acceptKey(a,"inverse")}function g(a){this.acceptRequired(a,"name"),this.acceptArray(a.params),this.acceptKey(a,"hash")}var h=c(1)["default"];b.__esModule=!0;var i=c(6),j=h(i);d.prototype={constructor:d,mutating:!1,acceptKey:function(a,b){var c=this.accept(a[b]);if(this.mutating){if(c&&!d.prototype[c.type])throw new j["default"]('Unexpected node type "'+c.type+'" found when accepting '+b+" on "+a.type);a[b]=c}},acceptRequired:function(a,b){if(this.acceptKey(a,b),!a[b])throw new j["default"](a.type+" requires "+b)},acceptArray:function(a){for(var b=0,c=a.length;b<c;b++)this.acceptKey(a,b),a[b]||(a.splice(b,1),b--,c--)},accept:function(a){if(a){if(!this[a.type])throw new j["default"]("Unknown type: "+a.type,a);this.current&&this.parents.unshift(this.current),this.current=a;var b=this[a.type](a);return this.current=this.parents.shift(),!this.mutating||b?b:b!==!1?a:void 0}},Program:function(a){this.acceptArray(a.body)},MustacheStatement:e,Decorator:e,BlockStatement:f,DecoratorBlock:f,PartialStatement:g,PartialBlockStatement:function(a){g.call(this,a),this.acceptKey(a,"program")},ContentStatement:function(){},CommentStatement:function(){},SubExpression:e,PathExpression:function(){},StringLiteral:function(){},NumberLiteral:function(){},BooleanLiteral:function(){},UndefinedLiteral:function(){},NullLiteral:function(){},Hash:function(a){this.acceptArray(a.pairs)},HashPair:function(a){this.acceptRequired(a,"value")}},b["default"]=d,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){if(b=b.path?b.path.original:b,a.path.original!==b){var c={loc:a.path.loc};throw new q["default"](a.path.original+" doesn't match "+b,c)}}function e(a,b){this.source=a,this.start={line:b.first_line,column:b.first_column},this.end={line:b.last_line,column:b.last_column}}function f(a){return/^\[.*\]$/.test(a)?a.substr(1,a.length-2):a}function g(a,b){return{open:"~"===a.charAt(2),close:"~"===b.charAt(b.length-3)}}function h(a){return a.replace(/^\{\{~?\!-?-?/,"").replace(/-?-?~?\}\}$/,"")}function i(a,b,c){c=this.locInfo(c);for(var d=a?"@":"",e=[],f=0,g="",h=0,i=b.length;h<i;h++){var j=b[h].part,k=b[h].original!==j;if(d+=(b[h].separator||"")+j,k||".."!==j&&"."!==j&&"this"!==j)e.push(j);else{if(e.length>0)throw new q["default"]("Invalid path: "+d,{loc:c});".."===j&&(f++,g+="../")}}return{type:"PathExpression",data:a,depth:f,parts:e,original:d,loc:c}}function j(a,b,c,d,e,f){var g=d.charAt(3)||d.charAt(2),h="{"!==g&&"&"!==g,i=/\*/.test(d);return{type:i?"Decorator":"MustacheStatement",path:a,params:b,hash:c,escaped:h,strip:e,loc:this.locInfo(f)}}function k(a,b,c,e){d(a,c),e=this.locInfo(e);var f={type:"Program",body:b,strip:{},loc:e};return{type:"BlockStatement",path:a.path,params:a.params,hash:a.hash,program:f,openStrip:{},inverseStrip:{},closeStrip:{},loc:e}}function l(a,b,c,e,f,g){e&&e.path&&d(a,e);var h=/\*/.test(a.open);b.blockParams=a.blockParams;var i=void 0,j=void 0;if(c){if(h)throw new q["default"]("Unexpected inverse block on decorator",c);c.chain&&(c.program.body[0].closeStrip=e.strip),j=c.strip,i=c.program}return f&&(f=i,i=b,b=f),{type:h?"DecoratorBlock":"BlockStatement",path:a.path,params:a.params,hash:a.hash,program:b,inverse:i,openStrip:a.strip,inverseStrip:j,closeStrip:e&&e.strip,loc:this.locInfo(g)}}function m(a,b){if(!b&&a.length){var c=a[0].loc,d=a[a.length-1].loc;c&&d&&(b={source:c.source,start:{line:c.start.line,column:c.start.column},end:{line:d.end.line,column:d.end.column}})}return{type:"Program",body:a,strip:{},loc:b}}function n(a,b,c,e){return d(a,c),{type:"PartialBlockStatement",name:a.path,params:a.params,hash:a.hash,program:b,openStrip:a.strip,closeStrip:c&&c.strip,loc:this.locInfo(e)}}var o=c(1)["default"];b.__esModule=!0,b.SourceLocation=e,b.id=f,b.stripFlags=g,b.stripComment=h,b.preparePath=i,b.prepareMustache=j,b.prepareRawBlock=k,b.prepareBlock=l,b.prepareProgram=m,b.preparePartialBlock=n;var p=c(6),q=o(p)},function(a,b,c){"use strict";function d(){}function e(a,b,c){if(null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.precompile. You passed "+a);b=b||{},"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var d=c.parse(a,b),e=(new c.Compiler).compile(d,b);return(new c.JavaScriptCompiler).compile(e,b)}function f(a,b,c){function d(){var d=c.parse(a,b),e=(new c.Compiler).compile(d,b),f=(new c.JavaScriptCompiler).compile(e,b,void 0,!0);return c.template(f)}function e(a,b){return f||(f=d()),f.call(this,a,b)}if(void 0===b&&(b={}),null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+a);b=l.extend({},b),"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var f=void 0;return e._setup=function(a){return f||(f=d()),f._setup(a)},e._child=function(a,b,c,e){return f||(f=d()),f._child(a,b,c,e)},e}function g(a,b){if(a===b)return!0;if(l.isArray(a)&&l.isArray(b)&&a.length===b.length){for(var c=0;c<a.length;c++)if(!g(a[c],b[c]))return!1;return!0}}function h(a){if(!a.path.parts){var b=a.path;a.path={type:"PathExpression",data:!1,depth:0,parts:[b.original+""],original:b.original+"",loc:b.loc}}}var i=c(1)["default"];b.__esModule=!0,b.Compiler=d,b.precompile=e,b.compile=f;var j=c(6),k=i(j),l=c(5),m=c(35),n=i(m),o=[].slice;d.prototype={compiler:d,equals:function(a){var b=this.opcodes.length;if(a.opcodes.length!==b)return!1;for(var c=0;c<b;c++){var d=this.opcodes[c],e=a.opcodes[c];if(d.opcode!==e.opcode||!g(d.args,e.args))return!1}b=this.children.length;for(var c=0;c<b;c++)if(!this.children[c].equals(a.children[c]))return!1;return!0},guid:0,compile:function(a,b){this.sourceNode=[],this.opcodes=[],this.children=[],this.options=b,this.stringParams=b.stringParams,this.trackIds=b.trackIds,b.blockParams=b.blockParams||[];var c=b.knownHelpers;if(b.knownHelpers={helperMissing:!0,blockHelperMissing:!0,each:!0,"if":!0,unless:!0,"with":!0,log:!0,lookup:!0},c)for(var d in c)d in c&&(this.options.knownHelpers[d]=c[d]);return this.accept(a)},compileProgram:function(a){var b=new this.compiler,c=b.compile(a,this.options),d=this.guid++;return this.usePartial=this.usePartial||c.usePartial,this.children[d]=c,this.useDepths=this.useDepths||c.useDepths,d},accept:function(a){if(!this[a.type])throw new k["default"]("Unknown type: "+a.type,a);this.sourceNode.unshift(a);var b=this[a.type](a);return this.sourceNode.shift(),b},Program:function(a){this.options.blockParams.unshift(a.blockParams);for(var b=a.body,c=b.length,d=0;d<c;d++)this.accept(b[d]);return this.options.blockParams.shift(),this.isSimple=1===c,this.blockParams=a.blockParams?a.blockParams.length:0,this},BlockStatement:function(a){h(a);var b=a.program,c=a.inverse;b=b&&this.compileProgram(b),c=c&&this.compileProgram(c);var d=this.classifySexpr(a);"helper"===d?this.helperSexpr(a,b,c):"simple"===d?(this.simpleSexpr(a),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("blockValue",a.path.original)):(this.ambiguousSexpr(a,b,c),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("ambiguousBlockValue")),this.opcode("append")},DecoratorBlock:function(a){var b=a.program&&this.compileProgram(a.program),c=this.setupFullMustacheParams(a,b,void 0),d=a.path;this.useDecorators=!0,this.opcode("registerDecorator",c.length,d.original)},PartialStatement:function(a){this.usePartial=!0;var b=a.program;b&&(b=this.compileProgram(a.program));var c=a.params;if(c.length>1)throw new k["default"]("Unsupported number of partial arguments: "+c.length,a);c.length||(this.options.explicitPartialContext?this.opcode("pushLiteral","undefined"):c.push({type:"PathExpression",parts:[],depth:0}));var d=a.name.original,e="SubExpression"===a.name.type;e&&this.accept(a.name),this.setupFullMustacheParams(a,b,void 0,!0);var f=a.indent||"";this.options.preventIndent&&f&&(this.opcode("appendContent",f),f=""),this.opcode("invokePartial",e,d,f),this.opcode("append")},PartialBlockStatement:function(a){this.PartialStatement(a)},MustacheStatement:function(a){this.SubExpression(a),a.escaped&&!this.options.noEscape?this.opcode("appendEscaped"):this.opcode("append")},Decorator:function(a){this.DecoratorBlock(a)},ContentStatement:function(a){a.value&&this.opcode("appendContent",a.value)},CommentStatement:function(){},SubExpression:function(a){h(a);var b=this.classifySexpr(a);"simple"===b?this.simpleSexpr(a):"helper"===b?this.helperSexpr(a):this.ambiguousSexpr(a)},ambiguousSexpr:function(a,b,c){var d=a.path,e=d.parts[0],f=null!=b||null!=c;this.opcode("getContext",d.depth),this.opcode("pushProgram",b),this.opcode("pushProgram",c),d.strict=!0,this.accept(d),this.opcode("invokeAmbiguous",e,f)},simpleSexpr:function(a){var b=a.path;b.strict=!0,this.accept(b),this.opcode("resolvePossibleLambda")},helperSexpr:function(a,b,c){var d=this.setupFullMustacheParams(a,b,c),e=a.path,f=e.parts[0];if(this.options.knownHelpers[f])this.opcode("invokeKnownHelper",d.length,f);else{if(this.options.knownHelpersOnly)throw new k["default"]("You specified knownHelpersOnly, but used the unknown helper "+f,a);e.strict=!0,e.falsy=!0,this.accept(e),this.opcode("invokeHelper",d.length,e.original,n["default"].helpers.simpleId(e))}},PathExpression:function(a){this.addDepth(a.depth),this.opcode("getContext",a.depth);var b=a.parts[0],c=n["default"].helpers.scopedId(a),d=!a.depth&&!c&&this.blockParamIndex(b);d?this.opcode("lookupBlockParam",d,a.parts):b?a.data?(this.options.data=!0,this.opcode("lookupData",a.depth,a.parts,a.strict)):this.opcode("lookupOnContext",a.parts,a.falsy,a.strict,c):this.opcode("pushContext")},StringLiteral:function(a){this.opcode("pushString",a.value)},NumberLiteral:function(a){this.opcode("pushLiteral",a.value)},BooleanLiteral:function(a){this.opcode("pushLiteral",a.value)},UndefinedLiteral:function(){this.opcode("pushLiteral","undefined")},NullLiteral:function(){this.opcode("pushLiteral","null")},Hash:function(a){var b=a.pairs,c=0,d=b.length;for(this.opcode("pushHash");c<d;c++)this.pushParam(b[c].value);for(;c--;)this.opcode("assignToHash",b[c].key);this.opcode("popHash")},opcode:function(a){this.opcodes.push({opcode:a,args:o.call(arguments,1),loc:this.sourceNode[0].loc})},addDepth:function(a){a&&(this.useDepths=!0)},classifySexpr:function(a){var b=n["default"].helpers.simpleId(a.path),c=b&&!!this.blockParamIndex(a.path.parts[0]),d=!c&&n["default"].helpers.helperExpression(a),e=!c&&(d||b);if(e&&!d){var f=a.path.parts[0],g=this.options;g.knownHelpers[f]?d=!0:g.knownHelpersOnly&&(e=!1)}return d?"helper":e?"ambiguous":"simple"},pushParams:function(a){for(var b=0,c=a.length;b<c;b++)this.pushParam(a[b])},pushParam:function(a){var b=null!=a.value?a.value:a.original||"";if(this.stringParams)b.replace&&(b=b.replace(/^(\.?\.\/)*/g,"").replace(/\//g,".")),a.depth&&this.addDepth(a.depth),this.opcode("getContext",a.depth||0),this.opcode("pushStringParam",b,a.type),"SubExpression"===a.type&&this.accept(a);else{if(this.trackIds){var c=void 0;if(!a.parts||n["default"].helpers.scopedId(a)||a.depth||(c=this.blockParamIndex(a.parts[0])),c){var d=a.parts.slice(1).join(".");this.opcode("pushId","BlockParam",c,d)}else b=a.original||b,b.replace&&(b=b.replace(/^this(?:\.|$)/,"").replace(/^\.\//,"").replace(/^\.$/,"")),this.opcode("pushId",a.type,b)}this.accept(a)}},setupFullMustacheParams:function(a,b,c,d){var e=a.params;return this.pushParams(e),this.opcode("pushProgram",b),this.opcode("pushProgram",c),a.hash?this.accept(a.hash):this.opcode("emptyHash",d),e},blockParamIndex:function(a){for(var b=0,c=this.options.blockParams.length;b<c;b++){var d=this.options.blockParams[b],e=d&&l.indexOf(d,a);if(d&&e>=0)return[b,e]}}}},function(a,b,c){"use strict";function d(a){this.value=a}function e(){}function f(a,b,c,d){var e=b.popStack(),f=0,g=c.length;for(a&&g--;f<g;f++)e=b.nameLookup(e,c[f],d);return a?[b.aliasable("container.strict"),"(",e,", ",b.quotedString(c[f]),")"]:e}var g=c(1)["default"];b.__esModule=!0;var h=c(4),i=c(6),j=g(i),k=c(5),l=c(43),m=g(l);e.prototype={nameLookup:function(a,b){return e.isValidJavaScriptVariableName(b)?[a,".",b]:[a,"[",JSON.stringify(b),"]"]},depthedLookup:function(a){return[this.aliasable("container.lookup"),'(depths, "',a,'")']},compilerInfo:function(){var a=h.COMPILER_REVISION,b=h.REVISION_CHANGES[a];return[a,b]},appendToBuffer:function(a,b,c){return k.isArray(a)||(a=[a]),a=this.source.wrap(a,b),this.environment.isSimple?["return ",a,";"]:c?["buffer += ",a,";"]:(a.appendToBuffer=!0,a)},initializeBuffer:function(){return this.quotedString("")},compile:function(a,b,c,d){this.environment=a,this.options=b,this.stringParams=this.options.stringParams,this.trackIds=this.options.trackIds,this.precompile=!d,this.name=this.environment.name,this.isChild=!!c,this.context=c||{decorators:[],programs:[],environments:[]},this.preamble(),this.stackSlot=0,this.stackVars=[],this.aliases={},this.registers={list:[]},this.hashes=[],this.compileStack=[],this.inlineStack=[],this.blockParams=[],this.compileChildren(a,b),this.useDepths=this.useDepths||a.useDepths||a.useDecorators||this.options.compat,this.useBlockParams=this.useBlockParams||a.useBlockParams;var e=a.opcodes,f=void 0,g=void 0,h=void 0,i=void 0;for(h=0,i=e.length;h<i;h++)f=e[h],this.source.currentLocation=f.loc,g=g||f.loc,this[f.opcode].apply(this,f.args);if(this.source.currentLocation=g,this.pushSource(""),this.stackSlot||this.inlineStack.length||this.compileStack.length)throw new j["default"]("Compile completed with content left on stack");this.decorators.isEmpty()?this.decorators=void 0:(this.useDecorators=!0,this.decorators.prepend("var decorators = container.decorators;\n"),this.decorators.push("return fn;"),d?this.decorators=Function.apply(this,["fn","props","container","depth0","data","blockParams","depths",this.decorators.merge()]):(this.decorators.prepend("function(fn, props, container, depth0, data, blockParams, depths) {\n"),this.decorators.push("}\n"),this.decorators=this.decorators.merge()));var k=this.createFunctionContext(d);if(this.isChild)return k;var l={compiler:this.compilerInfo(),main:k};this.decorators&&(l.main_d=this.decorators,l.useDecorators=!0);var m=this.context,n=m.programs,o=m.decorators;for(h=0,i=n.length;h<i;h++)n[h]&&(l[h]=n[h],o[h]&&(l[h+"_d"]=o[h],l.useDecorators=!0));return this.environment.usePartial&&(l.usePartial=!0),this.options.data&&(l.useData=!0),this.useDepths&&(l.useDepths=!0),this.useBlockParams&&(l.useBlockParams=!0),this.options.compat&&(l.compat=!0),d?l.compilerOptions=this.options:(l.compiler=JSON.stringify(l.compiler),this.source.currentLocation={start:{line:1,column:0}},l=this.objectLiteral(l),b.srcName?(l=l.toStringWithSourceMap({file:b.destName}),l.map=l.map&&l.map.toString()):l=l.toString()),l},preamble:function(){this.lastContext=0,this.source=new m["default"](this.options.srcName),this.decorators=new m["default"](this.options.srcName)},createFunctionContext:function(a){var b="",c=this.stackVars.concat(this.registers.list);c.length>0&&(b+=", "+c.join(", "));var d=0;for(var e in this.aliases){var f=this.aliases[e];this.aliases.hasOwnProperty(e)&&f.children&&f.referenceCount>1&&(b+=", alias"+ ++d+"="+e,f.children[0]="alias"+d)}var g=["container","depth0","helpers","partials","data"];(this.useBlockParams||this.useDepths)&&g.push("blockParams"),this.useDepths&&g.push("depths");var h=this.mergeSource(b);return a?(g.push(h),Function.apply(this,g)):this.source.wrap(["function(",g.join(","),") {\n ",h,"}"])},mergeSource:function(a){var b=this.environment.isSimple,c=!this.forceBuffer,d=void 0,e=void 0,f=void 0,g=void 0;return this.source.each(function(a){a.appendToBuffer?(f?a.prepend(" + "):f=a,g=a):(f&&(e?f.prepend("buffer += "):d=!0,g.add(";"),f=g=void 0),e=!0,b||(c=!1))}),c?f?(f.prepend("return "),g.add(";")):e||this.source.push('return "";'):(a+=", buffer = "+(d?"":this.initializeBuffer()),f?(f.prepend("return buffer + "),g.add(";")):this.source.push("return buffer;")),a&&this.source.prepend("var "+a.substring(2)+(d?"":";\n")),this.source.merge()},blockValue:function(a){var b=this.aliasable("helpers.blockHelperMissing"),c=[this.contextName(0)];this.setupHelperArgs(a,0,c);var d=this.popStack();c.splice(1,0,d),this.push(this.source.functionCall(b,"call",c))},ambiguousBlockValue:function(){var a=this.aliasable("helpers.blockHelperMissing"),b=[this.contextName(0)];this.setupHelperArgs("",0,b,!0),this.flushInline();var c=this.topStack();b.splice(1,0,c),this.pushSource(["if (!",this.lastHelper,") { ",c," = ",this.source.functionCall(a,"call",b),"}"])},appendContent:function(a){this.pendingContent?a=this.pendingContent+a:this.pendingLocation=this.source.currentLocation,this.pendingContent=a},append:function(){if(this.isInline())this.replaceStack(function(a){return[" != null ? ",a,' : ""']}),this.pushSource(this.appendToBuffer(this.popStack()));else{var a=this.popStack();this.pushSource(["if (",a," != null) { ",this.appendToBuffer(a,void 0,!0)," }"]),this.environment.isSimple&&this.pushSource(["else { ",this.appendToBuffer("''",void 0,!0)," }"])}},appendEscaped:function(){this.pushSource(this.appendToBuffer([this.aliasable("container.escapeExpression"),"(",this.popStack(),")"]))},getContext:function(a){this.lastContext=a},pushContext:function(){this.pushStackLiteral(this.contextName(this.lastContext))},lookupOnContext:function(a,b,c,d){var e=0;d||!this.options.compat||this.lastContext?this.pushContext():this.push(this.depthedLookup(a[e++])),this.resolvePath("context",a,e,b,c)},lookupBlockParam:function(a,b){this.useBlockParams=!0,this.push(["blockParams[",a[0],"][",a[1],"]"]),this.resolvePath("context",b,1)},lookupData:function(a,b,c){a?this.pushStackLiteral("container.data(data, "+a+")"):this.pushStackLiteral("data"),this.resolvePath("data",b,0,!0,c)},resolvePath:function(a,b,c,d,e){var g=this;if(this.options.strict||this.options.assumeObjects)return void this.push(f(this.options.strict&&e,this,b,a));for(var h=b.length;c<h;c++)this.replaceStack(function(e){
29
  var f=g.nameLookup(e,b[c],a);return d?[" && ",f]:[" != null ? ",f," : ",e]})},resolvePossibleLambda:function(){this.push([this.aliasable("container.lambda"),"(",this.popStack(),", ",this.contextName(0),")"])},pushStringParam:function(a,b){this.pushContext(),this.pushString(b),"SubExpression"!==b&&("string"==typeof a?this.pushString(a):this.pushStackLiteral(a))},emptyHash:function(a){this.trackIds&&this.push("{}"),this.stringParams&&(this.push("{}"),this.push("{}")),this.pushStackLiteral(a?"undefined":"{}")},pushHash:function(){this.hash&&this.hashes.push(this.hash),this.hash={values:[],types:[],contexts:[],ids:[]}},popHash:function(){var a=this.hash;this.hash=this.hashes.pop(),this.trackIds&&this.push(this.objectLiteral(a.ids)),this.stringParams&&(this.push(this.objectLiteral(a.contexts)),this.push(this.objectLiteral(a.types))),this.push(this.objectLiteral(a.values))},pushString:function(a){this.pushStackLiteral(this.quotedString(a))},pushLiteral:function(a){this.pushStackLiteral(a)},pushProgram:function(a){null!=a?this.pushStackLiteral(this.programExpression(a)):this.pushStackLiteral(null)},registerDecorator:function(a,b){var c=this.nameLookup("decorators",b,"decorator"),d=this.setupHelperArgs(b,a);this.decorators.push(["fn = ",this.decorators.functionCall(c,"",["fn","props","container",d])," || fn;"])},invokeHelper:function(a,b,c){var d=this.popStack(),e=this.setupHelper(a,b),f=c?[e.name," || "]:"",g=["("].concat(f,d);this.options.strict||g.push(" || ",this.aliasable("helpers.helperMissing")),g.push(")"),this.push(this.source.functionCall(g,"call",e.callParams))},invokeKnownHelper:function(a,b){var c=this.setupHelper(a,b);this.push(this.source.functionCall(c.name,"call",c.callParams))},invokeAmbiguous:function(a,b){this.useRegister("helper");var c=this.popStack();this.emptyHash();var d=this.setupHelper(0,a,b),e=this.lastHelper=this.nameLookup("helpers",a,"helper"),f=["(","(helper = ",e," || ",c,")"];this.options.strict||(f[0]="(helper = ",f.push(" != null ? helper : ",this.aliasable("helpers.helperMissing"))),this.push(["(",f,d.paramsInit?["),(",d.paramsInit]:[],"),","(typeof helper === ",this.aliasable('"function"')," ? ",this.source.functionCall("helper","call",d.callParams)," : helper))"])},invokePartial:function(a,b,c){var d=[],e=this.setupParams(b,1,d);a&&(b=this.popStack(),delete e.name),c&&(e.indent=JSON.stringify(c)),e.helpers="helpers",e.partials="partials",e.decorators="container.decorators",a?d.unshift(b):d.unshift(this.nameLookup("partials",b,"partial")),this.options.compat&&(e.depths="depths"),e=this.objectLiteral(e),d.push(e),this.push(this.source.functionCall("container.invokePartial","",d))},assignToHash:function(a){var b=this.popStack(),c=void 0,d=void 0,e=void 0;this.trackIds&&(e=this.popStack()),this.stringParams&&(d=this.popStack(),c=this.popStack());var f=this.hash;c&&(f.contexts[a]=c),d&&(f.types[a]=d),e&&(f.ids[a]=e),f.values[a]=b},pushId:function(a,b,c){"BlockParam"===a?this.pushStackLiteral("blockParams["+b[0]+"].path["+b[1]+"]"+(c?" + "+JSON.stringify("."+c):"")):"PathExpression"===a?this.pushString(b):"SubExpression"===a?this.pushStackLiteral("true"):this.pushStackLiteral("null")},compiler:e,compileChildren:function(a,b){for(var c=a.children,d=void 0,e=void 0,f=0,g=c.length;f<g;f++){d=c[f],e=new this.compiler;var h=this.matchExistingProgram(d);if(null==h){this.context.programs.push("");var i=this.context.programs.length;d.index=i,d.name="program"+i,this.context.programs[i]=e.compile(d,b,this.context,!this.precompile),this.context.decorators[i]=e.decorators,this.context.environments[i]=d,this.useDepths=this.useDepths||e.useDepths,this.useBlockParams=this.useBlockParams||e.useBlockParams,d.useDepths=this.useDepths,d.useBlockParams=this.useBlockParams}else d.index=h.index,d.name="program"+h.index,this.useDepths=this.useDepths||h.useDepths,this.useBlockParams=this.useBlockParams||h.useBlockParams}},matchExistingProgram:function(a){for(var b=0,c=this.context.environments.length;b<c;b++){var d=this.context.environments[b];if(d&&d.equals(a))return d}},programExpression:function(a){var b=this.environment.children[a],c=[b.index,"data",b.blockParams];return(this.useBlockParams||this.useDepths)&&c.push("blockParams"),this.useDepths&&c.push("depths"),"container.program("+c.join(", ")+")"},useRegister:function(a){this.registers[a]||(this.registers[a]=!0,this.registers.list.push(a))},push:function(a){return a instanceof d||(a=this.source.wrap(a)),this.inlineStack.push(a),a},pushStackLiteral:function(a){this.push(new d(a))},pushSource:function(a){this.pendingContent&&(this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent),this.pendingLocation)),this.pendingContent=void 0),a&&this.source.push(a)},replaceStack:function(a){var b=["("],c=void 0,e=void 0,f=void 0;if(!this.isInline())throw new j["default"]("replaceStack on non-inline");var g=this.popStack(!0);if(g instanceof d)c=[g.value],b=["(",c],f=!0;else{e=!0;var h=this.incrStack();b=["((",this.push(h)," = ",g,")"],c=this.topStack()}var i=a.call(this,c);f||this.popStack(),e&&this.stackSlot--,this.push(b.concat(i,")"))},incrStack:function(){return this.stackSlot++,this.stackSlot>this.stackVars.length&&this.stackVars.push("stack"+this.stackSlot),this.topStackName()},topStackName:function(){return"stack"+this.stackSlot},flushInline:function(){var a=this.inlineStack;this.inlineStack=[];for(var b=0,c=a.length;b<c;b++){var e=a[b];if(e instanceof d)this.compileStack.push(e);else{var f=this.incrStack();this.pushSource([f," = ",e,";"]),this.compileStack.push(f)}}},isInline:function(){return this.inlineStack.length},popStack:function(a){var b=this.isInline(),c=(b?this.inlineStack:this.compileStack).pop();if(!a&&c instanceof d)return c.value;if(!b){if(!this.stackSlot)throw new j["default"]("Invalid stack pop");this.stackSlot--}return c},topStack:function(){var a=this.isInline()?this.inlineStack:this.compileStack,b=a[a.length-1];return b instanceof d?b.value:b},contextName:function(a){return this.useDepths&&a?"depths["+a+"]":"depth"+a},quotedString:function(a){return this.source.quotedString(a)},objectLiteral:function(a){return this.source.objectLiteral(a)},aliasable:function(a){var b=this.aliases[a];return b?(b.referenceCount++,b):(b=this.aliases[a]=this.source.wrap(a),b.aliasable=!0,b.referenceCount=1,b)},setupHelper:function(a,b,c){var d=[],e=this.setupHelperArgs(b,a,d,c),f=this.nameLookup("helpers",b,"helper"),g=this.aliasable(this.contextName(0)+" != null ? "+this.contextName(0)+" : (container.nullContext || {})");return{params:d,paramsInit:e,name:f,callParams:[g].concat(d)}},setupParams:function(a,b,c){var d={},e=[],f=[],g=[],h=!c,i=void 0;h&&(c=[]),d.name=this.quotedString(a),d.hash=this.popStack(),this.trackIds&&(d.hashIds=this.popStack()),this.stringParams&&(d.hashTypes=this.popStack(),d.hashContexts=this.popStack());var j=this.popStack(),k=this.popStack();(k||j)&&(d.fn=k||"container.noop",d.inverse=j||"container.noop");for(var l=b;l--;)i=this.popStack(),c[l]=i,this.trackIds&&(g[l]=this.popStack()),this.stringParams&&(f[l]=this.popStack(),e[l]=this.popStack());return h&&(d.args=this.source.generateArray(c)),this.trackIds&&(d.ids=this.source.generateArray(g)),this.stringParams&&(d.types=this.source.generateArray(f),d.contexts=this.source.generateArray(e)),this.options.data&&(d.data="data"),this.useBlockParams&&(d.blockParams="blockParams"),d},setupHelperArgs:function(a,b,c,d){var e=this.setupParams(a,b,c);return e=this.objectLiteral(e),d?(this.useRegister("options"),c.push("options"),["options=",e]):c?(c.push(e),""):e}},function(){for(var a="break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield await null true false".split(" "),b=e.RESERVED_WORDS={},c=0,d=a.length;c<d;c++)b[a[c]]=!0}(),e.isValidJavaScriptVariableName=function(a){return!e.RESERVED_WORDS[a]&&/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(a)},b["default"]=e,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b,c){if(f.isArray(a)){for(var d=[],e=0,g=a.length;e<g;e++)d.push(b.wrap(a[e],c));return d}return"boolean"==typeof a||"number"==typeof a?a+"":a}function e(a){this.srcFile=a,this.source=[]}b.__esModule=!0;var f=c(5),g=void 0;try{}catch(h){}g||(g=function(a,b,c,d){this.src="",d&&this.add(d)},g.prototype={add:function(a){f.isArray(a)&&(a=a.join("")),this.src+=a},prepend:function(a){f.isArray(a)&&(a=a.join("")),this.src=a+this.src},toStringWithSourceMap:function(){return{code:this.toString()}},toString:function(){return this.src}}),e.prototype={isEmpty:function(){return!this.source.length},prepend:function(a,b){this.source.unshift(this.wrap(a,b))},push:function(a,b){this.source.push(this.wrap(a,b))},merge:function(){var a=this.empty();return this.each(function(b){a.add([" ",b,"\n"])}),a},each:function(a){for(var b=0,c=this.source.length;b<c;b++)a(this.source[b])},empty:function(){var a=this.currentLocation||{start:{}};return new g(a.start.line,a.start.column,this.srcFile)},wrap:function(a){var b=arguments.length<=1||void 0===arguments[1]?this.currentLocation||{start:{}}:arguments[1];return a instanceof g?a:(a=d(a,this,b),new g(b.start.line,b.start.column,this.srcFile,a))},functionCall:function(a,b,c){return c=this.generateList(c),this.wrap([a,b?"."+b+"(":"(",c,")"])},quotedString:function(a){return'"'+(a+"").replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")+'"'},objectLiteral:function(a){var b=[];for(var c in a)if(a.hasOwnProperty(c)){var e=d(a[c],this);"undefined"!==e&&b.push([this.quotedString(c),":",e])}var f=this.generateList(b);return f.prepend("{"),f.add("}"),f},generateList:function(a){for(var b=this.empty(),c=0,e=a.length;c<e;c++)c&&b.add(","),b.add(d(a[c],this));return b},generateArray:function(a){var b=this.generateList(a);return b.prepend("["),b.add("]"),b}},b["default"]=e,a.exports=b["default"]}])});
1
  /**!
2
 
3
  @license
4
+ handlebars v4.0.11
5
 
6
+ Copyright (C) 2011-2017 by Yehuda Katz
7
 
8
  Permission is hereby granted, free of charge, to any person obtaining a copy
9
  of this software and associated documentation files (the "Software"), to deal
24
  THE SOFTWARE.
25
 
26
  */
27
+ !function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define([],b):"object"==typeof exports?exports.Handlebars=b():a.Handlebars=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){"use strict";function d(){var a=r();return a.compile=function(b,c){return k.compile(b,c,a)},a.precompile=function(b,c){return k.precompile(b,c,a)},a.AST=i["default"],a.Compiler=k.Compiler,a.JavaScriptCompiler=m["default"],a.Parser=j.parser,a.parse=j.parse,a}var e=c(1)["default"];b.__esModule=!0;var f=c(2),g=e(f),h=c(35),i=e(h),j=c(36),k=c(41),l=c(42),m=e(l),n=c(39),o=e(n),p=c(34),q=e(p),r=g["default"].create,s=d();s.create=d,q["default"](s),s.Visitor=o["default"],s["default"]=s,b["default"]=s,a.exports=b["default"]},function(a,b){"use strict";b["default"]=function(a){return a&&a.__esModule?a:{"default":a}},b.__esModule=!0},function(a,b,c){"use strict";function d(){var a=new h.HandlebarsEnvironment;return n.extend(a,h),a.SafeString=j["default"],a.Exception=l["default"],a.Utils=n,a.escapeExpression=n.escapeExpression,a.VM=p,a.template=function(b){return p.template(b,a)},a}var e=c(3)["default"],f=c(1)["default"];b.__esModule=!0;var g=c(4),h=e(g),i=c(21),j=f(i),k=c(6),l=f(k),m=c(5),n=e(m),o=c(22),p=e(o),q=c(34),r=f(q),s=d();s.create=d,r["default"](s),s["default"]=s,b["default"]=s,a.exports=b["default"]},function(a,b){"use strict";b["default"]=function(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b},b.__esModule=!0},function(a,b,c){"use strict";function d(a,b,c){this.helpers=a||{},this.partials=b||{},this.decorators=c||{},i.registerDefaultHelpers(this),j.registerDefaultDecorators(this)}var e=c(1)["default"];b.__esModule=!0,b.HandlebarsEnvironment=d;var f=c(5),g=c(6),h=e(g),i=c(10),j=c(18),k=c(20),l=e(k),m="4.0.11";b.VERSION=m;var n=7;b.COMPILER_REVISION=n;var o={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1",7:">= 4.0.0"};b.REVISION_CHANGES=o;var p="[object Object]";d.prototype={constructor:d,logger:l["default"],log:l["default"].log,registerHelper:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple helpers");f.extend(this.helpers,a)}else this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){if(f.toString.call(a)===p)f.extend(this.partials,a);else{if("undefined"==typeof b)throw new h["default"]('Attempting to register a partial called "'+a+'" as undefined');this.partials[a]=b}},unregisterPartial:function(a){delete this.partials[a]},registerDecorator:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple decorators");f.extend(this.decorators,a)}else this.decorators[a]=b},unregisterDecorator:function(a){delete this.decorators[a]}};var q=l["default"].log;b.log=q,b.createFrame=f.createFrame,b.logger=l["default"]},function(a,b){"use strict";function c(a){return k[a]}function d(a){for(var b=1;b<arguments.length;b++)for(var c in arguments[b])Object.prototype.hasOwnProperty.call(arguments[b],c)&&(a[c]=arguments[b][c]);return a}function e(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1}function f(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return m.test(a)?a.replace(l,c):a}function g(a){return!a&&0!==a||!(!p(a)||0!==a.length)}function h(a){var b=d({},a);return b._parent=a,b}function i(a,b){return a.path=b,a}function j(a,b){return(a?a+".":"")+b}b.__esModule=!0,b.extend=d,b.indexOf=e,b.escapeExpression=f,b.isEmpty=g,b.createFrame=h,b.blockParams=i,b.appendContextPath=j;var k={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;","=":"&#x3D;"},l=/[&<>"'`=]/g,m=/[&<>"'`=]/,n=Object.prototype.toString;b.toString=n;var o=function(a){return"function"==typeof a};o(/x/)&&(b.isFunction=o=function(a){return"function"==typeof a&&"[object Function]"===n.call(a)}),b.isFunction=o;var p=Array.isArray||function(a){return!(!a||"object"!=typeof a)&&"[object Array]"===n.call(a)};b.isArray=p},function(a,b,c){"use strict";function d(a,b){var c=b&&b.loc,g=void 0,h=void 0;c&&(g=c.start.line,h=c.start.column,a+=" - "+g+":"+h);for(var i=Error.prototype.constructor.call(this,a),j=0;j<f.length;j++)this[f[j]]=i[f[j]];Error.captureStackTrace&&Error.captureStackTrace(this,d);try{c&&(this.lineNumber=g,e?Object.defineProperty(this,"column",{value:h,enumerable:!0}):this.column=h)}catch(k){}}var e=c(7)["default"];b.__esModule=!0;var f=["description","fileName","lineNumber","message","name","number","stack"];d.prototype=new Error,b["default"]=d,a.exports=b["default"]},function(a,b,c){a.exports={"default":c(8),__esModule:!0}},function(a,b,c){var d=c(9);a.exports=function(a,b,c){return d.setDesc(a,b,c)}},function(a,b){var c=Object;a.exports={create:c.create,getProto:c.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:c.getOwnPropertyDescriptor,setDesc:c.defineProperty,setDescs:c.defineProperties,getKeys:c.keys,getNames:c.getOwnPropertyNames,getSymbols:c.getOwnPropertySymbols,each:[].forEach}},function(a,b,c){"use strict";function d(a){g["default"](a),i["default"](a),k["default"](a),m["default"](a),o["default"](a),q["default"](a),s["default"](a)}var e=c(1)["default"];b.__esModule=!0,b.registerDefaultHelpers=d;var f=c(11),g=e(f),h=c(12),i=e(h),j=c(13),k=e(j),l=c(14),m=e(l),n=c(15),o=e(n),p=c(16),q=e(p),r=c(17),s=e(r)},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerHelper("blockHelperMissing",function(b,c){var e=c.inverse,f=c.fn;if(b===!0)return f(this);if(b===!1||null==b)return e(this);if(d.isArray(b))return b.length>0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):e(this);if(c.data&&c.ids){var g=d.createFrame(c.data);g.contextPath=d.appendContextPath(c.data.contextPath,c.name),c={data:g}}return f(b,c)})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(1)["default"];b.__esModule=!0;var e=c(5),f=c(6),g=d(f);b["default"]=function(a){a.registerHelper("each",function(a,b){function c(b,c,f){j&&(j.key=b,j.index=c,j.first=0===c,j.last=!!f,k&&(j.contextPath=k+b)),i+=d(a[b],{data:j,blockParams:e.blockParams([a[b],b],[k+b,null])})}if(!b)throw new g["default"]("Must pass iterator to #each");var d=b.fn,f=b.inverse,h=0,i="",j=void 0,k=void 0;if(b.data&&b.ids&&(k=e.appendContextPath(b.data.contextPath,b.ids[0])+"."),e.isFunction(a)&&(a=a.call(this)),b.data&&(j=e.createFrame(b.data)),a&&"object"==typeof a)if(e.isArray(a))for(var l=a.length;h<l;h++)h in a&&c(h,h,h===a.length-1);else{var m=void 0;for(var n in a)a.hasOwnProperty(n)&&(void 0!==m&&c(m,h-1),m=n,h++);void 0!==m&&c(m,h-1,!0)}return 0===h&&(i=f(this)),i})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(1)["default"];b.__esModule=!0;var e=c(6),f=d(e);b["default"]=function(a){a.registerHelper("helperMissing",function(){if(1!==arguments.length)throw new f["default"]('Missing helper: "'+arguments[arguments.length-1].name+'"')})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerHelper("if",function(a,b){return d.isFunction(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||d.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("log",function(){for(var b=[void 0],c=arguments[arguments.length-1],d=0;d<arguments.length-1;d++)b.push(arguments[d]);var e=1;null!=c.hash.level?e=c.hash.level:c.data&&null!=c.data.level&&(e=c.data.level),b[0]=e,a.log.apply(a,b)})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("lookup",function(a,b){return a&&a[b]})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerHelper("with",function(a,b){d.isFunction(a)&&(a=a.call(this));var c=b.fn;if(d.isEmpty(a))return b.inverse(this);var e=b.data;return b.data&&b.ids&&(e=d.createFrame(b.data),e.contextPath=d.appendContextPath(b.data.contextPath,b.ids[0])),c(a,{data:e,blockParams:d.blockParams([a],[e&&e.contextPath])})})},a.exports=b["default"]},function(a,b,c){"use strict";function d(a){g["default"](a)}var e=c(1)["default"];b.__esModule=!0,b.registerDefaultDecorators=d;var f=c(19),g=e(f)},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerDecorator("inline",function(a,b,c,e){var f=a;return b.partials||(b.partials={},f=function(e,f){var g=c.partials;c.partials=d.extend({},g,b.partials);var h=a(e,f);return c.partials=g,h}),b.partials[e.args[0]]=e.fn,f})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5),e={methodMap:["debug","info","warn","error"],level:"info",lookupLevel:function(a){if("string"==typeof a){var b=d.indexOf(e.methodMap,a.toLowerCase());a=b>=0?b:parseInt(a,10)}return a},log:function(a){if(a=e.lookupLevel(a),"undefined"!=typeof console&&e.lookupLevel(e.level)<=a){var b=e.methodMap[a];console[b]||(b="log");for(var c=arguments.length,d=Array(c>1?c-1:0),f=1;f<c;f++)d[f-1]=arguments[f];console[b].apply(console,d)}}};b["default"]=e,a.exports=b["default"]},function(a,b){"use strict";function c(a){this.string=a}b.__esModule=!0,c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=s.COMPILER_REVISION;if(b!==c){if(b<c){var d=s.REVISION_CHANGES[c],e=s.REVISION_CHANGES[b];throw new r["default"]("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new r["default"]("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){function c(c,d,e){e.hash&&(d=p.extend({},d,e.hash),e.ids&&(e.ids[0]=!0)),c=b.VM.resolvePartial.call(this,c,d,e);var f=b.VM.invokePartial.call(this,c,d,e);if(null==f&&b.compile&&(e.partials[e.name]=b.compile(c,a.compilerOptions,b),f=e.partials[e.name](d,e)),null!=f){if(e.indent){for(var g=f.split("\n"),h=0,i=g.length;h<i&&(g[h]||h+1!==i);h++)g[h]=e.indent+g[h];f=g.join("\n")}return f}throw new r["default"]("The partial "+e.name+" could not be compiled when running in runtime-only mode")}function d(b){function c(b){return""+a.main(e,b,e.helpers,e.partials,g,i,h)}var f=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],g=f.data;d._setup(f),!f.partial&&a.useData&&(g=j(b,g));var h=void 0,i=a.useBlockParams?[]:void 0;return a.useDepths&&(h=f.depths?b!=f.depths[0]?[b].concat(f.depths):f.depths:[b]),(c=k(a.main,c,e,f.depths||[],g,i))(b,f)}if(!b)throw new r["default"]("No environment passed to template");if(!a||!a.main)throw new r["default"]("Unknown template object: "+typeof a);a.main.decorator=a.main_d,b.VM.checkRevision(a.compiler);var e={strict:function(a,b){if(!(b in a))throw new r["default"]('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;d<c;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:p.escapeExpression,invokePartial:c,fn:function(b){var c=a[b];return c.decorator=a[b+"_d"],c},programs:[],program:function(a,b,c,d,e){var g=this.programs[a],h=this.fn(a);return b||e||d||c?g=f(this,a,h,b,c,d,e):g||(g=this.programs[a]=f(this,a,h)),g},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=p.extend({},b,a)),c},nullContext:l({}),noop:b.VM.noop,compilerInfo:a.compiler};return d.isTop=!0,d._setup=function(c){c.partial?(e.helpers=c.helpers,e.partials=c.partials,e.decorators=c.decorators):(e.helpers=e.merge(c.helpers,b.helpers),a.usePartial&&(e.partials=e.merge(c.partials,b.partials)),(a.usePartial||a.useDecorators)&&(e.decorators=e.merge(c.decorators,b.decorators)))},d._child=function(b,c,d,g){if(a.useBlockParams&&!d)throw new r["default"]("must pass block params");if(a.useDepths&&!g)throw new r["default"]("must pass parent depths");return f(e,b,a[b],c,0,d,g)},d}function f(a,b,c,d,e,f,g){function h(b){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],h=g;return!g||b==g[0]||b===a.nullContext&&null===g[0]||(h=[b].concat(g)),c(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),h)}return h=k(c,h,a,g,d,f),h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function g(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a="@partial-block"===c.name?c.data["partial-block"]:c.partials[c.name],a}function h(a,b,c){var d=c.data&&c.data["partial-block"];c.partial=!0,c.ids&&(c.data.contextPath=c.ids[0]||c.data.contextPath);var e=void 0;if(c.fn&&c.fn!==i&&!function(){c.data=s.createFrame(c.data);var a=c.fn;e=c.data["partial-block"]=function(b){var c=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return c.data=s.createFrame(c.data),c.data["partial-block"]=d,a(b,c)},a.partials&&(c.partials=p.extend({},c.partials,a.partials))}(),void 0===a&&e&&(a=e),void 0===a)throw new r["default"]("The partial "+c.name+" could not be found");if(a instanceof Function)return a(b,c)}function i(){return""}function j(a,b){return b&&"root"in b||(b=b?s.createFrame(b):{},b.root=a),b}function k(a,b,c,d,e,f){if(a.decorator){var g={};b=a.decorator(b,g,c,d&&d[0],e,f,d),p.extend(b,g)}return b}var l=c(23)["default"],m=c(3)["default"],n=c(1)["default"];b.__esModule=!0,b.checkRevision=d,b.template=e,b.wrapProgram=f,b.resolvePartial=g,b.invokePartial=h,b.noop=i;var o=c(5),p=m(o),q=c(6),r=n(q),s=c(4)},function(a,b,c){a.exports={"default":c(24),__esModule:!0}},function(a,b,c){c(25),a.exports=c(30).Object.seal},function(a,b,c){var d=c(26);c(27)("seal",function(a){return function(b){return a&&d(b)?a(b):b}})},function(a,b){a.exports=function(a){return"object"==typeof a?null!==a:"function"==typeof a}},function(a,b,c){var d=c(28),e=c(30),f=c(33);a.exports=function(a,b){var c=(e.Object||{})[a]||Object[a],g={};g[a]=b(c),d(d.S+d.F*f(function(){c(1)}),"Object",g)}},function(a,b,c){var d=c(29),e=c(30),f=c(31),g="prototype",h=function(a,b,c){var i,j,k,l=a&h.F,m=a&h.G,n=a&h.S,o=a&h.P,p=a&h.B,q=a&h.W,r=m?e:e[b]||(e[b]={}),s=m?d:n?d[b]:(d[b]||{})[g];m&&(c=b);for(i in c)j=!l&&s&&i in s,j&&i in r||(k=j?s[i]:c[i],r[i]=m&&"function"!=typeof s[i]?c[i]:p&&j?f(k,d):q&&s[i]==k?function(a){var b=function(b){return this instanceof a?new a(b):a(b)};return b[g]=a[g],b}(k):o&&"function"==typeof k?f(Function.call,k):k,o&&((r[g]||(r[g]={}))[i]=k))};h.F=1,h.G=2,h.S=4,h.P=8,h.B=16,h.W=32,a.exports=h},function(a,b){var c=a.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=c)},function(a,b){var c=a.exports={version:"1.2.6"};"number"==typeof __e&&(__e=c)},function(a,b,c){var d=c(32);a.exports=function(a,b,c){if(d(a),void 0===b)return a;switch(c){case 1:return function(c){return a.call(b,c)};case 2:return function(c,d){return a.call(b,c,d)};case 3:return function(c,d,e){return a.call(b,c,d,e)}}return function(){return a.apply(b,arguments)}}},function(a,b){a.exports=function(a){if("function"!=typeof a)throw TypeError(a+" is not a function!");return a}},function(a,b){a.exports=function(a){try{return!!a()}catch(b){return!0}}},function(a,b){(function(c){"use strict";b.__esModule=!0,b["default"]=function(a){var b="undefined"!=typeof c?c:window,d=b.Handlebars;a.noConflict=function(){return b.Handlebars===a&&(b.Handlebars=d),a}},a.exports=b["default"]}).call(b,function(){return this}())},function(a,b){"use strict";b.__esModule=!0;var c={helpers:{helperExpression:function(a){return"SubExpression"===a.type||("MustacheStatement"===a.type||"BlockStatement"===a.type)&&!!(a.params&&a.params.length||a.hash)},scopedId:function(a){return/^\.|this\b/.test(a.original)},simpleId:function(a){return 1===a.parts.length&&!c.helpers.scopedId(a)&&!a.depth}}};b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){if("Program"===a.type)return a;h["default"].yy=n,n.locInfo=function(a){return new n.SourceLocation(b&&b.srcName,a)};var c=new j["default"](b);return c.accept(h["default"].parse(a))}var e=c(1)["default"],f=c(3)["default"];b.__esModule=!0,b.parse=d;var g=c(37),h=e(g),i=c(38),j=e(i),k=c(40),l=f(k),m=c(5);b.parser=h["default"];var n={};m.extend(n,l)},function(a,b){"use strict";b.__esModule=!0;var c=function(){function a(){this.yy={}}var b={trace:function(){},yy:{},symbols_:{error:2,root:3,program:4,EOF:5,program_repetition0:6,statement:7,mustache:8,block:9,rawBlock:10,partial:11,partialBlock:12,content:13,COMMENT:14,CONTENT:15,openRawBlock:16,rawBlock_repetition_plus0:17,END_RAW_BLOCK:18,OPEN_RAW_BLOCK:19,helperName:20,openRawBlock_repetition0:21,openRawBlock_option0:22,CLOSE_RAW_BLOCK:23,openBlock:24,block_option0:25,closeBlock:26,openInverse:27,block_option1:28,OPEN_BLOCK:29,openBlock_repetition0:30,openBlock_option0:31,openBlock_option1:32,CLOSE:33,OPEN_INVERSE:34,openInverse_repetition0:35,openInverse_option0:36,openInverse_option1:37,openInverseChain:38,OPEN_INVERSE_CHAIN:39,openInverseChain_repetition0:40,openInverseChain_option0:41,openInverseChain_option1:42,inverseAndProgram:43,INVERSE:44,inverseChain:45,inverseChain_option0:46,OPEN_ENDBLOCK:47,OPEN:48,mustache_repetition0:49,mustache_option0:50,OPEN_UNESCAPED:51,mustache_repetition1:52,mustache_option1:53,CLOSE_UNESCAPED:54,OPEN_PARTIAL:55,partialName:56,partial_repetition0:57,partial_option0:58,openPartialBlock:59,OPEN_PARTIAL_BLOCK:60,openPartialBlock_repetition0:61,openPartialBlock_option0:62,param:63,sexpr:64,OPEN_SEXPR:65,sexpr_repetition0:66,sexpr_option0:67,CLOSE_SEXPR:68,hash:69,hash_repetition_plus0:70,hashSegment:71,ID:72,EQUALS:73,blockParams:74,OPEN_BLOCK_PARAMS:75,blockParams_repetition_plus0:76,CLOSE_BLOCK_PARAMS:77,path:78,dataName:79,STRING:80,NUMBER:81,BOOLEAN:82,UNDEFINED:83,NULL:84,DATA:85,pathSegments:86,SEP:87,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",14:"COMMENT",15:"CONTENT",18:"END_RAW_BLOCK",19:"OPEN_RAW_BLOCK",23:"CLOSE_RAW_BLOCK",29:"OPEN_BLOCK",33:"CLOSE",34:"OPEN_INVERSE",39:"OPEN_INVERSE_CHAIN",44:"INVERSE",47:"OPEN_ENDBLOCK",48:"OPEN",51:"OPEN_UNESCAPED",54:"CLOSE_UNESCAPED",55:"OPEN_PARTIAL",60:"OPEN_PARTIAL_BLOCK",65:"OPEN_SEXPR",68:"CLOSE_SEXPR",72:"ID",73:"EQUALS",75:"OPEN_BLOCK_PARAMS",77:"CLOSE_BLOCK_PARAMS",80:"STRING",81:"NUMBER",82:"BOOLEAN",83:"UNDEFINED",84:"NULL",85:"DATA",87:"SEP"},productions_:[0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[13,1],[10,3],[16,5],[9,4],[9,4],[24,6],[27,6],[38,6],[43,2],[45,3],[45,1],[26,3],[8,5],[8,5],[11,5],[12,3],[59,5],[63,1],[63,1],[64,5],[69,1],[71,3],[74,3],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[56,1],[56,1],[79,2],[78,1],[86,3],[86,1],[6,0],[6,2],[17,1],[17,2],[21,0],[21,2],[22,0],[22,1],[25,0],[25,1],[28,0],[28,1],[30,0],[30,2],[31,0],[31,1],[32,0],[32,1],[35,0],[35,2],[36,0],[36,1],[37,0],[37,1],[40,0],[40,2],[41,0],[41,1],[42,0],[42,1],[46,0],[46,1],[49,0],[49,2],[50,0],[50,1],[52,0],[52,2],[53,0],[53,1],[57,0],[57,2],[58,0],[58,1],[61,0],[61,2],[62,0],[62,1],[66,0],[66,2],[67,0],[67,1],[70,1],[70,2],[76,1],[76,2]],performAction:function(a,b,c,d,e,f,g){var h=f.length-1;switch(e){case 1:return f[h-1];case 2:this.$=d.prepareProgram(f[h]);break;case 3:this.$=f[h];break;case 4:this.$=f[h];break;case 5:this.$=f[h];break;case 6:this.$=f[h];break;case 7:this.$=f[h];break;case 8:this.$=f[h];break;case 9:this.$={type:"CommentStatement",value:d.stripComment(f[h]),strip:d.stripFlags(f[h],f[h]),loc:d.locInfo(this._$)};break;case 10:this.$={type:"ContentStatement",original:f[h],value:f[h],loc:d.locInfo(this._$)};break;case 11:this.$=d.prepareRawBlock(f[h-2],f[h-1],f[h],this._$);break;case 12:this.$={path:f[h-3],params:f[h-2],hash:f[h-1]};break;case 13:this.$=d.prepareBlock(f[h-3],f[h-2],f[h-1],f[h],!1,this._$);break;case 14:this.$=d.prepareBlock(f[h-3],f[h-2],f[h-1],f[h],!0,this._$);break;case 15:this.$={open:f[h-5],path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 16:this.$={path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 17:this.$={path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 18:this.$={strip:d.stripFlags(f[h-1],f[h-1]),program:f[h]};break;case 19:var i=d.prepareBlock(f[h-2],f[h-1],f[h],f[h],!1,this._$),j=d.prepareProgram([i],f[h-1].loc);j.chained=!0,this.$={strip:f[h-2].strip,program:j,chain:!0};break;case 20:this.$=f[h];break;case 21:this.$={path:f[h-1],strip:d.stripFlags(f[h-2],f[h])};break;case 22:this.$=d.prepareMustache(f[h-3],f[h-2],f[h-1],f[h-4],d.stripFlags(f[h-4],f[h]),this._$);break;case 23:this.$=d.prepareMustache(f[h-3],f[h-2],f[h-1],f[h-4],d.stripFlags(f[h-4],f[h]),this._$);break;case 24:this.$={type:"PartialStatement",name:f[h-3],params:f[h-2],hash:f[h-1],indent:"",strip:d.stripFlags(f[h-4],f[h]),loc:d.locInfo(this._$)};break;case 25:this.$=d.preparePartialBlock(f[h-2],f[h-1],f[h],this._$);break;case 26:this.$={path:f[h-3],params:f[h-2],hash:f[h-1],strip:d.stripFlags(f[h-4],f[h])};break;case 27:this.$=f[h];break;case 28:this.$=f[h];break;case 29:this.$={type:"SubExpression",path:f[h-3],params:f[h-2],hash:f[h-1],loc:d.locInfo(this._$)};break;case 30:this.$={type:"Hash",pairs:f[h],loc:d.locInfo(this._$)};break;case 31:this.$={type:"HashPair",key:d.id(f[h-2]),value:f[h],loc:d.locInfo(this._$)};break;case 32:this.$=d.id(f[h-1]);break;case 33:this.$=f[h];break;case 34:this.$=f[h];break;case 35:this.$={type:"StringLiteral",value:f[h],original:f[h],loc:d.locInfo(this._$)};break;case 36:this.$={type:"NumberLiteral",value:Number(f[h]),original:Number(f[h]),loc:d.locInfo(this._$)};break;case 37:this.$={type:"BooleanLiteral",value:"true"===f[h],original:"true"===f[h],loc:d.locInfo(this._$)};break;case 38:this.$={type:"UndefinedLiteral",original:void 0,value:void 0,loc:d.locInfo(this._$)};break;case 39:this.$={type:"NullLiteral",original:null,value:null,loc:d.locInfo(this._$)};break;case 40:this.$=f[h];break;case 41:this.$=f[h];break;case 42:this.$=d.preparePath(!0,f[h],this._$);break;case 43:this.$=d.preparePath(!1,f[h],this._$);break;case 44:f[h-2].push({part:d.id(f[h]),original:f[h],separator:f[h-1]}),this.$=f[h-2];break;case 45:this.$=[{part:d.id(f[h]),original:f[h]}];break;case 46:this.$=[];break;case 47:f[h-1].push(f[h]);break;case 48:this.$=[f[h]];break;case 49:f[h-1].push(f[h]);break;case 50:this.$=[];break;case 51:f[h-1].push(f[h]);break;case 58:this.$=[];break;case 59:f[h-1].push(f[h]);break;case 64:this.$=[];break;case 65:f[h-1].push(f[h]);break;case 70:this.$=[];break;case 71:f[h-1].push(f[h]);break;case 78:this.$=[];break;case 79:f[h-1].push(f[h]);break;case 82:this.$=[];break;case 83:f[h-1].push(f[h]);break;case 86:this.$=[];break;case 87:f[h-1].push(f[h]);break;case 90:this.$=[];break;case 91:f[h-1].push(f[h]);break;case 94:this.$=[];break;case 95:f[h-1].push(f[h]);break;case 98:this.$=[f[h]];break;case 99:f[h-1].push(f[h]);break;case 100:this.$=[f[h]];break;case 101:f[h-1].push(f[h])}},table:[{3:1,4:2,5:[2,46],6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:10,13:11,14:[1,12],15:[1,20],16:17,19:[1,23],24:15,27:16,29:[1,21],34:[1,22],39:[2,2],44:[2,2],47:[2,2],48:[1,13],51:[1,14],55:[1,18],59:19,60:[1,24]},{1:[2,1]},{5:[2,47],14:[2,47],15:[2,47],19:[2,47],29:[2,47],34:[2,47],39:[2,47],44:[2,47],47:[2,47],48:[2,47],51:[2,47],55:[2,47],60:[2,47]},{5:[2,3],14:[2,3],15:[2,3],19:[2,3],29:[2,3],34:[2,3],39:[2,3],44:[2,3],47:[2,3],48:[2,3],51:[2,3],55:[2,3],60:[2,3]},{5:[2,4],14:[2,4],15:[2,4],19:[2,4],29:[2,4],34:[2,4],39:[2,4],44:[2,4],47:[2,4],48:[2,4],51:[2,4],55:[2,4],60:[2,4]},{5:[2,5],14:[2,5],15:[2,5],19:[2,5],29:[2,5],34:[2,5],39:[2,5],44:[2,5],47:[2,5],48:[2,5],51:[2,5],55:[2,5],60:[2,5]},{5:[2,6],14:[2,6],15:[2,6],19:[2,6],29:[2,6],34:[2,6],39:[2,6],44:[2,6],47:[2,6],48:[2,6],51:[2,6],55:[2,6],60:[2,6]},{5:[2,7],14:[2,7],15:[2,7],19:[2,7],29:[2,7],34:[2,7],39:[2,7],44:[2,7],47:[2,7],48:[2,7],51:[2,7],55:[2,7],60:[2,7]},{5:[2,8],14:[2,8],15:[2,8],19:[2,8],29:[2,8],34:[2,8],39:[2,8],44:[2,8],47:[2,8],48:[2,8],51:[2,8],55:[2,8],60:[2,8]},{5:[2,9],14:[2,9],15:[2,9],19:[2,9],29:[2,9],34:[2,9],39:[2,9],44:[2,9],47:[2,9],48:[2,9],51:[2,9],55:[2,9],60:[2,9]},{20:25,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:36,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:37,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{4:38,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{13:40,15:[1,20],17:39},{20:42,56:41,64:43,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:45,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{5:[2,10],14:[2,10],15:[2,10],18:[2,10],19:[2,10],29:[2,10],34:[2,10],39:[2,10],44:[2,10],47:[2,10],48:[2,10],51:[2,10],55:[2,10],60:[2,10]},{20:46,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:47,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:48,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:42,56:49,64:43,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[2,78],49:50,65:[2,78],72:[2,78],80:[2,78],81:[2,78],82:[2,78],83:[2,78],84:[2,78],85:[2,78]},{23:[2,33],33:[2,33],54:[2,33],65:[2,33],68:[2,33],72:[2,33],75:[2,33],80:[2,33],81:[2,33],82:[2,33],83:[2,33],84:[2,33],85:[2,33]},{23:[2,34],33:[2,34],54:[2,34],65:[2,34],68:[2,34],72:[2,34],75:[2,34],80:[2,34],81:[2,34],82:[2,34],83:[2,34],84:[2,34],85:[2,34]},{23:[2,35],33:[2,35],54:[2,35],65:[2,35],68:[2,35],72:[2,35],75:[2,35],80:[2,35],81:[2,35],82:[2,35],83:[2,35],84:[2,35],85:[2,35]},{23:[2,36],33:[2,36],54:[2,36],65:[2,36],68:[2,36],72:[2,36],75:[2,36],80:[2,36],81:[2,36],82:[2,36],83:[2,36],84:[2,36],85:[2,36]},{23:[2,37],33:[2,37],54:[2,37],65:[2,37],68:[2,37],72:[2,37],75:[2,37],80:[2,37],81:[2,37],82:[2,37],83:[2,37],84:[2,37],85:[2,37]},{23:[2,38],33:[2,38],54:[2,38],65:[2,38],68:[2,38],72:[2,38],75:[2,38],80:[2,38],81:[2,38],82:[2,38],83:[2,38],84:[2,38],85:[2,38]},{23:[2,39],33:[2,39],54:[2,39],65:[2,39],68:[2,39],72:[2,39],75:[2,39],80:[2,39],81:[2,39],82:[2,39],83:[2,39],84:[2,39],85:[2,39]},{23:[2,43],33:[2,43],54:[2,43],65:[2,43],68:[2,43],72:[2,43],75:[2,43],80:[2,43],81:[2,43],82:[2,43],83:[2,43],84:[2,43],85:[2,43],87:[1,51]},{72:[1,35],86:52},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{52:53,54:[2,82],65:[2,82],72:[2,82],80:[2,82],81:[2,82],82:[2,82],83:[2,82],84:[2,82],85:[2,82]},{25:54,38:56,39:[1,58],43:57,44:[1,59],45:55,47:[2,54]},{28:60,43:61,44:[1,59],47:[2,56]},{13:63,15:[1,20],18:[1,62]},{15:[2,48],18:[2,48]},{33:[2,86],57:64,65:[2,86],72:[2,86],80:[2,86],81:[2,86],82:[2,86],83:[2,86],84:[2,86],85:[2,86]},{33:[2,40],65:[2,40],72:[2,40],80:[2,40],81:[2,40],82:[2,40],83:[2,40],84:[2,40],85:[2,40]},{33:[2,41],65:[2,41],72:[2,41],80:[2,41],81:[2,41],82:[2,41],83:[2,41],84:[2,41],85:[2,41]},{20:65,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:66,47:[1,67]},{30:68,33:[2,58],65:[2,58],72:[2,58],75:[2,58],80:[2,58],81:[2,58],82:[2,58],83:[2,58],84:[2,58],85:[2,58]},{33:[2,64],35:69,65:[2,64],72:[2,64],75:[2,64],80:[2,64],81:[2,64],82:[2,64],83:[2,64],84:[2,64],85:[2,64]},{21:70,23:[2,50],65:[2,50],72:[2,50],80:[2,50],81:[2,50],82:[2,50],83:[2,50],84:[2,50],85:[2,50]},{33:[2,90],61:71,65:[2,90],72:[2,90],80:[2,90],81:[2,90],82:[2,90],83:[2,90],84:[2,90],85:[2,90]},{20:75,33:[2,80],50:72,63:73,64:76,65:[1,44],69:74,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{72:[1,80]},{23:[2,42],33:[2,42],54:[2,42],65:[2,42],68:[2,42],72:[2,42],75:[2,42],80:[2,42],81:[2,42],82:[2,42],83:[2,42],84:[2,42],85:[2,42],87:[1,51]},{20:75,53:81,54:[2,84],63:82,64:76,65:[1,44],69:83,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:84,47:[1,67]},{47:[2,55]},{4:85,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{47:[2,20]},{20:86,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:87,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{26:88,47:[1,67]},{47:[2,57]},{5:[2,11],14:[2,11],15:[2,11],19:[2,11],29:[2,11],34:[2,11],39:[2,11],44:[2,11],47:[2,11],48:[2,11],51:[2,11],55:[2,11],60:[2,11]},{15:[2,49],18:[2,49]},{20:75,33:[2,88],58:89,63:90,64:76,65:[1,44],69:91,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{65:[2,94],66:92,68:[2,94],72:[2,94],80:[2,94],81:[2,94],82:[2,94],83:[2,94],84:[2,94],85:[2,94]},{5:[2,25],14:[2,25],15:[2,25],19:[2,25],29:[2,25],34:[2,25],39:[2,25],44:[2,25],47:[2,25],48:[2,25],51:[2,25],55:[2,25],60:[2,25]},{20:93,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,31:94,33:[2,60],63:95,64:76,65:[1,44],69:96,70:77,71:78,72:[1,79],75:[2,60],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,33:[2,66],36:97,63:98,64:76,65:[1,44],69:99,70:77,71:78,72:[1,79],75:[2,66],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,22:100,23:[2,52],63:101,64:76,65:[1,44],69:102,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,33:[2,92],62:103,63:104,64:76,65:[1,44],69:105,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,106]},{33:[2,79],65:[2,79],72:[2,79],80:[2,79],81:[2,79],82:[2,79],83:[2,79],84:[2,79],85:[2,79]},{33:[2,81]},{23:[2,27],33:[2,27],54:[2,27],65:[2,27],68:[2,27],72:[2,27],75:[2,27],80:[2,27],81:[2,27],82:[2,27],83:[2,27],84:[2,27],85:[2,27]},{23:[2,28],33:[2,28],54:[2,28],65:[2,28],68:[2,28],72:[2,28],75:[2,28],80:[2,28],81:[2,28],82:[2,28],83:[2,28],84:[2,28],85:[2,28]},{23:[2,30],33:[2,30],54:[2,30],68:[2,30],71:107,72:[1,108],75:[2,30]},{23:[2,98],33:[2,98],54:[2,98],68:[2,98],72:[2,98],75:[2,98]},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],73:[1,109],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{23:[2,44],33:[2,44],54:[2,44],65:[2,44],68:[2,44],72:[2,44],75:[2,44],80:[2,44],81:[2,44],82:[2,44],83:[2,44],84:[2,44],85:[2,44],87:[2,44]},{54:[1,110]},{54:[2,83],65:[2,83],72:[2,83],80:[2,83],81:[2,83],82:[2,83],83:[2,83],84:[2,83],85:[2,83]},{54:[2,85]},{5:[2,13],14:[2,13],15:[2,13],19:[2,13],29:[2,13],34:[2,13],39:[2,13],44:[2,13],47:[2,13],48:[2,13],51:[2,13],55:[2,13],60:[2,13]},{38:56,39:[1,58],43:57,44:[1,59],45:112,46:111,47:[2,76]},{33:[2,70],40:113,65:[2,70],72:[2,70],75:[2,70],80:[2,70],81:[2,70],82:[2,70],83:[2,70],84:[2,70],85:[2,70]},{47:[2,18]},{5:[2,14],14:[2,14],15:[2,14],19:[2,14],29:[2,14],34:[2,14],39:[2,14],44:[2,14],47:[2,14],48:[2,14],51:[2,14],55:[2,14],60:[2,14]},{33:[1,114]},{33:[2,87],65:[2,87],72:[2,87],80:[2,87],81:[2,87],82:[2,87],83:[2,87],84:[2,87],
28
  85:[2,87]},{33:[2,89]},{20:75,63:116,64:76,65:[1,44],67:115,68:[2,96],69:117,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,118]},{32:119,33:[2,62],74:120,75:[1,121]},{33:[2,59],65:[2,59],72:[2,59],75:[2,59],80:[2,59],81:[2,59],82:[2,59],83:[2,59],84:[2,59],85:[2,59]},{33:[2,61],75:[2,61]},{33:[2,68],37:122,74:123,75:[1,121]},{33:[2,65],65:[2,65],72:[2,65],75:[2,65],80:[2,65],81:[2,65],82:[2,65],83:[2,65],84:[2,65],85:[2,65]},{33:[2,67],75:[2,67]},{23:[1,124]},{23:[2,51],65:[2,51],72:[2,51],80:[2,51],81:[2,51],82:[2,51],83:[2,51],84:[2,51],85:[2,51]},{23:[2,53]},{33:[1,125]},{33:[2,91],65:[2,91],72:[2,91],80:[2,91],81:[2,91],82:[2,91],83:[2,91],84:[2,91],85:[2,91]},{33:[2,93]},{5:[2,22],14:[2,22],15:[2,22],19:[2,22],29:[2,22],34:[2,22],39:[2,22],44:[2,22],47:[2,22],48:[2,22],51:[2,22],55:[2,22],60:[2,22]},{23:[2,99],33:[2,99],54:[2,99],68:[2,99],72:[2,99],75:[2,99]},{73:[1,109]},{20:75,63:126,64:76,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,23],14:[2,23],15:[2,23],19:[2,23],29:[2,23],34:[2,23],39:[2,23],44:[2,23],47:[2,23],48:[2,23],51:[2,23],55:[2,23],60:[2,23]},{47:[2,19]},{47:[2,77]},{20:75,33:[2,72],41:127,63:128,64:76,65:[1,44],69:129,70:77,71:78,72:[1,79],75:[2,72],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,24],14:[2,24],15:[2,24],19:[2,24],29:[2,24],34:[2,24],39:[2,24],44:[2,24],47:[2,24],48:[2,24],51:[2,24],55:[2,24],60:[2,24]},{68:[1,130]},{65:[2,95],68:[2,95],72:[2,95],80:[2,95],81:[2,95],82:[2,95],83:[2,95],84:[2,95],85:[2,95]},{68:[2,97]},{5:[2,21],14:[2,21],15:[2,21],19:[2,21],29:[2,21],34:[2,21],39:[2,21],44:[2,21],47:[2,21],48:[2,21],51:[2,21],55:[2,21],60:[2,21]},{33:[1,131]},{33:[2,63]},{72:[1,133],76:132},{33:[1,134]},{33:[2,69]},{15:[2,12]},{14:[2,26],15:[2,26],19:[2,26],29:[2,26],34:[2,26],47:[2,26],48:[2,26],51:[2,26],55:[2,26],60:[2,26]},{23:[2,31],33:[2,31],54:[2,31],68:[2,31],72:[2,31],75:[2,31]},{33:[2,74],42:135,74:136,75:[1,121]},{33:[2,71],65:[2,71],72:[2,71],75:[2,71],80:[2,71],81:[2,71],82:[2,71],83:[2,71],84:[2,71],85:[2,71]},{33:[2,73],75:[2,73]},{23:[2,29],33:[2,29],54:[2,29],65:[2,29],68:[2,29],72:[2,29],75:[2,29],80:[2,29],81:[2,29],82:[2,29],83:[2,29],84:[2,29],85:[2,29]},{14:[2,15],15:[2,15],19:[2,15],29:[2,15],34:[2,15],39:[2,15],44:[2,15],47:[2,15],48:[2,15],51:[2,15],55:[2,15],60:[2,15]},{72:[1,138],77:[1,137]},{72:[2,100],77:[2,100]},{14:[2,16],15:[2,16],19:[2,16],29:[2,16],34:[2,16],44:[2,16],47:[2,16],48:[2,16],51:[2,16],55:[2,16],60:[2,16]},{33:[1,139]},{33:[2,75]},{33:[2,32]},{72:[2,101],77:[2,101]},{14:[2,17],15:[2,17],19:[2,17],29:[2,17],34:[2,17],39:[2,17],44:[2,17],47:[2,17],48:[2,17],51:[2,17],55:[2,17],60:[2,17]}],defaultActions:{4:[2,1],55:[2,55],57:[2,20],61:[2,57],74:[2,81],83:[2,85],87:[2,18],91:[2,89],102:[2,53],105:[2,93],111:[2,19],112:[2,77],117:[2,97],120:[2,63],123:[2,69],124:[2,12],136:[2,75],137:[2,32]},parseError:function(a,b){throw new Error(a)},parse:function(a){function b(){var a;return a=c.lexer.lex()||1,"number"!=typeof a&&(a=c.symbols_[a]||a),a}var c=this,d=[0],e=[null],f=[],g=this.table,h="",i=0,j=0,k=0;this.lexer.setInput(a),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,"undefined"==typeof this.lexer.yylloc&&(this.lexer.yylloc={});var l=this.lexer.yylloc;f.push(l);var m=this.lexer.options&&this.lexer.options.ranges;"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var n,o,p,q,r,s,t,u,v,w={};;){if(p=d[d.length-1],this.defaultActions[p]?q=this.defaultActions[p]:(null!==n&&"undefined"!=typeof n||(n=b()),q=g[p]&&g[p][n]),"undefined"==typeof q||!q.length||!q[0]){var x="";if(!k){v=[];for(s in g[p])this.terminals_[s]&&s>2&&v.push("'"+this.terminals_[s]+"'");x=this.lexer.showPosition?"Parse error on line "+(i+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+v.join(", ")+", got '"+(this.terminals_[n]||n)+"'":"Parse error on line "+(i+1)+": Unexpected "+(1==n?"end of input":"'"+(this.terminals_[n]||n)+"'"),this.parseError(x,{text:this.lexer.match,token:this.terminals_[n]||n,line:this.lexer.yylineno,loc:l,expected:v})}}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+p+", token: "+n);switch(q[0]){case 1:d.push(n),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(q[1]),n=null,o?(n=o,o=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,l=this.lexer.yylloc,k>0&&k--);break;case 2:if(t=this.productions_[q[1]][1],w.$=e[e.length-t],w._$={first_line:f[f.length-(t||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(t||1)].first_column,last_column:f[f.length-1].last_column},m&&(w._$.range=[f[f.length-(t||1)].range[0],f[f.length-1].range[1]]),r=this.performAction.call(w,h,j,i,this.yy,q[1],e,f),"undefined"!=typeof r)return r;t&&(d=d.slice(0,-1*t*2),e=e.slice(0,-1*t),f=f.slice(0,-1*t)),d.push(this.productions_[q[1]][0]),e.push(w.$),f.push(w._$),u=g[d[d.length-2]][d[d.length-1]],d.push(u);break;case 3:return!0}}return!0}},c=function(){var a={EOF:1,parseError:function(a,b){if(!this.yy.parser)throw new Error(a);this.yy.parser.parseError(a,b)},setInput:function(a){return this._input=a,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a;var b=a.match(/(?:\r\n?|\n).*/g);return b?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},unput:function(a){var b=a.length,c=a.split(/(?:\r\n?|\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-b-1),this.offset-=b;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===d.length?this.yylloc.first_column:0)+d[d.length-c.length].length-c[0].length:this.yylloc.first_column-b},this.options.ranges&&(this.yylloc.range=[e[0],e[0]+this.yyleng-b]),this},more:function(){return this._more=!0,this},less:function(a){this.unput(this.match.slice(a))},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var a=this.pastInput(),b=new Array(a.length+1).join("-");return a+this.upcomingInput()+"\n"+b+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d,e;this._more||(this.yytext="",this.match="");for(var f=this._currentRules(),g=0;g<f.length&&(c=this._input.match(this.rules[f[g]]),!c||b&&!(c[0].length>b[0].length)||(b=c,d=g,this.options.flex));g++);return b?(e=b[0].match(/(?:\r\n?|\n).*/g),e&&(this.yylineno+=e.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:e?e[e.length-1].length-e[e.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.matches=b,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],a=this.performAction.call(this,this.yy,this,f[d],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a?a:void 0):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var a=this.next();return"undefined"!=typeof a?a:this.lex()},begin:function(a){this.conditionStack.push(a)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(a){this.begin(a)}};return a.options={},a.performAction=function(a,b,c,d){function e(a,c){return b.yytext=b.yytext.substr(a,b.yyleng-c)}switch(c){case 0:if("\\\\"===b.yytext.slice(-2)?(e(0,1),this.begin("mu")):"\\"===b.yytext.slice(-1)?(e(0,1),this.begin("emu")):this.begin("mu"),b.yytext)return 15;break;case 1:return 15;case 2:return this.popState(),15;case 3:return this.begin("raw"),15;case 4:return this.popState(),"raw"===this.conditionStack[this.conditionStack.length-1]?15:(b.yytext=b.yytext.substr(5,b.yyleng-9),"END_RAW_BLOCK");case 5:return 15;case 6:return this.popState(),14;case 7:return 65;case 8:return 68;case 9:return 19;case 10:return this.popState(),this.begin("raw"),23;case 11:return 55;case 12:return 60;case 13:return 29;case 14:return 47;case 15:return this.popState(),44;case 16:return this.popState(),44;case 17:return 34;case 18:return 39;case 19:return 51;case 20:return 48;case 21:this.unput(b.yytext),this.popState(),this.begin("com");break;case 22:return this.popState(),14;case 23:return 48;case 24:return 73;case 25:return 72;case 26:return 72;case 27:return 87;case 28:break;case 29:return this.popState(),54;case 30:return this.popState(),33;case 31:return b.yytext=e(1,2).replace(/\\"/g,'"'),80;case 32:return b.yytext=e(1,2).replace(/\\'/g,"'"),80;case 33:return 85;case 34:return 82;case 35:return 82;case 36:return 83;case 37:return 84;case 38:return 81;case 39:return 75;case 40:return 77;case 41:return 72;case 42:return b.yytext=b.yytext.replace(/\\([\\\]])/g,"$1"),72;case 43:return"INVALID";case 44:return 5}},a.rules=[/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{(?=[^\/]))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]*?(?=(\{\{\{\{)))/,/^(?:[\s\S]*?--(~)?\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#>)/,/^(?:\{\{(~)?#\*?)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{(~)?!--)/,/^(?:\{\{(~)?![\s\S]*?\}\})/,/^(?:\{\{(~)?\*?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)|])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:undefined(?=([~}\s)])))/,/^(?:null(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:as\s+\|)/,/^(?:\|)/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/,/^(?:\[(\\\]|[^\]])*\])/,/^(?:.)/,/^(?:$)/],a.conditions={mu:{rules:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],inclusive:!1},emu:{rules:[2],inclusive:!1},com:{rules:[6],inclusive:!1},raw:{rules:[3,4,5],inclusive:!1},INITIAL:{rules:[0,1,44],inclusive:!0}},a}();return b.lexer=c,a.prototype=b,b.Parser=a,new a}();b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(){var a=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.options=a}function e(a,b,c){void 0===b&&(b=a.length);var d=a[b-1],e=a[b-2];return d?"ContentStatement"===d.type?(e||!c?/\r?\n\s*?$/:/(^|\r?\n)\s*?$/).test(d.original):void 0:c}function f(a,b,c){void 0===b&&(b=-1);var d=a[b+1],e=a[b+2];return d?"ContentStatement"===d.type?(e||!c?/^\s*?\r?\n/:/^\s*?(\r?\n|$)/).test(d.original):void 0:c}function g(a,b,c){var d=a[null==b?0:b+1];if(d&&"ContentStatement"===d.type&&(c||!d.rightStripped)){var e=d.value;d.value=d.value.replace(c?/^\s+/:/^[ \t]*\r?\n?/,""),d.rightStripped=d.value!==e}}function h(a,b,c){var d=a[null==b?a.length-1:b-1];if(d&&"ContentStatement"===d.type&&(c||!d.leftStripped)){var e=d.value;return d.value=d.value.replace(c?/\s+$/:/[ \t]+$/,""),d.leftStripped=d.value!==e,d.leftStripped}}var i=c(1)["default"];b.__esModule=!0;var j=c(39),k=i(j);d.prototype=new k["default"],d.prototype.Program=function(a){var b=!this.options.ignoreStandalone,c=!this.isRootSeen;this.isRootSeen=!0;for(var d=a.body,i=0,j=d.length;i<j;i++){var k=d[i],l=this.accept(k);if(l){var m=e(d,i,c),n=f(d,i,c),o=l.openStandalone&&m,p=l.closeStandalone&&n,q=l.inlineStandalone&&m&&n;l.close&&g(d,i,!0),l.open&&h(d,i,!0),b&&q&&(g(d,i),h(d,i)&&"PartialStatement"===k.type&&(k.indent=/([ \t]+$)/.exec(d[i-1].original)[1])),b&&o&&(g((k.program||k.inverse).body),h(d,i)),b&&p&&(g(d,i),h((k.inverse||k.program).body))}}return a},d.prototype.BlockStatement=d.prototype.DecoratorBlock=d.prototype.PartialBlockStatement=function(a){this.accept(a.program),this.accept(a.inverse);var b=a.program||a.inverse,c=a.program&&a.inverse,d=c,i=c;if(c&&c.chained)for(d=c.body[0].program;i.chained;)i=i.body[i.body.length-1].program;var j={open:a.openStrip.open,close:a.closeStrip.close,openStandalone:f(b.body),closeStandalone:e((d||b).body)};if(a.openStrip.close&&g(b.body,null,!0),c){var k=a.inverseStrip;k.open&&h(b.body,null,!0),k.close&&g(d.body,null,!0),a.closeStrip.open&&h(i.body,null,!0),!this.options.ignoreStandalone&&e(b.body)&&f(d.body)&&(h(b.body),g(d.body))}else a.closeStrip.open&&h(b.body,null,!0);return j},d.prototype.Decorator=d.prototype.MustacheStatement=function(a){return a.strip},d.prototype.PartialStatement=d.prototype.CommentStatement=function(a){var b=a.strip||{};return{inlineStandalone:!0,open:b.open,close:b.close}},b["default"]=d,a.exports=b["default"]},function(a,b,c){"use strict";function d(){this.parents=[]}function e(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash")}function f(a){e.call(this,a),this.acceptKey(a,"program"),this.acceptKey(a,"inverse")}function g(a){this.acceptRequired(a,"name"),this.acceptArray(a.params),this.acceptKey(a,"hash")}var h=c(1)["default"];b.__esModule=!0;var i=c(6),j=h(i);d.prototype={constructor:d,mutating:!1,acceptKey:function(a,b){var c=this.accept(a[b]);if(this.mutating){if(c&&!d.prototype[c.type])throw new j["default"]('Unexpected node type "'+c.type+'" found when accepting '+b+" on "+a.type);a[b]=c}},acceptRequired:function(a,b){if(this.acceptKey(a,b),!a[b])throw new j["default"](a.type+" requires "+b)},acceptArray:function(a){for(var b=0,c=a.length;b<c;b++)this.acceptKey(a,b),a[b]||(a.splice(b,1),b--,c--)},accept:function(a){if(a){if(!this[a.type])throw new j["default"]("Unknown type: "+a.type,a);this.current&&this.parents.unshift(this.current),this.current=a;var b=this[a.type](a);return this.current=this.parents.shift(),!this.mutating||b?b:b!==!1?a:void 0}},Program:function(a){this.acceptArray(a.body)},MustacheStatement:e,Decorator:e,BlockStatement:f,DecoratorBlock:f,PartialStatement:g,PartialBlockStatement:function(a){g.call(this,a),this.acceptKey(a,"program")},ContentStatement:function(){},CommentStatement:function(){},SubExpression:e,PathExpression:function(){},StringLiteral:function(){},NumberLiteral:function(){},BooleanLiteral:function(){},UndefinedLiteral:function(){},NullLiteral:function(){},Hash:function(a){this.acceptArray(a.pairs)},HashPair:function(a){this.acceptRequired(a,"value")}},b["default"]=d,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){if(b=b.path?b.path.original:b,a.path.original!==b){var c={loc:a.path.loc};throw new q["default"](a.path.original+" doesn't match "+b,c)}}function e(a,b){this.source=a,this.start={line:b.first_line,column:b.first_column},this.end={line:b.last_line,column:b.last_column}}function f(a){return/^\[.*\]$/.test(a)?a.substr(1,a.length-2):a}function g(a,b){return{open:"~"===a.charAt(2),close:"~"===b.charAt(b.length-3)}}function h(a){return a.replace(/^\{\{~?\!-?-?/,"").replace(/-?-?~?\}\}$/,"")}function i(a,b,c){c=this.locInfo(c);for(var d=a?"@":"",e=[],f=0,g="",h=0,i=b.length;h<i;h++){var j=b[h].part,k=b[h].original!==j;if(d+=(b[h].separator||"")+j,k||".."!==j&&"."!==j&&"this"!==j)e.push(j);else{if(e.length>0)throw new q["default"]("Invalid path: "+d,{loc:c});".."===j&&(f++,g+="../")}}return{type:"PathExpression",data:a,depth:f,parts:e,original:d,loc:c}}function j(a,b,c,d,e,f){var g=d.charAt(3)||d.charAt(2),h="{"!==g&&"&"!==g,i=/\*/.test(d);return{type:i?"Decorator":"MustacheStatement",path:a,params:b,hash:c,escaped:h,strip:e,loc:this.locInfo(f)}}function k(a,b,c,e){d(a,c),e=this.locInfo(e);var f={type:"Program",body:b,strip:{},loc:e};return{type:"BlockStatement",path:a.path,params:a.params,hash:a.hash,program:f,openStrip:{},inverseStrip:{},closeStrip:{},loc:e}}function l(a,b,c,e,f,g){e&&e.path&&d(a,e);var h=/\*/.test(a.open);b.blockParams=a.blockParams;var i=void 0,j=void 0;if(c){if(h)throw new q["default"]("Unexpected inverse block on decorator",c);c.chain&&(c.program.body[0].closeStrip=e.strip),j=c.strip,i=c.program}return f&&(f=i,i=b,b=f),{type:h?"DecoratorBlock":"BlockStatement",path:a.path,params:a.params,hash:a.hash,program:b,inverse:i,openStrip:a.strip,inverseStrip:j,closeStrip:e&&e.strip,loc:this.locInfo(g)}}function m(a,b){if(!b&&a.length){var c=a[0].loc,d=a[a.length-1].loc;c&&d&&(b={source:c.source,start:{line:c.start.line,column:c.start.column},end:{line:d.end.line,column:d.end.column}})}return{type:"Program",body:a,strip:{},loc:b}}function n(a,b,c,e){return d(a,c),{type:"PartialBlockStatement",name:a.path,params:a.params,hash:a.hash,program:b,openStrip:a.strip,closeStrip:c&&c.strip,loc:this.locInfo(e)}}var o=c(1)["default"];b.__esModule=!0,b.SourceLocation=e,b.id=f,b.stripFlags=g,b.stripComment=h,b.preparePath=i,b.prepareMustache=j,b.prepareRawBlock=k,b.prepareBlock=l,b.prepareProgram=m,b.preparePartialBlock=n;var p=c(6),q=o(p)},function(a,b,c){"use strict";function d(){}function e(a,b,c){if(null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.precompile. You passed "+a);b=b||{},"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var d=c.parse(a,b),e=(new c.Compiler).compile(d,b);return(new c.JavaScriptCompiler).compile(e,b)}function f(a,b,c){function d(){var d=c.parse(a,b),e=(new c.Compiler).compile(d,b),f=(new c.JavaScriptCompiler).compile(e,b,void 0,!0);return c.template(f)}function e(a,b){return f||(f=d()),f.call(this,a,b)}if(void 0===b&&(b={}),null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+a);b=l.extend({},b),"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var f=void 0;return e._setup=function(a){return f||(f=d()),f._setup(a)},e._child=function(a,b,c,e){return f||(f=d()),f._child(a,b,c,e)},e}function g(a,b){if(a===b)return!0;if(l.isArray(a)&&l.isArray(b)&&a.length===b.length){for(var c=0;c<a.length;c++)if(!g(a[c],b[c]))return!1;return!0}}function h(a){if(!a.path.parts){var b=a.path;a.path={type:"PathExpression",data:!1,depth:0,parts:[b.original+""],original:b.original+"",loc:b.loc}}}var i=c(1)["default"];b.__esModule=!0,b.Compiler=d,b.precompile=e,b.compile=f;var j=c(6),k=i(j),l=c(5),m=c(35),n=i(m),o=[].slice;d.prototype={compiler:d,equals:function(a){var b=this.opcodes.length;if(a.opcodes.length!==b)return!1;for(var c=0;c<b;c++){var d=this.opcodes[c],e=a.opcodes[c];if(d.opcode!==e.opcode||!g(d.args,e.args))return!1}b=this.children.length;for(var c=0;c<b;c++)if(!this.children[c].equals(a.children[c]))return!1;return!0},guid:0,compile:function(a,b){this.sourceNode=[],this.opcodes=[],this.children=[],this.options=b,this.stringParams=b.stringParams,this.trackIds=b.trackIds,b.blockParams=b.blockParams||[];var c=b.knownHelpers;if(b.knownHelpers={helperMissing:!0,blockHelperMissing:!0,each:!0,"if":!0,unless:!0,"with":!0,log:!0,lookup:!0},c)for(var d in c)d in c&&(this.options.knownHelpers[d]=c[d]);return this.accept(a)},compileProgram:function(a){var b=new this.compiler,c=b.compile(a,this.options),d=this.guid++;return this.usePartial=this.usePartial||c.usePartial,this.children[d]=c,this.useDepths=this.useDepths||c.useDepths,d},accept:function(a){if(!this[a.type])throw new k["default"]("Unknown type: "+a.type,a);this.sourceNode.unshift(a);var b=this[a.type](a);return this.sourceNode.shift(),b},Program:function(a){this.options.blockParams.unshift(a.blockParams);for(var b=a.body,c=b.length,d=0;d<c;d++)this.accept(b[d]);return this.options.blockParams.shift(),this.isSimple=1===c,this.blockParams=a.blockParams?a.blockParams.length:0,this},BlockStatement:function(a){h(a);var b=a.program,c=a.inverse;b=b&&this.compileProgram(b),c=c&&this.compileProgram(c);var d=this.classifySexpr(a);"helper"===d?this.helperSexpr(a,b,c):"simple"===d?(this.simpleSexpr(a),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("blockValue",a.path.original)):(this.ambiguousSexpr(a,b,c),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("ambiguousBlockValue")),this.opcode("append")},DecoratorBlock:function(a){var b=a.program&&this.compileProgram(a.program),c=this.setupFullMustacheParams(a,b,void 0),d=a.path;this.useDecorators=!0,this.opcode("registerDecorator",c.length,d.original)},PartialStatement:function(a){this.usePartial=!0;var b=a.program;b&&(b=this.compileProgram(a.program));var c=a.params;if(c.length>1)throw new k["default"]("Unsupported number of partial arguments: "+c.length,a);c.length||(this.options.explicitPartialContext?this.opcode("pushLiteral","undefined"):c.push({type:"PathExpression",parts:[],depth:0}));var d=a.name.original,e="SubExpression"===a.name.type;e&&this.accept(a.name),this.setupFullMustacheParams(a,b,void 0,!0);var f=a.indent||"";this.options.preventIndent&&f&&(this.opcode("appendContent",f),f=""),this.opcode("invokePartial",e,d,f),this.opcode("append")},PartialBlockStatement:function(a){this.PartialStatement(a)},MustacheStatement:function(a){this.SubExpression(a),a.escaped&&!this.options.noEscape?this.opcode("appendEscaped"):this.opcode("append")},Decorator:function(a){this.DecoratorBlock(a)},ContentStatement:function(a){a.value&&this.opcode("appendContent",a.value)},CommentStatement:function(){},SubExpression:function(a){h(a);var b=this.classifySexpr(a);"simple"===b?this.simpleSexpr(a):"helper"===b?this.helperSexpr(a):this.ambiguousSexpr(a)},ambiguousSexpr:function(a,b,c){var d=a.path,e=d.parts[0],f=null!=b||null!=c;this.opcode("getContext",d.depth),this.opcode("pushProgram",b),this.opcode("pushProgram",c),d.strict=!0,this.accept(d),this.opcode("invokeAmbiguous",e,f)},simpleSexpr:function(a){var b=a.path;b.strict=!0,this.accept(b),this.opcode("resolvePossibleLambda")},helperSexpr:function(a,b,c){var d=this.setupFullMustacheParams(a,b,c),e=a.path,f=e.parts[0];if(this.options.knownHelpers[f])this.opcode("invokeKnownHelper",d.length,f);else{if(this.options.knownHelpersOnly)throw new k["default"]("You specified knownHelpersOnly, but used the unknown helper "+f,a);e.strict=!0,e.falsy=!0,this.accept(e),this.opcode("invokeHelper",d.length,e.original,n["default"].helpers.simpleId(e))}},PathExpression:function(a){this.addDepth(a.depth),this.opcode("getContext",a.depth);var b=a.parts[0],c=n["default"].helpers.scopedId(a),d=!a.depth&&!c&&this.blockParamIndex(b);d?this.opcode("lookupBlockParam",d,a.parts):b?a.data?(this.options.data=!0,this.opcode("lookupData",a.depth,a.parts,a.strict)):this.opcode("lookupOnContext",a.parts,a.falsy,a.strict,c):this.opcode("pushContext")},StringLiteral:function(a){this.opcode("pushString",a.value)},NumberLiteral:function(a){this.opcode("pushLiteral",a.value)},BooleanLiteral:function(a){this.opcode("pushLiteral",a.value)},UndefinedLiteral:function(){this.opcode("pushLiteral","undefined")},NullLiteral:function(){this.opcode("pushLiteral","null")},Hash:function(a){var b=a.pairs,c=0,d=b.length;for(this.opcode("pushHash");c<d;c++)this.pushParam(b[c].value);for(;c--;)this.opcode("assignToHash",b[c].key);this.opcode("popHash")},opcode:function(a){this.opcodes.push({opcode:a,args:o.call(arguments,1),loc:this.sourceNode[0].loc})},addDepth:function(a){a&&(this.useDepths=!0)},classifySexpr:function(a){var b=n["default"].helpers.simpleId(a.path),c=b&&!!this.blockParamIndex(a.path.parts[0]),d=!c&&n["default"].helpers.helperExpression(a),e=!c&&(d||b);if(e&&!d){var f=a.path.parts[0],g=this.options;g.knownHelpers[f]?d=!0:g.knownHelpersOnly&&(e=!1)}return d?"helper":e?"ambiguous":"simple"},pushParams:function(a){for(var b=0,c=a.length;b<c;b++)this.pushParam(a[b])},pushParam:function(a){var b=null!=a.value?a.value:a.original||"";if(this.stringParams)b.replace&&(b=b.replace(/^(\.?\.\/)*/g,"").replace(/\//g,".")),a.depth&&this.addDepth(a.depth),this.opcode("getContext",a.depth||0),this.opcode("pushStringParam",b,a.type),"SubExpression"===a.type&&this.accept(a);else{if(this.trackIds){var c=void 0;if(!a.parts||n["default"].helpers.scopedId(a)||a.depth||(c=this.blockParamIndex(a.parts[0])),c){var d=a.parts.slice(1).join(".");this.opcode("pushId","BlockParam",c,d)}else b=a.original||b,b.replace&&(b=b.replace(/^this(?:\.|$)/,"").replace(/^\.\//,"").replace(/^\.$/,"")),this.opcode("pushId",a.type,b)}this.accept(a)}},setupFullMustacheParams:function(a,b,c,d){var e=a.params;return this.pushParams(e),this.opcode("pushProgram",b),this.opcode("pushProgram",c),a.hash?this.accept(a.hash):this.opcode("emptyHash",d),e},blockParamIndex:function(a){for(var b=0,c=this.options.blockParams.length;b<c;b++){var d=this.options.blockParams[b],e=d&&l.indexOf(d,a);if(d&&e>=0)return[b,e]}}}},function(a,b,c){"use strict";function d(a){this.value=a}function e(){}function f(a,b,c,d){var e=b.popStack(),f=0,g=c.length;for(a&&g--;f<g;f++)e=b.nameLookup(e,c[f],d);return a?[b.aliasable("container.strict"),"(",e,", ",b.quotedString(c[f]),")"]:e}var g=c(1)["default"];b.__esModule=!0;var h=c(4),i=c(6),j=g(i),k=c(5),l=c(43),m=g(l);e.prototype={nameLookup:function(a,b){return e.isValidJavaScriptVariableName(b)?[a,".",b]:[a,"[",JSON.stringify(b),"]"]},depthedLookup:function(a){return[this.aliasable("container.lookup"),'(depths, "',a,'")']},compilerInfo:function(){var a=h.COMPILER_REVISION,b=h.REVISION_CHANGES[a];return[a,b]},appendToBuffer:function(a,b,c){return k.isArray(a)||(a=[a]),a=this.source.wrap(a,b),this.environment.isSimple?["return ",a,";"]:c?["buffer += ",a,";"]:(a.appendToBuffer=!0,a)},initializeBuffer:function(){return this.quotedString("")},compile:function(a,b,c,d){this.environment=a,this.options=b,this.stringParams=this.options.stringParams,this.trackIds=this.options.trackIds,this.precompile=!d,this.name=this.environment.name,this.isChild=!!c,this.context=c||{decorators:[],programs:[],environments:[]},this.preamble(),this.stackSlot=0,this.stackVars=[],this.aliases={},this.registers={list:[]},this.hashes=[],this.compileStack=[],this.inlineStack=[],this.blockParams=[],this.compileChildren(a,b),this.useDepths=this.useDepths||a.useDepths||a.useDecorators||this.options.compat,this.useBlockParams=this.useBlockParams||a.useBlockParams;var e=a.opcodes,f=void 0,g=void 0,h=void 0,i=void 0;for(h=0,i=e.length;h<i;h++)f=e[h],this.source.currentLocation=f.loc,g=g||f.loc,this[f.opcode].apply(this,f.args);if(this.source.currentLocation=g,this.pushSource(""),this.stackSlot||this.inlineStack.length||this.compileStack.length)throw new j["default"]("Compile completed with content left on stack");this.decorators.isEmpty()?this.decorators=void 0:(this.useDecorators=!0,this.decorators.prepend("var decorators = container.decorators;\n"),this.decorators.push("return fn;"),d?this.decorators=Function.apply(this,["fn","props","container","depth0","data","blockParams","depths",this.decorators.merge()]):(this.decorators.prepend("function(fn, props, container, depth0, data, blockParams, depths) {\n"),this.decorators.push("}\n"),this.decorators=this.decorators.merge()));var k=this.createFunctionContext(d);if(this.isChild)return k;var l={compiler:this.compilerInfo(),main:k};this.decorators&&(l.main_d=this.decorators,l.useDecorators=!0);var m=this.context,n=m.programs,o=m.decorators;for(h=0,i=n.length;h<i;h++)n[h]&&(l[h]=n[h],o[h]&&(l[h+"_d"]=o[h],l.useDecorators=!0));return this.environment.usePartial&&(l.usePartial=!0),this.options.data&&(l.useData=!0),this.useDepths&&(l.useDepths=!0),this.useBlockParams&&(l.useBlockParams=!0),this.options.compat&&(l.compat=!0),d?l.compilerOptions=this.options:(l.compiler=JSON.stringify(l.compiler),this.source.currentLocation={start:{line:1,column:0}},l=this.objectLiteral(l),b.srcName?(l=l.toStringWithSourceMap({file:b.destName}),l.map=l.map&&l.map.toString()):l=l.toString()),l},preamble:function(){this.lastContext=0,this.source=new m["default"](this.options.srcName),this.decorators=new m["default"](this.options.srcName)},createFunctionContext:function(a){var b="",c=this.stackVars.concat(this.registers.list);c.length>0&&(b+=", "+c.join(", "));var d=0;for(var e in this.aliases){var f=this.aliases[e];this.aliases.hasOwnProperty(e)&&f.children&&f.referenceCount>1&&(b+=", alias"+ ++d+"="+e,f.children[0]="alias"+d)}var g=["container","depth0","helpers","partials","data"];(this.useBlockParams||this.useDepths)&&g.push("blockParams"),this.useDepths&&g.push("depths");var h=this.mergeSource(b);return a?(g.push(h),Function.apply(this,g)):this.source.wrap(["function(",g.join(","),") {\n ",h,"}"])},mergeSource:function(a){var b=this.environment.isSimple,c=!this.forceBuffer,d=void 0,e=void 0,f=void 0,g=void 0;return this.source.each(function(a){a.appendToBuffer?(f?a.prepend(" + "):f=a,g=a):(f&&(e?f.prepend("buffer += "):d=!0,g.add(";"),f=g=void 0),e=!0,b||(c=!1))}),c?f?(f.prepend("return "),g.add(";")):e||this.source.push('return "";'):(a+=", buffer = "+(d?"":this.initializeBuffer()),f?(f.prepend("return buffer + "),g.add(";")):this.source.push("return buffer;")),a&&this.source.prepend("var "+a.substring(2)+(d?"":";\n")),this.source.merge()},blockValue:function(a){var b=this.aliasable("helpers.blockHelperMissing"),c=[this.contextName(0)];this.setupHelperArgs(a,0,c);var d=this.popStack();c.splice(1,0,d),this.push(this.source.functionCall(b,"call",c))},ambiguousBlockValue:function(){var a=this.aliasable("helpers.blockHelperMissing"),b=[this.contextName(0)];this.setupHelperArgs("",0,b,!0),this.flushInline();var c=this.topStack();b.splice(1,0,c),this.pushSource(["if (!",this.lastHelper,") { ",c," = ",this.source.functionCall(a,"call",b),"}"])},appendContent:function(a){this.pendingContent?a=this.pendingContent+a:this.pendingLocation=this.source.currentLocation,this.pendingContent=a},append:function(){if(this.isInline())this.replaceStack(function(a){return[" != null ? ",a,' : ""']}),this.pushSource(this.appendToBuffer(this.popStack()));else{var a=this.popStack();this.pushSource(["if (",a," != null) { ",this.appendToBuffer(a,void 0,!0)," }"]),this.environment.isSimple&&this.pushSource(["else { ",this.appendToBuffer("''",void 0,!0)," }"])}},appendEscaped:function(){this.pushSource(this.appendToBuffer([this.aliasable("container.escapeExpression"),"(",this.popStack(),")"]))},getContext:function(a){this.lastContext=a},pushContext:function(){this.pushStackLiteral(this.contextName(this.lastContext))},lookupOnContext:function(a,b,c,d){var e=0;d||!this.options.compat||this.lastContext?this.pushContext():this.push(this.depthedLookup(a[e++])),this.resolvePath("context",a,e,b,c)},lookupBlockParam:function(a,b){this.useBlockParams=!0,this.push(["blockParams[",a[0],"][",a[1],"]"]),this.resolvePath("context",b,1)},lookupData:function(a,b,c){a?this.pushStackLiteral("container.data(data, "+a+")"):this.pushStackLiteral("data"),this.resolvePath("data",b,0,!0,c)},resolvePath:function(a,b,c,d,e){var g=this;if(this.options.strict||this.options.assumeObjects)return void this.push(f(this.options.strict&&e,this,b,a));for(var h=b.length;c<h;c++)this.replaceStack(function(e){
29
  var f=g.nameLookup(e,b[c],a);return d?[" && ",f]:[" != null ? ",f," : ",e]})},resolvePossibleLambda:function(){this.push([this.aliasable("container.lambda"),"(",this.popStack(),", ",this.contextName(0),")"])},pushStringParam:function(a,b){this.pushContext(),this.pushString(b),"SubExpression"!==b&&("string"==typeof a?this.pushString(a):this.pushStackLiteral(a))},emptyHash:function(a){this.trackIds&&this.push("{}"),this.stringParams&&(this.push("{}"),this.push("{}")),this.pushStackLiteral(a?"undefined":"{}")},pushHash:function(){this.hash&&this.hashes.push(this.hash),this.hash={values:[],types:[],contexts:[],ids:[]}},popHash:function(){var a=this.hash;this.hash=this.hashes.pop(),this.trackIds&&this.push(this.objectLiteral(a.ids)),this.stringParams&&(this.push(this.objectLiteral(a.contexts)),this.push(this.objectLiteral(a.types))),this.push(this.objectLiteral(a.values))},pushString:function(a){this.pushStackLiteral(this.quotedString(a))},pushLiteral:function(a){this.pushStackLiteral(a)},pushProgram:function(a){null!=a?this.pushStackLiteral(this.programExpression(a)):this.pushStackLiteral(null)},registerDecorator:function(a,b){var c=this.nameLookup("decorators",b,"decorator"),d=this.setupHelperArgs(b,a);this.decorators.push(["fn = ",this.decorators.functionCall(c,"",["fn","props","container",d])," || fn;"])},invokeHelper:function(a,b,c){var d=this.popStack(),e=this.setupHelper(a,b),f=c?[e.name," || "]:"",g=["("].concat(f,d);this.options.strict||g.push(" || ",this.aliasable("helpers.helperMissing")),g.push(")"),this.push(this.source.functionCall(g,"call",e.callParams))},invokeKnownHelper:function(a,b){var c=this.setupHelper(a,b);this.push(this.source.functionCall(c.name,"call",c.callParams))},invokeAmbiguous:function(a,b){this.useRegister("helper");var c=this.popStack();this.emptyHash();var d=this.setupHelper(0,a,b),e=this.lastHelper=this.nameLookup("helpers",a,"helper"),f=["(","(helper = ",e," || ",c,")"];this.options.strict||(f[0]="(helper = ",f.push(" != null ? helper : ",this.aliasable("helpers.helperMissing"))),this.push(["(",f,d.paramsInit?["),(",d.paramsInit]:[],"),","(typeof helper === ",this.aliasable('"function"')," ? ",this.source.functionCall("helper","call",d.callParams)," : helper))"])},invokePartial:function(a,b,c){var d=[],e=this.setupParams(b,1,d);a&&(b=this.popStack(),delete e.name),c&&(e.indent=JSON.stringify(c)),e.helpers="helpers",e.partials="partials",e.decorators="container.decorators",a?d.unshift(b):d.unshift(this.nameLookup("partials",b,"partial")),this.options.compat&&(e.depths="depths"),e=this.objectLiteral(e),d.push(e),this.push(this.source.functionCall("container.invokePartial","",d))},assignToHash:function(a){var b=this.popStack(),c=void 0,d=void 0,e=void 0;this.trackIds&&(e=this.popStack()),this.stringParams&&(d=this.popStack(),c=this.popStack());var f=this.hash;c&&(f.contexts[a]=c),d&&(f.types[a]=d),e&&(f.ids[a]=e),f.values[a]=b},pushId:function(a,b,c){"BlockParam"===a?this.pushStackLiteral("blockParams["+b[0]+"].path["+b[1]+"]"+(c?" + "+JSON.stringify("."+c):"")):"PathExpression"===a?this.pushString(b):"SubExpression"===a?this.pushStackLiteral("true"):this.pushStackLiteral("null")},compiler:e,compileChildren:function(a,b){for(var c=a.children,d=void 0,e=void 0,f=0,g=c.length;f<g;f++){d=c[f],e=new this.compiler;var h=this.matchExistingProgram(d);if(null==h){this.context.programs.push("");var i=this.context.programs.length;d.index=i,d.name="program"+i,this.context.programs[i]=e.compile(d,b,this.context,!this.precompile),this.context.decorators[i]=e.decorators,this.context.environments[i]=d,this.useDepths=this.useDepths||e.useDepths,this.useBlockParams=this.useBlockParams||e.useBlockParams,d.useDepths=this.useDepths,d.useBlockParams=this.useBlockParams}else d.index=h.index,d.name="program"+h.index,this.useDepths=this.useDepths||h.useDepths,this.useBlockParams=this.useBlockParams||h.useBlockParams}},matchExistingProgram:function(a){for(var b=0,c=this.context.environments.length;b<c;b++){var d=this.context.environments[b];if(d&&d.equals(a))return d}},programExpression:function(a){var b=this.environment.children[a],c=[b.index,"data",b.blockParams];return(this.useBlockParams||this.useDepths)&&c.push("blockParams"),this.useDepths&&c.push("depths"),"container.program("+c.join(", ")+")"},useRegister:function(a){this.registers[a]||(this.registers[a]=!0,this.registers.list.push(a))},push:function(a){return a instanceof d||(a=this.source.wrap(a)),this.inlineStack.push(a),a},pushStackLiteral:function(a){this.push(new d(a))},pushSource:function(a){this.pendingContent&&(this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent),this.pendingLocation)),this.pendingContent=void 0),a&&this.source.push(a)},replaceStack:function(a){var b=["("],c=void 0,e=void 0,f=void 0;if(!this.isInline())throw new j["default"]("replaceStack on non-inline");var g=this.popStack(!0);if(g instanceof d)c=[g.value],b=["(",c],f=!0;else{e=!0;var h=this.incrStack();b=["((",this.push(h)," = ",g,")"],c=this.topStack()}var i=a.call(this,c);f||this.popStack(),e&&this.stackSlot--,this.push(b.concat(i,")"))},incrStack:function(){return this.stackSlot++,this.stackSlot>this.stackVars.length&&this.stackVars.push("stack"+this.stackSlot),this.topStackName()},topStackName:function(){return"stack"+this.stackSlot},flushInline:function(){var a=this.inlineStack;this.inlineStack=[];for(var b=0,c=a.length;b<c;b++){var e=a[b];if(e instanceof d)this.compileStack.push(e);else{var f=this.incrStack();this.pushSource([f," = ",e,";"]),this.compileStack.push(f)}}},isInline:function(){return this.inlineStack.length},popStack:function(a){var b=this.isInline(),c=(b?this.inlineStack:this.compileStack).pop();if(!a&&c instanceof d)return c.value;if(!b){if(!this.stackSlot)throw new j["default"]("Invalid stack pop");this.stackSlot--}return c},topStack:function(){var a=this.isInline()?this.inlineStack:this.compileStack,b=a[a.length-1];return b instanceof d?b.value:b},contextName:function(a){return this.useDepths&&a?"depths["+a+"]":"depth"+a},quotedString:function(a){return this.source.quotedString(a)},objectLiteral:function(a){return this.source.objectLiteral(a)},aliasable:function(a){var b=this.aliases[a];return b?(b.referenceCount++,b):(b=this.aliases[a]=this.source.wrap(a),b.aliasable=!0,b.referenceCount=1,b)},setupHelper:function(a,b,c){var d=[],e=this.setupHelperArgs(b,a,d,c),f=this.nameLookup("helpers",b,"helper"),g=this.aliasable(this.contextName(0)+" != null ? "+this.contextName(0)+" : (container.nullContext || {})");return{params:d,paramsInit:e,name:f,callParams:[g].concat(d)}},setupParams:function(a,b,c){var d={},e=[],f=[],g=[],h=!c,i=void 0;h&&(c=[]),d.name=this.quotedString(a),d.hash=this.popStack(),this.trackIds&&(d.hashIds=this.popStack()),this.stringParams&&(d.hashTypes=this.popStack(),d.hashContexts=this.popStack());var j=this.popStack(),k=this.popStack();(k||j)&&(d.fn=k||"container.noop",d.inverse=j||"container.noop");for(var l=b;l--;)i=this.popStack(),c[l]=i,this.trackIds&&(g[l]=this.popStack()),this.stringParams&&(f[l]=this.popStack(),e[l]=this.popStack());return h&&(d.args=this.source.generateArray(c)),this.trackIds&&(d.ids=this.source.generateArray(g)),this.stringParams&&(d.types=this.source.generateArray(f),d.contexts=this.source.generateArray(e)),this.options.data&&(d.data="data"),this.useBlockParams&&(d.blockParams="blockParams"),d},setupHelperArgs:function(a,b,c,d){var e=this.setupParams(a,b,c);return e=this.objectLiteral(e),d?(this.useRegister("options"),c.push("options"),["options=",e]):c?(c.push(e),""):e}},function(){for(var a="break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield await null true false".split(" "),b=e.RESERVED_WORDS={},c=0,d=a.length;c<d;c++)b[a[c]]=!0}(),e.isValidJavaScriptVariableName=function(a){return!e.RESERVED_WORDS[a]&&/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(a)},b["default"]=e,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b,c){if(f.isArray(a)){for(var d=[],e=0,g=a.length;e<g;e++)d.push(b.wrap(a[e],c));return d}return"boolean"==typeof a||"number"==typeof a?a+"":a}function e(a){this.srcFile=a,this.source=[]}b.__esModule=!0;var f=c(5),g=void 0;try{}catch(h){}g||(g=function(a,b,c,d){this.src="",d&&this.add(d)},g.prototype={add:function(a){f.isArray(a)&&(a=a.join("")),this.src+=a},prepend:function(a){f.isArray(a)&&(a=a.join("")),this.src=a+this.src},toStringWithSourceMap:function(){return{code:this.toString()}},toString:function(){return this.src}}),e.prototype={isEmpty:function(){return!this.source.length},prepend:function(a,b){this.source.unshift(this.wrap(a,b))},push:function(a,b){this.source.push(this.wrap(a,b))},merge:function(){var a=this.empty();return this.each(function(b){a.add([" ",b,"\n"])}),a},each:function(a){for(var b=0,c=this.source.length;b<c;b++)a(this.source[b])},empty:function(){var a=this.currentLocation||{start:{}};return new g(a.start.line,a.start.column,this.srcFile)},wrap:function(a){var b=arguments.length<=1||void 0===arguments[1]?this.currentLocation||{start:{}}:arguments[1];return a instanceof g?a:(a=d(a,this,b),new g(b.start.line,b.start.column,this.srcFile,a))},functionCall:function(a,b,c){return c=this.generateList(c),this.wrap([a,b?"."+b+"(":"(",c,")"])},quotedString:function(a){return'"'+(a+"").replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")+'"'},objectLiteral:function(a){var b=[];for(var c in a)if(a.hasOwnProperty(c)){var e=d(a[c],this);"undefined"!==e&&b.push([this.quotedString(c),":",e])}var f=this.generateList(b);return f.prepend("{"),f.add("}"),f},generateList:function(a){for(var b=this.empty(),c=0,e=a.length;c<e;c++)c&&b.add(","),b.add(d(a[c],this));return b},generateArray:function(a){var b=this.generateList(a);return b.prepend("["),b.add("]"),b}},b["default"]=e,a.exports=b["default"]}])});
includes/handlebars/handlebars.runtime.js CHANGED
@@ -1,9 +1,9 @@
1
  /**!
2
 
3
  @license
4
- handlebars v4.0.10
5
 
6
- Copyright (C) 2011-2016 by Yehuda Katz
7
 
8
  Permission is hereby granted, free of charge, to any person obtaining a copy
9
  of this software and associated documentation files (the "Software"), to deal
@@ -207,7 +207,7 @@ return /******/ (function(modules) { // webpackBootstrap
207
 
208
  var _logger2 = _interopRequireDefault(_logger);
209
 
210
- var VERSION = '4.0.10';
211
  exports.VERSION = VERSION;
212
  var COMPILER_REVISION = 7;
213
 
1
  /**!
2
 
3
  @license
4
+ handlebars v4.0.11
5
 
6
+ Copyright (C) 2011-2017 by Yehuda Katz
7
 
8
  Permission is hereby granted, free of charge, to any person obtaining a copy
9
  of this software and associated documentation files (the "Software"), to deal
207
 
208
  var _logger2 = _interopRequireDefault(_logger);
209
 
210
+ var VERSION = '4.0.11';
211
  exports.VERSION = VERSION;
212
  var COMPILER_REVISION = 7;
213
 
includes/handlebars/handlebars.runtime.min.js CHANGED
@@ -1,9 +1,9 @@
1
  /**!
2
 
3
  @license
4
- handlebars v4.0.10
5
 
6
- Copyright (C) 2011-2016 by Yehuda Katz
7
 
8
  Permission is hereby granted, free of charge, to any person obtaining a copy
9
  of this software and associated documentation files (the "Software"), to deal
@@ -24,4 +24,4 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
  THE SOFTWARE.
25
 
26
  */
27
- !function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define([],b):"object"==typeof exports?exports.Handlebars=b():a.Handlebars=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){"use strict";function d(){var a=new h.HandlebarsEnvironment;return n.extend(a,h),a.SafeString=j["default"],a.Exception=l["default"],a.Utils=n,a.escapeExpression=n.escapeExpression,a.VM=p,a.template=function(b){return p.template(b,a)},a}var e=c(1)["default"],f=c(2)["default"];b.__esModule=!0;var g=c(3),h=e(g),i=c(20),j=f(i),k=c(5),l=f(k),m=c(4),n=e(m),o=c(21),p=e(o),q=c(33),r=f(q),s=d();s.create=d,r["default"](s),s["default"]=s,b["default"]=s,a.exports=b["default"]},function(a,b){"use strict";b["default"]=function(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b},b.__esModule=!0},function(a,b){"use strict";b["default"]=function(a){return a&&a.__esModule?a:{"default":a}},b.__esModule=!0},function(a,b,c){"use strict";function d(a,b,c){this.helpers=a||{},this.partials=b||{},this.decorators=c||{},i.registerDefaultHelpers(this),j.registerDefaultDecorators(this)}var e=c(2)["default"];b.__esModule=!0,b.HandlebarsEnvironment=d;var f=c(4),g=c(5),h=e(g),i=c(9),j=c(17),k=c(19),l=e(k),m="4.0.10";b.VERSION=m;var n=7;b.COMPILER_REVISION=n;var o={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1",7:">= 4.0.0"};b.REVISION_CHANGES=o;var p="[object Object]";d.prototype={constructor:d,logger:l["default"],log:l["default"].log,registerHelper:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple helpers");f.extend(this.helpers,a)}else this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){if(f.toString.call(a)===p)f.extend(this.partials,a);else{if("undefined"==typeof b)throw new h["default"]('Attempting to register a partial called "'+a+'" as undefined');this.partials[a]=b}},unregisterPartial:function(a){delete this.partials[a]},registerDecorator:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple decorators");f.extend(this.decorators,a)}else this.decorators[a]=b},unregisterDecorator:function(a){delete this.decorators[a]}};var q=l["default"].log;b.log=q,b.createFrame=f.createFrame,b.logger=l["default"]},function(a,b){"use strict";function c(a){return k[a]}function d(a){for(var b=1;b<arguments.length;b++)for(var c in arguments[b])Object.prototype.hasOwnProperty.call(arguments[b],c)&&(a[c]=arguments[b][c]);return a}function e(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1}function f(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return m.test(a)?a.replace(l,c):a}function g(a){return!a&&0!==a||!(!p(a)||0!==a.length)}function h(a){var b=d({},a);return b._parent=a,b}function i(a,b){return a.path=b,a}function j(a,b){return(a?a+".":"")+b}b.__esModule=!0,b.extend=d,b.indexOf=e,b.escapeExpression=f,b.isEmpty=g,b.createFrame=h,b.blockParams=i,b.appendContextPath=j;var k={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;","=":"&#x3D;"},l=/[&<>"'`=]/g,m=/[&<>"'`=]/,n=Object.prototype.toString;b.toString=n;var o=function(a){return"function"==typeof a};o(/x/)&&(b.isFunction=o=function(a){return"function"==typeof a&&"[object Function]"===n.call(a)}),b.isFunction=o;var p=Array.isArray||function(a){return!(!a||"object"!=typeof a)&&"[object Array]"===n.call(a)};b.isArray=p},function(a,b,c){"use strict";function d(a,b){var c=b&&b.loc,g=void 0,h=void 0;c&&(g=c.start.line,h=c.start.column,a+=" - "+g+":"+h);for(var i=Error.prototype.constructor.call(this,a),j=0;j<f.length;j++)this[f[j]]=i[f[j]];Error.captureStackTrace&&Error.captureStackTrace(this,d);try{c&&(this.lineNumber=g,e?Object.defineProperty(this,"column",{value:h,enumerable:!0}):this.column=h)}catch(k){}}var e=c(6)["default"];b.__esModule=!0;var f=["description","fileName","lineNumber","message","name","number","stack"];d.prototype=new Error,b["default"]=d,a.exports=b["default"]},function(a,b,c){a.exports={"default":c(7),__esModule:!0}},function(a,b,c){var d=c(8);a.exports=function(a,b,c){return d.setDesc(a,b,c)}},function(a,b){var c=Object;a.exports={create:c.create,getProto:c.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:c.getOwnPropertyDescriptor,setDesc:c.defineProperty,setDescs:c.defineProperties,getKeys:c.keys,getNames:c.getOwnPropertyNames,getSymbols:c.getOwnPropertySymbols,each:[].forEach}},function(a,b,c){"use strict";function d(a){g["default"](a),i["default"](a),k["default"](a),m["default"](a),o["default"](a),q["default"](a),s["default"](a)}var e=c(2)["default"];b.__esModule=!0,b.registerDefaultHelpers=d;var f=c(10),g=e(f),h=c(11),i=e(h),j=c(12),k=e(j),l=c(13),m=e(l),n=c(14),o=e(n),p=c(15),q=e(p),r=c(16),s=e(r)},function(a,b,c){"use strict";b.__esModule=!0;var d=c(4);b["default"]=function(a){a.registerHelper("blockHelperMissing",function(b,c){var e=c.inverse,f=c.fn;if(b===!0)return f(this);if(b===!1||null==b)return e(this);if(d.isArray(b))return b.length>0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):e(this);if(c.data&&c.ids){var g=d.createFrame(c.data);g.contextPath=d.appendContextPath(c.data.contextPath,c.name),c={data:g}}return f(b,c)})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(2)["default"];b.__esModule=!0;var e=c(4),f=c(5),g=d(f);b["default"]=function(a){a.registerHelper("each",function(a,b){function c(b,c,f){j&&(j.key=b,j.index=c,j.first=0===c,j.last=!!f,k&&(j.contextPath=k+b)),i+=d(a[b],{data:j,blockParams:e.blockParams([a[b],b],[k+b,null])})}if(!b)throw new g["default"]("Must pass iterator to #each");var d=b.fn,f=b.inverse,h=0,i="",j=void 0,k=void 0;if(b.data&&b.ids&&(k=e.appendContextPath(b.data.contextPath,b.ids[0])+"."),e.isFunction(a)&&(a=a.call(this)),b.data&&(j=e.createFrame(b.data)),a&&"object"==typeof a)if(e.isArray(a))for(var l=a.length;h<l;h++)h in a&&c(h,h,h===a.length-1);else{var m=void 0;for(var n in a)a.hasOwnProperty(n)&&(void 0!==m&&c(m,h-1),m=n,h++);void 0!==m&&c(m,h-1,!0)}return 0===h&&(i=f(this)),i})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(2)["default"];b.__esModule=!0;var e=c(5),f=d(e);b["default"]=function(a){a.registerHelper("helperMissing",function(){if(1!==arguments.length)throw new f["default"]('Missing helper: "'+arguments[arguments.length-1].name+'"')})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(4);b["default"]=function(a){a.registerHelper("if",function(a,b){return d.isFunction(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||d.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("log",function(){for(var b=[void 0],c=arguments[arguments.length-1],d=0;d<arguments.length-1;d++)b.push(arguments[d]);var e=1;null!=c.hash.level?e=c.hash.level:c.data&&null!=c.data.level&&(e=c.data.level),b[0]=e,a.log.apply(a,b)})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("lookup",function(a,b){return a&&a[b]})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(4);b["default"]=function(a){a.registerHelper("with",function(a,b){d.isFunction(a)&&(a=a.call(this));var c=b.fn;if(d.isEmpty(a))return b.inverse(this);var e=b.data;return b.data&&b.ids&&(e=d.createFrame(b.data),e.contextPath=d.appendContextPath(b.data.contextPath,b.ids[0])),c(a,{data:e,blockParams:d.blockParams([a],[e&&e.contextPath])})})},a.exports=b["default"]},function(a,b,c){"use strict";function d(a){g["default"](a)}var e=c(2)["default"];b.__esModule=!0,b.registerDefaultDecorators=d;var f=c(18),g=e(f)},function(a,b,c){"use strict";b.__esModule=!0;var d=c(4);b["default"]=function(a){a.registerDecorator("inline",function(a,b,c,e){var f=a;return b.partials||(b.partials={},f=function(e,f){var g=c.partials;c.partials=d.extend({},g,b.partials);var h=a(e,f);return c.partials=g,h}),b.partials[e.args[0]]=e.fn,f})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(4),e={methodMap:["debug","info","warn","error"],level:"info",lookupLevel:function(a){if("string"==typeof a){var b=d.indexOf(e.methodMap,a.toLowerCase());a=b>=0?b:parseInt(a,10)}return a},log:function(a){if(a=e.lookupLevel(a),"undefined"!=typeof console&&e.lookupLevel(e.level)<=a){var b=e.methodMap[a];console[b]||(b="log");for(var c=arguments.length,d=Array(c>1?c-1:0),f=1;f<c;f++)d[f-1]=arguments[f];console[b].apply(console,d)}}};b["default"]=e,a.exports=b["default"]},function(a,b){"use strict";function c(a){this.string=a}b.__esModule=!0,c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=s.COMPILER_REVISION;if(b!==c){if(b<c){var d=s.REVISION_CHANGES[c],e=s.REVISION_CHANGES[b];throw new r["default"]("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new r["default"]("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){function c(c,d,e){e.hash&&(d=p.extend({},d,e.hash),e.ids&&(e.ids[0]=!0)),c=b.VM.resolvePartial.call(this,c,d,e);var f=b.VM.invokePartial.call(this,c,d,e);if(null==f&&b.compile&&(e.partials[e.name]=b.compile(c,a.compilerOptions,b),f=e.partials[e.name](d,e)),null!=f){if(e.indent){for(var g=f.split("\n"),h=0,i=g.length;h<i&&(g[h]||h+1!==i);h++)g[h]=e.indent+g[h];f=g.join("\n")}return f}throw new r["default"]("The partial "+e.name+" could not be compiled when running in runtime-only mode")}function d(b){function c(b){return""+a.main(e,b,e.helpers,e.partials,g,i,h)}var f=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],g=f.data;d._setup(f),!f.partial&&a.useData&&(g=j(b,g));var h=void 0,i=a.useBlockParams?[]:void 0;return a.useDepths&&(h=f.depths?b!=f.depths[0]?[b].concat(f.depths):f.depths:[b]),(c=k(a.main,c,e,f.depths||[],g,i))(b,f)}if(!b)throw new r["default"]("No environment passed to template");if(!a||!a.main)throw new r["default"]("Unknown template object: "+typeof a);a.main.decorator=a.main_d,b.VM.checkRevision(a.compiler);var e={strict:function(a,b){if(!(b in a))throw new r["default"]('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;d<c;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:p.escapeExpression,invokePartial:c,fn:function(b){var c=a[b];return c.decorator=a[b+"_d"],c},programs:[],program:function(a,b,c,d,e){var g=this.programs[a],h=this.fn(a);return b||e||d||c?g=f(this,a,h,b,c,d,e):g||(g=this.programs[a]=f(this,a,h)),g},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=p.extend({},b,a)),c},nullContext:l({}),noop:b.VM.noop,compilerInfo:a.compiler};return d.isTop=!0,d._setup=function(c){c.partial?(e.helpers=c.helpers,e.partials=c.partials,e.decorators=c.decorators):(e.helpers=e.merge(c.helpers,b.helpers),a.usePartial&&(e.partials=e.merge(c.partials,b.partials)),(a.usePartial||a.useDecorators)&&(e.decorators=e.merge(c.decorators,b.decorators)))},d._child=function(b,c,d,g){if(a.useBlockParams&&!d)throw new r["default"]("must pass block params");if(a.useDepths&&!g)throw new r["default"]("must pass parent depths");return f(e,b,a[b],c,0,d,g)},d}function f(a,b,c,d,e,f,g){function h(b){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],h=g;return!g||b==g[0]||b===a.nullContext&&null===g[0]||(h=[b].concat(g)),c(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),h)}return h=k(c,h,a,g,d,f),h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function g(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a="@partial-block"===c.name?c.data["partial-block"]:c.partials[c.name],a}function h(a,b,c){var d=c.data&&c.data["partial-block"];c.partial=!0,c.ids&&(c.data.contextPath=c.ids[0]||c.data.contextPath);var e=void 0;if(c.fn&&c.fn!==i&&!function(){c.data=s.createFrame(c.data);var a=c.fn;e=c.data["partial-block"]=function(b){var c=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return c.data=s.createFrame(c.data),c.data["partial-block"]=d,a(b,c)},a.partials&&(c.partials=p.extend({},c.partials,a.partials))}(),void 0===a&&e&&(a=e),void 0===a)throw new r["default"]("The partial "+c.name+" could not be found");if(a instanceof Function)return a(b,c)}function i(){return""}function j(a,b){return b&&"root"in b||(b=b?s.createFrame(b):{},b.root=a),b}function k(a,b,c,d,e,f){if(a.decorator){var g={};b=a.decorator(b,g,c,d&&d[0],e,f,d),p.extend(b,g)}return b}var l=c(22)["default"],m=c(1)["default"],n=c(2)["default"];b.__esModule=!0,b.checkRevision=d,b.template=e,b.wrapProgram=f,b.resolvePartial=g,b.invokePartial=h,b.noop=i;var o=c(4),p=m(o),q=c(5),r=n(q),s=c(3)},function(a,b,c){a.exports={"default":c(23),__esModule:!0}},function(a,b,c){c(24),a.exports=c(29).Object.seal},function(a,b,c){var d=c(25);c(26)("seal",function(a){return function(b){return a&&d(b)?a(b):b}})},function(a,b){a.exports=function(a){return"object"==typeof a?null!==a:"function"==typeof a}},function(a,b,c){var d=c(27),e=c(29),f=c(32);a.exports=function(a,b){var c=(e.Object||{})[a]||Object[a],g={};g[a]=b(c),d(d.S+d.F*f(function(){c(1)}),"Object",g)}},function(a,b,c){var d=c(28),e=c(29),f=c(30),g="prototype",h=function(a,b,c){var i,j,k,l=a&h.F,m=a&h.G,n=a&h.S,o=a&h.P,p=a&h.B,q=a&h.W,r=m?e:e[b]||(e[b]={}),s=m?d:n?d[b]:(d[b]||{})[g];m&&(c=b);for(i in c)j=!l&&s&&i in s,j&&i in r||(k=j?s[i]:c[i],r[i]=m&&"function"!=typeof s[i]?c[i]:p&&j?f(k,d):q&&s[i]==k?function(a){var b=function(b){return this instanceof a?new a(b):a(b)};return b[g]=a[g],b}(k):o&&"function"==typeof k?f(Function.call,k):k,o&&((r[g]||(r[g]={}))[i]=k))};h.F=1,h.G=2,h.S=4,h.P=8,h.B=16,h.W=32,a.exports=h},function(a,b){var c=a.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=c)},function(a,b){var c=a.exports={version:"1.2.6"};"number"==typeof __e&&(__e=c)},function(a,b,c){var d=c(31);a.exports=function(a,b,c){if(d(a),void 0===b)return a;switch(c){case 1:return function(c){return a.call(b,c)};case 2:return function(c,d){return a.call(b,c,d)};case 3:return function(c,d,e){return a.call(b,c,d,e)}}return function(){return a.apply(b,arguments)}}},function(a,b){a.exports=function(a){if("function"!=typeof a)throw TypeError(a+" is not a function!");return a}},function(a,b){a.exports=function(a){try{return!!a()}catch(b){return!0}}},function(a,b){(function(c){"use strict";b.__esModule=!0,b["default"]=function(a){var b="undefined"!=typeof c?c:window,d=b.Handlebars;a.noConflict=function(){return b.Handlebars===a&&(b.Handlebars=d),a}},a.exports=b["default"]}).call(b,function(){return this}())}])});
1
  /**!
2
 
3
  @license
4
+ handlebars v4.0.11
5
 
6
+ Copyright (C) 2011-2017 by Yehuda Katz
7
 
8
  Permission is hereby granted, free of charge, to any person obtaining a copy
9
  of this software and associated documentation files (the "Software"), to deal
24
  THE SOFTWARE.
25
 
26
  */
27
+ !function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define([],b):"object"==typeof exports?exports.Handlebars=b():a.Handlebars=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){"use strict";function d(){var a=new h.HandlebarsEnvironment;return n.extend(a,h),a.SafeString=j["default"],a.Exception=l["default"],a.Utils=n,a.escapeExpression=n.escapeExpression,a.VM=p,a.template=function(b){return p.template(b,a)},a}var e=c(1)["default"],f=c(2)["default"];b.__esModule=!0;var g=c(3),h=e(g),i=c(20),j=f(i),k=c(5),l=f(k),m=c(4),n=e(m),o=c(21),p=e(o),q=c(33),r=f(q),s=d();s.create=d,r["default"](s),s["default"]=s,b["default"]=s,a.exports=b["default"]},function(a,b){"use strict";b["default"]=function(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b},b.__esModule=!0},function(a,b){"use strict";b["default"]=function(a){return a&&a.__esModule?a:{"default":a}},b.__esModule=!0},function(a,b,c){"use strict";function d(a,b,c){this.helpers=a||{},this.partials=b||{},this.decorators=c||{},i.registerDefaultHelpers(this),j.registerDefaultDecorators(this)}var e=c(2)["default"];b.__esModule=!0,b.HandlebarsEnvironment=d;var f=c(4),g=c(5),h=e(g),i=c(9),j=c(17),k=c(19),l=e(k),m="4.0.11";b.VERSION=m;var n=7;b.COMPILER_REVISION=n;var o={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1",7:">= 4.0.0"};b.REVISION_CHANGES=o;var p="[object Object]";d.prototype={constructor:d,logger:l["default"],log:l["default"].log,registerHelper:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple helpers");f.extend(this.helpers,a)}else this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){if(f.toString.call(a)===p)f.extend(this.partials,a);else{if("undefined"==typeof b)throw new h["default"]('Attempting to register a partial called "'+a+'" as undefined');this.partials[a]=b}},unregisterPartial:function(a){delete this.partials[a]},registerDecorator:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple decorators");f.extend(this.decorators,a)}else this.decorators[a]=b},unregisterDecorator:function(a){delete this.decorators[a]}};var q=l["default"].log;b.log=q,b.createFrame=f.createFrame,b.logger=l["default"]},function(a,b){"use strict";function c(a){return k[a]}function d(a){for(var b=1;b<arguments.length;b++)for(var c in arguments[b])Object.prototype.hasOwnProperty.call(arguments[b],c)&&(a[c]=arguments[b][c]);return a}function e(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1}function f(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return m.test(a)?a.replace(l,c):a}function g(a){return!a&&0!==a||!(!p(a)||0!==a.length)}function h(a){var b=d({},a);return b._parent=a,b}function i(a,b){return a.path=b,a}function j(a,b){return(a?a+".":"")+b}b.__esModule=!0,b.extend=d,b.indexOf=e,b.escapeExpression=f,b.isEmpty=g,b.createFrame=h,b.blockParams=i,b.appendContextPath=j;var k={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;","=":"&#x3D;"},l=/[&<>"'`=]/g,m=/[&<>"'`=]/,n=Object.prototype.toString;b.toString=n;var o=function(a){return"function"==typeof a};o(/x/)&&(b.isFunction=o=function(a){return"function"==typeof a&&"[object Function]"===n.call(a)}),b.isFunction=o;var p=Array.isArray||function(a){return!(!a||"object"!=typeof a)&&"[object Array]"===n.call(a)};b.isArray=p},function(a,b,c){"use strict";function d(a,b){var c=b&&b.loc,g=void 0,h=void 0;c&&(g=c.start.line,h=c.start.column,a+=" - "+g+":"+h);for(var i=Error.prototype.constructor.call(this,a),j=0;j<f.length;j++)this[f[j]]=i[f[j]];Error.captureStackTrace&&Error.captureStackTrace(this,d);try{c&&(this.lineNumber=g,e?Object.defineProperty(this,"column",{value:h,enumerable:!0}):this.column=h)}catch(k){}}var e=c(6)["default"];b.__esModule=!0;var f=["description","fileName","lineNumber","message","name","number","stack"];d.prototype=new Error,b["default"]=d,a.exports=b["default"]},function(a,b,c){a.exports={"default":c(7),__esModule:!0}},function(a,b,c){var d=c(8);a.exports=function(a,b,c){return d.setDesc(a,b,c)}},function(a,b){var c=Object;a.exports={create:c.create,getProto:c.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:c.getOwnPropertyDescriptor,setDesc:c.defineProperty,setDescs:c.defineProperties,getKeys:c.keys,getNames:c.getOwnPropertyNames,getSymbols:c.getOwnPropertySymbols,each:[].forEach}},function(a,b,c){"use strict";function d(a){g["default"](a),i["default"](a),k["default"](a),m["default"](a),o["default"](a),q["default"](a),s["default"](a)}var e=c(2)["default"];b.__esModule=!0,b.registerDefaultHelpers=d;var f=c(10),g=e(f),h=c(11),i=e(h),j=c(12),k=e(j),l=c(13),m=e(l),n=c(14),o=e(n),p=c(15),q=e(p),r=c(16),s=e(r)},function(a,b,c){"use strict";b.__esModule=!0;var d=c(4);b["default"]=function(a){a.registerHelper("blockHelperMissing",function(b,c){var e=c.inverse,f=c.fn;if(b===!0)return f(this);if(b===!1||null==b)return e(this);if(d.isArray(b))return b.length>0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):e(this);if(c.data&&c.ids){var g=d.createFrame(c.data);g.contextPath=d.appendContextPath(c.data.contextPath,c.name),c={data:g}}return f(b,c)})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(2)["default"];b.__esModule=!0;var e=c(4),f=c(5),g=d(f);b["default"]=function(a){a.registerHelper("each",function(a,b){function c(b,c,f){j&&(j.key=b,j.index=c,j.first=0===c,j.last=!!f,k&&(j.contextPath=k+b)),i+=d(a[b],{data:j,blockParams:e.blockParams([a[b],b],[k+b,null])})}if(!b)throw new g["default"]("Must pass iterator to #each");var d=b.fn,f=b.inverse,h=0,i="",j=void 0,k=void 0;if(b.data&&b.ids&&(k=e.appendContextPath(b.data.contextPath,b.ids[0])+"."),e.isFunction(a)&&(a=a.call(this)),b.data&&(j=e.createFrame(b.data)),a&&"object"==typeof a)if(e.isArray(a))for(var l=a.length;h<l;h++)h in a&&c(h,h,h===a.length-1);else{var m=void 0;for(var n in a)a.hasOwnProperty(n)&&(void 0!==m&&c(m,h-1),m=n,h++);void 0!==m&&c(m,h-1,!0)}return 0===h&&(i=f(this)),i})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(2)["default"];b.__esModule=!0;var e=c(5),f=d(e);b["default"]=function(a){a.registerHelper("helperMissing",function(){if(1!==arguments.length)throw new f["default"]('Missing helper: "'+arguments[arguments.length-1].name+'"')})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(4);b["default"]=function(a){a.registerHelper("if",function(a,b){return d.isFunction(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||d.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("log",function(){for(var b=[void 0],c=arguments[arguments.length-1],d=0;d<arguments.length-1;d++)b.push(arguments[d]);var e=1;null!=c.hash.level?e=c.hash.level:c.data&&null!=c.data.level&&(e=c.data.level),b[0]=e,a.log.apply(a,b)})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("lookup",function(a,b){return a&&a[b]})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(4);b["default"]=function(a){a.registerHelper("with",function(a,b){d.isFunction(a)&&(a=a.call(this));var c=b.fn;if(d.isEmpty(a))return b.inverse(this);var e=b.data;return b.data&&b.ids&&(e=d.createFrame(b.data),e.contextPath=d.appendContextPath(b.data.contextPath,b.ids[0])),c(a,{data:e,blockParams:d.blockParams([a],[e&&e.contextPath])})})},a.exports=b["default"]},function(a,b,c){"use strict";function d(a){g["default"](a)}var e=c(2)["default"];b.__esModule=!0,b.registerDefaultDecorators=d;var f=c(18),g=e(f)},function(a,b,c){"use strict";b.__esModule=!0;var d=c(4);b["default"]=function(a){a.registerDecorator("inline",function(a,b,c,e){var f=a;return b.partials||(b.partials={},f=function(e,f){var g=c.partials;c.partials=d.extend({},g,b.partials);var h=a(e,f);return c.partials=g,h}),b.partials[e.args[0]]=e.fn,f})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(4),e={methodMap:["debug","info","warn","error"],level:"info",lookupLevel:function(a){if("string"==typeof a){var b=d.indexOf(e.methodMap,a.toLowerCase());a=b>=0?b:parseInt(a,10)}return a},log:function(a){if(a=e.lookupLevel(a),"undefined"!=typeof console&&e.lookupLevel(e.level)<=a){var b=e.methodMap[a];console[b]||(b="log");for(var c=arguments.length,d=Array(c>1?c-1:0),f=1;f<c;f++)d[f-1]=arguments[f];console[b].apply(console,d)}}};b["default"]=e,a.exports=b["default"]},function(a,b){"use strict";function c(a){this.string=a}b.__esModule=!0,c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=s.COMPILER_REVISION;if(b!==c){if(b<c){var d=s.REVISION_CHANGES[c],e=s.REVISION_CHANGES[b];throw new r["default"]("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new r["default"]("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){function c(c,d,e){e.hash&&(d=p.extend({},d,e.hash),e.ids&&(e.ids[0]=!0)),c=b.VM.resolvePartial.call(this,c,d,e);var f=b.VM.invokePartial.call(this,c,d,e);if(null==f&&b.compile&&(e.partials[e.name]=b.compile(c,a.compilerOptions,b),f=e.partials[e.name](d,e)),null!=f){if(e.indent){for(var g=f.split("\n"),h=0,i=g.length;h<i&&(g[h]||h+1!==i);h++)g[h]=e.indent+g[h];f=g.join("\n")}return f}throw new r["default"]("The partial "+e.name+" could not be compiled when running in runtime-only mode")}function d(b){function c(b){return""+a.main(e,b,e.helpers,e.partials,g,i,h)}var f=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],g=f.data;d._setup(f),!f.partial&&a.useData&&(g=j(b,g));var h=void 0,i=a.useBlockParams?[]:void 0;return a.useDepths&&(h=f.depths?b!=f.depths[0]?[b].concat(f.depths):f.depths:[b]),(c=k(a.main,c,e,f.depths||[],g,i))(b,f)}if(!b)throw new r["default"]("No environment passed to template");if(!a||!a.main)throw new r["default"]("Unknown template object: "+typeof a);a.main.decorator=a.main_d,b.VM.checkRevision(a.compiler);var e={strict:function(a,b){if(!(b in a))throw new r["default"]('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;d<c;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:p.escapeExpression,invokePartial:c,fn:function(b){var c=a[b];return c.decorator=a[b+"_d"],c},programs:[],program:function(a,b,c,d,e){var g=this.programs[a],h=this.fn(a);return b||e||d||c?g=f(this,a,h,b,c,d,e):g||(g=this.programs[a]=f(this,a,h)),g},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=p.extend({},b,a)),c},nullContext:l({}),noop:b.VM.noop,compilerInfo:a.compiler};return d.isTop=!0,d._setup=function(c){c.partial?(e.helpers=c.helpers,e.partials=c.partials,e.decorators=c.decorators):(e.helpers=e.merge(c.helpers,b.helpers),a.usePartial&&(e.partials=e.merge(c.partials,b.partials)),(a.usePartial||a.useDecorators)&&(e.decorators=e.merge(c.decorators,b.decorators)))},d._child=function(b,c,d,g){if(a.useBlockParams&&!d)throw new r["default"]("must pass block params");if(a.useDepths&&!g)throw new r["default"]("must pass parent depths");return f(e,b,a[b],c,0,d,g)},d}function f(a,b,c,d,e,f,g){function h(b){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],h=g;return!g||b==g[0]||b===a.nullContext&&null===g[0]||(h=[b].concat(g)),c(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),h)}return h=k(c,h,a,g,d,f),h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function g(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a="@partial-block"===c.name?c.data["partial-block"]:c.partials[c.name],a}function h(a,b,c){var d=c.data&&c.data["partial-block"];c.partial=!0,c.ids&&(c.data.contextPath=c.ids[0]||c.data.contextPath);var e=void 0;if(c.fn&&c.fn!==i&&!function(){c.data=s.createFrame(c.data);var a=c.fn;e=c.data["partial-block"]=function(b){var c=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return c.data=s.createFrame(c.data),c.data["partial-block"]=d,a(b,c)},a.partials&&(c.partials=p.extend({},c.partials,a.partials))}(),void 0===a&&e&&(a=e),void 0===a)throw new r["default"]("The partial "+c.name+" could not be found");if(a instanceof Function)return a(b,c)}function i(){return""}function j(a,b){return b&&"root"in b||(b=b?s.createFrame(b):{},b.root=a),b}function k(a,b,c,d,e,f){if(a.decorator){var g={};b=a.decorator(b,g,c,d&&d[0],e,f,d),p.extend(b,g)}return b}var l=c(22)["default"],m=c(1)["default"],n=c(2)["default"];b.__esModule=!0,b.checkRevision=d,b.template=e,b.wrapProgram=f,b.resolvePartial=g,b.invokePartial=h,b.noop=i;var o=c(4),p=m(o),q=c(5),r=n(q),s=c(3)},function(a,b,c){a.exports={"default":c(23),__esModule:!0}},function(a,b,c){c(24),a.exports=c(29).Object.seal},function(a,b,c){var d=c(25);c(26)("seal",function(a){return function(b){return a&&d(b)?a(b):b}})},function(a,b){a.exports=function(a){return"object"==typeof a?null!==a:"function"==typeof a}},function(a,b,c){var d=c(27),e=c(29),f=c(32);a.exports=function(a,b){var c=(e.Object||{})[a]||Object[a],g={};g[a]=b(c),d(d.S+d.F*f(function(){c(1)}),"Object",g)}},function(a,b,c){var d=c(28),e=c(29),f=c(30),g="prototype",h=function(a,b,c){var i,j,k,l=a&h.F,m=a&h.G,n=a&h.S,o=a&h.P,p=a&h.B,q=a&h.W,r=m?e:e[b]||(e[b]={}),s=m?d:n?d[b]:(d[b]||{})[g];m&&(c=b);for(i in c)j=!l&&s&&i in s,j&&i in r||(k=j?s[i]:c[i],r[i]=m&&"function"!=typeof s[i]?c[i]:p&&j?f(k,d):q&&s[i]==k?function(a){var b=function(b){return this instanceof a?new a(b):a(b)};return b[g]=a[g],b}(k):o&&"function"==typeof k?f(Function.call,k):k,o&&((r[g]||(r[g]={}))[i]=k))};h.F=1,h.G=2,h.S=4,h.P=8,h.B=16,h.W=32,a.exports=h},function(a,b){var c=a.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=c)},function(a,b){var c=a.exports={version:"1.2.6"};"number"==typeof __e&&(__e=c)},function(a,b,c){var d=c(31);a.exports=function(a,b,c){if(d(a),void 0===b)return a;switch(c){case 1:return function(c){return a.call(b,c)};case 2:return function(c,d){return a.call(b,c,d)};case 3:return function(c,d,e){return a.call(b,c,d,e)}}return function(){return a.apply(b,arguments)}}},function(a,b){a.exports=function(a){if("function"!=typeof a)throw TypeError(a+" is not a function!");return a}},function(a,b){a.exports=function(a){try{return!!a()}catch(b){return!0}}},function(a,b){(function(c){"use strict";b.__esModule=!0,b["default"]=function(a){var b="undefined"!=typeof c?c:window,d=b.Handlebars;a.noConflict=function(){return b.Handlebars===a&&(b.Handlebars=d),a}},a.exports=b["default"]}).call(b,function(){return this}())}])});
includes/updraft-admin.js CHANGED
@@ -2,10 +2,10 @@
2
  * Send an action over AJAX. A wrapper around jQuery.ajax. In future, all consumers can be reviewed to simplify some of the options, where there is historical cruft.
3
  * N.B. updraft_iframe_modal() below uses the Ajax URL for the iframe's src attribute
4
  *
5
- * @param {string} action - the action to send
6
- * @param * data - data to send
7
- * @param Callback callback - will be called with the results
8
- * @param {object} [options={}] - further options. Relevant properties include:
9
  * - [json_parse=true] - whether to JSON parse the results
10
  * - [alert_on_error=true] - whether to show an alert box if there was a problem (otherwise, suppress it)
11
  * - [action='updraft_ajax'] - what to send as the action parameter on the AJAX request (N.B. action parameter to this function goes as the 'subaction' parameter on the AJAX request)
@@ -88,8 +88,8 @@ function updraft_send_command(action, data, callback, options) {
88
  /**
89
  * Opens the dialog box for confirmation of whether to delete a backup, plus options if relevant
90
  *
91
- * @param {string} key - The UNIX timestamp of the backup
92
- * @param {string} nonce - The backup job ID
93
  * @param {boolean} showremote - Whether or not to show the "also delete from remote storage?" checkbox
94
  */
95
  function updraft_delete(key, nonce, showremote) {
@@ -210,9 +210,9 @@ function updraft_remote_storage_tabs_setup() {
210
  /**
211
  * Carries out a remote storage test
212
  *
213
- * @param {string} method - The identifier for the remote storage
214
  * @param {callback} result_callback - A callback function to be called with the result
215
- * @param {string} [instance_id] - The particular instance (if any) of the remote storage to be tested (for methods supporting multiple instances)
216
  */
217
  function updraft_remote_storage_test(method, result_callback, instance_id) {
218
 
@@ -293,8 +293,9 @@ function backupnow_whichfiles_checked(onlythesefileentities){
293
  /**
294
  * A method to get all the selected table values from the backup now modal
295
  *
296
- * @param {[String]} onlythesetableentities an empty string to append values to
297
- * @return {[String]} a string that contains the values of all selected table entities and the database the belong to
 
298
  */
299
  function backupnow_whichtables_checked(onlythesetableentities){
300
  var send_list = false;
@@ -440,7 +441,7 @@ window.onbeforeunload = function(e) {
440
  /**
441
  * N.B. This function works on both the UD settings page and elsewhere
442
  *
443
- * @param {boolean} firstload Check if this is first load
444
  */
445
  function updraft_check_page_visibility(firstload) {
446
  if ('hidden' == document["visibilityState"]) {
@@ -476,12 +477,10 @@ var updraft_inpage_hasbegun = 0;
476
  * @param {Function} success_callback callback function after backup
477
  * @param {String} onlythisfileentity csv list of file entities to be backed up
478
  * @param {Array} extradata any extra data to be added
479
- * @param {Integer} backupnow_nodb Indicate whether the database should be backed up. Valid values: 0, 1
480
  * @param {Integer} backupnow_nofiles Indicate whether any files should be backed up. Valid values: 0, 1
481
  * @param {Integer} backupnow_nocloud Indicate whether the backup should be uploaded to cloud storage. Valid values: 0, 1
482
  * @param {String} label An optional label to be added to a backup
483
- *
484
- * @return {void}
485
  */
486
  function updraft_backupnow_inpage_go(success_callback, onlythisfileentity, extradata, backupnow_nodb, backupnow_nofiles, backupnow_nocloud, label) {
487
 
@@ -681,7 +680,7 @@ jQuery('#updraft_backup_started').slideUp();}, 3500);
681
  /**
682
  * Opens a dialog window showing the requested (or latest) log file, plus an option to download it
683
  *
684
- * @param String [backup_nonce] - the nonce of the log to display, or empty for the latest one
685
  */
686
  function updraft_popuplog(backup_nonce) {
687
 
@@ -931,7 +930,7 @@ function updraftplus_diskspace_entity(key) {
931
  * Open a modal with content fetched from an iframe
932
  *
933
  * @param {String} getwhat - the subaction parameter to pass to UD's AJAX handler
934
- * @param {String} title - the title for the modal
935
  */
936
  function updraft_iframe_modal(getwhat, title) {
937
  var width = 780;
@@ -983,8 +982,10 @@ function updraftplus_show_contents(timestamp, type, findex) {
983
  /**
984
  * Creates the jstree and makes a call to the backend to dynamically get the tree nodes
985
  *
986
- * @param {string} path - Optional path parameter if not passed in then Root of zip will be used
987
- * @param {bool} drop_directory - Optional parameter that if passed will remove the last directory level from the path, used for if you want to move up the directory tree from the root node
 
 
988
  */
989
  function zip_files_jstree(entity, timestamp, type, findex) {
990
 
@@ -1325,13 +1326,13 @@ function updraft_downloader_status_update(base, backup_timestamp, what, findex,
1325
  /**
1326
  * Function that sets up a ajax call to start a backup
1327
  *
1328
- * @param {Integer} backupnow_nodb Indicate whether the database should be backed up: valid values are 0, 1
1329
- * @param {Integer} backupnow_nofiles Indicate whether any files should be backed up: valid values are 0, 1
1330
- * @param {Integer} backupnow_nocloud Indicate whether the backup should be uploaded to cloud storage: valid values are 0, 1
1331
- * @param {String} onlythesefileentities A csv list of file entities to be backed up
1332
- * @param {String} onlythesetableentities A csv list of table entities to be backed up
1333
- * @param {Array} extradata any extra data to be added
1334
- * @param {String} label A optional label to be added to a backup
1335
  */
1336
  function updraft_backupnow_go(backupnow_nodb, backupnow_nofiles, backupnow_nocloud, onlythesefileentities, extradata, label, onlythesetableentities) {
1337
 
@@ -1363,7 +1364,7 @@ jQuery('#updraft_backup_started').fadeOut('slow');}, 75000);
1363
  console.log("UpdraftPlus: ID of started job: "+updraft_backupnow_nonce);
1364
  }
1365
  setTimeout(function() {
1366
- updraft_activejobs_update(true);}, 500);
1367
  });
1368
  }
1369
 
@@ -1527,15 +1528,57 @@ jQuery(document).ready(function($) {
1527
  if (on_page_load) {
1528
  jQuery('#updraftcentral_keycreate_mothership_firewalled_container').show();
1529
  } else {
 
1530
  jQuery('#updraftcentral_keycreate_mothership_firewalled_container').slideDown();
1531
  jQuery('#updraftcentral_keycreate_mothership').focus();
1532
  }
1533
  } else {
1534
  jQuery('#updraftcentral_keycreate_mothership').prop('disabled', true);
 
 
 
 
1535
  }
1536
  }
1537
 
1538
- jQuery('#updraftcentral_keys').on('change', 'input[type="radio"]', function() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1539
  updraftcentral_keys_setupform(false);
1540
  });
1541
  // Initial setup (for browsers, e.g. Firefox, that remember form selection state but not DOM state, which can leave an inconsistent state)
@@ -1575,38 +1618,7 @@ jQuery(document).ready(function($) {
1575
  jQuery('#updraftcentral_keys').on('click', '#updraftcentral_stage2_go', function(e) {
1576
  e.preventDefault();
1577
 
1578
- // Reset the error message before we continue
1579
- jQuery('#updraftcentral_wizard_stage1_error').text('');
1580
-
1581
- var host = '';
1582
-
1583
- if (jQuery('#updraftcentral_mothership_updraftpluscom').is(':checked')) {
1584
- host = 'updraftplus.com';
1585
- } else if (jQuery('#updraftcentral_mothership_other').is(':checked')) {
1586
- var mothership = jQuery('#updraftcentral_keycreate_mothership').val();
1587
- if ('' == mothership) {
1588
- jQuery('#updraftcentral_wizard_stage1_error').text(updraftlion.updraftcentral_wizard_empty_url);
1589
- return;
1590
- }
1591
- try {
1592
- var url = new URL(mothership);
1593
- host = url.hostname;
1594
- } catch (e) {
1595
- // Try and grab the host name a different way if it failed because of no URL object (e.g. IE 11).
1596
- if ('undefined' === typeof URL) {
1597
- host = jQuery('<a>').prop('href', mothership).prop('hostname');
1598
- }
1599
- if (!host || 'undefined' !== typeof URL) {
1600
- jQuery('#updraftcentral_wizard_stage1_error').text(updraftlion.updraftcentral_wizard_invalid_url);
1601
- return;
1602
- }
1603
- }
1604
- }
1605
-
1606
- jQuery('#updraftcentral_keycreate_description').val(host);
1607
-
1608
- jQuery('.updraftcentral_wizard_stage1').hide();
1609
- jQuery('.updraftcentral_wizard_stage2').show();
1610
  });
1611
 
1612
  jQuery('#updraftcentral_keys').on('click', '#updraftcentral_keycreate_go', function(e) {
@@ -1846,9 +1858,9 @@ jQuery('#setting-error-settings_updated').slideUp();}, 5000);
1846
  }
1847
  }
1848
  });
1849
- if (anyselected == 1) {
1850
  // Work out what to download
1851
- if (updraft_restore_stage == 1) {
1852
  // meta_foreign == 1 : All-in-one format: the only thing to download, always, is wpcore
1853
  // if ('1' == meta_foreign) {
1854
  // whichselected = [];
@@ -1899,9 +1911,9 @@ jQuery('#setting-error-settings_updated').slideUp();}, 5000);
1899
  }
1900
 
1901
  // Make sure all are downloaded
1902
- } else if (updraft_restore_stage == 2) {
1903
  updraft_restorer_checkstage2(1);
1904
- } else if (updraft_restore_stage == 3) {
1905
  var continue_restore = 1;
1906
  jQuery('#updraft_restoreoptions_ui input.required').each(function(index) {
1907
  if (continue_restore == 0) return;
@@ -1923,8 +1935,10 @@ jQuery('#setting-error-settings_updated').slideUp();}, 5000);
1923
  console.log("Restore options: "+restore_options);
1924
  jQuery('#updraft_restorer_restore_options').val(restore_options);
1925
  // This must be done last, as it wipes out the section with #updraft_restoreoptions_ui
1926
- jQuery('#updraft-restore-modal-stage2a').html(updraftlion.restoreproceeding);
1927
  jQuery('#updraft_restore_form').submit();
 
 
1928
  }
1929
  } else {
1930
  alert(updraftlion.youdidnotselectany);
@@ -2180,31 +2194,31 @@ jQuery('#setting-error-settings_updated').slideUp();}, 5000);
2180
  // var hundredmb = 100 * 1024 * 1024, max = parseInt(up.settings.max_file_size, 10);
2181
 
2182
  plupload.each(files, function(file) {
2183
- // @codingStandardsIgnoreLine
2184
- if (! /^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-[\-a-z]+([0-9]+?)?(\.(zip|gz|gz\.crypt))?$/i.test(file.name) && ! /^log\.([0-9a-f]{12})\.txt$/.test(file.name)) {
2185
- var accepted_file = false;
2186
- for (var i = 0; i<updraft_accept_archivename.length; i++) {
2187
- if (updraft_accept_archivename[i].test(file.name)) {
2188
- var accepted_file = true;
 
 
 
 
 
 
 
 
 
 
 
2189
  }
2190
- }
2191
- if (!accepted_file) {
2192
- if (/\.(zip|tar|tar\.gz|tar\.bz2)$/i.test(file.name) || /\.sql(\.gz)?$/i.test(file.name)) {
2193
- jQuery('#updraft-message-modal-innards').html('<p><strong>'+file.name+"</strong></p> "+updraftlion.notarchive2);
2194
- jQuery('#updraft-message-modal').dialog('open');
2195
- } else {
2196
- alert(file.name+": "+updraftlion.notarchive);
2197
  }
2198
- uploader.removeFile(file);
2199
- return;
2200
- }
2201
- }
2202
 
2203
- // a file was added, you may want to update your DOM here...
2204
- jQuery('#filelist').append(
2205
- '<div class="file" id="' + file.id + '"><b>' +
2206
- file.name + '</b> (<span>' + plupload.formatSize(0) + '</span>/' + plupload.formatSize(file.size) + ') ' +
2207
- '<div class="fileprogress"></div></div>');
2208
  });
2209
 
2210
  up.refresh();
@@ -2369,6 +2383,7 @@ jQuery('#setting-error-settings_updated').slideUp();}, 5000);
2369
  * Get the value of a named URL parameter - https://stackoverflow.com/questions/4548487/jquery-read-query-string
2370
  *
2371
  * @param {string} name - URL parameter to return the value of
 
2372
  * @returns {string}
2373
  */
2374
  function get_parameter_by_name(name) {
@@ -2449,7 +2464,7 @@ jQuery(document).ready(function($) {
2449
  e.preventDefault();
2450
  $(settings_css_prefix+'#updraftvault_recountquota').html(updraftlion.counting);
2451
  try {
2452
- updraft_send_command('vault_recountquota', null, function(response) {
2453
  $(settings_css_prefix+'#updraftvault_recountquota').html(updraftlion.updatequotacount);
2454
  if (response.hasOwnProperty('html')) {
2455
  $(settings_css_prefix+'#updraftvault_settings_connected').html(response.html);
@@ -2474,7 +2489,7 @@ jQuery(document).ready(function($) {
2474
  e.preventDefault();
2475
  $(settings_css_prefix+'#updraftvault_disconnect').html(updraftlion.disconnecting);
2476
  try {
2477
- updraft_send_command('vault_disconnect', { immediate_echo: true }, function(response) {
2478
  $(settings_css_prefix+'#updraftvault_disconnect').html(updraftlion.disconnect);
2479
  if (response.hasOwnProperty('html')) {
2480
  $(settings_css_prefix+'#updraftvault_settings_connected').html(response.html).slideUp();
@@ -2504,6 +2519,7 @@ jQuery(document).ready(function($) {
2504
  updraft_send_command('vault_connect', {
2505
  email: $('#updraftvault_email').val(),
2506
  pass: $('#updraftvault_pass').val(),
 
2507
  }, function(resp, status, response) {
2508
  $(settings_css_prefix+'#updraftvault_connect_go').html(updraftlion.connect);
2509
  if (resp.hasOwnProperty('e')) {
@@ -2747,7 +2763,7 @@ jQuery(document).ready(function($) {
2747
  /**
2748
  * Retrieve the current settings from the DOM
2749
  *
2750
- * @param {string} [output_format='string'] - the output format; valid values are 'string' or 'object'
2751
  *
2752
  * @returns String|Object
2753
  */
@@ -2782,8 +2798,9 @@ jQuery(document).ready(function($) {
2782
  /**
2783
  * Method to parse the response from the backend and update the page with the returned content or display error messages if failed
2784
  *
2785
- * @param String - the JSON-encoded response containing information to update the settings page with
2786
- * @return object - the decoded response (empty if decoding was not successful)
 
2787
  */
2788
  function updraft_handle_page_updates(response) {
2789
 
@@ -2882,3 +2899,24 @@ jQuery(document).ready(function($) {
2882
 
2883
 
2884
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  * Send an action over AJAX. A wrapper around jQuery.ajax. In future, all consumers can be reviewed to simplify some of the options, where there is historical cruft.
3
  * N.B. updraft_iframe_modal() below uses the Ajax URL for the iframe's src attribute
4
  *
5
+ * @param {string} action - the action to send
6
+ * @param {*} data - data to send
7
+ * @param {Function} callback - will be called with the results
8
+ * @param {object} options -further options. Relevant properties include:
9
  * - [json_parse=true] - whether to JSON parse the results
10
  * - [alert_on_error=true] - whether to show an alert box if there was a problem (otherwise, suppress it)
11
  * - [action='updraft_ajax'] - what to send as the action parameter on the AJAX request (N.B. action parameter to this function goes as the 'subaction' parameter on the AJAX request)
88
  /**
89
  * Opens the dialog box for confirmation of whether to delete a backup, plus options if relevant
90
  *
91
+ * @param {string} key - The UNIX timestamp of the backup
92
+ * @param {string} nonce - The backup job ID
93
  * @param {boolean} showremote - Whether or not to show the "also delete from remote storage?" checkbox
94
  */
95
  function updraft_delete(key, nonce, showremote) {
210
  /**
211
  * Carries out a remote storage test
212
  *
213
+ * @param {string} method - The identifier for the remote storage
214
  * @param {callback} result_callback - A callback function to be called with the result
215
+ * @param {string} instance_id - The particular instance (if any) of the remote storage to be tested (for methods supporting multiple instances)
216
  */
217
  function updraft_remote_storage_test(method, result_callback, instance_id) {
218
 
293
  /**
294
  * A method to get all the selected table values from the backup now modal
295
  *
296
+ * @param {string} onlythesetableentities an empty string to append values to
297
+ *
298
+ * @return {string} a string that contains the values of all selected table entities and the database the belong to
299
  */
300
  function backupnow_whichtables_checked(onlythesetableentities){
301
  var send_list = false;
441
  /**
442
  * N.B. This function works on both the UD settings page and elsewhere
443
  *
444
+ * @param {boolean} firstload Check if this is first load
445
  */
446
  function updraft_check_page_visibility(firstload) {
447
  if ('hidden' == document["visibilityState"]) {
477
  * @param {Function} success_callback callback function after backup
478
  * @param {String} onlythisfileentity csv list of file entities to be backed up
479
  * @param {Array} extradata any extra data to be added
480
+ * @param {Integer} backupnow_nodb Indicate whether the database should be backed up. Valid values: 0, 1
481
  * @param {Integer} backupnow_nofiles Indicate whether any files should be backed up. Valid values: 0, 1
482
  * @param {Integer} backupnow_nocloud Indicate whether the backup should be uploaded to cloud storage. Valid values: 0, 1
483
  * @param {String} label An optional label to be added to a backup
 
 
484
  */
485
  function updraft_backupnow_inpage_go(success_callback, onlythisfileentity, extradata, backupnow_nodb, backupnow_nofiles, backupnow_nocloud, label) {
486
 
680
  /**
681
  * Opens a dialog window showing the requested (or latest) log file, plus an option to download it
682
  *
683
+ * @param {string} backup_nonce - the nonce of the log to display, or empty for the latest one
684
  */
685
  function updraft_popuplog(backup_nonce) {
686
 
930
  * Open a modal with content fetched from an iframe
931
  *
932
  * @param {String} getwhat - the subaction parameter to pass to UD's AJAX handler
933
+ * @param {String} title - the title for the modal
934
  */
935
  function updraft_iframe_modal(getwhat, title) {
936
  var width = 780;
982
  /**
983
  * Creates the jstree and makes a call to the backend to dynamically get the tree nodes
984
  *
985
+ * @param {string} entity Entity for the jstree
986
+ * @param {integer} timestamp Timestamp of the jstree
987
+ * @param {string} type Type of file to display in the JS tree
988
+ * @param {array} findex Index of Zip
989
  */
990
  function zip_files_jstree(entity, timestamp, type, findex) {
991
 
1326
  /**
1327
  * Function that sets up a ajax call to start a backup
1328
  *
1329
+ * @param {Integer} backupnow_nodb Indicate whether the database should be backed up: valid values are 0, 1
1330
+ * @param {Integer} backupnow_nofiles Indicate whether any files should be backed up: valid values are 0, 1
1331
+ * @param {Integer} backupnow_nocloud Indicate whether the backup should be uploaded to cloud storage: valid values are 0, 1
1332
+ * @param {String} onlythesefileentities A csv list of file entities to be backed up
1333
+ * @param {String} onlythesetableentities A csv list of table entities to be backed up
1334
+ * @param {Array} extradata any extra data to be added
1335
+ * @param {String} label A optional label to be added to a backup
1336
  */
1337
  function updraft_backupnow_go(backupnow_nodb, backupnow_nofiles, backupnow_nocloud, onlythesefileentities, extradata, label, onlythesetableentities) {
1338
 
1364
  console.log("UpdraftPlus: ID of started job: "+updraft_backupnow_nonce);
1365
  }
1366
  setTimeout(function() {
1367
+ updraft_activejobs_update(true);}, 500);
1368
  });
1369
  }
1370
 
1528
  if (on_page_load) {
1529
  jQuery('#updraftcentral_keycreate_mothership_firewalled_container').show();
1530
  } else {
1531
+ jQuery('.updraftcentral_wizard_self_hosted_stage2').show();
1532
  jQuery('#updraftcentral_keycreate_mothership_firewalled_container').slideDown();
1533
  jQuery('#updraftcentral_keycreate_mothership').focus();
1534
  }
1535
  } else {
1536
  jQuery('#updraftcentral_keycreate_mothership').prop('disabled', true);
1537
+ if (!on_page_load) {
1538
+ jQuery('.updraftcentral_wizard_self_hosted_stage2').hide();
1539
+ updraftcentral_stage2_go();
1540
+ }
1541
  }
1542
  }
1543
 
1544
+ function updraftcentral_stage2_go() {
1545
+ // Reset the error message before we continue
1546
+ jQuery('#updraftcentral_wizard_stage1_error').text('');
1547
+
1548
+ var host = '';
1549
+
1550
+ if (jQuery('#updraftcentral_mothership_updraftpluscom').is(':checked')) {
1551
+ jQuery('.updraftcentral_keycreate_description').hide();
1552
+ host = 'updraftplus.com';
1553
+ } else if (jQuery('#updraftcentral_mothership_other').is(':checked')) {
1554
+ jQuery('.updraftcentral_keycreate_description').show();
1555
+ var mothership = jQuery('#updraftcentral_keycreate_mothership').val();
1556
+ if ('' == mothership) {
1557
+ jQuery('#updraftcentral_wizard_stage1_error').text(updraftlion.updraftcentral_wizard_empty_url);
1558
+ return;
1559
+ }
1560
+ try {
1561
+ var url = new URL(mothership);
1562
+ host = url.hostname;
1563
+ } catch (e) {
1564
+ // Try and grab the host name a different way if it failed because of no URL object (e.g. IE 11).
1565
+ if ('undefined' === typeof URL) {
1566
+ host = jQuery('<a>').prop('href', mothership).prop('hostname');
1567
+ }
1568
+ if (!host || 'undefined' !== typeof URL) {
1569
+ jQuery('#updraftcentral_wizard_stage1_error').text(updraftlion.updraftcentral_wizard_invalid_url);
1570
+ return;
1571
+ }
1572
+ }
1573
+ }
1574
+
1575
+ jQuery('#updraftcentral_keycreate_description').val(host);
1576
+
1577
+ jQuery('.updraftcentral_wizard_stage1').hide();
1578
+ jQuery('.updraftcentral_wizard_stage2').show();
1579
+ }
1580
+
1581
+ jQuery('#updraftcentral_keys').on('click', 'input[type="radio"]', function() {
1582
  updraftcentral_keys_setupform(false);
1583
  });
1584
  // Initial setup (for browsers, e.g. Firefox, that remember form selection state but not DOM state, which can leave an inconsistent state)
1618
  jQuery('#updraftcentral_keys').on('click', '#updraftcentral_stage2_go', function(e) {
1619
  e.preventDefault();
1620
 
1621
+ updraftcentral_stage2_go();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1622
  });
1623
 
1624
  jQuery('#updraftcentral_keys').on('click', '#updraftcentral_keycreate_go', function(e) {
1858
  }
1859
  }
1860
  });
1861
+ if (1 == anyselected) {
1862
  // Work out what to download
1863
+ if (1 == updraft_restore_stage) {
1864
  // meta_foreign == 1 : All-in-one format: the only thing to download, always, is wpcore
1865
  // if ('1' == meta_foreign) {
1866
  // whichselected = [];
1911
  }
1912
 
1913
  // Make sure all are downloaded
1914
+ } else if (2 == updraft_restore_stage) {
1915
  updraft_restorer_checkstage2(1);
1916
+ } else if (3 == updraft_restore_stage) {
1917
  var continue_restore = 1;
1918
  jQuery('#updraft_restoreoptions_ui input.required').each(function(index) {
1919
  if (continue_restore == 0) return;
1935
  console.log("Restore options: "+restore_options);
1936
  jQuery('#updraft_restorer_restore_options').val(restore_options);
1937
  // This must be done last, as it wipes out the section with #updraft_restoreoptions_ui
1938
+ jQuery('#updraft-restore-modal-stage2a').html(updraftlion.restore_proceeding);
1939
  jQuery('#updraft_restore_form').submit();
1940
+ // In progress; prevent the button being pressed again
1941
+ updraft_restore_stage = 4;
1942
  }
1943
  } else {
1944
  alert(updraftlion.youdidnotselectany);
2194
  // var hundredmb = 100 * 1024 * 1024, max = parseInt(up.settings.max_file_size, 10);
2195
 
2196
  plupload.each(files, function(file) {
2197
+ // @codingStandardsIgnoreLine
2198
+ if (! /^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-[\-a-z]+([0-9]+?)?(\.(zip|gz|gz\.crypt))?$/i.test(file.name) && ! /^log\.([0-9a-f]{12})\.txt$/.test(file.name)) {
2199
+ var accepted_file = false;
2200
+ for (var i = 0; i<updraft_accept_archivename.length; i++) {
2201
+ if (updraft_accept_archivename[i].test(file.name)) {
2202
+ var accepted_file = true;
2203
+ }
2204
+ }
2205
+ if (!accepted_file) {
2206
+ if (/\.(zip|tar|tar\.gz|tar\.bz2)$/i.test(file.name) || /\.sql(\.gz)?$/i.test(file.name)) {
2207
+ jQuery('#updraft-message-modal-innards').html('<p><strong>'+file.name+"</strong></p> "+updraftlion.notarchive2);
2208
+ jQuery('#updraft-message-modal').dialog('open');
2209
+ } else {
2210
+ alert(file.name+": "+updraftlion.notarchive);
2211
+ }
2212
+ uploader.removeFile(file);
2213
+ return;
2214
  }
 
 
 
 
 
 
 
2215
  }
 
 
 
 
2216
 
2217
+ // a file was added, you may want to update your DOM here...
2218
+ jQuery('#filelist').append(
2219
+ '<div class="file" id="' + file.id + '"><b>' +
2220
+ file.name + '</b> (<span>' + plupload.formatSize(0) + '</span>/' + plupload.formatSize(file.size) + ') ' +
2221
+ '<div class="fileprogress"></div></div>');
2222
  });
2223
 
2224
  up.refresh();
2383
  * Get the value of a named URL parameter - https://stackoverflow.com/questions/4548487/jquery-read-query-string
2384
  *
2385
  * @param {string} name - URL parameter to return the value of
2386
+ *
2387
  * @returns {string}
2388
  */
2389
  function get_parameter_by_name(name) {
2464
  e.preventDefault();
2465
  $(settings_css_prefix+'#updraftvault_recountquota').html(updraftlion.counting);
2466
  try {
2467
+ updraft_send_command('vault_recountquota', { instance_id: $('#updraftvault_settings_connect').data('instance_id') }, function(response) {
2468
  $(settings_css_prefix+'#updraftvault_recountquota').html(updraftlion.updatequotacount);
2469
  if (response.hasOwnProperty('html')) {
2470
  $(settings_css_prefix+'#updraftvault_settings_connected').html(response.html);
2489
  e.preventDefault();
2490
  $(settings_css_prefix+'#updraftvault_disconnect').html(updraftlion.disconnecting);
2491
  try {
2492
+ updraft_send_command('vault_disconnect', { immediate_echo: true, instance_id: $('#updraftvault_settings_connect').data('instance_id') }, function(response) {
2493
  $(settings_css_prefix+'#updraftvault_disconnect').html(updraftlion.disconnect);
2494
  if (response.hasOwnProperty('html')) {
2495
  $(settings_css_prefix+'#updraftvault_settings_connected').html(response.html).slideUp();
2519
  updraft_send_command('vault_connect', {
2520
  email: $('#updraftvault_email').val(),
2521
  pass: $('#updraftvault_pass').val(),
2522
+ instance_id: $('#updraftvault_settings_connect').data('instance_id'),
2523
  }, function(resp, status, response) {
2524
  $(settings_css_prefix+'#updraftvault_connect_go').html(updraftlion.connect);
2525
  if (resp.hasOwnProperty('e')) {
2763
  /**
2764
  * Retrieve the current settings from the DOM
2765
  *
2766
+ * @param {string} output_format - the output format; valid values are 'string' or 'object'
2767
  *
2768
  * @returns String|Object
2769
  */
2798
  /**
2799
  * Method to parse the response from the backend and update the page with the returned content or display error messages if failed
2800
  *
2801
+ * @param {string} response - the JSON-encoded response containing information to update the settings page with
2802
+ *
2803
+ * @return {object} - the decoded response (empty if decoding was not successful)
2804
  */
2805
  function updraft_handle_page_updates(response) {
2806
 
2899
 
2900
 
2901
  });
2902
+
2903
+ // For When character set and collate both are unsupported at restoration time and if user change anyone substitution dropdown from both, Other substitution select box value should be change respectively.
2904
+ jQuery(document).ready(function($) {
2905
+ jQuery('#updraft-restore-modal').on('change', '#updraft_restorer_charset', function(e) {
2906
+ if ($('#updraft_restorer_charset').length && $('#updraft_restorer_collate').length && $('#collate_change_on_charset_selection_data').length) {
2907
+ var updraft_restorer_charset = $('#updraft_restorer_charset').val();
2908
+ // For only show collate which are related to charset
2909
+ $('#updraft_restorer_collate option').show();
2910
+ $('#updraft_restorer_collate option[data-charset!='+updraft_restorer_charset+']').hide();
2911
+ updraft_send_command('collate_change_on_charset_selection', {
2912
+ collate_change_on_charset_selection_data: $('#collate_change_on_charset_selection_data').val(),
2913
+ updraft_restorer_charset: updraft_restorer_charset,
2914
+ updraft_restorer_collate: $('#updraft_restorer_collate').val(),
2915
+ }, function(response) {
2916
+ if (response.hasOwnProperty('is_action_required') && 1 == response.is_action_required && response.hasOwnProperty('similar_type_collate')) {
2917
+ $('#updraft_restorer_collate').val(response.similar_type_collate);
2918
+ }
2919
+ });
2920
+ }
2921
+ });
2922
+ });
includes/updraft-admin.min.js CHANGED
@@ -1,3 +1,3 @@
1
- function updraft_send_command(t,e,a,r){default_options={json_parse:!0,alert_on_error:!0,action:"updraft_ajax",nonce:updraft_credentialtest_nonce,nonce_key:"nonce",timeout:null,async:!0,type:"POST"},"undefined"==typeof r&&(r={});for(var n in default_options)r.hasOwnProperty(n)||(r[n]=default_options[n]);var o={action:r.action,subaction:t};if(o[r.nonce_key]=r.nonce,"object"==typeof e)for(var u in e)o[u]=e[u];else o.action_data=e;var d={type:r.type,url:ajaxurl,data:o,success:function(t,e){if(r.json_parse){try{var n=ud_parse_json(t)}catch(o){return console.log(o),console.log(t),void(r.alert_on_error&&alert(updraftlion.unexpectedresponse+" "+t))}"function"==typeof a&&a(n,e,t)}else"function"==typeof a&&a(t,e)},error:function(t,e,a){"function"==typeof r.error_callback?r.error_callback(t,e,a):(console.log("updraft_send_command: error: "+e+" ("+a+")"),console.log(t))},dataType:"text",async:r.async};null!=r.timeout&&(d.timeout=r.timeout),jQuery.ajax(d)}function updraft_delete(t,e,a){jQuery("#updraft_delete_timestamp").val(t),jQuery("#updraft_delete_nonce").val(e),a?jQuery("#updraft-delete-remote-section, #updraft_delete_remote").removeAttr("disabled").show():jQuery("#updraft-delete-remote-section, #updraft_delete_remote").hide().attr("disabled","disabled"),t.indexOf(",")>-1?(jQuery("#updraft_delete_question_singular").hide(),jQuery("#updraft_delete_question_plural").show()):(jQuery("#updraft_delete_question_plural").hide(),jQuery("#updraft_delete_question_singular").show()),jQuery("#updraft-delete-modal").dialog("open")}function updraft_remote_storage_tab_activation(t){jQuery(".updraftplusmethod").hide(),jQuery(".remote-tab").data("active",!1),jQuery(".remote-tab").removeClass("nav-tab-active"),jQuery(".updraftplusmethod."+t).show(),jQuery(".remote-tab-"+t).data("active",!0),jQuery(".remote-tab-"+t).addClass("nav-tab-active")}function updraft_check_overduecrons(){updraft_send_command("check_overdue_crons",null,function(t){t&&t.hasOwnProperty("m")&&jQuery("#updraft-insert-admin-warning").html(t.m)},{alert_on_error:!1})}function updraft_remote_storage_tabs_setup(){var t=0,e=jQuery(".updraft_servicecheckbox:checked");jQuery(e).each(function(a,r){var n=jQuery(r).val();"updraft_servicecheckbox_none"!=jQuery(r).attr("id")&&t++,jQuery(".remote-tab-"+n).show(),a==jQuery(e).length-1&&updraft_remote_storage_tab_activation(n)}),t>0&&jQuery(".updraftplusmethod.none").hide(),jQuery(document).keyup(function(t){if((32===t.keyCode||13===t.keyCode)&&jQuery(document.activeElement).is("input.labelauty + label")){var e=jQuery(document.activeElement).attr("for");e&&jQuery("#"+e).change()}}),jQuery(".updraft_servicecheckbox").change(function(){var e=jQuery(this).attr("id");if("updraft_servicecheckbox_"==e.substring(0,24)){var a=e.substring(24);null!=a&&""!=a&&(jQuery(this).is(":checked")?(t++,jQuery(".remote-tab-"+a).fadeIn(),updraft_remote_storage_tab_activation(a)):(t--,jQuery(".remote-tab-"+a).hide(),1==jQuery(".remote-tab-"+a).data("active")&&updraft_remote_storage_tab_activation(jQuery(".remote-tab:visible").last().attr("name"))))}t<=0?jQuery(".updraftplusmethod.none").fadeIn():jQuery(".updraftplusmethod.none").hide()}),jQuery(".updraft_servicecheckbox:not(.multi)").change(function(){var t=jQuery(this).attr("value");jQuery(this).is(":not(:checked)")?(jQuery(".updraftplusmethod."+t).hide(),jQuery(".updraftplusmethod.none").fadeIn()):jQuery(".updraft_servicecheckbox").not(this).prop("checked",!1)});var a=jQuery(".updraft_servicecheckbox");"function"==typeof a.labelauty&&a.labelauty()}function updraft_remote_storage_test(t,e,a){var r,n;a?(r=jQuery("#updraft-"+t+"-test-"+a),n=".updraftplusmethod."+t+"-"+a):(r=jQuery("#updraft-"+t+"-test"),n=".updraftplusmethod."+t);var o=r.data("method_label");r.html(updraftlion.testing_settings.replace("%s",o));var u={method:t};jQuery("#updraft-navtab-settings-content "+n+" input[data-updraft_settings_test], #updraft-navtab-settings-content .expertmode input[data-updraft_settings_test]").each(function(t,e){var a=jQuery(e).data("updraft_settings_test"),r=jQuery(e).attr("type");if(a){r||(console.log("UpdraftPlus: settings test input item with no type found"),console.log(e),r="text");var n=null;"checkbox"==r?n=jQuery(e).is(":checked")?1:0:"text"==r||"password"==r?n=jQuery(e).val():(console.log("UpdraftPlus: settings test input item with unrecognised type ("+r+") found"),console.log(e)),u[a]=n}}),jQuery("#updraft-navtab-settings-content "+n+" textarea[data-updraft_settings_test], #updraft-navtab-settings-content "+n+" select[data-updraft_settings_test]").each(function(t,e){var a=jQuery(e).data("updraft_settings_test");u[a]=jQuery(e).val()}),updraft_send_command("test_storage_settings",u,function(t,a){r.html(updraftlion.test_settings.replace("%s",o)),"undefined"!=typeof e&&0!=e&&(e=e.call(this,t,a,u)),"undefined"!=typeof e&&!1===e&&(alert(updraftlion.settings_test_result.replace("%s",o)+" "+t.output),t.hasOwnProperty("data")&&console.log(t.data))})}function backupnow_whichfiles_checked(t){return jQuery('#backupnow_includefiles_moreoptions input[type="checkbox"]').each(function(e){if(jQuery(this).is(":checked")){var a=jQuery(this).attr("name");if("updraft_include_"==a.substring(0,16)){var r=a.substring(16);""!=t&&(t+=","),t+=r}}}),t}function backupnow_whichtables_checked(t){var e=!1;return jQuery('#backupnow_database_moreoptions input[type="checkbox"]').each(function(t){if(!jQuery(this).is(":checked"))return void(e=!0)}),t=jQuery("input[name^='updraft_include_tables_']").serializeArray(),!e||t}function updraft_deleteallselected(){var t=0,e="",a="",r="";jQuery("#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected").each(function(n){t++;var o=jQuery(this).data("nonce");a&&(a+=","),a+=o;var u=jQuery(this).data("key");e&&(e+=","),e+=u;var d=jQuery(this).find(".updraftplus-remove").data("hasremote");r&&(r+=","),r+=d}),updraft_delete(e,a,r)}function updraft_openrestorepanel(t){updraft_console_focussed_tab=2,updraft_historytimertoggle(t),jQuery("#updraft-navtab-status-content").hide(),jQuery("#updraft-navtab-expert-content").hide(),jQuery("#updraft-navtab-settings-content").hide(),jQuery("#updraft-navtab-addons-content").hide(),jQuery("#updraft-navtab-backups-content").show(),jQuery("#updraft-navtab-backups").addClass("nav-tab-active"),jQuery("#updraft-navtab-expert").removeClass("nav-tab-active"),jQuery("#updraft-navtab-settings").removeClass("nav-tab-active"),jQuery("#updraft-navtab-status").removeClass("nav-tab-active"),jQuery("#updraft-navtab-addons").removeClass("nav-tab-active")}function updraft_delete_old_dirs(){return!0}function updraft_initiate_restore(t){jQuery("#updraft-migrate-modal").dialog("close"),jQuery('#updraft-navtab-backups-content .updraft_existing_backups button[data-backup_timestamp="'+t+'"]').click()}function updraft_restore_setoptions(t){var e=0;jQuery('input[name="updraft_restore[]"]').each(function(a,r){var n=jQuery(r).val(),o=n+"=([0-9,]+)",u=new RegExp(o),d=t.match(u);d?(jQuery(r).removeAttr("disabled").data("howmany",d[1]).parent().show(),e++,"db"==n&&(e+=4.5),jQuery(r).is(":checked")&&jQuery("#updraft_restorer_"+n+"options").show()):jQuery(r).attr("disabled","disabled").parent().hide()});var a=t.match(/dbcrypted=1/);a?jQuery(".updraft_restore_crypteddb").show():jQuery(".updraft_restore_crypteddb").hide();var r=t.match(/meta_foreign=([12])/);r?jQuery("#updraft_restore_meta_foreign").val(r[1]):jQuery("#updraft_restore_meta_foreign").val("0");var n=336+20*e;jQuery("#updraft-restore-modal").dialog("option","height",n)}function updraft_backup_dialog_open(){jQuery("#backupnow_includefiles_moreoptions").hide(),updraft_settings_form_changed?window.confirm(updraftlion.unsavedsettingsbackup)&&(jQuery("#backupnow_label").val(""),jQuery("#updraft-backupnow-modal").dialog("open")):(jQuery("#backupnow_label").val(""),jQuery("#updraft-backupnow-modal").dialog("open"))}function updraft_migrate_dialog_open(){jQuery("#updraft_migrate_modal_alt").hide(),updraft_migrate_modal_default_buttons={},updraft_migrate_modal_default_buttons[updraftlion.close]=function(){jQuery(this).dialog("close")},jQuery("#updraft-migrate-modal").dialog("option","buttons",updraft_migrate_modal_default_buttons),jQuery("#updraft-migrate-modal").dialog("open"),jQuery("#updraft_migrate_modal_main").show()}function updraft_check_page_visibility(t){"hidden"==document.visibilityState?updraft_page_is_visible=0:(updraft_page_is_visible=1,1!==t&&updraft_activejobs_update(!0))}function updraft_backupnow_inpage_go(t,e,a,r,n,o,u){r="undefined"==typeof r?0:r,n="undefined"==typeof n?0:n,o="undefined"==typeof o?0:o,u="undefined"==typeof u?updraftlion.automaticbackupbeforeupdate:u,updraft_console_focussed_tab=1,updraft_inpage_success_callback=t;var d={},s=jQuery("#updraft-backupnow-inpage-modal").length;s&&jQuery("#updraft-backupnow-inpage-modal").dialog("option","buttons",d),jQuery("#updraft_inpage_prebackup").hide(),s&&jQuery("#updraft-backupnow-inpage-modal").dialog("open"),jQuery("#updraft_inpage_backup").show(),updraft_activejobslist_backupnownonce_only=1,updraft_inpage_hasbegun=0,updraft_backupnow_go(r,n,o,e,a,u,"")}function updraft_activejobs_update(t){var e=(new Date).getTime();if(!(0==t&&e<updraft_activejobs_nextupdate)){updraft_activejobs_nextupdate=e+5500;var a="";jQuery(".ud_downloadstatus .updraftplus_downloader, #ud_downloadstatus2 .updraftplus_downloader").each(function(t,e){var r=jQuery(e).data("downloaderfor");"object"==typeof r&&(""!=a&&(a+=":"),a=a+r.base+","+r.nonce+","+r.what+","+r.index)});var r={downloaders:a};try{jQuery("#updraft-poplog").dialog("isOpen")&&(r.log_fetch=1,r.log_nonce=updraft_poplog_log_nonce,r.log_pointer=updraft_poplog_log_pointer)}catch(n){console.log(n)}updraft_activejobslist_backupnownonce_only&&"undefined"!=typeof updraft_backupnow_nonce&&""!=updraft_backupnow_nonce&&(r.thisjobonly=updraft_backupnow_nonce),updraft_send_command("activejobs_list",r,function(t){try{resp=ud_parse_json(t),resp.hasOwnProperty("l")&&(resp.l?(jQuery("#updraft_lastlogmessagerow").show(),jQuery("#updraft_lastlogcontainer").html(resp.l)):(jQuery("#updraft_lastlogmessagerow").hide(),jQuery("#updraft_lastlogcontainer").html("("+updraftlion.nothing_yet_logged+")")));var n=-1;if(jQuery("#updraft_activejobs").html(resp.j),jQuery("#updraft_activejobs .updraft_jobtimings").each(function(t,a){var r=jQuery(a);if(r.data("lastactivity")&&r.data("jobid")){var o=r.data("jobid"),u=r.data("lastactivity");(n==-1||u<n)&&(n=u);var d=r.data("nextresumptionafter"),s=r.data("nextresumption");e=(new Date).getTime(),u>50&&s>0&&d<-30&&e>updraft_last_forced_when+1e5&&(updraft_last_forced_jobid!=o||s!=updraft_last_forced_resumption)&&(updraft_last_forced_resumption=s,updraft_last_forced_jobid=o,updraft_last_forced_when=e,console.log("UpdraftPlus: force resumption: job_id="+o+", resumption="+s),updraft_send_command("forcescheduledresumption",{resumption:s,job_id:o},function(t){console.log(t)},{json_parse:!1,alert_on_error:!1}))}}),e=(new Date).getTime(),updraft_activejobs_nextupdate=e+18e4,1==updraft_page_is_visible&&(1==updraft_console_focussed_tab||2==updraft_console_focussed_tab&&""!=a)&&(updraft_activejobs_nextupdate=n>-1?n<5?e+1750:e+5e3:lastlog_lastdata==t?e+7500:e+1750),lastlog_lastdata=t,null!=resp.j&&""!=resp.j?(jQuery("#updraft_activejobsrow").show(),r.hasOwnProperty("thisjobonly")&&!updraft_inpage_hasbegun&&jQuery("#updraft-jobid-"+r.thisjobonly).length?(updraft_inpage_hasbegun=1,console.log("UpdraftPlus: the start of the requested backup job has been detected")):!updraft_inpage_hasbegun&&updraft_activejobslist_backupnownonce_only&&jQuery(".updraft_jobtimings.isautobackup").length?(autobackup_nonce=jQuery(".updraft_jobtimings.isautobackup").first().data("jobid"),autobackup_nonce&&(updraft_inpage_hasbegun=1,updraft_backupnow_nonce=autobackup_nonce,r.thisjobonly=autobackup_nonce,console.log("UpdraftPlus: the start of the requested backup job has been detected; id: "+autobackup_nonce))):1==updraft_inpage_hasbegun&&jQuery("#updraft-jobid-"+r.thisjobonly+".updraft_finished").length&&(updraft_inpage_hasbegun=2,console.log("UpdraftPlus: the end of the requested backup job has been detected"),"undefined"!=typeof updraft_inpage_success_callback&&""!=updraft_inpage_success_callback?updraft_inpage_success_callback.call(!1):jQuery("#updraft-backupnow-inpage-modal").dialog("close")),""==lastlog_jobs&&setTimeout(function(){jQuery("#updraft_backup_started").slideUp()},3500)):jQuery("#updraft_activejobsrow").is(":hidden")||("undefined"!=typeof lastbackup_laststatus&&updraft_showlastbackup(),jQuery("#updraft_activejobsrow").hide()),lastlog_jobs=resp.j,null!=resp.ds&&""!=resp.ds&&jQuery(resp.ds).each(function(e,a){""!=a.base&&updraft_downloader_status_update(a.base,a.timestamp,a.what,a.findex,a,t)}),null!=resp.u&&""!=resp.u&&jQuery("#updraft-poplog").dialog("isOpen")){var o=resp.u;if(o.nonce==updraft_poplog_log_nonce&&(updraft_poplog_log_pointer=o.pointer,null!=o.log&&""!=o.log)){var u=jQuery("#updraft-poplog").scrollTop();jQuery("#updraft-poplog-content").append(o.log),updraft_poplog_lastscroll!=u&&updraft_poplog_lastscroll!=-1||(jQuery("#updraft-poplog").scrollTop(jQuery("#updraft-poplog-content").prop("scrollHeight")),updraft_poplog_lastscroll=jQuery("#updraft-poplog").scrollTop())}}}catch(d){console.log(updraftlion.unexpectedresponse+" "+t),console.log(d)}},{json_parse:!1,type:"GET"})}}function updraft_popuplog(t){var e=updraftlion.loading_log_file;t&&(e+=" (log."+t+".txt)"),jQuery("#updraft-poplog").dialog("option","title",e),jQuery("#updraft-poplog-content").html("<em>"+e+" ...</em> "),jQuery("#updraft-poplog").dialog("open"),updraft_send_command("get_log",t,function(t){updraft_poplog_log_pointer=t.pointer,updraft_poplog_log_nonce=t.nonce;var e="?page=updraftplus&action=downloadlog&force_download=1&updraftplus_backup_nonce="+t.nonce;jQuery("#updraft-poplog-content").html(t.log);var a={};a[updraftlion.downloadlogfile]=function(){window.location.href=e},a[updraftlion.close]=function(){jQuery(this).dialog("close")},jQuery("#updraft-poplog").dialog("option","buttons",a),jQuery("#updraft-poplog").dialog("option","title","log."+t.nonce+".txt"),updraft_poplog_lastscroll=-1},{type:"GET",timeout:6e4,error_callback:function(t,e,a){var r=e==a?a:a+" ("+e+")";jQuery("#updraft-poplog-content").append(r),console.log(t)}})}function updraft_showlastbackup(){updraft_send_command("get_fragment","last_backup_html",function(t){response=t.output,lastbackup_laststatus==response?setTimeout(function(){updraft_showlastbackup()},7e3):jQuery("#updraft_last_backup").html(response),lastbackup_laststatus=response},{type:"GET"})}function updraft_historytimertoggle(t){updraft_historytimer&&1!=t?(clearTimeout(updraft_historytimer),updraft_historytimer=0):(updraft_updatehistory(0,0),updraft_historytimer=setInterval(function(){updraft_updatehistory(0,0)},3e4),calculated_diskspace||(updraftplus_diskspace(),calculated_diskspace=1))}function updraft_updatehistory(t,e){var a=Math.round((new Date).getTime()/1e3);if(1==t||1==e)updraft_historytimer_notbefore=a+30;else if(a<updraft_historytimer_notbefore)return void console.log("Update history skipped: "+a.toString()+" < "+updraft_historytimer_notbefore.toString());1==t&&(1==e?(updraft_history_lastchecksum=!1,jQuery("#updraft-navtab-backups-content .updraft_existing_backups").html('<p style="text-align:center;"><em>'+updraftlion.rescanningremote+"</em></p>")):(updraft_history_lastchecksum=!1,jQuery("#updraft-navtab-backups-content .updraft_existing_backups").html('<p style="text-align:center;"><em>'+updraftlion.rescanning+"</em></p>")));var r=e?"remotescan":!!t&&"rescan";updraft_send_command("rescan",r,function(t){if(t.hasOwnProperty("logs_exist")&&t.logs_exist&&jQuery("#updraft_lastlogmessagerow .updraft-log-link").show(),t.hasOwnProperty("migrate_modal")&&t.migrate_modal&&jQuery("#updraft_migrate_modal_main").replaceWith(t.migrate_modal),null!=t.n&&jQuery("#updraft-navtab-backups").html(t.n),null!=t.t){if(null!=t.cksum){if(t.cksum==updraft_history_lastchecksum)return;updraft_history_lastchecksum=t.cksum}jQuery("#updraft-navtab-backups-content .updraft_existing_backups").html(t.t),t.data&&console.log(t.data)}})}function updraft_intervals_monthly_or_not(t,e){var a="#updraft-navtab-settings-content #"+t,r=jQuery(a+" option").length,n="monthly"==e,o=!1;if(r>10&&(o=!0),n||o){if(n&&o)return void("monthly"==e&&(jQuery(".updraft_monthly_extra_words_"+t).remove(),jQuery(a).before('<span class="updraft_monthly_extra_words_'+t+'">'+updraftlion.day+" </span>").after('<span class="updraft_monthly_extra_words_'+t+'"> '+updraftlion.inthemonth+" </span>")));if(jQuery(".updraft_monthly_extra_words_"+t).remove(),n){updraft_interval_week_val=jQuery(a+" option:selected").val(),jQuery(a).html(updraftlion.mdayselector).before('<span class="updraft_monthly_extra_words_'+t+'">'+updraftlion.day+" </span>").after('<span class="updraft_monthly_extra_words_'+t+'"> '+updraftlion.inthemonth+" </span>");var u=updraft_interval_month_val===!1?1:updraft_interval_month_val;u-=1,jQuery(a+" option:eq("+u+")").prop("selected",!0)}else{updraft_interval_month_val=jQuery(a+" option:selected").val(),jQuery(a).html(updraftlion.dayselector);var d=updraft_interval_week_val===!1?1:updraft_interval_week_val;jQuery(a+" option:eq("+d+")").prop("selected",!0)}}}function updraft_check_same_times(){var t=0,e=jQuery("#updraft-navtab-settings-content .updraft_interval").val();"manual"==e?jQuery("#updraft-navtab-settings-content .updraft_files_timings").hide():jQuery("#updraft-navtab-settings-content .updraft_files_timings").show(),"weekly"==e||"fortnightly"==e||"monthly"==e?(updraft_intervals_monthly_or_not("updraft_startday_files",e),jQuery("#updraft-navtab-settings-content #updraft_startday_files").show()):(jQuery(".updraft_monthly_extra_words_updraft_startday_files").remove(),jQuery("#updraft-navtab-settings-content #updraft_startday_files").hide());var a=jQuery("#updraft-navtab-settings-content .updraft_interval_database").val();"manual"==a&&(t=1,jQuery("#updraft-navtab-settings-content .updraft_db_timings").hide()),"weekly"==a||"fortnightly"==a||"monthly"==a?(updraft_intervals_monthly_or_not("updraft_startday_db",a),jQuery("#updraft-navtab-settings-content #updraft_startday_db").show()):(jQuery(".updraft_monthly_extra_words_updraft_startday_db").remove(),jQuery("#updraft-navtab-settings-content #updraft_startday_db").hide()),a==e?(jQuery("#updraft-navtab-settings-content .updraft_db_timings").hide(),0==t?jQuery("#updraft-navtab-settings-content .updraft_same_schedules_message").show():jQuery("#updraft-navtab-settings-content .updraft_same_schedules_message").hide()):(jQuery("#updraft-navtab-settings-content .updraft_same_schedules_message").hide(),0==t&&jQuery("#updraft-navtab-settings-content .updraft_db_timings").show())}function updraft_activejobs_delete(t){updraft_send_command("activejobs_delete",t,function(e){"Y"==e.ok?jQuery("#updraft-jobid-"+t).html(e.m).fadeOut("slow").remove():"N"==e.ok?alert(e.m):(alert(updraftlion.unexpectedresponse),console.log(e))})}function updraftplus_diskspace_entity(t){jQuery("#updraft_diskspaceused_"+t).html("<em>"+updraftlion.calculating+"</em>"),updraft_send_command("get_fragment",{fragment:"disk_usage",data:t},function(e){jQuery("#updraft_diskspaceused_"+t).html(e.output)},{type:"GET"})}function updraft_iframe_modal(t,e){var a=780,r=500;jQuery("#updraft-iframe-modal-innards").html('<iframe width="100%" height="430px" src="'+ajaxurl+"?action=updraft_ajax&subaction="+t+"&nonce="+updraft_credentialtest_nonce+'"></iframe>'),jQuery("#updraft-iframe-modal").dialog("option","title",e).dialog("option","width",a).dialog("option","height",r).dialog("open")}function updraft_html_modal(t,e,a,r){jQuery("#updraft-iframe-modal-innards").html(t);var n={};a<450&&(n[updraftlion.close]=function(){jQuery(this).dialog("close")}),jQuery("#updraft-iframe-modal").dialog("option","title",e).dialog("option","width",a).dialog("option","height",r).dialog("option","buttons",n).dialog("open")}function updraftplus_diskspace(){jQuery("#updraft-navtab-backups-content .updraft_diskspaceused").html("<em>"+updraftlion.calculating+"</em>"),updraft_send_command("get_fragment",{fragment:"disk_usage",data:"updraft"},function(t){jQuery("#updraft-navtab-backups-content .updraft_diskspaceused").html(t.output)},{type:"GET"})}function updraftplus_deletefromserver(t,e,a){a||(a=0);var r={stage:"delete",timestamp:t,type:e,findex:a};updraft_send_command("updraft_download_backup",r,null,{action:"updraft_download_backup",nonce:updraft_download_nonce,nonce_key:"_wpnonce"})}function updraftplus_downloadstage2(t,e,a){location.href=ajaxurl+"?_wpnonce="+updraft_download_nonce+"&timestamp="+t+"&type="+e+"&stage=2&findex="+a+"&action=updraft_download_backup"}function updraftplus_show_contents(t,e,a){var r='<div id="updraft_zip_files_container" class="hidden-in-updraftcentral" style="clear:left;"><div id="updraft_zip_info_container"><p><span id="updraft_zip_path_text">'+updraftlion.zip_file_contents_info+'</span> - <span id="updraft_zip_size_text"></span></p>'+updraftlion.browse_download_link+'</div><div id="updraft_zip_files_jstree_container"><input type="search" id="zip_files_jstree_search" name="zip_files_jstree_search" placeholder="'+updraftlion.search+'"><div id="updraft_zip_files_jstree"></div></div></div>';updraft_html_modal(r,updraftlion.zip_file_contents,780,500),zip_files_jstree("zipbrowser",t,e,a)}function zip_files_jstree(t,e,a,r){jQuery("#updraft_zip_files_jstree").jstree({core:{multiple:!1,data:function(n,o){updraft_send_command("get_jstree_directory_nodes",{entity:t,node:n,timestamp:e,type:a,findex:r},function(t){t.hasOwnProperty("error")?alert(t.error):o.call(this,t.nodes)})},error:function(t){alert(t),console.log(t)}},search:{show_only_matches:!0},plugins:["search","sort"]}),jQuery("#updraft_zip_files_jstree").on("ready.jstree",function(t,e){jQuery("#updraft-iframe-modal").dialog("option","title",updraftlion.zip_file_contents+": "+e.instance.get_node("#").children[0])});var n=!1;jQuery("#zip_files_jstree_search").keyup(function(){n&&clearTimeout(n),n=setTimeout(function(){var t=jQuery("#zip_files_jstree_search").val();jQuery("#updraft_zip_files_jstree").jstree(!0).search(t)},250)}),jQuery("#updraft_zip_files_jstree").on("changed.jstree",function(t,e){jQuery("#updraft_zip_path_text").text(e.node.li_attr.path),e.node.li_attr.size?(jQuery("#updraft_zip_size_text").text(e.node.li_attr.size),jQuery("#updraft_zip_download_item").show()):(jQuery("#updraft_zip_size_text").text(""),jQuery("#updraft_zip_download_item").hide())}),jQuery("#updraft_zip_download_item").click(function(t){t.preventDefault();var n=jQuery("#updraft_zip_path_text").text();updraft_send_command("get_zipfile_download",{path:n,timestamp:e,type:a,findex:r},function(t){t.hasOwnProperty("error")?alert(t.error):t.hasOwnProperty("path")?location.href=ajaxurl+"?_wpnonce="+updraft_download_nonce+"&timestamp="+e+"&type="+a+"&stage=2&findex="+r+"&filepath="+t.path+"&action=updraft_download_backup":alert(updraftlion.download_timeout)})})}function updraft_downloader(t,e,a,r,n,o,u){"string"!=typeof n&&(n=n.toString());for(var n=n.split(","),d=0;d<n.length;d++){var s=t+e+"_"+a+"_"+n[d],p="."+s,i=parseInt(n[d]);i++;var l=0==n[d]?"":" ("+i+")";if(!jQuery(p).length){var c=o?o:e;jQuery(r).append('<div style="clear:left; border: 1px solid; padding: 8px; margin-top: 4px; max-width:840px;" class="'+s+' updraftplus_downloader"><button onclick="jQuery(this).parent().fadeOut().remove();" type="button" style="float:right; margin-bottom: 8px;">X</button><strong>'+updraftlion.download+" "+a+l+" ("+c+')</strong>:<div class="raw">'+updraftlion.begunlooking+'</div><div class="file '+s+'_st"><div class="dlfileprogress" style="width: 0;"></div></div></div>'),jQuery(p).data("downloaderfor",{base:t,nonce:e,what:a,index:n[d]}),setTimeout(function(){updraft_activejobs_update(!0)},1500)}jQuery(p).data("lasttimebegan",(new Date).getTime()),u=!!u;var f=jQuery("#updraft-navtab-backups-content .uddownloadform_"+a+"_"+e+"_"+n[d]).data("wp_nonce").toString(),_={type:a,timestamp:e,findex:n[d]},y={action:"updraft_download_backup",nonce_key:"_wpnonce",nonce:f,timeout:1e4,async:u};updraft_send_command("updraft_download_backup",_,function(t){},y)}return!1}function ud_parse_json(t){t.charAt(0),t.charAt(t.length-1);try{var e=JSON.parse(t);return e}catch(a){console.log("UpdraftPlus: Exception when trying to parse JSON (1) - will attempt to fix/re-parse"),console.log(t)}var r=t.indexOf("{"),n=t.lastIndexOf("}");if(r>-1&&n>-1){var o=t.slice(r,n+1);try{var u=JSON.parse(o);return console.log("UpdraftPlus: JSON re-parse successful"),u}catch(a){throw console.log("UpdraftPlus: Exception when trying to parse JSON (2)"),a}}throw"UpdraftPlus: could not parse the JSON"}function updraft_restorer_checkstage2(t){var e=jQuery("#ud_downloadstatus2 .file").length;return e>0?void(t&&alert(updraftlion.stilldownloading)):(jQuery("#updraft-restore-modal-stage2a").html(updraftlion.processing),void updraft_send_command("restore_alldownloaded",{timestamp:jQuery("#updraft_restore_timestamp").val(),restoreopts:jQuery("#updraft_restore_form").serialize()},function(t){var e=null;jQuery("#updraft_restorer_restore_options").val("");try{var a=ud_parse_json(t);if(null==a)return void jQuery("#updraft-restore-modal-stage2a").html(updraftlion.emptyresponse);var r=a.m;if(""!=a.w&&(r=r+"<p><strong>"+updraftlion.warnings+"</strong><br>"+a.w+"</p>"),""!=a.e?r=r+"<p><strong>"+updraftlion.errors+"</strong><br>"+a.e+"</p>":updraft_restore_stage=3,a.hasOwnProperty("i")){try{if(e=ud_parse_json(a.i),e.hasOwnProperty("addui")){console.log("Further UI options are being displayed");var n=e.addui;r+='<div id="updraft_restoreoptions_ui" style="clear:left; padding-top:10px;">'+n+"</div>","object"==typeof JSON&&"function"==typeof JSON.stringify&&(delete e.addui,a.i=JSON.stringify(e))}}catch(o){console.log(o),console.log(a)}jQuery("#updraft_restorer_backup_info").val(a.i)}else jQuery("#updraft_restorer_backup_info").val();jQuery("#updraft-restore-modal-stage2a").html(r),jQuery("#updraft-restore-modal-stage2a .updraft_select2").length>0&&jQuery("#updraft-restore-modal-stage2a .updraft_select2").select2()}catch(o){console.log(t),console.log(o),jQuery("#updraft-restore-modal-stage2a").text(updraftlion.jsonnotunderstood+" "+updraftlion.errordata+": "+t).html()}},{json_parse:!1}))}function updraft_downloader_status(t,e,a,r){}function updraft_downloader_status_update(t,e,a,r,n,o){var u=t+e+"_"+a+"_"+r,d="."+u,s=0;if(null!=n.e)jQuery(d+" .raw").html("<strong>"+updraftlion.error+"</strong> "+n.e),console.log(n);else if(null!=n.p){if(jQuery(d+"_st .dlfileprogress").width(n.p+"%"),null!=n.a&&n.a>0){var p=(new Date).getTime(),i=jQuery(d).data("lasttimebegan"),l=p-i;if(n.a>90&&l>6e4){console.log(e+" "+a+" "+r+": restarting download: file_age="+n.a+", sincelastrestart_ms="+l),jQuery(d).data("lasttimebegan",(new Date).getTime());var c=jQuery("#updraft-navtab-backups-content .uddownloadform_"+a+"_"+e+"_"+r),f={type:a,timestamp:e,findex:r},_={action:"updraft_download_backup",nonce_key:"_wpnonce",nonce:c.data("wp_nonce").toString(),timeout:1e4};updraft_send_command("updraft_download_backup",f,function(t){},_),jQuery(d).data("lasttimebegan",(new Date).getTime())}}if(null!=n.m)if(n.p>=100&&"udrestoredlstatus_"==t)jQuery(d+" .raw").html(n.m),jQuery(d).fadeOut("slow",function(){jQuery(this).remove(),updraft_restorer_checkstage2(0)});else if(n.p<100||"uddlstatus_"!=t)jQuery(d+" .raw").html(n.m);else{var y=updraftlion.fileready+" "+updraftlion.actions+': \t\t\t\t<button type="button" onclick="updraftplus_downloadstage2(\''+e+"', '"+a+"', '"+r+"')\">"+updraftlion.downloadtocomputer+'</button> \t\t\t\t<button id="uddownloaddelete_'+e+"_"+a+'" type="button" onclick="updraftplus_deletefromserver(\''+e+"', '"+a+"', '"+r+"')\">"+updraftlion.deletefromserver+"</button>";n.hasOwnProperty("can_show_contents")&&n.can_show_contents&&(y+=' <button type="button" onclick="updraftplus_show_contents(\''+e+"', '"+a+"', '"+r+"')\">"+updraftlion.browse_contents+"</button>"),jQuery(d+" .raw").html(y)}}else null!=n.m?jQuery(d+" .raw").html(n.m):(jQuery(d+" .raw").html(updraftlion.jsonnotunderstood+" ("+o+")"),s=1);return s}function updraft_backupnow_go(t,e,a,r,n,o,u){jQuery("#updraft_backup_started").html("<em>"+updraftlion.requeststart+"</em>").slideDown(""),setTimeout(function(){jQuery("#updraft_backup_started").fadeOut("slow")},75e3);var d={backupnow_nodb:t,backupnow_nofiles:e,backupnow_nocloud:a,backupnow_label:o,extradata:n};""!=r&&(d.onlythisfileentity=r),""!=u&&(d.onlythesetableentities=u),updraft_send_command("backupnow",d,function(t){jQuery("#updraft_backup_started").html(t.m),t.hasOwnProperty("nonce")&&(updraft_backupnow_nonce=t.nonce,console.log("UpdraftPlus: ID of started job: "+updraft_backupnow_nonce)),setTimeout(function(){updraft_activejobs_update(!0)},500)})}var onlythesefileentities=backupnow_whichfiles_checked("");""==onlythesefileentities?jQuery("#backupnow_includefiles_moreoptions").show():jQuery("#backupnow_includefiles_moreoptions").hide();var updraft_restore_stage=1,lastlog_lastmessage="",lastlog_lastdata="",lastlog_jobs="",updraft_activejobs_nextupdate=(new Date).getTime()+1e3,updraft_page_is_visible=1,updraft_console_focussed_tab=1,updraft_settings_form_changed=!1;window.onbeforeunload=function(t){if(updraft_settings_form_changed)return updraftlion.unsavedsettings},"undefined"!=typeof document.hidden&&document.addEventListener("visibilitychange",function(){updraft_check_page_visibility(0)},!1),updraft_check_page_visibility(1);var updraft_poplog_log_nonce,updraft_poplog_log_pointer=0,updraft_poplog_lastscroll=-1,updraft_last_forced_jobid=-1,updraft_last_forced_resumption=-1,updraft_last_forced_when=-1,updraft_backupnow_nonce="",updraft_activejobslist_backupnownonce_only=0,updraft_inpage_hasbegun=0,updraft_historytimer=0,calculated_diskspace=0,updraft_historytimer_notbefore=0,updraft_history_lastchecksum=!1,updraft_interval_week_val=!1,updraft_interval_month_val=!1;"undefined"!=typeof updraft_siteurl&&setInterval(function(){jQuery.get(updraft_siteurl+"/wp-cron.php")},21e4);var lastlog_lastmessage="";jQuery(document).ajaxError(function(t,e,a,r){if(null!=r&&""!=r&&null!=e.responseText&&""!=e.responseText&&(console.log("Error caught by UpdraftPlus ajaxError handler (follows) for "+a.url),console.log(r),0==a.url.search(ajaxurl)))if(a.url.search("subaction=downloadstatus")>=0){var n=a.url.match(/timestamp=\d+/),o=a.url.match(/type=[a-z]+/),u=a.url.match(/findex=\d+/),d=a.url.match(/base=[a-z_]+/);if(u=u instanceof Array?parseInt(u[0].substr(7)):0,o=o instanceof Array?o[0].substr(5):"",d=d instanceof Array?d[0].substr(5):"",n=n instanceof Array?parseInt(n[0].substr(10)):0,""!=d&&""!=o&&n>0){var s=d+n+"_"+o+"_"+u;jQuery("."+s+" .raw").html("<strong>"+updraftlion.error+"</strong> "+updraftlion.servererrorcode)}}else a.url.search("subaction=restore_alldownloaded")>=0&&jQuery("#updraft-restore-modal-stage2a").append("<br><strong>"+updraftlion.error+"</strong> "+updraftlion.servererrorcode+": "+r)}),jQuery(document).ready(function(t){function e(e){t('.expertmode .advanced_settings_container .advanced_tools:not(".'+e+'")').hide(),t(".expertmode .advanced_settings_container .advanced_tools."+e).fadeIn("slow"),t(".expertmode .advanced_settings_container .advanced_tools_button:not(#"+e+")").removeClass("active"),t(".expertmode .advanced_settings_container .advanced_tools_button#"+e).addClass("active")}function a(t){var e=!!jQuery("#updraftcentral_mothership_other").is(":checked");e?(jQuery("#updraftcentral_keycreate_mothership").prop("disabled",!1),t?jQuery("#updraftcentral_keycreate_mothership_firewalled_container").show():(jQuery("#updraftcentral_keycreate_mothership_firewalled_container").slideDown(),jQuery("#updraftcentral_keycreate_mothership").focus())):jQuery("#updraftcentral_keycreate_mothership").prop("disabled",!0)}function r(e,a,n,o){jQuery("#updraft-delete-waitwarning").slideDown();var u=e,d=a,s=n,p=o,i=jQuery("#updraft_delete_timestamp").val().split(","),l=jQuery("#updraft_delete_form").serializeArray(),c={};
2
- t.each(l,function(){void 0!==c[this.name]?(c[this.name].push||(c[this.name]=[c[this.name]]),c[this.name].push(this.value||"")):c[this.name]=this.value||""}),c.remote_delete_limit=updraftlion.remote_delete_limit,delete c.action,delete c.subaction,delete c.nonce,updraft_send_command("deleteset",c,function(t){if(t.hasOwnProperty("result")&&null!=t.result)if("error"==t.result)alert(updraftlion.error+" "+t.message);else if("continue"==t.result)u=u+t.backup_local+t.backup_remote,d+=t.backup_local,s+=t.backup_remote,p+=t.backup_sets,jQuery("#updraft-deleted-files-total").text(u+" "+updraftlion.remote_files_deleted),r(u,d,s,p);else if("success"==t.result){jQuery("#updraft-deleted-files-total").text(""),jQuery("#updraft-delete-waitwarning").slideUp(),t.hasOwnProperty("count_backups")&&jQuery("#updraft-navtab-backups").html(updraftlion.existing_backups+" ("+t.count_backups+")");for(var e=0;e<i.length;e++){var a=i[e];jQuery("#updraft-navtab-backups-content .updraft_existing_backups_row_"+a).slideUp().remove()}jQuery("#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected").length<1&&jQuery("#ud_massactions").hide(),updraft_history_lastchecksum=!1,jQuery("#updraft-delete-modal").dialog("close"),d+=t.backup_local,s+=t.backup_remote,p+=t.backup_sets,alert(t.set_message+" "+p+"\n"+t.local_message+" "+d+"\n"+t.remote_message+" "+s)}})}function n(t,e){jQuery("#updraft-navtab-settings-content #updraft_include_"+t).is(":checked")?e?jQuery("#updraft-navtab-settings-content #updraft_include_"+t+"_exclude").show():jQuery("#updraft-navtab-settings-content #updraft_include_"+t+"_exclude").slideDown():e?jQuery("#updraft-navtab-settings-content #updraft_include_"+t+"_exclude").hide():jQuery("#updraft-navtab-settings-content #updraft_include_"+t+"_exclude").slideUp()}function o(){var t=new plupload.Uploader(updraft_plupload_config);t.bind("Init",function(t){var e=jQuery("#plupload-upload-ui");t.features.dragdrop?(e.addClass("drag-drop"),jQuery("#drag-drop-area").bind("dragover.wp-uploader",function(){e.addClass("drag-over")}).bind("dragleave.wp-uploader, drop.wp-uploader",function(){e.removeClass("drag-over")})):(e.removeClass("drag-drop"),jQuery("#drag-drop-area").unbind(".wp-uploader"))}),t.init(),t.bind("FilesAdded",function(e,a){plupload.each(a,function(e){if(!/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-[\-a-z]+([0-9]+?)?(\.(zip|gz|gz\.crypt))?$/i.test(e.name)&&!/^log\.([0-9a-f]{12})\.txt$/.test(e.name)){for(var a=!1,r=0;r<updraft_accept_archivename.length;r++)if(updraft_accept_archivename[r].test(e.name))var a=!0;if(!a)return/\.(zip|tar|tar\.gz|tar\.bz2)$/i.test(e.name)||/\.sql(\.gz)?$/i.test(e.name)?(jQuery("#updraft-message-modal-innards").html("<p><strong>"+e.name+"</strong></p> "+updraftlion.notarchive2),jQuery("#updraft-message-modal").dialog("open")):alert(e.name+": "+updraftlion.notarchive),void t.removeFile(e)}jQuery("#filelist").append('<div class="file" id="'+e.id+'"><b>'+e.name+"</b> (<span>"+plupload.formatSize(0)+"</span>/"+plupload.formatSize(e.size)+') <div class="fileprogress"></div></div>')}),e.refresh(),e.start()}),t.bind("UploadProgress",function(t,e){jQuery("#"+e.id+" .fileprogress").width(e.percent+"%"),jQuery("#"+e.id+" span").html(plupload.formatSize(parseInt(e.size*e.percent/100))),e.size==e.loaded&&(jQuery("#"+e.id).html('<div class="file" id="'+e.id+'"><b>'+e.name+"</b> (<span>"+plupload.formatSize(parseInt(e.size*e.percent/100))+"</span>/"+plupload.formatSize(e.size)+") - "+updraftlion.complete+"</div>"),jQuery("#"+e.id+" .fileprogress").width(e.percent+"%"))}),t.bind("Error",function(t,e){console.log(e);var a;a="-200"==e.code?"\n"+updraftlion.makesure2:updraftlion.makesure;var r=updraftlion.uploaderr+" (code "+e.code+") : "+e.message;e.hasOwnProperty("status")&&e.status&&(r+=" ("+updraftlion.http_code+" "+e.status+")"),e.hasOwnProperty("response")&&(console.log("UpdraftPlus: plupload error: "+e.response),e.response.length<100&&(r+=" "+updraftlion.error+" "+e.response+"\n")),r+=" "+a,alert(r)}),t.bind("FileUploaded",function(t,e,a){if("200"==a.status)try{resp=ud_parse_json(a.response),resp.e?alert(updraftlion.uploaderror+" "+resp.e):resp.dm?(alert(resp.dm),updraft_updatehistory(1,0)):resp.m?updraft_updatehistory(1,0):alert("Unknown server response: "+a.response)}catch(r){console.log(a),alert(updraftlion.jsonnotunderstood)}else alert("Unknown server response status: "+a.code),console.log(a)})}function u(t){params={uri:jQuery("#updraftplus_httpget_uri").val()},params.curl=t,updraft_send_command("httpget",params,function(t){t.e&&alert(t.e),t.r?jQuery("#updraftplus_httpget_results").html("<pre>"+t.r+"</pre>"):console.log(t)},{type:"GET"})}function d(t,e,a){updraft_restore_setoptions(t),jQuery("#updraft_restore_timestamp").val(e),jQuery(".updraft_restore_date").html(a),updraft_restore_stage=1,jQuery("#updraft-migrate-modal").dialog("close"),jQuery("#updraft-restore-modal").dialog("open"),jQuery("#updraft-restore-modal-stage1").show(),jQuery("#updraft-restore-modal-stage2").hide(),jQuery("#updraft-restore-modal-stage2a").html(""),updraft_activejobs_update(!0)}function s(t){t=t.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var e="[\\?&]"+t+"=([^&#]*)",a=new RegExp(e),r=a.exec(window.location.href);return null==r?"":decodeURIComponent(r[1].replace(/\+/g," "))}if(t(".expertmode .advanced_settings_container .advanced_tools_button").click(function(){e(t(this).attr("id"))}),jQuery.ui&&jQuery.ui.dialog&&jQuery.ui.dialog.prototype._allowInteraction){var p=jQuery.ui.dialog.prototype._allowInteraction;jQuery.ui.dialog.prototype._allowInteraction=function(t){return!!jQuery(t.target).closest(".select2-dropdown").length||p.apply(this,arguments)}}t("#updraftcentral_keys").on("click","a.updraftcentral_keys_show",function(e){e.preventDefault(),t(this).remove(),t("#updraftcentral_keys_table").slideDown()}),t("#updraftcentral_keycreate_altmethod_moreinfo_get").click(function(e){e.preventDefault(),t(this).remove(),t("#updraftcentral_keycreate_altmethod_moreinfo").slideDown()}),t(".updraft_webdav_settings").on("change keyup paste",function(){var e=[],a="";t(".updraft_webdav_settings").each(function(r,n){var o=t(n).attr("id");if(o&&"updraft_webdav_"==o.substring(0,15)){var u=o.substring(15);id_split=u.split("_"),u=id_split[0],a=id_split[1],e[u]=this.value}});var r="",n="@",o="/",u=":",d=":";(e.host.indexOf("@")>=0||""===e.host)&&(n=""),e.host.indexOf("/")>=0?t("#updraft_webdav_host_error").show():t("#updraft_webdav_host_error").hide(),0!=e.path.indexOf("/")&&""!==e.path||(o=""),""!==e.user&&""!==e.pass||(u=""),""!==e.host&&""!==e.port||(d=""),r=e.webdav+e.user+u+e.pass+n+encodeURIComponent(e.host)+d+e.port+o+e.path,t("#updraft_webdav_url_"+a).val(r)}),t("#updraft-navtab-backups-content").on("click",".updraft_existing_backups .updraft_existing_backups_row",function(e){(e.ctrlKey||e.metaKey)&&(t(this).toggleClass("backuprowselected"),t("#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected").length>0?t("#ud_massactions").show():t("#ud_massactions").hide())}),jQuery("#updraft-navtab-settings-content .updraftplusmethod").on("click","button.updraft-test-button",function(){var t=jQuery(this).data("method"),e=jQuery(this).data("instance_id");updraft_remote_storage_test(t,function(e,a,r){return"sftp"==t&&(r.hasOwnProperty("scp")&&r.scp?alert(updraftlion.settings_test_result.replace("%s","SCP")+" "+e.output):alert(updraftlion.settings_test_result.replace("%s","SFTP")+" "+e.output),e.hasOwnProperty("data")&&console.log(e.data),!0)},e)}),t("#updraft-navtab-settings-content select.updraft_interval, #updraft-navtab-settings-content select.updraft_interval_database").change(function(){updraft_check_same_times()}),t("#backupnow_includefiles_showmoreoptions").click(function(e){e.preventDefault(),t("#backupnow_includefiles_moreoptions").toggle()}),t("#backupnow_database_showmoreoptions").click(function(e){e.preventDefault(),t("#backupnow_database_moreoptions").toggle()}),t("#updraft-navtab-backups-content a.updraft_diskspaceused_update").click(function(t){t.preventDefault(),updraftplus_diskspace()}),t("#updraft-navtab-backups-content a.updraft_uploader_toggle").click(function(e){e.preventDefault(),t("#updraft-plupload-modal").slideToggle()}),t("#updraft-navtab-backups-content a.updraft_rescan_local").click(function(t){t.preventDefault(),updraft_updatehistory(1,0)}),t("#updraft-navtab-backups-content a.updraft_rescan_remote").click(function(t){t.preventDefault(),updraft_updatehistory(1,1)}),jQuery("#updraftcentral_keys").on("change",'input[type="radio"]',function(){a(!1)}),a(!0),jQuery("#updraftcentral_keys").on("click","#updraftcentral_view_log",function(t){t.preventDefault(),jQuery("#updraftcentral_view_log_container").block({message:'<div style="margin: 8px; font-size:150%;"><img src="'+updraftlion.ud_url+'/images/udlogo-rotating.gif" height="80" width="80" style="padding-bottom:10px;"><br>'+updraftlion.fetching+"</div>"});try{updraft_send_command("updraftcentral_get_log",null,function(t){jQuery("#updraftcentral_view_log_container").unblock(),t.hasOwnProperty("log_contents")?jQuery("#updraftcentral_view_log_contents").html('<div style="border:1px solid;padding: 2px;max-height: 400px; overflow-y:scroll;">'+t.log_contents+"</div>"):console.response(resp)})}catch(e){jQuery("#updraft_central_key").html(),console.log(e)}}),jQuery("#updraftcentral_keys").on("click","#updraftcentral_wizard_go",function(t){jQuery("#updraftcentral_wizard_go").hide(),jQuery(".updraftcentral_wizard_success").remove(),jQuery(".create_key_container").show()}),jQuery("#updraftcentral_keys").on("click","#updraftcentral_stage1_go",function(t){t.preventDefault(),jQuery(".updraftcentral_wizard_stage2").hide(),jQuery(".updraftcentral_wizard_stage1").show()}),jQuery("#updraftcentral_keys").on("click","#updraftcentral_stage2_go",function(t){t.preventDefault(),jQuery("#updraftcentral_wizard_stage1_error").text("");var e="";if(jQuery("#updraftcentral_mothership_updraftpluscom").is(":checked"))e="updraftplus.com";else if(jQuery("#updraftcentral_mothership_other").is(":checked")){var a=jQuery("#updraftcentral_keycreate_mothership").val();if(""==a)return void jQuery("#updraftcentral_wizard_stage1_error").text(updraftlion.updraftcentral_wizard_empty_url);try{var r=new URL(a);e=r.hostname}catch(t){if("undefined"==typeof URL&&(e=jQuery("<a>").prop("href",a).prop("hostname")),!e||"undefined"!=typeof URL)return void jQuery("#updraftcentral_wizard_stage1_error").text(updraftlion.updraftcentral_wizard_invalid_url)}}jQuery("#updraftcentral_keycreate_description").val(e),jQuery(".updraftcentral_wizard_stage1").hide(),jQuery(".updraftcentral_wizard_stage2").show()}),jQuery("#updraftcentral_keys").on("click","#updraftcentral_keycreate_go",function(t){t.preventDefault();var e=!!jQuery("#updraftcentral_mothership_other").is(":checked"),a=jQuery("#updraftcentral_keycreate_description").val(),r=jQuery("#updraftcentral_keycreate_keysize").val(),n="__updraftpluscom";if(data={key_description:a,key_size:r},e&&(n=jQuery("#updraftcentral_keycreate_mothership").val(),"http"!=n.substring(0,4)))return void alert(updraftlion.enter_mothership_url);data.mothership_firewalled=jQuery("#updraftcentral_keycreate_mothership_firewalled").is(":checked")?1:0,data.where_send=n,jQuery(".create_key_container").hide(),jQuery(".updraftcentral_wizard_stage1").show(),jQuery(".updraftcentral_wizard_stage2").hide(),jQuery("#updraftcentral_keys").block({message:'<div style="margin: 8px; font-size:150%;"><img src="'+updraftlion.ud_url+'/images/udlogo-rotating.gif" height="80" width="80" style="padding-bottom:10px;"><br>'+updraftlion.creating_please_allow+"</div>"});try{updraft_send_command("updraftcentral_create_key",data,function(t){jQuery("#updraftcentral_keys").unblock();try{if(resp=ud_parse_json(t),resp.hasOwnProperty("error"))return alert(resp.error),void console.log(resp);alert(resp.r),resp.hasOwnProperty("bundle")&&resp.hasOwnProperty("keys_guide")?(jQuery("#updraftcentral_keys_content").html(resp.keys_guide),jQuery("#updraftcentral_keys_content").append('<div class="updraftcentral_wizard_success">'+resp.r+'<br><textarea onclick="this.select();" style="width:620px; height:165px; word-wrap:break-word; border: 1px solid #aaa; border-radius: 3px; padding:4px;">'+resp.bundle+"</textarea></div>")):console.log(resp),resp.hasOwnProperty("keys_table")&&jQuery("#updraftcentral_keys_content").append(resp.keys_table),jQuery("#updraftcentral_wizard_go").show()}catch(e){alert(updraftlion.unexpectedresponse+" "+t),console.log(e)}},{json_parse:!1})}catch(o){jQuery("#updraft_central_key").html(),console.log(o)}}),jQuery("#updraftcentral_keys").on("click",".updraftcentral_key_delete",function(t){t.preventDefault();var e=jQuery(this).data("key_id");return"undefined"==typeof e?void console.log("UpdraftPlus: .updraftcentral_key_delete clicked, but no key ID found"):(jQuery("#updraftcentral_keys").block({message:'<div style="margin: 8px; font-size:150%;"><img src="'+updraftlion.ud_url+'/images/udlogo-rotating.gif" height="80" width="80" style="padding-bottom:10px;"><br>'+updraftlion.deleting+"</div>"}),void updraft_send_command("updraftcentral_delete_key",{key_id:e},function(t){jQuery("#updraftcentral_keys").unblock(),t.hasOwnProperty("keys_table")&&jQuery("#updraftcentral_keys_content").html(t.keys_table)}))}),jQuery("#updraft_reset_sid").click(function(t){t.preventDefault(),updraft_send_command("reset_site_id",null,function(t){jQuery("#updraft_show_sid").html(t)},{json_parse:!1})}),jQuery("#updraft-navtab-settings-content form input:not('.udignorechange'), #updraft-navtab-settings-content form select").change(function(t){updraft_settings_form_changed=!0}),jQuery("#updraft-navtab-settings-content form input[type='submit']").click(function(t){updraft_settings_form_changed=!1});var i=180;jQuery(".updraft-bigbutton").each(function(t,e){var a=jQuery(e).width();a>i&&(i=a)}),i>180&&jQuery(".updraft-bigbutton").width(i),setInterval(function(){updraft_activejobs_update(!1)},1250),setTimeout(function(){jQuery("#setting-error-settings_updated").slideUp()},5e3),jQuery(".updraftplusmethod").hide(),jQuery("#updraft_restore_db").change(function(){jQuery("#updraft_restore_db").is(":checked")?jQuery("#updraft_restorer_dboptions").slideDown():jQuery("#updraft_restorer_dboptions").slideUp()}),updraft_check_same_times();var l={};l[updraftlion.close]=function(){jQuery(this).dialog("close")},jQuery("#updraft-message-modal").dialog({autoOpen:!1,height:350,width:520,modal:!0,buttons:l});var c={};c[updraftlion.deletebutton]=function(){r(0,0,0,0)},c[updraftlion.cancel]=function(){jQuery(this).dialog("close")},jQuery("#updraft-delete-modal").dialog({autoOpen:!1,height:262,width:430,modal:!0,buttons:c});var f={};f[updraftlion.restore]=function(){var t=0,e=[],a=0,r=jQuery("#updraft_restore_meta_foreign").val();if(jQuery('input[name="updraft_restore[]"]').each(function(n,o){if(jQuery(o).is(":checked")&&!jQuery(o).is(":disabled")){t=1;var u=jQuery(o).data("howmany"),d=jQuery(o).val();if((1==r||2==r&&"db"!=d)&&("wpcore"!=d&&(u=jQuery("#updraft_restore_form #updraft_restore_wpcore").data("howmany")),d="wpcore"),"wpcore"!=d||0==a){var s=[d,u];e.push(s),"wpcore"==d&&(a=1)}}}),1==t){if(1==updraft_restore_stage){jQuery("#updraft-restore-modal-stage1").slideUp("slow"),jQuery("#updraft-restore-modal-stage2").show(),updraft_restore_stage=2;var n=jQuery(".updraft_restore_date").first().text(),o=e,u=jQuery("#updraft_restore_timestamp").val();try{updraft_send_command("whichdownloadsneeded",{downloads:e,timestamp:u},function(t){if(t.hasOwnProperty("downloads")&&(console.log("UpdraftPlus: items which still require downloading follow"),o=t.downloads,console.log(o)),0==o.length)updraft_restorer_checkstage2(0);else for(var e=0;e<o.length;e++)updraft_downloader("udrestoredlstatus_",u,o[e][0],"#ud_downloadstatus2",o[e][1],n,!1)},{alert_on_error:!1})}catch(d){console.log("UpdraftPlus: error (follows) when looking for items needing downloading"),console.log(d),alert(updraftlion.jsonnotunderstood)}}else if(2==updraft_restore_stage)updraft_restorer_checkstage2(1);else if(3==updraft_restore_stage){var s=1;if(jQuery("#updraft_restoreoptions_ui input.required").each(function(t){if(0!=s){var e=jQuery(this).val();if(""==e)alert(updraftlion.pleasefillinrequired),s=0;else if(""!=jQuery(this).attr("pattern")){var a=jQuery(this).attr("pattern"),r=new RegExp(a,"g");r.test(e)||(alert(jQuery(this).data("invalidpattern")),s=0)}}}),!s)return;var p=jQuery("#updraft_restoreoptions_ui select, #updraft_restoreoptions_ui input").serialize();console.log("Restore options: "+p),jQuery("#updraft_restorer_restore_options").val(p),jQuery("#updraft-restore-modal-stage2a").html(updraftlion.restoreproceeding),jQuery("#updraft_restore_form").submit()}}else alert(updraftlion.youdidnotselectany)},f[updraftlion.cancel]=function(){jQuery(this).dialog("close")},jQuery("#updraft-restore-modal").dialog({autoOpen:!1,height:505,width:590,modal:!0,buttons:f}),jQuery("#updraft-iframe-modal").dialog({autoOpen:!1,height:500,width:780,modal:!0}),jQuery("#updraft-backupnow-inpage-modal").dialog({autoOpen:!1,height:345,width:580,modal:!0});var _={};_[updraftlion.backupnow]=function(){var t=jQuery("#backupnow_includedb").is(":checked")?0:1,e=jQuery("#backupnow_includefiles").is(":checked")?0:1,a=jQuery("#backupnow_includecloud").is(":checked")?0:1,r=backupnow_whichtables_checked("");if(""==r&&0==t)return alert(updraftlion.notableschosen),void jQuery("#backupnow_includefiles_moreoptions").show();"boolean"==typeof r&&(r=null);var n=backupnow_whichfiles_checked("");return""==n&&0==e?(alert(updraftlion.nofileschosen),void jQuery("#backupnow_includefiles_moreoptions").show()):t&&e?void alert(updraftlion.excludedeverything):(jQuery(this).dialog("close"),setTimeout(function(){jQuery("#updraft_lastlogmessagerow").fadeOut("slow",function(){jQuery(this).fadeIn("slow")})},1700),void updraft_backupnow_go(t,e,a,n,"",jQuery("#backupnow_label").val(),r))},_[updraftlion.cancel]=function(){jQuery(this).dialog("close")},jQuery("#updraft-backupnow-modal").dialog({autoOpen:!1,height:472,width:610,modal:!0,buttons:_}),jQuery("#updraft-migrate-modal").dialog({autoOpen:!1,height:updraftlion.migratemodalheight,width:updraftlion.migratemodalwidth,modal:!0}),jQuery("#updraft-poplog").dialog({autoOpen:!1,height:600,width:"75%",modal:!0}),jQuery("#updraft-navtab-settings-content .enableexpertmode").click(function(){return jQuery("#updraft-navtab-settings-content .expertmode").fadeIn(),jQuery("#updraft-navtab-settings-content .enableexpertmode").off("click"),!1}),jQuery("#updraft-navtab-settings-content .backupdirrow").on("click","a.updraft_backup_dir_reset",function(){return jQuery("#updraft_dir").val("updraft"),!1}),jQuery("#updraft-navtab-settings-content .updraft_include_entity").click(function(){var t=jQuery(this).data("toggle_exclude_field");t&&n(t,!1)}),jQuery("#updraft-navtab-settings-content .updraft-service").change(function(){var t=jQuery(this).val();jQuery("#updraft-navtab-settings-content .updraftplusmethod").hide(),jQuery("#updraft-navtab-settings-content ."+t).show()}),jQuery("#updraft-navtab-settings-content a.updraft_show_decryption_widget").click(function(t){t.preventDefault(),jQuery("#updraftplus_db_decrypt").val(jQuery("#updraft_encryptionphrase").val()),jQuery("#updraft-manualdecrypt-modal").slideToggle()}),jQuery("#updraftplus-phpinfo").click(function(t){t.preventDefault(),updraft_iframe_modal("phpinfo",updraftlion.phpinfo)}),jQuery("#updraftplus-rawbackuphistory").click(function(t){t.preventDefault(),updraft_iframe_modal("rawbackuphistory",updraftlion.raw)}),jQuery("#updraft-navtab-status").click(function(t){t.preventDefault(),jQuery(this).addClass("nav-tab-active"),jQuery("#updraft-navtab-expert-content").hide(),jQuery("#updraft-navtab-settings-content").hide(),jQuery("#updraft-navtab-backups-content").hide(),jQuery("#updraft-navtab-addons-content").hide(),jQuery("#updraft-navtab-status-content").show(),jQuery("#updraft-navtab-expert").removeClass("nav-tab-active"),jQuery("#updraft-navtab-backups").removeClass("nav-tab-active"),jQuery("#updraft-navtab-settings").removeClass("nav-tab-active"),jQuery("#updraft-navtab-addons").removeClass("nav-tab-active"),updraft_page_is_visible=1,updraft_console_focussed_tab=1,updraft_activejobs_update(!0)}),jQuery("#updraft-navtab-expert").click(function(t){t.preventDefault(),jQuery(this).addClass("nav-tab-active"),jQuery("#updraft-navtab-settings-content").hide(),jQuery("#updraft-navtab-status-content").hide(),jQuery("#updraft-navtab-backups-content").hide(),jQuery("#updraft-navtab-addons-content").hide(),jQuery("#updraft-navtab-expert-content").show(),jQuery("#updraft-navtab-status").removeClass("nav-tab-active"),jQuery("#updraft-navtab-backups").removeClass("nav-tab-active"),jQuery("#updraft-navtab-settings").removeClass("nav-tab-active"),jQuery("#updraft-navtab-addons").removeClass("nav-tab-active"),updraft_page_is_visible=1,updraft_console_focussed_tab=4}),jQuery("#updraft-navtab-settings, #updraft-navtab-settings2, #updraft_backupnow_gotosettings").click(function(t){t.preventDefault(),jQuery(this).parents(".updraftmessage").remove(),jQuery("#updraft-backupnow-modal").dialog("close"),jQuery("#updraft-navtab-status-content").hide(),jQuery("#updraft-navtab-backups-content").hide(),jQuery("#updraft-navtab-expert-content").hide(),jQuery("#updraft-navtab-addons-content").hide(),jQuery("#updraft-navtab-settings-content").show(),jQuery("#updraft-navtab-settings").addClass("nav-tab-active"),jQuery("#updraft-navtab-expert").removeClass("nav-tab-active"),jQuery("#updraft-navtab-backups").removeClass("nav-tab-active"),jQuery("#updraft-navtab-status").removeClass("nav-tab-active"),jQuery("#updraft-navtab-addons").removeClass("nav-tab-active"),updraft_page_is_visible=1,updraft_console_focussed_tab=3}),jQuery("#updraft-navtab-addons").click(function(t){t.preventDefault(),jQuery(this).addClass("b#nav-tab-active"),jQuery("#updraft-navtab-status-content").hide(),jQuery("#updraft-navtab-backups-content").hide(),jQuery("#updraft-navtab-expert-content").hide(),jQuery("#updraft-navtab-settings-content").hide(),jQuery("#updraft-navtab-addons-content").show(),jQuery("#updraft-navtab-addons").addClass("nav-tab-active"),jQuery("#updraft-navtab-expert").removeClass("nav-tab-active"),jQuery("#updraft-navtab-backups").removeClass("nav-tab-active"),jQuery("#updraft-navtab-status").removeClass("nav-tab-active"),jQuery("#updraft-navtab-settings").removeClass("nav-tab-active"),updraft_page_is_visible=1,updraft_console_focussed_tab=5}),jQuery("#updraft-navtab-backups").click(function(t){t.preventDefault(),updraft_openrestorepanel(1)}),updraft_send_command("ping",null,function(t,e){"success"==e&&"pong"!=t&&t.indexOf("pong")>=0&&(jQuery("#updraft-navtab-backups-content .ud-whitespace-warning").show(),console.log("UpdraftPlus: Extra output warning: response (which should be just (string)'pong') follows."),console.log(t))},{json_parse:!1,type:"GET"});try{"undefined"!=typeof updraft_plupload_config&&o()}catch(y){console.log(y)}if(jQuery("#updraftplus_httpget_go").click(function(t){t.preventDefault(),u(0)}),jQuery("#updraftplus_httpget_gocurl").click(function(t){t.preventDefault(),u(1)}),jQuery("#updraftplus_callwpaction_go").click(function(t){t.preventDefault(),params={wpaction:jQuery("#updraftplus_callwpaction").val()},updraft_send_command("call_wordpress_action",params,function(t){t.e?alert(t.e):t.s||(t.r?jQuery("#updraftplus_callwpaction_results").html(t.r):(console.log(t),alert(updraftlion.jsonnotunderstood)))})}),jQuery("#updraft_activejobs_table").on("click",".updraft_jobinfo_delete",function(t){t.preventDefault();var e=jQuery(this).data("jobid");e?updraft_activejobs_delete(e):console.log("UpdraftPlus: A stop job link was clicked, but the Job ID could not be found")}),jQuery("#updraft_activejobs_table, #updraft-navtab-backups-content .updraft_existing_backups, #updraft-backupnow-inpage-modal").on("click",".updraft-log-link",function(t){t.preventDefault();var e=jQuery(this).data("jobid");e?updraft_popuplog(e):console.log("UpdraftPlus: A log link was clicked, but the Job ID could not be found")}),jQuery("#updraft-navtab-backups-content .updraft_existing_backups").on("click","button.choose-components-button",function(t){var e=jQuery(this).data("entities"),a=jQuery(this).data("backup_timestamp"),r=jQuery(this).data("showdata");d(e,a,r)}),"initiate_restore"==s("udaction")){var g=s("entities"),h=s("backup_timestamp"),m=s("showdata");d(g,h,m)}jQuery("#updraft-navtab-backups-content .updraft_existing_backups").on("click",".updraft-delete-link",function(t){t.preventDefault();var e=jQuery(this).data("hasremote"),a=jQuery(this).data("nonce").toString(),r=jQuery(this).data("key").toString();a?updraft_delete(r,a,e):console.log("UpdraftPlus: A delete link was clicked, but the Job ID could not be found")}),jQuery("#updraft-navtab-backups-content .updraft_existing_backups").on("click","button.updraft_download_button",function(t){t.preventDefault();var e="uddlstatus_",a=jQuery(this).data("backup_timestamp"),r=jQuery(this).data("what"),n=".ud_downloadstatus",o=jQuery(this).data("set_contents"),u=jQuery(this).data("prettydate"),d=!0;updraft_downloader(e,a,r,n,o,u,d)}),jQuery("#updraft-navtab-backups-content .updraft_existing_backups").on("dblclick",".updraft_existingbackup_date",function(t){t.preventDefault();var e=jQuery(this).data("rawbackup");null!=e&&""!=e&&updraft_html_modal(e,updraftlion.raw,780,500)})}),jQuery(document).ready(function(t){var e="#updraft-navtab-settings-content ";t(e+"#updraftvault_settings_cell").on("click",".updraftvault_backtostart",function(a){a.preventDefault(),t(e+"#updraftvault_settings_showoptions").slideUp(),t(e+"#updraftvault_settings_connect").slideUp(),t(e+"#updraftvault_settings_connected").slideUp(),t(e+"#updraftvault_settings_default").slideDown()}),t(e+"#updraftvault_settings_connect input").keypress(function(a){if(13==a.which)return t(e+"#updraftvault_connect_go").click(),!1}),t(e+"#updraftvault_settings_cell").on("click","#updraftvault_recountquota",function(a){a.preventDefault(),t(e+"#updraftvault_recountquota").html(updraftlion.counting);try{updraft_send_command("vault_recountquota",null,function(a){t(e+"#updraftvault_recountquota").html(updraftlion.updatequotacount),a.hasOwnProperty("html")&&(t(e+"#updraftvault_settings_connected").html(a.html),a.hasOwnProperty("connected")&&(a.connected?(t(e+"#updraftvault_settings_default").hide(),t(e+"#updraftvault_settings_connected").show()):(t(e+"#updraftvault_settings_connected").hide(),t(e+"#updraftvault_settings_default").show())))})}catch(r){t(e+"#updraftvault_recountquota").html(updraftlion.updatequotacount),console.log(r)}}),t(e+"#updraftvault_settings_cell").on("click","#updraftvault_disconnect",function(a){a.preventDefault(),t(e+"#updraftvault_disconnect").html(updraftlion.disconnecting);try{updraft_send_command("vault_disconnect",{immediate_echo:!0},function(a){t(e+"#updraftvault_disconnect").html(updraftlion.disconnect),a.hasOwnProperty("html")&&(t(e+"#updraftvault_settings_connected").html(a.html).slideUp(),t(e+"#updraftvault_settings_default").slideDown())})}catch(r){t(e+"#updraftvault_disconnect").html(updraftlion.disconnect),console.log(r)}}),t(e+"#updraftvault_connect").click(function(a){a.preventDefault(),t(e+"#updraftvault_settings_default").slideUp(),t(e+"#updraftvault_settings_connect").slideDown()}),t(e+"#updraftvault_showoptions").click(function(a){a.preventDefault(),t(e+"#updraftvault_settings_default").slideUp(),t(e+"#updraftvault_settings_showoptions").slideDown()}),t(e+"#updraftvault_connect_go").click(function(a){return t(e+"#updraftvault_connect_go").html(updraftlion.connecting),updraft_send_command("vault_connect",{email:t("#updraftvault_email").val(),pass:t("#updraftvault_pass").val()},function(a,r,n){t(e+"#updraftvault_connect_go").html(updraftlion.connect),a.hasOwnProperty("e")?(updraft_html_modal('<h4 style="margin-top:0px; padding-top:0px;">'+updraftlion.errornocolon+"</h4><p>"+a.e+"</p>",updraftlion.disconnect,400,250),a.hasOwnProperty("code")&&"no_quota"==a.code&&(t(e+"#updraftvault_settings_connect").slideUp(),t(e+"#updraftvault_settings_default").slideDown())):a.hasOwnProperty("connected")&&a.connected&&a.hasOwnProperty("html")?(t(e+"#updraftvault_settings_connect").slideUp(),t(e+"#updraftvault_settings_connected").html(a.html).slideDown()):(console.log(a),alert(updraftlion.unexpectedresponse+" "+n))}),!1})}),jQuery(document).ready(function(t){function e(){var t=new plupload.Uploader(updraft_plupload_config2);t.bind("Init",function(t){var e=jQuery("#plupload-upload-ui2");t.features.dragdrop?(e.addClass("drag-drop"),jQuery("#drag-drop-area2").bind("dragover.wp-uploader",function(){e.addClass("drag-over")}).bind("dragleave.wp-uploader, drop.wp-uploader",function(){e.removeClass("drag-over")})):(e.removeClass("drag-drop"),jQuery("#drag-drop-area2").unbind(".wp-uploader"))}),t.init(),t.bind("FilesAdded",function(e,a){plupload.each(a,function(e){return/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-db([0-9]+)?\.(gz\.crypt)$/i.test(e.name)?void jQuery("#filelist2").append('<div class="file" id="'+e.id+'"><b>'+e.name+"</b> (<span>"+plupload.formatSize(0)+"</span>/"+plupload.formatSize(e.size)+') <div class="fileprogress"></div></div>'):(alert(e.name+": "+updraftlion.notdba),void t.removeFile(e))}),e.refresh(),e.start()}),t.bind("UploadProgress",function(t,e){jQuery("#"+e.id+" .fileprogress").width(e.percent+"%"),jQuery("#"+e.id+" span").html(plupload.formatSize(parseInt(e.size*e.percent/100)))}),t.bind("Error",function(t,e){"-200"==e.code?err_makesure="\n"+updraftlion.makesure2:err_makesure=updraftlion.makesure,alert(updraftlion.uploaderr+" (code "+e.code+") : "+e.message+" "+err_makesure)}),t.bind("FileUploaded",function(t,e,a){"200"==a.status?"ERROR:"==a.response.substring(0,6)?alert(updraftlion.uploaderror+" "+a.response.substring(6)):"OK:"==a.response.substring(0,3)?(bkey=a.response.substring(3),jQuery("#"+e.id+" .fileprogress").hide(),jQuery("#"+e.id).append(updraftlion.uploaded+' <a href="?page=updraftplus&action=downloadfile&updraftplus_file='+bkey+"&decrypt_key="+encodeURIComponent(jQuery("#updraftplus_db_decrypt").val())+'">'+updraftlion.followlink+"</a> "+updraftlion.thiskey+" "+jQuery("#updraftplus_db_decrypt").val().replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"))):alert(updraftlion.unknownresp+" "+a.response):alert(updraftlion.ukrespstatus+" "+a.code)})}try{"undefined"!=typeof updraft_plupload_config2&&e()}catch(a){console.log(a)}jQuery("#updraft-hidethis").remove(),updraft_remote_storage_tabs_setup()}),jQuery(document).ready(function(t){function e(){var t=r("object"),e=new Date;t=JSON.stringify({version:"1.12.40",epoch_date:e.getTime(),local_date:e.toLocaleString(),network_site_url:updraftlion.network_site_url,data:t});var a=document.body.appendChild(document.createElement("a"));a.setAttribute("download","updraftplus-settings.json"),a.setAttribute("style","display:none;"),a.setAttribute("href","data:text/json;charset=UTF-8,"+encodeURIComponent(t)),a.click()}function a(e){var a,r=decodeURIComponent(e);try{a=ud_parse_json(r)}catch(o){return t.unblockUI(),jQuery("#import_settings").val(""),console.log(r),console.log(o),void alert(updraftlion.import_invalid_json_file)}if(window.confirm(updraftlion.importing_data_from+" "+r.network_site_url+"\n"+updraftlion.exported_on+" "+r.local_date+"\n"+updraftlion.continue_import)){var u=JSON.stringify(a.data);updraft_send_command("importsettings",{settings:u,updraftplus_version:updraftlion.updraftplus_version},function(e){var a=n(e);!a.hasOwnProperty("saved")||a.saved?(updraft_settings_form_changed=!1,location.replace(updraftlion.updraft_settings_url)):(t.unblockUI(),a.hasOwnProperty("error_message")&&a.error_message&&alert(a.error_message))},{action:"updraft_importsettings",nonce:updraftplus_settings_nonce,json_parse:!1})}else t.unblockUI()}function r(e){var a="",e="undefined"==typeof e?"string":e;return"object"==e?a=t("#updraft-navtab-settings-content form input[name!='action'][name!='option_page'][name!='_wpnonce'][name!='_wp_http_referer'], #updraft-navtab-settings-content form textarea, #updraft-navtab-settings-content form select, #updraft-navtab-settings-content form input[type=checkbox]").serializeJSON({
3
- checkboxUncheckedValue:"0",useIntKeysAsArrayIndex:!0}):(a=t("#updraft-navtab-settings-content form input[name!='action'], #updraft-navtab-settings-content form textarea, #updraft-navtab-settings-content form select").serialize(),t.each(t("#updraft-navtab-settings-content form input[type=checkbox]").filter(function(e){return 0==t(this).prop("checked")}),function(e,r){var n="0";a+="&"+t(r).attr("name")+"="+n})),a}function n(e){try{var a=ud_parse_json(e),r=(a.messages,a.backup_dir.writable),n=a.backup_dir.message,o=a.backup_dir.button_title}catch(u){return console.log(u),console.log(e),alert(updraftlion.jsonnotunderstood),t.unblockUI(),{}}if(a.hasOwnProperty("changed")){console.log("UpdraftPlus: savesettings: some values were changed after being filtered"),console.log(a.changed);for(prop in a.changed)if("object"==typeof a.changed[prop])for(innerprop in a.changed[prop])t("[name='"+innerprop+"']").is(":checkbox")||t("[name='"+prop+"["+innerprop+"]']").val(a.changed[prop][innerprop]);else t("[name='"+prop+"']").is(":checkbox")||t("[name='"+prop+"']").val(a.changed[prop])}return t("#updraft_writable_mess").html(n),0==r?(t("#updraft-backupnow-button").attr("disabled","disabled"),t("#updraft-backupnow-button").attr("title",o),t(".backupdirrow").css("display","table-row")):(t("#updraft-backupnow-button").removeAttr("disabled"),t("#updraft-backupnow-button").removeAttr("title")),a.hasOwnProperty("updraft_include_more_path")&&t("#backupnow_includefiles_moreoptions").html(a.updraft_include_more_path),a.hasOwnProperty("backup_now_message")&&t("#backupnow_remote_container").html(a.backup_now_message),t(".updraftmessage").remove(),t("#updraft_backup_started").before(a.messages),t("#next-backup-table-inner").html(a.scheduled),a}function o(){var t=!1;if(jQuery("#updraft-authenticate-modal-innards").html(""),jQuery("div[class*=updraft_authenticate_] a.updraft_authlink").each(function(){jQuery("#updraft-authenticate-modal-innards").append('<p><a href="'+jQuery(this).attr("href")+'">'+jQuery(this).html()+"</a></p>"),t=!0}),t){var e={};e[updraftlion.cancel]=function(){jQuery(this).dialog("close")},jQuery("#updraft-authenticate-modal").dialog({autoOpen:!0,modal:!0,resizable:!1,draggable:!1,buttons:e,width:"auto"}).dialog("open")}}var u=new Image;u.src=updraftlion.ud_url+"/images/udlogo-rotating.gif",t("#updraft-navtab-settings-content input.updraft_include_entity").change(function(e){var a=t(this).attr("id"),r=t(this).is(":checked"),n="#backupnow_files_"+a;t(n).prop("checked",r)}),t("#updraftplus-settings-save").click(function(e){e.preventDefault(),t.blockUI({message:'<div style="margin: 8px; font-size:150%;"><img src="'+updraftlion.ud_url+'/images/udlogo-rotating.gif" height="80" width="80" style="padding-bottom:10px;"><br>'+updraftlion.saving+"</div>"});var a=r("string");updraft_send_command("savesettings",{settings:a,updraftplus_version:updraftlion.updraftplus_version},function(e){n(e),t("#updraft-wrap .fade").delay(6e3).fadeOut(2e3),t("html, body").animate({scrollTop:t("#updraft-wrap").offset().top},1e3,function(){o()}),t.unblockUI()},{action:"updraft_savesettings",nonce:updraftplus_settings_nonce,json_parse:!1})}),t("#updraftplus-settings-export").click(function(){updraft_settings_form_changed&&alert(updraftlion.unsaved_settings_export),e()}),t("#updraftplus-settings-import").click(function(){t.blockUI({message:'<div style="margin: 8px; font-size:150%;"><img src="'+updraftlion.ud_url+'/images/udlogo-rotating.gif" height="80" width="80" style="padding-bottom:10px;"><br>'+updraftlion.importing+"</div>"});var e=document.getElementById("import_settings");if(0==e.files.length)return alert(updraftlion.import_select_file),void t.unblockUI();var r=e.files[0],n=new FileReader;n.onload=function(){a(this.result)},n.readAsText(r)})});
1
+ function updraft_send_command(t,e,a,r){default_options={json_parse:!0,alert_on_error:!0,action:"updraft_ajax",nonce:updraft_credentialtest_nonce,nonce_key:"nonce",timeout:null,async:!0,type:"POST"},"undefined"==typeof r&&(r={});for(var n in default_options)r.hasOwnProperty(n)||(r[n]=default_options[n]);var o={action:r.action,subaction:t};if(o[r.nonce_key]=r.nonce,"object"==typeof e)for(var u in e)o[u]=e[u];else o.action_data=e;var d={type:r.type,url:ajaxurl,data:o,success:function(t,e){if(r.json_parse){try{var n=ud_parse_json(t)}catch(o){return console.log(o),console.log(t),void(r.alert_on_error&&alert(updraftlion.unexpectedresponse+" "+t))}"function"==typeof a&&a(n,e,t)}else"function"==typeof a&&a(t,e)},error:function(t,e,a){"function"==typeof r.error_callback?r.error_callback(t,e,a):(console.log("updraft_send_command: error: "+e+" ("+a+")"),console.log(t))},dataType:"text",async:r.async};null!=r.timeout&&(d.timeout=r.timeout),jQuery.ajax(d)}function updraft_delete(t,e,a){jQuery("#updraft_delete_timestamp").val(t),jQuery("#updraft_delete_nonce").val(e),a?jQuery("#updraft-delete-remote-section, #updraft_delete_remote").removeAttr("disabled").show():jQuery("#updraft-delete-remote-section, #updraft_delete_remote").hide().attr("disabled","disabled"),t.indexOf(",")>-1?(jQuery("#updraft_delete_question_singular").hide(),jQuery("#updraft_delete_question_plural").show()):(jQuery("#updraft_delete_question_plural").hide(),jQuery("#updraft_delete_question_singular").show()),jQuery("#updraft-delete-modal").dialog("open")}function updraft_remote_storage_tab_activation(t){jQuery(".updraftplusmethod").hide(),jQuery(".remote-tab").data("active",!1),jQuery(".remote-tab").removeClass("nav-tab-active"),jQuery(".updraftplusmethod."+t).show(),jQuery(".remote-tab-"+t).data("active",!0),jQuery(".remote-tab-"+t).addClass("nav-tab-active")}function updraft_check_overduecrons(){updraft_send_command("check_overdue_crons",null,function(t){t&&t.hasOwnProperty("m")&&jQuery("#updraft-insert-admin-warning").html(t.m)},{alert_on_error:!1})}function updraft_remote_storage_tabs_setup(){var t=0,e=jQuery(".updraft_servicecheckbox:checked");jQuery(e).each(function(a,r){var n=jQuery(r).val();"updraft_servicecheckbox_none"!=jQuery(r).attr("id")&&t++,jQuery(".remote-tab-"+n).show(),a==jQuery(e).length-1&&updraft_remote_storage_tab_activation(n)}),t>0&&jQuery(".updraftplusmethod.none").hide(),jQuery(document).keyup(function(t){if((32===t.keyCode||13===t.keyCode)&&jQuery(document.activeElement).is("input.labelauty + label")){var e=jQuery(document.activeElement).attr("for");e&&jQuery("#"+e).change()}}),jQuery(".updraft_servicecheckbox").change(function(){var e=jQuery(this).attr("id");if("updraft_servicecheckbox_"==e.substring(0,24)){var a=e.substring(24);null!=a&&""!=a&&(jQuery(this).is(":checked")?(t++,jQuery(".remote-tab-"+a).fadeIn(),updraft_remote_storage_tab_activation(a)):(t--,jQuery(".remote-tab-"+a).hide(),1==jQuery(".remote-tab-"+a).data("active")&&updraft_remote_storage_tab_activation(jQuery(".remote-tab:visible").last().attr("name"))))}t<=0?jQuery(".updraftplusmethod.none").fadeIn():jQuery(".updraftplusmethod.none").hide()}),jQuery(".updraft_servicecheckbox:not(.multi)").change(function(){var t=jQuery(this).attr("value");jQuery(this).is(":not(:checked)")?(jQuery(".updraftplusmethod."+t).hide(),jQuery(".updraftplusmethod.none").fadeIn()):jQuery(".updraft_servicecheckbox").not(this).prop("checked",!1)});var a=jQuery(".updraft_servicecheckbox");"function"==typeof a.labelauty&&a.labelauty()}function updraft_remote_storage_test(t,e,a){var r,n;a?(r=jQuery("#updraft-"+t+"-test-"+a),n=".updraftplusmethod."+t+"-"+a):(r=jQuery("#updraft-"+t+"-test"),n=".updraftplusmethod."+t);var o=r.data("method_label");r.html(updraftlion.testing_settings.replace("%s",o));var u={method:t};jQuery("#updraft-navtab-settings-content "+n+" input[data-updraft_settings_test], #updraft-navtab-settings-content .expertmode input[data-updraft_settings_test]").each(function(t,e){var a=jQuery(e).data("updraft_settings_test"),r=jQuery(e).attr("type");if(a){r||(console.log("UpdraftPlus: settings test input item with no type found"),console.log(e),r="text");var n=null;"checkbox"==r?n=jQuery(e).is(":checked")?1:0:"text"==r||"password"==r?n=jQuery(e).val():(console.log("UpdraftPlus: settings test input item with unrecognised type ("+r+") found"),console.log(e)),u[a]=n}}),jQuery("#updraft-navtab-settings-content "+n+" textarea[data-updraft_settings_test], #updraft-navtab-settings-content "+n+" select[data-updraft_settings_test]").each(function(t,e){var a=jQuery(e).data("updraft_settings_test");u[a]=jQuery(e).val()}),updraft_send_command("test_storage_settings",u,function(t,a){r.html(updraftlion.test_settings.replace("%s",o)),"undefined"!=typeof e&&0!=e&&(e=e.call(this,t,a,u)),"undefined"!=typeof e&&!1===e&&(alert(updraftlion.settings_test_result.replace("%s",o)+" "+t.output),t.hasOwnProperty("data")&&console.log(t.data))})}function backupnow_whichfiles_checked(t){return jQuery('#backupnow_includefiles_moreoptions input[type="checkbox"]').each(function(e){if(jQuery(this).is(":checked")){var a=jQuery(this).attr("name");if("updraft_include_"==a.substring(0,16)){var r=a.substring(16);""!=t&&(t+=","),t+=r}}}),t}function backupnow_whichtables_checked(t){var e=!1;return jQuery('#backupnow_database_moreoptions input[type="checkbox"]').each(function(t){if(!jQuery(this).is(":checked"))return void(e=!0)}),t=jQuery("input[name^='updraft_include_tables_']").serializeArray(),!e||t}function updraft_deleteallselected(){var t=0,e="",a="",r="";jQuery("#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected").each(function(n){t++;var o=jQuery(this).data("nonce");a&&(a+=","),a+=o;var u=jQuery(this).data("key");e&&(e+=","),e+=u;var d=jQuery(this).find(".updraftplus-remove").data("hasremote");r&&(r+=","),r+=d}),updraft_delete(e,a,r)}function updraft_openrestorepanel(t){updraft_console_focussed_tab=2,updraft_historytimertoggle(t),jQuery("#updraft-navtab-status-content").hide(),jQuery("#updraft-navtab-expert-content").hide(),jQuery("#updraft-navtab-settings-content").hide(),jQuery("#updraft-navtab-addons-content").hide(),jQuery("#updraft-navtab-backups-content").show(),jQuery("#updraft-navtab-backups").addClass("nav-tab-active"),jQuery("#updraft-navtab-expert").removeClass("nav-tab-active"),jQuery("#updraft-navtab-settings").removeClass("nav-tab-active"),jQuery("#updraft-navtab-status").removeClass("nav-tab-active"),jQuery("#updraft-navtab-addons").removeClass("nav-tab-active")}function updraft_delete_old_dirs(){return!0}function updraft_initiate_restore(t){jQuery("#updraft-migrate-modal").dialog("close"),jQuery('#updraft-navtab-backups-content .updraft_existing_backups button[data-backup_timestamp="'+t+'"]').click()}function updraft_restore_setoptions(t){var e=0;jQuery('input[name="updraft_restore[]"]').each(function(a,r){var n=jQuery(r).val(),o=n+"=([0-9,]+)",u=new RegExp(o),d=t.match(u);d?(jQuery(r).removeAttr("disabled").data("howmany",d[1]).parent().show(),e++,"db"==n&&(e+=4.5),jQuery(r).is(":checked")&&jQuery("#updraft_restorer_"+n+"options").show()):jQuery(r).attr("disabled","disabled").parent().hide()});var a=t.match(/dbcrypted=1/);a?jQuery(".updraft_restore_crypteddb").show():jQuery(".updraft_restore_crypteddb").hide();var r=t.match(/meta_foreign=([12])/);r?jQuery("#updraft_restore_meta_foreign").val(r[1]):jQuery("#updraft_restore_meta_foreign").val("0");var n=336+20*e;jQuery("#updraft-restore-modal").dialog("option","height",n)}function updraft_backup_dialog_open(){jQuery("#backupnow_includefiles_moreoptions").hide(),updraft_settings_form_changed?window.confirm(updraftlion.unsavedsettingsbackup)&&(jQuery("#backupnow_label").val(""),jQuery("#updraft-backupnow-modal").dialog("open")):(jQuery("#backupnow_label").val(""),jQuery("#updraft-backupnow-modal").dialog("open"))}function updraft_migrate_dialog_open(){jQuery("#updraft_migrate_modal_alt").hide(),updraft_migrate_modal_default_buttons={},updraft_migrate_modal_default_buttons[updraftlion.close]=function(){jQuery(this).dialog("close")},jQuery("#updraft-migrate-modal").dialog("option","buttons",updraft_migrate_modal_default_buttons),jQuery("#updraft-migrate-modal").dialog("open"),jQuery("#updraft_migrate_modal_main").show()}function updraft_check_page_visibility(t){"hidden"==document.visibilityState?updraft_page_is_visible=0:(updraft_page_is_visible=1,1!==t&&updraft_activejobs_update(!0))}function updraft_backupnow_inpage_go(t,e,a,r,n,o,u){r="undefined"==typeof r?0:r,n="undefined"==typeof n?0:n,o="undefined"==typeof o?0:o,u="undefined"==typeof u?updraftlion.automaticbackupbeforeupdate:u,updraft_console_focussed_tab=1,updraft_inpage_success_callback=t;var d={},s=jQuery("#updraft-backupnow-inpage-modal").length;s&&jQuery("#updraft-backupnow-inpage-modal").dialog("option","buttons",d),jQuery("#updraft_inpage_prebackup").hide(),s&&jQuery("#updraft-backupnow-inpage-modal").dialog("open"),jQuery("#updraft_inpage_backup").show(),updraft_activejobslist_backupnownonce_only=1,updraft_inpage_hasbegun=0,updraft_backupnow_go(r,n,o,e,a,u,"")}function updraft_activejobs_update(t){var e=(new Date).getTime();if(!(0==t&&e<updraft_activejobs_nextupdate)){updraft_activejobs_nextupdate=e+5500;var a="";jQuery(".ud_downloadstatus .updraftplus_downloader, #ud_downloadstatus2 .updraftplus_downloader").each(function(t,e){var r=jQuery(e).data("downloaderfor");"object"==typeof r&&(""!=a&&(a+=":"),a=a+r.base+","+r.nonce+","+r.what+","+r.index)});var r={downloaders:a};try{jQuery("#updraft-poplog").dialog("isOpen")&&(r.log_fetch=1,r.log_nonce=updraft_poplog_log_nonce,r.log_pointer=updraft_poplog_log_pointer)}catch(n){console.log(n)}updraft_activejobslist_backupnownonce_only&&"undefined"!=typeof updraft_backupnow_nonce&&""!=updraft_backupnow_nonce&&(r.thisjobonly=updraft_backupnow_nonce),updraft_send_command("activejobs_list",r,function(t){try{resp=ud_parse_json(t),resp.hasOwnProperty("l")&&(resp.l?(jQuery("#updraft_lastlogmessagerow").show(),jQuery("#updraft_lastlogcontainer").html(resp.l)):(jQuery("#updraft_lastlogmessagerow").hide(),jQuery("#updraft_lastlogcontainer").html("("+updraftlion.nothing_yet_logged+")")));var n=-1;if(jQuery("#updraft_activejobs").html(resp.j),jQuery("#updraft_activejobs .updraft_jobtimings").each(function(t,a){var r=jQuery(a);if(r.data("lastactivity")&&r.data("jobid")){var o=r.data("jobid"),u=r.data("lastactivity");(n==-1||u<n)&&(n=u);var d=r.data("nextresumptionafter"),s=r.data("nextresumption");e=(new Date).getTime(),u>50&&s>0&&d<-30&&e>updraft_last_forced_when+1e5&&(updraft_last_forced_jobid!=o||s!=updraft_last_forced_resumption)&&(updraft_last_forced_resumption=s,updraft_last_forced_jobid=o,updraft_last_forced_when=e,console.log("UpdraftPlus: force resumption: job_id="+o+", resumption="+s),updraft_send_command("forcescheduledresumption",{resumption:s,job_id:o},function(t){console.log(t)},{json_parse:!1,alert_on_error:!1}))}}),e=(new Date).getTime(),updraft_activejobs_nextupdate=e+18e4,1==updraft_page_is_visible&&(1==updraft_console_focussed_tab||2==updraft_console_focussed_tab&&""!=a)&&(updraft_activejobs_nextupdate=n>-1?n<5?e+1750:e+5e3:lastlog_lastdata==t?e+7500:e+1750),lastlog_lastdata=t,null!=resp.j&&""!=resp.j?(jQuery("#updraft_activejobsrow").show(),r.hasOwnProperty("thisjobonly")&&!updraft_inpage_hasbegun&&jQuery("#updraft-jobid-"+r.thisjobonly).length?(updraft_inpage_hasbegun=1,console.log("UpdraftPlus: the start of the requested backup job has been detected")):!updraft_inpage_hasbegun&&updraft_activejobslist_backupnownonce_only&&jQuery(".updraft_jobtimings.isautobackup").length?(autobackup_nonce=jQuery(".updraft_jobtimings.isautobackup").first().data("jobid"),autobackup_nonce&&(updraft_inpage_hasbegun=1,updraft_backupnow_nonce=autobackup_nonce,r.thisjobonly=autobackup_nonce,console.log("UpdraftPlus: the start of the requested backup job has been detected; id: "+autobackup_nonce))):1==updraft_inpage_hasbegun&&jQuery("#updraft-jobid-"+r.thisjobonly+".updraft_finished").length&&(updraft_inpage_hasbegun=2,console.log("UpdraftPlus: the end of the requested backup job has been detected"),"undefined"!=typeof updraft_inpage_success_callback&&""!=updraft_inpage_success_callback?updraft_inpage_success_callback.call(!1):jQuery("#updraft-backupnow-inpage-modal").dialog("close")),""==lastlog_jobs&&setTimeout(function(){jQuery("#updraft_backup_started").slideUp()},3500)):jQuery("#updraft_activejobsrow").is(":hidden")||("undefined"!=typeof lastbackup_laststatus&&updraft_showlastbackup(),jQuery("#updraft_activejobsrow").hide()),lastlog_jobs=resp.j,null!=resp.ds&&""!=resp.ds&&jQuery(resp.ds).each(function(e,a){""!=a.base&&updraft_downloader_status_update(a.base,a.timestamp,a.what,a.findex,a,t)}),null!=resp.u&&""!=resp.u&&jQuery("#updraft-poplog").dialog("isOpen")){var o=resp.u;if(o.nonce==updraft_poplog_log_nonce&&(updraft_poplog_log_pointer=o.pointer,null!=o.log&&""!=o.log)){var u=jQuery("#updraft-poplog").scrollTop();jQuery("#updraft-poplog-content").append(o.log),updraft_poplog_lastscroll!=u&&updraft_poplog_lastscroll!=-1||(jQuery("#updraft-poplog").scrollTop(jQuery("#updraft-poplog-content").prop("scrollHeight")),updraft_poplog_lastscroll=jQuery("#updraft-poplog").scrollTop())}}}catch(d){console.log(updraftlion.unexpectedresponse+" "+t),console.log(d)}},{json_parse:!1,type:"GET"})}}function updraft_popuplog(t){var e=updraftlion.loading_log_file;t&&(e+=" (log."+t+".txt)"),jQuery("#updraft-poplog").dialog("option","title",e),jQuery("#updraft-poplog-content").html("<em>"+e+" ...</em> "),jQuery("#updraft-poplog").dialog("open"),updraft_send_command("get_log",t,function(t){updraft_poplog_log_pointer=t.pointer,updraft_poplog_log_nonce=t.nonce;var e="?page=updraftplus&action=downloadlog&force_download=1&updraftplus_backup_nonce="+t.nonce;jQuery("#updraft-poplog-content").html(t.log);var a={};a[updraftlion.downloadlogfile]=function(){window.location.href=e},a[updraftlion.close]=function(){jQuery(this).dialog("close")},jQuery("#updraft-poplog").dialog("option","buttons",a),jQuery("#updraft-poplog").dialog("option","title","log."+t.nonce+".txt"),updraft_poplog_lastscroll=-1},{type:"GET",timeout:6e4,error_callback:function(t,e,a){var r=e==a?a:a+" ("+e+")";jQuery("#updraft-poplog-content").append(r),console.log(t)}})}function updraft_showlastbackup(){updraft_send_command("get_fragment","last_backup_html",function(t){response=t.output,lastbackup_laststatus==response?setTimeout(function(){updraft_showlastbackup()},7e3):jQuery("#updraft_last_backup").html(response),lastbackup_laststatus=response},{type:"GET"})}function updraft_historytimertoggle(t){updraft_historytimer&&1!=t?(clearTimeout(updraft_historytimer),updraft_historytimer=0):(updraft_updatehistory(0,0),updraft_historytimer=setInterval(function(){updraft_updatehistory(0,0)},3e4),calculated_diskspace||(updraftplus_diskspace(),calculated_diskspace=1))}function updraft_updatehistory(t,e){var a=Math.round((new Date).getTime()/1e3);if(1==t||1==e)updraft_historytimer_notbefore=a+30;else if(a<updraft_historytimer_notbefore)return void console.log("Update history skipped: "+a.toString()+" < "+updraft_historytimer_notbefore.toString());1==t&&(1==e?(updraft_history_lastchecksum=!1,jQuery("#updraft-navtab-backups-content .updraft_existing_backups").html('<p style="text-align:center;"><em>'+updraftlion.rescanningremote+"</em></p>")):(updraft_history_lastchecksum=!1,jQuery("#updraft-navtab-backups-content .updraft_existing_backups").html('<p style="text-align:center;"><em>'+updraftlion.rescanning+"</em></p>")));var r=e?"remotescan":!!t&&"rescan";updraft_send_command("rescan",r,function(t){if(t.hasOwnProperty("logs_exist")&&t.logs_exist&&jQuery("#updraft_lastlogmessagerow .updraft-log-link").show(),t.hasOwnProperty("migrate_modal")&&t.migrate_modal&&jQuery("#updraft_migrate_modal_main").replaceWith(t.migrate_modal),null!=t.n&&jQuery("#updraft-navtab-backups").html(t.n),null!=t.t){if(null!=t.cksum){if(t.cksum==updraft_history_lastchecksum)return;updraft_history_lastchecksum=t.cksum}jQuery("#updraft-navtab-backups-content .updraft_existing_backups").html(t.t),t.data&&console.log(t.data)}})}function updraft_intervals_monthly_or_not(t,e){var a="#updraft-navtab-settings-content #"+t,r=jQuery(a+" option").length,n="monthly"==e,o=!1;if(r>10&&(o=!0),n||o){if(n&&o)return void("monthly"==e&&(jQuery(".updraft_monthly_extra_words_"+t).remove(),jQuery(a).before('<span class="updraft_monthly_extra_words_'+t+'">'+updraftlion.day+" </span>").after('<span class="updraft_monthly_extra_words_'+t+'"> '+updraftlion.inthemonth+" </span>")));if(jQuery(".updraft_monthly_extra_words_"+t).remove(),n){updraft_interval_week_val=jQuery(a+" option:selected").val(),jQuery(a).html(updraftlion.mdayselector).before('<span class="updraft_monthly_extra_words_'+t+'">'+updraftlion.day+" </span>").after('<span class="updraft_monthly_extra_words_'+t+'"> '+updraftlion.inthemonth+" </span>");var u=updraft_interval_month_val===!1?1:updraft_interval_month_val;u-=1,jQuery(a+" option:eq("+u+")").prop("selected",!0)}else{updraft_interval_month_val=jQuery(a+" option:selected").val(),jQuery(a).html(updraftlion.dayselector);var d=updraft_interval_week_val===!1?1:updraft_interval_week_val;jQuery(a+" option:eq("+d+")").prop("selected",!0)}}}function updraft_check_same_times(){var t=0,e=jQuery("#updraft-navtab-settings-content .updraft_interval").val();"manual"==e?jQuery("#updraft-navtab-settings-content .updraft_files_timings").hide():jQuery("#updraft-navtab-settings-content .updraft_files_timings").show(),"weekly"==e||"fortnightly"==e||"monthly"==e?(updraft_intervals_monthly_or_not("updraft_startday_files",e),jQuery("#updraft-navtab-settings-content #updraft_startday_files").show()):(jQuery(".updraft_monthly_extra_words_updraft_startday_files").remove(),jQuery("#updraft-navtab-settings-content #updraft_startday_files").hide());var a=jQuery("#updraft-navtab-settings-content .updraft_interval_database").val();"manual"==a&&(t=1,jQuery("#updraft-navtab-settings-content .updraft_db_timings").hide()),"weekly"==a||"fortnightly"==a||"monthly"==a?(updraft_intervals_monthly_or_not("updraft_startday_db",a),jQuery("#updraft-navtab-settings-content #updraft_startday_db").show()):(jQuery(".updraft_monthly_extra_words_updraft_startday_db").remove(),jQuery("#updraft-navtab-settings-content #updraft_startday_db").hide()),a==e?(jQuery("#updraft-navtab-settings-content .updraft_db_timings").hide(),0==t?jQuery("#updraft-navtab-settings-content .updraft_same_schedules_message").show():jQuery("#updraft-navtab-settings-content .updraft_same_schedules_message").hide()):(jQuery("#updraft-navtab-settings-content .updraft_same_schedules_message").hide(),0==t&&jQuery("#updraft-navtab-settings-content .updraft_db_timings").show())}function updraft_activejobs_delete(t){updraft_send_command("activejobs_delete",t,function(e){"Y"==e.ok?jQuery("#updraft-jobid-"+t).html(e.m).fadeOut("slow").remove():"N"==e.ok?alert(e.m):(alert(updraftlion.unexpectedresponse),console.log(e))})}function updraftplus_diskspace_entity(t){jQuery("#updraft_diskspaceused_"+t).html("<em>"+updraftlion.calculating+"</em>"),updraft_send_command("get_fragment",{fragment:"disk_usage",data:t},function(e){jQuery("#updraft_diskspaceused_"+t).html(e.output)},{type:"GET"})}function updraft_iframe_modal(t,e){var a=780,r=500;jQuery("#updraft-iframe-modal-innards").html('<iframe width="100%" height="430px" src="'+ajaxurl+"?action=updraft_ajax&subaction="+t+"&nonce="+updraft_credentialtest_nonce+'"></iframe>'),jQuery("#updraft-iframe-modal").dialog("option","title",e).dialog("option","width",a).dialog("option","height",r).dialog("open")}function updraft_html_modal(t,e,a,r){jQuery("#updraft-iframe-modal-innards").html(t);var n={};a<450&&(n[updraftlion.close]=function(){jQuery(this).dialog("close")}),jQuery("#updraft-iframe-modal").dialog("option","title",e).dialog("option","width",a).dialog("option","height",r).dialog("option","buttons",n).dialog("open")}function updraftplus_diskspace(){jQuery("#updraft-navtab-backups-content .updraft_diskspaceused").html("<em>"+updraftlion.calculating+"</em>"),updraft_send_command("get_fragment",{fragment:"disk_usage",data:"updraft"},function(t){jQuery("#updraft-navtab-backups-content .updraft_diskspaceused").html(t.output)},{type:"GET"})}function updraftplus_deletefromserver(t,e,a){a||(a=0);var r={stage:"delete",timestamp:t,type:e,findex:a};updraft_send_command("updraft_download_backup",r,null,{action:"updraft_download_backup",nonce:updraft_download_nonce,nonce_key:"_wpnonce"})}function updraftplus_downloadstage2(t,e,a){location.href=ajaxurl+"?_wpnonce="+updraft_download_nonce+"&timestamp="+t+"&type="+e+"&stage=2&findex="+a+"&action=updraft_download_backup"}function updraftplus_show_contents(t,e,a){var r='<div id="updraft_zip_files_container" class="hidden-in-updraftcentral" style="clear:left;"><div id="updraft_zip_info_container"><p><span id="updraft_zip_path_text">'+updraftlion.zip_file_contents_info+'</span> - <span id="updraft_zip_size_text"></span></p>'+updraftlion.browse_download_link+'</div><div id="updraft_zip_files_jstree_container"><input type="search" id="zip_files_jstree_search" name="zip_files_jstree_search" placeholder="'+updraftlion.search+'"><div id="updraft_zip_files_jstree"></div></div></div>';updraft_html_modal(r,updraftlion.zip_file_contents,780,500),zip_files_jstree("zipbrowser",t,e,a)}function zip_files_jstree(t,e,a,r){jQuery("#updraft_zip_files_jstree").jstree({core:{multiple:!1,data:function(n,o){updraft_send_command("get_jstree_directory_nodes",{entity:t,node:n,timestamp:e,type:a,findex:r},function(t){t.hasOwnProperty("error")?alert(t.error):o.call(this,t.nodes)})},error:function(t){alert(t),console.log(t)}},search:{show_only_matches:!0},plugins:["search","sort"]}),jQuery("#updraft_zip_files_jstree").on("ready.jstree",function(t,e){jQuery("#updraft-iframe-modal").dialog("option","title",updraftlion.zip_file_contents+": "+e.instance.get_node("#").children[0])});var n=!1;jQuery("#zip_files_jstree_search").keyup(function(){n&&clearTimeout(n),n=setTimeout(function(){var t=jQuery("#zip_files_jstree_search").val();jQuery("#updraft_zip_files_jstree").jstree(!0).search(t)},250)}),jQuery("#updraft_zip_files_jstree").on("changed.jstree",function(t,e){jQuery("#updraft_zip_path_text").text(e.node.li_attr.path),e.node.li_attr.size?(jQuery("#updraft_zip_size_text").text(e.node.li_attr.size),jQuery("#updraft_zip_download_item").show()):(jQuery("#updraft_zip_size_text").text(""),jQuery("#updraft_zip_download_item").hide())}),jQuery("#updraft_zip_download_item").click(function(t){t.preventDefault();var n=jQuery("#updraft_zip_path_text").text();updraft_send_command("get_zipfile_download",{path:n,timestamp:e,type:a,findex:r},function(t){t.hasOwnProperty("error")?alert(t.error):t.hasOwnProperty("path")?location.href=ajaxurl+"?_wpnonce="+updraft_download_nonce+"&timestamp="+e+"&type="+a+"&stage=2&findex="+r+"&filepath="+t.path+"&action=updraft_download_backup":alert(updraftlion.download_timeout)})})}function updraft_downloader(t,e,a,r,n,o,u){"string"!=typeof n&&(n=n.toString());for(var n=n.split(","),d=0;d<n.length;d++){var s=t+e+"_"+a+"_"+n[d],i="."+s,p=parseInt(n[d]);p++;var l=0==n[d]?"":" ("+p+")";if(!jQuery(i).length){var c=o?o:e;jQuery(r).append('<div style="clear:left; border: 1px solid; padding: 8px; margin-top: 4px; max-width:840px;" class="'+s+' updraftplus_downloader"><button onclick="jQuery(this).parent().fadeOut().remove();" type="button" style="float:right; margin-bottom: 8px;">X</button><strong>'+updraftlion.download+" "+a+l+" ("+c+')</strong>:<div class="raw">'+updraftlion.begunlooking+'</div><div class="file '+s+'_st"><div class="dlfileprogress" style="width: 0;"></div></div></div>'),jQuery(i).data("downloaderfor",{base:t,nonce:e,what:a,index:n[d]}),setTimeout(function(){updraft_activejobs_update(!0)},1500)}jQuery(i).data("lasttimebegan",(new Date).getTime()),u=!!u;var f=jQuery("#updraft-navtab-backups-content .uddownloadform_"+a+"_"+e+"_"+n[d]).data("wp_nonce").toString(),_={type:a,timestamp:e,findex:n[d]},y={action:"updraft_download_backup",nonce_key:"_wpnonce",nonce:f,timeout:1e4,async:u};updraft_send_command("updraft_download_backup",_,function(t){},y)}return!1}function ud_parse_json(t){t.charAt(0),t.charAt(t.length-1);try{var e=JSON.parse(t);return e}catch(a){console.log("UpdraftPlus: Exception when trying to parse JSON (1) - will attempt to fix/re-parse"),console.log(t)}var r=t.indexOf("{"),n=t.lastIndexOf("}");if(r>-1&&n>-1){var o=t.slice(r,n+1);try{var u=JSON.parse(o);return console.log("UpdraftPlus: JSON re-parse successful"),u}catch(a){throw console.log("UpdraftPlus: Exception when trying to parse JSON (2)"),a}}throw"UpdraftPlus: could not parse the JSON"}function updraft_restorer_checkstage2(t){var e=jQuery("#ud_downloadstatus2 .file").length;return e>0?void(t&&alert(updraftlion.stilldownloading)):(jQuery("#updraft-restore-modal-stage2a").html(updraftlion.processing),void updraft_send_command("restore_alldownloaded",{timestamp:jQuery("#updraft_restore_timestamp").val(),restoreopts:jQuery("#updraft_restore_form").serialize()},function(t){var e=null;jQuery("#updraft_restorer_restore_options").val("");try{var a=ud_parse_json(t);if(null==a)return void jQuery("#updraft-restore-modal-stage2a").html(updraftlion.emptyresponse);var r=a.m;if(""!=a.w&&(r=r+"<p><strong>"+updraftlion.warnings+"</strong><br>"+a.w+"</p>"),""!=a.e?r=r+"<p><strong>"+updraftlion.errors+"</strong><br>"+a.e+"</p>":updraft_restore_stage=3,a.hasOwnProperty("i")){try{if(e=ud_parse_json(a.i),e.hasOwnProperty("addui")){console.log("Further UI options are being displayed");var n=e.addui;r+='<div id="updraft_restoreoptions_ui" style="clear:left; padding-top:10px;">'+n+"</div>","object"==typeof JSON&&"function"==typeof JSON.stringify&&(delete e.addui,a.i=JSON.stringify(e))}}catch(o){console.log(o),console.log(a)}jQuery("#updraft_restorer_backup_info").val(a.i)}else jQuery("#updraft_restorer_backup_info").val();jQuery("#updraft-restore-modal-stage2a").html(r),jQuery("#updraft-restore-modal-stage2a .updraft_select2").length>0&&jQuery("#updraft-restore-modal-stage2a .updraft_select2").select2()}catch(o){console.log(t),console.log(o),jQuery("#updraft-restore-modal-stage2a").text(updraftlion.jsonnotunderstood+" "+updraftlion.errordata+": "+t).html()}},{json_parse:!1}))}function updraft_downloader_status(t,e,a,r){}function updraft_downloader_status_update(t,e,a,r,n,o){var u=t+e+"_"+a+"_"+r,d="."+u,s=0;if(null!=n.e)jQuery(d+" .raw").html("<strong>"+updraftlion.error+"</strong> "+n.e),console.log(n);else if(null!=n.p){if(jQuery(d+"_st .dlfileprogress").width(n.p+"%"),null!=n.a&&n.a>0){var i=(new Date).getTime(),p=jQuery(d).data("lasttimebegan"),l=i-p;if(n.a>90&&l>6e4){console.log(e+" "+a+" "+r+": restarting download: file_age="+n.a+", sincelastrestart_ms="+l),jQuery(d).data("lasttimebegan",(new Date).getTime());var c=jQuery("#updraft-navtab-backups-content .uddownloadform_"+a+"_"+e+"_"+r),f={type:a,timestamp:e,findex:r},_={action:"updraft_download_backup",nonce_key:"_wpnonce",nonce:c.data("wp_nonce").toString(),timeout:1e4};updraft_send_command("updraft_download_backup",f,function(t){},_),jQuery(d).data("lasttimebegan",(new Date).getTime())}}if(null!=n.m)if(n.p>=100&&"udrestoredlstatus_"==t)jQuery(d+" .raw").html(n.m),jQuery(d).fadeOut("slow",function(){jQuery(this).remove(),updraft_restorer_checkstage2(0)});else if(n.p<100||"uddlstatus_"!=t)jQuery(d+" .raw").html(n.m);else{var y=updraftlion.fileready+" "+updraftlion.actions+': \t\t\t\t<button type="button" onclick="updraftplus_downloadstage2(\''+e+"', '"+a+"', '"+r+"')\">"+updraftlion.downloadtocomputer+'</button> \t\t\t\t<button id="uddownloaddelete_'+e+"_"+a+'" type="button" onclick="updraftplus_deletefromserver(\''+e+"', '"+a+"', '"+r+"')\">"+updraftlion.deletefromserver+"</button>";n.hasOwnProperty("can_show_contents")&&n.can_show_contents&&(y+=' <button type="button" onclick="updraftplus_show_contents(\''+e+"', '"+a+"', '"+r+"')\">"+updraftlion.browse_contents+"</button>"),jQuery(d+" .raw").html(y)}}else null!=n.m?jQuery(d+" .raw").html(n.m):(jQuery(d+" .raw").html(updraftlion.jsonnotunderstood+" ("+o+")"),s=1);return s}function updraft_backupnow_go(t,e,a,r,n,o,u){jQuery("#updraft_backup_started").html("<em>"+updraftlion.requeststart+"</em>").slideDown(""),setTimeout(function(){jQuery("#updraft_backup_started").fadeOut("slow")},75e3);var d={backupnow_nodb:t,backupnow_nofiles:e,backupnow_nocloud:a,backupnow_label:o,extradata:n};""!=r&&(d.onlythisfileentity=r),""!=u&&(d.onlythesetableentities=u),updraft_send_command("backupnow",d,function(t){jQuery("#updraft_backup_started").html(t.m),t.hasOwnProperty("nonce")&&(updraft_backupnow_nonce=t.nonce,console.log("UpdraftPlus: ID of started job: "+updraft_backupnow_nonce)),setTimeout(function(){updraft_activejobs_update(!0)},500)})}var onlythesefileentities=backupnow_whichfiles_checked("");""==onlythesefileentities?jQuery("#backupnow_includefiles_moreoptions").show():jQuery("#backupnow_includefiles_moreoptions").hide();var updraft_restore_stage=1,lastlog_lastmessage="",lastlog_lastdata="",lastlog_jobs="",updraft_activejobs_nextupdate=(new Date).getTime()+1e3,updraft_page_is_visible=1,updraft_console_focussed_tab=1,updraft_settings_form_changed=!1;window.onbeforeunload=function(t){if(updraft_settings_form_changed)return updraftlion.unsavedsettings},"undefined"!=typeof document.hidden&&document.addEventListener("visibilitychange",function(){updraft_check_page_visibility(0)},!1),updraft_check_page_visibility(1);var updraft_poplog_log_nonce,updraft_poplog_log_pointer=0,updraft_poplog_lastscroll=-1,updraft_last_forced_jobid=-1,updraft_last_forced_resumption=-1,updraft_last_forced_when=-1,updraft_backupnow_nonce="",updraft_activejobslist_backupnownonce_only=0,updraft_inpage_hasbegun=0,updraft_historytimer=0,calculated_diskspace=0,updraft_historytimer_notbefore=0,updraft_history_lastchecksum=!1,updraft_interval_week_val=!1,updraft_interval_month_val=!1;"undefined"!=typeof updraft_siteurl&&setInterval(function(){jQuery.get(updraft_siteurl+"/wp-cron.php")},21e4);var lastlog_lastmessage="";jQuery(document).ajaxError(function(t,e,a,r){if(null!=r&&""!=r&&null!=e.responseText&&""!=e.responseText&&(console.log("Error caught by UpdraftPlus ajaxError handler (follows) for "+a.url),console.log(r),0==a.url.search(ajaxurl)))if(a.url.search("subaction=downloadstatus")>=0){var n=a.url.match(/timestamp=\d+/),o=a.url.match(/type=[a-z]+/),u=a.url.match(/findex=\d+/),d=a.url.match(/base=[a-z_]+/);if(u=u instanceof Array?parseInt(u[0].substr(7)):0,o=o instanceof Array?o[0].substr(5):"",d=d instanceof Array?d[0].substr(5):"",n=n instanceof Array?parseInt(n[0].substr(10)):0,""!=d&&""!=o&&n>0){var s=d+n+"_"+o+"_"+u;jQuery("."+s+" .raw").html("<strong>"+updraftlion.error+"</strong> "+updraftlion.servererrorcode)}}else a.url.search("subaction=restore_alldownloaded")>=0&&jQuery("#updraft-restore-modal-stage2a").append("<br><strong>"+updraftlion.error+"</strong> "+updraftlion.servererrorcode+": "+r)}),jQuery(document).ready(function(t){function e(e){t('.expertmode .advanced_settings_container .advanced_tools:not(".'+e+'")').hide(),t(".expertmode .advanced_settings_container .advanced_tools."+e).fadeIn("slow"),t(".expertmode .advanced_settings_container .advanced_tools_button:not(#"+e+")").removeClass("active"),t(".expertmode .advanced_settings_container .advanced_tools_button#"+e).addClass("active")}function a(t){var e=!!jQuery("#updraftcentral_mothership_other").is(":checked");e?(jQuery("#updraftcentral_keycreate_mothership").prop("disabled",!1),t?jQuery("#updraftcentral_keycreate_mothership_firewalled_container").show():(jQuery(".updraftcentral_wizard_self_hosted_stage2").show(),jQuery("#updraftcentral_keycreate_mothership_firewalled_container").slideDown(),jQuery("#updraftcentral_keycreate_mothership").focus())):(jQuery("#updraftcentral_keycreate_mothership").prop("disabled",!0),t||(jQuery(".updraftcentral_wizard_self_hosted_stage2").hide(),r()))}function r(){jQuery("#updraftcentral_wizard_stage1_error").text("");
2
+ var t="";if(jQuery("#updraftcentral_mothership_updraftpluscom").is(":checked"))jQuery(".updraftcentral_keycreate_description").hide(),t="updraftplus.com";else if(jQuery("#updraftcentral_mothership_other").is(":checked")){jQuery(".updraftcentral_keycreate_description").show();var e=jQuery("#updraftcentral_keycreate_mothership").val();if(""==e)return void jQuery("#updraftcentral_wizard_stage1_error").text(updraftlion.updraftcentral_wizard_empty_url);try{var a=new URL(e);t=a.hostname}catch(r){if("undefined"==typeof URL&&(t=jQuery("<a>").prop("href",e).prop("hostname")),!t||"undefined"!=typeof URL)return void jQuery("#updraftcentral_wizard_stage1_error").text(updraftlion.updraftcentral_wizard_invalid_url)}}jQuery("#updraftcentral_keycreate_description").val(t),jQuery(".updraftcentral_wizard_stage1").hide(),jQuery(".updraftcentral_wizard_stage2").show()}function n(e,a,r,o){jQuery("#updraft-delete-waitwarning").slideDown();var u=e,d=a,s=r,i=o,p=jQuery("#updraft_delete_timestamp").val().split(","),l=jQuery("#updraft_delete_form").serializeArray(),c={};t.each(l,function(){void 0!==c[this.name]?(c[this.name].push||(c[this.name]=[c[this.name]]),c[this.name].push(this.value||"")):c[this.name]=this.value||""}),c.remote_delete_limit=updraftlion.remote_delete_limit,delete c.action,delete c.subaction,delete c.nonce,updraft_send_command("deleteset",c,function(t){if(t.hasOwnProperty("result")&&null!=t.result)if("error"==t.result)alert(updraftlion.error+" "+t.message);else if("continue"==t.result)u=u+t.backup_local+t.backup_remote,d+=t.backup_local,s+=t.backup_remote,i+=t.backup_sets,jQuery("#updraft-deleted-files-total").text(u+" "+updraftlion.remote_files_deleted),n(u,d,s,i);else if("success"==t.result){jQuery("#updraft-deleted-files-total").text(""),jQuery("#updraft-delete-waitwarning").slideUp(),t.hasOwnProperty("count_backups")&&jQuery("#updraft-navtab-backups").html(updraftlion.existing_backups+" ("+t.count_backups+")");for(var e=0;e<p.length;e++){var a=p[e];jQuery("#updraft-navtab-backups-content .updraft_existing_backups_row_"+a).slideUp().remove()}jQuery("#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected").length<1&&jQuery("#ud_massactions").hide(),updraft_history_lastchecksum=!1,jQuery("#updraft-delete-modal").dialog("close"),d+=t.backup_local,s+=t.backup_remote,i+=t.backup_sets,alert(t.set_message+" "+i+"\n"+t.local_message+" "+d+"\n"+t.remote_message+" "+s)}})}function o(t,e){jQuery("#updraft-navtab-settings-content #updraft_include_"+t).is(":checked")?e?jQuery("#updraft-navtab-settings-content #updraft_include_"+t+"_exclude").show():jQuery("#updraft-navtab-settings-content #updraft_include_"+t+"_exclude").slideDown():e?jQuery("#updraft-navtab-settings-content #updraft_include_"+t+"_exclude").hide():jQuery("#updraft-navtab-settings-content #updraft_include_"+t+"_exclude").slideUp()}function u(){var t=new plupload.Uploader(updraft_plupload_config);t.bind("Init",function(t){var e=jQuery("#plupload-upload-ui");t.features.dragdrop?(e.addClass("drag-drop"),jQuery("#drag-drop-area").bind("dragover.wp-uploader",function(){e.addClass("drag-over")}).bind("dragleave.wp-uploader, drop.wp-uploader",function(){e.removeClass("drag-over")})):(e.removeClass("drag-drop"),jQuery("#drag-drop-area").unbind(".wp-uploader"))}),t.init(),t.bind("FilesAdded",function(e,a){plupload.each(a,function(e){if(!/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-[\-a-z]+([0-9]+?)?(\.(zip|gz|gz\.crypt))?$/i.test(e.name)&&!/^log\.([0-9a-f]{12})\.txt$/.test(e.name)){for(var a=!1,r=0;r<updraft_accept_archivename.length;r++)if(updraft_accept_archivename[r].test(e.name))var a=!0;if(!a)return/\.(zip|tar|tar\.gz|tar\.bz2)$/i.test(e.name)||/\.sql(\.gz)?$/i.test(e.name)?(jQuery("#updraft-message-modal-innards").html("<p><strong>"+e.name+"</strong></p> "+updraftlion.notarchive2),jQuery("#updraft-message-modal").dialog("open")):alert(e.name+": "+updraftlion.notarchive),void t.removeFile(e)}jQuery("#filelist").append('<div class="file" id="'+e.id+'"><b>'+e.name+"</b> (<span>"+plupload.formatSize(0)+"</span>/"+plupload.formatSize(e.size)+') <div class="fileprogress"></div></div>')}),e.refresh(),e.start()}),t.bind("UploadProgress",function(t,e){jQuery("#"+e.id+" .fileprogress").width(e.percent+"%"),jQuery("#"+e.id+" span").html(plupload.formatSize(parseInt(e.size*e.percent/100))),e.size==e.loaded&&(jQuery("#"+e.id).html('<div class="file" id="'+e.id+'"><b>'+e.name+"</b> (<span>"+plupload.formatSize(parseInt(e.size*e.percent/100))+"</span>/"+plupload.formatSize(e.size)+") - "+updraftlion.complete+"</div>"),jQuery("#"+e.id+" .fileprogress").width(e.percent+"%"))}),t.bind("Error",function(t,e){console.log(e);var a;a="-200"==e.code?"\n"+updraftlion.makesure2:updraftlion.makesure;var r=updraftlion.uploaderr+" (code "+e.code+") : "+e.message;e.hasOwnProperty("status")&&e.status&&(r+=" ("+updraftlion.http_code+" "+e.status+")"),e.hasOwnProperty("response")&&(console.log("UpdraftPlus: plupload error: "+e.response),e.response.length<100&&(r+=" "+updraftlion.error+" "+e.response+"\n")),r+=" "+a,alert(r)}),t.bind("FileUploaded",function(t,e,a){if("200"==a.status)try{resp=ud_parse_json(a.response),resp.e?alert(updraftlion.uploaderror+" "+resp.e):resp.dm?(alert(resp.dm),updraft_updatehistory(1,0)):resp.m?updraft_updatehistory(1,0):alert("Unknown server response: "+a.response)}catch(r){console.log(a),alert(updraftlion.jsonnotunderstood)}else alert("Unknown server response status: "+a.code),console.log(a)})}function d(t){params={uri:jQuery("#updraftplus_httpget_uri").val()},params.curl=t,updraft_send_command("httpget",params,function(t){t.e&&alert(t.e),t.r?jQuery("#updraftplus_httpget_results").html("<pre>"+t.r+"</pre>"):console.log(t)},{type:"GET"})}function s(t,e,a){updraft_restore_setoptions(t),jQuery("#updraft_restore_timestamp").val(e),jQuery(".updraft_restore_date").html(a),updraft_restore_stage=1,jQuery("#updraft-migrate-modal").dialog("close"),jQuery("#updraft-restore-modal").dialog("open"),jQuery("#updraft-restore-modal-stage1").show(),jQuery("#updraft-restore-modal-stage2").hide(),jQuery("#updraft-restore-modal-stage2a").html(""),updraft_activejobs_update(!0)}function i(t){t=t.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var e="[\\?&]"+t+"=([^&#]*)",a=new RegExp(e),r=a.exec(window.location.href);return null==r?"":decodeURIComponent(r[1].replace(/\+/g," "))}if(t(".expertmode .advanced_settings_container .advanced_tools_button").click(function(){e(t(this).attr("id"))}),jQuery.ui&&jQuery.ui.dialog&&jQuery.ui.dialog.prototype._allowInteraction){var p=jQuery.ui.dialog.prototype._allowInteraction;jQuery.ui.dialog.prototype._allowInteraction=function(t){return!!jQuery(t.target).closest(".select2-dropdown").length||p.apply(this,arguments)}}t("#updraftcentral_keys").on("click","a.updraftcentral_keys_show",function(e){e.preventDefault(),t(this).remove(),t("#updraftcentral_keys_table").slideDown()}),t("#updraftcentral_keycreate_altmethod_moreinfo_get").click(function(e){e.preventDefault(),t(this).remove(),t("#updraftcentral_keycreate_altmethod_moreinfo").slideDown()}),t(".updraft_webdav_settings").on("change keyup paste",function(){var e=[],a="";t(".updraft_webdav_settings").each(function(r,n){var o=t(n).attr("id");if(o&&"updraft_webdav_"==o.substring(0,15)){var u=o.substring(15);id_split=u.split("_"),u=id_split[0],a=id_split[1],e[u]=this.value}});var r="",n="@",o="/",u=":",d=":";(e.host.indexOf("@")>=0||""===e.host)&&(n=""),e.host.indexOf("/")>=0?t("#updraft_webdav_host_error").show():t("#updraft_webdav_host_error").hide(),0!=e.path.indexOf("/")&&""!==e.path||(o=""),""!==e.user&&""!==e.pass||(u=""),""!==e.host&&""!==e.port||(d=""),r=e.webdav+e.user+u+e.pass+n+encodeURIComponent(e.host)+d+e.port+o+e.path,t("#updraft_webdav_url_"+a).val(r)}),t("#updraft-navtab-backups-content").on("click",".updraft_existing_backups .updraft_existing_backups_row",function(e){(e.ctrlKey||e.metaKey)&&(t(this).toggleClass("backuprowselected"),t("#updraft-navtab-backups-content .updraft_existing_backups .updraft_existing_backups_row.backuprowselected").length>0?t("#ud_massactions").show():t("#ud_massactions").hide())}),jQuery("#updraft-navtab-settings-content .updraftplusmethod").on("click","button.updraft-test-button",function(){var t=jQuery(this).data("method"),e=jQuery(this).data("instance_id");updraft_remote_storage_test(t,function(e,a,r){return"sftp"==t&&(r.hasOwnProperty("scp")&&r.scp?alert(updraftlion.settings_test_result.replace("%s","SCP")+" "+e.output):alert(updraftlion.settings_test_result.replace("%s","SFTP")+" "+e.output),e.hasOwnProperty("data")&&console.log(e.data),!0)},e)}),t("#updraft-navtab-settings-content select.updraft_interval, #updraft-navtab-settings-content select.updraft_interval_database").change(function(){updraft_check_same_times()}),t("#backupnow_includefiles_showmoreoptions").click(function(e){e.preventDefault(),t("#backupnow_includefiles_moreoptions").toggle()}),t("#backupnow_database_showmoreoptions").click(function(e){e.preventDefault(),t("#backupnow_database_moreoptions").toggle()}),t("#updraft-navtab-backups-content a.updraft_diskspaceused_update").click(function(t){t.preventDefault(),updraftplus_diskspace()}),t("#updraft-navtab-backups-content a.updraft_uploader_toggle").click(function(e){e.preventDefault(),t("#updraft-plupload-modal").slideToggle()}),t("#updraft-navtab-backups-content a.updraft_rescan_local").click(function(t){t.preventDefault(),updraft_updatehistory(1,0)}),t("#updraft-navtab-backups-content a.updraft_rescan_remote").click(function(t){t.preventDefault(),updraft_updatehistory(1,1)}),jQuery("#updraftcentral_keys").on("click",'input[type="radio"]',function(){a(!1)}),a(!0),jQuery("#updraftcentral_keys").on("click","#updraftcentral_view_log",function(t){t.preventDefault(),jQuery("#updraftcentral_view_log_container").block({message:'<div style="margin: 8px; font-size:150%;"><img src="'+updraftlion.ud_url+'/images/udlogo-rotating.gif" height="80" width="80" style="padding-bottom:10px;"><br>'+updraftlion.fetching+"</div>"});try{updraft_send_command("updraftcentral_get_log",null,function(t){jQuery("#updraftcentral_view_log_container").unblock(),t.hasOwnProperty("log_contents")?jQuery("#updraftcentral_view_log_contents").html('<div style="border:1px solid;padding: 2px;max-height: 400px; overflow-y:scroll;">'+t.log_contents+"</div>"):console.response(resp)})}catch(e){jQuery("#updraft_central_key").html(),console.log(e)}}),jQuery("#updraftcentral_keys").on("click","#updraftcentral_wizard_go",function(t){jQuery("#updraftcentral_wizard_go").hide(),jQuery(".updraftcentral_wizard_success").remove(),jQuery(".create_key_container").show()}),jQuery("#updraftcentral_keys").on("click","#updraftcentral_stage1_go",function(t){t.preventDefault(),jQuery(".updraftcentral_wizard_stage2").hide(),jQuery(".updraftcentral_wizard_stage1").show()}),jQuery("#updraftcentral_keys").on("click","#updraftcentral_stage2_go",function(t){t.preventDefault(),r()}),jQuery("#updraftcentral_keys").on("click","#updraftcentral_keycreate_go",function(t){t.preventDefault();var e=!!jQuery("#updraftcentral_mothership_other").is(":checked"),a=jQuery("#updraftcentral_keycreate_description").val(),r=jQuery("#updraftcentral_keycreate_keysize").val(),n="__updraftpluscom";if(data={key_description:a,key_size:r},e&&(n=jQuery("#updraftcentral_keycreate_mothership").val(),"http"!=n.substring(0,4)))return void alert(updraftlion.enter_mothership_url);data.mothership_firewalled=jQuery("#updraftcentral_keycreate_mothership_firewalled").is(":checked")?1:0,data.where_send=n,jQuery(".create_key_container").hide(),jQuery(".updraftcentral_wizard_stage1").show(),jQuery(".updraftcentral_wizard_stage2").hide(),jQuery("#updraftcentral_keys").block({message:'<div style="margin: 8px; font-size:150%;"><img src="'+updraftlion.ud_url+'/images/udlogo-rotating.gif" height="80" width="80" style="padding-bottom:10px;"><br>'+updraftlion.creating_please_allow+"</div>"});try{updraft_send_command("updraftcentral_create_key",data,function(t){jQuery("#updraftcentral_keys").unblock();try{if(resp=ud_parse_json(t),resp.hasOwnProperty("error"))return alert(resp.error),void console.log(resp);alert(resp.r),resp.hasOwnProperty("bundle")&&resp.hasOwnProperty("keys_guide")?(jQuery("#updraftcentral_keys_content").html(resp.keys_guide),jQuery("#updraftcentral_keys_content").append('<div class="updraftcentral_wizard_success">'+resp.r+'<br><textarea onclick="this.select();" style="width:620px; height:165px; word-wrap:break-word; border: 1px solid #aaa; border-radius: 3px; padding:4px;">'+resp.bundle+"</textarea></div>")):console.log(resp),resp.hasOwnProperty("keys_table")&&jQuery("#updraftcentral_keys_content").append(resp.keys_table),jQuery("#updraftcentral_wizard_go").show()}catch(e){alert(updraftlion.unexpectedresponse+" "+t),console.log(e)}},{json_parse:!1})}catch(o){jQuery("#updraft_central_key").html(),console.log(o)}}),jQuery("#updraftcentral_keys").on("click",".updraftcentral_key_delete",function(t){t.preventDefault();var e=jQuery(this).data("key_id");return"undefined"==typeof e?void console.log("UpdraftPlus: .updraftcentral_key_delete clicked, but no key ID found"):(jQuery("#updraftcentral_keys").block({message:'<div style="margin: 8px; font-size:150%;"><img src="'+updraftlion.ud_url+'/images/udlogo-rotating.gif" height="80" width="80" style="padding-bottom:10px;"><br>'+updraftlion.deleting+"</div>"}),void updraft_send_command("updraftcentral_delete_key",{key_id:e},function(t){jQuery("#updraftcentral_keys").unblock(),t.hasOwnProperty("keys_table")&&jQuery("#updraftcentral_keys_content").html(t.keys_table)}))}),jQuery("#updraft_reset_sid").click(function(t){t.preventDefault(),updraft_send_command("reset_site_id",null,function(t){jQuery("#updraft_show_sid").html(t)},{json_parse:!1})}),jQuery("#updraft-navtab-settings-content form input:not('.udignorechange'), #updraft-navtab-settings-content form select").change(function(t){updraft_settings_form_changed=!0}),jQuery("#updraft-navtab-settings-content form input[type='submit']").click(function(t){updraft_settings_form_changed=!1});var l=180;jQuery(".updraft-bigbutton").each(function(t,e){var a=jQuery(e).width();a>l&&(l=a)}),l>180&&jQuery(".updraft-bigbutton").width(l),setInterval(function(){updraft_activejobs_update(!1)},1250),setTimeout(function(){jQuery("#setting-error-settings_updated").slideUp()},5e3),jQuery(".updraftplusmethod").hide(),jQuery("#updraft_restore_db").change(function(){jQuery("#updraft_restore_db").is(":checked")?jQuery("#updraft_restorer_dboptions").slideDown():jQuery("#updraft_restorer_dboptions").slideUp()}),updraft_check_same_times();var c={};c[updraftlion.close]=function(){jQuery(this).dialog("close")},jQuery("#updraft-message-modal").dialog({autoOpen:!1,height:350,width:520,modal:!0,buttons:c});var f={};f[updraftlion.deletebutton]=function(){n(0,0,0,0)},f[updraftlion.cancel]=function(){jQuery(this).dialog("close")},jQuery("#updraft-delete-modal").dialog({autoOpen:!1,height:262,width:430,modal:!0,buttons:f});var _={};_[updraftlion.restore]=function(){var t=0,e=[],a=0,r=jQuery("#updraft_restore_meta_foreign").val();if(jQuery('input[name="updraft_restore[]"]').each(function(n,o){if(jQuery(o).is(":checked")&&!jQuery(o).is(":disabled")){t=1;var u=jQuery(o).data("howmany"),d=jQuery(o).val();if((1==r||2==r&&"db"!=d)&&("wpcore"!=d&&(u=jQuery("#updraft_restore_form #updraft_restore_wpcore").data("howmany")),d="wpcore"),"wpcore"!=d||0==a){var s=[d,u];e.push(s),"wpcore"==d&&(a=1)}}}),1==t){if(1==updraft_restore_stage){jQuery("#updraft-restore-modal-stage1").slideUp("slow"),jQuery("#updraft-restore-modal-stage2").show(),updraft_restore_stage=2;var n=jQuery(".updraft_restore_date").first().text(),o=e,u=jQuery("#updraft_restore_timestamp").val();try{updraft_send_command("whichdownloadsneeded",{downloads:e,timestamp:u},function(t){if(t.hasOwnProperty("downloads")&&(console.log("UpdraftPlus: items which still require downloading follow"),o=t.downloads,console.log(o)),0==o.length)updraft_restorer_checkstage2(0);else for(var e=0;e<o.length;e++)updraft_downloader("udrestoredlstatus_",u,o[e][0],"#ud_downloadstatus2",o[e][1],n,!1)},{alert_on_error:!1})}catch(d){console.log("UpdraftPlus: error (follows) when looking for items needing downloading"),console.log(d),alert(updraftlion.jsonnotunderstood)}}else if(2==updraft_restore_stage)updraft_restorer_checkstage2(1);else if(3==updraft_restore_stage){var s=1;if(jQuery("#updraft_restoreoptions_ui input.required").each(function(t){if(0!=s){var e=jQuery(this).val();if(""==e)alert(updraftlion.pleasefillinrequired),s=0;else if(""!=jQuery(this).attr("pattern")){var a=jQuery(this).attr("pattern"),r=new RegExp(a,"g");r.test(e)||(alert(jQuery(this).data("invalidpattern")),s=0)}}}),!s)return;var i=jQuery("#updraft_restoreoptions_ui select, #updraft_restoreoptions_ui input").serialize();console.log("Restore options: "+i),jQuery("#updraft_restorer_restore_options").val(i),jQuery("#updraft-restore-modal-stage2a").html(updraftlion.restore_proceeding),jQuery("#updraft_restore_form").submit(),updraft_restore_stage=4}}else alert(updraftlion.youdidnotselectany)},_[updraftlion.cancel]=function(){jQuery(this).dialog("close")},jQuery("#updraft-restore-modal").dialog({autoOpen:!1,height:505,width:590,modal:!0,buttons:_}),jQuery("#updraft-iframe-modal").dialog({autoOpen:!1,height:500,width:780,modal:!0}),jQuery("#updraft-backupnow-inpage-modal").dialog({autoOpen:!1,height:345,width:580,modal:!0});var y={};y[updraftlion.backupnow]=function(){var t=jQuery("#backupnow_includedb").is(":checked")?0:1,e=jQuery("#backupnow_includefiles").is(":checked")?0:1,a=jQuery("#backupnow_includecloud").is(":checked")?0:1,r=backupnow_whichtables_checked("");if(""==r&&0==t)return alert(updraftlion.notableschosen),void jQuery("#backupnow_includefiles_moreoptions").show();"boolean"==typeof r&&(r=null);var n=backupnow_whichfiles_checked("");return""==n&&0==e?(alert(updraftlion.nofileschosen),void jQuery("#backupnow_includefiles_moreoptions").show()):t&&e?void alert(updraftlion.excludedeverything):(jQuery(this).dialog("close"),setTimeout(function(){jQuery("#updraft_lastlogmessagerow").fadeOut("slow",function(){jQuery(this).fadeIn("slow")})},1700),void updraft_backupnow_go(t,e,a,n,"",jQuery("#backupnow_label").val(),r))},y[updraftlion.cancel]=function(){jQuery(this).dialog("close")},jQuery("#updraft-backupnow-modal").dialog({autoOpen:!1,height:472,width:610,modal:!0,buttons:y}),jQuery("#updraft-migrate-modal").dialog({autoOpen:!1,height:updraftlion.migratemodalheight,width:updraftlion.migratemodalwidth,modal:!0}),jQuery("#updraft-poplog").dialog({autoOpen:!1,height:600,width:"75%",modal:!0}),jQuery("#updraft-navtab-settings-content .enableexpertmode").click(function(){return jQuery("#updraft-navtab-settings-content .expertmode").fadeIn(),jQuery("#updraft-navtab-settings-content .enableexpertmode").off("click"),!1}),jQuery("#updraft-navtab-settings-content .backupdirrow").on("click","a.updraft_backup_dir_reset",function(){return jQuery("#updraft_dir").val("updraft"),!1}),jQuery("#updraft-navtab-settings-content .updraft_include_entity").click(function(){var t=jQuery(this).data("toggle_exclude_field");t&&o(t,!1)}),jQuery("#updraft-navtab-settings-content .updraft-service").change(function(){var t=jQuery(this).val();jQuery("#updraft-navtab-settings-content .updraftplusmethod").hide(),jQuery("#updraft-navtab-settings-content ."+t).show()}),jQuery("#updraft-navtab-settings-content a.updraft_show_decryption_widget").click(function(t){t.preventDefault(),jQuery("#updraftplus_db_decrypt").val(jQuery("#updraft_encryptionphrase").val()),jQuery("#updraft-manualdecrypt-modal").slideToggle()}),jQuery("#updraftplus-phpinfo").click(function(t){t.preventDefault(),updraft_iframe_modal("phpinfo",updraftlion.phpinfo)}),jQuery("#updraftplus-rawbackuphistory").click(function(t){t.preventDefault(),updraft_iframe_modal("rawbackuphistory",updraftlion.raw)}),jQuery("#updraft-navtab-status").click(function(t){t.preventDefault(),jQuery(this).addClass("nav-tab-active"),jQuery("#updraft-navtab-expert-content").hide(),jQuery("#updraft-navtab-settings-content").hide(),jQuery("#updraft-navtab-backups-content").hide(),jQuery("#updraft-navtab-addons-content").hide(),jQuery("#updraft-navtab-status-content").show(),jQuery("#updraft-navtab-expert").removeClass("nav-tab-active"),jQuery("#updraft-navtab-backups").removeClass("nav-tab-active"),jQuery("#updraft-navtab-settings").removeClass("nav-tab-active"),jQuery("#updraft-navtab-addons").removeClass("nav-tab-active"),updraft_page_is_visible=1,updraft_console_focussed_tab=1,updraft_activejobs_update(!0)}),jQuery("#updraft-navtab-expert").click(function(t){t.preventDefault(),jQuery(this).addClass("nav-tab-active"),jQuery("#updraft-navtab-settings-content").hide(),jQuery("#updraft-navtab-status-content").hide(),jQuery("#updraft-navtab-backups-content").hide(),jQuery("#updraft-navtab-addons-content").hide(),jQuery("#updraft-navtab-expert-content").show(),jQuery("#updraft-navtab-status").removeClass("nav-tab-active"),jQuery("#updraft-navtab-backups").removeClass("nav-tab-active"),jQuery("#updraft-navtab-settings").removeClass("nav-tab-active"),jQuery("#updraft-navtab-addons").removeClass("nav-tab-active"),updraft_page_is_visible=1,updraft_console_focussed_tab=4}),jQuery("#updraft-navtab-settings, #updraft-navtab-settings2, #updraft_backupnow_gotosettings").click(function(t){t.preventDefault(),jQuery(this).parents(".updraftmessage").remove(),jQuery("#updraft-backupnow-modal").dialog("close"),jQuery("#updraft-navtab-status-content").hide(),jQuery("#updraft-navtab-backups-content").hide(),jQuery("#updraft-navtab-expert-content").hide(),jQuery("#updraft-navtab-addons-content").hide(),jQuery("#updraft-navtab-settings-content").show(),jQuery("#updraft-navtab-settings").addClass("nav-tab-active"),jQuery("#updraft-navtab-expert").removeClass("nav-tab-active"),jQuery("#updraft-navtab-backups").removeClass("nav-tab-active"),jQuery("#updraft-navtab-status").removeClass("nav-tab-active"),jQuery("#updraft-navtab-addons").removeClass("nav-tab-active"),updraft_page_is_visible=1,updraft_console_focussed_tab=3}),jQuery("#updraft-navtab-addons").click(function(t){t.preventDefault(),jQuery(this).addClass("b#nav-tab-active"),jQuery("#updraft-navtab-status-content").hide(),jQuery("#updraft-navtab-backups-content").hide(),jQuery("#updraft-navtab-expert-content").hide(),jQuery("#updraft-navtab-settings-content").hide(),jQuery("#updraft-navtab-addons-content").show(),jQuery("#updraft-navtab-addons").addClass("nav-tab-active"),jQuery("#updraft-navtab-expert").removeClass("nav-tab-active"),jQuery("#updraft-navtab-backups").removeClass("nav-tab-active"),jQuery("#updraft-navtab-status").removeClass("nav-tab-active"),jQuery("#updraft-navtab-settings").removeClass("nav-tab-active"),updraft_page_is_visible=1,updraft_console_focussed_tab=5}),jQuery("#updraft-navtab-backups").click(function(t){t.preventDefault(),updraft_openrestorepanel(1)}),updraft_send_command("ping",null,function(t,e){"success"==e&&"pong"!=t&&t.indexOf("pong")>=0&&(jQuery("#updraft-navtab-backups-content .ud-whitespace-warning").show(),console.log("UpdraftPlus: Extra output warning: response (which should be just (string)'pong') follows."),console.log(t))},{json_parse:!1,type:"GET"});try{"undefined"!=typeof updraft_plupload_config&&u()}catch(g){console.log(g)}if(jQuery("#updraftplus_httpget_go").click(function(t){t.preventDefault(),d(0)}),jQuery("#updraftplus_httpget_gocurl").click(function(t){t.preventDefault(),d(1)}),jQuery("#updraftplus_callwpaction_go").click(function(t){t.preventDefault(),params={wpaction:jQuery("#updraftplus_callwpaction").val()},updraft_send_command("call_wordpress_action",params,function(t){t.e?alert(t.e):t.s||(t.r?jQuery("#updraftplus_callwpaction_results").html(t.r):(console.log(t),alert(updraftlion.jsonnotunderstood)))})}),jQuery("#updraft_activejobs_table").on("click",".updraft_jobinfo_delete",function(t){t.preventDefault();var e=jQuery(this).data("jobid");e?updraft_activejobs_delete(e):console.log("UpdraftPlus: A stop job link was clicked, but the Job ID could not be found")}),jQuery("#updraft_activejobs_table, #updraft-navtab-backups-content .updraft_existing_backups, #updraft-backupnow-inpage-modal").on("click",".updraft-log-link",function(t){t.preventDefault();var e=jQuery(this).data("jobid");e?updraft_popuplog(e):console.log("UpdraftPlus: A log link was clicked, but the Job ID could not be found")}),jQuery("#updraft-navtab-backups-content .updraft_existing_backups").on("click","button.choose-components-button",function(t){var e=jQuery(this).data("entities"),a=jQuery(this).data("backup_timestamp"),r=jQuery(this).data("showdata");s(e,a,r)}),"initiate_restore"==i("udaction")){var h=i("entities"),m=i("backup_timestamp"),v=i("showdata");s(h,m,v)}jQuery("#updraft-navtab-backups-content .updraft_existing_backups").on("click",".updraft-delete-link",function(t){t.preventDefault();var e=jQuery(this).data("hasremote"),a=jQuery(this).data("nonce").toString(),r=jQuery(this).data("key").toString();a?updraft_delete(r,a,e):console.log("UpdraftPlus: A delete link was clicked, but the Job ID could not be found")}),jQuery("#updraft-navtab-backups-content .updraft_existing_backups").on("click","button.updraft_download_button",function(t){t.preventDefault();var e="uddlstatus_",a=jQuery(this).data("backup_timestamp"),r=jQuery(this).data("what"),n=".ud_downloadstatus",o=jQuery(this).data("set_contents"),u=jQuery(this).data("prettydate"),d=!0;updraft_downloader(e,a,r,n,o,u,d)}),jQuery("#updraft-navtab-backups-content .updraft_existing_backups").on("dblclick",".updraft_existingbackup_date",function(t){t.preventDefault();var e=jQuery(this).data("rawbackup");null!=e&&""!=e&&updraft_html_modal(e,updraftlion.raw,780,500)})}),jQuery(document).ready(function(t){var e="#updraft-navtab-settings-content ";t(e+"#updraftvault_settings_cell").on("click",".updraftvault_backtostart",function(a){a.preventDefault(),t(e+"#updraftvault_settings_showoptions").slideUp(),t(e+"#updraftvault_settings_connect").slideUp(),t(e+"#updraftvault_settings_connected").slideUp(),t(e+"#updraftvault_settings_default").slideDown()}),t(e+"#updraftvault_settings_connect input").keypress(function(a){if(13==a.which)return t(e+"#updraftvault_connect_go").click(),!1}),t(e+"#updraftvault_settings_cell").on("click","#updraftvault_recountquota",function(a){a.preventDefault(),t(e+"#updraftvault_recountquota").html(updraftlion.counting);try{updraft_send_command("vault_recountquota",{instance_id:t("#updraftvault_settings_connect").data("instance_id")},function(a){t(e+"#updraftvault_recountquota").html(updraftlion.updatequotacount),a.hasOwnProperty("html")&&(t(e+"#updraftvault_settings_connected").html(a.html),a.hasOwnProperty("connected")&&(a.connected?(t(e+"#updraftvault_settings_default").hide(),t(e+"#updraftvault_settings_connected").show()):(t(e+"#updraftvault_settings_connected").hide(),t(e+"#updraftvault_settings_default").show())))})}catch(r){t(e+"#updraftvault_recountquota").html(updraftlion.updatequotacount),console.log(r)}}),t(e+"#updraftvault_settings_cell").on("click","#updraftvault_disconnect",function(a){a.preventDefault(),t(e+"#updraftvault_disconnect").html(updraftlion.disconnecting);try{updraft_send_command("vault_disconnect",{immediate_echo:!0,instance_id:t("#updraftvault_settings_connect").data("instance_id")},function(a){t(e+"#updraftvault_disconnect").html(updraftlion.disconnect),a.hasOwnProperty("html")&&(t(e+"#updraftvault_settings_connected").html(a.html).slideUp(),t(e+"#updraftvault_settings_default").slideDown())})}catch(r){t(e+"#updraftvault_disconnect").html(updraftlion.disconnect),console.log(r)}}),t(e+"#updraftvault_connect").click(function(a){a.preventDefault(),t(e+"#updraftvault_settings_default").slideUp(),t(e+"#updraftvault_settings_connect").slideDown()}),t(e+"#updraftvault_showoptions").click(function(a){a.preventDefault(),t(e+"#updraftvault_settings_default").slideUp(),t(e+"#updraftvault_settings_showoptions").slideDown()}),t(e+"#updraftvault_connect_go").click(function(a){return t(e+"#updraftvault_connect_go").html(updraftlion.connecting),updraft_send_command("vault_connect",{email:t("#updraftvault_email").val(),pass:t("#updraftvault_pass").val(),instance_id:t("#updraftvault_settings_connect").data("instance_id")},function(a,r,n){t(e+"#updraftvault_connect_go").html(updraftlion.connect),a.hasOwnProperty("e")?(updraft_html_modal('<h4 style="margin-top:0px; padding-top:0px;">'+updraftlion.errornocolon+"</h4><p>"+a.e+"</p>",updraftlion.disconnect,400,250),a.hasOwnProperty("code")&&"no_quota"==a.code&&(t(e+"#updraftvault_settings_connect").slideUp(),t(e+"#updraftvault_settings_default").slideDown())):a.hasOwnProperty("connected")&&a.connected&&a.hasOwnProperty("html")?(t(e+"#updraftvault_settings_connect").slideUp(),t(e+"#updraftvault_settings_connected").html(a.html).slideDown()):(console.log(a),alert(updraftlion.unexpectedresponse+" "+n))}),!1})}),jQuery(document).ready(function(t){function e(){var t=new plupload.Uploader(updraft_plupload_config2);t.bind("Init",function(t){var e=jQuery("#plupload-upload-ui2");t.features.dragdrop?(e.addClass("drag-drop"),jQuery("#drag-drop-area2").bind("dragover.wp-uploader",function(){e.addClass("drag-over")}).bind("dragleave.wp-uploader, drop.wp-uploader",function(){e.removeClass("drag-over")})):(e.removeClass("drag-drop"),jQuery("#drag-drop-area2").unbind(".wp-uploader"))}),t.init(),t.bind("FilesAdded",function(e,a){plupload.each(a,function(e){return/^backup_([\-0-9]{15})_.*_([0-9a-f]{12})-db([0-9]+)?\.(gz\.crypt)$/i.test(e.name)?void jQuery("#filelist2").append('<div class="file" id="'+e.id+'"><b>'+e.name+"</b> (<span>"+plupload.formatSize(0)+"</span>/"+plupload.formatSize(e.size)+') <div class="fileprogress"></div></div>'):(alert(e.name+": "+updraftlion.notdba),void t.removeFile(e))}),e.refresh(),e.start()}),t.bind("UploadProgress",function(t,e){jQuery("#"+e.id+" .fileprogress").width(e.percent+"%"),jQuery("#"+e.id+" span").html(plupload.formatSize(parseInt(e.size*e.percent/100)))}),t.bind("Error",function(t,e){"-200"==e.code?err_makesure="\n"+updraftlion.makesure2:err_makesure=updraftlion.makesure,alert(updraftlion.uploaderr+" (code "+e.code+") : "+e.message+" "+err_makesure)}),t.bind("FileUploaded",function(t,e,a){"200"==a.status?"ERROR:"==a.response.substring(0,6)?alert(updraftlion.uploaderror+" "+a.response.substring(6)):"OK:"==a.response.substring(0,3)?(bkey=a.response.substring(3),jQuery("#"+e.id+" .fileprogress").hide(),jQuery("#"+e.id).append(updraftlion.uploaded+' <a href="?page=updraftplus&action=downloadfile&updraftplus_file='+bkey+"&decrypt_key="+encodeURIComponent(jQuery("#updraftplus_db_decrypt").val())+'">'+updraftlion.followlink+"</a> "+updraftlion.thiskey+" "+jQuery("#updraftplus_db_decrypt").val().replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"))):alert(updraftlion.unknownresp+" "+a.response):alert(updraftlion.ukrespstatus+" "+a.code)})}try{"undefined"!=typeof updraft_plupload_config2&&e()}catch(a){console.log(a)}jQuery("#updraft-hidethis").remove(),updraft_remote_storage_tabs_setup()}),jQuery(document).ready(function(t){function e(){var t=r("object"),e=new Date;t=JSON.stringify({version:"1.12.40",epoch_date:e.getTime(),local_date:e.toLocaleString(),network_site_url:updraftlion.network_site_url,data:t});var a=document.body.appendChild(document.createElement("a"));a.setAttribute("download","updraftplus-settings.json"),a.setAttribute("style","display:none;"),a.setAttribute("href","data:text/json;charset=UTF-8,"+encodeURIComponent(t)),a.click()}function a(e){var a,r=decodeURIComponent(e);try{a=ud_parse_json(r)}catch(o){return t.unblockUI(),jQuery("#import_settings").val(""),console.log(r),console.log(o),void alert(updraftlion.import_invalid_json_file)}if(window.confirm(updraftlion.importing_data_from+" "+r.network_site_url+"\n"+updraftlion.exported_on+" "+r.local_date+"\n"+updraftlion.continue_import)){var u=JSON.stringify(a.data);updraft_send_command("importsettings",{settings:u,updraftplus_version:updraftlion.updraftplus_version
3
+ },function(e){var a=n(e);!a.hasOwnProperty("saved")||a.saved?(updraft_settings_form_changed=!1,location.replace(updraftlion.updraft_settings_url)):(t.unblockUI(),a.hasOwnProperty("error_message")&&a.error_message&&alert(a.error_message))},{action:"updraft_importsettings",nonce:updraftplus_settings_nonce,json_parse:!1})}else t.unblockUI()}function r(e){var a="",e="undefined"==typeof e?"string":e;return"object"==e?a=t("#updraft-navtab-settings-content form input[name!='action'][name!='option_page'][name!='_wpnonce'][name!='_wp_http_referer'], #updraft-navtab-settings-content form textarea, #updraft-navtab-settings-content form select, #updraft-navtab-settings-content form input[type=checkbox]").serializeJSON({checkboxUncheckedValue:"0",useIntKeysAsArrayIndex:!0}):(a=t("#updraft-navtab-settings-content form input[name!='action'], #updraft-navtab-settings-content form textarea, #updraft-navtab-settings-content form select").serialize(),t.each(t("#updraft-navtab-settings-content form input[type=checkbox]").filter(function(e){return 0==t(this).prop("checked")}),function(e,r){var n="0";a+="&"+t(r).attr("name")+"="+n})),a}function n(e){try{var a=ud_parse_json(e),r=(a.messages,a.backup_dir.writable),n=a.backup_dir.message,o=a.backup_dir.button_title}catch(u){return console.log(u),console.log(e),alert(updraftlion.jsonnotunderstood),t.unblockUI(),{}}if(a.hasOwnProperty("changed")){console.log("UpdraftPlus: savesettings: some values were changed after being filtered"),console.log(a.changed);for(prop in a.changed)if("object"==typeof a.changed[prop])for(innerprop in a.changed[prop])t("[name='"+innerprop+"']").is(":checkbox")||t("[name='"+prop+"["+innerprop+"]']").val(a.changed[prop][innerprop]);else t("[name='"+prop+"']").is(":checkbox")||t("[name='"+prop+"']").val(a.changed[prop])}return t("#updraft_writable_mess").html(n),0==r?(t("#updraft-backupnow-button").attr("disabled","disabled"),t("#updraft-backupnow-button").attr("title",o),t(".backupdirrow").css("display","table-row")):(t("#updraft-backupnow-button").removeAttr("disabled"),t("#updraft-backupnow-button").removeAttr("title")),a.hasOwnProperty("updraft_include_more_path")&&t("#backupnow_includefiles_moreoptions").html(a.updraft_include_more_path),a.hasOwnProperty("backup_now_message")&&t("#backupnow_remote_container").html(a.backup_now_message),t(".updraftmessage").remove(),t("#updraft_backup_started").before(a.messages),t("#next-backup-table-inner").html(a.scheduled),a}function o(){var t=!1;if(jQuery("#updraft-authenticate-modal-innards").html(""),jQuery("div[class*=updraft_authenticate_] a.updraft_authlink").each(function(){jQuery("#updraft-authenticate-modal-innards").append('<p><a href="'+jQuery(this).attr("href")+'">'+jQuery(this).html()+"</a></p>"),t=!0}),t){var e={};e[updraftlion.cancel]=function(){jQuery(this).dialog("close")},jQuery("#updraft-authenticate-modal").dialog({autoOpen:!0,modal:!0,resizable:!1,draggable:!1,buttons:e,width:"auto"}).dialog("open")}}var u=new Image;u.src=updraftlion.ud_url+"/images/udlogo-rotating.gif",t("#updraft-navtab-settings-content input.updraft_include_entity").change(function(e){var a=t(this).attr("id"),r=t(this).is(":checked"),n="#backupnow_files_"+a;t(n).prop("checked",r)}),t("#updraftplus-settings-save").click(function(e){e.preventDefault(),t.blockUI({message:'<div style="margin: 8px; font-size:150%;"><img src="'+updraftlion.ud_url+'/images/udlogo-rotating.gif" height="80" width="80" style="padding-bottom:10px;"><br>'+updraftlion.saving+"</div>"});var a=r("string");updraft_send_command("savesettings",{settings:a,updraftplus_version:updraftlion.updraftplus_version},function(e){n(e),t("#updraft-wrap .fade").delay(6e3).fadeOut(2e3),t("html, body").animate({scrollTop:t("#updraft-wrap").offset().top},1e3,function(){o()}),t.unblockUI()},{action:"updraft_savesettings",nonce:updraftplus_settings_nonce,json_parse:!1})}),t("#updraftplus-settings-export").click(function(){updraft_settings_form_changed&&alert(updraftlion.unsaved_settings_export),e()}),t("#updraftplus-settings-import").click(function(){t.blockUI({message:'<div style="margin: 8px; font-size:150%;"><img src="'+updraftlion.ud_url+'/images/udlogo-rotating.gif" height="80" width="80" style="padding-bottom:10px;"><br>'+updraftlion.importing+"</div>"});var e=document.getElementById("import_settings");if(0==e.files.length)return alert(updraftlion.import_select_file),void t.unblockUI();var r=e.files[0],n=new FileReader;n.onload=function(){a(this.result)},n.readAsText(r)})}),jQuery(document).ready(function(t){jQuery("#updraft-restore-modal").on("change","#updraft_restorer_charset",function(e){if(t("#updraft_restorer_charset").length&&t("#updraft_restorer_collate").length&&t("#collate_change_on_charset_selection_data").length){var a=t("#updraft_restorer_charset").val();t("#updraft_restorer_collate option").show(),t("#updraft_restorer_collate option[data-charset!="+a+"]").hide(),updraft_send_command("collate_change_on_charset_selection",{collate_change_on_charset_selection_data:t("#collate_change_on_charset_selection_data").val(),updraft_restorer_charset:a,updraft_restorer_collate:t("#updraft_restorer_collate").val()},function(e){e.hasOwnProperty("is_action_required")&&1==e.is_action_required&&e.hasOwnProperty("similar_type_collate")&&t("#updraft_restorer_collate").val(e.similar_type_collate)})}})});
includes/updraftplus-notices.php CHANGED
@@ -375,7 +375,7 @@ class UpdraftPlus_Notices extends Updraft_Notices {
375
  return false;
376
  }
377
 
378
- protected function check_notice_dismissed($dismiss_time){
379
 
380
  $time_now = defined('UPDRAFTPLUS_NOTICES_FORCE_TIME') ? UPDRAFTPLUS_NOTICES_FORCE_TIME : time();
381
 
375
  return false;
376
  }
377
 
378
+ protected function check_notice_dismissed($dismiss_time) {
379
 
380
  $time_now = defined('UPDRAFTPLUS_NOTICES_FORCE_TIME') ? UPDRAFTPLUS_NOTICES_FORCE_TIME : time();
381
 
includes/updraftvault.php ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (!defined('UPDRAFTPLUS_DIR')) die('No access.');
4
+
5
+ /**
6
+ * Handles UpdraftVault Commands to pull Amazon S3 Bucket credentials
7
+ * from user's UpdraftVault and some default filters for per page display
8
+ *
9
+ * @method array get_credentials()
10
+ */
11
+ class UpdraftCentral_UpdraftVault_Commands extends UpdraftCentral_Commands {
12
+
13
+ /**
14
+ * Gets the Amazon S3 Credentials
15
+ *
16
+ * Extract the needed credentials to connect to the user's Amazon S3 Bucket
17
+ * by pulling this info from the UpdraftVault server.
18
+ *
19
+ * @return array $result - An array containing the Amazon S3 settings/config if successful,
20
+ * otherwise, it will contain the error details/info of the generated error.
21
+ */
22
+ public function get_credentials() {
23
+ global $updraftplus;
24
+
25
+ $storage_objects_and_ids = $updraftplus->get_storage_objects_and_ids(array('updraftvault'));
26
+
27
+ // UpdraftVault isn't expected to have multiple options currently, so we just grab the first instance_id in the settings and use the options from that. If in future we do decide we want to make UpdraftVault multiple options then we will need to update this part of the code e.g a instance_id needs to be passed in and used by the following lines of code.
28
+ if (isset($storage_objects_and_ids['updraftvault']['instance_settings'])) {
29
+ $instance_id = key($storage_objects_and_ids['updraftvault']['instance_settings']);
30
+ $opts = $storage_objects_and_ids['updraftvault']['instance_settings'][$instance_id];
31
+ $vault = $storage_objects_and_ids['updraftvault']['object'];
32
+ $vault->set_options($opts, false, $instance_id);
33
+ } else {
34
+ if (!class_exists('UpdraftPlus_BackupModule_updraftvault')) include_once(UPDRAFTPLUS_DIR.'/methods/updraftvault.php');
35
+ $vault = new UpdraftPlus_BackupModule_updraftvault();
36
+ }
37
+
38
+ $result = $vault->get_config();
39
+
40
+ if (isset($result['error']) && !empty($result['error'])) {
41
+ $result = array('error' => true, 'message' => $result['error']['message'], 'values' => $result['error']['values']);
42
+ }
43
+
44
+ return $this->_response($result);
45
+ }
46
+ }
languages/updraftplus-af.po CHANGED
@@ -11,77 +11,168 @@ msgstr ""
11
  "Language: af_ZA\n"
12
  "Project-Id-Version: UpdraftPlus\n"
13
 
14
- #: src/restorer.php:1872
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  msgid "Requested table character set (%s) is not present - changing to %s."
16
  msgstr ""
17
 
18
- #: src/class-updraftplus.php:4506
19
  msgid "Your chosen character set to use instead:"
20
  msgstr ""
21
 
22
- #: src/class-updraftplus.php:4499
23
  msgid "You can choose another suitable character set instead and continue with the restoration at your own risk."
24
  msgstr ""
25
 
26
- #: src/class-updraftplus.php:4499
27
  msgid "The database server that this WordPress site is running on doesn't support the character set (%s) which you are trying to import."
28
  msgid_plural "The database server that this WordPress site is running on doesn't support the character sets (%s) which you are trying to import."
29
  msgstr[0] ""
30
  msgstr[1] ""
31
 
32
- #: src/central/bootstrap.php:572
33
  msgid "Create another key"
34
  msgstr ""
35
 
36
- #: src/central/bootstrap.php:501
37
  msgid "UpdraftCentral dashboard connection details"
38
  msgstr ""
39
 
40
- #: src/central/bootstrap.php:495
41
  msgid "Next"
42
  msgstr ""
43
 
44
- #: src/central/bootstrap.php:490
45
- msgid "the UpdraftCentral dashboard plugin"
46
- msgstr ""
47
-
48
- #: src/central/bootstrap.php:490
49
- msgid "On my own website on which I have installed"
50
- msgstr ""
51
-
52
- #: src/central/bootstrap.php:485
53
  msgid "an account"
54
  msgstr ""
55
 
56
- #: src/central/bootstrap.php:485
57
  msgid "i.e. if you have %s there"
58
  msgstr ""
59
 
60
- #: src/central/bootstrap.php:477
61
  msgid "Connect this site to an UpdraftCentral dashboard found at..."
62
  msgstr ""
63
 
64
- #: src/central/bootstrap.php:451
65
  msgid "Manage existing keys (%d)..."
66
  msgstr ""
67
 
68
- #: src/central/bootstrap.php:401
69
  msgid "There are no UpdraftCentral dashboards that can currently control this site."
70
  msgstr ""
71
 
72
- #: src/central/bootstrap.php:238
73
  msgid "You can now control this site via your UpdraftCentral dashboard at %s."
74
  msgstr ""
75
 
76
- #: src/central/bootstrap.php:236
77
  msgid "Detailed instructions for this can be found at %s"
78
  msgstr ""
79
 
80
- #: src/central/bootstrap.php:236
81
  msgid "You now need to copy the key below and enter it at your %s."
82
  msgstr ""
83
 
84
- #: src/admin.php:761
85
  msgid "Please enter a valid URL e.g http://example.com"
86
  msgstr ""
87
 
@@ -133,31 +224,31 @@ msgstr ""
133
  msgid "Account ID"
134
  msgstr ""
135
 
136
- #: src/class-updraftplus.php:4377
137
  msgid "As long as your web hosting allows http (i.e. non-SSL access) or will forward requests to https (which is almost always the case), this is no problem. If that is not yet set up, then you should set it up, or use %s so that the non-https links are automatically replaced."
138
  msgstr ""
139
 
140
- #: src/class-updraftplus.php:4375, src/class-updraftplus.php:4377
141
  msgid "the migrator add-on"
142
  msgstr ""
143
 
144
- #: src/class-updraftplus.php:4375
145
  msgid "This restoration will work if you still have an SSL certificate (i.e. can use https) to access the site. Otherwise, you will want to use %s to search/replace the site address so that the site can be visited without https."
146
  msgstr ""
147
 
148
- #: src/class-updraftplus.php:4373
149
  msgid "This backup set is of this site, but at the time of the backup you were using %s, whereas the site now uses %s."
150
  msgstr ""
151
 
152
- #: src/class-updraftplus.php:4370
153
  msgid "The website address in the backup set (%s) is slightly different from that of the site now (%s). This is not expected to be a problem for restoring the site, as long as visits to the former address still reach the site."
154
  msgstr ""
155
 
156
- #: src/methods/googledrive.php:1153
157
  msgid "To de-authorize UpdraftPlus (all sites) from accessing your Google Drive, follow this link to your Google account settings."
158
  msgstr ""
159
 
160
- #: src/methods/googledrive.php:1149
161
  msgid "Follow this link to remove this site's settings for %s."
162
  msgstr ""
163
 
@@ -165,29 +256,31 @@ msgstr ""
165
  msgid "UpdraftPlus debug mode is on: detailed debugging data follows."
166
  msgstr ""
167
 
168
- #: src/admin.php:742
169
  msgid "Error: The chosen file is corrupt. Please choose a valid UpdraftPlus export file."
170
  msgstr ""
171
 
172
- #: src/admin.php:1292, src/admin.php:3976, src/class-updraftplus.php:2125,
173
- #: src/class-updraftplus.php:2190, src/class-updraftplus.php:2324
 
174
  msgid "A PHP fatal error (%s) has occurred: %s"
175
  msgstr ""
176
 
177
- #: src/admin.php:1285, src/admin.php:3968, src/class-updraftplus.php:2118,
178
- #: src/class-updraftplus.php:2183, src/class-updraftplus.php:2317
 
179
  msgid "A PHP exception (%s) has occurred: %s"
180
  msgstr ""
181
 
182
- #: src/addons/googlecloud.php:56
183
  msgid "South-east Australia"
184
  msgstr ""
185
 
186
- #: src/addons/googlecloud.php:55
187
  msgid "South-east Asia"
188
  msgstr ""
189
 
190
- #: src/addons/googlecloud.php:54
191
  msgid "North-east Asia"
192
  msgstr ""
193
 
@@ -219,7 +312,7 @@ msgstr ""
219
  msgid "Select Files"
220
  msgstr ""
221
 
222
- #: src/methods/cloudfiles.php:497
223
  msgid "Rackspace Storage Region"
224
  msgstr ""
225
 
@@ -231,19 +324,19 @@ msgstr ""
231
  msgid "Instant and secure logon with a wave of your phone."
232
  msgstr ""
233
 
234
- #: src/backup.php:1909
235
  msgid "As previously warned (see: %s), encryption is no longer a feature of the free edition of UpdraftPlus"
236
  msgstr ""
237
 
238
- #: src/admin.php:4465
239
  msgid "Value"
240
  msgstr ""
241
 
242
- #: src/admin.php:1557
243
  msgid "Did not know how to delete from this cloud service."
244
  msgstr ""
245
 
246
- #: src/addons/sftp.php:696
247
  msgid "Encrypted login failed; trying non-encrypted"
248
  msgstr ""
249
 
@@ -251,7 +344,7 @@ msgstr ""
251
  msgid "__Check this box to use Amazon's server-side encryption"
252
  msgstr ""
253
 
254
- #: src/addons/azure.php:549
255
  msgid "You must add the following as the authorised redirect URI in your Azure console (under \"API Settings\") when asked"
256
  msgstr ""
257
 
@@ -259,15 +352,15 @@ msgstr ""
259
  msgid "Stored at: %s"
260
  msgstr ""
261
 
262
- #: src/methods/cloudfiles.php:520
263
  msgid "Cloud Files"
264
  msgstr ""
265
 
266
- #: src/admin.php:4303
267
  msgid "Your settings failed to save. Please refresh the settings page and try again"
268
  msgstr ""
269
 
270
- #: src/admin.php:4262
271
  msgid "UpdraftPlus seems to have been updated to version (%s), which is different to the version running when this settings page was loaded. Please reload the settings page before trying to save settings."
272
  msgstr ""
273
 
@@ -284,87 +377,87 @@ msgstr ""
284
  msgid "Extra database"
285
  msgstr ""
286
 
287
- #: src/admin.php:3545
288
  msgid "Press here to download or browse"
289
  msgstr ""
290
 
291
- #: src/admin.php:1074, src/admin.php:1084
292
  msgid "Error: invalid path"
293
  msgstr ""
294
 
295
- #: src/admin.php:932
296
  msgid "An error occurred when fetching storage module options: "
297
  msgstr ""
298
 
299
- #: src/admin.php:758
300
  msgid "Loading log file"
301
  msgstr ""
302
 
303
- #: src/admin.php:757
304
  msgid "Unable to download file. This could be caused by a timeout. It would be best to download the zip to your computer."
305
  msgstr ""
306
 
307
- #: src/admin.php:756
308
  msgid "Search"
309
  msgstr ""
310
 
311
- #: src/admin.php:755
312
  msgid "Select a file to view information about it"
313
  msgstr ""
314
 
315
- #: src/admin.php:754
316
  msgid "Browsing zip file"
317
  msgstr ""
318
 
319
- #: src/admin.php:723
320
  msgid "With UpdraftPlus Premium, you can directly download individual files from here."
321
  msgstr ""
322
 
323
- #: src/admin.php:671
324
  msgid "Browse contents"
325
  msgstr ""
326
 
327
- #: src/restorer.php:1693
328
  msgid "Skipped tables:"
329
  msgstr ""
330
 
331
- #: src/class-updraftplus.php:4557
332
  msgid "This database backup has the following WordPress tables excluded: %s"
333
  msgstr ""
334
 
335
- #: src/admin.php:2524
336
  msgid "With UpdraftPlus Premium, you can choose to backup non-WordPress tables, backup only specified tables, and backup other databases too."
337
  msgstr ""
338
 
339
- #: src/admin.php:2524
340
  msgid "All WordPress tables will be backed up."
341
  msgstr ""
342
 
343
- #: src/admin.php:753
344
  msgid "Further information may be found in the browser JavaScript console, and the server PHP error logs."
345
  msgstr ""
346
 
347
- #: src/admin.php:753
348
  msgid "That you are attempting to upload a zip file previously created by UpdraftPlus."
349
  msgstr ""
350
 
351
- #: src/admin.php:753
352
  msgid "The available memory on the server."
353
  msgstr ""
354
 
355
- #: src/admin.php:753
356
  msgid "Any settings in your .htaccess or web.config file that affects the maximum upload or post size."
357
  msgstr ""
358
 
359
- #: src/admin.php:753
360
  msgid "The file failed to upload. Please check the following:"
361
  msgstr ""
362
 
363
- #: src/admin.php:752
364
  msgid "HTTP code:"
365
  msgstr ""
366
 
367
- #: src/admin.php:648
368
  msgid "You have chosen to backup a database, but no tables have been selected"
369
  msgstr ""
370
 
@@ -660,31 +753,31 @@ msgstr ""
660
  msgid "Apache modules"
661
  msgstr ""
662
 
663
- #: src/includes/updraftplus-notices.php:255
664
  msgid "Summer sale - 20% off UpdraftPlus Premium until July 31st"
665
  msgstr ""
666
 
667
- #: src/includes/updraftplus-notices.php:242
668
  msgid "Spring sale - 20% off UpdraftPlus Premium until April 31st"
669
  msgstr ""
670
 
671
- #: src/includes/updraftplus-notices.php:229
672
  msgid "Happy New Year - 20% off UpdraftPlus Premium until January 1st"
673
  msgstr ""
674
 
675
- #: src/includes/updraftplus-notices.php:216
676
  msgid "Christmas sale - 20% off UpdraftPlus Premium until December 25th"
677
  msgstr ""
678
 
679
- #: src/includes/updraftplus-notices.php:204,
680
- #: src/includes/updraftplus-notices.php:217,
681
- #: src/includes/updraftplus-notices.php:230,
682
- #: src/includes/updraftplus-notices.php:243,
683
- #: src/includes/updraftplus-notices.php:256
684
  msgid "To benefit, use this discount code:"
685
  msgstr ""
686
 
687
- #: src/includes/updraftplus-notices.php:203
688
  msgid "Black Friday - 20% off UpdraftPlus Premium until November 30th"
689
  msgstr ""
690
 
@@ -828,35 +921,35 @@ msgstr ""
828
  msgid "Export / import settings"
829
  msgstr ""
830
 
831
- #: src/restorer.php:1881
832
  msgid "Processing table (%s)"
833
  msgstr ""
834
 
835
- #: src/restorer.php:1659
836
  msgid "Backup of: %s"
837
  msgstr ""
838
 
839
- #: src/methods/googledrive.php:248
840
  msgid "The client has been deleted from the Google Drive API console. Please create a new Google Drive project and reconnect with UpdraftPlus."
841
  msgstr ""
842
 
843
- #: src/methods/dropbox.php:598
844
  msgid "%s de-authentication"
845
  msgstr ""
846
 
847
- #: src/methods/dropbox.php:563
848
  msgid "You must add the following as the authorised redirect URI in your Dropbox console (under \"API Settings\") when asked"
849
  msgstr ""
850
 
851
- #: src/methods/dropbox.php:532
852
  msgid "Follow this link to deauthenticate with %s."
853
  msgstr ""
854
 
855
- #: src/central/bootstrap.php:567
856
  msgid "UpdraftCentral enables control of your WordPress sites (including management of backups and updates) from a central dashboard."
857
  msgstr ""
858
 
859
- #: src/backup.php:1529
860
  msgid "If not, you will need to either remove data from this table, or contact your hosting company to request more resources."
861
  msgstr ""
862
 
@@ -864,51 +957,51 @@ msgstr ""
864
  msgid "You have selected a remote storage option which has an authorization step to complete:"
865
  msgstr ""
866
 
867
- #: src/admin.php:1633
868
  msgid "Remote files deleted:"
869
  msgstr ""
870
 
871
- #: src/admin.php:1632
872
  msgid "Local files deleted:"
873
  msgstr ""
874
 
875
- #: src/admin.php:977, src/admin.php:981, src/admin.php:989, src/admin.php:993
876
  msgid "Follow this link to authorize access to your %s account (you will not be able to back up to %s without it)."
877
  msgstr ""
878
 
879
- #: src/admin.php:751
880
  msgid "remote files deleted"
881
  msgstr ""
882
 
883
- #: src/admin.php:749
884
  msgid "Complete"
885
  msgstr ""
886
 
887
- #: src/admin.php:748
888
  msgid "Do you want to carry out the import?"
889
  msgstr ""
890
 
891
- #: src/admin.php:747
892
  msgid "Which was exported on:"
893
  msgstr ""
894
 
895
- #: src/admin.php:746
896
  msgid "This will import data from:"
897
  msgstr ""
898
 
899
- #: src/admin.php:745
900
  msgid "Importing..."
901
  msgstr ""
902
 
903
- #: src/admin.php:741
904
  msgid "You have not yet selected a file to import."
905
  msgstr ""
906
 
907
- #: src/admin.php:725
908
  msgid "Your export file will be of your displayed settings, not your saved ones."
909
  msgstr ""
910
 
911
- #: src/admin.php:84
912
  msgid "template not found"
913
  msgstr ""
914
 
@@ -916,28 +1009,28 @@ msgstr ""
916
  msgid "US East (Ohio)"
917
  msgstr ""
918
 
919
- #: src/addons/onedrive.php:946
920
  msgid "This site uses a URL which is either non-HTTPS, or is localhost or 127.0.0.1 URL. As such, you must use the main %s %s App to authenticate with your account."
921
  msgstr ""
922
 
923
- #: src/addons/onedrive.php:634
924
  msgid "Account is not authorized (%s)."
925
  msgstr ""
926
 
927
- #: src/addons/onedrive.php:595, src/udaddons/updraftplus-addons.php:802
928
  msgid "Your IP address:"
929
  msgstr ""
930
 
931
- #: src/addons/onedrive.php:595, src/udaddons/updraftplus-addons.php:802,
932
- #: src/udaddons/updraftplus-addons.php:816
933
  msgid "To remove any block, please go here."
934
  msgstr ""
935
 
936
- #: src/addons/onedrive.php:580, src/udaddons/updraftplus-addons.php:787
937
  msgid "An error response was received; HTTP code:"
938
  msgstr ""
939
 
940
- #: src/includes/class-commands.php:322
941
  msgid "%s add-on not found"
942
  msgstr ""
943
 
@@ -949,47 +1042,47 @@ msgstr ""
949
  msgid "This makes time-outs much more likely. You are recommended to turn safe_mode off, or to restore only one entity at a time"
950
  msgstr ""
951
 
952
- #: src/admin.php:2348
953
  msgid "To fix this problem go here."
954
  msgstr ""
955
 
956
- #: src/admin.php:2348
957
  msgid "OptimizePress 2.0 encodes its contents, so search/replace does not work."
958
  msgstr ""
959
 
960
- #: src/admin.php:709
961
  msgid "your PHP install lacks the openssl module; as a result, this can take minutes; if nothing has happened by then, then you should either try a smaller key size, or ask your web hosting company how to enable this PHP module on your setup."
962
  msgstr ""
963
 
964
- #: src/addons/webdav.php:132
965
  msgid "Path"
966
  msgstr ""
967
 
968
- #: src/addons/webdav.php:127
969
  msgid "Leave this blank to use the default (80 for webdav, 443 for webdavs)"
970
  msgstr ""
971
 
972
- #: src/addons/webdav.php:119
973
  msgid "Enter any path in the field below."
974
  msgstr ""
975
 
976
- #: src/addons/webdav.php:119
977
  msgid "A host name cannot contain a slash."
978
  msgstr ""
979
 
980
- #: src/addons/webdav.php:80
981
  msgid "Protocol (SSL or not)"
982
  msgstr ""
983
 
984
- #: src/addons/webdav.php:75
985
  msgid "This WebDAV URL is generated by filling in the options below. If you do not know the details, then you will need to ask your WebDAV provider."
986
  msgstr ""
987
 
988
- #: src/udaddons/updraftplus-addons.php:819
989
  msgid "No response data was received. This usually indicates a network connectivity issue (e.g. an outgoing firewall or overloaded network) between this site and UpdraftPlus.com."
990
  msgstr ""
991
 
992
- #: src/methods/s3.php:1063
993
  msgid "The AWS access key looks to be wrong (valid %s access keys begin with \"AK\")"
994
  msgstr ""
995
 
@@ -1013,73 +1106,73 @@ msgstr ""
1013
  msgid "FAQs"
1014
  msgstr ""
1015
 
1016
- #: src/central/bootstrap.php:523
1017
  msgid "More information..."
1018
  msgstr ""
1019
 
1020
- #: src/central/bootstrap.php:521
1021
  msgid "Use the alternative method for making a connection with the dashboard."
1022
  msgstr ""
1023
 
1024
- #: src/central/bootstrap.php:438
1025
  msgid "Key size: %d bits"
1026
  msgstr ""
1027
 
1028
- #: src/central/bootstrap.php:433
1029
  msgid "Public key was sent to:"
1030
  msgstr ""
1031
 
1032
- #: src/backup.php:2107
1033
  msgid "Failed to open directory (check the file permissions and ownership): %s"
1034
  msgstr ""
1035
 
1036
- #: src/backup.php:2085
1037
  msgid "%s: unreadable file - could not be backed up (check the file permissions and ownership)"
1038
  msgstr ""
1039
 
1040
- #: src/addons/migrator.php:2218
1041
  msgid "Create key"
1042
  msgstr ""
1043
 
1044
- #: src/addons/migrator.php:2215, src/central/bootstrap.php:515
1045
  msgid "slower, strongest"
1046
  msgstr ""
1047
 
1048
- #: src/addons/migrator.php:2214, src/central/bootstrap.php:514
1049
  msgid "recommended"
1050
  msgstr ""
1051
 
1052
- #: src/addons/migrator.php:2214, src/central/bootstrap.php:514
1053
  msgid "%s bytes"
1054
  msgstr ""
1055
 
1056
- #: src/addons/migrator.php:2213, src/central/bootstrap.php:513
1057
  msgid "faster (possibility for slow PHP installs)"
1058
  msgstr ""
1059
 
1060
- #: src/addons/migrator.php:2212, src/central/bootstrap.php:512
1061
  msgid "easy to break, fastest"
1062
  msgstr ""
1063
 
1064
- #: src/addons/migrator.php:2212, src/addons/migrator.php:2213,
1065
- #: src/addons/migrator.php:2215, src/central/bootstrap.php:512,
1066
- #: src/central/bootstrap.php:513, src/central/bootstrap.php:515
1067
  msgid "%s bits"
1068
  msgstr ""
1069
 
1070
- #: src/addons/migrator.php:2210, src/central/bootstrap.php:510
1071
  msgid "Encryption key size:"
1072
  msgstr ""
1073
 
1074
- #: src/addons/migrator.php:2208
1075
  msgid "Enter your chosen name"
1076
  msgstr ""
1077
 
1078
- #: src/addons/migrator.php:2207
1079
  msgid "Create a key: give this key a unique name (e.g. indicate the site it is for), then press \"Create Key\":"
1080
  msgstr ""
1081
 
1082
- #: src/methods/googledrive.php:491
1083
  msgid "Upload expected to fail: the %s limit for any single file is %s, whereas this file is %s GB (%d bytes)"
1084
  msgstr ""
1085
 
@@ -1099,7 +1192,7 @@ msgstr ""
1099
  msgid "This backup archive is %s MB in size - the attempt to send this via email is likely to fail (few email servers allow attachments of this size). If so, you should switch to using a different remote storage method."
1100
  msgstr ""
1101
 
1102
- #: src/class-updraftplus.php:1736
1103
  msgid "Size: %s MB"
1104
  msgstr ""
1105
 
@@ -1111,7 +1204,7 @@ msgstr ""
1111
  msgid "Now"
1112
  msgstr ""
1113
 
1114
- #: src/class-updraftplus.php:4389, src/restorer.php:1010
1115
  msgid "You should enable %s to make any pretty permalinks (e.g. %s) work"
1116
  msgstr ""
1117
 
@@ -1119,13 +1212,13 @@ msgstr ""
1119
  msgid "(tap on an icon to select or unselect)"
1120
  msgstr ""
1121
 
1122
- #: src/methods/updraftvault.php:317, src/methods/updraftvault.php:323,
1123
- #: src/methods/updraftvault.php:329
1124
  msgid "%s per year"
1125
  msgstr ""
1126
 
1127
- #: src/methods/updraftvault.php:316, src/methods/updraftvault.php:322,
1128
- #: src/methods/updraftvault.php:328
1129
  msgid "or (annual discount)"
1130
  msgstr ""
1131
 
@@ -1133,111 +1226,107 @@ msgstr ""
1133
  msgid "No Vault connection was found for this site (has it moved?); please disconnect and re-connect."
1134
  msgstr ""
1135
 
1136
- #: src/class-updraftplus.php:520, src/class-updraftplus.php:565
1137
  msgid "The given file was not found, or could not be read."
1138
  msgstr ""
1139
 
1140
- #: src/central/bootstrap.php:565
1141
  msgid "UpdraftCentral (Remote Control)"
1142
  msgstr ""
1143
 
1144
- #: src/central/bootstrap.php:554
1145
  msgid "View recent UpdraftCentral log events"
1146
  msgstr ""
1147
 
1148
- #: src/central/bootstrap.php:493
1149
- msgid "URL of mothership"
1150
- msgstr ""
1151
-
1152
- #: src/central/bootstrap.php:504
1153
  msgid "Enter any description"
1154
  msgstr ""
1155
 
1156
- #: src/central/bootstrap.php:503
1157
  msgid "Description"
1158
  msgstr ""
1159
 
1160
- #: src/central/bootstrap.php:443
1161
  msgid "Delete..."
1162
  msgstr ""
1163
 
1164
- #: src/central/bootstrap.php:436
1165
  msgid "Created:"
1166
  msgstr ""
1167
 
1168
- #: src/central/bootstrap.php:433
1169
  msgid "Access this site as user:"
1170
  msgstr ""
1171
 
1172
- #: src/central/bootstrap.php:457
1173
  msgid "Details"
1174
  msgstr ""
1175
 
1176
- #: src/central/bootstrap.php:456
1177
  msgid "Key description"
1178
  msgstr ""
1179
 
1180
- #: src/central/bootstrap.php:329, src/central/bootstrap.php:340
1181
  msgid "A key was created, but the attempt to register it with %s was unsuccessful - please try again later."
1182
  msgstr ""
1183
 
1184
- #: src/central/bootstrap.php:201
1185
  msgid "An invalid URL was entered"
1186
  msgstr ""
1187
 
1188
- #: src/central/bootstrap.php:77
1189
  msgid "Close..."
1190
  msgstr ""
1191
 
1192
- #: src/central/bootstrap.php:69
1193
  msgid "This connection appears to already have been made."
1194
  msgstr ""
1195
 
1196
- #: src/central/bootstrap.php:66
1197
  msgid "You must visit this link in the same browser and login session as you created the key in."
1198
  msgstr ""
1199
 
1200
- #: src/central/bootstrap.php:62
1201
  msgid "You must visit this URL in the same browser and login session as you created the key in."
1202
  msgstr ""
1203
 
1204
- #: src/central/bootstrap.php:62
1205
  msgid "You are not logged into this WordPress site in your web browser."
1206
  msgstr ""
1207
 
1208
- #: src/central/bootstrap.php:59
1209
  msgid "The key referred to was unknown."
1210
  msgstr ""
1211
 
1212
- #: src/central/bootstrap.php:56
1213
  msgid "A new UpdraftCentral connection has not been made."
1214
  msgstr ""
1215
 
1216
- #: src/central/bootstrap.php:54
1217
  msgid "An UpdraftCentral connection has been made successfully."
1218
  msgstr ""
1219
 
1220
- #: src/central/bootstrap.php:51
1221
  msgid "UpdraftCentral Connection"
1222
  msgstr ""
1223
 
1224
- #: src/backup.php:869, src/class-updraftplus.php:2806
1225
  msgid "The backup was aborted by the user"
1226
  msgstr ""
1227
 
1228
- #: src/admin.php:4298
1229
  msgid "Your settings have been saved."
1230
  msgstr ""
1231
 
1232
- #: src/admin.php:3432
1233
  msgid "Total backup size:"
1234
  msgstr ""
1235
 
1236
- #: src/admin.php:2846
1237
  msgid "stop"
1238
  msgstr ""
1239
 
1240
- #: src/admin.php:2684
1241
  msgid "The backup has finished running"
1242
  msgstr ""
1243
 
@@ -1263,27 +1352,27 @@ msgstr ""
1263
  msgid "calculate"
1264
  msgstr ""
1265
 
1266
- #: src/admin.php:724
1267
  msgid "You should save your changes to ensure that they are used for making your backup."
1268
  msgstr ""
1269
 
1270
- #: src/admin.php:717
1271
  msgid "We requested to delete the file, but could not understand the server's response"
1272
  msgstr ""
1273
 
1274
- #: src/admin.php:716
1275
  msgid "Please enter a valid URL"
1276
  msgstr ""
1277
 
1278
- #: src/admin.php:699
1279
  msgid "Saving..."
1280
  msgstr ""
1281
 
1282
- #: src/admin.php:662
1283
  msgid "Error: the server sent us a response which we did not understand."
1284
  msgstr ""
1285
 
1286
- #: src/admin.php:654
1287
  msgid "Fetching..."
1288
  msgstr ""
1289
 
@@ -1291,11 +1380,11 @@ msgstr ""
1291
  msgid "Asia Pacific (Seoul)"
1292
  msgstr ""
1293
 
1294
- #: src/restorer.php:1682
1295
  msgid "Uploads URL:"
1296
  msgstr ""
1297
 
1298
- #: src/backup.php:400
1299
  msgid "Unexpected error: no class '%s' was found (your UpdraftPlus installation seems broken - try re-installing)"
1300
  msgstr ""
1301
 
@@ -1303,24 +1392,24 @@ msgstr ""
1303
  msgid "The required %s PHP module is not installed - ask your web hosting company to enable it."
1304
  msgstr ""
1305
 
1306
- #: src/class-updraftplus.php:4440, src/restorer.php:1701
1307
  msgid "To import an ordinary WordPress site into a multisite installation requires %s."
1308
  msgstr ""
1309
 
1310
- #: src/class-updraftplus.php:4436
1311
  msgid "Please read this link for important information on this process."
1312
  msgstr ""
1313
 
1314
- #: src/class-updraftplus.php:4436
1315
  msgid "It will be imported as a new site."
1316
  msgstr ""
1317
 
1318
- #: src/admin.php:2497, src/templates/wp-admin/notices/horizontal-notice.php:16,
1319
  #: src/templates/wp-admin/notices/horizontal-notice.php:18
1320
  msgid "Dismiss"
1321
  msgstr ""
1322
 
1323
- #: src/admin.php:736
1324
  msgid "Please fill in the required information."
1325
  msgstr ""
1326
 
@@ -1340,40 +1429,40 @@ msgstr ""
1340
  msgid "Which site to restore"
1341
  msgstr ""
1342
 
1343
- #: src/addons/migrator.php:514, src/addons/migrator.php:515
1344
  msgid "Error when creating new site at your chosen address:"
1345
  msgstr ""
1346
 
1347
- #: src/addons/migrator.php:456
1348
  msgid "Required information for restoring this backup was not given (%s)"
1349
  msgstr ""
1350
 
1351
- #: src/addons/migrator.php:415
1352
  msgid "Attribute imported content to user"
1353
  msgstr ""
1354
 
1355
- #: src/addons/migrator.php:405, src/addons/migrator.php:407
1356
  msgid "You must use lower-case letters or numbers for the site path, only."
1357
  msgstr ""
1358
 
1359
- #: src/addons/migrator.php:393
1360
  msgid "This feature is not compatible with %s"
1361
  msgstr ""
1362
 
1363
- #: src/addons/migrator.php:391, src/addons/migrator.php:393
1364
  msgid "Importing a single site into a multisite install"
1365
  msgstr ""
1366
 
1367
- #: src/addons/migrator.php:382
1368
  msgid "other content from wp-content"
1369
  msgstr ""
1370
 
1371
- #: src/addons/migrator.php:379
1372
  msgid "WordPress core"
1373
  msgstr ""
1374
 
1375
- #: src/addons/migrator.php:379, src/addons/migrator.php:382,
1376
- #: src/addons/migrator.php:385
1377
  msgid "You selected %s to be included in the restoration - this cannot / should not be done when importing a single site into a network."
1378
  msgstr ""
1379
 
@@ -1381,11 +1470,11 @@ msgstr ""
1381
  msgid "Call WordPress action:"
1382
  msgstr ""
1383
 
1384
- #: src/admin.php:2532
1385
  msgid "Your saved settings also affect what is backed up - e.g. files excluded."
1386
  msgstr ""
1387
 
1388
- #: src/admin.php:3856
1389
  msgid "Skipping: this archive was already restored."
1390
  msgstr ""
1391
 
@@ -1417,51 +1506,51 @@ msgstr ""
1417
  msgid "This button will delete all UpdraftPlus settings and progress information for in-progress backups (but not any of your existing backups from your cloud storage)."
1418
  msgstr ""
1419
 
1420
- #: src/admin.php:4175
1421
  msgid "Send this backup to remote storage"
1422
  msgstr ""
1423
 
1424
- #: src/admin.php:4173
1425
  msgid "Check out UpdraftPlus Vault."
1426
  msgstr ""
1427
 
1428
- #: src/admin.php:4173
1429
  msgid "Not got any remote storage?"
1430
  msgstr ""
1431
 
1432
- #: src/admin.php:4173
1433
  msgid "settings"
1434
  msgstr ""
1435
 
1436
- #: src/admin.php:4173
1437
  msgid "Backup won't be sent to any remote storage - none has been saved in the %s"
1438
  msgstr ""
1439
 
1440
- #: src/admin.php:2530
1441
  msgid "Include any files in the backup"
1442
  msgstr ""
1443
 
1444
- #: src/admin.php:2516
1445
  msgid "Include the database in the backup"
1446
  msgstr ""
1447
 
1448
- #: src/admin.php:2496
1449
  msgid "Continue restoration"
1450
  msgstr ""
1451
 
1452
- #: src/admin.php:2491
1453
  msgid "You have an unfinished restoration operation, begun %s ago."
1454
  msgstr ""
1455
 
1456
- #: src/admin.php:2490
1457
  msgid "Unfinished restoration"
1458
  msgstr ""
1459
 
1460
- #: src/admin.php:2488
1461
  msgid "%s minutes, %s seconds"
1462
  msgstr ""
1463
 
1464
- #: src/admin.php:2435
1465
  msgid "Backup Contents And Schedule"
1466
  msgstr ""
1467
 
@@ -1469,142 +1558,136 @@ msgstr ""
1469
  msgid "Premium / Extensions"
1470
  msgstr ""
1471
 
1472
- #: src/admin.php:2214, src/admin.php:2223
1473
  msgid "Sufficient information about the in-progress restoration operation could not be found."
1474
  msgstr ""
1475
 
1476
- #: src/addons/morefiles.php:55, src/admin.php:722
1477
  msgctxt "(verb)"
1478
  msgid "Download"
1479
  msgstr ""
1480
 
1481
- #: src/admin.php:647
1482
  msgid "You have chosen to backup files, but no file entities have been selected"
1483
  msgstr ""
1484
 
1485
- #: src/admin.php:548
1486
  msgid "Extensions"
1487
  msgstr ""
1488
 
1489
- #: src/admin.php:540, src/templates/wp-admin/settings/tab-bar.php:8
1490
  msgid "Advanced Tools"
1491
  msgstr ""
1492
 
1493
- #: src/addons/googlecloud.php:966
1494
  msgid "Bucket location"
1495
  msgstr ""
1496
 
1497
- #: src/addons/googlecloud.php:961
1498
  msgid "Note that Google do not support every storage class in every location - you should read their documentation to learn about current availability."
1499
  msgstr ""
1500
 
1501
- #: src/addons/googlecloud.php:961, src/addons/googlecloud.php:976
1502
  msgid "This setting applies only when a new bucket is being created."
1503
  msgstr ""
1504
 
1505
- #: src/addons/googlecloud.php:946
1506
  msgid "You must use a bucket name that is unique, for all %s users."
1507
  msgstr ""
1508
 
1509
- #: src/addons/googlecloud.php:902
1510
  msgid "Do not confuse %s with %s - they are separate things."
1511
  msgstr ""
1512
 
1513
- #: src/addons/googlecloud.php:310
1514
  msgid "You do not have access to this bucket"
1515
  msgstr ""
1516
 
1517
- #: src/addons/googlecloud.php:57, src/addons/googlecloud.php:58,
1518
- #: src/addons/googlecloud.php:59
1519
  msgid "Western Europe"
1520
  msgstr ""
1521
 
1522
- #: src/addons/googlecloud.php:53
1523
  msgid "Eastern Asia-Pacific"
1524
  msgstr ""
1525
 
1526
- #: src/addons/googlecloud.php:52
1527
  msgid "Western United States"
1528
  msgstr ""
1529
 
1530
- #: src/addons/googlecloud.php:51
1531
  msgid "Eastern United States"
1532
  msgstr ""
1533
 
1534
- #: src/addons/googlecloud.php:50
1535
  msgid " Eastern United States"
1536
  msgstr ""
1537
 
1538
- #: src/addons/googlecloud.php:49
1539
  msgid "Central United States"
1540
  msgstr ""
1541
 
1542
- #: src/addons/googlecloud.php:48
1543
  msgid "European Union"
1544
  msgstr ""
1545
 
1546
- #: src/addons/googlecloud.php:47
1547
  msgid "Asia Pacific"
1548
  msgstr ""
1549
 
1550
- #: src/addons/googlecloud.php:46, src/addons/googlecloud.php:47,
1551
- #: src/addons/googlecloud.php:48
1552
  msgid "multi-region location"
1553
  msgstr ""
1554
 
1555
- #: src/addons/googlecloud.php:46
1556
  msgid "United States"
1557
  msgstr ""
1558
 
1559
- #: src/addons/googlecloud.php:42
1560
  msgid "Nearline"
1561
  msgstr ""
1562
 
1563
- #: src/addons/googlecloud.php:41
1564
  msgid "Durable reduced availability"
1565
  msgstr ""
1566
 
1567
- #: src/addons/googlecloud.php:40, src/addons/s3-enhanced.php:61
 
1568
  msgid "Standard"
1569
  msgstr ""
1570
 
1571
- #: src/addons/azure.php:577
1572
  msgid "container"
1573
  msgstr ""
1574
 
1575
- #: src/addons/azure.php:577
1576
  msgid "You can enter the path of any %s virtual folder you wish to use here."
1577
  msgstr ""
1578
 
1579
- #: src/addons/azure.php:576
1580
  msgid "optional"
1581
  msgstr ""
1582
 
1583
- #: src/addons/azure.php:576
1584
- msgid "Prefix"
1585
- msgstr ""
1586
-
1587
- #: src/addons/azure.php:571
1588
  msgid "See Microsoft's guidelines on container naming by following this link."
1589
  msgstr ""
1590
 
1591
- #: src/addons/azure.php:571
1592
  msgid "Enter the path of the %s you wish to use here."
1593
  msgstr ""
1594
 
1595
- #: src/addons/azure.php:560
1596
  msgid "This is not your Azure login - see the instructions if needing more guidance."
1597
  msgstr ""
1598
 
1599
- #: src/addons/azure.php:559
1600
- msgid "Account Name"
1601
- msgstr ""
1602
-
1603
- #: src/addons/azure.php:559, src/addons/azure.php:563
1604
  msgid "Azure"
1605
  msgstr ""
1606
 
1607
- #: src/addons/azure.php:555
1608
  msgid "Create Azure credentials in your Azure developer console."
1609
  msgstr ""
1610
 
@@ -1616,23 +1699,23 @@ msgstr ""
1616
  msgid "Could not access container"
1617
  msgstr ""
1618
 
1619
- #: src/class-updraftplus.php:2823
1620
  msgid "To complete your migration/clone, you should now log in to the remote site and restore the backup set."
1621
  msgstr ""
1622
 
1623
- #: src/backup.php:1581
1624
  msgid "the options table was not found"
1625
  msgstr ""
1626
 
1627
- #: src/backup.php:1579
1628
  msgid "no options or sitemeta table was found"
1629
  msgstr ""
1630
 
1631
- #: src/backup.php:1579, src/backup.php:1581
1632
  msgid "The database backup appears to have failed"
1633
  msgstr ""
1634
 
1635
- #: src/backup.php:1451
1636
  msgid "The backup directory is not writable (or disk space is full) - the database backup is expected to shortly fail."
1637
  msgstr ""
1638
 
@@ -1644,39 +1727,39 @@ msgstr ""
1644
  msgid "Not installed"
1645
  msgstr ""
1646
 
1647
- #: src/addons/googlecloud.php:951, src/addons/s3-enhanced.php:54
1648
  msgid "Storage class"
1649
  msgstr ""
1650
 
1651
- #: src/addons/googlecloud.php:946
1652
  msgid "See Google's guidelines on bucket naming by following this link."
1653
  msgstr ""
1654
 
1655
- #: src/addons/googlecloud.php:946
1656
  msgid "Enter the name of the %s bucket you wish to use here."
1657
  msgstr ""
1658
 
1659
- #: src/addons/googlecloud.php:945
1660
  msgid "Bucket"
1661
  msgstr ""
1662
 
1663
- #: src/addons/googlecloud.php:941
1664
  msgid "Otherwise, you can leave it blank."
1665
  msgstr ""
1666
 
1667
- #: src/addons/googlecloud.php:941
1668
  msgid "N.B. This is only needed if you have not already created the bucket, and you wish UpdraftPlus to create it for you."
1669
  msgstr ""
1670
 
1671
- #: src/addons/googlecloud.php:941
1672
  msgid "Enter the ID of the %s project you wish to use here."
1673
  msgstr ""
1674
 
1675
- #: src/addons/googlecloud.php:914
1676
  msgid "Follow this link to your Google API Console, and there activate the Storage API and create a Client ID in the API Access section."
1677
  msgstr ""
1678
 
1679
- #: src/addons/googlecloud.php:817
1680
  msgid "You must enter a project ID in order to be able to create a new bucket."
1681
  msgstr ""
1682
 
@@ -1684,31 +1767,31 @@ msgstr ""
1684
  msgid "Project ID"
1685
  msgstr ""
1686
 
1687
- #: src/addons/googlecloud.php:676
1688
  msgid "You must save and authenticate before you can test your settings."
1689
  msgstr ""
1690
 
1691
- #: src/addons/googlecloud.php:533
1692
  msgid "Have not yet obtained an access token from Google - you need to authorise or re-authorise your connection to Google Cloud."
1693
  msgstr ""
1694
 
1695
- #: src/addons/googlecloud.php:257, src/addons/googlecloud.php:330,
1696
- #: src/addons/googlecloud.php:809, src/addons/googlecloud.php:856
1697
  msgid "You do not have access to this bucket."
1698
  msgstr ""
1699
 
1700
- #: src/addons/googlecloud.php:257, src/addons/googlecloud.php:310,
1701
- #: src/addons/googlecloud.php:320, src/addons/googlecloud.php:330,
1702
- #: src/addons/googlecloud.php:635, src/addons/googlecloud.php:809,
1703
- #: src/addons/googlecloud.php:856, src/addons/googlecloud.php:908,
1704
- #: src/addons/googlecloud.php:908, src/addons/googlecloud.php:925,
1705
- #: src/addons/googlecloud.php:933, src/addons/googlecloud.php:946
1706
  msgid "Google Cloud"
1707
  msgstr ""
1708
 
1709
- #: src/addons/googlecloud.php:257, src/addons/googlecloud.php:310,
1710
- #: src/addons/googlecloud.php:330, src/addons/googlecloud.php:809,
1711
- #: src/addons/googlecloud.php:856
1712
  msgid "%s Service Exception."
1713
  msgstr ""
1714
 
@@ -1745,35 +1828,35 @@ msgstr ""
1745
  msgid "Press here to look inside your remote storage methods for any existing backup sets (from any site, if they are stored in the same folder)."
1746
  msgstr ""
1747
 
1748
- #: src/admin.php:1631
1749
  msgid "Backup sets removed:"
1750
  msgstr ""
1751
 
1752
- #: src/admin.php:735
1753
  msgid "Processing..."
1754
  msgstr ""
1755
 
1756
- #: src/admin.php:733
1757
  msgid "For backups older than"
1758
  msgstr ""
1759
 
1760
- #: src/admin.php:732
1761
  msgid "week(s)"
1762
  msgstr ""
1763
 
1764
- #: src/admin.php:731
1765
  msgid "hour(s)"
1766
  msgstr ""
1767
 
1768
- #: src/admin.php:730
1769
  msgid "day(s)"
1770
  msgstr ""
1771
 
1772
- #: src/admin.php:729
1773
  msgid "in the month"
1774
  msgstr ""
1775
 
1776
- #: src/admin.php:728
1777
  msgid "day"
1778
  msgstr ""
1779
 
@@ -1785,39 +1868,39 @@ msgstr ""
1785
  msgid "Add an additional retention rule..."
1786
  msgstr ""
1787
 
1788
- #: src/restorer.php:2204
1789
  msgid "This database needs to be deployed on MySQL version %s or later."
1790
  msgstr ""
1791
 
1792
- #: src/restorer.php:2204
1793
  msgid "This problem is caused by trying to restore a database on a very old MySQL version that is incompatible with the source database."
1794
  msgstr ""
1795
 
1796
- #: src/methods/updraftvault.php:645
1797
  msgid "You do not currently have any UpdraftPlus Vault quota"
1798
  msgstr ""
1799
 
1800
- #: src/class-updraftplus.php:4478
1801
  msgid "You must upgrade MySQL to be able to use this database."
1802
  msgstr ""
1803
 
1804
- #: src/class-updraftplus.php:4478
1805
  msgid "The database backup uses MySQL features not available in the old MySQL version (%s) that this site is running on."
1806
  msgstr ""
1807
 
1808
- #: src/admin.php:2333
1809
  msgid "The UpdraftPlus directory in wp-content/plugins has white-space in it; WordPress does not like this. You should rename the directory to wp-content/plugins/updraftplus to fix this problem."
1810
  msgstr ""
1811
 
1812
- #: src/methods/updraftvault.php:350
1813
  msgid "Don't know your email address, or forgotten your password?"
1814
  msgstr ""
1815
 
1816
- #: src/methods/updraftvault.php:343
1817
  msgid "Enter your UpdraftPlus.Com email / password here to connect:"
1818
  msgstr ""
1819
 
1820
- #: src/methods/updraftvault.php:305, src/methods/updraftvault.php:335
1821
  msgid "Read the FAQs here."
1822
  msgstr ""
1823
 
@@ -1829,132 +1912,133 @@ msgstr ""
1829
  msgid "Server-side encryption"
1830
  msgstr ""
1831
 
1832
- #: src/methods/updraftvault.php:653
1833
  msgid "If you have forgotten your password, then go here to change your password on updraftplus.com."
1834
  msgstr ""
1835
 
1836
- #: src/admin.php:985
1837
  msgid "Go to the remote storage settings in order to connect."
1838
  msgstr ""
1839
 
1840
- #: src/admin.php:985
1841
  msgid "%s has been chosen for remote storage, but you are not currently connected."
1842
  msgstr ""
1843
 
1844
- #: src/methods/updraftvault.php:332
1845
  msgid "Payments can be made in US dollars, euros or GB pounds sterling, via card or PayPal."
1846
  msgstr ""
1847
 
1848
- #: src/admin.php:705
1849
  msgid "Update quota count"
1850
  msgstr ""
1851
 
1852
- #: src/admin.php:704
1853
  msgid "Counting..."
1854
  msgstr ""
1855
 
1856
- #: src/admin.php:703
1857
  msgid "Disconnecting..."
1858
  msgstr ""
1859
 
1860
- #: src/admin.php:701
1861
  msgid "Connecting..."
1862
  msgstr ""
1863
 
1864
- #: src/methods/updraftvault.php:406, src/methods/updraftvault.php:480
1865
  msgid "Refresh current status"
1866
  msgstr ""
1867
 
1868
- #: src/methods/updraftvault.php:404, src/methods/updraftvault.php:420,
1869
- #: src/methods/updraftvault.php:422, src/methods/updraftvault.php:480
1870
  msgid "Get more quota"
1871
  msgstr ""
1872
 
1873
- #: src/methods/updraftvault.php:401, src/methods/updraftvault.php:417,
1874
- #: src/methods/updraftvault.php:461
1875
  msgid "Current use:"
1876
  msgstr ""
1877
 
1878
- #: src/methods/updraftvault.php:396
1879
  msgid "You can get more quota here"
1880
  msgstr ""
1881
 
1882
- #: src/methods/updraftvault.php:396
1883
  msgid "%s Error: you have insufficient storage quota available (%s) to upload this archive (%s)."
1884
  msgstr ""
1885
 
1886
- #: src/admin.php:702, src/methods/updraftvault.php:388
 
1887
  msgid "Disconnect"
1888
  msgstr ""
1889
 
1890
- #: src/methods/updraftvault.php:380
1891
  msgid "Quota:"
1892
  msgstr ""
1893
 
1894
- #: src/methods/updraftvault.php:378
1895
  msgid "Vault owner"
1896
  msgstr ""
1897
 
1898
- #: src/methods/updraftvault.php:378
1899
  msgid "Well done - there's nothing more needed to set up."
1900
  msgstr ""
1901
 
1902
- #: src/methods/updraftvault.php:378
1903
  msgid "This site is <strong>connected</strong> to UpdraftPlus Vault."
1904
  msgstr ""
1905
 
1906
- #: src/methods/updraftvault.php:374
1907
  msgid "You are <strong>not connected</strong> to UpdraftPlus Vault."
1908
  msgstr ""
1909
 
1910
- #: src/methods/updraftvault.php:350
1911
  msgid "Go here for help"
1912
  msgstr ""
1913
 
1914
- #: src/methods/updraftvault.php:345
1915
  msgid "E-mail"
1916
  msgstr ""
1917
 
1918
- #: src/central/bootstrap.php:540, src/methods/updraftvault.php:338,
1919
- #: src/methods/updraftvault.php:353
1920
  msgid "Back..."
1921
  msgstr ""
1922
 
1923
- #: src/methods/updraftvault.php:332
1924
  msgid "Subscriptions can be cancelled at any time."
1925
  msgstr ""
1926
 
1927
- #: src/methods/updraftvault.php:315, src/methods/updraftvault.php:321,
1928
- #: src/methods/updraftvault.php:327
1929
  msgid "%s per quarter"
1930
  msgstr ""
1931
 
1932
- #: src/central/bootstrap.php:567, src/methods/updraftvault.php:305,
1933
- #: src/methods/updraftvault.php:335
1934
  msgid "Read more about it here."
1935
  msgstr ""
1936
 
1937
- #: src/methods/updraftvault.php:305, src/methods/updraftvault.php:335
1938
  msgid "UpdraftPlus Vault is built on top of Amazon's world-leading data-centres, with redundant data storage to achieve 99.999999999% reliability."
1939
  msgstr ""
1940
 
1941
- #: src/methods/updraftvault.php:301
1942
  msgid "Already purchased space?"
1943
  msgstr ""
1944
 
1945
- #: src/methods/updraftvault.php:298
1946
  msgid "Show the options"
1947
  msgstr ""
1948
 
1949
- #: src/methods/updraftvault.php:297
1950
  msgid "First time user?"
1951
  msgstr ""
1952
 
1953
- #: src/methods/updraftvault.php:294, src/methods/updraftvault.php:311
1954
  msgid "Press a button to get started."
1955
  msgstr ""
1956
 
1957
- #: src/methods/updraftvault.php:294, src/methods/updraftvault.php:311
1958
  msgid "UpdraftPlus Vault brings you storage that is <strong>reliable, easy to use and a great price</strong>."
1959
  msgstr ""
1960
 
@@ -1975,11 +2059,11 @@ msgid "Updraft Vault"
1975
  msgstr ""
1976
 
1977
  #: src/addons/azure.php:388, src/addons/backblaze.php:464,
1978
- #: src/addons/googlecloud.php:760, src/methods/s3.php:1091
1979
  msgid "Delete failed:"
1980
  msgstr ""
1981
 
1982
- #: src/backup.php:3045
1983
  msgid "The zip engine returned the message: %s."
1984
  msgstr ""
1985
 
@@ -1999,75 +2083,75 @@ msgstr ""
1999
  msgid "Allow download"
2000
  msgstr ""
2001
 
2002
- #: src/addons/migrator.php:1762
2003
  msgid "If sending directly from site to site does not work for you, then there are three other methods - please try one of these instead."
2004
  msgstr ""
2005
 
2006
- #: src/addons/migrator.php:1747, src/admin.php:711
2007
  msgid "You should check that the remote site is online, not firewalled, does not have security modules that may be blocking access, has UpdraftPlus version %s or later active and that the keys have been entered correctly."
2008
  msgstr ""
2009
 
2010
- #: src/addons/migrator.php:2250
2011
  msgid "Existing keys"
2012
  msgstr ""
2013
 
2014
- #: src/addons/migrator.php:2241
2015
  msgid "No keys to allow remote sites to connect have yet been created."
2016
  msgstr ""
2017
 
2018
- #: src/addons/migrator.php:2223
2019
  msgid "Your new key:"
2020
  msgstr ""
2021
 
2022
- #: src/addons/migrator.php:2202
2023
  msgid "To allow another site to send a backup to this site, create a key, and then press the 'Migrate' button on the sending site, and copy-and-paste the key there."
2024
  msgstr ""
2025
 
2026
- #: src/addons/migrator.php:2184
2027
  msgid "So, to get the key for the remote site, open the 'Migrate' window on that site, scroll down, and you can create one there."
2028
  msgstr ""
2029
 
2030
- #: src/addons/migrator.php:2184
2031
  msgid "Keys for this site are created in the section below the one you just pressed in."
2032
  msgstr ""
2033
 
2034
- #: src/addons/migrator.php:1864, src/central/bootstrap.php:383
2035
  msgid "You must copy and paste this key now - it cannot be shown again."
2036
  msgstr ""
2037
 
2038
- #: src/addons/migrator.php:1864, src/central/bootstrap.php:383
2039
  msgid "Key created successfully."
2040
  msgstr ""
2041
 
2042
- #: src/addons/migrator.php:1849
2043
  msgid "A key with this name already exists; you must use a unique name."
2044
  msgstr ""
2045
 
2046
- #: src/addons/migrator.php:1793
2047
  msgid "Also send this backup to the active remote storage locations"
2048
  msgstr ""
2049
 
2050
- #: src/addons/migrator.php:1758
2051
  msgid "The site URL you are sending to (%s) looks like a local development website. If you are sending from an external network, it is likely that a firewall will be blocking this."
2052
  msgstr ""
2053
 
2054
- #: src/addons/migrator.php:1714
2055
  msgid "site not found"
2056
  msgstr ""
2057
 
2058
- #: src/addons/migrator.php:1699
2059
  msgid "Backup data will be sent to:"
2060
  msgstr ""
2061
 
2062
- #: src/addons/migrator.php:203
2063
  msgid "Restore an existing backup set onto this site"
2064
  msgstr ""
2065
 
2066
- #: src/addons/migrator.php:196
2067
  msgid "This site has no backups to restore from yet."
2068
  msgstr ""
2069
 
2070
- #: src/addons/reporting.php:160
2071
  msgid "Backup made by %s"
2072
  msgstr ""
2073
 
@@ -2075,7 +2159,7 @@ msgstr ""
2075
  msgid "This storage method does not allow downloading"
2076
  msgstr ""
2077
 
2078
- #: src/admin.php:3610
2079
  msgid "(backup set imported from remote location)"
2080
  msgstr ""
2081
 
@@ -2095,80 +2179,80 @@ msgstr ""
2095
  msgid "This backup set was not known by UpdraftPlus to be created by the current WordPress installation, but was either found in remote storage, or was sent from a remote site."
2096
  msgstr ""
2097
 
2098
- #: src/addons/migrator.php:1775, src/admin.php:718
2099
  msgid "Testing connection..."
2100
  msgstr ""
2101
 
2102
- #: src/admin.php:715
2103
  msgid "Deleting..."
2104
  msgstr ""
2105
 
2106
- #: src/admin.php:714
2107
  msgid "key name"
2108
  msgstr ""
2109
 
2110
- #: src/admin.php:712
2111
  msgid "Please give this key a name (e.g. indicate the site it is for):"
2112
  msgstr ""
2113
 
2114
- #: src/admin.php:709
2115
  msgid "Creating..."
2116
  msgstr ""
2117
 
2118
- #: src/addons/migrator.php:2201
2119
  msgid "Or, receive a backup from a remote site"
2120
  msgstr ""
2121
 
2122
- #: src/addons/migrator.php:2190
2123
  msgid "Paste key here"
2124
  msgstr ""
2125
 
2126
- #: src/addons/migrator.php:2184
2127
  msgid "How do I get a site's key?"
2128
  msgstr ""
2129
 
2130
- #: src/addons/migrator.php:2184
2131
  msgid "To add a site as a destination for sending to, enter that site's key below."
2132
  msgstr ""
2133
 
2134
- #: src/addons/migrator.php:2181
2135
  msgid "Or, send a backup to another site"
2136
  msgstr ""
2137
 
2138
- #: src/addons/migrator.php:1946, src/admin.php:719
2139
  msgid "Send"
2140
  msgstr ""
2141
 
2142
- #: src/addons/migrator.php:1940, src/admin.php:710
2143
  msgid "Send to site:"
2144
  msgstr ""
2145
 
2146
- #: src/addons/migrator.php:1938
2147
  msgid "No receiving sites have yet been added."
2148
  msgstr ""
2149
 
2150
- #: src/addons/migrator.php:1919
2151
  msgid "It is for sending backups to the following site: "
2152
  msgstr ""
2153
 
2154
- #: src/addons/migrator.php:1919
2155
  msgid "The key was successfully added."
2156
  msgstr ""
2157
 
2158
- #: src/addons/migrator.php:1903
2159
  msgid "The entered key does not belong to a remote site (it belongs to this one)."
2160
  msgstr ""
2161
 
2162
- #: src/addons/migrator.php:1892, src/addons/migrator.php:1894,
2163
- #: src/addons/migrator.php:1898
2164
  msgid "The entered key was corrupt - please try again."
2165
  msgstr ""
2166
 
2167
- #: src/addons/migrator.php:1890
2168
  msgid "The entered key was the wrong length - please try again."
2169
  msgstr ""
2170
 
2171
- #: src/addons/migrator.php:1880
2172
  msgid "key"
2173
  msgstr ""
2174
 
@@ -2196,84 +2280,84 @@ msgstr ""
2196
  msgid "FTP server"
2197
  msgstr ""
2198
 
2199
- #: src/addons/migrator.php:168
2200
  msgid "The UpdraftPlus Migrator modifies the restoration operation appropriately, to fit the backup data to the new site."
2201
  msgstr ""
2202
 
2203
- #: src/addons/migrator.php:168
2204
  msgid "A \"migration\" is ultimately the same as a restoration - but using backup archives that you import from another site."
2205
  msgstr ""
2206
 
2207
- #: src/admin.php:708
2208
  msgid "Resetting..."
2209
  msgstr ""
2210
 
2211
- #: src/addons/migrator.php:2190, src/admin.php:707
2212
  msgid "Add site"
2213
  msgstr ""
2214
 
2215
- #: src/admin.php:706
2216
  msgid "Adding..."
2217
  msgstr ""
2218
 
2219
- #: src/udaddons/options.php:336
2220
  msgid "Claim not granted - perhaps you have already used this purchase somewhere else, or your paid period for downloading from updraftplus.com has expired?"
2221
  msgstr ""
2222
 
2223
- #: src/restorer.php:2206
2224
  msgid "To use this backup, your database server needs to support the %s character set."
2225
  msgstr ""
2226
 
2227
- #: src/udaddons/updraftplus-addons.php:852
2228
  msgid "go here to change your password on updraftplus.com."
2229
  msgstr ""
2230
 
2231
- #: src/udaddons/updraftplus-addons.php:852
2232
  msgid "If you have forgotten your password "
2233
  msgstr ""
2234
 
2235
- #: src/udaddons/updraftplus-addons.php:851
2236
  msgid "Go here to re-enter your password."
2237
  msgstr ""
2238
 
2239
- #: src/addons/migrator.php:232
2240
  msgid "After pressing this button, you will be given the option to choose which components you wish to migrate"
2241
  msgstr ""
2242
 
2243
- #: src/addons/migrator.php:203
2244
  msgid "To import a backup set, go to the \"Existing Backups\" tab"
2245
  msgstr ""
2246
 
2247
- #: src/addons/migrator.php:170
2248
  msgid "To restore using any of the backup sets below, press the button."
2249
  msgstr ""
2250
 
2251
- #: src/admin.php:698, src/admin.php:724, src/admin.php:725
2252
  msgid "You have made changes to your settings, and not saved."
2253
  msgstr ""
2254
 
2255
- #: src/addons/onedrive.php:983
2256
  msgid "N.B. %s is not case-sensitive."
2257
  msgstr ""
2258
 
2259
- #: src/addons/onedrive.php:971
2260
  msgid "If OneDrive later shows you the message \"unauthorized_client\", then you did not enter a valid client ID here."
2261
  msgstr ""
2262
 
2263
- #: src/addons/azure.php:555, src/addons/migrator.php:1762,
2264
- #: src/addons/onedrive.php:955
2265
  msgid "For longer help, including screenshots, follow this link."
2266
  msgstr ""
2267
 
2268
- #: src/addons/onedrive.php:955
2269
  msgid "Create OneDrive credentials in your OneDrive developer console."
2270
  msgstr ""
2271
 
2272
- #: src/addons/onedrive.php:950
2273
  msgid "You must add the following as the authorised redirect URI in your OneDrive console (under \"API Settings\") when asked"
2274
  msgstr ""
2275
 
2276
- #: src/addons/azure.php:547
2277
  msgid "Microsoft Azure is not compatible with sites hosted on a localhost or 127.0.0.1 URL - their developer console forbids these (current URL is: %s)."
2278
  msgstr ""
2279
 
@@ -2281,12 +2365,12 @@ msgstr ""
2281
  msgid "%s authorisation failed:"
2282
  msgstr ""
2283
 
2284
- #: src/addons/onedrive.php:794, src/addons/onedrive.php:970,
2285
- #: src/addons/onedrive.php:974
2286
  msgid "OneDrive"
2287
  msgstr ""
2288
 
2289
- #: src/addons/onedrive.php:625
2290
  msgid "Please re-authorize the connection to your %s account."
2291
  msgstr ""
2292
 
@@ -2294,7 +2378,7 @@ msgstr ""
2294
  msgid "configure it here"
2295
  msgstr ""
2296
 
2297
- #: src/addons/onedrive.php:618, src/methods/updraftvault.php:618
2298
  msgid "To remove the block, please go here."
2299
  msgstr ""
2300
 
@@ -2439,7 +2523,7 @@ msgstr ""
2439
  msgid "If you have an AWS admin user, then you can use this wizard to quickly create a new AWS (IAM) user with access to only this bucket (rather than your whole account)"
2440
  msgstr ""
2441
 
2442
- #: src/methods/s3.php:875
2443
  msgid "To create a new IAM sub-user and access key that has access only to this bucket, use this add-on."
2444
  msgstr ""
2445
 
@@ -2451,19 +2535,19 @@ msgstr ""
2451
  msgid "UpdraftPlus news, high-quality training materials for WordPress developers and site-owners, and general WordPress news. You can de-subscribe at any time."
2452
  msgstr ""
2453
 
2454
- #: src/addons/onedrive.php:595, src/addons/onedrive.php:618,
2455
- #: src/methods/updraftvault.php:618, src/udaddons/updraftplus-addons.php:802,
2456
- #: src/udaddons/updraftplus-addons.php:816
2457
  msgid "This most likely means that you share a webserver with a hacked website that has been used in previous attacks."
2458
  msgstr ""
2459
 
2460
- #: src/addons/onedrive.php:618, src/methods/updraftvault.php:618,
2461
- #: src/udaddons/updraftplus-addons.php:816
2462
  msgid "It appears that your web server's IP Address (%s) is blocked."
2463
  msgstr ""
2464
 
2465
- #: src/addons/onedrive.php:618, src/methods/updraftvault.php:618,
2466
- #: src/udaddons/updraftplus-addons.php:816
2467
  msgid "UpdraftPlus.com has responded with 'Access Denied'."
2468
  msgstr ""
2469
 
@@ -2514,7 +2598,7 @@ msgstr ""
2514
  msgid "(at same time as files backup)"
2515
  msgstr ""
2516
 
2517
- #: src/admin.php:3114
2518
  msgid "No backup has been completed"
2519
  msgstr ""
2520
 
@@ -2573,16 +2657,16 @@ msgctxt "Uploader: Drop db.gz.crypt files here to upload them for decryption - o
2573
  msgid "or"
2574
  msgstr ""
2575
 
2576
- #: src/admin.php:692
2577
  msgid "You did not select any components to restore. Please select at least one, and then try again."
2578
  msgstr ""
2579
 
2580
- #: src/addons/sftp.php:442
2581
  msgctxt "Do not translate BEGIN RSA PRIVATE KEY. PCKS1, XML, PEM and PuTTY are also technical acronyms which should not be translated."
2582
  msgid "PKCS1 (PEM header: BEGIN RSA PRIVATE KEY), XML and PuTTY format keys are accepted."
2583
  msgstr ""
2584
 
2585
- #: src/addons/sftp.php:405
2586
  msgid "Resuming partial uploads is supported for SFTP, but not for SCP. Thus, if using SCP then you will need to ensure that your webserver allows PHP processes to run long enough to upload your largest backup file."
2587
  msgstr ""
2588
 
@@ -2591,7 +2675,7 @@ msgctxt "\"tenant\" is a term used with OpenStack storage - Google for \"OpenSta
2591
  msgid "tenant"
2592
  msgstr ""
2593
 
2594
- #: src/methods/openstack2.php:133
2595
  msgctxt "Keystone and swauth are technical terms which cannot be translated"
2596
  msgid "This needs to be a v2 (Keystone) authentication URI; v1 (Swauth) is not supported."
2597
  msgstr ""
@@ -2604,12 +2688,12 @@ msgstr ""
2604
  msgid "Check this box to have a basic report sent to"
2605
  msgstr ""
2606
 
2607
- #: src/admin.php:3123
2608
  msgctxt "i.e. Non-automatic"
2609
  msgid "Manual"
2610
  msgstr ""
2611
 
2612
- #: src/restorer.php:2183
2613
  msgctxt "The user is being told the number of times an error has happened, e.g. An error (27) occurred"
2614
  msgid "An error (%s) occurred:"
2615
  msgstr ""
@@ -2622,7 +2706,7 @@ msgstr ""
2622
  msgid "Any other file/directory on your server that you wish to back up"
2623
  msgstr ""
2624
 
2625
- #: src/admin.php:2350
2626
  msgid "For even more features and personal support, check out "
2627
  msgstr ""
2628
 
@@ -2631,7 +2715,7 @@ msgid "Database decryption phrase"
2631
  msgstr ""
2632
 
2633
  #: src/addons/autobackup.php:143, src/addons/autobackup.php:1007,
2634
- #: src/admin.php:697
2635
  msgid "Automatic backup before update"
2636
  msgstr ""
2637
 
@@ -2716,7 +2800,7 @@ msgstr ""
2716
  msgid "Note that after you have claimed your add-ons, you can remove your password (but not the email address) from the settings below, without affecting this site's access to updates."
2717
  msgstr ""
2718
 
2719
- #: src/admin.php:2684, src/admin.php:3632, src/admin.php:3633
2720
  msgid "View Log"
2721
  msgstr ""
2722
 
@@ -2733,7 +2817,7 @@ msgstr ""
2733
  msgid "and retain this many scheduled backups"
2734
  msgstr ""
2735
 
2736
- #: src/admin.php:3084
2737
  msgid "incremental backup; base backup: %s"
2738
  msgstr ""
2739
 
@@ -2745,28 +2829,28 @@ msgstr ""
2745
  msgid "Upload files into UpdraftPlus."
2746
  msgstr ""
2747
 
2748
- #: src/admin.php:936, src/includes/class-commands.php:376,
2749
  #: src/templates/wp-admin/settings/tab-status.php:22
2750
  msgid "The 'Backup Now' button is disabled as your backup directory is not writable (go to the 'Settings' tab and find the relevant option)."
2751
  msgstr ""
2752
 
2753
- #: src/class-updraftplus.php:4425
2754
  msgid "Backup label:"
2755
  msgstr ""
2756
 
2757
- #: src/addons/backblaze.php:189, src/admin.php:1875
2758
  msgid "Error: unexpected file read fail"
2759
  msgstr ""
2760
 
2761
- #: src/backup.php:3051
2762
  msgid "check your log for more details."
2763
  msgstr ""
2764
 
2765
- #: src/backup.php:3049
2766
  msgid "your web hosting account appears to be full; please see: %s"
2767
  msgstr ""
2768
 
2769
- #: src/backup.php:3047
2770
  msgid "A zip error occurred"
2771
  msgstr ""
2772
 
@@ -2774,19 +2858,19 @@ msgstr ""
2774
  msgid "Your label for this backup (optional)"
2775
  msgstr ""
2776
 
2777
- #: src/addons/googlecloud.php:908, src/methods/googledrive.php:1087
2778
  msgid "%s does not allow authorisation of sites hosted on direct IP addresses. You will need to change your site's address (%s) before you can use %s for storage."
2779
  msgstr ""
2780
 
2781
- #: src/methods/updraftvault.php:656, src/udaddons/updraftplus-addons.php:855
2782
  msgid "You entered an email address that was not recognised by UpdraftPlus.Com"
2783
  msgstr ""
2784
 
2785
- #: src/methods/updraftvault.php:653, src/udaddons/updraftplus-addons.php:851
2786
  msgid "Your email address was valid, but your password was not recognised by UpdraftPlus.Com."
2787
  msgstr ""
2788
 
2789
- #: src/methods/updraftvault.php:594, src/udaddons/updraftplus-addons.php:719
2790
  msgid "You need to supply both an email address and a password"
2791
  msgstr ""
2792
 
@@ -2794,36 +2878,36 @@ msgstr ""
2794
  msgid "To proceed, press 'Backup Now'. Then, watch the 'Last Log Message' field for activity."
2795
  msgstr ""
2796
 
2797
- #: src/class-updraftplus.php:4444
2798
  msgid "If you want to restore a multisite backup, you should first set up your WordPress installation as a multisite."
2799
  msgstr ""
2800
 
2801
- #: src/class-updraftplus.php:4444
2802
  msgid "Your backup is of a WordPress multisite install; but this site is not. Only the first site of the network will be accessible."
2803
  msgstr ""
2804
 
2805
- #: src/addons/migrator.php:1091
2806
  msgid "already done"
2807
  msgstr ""
2808
 
2809
- #: src/addons/migrator.php:1048
2810
  msgid "skipped (not in list)"
2811
  msgstr ""
2812
 
2813
- #: src/addons/migrator.php:1048, src/addons/migrator.php:1091,
2814
- #: src/addons/migrator.php:1223
2815
  msgid "Search and replacing table:"
2816
  msgstr ""
2817
 
2818
- #: src/addons/migrator.php:330
2819
  msgid "Enter a comma-separated list; otherwise, leave blank for all tables."
2820
  msgstr ""
2821
 
2822
- #: src/addons/migrator.php:330
2823
  msgid "These tables only"
2824
  msgstr ""
2825
 
2826
- #: src/addons/migrator.php:329
2827
  msgid "Rows per batch"
2828
  msgstr ""
2829
 
@@ -2835,19 +2919,19 @@ msgstr ""
2835
  msgid "You need to connect to receive future updates to UpdraftPlus."
2836
  msgstr ""
2837
 
2838
- #: src/class-updraftplus.php:4417
2839
  msgid "Any support requests to do with %s should be raised with your web hosting company."
2840
  msgstr ""
2841
 
2842
- #: src/class-updraftplus.php:4417
2843
  msgid "You should only proceed if you cannot update the current server and are confident (or willing to risk) that your plugins/themes/etc. are compatible with the older %s version."
2844
  msgstr ""
2845
 
2846
- #: src/class-updraftplus.php:4417
2847
  msgid "This is significantly newer than the server which you are now restoring onto (version %s)."
2848
  msgstr ""
2849
 
2850
- #: src/class-updraftplus.php:4417
2851
  msgid "The site in this backup was running on a webserver with version %s of %s. "
2852
  msgstr ""
2853
 
@@ -2876,7 +2960,7 @@ msgstr ""
2876
  msgid "UpdraftPlus is on social media - check us out!"
2877
  msgstr ""
2878
 
2879
- #: src/admin.php:3701
2880
  msgid "Why am I seeing this?"
2881
  msgstr ""
2882
 
@@ -2888,15 +2972,15 @@ msgstr ""
2888
  msgid "Press here to look inside your UpdraftPlus directory (in your web hosting space) for any new backup sets that you have uploaded."
2889
  msgstr ""
2890
 
2891
- #: src/admin.php:1814, src/admin.php:1826
2892
  msgid "Start backup"
2893
  msgstr ""
2894
 
2895
- #: src/class-updraftplus.php:4389, src/restorer.php:1010
2896
  msgid "You are using the %s webserver, but do not seem to have the %s module loaded."
2897
  msgstr ""
2898
 
2899
- #: src/admin.php:3007
2900
  msgid "You will need to consult with your web hosting provider to find out how to set permissions for a WordPress plugin to write to the directory."
2901
  msgstr ""
2902
 
@@ -2904,11 +2988,11 @@ msgstr ""
2904
  msgid "Unless you have a problem, you can completely ignore everything here."
2905
  msgstr ""
2906
 
2907
- #: src/admin.php:2036
2908
  msgid "This file could not be uploaded"
2909
  msgstr ""
2910
 
2911
- #: src/admin.php:2001
2912
  msgid "You will find more information about this in the Settings section."
2913
  msgstr ""
2914
 
@@ -2928,15 +3012,15 @@ msgstr ""
2928
  msgid "Memory limit"
2929
  msgstr ""
2930
 
2931
- #: src/class-updraftplus.php:4621, src/restorer.php:1493
2932
  msgid "restoration"
2933
  msgstr ""
2934
 
2935
- #: src/backup.php:864
2936
  msgid "Incremental"
2937
  msgstr ""
2938
 
2939
- #: src/backup.php:864
2940
  msgid "Full backup"
2941
  msgstr ""
2942
 
@@ -2952,62 +3036,62 @@ msgstr ""
2952
  msgid "Backup succeeded"
2953
  msgstr ""
2954
 
2955
- #: src/admin.php:3124, src/admin.php:3125, src/admin.php:3126,
2956
  #: src/updraftplus.php:99, src/updraftplus.php:100
2957
  msgid "Every %s hours"
2958
  msgstr ""
2959
 
2960
- #: src/addons/migrator.php:793, src/addons/migrator.php:795
2961
  msgid "search and replace"
2962
  msgstr ""
2963
 
2964
- #: src/addons/migrator.php:332
2965
  msgid "Go"
2966
  msgstr ""
2967
 
2968
- #: src/addons/migrator.php:321
2969
  msgid "A search/replace cannot be undone - are you sure you want to do this?"
2970
  msgstr ""
2971
 
2972
- #: src/addons/migrator.php:320
2973
  msgid "This can easily destroy your site; so, use it with care!"
2974
  msgstr ""
2975
 
2976
- #: src/addons/migrator.php:290, src/addons/migrator.php:328
2977
  msgid "Replace with"
2978
  msgstr ""
2979
 
2980
- #: src/addons/migrator.php:289, src/addons/migrator.php:327
2981
  msgid "Search for"
2982
  msgstr ""
2983
 
2984
- #: src/addons/migrator.php:288, src/addons/migrator.php:319,
2985
  #: src/templates/wp-admin/advanced/search-replace.php:7,
2986
  #: src/templates/wp-admin/advanced/tools-menu.php:18
2987
  msgid "Search / replace database"
2988
  msgstr ""
2989
 
2990
- #: src/addons/migrator.php:294
2991
  msgid "search term"
2992
  msgstr ""
2993
 
2994
- #: src/restorer.php:2211
2995
  msgid "Too many database errors have occurred - aborting"
2996
  msgstr ""
2997
 
2998
- #: src/backup.php:930
2999
  msgid "read more at %s"
3000
  msgstr ""
3001
 
3002
- #: src/backup.php:930
3003
  msgid "Email reports created by UpdraftPlus (free edition) bring you the latest UpdraftPlus.com news"
3004
  msgstr ""
3005
 
3006
- #: src/methods/googledrive.php:1095
3007
  msgid "N.B. If you install UpdraftPlus on several WordPress sites, then you cannot re-use your project; you must create a new one from your Google API console for each site."
3008
  msgstr ""
3009
 
3010
- #: src/admin.php:3459
3011
  msgid "You have not yet made any backups."
3012
  msgstr ""
3013
 
@@ -3027,30 +3111,30 @@ msgstr ""
3027
  msgid "Free disk space in account:"
3028
  msgstr ""
3029
 
3030
- #: src/admin.php:4269, src/templates/wp-admin/settings/tab-status.php:27
3031
  msgid "This button is disabled because your backup directory is not writable (see the settings)."
3032
  msgstr ""
3033
 
3034
- #: src/admin.php:524, src/admin.php:666, src/admin.php:1679,
3035
  #: src/includes/deprecated-actions.php:29,
3036
  #: src/templates/wp-admin/settings/downloading-and-restoring.php:21,
3037
  #: src/templates/wp-admin/settings/tab-bar.php:6
3038
  msgid "Existing Backups"
3039
  msgstr ""
3040
 
3041
- #: src/admin.php:516, src/templates/wp-admin/settings/tab-bar.php:5
3042
  msgid "Current Status"
3043
  msgstr ""
3044
 
3045
- #: src/admin.php:941
3046
  msgid "To change any of the default settings of what is backed up, to configure scheduled backups, to send your backups to remote storage (recommended), and more, go to the settings tab."
3047
  msgstr ""
3048
 
3049
- #: src/admin.php:941
3050
  msgid "To make a backup, just press the Backup Now button."
3051
  msgstr ""
3052
 
3053
- #: src/admin.php:941
3054
  msgid "Welcome to UpdraftPlus!"
3055
  msgstr ""
3056
 
@@ -3122,24 +3206,24 @@ msgstr ""
3122
  msgid "user"
3123
  msgstr ""
3124
 
3125
- #: src/class-updraftplus.php:1733
3126
  msgid "External database (%s)"
3127
  msgstr ""
3128
 
3129
- #: src/methods/googledrive.php:1095
3130
  msgid "Follow this link to your Google API Console, and there activate the Drive API and create a Client ID in the API Access section."
3131
  msgstr ""
3132
 
3133
- #: src/methods/googledrive.php:455
3134
  msgid "failed to access parent folder"
3135
  msgstr ""
3136
 
3137
- #: src/addons/googlecloud.php:615, src/addons/onedrive.php:762,
3138
- #: src/addons/onedrive.php:773, src/methods/googledrive.php:408
3139
  msgid "However, subsequent access attempts failed:"
3140
  msgstr ""
3141
 
3142
- #: src/admin.php:3484
3143
  msgid "External database"
3144
  msgstr ""
3145
 
@@ -3171,7 +3255,7 @@ msgstr ""
3171
  msgid "use UpdraftPlus Premium"
3172
  msgstr ""
3173
 
3174
- #: src/class-updraftplus.php:4286
3175
  msgid "Decryption failed. The database file is encrypted."
3176
  msgstr ""
3177
 
@@ -3179,62 +3263,62 @@ msgstr ""
3179
  msgid "Only the WordPress database can be restored; you will need to deal with the external database manually."
3180
  msgstr ""
3181
 
3182
- #: src/restorer.php:1758, src/restorer.php:2152, src/restorer.php:2193,
3183
- #: src/restorer.php:2206
3184
  msgid "An error occurred on the first %s command - aborting run"
3185
  msgstr ""
3186
 
3187
- #: src/addons/moredatabase.php:105, src/backup.php:1392
3188
  msgid "Connection failed: check your access details, that the database server is up, and that the network connection is not firewalled."
3189
  msgstr ""
3190
 
3191
- #: src/backup.php:1392
3192
  msgid "database connection attempt failed."
3193
  msgstr ""
3194
 
3195
- #: src/addons/migrator.php:979
3196
  msgid "Warning: the database's home URL (%s) is different to what we expected (%s)"
3197
  msgstr ""
3198
 
3199
- #: src/addons/google-enhanced.php:87
3200
  msgid "In %s, path names are case sensitive."
3201
  msgstr ""
3202
 
3203
- #: src/addons/azure.php:577, src/addons/google-enhanced.php:85,
3204
- #: src/addons/onedrive.php:983
3205
  msgid "If you leave it blank, then the backup will be placed in the root of your %s"
3206
  msgstr ""
3207
 
3208
- #: src/addons/google-enhanced.php:85, src/addons/googlecloud.php:946,
3209
- #: src/addons/onedrive.php:983
3210
  msgid "e.g. %s"
3211
  msgstr ""
3212
 
3213
- #: src/addons/google-enhanced.php:85, src/addons/onedrive.php:983
3214
  msgid "Enter the path of the %s folder you wish to use here."
3215
  msgstr ""
3216
 
3217
- #: src/addons/azure.php:570, src/methods/openstack2.php:164
3218
  msgid "Container"
3219
  msgstr ""
3220
 
3221
- #: src/methods/openstack2.php:147
3222
  msgid "Leave this blank, and a default will be chosen."
3223
  msgstr ""
3224
 
3225
- #: src/methods/openstack2.php:138
3226
  msgid "Tenant"
3227
  msgstr ""
3228
 
3229
- #: src/methods/openstack2.php:138
3230
  msgid "Follow this link for more information"
3231
  msgstr ""
3232
 
3233
- #: src/methods/openstack2.php:130, src/methods/openstack2.php:188
3234
  msgid "authentication URI"
3235
  msgstr ""
3236
 
3237
- #: src/methods/openstack2.php:125
3238
  msgid "Get your access credentials from your OpenStack Swift provider, and then pick a container name to use for storage. This container will be created for you if it does not already exist."
3239
  msgstr ""
3240
 
@@ -3254,24 +3338,24 @@ msgstr ""
3254
  msgid "Failed to upload %s"
3255
  msgstr ""
3256
 
3257
- #: src/methods/dropbox.php:641, src/methods/dropbox.php:643
3258
  msgid "Success:"
3259
  msgstr ""
3260
 
3261
- #: src/addons/onedrive.php:991, src/methods/dropbox.php:538
3262
  msgid "<strong>After</strong> you have saved your settings (by clicking 'Save Changes' below), then come back here once and click this link to complete authentication with %s."
3263
  msgstr ""
3264
 
3265
- #: src/addons/onedrive.php:989, src/methods/dropbox.php:528
3266
  msgid "(You appear to be already authenticated)."
3267
  msgstr ""
3268
 
3269
- #: src/methods/dropbox.php:523, src/methods/dropbox.php:532,
3270
- #: src/methods/dropbox.php:538
3271
  msgid "Dropbox"
3272
  msgstr ""
3273
 
3274
- #: src/addons/onedrive.php:988, src/methods/dropbox.php:523
3275
  msgid "Authenticate with %s"
3276
  msgstr ""
3277
 
@@ -3302,46 +3386,46 @@ msgstr ""
3302
  msgid "%s error - failed to access the container"
3303
  msgstr ""
3304
 
3305
- #: src/addons/googlecloud.php:988, src/addons/onedrive.php:990,
3306
- #: src/methods/dropbox.php:546, src/methods/googledrive.php:1161
3307
  msgid "Account holder's name: %s."
3308
  msgstr ""
3309
 
3310
- #: src/methods/googledrive.php:1139
3311
  msgid "To be able to set a custom folder name, use UpdraftPlus Premium."
3312
  msgstr ""
3313
 
3314
- #: src/methods/googledrive.php:1130
3315
  msgid "It is an ID number internal to Google Drive"
3316
  msgstr ""
3317
 
3318
- #: src/methods/googledrive.php:1130
3319
  msgid "<strong>This is NOT a folder name</strong>."
3320
  msgstr ""
3321
 
3322
- #: src/addons/google-enhanced.php:84, src/addons/onedrive.php:982,
3323
- #: src/methods/googledrive.php:1126, src/methods/googledrive.php:1136
3324
  msgid "Folder"
3325
  msgstr ""
3326
 
3327
- #: src/addons/googlecloud.php:296, src/addons/onedrive.php:366,
3328
- #: src/methods/googledrive.php:1046
3329
  msgid "%s download: failed: file not found"
3330
  msgstr ""
3331
 
3332
- #: src/addons/googlecloud.php:635, src/methods/googledrive.php:428
3333
  msgid "Name: %s."
3334
  msgstr ""
3335
 
3336
- #: src/methods/googledrive.php:186
3337
  msgid "Google Drive list files: failed to access parent folder"
3338
  msgstr ""
3339
 
3340
- #: src/methods/addon-not-yet-present.php:83, src/methods/insufficient.php:93
3341
  msgid "Your %s version: %s."
3342
  msgstr ""
3343
 
3344
- #: src/methods/addon-not-yet-present.php:82, src/methods/insufficient.php:92
3345
  msgid "You will need to ask your web hosting company to upgrade."
3346
  msgstr ""
3347
 
@@ -3358,7 +3442,7 @@ msgstr ""
3358
  msgid "Fetch"
3359
  msgstr ""
3360
 
3361
- #: src/addons/migrator.php:391,
3362
  #: src/templates/wp-admin/settings/downloading-and-restoring.php:61,
3363
  #: src/templates/wp-admin/settings/form-contents.php:210
3364
  msgid "This feature requires %s version %s or later"
@@ -3368,7 +3452,7 @@ msgstr ""
3368
  msgid "Failed to unpack the archive"
3369
  msgstr ""
3370
 
3371
- #: src/class-updraftplus.php:1265
3372
  msgid "Error - failed to download the file"
3373
  msgstr ""
3374
 
@@ -3376,28 +3460,28 @@ msgstr ""
3376
  msgid "Rescan local folder for new backup sets"
3377
  msgstr ""
3378
 
3379
- #: src/udaddons/updraftplus-addons.php:242
3380
  msgid "You should update UpdraftPlus to make sure that you have a version that has been tested for compatibility."
3381
  msgstr ""
3382
 
3383
- #: src/udaddons/updraftplus-addons.php:242
3384
  msgid "It has been tested up to version %s."
3385
  msgstr ""
3386
 
3387
- #: src/udaddons/updraftplus-addons.php:242
3388
  msgid "The installed version of UpdraftPlus Backup/Restore has not been tested on your version of WordPress (%s)."
3389
  msgstr ""
3390
 
3391
- #: src/addons/sftp.php:493
3392
  msgid "password/key"
3393
  msgstr ""
3394
 
3395
- #: src/addons/azure.php:563, src/addons/migrator.php:2208,
3396
- #: src/addons/sftp.php:439, src/admin.php:713, src/admin.php:4465
3397
  msgid "Key"
3398
  msgstr ""
3399
 
3400
- #: src/addons/sftp.php:434
3401
  msgid "Your login may be either password or key-based - you only need to enter one, not both."
3402
  msgstr ""
3403
 
@@ -3409,24 +3493,24 @@ msgstr ""
3409
  msgid "SCP/SFTP password/key"
3410
  msgstr ""
3411
 
3412
- #: src/admin.php:3519
3413
  msgid "Files backup (created by %s)"
3414
  msgstr ""
3415
 
3416
- #: src/admin.php:3519
3417
  msgid "Files and database WordPress backup (created by %s)"
3418
  msgstr ""
3419
 
3420
- #: src/addons/importer.php:276, src/admin.php:3513,
3421
  #: src/includes/class-backup-history.php:279
3422
  msgid "Backup created by: %s."
3423
  msgstr ""
3424
 
3425
- #: src/admin.php:3482
3426
  msgid "Database (created by %s)"
3427
  msgstr ""
3428
 
3429
- #: src/admin.php:3476, src/admin.php:3515
3430
  msgid "unknown source"
3431
  msgstr ""
3432
 
@@ -3438,33 +3522,33 @@ msgstr ""
3438
  msgid "Upload backup files"
3439
  msgstr ""
3440
 
3441
- #: src/admin.php:2080
3442
  msgid "This backup was created by %s, and can be imported."
3443
  msgstr ""
3444
 
3445
- #: src/admin.php:970
3446
  msgid "Read this page for a guide to possible causes and how to fix it."
3447
  msgstr ""
3448
 
3449
- #: src/admin.php:970
3450
  msgid "WordPress has a number (%d) of scheduled tasks which are overdue. Unless this is a development site, this probably means that the scheduler in your WordPress install is not working."
3451
  msgstr ""
3452
 
3453
- #: src/admin.php:678, src/includes/class-backup-history.php:286
3454
  msgid "If this is a backup created by a different backup plugin, then UpdraftPlus Premium may be able to help you."
3455
  msgstr ""
3456
 
3457
- #: src/admin.php:677
3458
  msgid "However, UpdraftPlus archives are standard zip/SQL files - so if you are sure that your file has the right format, then you can rename it to match that pattern."
3459
  msgstr ""
3460
 
3461
- #: src/admin.php:677, src/admin.php:678,
3462
  #: src/includes/class-backup-history.php:286
3463
  msgid "This file does not appear to be an UpdraftPlus backup archive (such files are .zip or .gz files which have a name like: backup_(time)_(site name)_(code)_(type).(zip|gz))."
3464
  msgstr ""
3465
 
3466
- #: src/admin.php:3516, src/includes/class-wpadmin-commands.php:152,
3467
- #: src/restorer.php:1462
3468
  msgid "Backup created by unknown source (%s) - cannot be restored."
3469
  msgstr ""
3470
 
@@ -3476,16 +3560,16 @@ msgstr ""
3476
  msgid "This version of UpdraftPlus does not know how to handle this type of foreign backup"
3477
  msgstr ""
3478
 
3479
- #: src/methods/dropbox.php:313
3480
  msgid "%s returned an unexpected HTTP response: %s"
3481
  msgstr ""
3482
 
3483
- #: src/addons/sftp.php:963
3484
  msgid "The UpdraftPlus module for this file access method (%s) does not support listing files"
3485
  msgstr ""
3486
 
3487
  #: src/addons/backblaze.php:515, src/methods/cloudfiles.php:246,
3488
- #: src/methods/dropbox.php:294, src/methods/openstack-base.php:111
3489
  msgid "No settings were found"
3490
  msgstr ""
3491
 
@@ -3493,16 +3577,16 @@ msgstr ""
3493
  msgid "One or more backups has been added from scanning remote storage; note that these backups will not be automatically deleted through the \"retain\" settings; if/when you wish to delete them then you must do so manually."
3494
  msgstr ""
3495
 
3496
- #: src/admin.php:644
3497
  msgid "Rescanning remote and local storage for backup sets..."
3498
  msgstr ""
3499
 
3500
- #: src/addons/googlecloud.php:951, src/addons/googlecloud.php:966,
3501
  #: src/addons/s3-enhanced.php:54, src/addons/s3-enhanced.php:67
3502
  msgid "(Read more)"
3503
  msgstr ""
3504
 
3505
- #: src/addons/reporting.php:431
3506
  msgid "Log all messages to syslog (only server admins are likely to want this)"
3507
  msgstr ""
3508
 
@@ -3515,7 +3599,7 @@ msgstr ""
3515
  msgid "Remove"
3516
  msgstr ""
3517
 
3518
- #: src/methods/s3.php:847
3519
  msgid "Other %s FAQs."
3520
  msgstr ""
3521
 
@@ -3523,16 +3607,16 @@ msgstr ""
3523
  msgid "Check this to receive more information and emails on the backup process - useful if something is going wrong."
3524
  msgstr ""
3525
 
3526
- #: src/addons/morefiles.php:445, src/admin.php:3216
3527
  msgid "If entering multiple files/directories, then separate them with commas. For entities at the top level, you can use a * at the start or end of the entry as a wildcard."
3528
  msgstr ""
3529
 
3530
- #: src/class-updraftplus.php:4621, src/methods/ftp.php:309,
3531
- #: src/restorer.php:1493
3532
  msgid "Your hosting company must enable these functions before %s can work."
3533
  msgstr ""
3534
 
3535
- #: src/class-updraftplus.php:4621, src/methods/ftp.php:309
3536
  msgid "Your web server's PHP installation has these functions disabled: %s."
3537
  msgstr ""
3538
 
@@ -3548,69 +3632,69 @@ msgstr ""
3548
  msgid "regular non-encrypted FTP"
3549
  msgstr ""
3550
 
3551
- #: src/restorer.php:1666
3552
  msgid "Backup created by:"
3553
  msgstr ""
3554
 
3555
- #: src/udaddons/options.php:485
3556
  msgid "Available to claim on this site"
3557
  msgstr ""
3558
 
3559
- #: src/udaddons/updraftplus-addons.php:263
3560
  msgid "To maintain your access to support, please renew."
3561
  msgstr ""
3562
 
3563
- #: src/udaddons/updraftplus-addons.php:263
3564
  msgid "Your paid access to UpdraftPlus support will soon expire."
3565
  msgstr ""
3566
 
3567
- #: src/udaddons/updraftplus-addons.php:261
3568
  msgid "To regain your access, please renew."
3569
  msgstr ""
3570
 
3571
- #: src/udaddons/updraftplus-addons.php:261
3572
  msgid "Your paid access to UpdraftPlus support has expired."
3573
  msgstr ""
3574
 
3575
- #: src/udaddons/updraftplus-addons.php:257
3576
  msgid "Your paid access to UpdraftPlus updates for this site will soon expire."
3577
  msgstr ""
3578
 
3579
- #: src/udaddons/updraftplus-addons.php:255,
3580
- #: src/udaddons/updraftplus-addons.php:257
3581
  msgid "To retain your access, and maintain access to updates (including future features and compatibility with future WordPress releases) and support, please renew."
3582
  msgstr ""
3583
 
3584
- #: src/udaddons/updraftplus-addons.php:255
3585
  msgid "Your paid access to UpdraftPlus updates for %s of the %s add-ons on this site will soon expire."
3586
  msgstr ""
3587
 
3588
- #: src/udaddons/updraftplus-addons.php:251
3589
  msgid "Your paid access to UpdraftPlus updates for %s add-ons on this site has expired."
3590
  msgstr ""
3591
 
3592
- #: src/udaddons/updraftplus-addons.php:249,
3593
- #: src/udaddons/updraftplus-addons.php:251
3594
  msgid "To regain access to updates (including future features and compatibility with future WordPress releases) and support, please renew."
3595
  msgstr ""
3596
 
3597
- #: src/udaddons/updraftplus-addons.php:249
3598
  msgid "Your paid access to UpdraftPlus updates for this site has expired. You will no longer receive updates to UpdraftPlus."
3599
  msgstr ""
3600
 
3601
- #: src/udaddons/updraftplus-addons.php:214
3602
  msgid "Dismiss from main dashboard (for %s weeks)"
3603
  msgstr ""
3604
 
3605
- #: src/class-updraftplus.php:4671
3606
  msgid "The attempt to undo the double-compression succeeded."
3607
  msgstr ""
3608
 
3609
- #: src/class-updraftplus.php:4648, src/class-updraftplus.php:4669
3610
  msgid "The attempt to undo the double-compression failed."
3611
  msgstr ""
3612
 
3613
- #: src/class-updraftplus.php:4641
3614
  msgid "The database file appears to have been compressed twice - probably the website you downloaded it from had a mis-configured webserver."
3615
  msgstr ""
3616
 
@@ -3618,32 +3702,32 @@ msgstr ""
3618
  msgid "Constants"
3619
  msgstr ""
3620
 
3621
- #: src/backup.php:1629
3622
  msgid "Failed to open database file for reading:"
3623
  msgstr ""
3624
 
3625
- #: src/backup.php:1440
3626
  msgid "No database tables found"
3627
  msgstr ""
3628
 
3629
- #: src/backup.php:1438
3630
  msgid "please wait for the rescheduled attempt"
3631
  msgstr ""
3632
 
3633
- #: src/addons/reporting.php:206
3634
  msgid "Note that warning messages are advisory - the backup process does not stop for them. Instead, they provide information that you might find useful, or that may indicate the source of a problem if the backup did not succeed."
3635
  msgstr ""
3636
 
3637
- #: src/addons/onedrive.php:91, src/methods/dropbox.php:203
3638
  msgid "Account full: your %s account has only %d bytes left, but the file to be uploaded has %d bytes remaining (total size: %d bytes)"
3639
  msgstr ""
3640
 
3641
- #: src/udaddons/updraftplus-addons.php:442,
3642
- #: src/udaddons/updraftplus-addons.php:447
3643
  msgid "Errors occurred:"
3644
  msgstr ""
3645
 
3646
- #: src/admin.php:3721
3647
  msgid "Follow this link to download the log file for this restoration (needed for any support requests)."
3648
  msgstr ""
3649
 
@@ -3667,24 +3751,24 @@ msgstr ""
3667
  msgid "Existing unremoved folders from a previous restore exist (please use the \"Delete Old Directories\" button to delete them before trying again): %s"
3668
  msgstr ""
3669
 
3670
- #: src/admin.php:945, src/class-updraftplus.php:783
3671
  msgid "The amount of time allowed for WordPress plugins to run is very low (%s seconds) - you should increase it to avoid backup failures due to time-outs (consult your web hosting company for more help - it is the max_execution_time PHP setting; the recommended value is %s seconds or more)"
3672
  msgstr ""
3673
 
3674
- #: src/addons/migrator.php:261
3675
  msgid "Disabled this plugin: %s: re-activate it manually when you are ready."
3676
  msgstr ""
3677
 
3678
- #: src/addons/sftp.php:718, src/addons/sftp.php:721,
3679
  #: src/includes/ftp.class.php:58, src/includes/ftp.class.php:61
3680
  msgid "The %s connection timed out; if you entered the server correctly, then this is usually caused by a firewall blocking the connection - you should check with your web hosting company."
3681
  msgstr ""
3682
 
3683
- #: src/addons/moredatabase.php:137, src/admin.php:1421
3684
  msgid "Messages:"
3685
  msgstr ""
3686
 
3687
- #: src/restorer.php:2046
3688
  msgid "An SQL line that is larger than the maximum packet size and cannot be split was found; this line will not be processed, but will be dropped: %s"
3689
  msgstr ""
3690
 
@@ -3777,59 +3861,66 @@ msgstr ""
3777
  msgid "Rackspace Cloud Files, enhanced"
3778
  msgstr ""
3779
 
3780
- #: src/addons/cloudfiles-enhanced.php:278, src/methods/cloudfiles-new.php:163
 
3781
  msgid "Cloud Files Container"
3782
  msgstr ""
3783
 
3784
- #: src/methods/cloudfiles-new.php:158
3785
  msgid "Cloud Files API Key"
3786
  msgstr ""
3787
 
3788
- #: src/methods/cloudfiles-new.php:153
3789
  msgid "To create a new Rackspace API sub-user and API key that has access only to this Rackspace container, use this add-on."
3790
  msgstr ""
3791
 
3792
- #: src/methods/cloudfiles-new.php:150
3793
  msgid "Cloud Files Username"
3794
  msgstr ""
3795
 
3796
- #: src/addons/cloudfiles-enhanced.php:47, src/methods/cloudfiles-new.php:136
 
3797
  msgid "London (LON)"
3798
  msgstr ""
3799
 
3800
- #: src/addons/cloudfiles-enhanced.php:46, src/methods/cloudfiles-new.php:135
 
3801
  msgid "Hong Kong (HKG)"
3802
  msgstr ""
3803
 
3804
- #: src/addons/cloudfiles-enhanced.php:45, src/methods/cloudfiles-new.php:134
 
3805
  msgid "Northern Virginia (IAD)"
3806
  msgstr ""
3807
 
3808
- #: src/addons/cloudfiles-enhanced.php:44, src/methods/cloudfiles-new.php:133
 
3809
  msgid "Chicago (ORD)"
3810
  msgstr ""
3811
 
3812
- #: src/addons/cloudfiles-enhanced.php:43, src/methods/cloudfiles-new.php:132
 
3813
  msgid "Sydney (SYD)"
3814
  msgstr ""
3815
 
3816
- #: src/addons/cloudfiles-enhanced.php:42, src/methods/cloudfiles-new.php:131
 
3817
  msgid "Dallas (DFW) (default)"
3818
  msgstr ""
3819
 
3820
- #: src/addons/cloudfiles-enhanced.php:274, src/methods/cloudfiles-new.php:126
3821
  msgid "Cloud Files Storage Region"
3822
  msgstr ""
3823
 
3824
- #: src/methods/cloudfiles-new.php:118
3825
  msgid "Accounts created at rackspacecloud.com are US-accounts; accounts created at rackspace.co.uk are UK-based"
3826
  msgstr ""
3827
 
3828
- #: src/methods/cloudfiles-new.php:116
3829
  msgid "US or UK-based Rackspace Account"
3830
  msgstr ""
3831
 
3832
- #: src/addons/cloudfiles-enhanced.php:258, src/methods/cloudfiles-new.php:116
3833
  msgid "Accounts created at rackspacecloud.com are US accounts; accounts created at rackspace.co.uk are UK accounts."
3834
  msgstr ""
3835
 
@@ -3840,39 +3931,39 @@ msgstr ""
3840
  msgid "Authorisation failed (check your credentials)"
3841
  msgstr ""
3842
 
3843
- #: src/methods/updraftvault.php:568, src/udaddons/options.php:270
3844
  msgid "An unknown error occurred when trying to connect to UpdraftPlus.Com"
3845
  msgstr ""
3846
 
3847
- #: src/admin.php:691, src/central/bootstrap.php:535
3848
  msgid "Create"
3849
  msgstr ""
3850
 
3851
- #: src/admin.php:653
3852
  msgid "Trying..."
3853
  msgstr ""
3854
 
3855
- #: src/admin.php:652
3856
  msgid "The new user's RackSpace console password is (this will not be shown again):"
3857
  msgstr ""
3858
 
3859
- #: src/admin.php:663, src/admin.php:3997
3860
  msgid "Error data:"
3861
  msgstr ""
3862
 
3863
- #: src/admin.php:3672
3864
  msgid "Backup does not exist in the backup history"
3865
  msgstr ""
3866
 
3867
- #: src/admin.php:2628
3868
  msgid "Your WordPress install has old directories from its state before you restored/migrated (technical information: these are suffixed with -old). You should press this button to delete them as soon as you have verified that the restoration worked."
3869
  msgstr ""
3870
 
3871
- #: src/restorer.php:1733
3872
  msgid "Split line to avoid exceeding maximum packet size"
3873
  msgstr ""
3874
 
3875
- #: src/restorer.php:1613
3876
  msgid "Your database user does not have permission to drop tables. We will attempt to restore by simply emptying the tables; this should work as long as you are restoring from a WordPress version with the same database structure (%s)"
3877
  msgstr ""
3878
 
@@ -3892,91 +3983,91 @@ msgstr ""
3892
  msgid "Moving old data out of the way..."
3893
  msgstr ""
3894
 
3895
- #: src/addons/reporting.php:422
3896
  msgid "Add another address..."
3897
  msgstr ""
3898
 
3899
- #: src/addons/reporting.php:408
3900
  msgid "Enter addresses here to have a report sent to them when a backup job finishes."
3901
  msgstr ""
3902
 
3903
- #: src/addons/reporting.php:383
3904
  msgid "Email reports"
3905
  msgstr ""
3906
 
3907
- #: src/class-updraftplus.php:1741, src/class-updraftplus.php:1746
3908
  msgid "%s checksum: %s"
3909
  msgstr ""
3910
 
3911
- #: src/class-updraftplus.php:1714, src/class-updraftplus.php:1716
3912
  msgid "files: %s"
3913
  msgstr ""
3914
 
3915
- #: src/addons/reporting.php:347
3916
  msgid "Use the \"Reporting\" section to configure the email addresses to be used."
3917
  msgstr ""
3918
 
3919
- #: src/addons/reporting.php:256
3920
  msgid "Debugging information"
3921
  msgstr ""
3922
 
3923
- #: src/addons/reporting.php:211, src/admin.php:3415
3924
  msgid "Uploaded to:"
3925
  msgstr ""
3926
 
3927
- #: src/addons/reporting.php:210
3928
  msgid "Time taken:"
3929
  msgstr ""
3930
 
3931
- #: src/addons/reporting.php:201
3932
  msgid "Warnings"
3933
  msgstr ""
3934
 
3935
- #: src/addons/reporting.php:186
3936
  msgid "Errors"
3937
  msgstr ""
3938
 
3939
- #: src/addons/reporting.php:183
3940
  msgid "Errors / warnings:"
3941
  msgstr ""
3942
 
3943
  #: src/addons/morefiles.php:119, src/addons/morefiles.php:120,
3944
- #: src/addons/reporting.php:172
3945
  msgid "Contains:"
3946
  msgstr ""
3947
 
3948
- #: src/addons/reporting.php:171
3949
  msgid "Backup began:"
3950
  msgstr ""
3951
 
3952
- #: src/addons/reporting.php:159
3953
  msgid "Backup Report"
3954
  msgstr ""
3955
 
3956
- #: src/addons/reporting.php:154
3957
  msgid "%d hours, %d minutes, %d seconds"
3958
  msgstr ""
3959
 
3960
- #: src/addons/reporting.php:140
3961
  msgid "%d errors, %d warnings"
3962
  msgstr ""
3963
 
3964
- #: src/addons/onedrive.php:718, src/methods/dropbox.php:625
3965
  msgid "%s authentication"
3966
  msgstr ""
3967
 
3968
- #: src/addons/onedrive.php:718, src/class-updraftplus.php:468,
3969
- #: src/methods/dropbox.php:176, src/methods/dropbox.php:598,
3970
- #: src/methods/dropbox.php:625, src/methods/dropbox.php:638,
3971
- #: src/methods/dropbox.php:784
3972
  msgid "%s error: %s"
3973
  msgstr ""
3974
 
3975
- #: src/addons/googlecloud.php:901, src/methods/dropbox.php:496
3976
  msgid "%s logo"
3977
  msgstr ""
3978
 
3979
- #: src/methods/dropbox.php:222
3980
  msgid "%s did not return the expected response - check your log file for more details"
3981
  msgstr ""
3982
 
@@ -3992,8 +4083,8 @@ msgstr ""
3992
  msgid "Your site's admin email address (%s) will be used."
3993
  msgstr ""
3994
 
3995
- #: src/admin.php:700, src/methods/updraftvault.php:302,
3996
- #: src/methods/updraftvault.php:347, src/udaddons/options.php:249
3997
  msgid "Connect"
3998
  msgstr ""
3999
 
@@ -4001,56 +4092,56 @@ msgstr ""
4001
  msgid "For more reporting features, use the Reporting add-on."
4002
  msgstr ""
4003
 
4004
- #: src/class-updraftplus.php:4361
4005
  msgid "(version: %s)"
4006
  msgstr ""
4007
 
4008
- #: src/addons/reporting.php:455, src/addons/reporting.php:455,
4009
- #: src/admin.php:642
4010
  msgid "Be aware that mail servers tend to have size limits; typically around %s Mb; backups larger than any limits will likely not arrive."
4011
  msgstr ""
4012
 
4013
- #: src/addons/reporting.php:455, src/admin.php:641
4014
  msgid "When the Email storage method is enabled, also send the entire backup"
4015
  msgstr ""
4016
 
4017
- #: src/addons/reporting.php:170, src/backup.php:965
4018
  msgid "Latest status:"
4019
  msgstr ""
4020
 
4021
- #: src/backup.php:964
4022
  msgid "Backup contains:"
4023
  msgstr ""
4024
 
4025
- #: src/backup.php:921
4026
  msgid "Backed up: %s"
4027
  msgstr ""
4028
 
4029
- #: src/addons/reporting.php:253, src/backup.php:915
4030
  msgid "The log file has been attached to this email."
4031
  msgstr ""
4032
 
4033
- #: src/backup.php:879
4034
  msgid "Unknown/unexpected error - please raise a support request"
4035
  msgstr ""
4036
 
4037
- #: src/backup.php:876
4038
  msgid "Database only (files were not part of this particular schedule)"
4039
  msgstr ""
4040
 
4041
- #: src/backup.php:876
4042
  msgid "Database (files backup has not completed)"
4043
  msgstr ""
4044
 
4045
- #: src/backup.php:873
4046
  msgid "Files only (database was not part of this particular schedule)"
4047
  msgstr ""
4048
 
4049
- #: src/backup.php:873
4050
  msgid "Files (database backup has not completed)"
4051
  msgstr ""
4052
 
4053
- #: src/admin.php:297, src/backup.php:871
4054
  msgid "Files and database"
4055
  msgstr ""
4056
 
@@ -4074,39 +4165,39 @@ msgstr ""
4074
  msgid "UpdraftPlus warning:"
4075
  msgstr ""
4076
 
4077
- #: src/udaddons/options.php:491
4078
  msgid "(or connect using the form on this page if you have already purchased it)"
4079
  msgstr ""
4080
 
4081
- #: src/udaddons/options.php:477
4082
  msgid "please follow this link to update the plugin in order to activate it"
4083
  msgstr ""
4084
 
4085
- #: src/udaddons/options.php:474
4086
  msgid "please follow this link to update the plugin in order to get it"
4087
  msgstr ""
4088
 
4089
- #: src/udaddons/options.php:464, src/udaddons/options.php:466
4090
  msgid "latest"
4091
  msgstr ""
4092
 
4093
- #: src/udaddons/options.php:462
4094
  msgid "Your version: %s"
4095
  msgstr ""
4096
 
4097
- #: src/udaddons/options.php:460, src/udaddons/options.php:460
4098
  msgid "You've got it"
4099
  msgstr ""
4100
 
4101
- #: src/udaddons/options.php:421
4102
  msgid "UpdraftPlus Support"
4103
  msgstr ""
4104
 
4105
- #: src/udaddons/options.php:379
4106
  msgid "An update containing your addons is available for UpdraftPlus - please follow this link to get it."
4107
  msgstr ""
4108
 
4109
- #: src/udaddons/options.php:368, src/udaddons/updraftplus-addons.php:290
4110
  msgid "UpdraftPlus Addons"
4111
  msgstr ""
4112
 
@@ -4114,24 +4205,24 @@ msgstr ""
4114
  msgid "An update is available for UpdraftPlus - please follow this link to get it."
4115
  msgstr ""
4116
 
4117
- #: src/methods/updraftvault.php:647, src/methods/updraftvault.php:662,
4118
- #: src/udaddons/updraftplus-addons.php:862
4119
  msgid "UpdraftPlus.Com returned a response, but we could not understand it"
4120
  msgstr ""
4121
 
4122
- #: src/methods/updraftvault.php:659, src/udaddons/updraftplus-addons.php:858
4123
  msgid "Your email address and password were not recognised by UpdraftPlus.Com"
4124
  msgstr ""
4125
 
4126
- #: src/methods/updraftvault.php:620, src/udaddons/updraftplus-addons.php:821
4127
  msgid "UpdraftPlus.Com returned a response which we could not understand (data: %s)"
4128
  msgstr ""
4129
 
4130
- #: src/udaddons/updraftplus-addons.php:746
4131
  msgid "UpdraftPlus.Com responded, but we did not understand the response"
4132
  msgstr ""
4133
 
4134
- #: src/udaddons/updraftplus-addons.php:744
4135
  msgid "We failed to successfully connect to UpdraftPlus.Com"
4136
  msgstr ""
4137
 
@@ -4142,15 +4233,15 @@ msgstr ""
4142
  msgid "Reporting"
4143
  msgstr ""
4144
 
4145
- #: src/admin.php:4462
4146
  msgid "Options (raw)"
4147
  msgstr ""
4148
 
4149
- #: src/addons/reporting.php:453, src/admin.php:640
4150
  msgid "Send a report only when there are warnings/errors"
4151
  msgstr ""
4152
 
4153
- #: src/restorer.php:1677
4154
  msgid "Content URL:"
4155
  msgstr ""
4156
 
@@ -4162,67 +4253,67 @@ msgstr ""
4162
  msgid "See also the \"More Files\" add-on from our shop."
4163
  msgstr ""
4164
 
4165
- #: src/backup.php:3038, src/class-updraftplus.php:796
4166
  msgid "Your free space in your hosting account is very low - only %s Mb remain"
4167
  msgstr ""
4168
 
4169
- #: src/class-updraftplus.php:780
4170
  msgid "The amount of memory (RAM) allowed for PHP is very low (%s Mb) - you should increase it to avoid failures due to insufficient memory (consult your web hosting company for more help)"
4171
  msgstr ""
4172
 
4173
- #: src/udaddons/options.php:556
4174
  msgid "Manage Addons"
4175
  msgstr ""
4176
 
4177
- #: src/udaddons/options.php:492, src/udaddons/options.php:492
4178
  msgid "Buy It"
4179
  msgstr ""
4180
 
4181
- #: src/udaddons/options.php:491
4182
  msgid "Get it from the UpdraftPlus.Com Store"
4183
  msgstr ""
4184
 
4185
- #: src/udaddons/options.php:485, src/udaddons/options.php:487
4186
  msgid "activate it on this site"
4187
  msgstr ""
4188
 
4189
- #: src/udaddons/options.php:487
4190
  msgid "You have an inactive purchase"
4191
  msgstr ""
4192
 
4193
- #: src/udaddons/options.php:477
4194
  msgid "Assigned to this site"
4195
  msgstr ""
4196
 
4197
- #: src/udaddons/options.php:474
4198
  msgid "Available for this site (via your all-addons purchase)"
4199
  msgstr ""
4200
 
4201
- #: src/udaddons/options.php:468
4202
  msgid "(apparently a pre-release or withdrawn release)"
4203
  msgstr ""
4204
 
4205
- #: src/udaddons/options.php:423
4206
  msgid "Go here"
4207
  msgstr ""
4208
 
4209
- #: src/udaddons/options.php:423
4210
  msgid "Need to get support?"
4211
  msgstr ""
4212
 
4213
- #: src/udaddons/options.php:405
4214
  msgid "An error occurred when trying to retrieve your add-ons."
4215
  msgstr ""
4216
 
4217
- #: src/udaddons/options.php:338
4218
  msgid "An unknown response was received. Response was:"
4219
  msgstr ""
4220
 
4221
- #: src/udaddons/options.php:337
4222
  msgid "Claim not granted - your account login details were wrong"
4223
  msgstr ""
4224
 
4225
- #: src/udaddons/options.php:335
4226
  msgid "Please wait whilst we make the claim..."
4227
  msgstr ""
4228
 
@@ -4294,7 +4385,7 @@ msgstr ""
4294
  msgid "Your web-server does not have the %s module installed."
4295
  msgstr ""
4296
 
4297
- #: src/addons/googlecloud.php:984, src/methods/googledrive.php:1148
4298
  msgid "<strong>(You appear to be already authenticated,</strong> though you can authenticate again to refresh your access if you've had a problem)."
4299
  msgstr ""
4300
 
@@ -4302,23 +4393,19 @@ msgstr ""
4302
  msgid "Drop backup files here"
4303
  msgstr ""
4304
 
4305
- #: src/admin.php:2507
4306
- msgid "Does nothing happen when you attempt backups?"
4307
- msgstr ""
4308
-
4309
- #: src/admin.php:651
4310
  msgid "The web server returned an error code (try again, or check your web server logs)"
4311
  msgstr ""
4312
 
4313
- #: src/admin.php:649
4314
  msgid "The restore operation has begun. Do not press stop or close your browser until it reports itself as having finished."
4315
  msgstr ""
4316
 
4317
- #: src/admin.php:646
4318
  msgid "If you exclude both the database and the files, then you have excluded everything!"
4319
  msgstr ""
4320
 
4321
- #: src/restorer.php:1671
4322
  msgid "Site home:"
4323
  msgstr ""
4324
 
@@ -4343,11 +4430,11 @@ msgstr ""
4343
  msgid "You can send a backup to more than one destination with an add-on."
4344
  msgstr ""
4345
 
4346
- #: src/admin.php:2846
4347
  msgid "Note: the progress bar below is based on stages, NOT time. Do not stop the backup simply because it seems to have remained in the same place for a while - that is normal."
4348
  msgstr ""
4349
 
4350
- #: src/admin.php:2744
4351
  msgid "(%s%%, file %s of %s)"
4352
  msgstr ""
4353
 
@@ -4356,15 +4443,15 @@ msgstr ""
4356
  msgid "Read more about how this works..."
4357
  msgstr ""
4358
 
4359
- #: src/addons/sftp.php:555
4360
  msgid "Failed: We were able to log in, but failed to successfully create a file in that location."
4361
  msgstr ""
4362
 
4363
- #: src/addons/sftp.php:553
4364
  msgid "Failed: We were able to log in and move to the indicated directory, but failed to successfully create a file in that location."
4365
  msgstr ""
4366
 
4367
- #: src/addons/sftp.php:465
4368
  msgid "Use SCP instead of SFTP"
4369
  msgstr ""
4370
 
@@ -4384,15 +4471,15 @@ msgstr ""
4384
  msgid "Backup is of: %s."
4385
  msgstr ""
4386
 
4387
- #: src/admin.php:739
4388
  msgid "%s settings test result:"
4389
  msgstr ""
4390
 
4391
- #: src/admin.php:3583, src/admin.php:3585
4392
  msgid "(Not finished)"
4393
  msgstr ""
4394
 
4395
- #: src/admin.php:3585
4396
  msgid "If you are seeing more backups than you expect, then it is probably because the deletion of old backup sets does not happen until a fresh backup completes."
4397
  msgstr ""
4398
 
@@ -4404,77 +4491,77 @@ msgstr ""
4404
  msgid "This is where UpdraftPlus will write the zip files it creates initially. This directory must be writable by your web server. It is relative to your content directory (which by default is called wp-content)."
4405
  msgstr ""
4406
 
4407
- #: src/admin.php:2841
4408
  msgid "Job ID: %s"
4409
  msgstr ""
4410
 
4411
- #: src/admin.php:2826
4412
  msgid "last activity: %ss ago"
4413
  msgstr ""
4414
 
4415
- #: src/admin.php:2825
4416
  msgid "next resumption: %d (after %ss)"
4417
  msgstr ""
4418
 
4419
- #: src/admin.php:2808, src/central/bootstrap.php:424,
4420
- #: src/central/bootstrap.php:431, src/methods/updraftvault.php:382,
4421
- #: src/methods/updraftvault.php:467
4422
  msgid "Unknown"
4423
  msgstr ""
4424
 
4425
- #: src/admin.php:2758
4426
  msgid "Backup finished"
4427
  msgstr ""
4428
 
4429
- #: src/admin.php:2753
4430
  msgid "Waiting until scheduled time to retry because of errors"
4431
  msgstr ""
4432
 
4433
- #: src/admin.php:2749
4434
  msgid "Pruning old backup sets"
4435
  msgstr ""
4436
 
4437
- #: src/admin.php:2737
4438
  msgid "Uploading files to remote storage"
4439
  msgstr ""
4440
 
4441
- #: src/admin.php:2806
4442
  msgid "Encrypted database"
4443
  msgstr ""
4444
 
4445
- #: src/admin.php:2798
4446
  msgid "Encrypting database"
4447
  msgstr ""
4448
 
4449
- #: src/admin.php:2772
4450
  msgid "Created database backup"
4451
  msgstr ""
4452
 
4453
- #: src/admin.php:2785
4454
  msgid "table: %s"
4455
  msgstr ""
4456
 
4457
- #: src/admin.php:2783
4458
  msgid "Creating database backup"
4459
  msgstr ""
4460
 
4461
- #: src/admin.php:2731
4462
  msgid "Created file backup zips"
4463
  msgstr ""
4464
 
4465
- #: src/admin.php:2718
4466
  msgid "Creating file backup zips"
4467
  msgstr ""
4468
 
4469
- #: src/admin.php:2713
4470
  msgid "Backup begun"
4471
  msgstr ""
4472
 
4473
- #: src/admin.php:2556
4474
  msgid "Backups in progress:"
4475
  msgstr ""
4476
 
4477
- #: src/admin.php:949
4478
  msgid "The scheduler is disabled in your WordPress install, via the DISABLE_WP_CRON setting. No backups can run (even &quot;Backup Now&quot;) unless either you have set up a facility to call the scheduler manually, or until it is enabled."
4479
  msgstr ""
4480
 
@@ -4490,25 +4577,24 @@ msgstr ""
4490
  msgid "UpdraftPlus needed to create a %s in your content directory, but failed - please check your file permissions and enable the access (%s)"
4491
  msgstr ""
4492
 
4493
- #: src/class-updraftplus.php:2830
4494
  msgid "The backup has not finished; a resumption is scheduled"
4495
  msgstr ""
4496
 
4497
- #: src/class-updraftplus.php:2018
4498
  msgid "Your website is visited infrequently and UpdraftPlus is not getting the resources it hoped for; please read this page:"
4499
  msgstr ""
4500
 
4501
  #: src/addons/onedrive.php:865,
4502
- #: src/includes/Dropbox/OAuth/Consumer/ConsumerAbstract.php:115,
4503
  #: src/includes/Dropbox2/OAuth/Consumer/ConsumerAbstract.php:118
4504
  msgid "The %s authentication could not go ahead, because something else on your site is breaking it. Try disabling your other plugins and switching to a default theme. (Specifically, you are looking for the component that sends output (most likely PHP warnings/errors) before the page begins. Turning off any debugging settings may also help)."
4505
  msgstr ""
4506
 
4507
- #: src/admin.php:2378
4508
  msgid "Your PHP memory limit (set by your web hosting company) is very low. UpdraftPlus attempted to raise it but was unsuccessful. This plugin may struggle with a memory limit of less than 64 Mb - especially if you have very large files uploaded (though on the other hand, many sites will be successful with a 32Mb limit - your experience may vary)."
4509
  msgstr ""
4510
 
4511
- #: src/addons/autobackup.php:1085, src/admin.php:693
4512
  msgid "Proceed with update"
4513
  msgstr ""
4514
 
@@ -4583,84 +4669,84 @@ msgstr ""
4583
  msgid "Support"
4584
  msgstr ""
4585
 
4586
- #: src/class-updraftplus.php:4562
4587
  msgid "UpdraftPlus was unable to find the table prefix when scanning the database backup."
4588
  msgstr ""
4589
 
4590
- #: src/class-updraftplus.php:4554
4591
  msgid "This database backup is missing core WordPress tables: %s"
4592
  msgstr ""
4593
 
4594
- #: src/class-updraftplus.php:4410
4595
  msgid "You are importing from a newer version of WordPress (%s) into an older one (%s). There are no guarantees that WordPress can handle this."
4596
  msgstr ""
4597
 
4598
- #: src/class-updraftplus.php:4409, src/class-updraftplus.php:4416
4599
  msgid "%s version: %s"
4600
  msgstr ""
4601
 
4602
- #: src/class-updraftplus.php:4303
4603
  msgid "The database is too small to be a valid WordPress database (size: %s Kb)."
4604
  msgstr ""
4605
 
4606
- #: src/addons/autobackup.php:1053, src/admin.php:782,
4607
  #: src/includes/updraftplus-notices.php:171
4608
  msgid "Be safe with an automatic backup"
4609
  msgstr ""
4610
 
4611
- #: src/admin.php:2330
4612
  msgid "If you can still read these words after the page finishes loading, then there is a JavaScript or jQuery problem in the site."
4613
  msgstr ""
4614
 
4615
- #: src/admin.php:687
4616
  msgid "The file was uploaded."
4617
  msgstr ""
4618
 
4619
- #: src/admin.php:686
4620
  msgid "Unknown server response status:"
4621
  msgstr ""
4622
 
4623
- #: src/admin.php:685
4624
  msgid "Unknown server response:"
4625
  msgstr ""
4626
 
4627
- #: src/admin.php:684
4628
  msgid "This decryption key will be attempted:"
4629
  msgstr ""
4630
 
4631
- #: src/admin.php:683
4632
  msgid "Follow this link to attempt decryption and download the database file to your computer."
4633
  msgstr ""
4634
 
4635
- #: src/admin.php:682
4636
  msgid "Upload error"
4637
  msgstr ""
4638
 
4639
- #: src/admin.php:681
4640
  msgid "This file does not appear to be an UpdraftPlus encrypted database archive (such files are .gz.crypt files which have a name like: backup_(time)_(site name)_(code)_db.crypt.gz)."
4641
  msgstr ""
4642
 
4643
- #: src/admin.php:680
4644
  msgid "Upload error:"
4645
  msgstr ""
4646
 
4647
- #: src/admin.php:679
4648
  msgid "(make sure that you were trying to upload a zip file previously created by UpdraftPlus)"
4649
  msgstr ""
4650
 
4651
- #: src/admin.php:670
4652
  msgid "Download to your computer"
4653
  msgstr ""
4654
 
4655
- #: src/admin.php:669
4656
  msgid "Delete from your web server"
4657
  msgstr ""
4658
 
4659
- #: src/admin.php:3553
4660
  msgid "You appear to be missing one or more archives from this multi-archive set."
4661
  msgstr ""
4662
 
4663
- #: src/admin.php:3550
4664
  msgid "(%d archive(s) in set)."
4665
  msgstr ""
4666
 
@@ -4672,15 +4758,15 @@ msgstr ""
4672
  msgid "Error: the server sent us a response (JSON) which we did not understand."
4673
  msgstr ""
4674
 
4675
- #: src/admin.php:660
4676
  msgid "Warnings:"
4677
  msgstr ""
4678
 
4679
- #: src/admin.php:659
4680
  msgid "Error: the server sent an empty response."
4681
  msgstr ""
4682
 
4683
- #: src/admin.php:2091
4684
  msgid "This looks like a file created by UpdraftPlus, but this install does not know about this type of object: %s. Perhaps you need to install an add-on?"
4685
  msgstr ""
4686
 
@@ -4716,7 +4802,7 @@ msgstr ""
4716
  msgid "No such backup set exists"
4717
  msgstr ""
4718
 
4719
- #: src/admin.php:1297
4720
  msgid "The backup archive for this file could not be found. The remote storage method in use (%s) does not allow us to retrieve files. To perform any restoration using UpdraftPlus, you will need to obtain a copy of this file and place it inside UpdraftPlus's working folder"
4721
  msgstr ""
4722
 
@@ -4724,7 +4810,7 @@ msgstr ""
4724
  msgid "Moving unpacked backup into place..."
4725
  msgstr ""
4726
 
4727
- #: src/backup.php:2744, src/backup.php:2998
4728
  msgid "Failed to open the zip file (%s) - %s"
4729
  msgstr ""
4730
 
@@ -4732,11 +4818,11 @@ msgstr ""
4732
  msgid "WordPress root directory server path: %s"
4733
  msgstr ""
4734
 
4735
- #: src/methods/s3.php:852
4736
  msgid "%s end-point"
4737
  msgstr ""
4738
 
4739
- #: src/methods/s3.php:814
4740
  msgid "... and many more!"
4741
  msgstr ""
4742
 
@@ -4744,15 +4830,15 @@ msgstr ""
4744
  msgid "S3 (Compatible)"
4745
  msgstr ""
4746
 
4747
- #: src/admin.php:1211
4748
  msgid "File is not locally present - needs retrieving from remote storage"
4749
  msgstr ""
4750
 
4751
- #: src/admin.php:3853
4752
  msgid "Looking for %s archive: file name: %s"
4753
  msgstr ""
4754
 
4755
- #: src/admin.php:3814
4756
  msgid "Final checks"
4757
  msgstr ""
4758
 
@@ -4764,11 +4850,11 @@ msgstr ""
4764
  msgid "Drop encrypted database files (db.gz.crypt files) here to upload them for decryption"
4765
  msgstr ""
4766
 
4767
- #: src/admin.php:3205
4768
  msgid "Your wp-content directory server path: %s"
4769
  msgstr ""
4770
 
4771
- #: src/admin.php:676
4772
  msgid "Raw backup history"
4773
  msgstr ""
4774
 
@@ -4776,11 +4862,11 @@ msgstr ""
4776
  msgid "Show raw backup and file list"
4777
  msgstr ""
4778
 
4779
- #: src/admin.php:658
4780
  msgid "Processing files - please wait..."
4781
  msgstr ""
4782
 
4783
- #: src/admin.php:3999,
4784
  #: src/templates/wp-admin/settings/downloading-and-restoring.php:27
4785
  msgid "Please consult this FAQ for help on what to do about it."
4786
  msgstr ""
@@ -4789,42 +4875,42 @@ msgstr ""
4789
  msgid "Your WordPress installation has a problem with outputting extra whitespace. This can corrupt backups that you download from here."
4790
  msgstr ""
4791
 
4792
- #: src/class-updraftplus.php:4311
4793
  msgid "Failed to open database file."
4794
  msgstr ""
4795
 
4796
- #: src/admin.php:4431
4797
  msgid "Known backups (raw)"
4798
  msgstr ""
4799
 
4800
- #: src/restorer.php:964
4801
  msgid "Files found:"
4802
  msgstr ""
4803
 
4804
- #: src/restorer.php:1859
4805
  msgid "Requested table engine (%s) is not present - changing to MyISAM."
4806
  msgstr ""
4807
 
4808
- #: src/addons/migrator.php:341
4809
  msgid "This looks like a migration (the backup is from a site with a different address/URL), but you did not check the option to search-and-replace the database. That is usually a mistake."
4810
  msgstr ""
4811
 
4812
- #: src/admin.php:3873
4813
  msgid "file is size:"
4814
  msgstr ""
4815
 
4816
- #: src/addons/googlecloud.php:941, src/addons/migrator.php:379,
4817
- #: src/addons/migrator.php:382, src/addons/migrator.php:385, src/admin.php:949,
4818
- #: src/admin.php:2335, src/backup.php:3045, src/class-updraftplus.php:4499,
4819
  #: src/updraftplus.php:156
4820
  msgid "Go here for more information."
4821
  msgstr ""
4822
 
4823
- #: src/admin.php:657
4824
  msgid "Some files are still downloading or being processed - please wait."
4825
  msgstr ""
4826
 
4827
- #: src/class-updraftplus.php:4382, src/class-updraftplus.php:4400
4828
  msgid "This backup set is from a different site - this is not a restoration, but a migration. You need the Migrator add-on in order to make this work."
4829
  msgstr ""
4830
 
@@ -4844,15 +4930,15 @@ msgstr ""
4844
  msgid "%s login failure"
4845
  msgstr ""
4846
 
4847
- #: src/methods/dropbox.php:438
4848
  msgid "You do not appear to be authenticated with %s"
4849
  msgstr ""
4850
 
4851
- #: src/methods/dropbox.php:405
4852
  msgid "Failed to access %s when deleting (see log file for more)"
4853
  msgstr ""
4854
 
4855
- #: src/methods/dropbox.php:397
4856
  msgid "You do not appear to be authenticated with %s (whilst deleting)"
4857
  msgstr ""
4858
 
@@ -4870,9 +4956,9 @@ msgstr ""
4870
 
4871
  #: src/addons/azure.php:218, src/methods/addon-base-v2.php:219,
4872
  #: src/methods/cloudfiles.php:405, src/methods/cloudfiles.php:422,
4873
- #: src/methods/googledrive.php:1006, src/methods/openstack-base.php:428,
4874
- #: src/methods/stream-base.php:265, src/methods/stream-base.php:272,
4875
- #: src/methods/stream-base.php:285
4876
  msgid "%s Error"
4877
  msgstr ""
4878
 
@@ -4880,7 +4966,7 @@ msgstr ""
4880
  msgid "%s error - failed to upload file"
4881
  msgstr ""
4882
 
4883
- #: src/class-updraftplus.php:1157, src/methods/cloudfiles.php:223
4884
  msgid "%s error - failed to re-assemble chunks"
4885
  msgstr ""
4886
 
@@ -4894,25 +4980,25 @@ msgstr ""
4894
  msgid "%s authentication failed"
4895
  msgstr ""
4896
 
4897
- #: src/addons/googlecloud.php:432, src/addons/migrator.php:470,
4898
- #: src/admin.php:2036, src/admin.php:2083, src/admin.php:2091,
4899
- #: src/class-updraftplus.php:925, src/class-updraftplus.php:931,
4900
- #: src/class-updraftplus.php:4284, src/class-updraftplus.php:4286,
4901
- #: src/class-updraftplus.php:4433, src/class-updraftplus.php:4440,
4902
- #: src/class-updraftplus.php:4478, src/methods/googledrive.php:369,
4903
  #: src/methods/s3.php:322
4904
  msgid "Error: %s"
4905
  msgstr ""
4906
 
4907
- #: src/admin.php:3142
4908
  msgid "Backup directory specified exists, but is <b>not</b> writable."
4909
  msgstr ""
4910
 
4911
- #: src/admin.php:3140
4912
  msgid "Backup directory specified does <b>not</b> exist."
4913
  msgstr ""
4914
 
4915
- #: src/admin.php:2853, src/admin.php:3096
4916
  msgid "Warning: %s"
4917
  msgstr ""
4918
 
@@ -4920,55 +5006,55 @@ msgstr ""
4920
  msgid "Last backup job run:"
4921
  msgstr ""
4922
 
4923
- #: src/backup.php:2766
4924
  msgid "A very large file was encountered: %s (size: %s Mb)"
4925
  msgstr ""
4926
 
4927
- #: src/backup.php:2172
4928
  msgid "%s: unreadable file - could not be backed up"
4929
  msgstr ""
4930
 
4931
- #: src/backup.php:1529
4932
  msgid "Table %s has very many rows (%s) - we hope your web hosting company gives you enough resources to dump out that table in the backup"
4933
  msgstr ""
4934
 
4935
- #: src/backup.php:1648
4936
  msgid "An error occurred whilst closing the final database file"
4937
  msgstr ""
4938
 
4939
- #: src/backup.php:906
4940
  msgid "Warnings encountered:"
4941
  msgstr ""
4942
 
4943
- #: src/class-updraftplus.php:2818
4944
  msgid "The backup apparently succeeded (with warnings) and is now complete"
4945
  msgstr ""
4946
 
4947
- #: src/class-updraftplus.php:809
4948
  msgid "Your free disk space is very low - only %s Mb remain"
4949
  msgstr ""
4950
 
4951
- #: src/addons/migrator.php:478
4952
  msgid "New site:"
4953
  msgstr ""
4954
 
4955
- #: src/addons/migrator.php:453
4956
  msgid "Migrated site (from UpdraftPlus)"
4957
  msgstr ""
4958
 
4959
- #: src/addons/migrator.php:400
4960
  msgid "Enter details for where this new site is to live within your multisite install:"
4961
  msgstr ""
4962
 
4963
- #: src/addons/migrator.php:399
4964
  msgid "Information needed to continue:"
4965
  msgstr ""
4966
 
4967
- #: src/addons/migrator.php:356
4968
  msgid "Network activating theme:"
4969
  msgstr ""
4970
 
4971
- #: src/addons/migrator.php:346
4972
  msgid "Processed plugin:"
4973
  msgstr ""
4974
 
@@ -4980,64 +5066,64 @@ msgstr ""
4980
  msgid "Some servers advertise encrypted FTP as available, but then time-out (after a long time) when you attempt to use it. If you find this happenning, then go into the \"Expert Options\" (below) and turn off SSL there."
4981
  msgstr ""
4982
 
4983
- #: src/methods/s3.php:828
4984
  msgid "Your web server's PHP installation does not included a required module (%s). Please contact your web hosting provider's support and ask for them to enable it."
4985
  msgstr ""
4986
 
4987
- #: src/methods/s3.php:1084
4988
  msgid "Please check your access credentials."
4989
  msgstr ""
4990
 
4991
- #: src/addons/s3-enhanced.php:179, src/methods/s3.php:1062
4992
  msgid "The error reported by %s was:"
4993
  msgstr ""
4994
 
4995
- #: src/restorer.php:1403
4996
  msgid "Please supply the requested information, and then continue."
4997
  msgstr ""
4998
 
4999
- #: src/class-updraftplus.php:4451, src/restorer.php:1707
5000
  msgid "Site information:"
5001
  msgstr ""
5002
 
5003
- #: src/restorer.php:1574
5004
  msgid "Your database user does not have permission to create tables. We will attempt to restore by simply emptying the tables; this should work as long as a) you are restoring from a WordPress version with the same database structure, and b) Your imported database does not contain any tables which are not already present on the importing site."
5005
  msgstr ""
5006
 
5007
- #: src/addons/migrator.php:341, src/admin.php:2330,
5008
- #: src/class-updraftplus.php:4444, src/restorer.php:2046
5009
  msgid "Warning:"
5010
  msgstr ""
5011
 
5012
- #: src/class-updraftplus.php:4433, src/class-updraftplus.php:4436,
5013
  #: src/restorer.php:154
5014
  msgid "You are running on WordPress multisite - but your backup is not of a multisite site."
5015
  msgstr ""
5016
 
5017
- #: src/admin.php:3841
5018
  msgid "Skipping restoration of WordPress core when importing a single site into a multisite installation. If you had anything necessary in your WordPress directory then you will need to re-add it manually from the zip file."
5019
  msgstr ""
5020
 
5021
- #: src/admin.php:3271, src/methods/updraftvault.php:286
5022
  msgid "Your web server's PHP installation does not included a <strong>required</strong> (for %s) module (%s). Please contact your web hosting provider's support and ask for them to enable it."
5023
  msgstr ""
5024
 
5025
- #: src/admin.php:694
5026
  msgid "Close"
5027
  msgstr ""
5028
 
5029
  #: src/addons/autobackup.php:330, src/addons/autobackup.php:422,
5030
- #: src/admin.php:650, src/methods/remotesend.php:66,
5031
  #: src/methods/remotesend.php:74, src/methods/remotesend.php:225,
5032
  #: src/methods/remotesend.php:242
5033
  msgid "Unexpected response:"
5034
  msgstr ""
5035
 
5036
- #: src/addons/reporting.php:451, src/admin.php:645
5037
  msgid "To send to more than one address, separate each address with a comma."
5038
  msgstr ""
5039
 
5040
- #: src/admin.php:674
5041
  msgid "PHP information"
5042
  msgstr ""
5043
 
@@ -5057,7 +5143,7 @@ msgstr ""
5057
  msgid "Do you want to migrate or clone/duplicate a site?"
5058
  msgstr ""
5059
 
5060
- #: src/addons/migrator.php:171
5061
  msgid "<a href=\"%s\">Read this article to see step-by-step how it's done.</a>"
5062
  msgstr ""
5063
 
@@ -5073,7 +5159,7 @@ msgstr ""
5073
  msgid "Also delete from remote storage"
5074
  msgstr ""
5075
 
5076
- #: src/admin.php:2583
5077
  msgid "Latest UpdraftPlus.com news:"
5078
  msgstr ""
5079
 
@@ -5090,11 +5176,11 @@ msgstr ""
5090
  msgid "News"
5091
  msgstr ""
5092
 
5093
- #: src/admin.php:1475, src/includes/class-wpadmin-commands.php:465
5094
  msgid "Backup set not found"
5095
  msgstr ""
5096
 
5097
- #: src/backup.php:160
5098
  msgid "%s - could not back this entity up; the corresponding directory does not exist (%s)"
5099
  msgstr ""
5100
 
@@ -5112,7 +5198,7 @@ msgstr ""
5112
  msgid "Blog link"
5113
  msgstr ""
5114
 
5115
- #: src/admin.php:738
5116
  msgid "Testing %s Settings..."
5117
  msgstr ""
5118
 
@@ -5120,101 +5206,101 @@ msgstr ""
5120
  msgid "Or, you can place them manually into your UpdraftPlus directory (usually wp-content/updraft), e.g. via FTP, and then use the \"rescan\" link above."
5121
  msgstr ""
5122
 
5123
- #: src/admin.php:965
5124
  msgid "UpdraftPlus's debug mode is on. You may see debugging notices on this page not just from UpdraftPlus, but from any other plugin installed. Please try to make sure that the notice you are seeing is from UpdraftPlus before you raise a support request."
5125
  msgstr ""
5126
 
5127
- #: src/admin.php:965
5128
  msgid "Notice"
5129
  msgstr ""
5130
 
5131
- #: src/backup.php:888
5132
  msgid "Errors encountered:"
5133
  msgstr ""
5134
 
5135
- #: src/admin.php:643
5136
  msgid "Rescanning (looking for backups that you have uploaded manually into the internal backup store)..."
5137
  msgstr ""
5138
 
5139
- #: src/admin.php:656
5140
  msgid "Begun looking for this entity"
5141
  msgstr ""
5142
 
5143
- #: src/addons/dropbox-folders.php:36
5144
  msgid "Store at"
5145
  msgstr ""
5146
 
5147
- #: src/addons/migrator.php:1388
5148
  msgid "\"%s\" has no primary key, manual change needed on row %s."
5149
  msgstr ""
5150
 
5151
- #: src/addons/migrator.php:1266
5152
  msgid "rows: %d"
5153
  msgstr ""
5154
 
5155
- #: src/addons/migrator.php:1142
5156
  msgid "Time taken (seconds):"
5157
  msgstr ""
5158
 
5159
- #: src/addons/migrator.php:1141, src/admin.php:661
5160
  msgid "Errors:"
5161
  msgstr ""
5162
 
5163
- #: src/addons/migrator.php:1140
5164
  msgid "SQL update commands run:"
5165
  msgstr ""
5166
 
5167
- #: src/addons/migrator.php:1139
5168
  msgid "Changes made:"
5169
  msgstr ""
5170
 
5171
- #: src/addons/migrator.php:1138
5172
  msgid "Rows examined:"
5173
  msgstr ""
5174
 
5175
- #: src/addons/migrator.php:1137
5176
  msgid "Tables examined:"
5177
  msgstr ""
5178
 
5179
- #: src/addons/migrator.php:1026
5180
  msgid "Could not get list of tables"
5181
  msgstr ""
5182
 
5183
- #: src/addons/migrator.php:971
5184
  msgid "Warning: the database's site URL (%s) is different to what we expected (%s)"
5185
  msgstr ""
5186
 
5187
- #: src/addons/migrator.php:960
5188
  msgid "Nothing to do: the site URL is already: %s"
5189
  msgstr ""
5190
 
5191
- #: src/addons/migrator.php:924, src/addons/migrator.php:928,
5192
- #: src/addons/migrator.php:932, src/addons/migrator.php:937,
5193
- #: src/addons/migrator.php:941, src/addons/migrator.php:946
5194
  msgid "Error: unexpected empty parameter (%s, %s)"
5195
  msgstr ""
5196
 
5197
- #: src/addons/migrator.php:884
5198
  msgid "Database: search and replace site URL"
5199
  msgstr ""
5200
 
5201
- #: src/addons/migrator.php:795, src/addons/migrator.php:1123
5202
  msgid "Failed: we did not understand the result returned by the %s operation."
5203
  msgstr ""
5204
 
5205
- #: src/addons/migrator.php:793, src/addons/migrator.php:1121
5206
  msgid "Failed: the %s operation was not able to start."
5207
  msgstr ""
5208
 
5209
- #: src/addons/migrator.php:558
5210
  msgid "(learn more)"
5211
  msgstr ""
5212
 
5213
- #: src/addons/migrator.php:558
5214
  msgid "Search and replace site location in the database (migrate)"
5215
  msgstr ""
5216
 
5217
- #: src/addons/migrator.php:558
5218
  msgid "All references to the site location in the database will be replaced with your current site URL, which is: %s"
5219
  msgstr ""
5220
 
@@ -5222,7 +5308,7 @@ msgstr ""
5222
  msgid "Blog uploads"
5223
  msgstr ""
5224
 
5225
- #: src/addons/migrator.php:385, src/addons/multisite.php:652
5226
  msgid "Must-use plugins"
5227
  msgstr ""
5228
 
@@ -5234,7 +5320,7 @@ msgstr ""
5234
  msgid "starting from next time it is"
5235
  msgstr ""
5236
 
5237
- #: src/addons/sftp.php:498
5238
  msgid "Failure: Port must be an integer."
5239
  msgstr ""
5240
 
@@ -5242,35 +5328,35 @@ msgstr ""
5242
  msgid "password"
5243
  msgstr ""
5244
 
5245
- #: src/addons/sftp.php:489, src/methods/openstack2.php:173
5246
  msgid "username"
5247
  msgstr ""
5248
 
5249
- #: src/addons/sftp.php:485
5250
  msgid "host name"
5251
  msgstr ""
5252
 
5253
- #: src/addons/sftp.php:458
5254
  msgid "Where to change directory to after logging in - often this is relative to your home directory."
5255
  msgstr ""
5256
 
5257
- #: src/addons/sftp.php:456
5258
  msgid "Directory path"
5259
  msgstr ""
5260
 
5261
  #: src/addons/lockadmin.php:156, src/addons/moredatabase.php:246,
5262
- #: src/addons/sftp.php:431, src/addons/webdav.php:109,
5263
- #: src/methods/openstack2.php:158, src/methods/updraftvault.php:346,
5264
  #: src/udaddons/options.php:135
5265
  msgid "Password"
5266
  msgstr ""
5267
 
5268
- #: src/addons/sftp.php:417, src/addons/webdav.php:123
5269
  msgid "Port"
5270
  msgstr ""
5271
 
5272
- #: src/addons/moredatabase.php:244, src/addons/sftp.php:410,
5273
- #: src/addons/webdav.php:115
5274
  msgid "Host"
5275
  msgstr ""
5276
 
@@ -5278,7 +5364,7 @@ msgstr ""
5278
  msgid "%s Error: Failed to download"
5279
  msgstr ""
5280
 
5281
- #: src/addons/sftp.php:530
5282
  msgid "Check your file permissions: Could not successfully create and enter:"
5283
  msgstr ""
5284
 
@@ -5322,26 +5408,26 @@ msgstr ""
5322
  msgid "WordPress Core"
5323
  msgstr ""
5324
 
5325
- #: src/methods/addon-base-v2.php:302, src/methods/stream-base.php:315
5326
  msgid "Failed: We were not able to place a file in that directory - please check your credentials."
5327
  msgstr ""
5328
 
5329
- #: src/addons/googlecloud.php:693, src/addons/googlecloud.php:727,
5330
- #: src/addons/googlecloud.php:733, src/addons/sftp.php:516, src/admin.php:2907,
5331
- #: src/admin.php:2942, src/admin.php:2951, src/methods/addon-base-v2.php:290,
5332
- #: src/methods/stream-base.php:301
5333
  msgid "Failed"
5334
  msgstr ""
5335
 
5336
- #: src/addons/webdav.php:71
5337
  msgid "WebDAV URL"
5338
  msgstr ""
5339
 
5340
- #: src/methods/stream-base.php:285
5341
  msgid "Local write failed: Failed to download"
5342
  msgstr ""
5343
 
5344
- #: src/methods/stream-base.php:272
5345
  msgid "Error opening remote file: Failed to download"
5346
  msgstr ""
5347
 
@@ -5349,14 +5435,14 @@ msgstr ""
5349
  msgid "Chunk %s: A %s error occurred"
5350
  msgstr ""
5351
 
5352
- #: src/addons/googlecloud.php:320, src/addons/sftp.php:45,
5353
  #: src/methods/addon-base-v2.php:76, src/methods/addon-base-v2.php:117,
5354
  #: src/methods/addon-base-v2.php:149, src/methods/addon-base-v2.php:195,
5355
- #: src/methods/addon-base-v2.php:269, src/methods/ftp.php:42,
5356
- #: src/methods/googledrive.php:172, src/methods/googledrive.php:174,
5357
  #: src/methods/stream-base.php:27, src/methods/stream-base.php:144,
5358
  #: src/methods/stream-base.php:150, src/methods/stream-base.php:184,
5359
- #: src/methods/stream-base.php:246
5360
  msgid "No %s settings were found"
5361
  msgstr ""
5362
 
@@ -5384,36 +5470,36 @@ msgstr ""
5384
  msgid "If you want encryption (e.g. you are storing sensitive business data), then an add-on is available."
5385
  msgstr ""
5386
 
5387
- #: src/addons/onedrive.php:756, src/methods/dropbox.php:656
5388
  msgid "Your %s account name: %s"
5389
  msgstr ""
5390
 
5391
- #: src/methods/dropbox.php:646, src/methods/dropbox.php:673
5392
  msgid "though part of the returned information was not as expected - your mileage may vary"
5393
  msgstr ""
5394
 
5395
- #: src/methods/dropbox.php:641, src/methods/dropbox.php:643
5396
  msgid "you have authenticated your %s account"
5397
  msgstr ""
5398
 
5399
- #: src/methods/dropbox.php:513, src/methods/dropbox.php:515
5400
  msgid "there's an add-on for that."
5401
  msgstr ""
5402
 
5403
- #: src/methods/dropbox.php:513, src/methods/dropbox.php:515
5404
  msgid "If you back up several sites into the same Dropbox and want to organise with sub-folders, then "
5405
  msgstr ""
5406
 
5407
- #: src/methods/dropbox.php:513, src/methods/dropbox.php:515
5408
  msgid "Backups are saved in"
5409
  msgstr ""
5410
 
5411
- #: src/methods/dropbox.php:513, src/methods/dropbox.php:515
5412
  msgid "Need to use sub-folders?"
5413
  msgstr ""
5414
 
5415
- #: src/methods/dropbox.php:220, src/methods/dropbox.php:241,
5416
- #: src/methods/dropbox.php:257
5417
  msgid "error: failed to upload file to %s (see log file for more)"
5418
  msgstr ""
5419
 
@@ -5421,67 +5507,67 @@ msgstr ""
5421
  msgid "You do not appear to be authenticated with Dropbox"
5422
  msgstr ""
5423
 
5424
- #: src/methods/s3.php:1079
5425
  msgid "The communication with %s was not encrypted."
5426
  msgstr ""
5427
 
5428
- #: src/methods/s3.php:1077
5429
  msgid "The communication with %s was encrypted."
5430
  msgstr ""
5431
 
5432
- #: src/addons/googlecloud.php:756, src/methods/s3.php:1074
5433
  msgid "We accessed the bucket, and were able to create files within it."
5434
  msgstr ""
5435
 
5436
- #: src/addons/googlecloud.php:750, src/addons/googlecloud.php:764,
5437
- #: src/methods/s3.php:1072, src/methods/s3.php:1084
5438
  msgid "We successfully accessed the bucket, but the attempt to create a file in it failed."
5439
  msgstr ""
5440
 
5441
- #: src/addons/googlecloud.php:750, src/addons/googlecloud.php:764,
5442
- #: src/methods/s3.php:1072, src/methods/s3.php:1084
5443
  msgid "Failure"
5444
  msgstr ""
5445
 
5446
- #: src/methods/s3.php:1060
5447
  msgid "Failure: We could not successfully access or create such a bucket. Please check your access credentials, and if those are correct then try another bucket name (as another %s user may already have taken your name)."
5448
  msgstr ""
5449
 
5450
- #: src/addons/s3-enhanced.php:152, src/methods/openstack2.php:144,
5451
- #: src/methods/s3.php:1054
5452
  msgid "Region"
5453
  msgstr ""
5454
 
5455
- #: src/addons/googlecloud.php:120, src/addons/googlecloud.php:710,
5456
- #: src/methods/s3.php:1036
5457
  msgid "Failure: No bucket details were given."
5458
  msgstr ""
5459
 
5460
- #: src/methods/s3.php:1014
5461
  msgid "API secret"
5462
  msgstr ""
5463
 
5464
- #: src/methods/s3.php:889
5465
  msgid "Enter only a bucket name or a bucket and path. Examples: mybucket, mybucket/mypath"
5466
  msgstr ""
5467
 
5468
- #: src/methods/s3.php:888
5469
  msgid "%s location"
5470
  msgstr ""
5471
 
5472
- #: src/methods/s3.php:884
5473
  msgid "%s secret key"
5474
  msgstr ""
5475
 
5476
- #: src/methods/s3.php:880
5477
  msgid "%s access key"
5478
  msgstr ""
5479
 
5480
- #: src/methods/s3.php:845
5481
  msgid "If you see errors about SSL certificates, then please go here for help."
5482
  msgstr ""
5483
 
5484
- #: src/methods/s3.php:843
5485
  msgid "Get your access key and secret key <a href=\"%s\">from your %s console</a>, then pick a (globally unique - all %s users) bucket name (letters and numbers) (and optionally a path) to use for storage. This bucket will be created for you if it does not already exist."
5486
  msgstr ""
5487
 
@@ -5522,89 +5608,82 @@ msgstr ""
5522
  msgid "WordPress Backup"
5523
  msgstr ""
5524
 
5525
- #: src/methods/cloudfiles.php:582, src/methods/openstack-base.php:503
5526
  msgid "We accessed the container, and were able to create files within it."
5527
  msgstr ""
5528
 
5529
- #: src/methods/cloudfiles.php:578
5530
  msgid "Cloud Files error - we accessed the container, but failed to create a file within it"
5531
  msgstr ""
5532
 
5533
- #: src/methods/cloudfiles.php:551, src/methods/openstack-base.php:445
5534
  msgid "Failure: No container details were given."
5535
  msgstr ""
5536
 
5537
- #: src/addons/moredatabase.php:245, src/addons/sftp.php:424,
5538
- #: src/addons/webdav.php:103, src/methods/cloudfiles-new.php:178,
5539
- #: src/methods/cloudfiles.php:531, src/methods/openstack2.php:152
5540
  msgid "Username"
5541
  msgstr ""
5542
 
5543
- #: src/methods/cloudfiles-new.php:173, src/methods/cloudfiles.php:526,
5544
- #: src/methods/s3.php:1010
5545
  msgid "API key"
5546
  msgstr ""
5547
 
5548
- #: src/addons/migrator.php:294, src/addons/migrator.php:1880,
5549
  #: src/addons/moredatabase.php:82, src/addons/moredatabase.php:84,
5550
- #: src/addons/moredatabase.php:86, src/addons/sftp.php:485,
5551
- #: src/addons/sftp.php:489, src/addons/sftp.php:493, src/addons/webdav.php:143,
5552
- #: src/admin.php:714, src/methods/addon-base-v2.php:282,
5553
- #: src/methods/cloudfiles-new.php:173, src/methods/cloudfiles-new.php:178,
5554
- #: src/methods/cloudfiles.php:526, src/methods/cloudfiles.php:531,
5555
  #: src/methods/ftp.php:380, src/methods/ftp.php:384,
5556
  #: src/methods/openstack2.php:173, src/methods/openstack2.php:178,
5557
  #: src/methods/openstack2.php:183, src/methods/openstack2.php:188,
5558
- #: src/methods/s3.php:1010, src/methods/s3.php:1014
5559
  msgid "Failure: No %s was given."
5560
  msgstr ""
5561
 
5562
- #: src/methods/cloudfiles-new.php:107, src/methods/cloudfiles.php:468,
5563
- #: src/methods/openstack-base.php:549, src/methods/s3.php:832
 
5564
  msgid "UpdraftPlus's %s module <strong>requires</strong> %s. Please do not file any support requests; there is no alternative."
5565
  msgstr ""
5566
 
5567
- #: src/methods/cloudfiles.php:514
5568
- msgid "Cloud Files container"
5569
- msgstr ""
5570
-
5571
- #: src/methods/cloudfiles.php:510
5572
- msgid "Cloud Files API key"
5573
- msgstr ""
5574
-
5575
- #: src/methods/cloudfiles.php:506
5576
  msgid "Cloud Files username"
5577
  msgstr ""
5578
 
5579
- #: src/addons/cloudfiles-enhanced.php:38, src/methods/cloudfiles-new.php:120,
5580
- #: src/methods/cloudfiles.php:486
5581
  msgid "UK"
5582
  msgstr ""
5583
 
5584
- #: src/addons/cloudfiles-enhanced.php:37, src/methods/cloudfiles-new.php:119,
5585
- #: src/methods/cloudfiles.php:485
5586
  msgid "US (default)"
5587
  msgstr ""
5588
 
5589
- #: src/methods/cloudfiles.php:482
5590
  msgid "US or UK Cloud"
5591
  msgstr ""
5592
 
5593
- #: src/methods/cloudfiles-new.php:112, src/methods/cloudfiles.php:478,
5594
- #: src/methods/openstack2.php:125
5595
  msgid "Also, you should read this important FAQ."
5596
  msgstr ""
5597
 
5598
- #: src/methods/cloudfiles-new.php:112, src/methods/cloudfiles.php:478
5599
  msgid "Get your API key <a href=\"https://mycloud.rackspace.com/\">from your Rackspace Cloud console</a> (read instructions <a href=\"http://www.rackspace.com/knowledge_center/article/rackspace-cloud-essentials-1-generating-your-api-key\">here</a>), then pick a container name to use for storage. This container will be created for you if it does not already exist."
5600
  msgstr ""
5601
 
5602
- #: src/admin.php:737, src/methods/backup-module.php:253
5603
  msgid "Test %s Settings"
5604
  msgstr ""
5605
 
5606
- #: src/class-updraftplus.php:1197, src/class-updraftplus.php:1241,
5607
- #: src/methods/cloudfiles.php:405, src/methods/stream-base.php:265
5608
  msgid "Error opening local file: Failed to download"
5609
  msgstr ""
5610
 
@@ -5619,9 +5698,9 @@ msgstr ""
5619
  msgid "%s Error: Failed to upload"
5620
  msgstr ""
5621
 
5622
- #: src/addons/googlecloud.php:203, src/addons/googlecloud.php:208,
5623
- #: src/class-updraftplus.php:1055, src/methods/cloudfiles.php:142,
5624
- #: src/methods/googledrive.php:924, src/methods/googledrive.php:929
5625
  msgid "%s Error: Failed to open local file"
5626
  msgstr ""
5627
 
@@ -5632,154 +5711,157 @@ msgstr ""
5632
 
5633
  #: src/addons/cloudfiles-enhanced.php:99,
5634
  #: src/addons/cloudfiles-enhanced.php:112,
5635
- #: src/addons/cloudfiles-enhanced.php:116, src/methods/cloudfiles.php:561,
5636
- #: src/methods/cloudfiles.php:564, src/methods/cloudfiles.php:567
5637
  msgid "Cloud Files authentication failed"
5638
  msgstr ""
5639
 
5640
- #: src/addons/googlecloud.php:993, src/methods/googledrive.php:1166
5641
  msgid "<strong>After</strong> you have saved your settings (by clicking 'Save Changes' below), then come back here once and click this link to complete authentication with Google."
5642
  msgstr ""
5643
 
5644
- #: src/addons/googlecloud.php:933, src/addons/onedrive.php:974,
5645
- #: src/methods/googledrive.php:1114
 
 
 
 
5646
  msgid "Client Secret"
5647
  msgstr ""
5648
 
5649
- #: src/addons/googlecloud.php:928, src/methods/googledrive.php:1111
5650
  msgid "If Google later shows you the message \"invalid_client\", then you did not enter a valid client ID here."
5651
  msgstr ""
5652
 
5653
- #: src/addons/googlecloud.php:925, src/addons/onedrive.php:970,
5654
- #: src/methods/googledrive.php:1110
5655
  msgid "Client ID"
5656
  msgstr ""
5657
 
5658
- #: src/addons/googlecloud.php:914, src/methods/googledrive.php:1095
5659
  msgid "You must add the following as the authorised redirect URI (under \"More Options\") when asked"
5660
  msgstr ""
5661
 
5662
- #: src/addons/googlecloud.php:914, src/methods/googledrive.php:1095
5663
  msgid "Select 'Web Application' as the application type."
5664
  msgstr ""
5665
 
5666
- #: src/addons/googlecloud.php:912, src/methods/googledrive.php:1093
5667
  msgid "For longer help, including screenshots, follow this link. The description below is sufficient for more expert users."
5668
  msgstr ""
5669
 
5670
- #: src/methods/addon-base-v2.php:243, src/methods/cloudfiles.php:458,
5671
- #: src/methods/dropbox.php:497, src/methods/ftp.php:321,
5672
- #: src/methods/googledrive.php:1076, src/methods/openstack-base.php:539,
5673
- #: src/methods/s3.php:803, src/methods/stream-base.php:218
 
 
5674
  msgid "%s is a great choice, because UpdraftPlus supports chunked uploads - no matter how big your site is, UpdraftPlus can upload it a little at a time, and not get thwarted by timeouts."
5675
  msgstr ""
5676
 
5677
- #: src/addons/googlecloud.php:499, src/addons/googlecloud.php:500,
5678
- #: src/addons/googlecloud.php:783, src/methods/googledrive.php:531,
5679
- #: src/methods/googledrive.php:532, src/methods/googledrive.php:542,
5680
- #: src/methods/googledrive.php:543
5681
  msgid "Account is not authorized."
5682
  msgstr ""
5683
 
5684
- #: src/methods/googledrive.php:455, src/methods/googledrive.php:501,
5685
- #: src/methods/googledrive.php:507, src/methods/googledrive.php:509,
5686
  #: src/methods/stream-base.php:200
5687
  msgid "Failed to upload to %s"
5688
  msgstr ""
5689
 
5690
- #: src/methods/googledrive.php:484
5691
  msgid "Account full: your %s account has only %d bytes left, but the file to be uploaded is %d bytes"
5692
  msgstr ""
5693
 
5694
- #: src/methods/googledrive.php:575, src/methods/googledrive.php:611
5695
  msgid "Have not yet obtained an access token from Google - you need to authorise or re-authorise your connection to Google Drive."
5696
  msgstr ""
5697
 
5698
- #: src/addons/googlecloud.php:635, src/addons/onedrive.php:794,
5699
- #: src/methods/googledrive.php:428
5700
  msgid "you have authenticated your %s account."
5701
  msgstr ""
5702
 
5703
- #: src/addons/googlecloud.php:635, src/addons/googlecloud.php:756,
5704
- #: src/addons/onedrive.php:794, src/addons/sftp.php:550,
5705
- #: src/methods/addon-base-v2.php:299, src/methods/cloudfiles.php:582,
5706
- #: src/methods/googledrive.php:428, src/methods/openstack-base.php:503,
5707
- #: src/methods/s3.php:1074, src/methods/stream-base.php:312
5708
  msgid "Success"
5709
  msgstr ""
5710
 
5711
- #: src/addons/onedrive.php:748, src/methods/dropbox.php:684,
5712
- #: src/methods/dropbox.php:693, src/methods/googledrive.php:402
5713
  msgid "Your %s quota usage: %s %% used, %s available"
5714
  msgstr ""
5715
 
5716
- #: src/addons/googlecloud.php:438, src/methods/googledrive.php:375
5717
  msgid "Authorization failed"
5718
  msgstr ""
5719
 
5720
- #: src/addons/googlecloud.php:430, src/methods/googledrive.php:367
5721
  msgid "No refresh token was received from Google. This often means that you entered your client secret wrongly, or that you have not yet re-authenticated (below) since correcting it. Re-check it, then follow the link to authenticate again. Finally, if that does not work, then use expert mode to wipe all your settings, create a new Google client ID/secret, and start again."
5722
  msgstr ""
5723
 
5724
- #: src/methods/addon-not-yet-present.php:68
5725
  msgid "follow this link to get it"
5726
  msgstr ""
5727
 
5728
- #: src/methods/addon-not-yet-present.php:68
5729
  msgid "%s support is available as an add-on"
5730
  msgstr ""
5731
 
5732
  #: src/methods/addon-not-yet-present.php:28,
5733
- #: src/methods/addon-not-yet-present.php:40,
5734
- #: src/methods/addon-not-yet-present.php:47,
5735
- #: src/methods/addon-not-yet-present.php:61
5736
  msgid "You do not have the UpdraftPlus %s add-on installed - get it from %s"
5737
  msgstr ""
5738
 
5739
- #: src/includes/Dropbox/OAuth/Consumer/ConsumerAbstract.php:123,
5740
- #: src/includes/Dropbox/OAuth/Consumer/ConsumerAbstract.php:124,
5741
  #: src/includes/Dropbox2/OAuth/Consumer/ConsumerAbstract.php:126,
5742
  #: src/includes/Dropbox2/OAuth/Consumer/ConsumerAbstract.php:127
5743
  msgid "You need to re-authenticate with %s, as your existing credentials are not working."
5744
  msgstr ""
5745
 
5746
- #: src/addons/migrator.php:1775, src/admin.php:1239, src/admin.php:2910,
5747
- #: src/admin.php:2944, src/admin.php:2948, src/admin.php:3871,
5748
- #: src/restorer.php:2286, src/restorer.php:2391
5749
  msgid "OK"
5750
  msgstr ""
5751
 
5752
- #: src/restorer.php:2280, src/restorer.php:2355
5753
  msgid "Table prefix has changed: changing %s table field(s) accordingly:"
5754
  msgstr ""
5755
 
5756
- #: src/addons/migrator.php:1154, src/restorer.php:2183
5757
  msgid "the database query being run was:"
5758
  msgstr ""
5759
 
5760
- #: src/restorer.php:1885
5761
  msgid "will restore as:"
5762
  msgstr ""
5763
 
5764
- #: src/class-updraftplus.php:4422, src/restorer.php:1689,
5765
- #: src/restorer.php:1778, src/restorer.php:1804
5766
  msgid "Old table prefix:"
5767
  msgstr ""
5768
 
5769
- #: src/addons/reporting.php:70, src/addons/reporting.php:169,
5770
- #: src/backup.php:962, src/class-updraftplus.php:4361
5771
  msgid "Backup of:"
5772
  msgstr ""
5773
 
5774
- #: src/restorer.php:1499
5775
  msgid "Failed to open database file"
5776
  msgstr ""
5777
 
5778
- #: src/restorer.php:1478
5779
  msgid "Failed to find database file"
5780
  msgstr ""
5781
 
5782
- #: src/restorer.php:1455
5783
  msgid "Warning: PHP safe_mode is active on your server. Timeouts are much more likely. If these happen, then you will need to manually restore the file via phpMyAdmin or another method."
5784
  msgstr ""
5785
 
@@ -5839,60 +5921,61 @@ msgstr ""
5839
  msgid "UpdraftPlus is not able to directly restore this kind of entity. It must be restored manually."
5840
  msgstr ""
5841
 
5842
- #: src/admin.php:3879, src/admin.php:3880
5843
  msgid "Could not find one of the files for restoration"
5844
  msgstr ""
5845
 
5846
- #: src/admin.php:3989
5847
  msgid "Error message"
5848
  msgstr ""
5849
 
5850
- #: src/admin.php:3876
5851
  msgid "The backup records do not contain information about the proper size of this file."
5852
  msgstr ""
5853
 
5854
- #: src/admin.php:3868
5855
  msgid "Archive is expected to be size:"
5856
  msgstr ""
5857
 
5858
- #: src/admin.php:3765
5859
  msgid "If making a request for support, please include this information:"
5860
  msgstr ""
5861
 
5862
- #: src/admin.php:3764
5863
  msgid "ABORT: Could not find the information on which entities to restore."
5864
  msgstr ""
5865
 
5866
- #: src/admin.php:3719
5867
  msgid "UpdraftPlus Restoration: Progress"
5868
  msgstr ""
5869
 
5870
- #: src/admin.php:3671
5871
  msgid "This backup does not exist in the backup history - restoration aborted. Timestamp:"
5872
  msgstr ""
5873
 
5874
- #: src/admin.php:3613
5875
  msgid "After pressing this button, you will be given the option to choose which components you wish to restore"
5876
  msgstr ""
5877
 
5878
- #: src/admin.php:3622
5879
  msgid "Delete this backup set"
5880
  msgstr ""
5881
 
5882
- #: src/admin.php:3283
5883
  msgid "Good news: Your site's communications with %s can be encrypted. If you see any errors to do with encryption, then look in the 'Expert Settings' for more help."
5884
  msgstr ""
5885
 
5886
- #: src/admin.php:3280
5887
  msgid "Your web server's PHP/Curl installation does not support https access. We cannot access %s without this support. Please contact your web hosting provider's support. %s <strong>requires</strong> Curl+https. Please do not file any support requests; there is no alternative."
5888
  msgstr ""
5889
 
5890
- #: src/admin.php:3278
5891
  msgid "Your web server's PHP/Curl installation does not support https access. Communications with %s will be unencrypted. Ask your web host to install Curl/SSL in order to gain the ability for encryption (via an add-on)."
5892
  msgstr ""
5893
 
5894
- #: src/methods/cloudfiles-new.php:107, src/methods/cloudfiles.php:468,
5895
- #: src/methods/openstack-base.php:549, src/methods/s3.php:832
 
5896
  msgid "Your web server's PHP installation does not included a required module (%s). Please contact your web hosting provider's support."
5897
  msgstr ""
5898
 
@@ -5928,23 +6011,23 @@ msgstr ""
5928
  msgid "Use the server's SSL certificates"
5929
  msgstr ""
5930
 
5931
- #: src/admin.php:3144
5932
  msgid "If that is unsuccessful check the permissions on your server or change it to another directory that is writable by your web server process."
5933
  msgstr ""
5934
 
5935
- #: src/admin.php:3144
5936
  msgid "click here"
5937
  msgstr ""
5938
 
5939
- #: src/admin.php:3144
5940
  msgid "or, to reset this option"
5941
  msgstr ""
5942
 
5943
- #: src/admin.php:3144
5944
  msgid "Follow this link to attempt to create the directory and set the permissions"
5945
  msgstr ""
5946
 
5947
- #: src/admin.php:3136
5948
  msgid "Backup directory specified is writable, which is good."
5949
  msgstr ""
5950
 
@@ -5976,15 +6059,15 @@ msgstr ""
5976
  msgid "Advanced / Debugging Settings"
5977
  msgstr ""
5978
 
5979
- #: src/admin.php:673
5980
  msgid "Requesting start of backup..."
5981
  msgstr ""
5982
 
5983
- #: src/addons/morefiles.php:297, src/admin.php:689
5984
  msgid "Cancel"
5985
  msgstr ""
5986
 
5987
- #: src/addons/reporting.php:233, src/admin.php:3427
5988
  msgid "None"
5989
  msgstr ""
5990
 
@@ -6009,11 +6092,11 @@ msgstr ""
6009
  msgid "The above directories are everything, except for WordPress core itself which you can download afresh from WordPress.org."
6010
  msgstr ""
6011
 
6012
- #: src/addons/morefiles.php:443, src/admin.php:3214
6013
  msgid "Exclude these:"
6014
  msgstr ""
6015
 
6016
- #: src/admin.php:3205
6017
  msgid "Any other directories found inside wp-content"
6018
  msgstr ""
6019
 
@@ -6029,49 +6112,45 @@ msgstr ""
6029
  msgid "To fix the time at which a backup should take place,"
6030
  msgstr ""
6031
 
6032
- #: src/admin.php:3130
6033
  msgid "Monthly"
6034
  msgstr ""
6035
 
6036
- #: src/admin.php:3129
6037
  msgid "Fortnightly"
6038
  msgstr ""
6039
 
6040
- #: src/admin.php:3128
6041
  msgid "Weekly"
6042
  msgstr ""
6043
 
6044
- #: src/admin.php:3127
6045
  msgid "Daily"
6046
  msgstr ""
6047
 
6048
- #: src/admin.php:696, src/admin.php:3110
6049
  msgid "Download log file"
6050
  msgstr ""
6051
 
6052
- #: src/admin.php:3007
6053
  msgid "The folder exists, but your webserver does not have permission to write to it."
6054
  msgstr ""
6055
 
6056
- #: src/admin.php:3002
6057
  msgid "The folder was created, but we had to change its file permissions to 777 (world-writable) to be able to write to it. You should check with your hosting provider that this will not cause any problems"
6058
  msgstr ""
6059
 
6060
- #: src/admin.php:2988
6061
  msgid "The request to the filesystem to create the directory failed."
6062
  msgstr ""
6063
 
6064
- #: src/addons/migrator.php:2253, src/admin.php:690, src/admin.php:2904,
6065
- #: src/admin.php:2937, src/admin.php:3622,
6066
  #: src/templates/wp-admin/settings/delete-and-restore-modals.php:5
6067
  msgid "Delete"
6068
  msgstr ""
6069
 
6070
- #: src/admin.php:2688
6071
- msgid "(None)"
6072
- msgstr ""
6073
-
6074
- #: src/admin.php:2844
6075
  msgid "show log"
6076
  msgstr ""
6077
 
@@ -6176,10 +6255,6 @@ msgstr ""
6176
  msgid "Multisite"
6177
  msgstr ""
6178
 
6179
- #: src/admin.php:2507
6180
- msgid "Go here for help."
6181
- msgstr ""
6182
-
6183
  #: src/templates/wp-admin/settings/tab-status.php:86
6184
  msgid "Perform a one-time backup"
6185
  msgstr ""
@@ -6229,27 +6304,27 @@ msgstr ""
6229
  msgid "Delete backup set"
6230
  msgstr ""
6231
 
6232
- #: src/admin.php:672
6233
  msgid "Download error: the server sent us a response which we did not understand."
6234
  msgstr ""
6235
 
6236
  #: src/addons/backblaze.php:209, src/addons/cloudfiles-enhanced.php:102,
6237
- #: src/addons/migrator.php:780, src/addons/migrator.php:1026,
6238
- #: src/addons/migrator.php:1107, src/addons/migrator.php:1154,
6239
- #: src/addons/migrator.php:1388, src/addons/migrator.php:1714,
6240
- #: src/addons/migrator.php:1741, src/addons/migrator.php:1747,
6241
- #: src/addons/migrator.php:1809, src/addons/migrator.php:1849,
6242
- #: src/addons/migrator.php:1888, src/addons/migrator.php:1898,
6243
- #: src/addons/migrator.php:1903, src/addons/s3-enhanced.php:127,
6244
  #: src/addons/s3-enhanced.php:132, src/addons/s3-enhanced.php:134,
6245
- #: src/addons/sftp.php:814, src/addons/webdav.php:119, src/admin.php:84,
6246
- #: src/admin.php:664, src/admin.php:3873, src/admin.php:3903,
6247
  #: src/methods/remotesend.php:71, src/methods/remotesend.php:239,
6248
- #: src/methods/updraftvault.php:465, src/restorer.php:1408
6249
  msgid "Error:"
6250
  msgstr ""
6251
 
6252
- #: src/admin.php:655,
6253
  #: src/templates/wp-admin/settings/downloading-and-restoring.php:32
6254
  msgid "calculating..."
6255
  msgstr ""
@@ -6270,15 +6345,15 @@ msgstr ""
6270
  msgid "This is a count of the contents of your Updraft directory"
6271
  msgstr ""
6272
 
6273
- #: src/addons/google-enhanced.php:84, src/methods/googledrive.php:172,
6274
- #: src/methods/googledrive.php:174, src/methods/googledrive.php:428,
6275
- #: src/methods/googledrive.php:455, src/methods/googledrive.php:484,
6276
- #: src/methods/googledrive.php:491, src/methods/googledrive.php:501,
6277
- #: src/methods/googledrive.php:507, src/methods/googledrive.php:509,
6278
- #: src/methods/googledrive.php:1075, src/methods/googledrive.php:1087,
6279
- #: src/methods/googledrive.php:1087, src/methods/googledrive.php:1110,
6280
- #: src/methods/googledrive.php:1114, src/methods/googledrive.php:1126,
6281
- #: src/methods/googledrive.php:1136, src/methods/googledrive.php:1149
6282
  msgid "Google Drive"
6283
  msgstr ""
6284
 
@@ -6294,32 +6369,32 @@ msgstr ""
6294
  msgid "More tasks:"
6295
  msgstr ""
6296
 
6297
- #: src/admin.php:2607
6298
  msgid "Download most recently modified log file"
6299
  msgstr ""
6300
 
6301
- #: src/admin.php:2566, src/admin.php:2572, src/central/bootstrap.php:169
6302
  msgid "(Nothing yet logged)"
6303
  msgstr ""
6304
 
6305
  #: src/addons/autobackup.php:325, src/addons/autobackup.php:420,
6306
- #: src/admin.php:2565, src/admin.php:2570
6307
  msgid "Last log message"
6308
  msgstr ""
6309
 
6310
- #: src/addons/migrator.php:232, src/admin.php:695, src/admin.php:3613,
6311
  #: src/templates/wp-admin/settings/tab-status.php:30
6312
  msgid "Restore"
6313
  msgstr ""
6314
 
6315
- #: src/admin.php:516, src/admin.php:688,
6316
  #: src/templates/wp-admin/settings/tab-status.php:27
6317
  msgid "Backup Now"
6318
  msgstr ""
6319
 
6320
- #: src/addons/migrator.php:1779, src/addons/moredatabase.php:247,
6321
- #: src/addons/reporting.php:248, src/admin.php:301, src/admin.php:3402,
6322
- #: src/admin.php:3482, src/admin.php:3957,
6323
  #: src/includes/class-wpadmin-commands.php:147,
6324
  #: src/includes/class-wpadmin-commands.php:480,
6325
  #: src/templates/wp-admin/settings/delete-and-restore-modals.php:81,
@@ -6327,7 +6402,7 @@ msgstr ""
6327
  msgid "Database"
6328
  msgstr ""
6329
 
6330
- #: src/admin.php:297, src/admin.php:4438
6331
  msgid "Files"
6332
  msgstr ""
6333
 
@@ -6339,11 +6414,11 @@ msgstr ""
6339
  msgid "All the times shown in this section are using WordPress's configured time zone, which you can set in Settings -> General"
6340
  msgstr ""
6341
 
6342
- #: src/admin.php:277
6343
  msgid "At the same time as the files backup"
6344
  msgstr ""
6345
 
6346
- #: src/admin.php:267, src/admin.php:288, src/admin.php:295
6347
  msgid "Nothing currently scheduled"
6348
  msgstr ""
6349
 
@@ -6355,15 +6430,15 @@ msgstr ""
6355
  msgid "JavaScript warning"
6356
  msgstr ""
6357
 
6358
- #: src/admin.php:675, src/admin.php:2634
6359
  msgid "Delete Old Directories"
6360
  msgstr ""
6361
 
6362
- #: src/admin.php:2378
6363
  msgid "Current limit is:"
6364
  msgstr ""
6365
 
6366
- #: src/admin.php:2352
6367
  msgid "Your backup has been restored."
6368
  msgstr ""
6369
 
@@ -6375,132 +6450,138 @@ msgstr ""
6375
  msgid "Lead developer's homepage"
6376
  msgstr ""
6377
 
6378
- #: src/admin.php:4351
 
 
 
 
6379
  msgid "Your settings have been wiped."
6380
  msgstr ""
6381
 
6382
- #: src/admin.php:2312
6383
  msgid "Backup directory successfully created."
6384
  msgstr ""
6385
 
6386
- #: src/admin.php:2305
6387
  msgid "Backup directory could not be created"
6388
  msgstr ""
6389
 
6390
- #: src/admin.php:2876
6391
  msgid "Old directory removal failed for some reason. You may want to do this manually."
6392
  msgstr ""
6393
 
6394
- #: src/admin.php:2874
6395
  msgid "Old directories successfully removed."
6396
  msgstr ""
6397
 
6398
- #: src/admin.php:2871, src/admin.php:2871
6399
  msgid "Remove old directories"
6400
  msgstr ""
6401
 
6402
- #: src/addons/migrator.php:297, src/addons/migrator.php:312,
6403
- #: src/admin.php:2254, src/admin.php:2263, src/admin.php:2272,
6404
- #: src/admin.php:2314, src/admin.php:2878
6405
  msgid "Return to UpdraftPlus Configuration"
6406
  msgstr ""
6407
 
6408
- #: src/admin.php:668, src/admin.php:2254, src/admin.php:2263,
6409
- #: src/admin.php:2272, src/admin.php:2314, src/admin.php:2878,
6410
  #: src/templates/wp-admin/settings/existing-backups-table.php:16
6411
  msgid "Actions"
6412
  msgstr ""
6413
 
6414
- #: src/admin.php:2173
6415
  msgid "Bad filename format - this does not look like an encrypted database file created by UpdraftPlus"
6416
  msgstr ""
6417
 
6418
- #: src/admin.php:2083
6419
  msgid "Bad filename format - this does not look like a file created by UpdraftPlus"
6420
  msgstr ""
6421
 
6422
- #: src/admin.php:1964
6423
  msgid "No local copy present."
6424
  msgstr ""
6425
 
6426
- #: src/admin.php:1961
6427
  msgid "Download in progress"
6428
  msgstr ""
6429
 
6430
- #: src/admin.php:667, src/admin.php:1950
6431
  msgid "File ready."
6432
  msgstr ""
6433
 
6434
- #: src/admin.php:1931
6435
  msgid "Download failed"
6436
  msgstr ""
6437
 
6438
- #: src/admin.php:665, src/admin.php:1247, src/admin.php:1710,
6439
- #: src/class-updraftplus.php:1197, src/class-updraftplus.php:1241,
6440
  #: src/methods/addon-base-v2.php:95, src/methods/addon-base-v2.php:100,
6441
  #: src/methods/addon-base-v2.php:205, src/methods/addon-base-v2.php:225,
6442
- #: src/methods/stream-base.php:200, src/restorer.php:2282,
6443
- #: src/restorer.php:2307, src/restorer.php:2388, src/updraftplus.php:156
6444
  msgid "Error"
6445
  msgstr ""
6446
 
6447
- #: src/admin.php:1738
6448
  msgid "Could not find that job - perhaps it has already finished?"
6449
  msgstr ""
6450
 
6451
- #: src/admin.php:1730
6452
  msgid "Job deleted"
6453
  msgstr ""
6454
 
6455
- #: src/admin.php:1814
6456
  msgid "OK. You should soon see activity in the \"Last log message\" field below."
6457
  msgstr ""
6458
 
6459
- #: src/admin.php:740
6460
  msgid "Nothing yet logged"
6461
  msgstr ""
6462
 
6463
- #: src/admin.php:961
6464
  msgid "Please consult this FAQ if you have problems backing up."
6465
  msgstr ""
6466
 
6467
- #: src/admin.php:961
6468
  msgid "Your website is hosted using the %s web server."
6469
  msgstr ""
6470
 
6471
- #: src/admin.php:957
6472
  msgid "UpdraftPlus does not officially support versions of WordPress before %s. It may work for you, but if it does not, then please be aware that no support is available until you upgrade WordPress."
6473
  msgstr ""
6474
 
6475
- #: src/admin.php:953
6476
  msgid "You have less than %s of free disk space on the disk which UpdraftPlus is configured to use to create backups. UpdraftPlus could well run out of space. Contact your the operator of your server (e.g. your web hosting company) to resolve this issue."
6477
  msgstr ""
6478
 
6479
- #: src/admin.php:945, src/admin.php:949, src/admin.php:953, src/admin.php:957,
6480
- #: src/admin.php:961, src/admin.php:970, src/admin.php:3271,
6481
- #: src/admin.php:3278, src/admin.php:3280, src/methods/cloudfiles-new.php:107,
6482
- #: src/methods/cloudfiles.php:468, src/methods/ftp.php:309,
6483
- #: src/methods/openstack-base.php:549, src/methods/s3.php:828,
6484
- #: src/methods/s3.php:832, src/methods/updraftvault.php:286,
 
 
6485
  #: src/templates/wp-admin/settings/downloading-and-restoring.php:27,
6486
- #: src/udaddons/updraftplus-addons.php:242
6487
  msgid "Warning"
6488
  msgstr ""
6489
 
6490
- #: src/admin.php:890
6491
  msgid "Add-Ons / Pro Support"
6492
  msgstr ""
6493
 
6494
- #: src/admin.php:532, src/admin.php:886,
6495
  #: src/templates/wp-admin/settings/tab-bar.php:7
6496
  msgid "Settings"
6497
  msgstr ""
6498
 
6499
- #: src/backup.php:232
6500
  msgid "Could not create %s zip. Consult the log file for more information."
6501
  msgstr ""
6502
 
6503
- #: src/backup.php:2052
6504
  msgid "Infinite recursion: consult your log for more information"
6505
  msgstr ""
6506
 
@@ -6512,50 +6593,50 @@ msgstr ""
6512
  msgid "Like UpdraftPlus and can spare one minute?"
6513
  msgstr ""
6514
 
6515
- #: src/addons/azure.php:218, src/class-updraftplus.php:4080,
6516
- #: src/methods/googledrive.php:1006, src/methods/s3.php:322
6517
  msgid "File not found"
6518
  msgstr ""
6519
 
6520
- #: src/class-updraftplus.php:3987
6521
  msgid "The decryption key used:"
6522
  msgstr ""
6523
 
6524
- #: src/class-updraftplus.php:3987, src/class-updraftplus.php:4296,
6525
  #: src/restorer.php:389
6526
  msgid "Decryption failed. The most likely cause is that you used the wrong key."
6527
  msgstr ""
6528
 
6529
- #: src/class-updraftplus.php:3968, src/class-updraftplus.php:4284,
6530
  #: src/restorer.php:376
6531
  msgid "Decryption failed. The database file is encrypted, but you have no encryption key entered."
6532
  msgstr ""
6533
 
6534
- #: src/backup.php:1935
6535
  msgid "Could not open the backup file for writing"
6536
  msgstr ""
6537
 
6538
- #: src/class-updraftplus.php:3354
6539
  msgid "Could not save backup history because we have no backup array. Backup probably failed."
6540
  msgstr ""
6541
 
6542
- #: src/class-updraftplus.php:3315
6543
  msgid "Could not read the directory"
6544
  msgstr ""
6545
 
6546
- #: src/admin.php:2001, src/backup.php:1159
6547
  msgid "Backup directory (%s) is not writable, or does not exist."
6548
  msgstr ""
6549
 
6550
- #: src/backup.php:963
6551
  msgid "WordPress backup is complete"
6552
  msgstr ""
6553
 
6554
- #: src/class-updraftplus.php:2827
6555
  msgid "The backup attempt has finished, apparently unsuccessfully"
6556
  msgstr ""
6557
 
6558
- #: src/class-updraftplus.php:2812
6559
  msgid "The backup apparently succeeded and is now complete"
6560
  msgstr ""
6561
 
@@ -6563,38 +6644,38 @@ msgstr ""
6563
  msgid "Encryption error occurred when encrypting database. Encryption aborted."
6564
  msgstr ""
6565
 
6566
- #: src/class-updraftplus.php:2515
6567
  msgid "Could not create files in the backup directory. Backup aborted - check your UpdraftPlus settings."
6568
  msgstr ""
6569
 
6570
- #: src/class-updraftplus.php:1798
6571
  msgid "Others"
6572
  msgstr ""
6573
 
6574
- #: src/addons/multisite.php:467, src/class-updraftplus.php:1783
6575
  msgid "Uploads"
6576
  msgstr ""
6577
 
6578
- #: src/class-updraftplus.php:1782
6579
  msgid "Themes"
6580
  msgstr ""
6581
 
6582
- #: src/class-updraftplus.php:1781
6583
  msgid "Plugins"
6584
  msgstr ""
6585
 
6586
- #: src/class-updraftplus.php:560
6587
  msgid "No log files were found."
6588
  msgstr ""
6589
 
6590
- #: src/admin.php:1883, src/admin.php:1887, src/class-updraftplus.php:555
6591
  msgid "The log file could not be read."
6592
  msgstr ""
6593
 
6594
- #: src/admin.php:977, src/admin.php:981, src/admin.php:985, src/admin.php:989,
6595
- #: src/admin.php:993, src/class-updraftplus.php:520,
6596
- #: src/class-updraftplus.php:555, src/class-updraftplus.php:560,
6597
- #: src/class-updraftplus.php:565
6598
  msgid "UpdraftPlus notice:"
6599
  msgstr ""
6600
 
11
  "Language: af_ZA\n"
12
  "Project-Id-Version: UpdraftPlus\n"
13
 
14
+ #: src/addons/googlecloud.php:979, src/addons/googlecloud.php:980,
15
+ #: src/addons/googlecloud.php:981
16
+ msgid "Western Europe %s"
17
+ msgstr ""
18
+
19
+ #: src/addons/googlecloud.php:978
20
+ msgid "South-east Australia %s"
21
+ msgstr ""
22
+
23
+ #: src/addons/googlecloud.php:977
24
+ msgid "South-east Asia %s"
25
+ msgstr ""
26
+
27
+ #: src/addons/googlecloud.php:976
28
+ msgid "North-east Asia %s"
29
+ msgstr ""
30
+
31
+ #: src/addons/googlecloud.php:975
32
+ msgid "Eastern Asia-Pacific %s"
33
+ msgstr ""
34
+
35
+ #: src/addons/googlecloud.php:974
36
+ msgid "Western United States %s"
37
+ msgstr ""
38
+
39
+ #: src/addons/googlecloud.php:972, src/addons/googlecloud.php:973
40
+ msgid "Eastern United States %s"
41
+ msgstr ""
42
+
43
+ #: src/addons/googlecloud.php:970
44
+ msgid "European Union (multi-region location)"
45
+ msgstr ""
46
+
47
+ #: src/addons/googlecloud.php:969
48
+ msgid "Asia Pacific (multi-region location)"
49
+ msgstr ""
50
+
51
+ #: src/addons/googlecloud.php:968
52
+ msgid "United States (multi-region location)"
53
+ msgstr ""
54
+
55
+ #: src/addons/azure.php:552
56
+ msgid "%s Prefix"
57
+ msgstr ""
58
+
59
+ #: src/addons/azure.php:547
60
+ msgid "%s Container"
61
+ msgstr ""
62
+
63
+ #: src/addons/azure.php:542
64
+ msgid "%s Key"
65
+ msgstr ""
66
+
67
+ #: src/addons/azure.php:538
68
+ msgid "%s Account Name"
69
+ msgstr ""
70
+
71
+ #: src/addons/googlecloud.php:623
72
+ msgid "But no %s settings were found. Please complete all fields in %s settings and save the settings."
73
+ msgstr ""
74
+
75
+ #: src/addons/googlecloud.php:621
76
+ msgid "But no bucket was defined, so backups may not complete. Please enter a bucket name in the %s settings and save settings."
77
+ msgstr ""
78
+
79
+ #: src/includes/updraftplus-notices.php:202
80
+ msgid "Find out more."
81
+ msgstr ""
82
+
83
+ #: src/includes/updraftplus-notices.php:202
84
+ msgid "From the team behind UpdraftPlus."
85
+ msgstr ""
86
+
87
+ #: src/central/bootstrap.php:506
88
+ msgid "URL for the site of your UpdraftCentral dashboard"
89
+ msgstr ""
90
+
91
+ #: src/central/bootstrap.php:504
92
+ msgid "Enter the URL where your self-hosted install of UpdraftCentral is located:"
93
+ msgstr ""
94
+
95
+ #: src/central/bootstrap.php:501
96
+ msgid "A website where you have installed %s"
97
+ msgstr ""
98
+
99
+ #: src/central/bootstrap.php:499
100
+ msgid "Self-hosted dashboard"
101
+ msgstr ""
102
+
103
+ #: src/central/bootstrap.php:241
104
+ msgid "At your UpdraftCentral dashboard you should press the \"Add Site\" button then paste the key in the input box."
105
+ msgstr ""
106
+
107
+ #: src/addons/migrator.php:838
108
+ msgid "Your .htaccess has an old site reference on line number %s. You should remove it manually."
109
+ msgid_plural "Your .htaccess has an old site references on line numbers %s. You should remove them manually."
110
+ msgstr[0] ""
111
+ msgstr[1] ""
112
+
113
+ #: src/restorer.php:1878
114
  msgid "Requested table character set (%s) is not present - changing to %s."
115
  msgstr ""
116
 
117
+ #: src/class-updraftplus.php:4528
118
  msgid "Your chosen character set to use instead:"
119
  msgstr ""
120
 
121
+ #: src/class-updraftplus.php:4521
122
  msgid "You can choose another suitable character set instead and continue with the restoration at your own risk."
123
  msgstr ""
124
 
125
+ #: src/class-updraftplus.php:4521
126
  msgid "The database server that this WordPress site is running on doesn't support the character set (%s) which you are trying to import."
127
  msgid_plural "The database server that this WordPress site is running on doesn't support the character sets (%s) which you are trying to import."
128
  msgstr[0] ""
129
  msgstr[1] ""
130
 
131
+ #: src/central/bootstrap.php:584
132
  msgid "Create another key"
133
  msgstr ""
134
 
135
+ #: src/central/bootstrap.php:513
136
  msgid "UpdraftCentral dashboard connection details"
137
  msgstr ""
138
 
139
+ #: src/central/bootstrap.php:507
140
  msgid "Next"
141
  msgstr ""
142
 
143
+ #: src/central/bootstrap.php:493
 
 
 
 
 
 
 
 
144
  msgid "an account"
145
  msgstr ""
146
 
147
+ #: src/central/bootstrap.php:493
148
  msgid "i.e. if you have %s there"
149
  msgstr ""
150
 
151
+ #: src/central/bootstrap.php:482
152
  msgid "Connect this site to an UpdraftCentral dashboard found at..."
153
  msgstr ""
154
 
155
+ #: src/central/bootstrap.php:456
156
  msgid "Manage existing keys (%d)..."
157
  msgstr ""
158
 
159
+ #: src/central/bootstrap.php:406
160
  msgid "There are no UpdraftCentral dashboards that can currently control this site."
161
  msgstr ""
162
 
163
+ #: src/central/bootstrap.php:243
164
  msgid "You can now control this site via your UpdraftCentral dashboard at %s."
165
  msgstr ""
166
 
167
+ #: src/central/bootstrap.php:241
168
  msgid "Detailed instructions for this can be found at %s"
169
  msgstr ""
170
 
171
+ #: src/central/bootstrap.php:241
172
  msgid "You now need to copy the key below and enter it at your %s."
173
  msgstr ""
174
 
175
+ #: src/admin.php:770
176
  msgid "Please enter a valid URL e.g http://example.com"
177
  msgstr ""
178
 
224
  msgid "Account ID"
225
  msgstr ""
226
 
227
+ #: src/class-updraftplus.php:4399
228
  msgid "As long as your web hosting allows http (i.e. non-SSL access) or will forward requests to https (which is almost always the case), this is no problem. If that is not yet set up, then you should set it up, or use %s so that the non-https links are automatically replaced."
229
  msgstr ""
230
 
231
+ #: src/class-updraftplus.php:4397, src/class-updraftplus.php:4399
232
  msgid "the migrator add-on"
233
  msgstr ""
234
 
235
+ #: src/class-updraftplus.php:4397
236
  msgid "This restoration will work if you still have an SSL certificate (i.e. can use https) to access the site. Otherwise, you will want to use %s to search/replace the site address so that the site can be visited without https."
237
  msgstr ""
238
 
239
+ #: src/class-updraftplus.php:4395
240
  msgid "This backup set is of this site, but at the time of the backup you were using %s, whereas the site now uses %s."
241
  msgstr ""
242
 
243
+ #: src/class-updraftplus.php:4392
244
  msgid "The website address in the backup set (%s) is slightly different from that of the site now (%s). This is not expected to be a problem for restoring the site, as long as visits to the former address still reach the site."
245
  msgstr ""
246
 
247
+ #: src/methods/googledrive.php:1162
248
  msgid "To de-authorize UpdraftPlus (all sites) from accessing your Google Drive, follow this link to your Google account settings."
249
  msgstr ""
250
 
251
+ #: src/methods/googledrive.php:1159
252
  msgid "Follow this link to remove this site's settings for %s."
253
  msgstr ""
254
 
256
  msgid "UpdraftPlus debug mode is on: detailed debugging data follows."
257
  msgstr ""
258
 
259
+ #: src/admin.php:751
260
  msgid "Error: The chosen file is corrupt. Please choose a valid UpdraftPlus export file."
261
  msgstr ""
262
 
263
+ #: src/admin.php:1338, src/admin.php:4160, src/backup.php:2017,
264
+ #: src/class-updraftplus.php:2147, src/class-updraftplus.php:2212,
265
+ #: src/class-updraftplus.php:2346
266
  msgid "A PHP fatal error (%s) has occurred: %s"
267
  msgstr ""
268
 
269
+ #: src/admin.php:1329, src/admin.php:4146, src/backup.php:2008,
270
+ #: src/class-updraftplus.php:2138, src/class-updraftplus.php:2205,
271
+ #: src/class-updraftplus.php:2339
272
  msgid "A PHP exception (%s) has occurred: %s"
273
  msgstr ""
274
 
275
+ #: src/addons/googlecloud.php:58
276
  msgid "South-east Australia"
277
  msgstr ""
278
 
279
+ #: src/addons/googlecloud.php:57
280
  msgid "South-east Asia"
281
  msgstr ""
282
 
283
+ #: src/addons/googlecloud.php:56
284
  msgid "North-east Asia"
285
  msgstr ""
286
 
312
  msgid "Select Files"
313
  msgstr ""
314
 
315
+ #: src/methods/cloudfiles.php:487
316
  msgid "Rackspace Storage Region"
317
  msgstr ""
318
 
324
  msgid "Instant and secure logon with a wave of your phone."
325
  msgstr ""
326
 
327
+ #: src/backup.php:2021
328
  msgid "As previously warned (see: %s), encryption is no longer a feature of the free edition of UpdraftPlus"
329
  msgstr ""
330
 
331
+ #: src/admin.php:4688
332
  msgid "Value"
333
  msgstr ""
334
 
335
+ #: src/admin.php:1604
336
  msgid "Did not know how to delete from this cloud service."
337
  msgstr ""
338
 
339
+ #: src/addons/sftp.php:700
340
  msgid "Encrypted login failed; trying non-encrypted"
341
  msgstr ""
342
 
344
  msgid "__Check this box to use Amazon's server-side encryption"
345
  msgstr ""
346
 
347
+ #: src/addons/azure.php:529
348
  msgid "You must add the following as the authorised redirect URI in your Azure console (under \"API Settings\") when asked"
349
  msgstr ""
350
 
352
  msgid "Stored at: %s"
353
  msgstr ""
354
 
355
+ #: src/methods/cloudfiles.php:507
356
  msgid "Cloud Files"
357
  msgstr ""
358
 
359
+ #: src/admin.php:4501
360
  msgid "Your settings failed to save. Please refresh the settings page and try again"
361
  msgstr ""
362
 
363
+ #: src/admin.php:4460
364
  msgid "UpdraftPlus seems to have been updated to version (%s), which is different to the version running when this settings page was loaded. Please reload the settings page before trying to save settings."
365
  msgstr ""
366
 
377
  msgid "Extra database"
378
  msgstr ""
379
 
380
+ #: src/admin.php:3720
381
  msgid "Press here to download or browse"
382
  msgstr ""
383
 
384
+ #: src/admin.php:1117, src/admin.php:1127
385
  msgid "Error: invalid path"
386
  msgstr ""
387
 
388
+ #: src/admin.php:941
389
  msgid "An error occurred when fetching storage module options: "
390
  msgstr ""
391
 
392
+ #: src/admin.php:767
393
  msgid "Loading log file"
394
  msgstr ""
395
 
396
+ #: src/admin.php:766
397
  msgid "Unable to download file. This could be caused by a timeout. It would be best to download the zip to your computer."
398
  msgstr ""
399
 
400
+ #: src/admin.php:765
401
  msgid "Search"
402
  msgstr ""
403
 
404
+ #: src/admin.php:764
405
  msgid "Select a file to view information about it"
406
  msgstr ""
407
 
408
+ #: src/admin.php:763
409
  msgid "Browsing zip file"
410
  msgstr ""
411
 
412
+ #: src/admin.php:732
413
  msgid "With UpdraftPlus Premium, you can directly download individual files from here."
414
  msgstr ""
415
 
416
+ #: src/admin.php:680
417
  msgid "Browse contents"
418
  msgstr ""
419
 
420
+ #: src/restorer.php:1699
421
  msgid "Skipped tables:"
422
  msgstr ""
423
 
424
+ #: src/class-updraftplus.php:4579
425
  msgid "This database backup has the following WordPress tables excluded: %s"
426
  msgstr ""
427
 
428
+ #: src/admin.php:2615
429
  msgid "With UpdraftPlus Premium, you can choose to backup non-WordPress tables, backup only specified tables, and backup other databases too."
430
  msgstr ""
431
 
432
+ #: src/admin.php:2615
433
  msgid "All WordPress tables will be backed up."
434
  msgstr ""
435
 
436
+ #: src/admin.php:762
437
  msgid "Further information may be found in the browser JavaScript console, and the server PHP error logs."
438
  msgstr ""
439
 
440
+ #: src/admin.php:762
441
  msgid "That you are attempting to upload a zip file previously created by UpdraftPlus."
442
  msgstr ""
443
 
444
+ #: src/admin.php:762
445
  msgid "The available memory on the server."
446
  msgstr ""
447
 
448
+ #: src/admin.php:762
449
  msgid "Any settings in your .htaccess or web.config file that affects the maximum upload or post size."
450
  msgstr ""
451
 
452
+ #: src/admin.php:762
453
  msgid "The file failed to upload. Please check the following:"
454
  msgstr ""
455
 
456
+ #: src/admin.php:761
457
  msgid "HTTP code:"
458
  msgstr ""
459
 
460
+ #: src/admin.php:657
461
  msgid "You have chosen to backup a database, but no tables have been selected"
462
  msgstr ""
463
 
753
  msgid "Apache modules"
754
  msgstr ""
755
 
756
+ #: src/includes/updraftplus-notices.php:264
757
  msgid "Summer sale - 20% off UpdraftPlus Premium until July 31st"
758
  msgstr ""
759
 
760
+ #: src/includes/updraftplus-notices.php:251
761
  msgid "Spring sale - 20% off UpdraftPlus Premium until April 31st"
762
  msgstr ""
763
 
764
+ #: src/includes/updraftplus-notices.php:238
765
  msgid "Happy New Year - 20% off UpdraftPlus Premium until January 1st"
766
  msgstr ""
767
 
768
+ #: src/includes/updraftplus-notices.php:225
769
  msgid "Christmas sale - 20% off UpdraftPlus Premium until December 25th"
770
  msgstr ""
771
 
772
+ #: src/includes/updraftplus-notices.php:213,
773
+ #: src/includes/updraftplus-notices.php:226,
774
+ #: src/includes/updraftplus-notices.php:239,
775
+ #: src/includes/updraftplus-notices.php:252,
776
+ #: src/includes/updraftplus-notices.php:265
777
  msgid "To benefit, use this discount code:"
778
  msgstr ""
779
 
780
+ #: src/includes/updraftplus-notices.php:212
781
  msgid "Black Friday - 20% off UpdraftPlus Premium until November 30th"
782
  msgstr ""
783
 
921
  msgid "Export / import settings"
922
  msgstr ""
923
 
924
+ #: src/restorer.php:1887
925
  msgid "Processing table (%s)"
926
  msgstr ""
927
 
928
+ #: src/restorer.php:1665
929
  msgid "Backup of: %s"
930
  msgstr ""
931
 
932
+ #: src/methods/googledrive.php:252
933
  msgid "The client has been deleted from the Google Drive API console. Please create a new Google Drive project and reconnect with UpdraftPlus."
934
  msgstr ""
935
 
936
+ #: src/methods/dropbox.php:589
937
  msgid "%s de-authentication"
938
  msgstr ""
939
 
940
+ #: src/methods/dropbox.php:530
941
  msgid "You must add the following as the authorised redirect URI in your Dropbox console (under \"API Settings\") when asked"
942
  msgstr ""
943
 
944
+ #: src/methods/dropbox.php:505
945
  msgid "Follow this link to deauthenticate with %s."
946
  msgstr ""
947
 
948
+ #: src/central/bootstrap.php:579
949
  msgid "UpdraftCentral enables control of your WordPress sites (including management of backups and updates) from a central dashboard."
950
  msgstr ""
951
 
952
+ #: src/backup.php:1615
953
  msgid "If not, you will need to either remove data from this table, or contact your hosting company to request more resources."
954
  msgstr ""
955
 
957
  msgid "You have selected a remote storage option which has an authorization step to complete:"
958
  msgstr ""
959
 
960
+ #: src/admin.php:1680
961
  msgid "Remote files deleted:"
962
  msgstr ""
963
 
964
+ #: src/admin.php:1679
965
  msgid "Local files deleted:"
966
  msgstr ""
967
 
968
+ #: src/admin.php:989, src/admin.php:998, src/admin.php:1011, src/admin.php:1020
969
  msgid "Follow this link to authorize access to your %s account (you will not be able to back up to %s without it)."
970
  msgstr ""
971
 
972
+ #: src/admin.php:760
973
  msgid "remote files deleted"
974
  msgstr ""
975
 
976
+ #: src/admin.php:758
977
  msgid "Complete"
978
  msgstr ""
979
 
980
+ #: src/admin.php:757
981
  msgid "Do you want to carry out the import?"
982
  msgstr ""
983
 
984
+ #: src/admin.php:756
985
  msgid "Which was exported on:"
986
  msgstr ""
987
 
988
+ #: src/admin.php:755
989
  msgid "This will import data from:"
990
  msgstr ""
991
 
992
+ #: src/admin.php:754
993
  msgid "Importing..."
994
  msgstr ""
995
 
996
+ #: src/admin.php:750
997
  msgid "You have not yet selected a file to import."
998
  msgstr ""
999
 
1000
+ #: src/admin.php:734
1001
  msgid "Your export file will be of your displayed settings, not your saved ones."
1002
  msgstr ""
1003
 
1004
+ #: src/admin.php:87
1005
  msgid "template not found"
1006
  msgstr ""
1007
 
1009
  msgid "US East (Ohio)"
1010
  msgstr ""
1011
 
1012
+ #: src/addons/onedrive.php:949
1013
  msgid "This site uses a URL which is either non-HTTPS, or is localhost or 127.0.0.1 URL. As such, you must use the main %s %s App to authenticate with your account."
1014
  msgstr ""
1015
 
1016
+ #: src/addons/onedrive.php:635
1017
  msgid "Account is not authorized (%s)."
1018
  msgstr ""
1019
 
1020
+ #: src/addons/onedrive.php:596, src/udaddons/updraftplus-addons.php:872
1021
  msgid "Your IP address:"
1022
  msgstr ""
1023
 
1024
+ #: src/addons/onedrive.php:596, src/udaddons/updraftplus-addons.php:872,
1025
+ #: src/udaddons/updraftplus-addons.php:886
1026
  msgid "To remove any block, please go here."
1027
  msgstr ""
1028
 
1029
+ #: src/addons/onedrive.php:581, src/udaddons/updraftplus-addons.php:857
1030
  msgid "An error response was received; HTTP code:"
1031
  msgstr ""
1032
 
1033
+ #: src/includes/class-commands.php:336
1034
  msgid "%s add-on not found"
1035
  msgstr ""
1036
 
1042
  msgid "This makes time-outs much more likely. You are recommended to turn safe_mode off, or to restore only one entity at a time"
1043
  msgstr ""
1044
 
1045
+ #: src/admin.php:2429
1046
  msgid "To fix this problem go here."
1047
  msgstr ""
1048
 
1049
+ #: src/admin.php:2429
1050
  msgid "OptimizePress 2.0 encodes its contents, so search/replace does not work."
1051
  msgstr ""
1052
 
1053
+ #: src/admin.php:718
1054
  msgid "your PHP install lacks the openssl module; as a result, this can take minutes; if nothing has happened by then, then you should either try a smaller key size, or ask your web hosting company how to enable this PHP module on your setup."
1055
  msgstr ""
1056
 
1057
+ #: src/addons/webdav.php:121
1058
  msgid "Path"
1059
  msgstr ""
1060
 
1061
+ #: src/addons/webdav.php:116
1062
  msgid "Leave this blank to use the default (80 for webdav, 443 for webdavs)"
1063
  msgstr ""
1064
 
1065
+ #: src/addons/webdav.php:108
1066
  msgid "Enter any path in the field below."
1067
  msgstr ""
1068
 
1069
+ #: src/addons/webdav.php:108
1070
  msgid "A host name cannot contain a slash."
1071
  msgstr ""
1072
 
1073
+ #: src/addons/webdav.php:83
1074
  msgid "Protocol (SSL or not)"
1075
  msgstr ""
1076
 
1077
+ #: src/addons/webdav.php:78
1078
  msgid "This WebDAV URL is generated by filling in the options below. If you do not know the details, then you will need to ask your WebDAV provider."
1079
  msgstr ""
1080
 
1081
+ #: src/udaddons/updraftplus-addons.php:889
1082
  msgid "No response data was received. This usually indicates a network connectivity issue (e.g. an outgoing firewall or overloaded network) between this site and UpdraftPlus.com."
1083
  msgstr ""
1084
 
1085
+ #: src/methods/s3.php:1168
1086
  msgid "The AWS access key looks to be wrong (valid %s access keys begin with \"AK\")"
1087
  msgstr ""
1088
 
1106
  msgid "FAQs"
1107
  msgstr ""
1108
 
1109
+ #: src/central/bootstrap.php:535
1110
  msgid "More information..."
1111
  msgstr ""
1112
 
1113
+ #: src/central/bootstrap.php:533
1114
  msgid "Use the alternative method for making a connection with the dashboard."
1115
  msgstr ""
1116
 
1117
+ #: src/central/bootstrap.php:443
1118
  msgid "Key size: %d bits"
1119
  msgstr ""
1120
 
1121
+ #: src/central/bootstrap.php:438
1122
  msgid "Public key was sent to:"
1123
  msgstr ""
1124
 
1125
+ #: src/backup.php:2233
1126
  msgid "Failed to open directory (check the file permissions and ownership): %s"
1127
  msgstr ""
1128
 
1129
+ #: src/backup.php:2211
1130
  msgid "%s: unreadable file - could not be backed up (check the file permissions and ownership)"
1131
  msgstr ""
1132
 
1133
+ #: src/addons/migrator.php:2286
1134
  msgid "Create key"
1135
  msgstr ""
1136
 
1137
+ #: src/addons/migrator.php:2283, src/central/bootstrap.php:527
1138
  msgid "slower, strongest"
1139
  msgstr ""
1140
 
1141
+ #: src/addons/migrator.php:2282, src/central/bootstrap.php:526
1142
  msgid "recommended"
1143
  msgstr ""
1144
 
1145
+ #: src/addons/migrator.php:2282, src/central/bootstrap.php:526
1146
  msgid "%s bytes"
1147
  msgstr ""
1148
 
1149
+ #: src/addons/migrator.php:2281, src/central/bootstrap.php:525
1150
  msgid "faster (possibility for slow PHP installs)"
1151
  msgstr ""
1152
 
1153
+ #: src/addons/migrator.php:2280, src/central/bootstrap.php:524
1154
  msgid "easy to break, fastest"
1155
  msgstr ""
1156
 
1157
+ #: src/addons/migrator.php:2280, src/addons/migrator.php:2281,
1158
+ #: src/addons/migrator.php:2283, src/central/bootstrap.php:524,
1159
+ #: src/central/bootstrap.php:525, src/central/bootstrap.php:527
1160
  msgid "%s bits"
1161
  msgstr ""
1162
 
1163
+ #: src/addons/migrator.php:2278, src/central/bootstrap.php:522
1164
  msgid "Encryption key size:"
1165
  msgstr ""
1166
 
1167
+ #: src/addons/migrator.php:2276
1168
  msgid "Enter your chosen name"
1169
  msgstr ""
1170
 
1171
+ #: src/addons/migrator.php:2275
1172
  msgid "Create a key: give this key a unique name (e.g. indicate the site it is for), then press \"Create Key\":"
1173
  msgstr ""
1174
 
1175
+ #: src/methods/googledrive.php:497
1176
  msgid "Upload expected to fail: the %s limit for any single file is %s, whereas this file is %s GB (%d bytes)"
1177
  msgstr ""
1178
 
1192
  msgid "This backup archive is %s MB in size - the attempt to send this via email is likely to fail (few email servers allow attachments of this size). If so, you should switch to using a different remote storage method."
1193
  msgstr ""
1194
 
1195
+ #: src/class-updraftplus.php:1754
1196
  msgid "Size: %s MB"
1197
  msgstr ""
1198
 
1204
  msgid "Now"
1205
  msgstr ""
1206
 
1207
+ #: src/class-updraftplus.php:4411, src/restorer.php:1015
1208
  msgid "You should enable %s to make any pretty permalinks (e.g. %s) work"
1209
  msgstr ""
1210
 
1212
  msgid "(tap on an icon to select or unselect)"
1213
  msgstr ""
1214
 
1215
+ #: src/methods/updraftvault.php:310, src/methods/updraftvault.php:316,
1216
+ #: src/methods/updraftvault.php:322
1217
  msgid "%s per year"
1218
  msgstr ""
1219
 
1220
+ #: src/methods/updraftvault.php:309, src/methods/updraftvault.php:315,
1221
+ #: src/methods/updraftvault.php:321
1222
  msgid "or (annual discount)"
1223
  msgstr ""
1224
 
1226
  msgid "No Vault connection was found for this site (has it moved?); please disconnect and re-connect."
1227
  msgstr ""
1228
 
1229
+ #: src/class-updraftplus.php:538, src/class-updraftplus.php:583
1230
  msgid "The given file was not found, or could not be read."
1231
  msgstr ""
1232
 
1233
+ #: src/central/bootstrap.php:577
1234
  msgid "UpdraftCentral (Remote Control)"
1235
  msgstr ""
1236
 
1237
+ #: src/central/bootstrap.php:566
1238
  msgid "View recent UpdraftCentral log events"
1239
  msgstr ""
1240
 
1241
+ #: src/central/bootstrap.php:516
 
 
 
 
1242
  msgid "Enter any description"
1243
  msgstr ""
1244
 
1245
+ #: src/central/bootstrap.php:515
1246
  msgid "Description"
1247
  msgstr ""
1248
 
1249
+ #: src/central/bootstrap.php:448
1250
  msgid "Delete..."
1251
  msgstr ""
1252
 
1253
+ #: src/central/bootstrap.php:441
1254
  msgid "Created:"
1255
  msgstr ""
1256
 
1257
+ #: src/central/bootstrap.php:438
1258
  msgid "Access this site as user:"
1259
  msgstr ""
1260
 
1261
+ #: src/central/bootstrap.php:462
1262
  msgid "Details"
1263
  msgstr ""
1264
 
1265
+ #: src/central/bootstrap.php:461
1266
  msgid "Key description"
1267
  msgstr ""
1268
 
1269
+ #: src/central/bootstrap.php:334, src/central/bootstrap.php:345
1270
  msgid "A key was created, but the attempt to register it with %s was unsuccessful - please try again later."
1271
  msgstr ""
1272
 
1273
+ #: src/central/bootstrap.php:206
1274
  msgid "An invalid URL was entered"
1275
  msgstr ""
1276
 
1277
+ #: src/central/bootstrap.php:82
1278
  msgid "Close..."
1279
  msgstr ""
1280
 
1281
+ #: src/central/bootstrap.php:74
1282
  msgid "This connection appears to already have been made."
1283
  msgstr ""
1284
 
1285
+ #: src/central/bootstrap.php:71
1286
  msgid "You must visit this link in the same browser and login session as you created the key in."
1287
  msgstr ""
1288
 
1289
+ #: src/central/bootstrap.php:67
1290
  msgid "You must visit this URL in the same browser and login session as you created the key in."
1291
  msgstr ""
1292
 
1293
+ #: src/central/bootstrap.php:67
1294
  msgid "You are not logged into this WordPress site in your web browser."
1295
  msgstr ""
1296
 
1297
+ #: src/central/bootstrap.php:64
1298
  msgid "The key referred to was unknown."
1299
  msgstr ""
1300
 
1301
+ #: src/central/bootstrap.php:61
1302
  msgid "A new UpdraftCentral connection has not been made."
1303
  msgstr ""
1304
 
1305
+ #: src/central/bootstrap.php:59
1306
  msgid "An UpdraftCentral connection has been made successfully."
1307
  msgstr ""
1308
 
1309
+ #: src/central/bootstrap.php:56
1310
  msgid "UpdraftCentral Connection"
1311
  msgstr ""
1312
 
1313
+ #: src/backup.php:917, src/class-updraftplus.php:2828
1314
  msgid "The backup was aborted by the user"
1315
  msgstr ""
1316
 
1317
+ #: src/admin.php:4496
1318
  msgid "Your settings have been saved."
1319
  msgstr ""
1320
 
1321
+ #: src/admin.php:3598
1322
  msgid "Total backup size:"
1323
  msgstr ""
1324
 
1325
+ #: src/admin.php:2955
1326
  msgid "stop"
1327
  msgstr ""
1328
 
1329
+ #: src/admin.php:2797
1330
  msgid "The backup has finished running"
1331
  msgstr ""
1332
 
1352
  msgid "calculate"
1353
  msgstr ""
1354
 
1355
+ #: src/admin.php:733
1356
  msgid "You should save your changes to ensure that they are used for making your backup."
1357
  msgstr ""
1358
 
1359
+ #: src/admin.php:726
1360
  msgid "We requested to delete the file, but could not understand the server's response"
1361
  msgstr ""
1362
 
1363
+ #: src/admin.php:725
1364
  msgid "Please enter a valid URL"
1365
  msgstr ""
1366
 
1367
+ #: src/admin.php:708
1368
  msgid "Saving..."
1369
  msgstr ""
1370
 
1371
+ #: src/admin.php:671
1372
  msgid "Error: the server sent us a response which we did not understand."
1373
  msgstr ""
1374
 
1375
+ #: src/admin.php:663
1376
  msgid "Fetching..."
1377
  msgstr ""
1378
 
1380
  msgid "Asia Pacific (Seoul)"
1381
  msgstr ""
1382
 
1383
+ #: src/restorer.php:1688
1384
  msgid "Uploads URL:"
1385
  msgstr ""
1386
 
1387
+ #: src/backup.php:435
1388
  msgid "Unexpected error: no class '%s' was found (your UpdraftPlus installation seems broken - try re-installing)"
1389
  msgstr ""
1390
 
1392
  msgid "The required %s PHP module is not installed - ask your web hosting company to enable it."
1393
  msgstr ""
1394
 
1395
+ #: src/class-updraftplus.php:4462, src/restorer.php:1707
1396
  msgid "To import an ordinary WordPress site into a multisite installation requires %s."
1397
  msgstr ""
1398
 
1399
+ #: src/class-updraftplus.php:4458
1400
  msgid "Please read this link for important information on this process."
1401
  msgstr ""
1402
 
1403
+ #: src/class-updraftplus.php:4458
1404
  msgid "It will be imported as a new site."
1405
  msgstr ""
1406
 
1407
+ #: src/admin.php:2588, src/templates/wp-admin/notices/horizontal-notice.php:16,
1408
  #: src/templates/wp-admin/notices/horizontal-notice.php:18
1409
  msgid "Dismiss"
1410
  msgstr ""
1411
 
1412
+ #: src/admin.php:745
1413
  msgid "Please fill in the required information."
1414
  msgstr ""
1415
 
1429
  msgid "Which site to restore"
1430
  msgstr ""
1431
 
1432
+ #: src/addons/migrator.php:517, src/addons/migrator.php:518
1433
  msgid "Error when creating new site at your chosen address:"
1434
  msgstr ""
1435
 
1436
+ #: src/addons/migrator.php:459
1437
  msgid "Required information for restoring this backup was not given (%s)"
1438
  msgstr ""
1439
 
1440
+ #: src/addons/migrator.php:418
1441
  msgid "Attribute imported content to user"
1442
  msgstr ""
1443
 
1444
+ #: src/addons/migrator.php:408, src/addons/migrator.php:410
1445
  msgid "You must use lower-case letters or numbers for the site path, only."
1446
  msgstr ""
1447
 
1448
+ #: src/addons/migrator.php:396
1449
  msgid "This feature is not compatible with %s"
1450
  msgstr ""
1451
 
1452
+ #: src/addons/migrator.php:394, src/addons/migrator.php:396
1453
  msgid "Importing a single site into a multisite install"
1454
  msgstr ""
1455
 
1456
+ #: src/addons/migrator.php:385
1457
  msgid "other content from wp-content"
1458
  msgstr ""
1459
 
1460
+ #: src/addons/migrator.php:382
1461
  msgid "WordPress core"
1462
  msgstr ""
1463
 
1464
+ #: src/addons/migrator.php:382, src/addons/migrator.php:385,
1465
+ #: src/addons/migrator.php:388
1466
  msgid "You selected %s to be included in the restoration - this cannot / should not be done when importing a single site into a network."
1467
  msgstr ""
1468
 
1470
  msgid "Call WordPress action:"
1471
  msgstr ""
1472
 
1473
+ #: src/admin.php:2623
1474
  msgid "Your saved settings also affect what is backed up - e.g. files excluded."
1475
  msgstr ""
1476
 
1477
+ #: src/admin.php:4035
1478
  msgid "Skipping: this archive was already restored."
1479
  msgstr ""
1480
 
1506
  msgid "This button will delete all UpdraftPlus settings and progress information for in-progress backups (but not any of your existing backups from your cloud storage)."
1507
  msgstr ""
1508
 
1509
+ #: src/admin.php:4370
1510
  msgid "Send this backup to remote storage"
1511
  msgstr ""
1512
 
1513
+ #: src/admin.php:4368
1514
  msgid "Check out UpdraftPlus Vault."
1515
  msgstr ""
1516
 
1517
+ #: src/admin.php:4368
1518
  msgid "Not got any remote storage?"
1519
  msgstr ""
1520
 
1521
+ #: src/admin.php:4368
1522
  msgid "settings"
1523
  msgstr ""
1524
 
1525
+ #: src/admin.php:4368
1526
  msgid "Backup won't be sent to any remote storage - none has been saved in the %s"
1527
  msgstr ""
1528
 
1529
+ #: src/admin.php:2621
1530
  msgid "Include any files in the backup"
1531
  msgstr ""
1532
 
1533
+ #: src/admin.php:2607
1534
  msgid "Include the database in the backup"
1535
  msgstr ""
1536
 
1537
+ #: src/admin.php:2587
1538
  msgid "Continue restoration"
1539
  msgstr ""
1540
 
1541
+ #: src/admin.php:2582
1542
  msgid "You have an unfinished restoration operation, begun %s ago."
1543
  msgstr ""
1544
 
1545
+ #: src/admin.php:2581
1546
  msgid "Unfinished restoration"
1547
  msgstr ""
1548
 
1549
+ #: src/admin.php:2579
1550
  msgid "%s minutes, %s seconds"
1551
  msgstr ""
1552
 
1553
+ #: src/admin.php:2526
1554
  msgid "Backup Contents And Schedule"
1555
  msgstr ""
1556
 
1558
  msgid "Premium / Extensions"
1559
  msgstr ""
1560
 
1561
+ #: src/admin.php:2295, src/admin.php:2304
1562
  msgid "Sufficient information about the in-progress restoration operation could not be found."
1563
  msgstr ""
1564
 
1565
+ #: src/addons/morefiles.php:55, src/admin.php:731
1566
  msgctxt "(verb)"
1567
  msgid "Download"
1568
  msgstr ""
1569
 
1570
+ #: src/admin.php:656
1571
  msgid "You have chosen to backup files, but no file entities have been selected"
1572
  msgstr ""
1573
 
1574
+ #: src/admin.php:558
1575
  msgid "Extensions"
1576
  msgstr ""
1577
 
1578
+ #: src/admin.php:550, src/templates/wp-admin/settings/tab-bar.php:8
1579
  msgid "Advanced Tools"
1580
  msgstr ""
1581
 
1582
+ #: src/addons/googlecloud.php:964
1583
  msgid "Bucket location"
1584
  msgstr ""
1585
 
1586
+ #: src/addons/googlecloud.php:959
1587
  msgid "Note that Google do not support every storage class in every location - you should read their documentation to learn about current availability."
1588
  msgstr ""
1589
 
1590
+ #: src/addons/googlecloud.php:959, src/addons/googlecloud.php:984
1591
  msgid "This setting applies only when a new bucket is being created."
1592
  msgstr ""
1593
 
1594
+ #: src/addons/googlecloud.php:947
1595
  msgid "You must use a bucket name that is unique, for all %s users."
1596
  msgstr ""
1597
 
1598
+ #: src/addons/googlecloud.php:906
1599
  msgid "Do not confuse %s with %s - they are separate things."
1600
  msgstr ""
1601
 
1602
+ #: src/addons/googlecloud.php:312
1603
  msgid "You do not have access to this bucket"
1604
  msgstr ""
1605
 
1606
+ #: src/addons/googlecloud.php:59, src/addons/googlecloud.php:60,
1607
+ #: src/addons/googlecloud.php:61
1608
  msgid "Western Europe"
1609
  msgstr ""
1610
 
1611
+ #: src/addons/googlecloud.php:55
1612
  msgid "Eastern Asia-Pacific"
1613
  msgstr ""
1614
 
1615
+ #: src/addons/googlecloud.php:54
1616
  msgid "Western United States"
1617
  msgstr ""
1618
 
1619
+ #: src/addons/googlecloud.php:53
1620
  msgid "Eastern United States"
1621
  msgstr ""
1622
 
1623
+ #: src/addons/googlecloud.php:52
1624
  msgid " Eastern United States"
1625
  msgstr ""
1626
 
1627
+ #: src/addons/googlecloud.php:51, src/addons/googlecloud.php:971
1628
  msgid "Central United States"
1629
  msgstr ""
1630
 
1631
+ #: src/addons/googlecloud.php:50
1632
  msgid "European Union"
1633
  msgstr ""
1634
 
1635
+ #: src/addons/googlecloud.php:49
1636
  msgid "Asia Pacific"
1637
  msgstr ""
1638
 
1639
+ #: src/addons/googlecloud.php:48, src/addons/googlecloud.php:49,
1640
+ #: src/addons/googlecloud.php:50
1641
  msgid "multi-region location"
1642
  msgstr ""
1643
 
1644
+ #: src/addons/googlecloud.php:48
1645
  msgid "United States"
1646
  msgstr ""
1647
 
1648
+ #: src/addons/googlecloud.php:43, src/addons/googlecloud.php:956
1649
  msgid "Nearline"
1650
  msgstr ""
1651
 
1652
+ #: src/addons/googlecloud.php:42, src/addons/googlecloud.php:955
1653
  msgid "Durable reduced availability"
1654
  msgstr ""
1655
 
1656
+ #: src/addons/googlecloud.php:41, src/addons/googlecloud.php:954,
1657
+ #: src/addons/s3-enhanced.php:61
1658
  msgid "Standard"
1659
  msgstr ""
1660
 
1661
+ #: src/addons/azure.php:553
1662
  msgid "container"
1663
  msgstr ""
1664
 
1665
+ #: src/addons/azure.php:553
1666
  msgid "You can enter the path of any %s virtual folder you wish to use here."
1667
  msgstr ""
1668
 
1669
+ #: src/addons/azure.php:552
1670
  msgid "optional"
1671
  msgstr ""
1672
 
1673
+ #: src/addons/azure.php:548
 
 
 
 
1674
  msgid "See Microsoft's guidelines on container naming by following this link."
1675
  msgstr ""
1676
 
1677
+ #: src/addons/azure.php:548
1678
  msgid "Enter the path of the %s you wish to use here."
1679
  msgstr ""
1680
 
1681
+ #: src/addons/azure.php:539
1682
  msgid "This is not your Azure login - see the instructions if needing more guidance."
1683
  msgstr ""
1684
 
1685
+ #: src/addons/azure.php:538, src/addons/azure.php:542,
1686
+ #: src/addons/azure.php:547, src/addons/azure.php:552
 
 
 
1687
  msgid "Azure"
1688
  msgstr ""
1689
 
1690
+ #: src/addons/azure.php:534
1691
  msgid "Create Azure credentials in your Azure developer console."
1692
  msgstr ""
1693
 
1699
  msgid "Could not access container"
1700
  msgstr ""
1701
 
1702
+ #: src/class-updraftplus.php:2845
1703
  msgid "To complete your migration/clone, you should now log in to the remote site and restore the backup set."
1704
  msgstr ""
1705
 
1706
+ #: src/backup.php:1667
1707
  msgid "the options table was not found"
1708
  msgstr ""
1709
 
1710
+ #: src/backup.php:1665
1711
  msgid "no options or sitemeta table was found"
1712
  msgstr ""
1713
 
1714
+ #: src/backup.php:1665, src/backup.php:1667
1715
  msgid "The database backup appears to have failed"
1716
  msgstr ""
1717
 
1718
+ #: src/backup.php:1537
1719
  msgid "The backup directory is not writable (or disk space is full) - the database backup is expected to shortly fail."
1720
  msgstr ""
1721
 
1727
  msgid "Not installed"
1728
  msgstr ""
1729
 
1730
+ #: src/addons/googlecloud.php:950, src/addons/s3-enhanced.php:54
1731
  msgid "Storage class"
1732
  msgstr ""
1733
 
1734
+ #: src/addons/googlecloud.php:947
1735
  msgid "See Google's guidelines on bucket naming by following this link."
1736
  msgstr ""
1737
 
1738
+ #: src/addons/googlecloud.php:947
1739
  msgid "Enter the name of the %s bucket you wish to use here."
1740
  msgstr ""
1741
 
1742
+ #: src/addons/googlecloud.php:946
1743
  msgid "Bucket"
1744
  msgstr ""
1745
 
1746
+ #: src/addons/googlecloud.php:942
1747
  msgid "Otherwise, you can leave it blank."
1748
  msgstr ""
1749
 
1750
+ #: src/addons/googlecloud.php:942
1751
  msgid "N.B. This is only needed if you have not already created the bucket, and you wish UpdraftPlus to create it for you."
1752
  msgstr ""
1753
 
1754
+ #: src/addons/googlecloud.php:942
1755
  msgid "Enter the ID of the %s project you wish to use here."
1756
  msgstr ""
1757
 
1758
+ #: src/addons/googlecloud.php:918
1759
  msgid "Follow this link to your Google API Console, and there activate the Storage API and create a Client ID in the API Access section."
1760
  msgstr ""
1761
 
1762
+ #: src/addons/googlecloud.php:831
1763
  msgid "You must enter a project ID in order to be able to create a new bucket."
1764
  msgstr ""
1765
 
1767
  msgid "Project ID"
1768
  msgstr ""
1769
 
1770
+ #: src/addons/googlecloud.php:690
1771
  msgid "You must save and authenticate before you can test your settings."
1772
  msgstr ""
1773
 
1774
+ #: src/addons/googlecloud.php:537
1775
  msgid "Have not yet obtained an access token from Google - you need to authorise or re-authorise your connection to Google Cloud."
1776
  msgstr ""
1777
 
1778
+ #: src/addons/googlecloud.php:259, src/addons/googlecloud.php:332,
1779
+ #: src/addons/googlecloud.php:823, src/addons/googlecloud.php:870
1780
  msgid "You do not have access to this bucket."
1781
  msgstr ""
1782
 
1783
+ #: src/addons/googlecloud.php:259, src/addons/googlecloud.php:312,
1784
+ #: src/addons/googlecloud.php:322, src/addons/googlecloud.php:332,
1785
+ #: src/addons/googlecloud.php:649, src/addons/googlecloud.php:823,
1786
+ #: src/addons/googlecloud.php:870, src/addons/googlecloud.php:912,
1787
+ #: src/addons/googlecloud.php:912, src/addons/googlecloud.php:927,
1788
+ #: src/addons/googlecloud.php:935, src/addons/googlecloud.php:947
1789
  msgid "Google Cloud"
1790
  msgstr ""
1791
 
1792
+ #: src/addons/googlecloud.php:259, src/addons/googlecloud.php:312,
1793
+ #: src/addons/googlecloud.php:332, src/addons/googlecloud.php:823,
1794
+ #: src/addons/googlecloud.php:870
1795
  msgid "%s Service Exception."
1796
  msgstr ""
1797
 
1828
  msgid "Press here to look inside your remote storage methods for any existing backup sets (from any site, if they are stored in the same folder)."
1829
  msgstr ""
1830
 
1831
+ #: src/admin.php:1678
1832
  msgid "Backup sets removed:"
1833
  msgstr ""
1834
 
1835
+ #: src/admin.php:744
1836
  msgid "Processing..."
1837
  msgstr ""
1838
 
1839
+ #: src/admin.php:742
1840
  msgid "For backups older than"
1841
  msgstr ""
1842
 
1843
+ #: src/admin.php:741
1844
  msgid "week(s)"
1845
  msgstr ""
1846
 
1847
+ #: src/admin.php:740
1848
  msgid "hour(s)"
1849
  msgstr ""
1850
 
1851
+ #: src/admin.php:739
1852
  msgid "day(s)"
1853
  msgstr ""
1854
 
1855
+ #: src/admin.php:738
1856
  msgid "in the month"
1857
  msgstr ""
1858
 
1859
+ #: src/admin.php:737
1860
  msgid "day"
1861
  msgstr ""
1862
 
1868
  msgid "Add an additional retention rule..."
1869
  msgstr ""
1870
 
1871
+ #: src/restorer.php:2210
1872
  msgid "This database needs to be deployed on MySQL version %s or later."
1873
  msgstr ""
1874
 
1875
+ #: src/restorer.php:2210
1876
  msgid "This problem is caused by trying to restore a database on a very old MySQL version that is incompatible with the source database."
1877
  msgstr ""
1878
 
1879
+ #: src/methods/updraftvault.php:670
1880
  msgid "You do not currently have any UpdraftPlus Vault quota"
1881
  msgstr ""
1882
 
1883
+ #: src/class-updraftplus.php:4500
1884
  msgid "You must upgrade MySQL to be able to use this database."
1885
  msgstr ""
1886
 
1887
+ #: src/class-updraftplus.php:4500
1888
  msgid "The database backup uses MySQL features not available in the old MySQL version (%s) that this site is running on."
1889
  msgstr ""
1890
 
1891
+ #: src/admin.php:2414
1892
  msgid "The UpdraftPlus directory in wp-content/plugins has white-space in it; WordPress does not like this. You should rename the directory to wp-content/plugins/updraftplus to fix this problem."
1893
  msgstr ""
1894
 
1895
+ #: src/methods/updraftvault.php:342
1896
  msgid "Don't know your email address, or forgotten your password?"
1897
  msgstr ""
1898
 
1899
+ #: src/methods/updraftvault.php:335
1900
  msgid "Enter your UpdraftPlus.Com email / password here to connect:"
1901
  msgstr ""
1902
 
1903
+ #: src/methods/updraftvault.php:299, src/methods/updraftvault.php:328
1904
  msgid "Read the FAQs here."
1905
  msgstr ""
1906
 
1912
  msgid "Server-side encryption"
1913
  msgstr ""
1914
 
1915
+ #: src/methods/updraftvault.php:678
1916
  msgid "If you have forgotten your password, then go here to change your password on updraftplus.com."
1917
  msgstr ""
1918
 
1919
+ #: src/admin.php:1003
1920
  msgid "Go to the remote storage settings in order to connect."
1921
  msgstr ""
1922
 
1923
+ #: src/admin.php:1003
1924
  msgid "%s has been chosen for remote storage, but you are not currently connected."
1925
  msgstr ""
1926
 
1927
+ #: src/methods/updraftvault.php:325
1928
  msgid "Payments can be made in US dollars, euros or GB pounds sterling, via card or PayPal."
1929
  msgstr ""
1930
 
1931
+ #: src/admin.php:714
1932
  msgid "Update quota count"
1933
  msgstr ""
1934
 
1935
+ #: src/admin.php:713
1936
  msgid "Counting..."
1937
  msgstr ""
1938
 
1939
+ #: src/admin.php:712
1940
  msgid "Disconnecting..."
1941
  msgstr ""
1942
 
1943
+ #: src/admin.php:710
1944
  msgid "Connecting..."
1945
  msgstr ""
1946
 
1947
+ #: src/methods/updraftvault.php:431, src/methods/updraftvault.php:505
1948
  msgid "Refresh current status"
1949
  msgstr ""
1950
 
1951
+ #: src/methods/updraftvault.php:429, src/methods/updraftvault.php:445,
1952
+ #: src/methods/updraftvault.php:447, src/methods/updraftvault.php:505
1953
  msgid "Get more quota"
1954
  msgstr ""
1955
 
1956
+ #: src/methods/updraftvault.php:426, src/methods/updraftvault.php:442,
1957
+ #: src/methods/updraftvault.php:486
1958
  msgid "Current use:"
1959
  msgstr ""
1960
 
1961
+ #: src/methods/updraftvault.php:421
1962
  msgid "You can get more quota here"
1963
  msgstr ""
1964
 
1965
+ #: src/methods/updraftvault.php:421
1966
  msgid "%s Error: you have insufficient storage quota available (%s) to upload this archive (%s)."
1967
  msgstr ""
1968
 
1969
+ #: src/admin.php:711, src/methods/updraftvault.php:369,
1970
+ #: src/methods/updraftvault.php:413
1971
  msgid "Disconnect"
1972
  msgstr ""
1973
 
1974
+ #: src/methods/updraftvault.php:366, src/methods/updraftvault.php:405
1975
  msgid "Quota:"
1976
  msgstr ""
1977
 
1978
+ #: src/methods/updraftvault.php:365, src/methods/updraftvault.php:403
1979
  msgid "Vault owner"
1980
  msgstr ""
1981
 
1982
+ #: src/methods/updraftvault.php:365, src/methods/updraftvault.php:403
1983
  msgid "Well done - there's nothing more needed to set up."
1984
  msgstr ""
1985
 
1986
+ #: src/methods/updraftvault.php:365, src/methods/updraftvault.php:403
1987
  msgid "This site is <strong>connected</strong> to UpdraftPlus Vault."
1988
  msgstr ""
1989
 
1990
+ #: src/methods/updraftvault.php:371, src/methods/updraftvault.php:399
1991
  msgid "You are <strong>not connected</strong> to UpdraftPlus Vault."
1992
  msgstr ""
1993
 
1994
+ #: src/methods/updraftvault.php:342
1995
  msgid "Go here for help"
1996
  msgstr ""
1997
 
1998
+ #: src/methods/updraftvault.php:337
1999
  msgid "E-mail"
2000
  msgstr ""
2001
 
2002
+ #: src/central/bootstrap.php:552, src/methods/updraftvault.php:331,
2003
+ #: src/methods/updraftvault.php:345
2004
  msgid "Back..."
2005
  msgstr ""
2006
 
2007
+ #: src/methods/updraftvault.php:325
2008
  msgid "Subscriptions can be cancelled at any time."
2009
  msgstr ""
2010
 
2011
+ #: src/methods/updraftvault.php:308, src/methods/updraftvault.php:314,
2012
+ #: src/methods/updraftvault.php:320
2013
  msgid "%s per quarter"
2014
  msgstr ""
2015
 
2016
+ #: src/central/bootstrap.php:579, src/methods/updraftvault.php:299,
2017
+ #: src/methods/updraftvault.php:328
2018
  msgid "Read more about it here."
2019
  msgstr ""
2020
 
2021
+ #: src/methods/updraftvault.php:299, src/methods/updraftvault.php:328
2022
  msgid "UpdraftPlus Vault is built on top of Amazon's world-leading data-centres, with redundant data storage to achieve 99.999999999% reliability."
2023
  msgstr ""
2024
 
2025
+ #: src/methods/updraftvault.php:295
2026
  msgid "Already purchased space?"
2027
  msgstr ""
2028
 
2029
+ #: src/methods/updraftvault.php:292
2030
  msgid "Show the options"
2031
  msgstr ""
2032
 
2033
+ #: src/methods/updraftvault.php:291
2034
  msgid "First time user?"
2035
  msgstr ""
2036
 
2037
+ #: src/methods/updraftvault.php:288, src/methods/updraftvault.php:305
2038
  msgid "Press a button to get started."
2039
  msgstr ""
2040
 
2041
+ #: src/methods/updraftvault.php:288, src/methods/updraftvault.php:305
2042
  msgid "UpdraftPlus Vault brings you storage that is <strong>reliable, easy to use and a great price</strong>."
2043
  msgstr ""
2044
 
2059
  msgstr ""
2060
 
2061
  #: src/addons/azure.php:388, src/addons/backblaze.php:464,
2062
+ #: src/addons/googlecloud.php:774, src/methods/s3.php:1196
2063
  msgid "Delete failed:"
2064
  msgstr ""
2065
 
2066
+ #: src/backup.php:3278
2067
  msgid "The zip engine returned the message: %s."
2068
  msgstr ""
2069
 
2083
  msgid "Allow download"
2084
  msgstr ""
2085
 
2086
+ #: src/addons/migrator.php:1830
2087
  msgid "If sending directly from site to site does not work for you, then there are three other methods - please try one of these instead."
2088
  msgstr ""
2089
 
2090
+ #: src/addons/migrator.php:1815, src/admin.php:720
2091
  msgid "You should check that the remote site is online, not firewalled, does not have security modules that may be blocking access, has UpdraftPlus version %s or later active and that the keys have been entered correctly."
2092
  msgstr ""
2093
 
2094
+ #: src/addons/migrator.php:2318
2095
  msgid "Existing keys"
2096
  msgstr ""
2097
 
2098
+ #: src/addons/migrator.php:2309
2099
  msgid "No keys to allow remote sites to connect have yet been created."
2100
  msgstr ""
2101
 
2102
+ #: src/addons/migrator.php:2291
2103
  msgid "Your new key:"
2104
  msgstr ""
2105
 
2106
+ #: src/addons/migrator.php:2270
2107
  msgid "To allow another site to send a backup to this site, create a key, and then press the 'Migrate' button on the sending site, and copy-and-paste the key there."
2108
  msgstr ""
2109
 
2110
+ #: src/addons/migrator.php:2252
2111
  msgid "So, to get the key for the remote site, open the 'Migrate' window on that site, scroll down, and you can create one there."
2112
  msgstr ""
2113
 
2114
+ #: src/addons/migrator.php:2252
2115
  msgid "Keys for this site are created in the section below the one you just pressed in."
2116
  msgstr ""
2117
 
2118
+ #: src/addons/migrator.php:1932, src/central/bootstrap.php:388
2119
  msgid "You must copy and paste this key now - it cannot be shown again."
2120
  msgstr ""
2121
 
2122
+ #: src/addons/migrator.php:1932, src/central/bootstrap.php:388
2123
  msgid "Key created successfully."
2124
  msgstr ""
2125
 
2126
+ #: src/addons/migrator.php:1917
2127
  msgid "A key with this name already exists; you must use a unique name."
2128
  msgstr ""
2129
 
2130
+ #: src/addons/migrator.php:1861
2131
  msgid "Also send this backup to the active remote storage locations"
2132
  msgstr ""
2133
 
2134
+ #: src/addons/migrator.php:1826
2135
  msgid "The site URL you are sending to (%s) looks like a local development website. If you are sending from an external network, it is likely that a firewall will be blocking this."
2136
  msgstr ""
2137
 
2138
+ #: src/addons/migrator.php:1782
2139
  msgid "site not found"
2140
  msgstr ""
2141
 
2142
+ #: src/addons/migrator.php:1767
2143
  msgid "Backup data will be sent to:"
2144
  msgstr ""
2145
 
2146
+ #: src/addons/migrator.php:206
2147
  msgid "Restore an existing backup set onto this site"
2148
  msgstr ""
2149
 
2150
+ #: src/addons/migrator.php:199
2151
  msgid "This site has no backups to restore from yet."
2152
  msgstr ""
2153
 
2154
+ #: src/addons/reporting.php:171
2155
  msgid "Backup made by %s"
2156
  msgstr ""
2157
 
2159
  msgid "This storage method does not allow downloading"
2160
  msgstr ""
2161
 
2162
+ #: src/admin.php:3783
2163
  msgid "(backup set imported from remote location)"
2164
  msgstr ""
2165
 
2179
  msgid "This backup set was not known by UpdraftPlus to be created by the current WordPress installation, but was either found in remote storage, or was sent from a remote site."
2180
  msgstr ""
2181
 
2182
+ #: src/addons/migrator.php:1843, src/admin.php:727
2183
  msgid "Testing connection..."
2184
  msgstr ""
2185
 
2186
+ #: src/admin.php:724
2187
  msgid "Deleting..."
2188
  msgstr ""
2189
 
2190
+ #: src/admin.php:723
2191
  msgid "key name"
2192
  msgstr ""
2193
 
2194
+ #: src/admin.php:721
2195
  msgid "Please give this key a name (e.g. indicate the site it is for):"
2196
  msgstr ""
2197
 
2198
+ #: src/admin.php:718
2199
  msgid "Creating..."
2200
  msgstr ""
2201
 
2202
+ #: src/addons/migrator.php:2269
2203
  msgid "Or, receive a backup from a remote site"
2204
  msgstr ""
2205
 
2206
+ #: src/addons/migrator.php:2258
2207
  msgid "Paste key here"
2208
  msgstr ""
2209
 
2210
+ #: src/addons/migrator.php:2252
2211
  msgid "How do I get a site's key?"
2212
  msgstr ""
2213
 
2214
+ #: src/addons/migrator.php:2252
2215
  msgid "To add a site as a destination for sending to, enter that site's key below."
2216
  msgstr ""
2217
 
2218
+ #: src/addons/migrator.php:2249
2219
  msgid "Or, send a backup to another site"
2220
  msgstr ""
2221
 
2222
+ #: src/addons/migrator.php:2014, src/admin.php:728
2223
  msgid "Send"
2224
  msgstr ""
2225
 
2226
+ #: src/addons/migrator.php:2008, src/admin.php:719
2227
  msgid "Send to site:"
2228
  msgstr ""
2229
 
2230
+ #: src/addons/migrator.php:2006
2231
  msgid "No receiving sites have yet been added."
2232
  msgstr ""
2233
 
2234
+ #: src/addons/migrator.php:1987
2235
  msgid "It is for sending backups to the following site: "
2236
  msgstr ""
2237
 
2238
+ #: src/addons/migrator.php:1987
2239
  msgid "The key was successfully added."
2240
  msgstr ""
2241
 
2242
+ #: src/addons/migrator.php:1971
2243
  msgid "The entered key does not belong to a remote site (it belongs to this one)."
2244
  msgstr ""
2245
 
2246
+ #: src/addons/migrator.php:1960, src/addons/migrator.php:1962,
2247
+ #: src/addons/migrator.php:1966
2248
  msgid "The entered key was corrupt - please try again."
2249
  msgstr ""
2250
 
2251
+ #: src/addons/migrator.php:1958
2252
  msgid "The entered key was the wrong length - please try again."
2253
  msgstr ""
2254
 
2255
+ #: src/addons/migrator.php:1948
2256
  msgid "key"
2257
  msgstr ""
2258
 
2280
  msgid "FTP server"
2281
  msgstr ""
2282
 
2283
+ #: src/addons/migrator.php:171
2284
  msgid "The UpdraftPlus Migrator modifies the restoration operation appropriately, to fit the backup data to the new site."
2285
  msgstr ""
2286
 
2287
+ #: src/addons/migrator.php:171
2288
  msgid "A \"migration\" is ultimately the same as a restoration - but using backup archives that you import from another site."
2289
  msgstr ""
2290
 
2291
+ #: src/admin.php:717
2292
  msgid "Resetting..."
2293
  msgstr ""
2294
 
2295
+ #: src/addons/migrator.php:2258, src/admin.php:716
2296
  msgid "Add site"
2297
  msgstr ""
2298
 
2299
+ #: src/admin.php:715
2300
  msgid "Adding..."
2301
  msgstr ""
2302
 
2303
+ #: src/udaddons/options.php:335
2304
  msgid "Claim not granted - perhaps you have already used this purchase somewhere else, or your paid period for downloading from updraftplus.com has expired?"
2305
  msgstr ""
2306
 
2307
+ #: src/restorer.php:2212
2308
  msgid "To use this backup, your database server needs to support the %s character set."
2309
  msgstr ""
2310
 
2311
+ #: src/udaddons/updraftplus-addons.php:922
2312
  msgid "go here to change your password on updraftplus.com."
2313
  msgstr ""
2314
 
2315
+ #: src/udaddons/updraftplus-addons.php:922
2316
  msgid "If you have forgotten your password "
2317
  msgstr ""
2318
 
2319
+ #: src/udaddons/updraftplus-addons.php:921
2320
  msgid "Go here to re-enter your password."
2321
  msgstr ""
2322
 
2323
+ #: src/addons/migrator.php:235
2324
  msgid "After pressing this button, you will be given the option to choose which components you wish to migrate"
2325
  msgstr ""
2326
 
2327
+ #: src/addons/migrator.php:206
2328
  msgid "To import a backup set, go to the \"Existing Backups\" tab"
2329
  msgstr ""
2330
 
2331
+ #: src/addons/migrator.php:173
2332
  msgid "To restore using any of the backup sets below, press the button."
2333
  msgstr ""
2334
 
2335
+ #: src/admin.php:707, src/admin.php:733, src/admin.php:734
2336
  msgid "You have made changes to your settings, and not saved."
2337
  msgstr ""
2338
 
2339
+ #: src/addons/onedrive.php:994
2340
  msgid "N.B. %s is not case-sensitive."
2341
  msgstr ""
2342
 
2343
+ #: src/addons/onedrive.php:984
2344
  msgid "If OneDrive later shows you the message \"unauthorized_client\", then you did not enter a valid client ID here."
2345
  msgstr ""
2346
 
2347
+ #: src/addons/azure.php:534, src/addons/migrator.php:1830,
2348
+ #: src/addons/onedrive.php:970
2349
  msgid "For longer help, including screenshots, follow this link."
2350
  msgstr ""
2351
 
2352
+ #: src/addons/onedrive.php:963
2353
  msgid "Create OneDrive credentials in your OneDrive developer console."
2354
  msgstr ""
2355
 
2356
+ #: src/addons/onedrive.php:956
2357
  msgid "You must add the following as the authorised redirect URI in your OneDrive console (under \"API Settings\") when asked"
2358
  msgstr ""
2359
 
2360
+ #: src/addons/azure.php:527
2361
  msgid "Microsoft Azure is not compatible with sites hosted on a localhost or 127.0.0.1 URL - their developer console forbids these (current URL is: %s)."
2362
  msgstr ""
2363
 
2365
  msgid "%s authorisation failed:"
2366
  msgstr ""
2367
 
2368
+ #: src/addons/onedrive.php:797, src/addons/onedrive.php:983,
2369
+ #: src/addons/onedrive.php:987
2370
  msgid "OneDrive"
2371
  msgstr ""
2372
 
2373
+ #: src/addons/onedrive.php:626
2374
  msgid "Please re-authorize the connection to your %s account."
2375
  msgstr ""
2376
 
2378
  msgid "configure it here"
2379
  msgstr ""
2380
 
2381
+ #: src/addons/onedrive.php:619, src/methods/updraftvault.php:643
2382
  msgid "To remove the block, please go here."
2383
  msgstr ""
2384
 
2523
  msgid "If you have an AWS admin user, then you can use this wizard to quickly create a new AWS (IAM) user with access to only this bucket (rather than your whole account)"
2524
  msgstr ""
2525
 
2526
+ #: src/methods/s3.php:875, src/methods/s3.php:972
2527
  msgid "To create a new IAM sub-user and access key that has access only to this bucket, use this add-on."
2528
  msgstr ""
2529
 
2535
  msgid "UpdraftPlus news, high-quality training materials for WordPress developers and site-owners, and general WordPress news. You can de-subscribe at any time."
2536
  msgstr ""
2537
 
2538
+ #: src/addons/onedrive.php:596, src/addons/onedrive.php:619,
2539
+ #: src/methods/updraftvault.php:643, src/udaddons/updraftplus-addons.php:872,
2540
+ #: src/udaddons/updraftplus-addons.php:886
2541
  msgid "This most likely means that you share a webserver with a hacked website that has been used in previous attacks."
2542
  msgstr ""
2543
 
2544
+ #: src/addons/onedrive.php:619, src/methods/updraftvault.php:643,
2545
+ #: src/udaddons/updraftplus-addons.php:886
2546
  msgid "It appears that your web server's IP Address (%s) is blocked."
2547
  msgstr ""
2548
 
2549
+ #: src/addons/onedrive.php:619, src/methods/updraftvault.php:643,
2550
+ #: src/udaddons/updraftplus-addons.php:886
2551
  msgid "UpdraftPlus.com has responded with 'Access Denied'."
2552
  msgstr ""
2553
 
2598
  msgid "(at same time as files backup)"
2599
  msgstr ""
2600
 
2601
+ #: src/admin.php:3254
2602
  msgid "No backup has been completed"
2603
  msgstr ""
2604
 
2657
  msgid "or"
2658
  msgstr ""
2659
 
2660
+ #: src/admin.php:701
2661
  msgid "You did not select any components to restore. Please select at least one, and then try again."
2662
  msgstr ""
2663
 
2664
+ #: src/addons/sftp.php:436
2665
  msgctxt "Do not translate BEGIN RSA PRIVATE KEY. PCKS1, XML, PEM and PuTTY are also technical acronyms which should not be translated."
2666
  msgid "PKCS1 (PEM header: BEGIN RSA PRIVATE KEY), XML and PuTTY format keys are accepted."
2667
  msgstr ""
2668
 
2669
+ #: src/addons/sftp.php:399
2670
  msgid "Resuming partial uploads is supported for SFTP, but not for SCP. Thus, if using SCP then you will need to ensure that your webserver allows PHP processes to run long enough to upload your largest backup file."
2671
  msgstr ""
2672
 
2675
  msgid "tenant"
2676
  msgstr ""
2677
 
2678
+ #: src/methods/openstack2.php:132
2679
  msgctxt "Keystone and swauth are technical terms which cannot be translated"
2680
  msgid "This needs to be a v2 (Keystone) authentication URI; v1 (Swauth) is not supported."
2681
  msgstr ""
2688
  msgid "Check this box to have a basic report sent to"
2689
  msgstr ""
2690
 
2691
+ #: src/admin.php:3268
2692
  msgctxt "i.e. Non-automatic"
2693
  msgid "Manual"
2694
  msgstr ""
2695
 
2696
+ #: src/restorer.php:2189
2697
  msgctxt "The user is being told the number of times an error has happened, e.g. An error (27) occurred"
2698
  msgid "An error (%s) occurred:"
2699
  msgstr ""
2706
  msgid "Any other file/directory on your server that you wish to back up"
2707
  msgstr ""
2708
 
2709
+ #: src/admin.php:2431
2710
  msgid "For even more features and personal support, check out "
2711
  msgstr ""
2712
 
2715
  msgstr ""
2716
 
2717
  #: src/addons/autobackup.php:143, src/addons/autobackup.php:1007,
2718
+ #: src/admin.php:706
2719
  msgid "Automatic backup before update"
2720
  msgstr ""
2721
 
2800
  msgid "Note that after you have claimed your add-ons, you can remove your password (but not the email address) from the settings below, without affecting this site's access to updates."
2801
  msgstr ""
2802
 
2803
+ #: src/admin.php:2797, src/admin.php:3814
2804
  msgid "View Log"
2805
  msgstr ""
2806
 
2817
  msgid "and retain this many scheduled backups"
2818
  msgstr ""
2819
 
2820
+ #: src/admin.php:3224
2821
  msgid "incremental backup; base backup: %s"
2822
  msgstr ""
2823
 
2829
  msgid "Upload files into UpdraftPlus."
2830
  msgstr ""
2831
 
2832
+ #: src/admin.php:945, src/includes/class-commands.php:390,
2833
  #: src/templates/wp-admin/settings/tab-status.php:22
2834
  msgid "The 'Backup Now' button is disabled as your backup directory is not writable (go to the 'Settings' tab and find the relevant option)."
2835
  msgstr ""
2836
 
2837
+ #: src/class-updraftplus.php:4447
2838
  msgid "Backup label:"
2839
  msgstr ""
2840
 
2841
+ #: src/addons/backblaze.php:189, src/admin.php:1941
2842
  msgid "Error: unexpected file read fail"
2843
  msgstr ""
2844
 
2845
+ #: src/backup.php:3284
2846
  msgid "check your log for more details."
2847
  msgstr ""
2848
 
2849
+ #: src/backup.php:3282
2850
  msgid "your web hosting account appears to be full; please see: %s"
2851
  msgstr ""
2852
 
2853
+ #: src/backup.php:3280
2854
  msgid "A zip error occurred"
2855
  msgstr ""
2856
 
2858
  msgid "Your label for this backup (optional)"
2859
  msgstr ""
2860
 
2861
+ #: src/addons/googlecloud.php:912, src/methods/googledrive.php:1096
2862
  msgid "%s does not allow authorisation of sites hosted on direct IP addresses. You will need to change your site's address (%s) before you can use %s for storage."
2863
  msgstr ""
2864
 
2865
+ #: src/methods/updraftvault.php:681, src/udaddons/updraftplus-addons.php:925
2866
  msgid "You entered an email address that was not recognised by UpdraftPlus.Com"
2867
  msgstr ""
2868
 
2869
+ #: src/methods/updraftvault.php:678, src/udaddons/updraftplus-addons.php:921
2870
  msgid "Your email address was valid, but your password was not recognised by UpdraftPlus.Com."
2871
  msgstr ""
2872
 
2873
+ #: src/methods/updraftvault.php:619, src/udaddons/updraftplus-addons.php:789
2874
  msgid "You need to supply both an email address and a password"
2875
  msgstr ""
2876
 
2878
  msgid "To proceed, press 'Backup Now'. Then, watch the 'Last Log Message' field for activity."
2879
  msgstr ""
2880
 
2881
+ #: src/class-updraftplus.php:4466
2882
  msgid "If you want to restore a multisite backup, you should first set up your WordPress installation as a multisite."
2883
  msgstr ""
2884
 
2885
+ #: src/class-updraftplus.php:4466
2886
  msgid "Your backup is of a WordPress multisite install; but this site is not. Only the first site of the network will be accessible."
2887
  msgstr ""
2888
 
2889
+ #: src/addons/migrator.php:1132
2890
  msgid "already done"
2891
  msgstr ""
2892
 
2893
+ #: src/addons/migrator.php:1089
2894
  msgid "skipped (not in list)"
2895
  msgstr ""
2896
 
2897
+ #: src/addons/migrator.php:1089, src/addons/migrator.php:1132,
2898
+ #: src/addons/migrator.php:1266
2899
  msgid "Search and replacing table:"
2900
  msgstr ""
2901
 
2902
+ #: src/addons/migrator.php:333
2903
  msgid "Enter a comma-separated list; otherwise, leave blank for all tables."
2904
  msgstr ""
2905
 
2906
+ #: src/addons/migrator.php:333
2907
  msgid "These tables only"
2908
  msgstr ""
2909
 
2910
+ #: src/addons/migrator.php:332
2911
  msgid "Rows per batch"
2912
  msgstr ""
2913
 
2919
  msgid "You need to connect to receive future updates to UpdraftPlus."
2920
  msgstr ""
2921
 
2922
+ #: src/class-updraftplus.php:4439
2923
  msgid "Any support requests to do with %s should be raised with your web hosting company."
2924
  msgstr ""
2925
 
2926
+ #: src/class-updraftplus.php:4439
2927
  msgid "You should only proceed if you cannot update the current server and are confident (or willing to risk) that your plugins/themes/etc. are compatible with the older %s version."
2928
  msgstr ""
2929
 
2930
+ #: src/class-updraftplus.php:4439
2931
  msgid "This is significantly newer than the server which you are now restoring onto (version %s)."
2932
  msgstr ""
2933
 
2934
+ #: src/class-updraftplus.php:4439
2935
  msgid "The site in this backup was running on a webserver with version %s of %s. "
2936
  msgstr ""
2937
 
2960
  msgid "UpdraftPlus is on social media - check us out!"
2961
  msgstr ""
2962
 
2963
+ #: src/admin.php:3881
2964
  msgid "Why am I seeing this?"
2965
  msgstr ""
2966
 
2972
  msgid "Press here to look inside your UpdraftPlus directory (in your web hosting space) for any new backup sets that you have uploaded."
2973
  msgstr ""
2974
 
2975
+ #: src/admin.php:1880, src/admin.php:1892
2976
  msgid "Start backup"
2977
  msgstr ""
2978
 
2979
+ #: src/class-updraftplus.php:4411, src/restorer.php:1015
2980
  msgid "You are using the %s webserver, but do not seem to have the %s module loaded."
2981
  msgstr ""
2982
 
2983
+ #: src/admin.php:3122
2984
  msgid "You will need to consult with your web hosting provider to find out how to set permissions for a WordPress plugin to write to the directory."
2985
  msgstr ""
2986
 
2988
  msgid "Unless you have a problem, you can completely ignore everything here."
2989
  msgstr ""
2990
 
2991
+ #: src/admin.php:2112
2992
  msgid "This file could not be uploaded"
2993
  msgstr ""
2994
 
2995
+ #: src/admin.php:2077
2996
  msgid "You will find more information about this in the Settings section."
2997
  msgstr ""
2998
 
3012
  msgid "Memory limit"
3013
  msgstr ""
3014
 
3015
+ #: src/class-updraftplus.php:4643, src/restorer.php:1499
3016
  msgid "restoration"
3017
  msgstr ""
3018
 
3019
+ #: src/backup.php:912
3020
  msgid "Incremental"
3021
  msgstr ""
3022
 
3023
+ #: src/backup.php:912
3024
  msgid "Full backup"
3025
  msgstr ""
3026
 
3036
  msgid "Backup succeeded"
3037
  msgstr ""
3038
 
3039
+ #: src/admin.php:3269, src/admin.php:3270, src/admin.php:3271,
3040
  #: src/updraftplus.php:99, src/updraftplus.php:100
3041
  msgid "Every %s hours"
3042
  msgstr ""
3043
 
3044
+ #: src/addons/migrator.php:796, src/addons/migrator.php:798
3045
  msgid "search and replace"
3046
  msgstr ""
3047
 
3048
+ #: src/addons/migrator.php:335
3049
  msgid "Go"
3050
  msgstr ""
3051
 
3052
+ #: src/addons/migrator.php:324
3053
  msgid "A search/replace cannot be undone - are you sure you want to do this?"
3054
  msgstr ""
3055
 
3056
+ #: src/addons/migrator.php:323
3057
  msgid "This can easily destroy your site; so, use it with care!"
3058
  msgstr ""
3059
 
3060
+ #: src/addons/migrator.php:293, src/addons/migrator.php:331
3061
  msgid "Replace with"
3062
  msgstr ""
3063
 
3064
+ #: src/addons/migrator.php:292, src/addons/migrator.php:330
3065
  msgid "Search for"
3066
  msgstr ""
3067
 
3068
+ #: src/addons/migrator.php:291, src/addons/migrator.php:322,
3069
  #: src/templates/wp-admin/advanced/search-replace.php:7,
3070
  #: src/templates/wp-admin/advanced/tools-menu.php:18
3071
  msgid "Search / replace database"
3072
  msgstr ""
3073
 
3074
+ #: src/addons/migrator.php:297
3075
  msgid "search term"
3076
  msgstr ""
3077
 
3078
+ #: src/restorer.php:2217
3079
  msgid "Too many database errors have occurred - aborting"
3080
  msgstr ""
3081
 
3082
+ #: src/backup.php:978
3083
  msgid "read more at %s"
3084
  msgstr ""
3085
 
3086
+ #: src/backup.php:978
3087
  msgid "Email reports created by UpdraftPlus (free edition) bring you the latest UpdraftPlus.com news"
3088
  msgstr ""
3089
 
3090
+ #: src/methods/googledrive.php:1103
3091
  msgid "N.B. If you install UpdraftPlus on several WordPress sites, then you cannot re-use your project; you must create a new one from your Google API console for each site."
3092
  msgstr ""
3093
 
3094
+ #: src/admin.php:3625
3095
  msgid "You have not yet made any backups."
3096
  msgstr ""
3097
 
3111
  msgid "Free disk space in account:"
3112
  msgstr ""
3113
 
3114
+ #: src/admin.php:4467, src/templates/wp-admin/settings/tab-status.php:27
3115
  msgid "This button is disabled because your backup directory is not writable (see the settings)."
3116
  msgstr ""
3117
 
3118
+ #: src/admin.php:534, src/admin.php:675, src/admin.php:1726,
3119
  #: src/includes/deprecated-actions.php:29,
3120
  #: src/templates/wp-admin/settings/downloading-and-restoring.php:21,
3121
  #: src/templates/wp-admin/settings/tab-bar.php:6
3122
  msgid "Existing Backups"
3123
  msgstr ""
3124
 
3125
+ #: src/admin.php:526, src/templates/wp-admin/settings/tab-bar.php:5
3126
  msgid "Current Status"
3127
  msgstr ""
3128
 
3129
+ #: src/admin.php:950
3130
  msgid "To change any of the default settings of what is backed up, to configure scheduled backups, to send your backups to remote storage (recommended), and more, go to the settings tab."
3131
  msgstr ""
3132
 
3133
+ #: src/admin.php:950
3134
  msgid "To make a backup, just press the Backup Now button."
3135
  msgstr ""
3136
 
3137
+ #: src/admin.php:950
3138
  msgid "Welcome to UpdraftPlus!"
3139
  msgstr ""
3140
 
3206
  msgid "user"
3207
  msgstr ""
3208
 
3209
+ #: src/class-updraftplus.php:1751
3210
  msgid "External database (%s)"
3211
  msgstr ""
3212
 
3213
+ #: src/methods/googledrive.php:1103
3214
  msgid "Follow this link to your Google API Console, and there activate the Drive API and create a Client ID in the API Access section."
3215
  msgstr ""
3216
 
3217
+ #: src/methods/googledrive.php:461
3218
  msgid "failed to access parent folder"
3219
  msgstr ""
3220
 
3221
+ #: src/addons/googlecloud.php:629, src/addons/onedrive.php:765,
3222
+ #: src/addons/onedrive.php:776, src/methods/googledrive.php:414
3223
  msgid "However, subsequent access attempts failed:"
3224
  msgstr ""
3225
 
3226
+ #: src/admin.php:3650
3227
  msgid "External database"
3228
  msgstr ""
3229
 
3255
  msgid "use UpdraftPlus Premium"
3256
  msgstr ""
3257
 
3258
+ #: src/class-updraftplus.php:4308
3259
  msgid "Decryption failed. The database file is encrypted."
3260
  msgstr ""
3261
 
3263
  msgid "Only the WordPress database can be restored; you will need to deal with the external database manually."
3264
  msgstr ""
3265
 
3266
+ #: src/restorer.php:1764, src/restorer.php:2158, src/restorer.php:2199,
3267
+ #: src/restorer.php:2212
3268
  msgid "An error occurred on the first %s command - aborting run"
3269
  msgstr ""
3270
 
3271
+ #: src/addons/moredatabase.php:105, src/backup.php:1478
3272
  msgid "Connection failed: check your access details, that the database server is up, and that the network connection is not firewalled."
3273
  msgstr ""
3274
 
3275
+ #: src/backup.php:1478
3276
  msgid "database connection attempt failed."
3277
  msgstr ""
3278
 
3279
+ #: src/addons/migrator.php:1020
3280
  msgid "Warning: the database's home URL (%s) is different to what we expected (%s)"
3281
  msgstr ""
3282
 
3283
+ #: src/addons/google-enhanced.php:68
3284
  msgid "In %s, path names are case sensitive."
3285
  msgstr ""
3286
 
3287
+ #: src/addons/azure.php:553, src/addons/google-enhanced.php:66,
3288
+ #: src/addons/onedrive.php:994
3289
  msgid "If you leave it blank, then the backup will be placed in the root of your %s"
3290
  msgstr ""
3291
 
3292
+ #: src/addons/google-enhanced.php:66, src/addons/googlecloud.php:947,
3293
+ #: src/addons/onedrive.php:994
3294
  msgid "e.g. %s"
3295
  msgstr ""
3296
 
3297
+ #: src/addons/google-enhanced.php:66, src/addons/onedrive.php:994
3298
  msgid "Enter the path of the %s folder you wish to use here."
3299
  msgstr ""
3300
 
3301
+ #: src/methods/openstack2.php:163
3302
  msgid "Container"
3303
  msgstr ""
3304
 
3305
+ #: src/methods/openstack2.php:146
3306
  msgid "Leave this blank, and a default will be chosen."
3307
  msgstr ""
3308
 
3309
+ #: src/methods/openstack2.php:137
3310
  msgid "Tenant"
3311
  msgstr ""
3312
 
3313
+ #: src/methods/openstack2.php:137
3314
  msgid "Follow this link for more information"
3315
  msgstr ""
3316
 
3317
+ #: src/methods/openstack2.php:129, src/methods/openstack2.php:188
3318
  msgid "authentication URI"
3319
  msgstr ""
3320
 
3321
+ #: src/methods/openstack2.php:124
3322
  msgid "Get your access credentials from your OpenStack Swift provider, and then pick a container name to use for storage. This container will be created for you if it does not already exist."
3323
  msgstr ""
3324
 
3338
  msgid "Failed to upload %s"
3339
  msgstr ""
3340
 
3341
+ #: src/methods/dropbox.php:636, src/methods/dropbox.php:638
3342
  msgid "Success:"
3343
  msgstr ""
3344
 
3345
+ #: src/addons/onedrive.php:1015, src/methods/dropbox.php:513
3346
  msgid "<strong>After</strong> you have saved your settings (by clicking 'Save Changes' below), then come back here once and click this link to complete authentication with %s."
3347
  msgstr ""
3348
 
3349
+ #: src/addons/onedrive.php:1007, src/methods/dropbox.php:501
3350
  msgid "(You appear to be already authenticated)."
3351
  msgstr ""
3352
 
3353
+ #: src/methods/dropbox.php:497, src/methods/dropbox.php:505,
3354
+ #: src/methods/dropbox.php:513
3355
  msgid "Dropbox"
3356
  msgstr ""
3357
 
3358
+ #: src/addons/onedrive.php:1000, src/methods/dropbox.php:497
3359
  msgid "Authenticate with %s"
3360
  msgstr ""
3361
 
3386
  msgid "%s error - failed to access the container"
3387
  msgstr ""
3388
 
3389
+ #: src/addons/googlecloud.php:1024, src/addons/onedrive.php:1039,
3390
+ #: src/methods/dropbox.php:562, src/methods/googledrive.php:1168
3391
  msgid "Account holder's name: %s."
3392
  msgstr ""
3393
 
3394
+ #: src/methods/googledrive.php:1146
3395
  msgid "To be able to set a custom folder name, use UpdraftPlus Premium."
3396
  msgstr ""
3397
 
3398
+ #: src/methods/googledrive.php:1133
3399
  msgid "It is an ID number internal to Google Drive"
3400
  msgstr ""
3401
 
3402
+ #: src/methods/googledrive.php:1133
3403
  msgid "<strong>This is NOT a folder name</strong>."
3404
  msgstr ""
3405
 
3406
+ #: src/addons/google-enhanced.php:64, src/addons/onedrive.php:992,
3407
+ #: src/methods/googledrive.php:1128, src/methods/googledrive.php:1139
3408
  msgid "Folder"
3409
  msgstr ""
3410
 
3411
+ #: src/addons/googlecloud.php:298, src/addons/onedrive.php:366,
3412
+ #: src/methods/googledrive.php:1052
3413
  msgid "%s download: failed: file not found"
3414
  msgstr ""
3415
 
3416
+ #: src/addons/googlecloud.php:649, src/methods/googledrive.php:434
3417
  msgid "Name: %s."
3418
  msgstr ""
3419
 
3420
+ #: src/methods/googledrive.php:190
3421
  msgid "Google Drive list files: failed to access parent folder"
3422
  msgstr ""
3423
 
3424
+ #: src/methods/addon-not-yet-present.php:99, src/methods/insufficient.php:121
3425
  msgid "Your %s version: %s."
3426
  msgstr ""
3427
 
3428
+ #: src/methods/addon-not-yet-present.php:98, src/methods/insufficient.php:120
3429
  msgid "You will need to ask your web hosting company to upgrade."
3430
  msgstr ""
3431
 
3442
  msgid "Fetch"
3443
  msgstr ""
3444
 
3445
+ #: src/addons/migrator.php:394,
3446
  #: src/templates/wp-admin/settings/downloading-and-restoring.php:61,
3447
  #: src/templates/wp-admin/settings/form-contents.php:210
3448
  msgid "This feature requires %s version %s or later"
3452
  msgid "Failed to unpack the archive"
3453
  msgstr ""
3454
 
3455
+ #: src/class-updraftplus.php:1283
3456
  msgid "Error - failed to download the file"
3457
  msgstr ""
3458
 
3460
  msgid "Rescan local folder for new backup sets"
3461
  msgstr ""
3462
 
3463
+ #: src/udaddons/updraftplus-addons.php:253
3464
  msgid "You should update UpdraftPlus to make sure that you have a version that has been tested for compatibility."
3465
  msgstr ""
3466
 
3467
+ #: src/udaddons/updraftplus-addons.php:253
3468
  msgid "It has been tested up to version %s."
3469
  msgstr ""
3470
 
3471
+ #: src/udaddons/updraftplus-addons.php:253
3472
  msgid "The installed version of UpdraftPlus Backup/Restore has not been tested on your version of WordPress (%s)."
3473
  msgstr ""
3474
 
3475
+ #: src/addons/sftp.php:497
3476
  msgid "password/key"
3477
  msgstr ""
3478
 
3479
+ #: src/addons/migrator.php:2276, src/addons/sftp.php:433, src/admin.php:722,
3480
+ #: src/admin.php:4688
3481
  msgid "Key"
3482
  msgstr ""
3483
 
3484
+ #: src/addons/sftp.php:428
3485
  msgid "Your login may be either password or key-based - you only need to enter one, not both."
3486
  msgstr ""
3487
 
3493
  msgid "SCP/SFTP password/key"
3494
  msgstr ""
3495
 
3496
+ #: src/admin.php:3694
3497
  msgid "Files backup (created by %s)"
3498
  msgstr ""
3499
 
3500
+ #: src/admin.php:3694
3501
  msgid "Files and database WordPress backup (created by %s)"
3502
  msgstr ""
3503
 
3504
+ #: src/addons/importer.php:276, src/admin.php:3688,
3505
  #: src/includes/class-backup-history.php:279
3506
  msgid "Backup created by: %s."
3507
  msgstr ""
3508
 
3509
+ #: src/admin.php:3648
3510
  msgid "Database (created by %s)"
3511
  msgstr ""
3512
 
3513
+ #: src/admin.php:3642, src/admin.php:3690
3514
  msgid "unknown source"
3515
  msgstr ""
3516
 
3522
  msgid "Upload backup files"
3523
  msgstr ""
3524
 
3525
+ #: src/admin.php:2158
3526
  msgid "This backup was created by %s, and can be imported."
3527
  msgstr ""
3528
 
3529
+ #: src/admin.php:979
3530
  msgid "Read this page for a guide to possible causes and how to fix it."
3531
  msgstr ""
3532
 
3533
+ #: src/admin.php:979
3534
  msgid "WordPress has a number (%d) of scheduled tasks which are overdue. Unless this is a development site, this probably means that the scheduler in your WordPress install is not working."
3535
  msgstr ""
3536
 
3537
+ #: src/admin.php:687, src/includes/class-backup-history.php:286
3538
  msgid "If this is a backup created by a different backup plugin, then UpdraftPlus Premium may be able to help you."
3539
  msgstr ""
3540
 
3541
+ #: src/admin.php:686
3542
  msgid "However, UpdraftPlus archives are standard zip/SQL files - so if you are sure that your file has the right format, then you can rename it to match that pattern."
3543
  msgstr ""
3544
 
3545
+ #: src/admin.php:686, src/admin.php:687,
3546
  #: src/includes/class-backup-history.php:286
3547
  msgid "This file does not appear to be an UpdraftPlus backup archive (such files are .zip or .gz files which have a name like: backup_(time)_(site name)_(code)_(type).(zip|gz))."
3548
  msgstr ""
3549
 
3550
+ #: src/admin.php:3691, src/includes/class-wpadmin-commands.php:152,
3551
+ #: src/restorer.php:1468
3552
  msgid "Backup created by unknown source (%s) - cannot be restored."
3553
  msgstr ""
3554
 
3560
  msgid "This version of UpdraftPlus does not know how to handle this type of foreign backup"
3561
  msgstr ""
3562
 
3563
+ #: src/methods/dropbox.php:309
3564
  msgid "%s returned an unexpected HTTP response: %s"
3565
  msgstr ""
3566
 
3567
+ #: src/addons/sftp.php:967
3568
  msgid "The UpdraftPlus module for this file access method (%s) does not support listing files"
3569
  msgstr ""
3570
 
3571
  #: src/addons/backblaze.php:515, src/methods/cloudfiles.php:246,
3572
+ #: src/methods/dropbox.php:290, src/methods/openstack-base.php:111
3573
  msgid "No settings were found"
3574
  msgstr ""
3575
 
3577
  msgid "One or more backups has been added from scanning remote storage; note that these backups will not be automatically deleted through the \"retain\" settings; if/when you wish to delete them then you must do so manually."
3578
  msgstr ""
3579
 
3580
+ #: src/admin.php:653
3581
  msgid "Rescanning remote and local storage for backup sets..."
3582
  msgstr ""
3583
 
3584
+ #: src/addons/googlecloud.php:950, src/addons/googlecloud.php:964,
3585
  #: src/addons/s3-enhanced.php:54, src/addons/s3-enhanced.php:67
3586
  msgid "(Read more)"
3587
  msgstr ""
3588
 
3589
+ #: src/addons/reporting.php:442
3590
  msgid "Log all messages to syslog (only server admins are likely to want this)"
3591
  msgstr ""
3592
 
3599
  msgid "Remove"
3600
  msgstr ""
3601
 
3602
+ #: src/methods/s3.php:847, src/methods/s3.php:960
3603
  msgid "Other %s FAQs."
3604
  msgstr ""
3605
 
3607
  msgid "Check this to receive more information and emails on the backup process - useful if something is going wrong."
3608
  msgstr ""
3609
 
3610
+ #: src/addons/morefiles.php:445, src/admin.php:3373
3611
  msgid "If entering multiple files/directories, then separate them with commas. For entities at the top level, you can use a * at the start or end of the entry as a wildcard."
3612
  msgstr ""
3613
 
3614
+ #: src/class-updraftplus.php:4643, src/methods/ftp.php:309,
3615
+ #: src/restorer.php:1499
3616
  msgid "Your hosting company must enable these functions before %s can work."
3617
  msgstr ""
3618
 
3619
+ #: src/class-updraftplus.php:4643, src/methods/ftp.php:309
3620
  msgid "Your web server's PHP installation has these functions disabled: %s."
3621
  msgstr ""
3622
 
3632
  msgid "regular non-encrypted FTP"
3633
  msgstr ""
3634
 
3635
+ #: src/restorer.php:1672
3636
  msgid "Backup created by:"
3637
  msgstr ""
3638
 
3639
+ #: src/udaddons/options.php:503
3640
  msgid "Available to claim on this site"
3641
  msgstr ""
3642
 
3643
+ #: src/udaddons/updraftplus-addons.php:274
3644
  msgid "To maintain your access to support, please renew."
3645
  msgstr ""
3646
 
3647
+ #: src/udaddons/updraftplus-addons.php:274
3648
  msgid "Your paid access to UpdraftPlus support will soon expire."
3649
  msgstr ""
3650
 
3651
+ #: src/udaddons/updraftplus-addons.php:272
3652
  msgid "To regain your access, please renew."
3653
  msgstr ""
3654
 
3655
+ #: src/udaddons/updraftplus-addons.php:272
3656
  msgid "Your paid access to UpdraftPlus support has expired."
3657
  msgstr ""
3658
 
3659
+ #: src/udaddons/updraftplus-addons.php:268
3660
  msgid "Your paid access to UpdraftPlus updates for this site will soon expire."
3661
  msgstr ""
3662
 
3663
+ #: src/udaddons/updraftplus-addons.php:266,
3664
+ #: src/udaddons/updraftplus-addons.php:268
3665
  msgid "To retain your access, and maintain access to updates (including future features and compatibility with future WordPress releases) and support, please renew."
3666
  msgstr ""
3667
 
3668
+ #: src/udaddons/updraftplus-addons.php:266
3669
  msgid "Your paid access to UpdraftPlus updates for %s of the %s add-ons on this site will soon expire."
3670
  msgstr ""
3671
 
3672
+ #: src/udaddons/updraftplus-addons.php:262
3673
  msgid "Your paid access to UpdraftPlus updates for %s add-ons on this site has expired."
3674
  msgstr ""
3675
 
3676
+ #: src/udaddons/updraftplus-addons.php:260,
3677
+ #: src/udaddons/updraftplus-addons.php:262
3678
  msgid "To regain access to updates (including future features and compatibility with future WordPress releases) and support, please renew."
3679
  msgstr ""
3680
 
3681
+ #: src/udaddons/updraftplus-addons.php:260
3682
  msgid "Your paid access to UpdraftPlus updates for this site has expired. You will no longer receive updates to UpdraftPlus."
3683
  msgstr ""
3684
 
3685
+ #: src/udaddons/updraftplus-addons.php:225
3686
  msgid "Dismiss from main dashboard (for %s weeks)"
3687
  msgstr ""
3688
 
3689
+ #: src/class-updraftplus.php:4693
3690
  msgid "The attempt to undo the double-compression succeeded."
3691
  msgstr ""
3692
 
3693
+ #: src/class-updraftplus.php:4670, src/class-updraftplus.php:4691
3694
  msgid "The attempt to undo the double-compression failed."
3695
  msgstr ""
3696
 
3697
+ #: src/class-updraftplus.php:4663
3698
  msgid "The database file appears to have been compressed twice - probably the website you downloaded it from had a mis-configured webserver."
3699
  msgstr ""
3700
 
3702
  msgid "Constants"
3703
  msgstr ""
3704
 
3705
+ #: src/backup.php:1715
3706
  msgid "Failed to open database file for reading:"
3707
  msgstr ""
3708
 
3709
+ #: src/backup.php:1526
3710
  msgid "No database tables found"
3711
  msgstr ""
3712
 
3713
+ #: src/backup.php:1524
3714
  msgid "please wait for the rescheduled attempt"
3715
  msgstr ""
3716
 
3717
+ #: src/addons/reporting.php:217
3718
  msgid "Note that warning messages are advisory - the backup process does not stop for them. Instead, they provide information that you might find useful, or that may indicate the source of a problem if the backup did not succeed."
3719
  msgstr ""
3720
 
3721
+ #: src/addons/onedrive.php:91, src/methods/dropbox.php:199
3722
  msgid "Account full: your %s account has only %d bytes left, but the file to be uploaded has %d bytes remaining (total size: %d bytes)"
3723
  msgstr ""
3724
 
3725
+ #: src/udaddons/updraftplus-addons.php:459,
3726
+ #: src/udaddons/updraftplus-addons.php:495
3727
  msgid "Errors occurred:"
3728
  msgstr ""
3729
 
3730
+ #: src/admin.php:3900
3731
  msgid "Follow this link to download the log file for this restoration (needed for any support requests)."
3732
  msgstr ""
3733
 
3751
  msgid "Existing unremoved folders from a previous restore exist (please use the \"Delete Old Directories\" button to delete them before trying again): %s"
3752
  msgstr ""
3753
 
3754
+ #: src/admin.php:954, src/class-updraftplus.php:801
3755
  msgid "The amount of time allowed for WordPress plugins to run is very low (%s seconds) - you should increase it to avoid backup failures due to time-outs (consult your web hosting company for more help - it is the max_execution_time PHP setting; the recommended value is %s seconds or more)"
3756
  msgstr ""
3757
 
3758
+ #: src/addons/migrator.php:264
3759
  msgid "Disabled this plugin: %s: re-activate it manually when you are ready."
3760
  msgstr ""
3761
 
3762
+ #: src/addons/sftp.php:722, src/addons/sftp.php:725,
3763
  #: src/includes/ftp.class.php:58, src/includes/ftp.class.php:61
3764
  msgid "The %s connection timed out; if you entered the server correctly, then this is usually caused by a firewall blocking the connection - you should check with your web hosting company."
3765
  msgstr ""
3766
 
3767
+ #: src/addons/moredatabase.php:137, src/admin.php:1470
3768
  msgid "Messages:"
3769
  msgstr ""
3770
 
3771
+ #: src/restorer.php:2052
3772
  msgid "An SQL line that is larger than the maximum packet size and cannot be split was found; this line will not be processed, but will be dropped: %s"
3773
  msgstr ""
3774
 
3861
  msgid "Rackspace Cloud Files, enhanced"
3862
  msgstr ""
3863
 
3864
+ #: src/addons/cloudfiles-enhanced.php:278, src/methods/cloudfiles-new.php:142,
3865
+ #: src/methods/cloudfiles.php:504
3866
  msgid "Cloud Files Container"
3867
  msgstr ""
3868
 
3869
+ #: src/methods/cloudfiles-new.php:137, src/methods/cloudfiles.php:499
3870
  msgid "Cloud Files API Key"
3871
  msgstr ""
3872
 
3873
+ #: src/methods/cloudfiles-new.php:132
3874
  msgid "To create a new Rackspace API sub-user and API key that has access only to this Rackspace container, use this add-on."
3875
  msgstr ""
3876
 
3877
+ #: src/methods/cloudfiles-new.php:129
3878
  msgid "Cloud Files Username"
3879
  msgstr ""
3880
 
3881
+ #: src/addons/cloudfiles-enhanced.php:47, src/methods/cloudfiles-new.php:124,
3882
+ #: src/methods/cloudfiles-new.php:169
3883
  msgid "London (LON)"
3884
  msgstr ""
3885
 
3886
+ #: src/addons/cloudfiles-enhanced.php:46, src/methods/cloudfiles-new.php:123,
3887
+ #: src/methods/cloudfiles-new.php:168
3888
  msgid "Hong Kong (HKG)"
3889
  msgstr ""
3890
 
3891
+ #: src/addons/cloudfiles-enhanced.php:45, src/methods/cloudfiles-new.php:122,
3892
+ #: src/methods/cloudfiles-new.php:167
3893
  msgid "Northern Virginia (IAD)"
3894
  msgstr ""
3895
 
3896
+ #: src/addons/cloudfiles-enhanced.php:44, src/methods/cloudfiles-new.php:121,
3897
+ #: src/methods/cloudfiles-new.php:166
3898
  msgid "Chicago (ORD)"
3899
  msgstr ""
3900
 
3901
+ #: src/addons/cloudfiles-enhanced.php:43, src/methods/cloudfiles-new.php:120,
3902
+ #: src/methods/cloudfiles-new.php:165
3903
  msgid "Sydney (SYD)"
3904
  msgstr ""
3905
 
3906
+ #: src/addons/cloudfiles-enhanced.php:42, src/methods/cloudfiles-new.php:119,
3907
+ #: src/methods/cloudfiles-new.php:164
3908
  msgid "Dallas (DFW) (default)"
3909
  msgstr ""
3910
 
3911
+ #: src/addons/cloudfiles-enhanced.php:274, src/methods/cloudfiles-new.php:116
3912
  msgid "Cloud Files Storage Region"
3913
  msgstr ""
3914
 
3915
+ #: src/methods/cloudfiles-new.php:109
3916
  msgid "Accounts created at rackspacecloud.com are US-accounts; accounts created at rackspace.co.uk are UK-based"
3917
  msgstr ""
3918
 
3919
+ #: src/methods/cloudfiles-new.php:107
3920
  msgid "US or UK-based Rackspace Account"
3921
  msgstr ""
3922
 
3923
+ #: src/addons/cloudfiles-enhanced.php:258, src/methods/cloudfiles-new.php:107
3924
  msgid "Accounts created at rackspacecloud.com are US accounts; accounts created at rackspace.co.uk are UK accounts."
3925
  msgstr ""
3926
 
3931
  msgid "Authorisation failed (check your credentials)"
3932
  msgstr ""
3933
 
3934
+ #: src/methods/updraftvault.php:593, src/udaddons/options.php:270
3935
  msgid "An unknown error occurred when trying to connect to UpdraftPlus.Com"
3936
  msgstr ""
3937
 
3938
+ #: src/admin.php:700, src/central/bootstrap.php:547
3939
  msgid "Create"
3940
  msgstr ""
3941
 
3942
+ #: src/admin.php:662
3943
  msgid "Trying..."
3944
  msgstr ""
3945
 
3946
+ #: src/admin.php:661
3947
  msgid "The new user's RackSpace console password is (this will not be shown again):"
3948
  msgstr ""
3949
 
3950
+ #: src/admin.php:672, src/admin.php:4180
3951
  msgid "Error data:"
3952
  msgstr ""
3953
 
3954
+ #: src/admin.php:3852
3955
  msgid "Backup does not exist in the backup history"
3956
  msgstr ""
3957
 
3958
+ #: src/admin.php:2732
3959
  msgid "Your WordPress install has old directories from its state before you restored/migrated (technical information: these are suffixed with -old). You should press this button to delete them as soon as you have verified that the restoration worked."
3960
  msgstr ""
3961
 
3962
+ #: src/restorer.php:1739
3963
  msgid "Split line to avoid exceeding maximum packet size"
3964
  msgstr ""
3965
 
3966
+ #: src/restorer.php:1619
3967
  msgid "Your database user does not have permission to drop tables. We will attempt to restore by simply emptying the tables; this should work as long as you are restoring from a WordPress version with the same database structure (%s)"
3968
  msgstr ""
3969
 
3983
  msgid "Moving old data out of the way..."
3984
  msgstr ""
3985
 
3986
+ #: src/addons/reporting.php:433
3987
  msgid "Add another address..."
3988
  msgstr ""
3989
 
3990
+ #: src/addons/reporting.php:419
3991
  msgid "Enter addresses here to have a report sent to them when a backup job finishes."
3992
  msgstr ""
3993
 
3994
+ #: src/addons/reporting.php:394
3995
  msgid "Email reports"
3996
  msgstr ""
3997
 
3998
+ #: src/class-updraftplus.php:1759, src/class-updraftplus.php:1764
3999
  msgid "%s checksum: %s"
4000
  msgstr ""
4001
 
4002
+ #: src/class-updraftplus.php:1732, src/class-updraftplus.php:1734
4003
  msgid "files: %s"
4004
  msgstr ""
4005
 
4006
+ #: src/addons/reporting.php:358
4007
  msgid "Use the \"Reporting\" section to configure the email addresses to be used."
4008
  msgstr ""
4009
 
4010
+ #: src/addons/reporting.php:267
4011
  msgid "Debugging information"
4012
  msgstr ""
4013
 
4014
+ #: src/addons/reporting.php:222, src/admin.php:3581
4015
  msgid "Uploaded to:"
4016
  msgstr ""
4017
 
4018
+ #: src/addons/reporting.php:221
4019
  msgid "Time taken:"
4020
  msgstr ""
4021
 
4022
+ #: src/addons/reporting.php:212
4023
  msgid "Warnings"
4024
  msgstr ""
4025
 
4026
+ #: src/addons/reporting.php:197
4027
  msgid "Errors"
4028
  msgstr ""
4029
 
4030
+ #: src/addons/reporting.php:194
4031
  msgid "Errors / warnings:"
4032
  msgstr ""
4033
 
4034
  #: src/addons/morefiles.php:119, src/addons/morefiles.php:120,
4035
+ #: src/addons/reporting.php:183
4036
  msgid "Contains:"
4037
  msgstr ""
4038
 
4039
+ #: src/addons/reporting.php:182
4040
  msgid "Backup began:"
4041
  msgstr ""
4042
 
4043
+ #: src/addons/reporting.php:170
4044
  msgid "Backup Report"
4045
  msgstr ""
4046
 
4047
+ #: src/addons/reporting.php:165
4048
  msgid "%d hours, %d minutes, %d seconds"
4049
  msgstr ""
4050
 
4051
+ #: src/addons/reporting.php:151
4052
  msgid "%d errors, %d warnings"
4053
  msgstr ""
4054
 
4055
+ #: src/addons/onedrive.php:721, src/methods/dropbox.php:620
4056
  msgid "%s authentication"
4057
  msgstr ""
4058
 
4059
+ #: src/addons/onedrive.php:721, src/class-updraftplus.php:486,
4060
+ #: src/methods/dropbox.php:172, src/methods/dropbox.php:589,
4061
+ #: src/methods/dropbox.php:620, src/methods/dropbox.php:633,
4062
+ #: src/methods/dropbox.php:774
4063
  msgid "%s error: %s"
4064
  msgstr ""
4065
 
4066
+ #: src/addons/googlecloud.php:905, src/methods/dropbox.php:474
4067
  msgid "%s logo"
4068
  msgstr ""
4069
 
4070
+ #: src/methods/dropbox.php:218
4071
  msgid "%s did not return the expected response - check your log file for more details"
4072
  msgstr ""
4073
 
4083
  msgid "Your site's admin email address (%s) will be used."
4084
  msgstr ""
4085
 
4086
+ #: src/admin.php:709, src/methods/updraftvault.php:296,
4087
+ #: src/methods/updraftvault.php:339, src/udaddons/options.php:249
4088
  msgid "Connect"
4089
  msgstr ""
4090
 
4092
  msgid "For more reporting features, use the Reporting add-on."
4093
  msgstr ""
4094
 
4095
+ #: src/class-updraftplus.php:4383
4096
  msgid "(version: %s)"
4097
  msgstr ""
4098
 
4099
+ #: src/addons/reporting.php:466, src/addons/reporting.php:466,
4100
+ #: src/admin.php:651
4101
  msgid "Be aware that mail servers tend to have size limits; typically around %s Mb; backups larger than any limits will likely not arrive."
4102
  msgstr ""
4103
 
4104
+ #: src/addons/reporting.php:466, src/admin.php:650
4105
  msgid "When the Email storage method is enabled, also send the entire backup"
4106
  msgstr ""
4107
 
4108
+ #: src/addons/reporting.php:181, src/backup.php:1013
4109
  msgid "Latest status:"
4110
  msgstr ""
4111
 
4112
+ #: src/backup.php:1012
4113
  msgid "Backup contains:"
4114
  msgstr ""
4115
 
4116
+ #: src/backup.php:969
4117
  msgid "Backed up: %s"
4118
  msgstr ""
4119
 
4120
+ #: src/addons/reporting.php:264, src/backup.php:963
4121
  msgid "The log file has been attached to this email."
4122
  msgstr ""
4123
 
4124
+ #: src/backup.php:927
4125
  msgid "Unknown/unexpected error - please raise a support request"
4126
  msgstr ""
4127
 
4128
+ #: src/backup.php:924
4129
  msgid "Database only (files were not part of this particular schedule)"
4130
  msgstr ""
4131
 
4132
+ #: src/backup.php:924
4133
  msgid "Database (files backup has not completed)"
4134
  msgstr ""
4135
 
4136
+ #: src/backup.php:921
4137
  msgid "Files only (database was not part of this particular schedule)"
4138
  msgstr ""
4139
 
4140
+ #: src/backup.php:921
4141
  msgid "Files (database backup has not completed)"
4142
  msgstr ""
4143
 
4144
+ #: src/admin.php:305, src/backup.php:919
4145
  msgid "Files and database"
4146
  msgstr ""
4147
 
4165
  msgid "UpdraftPlus warning:"
4166
  msgstr ""
4167
 
4168
+ #: src/udaddons/options.php:509
4169
  msgid "(or connect using the form on this page if you have already purchased it)"
4170
  msgstr ""
4171
 
4172
+ #: src/udaddons/options.php:495
4173
  msgid "please follow this link to update the plugin in order to activate it"
4174
  msgstr ""
4175
 
4176
+ #: src/udaddons/options.php:492
4177
  msgid "please follow this link to update the plugin in order to get it"
4178
  msgstr ""
4179
 
4180
+ #: src/udaddons/options.php:482, src/udaddons/options.php:484
4181
  msgid "latest"
4182
  msgstr ""
4183
 
4184
+ #: src/udaddons/options.php:480
4185
  msgid "Your version: %s"
4186
  msgstr ""
4187
 
4188
+ #: src/udaddons/options.php:478, src/udaddons/options.php:478
4189
  msgid "You've got it"
4190
  msgstr ""
4191
 
4192
+ #: src/udaddons/options.php:439
4193
  msgid "UpdraftPlus Support"
4194
  msgstr ""
4195
 
4196
+ #: src/udaddons/options.php:397
4197
  msgid "An update containing your addons is available for UpdraftPlus - please follow this link to get it."
4198
  msgstr ""
4199
 
4200
+ #: src/udaddons/options.php:386, src/udaddons/updraftplus-addons.php:301
4201
  msgid "UpdraftPlus Addons"
4202
  msgstr ""
4203
 
4205
  msgid "An update is available for UpdraftPlus - please follow this link to get it."
4206
  msgstr ""
4207
 
4208
+ #: src/methods/updraftvault.php:672, src/methods/updraftvault.php:687,
4209
+ #: src/udaddons/updraftplus-addons.php:932
4210
  msgid "UpdraftPlus.Com returned a response, but we could not understand it"
4211
  msgstr ""
4212
 
4213
+ #: src/methods/updraftvault.php:684, src/udaddons/updraftplus-addons.php:928
4214
  msgid "Your email address and password were not recognised by UpdraftPlus.Com"
4215
  msgstr ""
4216
 
4217
+ #: src/methods/updraftvault.php:645, src/udaddons/updraftplus-addons.php:891
4218
  msgid "UpdraftPlus.Com returned a response which we could not understand (data: %s)"
4219
  msgstr ""
4220
 
4221
+ #: src/udaddons/updraftplus-addons.php:816
4222
  msgid "UpdraftPlus.Com responded, but we did not understand the response"
4223
  msgstr ""
4224
 
4225
+ #: src/udaddons/updraftplus-addons.php:814
4226
  msgid "We failed to successfully connect to UpdraftPlus.Com"
4227
  msgstr ""
4228
 
4233
  msgid "Reporting"
4234
  msgstr ""
4235
 
4236
+ #: src/admin.php:4685
4237
  msgid "Options (raw)"
4238
  msgstr ""
4239
 
4240
+ #: src/addons/reporting.php:464, src/admin.php:649
4241
  msgid "Send a report only when there are warnings/errors"
4242
  msgstr ""
4243
 
4244
+ #: src/restorer.php:1683
4245
  msgid "Content URL:"
4246
  msgstr ""
4247
 
4253
  msgid "See also the \"More Files\" add-on from our shop."
4254
  msgstr ""
4255
 
4256
+ #: src/backup.php:3271, src/class-updraftplus.php:814
4257
  msgid "Your free space in your hosting account is very low - only %s Mb remain"
4258
  msgstr ""
4259
 
4260
+ #: src/class-updraftplus.php:798
4261
  msgid "The amount of memory (RAM) allowed for PHP is very low (%s Mb) - you should increase it to avoid failures due to insufficient memory (consult your web hosting company for more help)"
4262
  msgstr ""
4263
 
4264
+ #: src/udaddons/options.php:574
4265
  msgid "Manage Addons"
4266
  msgstr ""
4267
 
4268
+ #: src/udaddons/options.php:510, src/udaddons/options.php:510
4269
  msgid "Buy It"
4270
  msgstr ""
4271
 
4272
+ #: src/udaddons/options.php:509
4273
  msgid "Get it from the UpdraftPlus.Com Store"
4274
  msgstr ""
4275
 
4276
+ #: src/udaddons/options.php:503, src/udaddons/options.php:505
4277
  msgid "activate it on this site"
4278
  msgstr ""
4279
 
4280
+ #: src/udaddons/options.php:505
4281
  msgid "You have an inactive purchase"
4282
  msgstr ""
4283
 
4284
+ #: src/udaddons/options.php:495
4285
  msgid "Assigned to this site"
4286
  msgstr ""
4287
 
4288
+ #: src/udaddons/options.php:492
4289
  msgid "Available for this site (via your all-addons purchase)"
4290
  msgstr ""
4291
 
4292
+ #: src/udaddons/options.php:486
4293
  msgid "(apparently a pre-release or withdrawn release)"
4294
  msgstr ""
4295
 
4296
+ #: src/udaddons/options.php:441
4297
  msgid "Go here"
4298
  msgstr ""
4299
 
4300
+ #: src/udaddons/options.php:441
4301
  msgid "Need to get support?"
4302
  msgstr ""
4303
 
4304
+ #: src/udaddons/options.php:423
4305
  msgid "An error occurred when trying to retrieve your add-ons."
4306
  msgstr ""
4307
 
4308
+ #: src/udaddons/options.php:337
4309
  msgid "An unknown response was received. Response was:"
4310
  msgstr ""
4311
 
4312
+ #: src/udaddons/options.php:336
4313
  msgid "Claim not granted - your account login details were wrong"
4314
  msgstr ""
4315
 
4316
+ #: src/udaddons/options.php:334
4317
  msgid "Please wait whilst we make the claim..."
4318
  msgstr ""
4319
 
4385
  msgid "Your web-server does not have the %s module installed."
4386
  msgstr ""
4387
 
4388
+ #: src/addons/googlecloud.php:992, src/methods/googledrive.php:1158
4389
  msgid "<strong>(You appear to be already authenticated,</strong> though you can authenticate again to refresh your access if you've had a problem)."
4390
  msgstr ""
4391
 
4393
  msgid "Drop backup files here"
4394
  msgstr ""
4395
 
4396
+ #: src/admin.php:660
 
 
 
 
4397
  msgid "The web server returned an error code (try again, or check your web server logs)"
4398
  msgstr ""
4399
 
4400
+ #: src/admin.php:658
4401
  msgid "The restore operation has begun. Do not press stop or close your browser until it reports itself as having finished."
4402
  msgstr ""
4403
 
4404
+ #: src/admin.php:655
4405
  msgid "If you exclude both the database and the files, then you have excluded everything!"
4406
  msgstr ""
4407
 
4408
+ #: src/restorer.php:1677
4409
  msgid "Site home:"
4410
  msgstr ""
4411
 
4430
  msgid "You can send a backup to more than one destination with an add-on."
4431
  msgstr ""
4432
 
4433
+ #: src/admin.php:2955
4434
  msgid "Note: the progress bar below is based on stages, NOT time. Do not stop the backup simply because it seems to have remained in the same place for a while - that is normal."
4435
  msgstr ""
4436
 
4437
+ #: src/admin.php:2854
4438
  msgid "(%s%%, file %s of %s)"
4439
  msgstr ""
4440
 
4443
  msgid "Read more about how this works..."
4444
  msgstr ""
4445
 
4446
+ #: src/addons/sftp.php:559
4447
  msgid "Failed: We were able to log in, but failed to successfully create a file in that location."
4448
  msgstr ""
4449
 
4450
+ #: src/addons/sftp.php:557
4451
  msgid "Failed: We were able to log in and move to the indicated directory, but failed to successfully create a file in that location."
4452
  msgstr ""
4453
 
4454
+ #: src/addons/sftp.php:459
4455
  msgid "Use SCP instead of SFTP"
4456
  msgstr ""
4457
 
4471
  msgid "Backup is of: %s."
4472
  msgstr ""
4473
 
4474
+ #: src/admin.php:748
4475
  msgid "%s settings test result:"
4476
  msgstr ""
4477
 
4478
+ #: src/admin.php:3756, src/admin.php:3758
4479
  msgid "(Not finished)"
4480
  msgstr ""
4481
 
4482
+ #: src/admin.php:3758
4483
  msgid "If you are seeing more backups than you expect, then it is probably because the deletion of old backup sets does not happen until a fresh backup completes."
4484
  msgstr ""
4485
 
4491
  msgid "This is where UpdraftPlus will write the zip files it creates initially. This directory must be writable by your web server. It is relative to your content directory (which by default is called wp-content)."
4492
  msgstr ""
4493
 
4494
+ #: src/admin.php:2950
4495
  msgid "Job ID: %s"
4496
  msgstr ""
4497
 
4498
+ #: src/admin.php:2935
4499
  msgid "last activity: %ss ago"
4500
  msgstr ""
4501
 
4502
+ #: src/admin.php:2934
4503
  msgid "next resumption: %d (after %ss)"
4504
  msgstr ""
4505
 
4506
+ #: src/admin.php:2917, src/central/bootstrap.php:429,
4507
+ #: src/central/bootstrap.php:436, src/methods/updraftvault.php:387,
4508
+ #: src/methods/updraftvault.php:407, src/methods/updraftvault.php:492
4509
  msgid "Unknown"
4510
  msgstr ""
4511
 
4512
+ #: src/admin.php:2868
4513
  msgid "Backup finished"
4514
  msgstr ""
4515
 
4516
+ #: src/admin.php:2863
4517
  msgid "Waiting until scheduled time to retry because of errors"
4518
  msgstr ""
4519
 
4520
+ #: src/admin.php:2859
4521
  msgid "Pruning old backup sets"
4522
  msgstr ""
4523
 
4524
+ #: src/admin.php:2847
4525
  msgid "Uploading files to remote storage"
4526
  msgstr ""
4527
 
4528
+ #: src/admin.php:2915
4529
  msgid "Encrypted database"
4530
  msgstr ""
4531
 
4532
+ #: src/admin.php:2907
4533
  msgid "Encrypting database"
4534
  msgstr ""
4535
 
4536
+ #: src/admin.php:2881
4537
  msgid "Created database backup"
4538
  msgstr ""
4539
 
4540
+ #: src/admin.php:2894
4541
  msgid "table: %s"
4542
  msgstr ""
4543
 
4544
+ #: src/admin.php:2892
4545
  msgid "Creating database backup"
4546
  msgstr ""
4547
 
4548
+ #: src/admin.php:2842
4549
  msgid "Created file backup zips"
4550
  msgstr ""
4551
 
4552
+ #: src/admin.php:2829
4553
  msgid "Creating file backup zips"
4554
  msgstr ""
4555
 
4556
+ #: src/admin.php:2824
4557
  msgid "Backup begun"
4558
  msgstr ""
4559
 
4560
+ #: src/admin.php:2657
4561
  msgid "Backups in progress:"
4562
  msgstr ""
4563
 
4564
+ #: src/admin.php:958
4565
  msgid "The scheduler is disabled in your WordPress install, via the DISABLE_WP_CRON setting. No backups can run (even &quot;Backup Now&quot;) unless either you have set up a facility to call the scheduler manually, or until it is enabled."
4566
  msgstr ""
4567
 
4577
  msgid "UpdraftPlus needed to create a %s in your content directory, but failed - please check your file permissions and enable the access (%s)"
4578
  msgstr ""
4579
 
4580
+ #: src/class-updraftplus.php:2852
4581
  msgid "The backup has not finished; a resumption is scheduled"
4582
  msgstr ""
4583
 
4584
+ #: src/class-updraftplus.php:2036
4585
  msgid "Your website is visited infrequently and UpdraftPlus is not getting the resources it hoped for; please read this page:"
4586
  msgstr ""
4587
 
4588
  #: src/addons/onedrive.php:865,
 
4589
  #: src/includes/Dropbox2/OAuth/Consumer/ConsumerAbstract.php:118
4590
  msgid "The %s authentication could not go ahead, because something else on your site is breaking it. Try disabling your other plugins and switching to a default theme. (Specifically, you are looking for the component that sends output (most likely PHP warnings/errors) before the page begins. Turning off any debugging settings may also help)."
4591
  msgstr ""
4592
 
4593
+ #: src/admin.php:2458
4594
  msgid "Your PHP memory limit (set by your web hosting company) is very low. UpdraftPlus attempted to raise it but was unsuccessful. This plugin may struggle with a memory limit of less than 64 Mb - especially if you have very large files uploaded (though on the other hand, many sites will be successful with a 32Mb limit - your experience may vary)."
4595
  msgstr ""
4596
 
4597
+ #: src/addons/autobackup.php:1085, src/admin.php:702
4598
  msgid "Proceed with update"
4599
  msgstr ""
4600
 
4669
  msgid "Support"
4670
  msgstr ""
4671
 
4672
+ #: src/class-updraftplus.php:4584
4673
  msgid "UpdraftPlus was unable to find the table prefix when scanning the database backup."
4674
  msgstr ""
4675
 
4676
+ #: src/class-updraftplus.php:4576
4677
  msgid "This database backup is missing core WordPress tables: %s"
4678
  msgstr ""
4679
 
4680
+ #: src/class-updraftplus.php:4432
4681
  msgid "You are importing from a newer version of WordPress (%s) into an older one (%s). There are no guarantees that WordPress can handle this."
4682
  msgstr ""
4683
 
4684
+ #: src/class-updraftplus.php:4431, src/class-updraftplus.php:4438
4685
  msgid "%s version: %s"
4686
  msgstr ""
4687
 
4688
+ #: src/class-updraftplus.php:4325
4689
  msgid "The database is too small to be a valid WordPress database (size: %s Kb)."
4690
  msgstr ""
4691
 
4692
+ #: src/addons/autobackup.php:1053, src/admin.php:793,
4693
  #: src/includes/updraftplus-notices.php:171
4694
  msgid "Be safe with an automatic backup"
4695
  msgstr ""
4696
 
4697
+ #: src/admin.php:2411
4698
  msgid "If you can still read these words after the page finishes loading, then there is a JavaScript or jQuery problem in the site."
4699
  msgstr ""
4700
 
4701
+ #: src/admin.php:696
4702
  msgid "The file was uploaded."
4703
  msgstr ""
4704
 
4705
+ #: src/admin.php:695
4706
  msgid "Unknown server response status:"
4707
  msgstr ""
4708
 
4709
+ #: src/admin.php:694
4710
  msgid "Unknown server response:"
4711
  msgstr ""
4712
 
4713
+ #: src/admin.php:693
4714
  msgid "This decryption key will be attempted:"
4715
  msgstr ""
4716
 
4717
+ #: src/admin.php:692
4718
  msgid "Follow this link to attempt decryption and download the database file to your computer."
4719
  msgstr ""
4720
 
4721
+ #: src/admin.php:691
4722
  msgid "Upload error"
4723
  msgstr ""
4724
 
4725
+ #: src/admin.php:690
4726
  msgid "This file does not appear to be an UpdraftPlus encrypted database archive (such files are .gz.crypt files which have a name like: backup_(time)_(site name)_(code)_db.crypt.gz)."
4727
  msgstr ""
4728
 
4729
+ #: src/admin.php:689
4730
  msgid "Upload error:"
4731
  msgstr ""
4732
 
4733
+ #: src/admin.php:688
4734
  msgid "(make sure that you were trying to upload a zip file previously created by UpdraftPlus)"
4735
  msgstr ""
4736
 
4737
+ #: src/admin.php:679
4738
  msgid "Download to your computer"
4739
  msgstr ""
4740
 
4741
+ #: src/admin.php:678
4742
  msgid "Delete from your web server"
4743
  msgstr ""
4744
 
4745
+ #: src/admin.php:3728
4746
  msgid "You appear to be missing one or more archives from this multi-archive set."
4747
  msgstr ""
4748
 
4749
+ #: src/admin.php:3725
4750
  msgid "(%d archive(s) in set)."
4751
  msgstr ""
4752
 
4758
  msgid "Error: the server sent us a response (JSON) which we did not understand."
4759
  msgstr ""
4760
 
4761
+ #: src/admin.php:669
4762
  msgid "Warnings:"
4763
  msgstr ""
4764
 
4765
+ #: src/admin.php:668
4766
  msgid "Error: the server sent an empty response."
4767
  msgstr ""
4768
 
4769
+ #: src/admin.php:2169
4770
  msgid "This looks like a file created by UpdraftPlus, but this install does not know about this type of object: %s. Perhaps you need to install an add-on?"
4771
  msgstr ""
4772
 
4802
  msgid "No such backup set exists"
4803
  msgstr ""
4804
 
4805
+ #: src/admin.php:1343
4806
  msgid "The backup archive for this file could not be found. The remote storage method in use (%s) does not allow us to retrieve files. To perform any restoration using UpdraftPlus, you will need to obtain a copy of this file and place it inside UpdraftPlus's working folder"
4807
  msgstr ""
4808
 
4810
  msgid "Moving unpacked backup into place..."
4811
  msgstr ""
4812
 
4813
+ #: src/backup.php:2972, src/backup.php:3227
4814
  msgid "Failed to open the zip file (%s) - %s"
4815
  msgstr ""
4816
 
4818
  msgid "WordPress root directory server path: %s"
4819
  msgstr ""
4820
 
4821
+ #: src/methods/dreamobjects.php:77, src/methods/s3.php:852
4822
  msgid "%s end-point"
4823
  msgstr ""
4824
 
4825
+ #: src/methods/s3.php:814, src/methods/s3.php:928
4826
  msgid "... and many more!"
4827
  msgstr ""
4828
 
4830
  msgid "S3 (Compatible)"
4831
  msgstr ""
4832
 
4833
+ #: src/admin.php:1254
4834
  msgid "File is not locally present - needs retrieving from remote storage"
4835
  msgstr ""
4836
 
4837
+ #: src/admin.php:4032
4838
  msgid "Looking for %s archive: file name: %s"
4839
  msgstr ""
4840
 
4841
+ #: src/admin.php:3993
4842
  msgid "Final checks"
4843
  msgstr ""
4844
 
4850
  msgid "Drop encrypted database files (db.gz.crypt files) here to upload them for decryption"
4851
  msgstr ""
4852
 
4853
+ #: src/admin.php:3362
4854
  msgid "Your wp-content directory server path: %s"
4855
  msgstr ""
4856
 
4857
+ #: src/admin.php:685
4858
  msgid "Raw backup history"
4859
  msgstr ""
4860
 
4862
  msgid "Show raw backup and file list"
4863
  msgstr ""
4864
 
4865
+ #: src/admin.php:667
4866
  msgid "Processing files - please wait..."
4867
  msgstr ""
4868
 
4869
+ #: src/admin.php:4182,
4870
  #: src/templates/wp-admin/settings/downloading-and-restoring.php:27
4871
  msgid "Please consult this FAQ for help on what to do about it."
4872
  msgstr ""
4875
  msgid "Your WordPress installation has a problem with outputting extra whitespace. This can corrupt backups that you download from here."
4876
  msgstr ""
4877
 
4878
+ #: src/class-updraftplus.php:4333
4879
  msgid "Failed to open database file."
4880
  msgstr ""
4881
 
4882
+ #: src/admin.php:4650
4883
  msgid "Known backups (raw)"
4884
  msgstr ""
4885
 
4886
+ #: src/restorer.php:969
4887
  msgid "Files found:"
4888
  msgstr ""
4889
 
4890
+ #: src/restorer.php:1865
4891
  msgid "Requested table engine (%s) is not present - changing to MyISAM."
4892
  msgstr ""
4893
 
4894
+ #: src/addons/migrator.php:344
4895
  msgid "This looks like a migration (the backup is from a site with a different address/URL), but you did not check the option to search-and-replace the database. That is usually a mistake."
4896
  msgstr ""
4897
 
4898
+ #: src/admin.php:4052
4899
  msgid "file is size:"
4900
  msgstr ""
4901
 
4902
+ #: src/addons/googlecloud.php:942, src/addons/migrator.php:382,
4903
+ #: src/addons/migrator.php:385, src/addons/migrator.php:388, src/admin.php:958,
4904
+ #: src/admin.php:2416, src/backup.php:3278, src/class-updraftplus.php:4521,
4905
  #: src/updraftplus.php:156
4906
  msgid "Go here for more information."
4907
  msgstr ""
4908
 
4909
+ #: src/admin.php:666
4910
  msgid "Some files are still downloading or being processed - please wait."
4911
  msgstr ""
4912
 
4913
+ #: src/class-updraftplus.php:4404, src/class-updraftplus.php:4422
4914
  msgid "This backup set is from a different site - this is not a restoration, but a migration. You need the Migrator add-on in order to make this work."
4915
  msgstr ""
4916
 
4930
  msgid "%s login failure"
4931
  msgstr ""
4932
 
4933
+ #: src/methods/dropbox.php:413
4934
  msgid "You do not appear to be authenticated with %s"
4935
  msgstr ""
4936
 
4937
+ #: src/methods/dropbox.php:380
4938
  msgid "Failed to access %s when deleting (see log file for more)"
4939
  msgstr ""
4940
 
4941
+ #: src/methods/dropbox.php:372
4942
  msgid "You do not appear to be authenticated with %s (whilst deleting)"
4943
  msgstr ""
4944
 
4956
 
4957
  #: src/addons/azure.php:218, src/methods/addon-base-v2.php:219,
4958
  #: src/methods/cloudfiles.php:405, src/methods/cloudfiles.php:422,
4959
+ #: src/methods/googledrive.php:1012, src/methods/openstack-base.php:428,
4960
+ #: src/methods/stream-base.php:261, src/methods/stream-base.php:268,
4961
+ #: src/methods/stream-base.php:281
4962
  msgid "%s Error"
4963
  msgstr ""
4964
 
4966
  msgid "%s error - failed to upload file"
4967
  msgstr ""
4968
 
4969
+ #: src/class-updraftplus.php:1175, src/methods/cloudfiles.php:223
4970
  msgid "%s error - failed to re-assemble chunks"
4971
  msgstr ""
4972
 
4980
  msgid "%s authentication failed"
4981
  msgstr ""
4982
 
4983
+ #: src/addons/googlecloud.php:436, src/addons/migrator.php:473,
4984
+ #: src/admin.php:2112, src/admin.php:2161, src/admin.php:2169,
4985
+ #: src/class-updraftplus.php:943, src/class-updraftplus.php:949,
4986
+ #: src/class-updraftplus.php:4306, src/class-updraftplus.php:4308,
4987
+ #: src/class-updraftplus.php:4455, src/class-updraftplus.php:4462,
4988
+ #: src/class-updraftplus.php:4500, src/methods/googledrive.php:375,
4989
  #: src/methods/s3.php:322
4990
  msgid "Error: %s"
4991
  msgstr ""
4992
 
4993
+ #: src/admin.php:3287
4994
  msgid "Backup directory specified exists, but is <b>not</b> writable."
4995
  msgstr ""
4996
 
4997
+ #: src/admin.php:3285
4998
  msgid "Backup directory specified does <b>not</b> exist."
4999
  msgstr ""
5000
 
5001
+ #: src/admin.php:2962, src/admin.php:3236
5002
  msgid "Warning: %s"
5003
  msgstr ""
5004
 
5006
  msgid "Last backup job run:"
5007
  msgstr ""
5008
 
5009
+ #: src/backup.php:2998
5010
  msgid "A very large file was encountered: %s (size: %s Mb)"
5011
  msgstr ""
5012
 
5013
+ #: src/backup.php:2298
5014
  msgid "%s: unreadable file - could not be backed up"
5015
  msgstr ""
5016
 
5017
+ #: src/backup.php:1615
5018
  msgid "Table %s has very many rows (%s) - we hope your web hosting company gives you enough resources to dump out that table in the backup"
5019
  msgstr ""
5020
 
5021
+ #: src/backup.php:1736
5022
  msgid "An error occurred whilst closing the final database file"
5023
  msgstr ""
5024
 
5025
+ #: src/backup.php:954
5026
  msgid "Warnings encountered:"
5027
  msgstr ""
5028
 
5029
+ #: src/class-updraftplus.php:2840
5030
  msgid "The backup apparently succeeded (with warnings) and is now complete"
5031
  msgstr ""
5032
 
5033
+ #: src/class-updraftplus.php:827
5034
  msgid "Your free disk space is very low - only %s Mb remain"
5035
  msgstr ""
5036
 
5037
+ #: src/addons/migrator.php:481
5038
  msgid "New site:"
5039
  msgstr ""
5040
 
5041
+ #: src/addons/migrator.php:456
5042
  msgid "Migrated site (from UpdraftPlus)"
5043
  msgstr ""
5044
 
5045
+ #: src/addons/migrator.php:403
5046
  msgid "Enter details for where this new site is to live within your multisite install:"
5047
  msgstr ""
5048
 
5049
+ #: src/addons/migrator.php:402
5050
  msgid "Information needed to continue:"
5051
  msgstr ""
5052
 
5053
+ #: src/addons/migrator.php:359
5054
  msgid "Network activating theme:"
5055
  msgstr ""
5056
 
5057
+ #: src/addons/migrator.php:349
5058
  msgid "Processed plugin:"
5059
  msgstr ""
5060
 
5066
  msgid "Some servers advertise encrypted FTP as available, but then time-out (after a long time) when you attempt to use it. If you find this happenning, then go into the \"Expert Options\" (below) and turn off SSL there."
5067
  msgstr ""
5068
 
5069
+ #: src/methods/s3.php:828, src/methods/s3.php:942
5070
  msgid "Your web server's PHP installation does not included a required module (%s). Please contact your web hosting provider's support and ask for them to enable it."
5071
  msgstr ""
5072
 
5073
+ #: src/methods/s3.php:1189
5074
  msgid "Please check your access credentials."
5075
  msgstr ""
5076
 
5077
+ #: src/addons/s3-enhanced.php:179, src/methods/s3.php:1167
5078
  msgid "The error reported by %s was:"
5079
  msgstr ""
5080
 
5081
+ #: src/restorer.php:1409
5082
  msgid "Please supply the requested information, and then continue."
5083
  msgstr ""
5084
 
5085
+ #: src/class-updraftplus.php:4473, src/restorer.php:1713
5086
  msgid "Site information:"
5087
  msgstr ""
5088
 
5089
+ #: src/restorer.php:1580
5090
  msgid "Your database user does not have permission to create tables. We will attempt to restore by simply emptying the tables; this should work as long as a) you are restoring from a WordPress version with the same database structure, and b) Your imported database does not contain any tables which are not already present on the importing site."
5091
  msgstr ""
5092
 
5093
+ #: src/addons/migrator.php:344, src/admin.php:2411,
5094
+ #: src/class-updraftplus.php:4466, src/restorer.php:2052
5095
  msgid "Warning:"
5096
  msgstr ""
5097
 
5098
+ #: src/class-updraftplus.php:4455, src/class-updraftplus.php:4458,
5099
  #: src/restorer.php:154
5100
  msgid "You are running on WordPress multisite - but your backup is not of a multisite site."
5101
  msgstr ""
5102
 
5103
+ #: src/admin.php:4020
5104
  msgid "Skipping restoration of WordPress core when importing a single site into a multisite installation. If you had anything necessary in your WordPress directory then you will need to re-add it manually from the zip file."
5105
  msgstr ""
5106
 
5107
+ #: src/admin.php:3434, src/methods/updraftvault.php:283
5108
  msgid "Your web server's PHP installation does not included a <strong>required</strong> (for %s) module (%s). Please contact your web hosting provider's support and ask for them to enable it."
5109
  msgstr ""
5110
 
5111
+ #: src/admin.php:703
5112
  msgid "Close"
5113
  msgstr ""
5114
 
5115
  #: src/addons/autobackup.php:330, src/addons/autobackup.php:422,
5116
+ #: src/admin.php:659, src/methods/remotesend.php:66,
5117
  #: src/methods/remotesend.php:74, src/methods/remotesend.php:225,
5118
  #: src/methods/remotesend.php:242
5119
  msgid "Unexpected response:"
5120
  msgstr ""
5121
 
5122
+ #: src/addons/reporting.php:462, src/admin.php:654
5123
  msgid "To send to more than one address, separate each address with a comma."
5124
  msgstr ""
5125
 
5126
+ #: src/admin.php:683
5127
  msgid "PHP information"
5128
  msgstr ""
5129
 
5143
  msgid "Do you want to migrate or clone/duplicate a site?"
5144
  msgstr ""
5145
 
5146
+ #: src/addons/migrator.php:174
5147
  msgid "<a href=\"%s\">Read this article to see step-by-step how it's done.</a>"
5148
  msgstr ""
5149
 
5159
  msgid "Also delete from remote storage"
5160
  msgstr ""
5161
 
5162
+ #: src/admin.php:2684
5163
  msgid "Latest UpdraftPlus.com news:"
5164
  msgstr ""
5165
 
5176
  msgid "News"
5177
  msgstr ""
5178
 
5179
+ #: src/admin.php:1522, src/includes/class-wpadmin-commands.php:465
5180
  msgid "Backup set not found"
5181
  msgstr ""
5182
 
5183
+ #: src/backup.php:189
5184
  msgid "%s - could not back this entity up; the corresponding directory does not exist (%s)"
5185
  msgstr ""
5186
 
5198
  msgid "Blog link"
5199
  msgstr ""
5200
 
5201
+ #: src/admin.php:747
5202
  msgid "Testing %s Settings..."
5203
  msgstr ""
5204
 
5206
  msgid "Or, you can place them manually into your UpdraftPlus directory (usually wp-content/updraft), e.g. via FTP, and then use the \"rescan\" link above."
5207
  msgstr ""
5208
 
5209
+ #: src/admin.php:974
5210
  msgid "UpdraftPlus's debug mode is on. You may see debugging notices on this page not just from UpdraftPlus, but from any other plugin installed. Please try to make sure that the notice you are seeing is from UpdraftPlus before you raise a support request."
5211
  msgstr ""
5212
 
5213
+ #: src/admin.php:974
5214
  msgid "Notice"
5215
  msgstr ""
5216
 
5217
+ #: src/backup.php:936
5218
  msgid "Errors encountered:"
5219
  msgstr ""
5220
 
5221
+ #: src/admin.php:652
5222
  msgid "Rescanning (looking for backups that you have uploaded manually into the internal backup store)..."
5223
  msgstr ""
5224
 
5225
+ #: src/admin.php:665
5226
  msgid "Begun looking for this entity"
5227
  msgstr ""
5228
 
5229
+ #: src/addons/dropbox-folders.php:32
5230
  msgid "Store at"
5231
  msgstr ""
5232
 
5233
+ #: src/addons/migrator.php:1431
5234
  msgid "\"%s\" has no primary key, manual change needed on row %s."
5235
  msgstr ""
5236
 
5237
+ #: src/addons/migrator.php:1309
5238
  msgid "rows: %d"
5239
  msgstr ""
5240
 
5241
+ #: src/addons/migrator.php:1183
5242
  msgid "Time taken (seconds):"
5243
  msgstr ""
5244
 
5245
+ #: src/addons/migrator.php:1182, src/admin.php:670
5246
  msgid "Errors:"
5247
  msgstr ""
5248
 
5249
+ #: src/addons/migrator.php:1181
5250
  msgid "SQL update commands run:"
5251
  msgstr ""
5252
 
5253
+ #: src/addons/migrator.php:1180
5254
  msgid "Changes made:"
5255
  msgstr ""
5256
 
5257
+ #: src/addons/migrator.php:1179
5258
  msgid "Rows examined:"
5259
  msgstr ""
5260
 
5261
+ #: src/addons/migrator.php:1178
5262
  msgid "Tables examined:"
5263
  msgstr ""
5264
 
5265
+ #: src/addons/migrator.php:1067
5266
  msgid "Could not get list of tables"
5267
  msgstr ""
5268
 
5269
+ #: src/addons/migrator.php:1012
5270
  msgid "Warning: the database's site URL (%s) is different to what we expected (%s)"
5271
  msgstr ""
5272
 
5273
+ #: src/addons/migrator.php:1001
5274
  msgid "Nothing to do: the site URL is already: %s"
5275
  msgstr ""
5276
 
5277
+ #: src/addons/migrator.php:965, src/addons/migrator.php:969,
5278
+ #: src/addons/migrator.php:973, src/addons/migrator.php:978,
5279
+ #: src/addons/migrator.php:982, src/addons/migrator.php:987
5280
  msgid "Error: unexpected empty parameter (%s, %s)"
5281
  msgstr ""
5282
 
5283
+ #: src/addons/migrator.php:925
5284
  msgid "Database: search and replace site URL"
5285
  msgstr ""
5286
 
5287
+ #: src/addons/migrator.php:798, src/addons/migrator.php:1164
5288
  msgid "Failed: we did not understand the result returned by the %s operation."
5289
  msgstr ""
5290
 
5291
+ #: src/addons/migrator.php:796, src/addons/migrator.php:1162
5292
  msgid "Failed: the %s operation was not able to start."
5293
  msgstr ""
5294
 
5295
+ #: src/addons/migrator.php:561
5296
  msgid "(learn more)"
5297
  msgstr ""
5298
 
5299
+ #: src/addons/migrator.php:561
5300
  msgid "Search and replace site location in the database (migrate)"
5301
  msgstr ""
5302
 
5303
+ #: src/addons/migrator.php:561
5304
  msgid "All references to the site location in the database will be replaced with your current site URL, which is: %s"
5305
  msgstr ""
5306
 
5308
  msgid "Blog uploads"
5309
  msgstr ""
5310
 
5311
+ #: src/addons/migrator.php:388, src/addons/multisite.php:652
5312
  msgid "Must-use plugins"
5313
  msgstr ""
5314
 
5320
  msgid "starting from next time it is"
5321
  msgstr ""
5322
 
5323
+ #: src/addons/sftp.php:502
5324
  msgid "Failure: Port must be an integer."
5325
  msgstr ""
5326
 
5328
  msgid "password"
5329
  msgstr ""
5330
 
5331
+ #: src/addons/sftp.php:493, src/methods/openstack2.php:173
5332
  msgid "username"
5333
  msgstr ""
5334
 
5335
+ #: src/addons/sftp.php:489
5336
  msgid "host name"
5337
  msgstr ""
5338
 
5339
+ #: src/addons/sftp.php:452
5340
  msgid "Where to change directory to after logging in - often this is relative to your home directory."
5341
  msgstr ""
5342
 
5343
+ #: src/addons/sftp.php:450
5344
  msgid "Directory path"
5345
  msgstr ""
5346
 
5347
  #: src/addons/lockadmin.php:156, src/addons/moredatabase.php:246,
5348
+ #: src/addons/sftp.php:425, src/addons/webdav.php:98,
5349
+ #: src/methods/openstack2.php:157, src/methods/updraftvault.php:338,
5350
  #: src/udaddons/options.php:135
5351
  msgid "Password"
5352
  msgstr ""
5353
 
5354
+ #: src/addons/sftp.php:411, src/addons/webdav.php:112
5355
  msgid "Port"
5356
  msgstr ""
5357
 
5358
+ #: src/addons/moredatabase.php:244, src/addons/sftp.php:404,
5359
+ #: src/addons/webdav.php:104
5360
  msgid "Host"
5361
  msgstr ""
5362
 
5364
  msgid "%s Error: Failed to download"
5365
  msgstr ""
5366
 
5367
+ #: src/addons/sftp.php:534
5368
  msgid "Check your file permissions: Could not successfully create and enter:"
5369
  msgstr ""
5370
 
5408
  msgid "WordPress Core"
5409
  msgstr ""
5410
 
5411
+ #: src/methods/addon-base-v2.php:337, src/methods/stream-base.php:311
5412
  msgid "Failed: We were not able to place a file in that directory - please check your credentials."
5413
  msgstr ""
5414
 
5415
+ #: src/addons/googlecloud.php:707, src/addons/googlecloud.php:741,
5416
+ #: src/addons/googlecloud.php:747, src/addons/sftp.php:520, src/admin.php:3018,
5417
+ #: src/admin.php:3053, src/admin.php:3062, src/methods/addon-base-v2.php:325,
5418
+ #: src/methods/stream-base.php:297
5419
  msgid "Failed"
5420
  msgstr ""
5421
 
5422
+ #: src/addons/webdav.php:74
5423
  msgid "WebDAV URL"
5424
  msgstr ""
5425
 
5426
+ #: src/methods/stream-base.php:281
5427
  msgid "Local write failed: Failed to download"
5428
  msgstr ""
5429
 
5430
+ #: src/methods/stream-base.php:268
5431
  msgid "Error opening remote file: Failed to download"
5432
  msgstr ""
5433
 
5435
  msgid "Chunk %s: A %s error occurred"
5436
  msgstr ""
5437
 
5438
+ #: src/addons/googlecloud.php:322, src/addons/sftp.php:45,
5439
  #: src/methods/addon-base-v2.php:76, src/methods/addon-base-v2.php:117,
5440
  #: src/methods/addon-base-v2.php:149, src/methods/addon-base-v2.php:195,
5441
+ #: src/methods/addon-base-v2.php:304, src/methods/ftp.php:42,
5442
+ #: src/methods/googledrive.php:176, src/methods/googledrive.php:178,
5443
  #: src/methods/stream-base.php:27, src/methods/stream-base.php:144,
5444
  #: src/methods/stream-base.php:150, src/methods/stream-base.php:184,
5445
+ #: src/methods/stream-base.php:242
5446
  msgid "No %s settings were found"
5447
  msgstr ""
5448
 
5470
  msgid "If you want encryption (e.g. you are storing sensitive business data), then an add-on is available."
5471
  msgstr ""
5472
 
5473
+ #: src/addons/onedrive.php:759, src/methods/dropbox.php:651
5474
  msgid "Your %s account name: %s"
5475
  msgstr ""
5476
 
5477
+ #: src/methods/dropbox.php:641, src/methods/dropbox.php:663
5478
  msgid "though part of the returned information was not as expected - your mileage may vary"
5479
  msgstr ""
5480
 
5481
+ #: src/methods/dropbox.php:636, src/methods/dropbox.php:638
5482
  msgid "you have authenticated your %s account"
5483
  msgstr ""
5484
 
5485
+ #: src/methods/dropbox.php:489, src/methods/dropbox.php:491
5486
  msgid "there's an add-on for that."
5487
  msgstr ""
5488
 
5489
+ #: src/methods/dropbox.php:489, src/methods/dropbox.php:491
5490
  msgid "If you back up several sites into the same Dropbox and want to organise with sub-folders, then "
5491
  msgstr ""
5492
 
5493
+ #: src/methods/dropbox.php:489, src/methods/dropbox.php:491
5494
  msgid "Backups are saved in"
5495
  msgstr ""
5496
 
5497
+ #: src/methods/dropbox.php:489, src/methods/dropbox.php:491
5498
  msgid "Need to use sub-folders?"
5499
  msgstr ""
5500
 
5501
+ #: src/methods/dropbox.php:216, src/methods/dropbox.php:237,
5502
+ #: src/methods/dropbox.php:253
5503
  msgid "error: failed to upload file to %s (see log file for more)"
5504
  msgstr ""
5505
 
5507
  msgid "You do not appear to be authenticated with Dropbox"
5508
  msgstr ""
5509
 
5510
+ #: src/methods/s3.php:1184
5511
  msgid "The communication with %s was not encrypted."
5512
  msgstr ""
5513
 
5514
+ #: src/methods/s3.php:1182
5515
  msgid "The communication with %s was encrypted."
5516
  msgstr ""
5517
 
5518
+ #: src/addons/googlecloud.php:770, src/methods/s3.php:1179
5519
  msgid "We accessed the bucket, and were able to create files within it."
5520
  msgstr ""
5521
 
5522
+ #: src/addons/googlecloud.php:764, src/addons/googlecloud.php:778,
5523
+ #: src/methods/s3.php:1177, src/methods/s3.php:1189
5524
  msgid "We successfully accessed the bucket, but the attempt to create a file in it failed."
5525
  msgstr ""
5526
 
5527
+ #: src/addons/googlecloud.php:764, src/addons/googlecloud.php:778,
5528
+ #: src/methods/s3.php:1177, src/methods/s3.php:1189
5529
  msgid "Failure"
5530
  msgstr ""
5531
 
5532
+ #: src/methods/s3.php:1165
5533
  msgid "Failure: We could not successfully access or create such a bucket. Please check your access credentials, and if those are correct then try another bucket name (as another %s user may already have taken your name)."
5534
  msgstr ""
5535
 
5536
+ #: src/addons/s3-enhanced.php:152, src/methods/openstack2.php:143,
5537
+ #: src/methods/s3.php:1159
5538
  msgid "Region"
5539
  msgstr ""
5540
 
5541
+ #: src/addons/googlecloud.php:122, src/addons/googlecloud.php:724,
5542
+ #: src/methods/s3.php:1141
5543
  msgid "Failure: No bucket details were given."
5544
  msgstr ""
5545
 
5546
+ #: src/methods/s3.php:1119
5547
  msgid "API secret"
5548
  msgstr ""
5549
 
5550
+ #: src/methods/s3.php:889, src/methods/s3.php:986
5551
  msgid "Enter only a bucket name or a bucket and path. Examples: mybucket, mybucket/mypath"
5552
  msgstr ""
5553
 
5554
+ #: src/methods/s3.php:888, src/methods/s3.php:985
5555
  msgid "%s location"
5556
  msgstr ""
5557
 
5558
+ #: src/methods/s3.php:884, src/methods/s3.php:981
5559
  msgid "%s secret key"
5560
  msgstr ""
5561
 
5562
+ #: src/methods/s3.php:880, src/methods/s3.php:977
5563
  msgid "%s access key"
5564
  msgstr ""
5565
 
5566
+ #: src/methods/s3.php:845, src/methods/s3.php:958
5567
  msgid "If you see errors about SSL certificates, then please go here for help."
5568
  msgstr ""
5569
 
5570
+ #: src/methods/s3.php:843, src/methods/s3.php:956
5571
  msgid "Get your access key and secret key <a href=\"%s\">from your %s console</a>, then pick a (globally unique - all %s users) bucket name (letters and numbers) (and optionally a path) to use for storage. This bucket will be created for you if it does not already exist."
5572
  msgstr ""
5573
 
5608
  msgid "WordPress Backup"
5609
  msgstr ""
5610
 
5611
+ #: src/methods/cloudfiles.php:586, src/methods/openstack-base.php:503
5612
  msgid "We accessed the container, and were able to create files within it."
5613
  msgstr ""
5614
 
5615
+ #: src/methods/cloudfiles.php:582
5616
  msgid "Cloud Files error - we accessed the container, but failed to create a file within it"
5617
  msgstr ""
5618
 
5619
+ #: src/methods/cloudfiles.php:555, src/methods/openstack-base.php:445
5620
  msgid "Failure: No container details were given."
5621
  msgstr ""
5622
 
5623
+ #: src/addons/moredatabase.php:245, src/addons/sftp.php:418,
5624
+ #: src/addons/webdav.php:92, src/methods/cloudfiles-new.php:186,
5625
+ #: src/methods/cloudfiles.php:535, src/methods/openstack2.php:151
5626
  msgid "Username"
5627
  msgstr ""
5628
 
5629
+ #: src/methods/cloudfiles-new.php:181, src/methods/cloudfiles.php:530,
5630
+ #: src/methods/s3.php:1115
5631
  msgid "API key"
5632
  msgstr ""
5633
 
5634
+ #: src/addons/migrator.php:297, src/addons/migrator.php:1948,
5635
  #: src/addons/moredatabase.php:82, src/addons/moredatabase.php:84,
5636
+ #: src/addons/moredatabase.php:86, src/addons/sftp.php:489,
5637
+ #: src/addons/sftp.php:493, src/addons/sftp.php:497, src/addons/webdav.php:158,
5638
+ #: src/admin.php:723, src/methods/addon-base-v2.php:317,
5639
+ #: src/methods/cloudfiles-new.php:181, src/methods/cloudfiles-new.php:186,
5640
+ #: src/methods/cloudfiles.php:530, src/methods/cloudfiles.php:535,
5641
  #: src/methods/ftp.php:380, src/methods/ftp.php:384,
5642
  #: src/methods/openstack2.php:173, src/methods/openstack2.php:178,
5643
  #: src/methods/openstack2.php:183, src/methods/openstack2.php:188,
5644
+ #: src/methods/s3.php:1115, src/methods/s3.php:1119
5645
  msgid "Failure: No %s was given."
5646
  msgstr ""
5647
 
5648
+ #: src/methods/cloudfiles-new.php:101, src/methods/cloudfiles.php:462,
5649
+ #: src/methods/openstack-base.php:549, src/methods/openstack-base.php:590,
5650
+ #: src/methods/s3.php:832, src/methods/s3.php:946
5651
  msgid "UpdraftPlus's %s module <strong>requires</strong> %s. Please do not file any support requests; there is no alternative."
5652
  msgstr ""
5653
 
5654
+ #: src/methods/cloudfiles.php:495
 
 
 
 
 
 
 
 
5655
  msgid "Cloud Files username"
5656
  msgstr ""
5657
 
5658
+ #: src/addons/cloudfiles-enhanced.php:38, src/methods/cloudfiles-new.php:111,
5659
+ #: src/methods/cloudfiles.php:478
5660
  msgid "UK"
5661
  msgstr ""
5662
 
5663
+ #: src/addons/cloudfiles-enhanced.php:37, src/methods/cloudfiles-new.php:110,
5664
+ #: src/methods/cloudfiles.php:477
5665
  msgid "US (default)"
5666
  msgstr ""
5667
 
5668
+ #: src/methods/cloudfiles.php:474
5669
  msgid "US or UK Cloud"
5670
  msgstr ""
5671
 
5672
+ #: src/methods/cloudfiles-new.php:103, src/methods/cloudfiles.php:470,
5673
+ #: src/methods/openstack2.php:124
5674
  msgid "Also, you should read this important FAQ."
5675
  msgstr ""
5676
 
5677
+ #: src/methods/cloudfiles-new.php:103, src/methods/cloudfiles.php:470
5678
  msgid "Get your API key <a href=\"https://mycloud.rackspace.com/\">from your Rackspace Cloud console</a> (read instructions <a href=\"http://www.rackspace.com/knowledge_center/article/rackspace-cloud-essentials-1-generating-your-api-key\">here</a>), then pick a container name to use for storage. This container will be created for you if it does not already exist."
5679
  msgstr ""
5680
 
5681
+ #: src/admin.php:746, src/methods/backup-module.php:262
5682
  msgid "Test %s Settings"
5683
  msgstr ""
5684
 
5685
+ #: src/class-updraftplus.php:1215, src/class-updraftplus.php:1259,
5686
+ #: src/methods/cloudfiles.php:405, src/methods/stream-base.php:261
5687
  msgid "Error opening local file: Failed to download"
5688
  msgstr ""
5689
 
5698
  msgid "%s Error: Failed to upload"
5699
  msgstr ""
5700
 
5701
+ #: src/addons/googlecloud.php:205, src/addons/googlecloud.php:210,
5702
+ #: src/class-updraftplus.php:1073, src/methods/cloudfiles.php:142,
5703
+ #: src/methods/googledrive.php:930, src/methods/googledrive.php:935
5704
  msgid "%s Error: Failed to open local file"
5705
  msgstr ""
5706
 
5711
 
5712
  #: src/addons/cloudfiles-enhanced.php:99,
5713
  #: src/addons/cloudfiles-enhanced.php:112,
5714
+ #: src/addons/cloudfiles-enhanced.php:116, src/methods/cloudfiles.php:565,
5715
+ #: src/methods/cloudfiles.php:568, src/methods/cloudfiles.php:571
5716
  msgid "Cloud Files authentication failed"
5717
  msgstr ""
5718
 
5719
+ #: src/addons/googlecloud.php:1001, src/methods/googledrive.php:1175
5720
  msgid "<strong>After</strong> you have saved your settings (by clicking 'Save Changes' below), then come back here once and click this link to complete authentication with Google."
5721
  msgstr ""
5722
 
5723
+ #: src/methods/googledrive.php:1153
5724
+ msgid "Authenticate with Google"
5725
+ msgstr ""
5726
+
5727
+ #: src/addons/googlecloud.php:935, src/addons/onedrive.php:987,
5728
+ #: src/methods/googledrive.php:1117
5729
  msgid "Client Secret"
5730
  msgstr ""
5731
 
5732
+ #: src/addons/googlecloud.php:930, src/methods/googledrive.php:1114
5733
  msgid "If Google later shows you the message \"invalid_client\", then you did not enter a valid client ID here."
5734
  msgstr ""
5735
 
5736
+ #: src/addons/googlecloud.php:927, src/addons/onedrive.php:983,
5737
+ #: src/methods/googledrive.php:1113
5738
  msgid "Client ID"
5739
  msgstr ""
5740
 
5741
+ #: src/addons/googlecloud.php:918, src/methods/googledrive.php:1103
5742
  msgid "You must add the following as the authorised redirect URI (under \"More Options\") when asked"
5743
  msgstr ""
5744
 
5745
+ #: src/addons/googlecloud.php:918, src/methods/googledrive.php:1103
5746
  msgid "Select 'Web Application' as the application type."
5747
  msgstr ""
5748
 
5749
+ #: src/addons/googlecloud.php:916, src/methods/googledrive.php:1101
5750
  msgid "For longer help, including screenshots, follow this link. The description below is sufficient for more expert users."
5751
  msgstr ""
5752
 
5753
+ #: src/methods/addon-base-v2.php:243, src/methods/addon-base-v2.php:265,
5754
+ #: src/methods/cloudfiles.php:454, src/methods/dropbox.php:475,
5755
+ #: src/methods/ftp.php:321, src/methods/googledrive.php:1084,
5756
+ #: src/methods/openstack-base.php:539, src/methods/openstack-base.php:581,
5757
+ #: src/methods/s3.php:803, src/methods/s3.php:917,
5758
+ #: src/methods/stream-base.php:216
5759
  msgid "%s is a great choice, because UpdraftPlus supports chunked uploads - no matter how big your site is, UpdraftPlus can upload it a little at a time, and not get thwarted by timeouts."
5760
  msgstr ""
5761
 
5762
+ #: src/addons/googlecloud.php:503, src/addons/googlecloud.php:504,
5763
+ #: src/addons/googlecloud.php:797, src/methods/googledrive.php:537,
5764
+ #: src/methods/googledrive.php:538, src/methods/googledrive.php:548,
5765
+ #: src/methods/googledrive.php:549
5766
  msgid "Account is not authorized."
5767
  msgstr ""
5768
 
5769
+ #: src/methods/googledrive.php:461, src/methods/googledrive.php:507,
5770
+ #: src/methods/googledrive.php:513, src/methods/googledrive.php:515,
5771
  #: src/methods/stream-base.php:200
5772
  msgid "Failed to upload to %s"
5773
  msgstr ""
5774
 
5775
+ #: src/methods/googledrive.php:490
5776
  msgid "Account full: your %s account has only %d bytes left, but the file to be uploaded is %d bytes"
5777
  msgstr ""
5778
 
5779
+ #: src/methods/googledrive.php:581, src/methods/googledrive.php:617
5780
  msgid "Have not yet obtained an access token from Google - you need to authorise or re-authorise your connection to Google Drive."
5781
  msgstr ""
5782
 
5783
+ #: src/addons/googlecloud.php:649, src/addons/onedrive.php:797,
5784
+ #: src/methods/googledrive.php:434
5785
  msgid "you have authenticated your %s account."
5786
  msgstr ""
5787
 
5788
+ #: src/addons/googlecloud.php:649, src/addons/googlecloud.php:770,
5789
+ #: src/addons/onedrive.php:797, src/addons/sftp.php:554,
5790
+ #: src/methods/addon-base-v2.php:334, src/methods/cloudfiles.php:586,
5791
+ #: src/methods/googledrive.php:434, src/methods/openstack-base.php:503,
5792
+ #: src/methods/s3.php:1179, src/methods/stream-base.php:308
5793
  msgid "Success"
5794
  msgstr ""
5795
 
5796
+ #: src/addons/onedrive.php:751, src/methods/dropbox.php:674,
5797
+ #: src/methods/dropbox.php:683, src/methods/googledrive.php:408
5798
  msgid "Your %s quota usage: %s %% used, %s available"
5799
  msgstr ""
5800
 
5801
+ #: src/addons/googlecloud.php:442, src/methods/googledrive.php:381
5802
  msgid "Authorization failed"
5803
  msgstr ""
5804
 
5805
+ #: src/addons/googlecloud.php:434, src/methods/googledrive.php:373
5806
  msgid "No refresh token was received from Google. This often means that you entered your client secret wrongly, or that you have not yet re-authenticated (below) since correcting it. Re-check it, then follow the link to authenticate again. Finally, if that does not work, then use expert mode to wipe all your settings, create a new Google client ID/secret, and start again."
5807
  msgstr ""
5808
 
5809
+ #: src/methods/addon-not-yet-present.php:84
5810
  msgid "follow this link to get it"
5811
  msgstr ""
5812
 
5813
+ #: src/methods/addon-not-yet-present.php:84
5814
  msgid "%s support is available as an add-on"
5815
  msgstr ""
5816
 
5817
  #: src/methods/addon-not-yet-present.php:28,
5818
+ #: src/methods/addon-not-yet-present.php:68,
5819
+ #: src/methods/addon-not-yet-present.php:75
 
5820
  msgid "You do not have the UpdraftPlus %s add-on installed - get it from %s"
5821
  msgstr ""
5822
 
 
 
5823
  #: src/includes/Dropbox2/OAuth/Consumer/ConsumerAbstract.php:126,
5824
  #: src/includes/Dropbox2/OAuth/Consumer/ConsumerAbstract.php:127
5825
  msgid "You need to re-authenticate with %s, as your existing credentials are not working."
5826
  msgstr ""
5827
 
5828
+ #: src/addons/migrator.php:1843, src/admin.php:1282, src/admin.php:3021,
5829
+ #: src/admin.php:3055, src/admin.php:3059, src/admin.php:4050,
5830
+ #: src/restorer.php:2292, src/restorer.php:2397
5831
  msgid "OK"
5832
  msgstr ""
5833
 
5834
+ #: src/restorer.php:2286, src/restorer.php:2361
5835
  msgid "Table prefix has changed: changing %s table field(s) accordingly:"
5836
  msgstr ""
5837
 
5838
+ #: src/addons/migrator.php:1197, src/restorer.php:2189
5839
  msgid "the database query being run was:"
5840
  msgstr ""
5841
 
5842
+ #: src/restorer.php:1891
5843
  msgid "will restore as:"
5844
  msgstr ""
5845
 
5846
+ #: src/class-updraftplus.php:4444, src/restorer.php:1695,
5847
+ #: src/restorer.php:1784, src/restorer.php:1810
5848
  msgid "Old table prefix:"
5849
  msgstr ""
5850
 
5851
+ #: src/addons/reporting.php:70, src/addons/reporting.php:180,
5852
+ #: src/backup.php:1010, src/class-updraftplus.php:4383
5853
  msgid "Backup of:"
5854
  msgstr ""
5855
 
5856
+ #: src/restorer.php:1505
5857
  msgid "Failed to open database file"
5858
  msgstr ""
5859
 
5860
+ #: src/restorer.php:1484
5861
  msgid "Failed to find database file"
5862
  msgstr ""
5863
 
5864
+ #: src/restorer.php:1461
5865
  msgid "Warning: PHP safe_mode is active on your server. Timeouts are much more likely. If these happen, then you will need to manually restore the file via phpMyAdmin or another method."
5866
  msgstr ""
5867
 
5921
  msgid "UpdraftPlus is not able to directly restore this kind of entity. It must be restored manually."
5922
  msgstr ""
5923
 
5924
+ #: src/admin.php:4058, src/admin.php:4059
5925
  msgid "Could not find one of the files for restoration"
5926
  msgstr ""
5927
 
5928
+ #: src/admin.php:4172
5929
  msgid "Error message"
5930
  msgstr ""
5931
 
5932
+ #: src/admin.php:4055
5933
  msgid "The backup records do not contain information about the proper size of this file."
5934
  msgstr ""
5935
 
5936
+ #: src/admin.php:4047
5937
  msgid "Archive is expected to be size:"
5938
  msgstr ""
5939
 
5940
+ #: src/admin.php:3944
5941
  msgid "If making a request for support, please include this information:"
5942
  msgstr ""
5943
 
5944
+ #: src/admin.php:3943
5945
  msgid "ABORT: Could not find the information on which entities to restore."
5946
  msgstr ""
5947
 
5948
+ #: src/admin.php:3898
5949
  msgid "UpdraftPlus Restoration: Progress"
5950
  msgstr ""
5951
 
5952
+ #: src/admin.php:3851
5953
  msgid "This backup does not exist in the backup history - restoration aborted. Timestamp:"
5954
  msgstr ""
5955
 
5956
+ #: src/admin.php:3786
5957
  msgid "After pressing this button, you will be given the option to choose which components you wish to restore"
5958
  msgstr ""
5959
 
5960
+ #: src/admin.php:3804
5961
  msgid "Delete this backup set"
5962
  msgstr ""
5963
 
5964
+ #: src/admin.php:3446
5965
  msgid "Good news: Your site's communications with %s can be encrypted. If you see any errors to do with encryption, then look in the 'Expert Settings' for more help."
5966
  msgstr ""
5967
 
5968
+ #: src/admin.php:3443
5969
  msgid "Your web server's PHP/Curl installation does not support https access. We cannot access %s without this support. Please contact your web hosting provider's support. %s <strong>requires</strong> Curl+https. Please do not file any support requests; there is no alternative."
5970
  msgstr ""
5971
 
5972
+ #: src/admin.php:3441
5973
  msgid "Your web server's PHP/Curl installation does not support https access. Communications with %s will be unencrypted. Ask your web host to install Curl/SSL in order to gain the ability for encryption (via an add-on)."
5974
  msgstr ""
5975
 
5976
+ #: src/methods/cloudfiles-new.php:101, src/methods/cloudfiles.php:462,
5977
+ #: src/methods/openstack-base.php:549, src/methods/openstack-base.php:590,
5978
+ #: src/methods/s3.php:832, src/methods/s3.php:946
5979
  msgid "Your web server's PHP installation does not included a required module (%s). Please contact your web hosting provider's support."
5980
  msgstr ""
5981
 
6011
  msgid "Use the server's SSL certificates"
6012
  msgstr ""
6013
 
6014
+ #: src/admin.php:3289
6015
  msgid "If that is unsuccessful check the permissions on your server or change it to another directory that is writable by your web server process."
6016
  msgstr ""
6017
 
6018
+ #: src/admin.php:3289
6019
  msgid "click here"
6020
  msgstr ""
6021
 
6022
+ #: src/admin.php:3289
6023
  msgid "or, to reset this option"
6024
  msgstr ""
6025
 
6026
+ #: src/admin.php:3289
6027
  msgid "Follow this link to attempt to create the directory and set the permissions"
6028
  msgstr ""
6029
 
6030
+ #: src/admin.php:3281
6031
  msgid "Backup directory specified is writable, which is good."
6032
  msgstr ""
6033
 
6059
  msgid "Advanced / Debugging Settings"
6060
  msgstr ""
6061
 
6062
+ #: src/admin.php:682
6063
  msgid "Requesting start of backup..."
6064
  msgstr ""
6065
 
6066
+ #: src/addons/morefiles.php:297, src/admin.php:698
6067
  msgid "Cancel"
6068
  msgstr ""
6069
 
6070
+ #: src/addons/reporting.php:244, src/admin.php:3593
6071
  msgid "None"
6072
  msgstr ""
6073
 
6092
  msgid "The above directories are everything, except for WordPress core itself which you can download afresh from WordPress.org."
6093
  msgstr ""
6094
 
6095
+ #: src/addons/morefiles.php:443, src/admin.php:3371
6096
  msgid "Exclude these:"
6097
  msgstr ""
6098
 
6099
+ #: src/admin.php:3362
6100
  msgid "Any other directories found inside wp-content"
6101
  msgstr ""
6102
 
6112
  msgid "To fix the time at which a backup should take place,"
6113
  msgstr ""
6114
 
6115
+ #: src/admin.php:3275
6116
  msgid "Monthly"
6117
  msgstr ""
6118
 
6119
+ #: src/admin.php:3274
6120
  msgid "Fortnightly"
6121
  msgstr ""
6122
 
6123
+ #: src/admin.php:3273
6124
  msgid "Weekly"
6125
  msgstr ""
6126
 
6127
+ #: src/admin.php:3272
6128
  msgid "Daily"
6129
  msgstr ""
6130
 
6131
+ #: src/admin.php:705, src/admin.php:3250
6132
  msgid "Download log file"
6133
  msgstr ""
6134
 
6135
+ #: src/admin.php:3122
6136
  msgid "The folder exists, but your webserver does not have permission to write to it."
6137
  msgstr ""
6138
 
6139
+ #: src/admin.php:3117
6140
  msgid "The folder was created, but we had to change its file permissions to 777 (world-writable) to be able to write to it. You should check with your hosting provider that this will not cause any problems"
6141
  msgstr ""
6142
 
6143
+ #: src/admin.php:3103
6144
  msgid "The request to the filesystem to create the directory failed."
6145
  msgstr ""
6146
 
6147
+ #: src/addons/migrator.php:2321, src/admin.php:699, src/admin.php:3015,
6148
+ #: src/admin.php:3048, src/admin.php:3804,
6149
  #: src/templates/wp-admin/settings/delete-and-restore-modals.php:5
6150
  msgid "Delete"
6151
  msgstr ""
6152
 
6153
+ #: src/admin.php:2953
 
 
 
 
6154
  msgid "show log"
6155
  msgstr ""
6156
 
6255
  msgid "Multisite"
6256
  msgstr ""
6257
 
 
 
 
 
6258
  #: src/templates/wp-admin/settings/tab-status.php:86
6259
  msgid "Perform a one-time backup"
6260
  msgstr ""
6304
  msgid "Delete backup set"
6305
  msgstr ""
6306
 
6307
+ #: src/admin.php:681
6308
  msgid "Download error: the server sent us a response which we did not understand."
6309
  msgstr ""
6310
 
6311
  #: src/addons/backblaze.php:209, src/addons/cloudfiles-enhanced.php:102,
6312
+ #: src/addons/migrator.php:783, src/addons/migrator.php:1067,
6313
+ #: src/addons/migrator.php:1148, src/addons/migrator.php:1197,
6314
+ #: src/addons/migrator.php:1431, src/addons/migrator.php:1782,
6315
+ #: src/addons/migrator.php:1809, src/addons/migrator.php:1815,
6316
+ #: src/addons/migrator.php:1877, src/addons/migrator.php:1917,
6317
+ #: src/addons/migrator.php:1956, src/addons/migrator.php:1966,
6318
+ #: src/addons/migrator.php:1971, src/addons/s3-enhanced.php:127,
6319
  #: src/addons/s3-enhanced.php:132, src/addons/s3-enhanced.php:134,
6320
+ #: src/addons/sftp.php:818, src/addons/webdav.php:108, src/admin.php:87,
6321
+ #: src/admin.php:673, src/admin.php:4052, src/admin.php:4082,
6322
  #: src/methods/remotesend.php:71, src/methods/remotesend.php:239,
6323
+ #: src/methods/updraftvault.php:490, src/restorer.php:1414
6324
  msgid "Error:"
6325
  msgstr ""
6326
 
6327
+ #: src/admin.php:664,
6328
  #: src/templates/wp-admin/settings/downloading-and-restoring.php:32
6329
  msgid "calculating..."
6330
  msgstr ""
6345
  msgid "This is a count of the contents of your Updraft directory"
6346
  msgstr ""
6347
 
6348
+ #: src/addons/google-enhanced.php:64, src/methods/googledrive.php:176,
6349
+ #: src/methods/googledrive.php:178, src/methods/googledrive.php:434,
6350
+ #: src/methods/googledrive.php:461, src/methods/googledrive.php:490,
6351
+ #: src/methods/googledrive.php:497, src/methods/googledrive.php:507,
6352
+ #: src/methods/googledrive.php:513, src/methods/googledrive.php:515,
6353
+ #: src/methods/googledrive.php:1083, src/methods/googledrive.php:1096,
6354
+ #: src/methods/googledrive.php:1096, src/methods/googledrive.php:1113,
6355
+ #: src/methods/googledrive.php:1117, src/methods/googledrive.php:1128,
6356
+ #: src/methods/googledrive.php:1139, src/methods/googledrive.php:1159
6357
  msgid "Google Drive"
6358
  msgstr ""
6359
 
6369
  msgid "More tasks:"
6370
  msgstr ""
6371
 
6372
+ #: src/admin.php:2711
6373
  msgid "Download most recently modified log file"
6374
  msgstr ""
6375
 
6376
+ #: src/admin.php:2667, src/admin.php:2673, src/central/bootstrap.php:174
6377
  msgid "(Nothing yet logged)"
6378
  msgstr ""
6379
 
6380
  #: src/addons/autobackup.php:325, src/addons/autobackup.php:420,
6381
+ #: src/admin.php:2666, src/admin.php:2671
6382
  msgid "Last log message"
6383
  msgstr ""
6384
 
6385
+ #: src/addons/migrator.php:235, src/admin.php:704, src/admin.php:3786,
6386
  #: src/templates/wp-admin/settings/tab-status.php:30
6387
  msgid "Restore"
6388
  msgstr ""
6389
 
6390
+ #: src/admin.php:526, src/admin.php:697,
6391
  #: src/templates/wp-admin/settings/tab-status.php:27
6392
  msgid "Backup Now"
6393
  msgstr ""
6394
 
6395
+ #: src/addons/migrator.php:1847, src/addons/moredatabase.php:247,
6396
+ #: src/addons/reporting.php:259, src/admin.php:309, src/admin.php:3568,
6397
+ #: src/admin.php:3648, src/admin.php:4136,
6398
  #: src/includes/class-wpadmin-commands.php:147,
6399
  #: src/includes/class-wpadmin-commands.php:480,
6400
  #: src/templates/wp-admin/settings/delete-and-restore-modals.php:81,
6402
  msgid "Database"
6403
  msgstr ""
6404
 
6405
+ #: src/admin.php:305, src/admin.php:4657
6406
  msgid "Files"
6407
  msgstr ""
6408
 
6414
  msgid "All the times shown in this section are using WordPress's configured time zone, which you can set in Settings -> General"
6415
  msgstr ""
6416
 
6417
+ #: src/admin.php:285
6418
  msgid "At the same time as the files backup"
6419
  msgstr ""
6420
 
6421
+ #: src/admin.php:275, src/admin.php:296, src/admin.php:303
6422
  msgid "Nothing currently scheduled"
6423
  msgstr ""
6424
 
6430
  msgid "JavaScript warning"
6431
  msgstr ""
6432
 
6433
+ #: src/admin.php:684, src/admin.php:2738
6434
  msgid "Delete Old Directories"
6435
  msgstr ""
6436
 
6437
+ #: src/admin.php:2458
6438
  msgid "Current limit is:"
6439
  msgstr ""
6440
 
6441
+ #: src/admin.php:2433
6442
  msgid "Your backup has been restored."
6443
  msgstr ""
6444
 
6450
  msgid "Lead developer's homepage"
6451
  msgstr ""
6452
 
6453
+ #: src/central/bootstrap.php:491
6454
+ msgid "UpdraftPlus.Com"
6455
+ msgstr ""
6456
+
6457
+ #: src/admin.php:4549
6458
  msgid "Your settings have been wiped."
6459
  msgstr ""
6460
 
6461
+ #: src/admin.php:2393
6462
  msgid "Backup directory successfully created."
6463
  msgstr ""
6464
 
6465
+ #: src/admin.php:2386
6466
  msgid "Backup directory could not be created"
6467
  msgstr ""
6468
 
6469
+ #: src/admin.php:2985
6470
  msgid "Old directory removal failed for some reason. You may want to do this manually."
6471
  msgstr ""
6472
 
6473
+ #: src/admin.php:2983
6474
  msgid "Old directories successfully removed."
6475
  msgstr ""
6476
 
6477
+ #: src/admin.php:2980, src/admin.php:2980
6478
  msgid "Remove old directories"
6479
  msgstr ""
6480
 
6481
+ #: src/addons/migrator.php:300, src/addons/migrator.php:315,
6482
+ #: src/admin.php:2335, src/admin.php:2344, src/admin.php:2353,
6483
+ #: src/admin.php:2395, src/admin.php:2987
6484
  msgid "Return to UpdraftPlus Configuration"
6485
  msgstr ""
6486
 
6487
+ #: src/admin.php:677, src/admin.php:2335, src/admin.php:2344,
6488
+ #: src/admin.php:2353, src/admin.php:2395, src/admin.php:2987,
6489
  #: src/templates/wp-admin/settings/existing-backups-table.php:16
6490
  msgid "Actions"
6491
  msgstr ""
6492
 
6493
+ #: src/admin.php:2255
6494
  msgid "Bad filename format - this does not look like an encrypted database file created by UpdraftPlus"
6495
  msgstr ""
6496
 
6497
+ #: src/admin.php:2161
6498
  msgid "Bad filename format - this does not look like a file created by UpdraftPlus"
6499
  msgstr ""
6500
 
6501
+ #: src/admin.php:2033
6502
  msgid "No local copy present."
6503
  msgstr ""
6504
 
6505
+ #: src/admin.php:2030
6506
  msgid "Download in progress"
6507
  msgstr ""
6508
 
6509
+ #: src/admin.php:676, src/admin.php:2019
6510
  msgid "File ready."
6511
  msgstr ""
6512
 
6513
+ #: src/admin.php:2000
6514
  msgid "Download failed"
6515
  msgstr ""
6516
 
6517
+ #: src/admin.php:674, src/admin.php:1290, src/admin.php:1764,
6518
+ #: src/class-updraftplus.php:1215, src/class-updraftplus.php:1259,
6519
  #: src/methods/addon-base-v2.php:95, src/methods/addon-base-v2.php:100,
6520
  #: src/methods/addon-base-v2.php:205, src/methods/addon-base-v2.php:225,
6521
+ #: src/methods/stream-base.php:200, src/restorer.php:2288,
6522
+ #: src/restorer.php:2313, src/restorer.php:2394, src/updraftplus.php:156
6523
  msgid "Error"
6524
  msgstr ""
6525
 
6526
+ #: src/admin.php:1799
6527
  msgid "Could not find that job - perhaps it has already finished?"
6528
  msgstr ""
6529
 
6530
+ #: src/admin.php:1791
6531
  msgid "Job deleted"
6532
  msgstr ""
6533
 
6534
+ #: src/admin.php:1880
6535
  msgid "OK. You should soon see activity in the \"Last log message\" field below."
6536
  msgstr ""
6537
 
6538
+ #: src/admin.php:749
6539
  msgid "Nothing yet logged"
6540
  msgstr ""
6541
 
6542
+ #: src/admin.php:970
6543
  msgid "Please consult this FAQ if you have problems backing up."
6544
  msgstr ""
6545
 
6546
+ #: src/admin.php:970
6547
  msgid "Your website is hosted using the %s web server."
6548
  msgstr ""
6549
 
6550
+ #: src/admin.php:966
6551
  msgid "UpdraftPlus does not officially support versions of WordPress before %s. It may work for you, but if it does not, then please be aware that no support is available until you upgrade WordPress."
6552
  msgstr ""
6553
 
6554
+ #: src/admin.php:962
6555
  msgid "You have less than %s of free disk space on the disk which UpdraftPlus is configured to use to create backups. UpdraftPlus could well run out of space. Contact your the operator of your server (e.g. your web hosting company) to resolve this issue."
6556
  msgstr ""
6557
 
6558
+ #: src/addons/migrator.php:838, src/admin.php:954, src/admin.php:958,
6559
+ #: src/admin.php:962, src/admin.php:966, src/admin.php:970, src/admin.php:979,
6560
+ #: src/admin.php:3434, src/admin.php:3441, src/admin.php:3443,
6561
+ #: src/methods/cloudfiles-new.php:101, src/methods/cloudfiles.php:462,
6562
+ #: src/methods/ftp.php:309, src/methods/openstack-base.php:549,
6563
+ #: src/methods/openstack-base.php:590, src/methods/s3.php:828,
6564
+ #: src/methods/s3.php:832, src/methods/s3.php:942, src/methods/s3.php:946,
6565
+ #: src/methods/updraftvault.php:283,
6566
  #: src/templates/wp-admin/settings/downloading-and-restoring.php:27,
6567
+ #: src/udaddons/updraftplus-addons.php:253
6568
  msgid "Warning"
6569
  msgstr ""
6570
 
6571
+ #: src/admin.php:900
6572
  msgid "Add-Ons / Pro Support"
6573
  msgstr ""
6574
 
6575
+ #: src/admin.php:542, src/admin.php:898,
6576
  #: src/templates/wp-admin/settings/tab-bar.php:7
6577
  msgid "Settings"
6578
  msgstr ""
6579
 
6580
+ #: src/backup.php:261
6581
  msgid "Could not create %s zip. Consult the log file for more information."
6582
  msgstr ""
6583
 
6584
+ #: src/backup.php:2178
6585
  msgid "Infinite recursion: consult your log for more information"
6586
  msgstr ""
6587
 
6593
  msgid "Like UpdraftPlus and can spare one minute?"
6594
  msgstr ""
6595
 
6596
+ #: src/addons/azure.php:218, src/class-updraftplus.php:4102,
6597
+ #: src/methods/googledrive.php:1012, src/methods/s3.php:322
6598
  msgid "File not found"
6599
  msgstr ""
6600
 
6601
+ #: src/class-updraftplus.php:4009
6602
  msgid "The decryption key used:"
6603
  msgstr ""
6604
 
6605
+ #: src/class-updraftplus.php:4009, src/class-updraftplus.php:4318,
6606
  #: src/restorer.php:389
6607
  msgid "Decryption failed. The most likely cause is that you used the wrong key."
6608
  msgstr ""
6609
 
6610
+ #: src/class-updraftplus.php:3990, src/class-updraftplus.php:4306,
6611
  #: src/restorer.php:376
6612
  msgid "Decryption failed. The database file is encrypted, but you have no encryption key entered."
6613
  msgstr ""
6614
 
6615
+ #: src/backup.php:2053
6616
  msgid "Could not open the backup file for writing"
6617
  msgstr ""
6618
 
6619
+ #: src/class-updraftplus.php:3376
6620
  msgid "Could not save backup history because we have no backup array. Backup probably failed."
6621
  msgstr ""
6622
 
6623
+ #: src/class-updraftplus.php:3337
6624
  msgid "Could not read the directory"
6625
  msgstr ""
6626
 
6627
+ #: src/admin.php:2077, src/backup.php:1234
6628
  msgid "Backup directory (%s) is not writable, or does not exist."
6629
  msgstr ""
6630
 
6631
+ #: src/backup.php:1011
6632
  msgid "WordPress backup is complete"
6633
  msgstr ""
6634
 
6635
+ #: src/class-updraftplus.php:2849
6636
  msgid "The backup attempt has finished, apparently unsuccessfully"
6637
  msgstr ""
6638
 
6639
+ #: src/class-updraftplus.php:2834
6640
  msgid "The backup apparently succeeded and is now complete"
6641
  msgstr ""
6642
 
6644
  msgid "Encryption error occurred when encrypting database. Encryption aborted."
6645
  msgstr ""
6646
 
6647
+ #: src/class-updraftplus.php:2537
6648
  msgid "Could not create files in the backup directory. Backup aborted - check your UpdraftPlus settings."
6649
  msgstr ""
6650
 
6651
+ #: src/class-updraftplus.php:1816
6652
  msgid "Others"
6653
  msgstr ""
6654
 
6655
+ #: src/addons/multisite.php:467, src/class-updraftplus.php:1801
6656
  msgid "Uploads"
6657
  msgstr ""
6658
 
6659
+ #: src/class-updraftplus.php:1800
6660
  msgid "Themes"
6661
  msgstr ""
6662
 
6663
+ #: src/class-updraftplus.php:1799
6664
  msgid "Plugins"
6665
  msgstr ""
6666
 
6667
+ #: src/class-updraftplus.php:578
6668
  msgid "No log files were found."
6669
  msgstr ""
6670
 
6671
+ #: src/admin.php:1949, src/admin.php:1953, src/class-updraftplus.php:573
6672
  msgid "The log file could not be read."
6673
  msgstr ""
6674
 
6675
+ #: src/admin.php:989, src/admin.php:998, src/admin.php:1003,
6676
+ #: src/admin.php:1011, src/admin.php:1020, src/class-updraftplus.php:538,
6677
+ #: src/class-updraftplus.php:573, src/class-updraftplus.php:578,
6678
+ #: src/class-updraftplus.php:583
6679
  msgid "UpdraftPlus notice:"
6680
  msgstr ""
6681
 
languages/updraftplus-ar.mo CHANGED
Binary file
languages/updraftplus-ar.po CHANGED
@@ -11,19 +11,122 @@ msgstr ""
11
  "Language: ar\n"
12
  "Project-Id-Version: UpdraftPlus\n"
13
 
14
- #: src/restorer.php:1872
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  msgid "Requested table character set (%s) is not present - changing to %s."
16
  msgstr ""
17
 
18
- #: src/class-updraftplus.php:4506
19
  msgid "Your chosen character set to use instead:"
20
  msgstr ""
21
 
22
- #: src/class-updraftplus.php:4499
23
  msgid "You can choose another suitable character set instead and continue with the restoration at your own risk."
24
  msgstr ""
25
 
26
- #: src/class-updraftplus.php:4499
27
  msgid "The database server that this WordPress site is running on doesn't support the character set (%s) which you are trying to import."
28
  msgid_plural "The database server that this WordPress site is running on doesn't support the character sets (%s) which you are trying to import."
29
  msgstr[0] ""
@@ -33,59 +136,51 @@ msgstr[3] ""
33
  msgstr[4] ""
34
  msgstr[5] ""
35
 
36
- #: src/central/bootstrap.php:572
37
  msgid "Create another key"
38
  msgstr ""
39
 
40
- #: src/central/bootstrap.php:501
41
  msgid "UpdraftCentral dashboard connection details"
42
  msgstr ""
43
 
44
- #: src/central/bootstrap.php:495
45
  msgid "Next"
46
  msgstr ""
47
 
48
- #: src/central/bootstrap.php:490
49
- msgid "the UpdraftCentral dashboard plugin"
50
- msgstr ""
51
-
52
- #: src/central/bootstrap.php:490
53
- msgid "On my own website on which I have installed"
54
- msgstr ""
55
-
56
- #: src/central/bootstrap.php:485
57
  msgid "an account"
58
  msgstr ""
59
 
60
- #: src/central/bootstrap.php:485
61
  msgid "i.e. if you have %s there"
62
  msgstr ""
63
 
64
- #: src/central/bootstrap.php:477
65
  msgid "Connect this site to an UpdraftCentral dashboard found at..."
66
  msgstr ""
67
 
68
- #: src/central/bootstrap.php:451
69
  msgid "Manage existing keys (%d)..."
70
  msgstr ""
71
 
72
- #: src/central/bootstrap.php:401
73
  msgid "There are no UpdraftCentral dashboards that can currently control this site."
74
  msgstr ""
75
 
76
- #: src/central/bootstrap.php:238
77
  msgid "You can now control this site via your UpdraftCentral dashboard at %s."
78
  msgstr ""
79
 
80
- #: src/central/bootstrap.php:236
81
  msgid "Detailed instructions for this can be found at %s"
82
  msgstr ""
83
 
84
- #: src/central/bootstrap.php:236
85
  msgid "You now need to copy the key below and enter it at your %s."
86
  msgstr ""
87
 
88
- #: src/admin.php:761
89
  msgid "Please enter a valid URL e.g http://example.com"
90
  msgstr ""
91
 
@@ -137,31 +232,31 @@ msgstr ""
137
  msgid "Account ID"
138
  msgstr ""
139
 
140
- #: src/class-updraftplus.php:4377
141
  msgid "As long as your web hosting allows http (i.e. non-SSL access) or will forward requests to https (which is almost always the case), this is no problem. If that is not yet set up, then you should set it up, or use %s so that the non-https links are automatically replaced."
142
  msgstr ""
143
 
144
- #: src/class-updraftplus.php:4375, src/class-updraftplus.php:4377
145
  msgid "the migrator add-on"
146
  msgstr ""
147
 
148
- #: src/class-updraftplus.php:4375
149
  msgid "This restoration will work if you still have an SSL certificate (i.e. can use https) to access the site. Otherwise, you will want to use %s to search/replace the site address so that the site can be visited without https."
150
  msgstr ""
151
 
152
- #: src/class-updraftplus.php:4373
153
  msgid "This backup set is of this site, but at the time of the backup you were using %s, whereas the site now uses %s."
154
  msgstr ""
155
 
156
- #: src/class-updraftplus.php:4370
157
  msgid "The website address in the backup set (%s) is slightly different from that of the site now (%s). This is not expected to be a problem for restoring the site, as long as visits to the former address still reach the site."
158
  msgstr ""
159
 
160
- #: src/methods/googledrive.php:1153
161
  msgid "To de-authorize UpdraftPlus (all sites) from accessing your Google Drive, follow this link to your Google account settings."
162
  msgstr ""
163
 
164
- #: src/methods/googledrive.php:1149
165
  msgid "Follow this link to remove this site's settings for %s."
166
  msgstr ""
167
 
@@ -169,29 +264,31 @@ msgstr ""
169
  msgid "UpdraftPlus debug mode is on: detailed debugging data follows."
170
  msgstr ""
171
 
172
- #: src/admin.php:742
173
  msgid "Error: The chosen file is corrupt. Please choose a valid UpdraftPlus export file."
174
  msgstr ""
175
 
176
- #: src/admin.php:1292, src/admin.php:3976, src/class-updraftplus.php:2125,
177
- #: src/class-updraftplus.php:2190, src/class-updraftplus.php:2324
 
178
  msgid "A PHP fatal error (%s) has occurred: %s"
179
  msgstr ""
180
 
181
- #: src/admin.php:1285, src/admin.php:3968, src/class-updraftplus.php:2118,
182
- #: src/class-updraftplus.php:2183, src/class-updraftplus.php:2317
 
183
  msgid "A PHP exception (%s) has occurred: %s"
184
  msgstr ""
185
 
186
- #: src/addons/googlecloud.php:56
187
  msgid "South-east Australia"
188
  msgstr ""
189
 
190
- #: src/addons/googlecloud.php:55
191
  msgid "South-east Asia"
192
  msgstr ""
193
 
194
- #: src/addons/googlecloud.php:54
195
  msgid "North-east Asia"
196
  msgstr ""
197
 
@@ -223,7 +320,7 @@ msgstr ""
223
  msgid "Select Files"
224
  msgstr ""
225
 
226
- #: src/methods/cloudfiles.php:497
227
  msgid "Rackspace Storage Region"
228
  msgstr ""
229
 
@@ -235,19 +332,19 @@ msgstr ""
235
  msgid "Instant and secure logon with a wave of your phone."
236
  msgstr ""
237
 
238
- #: src/backup.php:1909
239
  msgid "As previously warned (see: %s), encryption is no longer a feature of the free edition of UpdraftPlus"
240
  msgstr ""
241
 
242
- #: src/admin.php:4465
243
  msgid "Value"
244
  msgstr ""
245
 
246
- #: src/admin.php:1557
247
  msgid "Did not know how to delete from this cloud service."
248
  msgstr ""
249
 
250
- #: src/addons/sftp.php:696
251
  msgid "Encrypted login failed; trying non-encrypted"
252
  msgstr ""
253
 
@@ -255,7 +352,7 @@ msgstr ""
255
  msgid "__Check this box to use Amazon's server-side encryption"
256
  msgstr ""
257
 
258
- #: src/addons/azure.php:549
259
  msgid "You must add the following as the authorised redirect URI in your Azure console (under \"API Settings\") when asked"
260
  msgstr ""
261
 
@@ -263,15 +360,15 @@ msgstr ""
263
  msgid "Stored at: %s"
264
  msgstr ""
265
 
266
- #: src/methods/cloudfiles.php:520
267
  msgid "Cloud Files"
268
  msgstr ""
269
 
270
- #: src/admin.php:4303
271
  msgid "Your settings failed to save. Please refresh the settings page and try again"
272
  msgstr ""
273
 
274
- #: src/admin.php:4262
275
  msgid "UpdraftPlus seems to have been updated to version (%s), which is different to the version running when this settings page was loaded. Please reload the settings page before trying to save settings."
276
  msgstr ""
277
 
@@ -288,87 +385,87 @@ msgstr ""
288
  msgid "Extra database"
289
  msgstr ""
290
 
291
- #: src/admin.php:3545
292
  msgid "Press here to download or browse"
293
  msgstr ""
294
 
295
- #: src/admin.php:1074, src/admin.php:1084
296
  msgid "Error: invalid path"
297
  msgstr ""
298
 
299
- #: src/admin.php:932
300
  msgid "An error occurred when fetching storage module options: "
301
  msgstr ""
302
 
303
- #: src/admin.php:758
304
  msgid "Loading log file"
305
  msgstr ""
306
 
307
- #: src/admin.php:757
308
  msgid "Unable to download file. This could be caused by a timeout. It would be best to download the zip to your computer."
309
  msgstr ""
310
 
311
- #: src/admin.php:756
312
  msgid "Search"
313
  msgstr ""
314
 
315
- #: src/admin.php:755
316
  msgid "Select a file to view information about it"
317
  msgstr ""
318
 
319
- #: src/admin.php:754
320
  msgid "Browsing zip file"
321
  msgstr ""
322
 
323
- #: src/admin.php:723
324
  msgid "With UpdraftPlus Premium, you can directly download individual files from here."
325
  msgstr ""
326
 
327
- #: src/admin.php:671
328
  msgid "Browse contents"
329
  msgstr ""
330
 
331
- #: src/restorer.php:1693
332
  msgid "Skipped tables:"
333
  msgstr ""
334
 
335
- #: src/class-updraftplus.php:4557
336
  msgid "This database backup has the following WordPress tables excluded: %s"
337
  msgstr ""
338
 
339
- #: src/admin.php:2524
340
  msgid "With UpdraftPlus Premium, you can choose to backup non-WordPress tables, backup only specified tables, and backup other databases too."
341
  msgstr ""
342
 
343
- #: src/admin.php:2524
344
  msgid "All WordPress tables will be backed up."
345
  msgstr ""
346
 
347
- #: src/admin.php:753
348
  msgid "Further information may be found in the browser JavaScript console, and the server PHP error logs."
349
  msgstr ""
350
 
351
- #: src/admin.php:753
352
  msgid "That you are attempting to upload a zip file previously created by UpdraftPlus."
353
  msgstr ""
354
 
355
- #: src/admin.php:753
356
  msgid "The available memory on the server."
357
  msgstr ""
358
 
359
- #: src/admin.php:753
360
  msgid "Any settings in your .htaccess or web.config file that affects the maximum upload or post size."
361
  msgstr ""
362
 
363
- #: src/admin.php:753
364
  msgid "The file failed to upload. Please check the following:"
365
  msgstr ""
366
 
367
- #: src/admin.php:752
368
  msgid "HTTP code:"
369
  msgstr ""
370
 
371
- #: src/admin.php:648
372
  msgid "You have chosen to backup a database, but no tables have been selected"
373
  msgstr ""
374
 
@@ -664,31 +761,31 @@ msgstr ""
664
  msgid "Apache modules"
665
  msgstr ""
666
 
667
- #: src/includes/updraftplus-notices.php:255
668
  msgid "Summer sale - 20% off UpdraftPlus Premium until July 31st"
669
  msgstr ""
670
 
671
- #: src/includes/updraftplus-notices.php:242
672
  msgid "Spring sale - 20% off UpdraftPlus Premium until April 31st"
673
  msgstr ""
674
 
675
- #: src/includes/updraftplus-notices.php:229
676
  msgid "Happy New Year - 20% off UpdraftPlus Premium until January 1st"
677
  msgstr ""
678
 
679
- #: src/includes/updraftplus-notices.php:216
680
  msgid "Christmas sale - 20% off UpdraftPlus Premium until December 25th"
681
  msgstr ""
682
 
683
- #: src/includes/updraftplus-notices.php:204,
684
- #: src/includes/updraftplus-notices.php:217,
685
- #: src/includes/updraftplus-notices.php:230,
686
- #: src/includes/updraftplus-notices.php:243,
687
- #: src/includes/updraftplus-notices.php:256
688
  msgid "To benefit, use this discount code:"
689
  msgstr ""
690
 
691
- #: src/includes/updraftplus-notices.php:203
692
  msgid "Black Friday - 20% off UpdraftPlus Premium until November 30th"
693
  msgstr ""
694
 
@@ -832,35 +929,35 @@ msgstr ""
832
  msgid "Export / import settings"
833
  msgstr ""
834
 
835
- #: src/restorer.php:1881
836
  msgid "Processing table (%s)"
837
  msgstr ""
838
 
839
- #: src/restorer.php:1659
840
  msgid "Backup of: %s"
841
  msgstr ""
842
 
843
- #: src/methods/googledrive.php:248
844
  msgid "The client has been deleted from the Google Drive API console. Please create a new Google Drive project and reconnect with UpdraftPlus."
845
  msgstr ""
846
 
847
- #: src/methods/dropbox.php:598
848
  msgid "%s de-authentication"
849
  msgstr ""
850
 
851
- #: src/methods/dropbox.php:563
852
  msgid "You must add the following as the authorised redirect URI in your Dropbox console (under \"API Settings\") when asked"
853
  msgstr ""
854
 
855
- #: src/methods/dropbox.php:532
856
  msgid "Follow this link to deauthenticate with %s."
857
  msgstr ""
858
 
859
- #: src/central/bootstrap.php:567
860
  msgid "UpdraftCentral enables control of your WordPress sites (including management of backups and updates) from a central dashboard."
861
  msgstr ""
862
 
863
- #: src/backup.php:1529
864
  msgid "If not, you will need to either remove data from this table, or contact your hosting company to request more resources."
865
  msgstr ""
866
 
@@ -868,51 +965,51 @@ msgstr ""
868
  msgid "You have selected a remote storage option which has an authorization step to complete:"
869
  msgstr ""
870
 
871
- #: src/admin.php:1633
872
  msgid "Remote files deleted:"
873
  msgstr ""
874
 
875
- #: src/admin.php:1632
876
  msgid "Local files deleted:"
877
  msgstr ""
878
 
879
- #: src/admin.php:977, src/admin.php:981, src/admin.php:989, src/admin.php:993
880
  msgid "Follow this link to authorize access to your %s account (you will not be able to back up to %s without it)."
881
  msgstr ""
882
 
883
- #: src/admin.php:751
884
  msgid "remote files deleted"
885
  msgstr ""
886
 
887
- #: src/admin.php:749
888
  msgid "Complete"
889
  msgstr ""
890
 
891
- #: src/admin.php:748
892
  msgid "Do you want to carry out the import?"
893
  msgstr ""
894
 
895
- #: src/admin.php:747
896
  msgid "Which was exported on:"
897
  msgstr ""
898
 
899
- #: src/admin.php:746
900
  msgid "This will import data from:"
901
  msgstr ""
902
 
903
- #: src/admin.php:745
904
  msgid "Importing..."
905
  msgstr ""
906
 
907
- #: src/admin.php:741
908
  msgid "You have not yet selected a file to import."
909
  msgstr ""
910
 
911
- #: src/admin.php:725
912
  msgid "Your export file will be of your displayed settings, not your saved ones."
913
  msgstr ""
914
 
915
- #: src/admin.php:84
916
  msgid "template not found"
917
  msgstr ""
918
 
@@ -920,28 +1017,28 @@ msgstr ""
920
  msgid "US East (Ohio)"
921
  msgstr ""
922
 
923
- #: src/addons/onedrive.php:946
924
  msgid "This site uses a URL which is either non-HTTPS, or is localhost or 127.0.0.1 URL. As such, you must use the main %s %s App to authenticate with your account."
925
  msgstr ""
926
 
927
- #: src/addons/onedrive.php:634
928
  msgid "Account is not authorized (%s)."
929
  msgstr ""
930
 
931
- #: src/addons/onedrive.php:595, src/udaddons/updraftplus-addons.php:802
932
  msgid "Your IP address:"
933
  msgstr ""
934
 
935
- #: src/addons/onedrive.php:595, src/udaddons/updraftplus-addons.php:802,
936
- #: src/udaddons/updraftplus-addons.php:816
937
  msgid "To remove any block, please go here."
938
  msgstr ""
939
 
940
- #: src/addons/onedrive.php:580, src/udaddons/updraftplus-addons.php:787
941
  msgid "An error response was received; HTTP code:"
942
  msgstr ""
943
 
944
- #: src/includes/class-commands.php:322
945
  msgid "%s add-on not found"
946
  msgstr ""
947
 
@@ -953,47 +1050,47 @@ msgstr ""
953
  msgid "This makes time-outs much more likely. You are recommended to turn safe_mode off, or to restore only one entity at a time"
954
  msgstr ""
955
 
956
- #: src/admin.php:2348
957
  msgid "To fix this problem go here."
958
  msgstr ""
959
 
960
- #: src/admin.php:2348
961
  msgid "OptimizePress 2.0 encodes its contents, so search/replace does not work."
962
  msgstr ""
963
 
964
- #: src/admin.php:709
965
  msgid "your PHP install lacks the openssl module; as a result, this can take minutes; if nothing has happened by then, then you should either try a smaller key size, or ask your web hosting company how to enable this PHP module on your setup."
966
  msgstr ""
967
 
968
- #: src/addons/webdav.php:132
969
  msgid "Path"
970
  msgstr ""
971
 
972
- #: src/addons/webdav.php:127
973
  msgid "Leave this blank to use the default (80 for webdav, 443 for webdavs)"
974
  msgstr ""
975
 
976
- #: src/addons/webdav.php:119
977
  msgid "Enter any path in the field below."
978
  msgstr ""
979
 
980
- #: src/addons/webdav.php:119
981
  msgid "A host name cannot contain a slash."
982
  msgstr ""
983
 
984
- #: src/addons/webdav.php:80
985
  msgid "Protocol (SSL or not)"
986
  msgstr ""
987
 
988
- #: src/addons/webdav.php:75
989
  msgid "This WebDAV URL is generated by filling in the options below. If you do not know the details, then you will need to ask your WebDAV provider."
990
  msgstr ""
991
 
992
- #: src/udaddons/updraftplus-addons.php:819
993
  msgid "No response data was received. This usually indicates a network connectivity issue (e.g. an outgoing firewall or overloaded network) between this site and UpdraftPlus.com."
994
  msgstr ""
995
 
996
- #: src/methods/s3.php:1063
997
  msgid "The AWS access key looks to be wrong (valid %s access keys begin with \"AK\")"
998
  msgstr ""
999
 
@@ -1017,73 +1114,73 @@ msgstr ""
1017
  msgid "FAQs"
1018
  msgstr ""
1019
 
1020
- #: src/central/bootstrap.php:523
1021
  msgid "More information..."
1022
  msgstr ""
1023
 
1024
- #: src/central/bootstrap.php:521
1025
  msgid "Use the alternative method for making a connection with the dashboard."
1026
  msgstr ""
1027
 
1028
- #: src/central/bootstrap.php:438
1029
  msgid "Key size: %d bits"
1030
  msgstr ""
1031
 
1032
- #: src/central/bootstrap.php:433
1033
  msgid "Public key was sent to:"
1034
  msgstr ""
1035
 
1036
- #: src/backup.php:2107
1037
  msgid "Failed to open directory (check the file permissions and ownership): %s"
1038
  msgstr ""
1039
 
1040
- #: src/backup.php:2085
1041
  msgid "%s: unreadable file - could not be backed up (check the file permissions and ownership)"
1042
  msgstr ""
1043
 
1044
- #: src/addons/migrator.php:2218
1045
  msgid "Create key"
1046
  msgstr ""
1047
 
1048
- #: src/addons/migrator.php:2215, src/central/bootstrap.php:515
1049
  msgid "slower, strongest"
1050
  msgstr ""
1051
 
1052
- #: src/addons/migrator.php:2214, src/central/bootstrap.php:514
1053
  msgid "recommended"
1054
  msgstr "موصى به"
1055
 
1056
- #: src/addons/migrator.php:2214, src/central/bootstrap.php:514
1057
  msgid "%s bytes"
1058
  msgstr ""
1059
 
1060
- #: src/addons/migrator.php:2213, src/central/bootstrap.php:513
1061
  msgid "faster (possibility for slow PHP installs)"
1062
  msgstr ""
1063
 
1064
- #: src/addons/migrator.php:2212, src/central/bootstrap.php:512
1065
  msgid "easy to break, fastest"
1066
  msgstr ""
1067
 
1068
- #: src/addons/migrator.php:2212, src/addons/migrator.php:2213,
1069
- #: src/addons/migrator.php:2215, src/central/bootstrap.php:512,
1070
- #: src/central/bootstrap.php:513, src/central/bootstrap.php:515
1071
  msgid "%s bits"
1072
  msgstr ""
1073
 
1074
- #: src/addons/migrator.php:2210, src/central/bootstrap.php:510
1075
  msgid "Encryption key size:"
1076
  msgstr ""
1077
 
1078
- #: src/addons/migrator.php:2208
1079
  msgid "Enter your chosen name"
1080
  msgstr ""
1081
 
1082
- #: src/addons/migrator.php:2207
1083
  msgid "Create a key: give this key a unique name (e.g. indicate the site it is for), then press \"Create Key\":"
1084
  msgstr ""
1085
 
1086
- #: src/methods/googledrive.php:491
1087
  msgid "Upload expected to fail: the %s limit for any single file is %s, whereas this file is %s GB (%d bytes)"
1088
  msgstr ""
1089
 
@@ -1103,7 +1200,7 @@ msgstr ""
1103
  msgid "This backup archive is %s MB in size - the attempt to send this via email is likely to fail (few email servers allow attachments of this size). If so, you should switch to using a different remote storage method."
1104
  msgstr ""
1105
 
1106
- #: src/class-updraftplus.php:1736
1107
  msgid "Size: %s MB"
1108
  msgstr ""
1109
 
@@ -1115,7 +1212,7 @@ msgstr ""
1115
  msgid "Now"
1116
  msgstr "الآن"
1117
 
1118
- #: src/class-updraftplus.php:4389, src/restorer.php:1010
1119
  msgid "You should enable %s to make any pretty permalinks (e.g. %s) work"
1120
  msgstr ""
1121
 
@@ -1123,13 +1220,13 @@ msgstr ""
1123
  msgid "(tap on an icon to select or unselect)"
1124
  msgstr ""
1125
 
1126
- #: src/methods/updraftvault.php:317, src/methods/updraftvault.php:323,
1127
- #: src/methods/updraftvault.php:329
1128
  msgid "%s per year"
1129
  msgstr ""
1130
 
1131
- #: src/methods/updraftvault.php:316, src/methods/updraftvault.php:322,
1132
- #: src/methods/updraftvault.php:328
1133
  msgid "or (annual discount)"
1134
  msgstr ""
1135
 
@@ -1137,111 +1234,107 @@ msgstr ""
1137
  msgid "No Vault connection was found for this site (has it moved?); please disconnect and re-connect."
1138
  msgstr ""
1139
 
1140
- #: src/class-updraftplus.php:520, src/class-updraftplus.php:565
1141
  msgid "The given file was not found, or could not be read."
1142
  msgstr ""
1143
 
1144
- #: src/central/bootstrap.php:565
1145
  msgid "UpdraftCentral (Remote Control)"
1146
  msgstr ""
1147
 
1148
- #: src/central/bootstrap.php:554
1149
  msgid "View recent UpdraftCentral log events"
1150
  msgstr ""
1151
 
1152
- #: src/central/bootstrap.php:493
1153
- msgid "URL of mothership"
1154
- msgstr ""
1155
-
1156
- #: src/central/bootstrap.php:504
1157
  msgid "Enter any description"
1158
  msgstr ""
1159
 
1160
- #: src/central/bootstrap.php:503
1161
  msgid "Description"
1162
  msgstr " الوصف"
1163
 
1164
- #: src/central/bootstrap.php:443
1165
  msgid "Delete..."
1166
  msgstr ""
1167
 
1168
- #: src/central/bootstrap.php:436
1169
  msgid "Created:"
1170
  msgstr ""
1171
 
1172
- #: src/central/bootstrap.php:433
1173
  msgid "Access this site as user:"
1174
  msgstr ""
1175
 
1176
- #: src/central/bootstrap.php:457
1177
  msgid "Details"
1178
  msgstr "تفاصيل عن المناسبة"
1179
 
1180
- #: src/central/bootstrap.php:456
1181
  msgid "Key description"
1182
  msgstr ""
1183
 
1184
- #: src/central/bootstrap.php:329, src/central/bootstrap.php:340
1185
  msgid "A key was created, but the attempt to register it with %s was unsuccessful - please try again later."
1186
  msgstr ""
1187
 
1188
- #: src/central/bootstrap.php:201
1189
  msgid "An invalid URL was entered"
1190
  msgstr ""
1191
 
1192
- #: src/central/bootstrap.php:77
1193
  msgid "Close..."
1194
  msgstr ""
1195
 
1196
- #: src/central/bootstrap.php:69
1197
  msgid "This connection appears to already have been made."
1198
  msgstr ""
1199
 
1200
- #: src/central/bootstrap.php:66
1201
  msgid "You must visit this link in the same browser and login session as you created the key in."
1202
  msgstr ""
1203
 
1204
- #: src/central/bootstrap.php:62
1205
  msgid "You must visit this URL in the same browser and login session as you created the key in."
1206
  msgstr ""
1207
 
1208
- #: src/central/bootstrap.php:62
1209
  msgid "You are not logged into this WordPress site in your web browser."
1210
  msgstr ""
1211
 
1212
- #: src/central/bootstrap.php:59
1213
  msgid "The key referred to was unknown."
1214
  msgstr ""
1215
 
1216
- #: src/central/bootstrap.php:56
1217
  msgid "A new UpdraftCentral connection has not been made."
1218
  msgstr ""
1219
 
1220
- #: src/central/bootstrap.php:54
1221
  msgid "An UpdraftCentral connection has been made successfully."
1222
  msgstr ""
1223
 
1224
- #: src/central/bootstrap.php:51
1225
  msgid "UpdraftCentral Connection"
1226
  msgstr ""
1227
 
1228
- #: src/backup.php:869, src/class-updraftplus.php:2806
1229
  msgid "The backup was aborted by the user"
1230
  msgstr ""
1231
 
1232
- #: src/admin.php:4298
1233
  msgid "Your settings have been saved."
1234
  msgstr "تم حفظ إعداداتك."
1235
 
1236
- #: src/admin.php:3432
1237
  msgid "Total backup size:"
1238
  msgstr ""
1239
 
1240
- #: src/admin.php:2846
1241
  msgid "stop"
1242
  msgstr "توقف"
1243
 
1244
- #: src/admin.php:2684
1245
  msgid "The backup has finished running"
1246
  msgstr ""
1247
 
@@ -1267,27 +1360,27 @@ msgstr ""
1267
  msgid "calculate"
1268
  msgstr ""
1269
 
1270
- #: src/admin.php:724
1271
  msgid "You should save your changes to ensure that they are used for making your backup."
1272
  msgstr ""
1273
 
1274
- #: src/admin.php:717
1275
  msgid "We requested to delete the file, but could not understand the server's response"
1276
  msgstr ""
1277
 
1278
- #: src/admin.php:716
1279
  msgid "Please enter a valid URL"
1280
  msgstr ""
1281
 
1282
- #: src/admin.php:699
1283
  msgid "Saving..."
1284
  msgstr "جاري الحفظ..."
1285
 
1286
- #: src/admin.php:662
1287
  msgid "Error: the server sent us a response which we did not understand."
1288
  msgstr ""
1289
 
1290
- #: src/admin.php:654
1291
  msgid "Fetching..."
1292
  msgstr ""
1293
 
@@ -1295,11 +1388,11 @@ msgstr ""
1295
  msgid "Asia Pacific (Seoul)"
1296
  msgstr ""
1297
 
1298
- #: src/restorer.php:1682
1299
  msgid "Uploads URL:"
1300
  msgstr ""
1301
 
1302
- #: src/backup.php:400
1303
  msgid "Unexpected error: no class '%s' was found (your UpdraftPlus installation seems broken - try re-installing)"
1304
  msgstr ""
1305
 
@@ -1307,24 +1400,24 @@ msgstr ""
1307
  msgid "The required %s PHP module is not installed - ask your web hosting company to enable it."
1308
  msgstr ""
1309
 
1310
- #: src/class-updraftplus.php:4440, src/restorer.php:1701
1311
  msgid "To import an ordinary WordPress site into a multisite installation requires %s."
1312
  msgstr ""
1313
 
1314
- #: src/class-updraftplus.php:4436
1315
  msgid "Please read this link for important information on this process."
1316
  msgstr ""
1317
 
1318
- #: src/class-updraftplus.php:4436
1319
  msgid "It will be imported as a new site."
1320
  msgstr ""
1321
 
1322
- #: src/admin.php:2497, src/templates/wp-admin/notices/horizontal-notice.php:16,
1323
  #: src/templates/wp-admin/notices/horizontal-notice.php:18
1324
  msgid "Dismiss"
1325
  msgstr "رفض"
1326
 
1327
- #: src/admin.php:736
1328
  msgid "Please fill in the required information."
1329
  msgstr ""
1330
 
@@ -1344,40 +1437,40 @@ msgstr ""
1344
  msgid "Which site to restore"
1345
  msgstr ""
1346
 
1347
- #: src/addons/migrator.php:514, src/addons/migrator.php:515
1348
  msgid "Error when creating new site at your chosen address:"
1349
  msgstr ""
1350
 
1351
- #: src/addons/migrator.php:456
1352
  msgid "Required information for restoring this backup was not given (%s)"
1353
  msgstr ""
1354
 
1355
- #: src/addons/migrator.php:415
1356
  msgid "Attribute imported content to user"
1357
  msgstr ""
1358
 
1359
- #: src/addons/migrator.php:405, src/addons/migrator.php:407
1360
  msgid "You must use lower-case letters or numbers for the site path, only."
1361
  msgstr ""
1362
 
1363
- #: src/addons/migrator.php:393
1364
  msgid "This feature is not compatible with %s"
1365
  msgstr ""
1366
 
1367
- #: src/addons/migrator.php:391, src/addons/migrator.php:393
1368
  msgid "Importing a single site into a multisite install"
1369
  msgstr ""
1370
 
1371
- #: src/addons/migrator.php:382
1372
  msgid "other content from wp-content"
1373
  msgstr ""
1374
 
1375
- #: src/addons/migrator.php:379
1376
  msgid "WordPress core"
1377
  msgstr ""
1378
 
1379
- #: src/addons/migrator.php:379, src/addons/migrator.php:382,
1380
- #: src/addons/migrator.php:385
1381
  msgid "You selected %s to be included in the restoration - this cannot / should not be done when importing a single site into a network."
1382
  msgstr ""
1383
 
@@ -1385,11 +1478,11 @@ msgstr ""
1385
  msgid "Call WordPress action:"
1386
  msgstr ""
1387
 
1388
- #: src/admin.php:2532
1389
  msgid "Your saved settings also affect what is backed up - e.g. files excluded."
1390
  msgstr ""
1391
 
1392
- #: src/admin.php:3856
1393
  msgid "Skipping: this archive was already restored."
1394
  msgstr ""
1395
 
@@ -1421,51 +1514,51 @@ msgstr ""
1421
  msgid "This button will delete all UpdraftPlus settings and progress information for in-progress backups (but not any of your existing backups from your cloud storage)."
1422
  msgstr ""
1423
 
1424
- #: src/admin.php:4175
1425
  msgid "Send this backup to remote storage"
1426
  msgstr ""
1427
 
1428
- #: src/admin.php:4173
1429
  msgid "Check out UpdraftPlus Vault."
1430
  msgstr ""
1431
 
1432
- #: src/admin.php:4173
1433
  msgid "Not got any remote storage?"
1434
  msgstr ""
1435
 
1436
- #: src/admin.php:4173
1437
  msgid "settings"
1438
  msgstr "إعدادات"
1439
 
1440
- #: src/admin.php:4173
1441
  msgid "Backup won't be sent to any remote storage - none has been saved in the %s"
1442
  msgstr ""
1443
 
1444
- #: src/admin.php:2530
1445
  msgid "Include any files in the backup"
1446
  msgstr ""
1447
 
1448
- #: src/admin.php:2516
1449
  msgid "Include the database in the backup"
1450
  msgstr ""
1451
 
1452
- #: src/admin.php:2496
1453
  msgid "Continue restoration"
1454
  msgstr ""
1455
 
1456
- #: src/admin.php:2491
1457
  msgid "You have an unfinished restoration operation, begun %s ago."
1458
  msgstr ""
1459
 
1460
- #: src/admin.php:2490
1461
  msgid "Unfinished restoration"
1462
  msgstr ""
1463
 
1464
- #: src/admin.php:2488
1465
  msgid "%s minutes, %s seconds"
1466
  msgstr ""
1467
 
1468
- #: src/admin.php:2435
1469
  msgid "Backup Contents And Schedule"
1470
  msgstr ""
1471
 
@@ -1473,142 +1566,136 @@ msgstr ""
1473
  msgid "Premium / Extensions"
1474
  msgstr ""
1475
 
1476
- #: src/admin.php:2214, src/admin.php:2223
1477
  msgid "Sufficient information about the in-progress restoration operation could not be found."
1478
  msgstr ""
1479
 
1480
- #: src/addons/morefiles.php:55, src/admin.php:722
1481
  msgctxt "(verb)"
1482
  msgid "Download"
1483
  msgstr ""
1484
 
1485
- #: src/admin.php:647
1486
  msgid "You have chosen to backup files, but no file entities have been selected"
1487
  msgstr ""
1488
 
1489
- #: src/admin.php:548
1490
  msgid "Extensions"
1491
  msgstr "Extensions"
1492
 
1493
- #: src/admin.php:540, src/templates/wp-admin/settings/tab-bar.php:8
1494
  msgid "Advanced Tools"
1495
  msgstr ""
1496
 
1497
- #: src/addons/googlecloud.php:966
1498
  msgid "Bucket location"
1499
  msgstr ""
1500
 
1501
- #: src/addons/googlecloud.php:961
1502
  msgid "Note that Google do not support every storage class in every location - you should read their documentation to learn about current availability."
1503
  msgstr ""
1504
 
1505
- #: src/addons/googlecloud.php:961, src/addons/googlecloud.php:976
1506
  msgid "This setting applies only when a new bucket is being created."
1507
  msgstr ""
1508
 
1509
- #: src/addons/googlecloud.php:946
1510
  msgid "You must use a bucket name that is unique, for all %s users."
1511
  msgstr ""
1512
 
1513
- #: src/addons/googlecloud.php:902
1514
  msgid "Do not confuse %s with %s - they are separate things."
1515
  msgstr ""
1516
 
1517
- #: src/addons/googlecloud.php:310
1518
  msgid "You do not have access to this bucket"
1519
  msgstr ""
1520
 
1521
- #: src/addons/googlecloud.php:57, src/addons/googlecloud.php:58,
1522
- #: src/addons/googlecloud.php:59
1523
  msgid "Western Europe"
1524
  msgstr ""
1525
 
1526
- #: src/addons/googlecloud.php:53
1527
  msgid "Eastern Asia-Pacific"
1528
  msgstr ""
1529
 
1530
- #: src/addons/googlecloud.php:52
1531
  msgid "Western United States"
1532
  msgstr ""
1533
 
1534
- #: src/addons/googlecloud.php:51
1535
  msgid "Eastern United States"
1536
  msgstr ""
1537
 
1538
- #: src/addons/googlecloud.php:50
1539
  msgid " Eastern United States"
1540
  msgstr ""
1541
 
1542
- #: src/addons/googlecloud.php:49
1543
  msgid "Central United States"
1544
  msgstr ""
1545
 
1546
- #: src/addons/googlecloud.php:48
1547
  msgid "European Union"
1548
  msgstr ""
1549
 
1550
- #: src/addons/googlecloud.php:47
1551
  msgid "Asia Pacific"
1552
  msgstr ""
1553
 
1554
- #: src/addons/googlecloud.php:46, src/addons/googlecloud.php:47,
1555
- #: src/addons/googlecloud.php:48
1556
  msgid "multi-region location"
1557
  msgstr ""
1558
 
1559
- #: src/addons/googlecloud.php:46
1560
  msgid "United States"
1561
  msgstr ""
1562
 
1563
- #: src/addons/googlecloud.php:42
1564
  msgid "Nearline"
1565
  msgstr ""
1566
 
1567
- #: src/addons/googlecloud.php:41
1568
  msgid "Durable reduced availability"
1569
  msgstr ""
1570
 
1571
- #: src/addons/googlecloud.php:40, src/addons/s3-enhanced.php:61
 
1572
  msgid "Standard"
1573
  msgstr ""
1574
 
1575
- #: src/addons/azure.php:577
1576
  msgid "container"
1577
  msgstr ""
1578
 
1579
- #: src/addons/azure.php:577
1580
  msgid "You can enter the path of any %s virtual folder you wish to use here."
1581
  msgstr ""
1582
 
1583
- #: src/addons/azure.php:576
1584
  msgid "optional"
1585
  msgstr ""
1586
 
1587
- #: src/addons/azure.php:576
1588
- msgid "Prefix"
1589
- msgstr ""
1590
-
1591
- #: src/addons/azure.php:571
1592
  msgid "See Microsoft's guidelines on container naming by following this link."
1593
  msgstr ""
1594
 
1595
- #: src/addons/azure.php:571
1596
  msgid "Enter the path of the %s you wish to use here."
1597
  msgstr ""
1598
 
1599
- #: src/addons/azure.php:560
1600
  msgid "This is not your Azure login - see the instructions if needing more guidance."
1601
  msgstr ""
1602
 
1603
- #: src/addons/azure.php:559
1604
- msgid "Account Name"
1605
- msgstr ""
1606
-
1607
- #: src/addons/azure.php:559, src/addons/azure.php:563
1608
  msgid "Azure"
1609
  msgstr ""
1610
 
1611
- #: src/addons/azure.php:555
1612
  msgid "Create Azure credentials in your Azure developer console."
1613
  msgstr ""
1614
 
@@ -1620,23 +1707,23 @@ msgstr ""
1620
  msgid "Could not access container"
1621
  msgstr ""
1622
 
1623
- #: src/class-updraftplus.php:2823
1624
  msgid "To complete your migration/clone, you should now log in to the remote site and restore the backup set."
1625
  msgstr ""
1626
 
1627
- #: src/backup.php:1581
1628
  msgid "the options table was not found"
1629
  msgstr ""
1630
 
1631
- #: src/backup.php:1579
1632
  msgid "no options or sitemeta table was found"
1633
  msgstr ""
1634
 
1635
- #: src/backup.php:1579, src/backup.php:1581
1636
  msgid "The database backup appears to have failed"
1637
  msgstr ""
1638
 
1639
- #: src/backup.php:1451
1640
  msgid "The backup directory is not writable (or disk space is full) - the database backup is expected to shortly fail."
1641
  msgstr ""
1642
 
@@ -1648,39 +1735,39 @@ msgstr ""
1648
  msgid "Not installed"
1649
  msgstr "لم يتم التثبيت"
1650
 
1651
- #: src/addons/googlecloud.php:951, src/addons/s3-enhanced.php:54
1652
  msgid "Storage class"
1653
  msgstr ""
1654
 
1655
- #: src/addons/googlecloud.php:946
1656
  msgid "See Google's guidelines on bucket naming by following this link."
1657
  msgstr ""
1658
 
1659
- #: src/addons/googlecloud.php:946
1660
  msgid "Enter the name of the %s bucket you wish to use here."
1661
  msgstr ""
1662
 
1663
- #: src/addons/googlecloud.php:945
1664
  msgid "Bucket"
1665
  msgstr ""
1666
 
1667
- #: src/addons/googlecloud.php:941
1668
  msgid "Otherwise, you can leave it blank."
1669
  msgstr ""
1670
 
1671
- #: src/addons/googlecloud.php:941
1672
  msgid "N.B. This is only needed if you have not already created the bucket, and you wish UpdraftPlus to create it for you."
1673
  msgstr ""
1674
 
1675
- #: src/addons/googlecloud.php:941
1676
  msgid "Enter the ID of the %s project you wish to use here."
1677
  msgstr ""
1678
 
1679
- #: src/addons/googlecloud.php:914
1680
  msgid "Follow this link to your Google API Console, and there activate the Storage API and create a Client ID in the API Access section."
1681
  msgstr ""
1682
 
1683
- #: src/addons/googlecloud.php:817
1684
  msgid "You must enter a project ID in order to be able to create a new bucket."
1685
  msgstr ""
1686
 
@@ -1688,31 +1775,31 @@ msgstr ""
1688
  msgid "Project ID"
1689
  msgstr ""
1690
 
1691
- #: src/addons/googlecloud.php:676
1692
  msgid "You must save and authenticate before you can test your settings."
1693
  msgstr ""
1694
 
1695
- #: src/addons/googlecloud.php:533
1696
  msgid "Have not yet obtained an access token from Google - you need to authorise or re-authorise your connection to Google Cloud."
1697
  msgstr ""
1698
 
1699
- #: src/addons/googlecloud.php:257, src/addons/googlecloud.php:330,
1700
- #: src/addons/googlecloud.php:809, src/addons/googlecloud.php:856
1701
  msgid "You do not have access to this bucket."
1702
  msgstr ""
1703
 
1704
- #: src/addons/googlecloud.php:257, src/addons/googlecloud.php:310,
1705
- #: src/addons/googlecloud.php:320, src/addons/googlecloud.php:330,
1706
- #: src/addons/googlecloud.php:635, src/addons/googlecloud.php:809,
1707
- #: src/addons/googlecloud.php:856, src/addons/googlecloud.php:908,
1708
- #: src/addons/googlecloud.php:908, src/addons/googlecloud.php:925,
1709
- #: src/addons/googlecloud.php:933, src/addons/googlecloud.php:946
1710
  msgid "Google Cloud"
1711
  msgstr ""
1712
 
1713
- #: src/addons/googlecloud.php:257, src/addons/googlecloud.php:310,
1714
- #: src/addons/googlecloud.php:330, src/addons/googlecloud.php:809,
1715
- #: src/addons/googlecloud.php:856
1716
  msgid "%s Service Exception."
1717
  msgstr ""
1718
 
@@ -1749,35 +1836,35 @@ msgstr ""
1749
  msgid "Press here to look inside your remote storage methods for any existing backup sets (from any site, if they are stored in the same folder)."
1750
  msgstr ""
1751
 
1752
- #: src/admin.php:1631
1753
  msgid "Backup sets removed:"
1754
  msgstr ""
1755
 
1756
- #: src/admin.php:735
1757
  msgid "Processing..."
1758
  msgstr ""
1759
 
1760
- #: src/admin.php:733
1761
  msgid "For backups older than"
1762
  msgstr ""
1763
 
1764
- #: src/admin.php:732
1765
  msgid "week(s)"
1766
  msgstr ""
1767
 
1768
- #: src/admin.php:731
1769
  msgid "hour(s)"
1770
  msgstr ""
1771
 
1772
- #: src/admin.php:730
1773
  msgid "day(s)"
1774
  msgstr ""
1775
 
1776
- #: src/admin.php:729
1777
  msgid "in the month"
1778
  msgstr ""
1779
 
1780
- #: src/admin.php:728
1781
  msgid "day"
1782
  msgstr ""
1783
 
@@ -1789,39 +1876,39 @@ msgstr ""
1789
  msgid "Add an additional retention rule..."
1790
  msgstr ""
1791
 
1792
- #: src/restorer.php:2204
1793
  msgid "This database needs to be deployed on MySQL version %s or later."
1794
  msgstr ""
1795
 
1796
- #: src/restorer.php:2204
1797
  msgid "This problem is caused by trying to restore a database on a very old MySQL version that is incompatible with the source database."
1798
  msgstr ""
1799
 
1800
- #: src/methods/updraftvault.php:645
1801
  msgid "You do not currently have any UpdraftPlus Vault quota"
1802
  msgstr ""
1803
 
1804
- #: src/class-updraftplus.php:4478
1805
  msgid "You must upgrade MySQL to be able to use this database."
1806
  msgstr ""
1807
 
1808
- #: src/class-updraftplus.php:4478
1809
  msgid "The database backup uses MySQL features not available in the old MySQL version (%s) that this site is running on."
1810
  msgstr ""
1811
 
1812
- #: src/admin.php:2333
1813
  msgid "The UpdraftPlus directory in wp-content/plugins has white-space in it; WordPress does not like this. You should rename the directory to wp-content/plugins/updraftplus to fix this problem."
1814
  msgstr ""
1815
 
1816
- #: src/methods/updraftvault.php:350
1817
  msgid "Don't know your email address, or forgotten your password?"
1818
  msgstr ""
1819
 
1820
- #: src/methods/updraftvault.php:343
1821
  msgid "Enter your UpdraftPlus.Com email / password here to connect:"
1822
  msgstr ""
1823
 
1824
- #: src/methods/updraftvault.php:305, src/methods/updraftvault.php:335
1825
  msgid "Read the FAQs here."
1826
  msgstr ""
1827
 
@@ -1833,132 +1920,133 @@ msgstr ""
1833
  msgid "Server-side encryption"
1834
  msgstr ""
1835
 
1836
- #: src/methods/updraftvault.php:653
1837
  msgid "If you have forgotten your password, then go here to change your password on updraftplus.com."
1838
  msgstr ""
1839
 
1840
- #: src/admin.php:985
1841
  msgid "Go to the remote storage settings in order to connect."
1842
  msgstr ""
1843
 
1844
- #: src/admin.php:985
1845
  msgid "%s has been chosen for remote storage, but you are not currently connected."
1846
  msgstr ""
1847
 
1848
- #: src/methods/updraftvault.php:332
1849
  msgid "Payments can be made in US dollars, euros or GB pounds sterling, via card or PayPal."
1850
  msgstr ""
1851
 
1852
- #: src/admin.php:705
1853
  msgid "Update quota count"
1854
  msgstr ""
1855
 
1856
- #: src/admin.php:704
1857
  msgid "Counting..."
1858
  msgstr ""
1859
 
1860
- #: src/admin.php:703
1861
  msgid "Disconnecting..."
1862
  msgstr ""
1863
 
1864
- #: src/admin.php:701
1865
  msgid "Connecting..."
1866
  msgstr ""
1867
 
1868
- #: src/methods/updraftvault.php:406, src/methods/updraftvault.php:480
1869
  msgid "Refresh current status"
1870
  msgstr ""
1871
 
1872
- #: src/methods/updraftvault.php:404, src/methods/updraftvault.php:420,
1873
- #: src/methods/updraftvault.php:422, src/methods/updraftvault.php:480
1874
  msgid "Get more quota"
1875
  msgstr ""
1876
 
1877
- #: src/methods/updraftvault.php:401, src/methods/updraftvault.php:417,
1878
- #: src/methods/updraftvault.php:461
1879
  msgid "Current use:"
1880
  msgstr ""
1881
 
1882
- #: src/methods/updraftvault.php:396
1883
  msgid "You can get more quota here"
1884
  msgstr ""
1885
 
1886
- #: src/methods/updraftvault.php:396
1887
  msgid "%s Error: you have insufficient storage quota available (%s) to upload this archive (%s)."
1888
  msgstr ""
1889
 
1890
- #: src/admin.php:702, src/methods/updraftvault.php:388
 
1891
  msgid "Disconnect"
1892
  msgstr ""
1893
 
1894
- #: src/methods/updraftvault.php:380
1895
  msgid "Quota:"
1896
  msgstr ""
1897
 
1898
- #: src/methods/updraftvault.php:378
1899
  msgid "Vault owner"
1900
  msgstr ""
1901
 
1902
- #: src/methods/updraftvault.php:378
1903
  msgid "Well done - there's nothing more needed to set up."
1904
  msgstr ""
1905
 
1906
- #: src/methods/updraftvault.php:378
1907
  msgid "This site is <strong>connected</strong> to UpdraftPlus Vault."
1908
  msgstr ""
1909
 
1910
- #: src/methods/updraftvault.php:374
1911
  msgid "You are <strong>not connected</strong> to UpdraftPlus Vault."
1912
  msgstr ""
1913
 
1914
- #: src/methods/updraftvault.php:350
1915
  msgid "Go here for help"
1916
  msgstr ""
1917
 
1918
- #: src/methods/updraftvault.php:345
1919
  msgid "E-mail"
1920
  msgstr ""
1921
 
1922
- #: src/central/bootstrap.php:540, src/methods/updraftvault.php:338,
1923
- #: src/methods/updraftvault.php:353
1924
  msgid "Back..."
1925
  msgstr ""
1926
 
1927
- #: src/methods/updraftvault.php:332
1928
  msgid "Subscriptions can be cancelled at any time."
1929
  msgstr ""
1930
 
1931
- #: src/methods/updraftvault.php:315, src/methods/updraftvault.php:321,
1932
- #: src/methods/updraftvault.php:327
1933
  msgid "%s per quarter"
1934
  msgstr ""
1935
 
1936
- #: src/central/bootstrap.php:567, src/methods/updraftvault.php:305,
1937
- #: src/methods/updraftvault.php:335
1938
  msgid "Read more about it here."
1939
  msgstr ""
1940
 
1941
- #: src/methods/updraftvault.php:305, src/methods/updraftvault.php:335
1942
  msgid "UpdraftPlus Vault is built on top of Amazon's world-leading data-centres, with redundant data storage to achieve 99.999999999% reliability."
1943
  msgstr ""
1944
 
1945
- #: src/methods/updraftvault.php:301
1946
  msgid "Already purchased space?"
1947
  msgstr ""
1948
 
1949
- #: src/methods/updraftvault.php:298
1950
  msgid "Show the options"
1951
  msgstr ""
1952
 
1953
- #: src/methods/updraftvault.php:297
1954
  msgid "First time user?"
1955
  msgstr ""
1956
 
1957
- #: src/methods/updraftvault.php:294, src/methods/updraftvault.php:311
1958
  msgid "Press a button to get started."
1959
  msgstr ""
1960
 
1961
- #: src/methods/updraftvault.php:294, src/methods/updraftvault.php:311
1962
  msgid "UpdraftPlus Vault brings you storage that is <strong>reliable, easy to use and a great price</strong>."
1963
  msgstr ""
1964
 
@@ -1979,11 +2067,11 @@ msgid "Updraft Vault"
1979
  msgstr ""
1980
 
1981
  #: src/addons/azure.php:388, src/addons/backblaze.php:464,
1982
- #: src/addons/googlecloud.php:760, src/methods/s3.php:1091
1983
  msgid "Delete failed:"
1984
  msgstr ""
1985
 
1986
- #: src/backup.php:3045
1987
  msgid "The zip engine returned the message: %s."
1988
  msgstr ""
1989
 
@@ -2003,75 +2091,75 @@ msgstr ""
2003
  msgid "Allow download"
2004
  msgstr ""
2005
 
2006
- #: src/addons/migrator.php:1762
2007
  msgid "If sending directly from site to site does not work for you, then there are three other methods - please try one of these instead."
2008
  msgstr ""
2009
 
2010
- #: src/addons/migrator.php:1747, src/admin.php:711
2011
  msgid "You should check that the remote site is online, not firewalled, does not have security modules that may be blocking access, has UpdraftPlus version %s or later active and that the keys have been entered correctly."
2012
  msgstr ""
2013
 
2014
- #: src/addons/migrator.php:2250
2015
  msgid "Existing keys"
2016
  msgstr ""
2017
 
2018
- #: src/addons/migrator.php:2241
2019
  msgid "No keys to allow remote sites to connect have yet been created."
2020
  msgstr ""
2021
 
2022
- #: src/addons/migrator.php:2223
2023
  msgid "Your new key:"
2024
  msgstr ""
2025
 
2026
- #: src/addons/migrator.php:2202
2027
  msgid "To allow another site to send a backup to this site, create a key, and then press the 'Migrate' button on the sending site, and copy-and-paste the key there."
2028
  msgstr ""
2029
 
2030
- #: src/addons/migrator.php:2184
2031
  msgid "So, to get the key for the remote site, open the 'Migrate' window on that site, scroll down, and you can create one there."
2032
  msgstr ""
2033
 
2034
- #: src/addons/migrator.php:2184
2035
  msgid "Keys for this site are created in the section below the one you just pressed in."
2036
  msgstr ""
2037
 
2038
- #: src/addons/migrator.php:1864, src/central/bootstrap.php:383
2039
  msgid "You must copy and paste this key now - it cannot be shown again."
2040
  msgstr ""
2041
 
2042
- #: src/addons/migrator.php:1864, src/central/bootstrap.php:383
11
  "Language: ar\n"
12
  "Project-Id-Version: UpdraftPlus\n"
13
 
14
+ #: src/addons/googlecloud.php:979, src/addons/googlecloud.php:980,
15
+ #: src/addons/googlecloud.php:981
16
+ msgid "Western Europe %s"
17
+ msgstr ""
18
+
19
+ #: src/addons/googlecloud.php:978
20
+ msgid "South-east Australia %s"
21
+ msgstr ""
22
+
23
+ #: src/addons/googlecloud.php:977
24
+ msgid "South-east Asia %s"
25
+ msgstr ""
26
+
27
+ #: src/addons/googlecloud.php:976
28
+ msgid "North-east Asia %s"
29
+ msgstr ""
30
+
31
+ #: src/addons/googlecloud.php:975
32
+ msgid "Eastern Asia-Pacific %s"
33
+ msgstr ""
34
+
35
+ #: src/addons/googlecloud.php:974
36
+ msgid "Western United States %s"
37
+ msgstr ""
38
+
39
+ #: src/addons/googlecloud.php:972, src/addons/googlecloud.php:973
40
+ msgid "Eastern United States %s"
41
+ msgstr ""
42
+
43
+ #: src/addons/googlecloud.php:970
44
+ msgid "European Union (multi-region location)"
45
+ msgstr ""
46
+
47
+ #: src/addons/googlecloud.php:969
48
+ msgid "Asia Pacific (multi-region location)"
49
+ msgstr ""
50
+
51
+ #: src/addons/googlecloud.php:968
52
+ msgid "United States (multi-region location)"
53
+ msgstr ""
54
+
55
+ #: src/addons/azure.php:552
56
+ msgid "%s Prefix"
57
+ msgstr ""
58
+
59
+ #: src/addons/azure.php:547
60
+ msgid "%s Container"
61
+ msgstr ""
62
+
63
+ #: src/addons/azure.php:542
64
+ msgid "%s Key"
65
+ msgstr ""
66
+
67
+ #: src/addons/azure.php:538
68
+ msgid "%s Account Name"
69
+ msgstr ""
70
+
71
+ #: src/addons/googlecloud.php:623
72
+ msgid "But no %s settings were found. Please complete all fields in %s settings and save the settings."
73
+ msgstr ""
74
+
75
+ #: src/addons/googlecloud.php:621
76
+ msgid "But no bucket was defined, so backups may not complete. Please enter a bucket name in the %s settings and save settings."
77
+ msgstr ""
78
+
79
+ #: src/includes/updraftplus-notices.php:202
80
+ msgid "Find out more."
81
+ msgstr ""
82
+
83
+ #: src/includes/updraftplus-notices.php:202
84
+ msgid "From the team behind UpdraftPlus."
85
+ msgstr ""
86
+
87
+ #: src/central/bootstrap.php:506
88
+ msgid "URL for the site of your UpdraftCentral dashboard"
89
+ msgstr ""
90
+
91
+ #: src/central/bootstrap.php:504
92
+ msgid "Enter the URL where your self-hosted install of UpdraftCentral is located:"
93
+ msgstr ""
94
+
95
+ #: src/central/bootstrap.php:501
96
+ msgid "A website where you have installed %s"
97
+ msgstr ""
98
+
99
+ #: src/central/bootstrap.php:499
100
+ msgid "Self-hosted dashboard"
101
+ msgstr ""
102
+
103
+ #: src/central/bootstrap.php:241
104
+ msgid "At your UpdraftCentral dashboard you should press the \"Add Site\" button then paste the key in the input box."
105
+ msgstr ""
106
+
107
+ #: src/addons/migrator.php:838
108
+ msgid "Your .htaccess has an old site reference on line number %s. You should remove it manually."
109
+ msgid_plural "Your .htaccess has an old site references on line numbers %s. You should remove them manually."
110
+ msgstr[0] ""
111
+ msgstr[1] ""
112
+ msgstr[2] ""
113
+ msgstr[3] ""
114
+ msgstr[4] ""
115
+ msgstr[5] ""
116
+
117
+ #: src/restorer.php:1878
118
  msgid "Requested table character set (%s) is not present - changing to %s."
119
  msgstr ""
120
 
121
+ #: src/class-updraftplus.php:4528
122
  msgid "Your chosen character set to use instead:"
123
  msgstr ""
124
 
125
+ #: src/class-updraftplus.php:4521
126
  msgid "You can choose another suitable character set instead and continue with the restoration at your own risk."
127
  msgstr ""
128
 
129
+ #: src/class-updraftplus.php:4521
130
  msgid "The database server that this WordPress site is running on doesn't support the character set (%s) which you are trying to import."
131
  msgid_plural "The database server that this WordPress site is running on doesn't support the character sets (%s) which you are trying to import."
132
  msgstr[0] ""
136
  msgstr[4] ""
137
  msgstr[5] ""
138
 
139
+ #: src/central/bootstrap.php:584
140
  msgid "Create another key"
141
  msgstr ""
142
 
143
+ #: src/central/bootstrap.php:513
144
  msgid "UpdraftCentral dashboard connection details"
145
  msgstr ""
146
 
147
+ #: src/central/bootstrap.php:507
148
  msgid "Next"
149
  msgstr ""
150
 
151
+ #: src/central/bootstrap.php:493
 
 
 
 
 
 
 
 
152
  msgid "an account"
153
  msgstr ""
154
 
155
+ #: src/central/bootstrap.php:493
156
  msgid "i.e. if you have %s there"
157
  msgstr ""
158
 
159
+ #: src/central/bootstrap.php:482
160
  msgid "Connect this site to an UpdraftCentral dashboard found at..."
161
  msgstr ""
162
 
163
+ #: src/central/bootstrap.php:456
164
  msgid "Manage existing keys (%d)..."
165
  msgstr ""
166
 
167
+ #: src/central/bootstrap.php:406
168
  msgid "There are no UpdraftCentral dashboards that can currently control this site."
169
  msgstr ""
170
 
171
+ #: src/central/bootstrap.php:243
172
  msgid "You can now control this site via your UpdraftCentral dashboard at %s."
173
  msgstr ""
174
 
175
+ #: src/central/bootstrap.php:241
176
  msgid "Detailed instructions for this can be found at %s"
177
  msgstr ""
178
 
179
+ #: src/central/bootstrap.php:241
180
  msgid "You now need to copy the key below and enter it at your %s."
181
  msgstr ""
182
 
183
+ #: src/admin.php:770
184
  msgid "Please enter a valid URL e.g http://example.com"
185
  msgstr ""
186
 
232
  msgid "Account ID"
233
  msgstr ""
234
 
235
+ #: src/class-updraftplus.php:4399
236
  msgid "As long as your web hosting allows http (i.e. non-SSL access) or will forward requests to https (which is almost always the case), this is no problem. If that is not yet set up, then you should set it up, or use %s so that the non-https links are automatically replaced."
237
  msgstr ""
238
 
239
+ #: src/class-updraftplus.php:4397, src/class-updraftplus.php:4399
240
  msgid "the migrator add-on"
241
  msgstr ""
242
 
243
+ #: src/class-updraftplus.php:4397
244
  msgid "This restoration will work if you still have an SSL certificate (i.e. can use https) to access the site. Otherwise, you will want to use %s to search/replace the site address so that the site can be visited without https."
245
  msgstr ""
246
 
247
+ #: src/class-updraftplus.php:4395
248
  msgid "This backup set is of this site, but at the time of the backup you were using %s, whereas the site now uses %s."
249
  msgstr ""
250
 
251
+ #: src/class-updraftplus.php:4392
252
  msgid "The website address in the backup set (%s) is slightly different from that of the site now (%s). This is not expected to be a problem for restoring the site, as long as visits to the former address still reach the site."
253
  msgstr ""
254
 
255
+ #: src/methods/googledrive.php:1162
256
  msgid "To de-authorize UpdraftPlus (all sites) from accessing your Google Drive, follow this link to your Google account settings."
257
  msgstr ""
258
 
259
+ #: src/methods/googledrive.php:1159
260
  msgid "Follow this link to remove this site's settings for %s."
261
  msgstr ""
262
 
264
  msgid "UpdraftPlus debug mode is on: detailed debugging data follows."
265
  msgstr ""
266
 
267
+ #: src/admin.php:751
268
  msgid "Error: The chosen file is corrupt. Please choose a valid UpdraftPlus export file."
269
  msgstr ""
270
 
271
+ #: src/admin.php:1338, src/admin.php:4160, src/backup.php:2017,
272
+ #: src/class-updraftplus.php:2147, src/class-updraftplus.php:2212,
273
+ #: src/class-updraftplus.php:2346
274
  msgid "A PHP fatal error (%s) has occurred: %s"
275
  msgstr ""
276
 
277
+ #: src/admin.php:1329, src/admin.php:4146, src/backup.php:2008,
278
+ #: src/class-updraftplus.php:2138, src/class-updraftplus.php:2205,
279
+ #: src/class-updraftplus.php:2339
280
  msgid "A PHP exception (%s) has occurred: %s"
281
  msgstr ""
282
 
283
+ #: src/addons/googlecloud.php:58
284
  msgid "South-east Australia"
285
  msgstr ""
286
 
287
+ #: src/addons/googlecloud.php:57
288
  msgid "South-east Asia"
289
  msgstr ""
290
 
291
+ #: src/addons/googlecloud.php:56
292
  msgid "North-east Asia"
293
  msgstr ""
294
 
320
  msgid "Select Files"
321
  msgstr ""
322
 
323
+ #: src/methods/cloudfiles.php:487
324
  msgid "Rackspace Storage Region"
325
  msgstr ""
326
 
332
  msgid "Instant and secure logon with a wave of your phone."
333
  msgstr ""
334
 
335
+ #: src/backup.php:2021
336
  msgid "As previously warned (see: %s), encryption is no longer a feature of the free edition of UpdraftPlus"
337
  msgstr ""
338
 
339
+ #: src/admin.php:4688
340
  msgid "Value"
341
  msgstr ""
342
 
343
+ #: src/admin.php:1604
344
  msgid "Did not know how to delete from this cloud service."
345
  msgstr ""
346
 
347
+ #: src/addons/sftp.php:700
348
  msgid "Encrypted login failed; trying non-encrypted"
349
  msgstr ""
350
 
352
  msgid "__Check this box to use Amazon's server-side encryption"
353
  msgstr ""
354
 
355
+ #: src/addons/azure.php:529
356
  msgid "You must add the following as the authorised redirect URI in your Azure console (under \"API Settings\") when asked"
357
  msgstr ""
358
 
360
  msgid "Stored at: %s"
361
  msgstr ""
362
 
363
+ #: src/methods/cloudfiles.php:507
364
  msgid "Cloud Files"
365
  msgstr ""
366
 
367
+ #: src/admin.php:4501
368
  msgid "Your settings failed to save. Please refresh the settings page and try again"
369
  msgstr ""
370
 
371
+ #: src/admin.php:4460
372
  msgid "UpdraftPlus seems to have been updated to version (%s), which is different to the version running when this settings page was loaded. Please reload the settings page before trying to save settings."
373
  msgstr ""
374
 
385
  msgid "Extra database"
386
  msgstr ""
387
 
388
+ #: src/admin.php:3720
389
  msgid "Press here to download or browse"
390
  msgstr ""
391
 
392
+ #: src/admin.php:1117, src/admin.php:1127
393
  msgid "Error: invalid path"
394
  msgstr ""
395
 
396
+ #: src/admin.php:941
397
  msgid "An error occurred when fetching storage module options: "
398
  msgstr ""
399
 
400
+ #: src/admin.php:767
401
  msgid "Loading log file"
402
  msgstr ""
403
 
404
+ #: src/admin.php:766
405
  msgid "Unable to download file. This could be caused by a timeout. It would be best to download the zip to your computer."
406
  msgstr ""
407
 
408
+ #: src/admin.php:765
409
  msgid "Search"
410
  msgstr ""
411
 
412
+ #: src/admin.php:764
413
  msgid "Select a file to view information about it"
414
  msgstr ""
415
 
416
+ #: src/admin.php:763
417
  msgid "Browsing zip file"
418
  msgstr ""
419
 
420
+ #: src/admin.php:732
421
  msgid "With UpdraftPlus Premium, you can directly download individual files from here."
422
  msgstr ""
423
 
424
+ #: src/admin.php:680
425
  msgid "Browse contents"
426
  msgstr ""
427
 
428
+ #: src/restorer.php:1699
429
  msgid "Skipped tables:"
430
  msgstr ""
431
 
432
+ #: src/class-updraftplus.php:4579
433
  msgid "This database backup has the following WordPress tables excluded: %s"
434
  msgstr ""
435
 
436
+ #: src/admin.php:2615
437
  msgid "With UpdraftPlus Premium, you can choose to backup non-WordPress tables, backup only specified tables, and backup other databases too."
438
  msgstr ""
439
 
440
+ #: src/admin.php:2615
441
  msgid "All WordPress tables will be backed up."
442
  msgstr ""
443
 
444
+ #: src/admin.php:762
445
  msgid "Further information may be found in the browser JavaScript console, and the server PHP error logs."
446
  msgstr ""
447
 
448
+ #: src/admin.php:762
449
  msgid "That you are attempting to upload a zip file previously created by UpdraftPlus."
450
  msgstr ""
451
 
452
+ #: src/admin.php:762
453
  msgid "The available memory on the server."
454
  msgstr ""
455
 
456
+ #: src/admin.php:762
457
  msgid "Any settings in your .htaccess or web.config file that affects the maximum upload or post size."
458
  msgstr ""
459
 
460
+ #: src/admin.php:762
461
  msgid "The file failed to upload. Please check the following:"
462
  msgstr ""
463
 
464
+ #: src/admin.php:761
465
  msgid "HTTP code:"
466
  msgstr ""
467
 
468
+ #: src/admin.php:657
469
  msgid "You have chosen to backup a database, but no tables have been selected"
470
  msgstr ""
471
 
761
  msgid "Apache modules"
762
  msgstr ""
763
 
764
+ #: src/includes/updraftplus-notices.php:264
765
  msgid "Summer sale - 20% off UpdraftPlus Premium until July 31st"
766
  msgstr ""
767
 
768
+ #: src/includes/updraftplus-notices.php:251
769
  msgid "Spring sale - 20% off UpdraftPlus Premium until April 31st"
770
  msgstr ""
771
 
772
+ #: src/includes/updraftplus-notices.php:238
773
  msgid "Happy New Year - 20% off UpdraftPlus Premium until January 1st"
774
  msgstr ""
775
 
776
+ #: src/includes/updraftplus-notices.php:225
777
  msgid "Christmas sale - 20% off UpdraftPlus Premium until December 25th"
778
  msgstr ""
779
 
780
+ #: src/includes/updraftplus-notices.php:213,
781
+ #: src/includes/updraftplus-notices.php:226,
782
+ #: src/includes/updraftplus-notices.php:239,
783
+ #: src/includes/updraftplus-notices.php:252,
784
+ #: src/includes/updraftplus-notices.php:265
785
  msgid "To benefit, use this discount code:"
786
  msgstr ""
787
 
788
+ #: src/includes/updraftplus-notices.php:212
789
  msgid "Black Friday - 20% off UpdraftPlus Premium until November 30th"
790
  msgstr ""
791
 
929
  msgid "Export / import settings"
930
  msgstr ""
931
 
932
+ #: src/restorer.php:1887
933
  msgid "Processing table (%s)"
934
  msgstr ""
935
 
936
+ #: src/restorer.php:1665
937
  msgid "Backup of: %s"
938
  msgstr ""
939
 
940
+ #: src/methods/googledrive.php:252
941
  msgid "The client has been deleted from the Google Drive API console. Please create a new Google Drive project and reconnect with UpdraftPlus."
942
  msgstr ""
943
 
944
+ #: src/methods/dropbox.php:589
945
  msgid "%s de-authentication"
946
  msgstr ""
947
 
948
+ #: src/methods/dropbox.php:530
949
  msgid "You must add the following as the authorised redirect URI in your Dropbox console (under \"API Settings\") when asked"
950
  msgstr ""
951
 
952
+ #: src/methods/dropbox.php:505
953
  msgid "Follow this link to deauthenticate with %s."
954
  msgstr ""
955
 
956
+ #: src/central/bootstrap.php:579
957
  msgid "UpdraftCentral enables control of your WordPress sites (including management of backups and updates) from a central dashboard."
958
  msgstr ""
959
 
960
+ #: src/backup.php:1615
961
  msgid "If not, you will need to either remove data from this table, or contact your hosting company to request more resources."
962
  msgstr ""
963
 
965
  msgid "You have selected a remote storage option which has an authorization step to complete:"
966
  msgstr ""
967
 
968
+ #: src/admin.php:1680
969
  msgid "Remote files deleted:"
970
  msgstr ""
971
 
972
+ #: src/admin.php:1679
973
  msgid "Local files deleted:"
974
  msgstr ""
975
 
976
+ #: src/admin.php:989, src/admin.php:998, src/admin.php:1011, src/admin.php:1020
977
  msgid "Follow this link to authorize access to your %s account (you will not be able to back up to %s without it)."
978
  msgstr ""
979
 
980
+ #: src/admin.php:760
981
  msgid "remote files deleted"
982
  msgstr ""
983
 
984
+ #: src/admin.php:758
985
  msgid "Complete"
986
  msgstr ""
987
 
988
+ #: src/admin.php:757
989
  msgid "Do you want to carry out the import?"
990
  msgstr ""
991
 
992
+ #: src/admin.php:756
993
  msgid "Which was exported on:"
994
  msgstr ""
995
 
996
+ #: src/admin.php:755
997
  msgid "This will import data from:"
998
  msgstr ""
999
 
1000
+ #: src/admin.php:754
1001
  msgid "Importing..."
1002
  msgstr ""
1003
 
1004
+ #: src/admin.php:750
1005
  msgid "You have not yet selected a file to import."
1006
  msgstr ""
1007
 
1008
+ #: src/admin.php:734
1009
  msgid "Your export file will be of your displayed settings, not your saved ones."
1010
  msgstr ""
1011
 
1012
+ #: src/admin.php:87
1013
  msgid "template not found"
1014
  msgstr ""
1015
 
1017
  msgid "US East (Ohio)"
1018
  msgstr ""
1019
 
1020
+ #: src/addons/onedrive.php:949
1021
  msgid "This site uses a URL which is either non-HTTPS, or is localhost or 127.0.0.1 URL. As such, you must use the main %s %s App to authenticate with your account."
1022
  msgstr ""
1023
 
1024
+ #: src/addons/onedrive.php:635
1025
  msgid "Account is not authorized (%s)."
1026
  msgstr ""
1027
 
1028
+ #: src/addons/onedrive.php:596, src/udaddons/updraftplus-addons.php:872
1029
  msgid "Your IP address:"
1030
  msgstr ""
1031
 
1032
+ #: src/addons/onedrive.php:596, src/udaddons/updraftplus-addons.php:872,
1033
+ #: src/udaddons/updraftplus-addons.php:886
1034
  msgid "To remove any block, please go here."
1035
  msgstr ""
1036
 
1037
+ #: src/addons/onedrive.php:581, src/udaddons/updraftplus-addons.php:857
1038
  msgid "An error response was received; HTTP code:"
1039
  msgstr ""
1040
 
1041
+ #: src/includes/class-commands.php:336
1042
  msgid "%s add-on not found"
1043
  msgstr ""
1044
 
1050
  msgid "This makes time-outs much more likely. You are recommended to turn safe_mode off, or to restore only one entity at a time"
1051
  msgstr ""
1052
 
1053
+ #: src/admin.php:2429
1054
  msgid "To fix this problem go here."
1055
  msgstr ""
1056
 
1057
+ #: src/admin.php:2429
1058
  msgid "OptimizePress 2.0 encodes its contents, so search/replace does not work."
1059
  msgstr ""
1060
 
1061
+ #: src/admin.php:718
1062
  msgid "your PHP install lacks the openssl module; as a result, this can take minutes; if nothing has happened by then, then you should either try a smaller key size, or ask your web hosting company how to enable this PHP module on your setup."
1063
  msgstr ""
1064
 
1065
+ #: src/addons/webdav.php:121
1066
  msgid "Path"
1067
  msgstr ""
1068
 
1069
+ #: src/addons/webdav.php:116
1070
  msgid "Leave this blank to use the default (80 for webdav, 443 for webdavs)"
1071
  msgstr ""
1072
 
1073
+ #: src/addons/webdav.php:108
1074
  msgid "Enter any path in the field below."
1075
  msgstr ""
1076
 
1077
+ #: src/addons/webdav.php:108
1078
  msgid "A host name cannot contain a slash."
1079
  msgstr ""
1080
 
1081
+ #: src/addons/webdav.php:83
1082
  msgid "Protocol (SSL or not)"
1083
  msgstr ""
1084
 
1085
+ #: src/addons/webdav.php:78
1086
  msgid "This WebDAV URL is generated by filling in the options below. If you do not know the details, then you will need to ask your WebDAV provider."
1087
  msgstr ""
1088
 
1089
+ #: src/udaddons/updraftplus-addons.php:889
1090
  msgid "No response data was received. This usually indicates a network connectivity issue (e.g. an outgoing firewall or overloaded network) between this site and UpdraftPlus.com."
1091
  msgstr ""
1092
 
1093
+ #: src/methods/s3.php:1168
1094
  msgid "The AWS access key looks to be wrong (valid %s access keys begin with \"AK\")"
1095
  msgstr ""
1096
 
1114
  msgid "FAQs"
1115
  msgstr ""
1116
 
1117
+ #: src/central/bootstrap.php:535
1118
  msgid "More information..."
1119
  msgstr ""
1120
 
1121
+ #: src/central/bootstrap.php:533
1122
  msgid "Use the alternative method for making a connection with the dashboard."
1123
  msgstr ""
1124
 
1125
+ #: src/central/bootstrap.php:443
1126
  msgid "Key size: %d bits"
1127
  msgstr ""
1128
 
1129
+ #: src/central/bootstrap.php:438
1130
  msgid "Public key was sent to:"
1131
  msgstr ""
1132
 
1133
+ #: src/backup.php:2233
1134
  msgid "Failed to open directory (check the file permissions and ownership): %s"
1135
  msgstr ""
1136
 
1137
+ #: src/backup.php:2211
1138
  msgid "%s: unreadable file - could not be backed up (check the file permissions and ownership)"
1139
  msgstr ""
1140
 
1141
+ #: src/addons/migrator.php:2286
1142
  msgid "Create key"
1143
  msgstr ""
1144
 
1145
+ #: src/addons/migrator.php:2283, src/central/bootstrap.php:527
1146
  msgid "slower, strongest"
1147
  msgstr ""
1148
 
1149
+ #: src/addons/migrator.php:2282, src/central/bootstrap.php:526
1150
  msgid "recommended"
1151
  msgstr "موصى به"
1152
 
1153
+ #: src/addons/migrator.php:2282, src/central/bootstrap.php:526
1154
  msgid "%s bytes"
1155
  msgstr ""
1156
 
1157
+ #: src/addons/migrator.php:2281, src/central/bootstrap.php:525
1158
  msgid "faster (possibility for slow PHP installs)"
1159
  msgstr ""
1160
 
1161
+ #: src/addons/migrator.php:2280, src/central/bootstrap.php:524
1162
  msgid "easy to break, fastest"
1163
  msgstr ""
1164
 
1165
+ #: src/addons/migrator.php:2280, src/addons/migrator.php:2281,
1166
+ #: src/addons/migrator.php:2283, src/central/bootstrap.php:524,
1167
+ #: src/central/bootstrap.php:525, src/central/bootstrap.php:527
1168
  msgid "%s bits"
1169
  msgstr ""
1170
 
1171
+ #: src/addons/migrator.php:2278, src/central/bootstrap.php:522
1172
  msgid "Encryption key size:"
1173
  msgstr ""
1174
 
1175
+ #: src/addons/migrator.php:2276
1176
  msgid "Enter your chosen name"
1177
  msgstr ""
1178
 
1179
+ #: src/addons/migrator.php:2275
1180
  msgid "Create a key: give this key a unique name (e.g. indicate the site it is for), then press \"Create Key\":"
1181
  msgstr ""
1182
 
1183
+ #: src/methods/googledrive.php:497
1184
  msgid "Upload expected to fail: the %s limit for any single file is %s, whereas this file is %s GB (%d bytes)"
1185
  msgstr ""
1186
 
1200
  msgid "This backup archive is %s MB in size - the attempt to send this via email is likely to fail (few email servers allow attachments of this size). If so, you should switch to using a different remote storage method."
1201
  msgstr ""
1202
 
1203
+ #: src/class-updraftplus.php:1754
1204
  msgid "Size: %s MB"
1205
  msgstr ""
1206
 
1212
  msgid "Now"
1213
  msgstr "الآن"
1214
 
1215
+ #: src/class-updraftplus.php:4411, src/restorer.php:1015
1216
  msgid "You should enable %s to make any pretty permalinks (e.g. %s) work"
1217
  msgstr ""
1218
 
1220
  msgid "(tap on an icon to select or unselect)"
1221
  msgstr ""
1222
 
1223
+ #: src/methods/updraftvault.php:310, src/methods/updraftvault.php:316,
1224
+ #: src/methods/updraftvault.php:322
1225
  msgid "%s per year"
1226
  msgstr ""
1227
 
1228
+ #: src/methods/updraftvault.php:309, src/methods/updraftvault.php:315,
1229
+ #: src/methods/updraftvault.php:321
1230
  msgid "or (annual discount)"
1231
  msgstr ""
1232
 
1234
  msgid "No Vault connection was found for this site (has it moved?); please disconnect and re-connect."
1235
  msgstr ""
1236
 
1237
+ #: src/class-updraftplus.php:538, src/class-updraftplus.php:583
1238
  msgid "The given file was not found, or could not be read."
1239
  msgstr ""
1240
 
1241
+ #: src/central/bootstrap.php:577
1242
  msgid "UpdraftCentral (Remote Control)"
1243
  msgstr ""
1244
 
1245
+ #: src/central/bootstrap.php:566
1246
  msgid "View recent UpdraftCentral log events"
1247
  msgstr ""
1248
 
1249
+ #: src/central/bootstrap.php:516
 
 
 
 
1250
  msgid "Enter any description"
1251
  msgstr ""
1252
 
1253
+ #: src/central/bootstrap.php:515
1254
  msgid "Description"
1255
  msgstr " الوصف"
1256
 
1257
+ #: src/central/bootstrap.php:448
1258
  msgid "Delete..."
1259
  msgstr ""
1260
 
1261
+ #: src/central/bootstrap.php:441
1262
  msgid "Created:"
1263
  msgstr ""
1264
 
1265
+ #: src/central/bootstrap.php:438
1266
  msgid "Access this site as user:"
1267
  msgstr ""
1268
 
1269
+ #: src/central/bootstrap.php:462
1270
  msgid "Details"
1271
  msgstr "تفاصيل عن المناسبة"
1272
 
1273
+ #: src/central/bootstrap.php:461
1274
  msgid "Key description"
1275
  msgstr ""
1276
 
1277
+ #: src/central/bootstrap.php:334, src/central/bootstrap.php:345
1278
  msgid "A key was created, but the attempt to register it with %s was unsuccessful - please try again later."
1279
  msgstr ""
1280
 
1281
+ #: src/central/bootstrap.php:206
1282
  msgid "An invalid URL was entered"
1283
  msgstr ""
1284
 
1285
+ #: src/central/bootstrap.php:82
1286
  msgid "Close..."
1287
  msgstr ""
1288
 
1289
+ #: src/central/bootstrap.php:74
1290
  msgid "This connection appears to already have been made."
1291
  msgstr ""
1292
 
1293
+ #: src/central/bootstrap.php:71
1294
  msgid "You must visit this link in the same browser and login session as you created the key in."
1295
  msgstr ""
1296
 
1297
+ #: src/central/bootstrap.php:67
1298
  msgid "You must visit this URL in the same browser and login session as you created the key in."
1299
  msgstr ""
1300
 
1301
+ #: src/central/bootstrap.php:67
1302
  msgid "You are not logged into this WordPress site in your web browser."
1303
  msgstr ""
1304
 
1305
+ #: src/central/bootstrap.php:64
1306
  msgid "The key referred to was unknown."
1307
  msgstr ""
1308
 
1309
+ #: src/central/bootstrap.php:61
1310
  msgid "A new UpdraftCentral connection has not been made."
1311
  msgstr ""
1312
 
1313
+ #: src/central/bootstrap.php:59
1314
  msgid "An UpdraftCentral connection has been made successfully."
1315
  msgstr ""
1316
 
1317
+ #: src/central/bootstrap.php:56
1318
  msgid "UpdraftCentral Connection"
1319
  msgstr ""
1320
 
1321
+ #: src/backup.php:917, src/class-updraftplus.php:2828
1322
  msgid "The backup was aborted by the user"
1323
  msgstr ""
1324
 
1325
+ #: src/admin.php:4496
1326
  msgid "Your settings have been saved."
1327
  msgstr "تم حفظ إعداداتك."
1328
 
1329
+ #: src/admin.php:3598
1330
  msgid "Total backup size:"
1331
  msgstr ""
1332
 
1333
+ #: src/admin.php:2955
1334
  msgid "stop"
1335
  msgstr "توقف"
1336
 
1337
+ #: src/admin.php:2797
1338
  msgid "The backup has finished running"
1339
  msgstr ""
1340
 
1360
  msgid "calculate"
1361
  msgstr ""
1362
 
1363
+ #: src/admin.php:733
1364
  msgid "You should save your changes to ensure that they are used for making your backup."
1365
  msgstr ""
1366
 
1367
+ #: src/admin.php:726
1368
  msgid "We requested to delete the file, but could not understand the server's response"
1369
  msgstr ""
1370
 
1371
+ #: src/admin.php:725
1372
  msgid "Please enter a valid URL"
1373
  msgstr ""
1374
 
1375
+ #: src/admin.php:708
1376
  msgid "Saving..."
1377
  msgstr "جاري الحفظ..."
1378
 
1379
+ #: src/admin.php:671
1380
  msgid "Error: the server sent us a response which we did not understand."
1381
  msgstr ""
1382
 
1383
+ #: src/admin.php:663
1384
  msgid "Fetching..."
1385
  msgstr ""
1386
 
1388
  msgid "Asia Pacific (Seoul)"
1389
  msgstr ""
1390
 
1391
+ #: src/restorer.php:1688
1392
  msgid "Uploads URL:"
1393
  msgstr ""
1394
 
1395
+ #: src/backup.php:435
1396
  msgid "Unexpected error: no class '%s' was found (your UpdraftPlus installation seems broken - try re-installing)"
1397
  msgstr ""
1398
 
1400
  msgid "The required %s PHP module is not installed - ask your web hosting company to enable it."
1401
  msgstr ""
1402
 
1403
+ #: src/class-updraftplus.php:4462, src/restorer.php:1707
1404
  msgid "To import an ordinary WordPress site into a multisite installation requires %s."
1405
  msgstr ""
1406
 
1407
+ #: src/class-updraftplus.php:4458
1408
  msgid "Please read this link for important information on this process."
1409
  msgstr ""
1410
 
1411
+ #: src/class-updraftplus.php:4458
1412
  msgid "It will be imported as a new site."
1413
  msgstr ""
1414
 
1415
+ #: src/admin.php:2588, src/templates/wp-admin/notices/horizontal-notice.php:16,
1416
  #: src/templates/wp-admin/notices/horizontal-notice.php:18
1417
  msgid "Dismiss"
1418
  msgstr "رفض"
1419
 
1420
+ #: src/admin.php:745
1421
  msgid "Please fill in the required information."
1422
  msgstr ""
1423
 
1437
  msgid "Which site to restore"
1438
  msgstr ""
1439
 
1440
+ #: src/addons/migrator.php:517, src/addons/migrator.php:518
1441
  msgid "Error when creating new site at your chosen address:"
1442
  msgstr ""
1443
 
1444
+ #: src/addons/migrator.php:459
1445
  msgid "Required information for restoring this backup was not given (%s)"
1446
  msgstr ""
1447
 
1448
+ #: src/addons/migrator.php:418
1449
  msgid "Attribute imported content to user"
1450
  msgstr ""
1451
 
1452
+ #: src/addons/migrator.php:408, src/addons/migrator.php:410
1453
  msgid "You must use lower-case letters or numbers for the site path, only."
1454
  msgstr ""
1455
 
1456
+ #: src/addons/migrator.php:396
1457
  msgid "This feature is not compatible with %s"
1458
  msgstr ""
1459
 
1460
+ #: src/addons/migrator.php:394, src/addons/migrator.php:396
1461
  msgid "Importing a single site into a multisite install"
1462
  msgstr ""
1463
 
1464
+ #: src/addons/migrator.php:385
1465
  msgid "other content from wp-content"
1466
  msgstr ""
1467
 
1468
+ #: src/addons/migrator.php:382
1469
  msgid "WordPress core"
1470
  msgstr ""
1471
 
1472
+ #: src/addons/migrator.php:382, src/addons/migrator.php:385,
1473
+ #: src/addons/migrator.php:388
1474
  msgid "You selected %s to be included in the restoration - this cannot / should not be done when importing a single site into a network."
1475
  msgstr ""
1476
 
1478
  msgid "Call WordPress action:"
1479
  msgstr ""
1480
 
1481
+ #: src/admin.php:2623
1482
  msgid "Your saved settings also affect what is backed up - e.g. files excluded."
1483
  msgstr ""
1484
 
1485
+ #: src/admin.php:4035
1486
  msgid "Skipping: this archive was already restored."
1487
  msgstr ""
1488
 
1514
  msgid "This button will delete all UpdraftPlus settings and progress information for in-progress backups (but not any of your existing backups from your cloud storage)."
1515
  msgstr ""
1516
 
1517
+ #: src/admin.php:4370
1518
  msgid "Send this backup to remote storage"
1519
  msgstr ""
1520
 
1521
+ #: src/admin.php:4368
1522
  msgid "Check out UpdraftPlus Vault."
1523
  msgstr ""
1524
 
1525
+ #: src/admin.php:4368
1526
  msgid "Not got any remote storage?"
1527
  msgstr ""
1528
 
1529
+ #: src/admin.php:4368
1530
  msgid "settings"
1531
  msgstr "إعدادات"
1532
 
1533
+ #: src/admin.php:4368
1534
  msgid "Backup won't be sent to any remote storage - none has been saved in the %s"
1535
  msgstr ""
1536
 
1537
+ #: src/admin.php:2621
1538
  msgid "Include any files in the backup"
1539
  msgstr ""
1540
 
1541
+ #: src/admin.php:2607
1542
  msgid "Include the database in the backup"
1543
  msgstr ""
1544
 
1545
+ #: src/admin.php:2587
1546
  msgid "Continue restoration"
1547
  msgstr ""
1548
 
1549
+ #: src/admin.php:2582
1550
  msgid "You have an unfinished restoration operation, begun %s ago."
1551
  msgstr ""
1552
 
1553
+ #: src/admin.php:2581
1554
  msgid "Unfinished restoration"
1555
  msgstr ""
1556
 
1557
+ #: src/admin.php:2579
1558
  msgid "%s minutes, %s seconds"
1559
  msgstr ""
1560
 
1561
+ #: src/admin.php:2526
1562
  msgid "Backup Contents And Schedule"
1563
  msgstr ""
1564
 
1566
  msgid "Premium / Extensions"
1567
  msgstr ""
1568
 
1569
+ #: src/admin.php:2295, src/admin.php:2304
1570
  msgid "Sufficient information about the in-progress restoration operation could not be found."
1571
  msgstr ""
1572
 
1573
+ #: src/addons/morefiles.php:55, src/admin.php:731
1574
  msgctxt "(verb)"
1575
  msgid "Download"
1576
  msgstr ""
1577
 
1578
+ #: src/admin.php:656
1579
  msgid "You have chosen to backup files, but no file entities have been selected"
1580
  msgstr ""
1581
 
1582
+ #: src/admin.php:558
1583
  msgid "Extensions"
1584
  msgstr "Extensions"
1585
 
1586
+ #: src/admin.php:550, src/templates/wp-admin/settings/tab-bar.php:8
1587
  msgid "Advanced Tools"
1588
  msgstr ""
1589
 
1590
+ #: src/addons/googlecloud.php:964
1591
  msgid "Bucket location"
1592
  msgstr ""
1593
 
1594
+ #: src/addons/googlecloud.php:959
1595
  msgid "Note that Google do not support every storage class in every location - you should read their documentation to learn about current availability."
1596
  msgstr ""
1597
 
1598
+ #: src/addons/googlecloud.php:959, src/addons/googlecloud.php:984
1599
  msgid "This setting applies only when a new bucket is being created."
1600
  msgstr ""
1601
 
1602
+ #: src/addons/googlecloud.php:947
1603
  msgid "You must use a bucket name that is unique, for all %s users."
1604
  msgstr ""
1605
 
1606
+ #: src/addons/googlecloud.php:906
1607
  msgid "Do not confuse %s with %s - they are separate things."
1608
  msgstr ""
1609
 
1610
+ #: src/addons/googlecloud.php:312
1611
  msgid "You do not have access to this bucket"
1612
  msgstr ""
1613
 
1614
+ #: src/addons/googlecloud.php:59, src/addons/googlecloud.php:60,
1615
+ #: src/addons/googlecloud.php:61
1616
  msgid "Western Europe"
1617
  msgstr ""
1618
 
1619
+ #: src/addons/googlecloud.php:55
1620
  msgid "Eastern Asia-Pacific"
1621
  msgstr ""
1622
 
1623
+ #: src/addons/googlecloud.php:54
1624
  msgid "Western United States"
1625
  msgstr ""
1626
 
1627
+ #: src/addons/googlecloud.php:53
1628
  msgid "Eastern United States"
1629
  msgstr ""
1630
 
1631
+ #: src/addons/googlecloud.php:52
1632
  msgid " Eastern United States"
1633
  msgstr ""
1634
 
1635
+ #: src/addons/googlecloud.php:51, src/addons/googlecloud.php:971
1636
  msgid "Central United States"
1637
  msgstr ""
1638
 
1639
+ #: src/addons/googlecloud.php:50
1640
  msgid "European Union"
1641
  msgstr ""
1642
 
1643
+ #: src/addons/googlecloud.php:49
1644
  msgid "Asia Pacific"
1645
  msgstr ""
1646
 
1647
+ #: src/addons/googlecloud.php:48, src/addons/googlecloud.php:49,
1648
+ #: src/addons/googlecloud.php:50
1649
  msgid "multi-region location"
1650
  msgstr ""
1651
 
1652
+ #: src/addons/googlecloud.php:48
1653
  msgid "United States"
1654
  msgstr ""
1655
 
1656
+ #: src/addons/googlecloud.php:43, src/addons/googlecloud.php:956
1657
  msgid "Nearline"
1658
  msgstr ""
1659
 
1660
+ #: src/addons/googlecloud.php:42, src/addons/googlecloud.php:955
1661
  msgid "Durable reduced availability"
1662
  msgstr ""
1663
 
1664
+ #: src/addons/googlecloud.php:41, src/addons/googlecloud.php:954,
1665
+ #: src/addons/s3-enhanced.php:61
1666
  msgid "Standard"
1667
  msgstr ""
1668
 
1669
+ #: src/addons/azure.php:553
1670
  msgid "container"
1671
  msgstr ""
1672
 
1673
+ #: src/addons/azure.php:553
1674
  msgid "You can enter the path of any %s virtual folder you wish to use here."
1675
  msgstr ""
1676
 
1677
+ #: src/addons/azure.php:552
1678
  msgid "optional"
1679
  msgstr ""
1680
 
1681
+ #: src/addons/azure.php:548
 
 
 
 
1682
  msgid "See Microsoft's guidelines on container naming by following this link."
1683
  msgstr ""
1684
 
1685
+ #: src/addons/azure.php:548
1686
  msgid "Enter the path of the %s you wish to use here."
1687
  msgstr ""
1688
 
1689
+ #: src/addons/azure.php:539
1690
  msgid "This is not your Azure login - see the instructions if needing more guidance."
1691
  msgstr ""
1692
 
1693
+ #: src/addons/azure.php:538, src/addons/azure.php:542,
1694
+ #: src/addons/azure.php:547, src/addons/azure.php:552
 
 
 
1695
  msgid "Azure"
1696
  msgstr ""
1697
 
1698
+ #: src/addons/azure.php:534
1699
  msgid "Create Azure credentials in your Azure developer console."
1700
  msgstr ""
1701
 
1707
  msgid "Could not access container"
1708
  msgstr ""
1709
 
1710
+ #: src/class-updraftplus.php:2845
1711
  msgid "To complete your migration/clone, you should now log in to the remote site and restore the backup set."
1712
  msgstr ""
1713
 
1714
+ #: src/backup.php:1667
1715
  msgid "the options table was not found"
1716
  msgstr ""
1717
 
1718
+ #: src/backup.php:1665
1719
  msgid "no options or sitemeta table was found"
1720
  msgstr ""
1721
 
1722
+ #: src/backup.php:1665, src/backup.php:1667
1723
  msgid "The database backup appears to have failed"
1724
  msgstr ""
1725
 
1726
+ #: src/backup.php:1537
1727
  msgid "The backup directory is not writable (or disk space is full) - the database backup is expected to shortly fail."
1728
  msgstr ""
1729
 
1735
  msgid "Not installed"
1736
  msgstr "لم يتم التثبيت"
1737
 
1738
+ #: src/addons/googlecloud.php:950, src/addons/s3-enhanced.php:54
1739
  msgid "Storage class"
1740
  msgstr ""
1741
 
1742
+ #: src/addons/googlecloud.php:947
1743
  msgid "See Google's guidelines on bucket naming by following this link."
1744
  msgstr ""
1745
 
1746
+ #: src/addons/googlecloud.php:947
1747
  msgid "Enter the name of the %s bucket you wish to use here."
1748
  msgstr ""
1749
 
1750
+ #: src/addons/googlecloud.php:946
1751
  msgid "Bucket"
1752
  msgstr ""
1753
 
1754
+ #: src/addons/googlecloud.php:942
1755
  msgid "Otherwise, you can leave it blank."
1756
  msgstr ""
1757
 
1758
+ #: src/addons/googlecloud.php:942
1759
  msgid "N.B. This is only needed if you have not already created the bucket, and you wish UpdraftPlus to create it for you."
1760
  msgstr ""
1761
 
1762
+ #: src/addons/googlecloud.php:942
1763
  msgid "Enter the ID of the %s project you wish to use here."
1764
  msgstr ""
1765
 
1766
+ #: src/addons/googlecloud.php:918
1767
  msgid "Follow this link to your Google API Console, and there activate the Storage API and create a Client ID in the API Access section."
1768
  msgstr ""
1769
 
1770
+ #: src/addons/googlecloud.php:831
1771
  msgid "You must enter a project ID in order to be able to create a new bucket."
1772
  msgstr ""
1773
 
1775
  msgid "Project ID"
1776
  msgstr ""
1777
 
1778
+ #: src/addons/googlecloud.php:690
1779
  msgid "You must save and authenticate before you can test your settings."
1780
  msgstr ""
1781
 
1782
+ #: src/addons/googlecloud.php:537
1783
  msgid "Have not yet obtained an access token from Google - you need to authorise or re-authorise your connection to Google Cloud."
1784
  msgstr ""
1785
 
1786
+ #: src/addons/googlecloud.php:259, src/addons/googlecloud.php:332,
1787
+ #: src/addons/googlecloud.php:823, src/addons/googlecloud.php:870
1788
  msgid "You do not have access to this bucket."
1789
  msgstr ""
1790
 
1791
+ #: src/addons/googlecloud.php:259, src/addons/googlecloud.php:312,
1792
+ #: src/addons/googlecloud.php:322, src/addons/googlecloud.php:332,
1793
+ #: src/addons/googlecloud.php:649, src/addons/googlecloud.php:823,
1794
+ #: src/addons/googlecloud.php:870, src/addons/googlecloud.php:912,
1795
+ #: src/addons/googlecloud.php:912, src/addons/googlecloud.php:927,
1796
+ #: src/addons/googlecloud.php:935, src/addons/googlecloud.php:947
1797
  msgid "Google Cloud"
1798
  msgstr ""
1799
 
1800
+ #: src/addons/googlecloud.php:259, src/addons/googlecloud.php:312,
1801
+ #: src/addons/googlecloud.php:332, src/addons/googlecloud.php:823,
1802
+ #: src/addons/googlecloud.php:870
1803
  msgid "%s Service Exception."
1804
  msgstr ""
1805
 
1836
  msgid "Press here to look inside your remote storage methods for any existing backup sets (from any site, if they are stored in the same folder)."
1837
  msgstr ""
1838
 
1839
+ #: src/admin.php:1678
1840
  msgid "Backup sets removed:"
1841
  msgstr ""
1842
 
1843
+ #: src/admin.php:744
1844
  msgid "Processing..."
1845
  msgstr ""
1846
 
1847
+ #: src/admin.php:742
1848
  msgid "For backups older than"
1849
  msgstr ""
1850
 
1851
+ #: src/admin.php:741
1852
  msgid "week(s)"
1853
  msgstr ""
1854
 
1855
+ #: src/admin.php:740
1856
  msgid "hour(s)"
1857
  msgstr ""
1858
 
1859
+ #: src/admin.php:739
1860
  msgid "day(s)"
1861
  msgstr ""
1862
 
1863
+ #: src/admin.php:738
1864
  msgid "in the month"
1865
  msgstr ""
1866
 
1867
+ #: src/admin.php:737
1868
  msgid "day"
1869
  msgstr ""
1870
 
1876
  msgid "Add an additional retention rule..."
1877
  msgstr ""
1878
 
1879
+ #: src/restorer.php:2210
1880
  msgid "This database needs to be deployed on MySQL version %s or later."
1881
  msgstr ""
1882
 
1883
+ #: src/restorer.php:2210
1884
  msgid "This problem is caused by trying to restore a database on a very old MySQL version that is incompatible with the source database."
1885
  msgstr ""
1886
 
1887
+ #: src/methods/updraftvault.php:670
1888
  msgid "You do not currently have any UpdraftPlus Vault quota"
1889
  msgstr ""
1890
 
1891
+ #: src/class-updraftplus.php:4500
1892
  msgid "You must upgrade MySQL to be able to use this database."
1893
  msgstr ""
1894
 
1895
+ #: src/class-updraftplus.php:4500
1896
  msgid "The database backup uses MySQL features not available in the old MySQL version (%s) that this site is running on."
1897
  msgstr ""
1898
 
1899
+ #: src/admin.php:2414
1900
  msgid "The UpdraftPlus directory in wp-content/plugins has white-space in it; WordPress does not like this. You should rename the directory to wp-content/plugins/updraftplus to fix this problem."
1901
  msgstr ""
1902
 
1903
+ #: src/methods/updraftvault.php:342
1904
  msgid "Don't know your email address, or forgotten your password?"
1905
  msgstr ""
1906
 
1907
+ #: src/methods/updraftvault.php:335
1908
  msgid "Enter your UpdraftPlus.Com email / password here to connect:"
1909
  msgstr ""
1910
 
1911
+ #: src/methods/updraftvault.php:299, src/methods/updraftvault.php:328
1912
  msgid "Read the FAQs here."
1913
  msgstr ""
1914
 
1920
  msgid "Server-side encryption"
1921
  msgstr ""
1922
 
1923
+ #: src/methods/updraftvault.php:678
1924
  msgid "If you have forgotten your password, then go here to change your password on updraftplus.com."
1925
  msgstr ""
1926
 
1927
+ #: src/admin.php:1003
1928
  msgid "Go to the remote storage settings in order to connect."
1929
  msgstr ""
1930
 
1931
+ #: src/admin.php:1003
1932
  msgid "%s has been chosen for remote storage, but you are not currently connected."
1933
  msgstr ""
1934
 
1935
+ #: src/methods/updraftvault.php:325
1936
  msgid "Payments can be made in US dollars, euros or GB pounds sterling, via card or PayPal."
1937
  msgstr ""
1938
 
1939
+ #: src/admin.php:714
1940
  msgid "Update quota count"
1941
  msgstr ""
1942
 
1943
+ #: src/admin.php:713
1944
  msgid "Counting..."
1945
  msgstr ""
1946
 
1947
+ #: src/admin.php:712
1948
  msgid "Disconnecting..."
1949
  msgstr ""
1950
 
1951
+ #: src/admin.php:710
1952
  msgid "Connecting..."
1953
  msgstr ""
1954
 
1955
+ #: src/methods/updraftvault.php:431, src/methods/updraftvault.php:505
1956
  msgid "Refresh current status"
1957
  msgstr ""
1958
 
1959
+ #: src/methods/updraftvault.php:429, src/methods/updraftvault.php:445,
1960
+ #: src/methods/updraftvault.php:447, src/methods/updraftvault.php:505
1961
  msgid "Get more quota"
1962
  msgstr ""
1963
 
1964
+ #: src/methods/updraftvault.php:426, src/methods/updraftvault.php:442,
1965
+ #: src/methods/updraftvault.php:486
1966
  msgid "Current use:"
1967
  msgstr ""
1968
 
1969
+ #: src/methods/updraftvault.php:421
1970
  msgid "You can get more quota here"
1971
  msgstr ""
1972
 
1973
+ #: src/methods/updraftvault.php:421
1974
  msgid "%s Error: you have insufficient storage quota available (%s) to upload this archive (%s)."
1975
  msgstr ""
1976
 
1977
+ #: src/admin.php:711, src/methods/updraftvault.php:369,
1978
+ #: src/methods/updraftvault.php:413
1979
  msgid "Disconnect"
1980
  msgstr ""
1981
 
1982
+ #: src/methods/updraftvault.php:366, src/methods/updraftvault.php:405
1983
  msgid "Quota:"
1984
  msgstr ""
1985
 
1986
+ #: src/methods/updraftvault.php:365, src/methods/updraftvault.php:403
1987
  msgid "Vault owner"
1988
  msgstr ""
1989
 
1990
+ #: src/methods/updraftvault.php:365, src/methods/updraftvault.php:403
1991
  msgid "Well done - there's nothing more needed to set up."
1992
  msgstr ""
1993
 
1994
+ #: src/methods/updraftvault.php:365, src/methods/updraftvault.php:403
1995
  msgid "This site is <strong>connected</strong> to UpdraftPlus Vault."
1996
  msgstr ""
1997
 
1998
+ #: src/methods/updraftvault.php:371, src/methods/updraftvault.php:399
1999
  msgid "You are <strong>not connected</strong> to UpdraftPlus Vault."
2000
  msgstr ""
2001
 
2002
+ #: src/methods/updraftvault.php:342
2003
  msgid "Go here for help"
2004
  msgstr ""
2005
 
2006
+ #: src/methods/updraftvault.php:337
2007
  msgid "E-mail"
2008
  msgstr ""
2009
 
2010
+ #: src/central/bootstrap.php:552, src/methods/updraftvault.php:331,
2011
+ #: src/methods/updraftvault.php:345
2012
  msgid "Back..."
2013
  msgstr ""
2014
 
2015
+ #: src/methods/updraftvault.php:325
2016
  msgid "Subscriptions can be cancelled at any time."
2017
  msgstr ""
2018
 
2019
+ #: src/methods/updraftvault.php:308, src/methods/updraftvault.php:314,
2020
+ #: src/methods/updraftvault.php:320
2021
  msgid "%s per quarter"
2022
  msgstr ""
2023
 
2024
+ #: src/central/bootstrap.php:579, src/methods/updraftvault.php:299,
2025
+ #: src/methods/updraftvault.php:328
2026
  msgid "Read more about it here."
2027
  msgstr ""
2028
 
2029
+ #: src/methods/updraftvault.php:299, src/methods/updraftvault.php:328
2030
  msgid "UpdraftPlus Vault is built on top of Amazon's world-leading data-centres, with redundant data storage to achieve 99.999999999% reliability."
2031
  msgstr ""
2032
 
2033
+ #: src/methods/updraftvault.php:295
2034
  msgid "Already purchased space?"
2035
  msgstr ""
2036
 
2037
+ #: src/methods/updraftvault.php:292
2038
  msgid "Show the options"
2039
  msgstr ""
2040
 
2041
+ #: src/methods/updraftvault.php:291
2042
  msgid "First time user?"
2043
  msgstr ""
2044
 
2045
+ #: src/methods/updraftvault.php:288, src/methods/updraftvault.php:305
2046
  msgid "Press a button to get started."
2047
  msgstr ""
2048
 
2049
+ #: src/methods/updraftvault.php:288, src/methods/updraftvault.php:305
2050
  msgid "UpdraftPlus Vault brings you storage that is <strong>reliable, easy to use and a great price</strong>."
2051
  msgstr ""
2052
 
2067
  msgstr ""
2068
 
2069
  #: src/addons/azure.php:388, src/addons/backblaze.php:464,
2070
+ #: src/addons/googlecloud.php:774, src/methods/s3.php:1196
2071
  msgid "Delete failed:"
2072
  msgstr ""
2073
 
2074
+ #: src/backup.php:3278
2075
  msgid "The zip engine returned the message: %s."
2076
  msgstr ""
2077
 
2091
  msgid "Allow download"
2092
  msgstr ""
2093
 
2094
+ #: src/addons/migrator.php:1830
2095
  msgid "If sending directly from site to site does not work for you, then there are three other methods - please try one of these instead."
2096
  msgstr ""
2097
 
2098
+ #: src/addons/migrator.php:1815, src/admin.php:720
2099
  msgid "You should check that the remote site is online, not firewalled, does not have security modules that may be blocking access, has UpdraftPlus version %s or later active and that the keys have been entered correctly."
2100
  msgstr ""
2101
 
2102
+ #: src/addons/migrator.php:2318
2103
  msgid "Existing keys"
2104
  msgstr ""
2105
 
2106
+ #: src/addons/migrator.php:2309
2107
  msgid "No keys to allow remote sites to connect have yet been created."
2108
  msgstr ""
2109
 
2110
+ #: src/addons/migrator.php:2291
2111
  msgid "Your new key:"
2112
  msgstr ""
2113
 
2114
+ #: src/addons/migrator.php:2270
2115
  msgid "To allow another site to send a backup to this site, create a key, and then press the 'Migrate' button on the sending site, and copy-and-paste the key there."
2116
  msgstr ""
2117
 
2118
+ #: src/addons/migrator.php:2252
2119
  msgid "So, to get the key for the remote site, open the 'Migrate' window on that site, scroll down, and you can create one there."
2120
  msgstr ""
2121
 
2122
+ #: src/addons/migrator.php:2252
2123
  msgid "Keys for this site are created in the section below the one you just pressed in."
2124
  msgstr ""
2125
 
2126
+ #: src/addons/migrator.php:1932, src/central/bootstrap.php:388
2127
  msgid "You must copy and paste this key now - it cannot be shown again."
2128
  msgstr ""
2129
 
2130
+ #: src/