All in One SEO Pack - Version 3.4.2

Version Description

Download this release

Release Info

Developer benjaminprojas
Plugin Icon 128x128 All in One SEO Pack
Version 3.4.2
Comparing to
See all releases

Code changes from version 3.3.5 to 3.4.2

Files changed (79) hide show
  1. admin/aioseop_module_class.php +48 -188
  2. admin/aioseop_module_manager.php +14 -1
  3. admin/class-aioseop-helper.php +172 -31
  4. admin/class-aioseop-notices.php +31 -32
  5. admin/display/credits-content.php +0 -96
  6. admin/display/general-metaboxes.php +44 -42
  7. admin/display/menu.php +26 -10
  8. admin/display/notice-aioseop.php +50 -4
  9. admin/display/notice-default.php +50 -4
  10. admin/display/notices/check-php-version-notice.php +37 -0
  11. admin/display/notices/conflicting-plugin-notice.php +45 -0
  12. admin/display/notices/review-plugin-cta-notice.php +116 -0
  13. admin/display/notices/wc-detected-notice.php +10 -14
  14. admin/display/welcome-content.php +1 -1
  15. admin/display/welcome.php +2 -2
  16. admin/meta_import.php +1 -1
  17. aioseop_class.php +264 -191
  18. all_in_one_seo_pack.php +18 -590
  19. build/aioseop-link-attributes-gutenberg-editor.asset.php +4 -0
  20. build/aioseop-link-attributes-gutenberg-editor.js +6 -0
  21. class-aioseop-core.php +786 -0
  22. css/admin-notice.css +26 -9
  23. css/admin-toolbar-menu.css +14 -0
  24. css/admin/aioseop-about.css +5361 -0
  25. css/admin/aioseop-flyout.css +163 -0
  26. css/admin/selectize-v0.12.6/selectize.css +333 -0
  27. css/admin/selectize-v0.12.6/selectize.default.css +403 -0
  28. css/admin/selectize-v0.12.6/selectize.default.min.css +1 -0
  29. css/admin/selectize-v0.12.6/selectize.min.css +1 -0
  30. css/aioseop-font-icons.css +1 -25
  31. css/aiosp_admin.css +417 -41
  32. css/modules/aioseop_module.css +18 -54
  33. images/about/about-team.jpg +0 -0
  34. images/about/icon-full.svg +1 -0
  35. images/about/icon-none.svg +1 -0
  36. images/about/icon-partial.svg +1 -0
  37. images/about/plugin-mi.png +0 -0
  38. images/about/plugin-om.png +0 -0
  39. images/about/plugin-rp.png +0 -0
  40. images/about/plugin-smtp.png +0 -0
  41. images/about/plugin-wpforms.png +0 -0
  42. images/flyout/comments-solid.svg +1 -0
  43. images/flyout/gear-default.png +0 -0
  44. images/flyout/life-ring-regular.svg +1 -0
  45. images/flyout/lightbulb-regular.svg +1 -0
  46. images/flyout/star-solid.svg +1 -0
  47. inc/admin/class-aioseop-education.php +964 -0
  48. inc/admin/class-aioseop-link-attributes.php +93 -0
  49. inc/admin/helpers/PluginSilentUpgrader.php +571 -0
  50. inc/admin/helpers/PluginSilentUpgraderSkin.php +56 -0
  51. inc/admin/helpers/class-install-skin.php +19 -0
  52. inc/admin/views/class-aioseop-about.php +830 -0
  53. inc/admin/views/class-aioseop-flyout.php +159 -0
  54. inc/aioseop_functions.php +245 -97
  55. inc/aioseop_updates_class.php +0 -20
  56. inc/compatibility/abstract/aiosep_compatible.php +1 -1
  57. inc/compatibility/class-aioseop-php-functions.php +196 -0
  58. inc/compatibility/compat-wpml.php +1 -1
  59. inc/compatibility/gutenberg-chrome.php +2 -2
  60. inc/schema/aioseop-context.php +877 -0
  61. inc/schema/graphs/graph-breadcrumblist.php +150 -0
  62. inc/schema/graphs/graph-itemlist.php +52 -0
  63. inc/schema/graphs/graph-webpage.php +29 -1
  64. inc/schema/graphs/graph.php +1 -1
  65. inc/schema/schema-builder.php +14 -1
  66. js/admin/aioseop-about.js +139 -0
  67. js/admin/aioseop-count-chars-old.js +1 -2
  68. js/admin/aioseop-flyout.js +74 -0
  69. js/admin/aioseop-link-attributes-classic-editor.js +886 -0
  70. js/admin/aioseop-preview-snippet.js +9 -4
  71. js/admin/aioseop-quickedit.js +171 -0
  72. js/admin/education/aioseop-deactivate-conflicting-plugins.js +41 -0
  73. js/admin/education/aioseop-license-box.js +66 -0
  74. js/admin/education/aioseop-notice-bar.js +98 -0
  75. js/admin/education/aioseop-sitemap-prio-upsell.js +33 -0
  76. js/admin/education/aioseop-taxonomies-upsell.js +59 -0
  77. js/admin/education/aioseop-video-sitemap-upsell.js +87 -0
  78. js/admin/selectize-v0.12.6/selectize.js +3891 -0
  79. js/admin/selectize-v0.12.6/selectize.min.js +4 -0
admin/aioseop_module_class.php CHANGED
@@ -263,8 +263,8 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
263
  * @throws BadMethodCallException
264
  */
265
  function __call( $name, $arguments ) {
266
- if ( $this->strpos( $name, 'display_settings_page_' ) === 0 ) {
267
- return $this->display_settings_page( $this->substr( $name, 22 ) );
268
  }
269
  $error = sprintf( __( "Method %s doesn't exist", 'all-in-one-seo-pack' ), $name );
270
  if ( class_exists( 'BadMethodCallException' ) ) {
@@ -382,168 +382,6 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
382
  return ( isset( $this->options[ $opt ] ) && $this->options[ $opt ] );
383
  }
384
 
385
- /**
386
- * Case conversion; handle non UTF-8 encodings and fallback **
387
- *
388
- * @param $str
389
- * @param string $mode
390
- *
391
- * @return string
392
- */
393
-
394
- function convert_case( $str, $mode = 'upper' ) {
395
- static $charset = null;
396
- if ( null == $charset ) {
397
- $charset = get_bloginfo( 'charset' );
398
- }
399
- $str = (string) $str;
400
- if ( 'title' == $mode ) {
401
- if ( function_exists( 'mb_convert_case' ) ) {
402
- return mb_convert_case( $str, MB_CASE_TITLE, $charset );
403
- } else {
404
- return ucwords( $str );
405
- }
406
- }
407
-
408
- if ( 'UTF-8' == $charset ) {
409
- // phpcs:disable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
410
- global $UTF8_TABLES;
411
- include_once( AIOSEOP_PLUGIN_DIR . 'inc/aioseop_UTF8.php' );
412
- if ( is_array( $UTF8_TABLES ) ) {
413
- if ( 'upper' == $mode ) {
414
- return strtr( $str, $UTF8_TABLES['strtoupper'] );
415
- }
416
- if ( 'lower' == $mode ) {
417
- return strtr( $str, $UTF8_TABLES['strtolower'] );
418
- }
419
- }
420
- // phpcs:enable
421
- }
422
-
423
- if ( 'upper' == $mode ) {
424
- if ( function_exists( 'mb_strtoupper' ) ) {
425
- return mb_strtoupper( $str, $charset );
426
- } else {
427
- return strtoupper( $str );
428
- }
429
- }
430
-
431
- if ( 'lower' == $mode ) {
432
- if ( function_exists( 'mb_strtolower' ) ) {
433
- return mb_strtolower( $str, $charset );
434
- } else {
435
- return strtolower( $str );
436
- }
437
- }
438
-
439
- return $str;
440
- }
441
-
442
- /**
443
- * Convert a string to lower case
444
- * Compatible with mb_strtolower(), an UTF-8 friendly replacement for strtolower()
445
- *
446
- * @param $str
447
- *
448
- * @return string
449
- */
450
- function strtolower( $str ) {
451
- return $this->convert_case( $str, 'lower' );
452
- }
453
-
454
- /**
455
- * Convert a string to upper case
456
- * Compatible with mb_strtoupper(), an UTF-8 friendly replacement for strtoupper()
457
- *
458
- * @param $str
459
- *
460
- * @return string
461
- */
462
- function strtoupper( $str ) {
463
- return $this->convert_case( $str, 'upper' );
464
- }
465
-
466
- /**
467
- * Convert a string to title case
468
- * Compatible with mb_convert_case(), an UTF-8 friendly replacement for ucwords()
469
- *
470
- * @param $str
471
- *
472
- * @return string
473
- */
474
- function ucwords( $str ) {
475
- return $this->convert_case( $str, 'title' );
476
- }
477
-
478
- /**
479
- * Wrapper for strlen() - uses mb_strlen() if possible.
480
- *
481
- * @param $string
482
- *
483
- * @return int
484
- */
485
- function strlen( $string ) {
486
- if ( function_exists( 'mb_strlen' ) ) {
487
- return mb_strlen( $string, 'UTF-8' );
488
- }
489
-
490
- return strlen( $string );
491
- }
492
-
493
- /**
494
- * Wrapper for substr() - uses mb_substr() if possible.
495
- *
496
- * @param $string
497
- * @param int $start
498
- * @param int $length
499
- *
500
- * @return mixed
501
- */
502
- function substr( $string, $start = 0, $length = 2147483647 ) {
503
- $args = func_get_args();
504
- if ( function_exists( 'mb_substr' ) ) {
505
- return call_user_func_array( 'mb_substr', $args );
506
- }
507
-
508
- return call_user_func_array( 'substr', $args );
509
- }
510
-
511
- /**
512
- * Wrapper for strpos() - uses mb_strpos() if possible.
513
- *
514
- * @param $haystack
515
- * @param string $needle
516
- *
517
- * @param int $offset
518
- *
519
- * @return bool|int
520
- */
521
- function strpos( $haystack, $needle, $offset = 0 ) {
522
- if ( function_exists( 'mb_strpos' ) ) {
523
- return mb_strpos( $haystack, $needle, $offset, 'UTF-8' );
524
- }
525
-
526
- return strpos( $haystack, $needle, $offset );
527
- }
528
-
529
- /**
530
- * Wrapper for strrpos() - uses mb_strrpos() if possible.
531
- *
532
- * @param $haystack
533
- * @param string $needle
534
- *
535
- * @param int $offset
536
- *
537
- * @return bool|int
538
- */
539
- function strrpos( $haystack, $needle, $offset = 0 ) {
540
- if ( function_exists( 'mb_strrpos' ) ) {
541
- return mb_strrpos( $haystack, $needle, $offset, 'UTF-8' );
542
- }
543
-
544
- return strrpos( $haystack, $needle, $offset );
545
- }
546
-
547
  /**
548
  * Convert html string to php array - useful to get a serializable value.
549
  *
@@ -1172,7 +1010,7 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
1172
 
1173
  if ( is_array( $post_custom_fields ) ) {
1174
  foreach ( $post_custom_fields as $field_name => $field ) {
1175
- if ( ( $this->strpos( $field_name, $prefix ) === 0 ) && $field[0] ) {
1176
  $has_data = true;
1177
  $data .= $field_name . " = '" . $field[0] . "'\n";
1178
  }
@@ -1475,9 +1313,9 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
1475
  return $file;
1476
  }
1477
  if ( 0 > $maxlen ) {
1478
- return $this->substr( $file, $offset );
1479
  } else {
1480
- return $this->substr( $file, $offset, $maxlen );
1481
  }
1482
  } else {
1483
  return $wpfs->get_contents( $filename );
@@ -1918,9 +1756,10 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
1918
  * Get the Image by Attachment
1919
  *
1920
  * @since ?
 
1921
  *
1922
- * @param null $p
1923
- * @return bool
1924
  */
1925
  function get_the_image_by_attachment( $p = null ) {
1926
 
@@ -1930,6 +1769,10 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
1930
  $post = $p;
1931
  }
1932
 
 
 
 
 
1933
  $attachments = get_children(
1934
  array(
1935
  'post_parent' => $post->ID,
@@ -1948,7 +1791,7 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
1948
 
1949
  /* If no attachments or image is found, return false. */
1950
  if ( empty( $attachments ) && empty( $image ) ) {
1951
- return false;
1952
  }
1953
 
1954
  /* Set the default iterator to 0. */
@@ -1973,10 +1816,13 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
1973
  /**
1974
  * Get the Image by Scan
1975
  *
 
 
1976
  * @since ?
 
1977
  *
1978
- * @param null $p
1979
- * @return bool
1980
  */
1981
  function get_the_image_by_scan( $p = null ) {
1982
  if ( null === $p ) {
@@ -1985,15 +1831,21 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
1985
  $post = $p;
1986
  }
1987
 
 
 
 
 
 
 
1988
  /* Search the post's content for the <img /> tag and get its URL. */
1989
  preg_match_all( '|<img.*?src=[\'"](.*?)[\'"].*?>|i', get_post_field( 'post_content', $post->ID ), $matches );
1990
 
1991
  /* If there is a match for the image, return its URL. */
1992
  if ( isset( $matches ) && ! empty( $matches[1][0] ) ) {
1993
- return $matches[1][0];
1994
  }
1995
 
1996
- return false;
1997
  }
1998
 
1999
  /**
@@ -2222,8 +2074,8 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
2222
  */
2223
  function add_page_hooks() {
2224
  $hookname = current_filter();
2225
- if ( $this->strpos( $hookname, 'load-' ) === 0 ) {
2226
- $this->pagehook = $this->substr( $hookname, 5 );
2227
  }
2228
  add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
2229
  add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_styles' ) );
@@ -2256,11 +2108,13 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
2256
  $url = esc_url( admin_url( 'admin.php?page=' . $hookname ) );
2257
  }
2258
 
 
 
2259
  if ( null === $this->locations ) {
2260
  array_unshift(
2261
  $links,
2262
  array(
2263
- 'parent' => AIOSEOP_PLUGIN_DIRNAME,
2264
  'title' => $name,
2265
  'id' => $hookname,
2266
  'href' => $url,
@@ -2274,7 +2128,7 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
2274
  array_unshift(
2275
  $links,
2276
  array(
2277
- 'parent' => AIOSEOP_PLUGIN_DIRNAME,
2278
  'title' => $name,
2279
  'id' => $hookname,
2280
  'href' => $url,
@@ -2290,7 +2144,7 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
2290
  array_unshift(
2291
  $links,
2292
  array(
2293
- 'parent' => AIOSEOP_PLUGIN_DIRNAME,
2294
  'title' => $name,
2295
  'id' => $this->get_prefix( $k ) . $k,
2296
  'href' => esc_url( admin_url( 'admin.php?page=' . $this->get_prefix( $k ) . $k ) ),
@@ -2341,6 +2195,12 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
2341
  } else {
2342
  $name = $this->name;
2343
  }
 
 
 
 
 
 
2344
  if ( null === $this->locations ) {
2345
  $hookname = add_submenu_page(
2346
  $parent_slug,
@@ -2731,7 +2591,7 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
2731
  wp_enqueue_script( 'jquery-ui-datepicker' );
2732
  // fall through.
2733
  default:
2734
- $buf .= "<input name='" . esc_attr( $name ) . "' type='" . esc_attr( $options['type'] ) . "' " . wp_kses( $attr, wp_kses_allowed_html( 'data' ) ) . " value='" . esc_attr( $value ) . "' autocomplete='aioseop-" . time() . "'>\n";
2735
  }
2736
 
2737
  // TODO Maybe Change/Add a function for SEO character count.
@@ -2748,8 +2608,8 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
2748
  /* translators: %1$s and %2$s are placeholders and should not be translated. %1$s is replaced with a number, %2$s is replaced with the name of an meta tag field (e.g; "Title", "Description", etc.). */
2749
  $count_desc = __( ' characters. Most search engines use a maximum of %1$s chars for the %2$s.', 'all-in-one-seo-pack' );
2750
  }
2751
- $buf .= "<br /><input readonly tabindex='-1' type='text' name='{$prefix}length$n' size='3' maxlength='3' style='width:53px;height:23px;margin:0px;padding:0px 0px 0px 10px;' value='" . $this->strlen( $value ) . "' />"
2752
- . sprintf( $count_desc, $size, trim( $this->strtolower( $options['name'] ), ':' ) );
2753
  if ( ! empty( $onload ) ) {
2754
  $buf .= "<script>jQuery( document ).ready(function() { {$onload} });</script>";
2755
  }
@@ -2930,11 +2790,11 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
2930
  */
2931
  function sanitize_domain( $domain ) {
2932
  $domain = trim( $domain );
2933
- $domain = $this->strtolower( $domain );
2934
- if ( 0 === $this->strpos( $domain, 'http://' ) ) {
2935
- $domain = $this->substr( $domain, 7 );
2936
- } elseif ( 0 === $this->strpos( $domain, 'https://' ) ) {
2937
- $domain = $this->substr( $domain, 8 );
2938
  }
2939
  $domain = untrailingslashit( $domain );
2940
 
@@ -3295,7 +3155,7 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module' ) ) {
3295
  if ( ! empty( $options ) ) {
3296
  foreach ( $options as $k => $v ) {
3297
  if ( ! isset( $v['name'] ) ) {
3298
- $v['name'] = $this->ucwords( strtr( $k, '_', ' ' ) );
3299
  }
3300
  if ( ! isset( $v['type'] ) ) {
3301
  $v['type'] = 'checkbox';
263
  * @throws BadMethodCallException
264
  */
265
  function __call( $name, $arguments ) {
266
+ if ( AIOSEOP_PHP_Functions::strpos( $name, 'display_settings_page_' ) === 0 ) {
267
+ return $this->display_settings_page( AIOSEOP_PHP_Functions::substr( $name, 22 ) );
268
  }
269
  $error = sprintf( __( "Method %s doesn't exist", 'all-in-one-seo-pack' ), $name );
270
  if ( class_exists( 'BadMethodCallException' ) ) {
382
  return ( isset( $this->options[ $opt ] ) && $this->options[ $opt ] );
383
  }
384
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
385
  /**
386
  * Convert html string to php array - useful to get a serializable value.
387
  *
1010
 
1011
  if ( is_array( $post_custom_fields ) ) {
1012
  foreach ( $post_custom_fields as $field_name => $field ) {
1013
+ if ( ( AIOSEOP_PHP_Functions::strpos( $field_name, $prefix ) === 0 ) && $field[0] ) {
1014
  $has_data = true;
1015
  $data .= $field_name . " = '" . $field[0] . "'\n";
1016
  }
1313
  return $file;
1314
  }
1315
  if ( 0 > $maxlen ) {
1316
+ return AIOSEOP_PHP_Functions::substr( $file, $offset );
1317
  } else {
1318
+ return AIOSEOP_PHP_Functions::substr( $file, $offset, $maxlen );
1319
  }
1320
  } else {
1321
  return $wpfs->get_contents( $filename );
1756
  * Get the Image by Attachment
1757
  *
1758
  * @since ?
1759
+ * @since 3.4 Change return variable type bool|string to just string.
1760
  *
1761
+ * @param null|WP_Post $p WP Post object.
1762
+ * @return string Image URL.
1763
  */
1764
  function get_the_image_by_attachment( $p = null ) {
1765
 
1769
  $post = $p;
1770
  }
1771
 
1772
+ if ( empty( $post ) ) {
1773
+ return '';
1774
+ }
1775
+
1776
  $attachments = get_children(
1777
  array(
1778
  'post_parent' => $post->ID,
1791
 
1792
  /* If no attachments or image is found, return false. */
1793
  if ( empty( $attachments ) && empty( $image ) ) {
1794
+ return '';
1795
  }
1796
 
1797
  /* Set the default iterator to 0. */
1816
  /**
1817
  * Get the Image by Scan
1818
  *
1819
+ * Scans a Post's content by (regex) capturing an <img> element's source for the image URL.
1820
+ *
1821
  * @since ?
1822
+ * @since 3.4 Change return variable type bool|string to just string.
1823
  *
1824
+ * @param null|WP_Post $p WP Post object.
1825
+ * @return string Image URL source.
1826
  */
1827
  function get_the_image_by_scan( $p = null ) {
1828
  if ( null === $p ) {
1831
  $post = $p;
1832
  }
1833
 
1834
+ if ( empty( $post ) ) {
1835
+ return '';
1836
+ }
1837
+
1838
+ $rtn_url = '';
1839
+
1840
  /* Search the post's content for the <img /> tag and get its URL. */
1841
  preg_match_all( '|<img.*?src=[\'"](.*?)[\'"].*?>|i', get_post_field( 'post_content', $post->ID ), $matches );
1842
 
1843
  /* If there is a match for the image, return its URL. */
1844
  if ( isset( $matches ) && ! empty( $matches[1][0] ) ) {
1845
+ $rtn_url = $matches[1][0];
1846
  }
1847
 
1848
+ return $rtn_url;
1849
  }
1850
 
1851
  /**
2074
  */
2075
  function add_page_hooks() {
2076
  $hookname = current_filter();
2077
+ if ( AIOSEOP_PHP_Functions::strpos( $hookname, 'load-' ) === 0 ) {
2078
+ $this->pagehook = AIOSEOP_PHP_Functions::substr( $hookname, 5 );
2079
  }
2080
  add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
2081
  add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_styles' ) );
2108
  $url = esc_url( admin_url( 'admin.php?page=' . $hookname ) );
2109
  }
2110
 
2111
+ $parent = is_admin() ? AIOSEOP_PLUGIN_DIRNAME : 'aioseop-settings';
2112
+
2113
  if ( null === $this->locations ) {
2114
  array_unshift(
2115
  $links,
2116
  array(
2117
+ 'parent' => $parent,
2118
  'title' => $name,
2119
  'id' => $hookname,
2120
  'href' => $url,
2128
  array_unshift(
2129
  $links,
2130
  array(
2131
+ 'parent' => $parent,
2132
  'title' => $name,
2133
  'id' => $hookname,
2134
  'href' => $url,
2144
  array_unshift(
2145
  $links,
2146
  array(
2147
+ 'parent' => $parent,
2148
  'title' => $name,
2149
  'id' => $this->get_prefix( $k ) . $k,
2150
  'href' => esc_url( admin_url( 'admin.php?page=' . $this->get_prefix( $k ) . $k ) ),
2195
  } else {
2196
  $name = $this->name;
2197
  }
2198
+
2199
+ // Don't add unlicensed addons to admin menu.
2200
+ if ( null === $name ) {
2201
+ return;
2202
+ }
2203
+
2204
  if ( null === $this->locations ) {
2205
  $hookname = add_submenu_page(
2206
  $parent_slug,
2591
  wp_enqueue_script( 'jquery-ui-datepicker' );
2592
  // fall through.
2593
  default:
2594
+ $buf .= "<input name='" . esc_attr( $name ) . "' type='" . esc_attr( $options['type'] ) . "' " . wp_kses( $attr, wp_kses_allowed_html( 'data' ) ) . " value='" . esc_attr( $value ) . "' autocomplete='aioseop-" . time() . "'>\n";
2595
  }
2596
 
2597
  // TODO Maybe Change/Add a function for SEO character count.
2608
  /* translators: %1$s and %2$s are placeholders and should not be translated. %1$s is replaced with a number, %2$s is replaced with the name of an meta tag field (e.g; "Title", "Description", etc.). */
2609
  $count_desc = __( ' characters. Most search engines use a maximum of %1$s chars for the %2$s.', 'all-in-one-seo-pack' );
2610
  }
2611
+ $buf .= "<br /><input readonly tabindex='-1' type='text' name='{$prefix}length$n' size='3' maxlength='3' style='width:53px;height:23px;margin:0px;padding:0px 0px 0px 10px;' value='" . AIOSEOP_PHP_Functions::strlen( $value ) . "' />"
2612
+ . sprintf( $count_desc, $size, trim( AIOSEOP_PHP_Functions::strtolower( $options['name'] ), ':' ) );
2613
  if ( ! empty( $onload ) ) {
2614
  $buf .= "<script>jQuery( document ).ready(function() { {$onload} });</script>";
2615
  }
2790
  */
2791
  function sanitize_domain( $domain ) {
2792
  $domain = trim( $domain );
2793
+ $domain = AIOSEOP_PHP_Functions::strtolower( $domain );
2794
+ if ( 0 === AIOSEOP_PHP_Functions::strpos( $domain, 'http://' ) ) {
2795
+ $domain = AIOSEOP_PHP_Functions::substr( $domain, 7 );
2796
+ } elseif ( 0 === AIOSEOP_PHP_Functions::strpos( $domain, 'https://' ) ) {
2797
+ $domain = AIOSEOP_PHP_Functions::substr( $domain, 8 );
2798
  }
2799
  $domain = untrailingslashit( $domain );
2800
 
3155
  if ( ! empty( $options ) ) {
3156
  foreach ( $options as $k => $v ) {
3157
  if ( ! isset( $v['name'] ) ) {
3158
+ $v['name'] = AIOSEOP_PHP_Functions::ucwords( strtr( $k, '_', ' ' ) );
3159
  }
3160
  if ( ! isset( $v['type'] ) ) {
3161
  $v['type'] = 'checkbox';
admin/aioseop_module_manager.php CHANGED
@@ -255,7 +255,20 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Module_Manager' ) ) {
255
  }
256
  }
257
  if ( $mod_enable ) {
258
- return $this->do_load_module( $mod );
 
 
 
 
 
 
 
 
 
 
 
 
 
259
  }
260
 
261
  return false;
255
  }
256
  }
257
  if ( $mod_enable ) {
258
+ if ( AIOSEOPPRO ) {
259
+ return $this->do_load_module( $mod );
260
+ }
261
+
262
+ // Don't load Pro modules if Pro was previously installed.
263
+ switch ( $mod ) {
264
+ case 'video_sitemap': // phpcs:ignore PSR2.ControlStructures.SwitchDeclaration
265
+ case 'image_seo': { // phpcs:ignore PSR2.ControlStructures.SwitchDeclaration
266
+ break;
267
+ }
268
+ default: { // phpcs:ignore PSR2.ControlStructures.SwitchDeclaration
269
+ return $this->do_load_module( $mod );
270
+ }
271
+ }
272
  }
273
 
274
  return false;
admin/class-aioseop-helper.php CHANGED
@@ -62,6 +62,7 @@ class AIOSEOP_Helper {
62
  $this->help_text = $this->help_text_performance();
63
  break;
64
  case 'All_in_One_SEO_Pack_Sitemap':
 
65
  $this->help_text = $this->help_text_sitemap();
66
  break;
67
  case 'All_in_One_SEO_Pack_Opengraph':
@@ -79,6 +80,9 @@ class AIOSEOP_Helper {
79
  case 'All_in_One_SEO_Pack_Bad_Robots':
80
  $this->help_text = $this->help_text_bad_robots();
81
  break;
 
 
 
82
  }
83
 
84
  /**
@@ -102,16 +106,6 @@ class AIOSEOP_Helper {
102
  * @return array
103
  */
104
  private function help_text_general() {
105
- /*
106
- * Consider changing the construction of the macros.
107
- *
108
- * The name of the macro should NOT be inside _e() or __() because it does not make sense as it
109
- * won't change with the language.
110
- *
111
- * Moreover, it will confuse WPCS and it will try to replace %c (as in %category%) to %$1c.
112
- * Placeholder %s (%something) has been bug fixed.
113
- * @link https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards/issues/698
114
- */
115
  // phpcs:disable WordPress.WP.I18n.MissingTranslatorsComment
116
  // phpcs:disable WordPress.WP.I18n.UnorderedPlaceholdersText
117
  $rtn_help_text = array(
@@ -461,6 +455,23 @@ class AIOSEOP_Helper {
461
  'aiosp_use_tags_as_keywords' => __( 'Check this if you want your tags for a given post used as the Meta Keywords for this post (in addition to any keywords you specify on the Edit Post screen).', 'all-in-one-seo-pack' ),
462
  'aiosp_dynamic_postspage_keywords' => __( 'Check this if you want your keywords on your Posts page (set in WordPress under Settings, Reading, Front Page Displays) and your archive pages to be dynamically generated from the keywords of the posts showing on that page. If unchecked, it will use the keywords set in the edit page screen for the posts page.', 'all-in-one-seo-pack' ),
463
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
464
  );
465
 
466
  // phpcs:disable WordPress.WP.I18n.MissingTranslatorsComment
@@ -670,11 +681,7 @@ class AIOSEOP_Helper {
670
  'aiosp_performance_force_rewrites' => 'https://semperplugins.com/documentation/performance-settings/#force-rewrites',
671
  );
672
 
673
- foreach ( $help_doc_link as $k1_slug => $v1_url ) {
674
- $rtn_help_text[ $k1_slug ] .= '<br /><br /><a href="' . $v1_url . '" target="_blank">' . __( 'Click here for documentation on this setting.', 'all-in-one-seo-pack' ) . '</a>';
675
- }
676
-
677
- return $rtn_help_text;
678
  }
679
 
680
  /**
@@ -800,11 +807,7 @@ class AIOSEOP_Helper {
800
  }
801
  */
802
 
803
- foreach ( $help_doc_link as $k1_slug => $v1_url ) {
804
- $rtn_help_text[ $k1_slug ] .= '<br /><br /><a href="' . $v1_url . '" target="_blank">' . __( 'Click here for documentation on this setting.', 'all-in-one-seo-pack' ) . '</a>';
805
- }
806
-
807
- return $rtn_help_text;
808
  }
809
 
810
  /**
@@ -943,11 +946,7 @@ class AIOSEOP_Helper {
943
  'aioseop_opengraph_settings_customimg_twitter' => 'https://semperplugins.com/documentation/social-meta-settings-individual-pagepost-settings/#custom-twitter-image',
944
  );
945
 
946
- foreach ( $help_doc_link as $k1_slug => $v1_url ) {
947
- $rtn_help_text[ $k1_slug ] .= '<br /><br /><a href="' . $v1_url . '" target="_blank">' . __( 'Click here for documentation on this setting.', 'all-in-one-seo-pack' ) . '</a>';
948
- }
949
-
950
- return $rtn_help_text;
951
  }
952
 
953
  /**
@@ -1009,11 +1008,7 @@ class AIOSEOP_Helper {
1009
  'aiosp_importer_exporter_export_post_types' => 'https://semperplugins.com/documentation/importer-exporter-module/',
1010
  );
1011
 
1012
- foreach ( $help_doc_link as $k1_slug => $v1_url ) {
1013
- $rtn_help_text[ $k1_slug ] .= '<br /><br /><a href="' . $v1_url . '" target="_blank">' . __( 'Click here for documentation on this setting.', 'all-in-one-seo-pack' ) . '</a>';
1014
- }
1015
-
1016
- return $rtn_help_text;
1017
  }
1018
 
1019
  /**
@@ -1037,6 +1032,120 @@ class AIOSEOP_Helper {
1037
  );
1038
  }
1039
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1040
  /**
1041
  * Help Text Post Meta (Core Module)
1042
  *
@@ -1058,6 +1167,8 @@ class AIOSEOP_Helper {
1058
  'aiosp_noindex' => __( 'Check this box to ask search engines not to index this page.', 'all-in-one-seo-pack' ),
1059
  'aiosp_nofollow' => __( 'Check this box to ask search engines not to follow links from this page.', 'all-in-one-seo-pack' ),
1060
  'aiosp_sitemap_exclude' => __( 'Don\'t display this page in the sitemap.', 'all-in-one-seo-pack' ),
 
 
1061
  'aiosp_disable' => __( 'Disable SEO on this page.', 'all-in-one-seo-pack' ),
1062
  'aiosp_disable_analytics' => __( 'Disable Google Analytics on this page.', 'all-in-one-seo-pack' ),
1063
  );
@@ -1071,12 +1182,24 @@ class AIOSEOP_Helper {
1071
  'aiosp_noindex' => 'https://semperplugins.com/documentation/post-settings/#robots-meta-noindex',
1072
  'aiosp_nofollow' => 'https://semperplugins.com/documentation/post-settings/#robots-meta-nofollow',
1073
  'aiosp_sitemap_exclude' => 'https://semperplugins.com/documentation/post-settings/#exclude-from-sitemap',
 
 
1074
  'aiosp_disable' => 'https://semperplugins.com/documentation/post-settings/#disable-on-this-post',
1075
  'aiosp_disable_analytics' => 'https://semperplugins.com/documentation/post-settings/#disable-google-analytics',
1076
  );
1077
 
1078
  foreach ( $help_doc_link as $k1_slug => $v1_url ) {
1079
- $rtn_help_text[ $k1_slug ] .= '<br /><br /><a href="' . $v1_url . '" target="_blank">' . __( 'Click here for documentation on this setting.', 'all-in-one-seo-pack' ) . '</a>';
 
 
 
 
 
 
 
 
 
 
1080
  }
1081
 
1082
  return $rtn_help_text;
@@ -1100,4 +1223,22 @@ class AIOSEOP_Helper {
1100
  }
1101
  return 'DEV: Missing Help Text: ' . $slug;
1102
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1103
  }
62
  $this->help_text = $this->help_text_performance();
63
  break;
64
  case 'All_in_One_SEO_Pack_Sitemap':
65
+ case 'All_in_One_SEO_Pack_Sitemap_Pro':
66
  $this->help_text = $this->help_text_sitemap();
67
  break;
68
  case 'All_in_One_SEO_Pack_Opengraph':
80
  case 'All_in_One_SEO_Pack_Bad_Robots':
81
  $this->help_text = $this->help_text_bad_robots();
82
  break;
83
+ case 'All_in_One_SEO_Pack_Image_Seo':
84
+ $this->help_text = $this->help_text_image_seo();
85
+ break;
86
  }
87
 
88
  /**
106
  * @return array
107
  */
108
  private function help_text_general() {
 
 
 
 
 
 
 
 
 
 
109
  // phpcs:disable WordPress.WP.I18n.MissingTranslatorsComment
110
  // phpcs:disable WordPress.WP.I18n.UnorderedPlaceholdersText
111
  $rtn_help_text = array(
455
  'aiosp_use_tags_as_keywords' => __( 'Check this if you want your tags for a given post used as the Meta Keywords for this post (in addition to any keywords you specify on the Edit Post screen).', 'all-in-one-seo-pack' ),
456
  'aiosp_dynamic_postspage_keywords' => __( 'Check this if you want your keywords on your Posts page (set in WordPress under Settings, Reading, Front Page Displays) and your archive pages to be dynamically generated from the keywords of the posts showing on that page. If unchecked, it will use the keywords set in the edit page screen for the posts page.', 'all-in-one-seo-pack' ),
457
 
458
+ 'aiosp_license_key' => sprintf(
459
+ '%s</br></br>%s</br>',
460
+ sprintf(
461
+ esc_html__( 'To unlock more features consider %s.', 'all-in-one-seo-pack' ),
462
+ sprintf(
463
+ '<a href="%1$s" title="%2$s">%3$s</a>',
464
+ aioseop_get_utm_url( 'license-key-help-text' ),
465
+ sprintf( esc_html__( 'Upgrade to %s', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME . '&nbsp;Pro' ),
466
+ esc_html__( 'upgrading to PRO', 'all-in-one-seo-pack' )
467
+ )
468
+ ),
469
+ sprintf(
470
+ esc_html__( 'As a valued %1$s user you receive %2$s, automatically applied at checkout!', 'all-in-one-seo-pack' ),
471
+ AIOSEOP_PLUGIN_NAME,
472
+ sprintf( '<span class="aioseop-upsell-discount-amount">%s</span>', esc_html__( '30% off', 'all-in-one-seo-pack' ) )
473
+ )
474
+ ),
475
  );
476
 
477
  // phpcs:disable WordPress.WP.I18n.MissingTranslatorsComment
681
  'aiosp_performance_force_rewrites' => 'https://semperplugins.com/documentation/performance-settings/#force-rewrites',
682
  );
683
 
684
+ return $this->merge_text_with_links( $rtn_help_text, $help_doc_link );
 
 
 
 
685
  }
686
 
687
  /**
807
  }
808
  */
809
 
810
+ return $this->merge_text_with_links( $rtn_help_text, $help_doc_link );
 
 
 
 
811
  }
812
 
813
  /**
946
  'aioseop_opengraph_settings_customimg_twitter' => 'https://semperplugins.com/documentation/social-meta-settings-individual-pagepost-settings/#custom-twitter-image',
947
  );
948
 
949
+ return $this->merge_text_with_links( $rtn_help_text, $help_doc_link );
 
 
 
 
950
  }
951
 
952
  /**
1008
  'aiosp_importer_exporter_export_post_types' => 'https://semperplugins.com/documentation/importer-exporter-module/',
1009
  );
1010
 
1011
+ return $this->merge_text_with_links( $rtn_help_text, $help_doc_link );
 
 
 
 
1012
  }
1013
 
1014
  /**
1032
  );
1033
  }
1034
 
1035
+ /**
1036
+ * Returns the tooltip help text for the Image SEO module screen.
1037
+ *
1038
+ * @ignore
1039
+ * @since 3.4.0
1040
+ *
1041
+ * @return array
1042
+ */
1043
+ private function help_text_image_seo() {
1044
+ $rtn_help_text = array(
1045
+ 'aiosp_image_seo_title_format' =>
1046
+ __( 'This controls the format of the title attribute of your images.', 'all-in-one-seo-pack' ) . '<br />' .
1047
+ __( 'The following macros are supported:', 'all-in-one-seo-pack' ) .
1048
+ '<dl>' .
1049
+ '<dt>%image_title%</dt>' .
1050
+ '<dd>' . __( 'Your image title', 'all-in-one-seo-pack' ) . '</dd>' .
1051
+ '<dt>%site_title%</dt>' .
1052
+ '<dd>' . __( 'Your site title', 'all-in-one-seo-pack' ) . '</dd>' .
1053
+ '<dt>%site_description%</dt>' .
1054
+ '<dd>' . __( 'Your site description', 'all-in-one-seo-pack' ) . '</dd>' .
1055
+ '<dt>%image_seo_title%</dt>' .
1056
+ '<dd>' . __( 'Your image SEO title. This is the title you enter in our metabox', 'all-in-one-seo-pack' ) . '</dd>' .
1057
+ '<dt>%image_seo_description%</dt>' .
1058
+ '<dd>' . __( 'Your image SEO description. This is the meta description you enter in our metabox', 'all-in-one-seo-pack' ) . '</dd>' .
1059
+ '<dt>%post_seo_title%</dt>' .
1060
+ '<dd>' . __( 'The SEO title set for the post or page', 'all-in-one-seo-pack' ) . '</dd>' .
1061
+ '<dt>%post_seo_description%</dt>' .
1062
+ '<dd>' . __( 'The SEO description set for the post or page', 'all-in-one-seo-pack' ) . '</dd>' .
1063
+ '<dt>%alt_tag%</dt>' .
1064
+ '<dd>' . __( "Your image's alt tag attribute", 'all-in-one-seo-pack' ) . '</dd>' .
1065
+ '<dt>%post_title%</dt>' .
1066
+ '<dd>' . __( 'The original title of the post or page', 'all-in-one-seo-pack' ) . '</dd>' .
1067
+ '<dt>%category_title%</dt>' .
1068
+ '<dd>' . __( 'The title of the category or taxonomy', 'all-in-one-seo-pack' ) . '</dd>' .
1069
+ '<dt>%post_date%</dt>' .
1070
+ '<dd>' . sprintf(
1071
+ __( 'The %1$s when the %2$s was published (localized)', 'all-in-one-seo-pack' ),
1072
+ __( 'date', 'all-in-one-seo-pack' ),
1073
+ __( 'image', 'all-in-one-seo-pack' )
1074
+ ) . '</dd>' .
1075
+ '<dt>%post_year%</dt>' .
1076
+ '<dd>' . sprintf(
1077
+ __( 'The %1$s when the %2$s was published (localized)', 'all-in-one-seo-pack' ),
1078
+ __( 'year', 'all-in-one-seo-pack' ),
1079
+ __( 'image', 'all-in-one-seo-pack' )
1080
+ ) . '</dd>' .
1081
+ '<dt>%post_month%</dt>' .
1082
+ '<dd>' . sprintf(
1083
+ __( 'The %1$s when the %2$s was published (localized)', 'all-in-one-seo-pack' ),
1084
+ __( 'month', 'all-in-one-seo-pack' ),
1085
+ __( 'image', 'all-in-one-seo-pack' )
1086
+ ) . '</dd>' .
1087
+ '<dt>%tax_product_cat%</dt>' .
1088
+ '<dd>' . __( 'The title of the first WooCommerce Product Category the Product is assigned to', 'all-in-one-seo-pack' ) . '</dd>' .
1089
+ '<dt>%tax_product_tag%</dt>' .
1090
+ '<dd>' . __( 'The title of the first WooCommerce Product Tag the Product is assigned to', 'all-in-one-seo-pack' ) . '</dd>' .
1091
+ '</dl>',
1092
+ 'aiosp_image_seo_title_strip_punc' => __( "Enable this setting to strip punctuation characters for your images' title attribute.", 'all-in-one-seo-pack' ),
1093
+ 'aiosp_image_seo_alt_format' =>
1094
+ __( 'This controls the format of the alt tag attribute of your images.', 'all-in-one-seo-pack' ) . '<br />' .
1095
+ __( 'The following macros are supported:', 'all-in-one-seo-pack' ) .
1096
+ '<dl>' .
1097
+ '<dt>%image_title%</dt>' .
1098
+ '<dd>' . __( 'Your image title', 'all-in-one-seo-pack' ) . '</dd>' .
1099
+ '<dt>%site_title%</dt>' .
1100
+ '<dd>' . __( 'Your site title', 'all-in-one-seo-pack' ) . '</dd>' .
1101
+ '<dt>%site_description%</dt>' .
1102
+ '<dd>' . __( 'Your site description', 'all-in-one-seo-pack' ) . '</dd>' .
1103
+ '<dt>%image_seo_title%</dt>' .
1104
+ '<dd>' . __( 'Your image SEO title. This is the title you enter in our metabox', 'all-in-one-seo-pack' ) . '</dd>' .
1105
+ '<dt>%image_seo_description%</dt>' .
1106
+ '<dd>' . __( 'Your image SEO description. This is the meta description you enter in our metabox', 'all-in-one-seo-pack' ) . '</dd>' .
1107
+ '<dt>%post_seo_title%</dt>' .
1108
+ '<dd>' . __( 'The SEO title set for the post or page', 'all-in-one-seo-pack' ) . '</dd>' .
1109
+ '<dt>%post_seo_description%</dt>' .
1110
+ '<dd>' . __( 'The SEO description set for the post or page', 'all-in-one-seo-pack' ) . '</dd>' .
1111
+ '<dt>%alt_tag%</dt>' .
1112
+ '<dd>' . __( "Your image's alt tag attribute", 'all-in-one-seo-pack' ) . '</dd>' .
1113
+ '<dt>%post_title%</dt>' .
1114
+ '<dd>' . __( 'The original title of the post or page', 'all-in-one-seo-pack' ) . '</dd>' .
1115
+ '<dt>%category_title%</dt>' .
1116
+ '<dd>' . __( 'The title of the category or taxonomy', 'all-in-one-seo-pack' ) . '</dd>' .
1117
+ '<dt>%post_date%</dt>' .
1118
+ '<dd>' . sprintf(
1119
+ __( 'The %1$s when the %2$s was published (localized)', 'all-in-one-seo-pack' ),
1120
+ __( 'date', 'all-in-one-seo-pack' ),
1121
+ __( 'image', 'all-in-one-seo-pack' )
1122
+ ) . '</dd>' .
1123
+ '<dt>%post_year%</dt>' .
1124
+ '<dd>' . sprintf(
1125
+ __( 'The %1$s when the %2$s was published (localized)', 'all-in-one-seo-pack' ),
1126
+ __( 'year', 'all-in-one-seo-pack' ),
1127
+ __( 'image', 'all-in-one-seo-pack' )
1128
+ ) . '</dd>' .
1129
+ '<dt>%post_month%</dt>' .
1130
+ '<dd>' . sprintf(
1131
+ __( 'The %1$s when the %2$s was published (localized)', 'all-in-one-seo-pack' ),
1132
+ __( 'month', 'all-in-one-seo-pack' ),
1133
+ __( 'image', 'all-in-one-seo-pack' )
1134
+ ) . '</dd>' .
1135
+ '</dl>',
1136
+ 'aiosp_image_seo_alt_strip_punc' => __( "Enable this setting to strip punctuation characters for your images' alt tag attribute.", 'all-in-one-seo-pack' ),
1137
+ );
1138
+
1139
+ $help_doc_link = array(
1140
+ 'aiosp_image_seo_title_format' => 'https://semperplugins.com/documentation/image-seo-module/#title-attribute-format',
1141
+ 'aiosp_image_seo_title_strip_punc' => 'https://semperplugins.com/documentation/image-seo-module/#strip-punctuation-for-title-attributes',
1142
+ 'aiosp_image_seo_alt_format' => 'https://semperplugins.com/documentation/image-seo-module/#alt-tag-attribute-format',
1143
+ 'aiosp_image_seo_alt_strip_punc' => 'https://semperplugins.com/documentation/image-seo-module/#strip-punctuation-for-alt-tag-attributes',
1144
+ );
1145
+
1146
+ return $this->merge_text_with_links( $rtn_help_text, $help_doc_link );
1147
+ }
1148
+
1149
  /**
1150
  * Help Text Post Meta (Core Module)
1151
  *
1167
  'aiosp_noindex' => __( 'Check this box to ask search engines not to index this page.', 'all-in-one-seo-pack' ),
1168
  'aiosp_nofollow' => __( 'Check this box to ask search engines not to follow links from this page.', 'all-in-one-seo-pack' ),
1169
  'aiosp_sitemap_exclude' => __( 'Don\'t display this page in the sitemap.', 'all-in-one-seo-pack' ),
1170
+ 'aiosp_sitemap_priority' => __( 'Override the default sitemap priority for this post.', 'all-in-one-seo-pack' ),
1171
+ 'aiosp_sitemap_frequency' => __( 'Override the default sitemap frequency for this post.', 'all-in-one-seo-pack' ),
1172
  'aiosp_disable' => __( 'Disable SEO on this page.', 'all-in-one-seo-pack' ),
1173
  'aiosp_disable_analytics' => __( 'Disable Google Analytics on this page.', 'all-in-one-seo-pack' ),
1174
  );
1182
  'aiosp_noindex' => 'https://semperplugins.com/documentation/post-settings/#robots-meta-noindex',
1183
  'aiosp_nofollow' => 'https://semperplugins.com/documentation/post-settings/#robots-meta-nofollow',
1184
  'aiosp_sitemap_exclude' => 'https://semperplugins.com/documentation/post-settings/#exclude-from-sitemap',
1185
+ 'aiosp_sitemap_priority' => 'https://semperplugins.com/documentation/post-settings/#sitemap-priority',
1186
+ 'aiosp_sitemap_frequency' => 'https://semperplugins.com/documentation/post-settings/#sitemap-frequency',
1187
  'aiosp_disable' => 'https://semperplugins.com/documentation/post-settings/#disable-on-this-post',
1188
  'aiosp_disable_analytics' => 'https://semperplugins.com/documentation/post-settings/#disable-google-analytics',
1189
  );
1190
 
1191
  foreach ( $help_doc_link as $k1_slug => $v1_url ) {
1192
+ $link_text = __( 'Click here for documentation on this setting.', 'all-in-one-seo-pack' );
1193
+ $link_url = $v1_url;
1194
+
1195
+ if ( ! AIOSEOPPRO &&
1196
+ ( 'aiosp_sitemap_priority' === $k1_slug || 'aiosp_sitemap_frequency' === $k1_slug )
1197
+ ) {
1198
+ $link_text = sprintf( __( 'Upgrade to %s to unlock this feature.', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME . '&nbsp;Pro' );
1199
+ $link_url = "https://semperplugins.com/all-in-one-seo-pack-pro-version/?utm_source=WordPress&utm_campaign=liteplugin&utm_medium=$k1_slug";
1200
+ }
1201
+
1202
+ $rtn_help_text[ $k1_slug ] .= '<br /><br /><a href="' . $link_url . '" target="_blank">' . $link_text . '</a>';
1203
  }
1204
 
1205
  return $rtn_help_text;
1223
  }
1224
  return 'DEV: Missing Help Text: ' . $slug;
1225
  }
1226
+
1227
+ /**
1228
+ * Returns the tooltip help text with their respective documentation links.
1229
+ *
1230
+ * @since 3.4.0
1231
+ *
1232
+ * @param array $doc_text The tooltip strings.
1233
+ * @param array $doc_links The links to the docs on our website.
1234
+ *
1235
+ * @return array $tooltip_content The tooltip strings paired with their respective documentation links.
1236
+ */
1237
+ private function merge_text_with_links( $doc_text, $doc_links ) {
1238
+
1239
+ foreach ( $doc_links as $setting_slug => $url ) {
1240
+ $doc_text[ $setting_slug ] .= sprintf( "<br /><br /><a href='%s' target='_blank'>%s</a>", $url, __( 'Click here for documentation on this setting.', 'all-in-one-seo-pack' ) );
1241
+ }
1242
+ return $doc_text;
1243
+ }
1244
  }
admin/class-aioseop-notices.php CHANGED
@@ -106,32 +106,28 @@ if ( ! class_exists( 'AIOSEOP_Notices' ) ) {
106
  */
107
  private $aioseop_screens = array();
108
 
 
 
 
 
 
 
 
 
 
 
 
109
  /**
110
  * __constructor.
111
  *
112
  * @since 3.0
113
  */
114
  public function __construct() {
115
-
116
- // DirectoryIterator::getExtension() was added in PHP 5.3.6. We can remove this once we drop support < PHP 5.3.
117
- if ( version_compare( phpversion(), '5.3.6', '<' ) ) {
118
- return false;
119
- }
120
-
121
  $this->_requires();
122
  $this->obj_load_options();
123
 
124
  if ( current_user_can( 'aiosp_manage_seo' ) ) {
125
- $this->aioseop_screens[] = 'toplevel_page_' . AIOSEOP_PLUGIN_DIRNAME . '/aioseop_class';
126
- $this->aioseop_screens[] = 'all-in-one-seo_page_' . AIOSEOP_PLUGIN_DIRNAME . '/modules/aioseop_performance';
127
- $this->aioseop_screens[] = 'all-in-one-seo_page_' . AIOSEOP_PLUGIN_DIRNAME . '/modules/aioseop_sitemap';
128
- $this->aioseop_screens[] = 'all-in-one-seo_page_aiosp_opengraph';
129
- $this->aioseop_screens[] = 'all-in-one-seo_page_aiosp_robots_generator';
130
- $this->aioseop_screens[] = 'all-in-one-seo_page_' . AIOSEOP_PLUGIN_DIRNAME . '/modules/aioseop_robots';
131
- $this->aioseop_screens[] = 'all-in-one-seo_page_' . AIOSEOP_PLUGIN_DIRNAME . '/modules/aioseop_file_editor';
132
- $this->aioseop_screens[] = 'all-in-one-seo_page_' . AIOSEOP_PLUGIN_DIRNAME . '/modules/aioseop_importer_exporter';
133
- $this->aioseop_screens[] = 'all-in-one-seo_page_' . AIOSEOP_PLUGIN_DIRNAME . '/modules/aioseop_bad_robots';
134
- $this->aioseop_screens[] = 'all-in-one-seo_page_' . AIOSEOP_PLUGIN_DIRNAME . '/modules/aioseop_feature_manager';
135
 
136
  add_action( 'admin_init', array( $this, 'init' ) );
137
  add_action( 'current_screen', array( $this, 'admin_screen' ) );
@@ -161,7 +157,8 @@ if ( ! class_exists( 'AIOSEOP_Notices' ) ) {
161
  */
162
  private function autoload_notice_files() {
163
  foreach ( new DirectoryIterator( AIOSEOP_PLUGIN_DIR . 'admin/display/notices/' ) as $file ) {
164
- if ( $file->isFile() && 'php' === $file->getExtension() ) {
 
165
  $filename = $file->getFilename();
166
 
167
  // Qualified file pattern; "*-notice.php".
@@ -339,6 +336,7 @@ if ( ! class_exists( 'AIOSEOP_Notices' ) ) {
339
  'time' => 0,
340
  'text' => __( 'Dismiss', 'all-in-one-seo-pack' ),
341
  'link' => '#',
 
342
  'dismiss' => true,
343
  'class' => '',
344
  );
@@ -730,31 +728,32 @@ if ( ! class_exists( 'AIOSEOP_Notices' ) ) {
730
  $current_screen = get_current_screen();
731
  $current_user_id = get_current_user_id();
732
  foreach ( $this->active_notices as $a_notice_slug => $a_notice_time_display ) {
733
- // vvv TEMP Avoid review notice.
734
- if ( 'review_plugin' === $a_notice_slug ) {
735
- continue;
736
- }
737
- // ^^^ TEMP Avoid review notice.
738
  $notice_show = true;
739
  $notice = $this->get_notice( $a_notice_slug );
740
 
 
 
 
 
 
 
741
  // Screen Restriction.
742
  if ( ! empty( $notice['screens'] ) ) {
743
- // Checks if on aioseop screen.
744
  if ( in_array( 'aioseop', $notice['screens'], true ) ) {
745
- if ( ! in_array( $current_screen->id, $this->aioseop_screens, true ) ) {
746
- continue;
747
- }
748
  }
749
 
750
- // Checks the other screen restrictions by slug/id.
751
- if ( ! in_array( 'aioseop', $notice['screens'], true ) ) {
752
- if ( ! in_array( $current_screen->id, $notice['screens'], true ) ) {
753
- continue;
754
- }
755
  }
756
  }
757
 
 
 
 
 
758
  if ( isset( $this->dismissed[ $a_notice_slug ] ) && $this->dismissed[ $a_notice_slug ] ) {
759
  $notice_show = false;
760
  }
@@ -825,7 +824,7 @@ if ( ! class_exists( 'AIOSEOP_Notices' ) ) {
825
  if ( empty( $notice_slug ) ) {
826
  /* Translators: Displays the hordcoded slug that missing. */
827
  wp_send_json_error( sprintf( __( 'Missing values from `%s`.', 'all-in-one-seo-pack' ), 'notice_slug' ) );
828
- } elseif ( empty( $action_index ) && 0 !== $action_index ) {
829
  /* Translators: Displays the hordcoded slug that missing. */
830
  wp_send_json_error( sprintf( __( 'Missing values from `%s`.', 'all-in-one-seo-pack' ), 'action_index' ) );
831
  }
106
  */
107
  private $aioseop_screens = array();
108
 
109
+ /**
110
+ * List of screens that should be excluded.
111
+ *
112
+ * @var array
113
+ *
114
+ * @since 3.4.0
115
+ */
116
+ private $excluded_screens = array(
117
+ 'About Us' => 'all-in-one-seo_page_aioseop-about',
118
+ );
119
+
120
  /**
121
  * __constructor.
122
  *
123
  * @since 3.0
124
  */
125
  public function __construct() {
 
 
 
 
 
 
126
  $this->_requires();
127
  $this->obj_load_options();
128
 
129
  if ( current_user_can( 'aiosp_manage_seo' ) ) {
130
+ $this->aioseop_screens = aioseop_get_admin_screens();
 
 
 
 
 
 
 
 
 
131
 
132
  add_action( 'admin_init', array( $this, 'init' ) );
133
  add_action( 'current_screen', array( $this, 'admin_screen' ) );
157
  */
158
  private function autoload_notice_files() {
159
  foreach ( new DirectoryIterator( AIOSEOP_PLUGIN_DIR . 'admin/display/notices/' ) as $file ) {
160
+ $extension = pathinfo( $file->getFilename(), PATHINFO_EXTENSION );
161
+ if ( $file->isFile() && 'php' === $extension ) {
162
  $filename = $file->getFilename();
163
 
164
  // Qualified file pattern; "*-notice.php".
336
  'time' => 0,
337
  'text' => __( 'Dismiss', 'all-in-one-seo-pack' ),
338
  'link' => '#',
339
+ 'new_tab' => true,
340
  'dismiss' => true,
341
  'class' => '',
342
  );
728
  $current_screen = get_current_screen();
729
  $current_user_id = get_current_user_id();
730
  foreach ( $this->active_notices as $a_notice_slug => $a_notice_time_display ) {
 
 
 
 
 
731
  $notice_show = true;
732
  $notice = $this->get_notice( $a_notice_slug );
733
 
734
+ // If we have no message or static HTML, this is a bad notice.
735
+ if ( empty( $notice['message'] ) && empty( $notice['html'] ) ) {
736
+ $this->remove_notice( $a_notice_slug );
737
+ continue;
738
+ }
739
+
740
  // Screen Restriction.
741
  if ( ! empty( $notice['screens'] ) ) {
742
+
743
  if ( in_array( 'aioseop', $notice['screens'], true ) ) {
744
+ unset( $notice['screens']['aiosoep'] );
745
+ $notice['screens'] = array_merge( $notice['screens'], aioseop_get_admin_screens() );
 
746
  }
747
 
748
+ if ( ! in_array( $current_screen->id, $notice['screens'], true ) ) {
749
+ continue;
 
 
 
750
  }
751
  }
752
 
753
+ if ( in_array( $current_screen->id, $this->excluded_screens, true ) ) {
754
+ continue;
755
+ }
756
+
757
  if ( isset( $this->dismissed[ $a_notice_slug ] ) && $this->dismissed[ $a_notice_slug ] ) {
758
  $notice_show = false;
759
  }
824
  if ( empty( $notice_slug ) ) {
825
  /* Translators: Displays the hordcoded slug that missing. */
826
  wp_send_json_error( sprintf( __( 'Missing values from `%s`.', 'all-in-one-seo-pack' ), 'notice_slug' ) );
827
+ } elseif ( empty( $action_index ) && 0 !== (int) $action_index ) {
828
  /* Translators: Displays the hordcoded slug that missing. */
829
  wp_send_json_error( sprintf( __( 'Missing values from `%s`.', 'all-in-one-seo-pack' ), 'action_index' ) );
830
  }
admin/display/credits-content.php CHANGED
@@ -22,26 +22,11 @@
22
 
23
  <h3 class="wp-people-group"><?php _e( 'Project Leaders', 'all-in-one-seo-pack' ); ?></h3>
24
  <ul class="wp-people-group " id="wp-people-group-project-leaders">
25
- <li class="wp-person" id="wp-person-michaeltorbert">
26
- <a class="web" href="https://twitter.com/michaeltorbert" target="_blank"><img alt="" class="gravatar" src="https://s.gravatar.com/avatar/f41419cf5cfdbb071a8d591ac9976bf3?s=60">
27
- Michael Torbert</a>
28
- <span class="title">
29
- <?php
30
- /* translators: This is our CEO and founder Michael Torbert who oversees everything that is related to All in One SEO Pack. Feel free to use a different term if this doesn't translate well. */
31
- _e( 'Project Lead', 'all-in-one-seo-pack' );
32
- ?>
33
- </span>
34
- </li>
35
  <li class="wp-person" id="wp-person-stevemortiboy">
36
  <a class="web" target="_blank" href="https://twitter.com/wpsmort"><img alt="" class="gravatar" src="https://www.gravatar.com/avatar/40e33d813c16a63500675d851b0cbf3a?s=60">
37
  Steve Mortiboy</a>
38
  <span class="title"><?php _e( 'Project Manager', 'all-in-one-seo-pack' ); ?></span>
39
  </li>
40
- <li class="wp-person" id="wp-person-yuqianliu">
41
- <a class="web" target="_blank" href="https://profiles.wordpress.org/yuqianl"><img alt="" class="gravatar" src="https://www.gravatar.com/avatar/8f971bea2b6c483fd1099e558013a7d0?s=60">
42
- Yuqian Liu</a>
43
- <span class="title"><?php _e( 'Project Manager', 'all-in-one-seo-pack' ); ?></span>
44
- </li>
45
  </ul>
46
 
47
  <h3 class="wp-people-group"><?php printf( __( 'Core Team', 'all-in-one-seo-pack' ) ); ?></h3>
@@ -51,12 +36,6 @@
51
  Arnaud Broes</a>
52
  <span class="title"><?php _e( 'Team Lead', 'all-in-one-seo-pack' ); ?></span>
53
  </li>
54
-
55
- <li class="wp-person" id="rozroz">
56
- <a class="web" target="_blank" href="https://github.com/contactashish13"><img alt="" class="gravatar" src="https://avatars2.githubusercontent.com/u/12953439?s=60">
57
- Ashish Ravi</a>
58
- <span class="title"><?php _e( 'Development Team', 'all-in-one-seo-pack' ); ?></span>
59
- </li>
60
  <li class="wp-person" id="EkoJR">
61
  <a class="web" target="_blank" href="https://profiles.wordpress.org/EkoJR/"><img alt="" class="gravatar" src="https://secure.gravatar.com/avatar/bb4c78fe944b58bd5f127d836500c30a?s=200&d=mm&r=g">
62
  Ben Reames</a>
@@ -65,81 +44,6 @@
65
 
66
  </ul>
67
 
68
- <h3 class="wp-people-group">&#x1f31f;
69
- <?php
70
- /* translators: These are people who made an awesome contribution to All in One SEO Pack. Feel free to replace "Rockstar" with whatever works best in your language. */
71
- _e( 'Recent Rockstar Contributors', 'all-in-one-seo-pack' );
72
- ?>
73
- &#x1f31f;</h3>
74
- <ul class="wp-people-group " id="wp-people-group-rockstars">
75
- <li>
76
- <?php
77
- /* translators: %1$s and %2$s are used as placeholders and should not be transalted. These are used to transform the text in between them into a clickable link. */
78
- printf(
79
- __( 'Want to see your name and picture here as a community developer? %1$sClick here%2$s to open an issue on GitHub to report a bug, request a feature or find an issue and submit code!', 'all-in-one-seo-pack' ),
80
- '<a href="https://github.com/semperfiwebdesign/all-in-one-seo-pack" target="_blank">',
81
- '</a>'
82
- );
83
- ?>
84
- </li>
85
- <li class="wp-person" id="wp-person-mayukojpn">
86
- <a class="web" target="_blank" href="https://github.com/rebeccahum"><img alt="" class="gravatar" src="https://2.gravatar.com/avatar/b57b5efcabe3e01833849390ad7d3129?s=60">
87
- Rebecca Hum</a>
88
- </li>
89
- <li class="wp-person" id="wp-person-mayukojpn">
90
- <a class="web" target="_blank" href="https://profiles.wordpress.org/mayukojpn/"><img alt="" class="gravatar" src="https://secure.gravatar.com/avatar/79294868a241e80ea4fda34c618b8a11?s=60">
91
- Mayo Moriyama</a>
92
- </li>
93
- <li class="wp-person" id="wp-person-dougalcampbell">
94
- <a class="web" target="_blank" href="https://profiles.wordpress.org/dougal/"><img alt="" class="gravatar" src="https://www.gravatar.com/avatar/81717a172b6918071fbea1a52483294b?s=60">
95
- Dougal Campbell</a>
96
- </li>
97
- <li class="wp-person" id="wp-person-alejandromostajo">
98
- <a class="web" target="_blank" href="https://github.com/amostajo"><img alt="" class="gravatar" src="https://avatars1.githubusercontent.com/u/1645908?s=60">
99
- Alejandro Mostajo</a>
100
- </li>
101
- <li class="wp-person" id="wp-person-aaronbrodney">
102
- <a class="web" target="_blank" href="https://github.com/theycalledmetaz"><img alt="" class="gravatar" src="https://avatars3.githubusercontent.com/u/8225725?v=3&s=60">
103
- Aaron Brodney</a>
104
- </li>
105
- <li class="wp-person" id="rozroz">
106
- <a class="web" target="_blank" href="https://profiles.wordpress.org/yummy-wp/"><img alt="" class="gravatar" src="https://avatars0.githubusercontent.com/u/22232968?v=3&s=460">
107
- Stanislav Samoilenko</a>
108
- </li>
109
- <li class="wp-person" id="shoheitanaka">
110
- <a class="web" target="_blank" href="https://profiles.wordpress.org/shoheitanaka"><img alt="" class="gravatar" src="https://secure.gravatar.com/avatar/677e512c803c40c0180d4514f876a21f?s=200&d=mm&r=g">
111
- Shohei Tanaka</a>
112
- </li>
113
- <li class="wp-person" id="webaware">
114
- <a class="web" target="_blank" href="https://profiles.wordpress.org/webaware/"><img alt="" class="gravatar" src="https://secure.gravatar.com/avatar/aee800bc3644d9ebfa33c1ed9df5d958?s=200&d=mm&r=g">
115
- Ross McKay</a>
116
- </li>
117
- <li class="wp-person" id="webaware">
118
- <a class="web" target="_blank" href="https://github.com/jWright-Freelance/"><img alt="" class="gravatar" src="https://avatars1.githubusercontent.com/u/11382307?s=200&v=4">
119
- John Wright</a>
120
- </li>
121
- <li class="wp-person" id="webaware">
122
- <a class="web" target="_blank" href="https://wordpress.org/support/users/onetarek/"><img alt="" class="gravatar" src="https://secure.gravatar.com/avatar/dc4d0f0561009cc18c8d1cdfc760b2f1?s=200&d=retro&r=g">
123
- Md Jahidul Islam</a>
124
- </li>
125
- <li class="wp-person" id="adamsilverstein">
126
- <a class="web" target="_blank" href="https://profiles.wordpress.org/adamsilverstein/"><img alt=""class="gravatar" src="https://secure.gravatar.com/avatar/fddbd6c3e1c3d971aa732b9346aeb433?s=200&d=mm&r=g">
127
- Adam Silverstein</a>
128
- </li>
129
- <li class="wp-person" id="vschettino">
130
- <a class="web" target="_blank" href="https://github.com/vschettino/"><img alt="" class="gravatar" src="https://avatars2.githubusercontent.com/u/7289698?s=460&v=4">
131
- Vinicius Schettino</a>
132
- </li>
133
- <li class="wp-person" id="vschettino">
134
- <a class="web" target="_blank" href="https://github.com/srdjan-jcc"><img alt="" class="gravatar" src="https://avatars2.githubusercontent.com/u/3109112?s=460&v=4">
135
- Srdjan Jocic</a>
136
- </li>
137
- <li class="wp-person" id="vschettino">
138
- <a class="web" target="_blank" href="https://profiles.wordpress.org/soulseekah/"><img alt="" class="gravatar" src="https://avatars0.githubusercontent.com/u/685880?s=460&v=4">
139
- Gennady Kovshenin</a>
140
- </li>
141
- </ul>
142
-
143
  <h3 class="wp-people-group dashicons-before dashicons-translation">
144
  <?php
145
  /* translators: In this context, "translation contributors" are translators who submit strings on translate.wordpress.org and "translation editors" are those who proofread and approve them (also known as PTEs - Project Translation Editors).*/
22
 
23
  <h3 class="wp-people-group"><?php _e( 'Project Leaders', 'all-in-one-seo-pack' ); ?></h3>
24
  <ul class="wp-people-group " id="wp-people-group-project-leaders">
 
 
 
 
 
 
 
 
 
 
25
  <li class="wp-person" id="wp-person-stevemortiboy">
26
  <a class="web" target="_blank" href="https://twitter.com/wpsmort"><img alt="" class="gravatar" src="https://www.gravatar.com/avatar/40e33d813c16a63500675d851b0cbf3a?s=60">
27
  Steve Mortiboy</a>
28
  <span class="title"><?php _e( 'Project Manager', 'all-in-one-seo-pack' ); ?></span>
29
  </li>
 
 
 
 
 
30
  </ul>
31
 
32
  <h3 class="wp-people-group"><?php printf( __( 'Core Team', 'all-in-one-seo-pack' ) ); ?></h3>
36
  Arnaud Broes</a>
37
  <span class="title"><?php _e( 'Team Lead', 'all-in-one-seo-pack' ); ?></span>
38
  </li>
 
 
 
 
 
 
39
  <li class="wp-person" id="EkoJR">
40
  <a class="web" target="_blank" href="https://profiles.wordpress.org/EkoJR/"><img alt="" class="gravatar" src="https://secure.gravatar.com/avatar/bb4c78fe944b58bd5f127d836500c30a?s=200&d=mm&r=g">
41
  Ben Reames</a>
44
 
45
  </ul>
46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  <h3 class="wp-people-group dashicons-before dashicons-translation">
48
  <?php
49
  /* translators: In this context, "translation contributors" are translators who submit strings on translate.wordpress.org and "translation editors" are those who proofread and approve them (also known as PTEs - Project Translation Editors).*/
admin/display/general-metaboxes.php CHANGED
@@ -35,7 +35,6 @@ class aiosp_metaboxes {
35
  case 'aioseop-about':
36
  ?>
37
  <div class="aioseop_metabox_text">
38
- <h2 style="display:inline;"><?php echo AIOSEOP_PLUGIN_NAME; ?></h2>
39
  <?php
40
  global $current_user;
41
  $user_id = $current_user->ID;
@@ -52,9 +51,7 @@ class aiosp_metaboxes {
52
  <p>
53
  <strong>
54
  <?php
55
- echo aiosp_common::get_upgrade_hyperlink( 'side', __( 'Pro Version', 'all-in-one-seo-pack' ), __( 'CLICK HERE', 'all-in-one-seo-pack' ), '_blank' );
56
- /* translators: after this string comes a list of exclusive features that are not included in the free version of the plugin */
57
- echo ' ' . __( 'to upgrade to Pro Version and get:', 'all-in-one-seo-pack' );
58
  ?>
59
  </strong>
60
  </p>
@@ -69,41 +66,35 @@ class aiosp_metaboxes {
69
  <div class="aioseop_metabox_text">
70
  <?php self::pro_meta_content(); ?>
71
  </div>
72
- <?php endif; ?>
73
- <div class="aioseop_metabox_feature">
74
- <div class="aiosp-di">
75
- <a class="dashicons di-twitter" target="_blank" href="https://twitter.com/aioseopack" title="Follow me on Twitter"></a>
76
- <a class="dashicons di-facebook" target="_blank" href="https://www.facebook.com/aioseopack" title="Follow me on Facebook"></a>
77
- </div>
78
- </div>
79
  <?php
 
80
  $aiosp_trans = new AIOSEOP_Translations();
81
  // Eventually if nothing is returned we should just remove this section.
82
- if ( get_locale() != 'en_US' ) :
83
- ?>
84
  <div class="aioseop_translations">
85
  <strong>
86
- <?php
87
- if ( $aiosp_trans->percent_translated < 100 ) {
88
- if ( ! empty( $aiosp_trans->native_name ) ) {
89
- $maybe_native_name = $aiosp_trans->native_name;
90
- } else {
91
- $maybe_native_name = $aiosp_trans->name;
92
- }
93
-
94
- /* translators: %1$s, %2$s, etc. are placeholders and shouldn't be translated. %1$s expands to the number of languages All in One SEO Pack has been translated into, %2$s to the name of the plugin, $3%s to the percentage translated of the current language, $4%s to the language name, %5$s and %6$s to anchor tags with link to the translation page at translate.wordpress.org */
95
- printf(
96
- __( '%1$s has been translated into %2$s languages, but currently the %3$s translation is only %4$s percent complete. %5$sClick here%6$s to help get it to 100 percent.', 'all-in-one-seo-pack' ),
97
- AIOSEOP_PLUGIN_NAME,
98
- $aiosp_trans->translated_count,
99
- $maybe_native_name,
100
- $aiosp_trans->percent_translated,
101
- "<a href=\"$aiosp_trans->translation_url\" target=\"_BLANK\">",
102
- '</a>'
103
- );
104
  }
105
 
106
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
107
  </strong>
108
  </div>
109
  <?php endif; ?>
@@ -157,22 +148,22 @@ class aiosp_metaboxes {
157
  title="<?php _e( 'All in One SEO Pro Plugin Support Forum', 'all-in-one-seo-pack' ); ?>"
158
  href="https://semperplugins.com/support/"><?php _e( 'Access our Premium Support Forums', 'all-in-one-seo-pack' ); ?></a>
159
  </li>
160
- <li>
161
  <div class="aioseop_icon aioseop-icon-cog"></div>
162
  <a target="_blank" rel="noopener noreferrer" title="<?php _e( 'All in One SEO Pro Plugin Changelog', 'all-in-one-seo-pack' ); ?>"
163
  href="https://semperplugins.com/all-in-one-seo-pack-changelog/"><?php _e( 'View the Changelog', 'all-in-one-seo-pack' ); ?></a>
164
  </li>
165
- <li>
166
  <div class="aioseop_icon aioseop-icon-youtube"></div>
167
  <a target="_blank" rel="noopener noreferrer"
168
  href="https://semperplugins.com/doc-type/video/"><?php _e( 'Watch video tutorials', 'all-in-one-seo-pack' ); ?></a>
169
  </li>
170
- <li>
171
  <div class="aioseop_icon aioseop-icon-book"></div>
172
  <a target="_blank" rel="noopener noreferrer"
173
  href="https://semperplugins.com/documentation/quick-start-guide/"><?php _e( 'Getting started? Read the Beginners Guide', 'all-in-one-seo-pack' ); ?></a>
174
  </li>
175
- </ul>
176
  </div>
177
  <?php break; ?>
178
  <?php endswitch; ?>
@@ -189,26 +180,37 @@ class aiosp_metaboxes {
189
 
190
  echo '<ul>';
191
 
 
 
 
192
  if ( class_exists( 'WooCommerce' ) ) {
193
  echo '<li>' . __( 'Advanced support for WooCommerce', 'all-in-one-seo-pack' ) . '</li>';
194
  } else {
195
- echo '<li>' . __( 'Advanced support for e-commerce', 'all-in-one-seo-pack' ) . '</li>';
196
  }
197
 
198
  echo '<li>' . __( 'Video SEO Module', 'all-in-one-seo-pack' ) . '</li>';
199
- echo '<li>' . __( 'SEO for Categories, Tags and Custom Taxonomies', 'all-in-one-seo-pack' ) . '</li>';
200
- echo '<li>' . __( 'Social Meta for Categories, Tags and Custom Taxonomies', 'all-in-one-seo-pack' ) . '</li>';
201
  echo '<li>' . __( 'Advanced Google Analytics tracking', 'all-in-one-seo-pack' ) . '</li>';
 
 
202
  echo '<li>' . __( 'Greater control over display settings', 'all-in-one-seo-pack' ) . '</li>';
203
- echo '<li>' . __( 'Ad free (no banner adverts)', 'all-in-one-seo-pack' ) . '</li>';
204
  echo '<li>' . __( 'Access to Video Screencasts', 'all-in-one-seo-pack' ) . '</li>';
205
- echo '<li>' . __( 'Access to Premium Support Forums', 'all-in-one-seo-pack' ) . '</li>';
206
  echo '<li>' . __( 'Access to Knowledge Center', 'all-in-one-seo-pack' ) . '</li>';
207
 
208
  echo '</ul>';
209
 
210
- echo sprintf( __( '%1$sClick here%2$s to file a feature request/bug report.', 'all-in-one-seo-pack' ), '<a href="https://github.com/semperfiwebdesign/all-in-one-seo-pack/issues/new" target="_blank" rel="noopener noreferrer">', '</a>' );
 
 
 
 
 
 
 
211
 
 
212
  }
213
 
214
  }
35
  case 'aioseop-about':
36
  ?>
37
  <div class="aioseop_metabox_text">
 
38
  <?php
39
  global $current_user;
40
  $user_id = $current_user->ID;
51
  <p>
52
  <strong>
53
  <?php
54
+ _e( 'Upgrade to our premium version and unlock:', 'all-in-one-seo-pack' );
 
 
55
  ?>
56
  </strong>
57
  </p>
66
  <div class="aioseop_metabox_text">
67
  <?php self::pro_meta_content(); ?>
68
  </div>
 
 
 
 
 
 
 
69
  <?php
70
+ endif;
71
  $aiosp_trans = new AIOSEOP_Translations();
72
  // Eventually if nothing is returned we should just remove this section.
73
+ if ( get_locale() != 'en_US' ) :
74
+ ?>
75
  <div class="aioseop_translations">
76
  <strong>
77
+ <?php
78
+ if ( $aiosp_trans->percent_translated < 100 ) {
79
+ if ( ! empty( $aiosp_trans->native_name ) ) {
80
+ $maybe_native_name = $aiosp_trans->native_name;
81
+ } else {
82
+ $maybe_native_name = $aiosp_trans->name;
 
 
 
 
 
 
 
 
 
 
 
 
83
  }
84
 
85
+ /* translators: %1$s, %2$s, etc. are placeholders and shouldn't be translated. %1$s expands to the number of languages All in One SEO Pack has been translated into, %2$s to the name of the plugin, $3%s to the percentage translated of the current language, $4%s to the language name, %5$s and %6$s to anchor tags with link to the translation page at translate.wordpress.org */
86
+ printf(
87
+ __( '%1$s has been translated into %2$s languages, but currently the %3$s translation is only %4$s percent complete. %5$sClick here%6$s to help get it to 100 percent.', 'all-in-one-seo-pack' ),
88
+ AIOSEOP_PLUGIN_NAME,
89
+ $aiosp_trans->translated_count,
90
+ $maybe_native_name,
91
+ $aiosp_trans->percent_translated,
92
+ "<a href=\"$aiosp_trans->translation_url\" target=\"_BLANK\">",
93
+ '</a>'
94
+ );
95
+ }
96
+
97
+ ?>
98
  </strong>
99
  </div>
100
  <?php endif; ?>
148
  title="<?php _e( 'All in One SEO Pro Plugin Support Forum', 'all-in-one-seo-pack' ); ?>"
149
  href="https://semperplugins.com/support/"><?php _e( 'Access our Premium Support Forums', 'all-in-one-seo-pack' ); ?></a>
150
  </li>
151
+ <li>
152
  <div class="aioseop_icon aioseop-icon-cog"></div>
153
  <a target="_blank" rel="noopener noreferrer" title="<?php _e( 'All in One SEO Pro Plugin Changelog', 'all-in-one-seo-pack' ); ?>"
154
  href="https://semperplugins.com/all-in-one-seo-pack-changelog/"><?php _e( 'View the Changelog', 'all-in-one-seo-pack' ); ?></a>
155
  </li>
156
+ <li>
157
  <div class="aioseop_icon aioseop-icon-youtube"></div>
158
  <a target="_blank" rel="noopener noreferrer"
159
  href="https://semperplugins.com/doc-type/video/"><?php _e( 'Watch video tutorials', 'all-in-one-seo-pack' ); ?></a>
160
  </li>
161
+ <li>
162
  <div class="aioseop_icon aioseop-icon-book"></div>
163
  <a target="_blank" rel="noopener noreferrer"
164
  href="https://semperplugins.com/documentation/quick-start-guide/"><?php _e( 'Getting started? Read the Beginners Guide', 'all-in-one-seo-pack' ); ?></a>
165
  </li>
166
+ </ul>
167
  </div>
168
  <?php break; ?>
169
  <?php endswitch; ?>
180
 
181
  echo '<ul>';
182
 
183
+ echo '<li>' . __( 'SEO for Categories, Tags and Custom Taxonomies', 'all-in-one-seo-pack' ) . '</li>';
184
+ echo '<li>' . __( 'Social Meta for Categories, Tags and Custom Taxonomies', 'all-in-one-seo-pack' ) . '</li>';
185
+
186
  if ( class_exists( 'WooCommerce' ) ) {
187
  echo '<li>' . __( 'Advanced support for WooCommerce', 'all-in-one-seo-pack' ) . '</li>';
188
  } else {
189
+ echo '<li>' . __( 'Advanced support for eCommerce', 'all-in-one-seo-pack' ) . '</li>';
190
  }
191
 
192
  echo '<li>' . __( 'Video SEO Module', 'all-in-one-seo-pack' ) . '</li>';
193
+ echo '<li>' . __( 'Image SEO Module', 'all-in-one-seo-pack' ) . '</li>';
 
194
  echo '<li>' . __( 'Advanced Google Analytics tracking', 'all-in-one-seo-pack' ) . '</li>';
195
+ echo '<li>' . __( 'Support for Google Tag Manager', 'all-in-one-seo-pack' ) . '</li>';
196
+ // echo '<li>' . __( 'Support for Local Business Schema', 'all-in-one-seo-pack' ) . '</li>'.
197
  echo '<li>' . __( 'Greater control over display settings', 'all-in-one-seo-pack' ) . '</li>';
 
198
  echo '<li>' . __( 'Access to Video Screencasts', 'all-in-one-seo-pack' ) . '</li>';
199
+ echo '<li>' . __( 'Access to Premium Support', 'all-in-one-seo-pack' ) . '</li>';
200
  echo '<li>' . __( 'Access to Knowledge Center', 'all-in-one-seo-pack' ) . '</li>';
201
 
202
  echo '</ul>';
203
 
204
+ /* translators: %s: "All in One SEO Pack Pro" */
205
+ $text = sprintf( esc_html__( 'Get %s Now', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME . '&nbsp;Pro' );
206
+
207
+ $link = sprintf(
208
+ '<a href="%s" class="button button-primary button-hero button-pro-cta" target="_blank">%s</a>',
209
+ aioseop_get_utm_url( 'sidebar-cta-button' ),
210
+ $text
211
+ );
212
 
213
+ echo $link;
214
  }
215
 
216
  }
admin/display/menu.php CHANGED
@@ -24,13 +24,10 @@ class AIOSEOPAdminMenus {
24
  return;
25
  }
26
 
27
- if ( ! AIOSEOPPRO && ( current_user_can( 'manage_options' ) || current_user_can( 'aiosp_manage_seo' ) ) ) {
28
- add_action( 'admin_menu', array( $this, 'add_pro_submenu' ), 11 );
29
- } else {
30
- return;
31
  }
32
-
33
- add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
34
  }
35
 
36
  function remove_menus() {
@@ -38,13 +35,32 @@ class AIOSEOPAdminMenus {
38
  }
39
 
40
  /**
41
- * Adds Upgrade link to our menu.
42
  *
43
- * @since 2.3.11.5
 
44
  */
45
- function add_pro_submenu() {
46
  global $submenu;
47
- $url = 'https://semperplugins.com/all-in-one-seo-pack-pro-version/?loc=aio_menu';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  $upgrade_text = __( 'Upgrade to Pro', 'all-in-one-seo-pack' );
49
  $submenu[ AIOSEOP_PLUGIN_DIRNAME . '/aioseop_class.php' ][] = array(
50
  "<span class='upgrade_menu_link'>$upgrade_text</span>",
24
  return;
25
  }
26
 
27
+ if ( ( current_user_can( 'manage_options' ) || current_user_can( 'aiosp_manage_seo' ) ) ) {
28
+ add_action( 'admin_menu', array( $this, 'add_submenu_pages' ), 11 );
29
+ add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
 
30
  }
 
 
31
  }
32
 
33
  function remove_menus() {
35
  }
36
 
37
  /**
38
+ * Adds the submenu pages for Lite users.
39
  *
40
+ * @since 2.3.11.5
41
+ * @since 3.4.0 Added About page to admin menu.
42
  */
43
+ function add_submenu_pages() {
44
  global $submenu;
45
+
46
+ $plugin_base_dir = explode( '/', plugin_basename( __FILE__ ) );
47
+ $menu_slug = $plugin_base_dir[0] . '/aioseop_class.php';
48
+
49
+ add_submenu_page(
50
+ $menu_slug,
51
+ sprintf( __( 'About %s', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME ),
52
+ __( 'About Us', 'all-in-one-seo-pack' ),
53
+ apply_filters( 'manage_aiosp', 'aiosp_manage_seo' ),
54
+ 'aioseop-about',
55
+ array( 'AIOSEOP_About', 'init' ),
56
+ null
57
+ );
58
+
59
+ if ( AIOSEOPPRO ) {
60
+ return;
61
+ }
62
+
63
+ $url = aioseop_get_utm_url( 'admin-menu' );
64
  $upgrade_text = __( 'Upgrade to Pro', 'all-in-one-seo-pack' );
65
  $submenu[ AIOSEOP_PLUGIN_DIRNAME . '/aioseop_class.php' ][] = array(
66
  "<span class='upgrade_menu_link'>$upgrade_text</span>",
admin/display/notice-aioseop.php CHANGED
@@ -16,10 +16,46 @@ if ( isset( $notice['class'] ) && ! empty( $notice['class'] ) ) {
16
  $notice_class = $notice['class'];
17
  }
18
 
 
 
 
 
19
  ?>
20
- <div class="notice <?php echo esc_attr( $notice_class ); ?> is-dismissible aioseop-notice-container aioseop-notice-<?php echo esc_attr( $notice['slug'] ); ?>">
21
- <p><?php echo esc_html( $notice['message'] ); ?></p>
22
- <p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  <?php foreach ( $notice['action_options'] as $key => $action_option ) : ?>
24
  <?php
25
  $link = $action_option['link'];
@@ -28,7 +64,17 @@ if ( isset( $notice['class'] ) && ! empty( $notice['class'] ) ) {
28
  $class .= 'aioseop-delay-' . $key;
29
  $class .= ' ' . $action_option['class'];
30
  ?>
31
- <a href="<?php echo esc_url( $link ); ?>" id="<?php echo esc_attr( $id ); ?>" class="aioseop-notice-delay <?php echo esc_attr( $class ); ?>" target="_blank" rel="noopener"><?php echo esc_textarea( $action_option['text'] ); ?></a>
 
 
 
 
 
 
 
 
 
 
32
  <?php endforeach; ?>
33
  </p>
34
  </div>
16
  $notice_class = $notice['class'];
17
  }
18
 
19
+ add_filter( 'safe_style_css', 'aioseop_filter_styles' );
20
+
21
+ $dismissible = ! isset( $notice['dismissible'] ) || $notice['dismissible'] ? ' is-dismissible' : '';
22
+
23
  ?>
24
+ <div class="notice <?php echo esc_attr( $notice_class ); ?><?php echo $dismissible; ?> aioseop-notice-container aioseop-notice-<?php echo esc_attr( $notice['slug'] ); ?>">
25
+ <?php if ( ! empty( $notice['html'] ) ) : ?>
26
+ <?php
27
+ echo wp_kses(
28
+ $notice['html'],
29
+ array(
30
+ 'br' => array(),
31
+ 'div' => array(
32
+ 'class' => true,
33
+ 'style' => true,
34
+ ),
35
+ 'p' => array(),
36
+ 'strong' => array(),
37
+ 'a' => array(
38
+ 'href' => true,
39
+ 'class' => true,
40
+ 'data-*' => true,
41
+ 'target' => true,
42
+ 'rel' => true,
43
+ ),
44
+ 'style' => array(),
45
+ 'script' => array(
46
+ 'type' => true,
47
+ ),
48
+ 'ul' => array(
49
+ 'class' => true,
50
+ ),
51
+ 'li' => array(),
52
+ )
53
+ );
54
+ ?>
55
+ <?php else : ?>
56
+ <p><?php echo esc_html( $notice['message'] ); ?></p>
57
+ <?php endif; ?>
58
+ <p class="aioseo-action-buttons">
59
  <?php foreach ( $notice['action_options'] as $key => $action_option ) : ?>
60
  <?php
61
  $link = $action_option['link'];
64
  $class .= 'aioseop-delay-' . $key;
65
  $class .= ' ' . $action_option['class'];
66
  ?>
67
+ <a
68
+ href="<?php echo esc_url( $link ); ?>"
69
+ id="<?php echo esc_attr( $id ); ?>"
70
+ class="aioseop-notice-delay <?php echo esc_attr( $class ); ?>"
71
+ <?php
72
+ if ( $action_option['new_tab'] ) {
73
+ echo 'target="_blank" rel="noopener"';}
74
+ ?>
75
+ >
76
+ <?php echo esc_textarea( $action_option['text'] ); ?>
77
+ </a>
78
  <?php endforeach; ?>
79
  </p>
80
  </div>
admin/display/notice-default.php CHANGED
@@ -16,10 +16,46 @@ if ( isset( $notice['class'] ) && ! empty( $notice['class'] ) ) {
16
  $notice_class = $notice['class'];
17
  }
18
 
 
 
 
 
19
  ?>
20
- <div class="notice <?php echo esc_attr( $notice_class ); ?> is-dismissible aioseop-notice-container aioseop-notice-<?php echo esc_attr( $notice['slug'] ); ?>">
21
- <p><?php echo esc_html( $notice['message'] ); ?></p>
22
- <p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  <?php foreach ( $notice['action_options'] as $key => $action_option ) : ?>
24
  <?php
25
  $link = $action_option['link'];
@@ -28,7 +64,17 @@ if ( isset( $notice['class'] ) && ! empty( $notice['class'] ) ) {
28
  $class .= 'aioseop-delay-' . $key;
29
  $class .= ' ' . $action_option['class'];
30
  ?>
31
- <a href="<?php echo esc_url( $link ); ?>" id="<?php echo esc_attr( $id ); ?>" class="aioseop-notice-delay <?php echo esc_attr( $class ); ?>" target="_blank" rel="noopener"><?php echo esc_textarea( $action_option['text'] ); ?></a>
 
 
 
 
 
 
 
 
 
 
32
  <?php endforeach; ?>
33
  </p>
34
  </div>
16
  $notice_class = $notice['class'];
17
  }
18
 
19
+ add_filter( 'safe_style_css', 'aioseop_filter_styles' );
20
+
21
+ $dismissible = ! isset( $notice['dismissible'] ) || $notice['dismissible'] ? ' is-dismissible' : '';
22
+
23
  ?>
24
+ <div class="notice <?php echo esc_attr( $notice_class ); ?><?php echo $dismissible; ?> aioseop-notice-container aioseop-notice-<?php echo esc_attr( $notice['slug'] ); ?>">
25
+ <?php if ( ! empty( $notice['html'] ) ) : ?>
26
+ <?php
27
+ echo wp_kses(
28
+ $notice['html'],
29
+ array(
30
+ 'br' => array(),
31
+ 'div' => array(
32
+ 'class' => true,
33
+ 'style' => true,
34
+ ),
35
+ 'p' => array(),
36
+ 'strong' => array(),
37
+ 'a' => array(
38
+ 'href' => true,
39
+ 'class' => true,
40
+ 'data-*' => true,
41
+ 'target' => true,
42
+ 'rel' => true,
43
+ ),
44
+ 'style' => array(),
45
+ 'script' => array(
46
+ 'type' => true,
47
+ ),
48
+ 'ul' => array(
49
+ 'class' => true,
50
+ ),
51
+ 'li' => array(),
52
+ )
53
+ );
54
+ ?>
55
+ <?php else : ?>
56
+ <p><?php echo esc_html( $notice['message'] ); ?></p>
57
+ <?php endif; ?>
58
+ <p class="aioseo-action-buttons">
59
  <?php foreach ( $notice['action_options'] as $key => $action_option ) : ?>
60
  <?php
61
  $link = $action_option['link'];
64
  $class .= 'aioseop-delay-' . $key;
65
  $class .= ' ' . $action_option['class'];
66
  ?>
67
+ <a
68
+ href="<?php echo esc_url( $link ); ?>"
69
+ id="<?php echo esc_attr( $id ); ?>"
70
+ class="aioseop-notice-delay <?php echo esc_attr( $class ); ?>"
71
+ <?php
72
+ if ( $action_option['new_tab'] ) {
73
+ echo 'target="_blank" rel="noopener"';}
74
+ ?>
75
+ >
76
+ <?php echo esc_textarea( $action_option['text'] ); ?>
77
+ </a>
78
  <?php endforeach; ?>
79
  </p>
80
  </div>
admin/display/notices/check-php-version-notice.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Check PHP Version Notice.
4
+ *
5
+ * @since 3.4
6
+ *
7
+ * @package All-in-One-SEO-Pack
8
+ */
9
+
10
+ /**
11
+ * Notice - Check PHP Version
12
+ *
13
+ * @since 3.4
14
+ *
15
+ * @return array Notice configuration.
16
+ */
17
+ function aioseop_notice_check_php_version() {
18
+ $medium = ( AIOSEOPPRO ) ? 'proplugin' : 'liteplugin';
19
+ return array(
20
+ 'slug' => 'check_php_version',
21
+ 'delay_time' => 0,
22
+ 'target' => 'user',
23
+ 'screens' => array(),
24
+ 'class' => 'notice-error',
25
+ 'dismissible' => false,
26
+ /* translators: %1$s is a placeholder, which means that it should not be translated. It will be replaced with the name of the plugin, All in One SEO Pack. */
27
+ 'html' => '
28
+ <p>' . sprintf( __( 'Your site is running an outdated version of PHP that is no longer supported and may cause issues with %1$s. <a href="%2$s" target="_blank" rel="noopener noreferrer">Read more</a> for additional information.', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME, 'https://semperplugins.com/documentation/supported-php-version/?utm_source=WordPress&utm_medium=' . $medium . '&utm_campaign=outdated-php-notice' ) . '</p>
29
+ <style>
30
+ .aioseop-notice-check_php_version .aioseo-action-buttons {
31
+ display: none;
32
+ }
33
+ </style>
34
+ ',
35
+ );
36
+ }
37
+ add_filter( 'aioseop_admin_notice-check_php_version', 'aioseop_notice_check_php_version' );
admin/display/notices/conflicting-plugin-notice.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Conflicting Plugin Notice
4
+ *
5
+ * @since 3.4.0
6
+ *
7
+ * @package All-in-One-SEO-Pack
8
+ * @subpackage AIOSEOP_Notices
9
+ */
10
+
11
+ /**
12
+ * Returns the default values for our conflicting plugin notice.
13
+ *
14
+ * @since 3.4.0 Added UTM link and removed dismiss button.
15
+ *
16
+ * @return array
17
+ */
18
+ function aioseop_conflicting_plugin_notice() {
19
+ return array(
20
+ 'slug' => 'conflicting_plugin',
21
+ 'delay_time' => 0,
22
+ 'message' => '',
23
+ 'target' => 'user',
24
+ 'screens' => array(),
25
+ 'class' => 'notice-error',
26
+ 'action_options' => array(
27
+ array(
28
+ 'time' => 0,
29
+ 'link' => '#',
30
+ 'new_tab' => false,
31
+ 'text' => __( 'Deactivate plugins', 'all-in-one-seo-pack' ),
32
+ 'dismiss' => false,
33
+ 'class' => 'button-primary',
34
+ ),
35
+ array(
36
+ 'time' => 172800, // 48H
37
+ 'text' => 'Remind me later',
38
+ 'link' => '',
39
+ 'dismiss' => false,
40
+ 'class' => 'button-secondary',
41
+ ),
42
+ ),
43
+ );
44
+ }
45
+ add_filter( 'aioseop_admin_notice-conflicting_plugin', 'aioseop_conflicting_plugin_notice' );
admin/display/notices/review-plugin-cta-notice.php ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Review Plugin Notice
4
+ *
5
+ * @since 3.4
6
+ *
7
+ * @package All-in-One-SEO-Pack
8
+ */
9
+
10
+ /**
11
+ * Notice - Review Plugin
12
+ *
13
+ * @since 3.4
14
+ *
15
+ * @return array Notice configuration.
16
+ */
17
+ function aioseop_notice_review_plugin_cta() {
18
+ global $aioseop_options;
19
+ $feedback_url = add_query_arg(
20
+ array(
21
+ 'wpf7528_24' => untrailingslashit( home_url() ),
22
+ 'wpf7528_26' => ! empty( $aioseop_options['aiosp_license_key'] ) ? $aioseop_options['aiosp_license_key'] : null,
23
+ 'wpf7528_27' => AIOSEOPPRO ? 'pro' : 'lite',
24
+ 'wpf7528_28' => AIOSEOP_VERSION,
25
+ 'utm_source' => AIOSEOPPRO ? 'proplugin' : 'liteplugin',
26
+ 'utm_medium' => 'review-notice',
27
+ 'utm_campaign' => 'feedback',
28
+ 'utm_content' => AIOSEOP_VERSION,
29
+ ),
30
+ 'https://semperplugins.com/plugin-feedback/'
31
+ );
32
+
33
+ return array(
34
+ 'slug' => 'review_plugin_cta',
35
+ 'delay_time' => WEEK_IN_SECONDS * 2,
36
+ 'target' => 'user',
37
+ 'screens' => array(),
38
+ 'class' => 'notice-info',
39
+ 'html' => '
40
+ <div class="aioseo-review-plugin-cta">
41
+ <div class="step-1">' .
42
+ /* translators: %1$s is a placeholder, which means that it should not be translated. It will be replaced with the name of the plugin, All in One SEO Pack. */
43
+ '<p>' . sprintf( __( 'Are you enjoying %1$s?', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME ) . '</p>
44
+ <p>
45
+ <a href="#" class="aioseo-review-switch-step-2" data-step="2">Not Really</a>
46
+ <a href="#" class="aioseo-review-switch-step-3" data-step="3">Yes!</a>
47
+ </p>
48
+ </div>
49
+ <div class="step-2" style="display:none;">' .
50
+ /* translators: %1$s is a placeholder, which means that it should not be translated. It will be replaced with the name of the plugin, All in One SEO Pack. */
51
+ '<p>' . sprintf( __( 'We\'re sorry to hear you aren\'t enjoying %1$s. We would love a chance to improve. Could you take a minute and let us know what we can do better?', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME ) . '</p>
52
+ <p>
53
+ <a href="' . $feedback_url . '" class="aioseo-dismiss-review-notice" target="_blank" rel="noopener noreferrer">' . __( 'Give feedback', 'all-in-one-seo-pack' ) . '</a>&nbsp;&nbsp;
54
+ <a href="#" class="aioseo-dismiss-review-notice" target="_blank" rel="noopener noreferrer">' . __( 'No thanks', 'all-in-one-seo-pack' ) . '</a>
55
+ </p>
56
+ </div>
57
+ <div class="step-3" style="display:none;">
58
+ <p>' . __( 'That\'s awesome! Could you please do me a BIG favor and give it a 5-star rating on WordPress to help us spread the word and boost our motivation?', 'all-in-one-seo-pack' ) . '</p>' .
59
+ /* translators: %1$s is a placeholder, which means that it should not be translated. It will be replaced with the name of the plugin, All in One SEO Pack. */
60
+ '<p><strong>~ Syed Balkhi<br>' . sprintf( __( 'President of %1$s', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME ) . '</strong></p>
61
+ <p>
62
+ <a href="https://wordpress.org/support/plugin/all-in-one-seo-pack/reviews/?filter=5#new-post" class="aioseo-dismiss-review-notice" target="_blank" rel="noopener noreferrer">' . __( 'Ok, you deserve it', 'all-in-one-seo-pack' ) . '</a>&nbsp;&nbsp;
63
+ <a href="#" class="aioseo-dismiss-review-notice-delay" target="_blank" rel="noopener noreferrer">' . __( 'Nope, maybe later', 'all-in-one-seo-pack' ) . '</a>&nbsp;&nbsp;
64
+ <a href="#" class="aioseo-dismiss-review-notice" target="_blank" rel="noopener noreferrer">' . __( 'I already did', 'all-in-one-seo-pack' ) . '</a>
65
+ </p>
66
+ </div>
67
+ </div>
68
+ <style>
69
+ .aioseop-notice-review_plugin_cta .aioseo-action-buttons {
70
+ display: none;
71
+ }
72
+ </style>
73
+ <script type="text/javascript">
74
+ jQuery(document).on("click", ".aioseo-review-plugin-cta .aioseo-review-switch-step-3", function(event) {
75
+ event.preventDefault();
76
+ jQuery(".aioseo-review-plugin-cta .step-1, .aioseo-review-plugin-cta .step-2").hide();
77
+ jQuery(".aioseo-review-plugin-cta .step-3").show();
78
+ });
79
+ jQuery(document).on("click", ".aioseo-review-plugin-cta .aioseo-review-switch-step-2", function(event) {
80
+ event.preventDefault();
81
+ jQuery(".aioseo-review-plugin-cta .step-1, .aioseo-review-plugin-cta .step-3").hide();
82
+ jQuery(".aioseo-review-plugin-cta .step-2").show();
83
+ });
84
+ jQuery(document).on("click", ".aioseo-review-plugin-cta .aioseo-dismiss-review-notice-delay", function(event) {
85
+ event.preventDefault();
86
+ var element = jQuery(".aioseop-notice-review_plugin_cta .aioseo-action-buttons .aioseo-dismiss-review-notice-delay-button");
87
+ element.click();
88
+ });
89
+ jQuery(document).on("click", ".aioseo-review-plugin-cta .aioseo-dismiss-review-notice", function(event) {
90
+ if ("#" === jQuery(this).attr("href")) {
91
+ event.preventDefault();
92
+ }
93
+ var element = jQuery(".aioseop-notice-review_plugin_cta .aioseo-action-buttons .aioseo-dismiss-review-notice-button");
94
+ element.click();
95
+ });
96
+ </script>
97
+ ',
98
+ 'action_options' => array(
99
+ array(
100
+ 'time' => 0,
101
+ 'text' => '',
102
+ 'link' => '',
103
+ 'dismiss' => true,
104
+ 'class' => 'aioseo-dismiss-review-notice-button',
105
+ ),
106
+ array(
107
+ 'time' => WEEK_IN_SECONDS,
108
+ 'text' => '',
109
+ 'link' => '',
110
+ 'dismiss' => false,
111
+ 'class' => 'aioseo-dismiss-review-notice-delay-button',
112
+ ),
113
+ ),
114
+ );
115
+ }
116
+ add_filter( 'aioseop_admin_notice-review_plugin_cta', 'aioseop_notice_review_plugin_cta' );
admin/display/notices/wc-detected-notice.php CHANGED
@@ -2,15 +2,17 @@
2
  /**
3
  * WooCommerce Detected Notice
4
  *
5
- * @since 3.0
 
6
  * @package All-in-One-SEO-Pack
7
  * @subpackage AIOSEOP_Notices
8
  */
9
 
10
  /**
11
- * Notice - Pro Promotion for WooCommerce
12
  *
13
- * @since 3.0
 
14
  *
15
  * @return array
16
  */
@@ -19,27 +21,21 @@ function aioseop_notice_pro_promo_woocommerce() {
19
  'slug' => 'woocommerce_detected',
20
  'delay_time' => 0,
21
  /* translators: %s is a placeholder, which means that it should not be translated. It will be replaced with the name of the premium version of the plugin, All in One SEO Pack Pro. */
22
- 'message' => sprintf( __( 'We have detected you are running WooCommerce. Upgrade to %s to unlock our advanced e-commerce features, including SEO for Product Categories and more.', 'all-in-one-seo-pack' ), 'All in One SEO Pack Pro' ),
23
 
24
  'class' => 'notice-info',
25
  'target' => 'site',
26
- 'screens' => array( 'aioseop' ),
27
  'action_options' => array(
28
  array(
29
  'time' => 0,
30
- 'text' => __( 'Upgrade', 'all-in-one-seo-pack' ),
31
- 'link' => 'https://semperplugins.com/plugins/all-in-one-seo-pack-pro-version/?loc=woo',
32
  'dismiss' => false,
33
  'class' => 'button-primary button-orange',
34
  ),
35
- array(
36
- 'time' => 2592000, // 30 days.
37
- 'text' => __( 'No Thanks', 'all-in-one-seo-pack' ),
38
- 'link' => '',
39
- 'dismiss' => false,
40
- 'class' => 'button-secondary',
41
- ),
42
  ),
43
  );
44
  }
 
45
  add_filter( 'aioseop_admin_notice-woocommerce_detected', 'aioseop_notice_pro_promo_woocommerce' );
2
  /**
3
  * WooCommerce Detected Notice
4
  *
5
+ * @since 3.0.0
6
+ *
7
  * @package All-in-One-SEO-Pack
8
  * @subpackage AIOSEOP_Notices
9
  */
10
 
11
  /**
12
+ * Returns the default values for our WooCommerce upsell notice.
13
  *
14
+ * @since 3.0.0
15
+ * @since 3.4.0 Added UTM link and removed dismiss button.
16
  *
17
  * @return array
18
  */
21
  'slug' => 'woocommerce_detected',
22
  'delay_time' => 0,
23
  /* translators: %s is a placeholder, which means that it should not be translated. It will be replaced with the name of the premium version of the plugin, All in One SEO Pack Pro. */
24
+ 'message' => sprintf( __( 'We have detected you are running WooCommerce. Upgrade to %s to unlock our advanced eCommerce SEO features, including SEO for Product Categories and more.', 'all-in-one-seo-pack' ), 'All in One SEO Pack Pro' ),
25
 
26
  'class' => 'notice-info',
27
  'target' => 'site',
28
+ 'screens' => array( 'aioseop', 'product', 'edit-product' ),
29
  'action_options' => array(
30
  array(
31
  'time' => 0,
32
+ 'text' => __( 'Upgrade to Pro', 'all-in-one-seo-pack' ),
33
+ 'link' => aioseop_get_utm_url( 'woocommerce-upsell-notice' ),
34
  'dismiss' => false,
35
  'class' => 'button-primary button-orange',
36
  ),
 
 
 
 
 
 
 
37
  ),
38
  );
39
  }
40
+
41
  add_filter( 'aioseop_admin_notice-woocommerce_detected', 'aioseop_notice_pro_promo_woocommerce' );
admin/display/welcome-content.php CHANGED
@@ -11,7 +11,7 @@
11
  <div class="welcome-panel-content">
12
  <div class="welcome-panel-column-container">
13
  <div>
14
- <h3><a href="https://semperplugins.com/all-in-one-seo-pack-3-2/" target="_blank"><?php echo esc_html( __( "Check out what's new in our latest release post!", 'all-in-one-seo-pack' ) ); ?></a></h3>
15
  </div>
16
  <div class="welcome-panel-column">
17
  <h3>
11
  <div class="welcome-panel-content">
12
  <div class="welcome-panel-column-container">
13
  <div>
14
+ <h3><a href="https://semperplugins.com/all-in-one-seo-pack-3-4/" target="_blank"><?php echo esc_html( __( "Check out what's new in our latest release post!", 'all-in-one-seo-pack' ) ); ?></a></h3>
15
  </div>
16
  <div class="welcome-panel-column">
17
  <h3>
admin/display/welcome.php CHANGED
@@ -147,11 +147,11 @@ if ( ! class_exists( 'aioseop_welcome' ) ) {
147
  href="<?php echo esc_url( admin_url( add_query_arg( array( 'page' => 'aioseop-about' ), 'index.php' ) ) ); ?>">
148
  <?php esc_html_e( 'What&#8217;s New', 'all-in-one-seo-pack' ); ?>
149
  </a>
150
- <a
151
  class="nav-tab" id="aioseop-credits"
152
  href="<?php echo esc_url( admin_url( add_query_arg( array( 'page' => 'aioseop-credits' ), 'index.php' ) ) ); ?>">
153
  <?php esc_html_e( 'Credits', 'all-in-one-seo-pack' ); ?>
154
- </a>
155
  </h2>
156
 
157
 
147
  href="<?php echo esc_url( admin_url( add_query_arg( array( 'page' => 'aioseop-about' ), 'index.php' ) ) ); ?>">
148
  <?php esc_html_e( 'What&#8217;s New', 'all-in-one-seo-pack' ); ?>
149
  </a>
150
+ <!--a
151
  class="nav-tab" id="aioseop-credits"
152
  href="<?php echo esc_url( admin_url( add_query_arg( array( 'page' => 'aioseop-credits' ), 'index.php' ) ) ); ?>">
153
  <?php esc_html_e( 'Credits', 'all-in-one-seo-pack' ); ?>
154
+ </a-->
155
  </h2>
156
 
157
 
admin/meta_import.php CHANGED
@@ -197,7 +197,7 @@ function aiosp_seometa_admin() {
197
  </p>
198
 
199
  <p><span
200
- class="row-title"><?php printf( esc_html__( 'Before performing an import, we strongly recommend that you make a backup of your site. We use and recommend %1$s BackupBuddy %2$s for backups.', 'all-in-one-seo-pack' ), sprintf( '<a target="_blank" href="%s">', esc_url( 'https://semperfiwebdesign.com/backupbuddy/' ) ), '</a>' ); ?></span>
201
  </p>
202
 
203
 
197
  </p>
198
 
199
  <p><span
200
+ class="row-title"><?php printf( esc_html__( 'Before performing an import, we strongly recommend that you make a backup of your site. We use and recommend %1$s VaultPress by Jetpack %2$s for backups.', 'all-in-one-seo-pack' ), sprintf( '<a target="_blank" href="%s">', esc_url( 'https://www.wpbeginner.com/refer/jetpack/' ) ), '</a>' ); ?></span>
201
  </p>
202
 
203
 
aioseop_class.php CHANGED
@@ -399,13 +399,13 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
399
  /* translators: This is a setting where users can indicate which post types they want to use All in One SEO Pack with. */
400
  'name' => __( 'SEO on only these Content Types', 'all-in-one-seo-pack' ),
401
  'type' => 'multicheckbox',
402
- 'default' => array( 'post', 'page' ),
403
  ),
404
  'taxactive' => array(
405
  /* translators: This is a setting where users can indicate which taxonomies they want to use All in One SEO Pack with. */
406
  'name' => __( 'SEO on only these taxonomies', 'all-in-one-seo-pack' ),
407
  'type' => 'multicheckbox',
408
- 'default' => array( 'category', 'post_tag' ),
409
  ),
410
  'cpostnoindex' => array(
411
  /* translators: This is a setting where users can indicate which post types they want to NOINDEX by default. NOINDEX is a value of the HTML robots meta tag that asks search engines not to index the page. */
@@ -516,7 +516,7 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
516
  ),
517
  ),
518
  'ga_anonymize_ip' => array(
519
- /* translators: This is a setting which tells Google Analytics not to track and store the IP addresses of website visitors. This is required to be compliant with the GDPR for example. */
520
  'name' => __( 'Anonymize IP Addresses', 'all-in-one-seo-pack' ),
521
  'type' => 'checkbox',
522
  'condshow' => array(
@@ -867,7 +867,6 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
867
  );
868
 
869
  if ( ! AIOSEOPPRO ) {
870
- unset( $this->default_options['license_key'] );
871
  unset( $this->default_options['taxactive'] );
872
  }
873
 
@@ -886,7 +885,6 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
886
  'options' => array(
887
  'edit',
888
  'nonce-aioseop-edit',
889
- AIOSEOPPRO ? 'support' : 'upgrade',
890
  'snippet',
891
  'title',
892
  'description',
@@ -895,6 +893,8 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
895
  'noindex',
896
  'nofollow',
897
  'sitemap_exclude',
 
 
898
  'disable',
899
  'disable_analytics',
900
  ),
@@ -914,23 +914,17 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
914
  'upgrade' => array(
915
  'type' => 'html',
916
  'label' => 'none',
917
- 'default' => aiosp_common::get_upgrade_hyperlink(
918
- 'meta',
 
919
  sprintf(
920
- '%1$s %2$s Pro',
921
- /* translators: The complete string is as follows: "Upgrade to All in One SEO Pack Pro". */
922
- __( 'Upgrade to', 'all-in-one-seo-pack' ),
923
- AIOSEOP_PLUGIN_NAME
924
  ),
925
- __( 'UPGRADE TO PRO VERSION', 'all-in-one-seo-pack' ),
926
- '_blank'
927
  ),
928
  ),
929
- 'support' => array(
930
- 'type' => 'html',
931
- 'label' => 'none',
932
- 'default' => '<a target="_blank" href="https://semperplugins.com/support/">' . __( 'Support Forum', 'all-in-one-seo-pack' ) . '</a>',
933
- ),
934
  'snippet' => array(
935
  /* translators: The preview snippet shows how the page will look like in the search results (title, meta description and permalink). */
936
  'name' => __( 'Preview Snippet', 'all-in-one-seo-pack' ),
@@ -966,16 +960,83 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
966
  /* translators: This is a setting that allows users to add the NOINDEX robots meta tag value to the current post/page. */
967
  'name' => __( 'NOINDEX this page/post', 'all-in-one-seo-pack' ),
968
  'default' => '',
 
969
  ),
970
  'nofollow' => array(
971
  /* translators: This is a setting that allows users to add the NOFOLLOW robots meta tag value to the current post/page. */
972
  'name' => __( 'NOFOLLOW this page/post', 'all-in-one-seo-pack' ),
973
  'default' => '',
974
  ),
975
- /* translators: This is a setting that allows users to exclude the current post/page from the sitemap. */
976
- 'sitemap_exclude' => array( 'name' => __( 'Exclude From Sitemap', 'all-in-one-seo-pack' ) ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
977
  /* translators: This is a setting that allows users to disable All in One SEO Pack for the current post/page. */
978
  'disable' => array( 'name' => __( 'Disable on this page/post', 'all-in-one-seo-pack' ) ),
 
979
  'disable_analytics' => array(
980
  /* translators: This is a setting that allows users to disable Google Analytics tracking for the current post/page. */
981
  'name' => __( 'Disable Google Analytics', 'all-in-one-seo-pack' ),
@@ -987,6 +1048,12 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
987
  ),
988
  );
989
 
 
 
 
 
 
 
990
  $this->layout = array(
991
  'default' => array(
992
  /* translators: This is the name of the main menu. */
@@ -1167,11 +1234,12 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
1167
 
1168
  if ( is_admin() ) {
1169
  add_action( 'aioseop_global_settings_header', array( $this, 'display_right_sidebar' ) );
1170
- add_action( 'aioseop_global_settings_footer', array( $this, 'display_settings_footer' ) );
1171
  add_action( 'output_option', array( $this, 'custom_output_option' ), 10, 2 );
1172
  add_action( 'admin_init', array( $this, 'visibility_warning' ) );
 
1173
  add_action( 'admin_init', array( $this, 'woo_upgrade_notice' ) );
1174
-
 
1175
  }
1176
  if ( AIOSEOPPRO ) {
1177
  add_action( 'split_shared_term', array( $this, 'split_shared_term' ), 10, 4 );
@@ -1214,13 +1282,13 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
1214
  $w = $info['w'];
1215
  $p = $info['p'];
1216
 
1217
- if ( $this->strlen( $title ) > 70 ) {
1218
  $title = $this->trim_excerpt_without_filters(
1219
  $this->html_entity_decode( $title ),
1220
  70
1221
  ) . '...';
1222
  }
1223
- if ( $this->strlen( $description ) > 156 ) {
1224
  $description = $this->trim_excerpt_without_filters(
1225
  $this->html_entity_decode( $description ),
1226
  156
@@ -1619,6 +1687,8 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
1619
  'disable_analytics',
1620
  'noindex',
1621
  'nofollow',
 
 
1622
  );
1623
  if ( ! ( ! empty( $this->options['aiosp_can'] ) ) ) {
1624
  unset( $optlist['custom_link'] );
@@ -2131,7 +2201,7 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
2131
  $search = esc_attr( stripslashes( $s ) );
2132
  $title = $search;
2133
  } elseif ( ( is_tax() || is_category() ) && ! is_feed() ) {
2134
- $category_name = $this->ucwords( $this->internationalize( single_cat_title( '', false ) ) );
2135
  $title = $category_name;
2136
  } elseif ( is_page() ) {
2137
  $title = $this->internationalize( single_post_title( '', false ) );
@@ -2207,7 +2277,7 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
2207
  $request_a = explode( ' ', $request );
2208
  $request_new = array();
2209
  foreach ( $request_a as $token ) {
2210
- $request_new[] = $this->ucwords( trim( $token ) );
2211
  }
2212
  $request = implode( ' ', $request_new );
2213
 
@@ -2309,10 +2379,10 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
2309
  $new_title = str_replace( "%{$type}_author_nicename%", $authordata->user_nicename, $new_title );
2310
  }
2311
  if ( false !== strpos( $new_title, "%{$type}_author_firstname%", 0 ) ) {
2312
- $new_title = str_replace( "%{$type}_author_firstname%", $this->ucwords( $authordata->first_name ), $new_title );
2313
  }
2314
  if ( false !== strpos( $new_title, "%{$type}_author_lastname%", 0 ) ) {
2315
- $new_title = str_replace( "%{$type}_author_lastname%", $this->ucwords( $authordata->last_name ), $new_title );
2316
  }
2317
  if ( false !== strpos( $new_title, '%current_date%', 0 ) ) {
2318
  $new_title = str_replace( '%current_date%', aioseop_formatted_date(), $new_title );
@@ -2990,7 +3060,7 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
2990
  $max = $this->maximum_description_length;
2991
  }
2992
  $max_orig = $max;
2993
- $len = $this->strlen( $text2 );
2994
  if ( $max < $len ) {
2995
  if ( function_exists( 'mb_strrpos' ) ) {
2996
  $pos = mb_strrpos( $text2, ' ', - ( $len - $max ), 'UTF-8' );
@@ -3013,7 +3083,7 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
3013
  $max = $max_orig;
3014
  }
3015
  }
3016
- $text = $this->substr( $text, 0, $max );
3017
 
3018
  return trim( $text );
3019
  }
@@ -3045,15 +3115,15 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
3045
 
3046
  if ( get_query_var( 'm' ) ) {
3047
  $m = preg_replace( '/[^0-9]/', '', get_query_var( 'm' ) );
3048
- switch ( $this->strlen( $m ) ) {
3049
  case 4:
3050
  $link = get_year_link( $m );
3051
  break;
3052
  case 6:
3053
- $link = get_month_link( $this->substr( $m, 0, 4 ), $this->substr( $m, 4, 2 ) );
3054
  break;
3055
  case 8:
3056
- $link = get_day_link( $this->substr( $m, 0, 4 ), $this->substr( $m, 4, 2 ), $this->substr( $m, 6, 2 ) );
3057
  break;
3058
  default:
3059
  return false;
@@ -3354,7 +3424,7 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
3354
  }
3355
  if ( ! empty( $keywords ) ) {
3356
  foreach ( $keywords as $word ) {
3357
- $small_keywords[] = trim( $this->strtolower( $word ) );
3358
  }
3359
  }
3360
 
@@ -3404,6 +3474,8 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
3404
  'disable_analytics',
3405
  'noindex',
3406
  'nofollow',
 
 
3407
  );
3408
  foreach ( $optlist as $f ) {
3409
  $meta = get_term_meta( $term_id, '_aioseop_' . $f, true );
@@ -3465,7 +3537,7 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
3465
  ?>
3466
  });
3467
  }
3468
- <?php } ?>
3469
  </script>
3470
  <?php
3471
  }
@@ -3677,11 +3749,12 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
3677
  case 'post.php':
3678
  case 'post-new.php':
3679
  $title_format = $this->get_preview_snippet_title();
3680
- $extra_title_length = strlen( preg_replace( '/<span.*\/span>/', '', $title_format ) );
3681
 
3682
  $snippet_preview_data = array(
3683
  'autogenerateDescriptions' => $aioseop_options['aiosp_generate_descriptions'],
3684
  'skipExcerpt' => $aioseop_options['aiosp_skip_excerpt'],
 
3685
  );
3686
 
3687
  $count_chars_data['extraTitleLength'] = $extra_title_length;
@@ -3695,11 +3768,16 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
3695
  );
3696
  wp_localize_script( 'aioseop-preview-snippet', 'aioseop_preview_snippet', $snippet_preview_data );
3697
 
 
 
 
 
 
3698
  wp_enqueue_script(
3699
  'xregexp',
3700
- 'https://cdn.jsdelivr.net/npm/xregexp@3.2.0',
3701
  array(),
3702
- '3.2.0'
3703
  );
3704
  // No break required.
3705
  case 'toplevel_page_' . AIOSEOP_PLUGIN_DIRNAME . '/aioseop_class':
@@ -3867,6 +3945,8 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
3867
  }
3868
 
3869
  if ( ! is_object( $aioseop_sitemap ) ) {
 
 
3870
  unset( $settings['aiosp_sitemap_exclude'] );
3871
  }
3872
 
@@ -4084,8 +4164,8 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
4084
  $title = trim( strip_tags( $title ) );
4085
  $title_tag_start = '<title';
4086
  $title_tag_end = '</title';
4087
- $start = $this->strpos( $content, $title_tag_start, 0 );
4088
- $end = $this->strpos( $content, $title_tag_end, 0 );
4089
  $this->title_start = $start;
4090
  $this->title_end = $end;
4091
  $this->orig_title = $title;
@@ -4212,6 +4292,47 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
4212
  }
4213
  }
4214
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4215
  /**
4216
  * WooCommerce Upgrade Notice
4217
  *
@@ -4288,7 +4409,7 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
4288
  global $aioseop_options;
4289
 
4290
  // Handle the description format.
4291
- if ( isset( $description ) && false !== $description && ( $this->strlen( $description ) > $this->minimum_description_length ) && ! ( is_front_page() && is_paged() ) ) {
4292
  $description = $this->trim_description( $description );
4293
  if ( ! isset( $meta_string ) ) {
4294
  $meta_string = '';
@@ -4433,8 +4554,7 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
4433
  // Logging - rewrite handler check for output buffering.
4434
  $this->check_rewrite_handler();
4435
 
4436
- /* translators: The complete string is: "All in One SEO Pack by Michael Torbert of Semper Fi Web Design". The placeholders shouldn't be altered; only the words "by" and "of" should be translated. */
4437
- printf( "\n<!-- " . __( '%1$s by %2$s of %3$s', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME . ' ' . $this->version, 'Michael Torbert', 'Semper Fi Web Design' );
4438
 
4439
  if ( $this->ob_start_detected ) {
4440
  echo 'ob_start_detected ';
@@ -4448,7 +4568,7 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
4448
  $save_posts = $posts;
4449
 
4450
  // This outputs robots meta tags and custom canonical URl on WooCommerce product archive page.
4451
- // See Github issue https://github.com/semperfiwebdesign/all-in-one-seo-pack/issues/755.
4452
  if ( function_exists( 'wc_get_page_id' ) && is_post_type_archive( 'product' ) ) {
4453
  $post_id = wc_get_page_id( 'shop' );
4454
  if ( $post_id ) {
@@ -4653,7 +4773,7 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
4653
  }
4654
  if (
4655
  sizeof( $active_handlers ) > 0 &&
4656
- $this->strtolower( $active_handlers[ sizeof( $active_handlers ) - 1 ] ) == $this->strtolower( 'All_in_One_SEO_Pack::output_callback_for_title' )
4657
  ) {
4658
  ob_end_flush();
4659
  } else {
@@ -4933,28 +5053,36 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
4933
  }
4934
 
4935
  /**
4936
- * Save Post Data
4937
  *
4938
- * @since ?
 
4939
  *
4940
- * @param $id
4941
- * @return bool
4942
  */
4943
  function save_post_data( $id ) {
4944
  $awmp_edit = null;
4945
  $nonce = null;
 
4946
  if ( empty( $_POST ) ) {
4947
  return false;
4948
  }
 
4949
  if ( isset( $_POST['aiosp_edit'] ) ) {
4950
  $awmp_edit = $_POST['aiosp_edit'];
4951
  }
 
4952
  if ( isset( $_POST['nonce-aioseop-edit'] ) ) {
4953
  $nonce = $_POST['nonce-aioseop-edit'];
4954
  }
4955
 
4956
  if ( isset( $awmp_edit ) && ! empty( $awmp_edit ) && wp_verify_nonce( $nonce, 'edit-aioseop-nonce' ) ) {
4957
 
 
 
 
 
4958
  $optlist = array(
4959
  'keywords',
4960
  'description',
@@ -4965,52 +5093,30 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
4965
  'disable_analytics',
4966
  'noindex',
4967
  'nofollow',
 
 
4968
  );
4969
- if ( ! ( ! empty( $this->options['aiosp_can'] ) ) ) {
4970
- unset( $optlist['custom_link'] );
 
4971
  }
4972
- foreach ( $optlist as $f ) {
4973
- $field = "aiosp_$f";
 
4974
  if ( isset( $_POST[ $field ] ) ) {
4975
  $$field = $_POST[ $field ];
4976
  }
4977
- }
4978
 
4979
- $optlist = array(
4980
- 'keywords',
4981
- 'description',
4982
- 'title',
4983
- 'custom_link',
4984
- 'noindex',
4985
- 'nofollow',
4986
- );
4987
- if ( ! ( ! empty( $this->options['aiosp_can'] ) ) ) {
4988
- unset( $optlist['custom_link'] );
4989
  }
4990
- foreach ( $optlist as $f ) {
4991
- delete_post_meta( $id, "_aioseop_{$f}" );
4992
- }
4993
-
4994
- delete_post_meta( $id, '_aioseop_sitemap_exclude' );
4995
- delete_post_meta( $id, '_aioseop_disable' );
4996
- delete_post_meta( $id, '_aioseop_disable_analytics' );
4997
 
4998
- foreach ( $optlist as $f ) {
4999
- $var = "aiosp_$f";
5000
- $field = "_aioseop_$f";
5001
  if ( isset( $$var ) && ! empty( $$var ) ) {
5002
  add_post_meta( $id, $field, $$var );
5003
  }
5004
  }
5005
- if ( isset( $aiosp_sitemap_exclude ) && ! empty( $aiosp_sitemap_exclude ) ) {
5006
- add_post_meta( $id, '_aioseop_sitemap_exclude', $aiosp_sitemap_exclude );
5007
- }
5008
- if ( isset( $aiosp_disable ) && ! empty( $aiosp_disable ) ) {
5009
- add_post_meta( $id, '_aioseop_disable', $aiosp_disable );
5010
- if ( isset( $aiosp_disable_analytics ) && ! empty( $aiosp_disable_analytics ) ) {
5011
- add_post_meta( $id, '_aioseop_disable_analytics', $aiosp_disable_analytics );
5012
- }
5013
- }
5014
  }
5015
  }
5016
 
@@ -5109,28 +5215,31 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
5109
  $wp_admin_bar->add_menu(
5110
  array(
5111
  'id' => AIOSEOP_PLUGIN_DIRNAME,
5112
- 'title' => __( 'SEO', 'all-in-one-seo-pack' ),
5113
- 'href' => $url,
5114
  )
5115
  );
5116
 
5117
- if ( current_user_can( 'update_plugins' ) && ! AIOSEOPPRO ) {
5118
  $wp_admin_bar->add_menu(
5119
  array(
 
5120
  'parent' => AIOSEOP_PLUGIN_DIRNAME,
5121
- /* translators: This is a CTA action link to upgrade to the premium version of the plugin. */
5122
- 'title' => __( 'Upgrade To Pro', 'all-in-one-seo-pack' ),
5123
- 'id' => 'aioseop-pro-upgrade',
5124
- 'href' => 'https://semperplugins.com/plugins/all-in-one-seo-pack-pro-version/?loc=menu',
5125
- 'meta' => array( 'target' => '_blank' ),
5126
  )
5127
  );
5128
- // phpcs:ignore Squiz.Commenting.InlineComment.InvalidEndChar
5129
- // add_action( 'admin_bar_menu', array( $this, 'admin_bar_upgrade_menu' ), 1101 );
5130
  }
5131
 
 
 
 
 
 
 
 
 
 
5132
  $aioseop_admin_menu = 1;
5133
- if ( ! is_admin() && ! empty( $post ) ) {
5134
 
5135
  $blog_page = aiosp_common::get_blog_page( $post );
5136
  if ( ! empty( $blog_page ) ) {
@@ -5180,6 +5289,20 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
5180
  }
5181
  }
5182
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5183
  }
5184
  }
5185
 
@@ -5195,13 +5318,14 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
5195
  }
5196
 
5197
  /**
5198
- * Display Category Metaboxes
5199
  *
5200
- * @since ?
 
5201
  *
5202
- * @param $tax
5203
  */
5204
- function display_category_metaboxes( $tax ) {
5205
  $screen = 'edit-' . $tax->taxonomy;
5206
  ?>
5207
  <div id="poststuff">
@@ -5211,81 +5335,71 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
5211
  }
5212
 
5213
  /**
5214
- * Save Category Metaboxes
5215
  *
5216
- * @since ?
 
5217
  *
5218
- * @param $id
 
5219
  */
5220
- function save_category_metaboxes( $id ) {
5221
  $awmp_edit = null;
5222
  $nonce = null;
 
5223
  if ( isset( $_POST['aiosp_edit'] ) ) {
5224
  $awmp_edit = $_POST['aiosp_edit'];
5225
  }
 
5226
  if ( isset( $_POST['nonce-aioseop-edit'] ) ) {
5227
  $nonce = $_POST['nonce-aioseop-edit'];
5228
  }
5229
 
5230
  if ( isset( $awmp_edit ) && ! empty( $awmp_edit ) && wp_verify_nonce( $nonce, 'edit-aioseop-nonce' ) ) {
 
 
 
 
 
5231
  $optlist = array(
5232
  'keywords',
5233
  'description',
5234
  'title',
5235
  'custom_link',
5236
- 'sitemap_exclude',
5237
  'disable',
5238
  'disable_analytics',
5239
  'noindex',
5240
  'nofollow',
 
 
 
5241
  );
5242
- foreach ( $optlist as $f ) {
5243
- $field = "aiosp_$f";
 
 
 
 
 
5244
  if ( isset( $_POST[ $field ] ) ) {
5245
  $$field = $_POST[ $field ];
5246
  }
5247
- }
5248
 
5249
- $optlist = array(
5250
- 'keywords',
5251
- 'description',
5252
- 'title',
5253
- 'custom_link',
5254
- 'noindex',
5255
- 'nofollow',
5256
- );
5257
- if ( ! ( ! empty( $this->options['aiosp_can'] ) ) ) {
5258
- unset( $optlist['custom_link'] );
5259
- }
5260
- foreach ( $optlist as $f ) {
5261
- delete_term_meta( $id, "_aioseop_{$f}" );
5262
  }
5263
 
5264
- if ( current_user_can( 'activate_plugins' ) ) {
5265
- delete_term_meta( $id, '_aioseop_sitemap_exclude' );
5266
- delete_term_meta( $id, '_aioseop_disable' );
5267
- delete_term_meta( $id, '_aioseop_disable_analytics' );
5268
- }
5269
 
5270
- foreach ( $optlist as $f ) {
5271
- $var = "aiosp_$f";
5272
- $field = "_aioseop_$f";
5273
  if ( isset( $$var ) && ! empty( $$var ) ) {
5274
  add_term_meta( $id, $field, $$var );
5275
  }
5276
  }
5277
- if ( isset( $aiosp_sitemap_exclude ) && ! empty( $aiosp_sitemap_exclude ) && current_user_can( 'activate_plugins' ) ) {
5278
- add_term_meta( $id, '_aioseop_sitemap_exclude', $aiosp_sitemap_exclude );
5279
- }
5280
- if ( isset( $aiosp_disable ) && ! empty( $aiosp_disable ) && current_user_can( 'activate_plugins' ) ) {
5281
- add_term_meta( $id, '_aioseop_disable', $aiosp_disable );
5282
- if ( isset( $aiosp_disable_analytics ) && ! empty( $aiosp_disable_analytics ) ) {
5283
- add_term_meta( $id, '_aioseop_disable_analytics', $aiosp_disable_analytics );
5284
- }
5285
- }
5286
  }
5287
  }
5288
 
 
5289
  /**
5290
  * Admin Menu
5291
  *
@@ -5305,18 +5419,6 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
5305
 
5306
  $this->update_options();
5307
 
5308
- /*
5309
- For now we're removing admin pointers.
5310
- $this->add_admin_pointers();
5311
- if ( ! empty( $this->pointers ) ) {
5312
- foreach ( $this->pointers as $k => $p ) {
5313
- if ( ! empty( $p['pointer_scope'] ) && ( $p['pointer_scope'] == 'global' ) ) {
5314
- unset( $this->pointers[ $k ] );
5315
- }
5316
- }
5317
- }
5318
- */
5319
-
5320
  if ( isset( $_POST ) && isset( $_POST['module'] ) && isset( $_POST['nonce-aioseop'] ) && ( 'All_in_One_SEO_Pack' == $_POST['module'] ) && wp_verify_nonce( $_POST['nonce-aioseop'], 'aioseop-nonce' ) ) {
5321
  if ( isset( $_POST['Submit'] ) && AIOSEOPPRO ) {
5322
  if ( isset( $_POST['aiosp_custom_menu_order'] ) ) {
@@ -5360,8 +5462,8 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
5360
  if ( ! empty( $this->options['aiosp_taxactive'] ) ) {
5361
  foreach ( $this->options['aiosp_taxactive'] as $tax ) {
5362
  $this->locations['aiosp']['display'][] = 'edit-' . $tax;
5363
- add_action( "{$tax}_edit_form", array( $this, 'display_category_metaboxes' ) );
5364
- add_action( "edited_{$tax}", array( $this, 'save_category_metaboxes' ) );
5365
  }
5366
  }
5367
  } else {
@@ -5381,27 +5483,10 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
5381
  aioseop_get_menu_icon()
5382
  );
5383
 
5384
- add_meta_box(
5385
- 'aioseop-list',
5386
- __( 'Join Our Mailing List', 'all-in-one-seo-pack' ),
5387
- array( 'aiosp_metaboxes', 'display_extra_metaboxes' ),
5388
- 'aioseop_metaboxes',
5389
- 'normal',
5390
- 'core'
5391
- );
5392
- if ( AIOSEOPPRO ) {
5393
- add_meta_box(
5394
- 'aioseop-about',
5395
- __( 'About', 'all-in-one-seo-pack' ),
5396
- array( 'aiosp_metaboxes', 'display_extra_metaboxes' ),
5397
- 'aioseop_metaboxes',
5398
- 'side',
5399
- 'core'
5400
- );
5401
- } else {
5402
  add_meta_box(
5403
  'aioseop-about',
5404
- __( 'About', 'all-in-one-seo-pack' ) . "<span class='Taha' style='float:right;'>" . __( 'Version', 'all-in-one-seo-pack' ) . ' <b>' . AIOSEOP_VERSION . '</b></span>',
5405
  array( 'aiosp_metaboxes', 'display_extra_metaboxes' ),
5406
  'aioseop_metaboxes',
5407
  'side',
@@ -5410,7 +5495,15 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
5410
  }
5411
  add_meta_box(
5412
  'aioseop-support',
5413
- __( 'Support', 'all-in-one-seo-pack' ) . " <span class='Taha' style='float:right;'>" . __( 'Version', 'all-in-one-seo-pack' ) . ' <b>' . AIOSEOP_VERSION . '</b></span>',
 
 
 
 
 
 
 
 
5414
  array( 'aiosp_metaboxes', 'display_extra_metaboxes' ),
5415
  'aioseop_metaboxes',
5416
  'side',
@@ -5441,9 +5534,6 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
5441
  $title = $this->plugin_name . ' - ' . $title;
5442
  }
5443
  if ( $tab_num <= 1 ) {
5444
- if ( ! empty( $m[0]['callback_args']['help_link'] ) ) {
5445
- $title .= "<a class='aioseop_help_text_link aioseop_meta_box_help' target='_blank' href='" . $m[0]['callback_args']['help_link'] . "'><span>" . __( 'Help', 'all-in-one-seo-pack' ) . '</span></a>';
5446
- }
5447
  add_meta_box( $m[0]['id'], $title, $m[0]['callback'], $m[0]['post_type'], $m[0]['context'], $m[0]['priority'], $m[0]['callback_args'] );
5448
  } elseif ( $tab_num > 1 ) {
5449
  add_meta_box(
@@ -5496,12 +5586,6 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
5496
  return $order;
5497
  }
5498
 
5499
- function display_settings_header() {
5500
- }
5501
-
5502
- function display_settings_footer() {
5503
- }
5504
-
5505
  /**
5506
  * Filters title and meta titles and applies cleanup.
5507
  * - Decode HTML entities.
@@ -5639,7 +5723,7 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
5639
  <FORM action='' method='post' name='aioseop-migrate-options'>
5640
  <input type='hidden' name='nonce-aioseop-migrate-options' value='" . wp_create_nonce( 'aioseop-migrate-nonce-options' ) . "' />
5641
  <input type='submit' name='aioseop_migrate_options' class='button-primary' value='Update Database Options'>
5642
- </FORM>
5643
  </p></div>";
5644
  aioseop_output_dismissable_notice( $msg, '', 'error' );
5645
  }
@@ -5667,17 +5751,6 @@ class All_in_One_SEO_Pack extends All_in_One_SEO_Pack_Module {
5667
  });
5668
  //]]>
5669
  </script>
5670
- <?php if ( ! AIOSEOPPRO ) { ?>
5671
- <div class="aioseop_advert aioseop_nopad_all">
5672
- <?php $adid = mt_rand( 21, 22 ); ?>
5673
- <a
5674
- href="https://www.wincher.com/?referer=all-in-one-seo-pack&adreferer=banner<?php echo $adid; ?>"
5675
- target="_blank" aria-label="<?php _e( 'Banner advert for free Wincher rank checker plugin', 'all-in-one-seo-pack' ); ?>">
5676
- <div class=wincherad id=wincher<?php echo $adid; ?>>
5677
- </div>
5678
- </a>
5679
- </div>
5680
- <?php } ?>
5681
  </div>
5682
  </div>
5683
  <?php
399
  /* translators: This is a setting where users can indicate which post types they want to use All in One SEO Pack with. */
400
  'name' => __( 'SEO on only these Content Types', 'all-in-one-seo-pack' ),
401
  'type' => 'multicheckbox',
402
+ 'default' => array( 'post', 'page', 'product' ),
403
  ),
404
  'taxactive' => array(
405
  /* translators: This is a setting where users can indicate which taxonomies they want to use All in One SEO Pack with. */
406
  'name' => __( 'SEO on only these taxonomies', 'all-in-one-seo-pack' ),
407
  'type' => 'multicheckbox',
408
+ 'default' => array( 'category', 'post_tag', 'product_cat', 'product_tag' ),
409
  ),
410
  'cpostnoindex' => array(
411
  /* translators: This is a setting where users can indicate which post types they want to NOINDEX by default. NOINDEX is a value of the HTML robots meta tag that asks search engines not to index the page. */
516
  ),
517
  ),
518
  'ga_anonymize_ip' => array(
519
+ /* translators: This is a setting which tells Google Analytics not to track and store the IP addresses of website visitors. This is required to be compliant with the GDPR for example. */
520
  'name' => __( 'Anonymize IP Addresses', 'all-in-one-seo-pack' ),
521
  'type' => 'checkbox',
522
  'condshow' => array(
867
  );
868
 
869
  if ( ! AIOSEOPPRO ) {
 
870
  unset( $this->default_options['taxactive'] );
871
  }
872
 
885
  'options' => array(
886
  'edit',
887
  'nonce-aioseop-edit',
 
888
  'snippet',
889
  'title',
890
  'description',
893
  'noindex',
894
  'nofollow',
895
  'sitemap_exclude',
896
+ 'sitemap_priority',
897
+ 'sitemap_frequency',
898
  'disable',
899
  'disable_analytics',
900
  ),
914
  'upgrade' => array(
915
  'type' => 'html',
916
  'label' => 'none',
917
+ 'default' => sprintf(
918
+ '<a href="%1$s" target="_blank" title="%2$s" class="aioseop-metabox-pro-cta">%3$s</a>',
919
+ aioseop_get_utm_url( 'metabox-main' ),
920
  sprintf(
921
+ /* translators: %s: "All in One SEO Pack Pro". */
922
+ __( 'Upgrade to %s', 'all-in-one-seo-pack' ),
923
+ AIOSEOP_PLUGIN_NAME . '&nbsp;Pro'
 
924
  ),
925
+ __( 'UPGRADE TO PRO VERSION', 'all-in-one-seo-pack' )
 
926
  ),
927
  ),
 
 
 
 
 
928
  'snippet' => array(
929
  /* translators: The preview snippet shows how the page will look like in the search results (title, meta description and permalink). */
930
  'name' => __( 'Preview Snippet', 'all-in-one-seo-pack' ),
960
  /* translators: This is a setting that allows users to add the NOINDEX robots meta tag value to the current post/page. */
961
  'name' => __( 'NOINDEX this page/post', 'all-in-one-seo-pack' ),
962
  'default' => '',
963
+
964
  ),
965
  'nofollow' => array(
966
  /* translators: This is a setting that allows users to add the NOFOLLOW robots meta tag value to the current post/page. */
967
  'name' => __( 'NOFOLLOW this page/post', 'all-in-one-seo-pack' ),
968
  'default' => '',
969
  ),
970
+ 'sitemap_exclude' => array(
971
+ 'name' => __( 'Exclude From Sitemap', 'all-in-one-seo-pack' ),
972
+ 'condshow' => array(
973
+ 'aiosp_noindex' => array(
974
+ 'lhs' => 'aiosp_noindex',
975
+ 'op' => '!=',
976
+ 'rhs' => 'on',
977
+ ),
978
+ ),
979
+ ),
980
+ 'sitemap_priority' => array(
981
+ /* translators: This is a setting that allows users to override the global sitemap priority value for a given post/term. */
982
+ 'name' => __( 'Sitemap Priority', 'all-in-one-seo-pack' ),
983
+ 'type' => 'select',
984
+ 'condshow' => array(
985
+ 'aiosp_noindex' => array(
986
+ 'lhs' => 'aiosp_noindex',
987
+ 'op' => '!=',
988
+ 'rhs' => 'on',
989
+ ),
990
+ 'aiosp_sitemap_exclude' => array(
991
+ 'lhs' => 'aiosp_sitemap_exclude',
992
+ 'op' => '!=',
993
+ 'rhs' => 'on',
994
+ ),
995
+ ),
996
+ 'initial_options' => array(
997
+ '' => __( 'Do Not Override', 'all-in-one-seo-pack' ),
998
+ '0.1' => '10%',
999
+ '0.2' => '20%',
1000
+ '0.3' => '30%',
1001
+ '0.4' => '40%',
1002
+ '0.5' => '50%',
1003
+ '0.6' => '60%',
1004
+ '0.7' => '70%',
1005
+ '0.8' => '80%',
1006
+ '0.9' => '90%',
1007
+ '1.0' => '100%',
1008
+ ),
1009
+ ),
1010
+ 'sitemap_frequency' => array(
1011
+ /* translators: This is a setting that allows users to override the global sitemap frequency value for a given post/term. */
1012
+ 'name' => __( 'Sitemap Frequency', 'all-in-one-seo-pack' ),
1013
+ 'type' => 'select',
1014
+ 'condshow' => array(
1015
+ 'aiosp_noindex' => array(
1016
+ 'lhs' => 'aiosp_noindex',
1017
+ 'op' => '!=',
1018
+ 'rhs' => 'on',
1019
+ ),
1020
+ 'aiosp_sitemap_exclude' => array(
1021
+ 'lhs' => 'aiosp_sitemap_exclude',
1022
+ 'op' => '!=',
1023
+ 'rhs' => 'on',
1024
+ ),
1025
+ ),
1026
+ 'initial_options' => array(
1027
+ '' => __( 'Do Not Override', 'all-in-one-seo-pack' ),
1028
+ 'always' => __( 'Always', 'all-in-one-seo-pack' ),
1029
+ 'hourly' => __( 'Hourly', 'all-in-one-seo-pack' ),
1030
+ 'daily' => __( 'Daily', 'all-in-one-seo-pack' ),
1031
+ 'weekly' => __( 'Weekly', 'all-in-one-seo-pack' ),
1032
+ 'monthly' => __( 'Monthly', 'all-in-one-seo-pack' ),
1033
+ 'yearly' => __( 'Yearly', 'all-in-one-seo-pack' ),
1034
+ 'never' => __( 'Never', 'all-in-one-seo-pack' ),
1035
+ ),
1036
+ ),
1037
  /* translators: This is a setting that allows users to disable All in One SEO Pack for the current post/page. */
1038
  'disable' => array( 'name' => __( 'Disable on this page/post', 'all-in-one-seo-pack' ) ),
1039
+ /* translators: This is a setting that allows users to exclude the current post/page from the sitemap. */
1040
  'disable_analytics' => array(
1041
  /* translators: This is a setting that allows users to disable Google Analytics tracking for the current post/page. */
1042
  'name' => __( 'Disable Google Analytics', 'all-in-one-seo-pack' ),
1048
  ),
1049
  );
1050
 
1051
+ if ( ! AIOSEOPPRO ) {
1052
+ array_unshift( $this->locations['aiosp']['options'], 'upgrade' );
1053
+ $this->locations['aiosp']['default_options']['sitemap_priority']['disabled'] = 'disabled';
1054
+ $this->locations['aiosp']['default_options']['sitemap_frequency']['disabled'] = 'disabled';
1055
+ }
1056
+
1057
  $this->layout = array(
1058
  'default' => array(
1059
  /* translators: This is the name of the main menu. */
1234
 
1235
  if ( is_admin() ) {
1236
  add_action( 'aioseop_global_settings_header', array( $this, 'display_right_sidebar' ) );
 
1237
  add_action( 'output_option', array( $this, 'custom_output_option' ), 10, 2 );
1238
  add_action( 'admin_init', array( $this, 'visibility_warning' ) );
1239
+ add_action( 'admin_init', array( $this, 'review_plugin_cta' ) );
1240
  add_action( 'admin_init', array( $this, 'woo_upgrade_notice' ) );
1241
+ add_action( 'admin_init', array( $this, 'check_php_version' ) );
1242
+ add_action( 'admin_init', array( 'AIOSEOP_Education', 'register_conflicting_plugin_notice' ) );
1243
  }
1244
  if ( AIOSEOPPRO ) {
1245
  add_action( 'split_shared_term', array( $this, 'split_shared_term' ), 10, 4 );
1282
  $w = $info['w'];
1283
  $p = $info['p'];
1284
 
1285
+ if ( AIOSEOP_PHP_Functions::strlen( $title ) > 70 ) {
1286
  $title = $this->trim_excerpt_without_filters(
1287
  $this->html_entity_decode( $title ),
1288
  70
1289
  ) . '...';
1290
  }
1291
+ if ( AIOSEOP_PHP_Functions::strlen( $description ) > 156 ) {
1292
  $description = $this->trim_excerpt_without_filters(
1293
  $this->html_entity_decode( $description ),
1294
  156
1687
  'disable_analytics',
1688
  'noindex',
1689
  'nofollow',
1690
+ 'sitemap_priority',
1691
+ 'sitemap_frequency',
1692
  );
1693
  if ( ! ( ! empty( $this->options['aiosp_can'] ) ) ) {
1694
  unset( $optlist['custom_link'] );
2201
  $search = esc_attr( stripslashes( $s ) );
2202
  $title = $search;
2203
  } elseif ( ( is_tax() || is_category() ) && ! is_feed() ) {
2204
+ $category_name = AIOSEOP_PHP_Functions::ucwords( $this->internationalize( single_cat_title( '', false ) ) );
2205
  $title = $category_name;
2206
  } elseif ( is_page() ) {
2207
  $title = $this->internationalize( single_post_title( '', false ) );
2277
  $request_a = explode( ' ', $request );
2278
  $request_new = array();
2279
  foreach ( $request_a as $token ) {
2280
+ $request_new[] = AIOSEOP_PHP_Functions::ucwords( trim( $token ) );
2281
  }
2282
  $request = implode( ' ', $request_new );
2283
 
2379
  $new_title = str_replace( "%{$type}_author_nicename%", $authordata->user_nicename, $new_title );
2380
  }
2381
  if ( false !== strpos( $new_title, "%{$type}_author_firstname%", 0 ) ) {
2382
+ $new_title = str_replace( "%{$type}_author_firstname%", AIOSEOP_PHP_Functions::ucwords( $authordata->first_name ), $new_title );
2383
  }
2384
  if ( false !== strpos( $new_title, "%{$type}_author_lastname%", 0 ) ) {
2385
+ $new_title = str_replace( "%{$type}_author_lastname%", AIOSEOP_PHP_Functions::ucwords( $authordata->last_name ), $new_title );
2386
  }
2387
  if ( false !== strpos( $new_title, '%current_date%', 0 ) ) {
2388
  $new_title = str_replace( '%current_date%', aioseop_formatted_date(), $new_title );
3060
  $max = $this->maximum_description_length;
3061
  }
3062
  $max_orig = $max;
3063
+ $len = AIOSEOP_PHP_Functions::strlen( $text2 );
3064
  if ( $max < $len ) {
3065
  if ( function_exists( 'mb_strrpos' ) ) {
3066
  $pos = mb_strrpos( $text2, ' ', - ( $len - $max ), 'UTF-8' );
3083
  $max = $max_orig;
3084
  }
3085
  }
3086
+ $text = AIOSEOP_PHP_Functions::substr( $text, 0, $max );
3087
 
3088
  return trim( $text );
3089
  }
3115
 
3116
  if ( get_query_var( 'm' ) ) {
3117
  $m = preg_replace( '/[^0-9]/', '', get_query_var( 'm' ) );
3118
+ switch ( AIOSEOP_PHP_Functions::strlen( $m ) ) {
3119
  case 4:
3120
  $link = get_year_link( $m );
3121
  break;
3122
  case 6:
3123
+ $link = get_month_link( AIOSEOP_PHP_Functions::substr( $m, 0, 4 ), AIOSEOP_PHP_Functions::substr( $m, 4, 2 ) );
3124
  break;
3125
  case 8:
3126
+ $link = get_day_link( AIOSEOP_PHP_Functions::substr( $m, 0, 4 ), AIOSEOP_PHP_Functions::substr( $m, 4, 2 ), AIOSEOP_PHP_Functions::substr( $m, 6, 2 ) );
3127
  break;
3128
  default:
3129
  return false;
3424
  }
3425
  if ( ! empty( $keywords ) ) {
3426
  foreach ( $keywords as $word ) {
3427
+ $small_keywords[] = trim( AIOSEOP_PHP_Functions::strtolower( $word ) );
3428
  }
3429
  }
3430
 
3474
  'disable_analytics',
3475
  'noindex',
3476
  'nofollow',
3477
+ 'sitemap_priority',
3478
+ 'sitemap_frequency',
3479
  );
3480
  foreach ( $optlist as $f ) {
3481
  $meta = get_term_meta( $term_id, '_aioseop_' . $f, true );
3537
  ?>
3538
  });
3539
  }
3540
+ <?php } ?>
3541
  </script>
3542
  <?php
3543
  }
3749
  case 'post.php':
3750
  case 'post-new.php':
3751
  $title_format = $this->get_preview_snippet_title();
3752
+ $extra_title_length = strlen( preg_replace( '/<span.*\/span>/', '', html_entity_decode( $title_format, ENT_QUOTES ) ) );
3753
 
3754
  $snippet_preview_data = array(
3755
  'autogenerateDescriptions' => $aioseop_options['aiosp_generate_descriptions'],
3756
  'skipExcerpt' => $aioseop_options['aiosp_skip_excerpt'],
3757
+ 'dontTruncateDescriptions' => $aioseop_options['aiosp_dont_truncate_descriptions'],
3758
  );
3759
 
3760
  $count_chars_data['extraTitleLength'] = $extra_title_length;
3768
  );
3769
  wp_localize_script( 'aioseop-preview-snippet', 'aioseop_preview_snippet', $snippet_preview_data );
3770
 
3771
+ /*
3772
+ * @see XRegExp
3773
+ * @link http://xregexp.com/
3774
+ * @link https://github.com/slevithan/xregexp
3775
+ */
3776
  wp_enqueue_script(
3777
  'xregexp',
3778
+ AIOSEOP_PLUGIN_URL . 'js/admin/xregexp-v3.2.0/xregexp-all.min.js',
3779
  array(),
3780
+ AIOSEOP_VERSION
3781
  );
3782
  // No break required.
3783
  case 'toplevel_page_' . AIOSEOP_PLUGIN_DIRNAME . '/aioseop_class':
3945
  }
3946
 
3947
  if ( ! is_object( $aioseop_sitemap ) ) {
3948
+ unset( $settings['aiosp_sitemap_priority'] );
3949
+ unset( $settings['aiosp_sitemap_frequency'] );
3950
  unset( $settings['aiosp_sitemap_exclude'] );
3951
  }
3952
 
4164
  $title = trim( strip_tags( $title ) );
4165
  $title_tag_start = '<title';
4166
  $title_tag_end = '</title';
4167
+ $start = AIOSEOP_PHP_Functions::strpos( $content, $title_tag_start, 0 );
4168
+ $end = AIOSEOP_PHP_Functions::strpos( $content, $title_tag_end, 0 );
4169
  $this->title_start = $start;
4170
  $this->title_end = $end;
4171
  $this->orig_title = $title;
4292
  }
4293
  }
4294
 
4295
+ /**
4296
+ * Check the current PHP version and display a notice if on unsupported PHP.
4297
+ *
4298
+ * @since 3.4.0
4299
+ */
4300
+ function check_php_version() {
4301
+
4302
+ // Display for PHP below 5.6
4303
+ if ( version_compare( PHP_VERSION, '5.4', '>=' ) ) {
4304
+ return;
4305
+ }
4306
+
4307
+ // Display for admins only.
4308
+ if ( ! is_super_admin() ) {
4309
+ return;
4310
+ }
4311
+
4312
+ // Display on Dashboard page only.
4313
+ if ( isset( $GLOBALS['pagenow'] ) && 'index.php' !== $GLOBALS['pagenow'] ) {
4314
+ return;
4315
+ }
4316
+
4317
+ global $aioseop_notices;
4318
+ $aioseop_notices->reset_notice( 'check_php_version' );
4319
+ $aioseop_notices->activate_notice( 'check_php_version' );
4320
+ }
4321
+
4322
+ /**
4323
+ * Review CTA
4324
+ *
4325
+ * Asks user if they are enjoying the plugin and subsequently points them to a different URL for a review.
4326
+ *
4327
+ * @since 3.4
4328
+ *
4329
+ * @see `self::constructor()` with 'all_admin_notices' Filter Hook
4330
+ */
4331
+ function review_plugin_cta() {
4332
+ global $aioseop_notices;
4333
+ $aioseop_notices->activate_notice( 'review_plugin_cta' );
4334
+ }
4335
+
4336
  /**
4337
  * WooCommerce Upgrade Notice
4338
  *
4409
  global $aioseop_options;
4410
 
4411
  // Handle the description format.
4412
+ if ( isset( $description ) && false !== $description && ( AIOSEOP_PHP_Functions::strlen( $description ) > $this->minimum_description_length ) && ! ( is_front_page() && is_paged() ) ) {
4413
  $description = $this->trim_description( $description );
4414
  if ( ! isset( $meta_string ) ) {
4415
  $meta_string = '';
4554
  // Logging - rewrite handler check for output buffering.
4555
  $this->check_rewrite_handler();
4556
 
4557
+ printf( "\n<!-- " . AIOSEOP_PLUGIN_NAME . ' ' . $this->version );
 
4558
 
4559
  if ( $this->ob_start_detected ) {
4560
  echo 'ob_start_detected ';
4568
  $save_posts = $posts;
4569
 
4570
  // This outputs robots meta tags and custom canonical URl on WooCommerce product archive page.
4571
+ // See Github issue https://github.com/awesomemotive/all-in-one-seo-pack/issues/755.
4572
  if ( function_exists( 'wc_get_page_id' ) && is_post_type_archive( 'product' ) ) {
4573
  $post_id = wc_get_page_id( 'shop' );
4574
  if ( $post_id ) {
4773
  }
4774
  if (
4775
  sizeof( $active_handlers ) > 0 &&
4776
+ AIOSEOP_PHP_Functions::strtolower( $active_handlers[ sizeof( $active_handlers ) - 1 ] ) == AIOSEOP_PHP_Functions::strtolower( 'All_in_One_SEO_Pack::output_callback_for_title' )
4777
  ) {
4778
  ob_end_flush();
4779
  } else {
5053
  }
5054
 
5055
  /**
5056
+ * Saves the data of our metabox settings for a post.
5057
  *
5058
+ * @since ?
5059
+ * @since 3.4.0 Added support for priority/frequency + minor refactoring.
5060
  *
5061
+ * @param int $id The ID of the post.
5062
+ * @return bool Returns false if there is no POST data.
5063
  */
5064
  function save_post_data( $id ) {
5065
  $awmp_edit = null;
5066
  $nonce = null;
5067
+
5068
  if ( empty( $_POST ) ) {
5069
  return false;
5070
  }
5071
+
5072
  if ( isset( $_POST['aiosp_edit'] ) ) {
5073
  $awmp_edit = $_POST['aiosp_edit'];
5074
  }
5075
+
5076
  if ( isset( $_POST['nonce-aioseop-edit'] ) ) {
5077
  $nonce = $_POST['nonce-aioseop-edit'];
5078
  }
5079
 
5080
  if ( isset( $awmp_edit ) && ! empty( $awmp_edit ) && wp_verify_nonce( $nonce, 'edit-aioseop-nonce' ) ) {
5081
 
5082
+ if ( empty( $this->options['aiosp_can'] ) ) {
5083
+ unset( $optlist['custom_link'] );
5084
+ }
5085
+
5086
  $optlist = array(
5087
  'keywords',
5088
  'description',
5093
  'disable_analytics',
5094
  'noindex',
5095
  'nofollow',
5096
+ 'sitemap_priority',
5097
+ 'sitemap_frequency',
5098
  );
5099
+
5100
+ if ( ! AIOSEOPPRO ) {
5101
+ $optlist = array_diff( $optlist, array( 'sitemap_priority', 'sitemap_frequency' ) );
5102
  }
5103
+
5104
+ foreach ( $optlist as $field_name ) {
5105
+ $field = "aiosp_$field_name";
5106
  if ( isset( $_POST[ $field ] ) ) {
5107
  $$field = $_POST[ $field ];
5108
  }
 
5109
 
5110
+ delete_post_meta( $id, "_aioseop_{$field_name}" );
 
 
 
 
 
 
 
 
 
5111
  }
 
 
 
 
 
 
 
5112
 
5113
+ foreach ( $optlist as $field_name ) {
5114
+ $var = "aiosp_$field_name";
5115
+ $field = "_aioseop_$field_name";
5116
  if ( isset( $$var ) && ! empty( $$var ) ) {
5117
  add_post_meta( $id, $field, $$var );
5118
  }
5119
  }
 
 
 
 
 
 
 
 
 
5120
  }
5121
  }
5122
 
5215
  $wp_admin_bar->add_menu(
5216
  array(
5217
  'id' => AIOSEOP_PLUGIN_DIRNAME,
5218
+ 'title' => '<span class="ab-icon aioseop-admin-bar-logo"></span>' . __( 'SEO', 'all-in-one-seo-pack' ),
 
5219
  )
5220
  );
5221
 
5222
+ if ( ! is_admin() ) {
5223
  $wp_admin_bar->add_menu(
5224
  array(
5225
+ 'id' => 'aioseop-settings',
5226
  'parent' => AIOSEOP_PLUGIN_DIRNAME,
5227
+ 'title' => __( 'SEO Settings', 'all-in-one-seo-pack' ),
 
 
 
 
5228
  )
5229
  );
 
 
5230
  }
5231
 
5232
+ $wp_admin_bar->add_menu(
5233
+ array(
5234
+ 'id' => 'aioseop-settings-general',
5235
+ 'parent' => is_admin() ? AIOSEOP_PLUGIN_DIRNAME : 'aioseop-settings',
5236
+ 'title' => __( 'General Settings', 'all-in-one-seo-pack' ),
5237
+ 'href' => $url,
5238
+ )
5239
+ );
5240
+
5241
  $aioseop_admin_menu = 1;
5242
+ if ( ! empty( $post ) ) {
5243
 
5244
  $blog_page = aiosp_common::get_blog_page( $post );
5245
  if ( ! empty( $blog_page ) ) {
5289
  }
5290
  }
5291
  }
5292
+
5293
+ if ( current_user_can( 'update_plugins' ) && ! AIOSEOPPRO ) {
5294
+ $href = aioseop_get_utm_url( 'admin-bar' );
5295
+
5296
+ $wp_admin_bar->add_menu(
5297
+ array(
5298
+ 'parent' => AIOSEOP_PLUGIN_DIRNAME,
5299
+ 'title' => __( 'Upgrade to Pro', 'all-in-one-seo-pack' ),
5300
+ 'id' => 'aioseop-pro-upgrade',
5301
+ 'href' => $href,
5302
+ 'meta' => array( 'target' => '_blank' ),
5303
+ )
5304
+ );
5305
+ }
5306
  }
5307
  }
5308
 
5318
  }
5319
 
5320
  /**
5321
+ * Displays our metabox for taxonomy terms.
5322
  *
5323
+ * @since ?
5324
+ * @since 3.4.0 Renamed function to better reflect purpose.
5325
  *
5326
+ * @param $tax The taxonomy object.
5327
  */
5328
+ function display_term_metabox( $tax ) {
5329
  $screen = 'edit-' . $tax->taxonomy;
5330
  ?>
5331
  <div id="poststuff">
5335
  }
5336
 
5337
  /**
5338
+ * Saves the data of our metabox settings for a taxonomy term.
5339
  *
5340
+ * @since ?
5341
+ * @since 3.4.0 Added support for priority/frequency + minor refactoring. Renamed function to better reflect purpose.
5342
  *
5343
+ * @param int $id The ID of the taxonomy term.
5344
+ * @return bool Returns false if there is no POST data.
5345
  */
5346
+ function save_term_data( $id ) {
5347
  $awmp_edit = null;
5348
  $nonce = null;
5349
+
5350
  if ( isset( $_POST['aiosp_edit'] ) ) {
5351
  $awmp_edit = $_POST['aiosp_edit'];
5352
  }
5353
+
5354
  if ( isset( $_POST['nonce-aioseop-edit'] ) ) {
5355
  $nonce = $_POST['nonce-aioseop-edit'];
5356
  }
5357
 
5358
  if ( isset( $awmp_edit ) && ! empty( $awmp_edit ) && wp_verify_nonce( $nonce, 'edit-aioseop-nonce' ) ) {
5359
+
5360
+ if ( empty( $this->options['aiosp_can'] ) ) {
5361
+ unset( $optlist['custom_link'] );
5362
+ }
5363
+
5364
  $optlist = array(
5365
  'keywords',
5366
  'description',
5367
  'title',
5368
  'custom_link',
 
5369
  'disable',
5370
  'disable_analytics',
5371
  'noindex',
5372
  'nofollow',
5373
+ 'sitemap_exclude',
5374
+ 'sitemap_priority',
5375
+ 'sitemap_frequency',
5376
  );
5377
+
5378
+ if ( ! AIOSEOPPRO ) {
5379
+ $optlist = array_diff( $optlist, array( 'sitemap_priority', 'sitemap_frequency' ) );
5380
+ }
5381
+
5382
+ foreach ( $optlist as $field_name ) {
5383
+ $field = "aiosp_$field_name";
5384
  if ( isset( $_POST[ $field ] ) ) {
5385
  $$field = $_POST[ $field ];
5386
  }
 
5387
 
5388
+ delete_term_meta( $id, "_aioseop_{$field_name}" );
 
 
 
 
 
 
 
 
 
 
 
 
5389
  }
5390
 
5391
+ foreach ( $optlist as $field_name ) {
5392
+ $var = "aiosp_$field_name";
5393
+ $field = "_aioseop_$field_name";
 
 
5394
 
 
 
 
5395
  if ( isset( $$var ) && ! empty( $$var ) ) {
5396
  add_term_meta( $id, $field, $$var );
5397
  }
5398
  }
 
 
 
 
 
 
 
 
 
5399
  }
5400
  }
5401
 
5402
+
5403
  /**
5404
  * Admin Menu
5405
  *
5419
 
5420
  $this->update_options();
5421
 
 
 
 
 
 
 
 
 
 
 
 
 
5422
  if ( isset( $_POST ) && isset( $_POST['module'] ) && isset( $_POST['nonce-aioseop'] ) && ( 'All_in_One_SEO_Pack' == $_POST['module'] ) && wp_verify_nonce( $_POST['nonce-aioseop'], 'aioseop-nonce' ) ) {
5423
  if ( isset( $_POST['Submit'] ) && AIOSEOPPRO ) {
5424
  if ( isset( $_POST['aiosp_custom_menu_order'] ) ) {
5462
  if ( ! empty( $this->options['aiosp_taxactive'] ) ) {
5463
  foreach ( $this->options['aiosp_taxactive'] as $tax ) {
5464
  $this->locations['aiosp']['display'][] = 'edit-' . $tax;
5465
+ add_action( "{$tax}_edit_form", array( $this, 'display_term_metabox' ) );
5466
+ add_action( "edited_{$tax}", array( $this, 'save_term_data' ) );
5467
  }
5468
  }
5469
  } else {
5483
  aioseop_get_menu_icon()
5484
  );
5485
 
5486
+ if ( ! AIOSEOPPRO ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5487
  add_meta_box(
5488
  'aioseop-about',
5489
+ AIOSEOP_PLUGIN_NAME . '&nbsp;Pro',
5490
  array( 'aiosp_metaboxes', 'display_extra_metaboxes' ),
5491
  'aioseop_metaboxes',
5492
  'side',
5495
  }
5496
  add_meta_box(
5497
  'aioseop-support',
5498
+ __( 'Support', 'all-in-one-seo-pack' ),
5499
+ array( 'aiosp_metaboxes', 'display_extra_metaboxes' ),
5500
+ 'aioseop_metaboxes',
5501
+ 'side',
5502
+ 'core'
5503
+ );
5504
+ add_meta_box(
5505
+ 'aioseop-list',
5506
+ __( 'Join Our Mailing List', 'all-in-one-seo-pack' ),
5507
  array( 'aiosp_metaboxes', 'display_extra_metaboxes' ),
5508
  'aioseop_metaboxes',
5509
  'side',
5534
  $title = $this->plugin_name . ' - ' . $title;
5535
  }
5536
  if ( $tab_num <= 1 ) {
 
 
 
5537
  add_meta_box( $m[0]['id'], $title, $m[0]['callback'], $m[0]['post_type'], $m[0]['context'], $m[0]['priority'], $m[0]['callback_args'] );
5538
  } elseif ( $tab_num > 1 ) {
5539
  add_meta_box(
5586
  return $order;
5587
  }
5588
 
 
 
 
 
 
 
5589
  /**
5590
  * Filters title and meta titles and applies cleanup.
5591
  * - Decode HTML entities.
5723
  <FORM action='' method='post' name='aioseop-migrate-options'>
5724
  <input type='hidden' name='nonce-aioseop-migrate-options' value='" . wp_create_nonce( 'aioseop-migrate-nonce-options' ) . "' />
5725
  <input type='submit' name='aioseop_migrate_options' class='button-primary' value='Update Database Options'>
5726
+ </FORM>
5727
  </p></div>";
5728
  aioseop_output_dismissable_notice( $msg, '', 'error' );
5729
  }
5751
  });
5752
  //]]>
5753
  </script>
 
 
 
 
 
 
 
 
 
 
 
5754
  </div>
5755
  </div>
5756
  <?php
all_in_one_seo_pack.php CHANGED
@@ -3,15 +3,15 @@
3
  Plugin Name: All In One SEO Pack
4
  Plugin URI: https://semperplugins.com/all-in-one-seo-pack-pro-version/
5
  Description: Out-of-the-box SEO for WordPress. Features like XML Sitemaps, SEO for custom post types, SEO for blogs or business sites, SEO for ecommerce sites, and much more. More than 50 million downloads since 2007.
6
- Version: 3.3.5
7
- Author: Michael Torbert
8
  Author URI: https://semperplugins.com/all-in-one-seo-pack-pro-version/
9
  Text Domain: all-in-one-seo-pack
10
  Domain Path: /i18n/
11
  */
12
 
13
  /*
14
- Copyright (C) 2007-2019 Michael Torbert, https://semperfiwebdesign.com
15
 
16
  This program is free software; you can redistribute it and/or modify
17
  it under the terms of the GNU General Public License as published by
@@ -26,609 +26,37 @@ You should have received a copy of the GNU General Public License
26
  along with this program. If not, see <http://www.gnu.org/licenses/>.
27
  */
28
 
29
- /**
30
- * All in One SEO Pack.
31
- * The original WordPress SEO plugin.
32
- *
33
- * @package All-in-One-SEO-Pack
34
- * @version 3.3.5
35
- */
36
-
37
- if ( ! defined( 'AIOSEOPPRO' ) ) {
38
- define( 'AIOSEOPPRO', false );
39
- }
40
- if ( ! defined( 'AIOSEOP_PLUGIN_NAME' ) ) {
41
- if ( ! AIOSEOPPRO ) {
42
- define( 'AIOSEOP_PLUGIN_NAME', 'All in One SEO Pack' );
43
- } else {
44
- define( 'AIOSEOP_PLUGIN_NAME', 'All in One SEO Pack Pro' );
45
- }
46
- }
47
- if ( ! defined( 'AIOSEOP_VERSION' ) ) {
48
- define( 'AIOSEOP_VERSION', '3.3.5' );
49
- }
50
-
51
- /*
52
- * DO NOT EDIT BELOW THIS LINE.
53
- */
54
-
55
  if ( ! defined( 'ABSPATH' ) ) {
56
  return;
57
  }
58
 
59
- if ( AIOSEOPPRO ) {
60
-
61
- add_action( 'admin_head', 'disable_all_in_one_free', 1 );
62
-
63
- }
64
-
65
- if ( ! function_exists( 'aiosp_add_cap' ) ) {
66
-
67
- /**
68
- * AIOSEOP Add Capabilities
69
- *
70
- * @since 2.3.6
71
- */
72
- function aiosp_add_cap() {
73
- /*
74
- * TODO we should put this into an install script. We just need to make sure it runs soon enough and we need to make
75
- * sure people updating from previous versions have access to it.
76
- */
77
-
78
- $role = get_role( 'administrator' );
79
- if ( is_object( $role ) ) {
80
- $role->add_cap( 'aiosp_manage_seo' );
81
- }
82
- }
83
- }
84
- add_action( 'plugins_loaded', 'aiosp_add_cap' );
85
-
86
- if ( ! defined( 'AIOSEOP_PLUGIN_DIR' ) ) {
87
- define( 'AIOSEOP_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
88
- } elseif ( AIOSEOP_PLUGIN_DIR !== plugin_dir_path( __FILE__ ) ) {
89
- /*
90
- This is not a great message.
91
- add_action( 'admin_notices', create_function( '', 'echo "' . "<div class='error'>" . sprintf(
92
- __( "%s detected a conflict; please deactivate the plugin located in %s.", 'all-in-one-seo-pack' ),
93
- $aioseop_plugin_name, AIOSEOP_PLUGIN_DIR ) . "</div>" . '";' ) );
94
- */
95
- return;
96
- }
97
-
98
- if ( ! defined( 'AIOSEOP_PLUGIN_BASENAME' ) ) {
99
- define( 'AIOSEOP_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );
100
- }
101
- if ( ! defined( 'AIOSEOP_PLUGIN_DIRNAME' ) ) {
102
- define( 'AIOSEOP_PLUGIN_DIRNAME', dirname( AIOSEOP_PLUGIN_BASENAME ) );
103
- }
104
- if ( ! defined( 'AIOSEOP_PLUGIN_URL' ) ) {
105
- define( 'AIOSEOP_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
106
- }
107
- if ( ! defined( 'AIOSEOP_PLUGIN_IMAGES_URL' ) ) {
108
- define( 'AIOSEOP_PLUGIN_IMAGES_URL', AIOSEOP_PLUGIN_URL . 'images/' );
109
- }
110
- if ( ! defined( 'AIOSEOP_BASELINE_MEM_LIMIT' ) ) {
111
- define( 'AIOSEOP_BASELINE_MEM_LIMIT', '256M' );
112
- } // 256MB
113
- if ( ! defined( 'WP_CONTENT_URL' ) ) {
114
- define( 'WP_CONTENT_URL', site_url() . '/wp-content' );
115
- }
116
- if ( ! defined( 'WP_ADMIN_URL' ) ) {
117
- define( 'WP_ADMIN_URL', site_url() . '/wp-admin' );
118
- }
119
- if ( ! defined( 'WP_CONTENT_DIR' ) ) {
120
- define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
121
- }
122
- if ( ! defined( 'WP_PLUGIN_URL' ) ) {
123
- define( 'WP_PLUGIN_URL', WP_CONTENT_URL . '/plugins' );
124
- }
125
- if ( ! defined( 'WP_PLUGIN_DIR' ) ) {
126
- define( 'WP_PLUGIN_DIR', WP_CONTENT_DIR . '/plugins' );
127
- }
128
-
129
- global $aiosp, $aioseop_options, $aioseop_modules, $aioseop_module_list, $aiosp_activation, $aioseop_mem_limit, $aioseop_get_pages_start, $aioseop_admin_menu;
130
- $aioseop_get_pages_start = 0;
131
- $aioseop_admin_menu = 0;
132
-
133
- if ( AIOSEOPPRO ) {
134
- global $aioseop_update_checker;
135
- }
136
-
137
- $aioseop_options = get_option( 'aioseop_options' );
138
-
139
- // @codingStandardsIgnoreStart
140
- $aioseop_mem_limit = @ini_get( 'memory_limit' );
141
- // @codingStandardsIgnoreEnd
142
-
143
- if ( ! function_exists( 'aioseop_convert_bytestring' ) ) {
144
  /**
145
- * AIOSEOP Convert Bytestring
146
  *
147
- * @since ?
148
  *
149
- * @param $byte_string
150
- * @return int
151
  */
152
- function aioseop_convert_bytestring( $byte_string ) {
153
- $num = 0;
154
- preg_match( '/^\s*([0-9.]+)\s*([KMGTPE])B?\s*$/i', $byte_string, $matches );
155
- if ( ! empty( $matches ) ) {
156
- $num = (float) $matches[1];
157
- switch ( strtoupper( $matches[2] ) ) {
158
- case 'E':
159
- $num *= 1024;
160
- // fall through.
161
- case 'P':
162
- $num *= 1024;
163
- // fall through.
164
- case 'T':
165
- $num *= 1024;
166
- // fall through.
167
- case 'G':
168
- $num *= 1024;
169
- // fall through.
170
- case 'M':
171
- $num *= 1024;
172
- // fall through.
173
- case 'K':
174
- $num *= 1024;
175
- }
176
- }
177
-
178
- return intval( $num );
179
- }
180
  }
181
 
182
- if ( is_array( $aioseop_options ) && isset( $aioseop_options['modules'] ) && isset( $aioseop_options['modules']['aiosp_performance_options'] ) ) {
183
- $perf_opts = $aioseop_options['modules']['aiosp_performance_options'];
184
- if ( isset( $perf_opts['aiosp_performance_memory_limit'] ) ) {
185
- $aioseop_mem_limit = $perf_opts['aiosp_performance_memory_limit'];
186
- }
187
- if ( isset( $perf_opts['aiosp_performance_execution_time'] ) && ( '' !== $perf_opts['aiosp_performance_execution_time'] ) ) {
188
- // @codingStandardsIgnoreStart
189
- @ini_set( 'max_execution_time', (int) $perf_opts['aiosp_performance_execution_time'] );
190
- @set_time_limit( (int) $perf_opts['aiosp_performance_execution_time'] );
191
- // @codingStandardsIgnoreEnd
192
- }
193
- } else {
194
- $aioseop_mem_limit = aioseop_convert_bytestring( $aioseop_mem_limit );
195
- if ( ( $aioseop_mem_limit > 0 ) && ( $aioseop_mem_limit < AIOSEOP_BASELINE_MEM_LIMIT ) ) {
196
- $aioseop_mem_limit = AIOSEOP_BASELINE_MEM_LIMIT;
197
- }
198
- }
199
-
200
- if ( ! empty( $aioseop_mem_limit ) ) {
201
- if ( ! is_int( $aioseop_mem_limit ) ) {
202
- $aioseop_mem_limit = aioseop_convert_bytestring( $aioseop_mem_limit );
203
- }
204
- if ( ( $aioseop_mem_limit > 0 ) && ( $aioseop_mem_limit <= AIOSEOP_BASELINE_MEM_LIMIT ) ) {
205
- // @codingStandardsIgnoreStart
206
- @ini_set( 'memory_limit', $aioseop_mem_limit );
207
- // @codingStandardsIgnoreEnd
208
- }
209
- }
210
 
211
- $aiosp_activation = false;
212
- // List all available modules here.
213
- $aioseop_module_list = array(
214
- 'sitemap',
215
- 'opengraph',
216
- 'robots',
217
- 'file_editor',
218
- 'importer_exporter',
219
- 'bad_robots',
220
- 'performance',
221
- );
222
-
223
- if ( AIOSEOPPRO ) {
224
- $aioseop_module_list[] = 'video_sitemap';
225
- }
226
-
227
- if ( class_exists( 'All_in_One_SEO_Pack' ) ) {
228
- add_action( 'admin_notices', 'admin_notices_already_defined' );
229
  /**
230
- * Admin Notices Already Defined
231
  *
232
- * @throws ReflectionException
233
- */
234
- function admin_notices_already_defined() {
235
- echo "<div class=\'error\'>The All In One SEO Pack class is already defined";
236
- if ( class_exists( 'ReflectionClass' ) ) {
237
- $_r = new ReflectionClass( 'All_in_One_SEO_Pack' );
238
- echo ' in ' . $_r->getFileName();
239
- }
240
- echo ', preventing All In One SEO Pack from loading.</div>';
241
- }
242
-
243
- return;
244
- }
245
-
246
- if ( AIOSEOPPRO ) {
247
-
248
- require( AIOSEOP_PLUGIN_DIR . 'pro/sfwd_update_checker.php' );
249
- $aiosp_update_url = 'https://semperplugins.com/upgrade_plugins.php';
250
- if ( defined( 'AIOSEOP_UPDATE_URL' ) ) {
251
- $aiosp_update_url = AIOSEOP_UPDATE_URL;
252
- }
253
- $aioseop_update_checker = new SFWD_Update_Checker(
254
- $aiosp_update_url,
255
- __FILE__,
256
- 'aioseop'
257
- );
258
-
259
- $aioseop_update_checker->plugin_name = AIOSEOP_PLUGIN_NAME;
260
- $aioseop_update_checker->plugin_basename = AIOSEOP_PLUGIN_BASENAME;
261
- if ( ! empty( $aioseop_options['aiosp_license_key'] ) ) {
262
- $aioseop_update_checker->license_key = $aioseop_options['aiosp_license_key'];
263
- } else {
264
- $aioseop_update_checker->license_key = '';
265
- }
266
- $aioseop_update_checker->options_page = AIOSEOP_PLUGIN_DIRNAME . '/aioseop_class.php';
267
- $aioseop_update_checker->renewal_page = 'https://semperplugins.com/all-in-one-seo-pack-pro-version/';
268
-
269
- $aioseop_update_checker->addQueryArgFilter( array( $aioseop_update_checker, 'add_secret_key' ) );
270
- }
271
-
272
-
273
- if ( ! function_exists( 'aioseop_activate' ) ) {
274
-
275
- /**
276
- * AIOSEOP Activate
277
  *
278
- * @since ?
279
  */
280
- function aioseop_activate() {
281
-
282
- // Check if we just got activated.
283
- global $aiosp_activation;
284
- if ( AIOSEOPPRO ) {
285
- global $aioseop_update_checker;
286
- }
287
- $aiosp_activation = true;
288
-
289
- require_once AIOSEOP_PLUGIN_DIR . 'admin/class-aioseop-notices.php';
290
- global $aioseop_notices;
291
- // $aioseop_notices->reset_notice( 'review_plugin' );
292
- // These checks might be duplicated in the function being called.
293
- if ( ! is_network_admin() || ! isset( $_GET['activate-multi'] ) ) {
294
- set_transient( '_aioseop_activation_redirect', true, 30 ); // Sets 30 second transient for welcome screen redirect on activation.
295
- }
296
-
297
- delete_user_meta( get_current_user_id(), 'aioseop_yst_detected_notice_dismissed' );
298
-
299
- if ( AIOSEOPPRO ) {
300
- global $aioseop_options;
301
-
302
- $aioseop_update_checker->checkForUpdates();
303
-
304
- if (
305
- isset( $aioseop_options['modules']['aiosp_feature_manager_options']['aiosp_feature_manager_enable_video_sitemap'] ) &&
306
- 'on' === $aioseop_options['modules']['aiosp_feature_manager_options']['aiosp_feature_manager_enable_video_sitemap']
307
- ) {
308
- $next_scan_timestamp = wp_next_scheduled( 'aiosp_video_sitemap_scan' );
309
- if ( false !== $next_scan_timestamp && 10 < ( $next_scan_timestamp - time() ) ) {
310
- // Reschedule cron job to avoid waiting for next (daily) scan.
311
- wp_unschedule_event( $next_scan_timestamp, 'aiosp_video_sitemap_scan' );
312
- $next_scan_timestamp = false;
313
- }
314
-
315
- if ( false === $next_scan_timestamp ) {
316
- wp_schedule_single_event( time() + 10, 'aiosp_video_sitemap_scan' );
317
- }
318
- }
319
- }
320
- }
321
- }
322
-
323
- add_action( 'plugins_loaded', 'aioseop_init_class' );
324
-
325
- if ( ! function_exists( 'aiosp_plugin_row_meta' ) ) {
326
-
327
- add_filter( 'plugin_row_meta', 'aiosp_plugin_row_meta', 10, 2 );
328
-
329
- /**
330
- * AIOSEOP Plugin Row Meta
331
- *
332
- * @since 2.3.3
333
- *
334
- * @param $actions
335
- * @param $plugin_file
336
- *
337
- * @return array
338
- */
339
- function aiosp_plugin_row_meta( $actions, $plugin_file ) {
340
-
341
- $action_links = array(
342
-
343
- 'settings' => array(
344
- /* translators: This is an action link users can click to open a feature request/bug report on GitHub. */
345
- 'label' => __( 'Feature Request/Bug Report', 'all-in-one-seo-pack' ),
346
- 'url' => 'https://github.com/semperfiwebdesign/all-in-one-seo-pack/issues/new',
347
- ),
348
-
349
- );
350
-
351
- return aiosp_action_links( $actions, $plugin_file, $action_links, 'after' );
352
- }
353
- }
354
-
355
- if ( ! function_exists( 'aiosp_add_action_links' ) ) {
356
-
357
-
358
- add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), 'aiosp_add_action_links', 10, 2 );
359
-
360
- /**
361
- * AIOSEOP Add Action Links
362
- *
363
- * @since 2.3
364
- *
365
- * @param $actions
366
- * @param $plugin_file
367
- * @return array
368
- */
369
- function aiosp_add_action_links( $actions, $plugin_file ) {
370
- if ( ! is_array( $actions ) ) {
371
- return $actions;
372
- }
373
-
374
- $aioseop_plugin_dirname = AIOSEOP_PLUGIN_DIRNAME;
375
- $action_links = array();
376
- $action_links = array(
377
- 'settings' => array(
378
- /* translators: This is an action link users can click to open the General Settings menu. */
379
- 'label' => __( 'SEO Settings', 'all-in-one-seo-pack' ),
380
- 'url' => get_admin_url( null, "admin.php?page=$aioseop_plugin_dirname/aioseop_class.php" ),
381
- ),
382
-
383
- 'forum' => array(
384
- /* translators: This is an action link users can click to open our premium support forum. */
385
- 'label' => __( 'Support Forum', 'all-in-one-seo-pack' ),
386
- 'url' => 'https://semperplugins.com/support/',
387
- ),
388
-
389
- 'docs' => array(
390
- /* translators: This is an action link users can click to open our general documentation page. */
391
- 'label' => __( 'Documentation', 'all-in-one-seo-pack' ),
392
- 'url' => 'https://semperplugins.com/documentation/',
393
- ),
394
-
395
- );
396
-
397
- unset( $actions['edit'] );
398
-
399
- if ( ! AIOSEOPPRO ) {
400
- $action_links['proupgrade'] =
401
- array(
402
- /* translators: This is an action link users can click to purchase a license for All in One SEO Pack Pro. */
403
- 'label' => __( 'Upgrade to Pro', 'all-in-one-seo-pack' ),
404
- 'url' => 'https://semperplugins.com/plugins/all-in-one-seo-pack-pro-version/?loc=plugins',
405
-
406
- );
407
- }
408
-
409
- return aiosp_action_links( $actions, $plugin_file, $action_links, 'before' );
410
- }
411
- }
412
-
413
- if ( ! function_exists( 'aiosp_action_links' ) ) {
414
-
415
- /**
416
- * AIOSEOP Action Links
417
- *
418
- * @since 2.3
419
- *
420
- * @param $actions
421
- * @param $plugin_file
422
- * @param array $action_links
423
- * @param string $position
424
- * @return array
425
- */
426
- function aiosp_action_links( $actions, $plugin_file, $action_links = array(), $position = 'after' ) {
427
- static $plugin;
428
- if ( ! isset( $plugin ) ) {
429
- $plugin = plugin_basename( __FILE__ );
430
- }
431
- if ( $plugin === $plugin_file && ! empty( $action_links ) ) {
432
- foreach ( $action_links as $key => $value ) {
433
- $link = array( $key => '<a href="' . $value['url'] . '">' . $value['label'] . '</a>' );
434
- if ( 'after' === $position ) {
435
- $actions = array_merge( $actions, $link );
436
- } else {
437
- $actions = array_merge( $link, $actions );
438
- }
439
- }//foreach
440
- }// if
441
- return $actions;
442
- }
443
- }
444
-
445
- if ( ! function_exists( 'aioseop_init_class' ) ) {
446
- /**
447
- * Inits All-in-One-Seo plugin class.
448
- *
449
- * @global AIOSEOP_Notices $aioseop_notices
450
- *
451
- * @since 2.3
452
- * @since 2.3.12.3 Loads third party compatibility class.
453
- */
454
- function aioseop_init_class() {
455
- global $aiosp;
456
- load_plugin_textdomain( 'all-in-one-seo-pack', false, dirname( plugin_basename( __FILE__ ) ) . '/i18n/' );
457
- require_once( AIOSEOP_PLUGIN_DIR . 'inc/aioseop_functions.php' );
458
- require_once( AIOSEOP_PLUGIN_DIR . 'aioseop_class.php' );
459
- require_once( AIOSEOP_PLUGIN_DIR . 'inc/aioseop_updates_class.php' );
460
- require_once( AIOSEOP_PLUGIN_DIR . 'inc/commonstrings.php' );
461
- require_once( AIOSEOP_PLUGIN_DIR . 'admin/display/general-metaboxes.php' );
462
- require_once( AIOSEOP_PLUGIN_DIR . 'inc/aiosp_common.php' );
463
- require_once( AIOSEOP_PLUGIN_DIR . 'admin/meta_import.php' );
464
- require_once( AIOSEOP_PLUGIN_DIR . 'inc/translations.php' );
465
- require_once( AIOSEOP_PLUGIN_DIR . 'public/opengraph.php' );
466
- require_once( AIOSEOP_PLUGIN_DIR . 'inc/compatibility/abstract/aiosep_compatible.php' );
467
- require_once( AIOSEOP_PLUGIN_DIR . 'inc/compatibility/compat-init.php' );
468
- require_once( AIOSEOP_PLUGIN_DIR . 'inc/compatibility/php-functions.php' );
469
- require_once( AIOSEOP_PLUGIN_DIR . 'public/front.php' );
470
- require_once( AIOSEOP_PLUGIN_DIR . 'public/google-analytics.php' );
471
- require_once( AIOSEOP_PLUGIN_DIR . 'admin/display/welcome.php' );
472
- require_once( AIOSEOP_PLUGIN_DIR . 'admin/display/dashboard_widget.php' );
473
- require_once( AIOSEOP_PLUGIN_DIR . 'admin/display/menu.php' );
474
- require_once( AIOSEOP_PLUGIN_DIR . 'admin/class-aioseop-notices.php' );
475
- require_once( AIOSEOP_PLUGIN_DIR . 'inc/schema/schema-builder.php' );
476
-
477
- $aioseop_welcome = new aioseop_welcome(); // TODO move this to updates file.
478
-
479
- if ( AIOSEOPPRO ) {
480
- // Loads pro files and other pro init stuff.
481
- require_once( AIOSEOP_PLUGIN_DIR . 'pro/class-aio-pro-init.php' );
482
- }
483
- // call importer functions... this should be moved somewhere better.
484
- aiosp_seometa_import();
485
-
486
- $aiosp = new All_in_One_SEO_Pack();
487
-
488
- $aioseop_updates = new AIOSEOP_Updates();
489
-
490
- if ( AIOSEOPPRO ) {
491
- $aioseop_pro_updates = new AIOSEOP_Pro_Updates();
492
- add_action( 'admin_init', array( $aioseop_pro_updates, 'version_updates' ), 12 );
493
- }
494
-
495
- add_action( 'admin_init', 'aioseop_welcome' );
496
-
497
- if ( aioseop_option_isset( 'aiosp_unprotect_meta' ) ) {
498
- add_filter( 'is_protected_meta', 'aioseop_unprotect_meta', 10, 3 );
499
- }
500
-
501
- add_action( 'init', array( $aiosp, 'add_hooks' ) );
502
- add_action( 'plugins_loaded', array( $aioseop_updates, 'version_updates' ), 11 );
503
-
504
- // phpcs:ignore Squiz.Commenting.InlineComment.InvalidEndChar
505
- // add_action( 'admin_init', 'aioseop_review_plugin_notice' );
506
- if ( wp_doing_ajax() && ! empty( $_POST ) && ! empty( $_POST['action'] ) && 'aioseop_ajax_scan_header' === $_POST['action'] ) {
507
- remove_action( 'init', array( $aiosp, 'add_hooks' ) );
508
- add_action( 'admin_init', 'aioseop_scan_post_header' );
509
- // if the action doesn't run -- pdb.
510
- add_action( 'shutdown', 'aioseop_ajax_scan_header' );
511
- include_once( ABSPATH . 'wp-admin/includes/screen.php' );
512
- global $current_screen;
513
- if ( class_exists( 'WP_Screen' ) ) {
514
- $current_screen = WP_Screen::get( 'front' );
515
- }
516
- }
517
- }
518
- }
519
-
520
- if ( ! function_exists( 'aioseop_review_plugin_notice' ) ) {
521
- /**
522
- * Review Plugin Notice
523
- *
524
- * Activates the review notice.
525
- * Note: This couldn't be used directly in `aioseop_init_class()` since ajax instances was causing
526
- * the database options to reset.
527
- *
528
- * @since 3.0
529
- */
530
- function aioseop_review_plugin_notice() {
531
- global $aioseop_notices;
532
- // $aioseop_notices->activate_notice( 'review_plugin' );
533
- }
534
- }
535
-
536
- if ( ! function_exists( 'aioseop_admin_enqueue_styles' ) ) {
537
- /**
538
- * Admin Enqueue Styles
539
- *
540
- * Styles used in various parts of WordPress admin, and not just AIOSEOP's screens.
541
- * Note: If styles are specific to a given module, then use that module's admin_enqueue_styles() method, or parent method.
542
- *
543
- * @todo Refactor this into a core file.
544
- *
545
- * @since 3.0
546
- *
547
- * @see 'admin_enqueue_scripts' hook
548
- * @link https://developer.wordpress.org/reference/hooks/admin_enqueue_scripts/
549
- *
550
- * @param string $hook_suffix
551
- */
552
- function aioseop_admin_enqueue_styles( $hook_suffix ) {
553
- // Font Icons.
554
- if ( ! wp_style_is( 'aioseop-font-icons', 'registered' ) && ! wp_style_is( 'aioseop-font-icons', 'enqueued' ) ) {
555
- wp_enqueue_style(
556
- 'aioseop-font-icons',
557
- AIOSEOP_PLUGIN_URL . 'css/aioseop-font-icons.css',
558
- array(),
559
- AIOSEOP_VERSION
560
- );
561
- }
562
- if ( function_exists( 'is_rtl' ) && is_rtl() ) {
563
- if ( ! wp_style_is( 'aioseop-font-icons-rtl', 'registered' ) && ! wp_style_is( 'aioseop-font-icons-rtl', 'enqueued' ) ) {
564
- wp_enqueue_style(
565
- 'aioseop-font-icons-rtl',
566
- AIOSEOP_PLUGIN_URL . 'css/aioseop-font-icons-rtl.css',
567
- array(),
568
- AIOSEOP_VERSION
569
- );
570
- }
571
- }
572
- }
573
- }
574
-
575
- if ( ! function_exists( 'aioseop_welcome' ) ) {
576
- function aioseop_welcome() {
577
- if ( get_transient( '_aioseop_activation_redirect' ) ) {
578
- $aioseop_welcome = new aioseop_welcome();
579
- delete_transient( '_aioseop_activation_redirect' );
580
- $aioseop_welcome->init( true );
581
- }
582
-
583
- }
584
- }
585
-
586
- add_action( 'init', 'aioseop_load_modules', 1 );
587
- // phpcs:ignore Squiz.Commenting.InlineComment.InvalidEndChar
588
- // add_action( 'after_setup_theme', 'aioseop_load_modules' );
589
- if ( is_admin() || defined( 'AIOSEOP_UNIT_TESTING' ) ) {
590
- add_action( 'wp_ajax_aioseop_ajax_save_meta', 'aioseop_ajax_save_meta' );
591
- add_action( 'wp_ajax_aioseop_ajax_save_url', 'aioseop_ajax_save_url' );
592
- add_action( 'wp_ajax_aioseop_ajax_delete_url', 'aioseop_ajax_delete_url' );
593
- add_action( 'wp_ajax_aioseop_ajax_scan_header', 'aioseop_ajax_scan_header' );
594
- if ( AIOSEOPPRO ) {
595
- add_action( 'wp_ajax_aioseop_ajax_facebook_debug', 'aioseop_ajax_facebook_debug' );
596
- }
597
- add_action( 'wp_ajax_aioseop_ajax_save_settings', 'aioseop_ajax_save_settings' );
598
- add_action( 'wp_ajax_aioseop_ajax_get_menu_links', 'aioseop_ajax_get_menu_links' );
599
- add_action( 'wp_ajax_aioseo_dismiss_yst_notice', 'aioseop_update_yst_detected_notice' );
600
- add_action( 'wp_ajax_aioseo_dismiss_visibility_notice', 'aioseop_update_user_visibilitynotice' );
601
- add_action( 'wp_ajax_aioseo_dismiss_woo_upgrade_notice', 'aioseop_woo_upgrade_notice_dismissed' );
602
-
603
- add_action( 'admin_enqueue_scripts', 'aioseop_admin_enqueue_styles' );
604
- }
605
-
606
- if ( ! function_exists( 'aioseop_scan_post_header' ) ) {
607
- function aioseop_scan_post_header() {
608
- require_once( ABSPATH . WPINC . '/default-filters.php' );
609
- global $wp_query;
610
- $wp_query->query_vars['paged'] = 0;
611
- query_posts( 'post_type=post&posts_per_page=1' );
612
- if ( have_posts() ) {
613
- the_post();
614
- }
615
- }
616
- }
617
-
618
- require_once( AIOSEOP_PLUGIN_DIR . 'aioseop-init.php' );
619
-
620
- if ( ! function_exists( 'aioseop_install' ) ) {
621
- register_activation_hook( __FILE__, 'aioseop_install' );
622
-
623
- function aioseop_install() {
624
- aioseop_activate();
625
- }
626
  }
627
 
628
- if ( ! function_exists( 'disable_all_in_one_free' ) ) {
629
- function disable_all_in_one_free() {
630
- if ( AIOSEOPPRO && is_plugin_active( 'all-in-one-seo-pack/all_in_one_seo_pack.php' ) ) {
631
- deactivate_plugins( 'all-in-one-seo-pack/all_in_one_seo_pack.php' );
632
- }
633
  }
634
  }
3
  Plugin Name: All In One SEO Pack
4
  Plugin URI: https://semperplugins.com/all-in-one-seo-pack-pro-version/
5
  Description: Out-of-the-box SEO for WordPress. Features like XML Sitemaps, SEO for custom post types, SEO for blogs or business sites, SEO for ecommerce sites, and much more. More than 50 million downloads since 2007.
6
+ Version: 3.4.2
7
+ Author: All in One SEO Team
8
  Author URI: https://semperplugins.com/all-in-one-seo-pack-pro-version/
9
  Text Domain: all-in-one-seo-pack
10
  Domain Path: /i18n/
11
  */
12
 
13
  /*
14
+ Copyright (C) 2007-2020 All in One SEO, https://semperplugins.com
15
 
16
  This program is free software; you can redistribute it and/or modify
17
  it under the terms of the GNU General Public License as published by
26
  along with this program. If not, see <http://www.gnu.org/licenses/>.
27
  */
28
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  if ( ! defined( 'ABSPATH' ) ) {
30
  return;
31
  }
32
 
33
+ if ( ! defined( 'AIOSEO_PLUGIN_DIR' ) ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  /**
35
+ * Plugin Directory
36
  *
37
+ * @since 3.4
38
  *
39
+ * @var string $AIOSEOP_PLUGIN_DIR Plugin folder directory path. Eg. `C:\WebProjects\UW-WPDev-aioseop\src-plugins/all-in-one-seo-pack/`
 
40
  */
41
+ define( 'AIOSEO_PLUGIN_DIR', dirname( __FILE__ ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  }
43
 
44
+ if ( ! defined( 'AIOSEO_PLUGIN_FILE' ) ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  /**
47
+ * Plugin File
48
  *
49
+ * @since 3.4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  *
51
+ * @var string $AIOSEOP_PLUGIN_FILE Plugin folder directory path. Eg. `C:\WebProjects\UW-WPDev-aioseop\src-plugins/all-in-one-seo-pack/`
52
  */
53
+ define( 'AIOSEO_PLUGIN_FILE', __FILE__ );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  }
55
 
56
+ if ( ! class_exists( 'AIOSEOP_Core' ) ) {
57
+ require_once plugin_dir_path( __FILE__ ) . 'class-aioseop-core.php';
58
+ global $aioseop_core;
59
+ if ( is_null( $aioseop_core ) ) {
60
+ $aioseop_core = new AIOSEOP_Core();
61
  }
62
  }
build/aioseop-link-attributes-gutenberg-editor.asset.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php return array(
2
+ 'dependencies' => array( 'lodash', 'wp-element', 'wp-polyfill' ),
3
+ 'version' => '30786cf55e346e4068908edbdfda65d1',
4
+ );
build/aioseop-link-attributes-gutenberg-editor.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ !function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=15)}([function(e,t){!function(){e.exports=this.wp.element}()},function(e,t){e.exports=function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}},function(e,t,n){var o;
2
+ /*!
3
+ Copyright (c) 2017 Jed Watson.
4
+ Licensed under the MIT License (MIT), see
5
+ http://jedwatson.github.io/classnames
6
+ */!function(){"use strict";var n={}.hasOwnProperty;function r(){for(var e=[],t=0;t<arguments.length;t++){var o=arguments[t];if(o){var i=typeof o;if("string"===i||"number"===i)e.push(o);else if(Array.isArray(o)&&o.length){var s=r.apply(null,o);s&&e.push(s)}else if("object"===i)for(var a in o)n.call(o,a)&&o[a]&&e.push(a)}}return e.join(" ")}e.exports?(r.default=r,e.exports=r):void 0===(o=function(){return r}.apply(t,[]))||(e.exports=o)}()},function(e,t,n){var o=n(12);e.exports=function(e,t){if(null==e)return{};var n,r,i=o(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r<s.length;r++)n=s[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}e.exports=function(e,t,o){return t&&n(e.prototype,t),o&&n(e,o),e}},function(e,t,n){var o=n(13),r=n(1);e.exports=function(e,t){return!t||"object"!==o(t)&&"function"!=typeof t?r(e):t}},function(e,t){function n(t){return e.exports=n=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},n(t)}e.exports=n},function(e,t,n){var o=n(14);e.exports=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&o(e,t)}},function(e,t){!function(){e.exports=this.lodash}()},function(e,t){function n(){return e.exports=n=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},n.apply(this,arguments)}e.exports=n},function(e,t){e.exports=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},function(e,t){e.exports=function(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=0;o<i.length;o++)n=i[o],t.indexOf(n)>=0||(r[n]=e[n]);return r}},function(e,t){function n(t){return"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?e.exports=n=function(e){return typeof e}:e.exports=n=function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(t)}e.exports=n},function(e,t){function n(t,o){return e.exports=n=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},n(t,o)}e.exports=n},function(e,t,n){"use strict";n.r(t);var o=n(3),r=n.n(o),i=n(11),s=n.n(i),a=n(4),l=n.n(a),u=n(5),c=n.n(u),p=n(6),f=n.n(p),d=n(7),h=n.n(d),g=n(1),v=n.n(g),b=n(8),m=n.n(b),y=n(0),w=n(9),k=n(10),O=n.n(k),S=wp.url,L=S.getProtocol,j=S.isValidProtocol,E=S.getAuthority,C=S.isValidAuthority,P=S.getPath,x=S.isValidPath,_=S.getQueryString,N=S.isValidQueryString,R=S.getFragment,F=S.isValidFragment,T=wp.i18n,W=T.__,A=T.sprintf;function D(e){if(!e)return!1;var t=e.trim();if(!t)return!1;if(/^\S+:/.test(t)){var n=L(t);if(!j(n))return!1;if(Object(w.startsWith)(n,"http")&&!/^https?:\/\/[^\/\s]/i.test(t))return!1;var o=E(t);if(!C(o))return!1;var r=P(t);if(r&&!x(r))return!1;var i=_(t);if(i&&!N(i))return!1;var s=R(t);if(s&&!F(s))return!1}return!(Object(w.startsWith)(t,"#")&&!F(t))}function I(e){var t=e.url,n=e.opensInNewWindow,o=e.noFollow,r=e.sponsored,i=e.text,s={type:"aioseop/link",attributes:{url:t}},a=[];if(n){var l=A(W("%s (opens in a new tab)","all-in-one-seo-pack"),i);s.attributes.target="_blank",s.attributes["aria-label"]=l,a.push("noreferrer noopener")}return o&&a.push("nofollow"),r&&a.push("sponsored"),a.length>0&&(s.attributes.rel=a.join(" ")),s}var V=wp.element.Component,M=wp.dom,U=M.getOffsetParent,K=M.getRectangleFromRange;function B(){var e=window.getSelection();if(0===e.rangeCount)return{};var t=K(e.getRangeAt(0)),n=t.top+t.height,o=t.left+t.width/2,r=U(e.anchorNode);if(r){var i=r.getBoundingClientRect();n-=i.top,o-=i.left}return{top:n,left:o}}var H=function(e){function t(){var e;return l()(this,t),(e=f()(this,h()(t).apply(this,arguments))).state={style:B()},e}return m()(t,e),c()(t,[{key:"render",value:function(){var e=this.props.children,t=this.state.style;return Object(y.createElement)("div",{className:"editor-format-toolbar__selection-position",style:t},e)}}]),t}(V),z=n(2),q=n.n(z);function Q(e){return(Q="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function $(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function G(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function X(e,t){var n=e["page".concat(t?"Y":"X","Offset")],o="scroll".concat(t?"Top":"Left");if("number"!=typeof n){var r=e.document;"number"!=typeof(n=r.documentElement[o])&&(n=r.body[o])}return n}function Y(e){return X(e)}function J(e){return X(e,!0)}function Z(e){var t=function(e){var t,n,o,r=e.ownerDocument,i=r.body,s=r&&r.documentElement;return n=(t=e.getBoundingClientRect()).left,o=t.top,{left:n-=s.clientLeft||i.clientLeft||0,top:o-=s.clientTop||i.clientTop||0}}(e),n=e.ownerDocument,o=n.defaultView||n.parentWindow;return t.left+=Y(o),t.top+=J(o),t}var ee,te=new RegExp("^(".concat(/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,")(?!px)[a-z%]+$"),"i"),ne=/^(top|right|bottom|left)$/;function oe(e,t){for(var n=0;n<e.length;n++)t(e[n])}function re(e){return"border-box"===ee(e,"boxSizing")}"undefined"!=typeof window&&(ee=window.getComputedStyle?function(e,t,n){var o="",r=e.ownerDocument,i=n||r.defaultView.getComputedStyle(e,null);return i&&(o=i.getPropertyValue(t)||i[t]),o}:function(e,t){var n=e.currentStyle&&e.currentStyle[t];if(te.test(n)&&!ne.test(t)){var o=e.style,r=o.left,i=e.runtimeStyle.left;e.runtimeStyle.left=e.currentStyle.left,o.left="fontSize"===t?"1em":n||0,n=o.pixelLeft+"px",o.left=r,e.runtimeStyle.left=i}return""===n?"auto":n});var ie=["margin","border","padding"];function se(e,t,n){var o,r={},i=e.style;for(o in t)t.hasOwnProperty(o)&&(r[o]=i[o],i[o]=t[o]);for(o in n.call(e),t)t.hasOwnProperty(o)&&(i[o]=r[o])}function ae(e,t,n){var o,r,i,s=0;for(r=0;r<t.length;r++)if(o=t[r])for(i=0;i<n.length;i++){var a=void 0;a="border"===o?"".concat(o+n[i],"Width"):o+n[i],s+=parseFloat(ee(e,a))||0}return s}function le(e){return null!=e&&e==e.window}var ue={};function ce(e,t,n){if(le(e))return"width"===t?ue.viewportWidth(e):ue.viewportHeight(e);if(9===e.nodeType)return"width"===t?ue.docWidth(e):ue.docHeight(e);var o="width"===t?["Left","Right"]:["Top","Bottom"],r="width"===t?e.offsetWidth:e.offsetHeight,i=(ee(e),re(e)),s=0;(null==r||r<=0)&&(r=void 0,(null==(s=ee(e,t))||Number(s)<0)&&(s=e.style[t]||0),s=parseFloat(s)||0),void 0===n&&(n=i?1:-1);var a=void 0!==r||i,l=r||s;if(-1===n)return a?l-ae(e,["border","padding"],o):s;if(a){var u=2===n?-ae(e,["border"],o):ae(e,["margin"],o);return l+(1===n?0:u)}return s+ae(e,ie.slice(n),o)}oe(["Width","Height"],(function(e){ue["doc".concat(e)]=function(t){var n=t.document;return Math.max(n.documentElement["scroll".concat(e)],n.body["scroll".concat(e)],ue["viewport".concat(e)](n))},ue["viewport".concat(e)]=function(t){var n="client".concat(e),o=t.document,r=o.body,i=o.documentElement[n];return"CSS1Compat"===o.compatMode&&i||r&&r[n]||i}}));var pe={position:"absolute",visibility:"hidden",display:"block"};function fe(e){var t,n=arguments;return 0!==e.offsetWidth?t=ce.apply(void 0,n):se(e,pe,(function(){t=ce.apply(void 0,n)})),t}function de(e,t,n){var o=n;if("object"!==Q(t))return void 0!==o?("number"==typeof o&&(o+="px"),void(e.style[t]=o)):ee(e,t);for(var r in t)t.hasOwnProperty(r)&&de(e,r,t[r])}oe(["width","height"],(function(e){var t=e.charAt(0).toUpperCase()+e.slice(1);ue["outer".concat(t)]=function(t,n){return t&&fe(t,e,n?0:1)};var n="width"===e?["Left","Right"]:["Top","Bottom"];ue[e]=function(t,o){if(void 0===o)return t&&fe(t,e,-1);if(t){ee(t);return re(t)&&(o+=ae(t,["padding","border"],n)),de(t,e,o)}}}));var he=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?G(n,!0).forEach((function(t){$(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):G(n).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}({getWindow:function(e){var t=e.ownerDocument||e;return t.defaultView||t.parentWindow},offset:function(e,t){if(void 0===t)return Z(e);!function(e,t){"static"===de(e,"position")&&(e.style.position="relative");var n,o,r=Z(e),i={};for(o in t)t.hasOwnProperty(o)&&(n=parseFloat(de(e,o))||0,i[o]=n+t[o]-r[o]);de(e,i)}(e,t)},isWindow:le,each:oe,css:de,clone:function(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);if(e.overflow)for(var o in e)e.hasOwnProperty(o)&&(t.overflow[o]=e.overflow[o]);return t},scrollLeft:function(e,t){if(le(e)){if(void 0===t)return Y(e);window.scrollTo(t,J(e))}else{if(void 0===t)return e.scrollLeft;e.scrollLeft=t}},scrollTop:function(e,t){if(le(e)){if(void 0===t)return J(e);window.scrollTo(Y(e),t)}else{if(void 0===t)return e.scrollTop;e.scrollTop=t}},viewportWidth:0,viewportHeight:0},ue);var ge=function(e,t,n){n=n||{},9===t.nodeType&&(t=he.getWindow(t));var o=n.allowHorizontalScroll,r=n.onlyScrollIfNeeded,i=n.alignWithTop,s=n.alignWithLeft,a=n.offsetTop||0,l=n.offsetLeft||0,u=n.offsetBottom||0,c=n.offsetRight||0;o=void 0===o||o;var p,f,d,h,g,v,b,m,y,w,k=he.isWindow(t),O=he.offset(e),S=he.outerHeight(e),L=he.outerWidth(e);k?(b=t,w=he.height(b),y=he.width(b),m={left:he.scrollLeft(b),top:he.scrollTop(b)},g={left:O.left-m.left-l,top:O.top-m.top-a},v={left:O.left+L-(m.left+y)+c,top:O.top+S-(m.top+w)+u},h=m):(p=he.offset(t),f=t.clientHeight,d=t.clientWidth,h={left:t.scrollLeft,top:t.scrollTop},g={left:O.left-(p.left+(parseFloat(he.css(t,"borderLeftWidth"))||0))-l,top:O.top-(p.top+(parseFloat(he.css(t,"borderTopWidth"))||0))-a},v={left:O.left+L-(p.left+d+(parseFloat(he.css(t,"borderRightWidth"))||0))+c,top:O.top+S-(p.top+f+(parseFloat(he.css(t,"borderBottomWidth"))||0))+u}),g.top<0||v.top>0?!0===i?he.scrollTop(t,h.top+g.top):!1===i?he.scrollTop(t,h.top+v.top):g.top<0?he.scrollTop(t,h.top+g.top):he.scrollTop(t,h.top+v.top):r||((i=void 0===i||!!i)?he.scrollTop(t,h.top+g.top):he.scrollTop(t,h.top+v.top)),o&&(g.left<0||v.left>0?!0===s?he.scrollLeft(t,h.left+g.left):!1===s?he.scrollLeft(t,h.left+v.left):g.left<0?he.scrollLeft(t,h.left+g.left):he.scrollLeft(t,h.left+v.left):r||((s=void 0===s||!!s)?he.scrollLeft(t,h.left+g.left):he.scrollLeft(t,h.left+v.left)))},ve=wp.i18n,be=ve.__,me=ve.sprintf,ye=ve._n,we=wp.element,ke=we.Component,Oe=we.createRef,Se=wp.htmlEntities.decodeEntities,Le=wp.keycodes,je=Le.UP,Ee=Le.DOWN,Ce=Le.ENTER,Pe=Le.TAB,xe=wp.components,_e=xe.Spinner,Ne=xe.withSpokenMessages,Re=xe.Popover,Fe=wp.compose.withInstanceId,Te=wp.apiFetch,We=wp.url.addQueryArgs,Ae=function(e){return e.stopPropagation()},De=Ne(Fe(function(e){function t(e){var n,o=e.autocompleteRef;return l()(this,t),(n=f()(this,h()(t).apply(this,arguments))).onChange=n.onChange.bind(v()(n)),n.onKeyDown=n.onKeyDown.bind(v()(n)),n.autocompleteRef=o||Oe(),n.inputRef=Oe(),n.updateSuggestions=Object(w.throttle)(n.updateSuggestions.bind(v()(n)),200),n.suggestionNodes=[],n.state={posts:[],showSuggestions:!1,selectedSuggestion:null},n}return m()(t,e),c()(t,[{key:"componentDidUpdate",value:function(){var e=this,t=this.state,n=t.showSuggestions,o=t.selectedSuggestion;n&&null!==o&&!this.scrollingIntoView&&(this.scrollingIntoView=!0,ge(this.suggestionNodes[o],this.autocompleteRef.current,{onlyScrollIfNeeded:!0}),setTimeout((function(){e.scrollingIntoView=!1}),100))}},{key:"componentWillUnmount",value:function(){delete this.suggestionsRequest}},{key:"bindSuggestionNode",value:function(e){var t=this;return function(n){t.suggestionNodes[e]=n}}},{key:"updateSuggestions",value:function(e){var t=this;if(e.length<2||/^https?:/.test(e))this.setState({showSuggestions:!1,selectedSuggestion:null,loading:!1});else{this.setState({showSuggestions:!0,selectedSuggestion:null,loading:!0});var n=Te({path:We("/wp/v2/search",{search:e,per_page:20,type:"post"})});n.then((function(e){t.suggestionsRequest===n&&(t.setState({posts:e,loading:!1}),e.length?t.props.debouncedSpeak(me(ye("%d result found, use up and down arrow keys to navigate.","%d results found, use up and down arrow keys to navigate.",e.length),e.length),"assertive"):t.props.debouncedSpeak(be("No results.","all-in-one-seo-pack"),"assertive"))})).catch((function(){t.suggestionsRequest===n&&t.setState({loading:!1})})),this.suggestionsRequest=n}}},{key:"onChange",value:function(e){var t=e.target.value;this.props.onChange(t),this.updateSuggestions(t)}},{key:"onKeyDown",value:function(e){var t=this.state,n=t.showSuggestions,o=t.selectedSuggestion,r=t.posts,i=t.loading;if(n&&r.length&&!i){var s=this.state.posts[this.state.selectedSuggestion];switch(e.keyCode){case je:e.stopPropagation(),e.preventDefault();var a=o?o-1:r.length-1;this.setState({selectedSuggestion:a});break;case Ee:e.stopPropagation(),e.preventDefault();var l=null===o||o===r.length-1?0:o+1;this.setState({selectedSuggestion:l});break;case Pe:null!==this.state.selectedSuggestion&&(this.selectLink(s),this.props.speak(be("Link selected.","all-in-one-seo-pack")));break;case Ce:null!==this.state.selectedSuggestion&&(e.stopPropagation(),this.selectLink(s))}}else switch(e.keyCode){case je:0!==e.target.selectionStart&&(e.stopPropagation(),e.preventDefault(),e.target.setSelectionRange(0,0));break;case Ee:this.props.value.length!==e.target.selectionStart&&(e.stopPropagation(),e.preventDefault(),e.target.setSelectionRange(this.props.value.length,this.props.value.length))}}},{key:"selectLink",value:function(e){this.props.onChange(e.url,e),this.setState({selectedSuggestion:null,showSuggestions:!1})}},{key:"handleOnClick",value:function(e){this.selectLink(e),this.inputRef.current.focus()}},{key:"render",value:function(){var e=this,t=this.props,n=t.value,o=void 0===n?"":n,r=t.autoFocus,i=void 0===r||r,s=t.instanceId,a=t.className,l=this.state,u=l.showSuggestions,c=l.posts,p=l.selectedSuggestion,f=l.loading;return Object(y.createElement)("div",{className:q()("editor-url-input block-editor-url-input",a)},Object(y.createElement)("input",{autoFocus:i,type:"text","aria-label":be("URL","all-in-one-seo-pack"),required:!0,value:o,onChange:this.onChange,onInput:Ae,placeholder:be("Paste URL or type to search","all-in-one-seo-pack"),onKeyDown:this.onKeyDown,role:"combobox","aria-expanded":u,"aria-autocomplete":"list","aria-owns":"editor-url-input-suggestions-".concat(s),"aria-activedescendant":null!==p?"editor-url-input-suggestion-".concat(s,"-").concat(p):void 0,ref:this.inputRef}),f&&Object(y.createElement)(_e,null),u&&!!c.length&&Object(y.createElement)(Re,{position:"bottom",noArrow:!0,focusOnMount:!1},Object(y.createElement)("div",{className:q()("editor-url-input__suggestions","block-editor-url-input__suggestions","".concat(a,"__suggestions")),id:"editor-url-input-suggestions-".concat(s),ref:this.autocompleteRef,role:"listbox"},c.map((function(t,n){return Object(y.createElement)("button",{key:t.id,role:"option",tabIndex:"-1",id:"editor-url-input-suggestion-".concat(s,"-").concat(n),ref:e.bindSuggestionNode(n),className:q()("editor-url-input__suggestion block-editor-url-input__suggestion",{"is-selected":n===p}),onClick:function(){return e.handleOnClick(t)},"aria-selected":n===p},Se(t.title)||be("(no title)","all-in-one-seo-pack"))})))))}}]),t}(ke))),Ie=wp.i18n.__,Ve=wp.components.IconButton;function Me(e){var t=e.autocompleteRef,n=e.className,o=e.onChangeInputValue,i=e.value,s=r()(e,["autocompleteRef","className","onChangeInputValue","value"]);return Object(y.createElement)("form",O()({className:q()("block-editor-url-popover__link-editor",n)},s),Object(y.createElement)(De,{value:i,onChange:o,autocompleteRef:t}),Object(y.createElement)(Ve,{icon:"editor-break",label:Ie("Apply","all-in-one-seo-pack"),type:"submit"}))}var Ue=wp.i18n.__,Ke=wp.components,Be=Ke.ExternalLink,He=Ke.IconButton,ze=wp.url,qe=ze.safeDecodeURI,Qe=ze.filterURLForDisplay;function $e(e){var t=e.url,n=e.urlLabel,o=e.className,r=q()(o,"block-editor-url-popover__link-viewer-url");return t?Object(y.createElement)(Be,{className:r,href:t},n||Qe(qe(t))):Object(y.createElement)("span",{className:r})}function Ge(e){var t=e.className,n=e.linkClassName,o=e.onEditLinkClick,i=e.url,s=e.urlLabel,a=r()(e,["className","linkClassName","onEditLinkClick","url","urlLabel"]);return Object(y.createElement)("div",O()({className:q()("block-editor-url-popover__link-viewer",t)},a),Object(y.createElement)($e,{url:i,urlLabel:s,className:n}),o&&Object(y.createElement)(He,{icon:"edit",label:Ue("Edit","all-in-one-seo-pack"),onClick:o}))}var Xe=wp.i18n.__,Ye=wp.element,Je=Ye.Component,Ze=Ye.createRef,et=Ye.useMemo,tt=Ye.Fragment,nt=wp.components,ot=nt.ToggleControl,rt=nt.withSpokenMessages,it=wp.keycodes,st=it.LEFT,at=it.RIGHT,lt=it.UP,ut=it.DOWN,ct=it.BACKSPACE,pt=it.ENTER,ft=it.ESCAPE,dt=wp.dom.getRectangleFromRange,ht=wp.url.prependHTTP,gt=wp.richText,vt=gt.create,bt=gt.insert,mt=gt.isCollapsed,yt=gt.applyFormat,wt=gt.getTextContent,kt=gt.slice,Ot=wp.blockEditor.URLPopover,St=function(e){return e.stopPropagation()};function Lt(e,t){return e.addingLink||t.editLink}var jt=function(e){var t=e.isActive,n=e.addingLink,o=e.value,i=e.resetOnMount,s=r()(e,["isActive","addingLink","value","resetOnMount"]),a=et((function(){var e=window.getSelection(),t=e.rangeCount>0?e.getRangeAt(0):null;if(t){if(n)return dt(t);var o=t.startContainer;for(o=o.nextElementSibling||o;o.nodeType!==window.Node.ELEMENT_NODE;)o=o.parentNode;var r=o.closest("a");return r?r.getBoundingClientRect():void 0}}),[t,n,o.start,o.end]);return a?(i(a),Object(y.createElement)(Ot,O()({anchorRect:a},s))):null},Et=rt(function(e){function t(){var e;return l()(this,t),(e=f()(this,h()(t).apply(this,arguments))).editLink=e.editLink.bind(v()(e)),e.submitLink=e.submitLink.bind(v()(e)),e.onKeyDown=e.onKeyDown.bind(v()(e)),e.onChangeInputValue=e.onChangeInputValue.bind(v()(e)),e.setLinkTarget=e.setLinkTarget.bind(v()(e)),e.setNoFollow=e.setNoFollow.bind(v()(e)),e.setSponsored=e.setSponsored.bind(v()(e)),e.onFocusOutside=e.onFocusOutside.bind(v()(e)),e.resetState=e.resetState.bind(v()(e)),e.autocompleteRef=Ze(),e.resetOnMount=e.resetOnMount.bind(v()(e)),e.state={opensInNewWindow:!1,noFollow:!1,sponsored:!1,inputValue:"",anchorRect:!1},e}return m()(t,e),c()(t,[{key:"onKeyDown",value:function(e){[st,ut,at,lt,ct,pt].indexOf(e.keyCode)>-1&&e.stopPropagation(),[ft].indexOf(e.keyCode)>-1&&this.resetState()}},{key:"onChangeInputValue",value:function(e){this.setState({inputValue:e})}},{key:"setLinkTarget",value:function(e){var t=this.props,n=t.activeAttributes.url,o=void 0===n?"":n,r=t.value,i=t.onChange;if(this.setState({opensInNewWindow:e}),!Lt(this.props,this.state)){var s=wt(kt(r));i(yt(r,I({url:o,opensInNewWindow:e,noFollow:this.state.noFollow,sponsored:this.state.sponsored,text:s})))}}},{key:"setNoFollow",value:function(e){var t=this.props,n=t.activeAttributes.url,o=void 0===n?"":n,r=t.value,i=t.onChange;if(this.setState({noFollow:e}),!Lt(this.props,this.state)){var s=wt(kt(r));i(yt(r,I({url:o,opensInNewWindow:this.state.opensInNewWindow,noFollow:e,sponsored:this.state.sponsored,text:s})))}}},{key:"setSponsored",value:function(e){var t=this.props,n=t.activeAttributes.url,o=void 0===n?"":n,r=t.value,i=t.onChange;if(this.setState({sponsored:e}),!Lt(this.props,this.state)){var s=wt(kt(r));i(yt(r,I({url:o,opensInNewWindow:this.state.opensInNewWindow,noFollow:this.state.noFollow,sponsored:e,text:s})))}}},{key:"editLink",value:function(e){this.setState({editLink:!0}),e.preventDefault()}},{key:"submitLink",value:function(e){var t=this.props,n=t.isActive,o=t.value,r=t.onChange,i=t.speak,s=this.state,a=s.inputValue,l=s.opensInNewWindow,u=s.noFollow,c=s.sponsored,p=ht(a),f=I({url:p,opensInNewWindow:l,noFollow:u,sponsored:c,text:wt(kt(o))});if(e.preventDefault(),mt(o)&&!n){var d=yt(vt({text:p}),f,0,p.length);r(bt(o,d))}else r(yt(o,f));this.resetState(),D(p)?i(Xe(n?"Link edited.":"Link inserted.","all-in-one-seo-pack"),"assertive"):i(Xe("Warning: the link has been inserted but could have errors. Please test it.","all-in-one-seo-pack"),"assertive")}},{key:"onFocusOutside",value:function(){var e=this.autocompleteRef.current;e&&e.contains(event.target)||this.resetState()}},{key:"resetState",value:function(){this.props.stopAddingLink(),this.setState({editLink:!1})}},{key:"resetOnMount",value:function(e){this.state.anchorRect!==e&&this.setState({opensInNewWindow:!1,noFollow:!1,sponsored:!1,anchorRect:e})}},{key:"render",value:function(){var e=this,t=this.props,n=t.isActive,o=t.activeAttributes,r=o.url,i=o.target,s=o.rel,a=t.addingLink,l=t.value;if(!n&&!a)return null;var u=this.state,c=u.inputValue,p=u.opensInNewWindow,f=u.noFollow,d=u.sponsored,h=Lt(this.props,this.state);if(p||"_blank"!==i||this.setState({opensInNewWindow:!0}),"string"==typeof s){var g=s.split(" ").includes("nofollow"),v=s.split(" ").includes("sponsored");g!==f&&this.setState({noFollow:g}),v!==d&&this.setState({sponsored:v})}return Object(y.createElement)(H,{key:"".concat(l.start).concat(l.end)},Object(y.createElement)(jt,{resetOnMount:this.resetOnMount,value:l,isActive:n,addingLink:a,onFocusOutside:this.onFocusOutside,onClose:function(){c||e.resetState()},focusOnMount:!!h&&"firstElement",renderSettings:function(){return Object(y.createElement)(tt,null,Object(y.createElement)(ot,{label:Xe("Open in New Tab","all-in-one-seo-pack"),checked:p,onChange:e.setLinkTarget}),Object(y.createElement)(ot,{label:Xe('Add "nofollow" to link',"all-in-one-seo-pack"),checked:f,onChange:e.setNoFollow}),Object(y.createElement)(ot,{label:Xe('Add "sponsored" to link',"all-in-one-seo-pack"),checked:d,onChange:e.setSponsored}))}},h?Object(y.createElement)(Me,{className:"editor-format-toolbar__link-container-content block-editor-format-toolbar__link-container-content",value:c,onChangeInputValue:this.onChangeInputValue,onKeyDown:this.onKeyDown,onKeyPress:St,onSubmit:this.submitLink,autocompleteRef:this.autocompleteRef}):Object(y.createElement)(Ge,{className:"editor-format-toolbar__link-container-content block-editor-format-toolbar__link-container-content",onKeyPress:St,url:r,onEditLinkClick:this.editLink,linkClassName:D(ht(r))?void 0:"has-invalid-link"})))}}],[{key:"getDerivedStateFromProps",value:function(e,t){var n=e.activeAttributes,o=n.url,r=n.target,i=n.rel,s="_blank"===r;if(!Lt(e,t)){if(o!==t.inputValue)return{inputValue:o};if(s!==t.opensInNewWindow)return{opensInNewWindow:s};if("string"==typeof i){var a=i.split(" ").includes("nofollow"),l=i.split(" ").includes("sponsored");if(a!==t.noFollow)return{noFollow:a};if(l!==t.sponsored)return{sponsored:l}}}return null}}]),t}(Je));function Ct(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function Pt(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Ct(Object(n),!0).forEach((function(t){s()(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Ct(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var xt=wp.i18n.__,_t=wp.element,Nt=_t.Component,Rt=_t.Fragment,Ft=wp.data,Tt=Ft.select,Wt=Ft.withSelect,At=Ft.dispatch,Dt=wp.blockEditor,It=Dt.BlockControls,Vt=Dt.RichTextToolbarButton,Mt=Dt.RichTextShortcut,Ut=wp.richText,Kt=Ut.getTextContent,Bt=Ut.applyFormat,Ht=Ut.removeFormat,zt=Ut.slice,qt=Ut.getActiveFormat,Qt=wp.url.isURL,$t=wp.components,Gt=$t.Toolbar,Xt=$t.withSpokenMessages,Yt=wp.compose,Jt=Yt.compose,Zt=Yt.ifCondition,en=xt("Add Link","all-in-one-seo-pack"),tn=/^(mailto:)?[a-z0-9._%+-]+@[a-z0-9][a-z0-9.-]*\.[a-z]{2,63}$/i,nn=function(e){function t(){var e;return l()(this,t),(e=f()(this,h()(t).apply(this,arguments))).isEmail=e.isEmail.bind(v()(e)),e.addLink=e.addLink.bind(v()(e)),e.stopAddingLink=e.stopAddingLink.bind(v()(e)),e.onRemoveFormat=e.onRemoveFormat.bind(v()(e)),e.state={addingLink:!1},e}return m()(t,e),c()(t,[{key:"componentDidMount",value:function(){var e=Tt("core/rich-text").getFormatType("core/link");e&&(e.edit=null,At("core/rich-text").addFormatTypes(e))}},{key:"isEmail",value:function(e){return tn.test(e)}},{key:"addLink",value:function(){var e=this.props,t=e.value,n=e.onChange,o=Kt(zt(t));o&&Qt(o)?n(Bt(t,{type:"aioseop/link",attributes:{url:o}})):o&&this.isEmail(o)?n(Bt(t,{type:"aioseop/link",attributes:{url:"mailto:".concat(o)}})):this.setState({addingLink:!0})}},{key:"stopAddingLink",value:function(){this.setState({addingLink:!1})}},{key:"onRemoveFormat",value:function(){var e=this.props,t=e.value,n=e.onChange,o=e.speak,r=t;Object(w.map)(["core/link","aioseop/link"],(function(e){r=Ht(r,e)})),n(Pt({},r)),o(xt("Link removed.","all-in-one-seo-pack"),"assertive")}},{key:"render",value:function(){var e=this.props,t=e.activeAttributes,n=e.onChange,o=this.props,r=o.isActive,i=o.value,s=qt(i,"core/link");if(s){s.type="aioseop/link";var a=i;a=Bt(a,s),n(Pt({},a=Ht(a,"core/link"))),i=a,r=!0}return Object(y.createElement)(Rt,null,Object(y.createElement)(It,null,Object(y.createElement)(Gt,{className:"editorskit-components-toolbar"},Object(y.createElement)(Mt,{type:"primary",character:"k",onUse:this.addLink}),Object(y.createElement)(Mt,{type:"primaryShift",character:"k",onUse:this.onRemoveFormat}),r&&Object(y.createElement)(Vt,{name:"link",icon:"editor-unlink",title:xt("Unlink","all-in-one-seo-pack"),onClick:this.onRemoveFormat,isActive:r,shortcutType:"primaryShift",shortcutCharacter:"k"}),!r&&Object(y.createElement)(Vt,{name:"link",icon:"admin-links",title:en,onClick:this.addLink,isActive:r,shortcutType:"primary",shortcutCharacter:"k"}),Object(y.createElement)(Et,{addingLink:this.state.addingLink,stopAddingLink:this.stopAddingLink,isActive:r,activeAttributes:t,value:i,onChange:n}))))}}]),t}(Nt),on=Jt(Wt((function(){return{isDisabled:Tt("core/edit-post").isFeatureActive("disableEditorsKitLinkFormats")}})),Zt((function(e){return!e.isDisabled})),Xt)(nn);n.d(t,"link",(function(){return fn}));var rn=wp.i18n.__,sn=wp.richText,an=sn.registerFormatType,ln=sn.applyFormat,un=sn.isCollapsed,cn=wp.htmlEntities.decodeEntities,pn=wp.url.isURL,fn={name:"aioseop/link",title:rn("Link","all-in-one-seo-pack"),tagName:"a",className:"aioseop-link",attributes:{url:"href",target:"target",rel:"rel"},__unstablePasteRule:function(e,t){var n=t.html,o=t.plainText;if(un(e))return e;var r=(n||o).replace(/<[^>]+>/g,"").trim();return pn(r)?ln(e,{type:"aioseop/link",attributes:{url:cn(r)}}):e},edit:on};[fn].forEach((function(e){var t=e.name,n=r()(e,["name"]);t&&an(t,n)}))}]);
class-aioseop-core.php ADDED
@@ -0,0 +1,786 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * AIOSEOP Core Class
4
+ *
5
+ * Handles all the core operations required to run on a WordPress platform.
6
+ *
7
+ * @package All-in-One-SEO-Pack
8
+ * @since 3.4
9
+ */
10
+
11
+ /**
12
+ * Class AIOSEOP_Core
13
+ *
14
+ * @since 3.4
15
+ */
16
+ class AIOSEOP_Core {
17
+
18
+ /**
19
+ * AIOSEOP_Core constructor.
20
+ *
21
+ * Set plugin's globals, constants, and initialization hook.
22
+ *
23
+ * @since 3.4
24
+ */
25
+ public function __construct() {
26
+ global $aiosp;
27
+ global $aioseop_options;
28
+ global $aioseop_modules;
29
+ global $aioseop_module_list;
30
+ global $aiosp_activation;
31
+ global $aioseop_mem_limit;
32
+ global $aioseop_get_pages_start;
33
+ global $aioseop_admin_menu;
34
+
35
+ $this->_define_constants();
36
+
37
+ $aioseop_get_pages_start = 0;
38
+ $aioseop_admin_menu = 0;
39
+ $aiosp_activation = false;
40
+
41
+ $aioseop_options = get_option( 'aioseop_options' );
42
+
43
+ // Sets the memory limit based on settings. Default 256M.
44
+ $memory_limit = '';
45
+ $execution_time = '';
46
+ if ( ! empty( $aioseop_options['modules']['aiosp_performance_options']['aiosp_performance_memory_limit'] ) ) {
47
+ $memory_limit = $aioseop_options['modules']['aiosp_performance_options']['aiosp_performance_memory_limit'];
48
+ }
49
+ if ( ! empty( $aioseop_options['modules']['aiosp_performance_options']['aiosp_performance_execution_time'] ) ) {
50
+ $execution_time = $aioseop_options['modules']['aiosp_performance_options']['aiosp_performance_execution_time'];
51
+ }
52
+ $aioseop_mem_limit = $this->set_mem_limit( $memory_limit, $execution_time );
53
+
54
+ // List all available modules here.
55
+ $aioseop_module_list = array(
56
+ 'sitemap',
57
+ 'opengraph',
58
+ 'robots',
59
+ 'file_editor',
60
+ 'importer_exporter',
61
+ 'bad_robots',
62
+ 'performance',
63
+ 'video_sitemap',
64
+ 'image_seo',
65
+ );
66
+
67
+ // Initialize plugin.
68
+ add_action( 'plugins_loaded', array( $this, 'init' ), 5 );
69
+ }
70
+
71
+ /**
72
+ * Initialize plugin.
73
+ *
74
+ * TODO Refactor method on lines marked `TODO`.
75
+ *
76
+ * @since 3.4
77
+ */
78
+ public function init() {
79
+ global $aiosp;
80
+ global $aioseop_options;
81
+
82
+ // Error notice when class already exists.
83
+ if ( class_exists( 'All_in_One_SEO_Pack' ) ) {
84
+ add_action( 'admin_notices', array( $this, 'admin_notices_already_defined' ) );
85
+ }
86
+
87
+ $this->_requires();
88
+ $this->add_hooks();
89
+
90
+ // TODO Remove/Change. We no longer have a folder called i18n OR should this be called `languages`.
91
+ load_plugin_textdomain( 'all-in-one-seo-pack', false, dirname( AIOSEOP_PLUGIN_BASENAME ) . '/i18n/' );
92
+
93
+ // Call importer functions... this should be moved somewhere better.
94
+ aiosp_seometa_import();
95
+
96
+ $aiosp = new All_in_One_SEO_Pack();
97
+
98
+ $aioseop_updates = new AIOSEOP_Updates();
99
+
100
+ // Check for plugin version update.
101
+ // TODO Move to AIOSEOP_Updates::__construct().
102
+ add_action( 'plugins_loaded', array( $aioseop_updates, 'version_updates' ), 11 );
103
+ if ( AIOSEOPPRO ) {
104
+ $aioseop_pro_updates = new AIOSEOP_Pro_Updates();
105
+ // TODO Move to AIOSEOP_Pro_Updates::__construct().
106
+ add_action( 'admin_init', array( $aioseop_pro_updates, 'version_updates' ), 12 );
107
+ }
108
+
109
+ // Check for Pro updates.
110
+ // vv TODO Should this be moved to (Pro) updater class?
111
+ if ( AIOSEOPPRO ) {
112
+ global $aioseop_update_checker;
113
+
114
+ require( AIOSEOP_PLUGIN_DIR . 'pro/sfwd_update_checker.php' );
115
+ $aiosp_update_url = 'https://semperplugins.com/upgrade_plugins.php';
116
+ if ( defined( 'AIOSEOP_UPDATE_URL' ) ) {
117
+ $aiosp_update_url = AIOSEOP_UPDATE_URL;
118
+ }
119
+ $aioseop_update_checker = new SFWD_Update_Checker(
120
+ $aiosp_update_url,
121
+ AIOSEO_PLUGIN_FILE,
122
+ 'aioseop'
123
+ );
124
+
125
+ $aioseop_update_checker->plugin_name = AIOSEOP_PLUGIN_NAME;
126
+ $aioseop_update_checker->plugin_basename = AIOSEOP_PLUGIN_BASENAME;
127
+ if ( ! empty( $aioseop_options['aiosp_license_key'] ) ) {
128
+ $aioseop_update_checker->license_key = $aioseop_options['aiosp_license_key'];
129
+ } else {
130
+ $aioseop_update_checker->license_key = '';
131
+ }
132
+ $aioseop_update_checker->options_page = AIOSEOP_PLUGIN_DIRNAME . '/aioseop_class.php';
133
+ $aioseop_update_checker->renewal_page = 'https://semperplugins.com/all-in-one-seo-pack-pro-version/';
134
+
135
+ $aioseop_update_checker->addQueryArgFilter( array( $aioseop_update_checker, 'add_secret_key' ) );
136
+ }
137
+ // ^^ TODO Should this be moved to (Pro) updater class?
138
+
139
+ // TODO Move this to updates file.
140
+ // FIXME This is executed in AIOSEOP_Core::aioseop_welcome() on admin_init hook.
141
+ new aioseop_welcome();
142
+ AIOSEOP_Education::init();
143
+ AIOSEOP_Flyout::init();
144
+
145
+ add_action( 'admin_init', array( $this, 'aioseop_welcome' ) );
146
+
147
+ // TODO Move this add_action to All_in_One_SEO_Pack::__construct().
148
+ add_action( 'init', array( $aiosp, 'add_hooks' ) );
149
+
150
+ // phpcs:ignore Squiz.Commenting.InlineComment.InvalidEndChar
151
+ // add_action( 'admin_init', array( $this, 'review_plugin_notice' ) );
152
+
153
+ // Perform Opengraph scan from JS scan.
154
+ // vv TODO This could be improved by using WP AJAX.
155
+ if ( wp_doing_ajax() && ! empty( $_POST ) && ! empty( $_POST['action'] ) && 'aioseop_ajax_scan_header' === $_POST['action'] ) {
156
+ remove_action( 'init', array( $aiosp, 'add_hooks' ) );
157
+ add_action( 'admin_init', array( $this, 'scan_post_header' ) );
158
+ // if the action doesn't run -- pdb.
159
+ add_action( 'shutdown', 'aioseop_ajax_scan_header' );
160
+
161
+ include_once( ABSPATH . 'wp-admin/includes/screen.php' );
162
+ global $current_screen;
163
+ if ( class_exists( 'WP_Screen' ) ) {
164
+ $current_screen = WP_Screen::get( 'front' );
165
+ }
166
+ }
167
+ // ^^ TODO This could be improved by using WP AJAX.
168
+ }
169
+
170
+ /**
171
+ * Define plugin constants.
172
+ *
173
+ * @ignore
174
+ *
175
+ * @since 3.4
176
+ *
177
+ * @see get_file_data()
178
+ * @link https://developer.wordpress.org/reference/functions/get_file_data/
179
+ * @link https://hitchhackerguide.com/2011/02/12/get_plugin_data/
180
+ *
181
+ * @access private
182
+ */
183
+ private function _define_constants() {
184
+ if ( defined( 'AIOSEOP_VERSION' ) ) {
185
+ return;
186
+ }
187
+
188
+ if ( ! defined( 'AIOSEOP_PLUGIN_BASENAME' ) ) {
189
+ /**
190
+ * Plugin Basename.
191
+ *
192
+ * @since 3.4
193
+ *
194
+ * @var string $AIOSEOP_PLUGIN_BASENAME Plugin basename on WP platform. Eg. 'all-in-one-seo-pack/all_in_one_seo_pack.php`.
195
+ */
196
+ define( 'AIOSEOP_PLUGIN_BASENAME', plugin_basename( AIOSEO_PLUGIN_FILE ) );
197
+ }
198
+
199
+ // Use get_file_data with this file, and get the plugin's file data with default_headers.
200
+ $default_headers = array(
201
+ 'Name' => 'Plugin Name',
202
+ 'Version' => 'Version',
203
+ );
204
+
205
+ $plugin_data = get_file_data( AIOSEO_PLUGIN_FILE, $default_headers );
206
+
207
+ /**
208
+ * AIOSEOP Display Name
209
+ *
210
+ * @since ?
211
+ * @since 3.4 Change to file header data.
212
+ *
213
+ * @var string $AIOSEOP_PLUGIN_NAME Contains 'All In One SEO Pack'.
214
+ */
215
+ define( 'AIOSEOP_PLUGIN_NAME', $plugin_data['Name'] );
216
+
217
+ /**
218
+ * Plugin Version Number
219
+ *
220
+ * @since ?
221
+ * @since 3.4 Change to file header data.
222
+ *
223
+ * @var string $AIOSEOP_VERSION Contains the plugin's version number. Eg. '3.2.4'
224
+ */
225
+ define( 'AIOSEOP_VERSION', $plugin_data['Version'] );
226
+
227
+ if ( ! defined( 'AIOSEOPPRO' ) ) {
228
+ define( 'AIOSEOPPRO', false );
229
+ }
230
+
231
+ if ( ! defined( 'AIOSEOP_PLUGIN_DIR' ) ) {
232
+
233
+ /**
234
+ * Plugin Directory
235
+ *
236
+ * @since ?
237
+ *
238
+ * @var string $AIOSEOP_PLUGIN_DIR Plugin folder directory path. Eg. `C:\WebProjects\UW-WPDev-aioseop\src-plugins/all-in-one-seo-pack/`
239
+ */
240
+ define( 'AIOSEOP_PLUGIN_DIR', plugin_dir_path( AIOSEO_PLUGIN_FILE ) );
241
+ }
242
+
243
+ // Defines constants that haven't been defined.
244
+ // Keep `! defined()` for development purposes to possibly separate plugin development from other plugins.
245
+ // DEV NOTE: This may not be practical. WP still requires AIOSEOP to be in the plugins folder in order to be detected.
246
+ if ( ! defined( 'AIOSEOP_PLUGIN_DIRNAME' ) ) {
247
+
248
+ /**
249
+ * Plugin Directory Name
250
+ *
251
+ * @since ?
252
+ *
253
+ * @var string $AIOSEOP_PLUGIN_DIRNAME Plugin folder/directory name. Eg. `all-in-one-seo-pack`
254
+ */
255
+ define( 'AIOSEOP_PLUGIN_DIRNAME', dirname( plugin_basename( AIOSEO_PLUGIN_FILE ) ) );
256
+ }
257
+ if ( ! defined( 'AIOSEOP_PLUGIN_URL' ) ) {
258
+
259
+ /**
260
+ * Plugin URL
261
+ *
262
+ * @since ?
263
+ *
264
+ * @var string $AIOSEOP_PLUGIN_URL Plugin directory url. Eg `http://aioseop.test/wp-content/plugins/all-in-one-seo-pack/`
265
+ */
266
+ define( 'AIOSEOP_PLUGIN_URL', plugin_dir_url( AIOSEO_PLUGIN_FILE ) );
267
+ }
268
+ if ( ! defined( 'AIOSEOP_PLUGIN_IMAGES_URL' ) ) {
269
+
270
+ /**
271
+ * Plugin Images URL
272
+ *
273
+ * @since ?
274
+ *
275
+ * @var string $AIOSEOP_PLUGIN_IMAGES_URL URL location for the plugin's image directory. Eg. `http://aioseop.test/wp-content/plugins/all-in-one-seo-pack/images/`
276
+ */
277
+ define( 'AIOSEOP_PLUGIN_IMAGES_URL', plugin_dir_url( AIOSEO_PLUGIN_FILE ) . 'images/' );
278
+ }
279
+ if ( ! defined( 'AIOSEOP_BASELINE_MEM_LIMIT' ) ) {
280
+
281
+ /**
282
+ * Plugin Baseline Memory Limit
283
+ *
284
+ * @since ?
285
+ *
286
+ * @var string $AIOSEOP_BASELINE_MEM_LIMIT The memory limit to set the ini config to.
287
+ */
288
+ define( 'AIOSEOP_BASELINE_MEM_LIMIT', '256M' );
289
+ }
290
+
291
+ // TODO Is this still necessary? These should already be defined by WP before plugins_loaded hook occurs.
292
+ if ( ! defined( 'WP_CONTENT_URL' ) ) {
293
+ define( 'WP_CONTENT_URL', site_url() . '/wp-content' );
294
+ }
295
+ if ( ! defined( 'WP_ADMIN_URL' ) ) {
296
+ define( 'WP_ADMIN_URL', site_url() . '/wp-admin' );
297
+ }
298
+ if ( ! defined( 'WP_CONTENT_DIR' ) ) {
299
+ define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
300
+ }
301
+ if ( ! defined( 'WP_PLUGIN_URL' ) ) {
302
+ define( 'WP_PLUGIN_URL', WP_CONTENT_URL . '/plugins' );
303
+ }
304
+ if ( ! defined( 'WP_PLUGIN_DIR' ) ) {
305
+ define( 'WP_PLUGIN_DIR', WP_CONTENT_DIR . '/plugins' );
306
+ }
307
+ }
308
+
309
+ /**
310
+ * Handles require_once files.
311
+ *
312
+ * @ignore
313
+ *
314
+ * @since 3.4
315
+ *
316
+ * @access private
317
+ */
318
+ private function _requires() {
319
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/aioseop_functions.php';
320
+ require_once AIOSEOP_PLUGIN_DIR . 'aioseop_class.php';
321
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/aioseop_updates_class.php';
322
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/commonstrings.php';
323
+ require_once AIOSEOP_PLUGIN_DIR . 'admin/display/general-metaboxes.php';
324
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/aiosp_common.php';
325
+ require_once AIOSEOP_PLUGIN_DIR . 'admin/meta_import.php';
326
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/translations.php';
327
+ require_once AIOSEOP_PLUGIN_DIR . 'public/opengraph.php';
328
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/compatibility/abstract/aiosep_compatible.php';
329
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/compatibility/compat-init.php';
330
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/compatibility/php-functions.php';
331
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/compatibility/class-aioseop-php-functions.php';
332
+ require_once AIOSEOP_PLUGIN_DIR . 'public/front.php';
333
+ require_once AIOSEOP_PLUGIN_DIR . 'public/google-analytics.php';
334
+ require_once AIOSEOP_PLUGIN_DIR . 'admin/display/welcome.php';
335
+ require_once AIOSEOP_PLUGIN_DIR . 'admin/display/dashboard_widget.php';
336
+ require_once AIOSEOP_PLUGIN_DIR . 'admin/display/menu.php';
337
+ require_once AIOSEOP_PLUGIN_DIR . 'admin/class-aioseop-notices.php';
338
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/schema-builder.php';
339
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/admin/class-aioseop-link-attributes.php';
340
+ require_once( AIOSEOP_PLUGIN_DIR . 'inc/admin/class-aioseop-education.php' );
341
+ require_once( AIOSEOP_PLUGIN_DIR . 'inc/admin/views/class-aioseop-flyout.php' );
342
+ require_once( AIOSEOP_PLUGIN_DIR . 'inc/admin/views/class-aioseop-about.php' );
343
+
344
+ // Loads pro files and other pro init stuff.
345
+ if ( AIOSEOPPRO ) {
346
+ require_once AIOSEOP_PLUGIN_DIR . 'pro/class-aioseop-pro-init.php';
347
+ }
348
+ }
349
+
350
+ /**
351
+ * Set ini memory limit.
352
+ *
353
+ * Set by the Performance settings to adjust the memory limit on the system ini config.
354
+ *
355
+ * TODO This could be moved to the performance module, but may need the ability to fire early (before other operations occur).
356
+ * TODO Should this also set the execution time even if the mem_limit is empty (both are set by the same module options).
357
+ * TODO Add Try/Catch for ini_set() & ini_time_limit().
358
+ *
359
+ * @since 3.4
360
+ *
361
+ * @param string $memory_limit Amount of memory to set the memory limit to.
362
+ * @param string $execution_time Amount of time to set the timeout to.
363
+ * @return string
364
+ */
365
+ private function set_mem_limit( $memory_limit, $execution_time ) {
366
+ // @codingStandardsIgnoreStart
367
+ $aioseop_mem_limit = @ini_get( 'memory_limit' );
368
+ // @codingStandardsIgnoreEnd
369
+
370
+ if ( ! empty( $memory_limit ) ) {
371
+ if ( ! empty( $execution_time ) ) {
372
+ // @codingStandardsIgnoreStart
373
+ @ini_set( 'max_execution_time', (int) $execution_time );
374
+ @set_time_limit( (int) $execution_time );
375
+ // @codingStandardsIgnoreEnd
376
+ }
377
+ } else {
378
+ $aioseop_mem_limit = $this->convert_bytestring( $aioseop_mem_limit );
379
+ if ( ( $aioseop_mem_limit > 0 ) && ( $aioseop_mem_limit < AIOSEOP_BASELINE_MEM_LIMIT ) ) {
380
+ $aioseop_mem_limit = AIOSEOP_BASELINE_MEM_LIMIT;
381
+ }
382
+ }
383
+
384
+ if ( ! empty( $aioseop_mem_limit ) ) {
385
+ if ( ! is_int( $aioseop_mem_limit ) ) {
386
+ $aioseop_mem_limit = $this->convert_bytestring( $aioseop_mem_limit );
387
+ }
388
+ if ( ( $aioseop_mem_limit > 0 ) && ( $aioseop_mem_limit <= AIOSEOP_BASELINE_MEM_LIMIT ) ) {
389
+ // @codingStandardsIgnoreStart
390
+ @ini_set( 'memory_limit', $aioseop_mem_limit );
391
+ // @codingStandardsIgnoreEnd
392
+ }
393
+ }
394
+
395
+ return $aioseop_mem_limit;
396
+ }
397
+
398
+ /**
399
+ * Add Hooks.
400
+ *
401
+ * @since 3.4
402
+ */
403
+ public function add_hooks() {
404
+ global $wp_version;
405
+
406
+ add_action( 'plugins_loaded', array( $this, 'add_cap' ) );
407
+
408
+ add_action( 'init', 'aioseop_load_modules', 1 );
409
+
410
+ if ( aioseop_option_isset( 'aiosp_unprotect_meta' ) ) {
411
+ add_filter( 'is_protected_meta', 'aioseop_unprotect_meta', 10, 3 );
412
+ }
413
+
414
+ // phpcs:ignore Squiz.Commenting.InlineComment.InvalidEndChar
415
+ // add_action( 'after_setup_theme', 'aioseop_load_modules' );
416
+
417
+ if ( AIOSEOPPRO ) {
418
+ remove_action( 'admin_head', 'disable_all_in_one_free', 1 );
419
+ add_action( 'admin_head', array( $this, 'disable_all_in_one_free' ), 1 );
420
+ }
421
+
422
+ // TODO vv Move to aioseop_admin class.
423
+ add_filter( 'plugin_row_meta', array( $this, 'plugin_row_meta' ), 10, 2 );
424
+ add_filter( 'plugin_action_links_' . AIOSEOP_PLUGIN_BASENAME, array( $this, 'add_action_links' ), 10, 2 );
425
+ if ( is_admin() || defined( 'AIOSEOP_UNIT_TESTING' ) ) {
426
+ add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_styles' ) );
427
+
428
+ $file_dir = AIOSEOP_PLUGIN_DIR . 'all_in_one_seo_pack.php';
429
+ register_activation_hook( $file_dir, array( 'AIOSEOP_Core', 'activate' ) );
430
+
431
+ // TODO Move AJAX to aioseop_admin class, and could be a separate function hooked onto admin_init.
432
+ add_action( 'wp_ajax_aioseop_ajax_save_meta', 'aioseop_ajax_save_meta' );
433
+ add_action( 'wp_ajax_aioseop_ajax_save_url', 'aioseop_ajax_save_url' );
434
+ add_action( 'wp_ajax_aioseop_ajax_delete_url', 'aioseop_ajax_delete_url' );
435
+ add_action( 'wp_ajax_aioseop_ajax_scan_header', 'aioseop_ajax_scan_header' );
436
+ add_action( 'wp_ajax_aioseop_ajax_save_settings', 'aioseop_ajax_save_settings' );
437
+ add_action( 'wp_ajax_aioseop_ajax_get_menu_links', 'aioseop_ajax_get_menu_links' );
438
+ add_action( 'wp_ajax_aioseo_dismiss_yst_notice', 'aioseop_update_yst_detected_notice' );
439
+ add_action( 'wp_ajax_aioseo_dismiss_visibility_notice', 'aioseop_update_user_visibilitynotice' );
440
+ add_action( 'wp_ajax_aioseo_dismiss_woo_upgrade_notice', 'aioseop_woo_upgrade_notice_dismissed' );
441
+ add_action( 'wp_ajax_aioseop_install_plugin', array( 'AIOSEOP_About', 'install_plugin' ) );
442
+ add_action( 'wp_ajax_aioseop_activate_plugin', array( 'AIOSEOP_About', 'activate_plugin' ) );
443
+
444
+ if ( AIOSEOPPRO ) {
445
+ add_action( 'wp_ajax_aioseop_ajax_facebook_debug', 'aioseop_ajax_facebook_debug' );
446
+ }
447
+ }
448
+
449
+ add_action( 'wp_enqueue_scripts', array( $this, 'front_enqueue_styles' ) );
450
+ add_action( 'admin_enqueue_scripts', array( $this, 'front_enqueue_styles' ) );
451
+
452
+ // Low priority allows us to override implementations of other plugins.
453
+ add_action( 'wp_enqueue_editor', array( 'AIOSEOP_Link_Attributes', 'enqueue_link_attributes_classic_editor' ), 999999 );
454
+
455
+ add_action( 'admin_init', array( 'AIOSEOP_Link_Attributes', 'register_link_attributes_gutenberg_editor' ) );
456
+
457
+ if ( version_compare( $wp_version, '5.0', '>=' ) ) {
458
+ add_action( 'enqueue_block_editor_assets', array( 'AIOSEOP_Link_Attributes', 'enqueue_link_attributes_gutenberg_editor' ) );
459
+ }
460
+
461
+ // TODO ^^ Move to aioseop_admin class.
462
+ }
463
+
464
+ /**
465
+ * AIOSEOP Activate
466
+ *
467
+ * @since ?
468
+ */
469
+ public static function activate() {
470
+ // Check if we just got activated.
471
+ global $aiosp_activation;
472
+ $aiosp_activation = true;
473
+
474
+ // phpcs:disable
475
+ // require_once AIOSEOP_PLUGIN_DIR . 'admin/class-aioseop-notices.php';
476
+ // global $aioseop_notices;
477
+ // $aioseop_notices->reset_notice( 'review_plugin' );
478
+ // phpcs:enable
479
+
480
+ // These checks might be duplicated in the function being called.
481
+ if ( ! is_network_admin() || ! isset( $_GET['activate-multi'] ) ) {
482
+ set_transient( '_aioseop_activation_redirect', true, 30 ); // Sets 30 second transient for welcome screen redirect on activation.
483
+ }
484
+
485
+ delete_user_meta( get_current_user_id(), 'aioseop_yst_detected_notice_dismissed' );
486
+
487
+ if ( AIOSEOPPRO ) {
488
+ global $aioseop_options;
489
+ global $aioseop_update_checker;
490
+
491
+ $aioseop_update_checker->checkForUpdates();
492
+
493
+ if (
494
+ isset( $aioseop_options['modules']['aiosp_feature_manager_options']['aiosp_feature_manager_enable_video_sitemap'] ) &&
495
+ 'on' === $aioseop_options['modules']['aiosp_feature_manager_options']['aiosp_feature_manager_enable_video_sitemap']
496
+ ) {
497
+ $next_scan_timestamp = wp_next_scheduled( 'aiosp_video_sitemap_scan' );
498
+ if ( false !== $next_scan_timestamp && 10 < ( $next_scan_timestamp - time() ) ) {
499
+ // Reschedule cron job to avoid waiting for next (daily) scan.
500
+ wp_unschedule_event( $next_scan_timestamp, 'aiosp_video_sitemap_scan' );
501
+ $next_scan_timestamp = false;
502
+ }
503
+
504
+ if ( false === $next_scan_timestamp ) {
505
+ wp_schedule_single_event( time() + 10, 'aiosp_video_sitemap_scan' );
506
+ }
507
+ }
508
+ }
509
+ }
510
+
511
+ /**
512
+ * Disable AIOSEOP Free version.
513
+ *
514
+ * @since ?
515
+ */
516
+ public function disable_all_in_one_free() {
517
+ if ( AIOSEOPPRO && is_plugin_active( 'all-in-one-seo-pack/all_in_one_seo_pack.php' ) ) {
518
+ deactivate_plugins( 'all-in-one-seo-pack/all_in_one_seo_pack.php' );
519
+ }
520
+ }
521
+
522
+ /**
523
+ * AIOSEOP Add Capabilities
524
+ *
525
+ * @since 2.3.6
526
+ */
527
+ public function add_cap() {
528
+ $role = get_role( 'administrator' );
529
+ if ( is_object( $role ) ) {
530
+ $role->add_cap( 'aiosp_manage_seo' );
531
+ }
532
+ }
533
+
534
+ /**
535
+ * Scan Post Header
536
+ *
537
+ * TODO Move to Opengraph module when AJAX-like operations in \AIOSEOP_Core::init() are refactored as well.
538
+ *
539
+ * @since ?
540
+ */
541
+ public function scan_post_header() {
542
+ require_once ABSPATH . WPINC . '/default-filters.php';
543
+ global $wp_query;
544
+ $wp_query->query_vars['paged'] = 0;
545
+ query_posts( 'post_type=post&posts_per_page=1' );
546
+
547
+ if ( have_posts() ) {
548
+ the_post();
549
+ }
550
+ }
551
+
552
+ /**
553
+ * AIOSEOP Convert Bytestring
554
+ *
555
+ * TODO Should this be in a functions file?
556
+ *
557
+ * @since ?
558
+ *
559
+ * @param $byte_string
560
+ * @return int
561
+ */
562
+ private function convert_bytestring( $byte_string ) {
563
+ $num = 0;
564
+ preg_match( '/^\s*([0-9.]+)\s*([KMGTPE])B?\s*$/i', $byte_string, $matches );
565
+ if ( ! empty( $matches ) ) {
566
+ $num = (float) $matches[1];
567
+ switch ( strtoupper( $matches[2] ) ) {
568
+ case 'E':
569
+ $num *= 1024;
570
+ // fall through.
571
+ case 'P':
572
+ $num *= 1024;
573
+ // fall through.
574
+ case 'T':
575
+ $num *= 1024;
576
+ // fall through.
577
+ case 'G':
578
+ $num *= 1024;
579
+ // fall through.
580
+ case 'M':
581
+ $num *= 1024;
582
+ // fall through.
583
+ case 'K':
584
+ $num *= 1024;
585
+ }
586
+ }
587
+
588
+ return intval( $num );
589
+ }
590
+
591
+ /**
592
+ * AIOSEOP Plugin Row Meta
593
+ *
594
+ * @since 2.3.3
595
+ *
596
+ * @uses `plugin_row_meta` hook.
597
+ * @link https://developer.wordpress.org/reference/hooks/plugin_row_meta/
598
+ *
599
+ * @param $actions
600
+ * @param $plugin_file
601
+ * @return array
602
+ */
603
+ public function plugin_row_meta( $actions, $plugin_file ) {
604
+ $medium = ( AIOSEOPPRO ) ? 'proplugin' : 'liteplugin';
605
+ $action_links = array(
606
+ 'settings' => array(
607
+ /* translators: This is an action link users can click to open a feature request/bug report on GitHub. */
608
+ 'label' => __( 'Suggest a Feature', 'all-in-one-seo-pack' ),
609
+ 'url' => 'https://semperplugins.com/suggest-a-feature/?utm_source=WordPress&utm_medium=' . $medium . '&utm_campaign=action-links&utm_content=Feature',
610
+ ),
611
+
612
+ );
613
+
614
+ return $this->action_links( $actions, $plugin_file, $action_links, 'after' );
615
+ }
616
+
617
+ /**
618
+ * AIOSEOP Add Action Links
619
+ *
620
+ * Adds additional links to the plugin on the admin Plugins page.
621
+ *
622
+ * @since 2.3
623
+ *
624
+ * @param $actions
625
+ * @param $plugin_file
626
+ * @return array
627
+ */
628
+ public function add_action_links( $actions, $plugin_file ) {
629
+ if ( ! is_array( $actions ) ) {
630
+ return $actions;
631
+ }
632
+
633
+ $aioseop_plugin_dirname = AIOSEOP_PLUGIN_DIRNAME;
634
+ $action_links = array(
635
+ 'settings' => array(
636
+ /* translators: This is an action link users can click to open the General Settings menu. */
637
+ 'label' => __( 'SEO Settings', 'all-in-one-seo-pack' ),
638
+ 'url' => get_admin_url( null, "admin.php?page=$aioseop_plugin_dirname/aioseop_class.php" ),
639
+ ),
640
+
641
+ 'forum' => array(
642
+ /* translators: This is an action link users can click to open our premium support forum. */
643
+ 'label' => __( 'Support', 'all-in-one-seo-pack' ),
644
+ 'url' => 'https://semperplugins.com/contact/',
645
+ ),
646
+
647
+ 'docs' => array(
648
+ /* translators: This is an action link users can click to open our general documentation page. */
649
+ 'label' => __( 'Documentation', 'all-in-one-seo-pack' ),
650
+ 'url' => 'https://semperplugins.com/documentation/',
651
+ ),
652
+
653
+ );
654
+
655
+ unset( $actions['edit'] );
656
+
657
+ if ( ! AIOSEOPPRO ) {
658
+ $action_links['proupgrade'] = array(
659
+ /* translators: This is an action link users can click to purchase a license for All in One SEO Pack Pro. */
660
+ 'label' => __( 'Upgrade to Pro', 'all-in-one-seo-pack' ),
661
+ 'url' => aioseop_get_utm_url( 'plugins-menu' ),
662
+
663
+ );
664
+ }
665
+
666
+ return $this->action_links( $actions, $plugin_file, $action_links, 'before' );
667
+ }
668
+
669
+ /**
670
+ * AIOSEOP Action Links
671
+ *
672
+ * @since 2.3
673
+ *
674
+ * @param $actions
675
+ * @param $plugin_file
676
+ * @param array $action_links
677
+ * @param string $position
678
+ * @return array
679
+ */
680
+ public function action_links( $actions, $plugin_file, $action_links = array(), $position = 'after' ) {
681
+ static $plugin;
682
+
683
+ if ( ! isset( $plugin ) ) {
684
+ $plugin = AIOSEOP_PLUGIN_BASENAME;
685
+ }
686
+ if ( $plugin === $plugin_file && ! empty( $action_links ) ) {
687
+ foreach ( $action_links as $key => $value ) {
688
+ $link = array( $key => '<a href="' . $value['url'] . '">' . $value['label'] . '</a>' );
689
+ if ( 'after' === $position ) {
690
+ $actions = array_merge( $actions, $link );
691
+ } else {
692
+ $actions = array_merge( $link, $actions );
693
+ }
694
+ }
695
+ }
696
+
697
+ return $actions;
698
+ }
699
+
700
+ /**
701
+ * AIOSEOP's Welcome Page
702
+ *
703
+ * @since ?
704
+ */
705
+ public function aioseop_welcome() {
706
+ if ( get_transient( '_aioseop_activation_redirect' ) ) {
707
+ $aioseop_welcome = new aioseop_welcome();
708
+ delete_transient( '_aioseop_activation_redirect' );
709
+ $aioseop_welcome->init( true );
710
+ }
711
+ }
712
+
713
+ /**
714
+ * Admin Notices Already Defined
715
+ *
716
+ * @since ?
717
+ *
718
+ * @throws ReflectionException
719
+ */
720
+ public function admin_notices_already_defined() {
721
+ $text = '';
722
+ if ( class_exists( 'ReflectionClass' ) ) {
723
+ $_r = new ReflectionClass( 'All_in_One_SEO_Pack' );
724
+ $text = ' in ' . $_r->getFileName();
725
+ }
726
+
727
+ echo '<div class="error">The All In One SEO Pack class is already defined' . $text . ', preventing All In One SEO Pack from loading.</div>';
728
+ }
729
+
730
+ /**
731
+ * Review Plugin Notice
732
+ *
733
+ * Activates the review notice.
734
+ * Note: This couldn't be used directly in `aioseop_init_class()` since ajax instances was causing
735
+ * the database options to reset.
736
+ *
737
+ * @since 3.0
738
+ */
739
+ public function review_plugin_notice() {
740
+ global $aioseop_notices;
741
+ // $aioseop_notices->activate_notice( 'review_plugin' );
742
+ }
743
+
744
+ /**
745
+ * Enqueues stylesheets used in the admin area.
746
+ *
747
+ * @since 3.4.0
748
+ *
749
+ * @param string $hook_suffix
750
+ * @return void
751
+ */
752
+ function admin_enqueue_styles( $hook_suffix ) {
753
+ if ( ! is_admin() ) {
754
+ return;
755
+ }
756
+
757
+ if ( ! wp_style_is( 'aioseop-font-icons', 'registered' ) && ! wp_style_is( 'aioseop-font-icons', 'enqueued' ) ) {
758
+ wp_enqueue_style(
759
+ 'aioseop-font-icons',
760
+ AIOSEOP_PLUGIN_URL . 'css/aioseop-font-icons.css',
761
+ array(),
762
+ AIOSEOP_VERSION
763
+ );
764
+ }
765
+
766
+ if ( function_exists( 'is_rtl' ) && is_rtl() ) {
767
+ if ( ! wp_style_is( 'aioseop-font-icons-rtl', 'registered' ) && ! wp_style_is( 'aioseop-font-icons-rtl', 'enqueued' ) ) {
768
+ wp_enqueue_style(
769
+ 'aioseop-font-icons-rtl',
770
+ AIOSEOP_PLUGIN_URL . 'css/aioseop-font-icons-rtl.css',
771
+ array(),
772
+ AIOSEOP_VERSION
773
+ );
774
+ }
775
+ }
776
+ }
777
+
778
+ /**
779
+ * Enqueues stylesheets used on the frontend.
780
+ *
781
+ * @since 3.4.0
782
+ */
783
+ function front_enqueue_styles() {
784
+ wp_enqueue_style( 'aioseop-toolbar-menu', AIOSEOP_PLUGIN_URL . 'css/admin-toolbar-menu.css', null, AIOSEOP_VERSION, 'all' );
785
+ }
786
+ }
css/admin-notice.css CHANGED
@@ -6,17 +6,34 @@
6
  * @since 3.0
7
  */
8
 
 
 
 
 
9
  .aioseop-notice-delay {
10
- display: inherit;
11
- /* width: fit-content; */
12
  }
13
 
14
  .aioseop-notice-delay.aioseop-delay-0.button-primary.button-orange {
15
- background: #d54e21;
16
- border-color: #aa3e1a;
17
- -webkit-box-shadow: 0 1px 0 #aa3e1a;
18
- box-shadow: 0 1px 0 #aa3e1a;
19
- color: #fff;
20
- text-decoration: none;
21
- text-shadow: 0 -1px 1px #d54e21,1px 0 1px #d54e21,0 1px 1px #d54e21,-1px 0 1px #d54e21;
 
 
 
 
22
  }
 
 
 
 
 
 
 
 
 
6
  * @since 3.0
7
  */
8
 
9
+ .aioseop-notice {
10
+ padding: 10px 5px 0 5px;
11
+ }
12
+
13
  .aioseop-notice-delay {
14
+ display: inherit;
15
+ /* width: fit-content; */
16
  }
17
 
18
  .aioseop-notice-delay.aioseop-delay-0.button-primary.button-orange {
19
+ background-color: #d54e21;
20
+ border-color: #aa3e1a;
21
+ -webkit-box-shadow: 0 1px 0 #aa3e1a;
22
+ box-shadow: 0 1px 0 #aa3e1a;
23
+ color: #fff;
24
+ text-decoration: none;
25
+ text-shadow: 0 -1px 1px #d54e21, 1px 0 1px #d54e21, 0 1px 1px #d54e21, -1px 0 1px #d54e21;
26
+ }
27
+
28
+ .aioseop-notice-delay.aioseop-delay-0.button-primary.button-orange:hover {
29
+ background-color: #bc3508;
30
  }
31
+
32
+ .aioseop-notice-indented {
33
+ margin-left: 50px;
34
+ padding: 5px 0;
35
+ }
36
+
37
+ .aioseop-notice-indented ul {
38
+ list-style: circle inside;
39
+ }
css/admin-toolbar-menu.css ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #wp-admin-bar-aioseop-pro-upgrade a {
2
+ font-style: italic;
3
+ color: orange !important;
4
+ }
5
+
6
+ .aioseop-admin-bar-logo {
7
+ float: left;
8
+ top: 3px;
9
+ background-repeat: no-repeat;
10
+ background-position: 0 6px;
11
+ background-size: 20px;
12
+ color: #a0a5aa;
13
+ content: url("data:image/svg+xml,%3Csvg width='20px' height='20px' viewBox='0 0 516 516' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' clip-rule='evenodd' stroke-linejoin='round' stroke-miterlimit='2' fill='%23a0a5aa'%3E%3Cpath d='M313.09629 56.767c15.572 4.282 30.418 10.326 44.308 17.903l49.035-35.771 68.022 68.023-35.24 48.172c7.827 13.776 14.13 28.529 18.681 44.029l57.95 9.064v96.198l-56.968 8.832c-4.446 16.178-10.792 31.571-18.785 45.925l36.485 49.874-68.022 68.023-50.057-36.517c-13.54 7.493-28 13.523-43.166 17.878l-8.92 57.538h-96.199l-8.949-57.218c-15.633-4.394-30.525-10.565-44.443-18.282l-47.249 34.468-68.023-68.022 34.305-46.894c-7.89-14.015-14.206-29.031-18.71-44.81l-57.151-8.86v-96.199l56.983-8.912c4.331-15.347 10.377-29.979 17.916-43.674l-35.466-48.48 68.023-68.023 48.061 35.061c13.641-7.693 28.234-13.895 43.554-18.384L208.09729 0h96.198l8.801 56.767zm-38.657 342.655c70.789-8.277 125.797-68.527 125.797-141.523 0-78.644-63.849-142.493-142.493-142.493s-142.493 63.849-142.493 142.493c0 73.293 55.457 133.737 126.663 141.621v-44.549c-36.12-7.515-63.294-39.554-63.294-77.89v-48.998h33.367v-50.298c0-5.447 4.423-9.87 9.871-9.87 5.447 0 9.87 4.423 9.87 9.87v50.298h52.726v-50.298c0-5.447 4.423-9.87 9.87-9.87 5.448 0 9.87 4.423 9.87 9.87v50.298h33.54v48.998c0 38.336-27.174 70.375-63.294 77.89v44.451z'/%3E%3C/svg%3E%0A");
14
+ }
css/admin/aioseop-about.css ADDED
@@ -0,0 +1,5361 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+
3
+ .choices {
4
+ position: relative;
5
+ margin-bottom: 24px;
6
+ }
7
+
8
+ .choices:focus {
9
+ outline: none;
10
+ }
11
+
12
+ .choices:last-child {
13
+ margin-bottom: 0;
14
+ }
15
+
16
+ .choices.is-disabled .choices__inner,
17
+ .choices.is-disabled .choices__input {
18
+ background-color: #eaeaea;
19
+ cursor: not-allowed;
20
+ user-select: none;
21
+ }
22
+
23
+ .choices.is-disabled .choices__item {
24
+ cursor: not-allowed;
25
+ }
26
+
27
+ .choices [hidden] {
28
+ display: none !important;
29
+ }
30
+
31
+ .choices input[type=text].choices__input {
32
+ width: calc(100% - 20px) !important;
33
+ margin: 10px !important;
34
+ padding: 7px 12px !important;
35
+ box-sizing: border-box !important;
36
+ border: 1px solid #ddd !important;
37
+ border-radius: 3px !important;
38
+ }
39
+
40
+ .choices input[type=text].choices__input:focus {
41
+ border: 1px solid #016AAB !important;
42
+ box-shadow: 0 0 0 1px #016AAB !important;
43
+ outline: none !important;
44
+ }
45
+
46
+ .choices[data-type*="select-one"] {
47
+ cursor: pointer;
48
+ }
49
+
50
+ .choices[data-type*="select-one"] .choices__input {
51
+ display: block;
52
+ width: 100% !important;
53
+ padding: 10px !important;
54
+ border-bottom: 1px solid #ddd !important;
55
+ background-color: #FFFFFF;
56
+ margin: 0 !important;
57
+ }
58
+
59
+ .choices[data-type*="select-one"] .choices__button {
60
+ background-image: url("../images/cross-inverse.svg");
61
+ padding: 0;
62
+ background-size: 8px;
63
+ position: absolute;
64
+ top: 50%;
65
+ right: 0;
66
+ margin-top: -10px;
67
+ margin-right: 25px;
68
+ height: 20px;
69
+ width: 20px;
70
+ border-radius: 10em;
71
+ opacity: .5;
72
+ }
73
+
74
+ .choices[data-type*="select-one"] .choices__button:hover,
75
+ .choices[data-type*="select-one"] .choices__button:focus {
76
+ opacity: 1;
77
+ }
78
+
79
+ .choices[data-type*="select-one"] .choices__button:focus {
80
+ box-shadow: 0 0 0 2px #0e6cad;
81
+ }
82
+
83
+ .choices[data-type*="select-one"] .choices__item[data-value=''] .choices__button {
84
+ display: none;
85
+ }
86
+
87
+ .choices[data-type*="select-one"]:after {
88
+ content: "";
89
+ height: 0;
90
+ width: 0;
91
+ border-style: solid;
92
+ border-color: currentColor transparent transparent transparent;
93
+ border-width: 5px;
94
+ position: absolute;
95
+ right: 11.5px;
96
+ top: 50%;
97
+ margin-top: -2.5px;
98
+ pointer-events: none;
99
+ }
100
+
101
+ .choices[data-type*="select-one"].is-open:after {
102
+ border-color: transparent transparent currentColor transparent;
103
+ margin-top: -7.5px;
104
+ }
105
+
106
+ .choices[data-type*="select-one"][dir="rtl"]:after {
107
+ left: 11.5px;
108
+ right: auto;
109
+ }
110
+
111
+ .choices[data-type*="select-one"][dir="rtl"] .choices__button {
112
+ right: auto;
113
+ left: 0;
114
+ margin-left: 25px;
115
+ margin-right: 0;
116
+ }
117
+
118
+ .choices[data-type*="select-multiple"] .choices__inner {
119
+ padding-right: 24px;
120
+ }
121
+
122
+ .choices[data-type*="select-multiple"]:after {
123
+ content: "";
124
+ height: 0;
125
+ width: 0;
126
+ border-style: solid;
127
+ border-color: currentColor transparent transparent transparent;
128
+ border-width: 5px;
129
+ position: absolute;
130
+ right: 11.5px;
131
+ top: 1em;
132
+ pointer-events: none;
133
+ }
134
+
135
+ .choices[data-type*="select-multiple"].is-open:after {
136
+ border-color: transparent transparent currentColor transparent;
137
+ margin-top: -7.5px;
138
+ }
139
+
140
+ .choices[data-type*="select-multiple"] .choices__inner,
141
+ .choices[data-type*="text"] .choices__inner {
142
+ cursor: text;
143
+ }
144
+
145
+ .choices[data-type*="select-multiple"] .choices__button,
146
+ .choices[data-type*="text"] .choices__button {
147
+ position: relative;
148
+ display: inline-block;
149
+ vertical-align: baseline;
150
+ margin-top: 0;
151
+ margin-right: -4px;
152
+ margin-bottom: 0;
153
+ margin-left: 8px;
154
+ padding: 1px;
155
+ padding-left: 16px;
156
+ border-left: 1px solid #0a4f7e;
157
+ background-color: transparent;
158
+ background-image: url("../images/cross.svg");
159
+ background-size: 8px;
160
+ background-position: center center;
161
+ background-repeat: no-repeat;
162
+ width: 8px;
163
+ line-height: 1;
164
+ opacity: .75;
165
+ border-radius: 0;
166
+ }
167
+
168
+ .choices[data-type*="select-multiple"] .choices__button:hover,
169
+ .choices[data-type*="select-multiple"] .choices__button:focus,
170
+ .choices[data-type*="text"] .choices__button:hover,
171
+ .choices[data-type*="text"] .choices__button:focus {
172
+ opacity: 1;
173
+ }
174
+
175
+ .choices__inner {
176
+ display: inline-block;
177
+ vertical-align: top;
178
+ width: 100%;
179
+ background-color: #fff;
180
+ padding: 4px 7.5px 1px;
181
+ border: 1px solid #ddd;
182
+ border-radius: 3px;
183
+ min-height: 35px;
184
+ overflow: hidden;
185
+ }
186
+
187
+ .is-open .choices__inner {
188
+ border-bottom-left-radius: 0;
189
+ border-bottom-right-radius: 0;
190
+ }
191
+
192
+ .is-open.is-flipped .choices__inner {
193
+ border-radius: 0 0 3px 3px;
194
+ }
195
+
196
+ .is-focused .choices__inner,
197
+ .is-open .choices__inner {
198
+ border-color: #016AAB;
199
+ box-shadow: 0 0 0 1px #016AAB;
200
+ outline: none;
201
+ }
202
+
203
+ .is-flipped.is-open .choices__inner {
204
+ border-color: #016AAB;
205
+ box-shadow: 0 0 0 1px #016AAB;
206
+ outline: none;
207
+ }
208
+
209
+ .choices__list {
210
+ margin: 0;
211
+ padding-left: 0;
212
+ list-style: none;
213
+ }
214
+
215
+ .choices__list--single {
216
+ display: inline-block;
217
+ vertical-align: baseline;
218
+ width: 100%;
219
+ padding: 4px 16px 4px 0;
220
+ font-size: 0.875em;
221
+ }
222
+
223
+ .choices__list--single .choices__item {
224
+ width: 100%;
225
+ }
226
+
227
+ .choices__list--multiple {
228
+ display: inline;
229
+ }
230
+
231
+ .choices__list--multiple .choices__item {
232
+ display: inline-block;
233
+ vertical-align: middle;
234
+ border-radius: 3px;
235
+ padding: 4px 10px;
236
+ font-size: .75em;
237
+ line-height: 1.3;
238
+ font-weight: 500;
239
+ margin-right: 3px;
240
+ margin-top: 0px;
241
+ margin-bottom: 3px;
242
+ background-color: #0e6cad;
243
+ border: 1px solid #0c5d95;
244
+ color: #FFFFFF;
245
+ word-break: break-all;
246
+ }
247
+
248
+ .choices__list--multiple .choices__item[data-deletable] {
249
+ padding-right: 5px;
250
+ }
251
+
252
+ .choices__list--multiple .choices__item.is-highlighted {
253
+ background-color: #0c5d95;
254
+ border: 1px solid #0a4f7e;
255
+ }
256
+
257
+ .choices__list--multiple+input[type=text].choices__input {
258
+ border: none !important;
259
+ margin: 0 !important;
260
+ width: 100% !important;
261
+ padding: 3px !important;
262
+ }
263
+
264
+ .choices__list--multiple+input[type=text].choices__input:focus {
265
+ box-shadow: none !important;
266
+ border: none !important;
267
+ }
268
+
269
+ .is-disabled .choices__list--multiple .choices__item {
270
+ background-color: #aaaaaa;
271
+ border: 1px solid #919191;
272
+ }
273
+
274
+ .choices__list--dropdown {
275
+ display: none;
276
+ z-index: 1;
277
+ position: absolute;
278
+ width: 100%;
279
+ background-color: #fff;
280
+ border: 1px solid #ddd;
281
+ top: 100%;
282
+ margin-top: -1px;
283
+ border-bottom-left-radius: 3px;
284
+ border-bottom-right-radius: 3px;
285
+ overflow: hidden;
286
+ word-break: break-all;
287
+ }
288
+
289
+ .choices__list--dropdown.is-active {
290
+ display: block;
291
+ }
292
+
293
+ .choices__list--dropdown .choices__list {
294
+ position: relative;
295
+ max-height: 300px;
296
+ overflow: auto;
297
+ -webkit-overflow-scrolling: touch;
298
+ will-change: scroll-position;
299
+ }
300
+
301
+ .choices__list--dropdown .choices__item {
302
+ position: relative;
303
+ vertical-align: top;
304
+ padding: 10px;
305
+ font-size: .875em;
306
+ }
307
+
308
+ @media (min-width: 640px) {
309
+ .choices__list--dropdown .choices__item--selectable {
310
+ padding-right: 100px;
311
+ }
312
+ .choices__list--dropdown .choices__item--selectable:after {
313
+ content: attr(data-select-text);
314
+ font-size: .75em;
315
+ opacity: 0;
316
+ position: absolute;
317
+ right: 10px;
318
+ top: 50%;
319
+ transform: translateY(-50%);
320
+ }
321
+ }
322
+
323
+ .choices__list--dropdown .choices__item--selectable.is-highlighted {
324
+ background-color: #f2f2f2;
325
+ }
326
+
327
+ .choices__list--dropdown .choices__item--selectable.is-highlighted:after {
328
+ opacity: .5;
329
+ }
330
+
331
+ .choices__list--dropdown .choices__placeholder {
332
+ display: none;
333
+ }
334
+
335
+ .is-open .choices__list--dropdown {
336
+ border-color: #016AAB;
337
+ border-top-color: #c4c4c4;
338
+ border-bottom-color: #fff;
339
+ box-shadow: 0 1px 0 1px #016AAB;
340
+ }
341
+
342
+ .is-open.is-flipped .choices__list--dropdown {
343
+ border-top-color: #fff;
344
+ border-bottom-color: #c4c4c4;
345
+ box-shadow: 0 -1px 0 1px #016AAB;
346
+ }
347
+
348
+ .is-flipped .choices__list--dropdown {
349
+ top: auto;
350
+ bottom: 100%;
351
+ margin-top: 0;
352
+ margin-bottom: -1px;
353
+ border-radius: .25rem .25rem 0 0;
354
+ }
355
+
356
+ .choices__item {
357
+ cursor: default;
358
+ }
359
+
360
+ .choices__item--selectable {
361
+ cursor: pointer;
362
+ }
363
+
364
+ .choices__item--disabled {
365
+ cursor: not-allowed;
366
+ user-select: none;
367
+ opacity: .5;
368
+ }
369
+
370
+ .choices__heading {
371
+ font-weight: 600;
372
+ font-size: .75em;
373
+ padding: 10px;
374
+ border-bottom: 1px solid #f7f7f7;
375
+ color: gray;
376
+ }
377
+
378
+ .choices__button {
379
+ text-indent: -9999px;
380
+ -webkit-appearance: none;
381
+ appearance: none;
382
+ border: 0;
383
+ background-color: transparent;
384
+ background-repeat: no-repeat;
385
+ background-position: center;
386
+ cursor: pointer;
387
+ }
388
+
389
+ .choices__button:focus {
390
+ outline: none;
391
+ }
392
+
393
+ .choices__input {
394
+ display: inline-block;
395
+ vertical-align: baseline !important;
396
+ background-color: transparent;
397
+ margin: 0 0 2px 0 !important;
398
+ border: 0 !important;
399
+ border-radius: 0 !important;
400
+ max-width: 100%;
401
+ min-height: 0 !important;
402
+ width: auto !important;
403
+ padding: 4px 0 4px 2px !important;
404
+ }
405
+
406
+ .choices .choices__inner input.choices__input:focus {
407
+ outline: none !important;
408
+ box-shadow: none !important;
409
+ border: none !important;
410
+ }
411
+
412
+ .choices__placeholder {
413
+ opacity: .5;
414
+ }
415
+
416
+ body.rtl .choices[data-type*="select-multiple"] .choices__inner {
417
+ padding-right: 4px;
418
+ padding-left: 24px;
419
+ }
420
+
421
+ body.rtl .choices[data-type*="select-multiple"]:after {
422
+ right: auto;
423
+ left: 11.5px;
424
+ }
425
+
426
+ body.rtl .choices__list--single {
427
+ padding-right: 4px;
428
+ padding-left: 16px;
429
+ }
430
+
431
+ body.rtl .choices__list--multiple .choices__item {
432
+ margin-right: 0;
433
+ margin-left: 3.75px;
434
+ }
435
+
436
+ body.rtl .choices__list--multiple .choices__item[data-deletable] {
437
+ padding-right: 10px;
438
+ padding-left: 5px;
439
+ }
440
+
441
+ body.rtl .choices__list--dropdown .choices__item {
442
+ text-align: right;
443
+ }
444
+
445
+ body.rtl .choices__input {
446
+ padding-right: 2px !important;
447
+ padding-left: 0 !important;
448
+ }
449
+
450
+ body.rtl .choices[data-type*="select-multiple"] .choices__button,
451
+ body.rtl .choices[data-type*="text"] .choices__button {
452
+ margin-right: 8px;
453
+ margin-left: -4px;
454
+ border-right: 1px solid #0a4f7e;
455
+ border-left: none;
456
+ }
457
+
458
+ @media (min-width: 640px) {
459
+ body.rtl .choices__list--dropdown .choices__item--selectable {
460
+ text-align: right;
461
+ padding-left: 100px;
462
+ padding-right: 10px;
463
+ }
464
+ body.rtl .choices__list--dropdown .choices__item--selectable:after {
465
+ right: auto;
466
+ left: 10px;
467
+ }
468
+ }
469
+
470
+ .aioseop-admin-page .aioseop-btn {
471
+ border: 1px;
472
+ border-style: solid;
473
+ border-radius: 3px;
474
+ cursor: pointer;
475
+ display: inline-block;
476
+ margin: 0;
477
+ text-decoration: none;
478
+ text-align: center;
479
+ vertical-align: middle;
480
+ white-space: nowrap;
481
+ box-shadow: none;
482
+ }
483
+
484
+ .aioseop-admin-page .aioseop-btn-block {
485
+ display: block;
486
+ width: 100%;
487
+ }
488
+
489
+ .aioseop-admin-page .aioseop-btn-md {
490
+ font-size: 13px;
491
+ font-weight: 600;
492
+ padding: 8px 12px;
493
+ min-height: 35px;
494
+ }
495
+
496
+ .aioseop-admin-page .aioseop-btn-lg {
497
+ font-size: 16px;
498
+ font-weight: 600;
499
+ padding: 16px 28px;
500
+ }
501
+
502
+ .aioseop-admin-page .aioseop-btn-orange {
503
+ background-color: #e27730;
504
+ border-color: #e27730;
505
+ color: #fff;
506
+ }
507
+
508
+ .aioseop-admin-page .aioseop-btn-orange:hover {
509
+ background-color: #b85a1b;
510
+ border-color: #b85a1b;
511
+ color: #fff;
512
+ }
513
+
514
+ .aioseop-admin-page .aioseop-btn-grey {
515
+ background-color: #eee;
516
+ border-color: #ccc;
517
+ color: #666;
518
+ }
519
+
520
+ .aioseop-admin-page .aioseop-btn-grey:hover {
521
+ background-color: #d7d7d7;
522
+ border-color: #ccc;
523
+ color: #444;
524
+ }
525
+
526
+ .aioseop-admin-page .aioseop-btn-light-grey {
527
+ background-color: #f5f5f5;
528
+ border: 1px solid #ccc;
529
+ color: #666;
530
+ }
531
+
532
+ .aioseop-admin-page .aioseop-btn-light-grey:hover {
533
+ background-color: #eee;
534
+ border-color: #ccc;
535
+ color: #444;
536
+ }
537
+
538
+ .aioseop-admin-page .aioseop-btn-trans-green {
539
+ background-color: transparent;
540
+ border: none;
541
+ color: #2a9b39;
542
+ }
543
+
544
+ .aioseop-admin-page .aioseop-btn-trans-green:hover {
545
+ background-color: #2a9b39;
546
+ color: #fff;
547
+ }
548
+
549
+ .aioseop-admin-page .aioseop-btn-trans-green .underline {
550
+ position: relative;
551
+ }
552
+
553
+ .aioseop-admin-page .aioseop-btn-trans-green .underline:after {
554
+ content: " ";
555
+ border-bottom: 1px dashed #2a9b39;
556
+ position: absolute;
557
+ bottom: -5px;
558
+ left: 0;
559
+ width: 100%;
560
+ }
561
+
562
+ .aioseop-admin-page .aioseop-btn-trans-green .dashicons {
563
+ height: 18px;
564
+ }
565
+
566
+ body div.jconfirm *,
567
+ body div.jconfirm *::before,
568
+ body div.jconfirm *::after {
569
+ -webkit-box-sizing: border-box;
570
+ -moz-box-sizing: border-box;
571
+ box-sizing: border-box;
572
+ }
573
+
574
+ body div.jconfirm div.jconfirm-box-container div.jconfirm-box {
575
+ border-radius: 0;
576
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
577
+ }
578
+
579
+ body div.jconfirm div.jconfirm-box-container div.jconfirm-box div.jconfirm-closeIcon {
580
+ color: rgba(0, 0, 0, 0.4);
581
+ top: 8px;
582
+ right: 8px;
583
+ }
584
+
585
+ body div.jconfirm div.jconfirm-box-container div.jconfirm-box div.jconfirm-closeIcon:hover {
586
+ color: rgba(0, 0, 0, 0.8);
587
+ }
588
+
589
+ body div.jconfirm div.jconfirm-box div.jconfirm-title-c {
590
+ margin: 0 0 26px 0 !important;
591
+ padding: 0 !important;
592
+ }
593
+
594
+ body div.jconfirm div.jconfirm-box div.jconfirm-title-c span.jconfirm-icon-c {
595
+ margin: 0 !important;
596
+ color: #c4c4c4 !important;
597
+ }
598
+
599
+ body div.jconfirm div.jconfirm-box div.jconfirm-title-c span.jconfirm-title {
600
+ display: block;
601
+ color: #333;
602
+ }
603
+
604
+ body div.jconfirm div.jconfirm-box div.jconfirm-title-c span.jconfirm-icon-c+span.jconfirm-title {
605
+ margin-top: 20px !important;
606
+ }
607
+
608
+ body div.jconfirm div.jconfirm-box div.jconfirm-content-pane {
609
+ margin-bottom: 26px;
610
+ display: block;
611
+ }
612
+
613
+ body div.jconfirm div.jconfirm-box div.jconfirm-content-pane .jconfirm-content {
614
+ overflow: inherit;
615
+ }
616
+
617
+ body div.jconfirm div.jconfirm-box div.jconfirm-content {
618
+ font-size: 16px;
619
+ color: #555;
620
+ line-height: 1.4;
621
+ }
622
+
623
+ body div.jconfirm div.jconfirm-box div.jconfirm-content.lite-upgrade p {
624
+ font-size: 18px;
625
+ padding: 0 20px;
626
+ }
627
+
628
+ body div.jconfirm div.jconfirm-box div.jconfirm-content p {
629
+ margin: 0 0 16px;
630
+ font-size: 16px;
631
+ line-height: 1.5;
632
+ }
633
+
634
+ body div.jconfirm div.jconfirm-box div.jconfirm-content p:last-of-type {
635
+ margin: 0;
636
+ }
637
+
638
+ body div.jconfirm div.jconfirm-box div.jconfirm-content p.large {
639
+ font-size: 18px;
640
+ }
641
+
642
+ body div.jconfirm div.jconfirm-box div.jconfirm-content p.small {
643
+ font-size: 14px;
644
+ }
645
+
646
+ body div.jconfirm div.jconfirm-box div.jconfirm-content .already-purchased {
647
+ font-size: 12px;
648
+ color: #ccc;
649
+ text-decoration: none;
650
+ }
651
+
652
+ body div.jconfirm div.jconfirm-box div.jconfirm-content .already-purchased:hover {
653
+ text-decoration: underline;
654
+ }
655
+
656
+ body div.jconfirm div.jconfirm-box div.jconfirm-buttons .already-purchased {
657
+ display: block;
658
+ font-size: 12px;
659
+ color: #aaa;
660
+ text-decoration: none;
661
+ padding-top: 20px;
662
+ }
663
+
664
+ body div.jconfirm div.jconfirm-box div.jconfirm-buttons .already-purchased:hover {
665
+ color: #999;
666
+ text-decoration: underline;
667
+ }
668
+
669
+ body div.jconfirm div.jconfirm-box .discount-note {
670
+ text-align: center;
671
+ margin: 30px 0 0;
672
+ }
673
+
674
+ body div.jconfirm div.jconfirm-box .discount-note p {
675
+ background-color: #faffac;
676
+ margin: 0 -30px;
677
+ padding: 24px 60px 20px;
678
+ font-size: 15px;
679
+ color: #4d4d4d;
680
+ position: relative;
681
+ }
682
+
683
+ body div.jconfirm div.jconfirm-box .discount-note p:after {
684
+ content: '\f058';
685
+ display: inline-block;
686
+ font: normal normal normal 14px/1 FontAwesome;
687
+ background-color: #fff;
688
+ font-size: 26px;
689
+ border-radius: 50%;
690
+ padding: 5px 6px;
691
+ text-rendering: auto;
692
+ -webkit-font-smoothing: antialiased;
693
+ -moz-osx-font-smoothing: grayscale;
694
+ position: absolute;
695
+ top: -20px;
696
+ right: 50%;
697
+ margin-right: -18px;
698
+ color: #3abc01;
699
+ }
700
+
701
+ body div.jconfirm div.jconfirm-box .discount-note span {
702
+ font-weight: 700;
703
+ color: #3abc01;
704
+ }
705
+
706
+ body div.jconfirm div.jconfirm-box .discount-note a {
707
+ color: #aaa;
708
+ display: block;
709
+ margin-top: 12px;
710
+ }
711
+
712
+ body div.jconfirm div.jconfirm-box input[type=text] {
713
+ display: block;
714
+ width: 99%;
715
+ border: 1px solid #d6d6d6;
716
+ padding: 10px;
717
+ box-shadow: none;
718
+ margin: 20px auto 0 auto;
719
+ }
720
+
721
+ body div.jconfirm div.jconfirm-box #aioseop-embed-shortcode {
722
+ margin: 20px 0;
723
+ text-align: center;
724
+ font-size: 24px;
725
+ padding: 8px 5px;
726
+ }
727
+
728
+ body div.jconfirm div.jconfirm-box #aioseop-embed-shortcode:disabled {
729
+ color: #333;
730
+ }
731
+
732
+ body div.jconfirm div.jconfirm-box button.btn-confirm {
733
+ background-color: #e27730;
734
+ color: #fff;
735
+ outline: none;
736
+ }
737
+
738
+ body div.jconfirm div.jconfirm-box button.btn-confirm:hover {
739
+ background-color: #b85a1b;
740
+ border-color: #b85a1b;
741
+ }
742
+
743
+ body div.jconfirm div.jconfirm-box button,
744
+ body div.jconfirm div.jconfirm-box button.btn-default {
745
+ color: #666;
746
+ }
747
+
748
+ body div.jconfirm div.jconfirm-box button.btn-block {
749
+ display: block;
750
+ text-align: center;
751
+ width: 100%;
752
+ margin: 0 0 10px 0 !important;
753
+ }
754
+
755
+ body div.jconfirm div.jconfirm-box button.btn-normal-case {
756
+ text-transform: none !important;
757
+ }
758
+
759
+ body div.jconfirm div.jconfirm-box .error {
760
+ display: none;
761
+ color: red;
762
+ }
763
+
764
+ body div.jconfirm div.jconfirm-box .aioseop-error {
765
+ border: 1px solid #ebccd1 !important;
766
+ }
767
+
768
+ body div.jconfirm div.jconfirm-box .jconfirm-title-c .jconfirm-icon-c {
769
+ -webkit-transition: none !important;
770
+ transition: none !important;
771
+ -webkit-transform: none !important;
772
+ -ms-transform: none !important;
773
+ transform: none !important;
774
+ font-size: 45px !important;
775
+ }
776
+
777
+ body div.jconfirm div.jconfirm-box.aioseop-providers-account-add-modal div.jconfirm-title-c {
778
+ font-size: 20px;
779
+ }
780
+
781
+ body div.jconfirm div.jconfirm-box.aioseop-providers-account-add-modal div.jconfirm-content .description {
782
+ font-size: 13px;
783
+ line-height: 1.4;
784
+ margin-top: 16px;
785
+ }
786
+
787
+ body div.jconfirm div.jconfirm-box.aioseop-providers-account-add-modal div.jconfirm-content input[type="text"] {
788
+ margin-top: 10px;
789
+ }
790
+
791
+ body .choices {
792
+ text-align: left;
793
+ font-size: 16px;
794
+ }
795
+
796
+ body .choices input[type=text].choices__input {
797
+ display: inline-block !important;
798
+ }
799
+
800
+ .aioseop-admin-page .aioseop-alert {
801
+ padding: 16px;
802
+ margin-bottom: 18px;
803
+ border: 1px solid transparent;
804
+ }
805
+
806
+ .aioseop-admin-page .aioseop-alert h4 {
807
+ margin-top: 0;
808
+ color: inherit;
809
+ }
810
+
811
+ .aioseop-admin-page .aioseop-alert p {
812
+ margin: 0 0 15px 0;
813
+ }
814
+
815
+ .aioseop-admin-page .aioseop-alert p:last-of-type {
816
+ margin: 0;
817
+ }
818
+
819
+ .aioseop-admin-page .aioseop-alert.aioseop-alert-nomargin {
820
+ margin: 0;
821
+ }
822
+
823
+ .aioseop-admin-page .aioseop-alert.aioseop-alert-small {
824
+ font-size: 12px;
825
+ }
826
+
827
+ .aioseop-admin-page .aioseop-alert.aioseop-alert-success {
828
+ background-color: #dff0d8;
829
+ border-color: #d6e9c6;
830
+ color: #3c763d;
831
+ }
832
+
833
+ .aioseop-admin-page .aioseop-alert.aioseop-alert-info {
834
+ background-color: #d9edf7;
835
+ border-color: #bce8f1;
836
+ color: #31708f;
837
+ }
838
+
839
+ .aioseop-admin-page .aioseop-alert.aioseop-alert-warning {
840
+ background-color: #fcf8e3;
841
+ border-color: #faebcc;
842
+ color: #8a6d3b;
843
+ }
844
+
845
+ .aioseop-admin-page .aioseop-alert.aioseop-alert-danger {
846
+ background-color: #f2dede;
847
+ border-color: #ebccd1;
848
+ color: #a94442;
849
+ }
850
+
851
+ .aioseop-flag {
852
+ width: 16px;
853
+ height: 16px;
854
+ background: url(../images/flags.png) no-repeat;
855
+ display: inline-block;
856
+ }
857
+
858
+ .aioseop-flag.aioseop-flag-ad {
859
+ background-position: -16px 0;
860
+ }
861
+
862
+ .aioseop-flag.aioseop-flag-ae {
863
+ background-position: -32px 0;
864
+ }
865
+
866
+ .aioseop-flag.aioseop-flag-af {
867
+ background-position: -48px 0;
868
+ }
869
+
870
+ .aioseop-flag.aioseop-flag-ag {
871
+ background-position: -64px 0;
872
+ }
873
+
874
+ .aioseop-flag.aioseop-flag-ai {
875
+ background-position: -80px 0;
876
+ }
877
+
878
+ .aioseop-flag.aioseop-flag-al {
879
+ background-position: -96px 0;
880
+ }
881
+
882
+ .aioseop-flag.aioseop-flag-am {
883
+ background-position: -112px 0;
884
+ }
885
+
886
+ .aioseop-flag.aioseop-flag-an {
887
+ background-position: -128px 0;
888
+ }
889
+
890
+ .aioseop-flag.aioseop-flag-ao {
891
+ background-position: -144px 0;
892
+ }
893
+
894
+ .aioseop-flag.aioseop-flag-ar {
895
+ background-position: -160px 0;
896
+ }
897
+
898
+ .aioseop-flag.aioseop-flag-as {
899
+ background-position: -176px 0;
900
+ }
901
+
902
+ .aioseop-flag.aioseop-flag-at {
903
+ background-position: -192px 0;
904
+ }
905
+
906
+ .aioseop-flag.aioseop-flag-au {
907
+ background-position: -208px 0;
908
+ }
909
+
910
+ .aioseop-flag.aioseop-flag-aw {
911
+ background-position: -224px 0;
912
+ }
913
+
914
+ .aioseop-flag.aioseop-flag-az {
915
+ background-position: 0 -16px;
916
+ }
917
+
918
+ .aioseop-flag.aioseop-flag-ba {
919
+ background-position: -16px -16px;
920
+ }
921
+
922
+ .aioseop-flag.aioseop-flag-bb {
923
+ background-position: -32px -16px;
924
+ }
925
+
926
+ .aioseop-flag.aioseop-flag-bd {
927
+ background-position: -48px -16px;
928
+ }
929
+
930
+ .aioseop-flag.aioseop-flag-be {
931
+ background-position: -64px -16px;
932
+ }
933
+
934
+ .aioseop-flag.aioseop-flag-bf {
935
+ background-position: -80px -16px;
936
+ }
937
+
938
+ .aioseop-flag.aioseop-flag-bg {
939
+ background-position: -96px -16px;
940
+ }
941
+
942
+ .aioseop-flag.aioseop-flag-bh {
943
+ background-position: -112px -16px;
944
+ }
945
+
946
+ .aioseop-flag.aioseop-flag-bi {
947
+ background-position: -128px -16px;
948
+ }
949
+
950
+ .aioseop-flag.aioseop-flag-bj {
951
+ background-position: -144px -16px;
952
+ }
953
+
954
+ .aioseop-flag.aioseop-flag-bm {
955
+ background-position: -160px -16px;
956
+ }
957
+
958
+ .aioseop-flag.aioseop-flag-bn {
959
+ background-position: -176px -16px;
960
+ }
961
+
962
+ .aioseop-flag.aioseop-flag-bo {
963
+ background-position: -192px -16px;
964
+ }
965
+
966
+ .aioseop-flag.aioseop-flag-br {
967
+ background-position: -208px -16px;
968
+ }
969
+
970
+ .aioseop-flag.aioseop-flag-bs {
971
+ background-position: -224px -16px;
972
+ }
973
+
974
+ .aioseop-flag.aioseop-flag-bt {
975
+ background-position: 0 -32px;
976
+ }
977
+
978
+ .aioseop-flag.aioseop-flag-bw {
979
+ background-position: -16px -32px;
980
+ }
981
+
982
+ .aioseop-flag.aioseop-flag-by {
983
+ background-position: -32px -32px;
984
+ }
985
+
986
+ .aioseop-flag.aioseop-flag-bz {
987
+ background-position: -48px -32px;
988
+ }
989
+
990
+ .aioseop-flag.aioseop-flag-ca {
991
+ background-position: -64px -32px;
992
+ }
993
+
994
+ .aioseop-flag.aioseop-flag-cd {
995
+ background-position: -80px -32px;
996
+ }
997
+
998
+ .aioseop-flag.aioseop-flag-cf {
999
+ background-position: -96px -32px;
1000
+ }
1001
+
1002
+ .aioseop-flag.aioseop-flag-cg {
1003
+ background-position: -112px -32px;
1004
+ }
1005
+
1006
+ .aioseop-flag.aioseop-flag-ch {
1007
+ background-position: -128px -32px;
1008
+ }
1009
+
1010
+ .aioseop-flag.aioseop-flag-ci {
1011
+ background-position: -144px -32px;
1012
+ }
1013
+
1014
+ .aioseop-flag.aioseop-flag-ck {
1015
+ background-position: -160px -32px;
1016
+ }
1017
+
1018
+ .aioseop-flag.aioseop-flag-cl {
1019
+ background-position: -176px -32px;
1020
+ }
1021
+
1022
+ .aioseop-flag.aioseop-flag-cm {
1023
+ background-position: -192px -32px;
1024
+ }
1025
+
1026
+ .aioseop-flag.aioseop-flag-cn {
1027
+ background-position: -208px -32px;
1028
+ }
1029
+
1030
+ .aioseop-flag.aioseop-flag-co {
1031
+ background-position: -224px -32px;
1032
+ }
1033
+
1034
+ .aioseop-flag.aioseop-flag-cr {
1035
+ background-position: 0 -48px;
1036
+ }
1037
+
1038
+ .aioseop-flag.aioseop-flag-cu {
1039
+ background-position: -16px -48px;
1040
+ }
1041
+
1042
+ .aioseop-flag.aioseop-flag-cv {
1043
+ background-position: -32px -48px;
1044
+ }
1045
+
1046
+ .aioseop-flag.aioseop-flag-cy {
1047
+ background-position: -48px -48px;
1048
+ }
1049
+
1050
+ .aioseop-flag.aioseop-flag-cz {
1051
+ background-position: -64px -48px;
1052
+ }
1053
+
1054
+ .aioseop-flag.aioseop-flag-de {
1055
+ background-position: -80px -48px;
1056
+ }
1057
+
1058
+ .aioseop-flag.aioseop-flag-dj {
1059
+ background-position: -96px -48px;
1060
+ }
1061
+
1062
+ .aioseop-flag.aioseop-flag-dk {
1063
+ background-position: -112px -48px;
1064
+ }
1065
+
1066
+ .aioseop-flag.aioseop-flag-dm {
1067
+ background-position: -128px -48px;
1068
+ }
1069
+
1070
+ .aioseop-flag.aioseop-flag-do {
1071
+ background-position: -144px -48px;
1072
+ }
1073
+
1074
+ .aioseop-flag.aioseop-flag-dz {
1075
+ background-position: -160px -48px;
1076
+ }
1077
+
1078
+ .aioseop-flag.aioseop-flag-ec {
1079
+ background-position: -176px -48px;
1080
+ }
1081
+
1082
+ .aioseop-flag.aioseop-flag-ee {
1083
+ background-position: -192px -48px;
1084
+ }
1085
+
1086
+ .aioseop-flag.aioseop-flag-eg {
1087
+ background-position: -208px -48px;
1088
+ }
1089
+
1090
+ .aioseop-flag.aioseop-flag-eh {
1091
+ background-position: -224px -48px;
1092
+ }
1093
+
1094
+ .aioseop-flag.aioseop-flag-er {
1095
+ background-position: 0 -64px;
1096
+ }
1097
+
1098
+ .aioseop-flag.aioseop-flag-es {
1099
+ background-position: -16px -64px;
1100
+ }
1101
+
1102
+ .aioseop-flag.aioseop-flag-et {
1103
+ background-position: -32px -64px;
1104
+ }
1105
+
1106
+ .aioseop-flag.aioseop-flag-fi {
1107
+ background-position: -48px -64px;
1108
+ }
1109
+
1110
+ .aioseop-flag.aioseop-flag-fj {
1111
+ background-position: -64px -64px;
1112
+ }
1113
+
1114
+ .aioseop-flag.aioseop-flag-fm {
1115
+ background-position: -80px -64px;
1116
+ }
1117
+
1118
+ .aioseop-flag.aioseop-flag-fo {
1119
+ background-position: -96px -64px;
1120
+ }
1121
+
1122
+ .aioseop-flag.aioseop-flag-fr {
1123
+ background-position: -112px -64px;
1124
+ }
1125
+
1126
+ .aioseop-flag.aioseop-flag-ga {
1127
+ background-position: -128px -64px;
1128
+ }
1129
+
1130
+ .aioseop-flag.aioseop-flag-gb {
1131
+ background-position: -144px -64px;
1132
+ }
1133
+
1134
+ .aioseop-flag.aioseop-flag-gd {
1135
+ background-position: -160px -64px;
1136
+ }
1137
+
1138
+ .aioseop-flag.aioseop-flag-ge {
1139
+ background-position: -176px -64px;
1140
+ }
1141
+
1142
+ .aioseop-flag.aioseop-flag-gg {
1143
+ background-position: -192px -64px;
1144
+ }
1145
+
1146
+ .aioseop-flag.aioseop-flag-gh {
1147
+ background-position: -208px -64px;
1148
+ }
1149
+
1150
+ .aioseop-flag.aioseop-flag-gi {
1151
+ background-position: -224px -64px;
1152
+ }
1153
+
1154
+ .aioseop-flag.aioseop-flag-gl {
1155
+ background-position: 0 -80px;
1156
+ }
1157
+
1158
+ .aioseop-flag.aioseop-flag-gm {
1159
+ background-position: -16px -80px;
1160
+ }
1161
+
1162
+ .aioseop-flag.aioseop-flag-gn {
1163
+ background-position: -32px -80px;
1164
+ }
1165
+
1166
+ .aioseop-flag.aioseop-flag-gp {
1167
+ background-position: -48px -80px;
1168
+ }
1169
+
1170
+ .aioseop-flag.aioseop-flag-gq {
1171
+ background-position: -64px -80px;
1172
+ }
1173
+
1174
+ .aioseop-flag.aioseop-flag-gr {
1175
+ background-position: -80px -80px;
1176
+ }
1177
+
1178
+ .aioseop-flag.aioseop-flag-gt {
1179
+ background-position: -96px -80px;
1180
+ }
1181
+
1182
+ .aioseop-flag.aioseop-flag-gu {
1183
+ background-position: -112px -80px;
1184
+ }
1185
+
1186
+ .aioseop-flag.aioseop-flag-gw {
1187
+ background-position: -128px -80px;
1188
+ }
1189
+
1190
+ .aioseop-flag.aioseop-flag-gy {
1191
+ background-position: -144px -80px;
1192
+ }
1193
+
1194
+ .aioseop-flag.aioseop-flag-hk {
1195
+ background-position: -160px -80px;
1196
+ }
1197
+
1198
+ .aioseop-flag.aioseop-flag-hn {
1199
+ background-position: -176px -80px;
1200
+ }
1201
+
1202
+ .aioseop-flag.aioseop-flag-hr {
1203
+ background-position: -192px -80px;
1204
+ }
1205
+
1206
+ .aioseop-flag.aioseop-flag-ht {
1207
+ background-position: -208px -80px;
1208
+ }
1209
+
1210
+ .aioseop-flag.aioseop-flag-hu {
1211
+ background-position: -224px -80px;
1212
+ }
1213
+
1214
+ .aioseop-flag.aioseop-flag-id {
1215
+ background-position: 0 -96px;
1216
+ }
1217
+
1218
+ .aioseop-flag.aioseop-flag-ie {
1219
+ background-position: -16px -96px;
1220
+ }
1221
+
1222
+ .aioseop-flag.aioseop-flag-il {
1223
+ background-position: -32px -96px;
1224
+ }
1225
+
1226
+ .aioseop-flag.aioseop-flag-im {
1227
+ background-position: -48px -96px;
1228
+ }
1229
+
1230
+ .aioseop-flag.aioseop-flag-in {
1231
+ background-position: -64px -96px;
1232
+ }
1233
+
1234
+ .aioseop-flag.aioseop-flag-iq {
1235
+ background-position: -80px -96px;
1236
+ }
1237
+
1238
+ .aioseop-flag.aioseop-flag-ir {
1239
+ background-position: -96px -96px;
1240
+ }
1241
+
1242
+ .aioseop-flag.aioseop-flag-is {
1243
+ background-position: -112px -96px;
1244
+ }
1245
+
1246
+ .aioseop-flag.aioseop-flag-it {
1247
+ background-position: -128px -96px;
1248
+ }
1249
+
1250
+ .aioseop-flag.aioseop-flag-je {
1251
+ background-position: -144px -96px;
1252
+ }
1253
+
1254
+ .aioseop-flag.aioseop-flag-jm {
1255
+ background-position: -160px -96px;
1256
+ }
1257
+
1258
+ .aioseop-flag.aioseop-flag-jo {
1259
+ background-position: -176px -96px;
1260
+ }
1261
+
1262
+ .aioseop-flag.aioseop-flag-jp {
1263
+ background-position: -192px -96px;
1264
+ }
1265
+
1266
+ .aioseop-flag.aioseop-flag-ke {
1267
+ background-position: -208px -96px;
1268
+ }
1269
+
1270
+ .aioseop-flag.aioseop-flag-kg {
1271
+ background-position: -224px -96px;
1272
+ }
1273
+
1274
+ .aioseop-flag.aioseop-flag-kh {
1275
+ background-position: 0 -112px;
1276
+ }
1277
+
1278
+ .aioseop-flag.aioseop-flag-ki {
1279
+ background-position: -16px -112px;
1280
+ }
1281
+
1282
+ .aioseop-flag.aioseop-flag-km {
1283
+ background-position: -32px -112px;
1284
+ }
1285
+
1286
+ .aioseop-flag.aioseop-flag-kn {
1287
+ background-position: -48px -112px;
1288
+ }
1289
+
1290
+ .aioseop-flag.aioseop-flag-kp {
1291
+ background-position: -64px -112px;
1292
+ }
1293
+
1294
+ .aioseop-flag.aioseop-flag-kr {
1295
+ background-position: -80px -112px;
1296
+ }
1297
+
1298
+ .aioseop-flag.aioseop-flag-kw {
1299
+ background-position: -96px -112px;
1300
+ }
1301
+
1302
+ .aioseop-flag.aioseop-flag-ky {
1303
+ background-position: -112px -112px;
1304
+ }
1305
+
1306
+ .aioseop-flag.aioseop-flag-kz {
1307
+ background-position: -128px -112px;
1308
+ }
1309
+
1310
+ .aioseop-flag.aioseop-flag-la {
1311
+ background-position: -144px -112px;
1312
+ }
1313
+
1314
+ .aioseop-flag.aioseop-flag-lb {
1315
+ background-position: -160px -112px;
1316
+ }
1317
+
1318
+ .aioseop-flag.aioseop-flag-lc {
1319
+ background-position: -176px -112px;
1320
+ }
1321
+
1322
+ .aioseop-flag.aioseop-flag-li {
1323
+ background-position: -192px -112px;
1324
+ }
1325
+
1326
+ .aioseop-flag.aioseop-flag-lk {
1327
+ background-position: -208px -112px;
1328
+ }
1329
+
1330
+ .aioseop-flag.aioseop-flag-lr {
1331
+ background-position: -224px -112px;
1332
+ }
1333
+
1334
+ .aioseop-flag.aioseop-flag-ls {
1335
+ background-position: 0 -128px;
1336
+ }
1337
+
1338
+ .aioseop-flag.aioseop-flag-lt {
1339
+ background-position: -16px -128px;
1340
+ }
1341
+
1342
+ .aioseop-flag.aioseop-flag-lu {
1343
+ background-position: -32px -128px;
1344
+ }
1345
+
1346
+ .aioseop-flag.aioseop-flag-lv {
1347
+ background-position: -48px -128px;
1348
+ }
1349
+
1350
+ .aioseop-flag.aioseop-flag-ly {
1351
+ background-position: -64px -128px;
1352
+ }
1353
+
1354
+ .aioseop-flag.aioseop-flag-ma {
1355
+ background-position: -80px -128px;
1356
+ }
1357
+
1358
+ .aioseop-flag.aioseop-flag-mc {
1359
+ background-position: -96px -128px;
1360
+ }
1361
+
1362
+ .aioseop-flag.aioseop-flag-md {
1363
+ background-position: -112px -128px;
1364
+ }
1365
+
1366
+ .aioseop-flag.aioseop-flag-me {
1367
+ background-position: -128px -128px;
1368
+ }
1369
+
1370
+ .aioseop-flag.aioseop-flag-mg {
1371
+ background-position: -144px -128px;
1372
+ }
1373
+
1374
+ .aioseop-flag.aioseop-flag-mh {
1375
+ background-position: -160px -128px;
1376
+ }
1377
+
1378
+ .aioseop-flag.aioseop-flag-mk {
1379
+ background-position: -176px -128px;
1380
+ }
1381
+
1382
+ .aioseop-flag.aioseop-flag-ml {
1383
+ background-position: -192px -128px;
1384
+ }
1385
+
1386
+ .aioseop-flag.aioseop-flag-mm {
1387
+ background-position: -208px -128px;
1388
+ }
1389
+
1390
+ .aioseop-flag.aioseop-flag-mn {
1391
+ background-position: -224px -128px;
1392
+ }
1393
+
1394
+ .aioseop-flag.aioseop-flag-mo {
1395
+ background-position: 0 -144px;
1396
+ }
1397
+
1398
+ .aioseop-flag.aioseop-flag-mq {
1399
+ background-position: -16px -144px;
1400
+ }
1401
+
1402
+ .aioseop-flag.aioseop-flag-mr {
1403
+ background-position: -32px -144px;
1404
+ }
1405
+
1406
+ .aioseop-flag.aioseop-flag-ms {
1407
+ background-position: -48px -144px;
1408
+ }
1409
+
1410
+ .aioseop-flag.aioseop-flag-mt {
1411
+ background-position: -64px -144px;
1412
+ }
1413
+
1414
+ .aioseop-flag.aioseop-flag-mu {
1415
+ background-position: -80px -144px;
1416
+ }
1417
+
1418
+ .aioseop-flag.aioseop-flag-mv {
1419
+ background-position: -96px -144px;
1420
+ }
1421
+
1422
+ .aioseop-flag.aioseop-flag-mw {
1423
+ background-position: -112px -144px;
1424
+ }
1425
+
1426
+ .aioseop-flag.aioseop-flag-mx {
1427
+ background-position: -128px -144px;
1428
+ }
1429
+
1430
+ .aioseop-flag.aioseop-flag-my {
1431
+ background-position: -144px -144px;
1432
+ }
1433
+
1434
+ .aioseop-flag.aioseop-flag-mz {
1435
+ background-position: -160px -144px;
1436
+ }
1437
+
1438
+ .aioseop-flag.aioseop-flag-na {
1439
+ background-position: -176px -144px;
1440
+ }
1441
+
1442
+ .aioseop-flag.aioseop-flag-nc {
1443
+ background-position: -192px -144px;
1444
+ }
1445
+
1446
+ .aioseop-flag.aioseop-flag-ne {
1447
+ background-position: -208px -144px;
1448
+ }
1449
+
1450
+ .aioseop-flag.aioseop-flag-ng {
1451
+ background-position: -224px -144px;
1452
+ }
1453
+
1454
+ .aioseop-flag.aioseop-flag-ni {
1455
+ background-position: 0 -160px;
1456
+ }
1457
+
1458
+ .aioseop-flag.aioseop-flag-nl {
1459
+ background-position: -16px -160px;
1460
+ }
1461
+
1462
+ .aioseop-flag.aioseop-flag-no {
1463
+ background-position: -32px -160px;
1464
+ }
1465
+
1466
+ .aioseop-flag.aioseop-flag-np {
1467
+ background-position: -48px -160px;
1468
+ }
1469
+
1470
+ .aioseop-flag.aioseop-flag-nr {
1471
+ background-position: -64px -160px;
1472
+ }
1473
+
1474
+ .aioseop-flag.aioseop-flag-nz {
1475
+ background-position: -80px -160px;
1476
+ }
1477
+
1478
+ .aioseop-flag.aioseop-flag-om {
1479
+ background-position: -96px -160px;
1480
+ }
1481
+
1482
+ .aioseop-flag.aioseop-flag-pa {
1483
+ background-position: -112px -160px;
1484
+ }
1485
+
1486
+ .aioseop-flag.aioseop-flag-pe {
1487
+ background-position: -128px -160px;
1488
+ }
1489
+
1490
+ .aioseop-flag.aioseop-flag-pf {
1491
+ background-position: -144px -160px;
1492
+ }
1493
+
1494
+ .aioseop-flag.aioseop-flag-pg {
1495
+ background-position: -160px -160px;
1496
+ }
1497
+
1498
+ .aioseop-flag.aioseop-flag-ph {
1499
+ background-position: -176px -160px;
1500
+ }
1501
+
1502
+ .aioseop-flag.aioseop-flag-pk {
1503
+ background-position: -192px -160px;
1504
+ }
1505
+
1506
+ .aioseop-flag.aioseop-flag-pl {
1507
+ background-position: -208px -160px;
1508
+ }
1509
+
1510
+ .aioseop-flag.aioseop-flag-pr {
1511
+ background-position: -224px -160px;
1512
+ }
1513
+
1514
+ .aioseop-flag.aioseop-flag-ps {
1515
+ background-position: 0 -176px;
1516
+ }
1517
+
1518
+ .aioseop-flag.aioseop-flag-pt {
1519
+ background-position: -16px -176px;
1520
+ }
1521
+
1522
+ .aioseop-flag.aioseop-flag-pw {
1523
+ background-position: -32px -176px;
1524
+ }
1525
+
1526
+ .aioseop-flag.aioseop-flag-py {
1527
+ background-position: -48px -176px;
1528
+ }
1529
+
1530
+ .aioseop-flag.aioseop-flag-qa {
1531
+ background-position: -64px -176px;
1532
+ }
1533
+
1534
+ .aioseop-flag.aioseop-flag-re {
1535
+ background-position: -80px -176px;
1536
+ }
1537
+
1538
+ .aioseop-flag.aioseop-flag-ro {
1539
+ background-position: -96px -176px;
1540
+ }
1541
+
1542
+ .aioseop-flag.aioseop-flag-rs {
1543
+ background-position: -112px -176px;
1544
+ }
1545
+
1546
+ .aioseop-flag.aioseop-flag-ru {
1547
+ background-position: -128px -176px;
1548
+ }
1549
+
1550
+ .aioseop-flag.aioseop-flag-rw {
1551
+ background-position: -144px -176px;
1552
+ }
1553
+
1554
+ .aioseop-flag.aioseop-flag-sa {
1555
+ background-position: -160px -176px;
1556
+ }
1557
+
1558
+ .aioseop-flag.aioseop-flag-sb {
1559
+ background-position: -176px -176px;
1560
+ }
1561
+
1562
+ .aioseop-flag.aioseop-flag-sc {
1563
+ background-position: -192px -176px;
1564
+ }
1565
+
1566
+ .aioseop-flag.aioseop-flag-sd {
1567
+ background-position: -208px -176px;
1568
+ }
1569
+
1570
+ .aioseop-flag.aioseop-flag-se {
1571
+ background-position: -224px -176px;
1572
+ }
1573
+
1574
+ .aioseop-flag.aioseop-flag-sg {
1575
+ background-position: 0 -192px;
1576
+ }
1577
+
1578
+ .aioseop-flag.aioseop-flag-si {
1579
+ background-position: -16px -192px;
1580
+ }
1581
+
1582
+ .aioseop-flag.aioseop-flag-sk {
1583
+ background-position: -32px -192px;
1584
+ }
1585
+
1586
+ .aioseop-flag.aioseop-flag-sl {
1587
+ background-position: -48px -192px;
1588
+ }
1589
+
1590
+ .aioseop-flag.aioseop-flag-sm {
1591
+ background-position: -64px -192px;
1592
+ }
1593
+
1594
+ .aioseop-flag.aioseop-flag-sn {
1595
+ background-position: -80px -192px;
1596
+ }
1597
+
1598
+ .aioseop-flag.aioseop-flag-so {
1599
+ background-position: -96px -192px;
1600
+ }
1601
+
1602
+ .aioseop-flag.aioseop-flag-sr {
1603
+ background-position: -112px -192px;
1604
+ }
1605
+
1606
+ .aioseop-flag.aioseop-flag-st {
1607
+ background-position: -128px -192px;
1608
+ }
1609
+
1610
+ .aioseop-flag.aioseop-flag-sv {
1611
+ background-position: -144px -192px;
1612
+ }
1613
+
1614
+ .aioseop-flag.aioseop-flag-sy {
1615
+ background-position: -160px -192px;
1616
+ }
1617
+
1618
+ .aioseop-flag.aioseop-flag-sz {
1619
+ background-position: -176px -192px;
1620
+ }
1621
+
1622
+ .aioseop-flag.aioseop-flag-tc {
1623
+ background-position: -192px -192px;
1624
+ }
1625
+
1626
+ .aioseop-flag.aioseop-flag-td {
1627
+ background-position: -208px -192px;
1628
+ }
1629
+
1630
+ .aioseop-flag.aioseop-flag-tg {
1631
+ background-position: -224px -192px;
1632
+ }
1633
+
1634
+ .aioseop-flag.aioseop-flag-th {
1635
+ background-position: 0 -208px;
1636
+ }
1637
+
1638
+ .aioseop-flag.aioseop-flag-tj {
1639
+ background-position: -16px -208px;
1640
+ }
1641
+
1642
+ .aioseop-flag.aioseop-flag-tl {
1643
+ background-position: -32px -208px;
1644
+ }
1645
+
1646
+ .aioseop-flag.aioseop-flag-tm {
1647
+ background-position: -48px -208px;
1648
+ }
1649
+
1650
+ .aioseop-flag.aioseop-flag-tn {
1651
+ background-position: -64px -208px;
1652
+ }
1653
+
1654
+ .aioseop-flag.aioseop-flag-to {
1655
+ background-position: -80px -208px;
1656
+ }
1657
+
1658
+ .aioseop-flag.aioseop-flag-tr {
1659
+ background-position: -96px -208px;
1660
+ }
1661
+
1662
+ .aioseop-flag.aioseop-flag-tt {
1663
+ background-position: -112px -208px;
1664
+ }
1665
+
1666
+ .aioseop-flag.aioseop-flag-tv {
1667
+ background-position: -128px -208px;
1668
+ }
1669
+
1670
+ .aioseop-flag.aioseop-flag-tw {
1671
+ background-position: -144px -208px;
1672
+ }
1673
+
1674
+ .aioseop-flag.aioseop-flag-tz {
1675
+ background-position: -160px -208px;
1676
+ }
1677
+
1678
+ .aioseop-flag.aioseop-flag-ua {
1679
+ background-position: -176px -208px;
1680
+ }
1681
+
1682
+ .aioseop-flag.aioseop-flag-ug {
1683
+ background-position: -192px -208px;
1684
+ }
1685
+
1686
+ .aioseop-flag.aioseop-flag-us {
1687
+ background-position: -208px -208px;
1688
+ }
1689
+
1690
+ .aioseop-flag.aioseop-flag-uy {
1691
+ background-position: -224px -208px;
1692
+ }
1693
+
1694
+ .aioseop-flag.aioseop-flag-uz {
1695
+ background-position: 0 -224px;
1696
+ }
1697
+
1698
+ .aioseop-flag.aioseop-flag-va {
1699
+ background-position: -16px -224px;
1700
+ }
1701
+
1702
+ .aioseop-flag.aioseop-flag-vc {
1703
+ background-position: -32px -224px;
1704
+ }
1705
+
1706
+ .aioseop-flag.aioseop-flag-ve {
1707
+ background-position: -48px -224px;
1708
+ }
1709
+
1710
+ .aioseop-flag.aioseop-flag-vg {
1711
+ background-position: -64px -224px;
1712
+ }
1713
+
1714
+ .aioseop-flag.aioseop-flag-vi {
1715
+ background-position: -80px -224px;
1716
+ }
1717
+
1718
+ .aioseop-flag.aioseop-flag-vn {
1719
+ background-position: -96px -224px;
1720
+ }
1721
+
1722
+ .aioseop-flag.aioseop-flag-vu {
1723
+ background-position: -112px -224px;
1724
+ }
1725
+
1726
+ .aioseop-flag.aioseop-flag-ws {
1727
+ background-position: -128px -224px;
1728
+ }
1729
+
1730
+ .aioseop-flag.aioseop-flag-ye {
1731
+ background-position: -144px -224px;
1732
+ }
1733
+
1734
+ .aioseop-flag.aioseop-flag-za {
1735
+ background-position: -160px -224px;
1736
+ }
1737
+
1738
+ .aioseop-flag.aioseop-flag-zm {
1739
+ background-position: -176px -224px;
1740
+ }
1741
+
1742
+ .aioseop-flag.aioseop-flag-zw {
1743
+ background-position: -192px -224px;
1744
+ }
1745
+
1746
+ #aioseop-header-temp {
1747
+ position: relative;
1748
+ margin: 0;
1749
+ position: absolute;
1750
+ top: -1px;
1751
+ left: 20px;
1752
+ right: 20px;
1753
+ z-index: 99;
1754
+ }
1755
+
1756
+ #aioseop-header {
1757
+ border-top: 3px solid #e27730;
1758
+ padding: 22px 20px;
1759
+ }
1760
+
1761
+ #aioseop-header img {
1762
+ display: block;
1763
+ margin: 0;
1764
+ max-width: 235px;
1765
+ }
1766
+
1767
+ @media (max-width: 782px) {
1768
+ #aioseop-header img {
1769
+ max-width: 200px;
1770
+ }
1771
+ }
1772
+
1773
+ .aioseop-admin-wrap .page-title {
1774
+ background-color: #fff;
1775
+ margin: 0 0 20px 0;
1776
+ padding: 15px 20px;
1777
+ }
1778
+
1779
+ .aioseop-admin-wrap .page-title .add-new-h2 {
1780
+ margin-left: 28px;
1781
+ }
1782
+
1783
+ .aioseop-admin-tabs {
1784
+ background-color: #fff;
1785
+ margin: 0 0 20px 0;
1786
+ padding: 0 20px;
1787
+ list-style: none;
1788
+ overflow: auto;
1789
+ font-size: 14px;
1790
+ }
1791
+
1792
+ .aioseop-admin-tabs li {
1793
+ margin: 0 30px 0 0;
1794
+ padding: 0;
1795
+ float: left;
1796
+ }
1797
+
1798
+ .aioseop-admin-tabs li:last-of-type {
1799
+ margin: 0;
1800
+ }
1801
+
1802
+ .aioseop-admin-tabs li a {
1803
+ color: #666;
1804
+ display: block;
1805
+ padding: 20px 0 18px 0;
1806
+ text-decoration: none;
1807
+ border-bottom: 2px solid #fff;
1808
+ box-shadow: none;
1809
+ }
1810
+
1811
+ .aioseop-admin-tabs li a:hover {
1812
+ border-color: #999;
1813
+ }
1814
+
1815
+ .aioseop-admin-tabs li a.active {
1816
+ border-color: #0073AA;
1817
+ }
1818
+
1819
+ .aioseop-admin-tabs li a:focus {
1820
+ box-shadow: none;
1821
+ }
1822
+
1823
+ #wpcontent {
1824
+ padding-left: 0 !important;
1825
+ position: relative;
1826
+ }
1827
+
1828
+ @media (max-width: 600px) {
1829
+ #wpcontent {
1830
+ padding-top: 46px;
1831
+ }
1832
+ }
1833
+
1834
+ @media (max-width: 600px) {
1835
+ #wpbody {
1836
+ padding-top: 0;
1837
+ }
1838
+ }
1839
+
1840
+ .aioseop-admin-page #screen-meta-links,
1841
+ .aioseop-admin-page #screen-meta {
1842
+ display: none;
1843
+ }
1844
+
1845
+ .aioseop-admin-page .video-container {
1846
+ position: relative;
1847
+ padding-bottom: 56.1%;
1848
+ height: 0;
1849
+ overflow: hidden;
1850
+ }
1851
+
1852
+ .aioseop-admin-page .video-container iframe,
1853
+ .aioseop-admin-page .video-container object,
1854
+ .aioseop-admin-page .video-container embed {
1855
+ position: absolute;
1856
+ top: 0;
1857
+ left: 0;
1858
+ width: 100%;
1859
+ height: 100%;
1860
+ }
1861
+
1862
+ .aioseop-admin-page .aioseop-file-upload input[type=file] {
1863
+ width: 0.1px;
1864
+ height: 0.1px;
1865
+ opacity: 0;
1866
+ overflow: hidden;
1867
+ position: absolute;
1868
+ z-index: -1;
1869
+ }
1870
+
1871
+ .aioseop-admin-page .aioseop-file-upload label {
1872
+ text-overflow: ellipsis;
1873
+ white-space: nowrap;
1874
+ cursor: pointer;
1875
+ display: inline-block;
1876
+ overflow: hidden;
1877
+ padding: 0;
1878
+ }
1879
+
1880
+ .aioseop-admin-page .aioseop-file-upload input[type=file]:focus+label,
1881
+ .aioseop-admin-page .aioseop-file-upload input[type=file].has-focus+label {
1882
+ outline: 1px dotted #000;
1883
+ outline: -webkit-focus-ring-color auto 5px;
1884
+ }
1885
+
1886
+ .aioseop-admin-page .aioseop-file-upload .fld {
1887
+ text-overflow: ellipsis;
1888
+ white-space: nowrap;
1889
+ overflow: hidden;
1890
+ background-color: #fff;
1891
+ border: 1px solid #ddd;
1892
+ border-radius: 3px;
1893
+ box-shadow: none;
1894
+ color: #333;
1895
+ display: inline-block;
1896
+ vertical-align: middle;
1897
+ padding: 7px 12px;
1898
+ margin: 0 10px 0 0;
1899
+ width: 400px;
1900
+ min-height: 35px;
1901
+ }
1902
+
1903
+ .aioseop-admin-page .aioseop-file-upload .fld .placeholder {
1904
+ color: #ccc;
1905
+ }
1906
+
1907
+ .aioseop-admin-page .aioseop-file-upload strong .fa {
1908
+ margin-right: 8px;
1909
+ }
1910
+
1911
+ .aioseop-admin-page .aioseop-hide {
1912
+ display: none;
1913
+ }
1914
+
1915
+ .aioseop-admin-page .aioseop-h1-placeholder {
1916
+ display: none;
1917
+ }
1918
+
1919
+ .aioseop-admin-page .notice {
1920
+ display: none;
1921
+ }
1922
+
1923
+ .aioseop-admin-page .lity {
1924
+ z-index: 999999999;
1925
+ padding: 20px;
1926
+ }
1927
+
1928
+ .aioseop-admin-page .lity-close {
1929
+ margin: 10px;
1930
+ }
1931
+
1932
+ .aioseop-admin-page .lity-content {
1933
+ max-width: 80vw;
1934
+ max-height: 80vh;
1935
+ }
1936
+
1937
+ .aioseop-admin-page .lity-content img {
1938
+ max-height: 80vh !important;
1939
+ max-width: 80vw !important;
1940
+ }
1941
+
1942
+ .aioseop-admin-page input.choices__input {
1943
+ line-height: normal;
1944
+ }
1945
+
1946
+ .aioseop-admin-page input:focus,
1947
+ .aioseop-admin-page select:focus,
1948
+ .aioseop-admin-page textarea:focus {
1949
+ border: 1px solid #016AAB !important;
1950
+ box-shadow: 0 0 0 1px #016AAB !important;
1951
+ outline: none !important;
1952
+ }
1953
+
1954
+ .aioseop-admin-page a:focus {
1955
+ box-shadow: 0 0 2px 1px #016AABCC;
1956
+ }
1957
+
1958
+ .aioseop-admin-wrap {
1959
+ margin: 0;
1960
+ }
1961
+
1962
+ .aioseop-admin-wrap .notice {
1963
+ margin-left: 20px !important;
1964
+ margin-right: 20px !important;
1965
+ }
1966
+
1967
+ .aioseop-admin-content {
1968
+ padding-left: 20px;
1969
+ padding-right: 20px;
1970
+ }
1971
+
1972
+ .aioseop-admin-content:before {
1973
+ content: " ";
1974
+ display: table;
1975
+ }
1976
+
1977
+ .aioseop-admin-content:after {
1978
+ clear: both;
1979
+ content: " ";
1980
+ display: table;
1981
+ }
1982
+
1983
+ .aioseop-admin-content hr {
1984
+ border: none;
1985
+ border-top: 1px solid #e4e4e4;
1986
+ margin: 20px 0;
1987
+ background: none;
1988
+ }
1989
+
1990
+ .aioseop-clear:before {
1991
+ content: " ";
1992
+ display: table;
1993
+ }
1994
+
1995
+ .aioseop-clear:after {
1996
+ clear: both;
1997
+ content: " ";
1998
+ display: table;
1999
+ }
2000
+
2001
+ .aioseop-admin-columns>div[class*="-column-"] {
2002
+ float: left;
2003
+ }
2004
+
2005
+ .aioseop-admin-columns .aioseop-admin-column-20 {
2006
+ width: 20%;
2007
+ }
2008
+
2009
+ .aioseop-admin-columns .aioseop-admin-column-33 {
2010
+ width: 33.33333%;
2011
+ }
2012
+
2013
+ .aioseop-admin-columns .aioseop-admin-column-40 {
2014
+ width: 40%;
2015
+ }
2016
+
2017
+ .aioseop-admin-columns .aioseop-admin-column-50 {
2018
+ width: 50%;
2019
+ }
2020
+
2021
+ .aioseop-admin-columns .aioseop-admin-column-60 {
2022
+ width: 60%;
2023
+ }
2024
+
2025
+ .aioseop-admin-columns .aioseop-admin-column-80 {
2026
+ width: 80%;
2027
+ }
2028
+
2029
+ .aioseop-admin-columns .aioseop-admin-column-last {
2030
+ float: right !important;
2031
+ }
2032
+
2033
+ .aioseop-admin-columns:after {
2034
+ content: "";
2035
+ display: table;
2036
+ clear: both;
2037
+ }
2038
+
2039
+ .lity-active,
2040
+ .lity-active body.aioseop-admin-page {
2041
+ overflow: scroll;
2042
+ }
2043
+
2044
+ #aioseop-overview .tablenav.top {
2045
+ margin-top: 0;
2046
+ }
2047
+
2048
+ #aioseop-overview .wp-list-table .column-id {
2049
+ width: 30px;
2050
+ }
2051
+
2052
+ #aioseop-overview .wp-list-table .column-entries {
2053
+ width: 70px;
2054
+ }
2055
+
2056
+ #aioseop-overview .wp-list-table .column-shortcode {
2057
+ width: 150px;
2058
+ }
2059
+
2060
+ #aioseop-overview .wp-list-table .column-created {
2061
+ width: 145px;
2062
+ }
2063
+
2064
+ #aioseop-entries-single #poststuff {
2065
+ padding: 0;
2066
+ }
2067
+
2068
+ #aioseop-entries-single .postbox .hndle {
2069
+ cursor: default !important;
2070
+ }
2071
+
2072
+ #aioseop-entries-single .aioseop-entry-navigation {
2073
+ font-size: 13px;
2074
+ line-height: 29px;
2075
+ float: right;
2076
+ position: relative;
2077
+ padding-top: 2px;
2078
+ padding-right: 1px;
2079
+ white-space: nowrap;
2080
+ }
2081
+
2082
+ @media (max-width: 600px) {
2083
+ #aioseop-entries-single .aioseop-entry-navigation {
2084
+ display: none;
2085
+ }
2086
+ }
2087
+
2088
+ #aioseop-entries-single .aioseop-entry-navigation .add-new-h2 {
2089
+ top: auto;
2090
+ margin: 0;
2091
+ padding: 4px 0px;
2092
+ text-align: center;
2093
+ }
2094
+
2095
+ @media (max-width: 782px) {
2096
+ #aioseop-entries-single .aioseop-entry-navigation .add-new-h2 {
2097
+ font-size: 13px;
2098
+ }
2099
+ }
2100
+
2101
+ #aioseop-entries-single .aioseop-entry-navigation .add-new-h2 .dashicons {
2102
+ font-size: 16px;
2103
+ height: auto;
2104
+ width: 28px;
2105
+ line-height: 29px;
2106
+ }
2107
+
2108
+ #aioseop-entries-single .aioseop-entry-navigation .add-new-h2.inactive {
2109
+ opacity: 0.5;
2110
+ pointer-events: none;
2111
+ cursor: default;
2112
+ }
2113
+
2114
+ #aioseop-entries-single .aioseop-entry-navigation .aioseop-entry-navigation-text {
2115
+ display: inline-block;
2116
+ margin-right: 10px;
2117
+ }
2118
+
2119
+ #aioseop-entries-single .aioseop-entry-navigation .aioseop-entry-current {
2120
+ top: auto;
2121
+ margin: 0 -5px 0 -3px;
2122
+ text-align: center;
2123
+ padding: 4px 10px;
2124
+ position: relative;
2125
+ text-decoration: none;
2126
+ border: 1px solid #ccc;
2127
+ -webkit-border-radius: 2px;
2128
+ border-radius: 2px;
2129
+ background: #fff;
2130
+ font-size: 13px;
2131
+ line-height: 29px;
2132
+ text-transform: center;
2133
+ }
2134
+
2135
+ #aioseop-entries-single #aioseop-entry-fields h2.hndle {
2136
+ font-size: 18px;
2137
+ }
2138
+
2139
+ #aioseop-entries-single #aioseop-entry-fields h2.hndle .dashicons {
2140
+ font-size: 16px;
2141
+ height: 16px;
2142
+ width: 16px;
2143
+ margin: 4px 4px 0 0;
2144
+ color: #e27730;
2145
+ }
2146
+
2147
+ #aioseop-entries-single #aioseop-entry-fields .no-fields {
2148
+ padding: 12px;
2149
+ margin: 0;
2150
+ }
2151
+
2152
+ #aioseop-entries-single #aioseop-entry-fields .inside {
2153
+ padding: 0;
2154
+ margin: 0;
2155
+ }
2156
+
2157
+ #aioseop-entries-single #aioseop-entry-fields .inside p {
2158
+ padding: 0;
2159
+ margin: 0;
2160
+ }
2161
+
2162
+ #aioseop-entries-single #aioseop-entry-fields .inside .aioseop-entry-field-name {
2163
+ font-weight: 600;
2164
+ background: #ebf3fb;
2165
+ padding: 8px 12px;
2166
+ }
2167
+
2168
+ #aioseop-entries-single #aioseop-entry-fields .inside .aioseop-entry-field-value {
2169
+ background: #fff;
2170
+ padding: 8px 12px;
2171
+ }
2172
+
2173
+ #aioseop-entries-single #aioseop-entry-fields .inside .empty .aioseop-entry-field-value {
2174
+ font-style: italic;
2175
+ color: #999;
2176
+ }
2177
+
2178
+ #aioseop-entries-single #aioseop-entry-fields .aioseop-empty-field-toggle {
2179
+ float: right;
2180
+ text-decoration: none;
2181
+ padding: 5px 0 0;
2182
+ }
2183
+
2184
+ #aioseop-entries-single #aioseop-entry-notes .inside {
2185
+ margin: 0;
2186
+ padding: 0;
2187
+ }
2188
+
2189
+ #aioseop-entries-single #aioseop-entry-notes .aioseop-entry-notes-new {
2190
+ padding: 10px;
2191
+ }
2192
+
2193
+ #aioseop-entries-single #aioseop-entry-notes form {
2194
+ display: none;
2195
+ }
2196
+
2197
+ #aioseop-entries-single #aioseop-entry-notes .btns {
2198
+ overflow: auto;
2199
+ padding: 8px 0;
2200
+ }
2201
+
2202
+ #aioseop-entries-single #aioseop-entry-notes .no-notes {
2203
+ margin: 0;
2204
+ padding: 4px 10px 8px;
2205
+ }
2206
+
2207
+ #aioseop-entries-single #aioseop-entry-notes .aioseop-entry-notes-single {
2208
+ padding: 10px;
2209
+ border-top: 1px solid #e3e1e3;
2210
+ }
2211
+
2212
+ #aioseop-entries-single #aioseop-entry-notes .aioseop-entry-notes-single p:last-of-type {
2213
+ margin-bottom: 0;
2214
+ }
2215
+
2216
+ #aioseop-entries-single #aioseop-entry-notes .aioseop-entry-notes-single.even {
2217
+ background-color: #f9f9f9;
2218
+ }
2219
+
2220
+ #aioseop-entries-single #aioseop-entry-notes .aioseop-entry-notes-byline {
2221
+ color: #888;
2222
+ margin-bottom: 10px;
2223
+ }
2224
+
2225
+ #aioseop-entries-single #aioseop-entry-notes .aioseop-entry-notes-byline .sep {
2226
+ color: #ddd;
2227
+ }
2228
+
2229
+ #aioseop-entries-single #aioseop-entry-notes .aioseop-entry-notes-byline .notes-user {
2230
+ text-decoration: none;
2231
+ font-weight: 600;
2232
+ }
2233
+
2234
+ #aioseop-entries-single #aioseop-entry-notes .aioseop-entry-notes-byline .note-delete {
2235
+ color: #a00;
2236
+ text-decoration: none;
2237
+ }
2238
+
2239
+ #aioseop-entries-single #aioseop-entry-notes .aioseop-entry-notes-byline .note-delete:hover {
2240
+ color: red;
2241
+ text-decoration: none;
2242
+ }
2243
+
2244
+ #aioseop-entries-single #aioseop-entry-logs .inside {
2245
+ margin: 0;
2246
+ padding: 0;
2247
+ }
2248
+
2249
+ #aioseop-entries-single #aioseop-entry-logs form {
2250
+ display: none;
2251
+ }
2252
+
2253
+ #aioseop-entries-single #aioseop-entry-logs .btns {
2254
+ overflow: auto;
2255
+ padding: 8px 0;
2256
+ }
2257
+
2258
+ #aioseop-entries-single #aioseop-entry-logs .no-logs {
2259
+ margin: 0;
2260
+ padding: 4px 10px 8px;
2261
+ }
2262
+
2263
+ #aioseop-entries-single #aioseop-entry-logs .aioseop-entry-logs-single {
2264
+ padding: 10px;
2265
+ border-top: 1px solid #e3e1e3;
2266
+ }
2267
+
2268
+ #aioseop-entries-single #aioseop-entry-logs .aioseop-entry-logs-single:first-of-type {
2269
+ border-top: 0;
2270
+ }
2271
+
2272
+ #aioseop-entries-single #aioseop-entry-logs .aioseop-entry-logs-single p:last-of-type {
2273
+ margin-bottom: 0;
2274
+ }
2275
+
2276
+ #aioseop-entries-single #aioseop-entry-logs .aioseop-entry-logs-single.even {
2277
+ background-color: #f9f9f9;
2278
+ }
2279
+
2280
+ #aioseop-entries-single #aioseop-entry-logs .aioseop-entry-logs-byline {
2281
+ color: #888;
2282
+ margin-bottom: 10px;
2283
+ }
2284
+
2285
+ #aioseop-entries-single #aioseop-entry-logs .aioseop-entry-logs-byline .notes-user {
2286
+ text-decoration: none;
2287
+ font-weight: 600;
2288
+ }
2289
+
2290
+ #aioseop-entries-single #aioseop-entry-details .inside,
2291
+ #aioseop-entries-single #aioseop-entry-payment .inside,
2292
+ #aioseop-entries-single #aioseop-entry-actions .inside {
2293
+ margin: 0;
2294
+ padding: 0;
2295
+ }
2296
+
2297
+ #aioseop-entries-single .aioseop-entry-details-meta,
2298
+ #aioseop-entries-single .aioseop-entry-actions-meta {
2299
+ padding: 6px 0 0;
2300
+ }
2301
+
2302
+ #aioseop-entries-single .aioseop-entry-details-meta p,
2303
+ #aioseop-entries-single .aioseop-entry-payment-meta p,
2304
+ #aioseop-entries-single .aioseop-entry-actions-meta p {
2305
+ padding: 6px 10px 8px;
2306
+ margin: 0;
2307
+ }
2308
+
2309
+ #aioseop-entries-single .aioseop-entry-payment-meta {
2310
+ padding: 0;
2311
+ }
2312
+
2313
+ #aioseop-entries-single .aioseop-entry-payment-meta p {
2314
+ border-bottom: 1px solid #eee;
2315
+ padding: 10px;
2316
+ }
2317
+
2318
+ #aioseop-entries-single .aioseop-entry-payment-meta p:last-of-type {
2319
+ border-bottom: 0;
2320
+ }
2321
+
2322
+ #aioseop-entries-single .aioseop-entry-details-meta strong,
2323
+ #aioseop-entries-single .aioseop-entry-actions-meta strong {
2324
+ font-weight: 600;
2325
+ }
2326
+
2327
+ #aioseop-entries-single .aioseop-entry-details-meta .dashicons,
2328
+ #aioseop-entries-single .aioseop-entry-actions-meta .dashicons {
2329
+ padding: 0 2px 0 0;
2330
+ color: #82878A;
2331
+ top: -1px;
2332
+ left: -1px;
2333
+ position: relative;
2334
+ text-decoration: none;
2335
+ }
2336
+
2337
+ #aioseop-entries-single #aioseop-entry-details .submitdelete {
2338
+ color: #a00;
2339
+ text-decoration: none;
2340
+ padding: 1px 2px;
2341
+ }
2342
+
2343
+ #aioseop-entries-single #aioseop-entry-details .submitdelete:hover {
2344
+ color: red;
2345
+ }
2346
+
2347
+ #aioseop-entries-single .aioseop-entry-actions-meta a {
2348
+ text-decoration: none;
2349
+ }
2350
+
2351
+ #aioseop-entries-single .aioseop-entry-actions-meta a:hover {
2352
+ text-decoration: underline;
2353
+ }
2354
+
2355
+ #aioseop-entries-single #aioseop-entry-geolocation .inside {
2356
+ padding: 0;
2357
+ margin: 0;
2358
+ }
2359
+
2360
+ #aioseop-entries-single #aioseop-entry-geolocation ul {
2361
+ margin: 0;
2362
+ }
2363
+
2364
+ #aioseop-entries-single #aioseop-entry-geolocation ul li {
2365
+ border-bottom: 1px solid #eee;
2366
+ margin: 0;
2367
+ overflow: auto;
2368
+ }
2369
+
2370
+ #aioseop-entries-single #aioseop-entry-geolocation ul li:last-of-type {
2371
+ border-bottom: 0;
2372
+ }
2373
+
2374
+ #aioseop-entries-single #aioseop-entry-geolocation .aioseop-geolocation-meta {
2375
+ width: 85px;
2376
+ float: left;
2377
+ border-right: 1px solid #eee;
2378
+ padding: 10px 20px 10px 12px;
2379
+ }
2380
+
2381
+ #aioseop-entries-single #aioseop-entry-geolocation .aioseop-geolocation-value {
2382
+ display: inline-block;
2383
+ padding: 10px 12px 10px 20px;
2384
+ }
2385
+
2386
+ #aioseop-entries-single #aioseop-entry-geolocation .aioseop-flag {
2387
+ vertical-align: text-top;
2388
+ margin-right: 4px;
2389
+ }
2390
+
2391
+ #aioseop-entries-list .form-details {
2392
+ border-bottom: 1px solid #ddd;
2393
+ padding-bottom: 15px;
2394
+ margin: 0 0 10px;
2395
+ }
2396
+
2397
+ #aioseop-entries-list .form-details .form-details-sub {
2398
+ color: #999;
2399
+ display: block;
2400
+ font-size: 10px;
2401
+ text-transform: uppercase;
2402
+ margin: 0 0 8px 0;
2403
+ }
2404
+
2405
+ #aioseop-entries-list .form-details .form-details-title {
2406
+ float: left;
2407
+ font-size: 18px;
2408
+ font-weight: 400;
2409
+ margin: 0;
2410
+ }
2411
+
2412
+ @media (max-width: 1199px) {
2413
+ #aioseop-entries-list .form-details .form-details-title {
2414
+ float: none;
2415
+ margin-bottom: 10px;
2416
+ }
2417
+ }
2418
+
2419
+ #aioseop-entries-list .form-details .form-selector {
2420
+ position: relative;
2421
+ display: inline-block;
2422
+ vertical-align: middle;
2423
+ }
2424
+
2425
+ #aioseop-entries-list .form-details .form-selector .toggle {
2426
+ border-radius: 50%;
2427
+ color: #444;
2428
+ font-size: 16px;
2429
+ box-shadow: none;
2430
+ }
2431
+
2432
+ #aioseop-entries-list .form-details .form-selector .toggle:hover,
2433
+ #aioseop-entries-list .form-details .form-selector .toggle.active {
2434
+ background-color: #e3e3e3;
2435
+ outline: none;
2436
+ }
2437
+
2438
+ #aioseop-entries-list .form-details .form-selector .toggle:before {
2439
+ vertical-align: middle;
2440
+ }
2441
+
2442
+ #aioseop-entries-list .form-details .form-selector .form-list {
2443
+ display: none;
2444
+ background: #fff;
2445
+ border-radius: 3px;
2446
+ box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.1);
2447
+ position: absolute;
2448
+ top: 27px;
2449
+ left: -108px;
2450
+ width: 230px;
2451
+ padding: 10px 0;
2452
+ z-index: 9991;
2453
+ }
2454
+
2455
+ #aioseop-entries-list .form-details .form-selector .form-list:before {
2456
+ content: " ";
2457
+ position: absolute;
2458
+ top: -10px;
2459
+ left: 110px;
2460
+ width: 0;
2461
+ height: 0;
2462
+ border-style: solid;
2463
+ border-width: 0 8px 10px 8px;
2464
+ border-color: transparent transparent #fff transparent;
2465
+ }
2466
+
2467
+ #aioseop-entries-list .form-details .form-selector ul {
2468
+ max-height: 196px;
2469
+ overflow-x: hidden;
2470
+ padding: 0;
2471
+ margin: 0;
2472
+ }
2473
+
2474
+ #aioseop-entries-list .form-details .form-selector ul li {
2475
+ list-style: none;
2476
+ margin: 0;
2477
+ font-size: 13px;
2478
+ }
2479
+
2480
+ #aioseop-entries-list .form-details .form-selector ul li a {
2481
+ display: block;
2482
+ text-decoration: none;
2483
+ padding: 5px 15px;
2484
+ color: #444;
2485
+ }
2486
+
2487
+ #aioseop-entries-list .form-details .form-selector ul li a:hover {
2488
+ background-color: #f7f7f7;
2489
+ }
2490
+
2491
+ #aioseop-entries-list .form-details .form-details-actions {
2492
+ float: right;
2493
+ }
2494
+
2495
+ @media (max-width: 1199px) {
2496
+ #aioseop-entries-list .form-details .form-details-actions {
2497
+ float: none;
2498
+ }
2499
+ }
2500
+
2501
+ #aioseop-entries-list .form-details .form-details-actions a {
2502
+ text-decoration: none;
2503
+ display: inline-block;
2504
+ margin: 0 12px 0 0;
2505
+ }
2506
+
2507
+ #aioseop-entries-list .form-details .form-details-actions a:last-of-type {
2508
+ margin: 0;
2509
+ }
2510
+
2511
+ #aioseop-entries-list .form-details .form-details-actions a .dashicons {
2512
+ width: 16px;
2513
+ height: 16px;
2514
+ font-size: 16px;
2515
+ }
2516
+
2517
+ #aioseop-entries-list .search-box .aioseop-form-search-box-field {
2518
+ max-width: 180px;
2519
+ vertical-align: top;
2520
+ margin: 0 2px 0 0;
2521
+ }
2522
+
2523
+ #aioseop-entries-list .search-box .aioseop-form-search-box-comparison {
2524
+ max-width: 90px;
2525
+ vertical-align: top;
2526
+ margin: 0 2px 0 0;
2527
+ }
2528
+
2529
+ #aioseop-entries-list .search-box .aioseop-form-search-box-term {
2530
+ min-height: 28px;
2531
+ line-height: normal;
2532
+ margin: 0 2px 0 0;
2533
+ }
2534
+
2535
+ #aioseop-entries-list .aioseop-filter-date .aioseop-filter-date-selector {
2536
+ min-height: 28px;
2537
+ background-color: #fff;
2538
+ vertical-align: middle;
2539
+ max-width: 210px;
2540
+ line-height: normal;
2541
+ }
2542
+
2543
+ #aioseop-entries-list .aioseop-filter-date button {
2544
+ margin: 1px 8px 0 0;
2545
+ vertical-align: top;
2546
+ }
2547
+
2548
+ #aioseop-entries-list .wp-list-table .new-entries-notification td {
2549
+ padding: 0;
2550
+ text-align: center;
2551
+ }
2552
+
2553
+ #aioseop-entries-list .wp-list-table .new-entries-notification td a {
2554
+ display: none;
2555
+ padding: 10px;
2556
+ background-color: #d9edf7;
2557
+ }
2558
+
2559
+ #aioseop-entries-list .wp-list-table .column-indicators {
2560
+ width: 35px;
2561
+ text-align: center;
2562
+ }
2563
+
2564
+ #aioseop-entries-list .wp-list-table .column-indicators a:focus {
2565
+ -webkit-box-shadow: none;
2566
+ box-shadow: none;
2567
+ }
2568
+
2569
+ #aioseop-entries-list .wp-list-table .column-indicators .dashicons {
2570
+ width: 14px;
2571
+ height: 14px;
2572
+ font-size: 14px;
2573
+ margin-top: 3px;
2574
+ }
2575
+
2576
+ #aioseop-entries-list .wp-list-table .indicator-star .dashicons {
2577
+ margin-right: 6px;
2578
+ }
2579
+
2580
+ #aioseop-entries-list .wp-list-table .indicator-star {
2581
+ color: #e4e4e4;
2582
+ }
2583
+
2584
+ #aioseop-entries-list .wp-list-table .indicator-star:hover,
2585
+ #aioseop-entries-list .wp-list-table .indicator-star.unstar {
2586
+ color: #e27730;
2587
+ }
2588
+
2589
+ #aioseop-entries-list .wp-list-table .indicator-read {
2590
+ color: #9ede84;
2591
+ }
2592
+
2593
+ #aioseop-entries-list .wp-list-table .indicator-read:hover,
2594
+ #aioseop-entries-list .wp-list-table .indicator-read.unread {
2595
+ color: #e4e4e4;
2596
+ }
2597
+
2598
+ #aioseop-entries-list .wp-list-table .column-date {
2599
+ width: 150px;
2600
+ }
2601
+
2602
+ #aioseop-entries-list .wp-list-table .column-status {
2603
+ width: 120px;
2604
+ }
2605
+
2606
+ #aioseop-entries-list .wp-list-table .column-status img {
2607
+ display: inline-block;
2608
+ height: 12px;
2609
+ width: auto;
2610
+ margin: 0 0 0 3px;
2611
+ }
2612
+
2613
+ #aioseop-entries-list .wp-list-table .column-payment_total {
2614
+ width: 100px;
2615
+ }
2616
+
2617
+ #aioseop-entries-list .wp-list-table .column-actions {
2618
+ width: 100px;
2619
+ }
2620
+
2621
+ #aioseop-entries-list .wp-list-table .sep {
2622
+ color: #ddd;
2623
+ }
2624
+
2625
+ #aioseop-entries-list .wp-list-table .delete:hover {
2626
+ color: red;
2627
+ }
2628
+
2629
+ #aioseop-entries-list #aioseop-entries-table-edit-columns {
2630
+ float: right;
2631
+ color: #ccc;
2632
+ }
2633
+
2634
+ #aioseop-entries-list #aioseop-entries-table-edit-columns:hover {
2635
+ color: #666;
2636
+ }
2637
+
2638
+ #aioseop-entries-list .aioseop-dash-widget-chart-block {
2639
+ padding: 12px 12px 0 8px;
2640
+ background-color: #ffffff;
2641
+ border: 1px solid #e5e5e5;
2642
+ margin-top: 20px;
2643
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
2644
+ }
2645
+
2646
+ #aioseop-entries-list .aioseop-dash-widget-chart-block .aioseop-error-no-data-chart {
2647
+ border: none;
2648
+ }
2649
+
2650
+ #aioseop-entries-list #aioseop-dash-widget-chart-title {
2651
+ margin-left: -12px;
2652
+ font-size: 18px;
2653
+ }
2654
+
2655
+ #aioseop-entries-list .aioseop-dash-widget-block:first-child {
2656
+ margin-top: 0;
2657
+ }
2658
+
2659
+ #aioseop-entries-list .aioseop-dash-widget-reset-chart {
2660
+ color: #d83638;
2661
+ opacity: 1;
2662
+ vertical-align: text-bottom;
2663
+ margin: 0 0 -1px 0;
2664
+ }
2665
+
2666
+ #aioseop-entries-list .aioseop-dash-widget-reset-chart:hover {
2667
+ color: #ad2b2c;
2668
+ }
2669
+
2670
+ #aioseop-entries-list .aioseop-dash-widget-reset-chart .dashicons {
2671
+ font-size: 20px;
2672
+ height: 20px;
2673
+ width: 20px;
2674
+ }
2675
+
2676
+ #aioseop-entries-list #aioseop-dash-widget-timespan {
2677
+ margin: 5px -12px 0 0;
2678
+ }
2679
+
2680
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-block {
2681
+ overflow: visible;
2682
+ }
2683
+
2684
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table {
2685
+ border: 1px solid #e5e5e5;
2686
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
2687
+ }
2688
+
2689
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table .aioseop-dash-widget-forms-list-columns td {
2690
+ padding: 12px 20px;
2691
+ border-bottom: 1px solid #e1e1e1;
2692
+ }
2693
+
2694
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table tbody {
2695
+ border-top: 0;
2696
+ }
2697
+
2698
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table tr {
2699
+ border-bottom: 0;
2700
+ }
2701
+
2702
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table tr:first-child {
2703
+ border-top: 0;
2704
+ }
2705
+
2706
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table tr:first-child td {
2707
+ border-top: 0;
2708
+ }
2709
+
2710
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table tr:nth-child(even) td {
2711
+ background-color: #f9f9f9;
2712
+ }
2713
+
2714
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table td {
2715
+ text-align: left;
2716
+ padding: 20px 20px;
2717
+ font-size: 14px;
2718
+ border: none;
2719
+ color: #555;
2720
+ background-color: #fff;
2721
+ }
2722
+
2723
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table tr>td:nth-child(2) {
2724
+ width: 180px;
2725
+ }
2726
+
2727
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table tr>td:nth-child(3) {
2728
+ width: 60px;
2729
+ text-align: center;
2730
+ }
2731
+
2732
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table tr>td:nth-child(4) {
2733
+ width: 90px;
2734
+ text-align: center;
2735
+ }
2736
+
2737
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table tr>td:nth-child(5) {
2738
+ width: 60px;
2739
+ text-align: center;
2740
+ padding-top: 0;
2741
+ padding-bottom: 0;
2742
+ }
2743
+
2744
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table .aioseop-dash-widget-form-active td:first-child {
2745
+ border-left: 3px solid #0073aa;
2746
+ padding-left: 17px;
2747
+ }
2748
+
2749
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table .aioseop-dash-widget-form-active .aioseop-dash-widget-single-chart-btn {
2750
+ display: none !important;
2751
+ }
2752
+
2753
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table .aioseop-dash-widget-form-active .aioseop-dash-widget-reset-chart {
2754
+ display: inline-block !important;
2755
+ border: none;
2756
+ background: none;
2757
+ margin: 0;
2758
+ }
2759
+
2760
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table .aioseop-dash-widget-forms-list-columns {
2761
+ background-color: #ffffff;
2762
+ border-bottom: 1px solid #ddd;
2763
+ }
2764
+
2765
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table a {
2766
+ text-decoration: none;
2767
+ }
2768
+
2769
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table a:hover {
2770
+ text-decoration: none;
2771
+ }
2772
+
2773
+ #aioseop-entries-list #aioseop-dash-widget-forms-list-table .aioseop-dash-widget-form-title a {
2774
+ font-weight: 600;
2775
+ }
2776
+
2777
+ @media screen and (max-width: 782px) {
2778
+ .aioseop-admin-content {
2779
+ padding-left: 10px;
2780
+ padding-right: 10px;
2781
+ }
2782
+ .wp-list-table {
2783
+ margin: 0 -10px 0 -10px;
2784
+ width: 100vw;
2785
+ table-layout: auto;
2786
+ }
2787
+ .wp-list-table.entries .column-indicators {
2788
+ width: auto !important;
2789
+ }
2790
+ .wp-list-table.entries .indicators .indicator-star {
2791
+ display: none;
2792
+ }
2793
+ .wp-list-table.entries .indicators .indicator-read {
2794
+ display: none;
2795
+ }
2796
+ .wp-list-table.entries tr:not(.inline-edit-row):not(.no-items) td.column-primary {
2797
+ height: 8px;
2798
+ padding: 0;
2799
+ z-index: +1;
2800
+ margin-right: 0;
2801
+ overflow: visible;
2802
+ }
2803
+ .wp-list-table.entries .toggle-row {
2804
+ right: 5px;
2805
+ top: 15px;
2806
+ }
2807
+ .wp-list-table.entries tr:not(.inline-edit-row):not(.no-items) td.column-primary+td {
2808
+ display: block !important;
2809
+ }
2810
+ .wp-list-table.entries tr:not(.inline-edit-row):not(.no-items) td.column-primary~td {
2811
+ margin-right: 5px;
2812
+ min-width: 50vw;
2813
+ }
2814
+ p.search-box {
2815
+ margin: 0;
2816
+ width: auto;
2817
+ }
2818
+ input[type=checkbox],
2819
+ input[type=radio] {
2820
+ height: 16px;
2821
+ width: 16px;
2822
+ }
2823
+ }
2824
+
2825
+ body.rtl #aioseop-entries-list .wp-list-table div[data-field-type="phone"] {
2826
+ direction: ltr;
2827
+ unicode-bidi: embed;
2828
+ text-align: right;
2829
+ }
2830
+
2831
+ #aioseop-welcome {
2832
+ border-top: 3px solid #e27730;
2833
+ color: #555;
2834
+ padding-top: 110px;
2835
+ }
2836
+
2837
+ @media (max-width: 767px) {
2838
+ #aioseop-welcome {
2839
+ padding-top: 64px;
2840
+ }
2841
+ }
2842
+
2843
+ #aioseop-welcome *,
2844
+ #aioseop-welcome *::before,
2845
+ #aioseop-welcome *::after {
2846
+ -webkit-box-sizing: border-box;
2847
+ -moz-box-sizing: border-box;
2848
+ box-sizing: border-box;
2849
+ }
2850
+
2851
+ #aioseop-welcome .container {
2852
+ margin: 0 auto;
2853
+ max-width: 720px;
2854
+ padding: 0;
2855
+ }
2856
+
2857
+ #aioseop-welcome .block {
2858
+ padding: 40px;
2859
+ }
2860
+
2861
+ @media (max-width: 767px) {
2862
+ #aioseop-welcome .block {
2863
+ padding: 20px;
2864
+ }
2865
+ }
2866
+
2867
+ #aioseop-welcome img {
2868
+ max-width: 100%;
2869
+ height: auto;
2870
+ }
2871
+
2872
+ #aioseop-welcome h1 {
2873
+ color: #222;
2874
+ font-size: 24px;
2875
+ text-align: center;
2876
+ margin: 0 0 16px 0;
2877
+ }
2878
+
2879
+ #aioseop-welcome h5 {
2880
+ color: #222;
2881
+ font-size: 16px;
2882
+ margin: 0 0 8px 0;
2883
+ }
2884
+
2885
+ #aioseop-welcome h6 {
2886
+ font-size: 16px;
2887
+ font-weight: 400;
2888
+ line-height: 1.6;
2889
+ text-align: center;
2890
+ margin: 0;
2891
+ }
2892
+
2893
+ #aioseop-welcome p {
2894
+ font-size: 14px;
2895
+ margin: 0 0 20px 0;
2896
+ }
2897
+
2898
+ #aioseop-welcome .button-wrap {
2899
+ max-width: 590px;
2900
+ margin: 0 auto 0 auto;
2901
+ }
2902
+
2903
+ #aioseop-welcome .button-wrap .left {
2904
+ float: left;
2905
+ width: 50%;
2906
+ padding-right: 20px;
2907
+ }
2908
+
2909
+ @media (max-width: 767px) {
2910
+ #aioseop-welcome .button-wrap .left {
2911
+ float: none;
2912
+ width: 100%;
2913
+ padding: 0;
2914
+ margin-bottom: 20px;
2915
+ }
2916
+ }
2917
+
2918
+ #aioseop-welcome .button-wrap .right {
2919
+ float: right;
2920
+ width: 50%;
2921
+ padding-left: 20px;
2922
+ }
2923
+
2924
+ @media (max-width: 767px) {
2925
+ #aioseop-welcome .button-wrap .right {
2926
+ float: none;
2927
+ width: 100%;
2928
+ padding: 0;
2929
+ }
2930
+ }
2931
+
2932
+ #aioseop-welcome .intro {
2933
+ background-color: #fff;
2934
+ border: 2px solid #e1e1e1;
2935
+ border-radius: 2px;
2936
+ margin-bottom: 30px;
2937
+ position: relative;
2938
+ padding-top: 40px;
2939
+ }
2940
+
2941
+ #aioseop-welcome .intro .sullie {
2942
+ background-color: #fff;
2943
+ border: 2px solid #e1e1e1;
2944
+ border-radius: 50%;
2945
+ height: 110px;
2946
+ width: 110px;
2947
+ padding: 18px 14px 0 14px;
2948
+ position: absolute;
2949
+ top: -58px;
2950
+ left: 50%;
2951
+ margin-left: -55px;
2952
+ }
2953
+
2954
+ #aioseop-welcome .intro .video-thumbnail {
2955
+ display: block;
2956
+ margin: 0 auto;
2957
+ }
2958
+
2959
+ #aioseop-welcome .intro .button-wrap {
2960
+ margin-top: 25px;
2961
+ }
2962
+
2963
+ #aioseop-welcome .features {
2964
+ background-color: #fff;
2965
+ border: 2px solid #e1e1e1;
2966
+ border-bottom: 0;
2967
+ border-radius: 2px 2px 0 0;
2968
+ position: relative;
2969
+ padding-top: 20px;
2970
+ padding-bottom: 20px;
2971
+ }
2972
+
2973
+ #aioseop-welcome .features .feature-list {
2974
+ margin-top: 60px;
2975
+ }
2976
+
2977
+ #aioseop-welcome .features .feature-block {
2978
+ float: left;
2979
+ width: 50%;
2980
+ padding-bottom: 35px;
2981
+ overflow: auto;
2982
+ }
2983
+
2984
+ @media (max-width: 767px) {
2985
+ #aioseop-welcome .features .feature-block {
2986
+ float: none;
2987
+ width: 100%;
2988
+ }
2989
+ }
2990
+
2991
+ #aioseop-welcome .features .feature-block.first {
2992
+ padding-right: 20px;
2993
+ clear: both;
2994
+ }
2995
+
2996
+ @media (max-width: 767px) {
2997
+ #aioseop-welcome .features .feature-block.first {
2998
+ padding-right: 0;
2999
+ }
3000
+ }
3001
+
3002
+ #aioseop-welcome .features .feature-block.last {
3003
+ padding-left: 20px;
3004
+ }
3005
+
3006
+ @media (max-width: 767px) {
3007
+ #aioseop-welcome .features .feature-block.last {
3008
+ padding-left: 0;
3009
+ }
3010
+ }
3011
+
3012
+ #aioseop-welcome .features .feature-block img {
3013
+ float: left;
3014
+ max-width: 46px;
3015
+ }
3016
+
3017
+ #aioseop-welcome .features .feature-block h5 {
3018
+ margin-left: 68px;
3019
+ }
3020
+
3021
+ #aioseop-welcome .features .feature-block p {
3022
+ margin: 0;
3023
+ margin-left: 68px;
3024
+ }
3025
+
3026
+ #aioseop-welcome .features .button-wrap {
3027
+ margin-top: 25px;
3028
+ text-align: center;
3029
+ }
3030
+
3031
+ #aioseop-welcome .upgrade-cta {
3032
+ background-color: #000;
3033
+ border: 2px solid #e1e1e1;
3034
+ border-top: 0;
3035
+ border-bottom: 0;
3036
+ color: #fff;
3037
+ }
3038
+
3039
+ #aioseop-welcome .upgrade-cta h2 {
3040
+ color: #fff;
3041
+ font-size: 20px;
3042
+ margin: 0 0 30px 0;
3043
+ }
3044
+
3045
+ #aioseop-welcome .upgrade-cta ul {
3046
+ display: -ms-flex;
3047
+ display: -webkit-flex;
3048
+ display: flex;
3049
+ -webkit-flex-wrap: wrap;
3050
+ flex-wrap: wrap;
3051
+ font-size: 15px;
3052
+ margin: 0;
3053
+ padding: 0;
3054
+ }
3055
+
3056
+ #aioseop-welcome .upgrade-cta ul li {
3057
+ display: block;
3058
+ width: 50%;
3059
+ margin: 0 0 8px 0;
3060
+ padding: 0;
3061
+ }
3062
+
3063
+ #aioseop-welcome .upgrade-cta ul li .dashicons {
3064
+ color: #2a9b39;
3065
+ margin-right: 5px;
3066
+ }
3067
+
3068
+ #aioseop-welcome .upgrade-cta .left {
3069
+ float: left;
3070
+ width: 66.666666%;
3071
+ padding-right: 20px;
3072
+ }
3073
+
3074
+ @media (max-width: 767px) {
3075
+ #aioseop-welcome .upgrade-cta .left {
3076
+ float: none;
3077
+ width: 100%;
3078
+ padding-right: 0;
3079
+ margin-bottom: 20px;
3080
+ }
3081
+ }
3082
+
3083
+ #aioseop-welcome .upgrade-cta .right {
3084
+ float: right;
3085
+ width: 33.333333%;
3086
+ padding: 20px 0 0 20px;
3087
+ text-align: center;
3088
+ }
3089
+
3090
+ @media (max-width: 767px) {
3091
+ #aioseop-welcome .upgrade-cta .right {
3092
+ float: none;
3093
+ width: 100%;
3094
+ padding-left: 0;
3095
+ }
3096
+ }
3097
+
3098
+ #aioseop-welcome .upgrade-cta .right h2 {
3099
+ text-align: center;
3100
+ margin: 0;
3101
+ }
3102
+
3103
+ #aioseop-welcome .upgrade-cta .right h2 span {
3104
+ display: inline-block;
3105
+ border-bottom: 1px solid #555;
3106
+ padding: 0 15px 12px;
3107
+ }
3108
+
3109
+ #aioseop-welcome .upgrade-cta .right .price {
3110
+ padding: 26px 0;
3111
+ }
3112
+
3113
+ #aioseop-welcome .upgrade-cta .right .price .amount {
3114
+ font-size: 48px;
3115
+ font-weight: 600;
3116
+ position: relative;
3117
+ display: inline-block;
3118
+ }
3119
+
3120
+ #aioseop-welcome .upgrade-cta .right .price .amount:before {
3121
+ content: '$';
3122
+ position: absolute;
3123
+ top: -8px;
3124
+ left: -16px;
3125
+ font-size: 18px;
3126
+ }
3127
+
3128
+ #aioseop-welcome .upgrade-cta .right .price .term {
3129
+ font-size: 12px;
3130
+ display: inline-block;
3131
+ }
3132
+
3133
+ #aioseop-welcome .testimonials {
3134
+ background-color: #fff;
3135
+ border: 2px solid #e1e1e1;
3136
+ border-top: 0;
3137
+ padding: 20px 0;
3138
+ }
3139
+
3140
+ #aioseop-welcome .testimonials .testimonial-block {
3141
+ margin: 50px 0 0 0;
3142
+ }
3143
+
3144
+ #aioseop-welcome .testimonials .testimonial-block img {
3145
+ border-radius: 50%;
3146
+ float: left;
3147
+ max-width: 100px;
3148
+ box-shadow: 0 0 18px rgba(0, 0, 0, 0.2);
3149
+ }
3150
+
3151
+ @media (max-width: 767px) {
3152
+ #aioseop-welcome .testimonials .testimonial-block img {
3153
+ width: 65px;
3154
+ }
3155
+ }
3156
+
3157
+ #aioseop-welcome .testimonials .testimonial-block p {
3158
+ font-size: 14px;
3159
+ margin: 0 0 12px 140px;
3160
+ }
3161
+
3162
+ @media (max-width: 767px) {
3163
+ #aioseop-welcome .testimonials .testimonial-block p {
3164
+ margin-left: 100px;
3165
+ }
3166
+ }
3167
+
3168
+ #aioseop-welcome .testimonials .testimonial-block p:last-of-type {
3169
+ margin-bottom: 0;
3170
+ }
3171
+
3172
+ #aioseop-welcome .footer {
3173
+ background-color: #f1f1f1;
3174
+ border: 2px solid #e1e1e1;
3175
+ border-top: 0;
3176
+ border-radius: 0 0 2px 2px;
3177
+ }
3178
+
3179
+ #aioseop-welcome.pro .features {
3180
+ border: 2px solid #e1e1e1;
3181
+ margin-bottom: 30px;
3182
+ }
3183
+
3184
+ #aioseop-welcome.pro .upgrade,
3185
+ #aioseop-welcome.pro .footer {
3186
+ display: none;
3187
+ }
3188
+
3189
+ #aioseop-welcome.pro .testimonials {
3190
+ border: 2px solid #e1e1e1;
3191
+ }
3192
+
3193
+ .dashboard_page_aioseop-getting-started .video-container {
3194
+ border: 2px solid #e1e1e1;
3195
+ }
3196
+
3197
+ .dashboard_page_aioseop-getting-started #wpfooter,
3198
+ .dashboard_page_aioseop-getting-started div.notice {
3199
+ display: none !important;
3200
+ }
3201
+
3202
+ #aioseop-admin-addons *,
3203
+ #aioseop-admin-addons *::before,
3204
+ #aioseop-admin-addons *::after {
3205
+ -webkit-box-sizing: border-box;
3206
+ -moz-box-sizing: border-box;
3207
+ box-sizing: border-box;
3208
+ }
3209
+
3210
+ #aioseop-admin-addons .addons-container {
3211
+ margin-left: -20px;
3212
+ margin-right: -20px;
3213
+ }
3214
+
3215
+ #aioseop-admin-addons .unlock-msg {
3216
+ padding: 0 20px;
3217
+ margin-top: -20px;
3218
+ clear: both;
3219
+ }
3220
+
3221
+ #aioseop-admin-addons #aioseop-admin-addons-search {
3222
+ background-color: #fff;
3223
+ border: 1px solid #ddd;
3224
+ border-radius: 3px;
3225
+ box-shadow: none;
3226
+ color: #333;
3227
+ vertical-align: middle;
3228
+ padding: 7px 12px;
3229
+ margin: -3px 10px 0 0;
3230
+ width: 200px;
3231
+ min-height: 35px;
3232
+ float: right;
3233
+ }
3234
+
3235
+ #aioseop-admin-addons #aioseop-admin-addons-search:focus {
3236
+ border-color: #bbb;
3237
+ }
3238
+
3239
+ #aioseop-admin-addons .addon-container {
3240
+ padding: 0 20px;
3241
+ float: left;
3242
+ width: 33.333333%;
3243
+ margin-bottom: 20px;
3244
+ }
3245
+
3246
+ @media (max-width: 1249px) {
3247
+ #aioseop-admin-addons .addon-container {
3248
+ width: 50%;
3249
+ }
3250
+ }
3251
+
3252
+ @media (max-width: 767px) {
3253
+ #aioseop-admin-addons .addon-container {
3254
+ width: 100%;
3255
+ margin-bottom: 20px;
3256
+ }
3257
+ }
3258
+
3259
+ #aioseop-admin-addons h4 {
3260
+ font-size: 17px;
3261
+ font-weight: 700;
3262
+ }
3263
+
3264
+ #aioseop-admin-addons .addon-item {
3265
+ background-color: #fff;
3266
+ border: 1px solid #ddd;
3267
+ border-radius: 3px;
3268
+ margin: 0;
3269
+ }
3270
+
3271
+ @media (max-width: 767px) {
3272
+ #aioseop-admin-addons .addon-item {
3273
+ margin: 0 0;
3274
+ }
3275
+ }
3276
+
3277
+ #aioseop-admin-addons .addon-item img {
3278
+ border: 1px solid #eee;
3279
+ float: left;
3280
+ max-width: 75px;
3281
+ }
3282
+
3283
+ #aioseop-admin-addons .addon-item h5 {
3284
+ margin: 0 0 10px 100px;
3285
+ font-size: 16px;
3286
+ }
3287
+
3288
+ #aioseop-admin-addons .addon-item p {
3289
+ margin: 0 0 0 100px;
3290
+ }
3291
+
3292
+ #aioseop-admin-addons .addon-item .details {
3293
+ padding: 30px 20px;
3294
+ }
3295
+
3296
+ #aioseop-admin-addons .addon-item .actions {
3297
+ background-color: #f7f7f7;
3298
+ border-top: 1px solid #ddd;
3299
+ padding: 20px;
3300
+ position: relative;
3301
+ }
3302
+
3303
+ #aioseop-admin-addons .addon-item .actions .msg {
3304
+ background-color: #f7f7f7;
3305
+ position: absolute;
3306
+ text-align: center;
3307
+ font-weight: 600;
3308
+ top: 0;
3309
+ left: 0;
3310
+ height: 100%;
3311
+ width: 100%;
3312
+ z-index: 99;
3313
+ padding: 20px;
3314
+ display: -webkit-box;
3315
+ display: -moz-box;
3316
+ display: -ms-flexbox;
3317
+ display: -webkit-flex;
3318
+ display: flex;
3319
+ -webkit-align-items: center;
3320
+ -ms-align-items: center;
3321
+ align-items: center;
3322
+ justify-content: center;
3323
+ }
3324
+
3325
+ #aioseop-admin-addons .addon-item .actions .msg.success {
3326
+ color: #2a9b39;
3327
+ }
3328
+
3329
+ #aioseop-admin-addons .addon-item .actions .msg.error {
3330
+ color: red;
3331
+ text-shadow: none;
3332
+ }
3333
+
3334
+ #aioseop-admin-addons .addon-item .status {
3335
+ float: left;
3336
+ padding-top: 8px;
3337
+ }
3338
+
3339
+ #aioseop-admin-addons .addon-item .status .status-inactive {
3340
+ color: red;
3341
+ }
3342
+
3343
+ #aioseop-admin-addons .addon-item .status .status-download {
3344
+ color: #666;
3345
+ }
3346
+
3347
+ #aioseop-admin-addons .addon-item .status .status-active {
3348
+ color: #2a9b39;
3349
+ }
3350
+
3351
+ #aioseop-admin-addons .addon-item .upgrade-button {
3352
+ text-align: center;
3353
+ }
3354
+
3355
+ #aioseop-admin-addons .addon-item .upgrade-button a {
3356
+ font-weight: 600;
3357
+ width: 140px;
3358
+ text-align: center;
3359
+ padding: 8px 5px;
3360
+ }
3361
+
3362
+ #aioseop-admin-addons .addon-item .action-button {
3363
+ float: right;
3364
+ }
3365
+
3366
+ #aioseop-admin-addons .addon-item .action-button button {
3367
+ background: none;
3368
+ border: 1px solid #ddd;
3369
+ border-radius: 3px;
3370
+ box-shadow: none;
3371
+ cursor: pointer;
3372
+ font-weight: 600;
3373
+ width: 140px;
3374
+ text-align: center;
3375
+ padding: 8px 5px;
3376
+ }
3377
+
3378
+ #aioseop-admin-addons .addon-item .action-button button:hover,
3379
+ #aioseop-admin-addons .addon-item .action-button button.loading {
3380
+ background-color: #e9e9e9;
3381
+ }
3382
+
3383
+ #aioseop-admin-addons .addon-item .action-button button .fa {
3384
+ margin-right: 8px;
3385
+ }
3386
+
3387
+ #aioseop-admin-addons .addon-item .action-button button .fa.fa-spinner {
3388
+ margin-right: 0;
3389
+ }
3390
+
3391
+ #aioseop-admin-addons .addon-item .action-button button.status-active .fa {
3392
+ color: #2a9b39;
3393
+ }
3394
+
3395
+ #aioseop-admin-addons .addon-item .action-button button.status-inactive .fa {
3396
+ color: red;
3397
+ }
3398
+
3399
+ #aioseop-admin-addons .addon-item .action-button button.status-download .fa {
3400
+ color: #999;
3401
+ }
3402
+
3403
+ #aioseop-admin-addons .addon-item .action-button button.disabled {
3404
+ cursor: default;
3405
+ }
3406
+
3407
+ #aioseop-admin-addons .addon-item .action-button button.loading .fa {
3408
+ color: #666;
3409
+ }
3410
+
3411
+
3412
+ /*
3413
+ 'xs-phone': 320px,
3414
+ 'phone': 600px,
3415
+ 'ipad': 768px,
3416
+ 'tablet': 782px,
3417
+ 'desktop': 960px,
3418
+ */
3419
+
3420
+ #aioseop-admin-about *,
3421
+ #aioseop-admin-about *::before,
3422
+ #aioseop-admin-about *::after {
3423
+ -webkit-box-sizing: border-box;
3424
+ -moz-box-sizing: border-box;
3425
+ box-sizing: border-box;
3426
+ }
3427
+
3428
+ #aioseop-admin-about .aioseop-admin-about-section {
3429
+ margin: 20px 20px;
3430
+ padding: 30px;
3431
+ background: #fff;
3432
+ border: 1px solid #DDDDDD;
3433
+ line-height: 2;
3434
+ }
3435
+
3436
+ #aioseop-admin-about .aioseop-admin-about-section h1,
3437
+ #aioseop-admin-about .aioseop-admin-about-section h2,
3438
+ #aioseop-admin-about .aioseop-admin-about-section h3,
3439
+ #aioseop-admin-about .aioseop-admin-about-section h4,
3440
+ #aioseop-admin-about .aioseop-admin-about-section h5 {
3441
+ margin-top: 0;
3442
+ padding-top: 0;
3443
+ line-height: 1.6;
3444
+ }
3445
+
3446
+ #aioseop-admin-about .aioseop-admin-about-section h2 {
3447
+ font-size: 24px;
3448
+ }
3449
+
3450
+ #aioseop-admin-about .aioseop-admin-about-section h3 {
3451
+ font-size: 18px;
3452
+ margin-bottom: 30px;
3453
+ color: #23282C;
3454
+ }
3455
+
3456
+ #aioseop-admin-about .aioseop-admin-about-section ul,
3457
+ #aioseop-admin-about .aioseop-admin-about-section p {
3458
+ font-size: 16px;
3459
+ }
3460
+
3461
+ #aioseop-admin-about .aioseop-admin-about-section p {
3462
+ margin-bottom: 20px;
3463
+ }
3464
+
3465
+ #aioseop-admin-about .aioseop-admin-about-section p.bigger {
3466
+ font-size: 18px;
3467
+ }
3468
+
3469
+ #aioseop-admin-about .aioseop-admin-about-section p.smaller {
3470
+ font-size: 14px;
3471
+ }
3472
+
3473
+ #aioseop-admin-about .aioseop-admin-about-section p:last-child {
3474
+ margin-bottom: 0;
3475
+ }
3476
+
3477
+ #aioseop-admin-about .aioseop-admin-about-section hr {
3478
+ margin: 30px 0;
3479
+ }
3480
+
3481
+ #aioseop-admin-about .aioseop-admin-about-section figure {
3482
+ margin: 0;
3483
+ }
3484
+
3485
+ #aioseop-admin-about .aioseop-admin-about-section figure img {
3486
+ width: 100%;
3487
+ }
3488
+
3489
+ #aioseop-admin-about .aioseop-admin-about-section figure figcaption {
3490
+ font-size: 14px;
3491
+ color: #888888;
3492
+ margin-top: 5px;
3493
+ text-align: center;
3494
+ line-height: initial;
3495
+ }
3496
+
3497
+ #aioseop-admin-about .aioseop-admin-about-section .aioseop-admin-column-40 {
3498
+ padding-left: 15px;
3499
+ }
3500
+
3501
+ @media (max-width: 767px) {
3502
+ #aioseop-admin-about .aioseop-admin-about-section .aioseop-admin-column-40 {
3503
+ width: 100%;
3504
+ padding-left: 0;
3505
+ padding-top: 20px;
3506
+ }
3507
+ }
3508
+
3509
+ #aioseop-admin-about .aioseop-admin-about-section .aioseop-admin-column-60 {
3510
+ padding-right: 15px;
3511
+ }
3512
+
3513
+ @media (max-width: 767px) {
3514
+ #aioseop-admin-about .aioseop-admin-about-section .aioseop-admin-column-60 {
3515
+ width: 100%;
3516
+ padding-right: 0;
3517
+ }
3518
+ }
3519
+
3520
+ #aioseop-admin-about .aioseop-admin-about-section ul.list-plain {
3521
+ margin-top: 0;
3522
+ margin-bottom: 0;
3523
+ }
3524
+
3525
+ #aioseop-admin-about .aioseop-admin-about-section ul.list-plain li {
3526
+ margin-bottom: 0;
3527
+ }
3528
+
3529
+ #aioseop-admin-about .aioseop-admin-about-section ul.list-features li .fa {
3530
+ color: #2a9b39;
3531
+ margin: 0 8px 0 0;
3532
+ }
3533
+
3534
+ #aioseop-admin-about .aioseop-admin-about-section .fa-star {
3535
+ color: gold;
3536
+ }
3537
+
3538
+ #aioseop-admin-about .aioseop-admin-about-section .no-margin {
3539
+ margin: 0 !important;
3540
+ }
3541
+
3542
+ #aioseop-admin-about .aioseop-admin-about-section .no-padding {
3543
+ padding: 0 !important;
3544
+ }
3545
+
3546
+ #aioseop-admin-about .aioseop-admin-about-section .centered {
3547
+ text-align: center !important;
3548
+ }
3549
+
3550
+ #aioseop-admin-about .aioseop-admin-about-section-first-form {
3551
+ display: flex;
3552
+ }
3553
+
3554
+ @media (max-width: 767px) {
3555
+ #aioseop-admin-about .aioseop-admin-about-section-first-form {
3556
+ display: block !important;
3557
+ }
3558
+ }
3559
+
3560
+ #aioseop-admin-about .aioseop-admin-about-section-first-form .aioseop-admin-about-section-first-form-text {
3561
+ flex: 1;
3562
+ padding-right: 30px;
3563
+ }
3564
+
3565
+ @media (max-width: 767px) {
3566
+ #aioseop-admin-about .aioseop-admin-about-section-first-form .aioseop-admin-about-section-first-form-text {
3567
+ flex: none;
3568
+ }
3569
+ }
3570
+
3571
+ #aioseop-admin-about .aioseop-admin-about-section-first-form .aioseop-admin-about-section-first-form-video iframe {
3572
+ border: 1px solid #DDDDDD;
3573
+ }
3574
+
3575
+ @media (max-width: 767px) {
3576
+ #aioseop-admin-about .aioseop-admin-about-section-first-form .aioseop-admin-about-section-first-form-video {
3577
+ padding-top: 20px;
3578
+ }
3579
+ }
3580
+
3581
+ #aioseop-admin-about .aioseop-admin-about-section-hero {
3582
+ padding: 0;
3583
+ }
3584
+
3585
+ #aioseop-admin-about .aioseop-admin-about-section-hero .aioseop-admin-about-section-hero-main,
3586
+ #aioseop-admin-about .aioseop-admin-about-section-hero .aioseop-admin-about-section-hero-extra {
3587
+ padding: 30px;
3588
+ }
3589
+
3590
+ @media (max-width: 767px) {
3591
+ #aioseop-admin-about .aioseop-admin-about-section-hero .aioseop-admin-about-section-hero-extra .aioseop-admin-column-50 {
3592
+ float: none;
3593
+ width: 100%;
3594
+ }
3595
+ }
3596
+
3597
+ #aioseop-admin-about .aioseop-admin-about-section-hero .aioseop-admin-about-section-hero-main {
3598
+ background-color: #FAFAFA;
3599
+ border-bottom: 1px solid #DDDDDD;
3600
+ }
3601
+
3602
+ #aioseop-admin-about .aioseop-admin-about-section-hero .aioseop-admin-about-section-hero-main.no-border {
3603
+ border-bottom: 0;
3604
+ }
3605
+
3606
+ #aioseop-admin-about .aioseop-admin-about-section-hero .aioseop-admin-about-section-hero-main p {
3607
+ color: #666;
3608
+ }
3609
+
3610
+ #aioseop-admin-about .aioseop-admin-about-section-hero h3.call-to-action {
3611
+ margin-bottom: -10px;
3612
+ }
3613
+
3614
+ #aioseop-admin-about .aioseop-admin-about-section-hero span.price-20-off {
3615
+ color: #6AB255;
3616
+ }
3617
+
3618
+ #aioseop-admin-about .aioseop-admin-about-section-squashed {
3619
+ margin-bottom: 0;
3620
+ }
3621
+
3622
+ #aioseop-admin-about .aioseop-admin-about-section-squashed:not(:last-of-type) {
3623
+ border-bottom: 0;
3624
+ }
3625
+
3626
+ #aioseop-admin-about .aioseop-admin-about-section-post h2 {
3627
+ margin-bottom: -10px;
3628
+ }
3629
+
3630
+ #aioseop-admin-about .aioseop-admin-about-section-post h3 {
3631
+ margin-bottom: 15px;
3632
+ }
3633
+
3634
+ #aioseop-admin-about .aioseop-admin-about-section-post p:last-of-type {
3635
+ margin-bottom: 30px;
3636
+ }
3637
+
3638
+ #aioseop-admin-about .aioseop-admin-about-section-post .aioseop-admin-column-20 {
3639
+ padding-right: 20px;
3640
+ width: auto;
3641
+ }
3642
+
3643
+ #aioseop-admin-about .aioseop-admin-about-section-post .aioseop-admin-column-20 img {
3644
+ width: 270px;
3645
+ }
3646
+
3647
+ @media (max-width: 767px) {
3648
+ #aioseop-admin-about .aioseop-admin-about-section-post .aioseop-admin-column-20 {
3649
+ width: 20%;
3650
+ }
3651
+ #aioseop-admin-about .aioseop-admin-about-section-post .aioseop-admin-column-20 img {
3652
+ width: auto;
3653
+ max-width: 100%;
3654
+ }
3655
+ }
3656
+
3657
+ #aioseop-admin-about .aioseop-admin-about-section-post .aioseop-admin-column-80 {
3658
+ padding-left: 20px;
3659
+ width: calc(100% - 20px - 270px);
3660
+ }
3661
+
3662
+ @media (max-width: 767px) {
3663
+ #aioseop-admin-about .aioseop-admin-about-section-post .aioseop-admin-column-80 {
3664
+ width: 80%;
3665
+ }
3666
+ }
3667
+
3668
+ #aioseop-admin-about .aioseop-admin-about-section-post .aioseop-admin-about-section-post-link {
3669
+ padding: 10px 15px;
3670
+ background-color: #DF7739;
3671
+ color: #fff;
3672
+ border-radius: 3px;
3673
+ text-decoration: none;
3674
+ margin-top: 15px;
3675
+ font-size: 14px;
3676
+ }
3677
+
3678
+ #aioseop-admin-about .aioseop-admin-about-section-post .aioseop-admin-about-section-post-link:hover {
3679
+ background-color: #B85A1B;
3680
+ }
3681
+
3682
+ #aioseop-admin-about .aioseop-admin-about-section-post .aioseop-admin-about-section-post-link .fa {
3683
+ color: #EDBA9E;
3684
+ vertical-align: middle;
3685
+ margin-left: 8px;
3686
+ }
3687
+
3688
+ #aioseop-admin-about .aioseop-admin-about-section-table table {
3689
+ border-collapse: collapse;
3690
+ }
3691
+
3692
+ #aioseop-admin-about .aioseop-admin-about-section-table table tr td {
3693
+ border-bottom: 1px solid #DDDDDD;
3694
+ border-right: 1px solid #DDDDDD;
3695
+ padding: 30px;
3696
+ vertical-align: top;
3697
+ }
3698
+
3699
+ #aioseop-admin-about .aioseop-admin-about-section-table table tr td:last-of-type {
3700
+ border-right: 0;
3701
+ }
3702
+
3703
+ #aioseop-admin-about .aioseop-admin-about-section-table table tr:last-child td {
3704
+ border-bottom: none;
3705
+ }
3706
+
3707
+ #aioseop-admin-about .aioseop-admin-about-section-table table p {
3708
+ background-repeat: no-repeat;
3709
+ background-size: 15px auto;
3710
+ background-position: 0 6px;
3711
+ margin: 0;
3712
+ }
3713
+
3714
+ #aioseop-admin-about .aioseop-admin-about-section-table table p.features-full {
3715
+ padding-left: 30px;
3716
+ background-image: url(../../images/about/icon-full.svg);
3717
+ }
3718
+
3719
+ #aioseop-admin-about .aioseop-admin-about-section-table table p.features-none {
3720
+ padding-left: 30px;
3721
+ background-image: url(../../images/about/icon-none.svg);
3722
+ }
3723
+
3724
+ #aioseop-admin-about .aioseop-admin-about-section-table table p.features-partial {
3725
+ padding-left: 30px;
3726
+ background-position: -3px 0;
3727
+ background-size: 23px auto;
3728
+ background-image: url(../../images/about/icon-partial.svg);
3729
+ }
3730
+
3731
+ #aioseop-admin-about .aioseop-admin-about-section-table .aioseop-admin-about-section-hero-main {
3732
+ padding: 0;
3733
+ }
3734
+
3735
+ #aioseop-admin-about .aioseop-admin-about-section-table .aioseop-admin-about-section-hero-main h3 {
3736
+ padding: 30px 30px 30px 60px;
3737
+ }
3738
+
3739
+ #aioseop-admin-about .aioseop-admin-about-section-table .aioseop-admin-about-section-hero-main .aioseop-admin-column-33:first-child h3 {
3740
+ padding: 30px;
3741
+ }
3742
+
3743
+ #aioseop-admin-about #aioseop-admin-addons {
3744
+ padding: 0 30px;
3745
+ }
3746
+
3747
+ #aioseop-admin-about #aioseop-admin-addons .addon-container {
3748
+ padding: 0 10px;
3749
+ }
3750
+
3751
+ #aioseop-admin-about #aioseop-admin-addons .addon-item .details {
3752
+ padding: 20px;
3753
+ }
3754
+
3755
+ #aioseop-admin-about #aioseop-admin-addons .addon-item img {
3756
+ padding: 10px;
3757
+ }
3758
+
3759
+ #aioseop-admin-about #aioseop-admin-addons .addon-item img[src*="-mi"] {
3760
+ padding: 13px;
3761
+ }
3762
+
3763
+ #aioseop-admin-about #aioseop-admin-addons .addon-item .action-button .button {
3764
+ display: inline-block;
3765
+ text-decoration: none;
3766
+ font-size: 13px;
3767
+ line-height: 26px;
3768
+ height: 28px;
3769
+ margin: 0;
3770
+ padding: 0 10px 1px;
3771
+ cursor: pointer;
3772
+ -webkit-appearance: none;
3773
+ border-radius: 3px;
3774
+ border: 1px solid #cccccc;
3775
+ background: #f7f7f7;
3776
+ box-shadow: 0 1px 0 #cccccc;
3777
+ font-weight: normal;
3778
+ }
3779
+
3780
+ #aioseop-admin-about #aioseop-admin-addons .addon-item .action-button .button:hover,
3781
+ #aioseop-admin-about #aioseop-admin-addons .addon-item .action-button .button:focus {
3782
+ background: #fafafa;
3783
+ border-color: #999;
3784
+ color: #23282d;
3785
+ }
3786
+
3787
+ #aioseop-admin-about #aioseop-admin-addons .addon-item .action-button .button.button-primary {
3788
+ background: #0085ba;
3789
+ border-color: #0073aa #006799 #006799;
3790
+ box-shadow: 0 1px 0 #006799;
3791
+ color: #fff;
3792
+ text-shadow: 0 -1px 1px #006799, 1px 0 1px #006799, 0 1px 1px #006799, -1px 0 1px #006799;
3793
+ }
3794
+
3795
+ #aioseop-admin-about #aioseop-admin-addons .addon-item .action-button .button.button-primary:hover,
3796
+ #aioseop-admin-about #aioseop-admin-addons .addon-item .action-button .button.button-primary:focus {
3797
+ background: #008ec2;
3798
+ border-color: #006799;
3799
+ color: #fff;
3800
+ }
3801
+
3802
+ #aioseop-admin-about #aioseop-admin-addons .addon-item .action-button .button.button-primary .fa-spinner {
3803
+ color: #fff;
3804
+ }
3805
+
3806
+ #aioseop-admin-about #aioseop-admin-addons .addon-item .action-button .button.button-secondary {
3807
+ color: #555;
3808
+ border-color: #cccccc;
3809
+ background: #f7f7f7;
3810
+ box-shadow: 0 1px 0 #cccccc;
3811
+ }
3812
+
3813
+ #aioseop-admin-about #aioseop-admin-addons .addon-item .action-button .button.button-secondary:hover,
3814
+ #aioseop-admin-about #aioseop-admin-addons .addon-item .action-button .button.button-secondary:focus {
3815
+ background: #fafafa;
3816
+ border-color: #999;
3817
+ color: #23282d;
3818
+ }
3819
+
3820
+ #aioseop-admin-about #aioseop-admin-addons .addon-item .action-button .button.disabled {
3821
+ cursor: default;
3822
+ }
3823
+
3824
+ @media (min-width: 1250px) {
3825
+ #aioseop-admin-community .item {
3826
+ width: calc(33.3333333% - 13.3333333px);
3827
+ }
3828
+ #aioseop-admin-community .item:nth-child(3n) {
3829
+ margin-right: 0;
3830
+ }
3831
+ }
3832
+
3833
+ @media (max-width: 1249px) {
3834
+ #aioseop-admin-community .item {
3835
+ width: calc(50% - 10px);
3836
+ }
3837
+ #aioseop-admin-community .item:nth-child(2n) {
3838
+ margin-right: 0;
3839
+ }
3840
+ }
3841
+
3842
+ @media (max-width: 767px) {
3843
+ #aioseop-admin-community .item {
3844
+ width: 100%;
3845
+ margin-right: 0;
3846
+ }
3847
+ }
3848
+
3849
+ #aioseop-admin-community *,
3850
+ #aioseop-admin-community *::before,
3851
+ #aioseop-admin-community *::after {
3852
+ -webkit-box-sizing: border-box;
3853
+ -moz-box-sizing: border-box;
3854
+ box-sizing: border-box;
3855
+ }
3856
+
3857
+ #aioseop-admin-community .items {
3858
+ display: flex;
3859
+ flex-wrap: wrap;
3860
+ margin: 20px;
3861
+ }
3862
+
3863
+ #aioseop-admin-community .item {
3864
+ border: 1px solid #DDDDDD;
3865
+ margin: 0 20px 20px 0;
3866
+ background-color: #ffffff;
3867
+ position: relative;
3868
+ }
3869
+
3870
+ #aioseop-admin-community .item-cover {
3871
+ width: 100%;
3872
+ height: 223px;
3873
+ position: relative;
3874
+ display: block;
3875
+ }
3876
+
3877
+ #aioseop-admin-community .item-img {
3878
+ width: auto;
3879
+ height: auto;
3880
+ max-width: 100px;
3881
+ max-height: 100px;
3882
+ position: absolute;
3883
+ top: 0;
3884
+ bottom: 0;
3885
+ left: 0;
3886
+ right: 0;
3887
+ margin: auto;
3888
+ }
3889
+
3890
+ #aioseop-admin-community .item-title {
3891
+ margin: 17px 20px 10px 20px;
3892
+ font-size: 16px;
3893
+ }
3894
+
3895
+ #aioseop-admin-community .item-description {
3896
+ margin: 0 20px 98px 20px;
3897
+ font-size: 14px;
3898
+ }
3899
+
3900
+ #aioseop-admin-community .item-footer {
3901
+ position: absolute;
3902
+ width: 100%;
3903
+ bottom: 0;
3904
+ padding: 20px;
3905
+ border-top: 1px solid #dddddd;
3906
+ background-color: #F7F7F7;
3907
+ }
3908
+
3909
+ #aioseop-admin-community .button {
3910
+ background-color: #1c75a6;
3911
+ color: #ffffff;
3912
+ font-weight: bold;
3913
+ -webkit-box-shadow: inset 0px -2px 0px 0px #0e6897;
3914
+ -moz-box-shadow: inset 0px -2px 0px 0px #0e6897;
3915
+ box-shadow: inset 0px -2px 0px 0px #0e6897;
3916
+ border: 1px solid #0e6897;
3917
+ padding: 12px;
3918
+ height: auto;
3919
+ line-height: 13px;
3920
+ text-shadow: 1px 1px 1.5px rgba(0, 0, 0, 0.35);
3921
+ }
3922
+
3923
+ #aioseop-admin-community .button:hover {
3924
+ background: #008ec2;
3925
+ border-color: #006799;
3926
+ }
3927
+
3928
+ .aioseop-admin-plugin-landing .notice {
3929
+ display: none !important;
3930
+ }
3931
+
3932
+ .aioseop-admin-plugin-landing .loader {
3933
+ margin: 0 auto;
3934
+ position: relative;
3935
+ text-indent: -9999em;
3936
+ border-top: 4px solid #969696;
3937
+ border-right: 4px solid #969696;
3938
+ border-bottom: 4px solid #969696;
3939
+ border-left: 4px solid #404040;
3940
+ -webkit-transform: translateZ(0);
3941
+ -ms-transform: translateZ(0);
3942
+ transform: translateZ(0);
3943
+ -webkit-animation: load8 1.1s infinite linear;
3944
+ animation: load8 1.1s infinite linear;
3945
+ background-color: transparent;
3946
+ }
3947
+
3948
+ .aioseop-admin-plugin-landing .loader,
3949
+ .aioseop-admin-plugin-landing .loader:after {
3950
+ display: block;
3951
+ border-radius: 50%;
3952
+ width: 50px;
3953
+ height: 50px;
3954
+ }
3955
+
3956
+ @-webkit-keyframes load8 {
3957
+ 0% {
3958
+ -webkit-transform: rotate(0deg);
3959
+ transform: rotate(0deg);
3960
+ }
3961
+ 100% {
3962
+ -webkit-transform: rotate(360deg);
3963
+ transform: rotate(360deg);
3964
+ }
3965
+ }
3966
+
3967
+ @keyframes load8 {
3968
+ 0% {
3969
+ -webkit-transform: rotate(0deg);
3970
+ transform: rotate(0deg);
3971
+ }
3972
+ 100% {
3973
+ -webkit-transform: rotate(360deg);
3974
+ transform: rotate(360deg);
3975
+ }
3976
+ }
3977
+
3978
+ #aioseop-admin-smtp {
3979
+ width: 700px;
3980
+ margin: 0 auto;
3981
+ }
3982
+
3983
+ #aioseop-admin-smtp *,
3984
+ #aioseop-admin-smtp *::before,
3985
+ #aioseop-admin-smtp *::after {
3986
+ -webkit-box-sizing: border-box;
3987
+ -moz-box-sizing: border-box;
3988
+ box-sizing: border-box;
3989
+ }
3990
+
3991
+ #aioseop-admin-smtp section {
3992
+ margin: 50px 0;
3993
+ text-align: left;
3994
+ clear: both;
3995
+ }
3996
+
3997
+ #aioseop-admin-smtp p {
3998
+ font-size: 15px;
3999
+ }
4000
+
4001
+ #aioseop-admin-smtp .top {
4002
+ text-align: center;
4003
+ }
4004
+
4005
+ #aioseop-admin-smtp .top img {
4006
+ margin-bottom: 38px;
4007
+ }
4008
+
4009
+ #aioseop-admin-smtp .top h1 {
4010
+ font-size: 26px;
4011
+ font-weight: 600;
4012
+ margin-bottom: 0;
4013
+ padding: 0;
4014
+ }
4015
+
4016
+ #aioseop-admin-smtp .top p {
4017
+ font-size: 17px;
4018
+ color: #777777;
4019
+ margin-top: .5em;
4020
+ }
4021
+
4022
+ #aioseop-admin-smtp .top .updated {
4023
+ display: none;
4024
+ }
4025
+
4026
+ #aioseop-admin-smtp .screenshot>* {
4027
+ vertical-align: middle;
4028
+ }
4029
+
4030
+ #aioseop-admin-smtp .screenshot .cont {
4031
+ display: inline-block;
4032
+ position: relative;
4033
+ width: 315px;
4034
+ padding: 5px;
4035
+ background-color: #ffffff;
4036
+ -webkit-box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.05);
4037
+ -moz-box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.05);
4038
+ box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.05);
4039
+ border-radius: 3px;
4040
+ }
4041
+
4042
+ #aioseop-admin-smtp .screenshot .cont img {
4043
+ max-width: 100%;
4044
+ display: block;
4045
+ }
4046
+
4047
+ #aioseop-admin-smtp .screenshot .cont .hover {
4048
+ position: absolute;
4049
+ opacity: 0;
4050
+ height: 100%;
4051
+ width: 100%;
4052
+ top: 0;
4053
+ left: 0;
4054
+ border: 5px solid #ffffff;
4055
+ background-color: rgba(0, 0, 0, 0.15);
4056
+ background-image: url("../images/zoom.svg");
4057
+ background-repeat: no-repeat;
4058
+ background-position: center;
4059
+ background-size: 50px;
4060
+ transition: all 0.3s;
4061
+ }
4062
+
4063
+ #aioseop-admin-smtp .screenshot .cont:hover .hover {
4064
+ opacity: 1;
4065
+ transition: all 0.3s;
4066
+ }
4067
+
4068
+ #aioseop-admin-smtp .screenshot ul {
4069
+ display: inline-block;
4070
+ margin: 0 0 0 30px;
4071
+ list-style-type: none;
4072
+ max-width: calc(100% - 350px);
4073
+ }
4074
+
4075
+ #aioseop-admin-smtp .screenshot li {
4076
+ margin: 16px 0;
4077
+ padding: 0 0 0 24px;
4078
+ font-size: 15px;
4079
+ background-image: url("../images/arrow-right.svg");
4080
+ background-position: left 3px;
4081
+ background-repeat: no-repeat;
4082
+ background-size: 14px;
4083
+ color: #777777;
4084
+ }
4085
+
4086
+ #aioseop-admin-smtp .step {
4087
+ background-color: #F9F9F9;
4088
+ -webkit-box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.05);
4089
+ -moz-box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.05);
4090
+ box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.05);
4091
+ border: 1px solid #E5E5E5;
4092
+ margin: 0 0 25px 0;
4093
+ }
4094
+
4095
+ #aioseop-admin-smtp .step>* {
4096
+ vertical-align: middle;
4097
+ }
4098
+
4099
+ #aioseop-admin-smtp .step .num {
4100
+ display: inline-block;
4101
+ position: relative;
4102
+ width: 100px;
4103
+ height: 50px;
4104
+ text-align: center;
4105
+ }
4106
+
4107
+ #aioseop-admin-smtp .step .loader {
4108
+ margin-top: -54px;
4109
+ transition: all .3s;
4110
+ opacity: 1;
4111
+ }
4112
+
4113
+ #aioseop-admin-smtp .step div {
4114
+ display: inline-block;
4115
+ width: calc(100% - 104px);
4116
+ background-color: #ffffff;
4117
+ padding: 30px;
4118
+ border-left: 1px solid #eeeeee;
4119
+ }
4120
+
4121
+ #aioseop-admin-smtp .step h2 {
4122
+ font-size: 24px;
4123
+ line-height: 22px;
4124
+ margin-top: 0;
4125
+ margin-bottom: 15px;
4126
+ }
4127
+
4128
+ #aioseop-admin-smtp .step p {
4129
+ font-size: 16px;
4130
+ color: #777777;
4131
+ }
4132
+
4133
+ #aioseop-admin-smtp .step .error {
4134
+ font-size: 14px;
4135
+ color: #b97474;
4136
+ margin-bottom: 0;
4137
+ }
4138
+
4139
+ #aioseop-admin-smtp .step .button {
4140
+ background-color: #007cba;
4141
+ color: #ffffff;
4142
+ font-weight: 500;
4143
+ box-shadow: none;
4144
+ padding: 12px;
4145
+ min-width: 200px;
4146
+ height: auto;
4147
+ line-height: 13px;
4148
+ text-align: center;
4149
+ font-size: 15px;
4150
+ border: none;
4151
+ transition: all .3s;
4152
+ }
4153
+
4154
+ #aioseop-admin-smtp .step .button:hover {
4155
+ background: #0071a1;
4156
+ }
4157
+
4158
+ #aioseop-admin-smtp .step .button.grey {
4159
+ background: #F6F6F6;
4160
+ border: 1px solid #dddddd;
4161
+ text-shadow: none;
4162
+ color: #9FA5AA;
4163
+ }
4164
+
4165
+ #aioseop-admin-smtp .step .button.disabled {
4166
+ cursor: default;
4167
+ }
4168
+
4169
+ #aioseop-admin-smtp .step .hidden {
4170
+ opacity: 0;
4171
+ transition: all .3s;
4172
+ }
4173
+
4174
+ #aioseop-admin-smtp .grey {
4175
+ opacity: 0.5;
4176
+ }
4177
+
4178
+ @media (max-width: 767px) {
4179
+ #aioseop-admin-smtp {
4180
+ width: auto;
4181
+ margin: 0 20px;
4182
+ }
4183
+ #aioseop-admin-smtp .screenshot .cont {
4184
+ width: auto;
4185
+ }
4186
+ #aioseop-admin-smtp .screenshot ul {
4187
+ margin: 20px 0 0 15px;
4188
+ max-width: 100%;
4189
+ }
4190
+ #aioseop-admin-smtp .button {
4191
+ white-space: normal;
4192
+ }
4193
+ }
4194
+
4195
+ #aioseop-admin-analytics {
4196
+ width: 700px;
4197
+ margin: 0 auto;
4198
+ }
4199
+
4200
+ #aioseop-admin-analytics *,
4201
+ #aioseop-admin-analytics *::before,
4202
+ #aioseop-admin-analytics *::after {
4203
+ -webkit-box-sizing: border-box;
4204
+ -moz-box-sizing: border-box;
4205
+ box-sizing: border-box;
4206
+ }
4207
+
4208
+ #aioseop-admin-analytics section {
4209
+ margin: 50px 0;
4210
+ text-align: left;
4211
+ clear: both;
4212
+ }
4213
+
4214
+ #aioseop-admin-analytics p {
4215
+ font-size: 15px;
4216
+ }
4217
+
4218
+ #aioseop-admin-analytics .top {
4219
+ text-align: center;
4220
+ }
4221
+
4222
+ #aioseop-admin-analytics .top img {
4223
+ margin-bottom: 38px;
4224
+ }
4225
+
4226
+ #aioseop-admin-analytics .top h1 {
4227
+ font-size: 26px;
4228
+ font-weight: 600;
4229
+ margin-bottom: 0;
4230
+ padding: 0;
4231
+ }
4232
+
4233
+ #aioseop-admin-analytics .top p {
4234
+ font-size: 17px;
4235
+ color: #777777;
4236
+ margin-top: .5em;
4237
+ }
4238
+
4239
+ #aioseop-admin-analytics .top .updated {
4240
+ display: none;
4241
+ }
4242
+
4243
+ #aioseop-admin-analytics .screenshot>* {
4244
+ vertical-align: middle;
4245
+ }
4246
+
4247
+ #aioseop-admin-analytics .screenshot .cont {
4248
+ display: inline-block;
4249
+ position: relative;
4250
+ width: 315px;
4251
+ padding: 5px;
4252
+ background-color: #ffffff;
4253
+ -webkit-box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.05);
4254
+ -moz-box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.05);
4255
+ box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.05);
4256
+ border-radius: 3px;
4257
+ }
4258
+
4259
+ #aioseop-admin-analytics .screenshot .cont img {
4260
+ max-width: 100%;
4261
+ }
4262
+
4263
+ #aioseop-admin-analytics .screenshot .cont .hover {
4264
+ position: absolute;
4265
+ opacity: 0;
4266
+ height: 100%;
4267
+ width: 100%;
4268
+ top: 0;
4269
+ left: 0;
4270
+ border: 5px solid #ffffff;
4271
+ background-color: rgba(0, 0, 0, 0.15);
4272
+ background-image: url("../images/zoom.svg");
4273
+ background-repeat: no-repeat;
4274
+ background-position: center;
4275
+ background-size: 50px;
4276
+ transition: all 0.3s;
4277
+ }
4278
+
4279
+ #aioseop-admin-analytics .screenshot .cont:hover .hover {
4280
+ opacity: 1;
4281
+ transition: all 0.3s;
4282
+ }
4283
+
4284
+ #aioseop-admin-analytics .screenshot ul {
4285
+ display: inline-block;
4286
+ margin-left: 30px;
4287
+ list-style-type: none;
4288
+ }
4289
+
4290
+ #aioseop-admin-analytics .screenshot li {
4291
+ margin: 16px 0;
4292
+ padding: 0 0 0 24px;
4293
+ font-size: 15px;
4294
+ background-image: url("../images/arrow-right.svg");
4295
+ background-position: left center;
4296
+ background-repeat: no-repeat;
4297
+ background-size: 14px;
4298
+ color: #777777;
4299
+ }
4300
+
4301
+ #aioseop-admin-analytics .step {
4302
+ background-color: #F9F9F9;
4303
+ -webkit-box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.05);
4304
+ -moz-box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.05);
4305
+ box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.05);
4306
+ border: 1px solid #E5E5E5;
4307
+ margin: 0 0 25px 0;
4308
+ }
4309
+
4310
+ #aioseop-admin-analytics .step>* {
4311
+ vertical-align: middle;
4312
+ }
4313
+
4314
+ #aioseop-admin-analytics .step .num {
4315
+ display: inline-block;
4316
+ position: relative;
4317
+ width: 100px;
4318
+ height: 50px;
4319
+ text-align: center;
4320
+ }
4321
+
4322
+ #aioseop-admin-analytics .step .loader {
4323
+ margin-top: -54px;
4324
+ transition: all .3s;
4325
+ opacity: 1;
4326
+ }
4327
+
4328
+ #aioseop-admin-analytics .step div {
4329
+ display: inline-block;
4330
+ width: calc(100% - 104px);
4331
+ background-color: #ffffff;
4332
+ padding: 30px;
4333
+ border-left: 1px solid #eeeeee;
4334
+ }
4335
+
4336
+ #aioseop-admin-analytics .step h2 {
4337
+ font-size: 24px;
4338
+ margin-top: 0;
4339
+ margin-bottom: 15px;
4340
+ }
4341
+
4342
+ #aioseop-admin-analytics .step p {
4343
+ font-size: 16px;
4344
+ color: #777777;
4345
+ }
4346
+
4347
+ #aioseop-admin-analytics .step .error {
4348
+ font-size: 14px;
4349
+ color: #b97474;
4350
+ margin-bottom: 0;
4351
+ }
4352
+
4353
+ #aioseop-admin-analytics .step .button {
4354
+ background-color: #007cba;
4355
+ color: #ffffff;
4356
+ font-weight: 500;
4357
+ padding: 12px;
4358
+ min-width: 200px;
4359
+ height: auto;
4360
+ line-height: 13px;
4361
+ text-align: center;
4362
+ font-size: 15px;
4363
+ border: none;
4364
+ transition: all .3s;
4365
+ }
4366
+
4367
+ #aioseop-admin-analytics .step .button:hover {
4368
+ background: #0071a1;
4369
+ }
4370
+
4371
+ #aioseop-admin-analytics .step .button.grey {
4372
+ background: #F6F6F6;
4373
+ border: 1px solid #dddddd;
4374
+ box-shadow: none;
4375
+ text-shadow: none;
4376
+ color: #9FA5AA;
4377
+ }
4378
+
4379
+ #aioseop-admin-analytics .step .button.disabled {
4380
+ cursor: default;
4381
+ }
4382
+
4383
+ #aioseop-admin-analytics .step .hidden {
4384
+ opacity: 0;
4385
+ transition: all .3s;
4386
+ }
4387
+
4388
+ #aioseop-admin-analytics .grey {
4389
+ opacity: 0.5;
4390
+ }
4391
+
4392
+ @media (max-width: 767px) {
4393
+ #aioseop-admin-analytics {
4394
+ width: auto;
4395
+ margin: 0 20px;
4396
+ }
4397
+ #aioseop-admin-analytics .screenshot .cont {
4398
+ width: auto;
4399
+ }
4400
+ #aioseop-admin-analytics .button {
4401
+ white-space: normal;
4402
+ }
4403
+ }
4404
+
4405
+ .aioseop-admin-settings *,
4406
+ .aioseop-admin-settings *::before,
4407
+ .aioseop-admin-settings *::after {
4408
+ -webkit-box-sizing: border-box;
4409
+ -moz-box-sizing: border-box;
4410
+ box-sizing: border-box;
4411
+ }
4412
+
4413
+ .aioseop-admin-settings .aioseop-setting-row {
4414
+ border-bottom: 1px solid #e4e4e4;
4415
+ padding: 30px 0;
4416
+ font-size: 14px;
4417
+ line-height: 1.3;
4418
+ }
4419
+
4420
+ .aioseop-admin-settings .aioseop-setting-row:first-of-type {
4421
+ padding-top: 10px !important;
4422
+ }
4423
+
4424
+ @media (max-width: 781px) {
4425
+ .aioseop-admin-settings .aioseop-setting-row {
4426
+ padding: 20px 0;
4427
+ }
4428
+ }
4429
+
4430
+ .aioseop-admin-settings .aioseop-setting-row.section-heading {
4431
+ padding: 20px 0;
4432
+ }
4433
+
4434
+ .aioseop-admin-settings .aioseop-setting-row.section-heading.no-desc h4 {
4435
+ margin: 0;
4436
+ }
4437
+
4438
+ .aioseop-admin-settings .aioseop-setting-row.section-heading .aioseop-setting-field {
4439
+ margin: 0;
4440
+ max-width: 1000px;
4441
+ }
4442
+
4443
+ .aioseop-admin-settings .aioseop-setting-row.tools p,
4444
+ .aioseop-admin-settings .aioseop-setting-row.tools p:first-of-type {
4445
+ margin: 0 0 16px 0;
4446
+ }
4447
+
4448
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-checkbox input[type=checkbox] {
4449
+ float: left;
4450
+ margin: 1px 0 0 0;
4451
+ }
4452
+
4453
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-checkbox .desc {
4454
+ margin: 0 0 0 30px;
4455
+ }
4456
+
4457
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-license .aioseop-setting-label {
4458
+ padding-top: 8px;
4459
+ }
4460
+
4461
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-license p.type {
4462
+ margin-top: 12px;
4463
+ }
4464
+
4465
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-text .aioseop-setting-label,
4466
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-number .aioseop-setting-label {
4467
+ padding-top: 8px;
4468
+ }
4469
+
4470
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-select .aioseop-setting-label {
4471
+ padding-top: 8px;
4472
+ }
4473
+
4474
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-radio .aioseop-setting-field input[type=radio] {
4475
+ margin: -3px 10px 0 0;
4476
+ }
4477
+
4478
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-radio .aioseop-setting-field label {
4479
+ margin-right: 30px;
4480
+ display: inline-block;
4481
+ }
4482
+
4483
+ .aioseop-admin-settings .aioseop-setting-row#aioseop-setting-row-email-template .aioseop-setting-field label:before {
4484
+ content: " ";
4485
+ display: block;
4486
+ width: 155px;
4487
+ height: 180px;
4488
+ margin: 0 0 10px 0;
4489
+ }
4490
+
4491
+ .aioseop-admin-settings .aioseop-setting-row#aioseop-setting-row-email-template .aioseop-setting-field .option-default:before {
4492
+ background: url(../images/settings-email-html.png) center center;
4493
+ }
4494
+
4495
+ .aioseop-admin-settings .aioseop-setting-row#aioseop-setting-row-email-template .aioseop-setting-field .option-none:before {
4496
+ background: url(../images/settings-email-plaintext.png) center center;
4497
+ }
4498
+
4499
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-image .aioseop-setting-field img {
4500
+ display: block;
4501
+ margin: 0 0 20px 0;
4502
+ max-width: 400px;
4503
+ }
4504
+
4505
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-color .aioseop-color-picker {
4506
+ padding-left: 40px;
4507
+ }
4508
+
4509
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-color .minicolors-input-swatch {
4510
+ top: 7px;
4511
+ left: 7px;
4512
+ height: 21px;
4513
+ width: 21px;
4514
+ border-radius: 2px;
4515
+ }
4516
+
4517
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-columns {
4518
+ display: flex;
4519
+ }
4520
+
4521
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-columns .aioseop-setting-label {
4522
+ float: none;
4523
+ align-self: center;
4524
+ flex: 0 0 200px;
4525
+ }
4526
+
4527
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-columns .aioseop-setting-field {
4528
+ margin: 0;
4529
+ flex: 1;
4530
+ }
4531
+
4532
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-columns .aioseop-setting-columns {
4533
+ margin: 0;
4534
+ display: flex;
4535
+ flex-wrap: wrap;
4536
+ justify-content: space-between;
4537
+ }
4538
+
4539
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-columns .aioseop-setting-column {
4540
+ margin-right: 5px;
4541
+ flex-basis: 390px;
4542
+ }
4543
+
4544
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-columns .aioseop-setting-column>* {
4545
+ width: 100%;
4546
+ }
4547
+
4548
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-columns .aioseop-setting-column label {
4549
+ display: inline-block;
4550
+ margin-bottom: 10px;
4551
+ }
4552
+
4553
+ .aioseop-admin-settings .aioseop-setting-row.aioseop-setting-row-columns .aioseop-setting-column .desc {
4554
+ margin-bottom: 10px;
4555
+ }
4556
+
4557
+ .aioseop-admin-settings .aioseop-setting-row h5 {
4558
+ font-size: 16px;
4559
+ font-weight: 600;
4560
+ margin: 0 0 20px 0;
4561
+ }
4562
+
4563
+ .aioseop-admin-settings .aioseop-setting-row h4 {
4564
+ font-size: 20px;
4565
+ font-weight: 700;
4566
+ margin: 0 0 6px 0;
4567
+ }
4568
+
4569
+ .aioseop-admin-settings .aioseop-setting-row h3 {
4570
+ font-size: 24px;
4571
+ font-weight: 600;
4572
+ margin: 0 0 20px 0;
4573
+ }
4574
+
4575
+ .aioseop-admin-settings .aioseop-setting-row p {
4576
+ margin: 12px 0 0;
4577
+ font-size: 14px;
4578
+ line-height: 1.3;
4579
+ }
4580
+
4581
+ .aioseop-admin-settings .aioseop-setting-row p:first-of-type {
4582
+ margin: 8px 0 0;
4583
+ }
4584
+
4585
+ .aioseop-admin-settings .aioseop-setting-row p.desc {
4586
+ font-style: italic;
4587
+ color: #666;
4588
+ }
4589
+
4590
+ .aioseop-admin-settings .aioseop-setting-row p.discount-note {
4591
+ font-style: italic;
4592
+ color: #666;
4593
+ }
4594
+
4595
+ .aioseop-admin-settings .aioseop-setting-row p.discount-note strong {
4596
+ color: green;
4597
+ }
4598
+
4599
+ .aioseop-admin-settings .aioseop-setting-row input[type=text],
4600
+ .aioseop-admin-settings .aioseop-setting-row input[type=password],
4601
+ .aioseop-admin-settings .aioseop-setting-row input[type=number],
4602
+ .aioseop-admin-settings .aioseop-setting-row select {
4603
+ background-color: #fff;
4604
+ border: 1px solid #ddd;
4605
+ border-radius: 3px;
4606
+ box-shadow: none;
4607
+ color: #333;
4608
+ display: inline-block;
4609
+ vertical-align: middle;
4610
+ padding: 7px 12px;
4611
+ margin: 0 10px 0 0;
4612
+ width: 400px;
4613
+ min-height: 35px;
4614
+ line-height: 1.3;
4615
+ }
4616
+
4617
+ @media (max-width: 959px) {
4618
+ .aioseop-admin-settings .aioseop-setting-row input[type=text],
4619
+ .aioseop-admin-settings .aioseop-setting-row input[type=password],
4620
+ .aioseop-admin-settings .aioseop-setting-row input[type=number],
4621
+ .aioseop-admin-settings .aioseop-setting-row select {
4622
+ width: 300px;
4623
+ }
4624
+ }
4625
+
4626
+ .aioseop-admin-settings .aioseop-setting-row input[type=number] {
4627
+ width: 100px;
4628
+ }
4629
+
4630
+ .aioseop-admin-settings .aioseop-setting-row button {
4631
+ margin-right: 10px;
4632
+ }
4633
+
4634
+ .aioseop-admin-settings .aioseop-setting-row .choicesjs-select-wrap {
4635
+ display: block;
4636
+ max-width: 400px;
4637
+ }
4638
+
4639
+ @media (max-width: 959px) {
4640
+ .aioseop-admin-settings .aioseop-setting-row .choicesjs-select-wrap {
4641
+ width: 300px;
4642
+ }
4643
+ }
4644
+
4645
+ .aioseop-admin-settings .aioseop-setting-row .progress-bar {
4646
+ background: #fff;
4647
+ border: 1px solid #e27730;
4648
+ height: 30px;
4649
+ width: 100%;
4650
+ position: relative;
4651
+ border-radius: 3px;
4652
+ margin: 0 0 16px 0;
4653
+ }
4654
+
4655
+ .aioseop-admin-settings .aioseop-setting-row .progress-bar.complete {
4656
+ border: 1px solid #2a9b39;
4657
+ }
4658
+
4659
+ .aioseop-admin-settings .aioseop-setting-row .progress-bar.complete .bar {
4660
+ background-color: #2a9b39;
4661
+ }
4662
+
4663
+ .aioseop-admin-settings .aioseop-setting-row .progress-bar.complete .bar:after {
4664
+ content: none;
4665
+ display: none;
4666
+ }
4667
+
4668
+ .aioseop-admin-settings .aioseop-setting-row .progress-bar .bar {
4669
+ display: block;
4670
+ background: #e27730;
4671
+ height: 100%;
4672
+ left: 0;
4673
+ position: absolute;
4674
+ -webkit-transition: width 0.5s ease-in-out;
4675
+ -moz-transition: width 0.5s ease-in-out;
4676
+ -o-transition: width 0.5s ease-in-out;
4677
+ transition: width 0.5s ease-in-out;
4678
+ }
4679
+
4680
+ @-webkit-keyframes progress {
4681
+ to {
4682
+ background-position: 60px 0;
4683
+ }
4684
+ }
4685
+
4686
+ @-moz-keyframes progress {
4687
+ to {
4688
+ background-position: 60px 0;
4689
+ }
4690
+ }
4691
+
4692
+ @keyframes progress {
4693
+ to {
4694
+ background-position: 60px 0;
4695
+ }
4696
+ }
4697
+
4698
+ .aioseop-admin-settings .aioseop-setting-row .progress-bar .bar:after {
4699
+ content: '';
4700
+ display: block;
4701
+ position: absolute;
4702
+ top: 0;
4703
+ left: 0;
4704
+ width: 100%;
4705
+ height: 100%;
4706
+ -webkit-animation: progress 1s linear infinite;
4707
+ -moz-animation: progress 1s linear infinite;
4708
+ animation: progress 1s linear infinite;
4709
+ background-repeat: repeat-x;
4710
+ background-size: 60px 60px;
4711
+ background-image: -webkit-linear-gradient(-45deg, transparent 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
4712
+ background-image: linear-gradient(-45deg, transparent 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
4713
+ }
4714
+
4715
+ .aioseop-admin-settings .aioseop-setting-label {
4716
+ display: block;
4717
+ float: left;
4718
+ width: 200px;
4719
+ padding: 0;
4720
+ }
4721
+
4722
+ @media (max-width: 781px) {
4723
+ .aioseop-admin-settings .aioseop-setting-label {
4724
+ float: none;
4725
+ width: 100%;
4726
+ padding-bottom: 15px;
4727
+ }
4728
+ }
4729
+
4730
+ .aioseop-admin-settings .aioseop-setting-label label {
4731
+ display: block;
4732
+ font-weight: 600;
4733
+ }
4734
+
4735
+ .aioseop-admin-settings .aioseop-setting-field {
4736
+ display: block;
4737
+ margin: 0 0 0 200px;
4738
+ max-width: 800px;
4739
+ }
4740
+
4741
+ @media (max-width: 781px) {
4742
+ .aioseop-admin-settings .aioseop-setting-field {
4743
+ margin: 0;
4744
+ }
4745
+ }
4746
+
4747
+ .aioseop-admin-settings p.submit {
4748
+ margin: 0;
4749
+ padding: 25px 0;
4750
+ }
4751
+
4752
+ .aioseop-admin-settings .info-area,
4753
+ .aioseop-admin-settings .pre-error {
4754
+ display: block;
4755
+ width: 100%;
4756
+ max-width: 1000px;
4757
+ height: 450px;
4758
+ font-family: Menlo, Monaco, monospace;
4759
+ font-size: 12px;
4760
+ background: #fff;
4761
+ box-shadow: none;
4762
+ border: 1px solid #ddd;
4763
+ white-space: pre;
4764
+ overflow: auto;
4765
+ padding: 20px;
4766
+ }
4767
+
4768
+ .aioseop-admin-settings .pre-error {
4769
+ height: auto;
4770
+ max-height: 250px;
4771
+ margin-bottom: 20px;
4772
+ }
4773
+
4774
+ .aioseop-admin-settings .checkbox-multiselect-columns {
4775
+ max-width: 600px;
4776
+ position: relative;
4777
+ }
4778
+
4779
+ .aioseop-admin-settings .checkbox-multiselect-columns:after {
4780
+ content: ".";
4781
+ display: block;
4782
+ height: 0;
4783
+ line-height: 0;
4784
+ font-size: 0;
4785
+ clear: both;
4786
+ min-height: 0;
4787
+ visibility: hidden;
4788
+ }
4789
+
4790
+ .aioseop-admin-settings .checkbox-multiselect-columns:before {
4791
+ content: "\f0ec";
4792
+ color: #999;
4793
+ font: normal normal normal 20px/1 FontAwesome;
4794
+ text-rendering: auto;
4795
+ -webkit-font-smoothing: antialiased;
4796
+ -moz-osx-font-smoothing: grayscale;
4797
+ position: absolute;
4798
+ top: 130px;
4799
+ left: 50%;
4800
+ margin: 0 0 0 -10px;
4801
+ }
4802
+
4803
+ .aioseop-admin-settings .checkbox-multiselect-columns .header {
4804
+ font-weight: 600;
4805
+ font-size: 13px;
4806
+ margin: 0;
4807
+ padding: 0 0 5px 0;
4808
+ text-align: center;
4809
+ }
4810
+
4811
+ .aioseop-admin-settings .checkbox-multiselect-columns .first-column,
4812
+ .aioseop-admin-settings .checkbox-multiselect-columns .second-column {
4813
+ width: 45%;
4814
+ float: left;
4815
+ }
4816
+
4817
+ .aioseop-admin-settings .checkbox-multiselect-columns .second-column {
4818
+ float: right;
4819
+ }
4820
+
4821
+ .aioseop-admin-settings .checkbox-multiselect-columns .second-column ul li {
4822
+ padding: 10px;
4823
+ }
4824
+
4825
+ .aioseop-admin-settings .checkbox-multiselect-columns ul {
4826
+ background-color: #fff;
4827
+ border: 1px solid #ddd;
4828
+ border-radius: 3px;
4829
+ position: relative;
4830
+ height: 250px;
4831
+ padding: 0;
4832
+ overflow-y: auto;
4833
+ margin: 0;
4834
+ list-style-type: none;
4835
+ }
4836
+
4837
+ .aioseop-admin-settings .checkbox-multiselect-columns ul li {
4838
+ border-bottom: 1px #eee solid;
4839
+ margin: 0;
4840
+ font-size: 14px;
4841
+ }
4842
+
4843
+ .aioseop-admin-settings .checkbox-multiselect-columns ul li label {
4844
+ display: block;
4845
+ padding: 10px 10px 10px 32px;
4846
+ position: relative;
4847
+ vertical-align: baseline;
4848
+ }
4849
+
4850
+ .aioseop-admin-settings .checkbox-multiselect-columns ul li label:hover {
4851
+ background-color: #e27730;
4852
+ color: #fff;
4853
+ }
4854
+
4855
+ .aioseop-admin-settings .checkbox-multiselect-columns ul li label:before {
4856
+ content: "\f0c8";
4857
+ color: #ddd;
4858
+ font: normal normal normal 16px/1 FontAwesome;
4859
+ text-rendering: auto;
4860
+ -webkit-font-smoothing: antialiased;
4861
+ -moz-osx-font-smoothing: grayscale;
4862
+ position: absolute;
4863
+ top: 12px;
4864
+ left: 10px;
4865
+ }
4866
+
4867
+ .aioseop-admin-settings .checkbox-multiselect-columns ul li label.checked {
4868
+ opacity: 0.6;
4869
+ }
4870
+
4871
+ .aioseop-admin-settings .checkbox-multiselect-columns ul li label.checked:before {
4872
+ content: "\f14a";
4873
+ color: #2a9b39;
4874
+ }
4875
+
4876
+ .aioseop-admin-settings .checkbox-multiselect-columns ul li input {
4877
+ display: none;
4878
+ }
4879
+
4880
+ .aioseop-admin-settings .checkbox-multiselect-columns .all {
4881
+ color: #999;
4882
+ display: inline-block;
4883
+ font-size: 13px;
4884
+ margin: 10px 0 0;
4885
+ }
4886
+
4887
+ .aioseop-admin-settings #aioseop-importer-analyze {
4888
+ display: none;
4889
+ }
4890
+
4891
+ .aioseop-admin-settings #aioseop-importer-analyze .process-count,
4892
+ .aioseop-admin-settings #aioseop-importer-analyze p {
4893
+ font-size: 14px;
4894
+ }
4895
+
4896
+ .aioseop-admin-settings #aioseop-importer-analyze .upgrade {
4897
+ display: none;
4898
+ font-size: 14px;
4899
+ }
4900
+
4901
+ .aioseop-admin-settings #aioseop-importer-analyze .upgrade h5 {
4902
+ font-size: 18px;
4903
+ font-weight: 600;
4904
+ padding: 0;
4905
+ margin: 30px 0 20px 0;
4906
+ }
4907
+
4908
+ .aioseop-admin-settings #aioseop-importer-analyze .upgrade hr {
4909
+ border: none;
4910
+ border-bottom: 1px solid #e4e4e4;
4911
+ margin: 40px 0;
4912
+ }
4913
+
4914
+ .aioseop-admin-settings #aioseop-importer-analyze .upgrade .aioseop-btn {
4915
+ margin-right: 10px;
4916
+ }
4917
+
4918
+ .aioseop-admin-settings #aioseop-importer-analyze .upgrade ul li {
4919
+ list-style-type: disc;
4920
+ margin-left: 14px;
4921
+ }
4922
+
4923
+ .aioseop-admin-settings #aioseop-importer-analyze .upgrade ul li.form {
4924
+ list-style-type: none;
4925
+ margin-left: 0;
4926
+ font-weight: 700;
4927
+ }
4928
+
4929
+ .aioseop-admin-settings #aioseop-tools-entries-export h5 {
4930
+ clear: both;
4931
+ margin: 20px 0 10px 0;
4932
+ }
4933
+
4934
+ .aioseop-admin-settings #aioseop-tools-entries-export label {
4935
+ clear: both;
4936
+ float: left;
4937
+ margin: 3px 0 3px 0;
4938
+ }
4939
+
4940
+ .aioseop-admin-settings #aioseop-tools-entries-export .choicesjs-select-wrap {
4941
+ position: relative;
4942
+ }
4943
+
4944
+ .aioseop-admin-settings #aioseop-tools-entries-export .choicesjs-select-wrap .choices {
4945
+ margin-bottom: 0;
4946
+ }
4947
+
4948
+ .aioseop-admin-settings #aioseop-tools-entries-export #aioseop-tools-entries-export-selectform-spinner {
4949
+ position: absolute;
4950
+ top: 6px;
4951
+ right: -30px;
4952
+ }
4953
+
4954
+ .aioseop-admin-settings #aioseop-tools-entries-export .aioseop-date-selector {
4955
+ width: 200px;
4956
+ cursor: pointer;
4957
+ }
4958
+
4959
+ .aioseop-admin-settings #aioseop-tools-entries-export .aioseop-search-box-field {
4960
+ width: 200px;
4961
+ }
4962
+
4963
+ .aioseop-admin-settings #aioseop-tools-entries-export .aioseop-search-box-comparison {
4964
+ width: 140px;
4965
+ }
4966
+
4967
+ .aioseop-admin-settings #aioseop-tools-entries-export .aioseop-search-box-term {
4968
+ width: 300px;
4969
+ }
4970
+
4971
+ .aioseop-admin-settings #aioseop-tools-entries-export section {
4972
+ margin-top: 20px;
4973
+ }
4974
+
4975
+ .aioseop-admin-settings #aioseop-tools-entries-export iframe {
4976
+ width: 0;
4977
+ height: 0;
4978
+ visibility: hidden;
4979
+ }
4980
+
4981
+ .aioseop-admin-settings #aioseop-tools-entries-export .aioseop-btn-text {
4982
+ opacity: 1;
4983
+ transition: all .5s;
4984
+ }
4985
+
4986
+ .aioseop-admin-settings #aioseop-tools-entries-export .aioseop-btn-spinner {
4987
+ position: absolute;
4988
+ left: 50%;
4989
+ top: 50%;
4990
+ transform: translate(-50%, -50%);
4991
+ opacity: 0;
4992
+ transition: all .5s;
4993
+ }
4994
+
4995
+ .aioseop-admin-settings #aioseop-tools-entries-export .aioseop-btn-spinner-on {
4996
+ cursor: default;
4997
+ opacity: 0.75;
4998
+ position: relative;
4999
+ }
5000
+
5001
+ .aioseop-admin-settings #aioseop-tools-entries-export .aioseop-btn-spinner-on .aioseop-btn-text {
5002
+ opacity: 0 !important;
5003
+ transition: all .5s;
5004
+ }
5005
+
5006
+ .aioseop-admin-settings #aioseop-tools-entries-export .aioseop-btn-spinner-on .aioseop-btn-spinner {
5007
+ opacity: 1 !important;
5008
+ transition: all .5s;
5009
+ }
5010
+
5011
+ .aioseop-admin-settings #aioseop-tools-entries-export .aioseop-btn-spinner-on:hover {
5012
+ background-color: #e27730;
5013
+ border-color: #e27730;
5014
+ }
5015
+
5016
+ .aioseop-admin-settings #aioseop-tools-entries-export #aioseop-tools-entries-export-process-msg,
5017
+ .aioseop-admin-settings #aioseop-tools-entries-export #aioseop-tools-entries-export-selectform-msg {
5018
+ background: #fff;
5019
+ border-left: 4px solid #22A0D0;
5020
+ line-height: 1.5em;
5021
+ margin: 20px 0 0 0;
5022
+ padding: 10px;
5023
+ }
5024
+
5025
+ .aioseop-admin-settings #aioseop-tools-entries-export #aioseop-tools-entries-export-process-msg.aioseop-error,
5026
+ .aioseop-admin-settings #aioseop-tools-entries-export #aioseop-tools-entries-export-selectform-msg.aioseop-error {
5027
+ border-color: #dc3232;
5028
+ }
5029
+
5030
+ .aioseop-admin-settings #aioseop-importer-process {
5031
+ display: none;
5032
+ }
5033
+
5034
+ .aioseop-admin-settings #aioseop-importer-process .process-count,
5035
+ .aioseop-admin-settings #aioseop-importer-process .process-completed {
5036
+ font-size: 14px;
5037
+ }
5038
+
5039
+ .aioseop-admin-settings #aioseop-importer-process .process-completed {
5040
+ display: none;
5041
+ }
5042
+
5043
+ .aioseop-admin-settings #aioseop-importer-process .status {
5044
+ margin: 20px 0 30px;
5045
+ background-color: #fff;
5046
+ border-radius: 3px;
5047
+ border: 1px solid #ddd;
5048
+ max-height: 800px;
5049
+ overflow-y: scroll;
5050
+ display: none;
5051
+ }
5052
+
5053
+ .aioseop-admin-settings #aioseop-importer-process .status .item {
5054
+ border-bottom: 1px solid #ddd;
5055
+ padding: 20px;
5056
+ }
5057
+
5058
+ .aioseop-admin-settings #aioseop-importer-process .status .item:last-of-type {
5059
+ border: none;
5060
+ }
5061
+
5062
+ .aioseop-admin-settings #aioseop-importer-process .status .item p {
5063
+ font-size: 13px;
5064
+ margin: 12px 0 0;
5065
+ }
5066
+
5067
+ .aioseop-admin-settings #aioseop-importer-process .status .item ul {
5068
+ font-size: 13px;
5069
+ margin: 12px 0 0 16px;
5070
+ }
5071
+
5072
+ .aioseop-admin-settings #aioseop-importer-process .status .item ul li {
5073
+ list-style: disc;
5074
+ }
5075
+
5076
+ .aioseop-admin-settings #aioseop-importer-process .status .item .status-icon {
5077
+ display: inline-block;
5078
+ margin: 0 10px 0 0;
5079
+ }
5080
+
5081
+ .aioseop-admin-settings #aioseop-importer-process .status .item .status-icon.fa-info-circle {
5082
+ color: #00a0d2;
5083
+ }
5084
+
5085
+ .aioseop-admin-settings #aioseop-importer-process .status .item .status-icon.fa-check {
5086
+ color: #46b450;
5087
+ }
5088
+
5089
+ .aioseop-admin-settings #aioseop-importer-process .status .item .status-icon.fa-exclamation-triangle {
5090
+ color: #ffb900;
5091
+ }
5092
+
5093
+ .aioseop-admin-settings #aioseop-importer-process .status .item .status-icon.fa-times,
5094
+ .aioseop-admin-settings #aioseop-importer-process .status .item .status-icon.fa-exclamation-circle {
5095
+ color: #dc3232;
5096
+ }
5097
+
5098
+ .aioseop-admin-settings #aioseop-importer-process .status .item .name {
5099
+ font-size: 14px;
5100
+ float: left;
5101
+ }
5102
+
5103
+ .aioseop-admin-settings #aioseop-importer-process .status .item .actions {
5104
+ font-size: 14px;
5105
+ float: right;
5106
+ }
5107
+
5108
+ .aioseop-admin-settings #aioseop-importer-process .status .item .actions .sep {
5109
+ color: #ddd;
5110
+ }
5111
+
5112
+ .aioseop-admin-settings .settings-lite-cta {
5113
+ background-color: #fff;
5114
+ border: 1px solid #dadada;
5115
+ padding: 25px 20px;
5116
+ margin: 10px 0 0 0;
5117
+ position: relative;
5118
+ }
5119
+
5120
+ .aioseop-admin-settings .settings-lite-cta .dismiss {
5121
+ position: absolute;
5122
+ top: 10px;
5123
+ right: 10px;
5124
+ color: #666;
5125
+ font-size: 16px;
5126
+ }
5127
+
5128
+ .aioseop-admin-settings .settings-lite-cta h5 {
5129
+ margin: 0 0 16px;
5130
+ font-size: 18px;
5131
+ font-weight: 700;
5132
+ }
5133
+
5134
+ .aioseop-admin-settings .settings-lite-cta h6 {
5135
+ font-weight: 700;
5136
+ font-size: 14px;
5137
+ margin: 0 0 16px;
5138
+ }
5139
+
5140
+ .aioseop-admin-settings .settings-lite-cta p {
5141
+ color: #555;
5142
+ font-size: 14px;
5143
+ margin: 0 0 16px;
5144
+ }
5145
+
5146
+ .aioseop-admin-settings .settings-lite-cta p:last-of-type {
5147
+ margin: 0;
5148
+ }
5149
+
5150
+ .aioseop-admin-settings .settings-lite-cta p a {
5151
+ color: #e27730;
5152
+ }
5153
+
5154
+ .aioseop-admin-settings .settings-lite-cta p a:hover {
5155
+ color: #b85a1b;
5156
+ }
5157
+
5158
+ .aioseop-admin-settings .settings-lite-cta ul {
5159
+ margin: 0;
5160
+ padding: 0;
5161
+ width: 50%;
5162
+ float: left;
5163
+ }
5164
+
5165
+ @media (max-width: 600px) {
5166
+ .aioseop-admin-settings .settings-lite-cta ul {
5167
+ width: 100%;
5168
+ float: none;
5169
+ }
5170
+ }
5171
+
5172
+ .aioseop-admin-settings .settings-lite-cta ul li {
5173
+ margin: 0;
5174
+ padding: 0 0 2px 16px;
5175
+ color: #555;
5176
+ font-size: 14px;
5177
+ position: relative;
5178
+ }
5179
+
5180
+ .aioseop-admin-settings .settings-lite-cta ul li:before {
5181
+ content: '+';
5182
+ position: absolute;
5183
+ top: -1px;
5184
+ left: 0;
5185
+ }
5186
+
5187
+ .aioseop-admin-settings .settings-lite-cta .list {
5188
+ margin: 0 0 16px 0;
5189
+ overflow: auto;
5190
+ max-width: 900px;
5191
+ }
5192
+
5193
+ .aioseop-admin-settings .settings-lite-cta .green {
5194
+ color: #218900;
5195
+ font-weight: 700;
5196
+ }
5197
+
5198
+ .aioseop-admin-settings .settings-lite-cta .fa-star {
5199
+ color: #ff982d;
5200
+ }
5201
+
5202
+ #aioseop-settings-providers .aioseop-settings-provider {
5203
+ border-bottom: 1px solid #ddd;
5204
+ padding: 30px 0;
5205
+ }
5206
+
5207
+ #aioseop-settings-providers .aioseop-settings-provider.focus-out {
5208
+ opacity: 0.4;
5209
+ }
5210
+
5211
+ #aioseop-settings-providers .aioseop-settings-provider-header {
5212
+ cursor: pointer;
5213
+ max-width: 1000px;
5214
+ }
5215
+
5216
+ #aioseop-settings-providers .aioseop-settings-provider-logo {
5217
+ float: left;
5218
+ position: relative;
5219
+ }
5220
+
5221
+ #aioseop-settings-providers .aioseop-settings-provider-logo .fa {
5222
+ position: absolute;
5223
+ top: 50%;
5224
+ margin: -9px 0 0 0;
5225
+ left: 10px;
5226
+ color: #666;
5227
+ font-size: 18px;
5228
+ }
5229
+
5230
+ #aioseop-settings-providers .aioseop-settings-provider-logo img {
5231
+ background: #fff;
5232
+ border: 1px solid #ddd;
5233
+ max-width: 90px;
5234
+ display: block;
5235
+ margin: 0 0 0 40px;
5236
+ }
5237
+
5238
+ #aioseop-settings-providers .aioseop-settings-provider-info {
5239
+ margin: 0 0 0 160px;
5240
+ position: relative;
5241
+ padding: 20px 0 0;
5242
+ }
5243
+
5244
+ #aioseop-settings-providers .aioseop-settings-provider-info h3 {
5245
+ margin: 0 0 10px 0;
5246
+ font-size: 20px;
5247
+ font-weight: 600;
5248
+ }
5249
+
5250
+ #aioseop-settings-providers .aioseop-settings-provider-info p {
5251
+ margin: 0;
5252
+ font-size: 14px;
5253
+ }
5254
+
5255
+ #aioseop-settings-providers .aioseop-settings-provider-info .connected-indicator {
5256
+ color: #83c11f;
5257
+ width: 135px;
5258
+ border: 1px solid #83c11f;
5259
+ border-radius: 4px;
5260
+ padding: 8px 14px;
5261
+ font-size: 16px;
5262
+ position: absolute;
5263
+ top: 28px;
5264
+ right: 0;
5265
+ display: none;
5266
+ }
5267
+
5268
+ #aioseop-settings-providers .connected .aioseop-settings-provider-info .connected-indicator {
5269
+ display: block;
5270
+ }
5271
+
5272
+ #aioseop-settings-providers .aioseop-settings-provider-accounts {
5273
+ margin: 0 0 0 160px;
5274
+ display: none;
5275
+ max-width: 840px;
5276
+ }
5277
+
5278
+ #aioseop-settings-providers .focus-in .aioseop-settings-provider-accounts {
5279
+ display: block;
5280
+ }
5281
+
5282
+ #aioseop-settings-providers .aioseop-settings-provider-accounts-list ul {
5283
+ padding: 0;
5284
+ margin: 0;
5285
+ }
5286
+
5287
+ #aioseop-settings-providers .aioseop-settings-provider-accounts-list ul li {
5288
+ border-bottom: 1px solid #ddd;
5289
+ margin: 0;
5290
+ padding: 10px 0;
5291
+ font-size: 14px;
5292
+ }
5293
+
5294
+ #aioseop-settings-providers .aioseop-settings-provider-accounts-list ul li:first-of-type {
5295
+ border-top: 1px solid #ddd;
5296
+ }
5297
+
5298
+ #aioseop-settings-providers .aioseop-settings-provider-accounts-list ul li:last-of-type {
5299
+ margin-bottom: 16px;
5300
+ }
5301
+
5302
+ #aioseop-settings-providers .aioseop-settings-provider-accounts-list ul span.label {
5303
+ float: left;
5304
+ width: 50%;
5305
+ }
5306
+
5307
+ #aioseop-settings-providers .aioseop-settings-provider-accounts-list ul span.date {
5308
+ color: #999;
5309
+ float: left;
5310
+ width: 35%;
5311
+ }
5312
+
5313
+ #aioseop-settings-providers .aioseop-settings-provider-accounts-list ul span.remove {
5314
+ float: right;
5315
+ width: 15%;
5316
+ text-align: right;
5317
+ }
5318
+
5319
+ #aioseop-settings-providers .aioseop-settings-provider-accounts-connect {
5320
+ display: none;
5321
+ padding: 20px;
5322
+ background-color: #ebf3fb;
5323
+ border: 1px solid #0e6cad;
5324
+ }
5325
+
5326
+ #aioseop-settings-providers .aioseop-settings-provider-accounts-connect input[type=text] {
5327
+ background-color: #fff;
5328
+ border: 1px solid #ddd;
5329
+ border-radius: 3px;
5330
+ box-shadow: none;
5331
+ color: #333;
5332
+ display: block;
5333
+ padding: 7px 12px;
5334
+ margin: 5px 0;
5335
+ width: 400px;
5336
+ min-height: 35px;
5337
+ line-height: 1.3;
5338
+ }
5339
+
5340
+ #aioseop-settings-providers .focus-in .aioseop-settings-provider-accounts-connect {
5341
+ display: block;
5342
+ }
5343
+
5344
+ #aioseop-settings-providers .aioseop-settings-provider-accounts-connect .fa {
5345
+ display: none;
5346
+ }
5347
+
5348
+ #aioseop-settings-providers .aioseop-settings-provider-accounts-connect p,
5349
+ #aioseop-settings-providers .aioseop-settings-provider-accounts p {
5350
+ margin: 0 0 15px 0;
5351
+ font-size: 14px;
5352
+ }
5353
+
5354
+ .wp-core-ui .button-primary-disabled, .wp-core-ui .button-primary.disabled, .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary[disabled] {
5355
+ color: white !important;
5356
+ border-color: #0073aa #006799 #006799 !important;
5357
+ box-shadow: 0 1px 0 #006799 !important;
5358
+ }
5359
+
5360
+
5361
+ /*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2Nzcy9hZG1pbi5jc3MiLCJzb3VyY2VzIjpbImFzc2V0cy9zY3NzL2FkbWluLnNjc3MiLCJhc3NldHMvc2Nzcy9fdmFyaWFibGVzLnNjc3MiLCJhc3NldHMvc2Nzcy92ZW5kb3IvcGFydGlhbHMvX2luY2x1ZGUtbWVkaWEuc2NzcyIsImFzc2V0cy9zY3NzL3ZlbmRvci9wYXJ0aWFscy9jaG9pY2VzL19jaG9pY2VzLnNjc3MiLCJhc3NldHMvc2Nzcy92ZW5kb3IvcGFydGlhbHMvY2hvaWNlcy9fdmFyaWFibGVzLnNjc3MiLCJhc3NldHMvc2Nzcy92ZW5kb3IvcGFydGlhbHMvY2hvaWNlcy9fc3R5bGVzLnNjc3MiLCJhc3NldHMvc2Nzcy92ZW5kb3IvcGFydGlhbHMvY2hvaWNlcy9fcnRsLnNjc3MiLCJhc3NldHMvc2Nzcy9hZG1pbi9fYnV0dG9ucy5zY3NzIiwiYXNzZXRzL3Njc3MvYWRtaW4vX2NvbmZpcm0uc2NzcyIsImFzc2V0cy9zY3NzL2FkbWluL19hbGVydHMuc2NzcyIsImFzc2V0cy9zY3NzL2FkbWluL19mbGFncy5zY3NzIiwiYXNzZXRzL3Njc3MvYWRtaW4vX2hlYWRlci5zY3NzIiwiYXNzZXRzL3Njc3MvYWRtaW4vX3RpdGxlLXRhYnMuc2NzcyIsImFzc2V0cy9zY3NzL2FkbWluL19nZW5lcmFsLnNjc3MiLCJhc3NldHMvc2Nzcy9hZG1pbi9fZmx5b3V0LW1lbnUuc2NzcyIsImFzc2V0cy9zY3NzL2FkbWluL19wYWdlLWZvcm1zLW92ZXJ2aWV3LnNjc3MiLCJhc3NldHMvc2Nzcy9hZG1pbi9fcGFnZS1lbnRyaWVzLXNpbmdsZS5zY3NzIiwiYXNzZXRzL3Njc3MvYWRtaW4vX3BhZ2UtZW50cmllcy1saXN0LnNjc3MiLCJhc3NldHMvc2Nzcy9hZG1pbi9fcGFnZS13ZWxjb21lLnNjc3MiLCJhc3NldHMvc2Nzcy9hZG1pbi9fcGFnZS1hZGRvbnMuc2NzcyIsImFzc2V0cy9zY3NzL2FkbWluL19wYWdlLWFib3V0LnNjc3MiLCJhc3NldHMvc2Nzcy9hZG1pbi9fcGFnZS1jb21tdW5pdHkuc2NzcyIsImFzc2V0cy9zY3NzL2FkbWluL19wYWdlLXBsdWdpbi1jb21tb24uc2NzcyIsImFzc2V0cy9zY3NzL2FkbWluL19wYWdlLXBsdWdpbi1zbXRwLnNjc3MiLCJhc3NldHMvc2Nzcy9hZG1pbi9fcGFnZS1wbHVnaW4tYW5hbHl0aWNzLnNjc3MiLCJhc3NldHMvc2Nzcy9hZG1pbi9fcGFnZS1zZXR0aW5ncy10b29scy5zY3NzIiwiYXNzZXRzL3Njc3MvYWRtaW4vX3BhZ2Utc2V0dGluZ3MtaW50ZWdyYXRpb25zLnNjc3MiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gV1BGb3JtcyBhZG1pbiBzdHlsZXMuXG4vLyBUaGVzZSBzdHlsZXMgYXJlIGxvYWRlZCBvbiBhbGwgV1BGb3JtcyByZWxhdGVkIGFkbWluIHBhZ2VzLlxuXG5AaW1wb3J0ICd2YXJpYWJsZXMnO1xuQGltcG9ydCAndmVuZG9yL3BhcnRpYWxzL2luY2x1ZGUtbWVkaWEnO1xuQGltcG9ydCAndmVuZG9yL3BhcnRpYWxzL2Nob2ljZXMvY2hvaWNlcyc7XG5cbiRicmVha3BvaW50czogKFxuXHQneHMtcGhvbmUnOiAzMjBweCxcblx0J3Bob25lJzogNjAwcHgsXG5cdCdpcGFkJzogNzY4cHgsXG5cdCd0YWJsZXQnOiA3ODJweCxcblx0J2Rlc2t0b3AnOiA5NjBweCxcbik7XG5cbkBpbXBvcnQgJ2FkbWluL2J1dHRvbnMnO1xuQGltcG9ydCAnYWRtaW4vY29uZmlybSc7XG5AaW1wb3J0ICdhZG1pbi9hbGVydHMnO1xuQGltcG9ydCAnYWRtaW4vZmxhZ3MnO1xuQGltcG9ydCAnYWRtaW4vaGVhZGVyJztcbkBpbXBvcnQgJ2FkbWluL3RpdGxlLXRhYnMnO1xuQGltcG9ydCAnYWRtaW4vZ2VuZXJhbCc7XG5AaW1wb3J0ICdhZG1pbi9mbHlvdXQtbWVudSc7XG5AaW1wb3J0ICdhZG1pbi9wYWdlLWZvcm1zLW92ZXJ2aWV3JztcbkBpbXBvcnQgJ2FkbWluL3BhZ2UtZW50cmllcy1zaW5nbGUnO1xuQGltcG9ydCAnYWRtaW4vcGFnZS1lbnRyaWVzLWxpc3QnO1xuQGltcG9ydCAnYWRtaW4vcGFnZS13ZWxjb21lJztcbkBpbXBvcnQgJ2FkbWluL3BhZ2UtYWRkb25zJztcbkBpbXBvcnQgJ2FkbWluL3BhZ2UtYWJvdXQnO1xuQGltcG9ydCAnYWRtaW4vcGFnZS1jb21tdW5pdHknO1xuQGltcG9ydCAnYWRtaW4vcGFnZS1wbHVnaW4tY29tbW9uJztcbkBpbXBvcnQgJ2FkbWluL3BhZ2UtcGx1Z2luLXNtdHAnO1xuQGltcG9ydCAnYWRtaW4vcGFnZS1wbHVnaW4tYW5hbHl0aWNzJztcbkBpbXBvcnQgJ2FkbWluL3BhZ2Utc2V0dGluZ3MtdG9vbHMnO1xuQGltcG9ydCAnYWRtaW4vcGFnZS1zZXR0aW5ncy1pbnRlZ3JhdGlvbnMnO1xuIiwiJG9yYW5nZTogI2UyNzczMDtcbiRkYXJrb3JhbmdlOiAjYjg1YTFiO1xuJGdyZWVuOiAjMmE5YjM5O1xuJGJsdWU6ICMwZTZjYWQ7XG4kbGlnaHRCbHVlOiAjZWJmM2ZiO1xuIiwiQGNoYXJzZXQgXCJVVEYtOFwiO1xuXG4vLyAgICAgXyAgICAgICAgICAgIF8gICAgICAgICAgIF8gICAgICAgICAgICAgICAgICAgICAgICAgICBfIF9cbi8vICAgIChfKSAgICAgICAgICB8IHwgICAgICAgICB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgfCAoXylcbi8vICAgICBfIF8gX18gICBfX198IHxfICAgXyAgX198IHwgX19fICAgXyBfXyBfX18gICBfX18gIF9ffCB8XyAgX18gX1xuLy8gICAgfCB8ICdfIFxcIC8gX198IHwgfCB8IHwvIF9gIHwvIF8gXFwgfCAnXyBgIF8gXFwgLyBfIFxcLyBfYCB8IHwvIF9gIHxcbi8vICAgIHwgfCB8IHwgfCAoX198IHwgfF98IHwgKF98IHwgIF9fLyB8IHwgfCB8IHwgfCAgX18vIChffCB8IHwgKF98IHxcbi8vICAgIHxffF98IHxffFxcX19ffF98XFxfXyxffFxcX18sX3xcXF9fX3wgfF98IHxffCB8X3xcXF9fX3xcXF9fLF98X3xcXF9fLF98XG4vL1xuLy8gICAgICBTaW1wbGUsIGVsZWdhbnQgYW5kIG1haW50YWluYWJsZSBtZWRpYSBxdWVyaWVzIGluIFNhc3Ncbi8vICAgICAgICAgICAgICAgICAgICAgICAgdjEuNC45XG4vL1xuLy8gICAgICAgICAgICAgICAgaHR0cDovL2luY2x1ZGUtbWVkaWEuY29tXG4vL1xuLy8gICAgICAgICBBdXRob3JzOiBFZHVhcmRvIEJvdWNhcyAoQGVkdWFyZG9ib3VjYXMpXG4vLyAgICAgICAgICAgICAgICAgIEh1Z28gR2lyYXVkZWwgKEBodWdvZ2lyYXVkZWwpXG4vL1xuLy8gICAgICBUaGlzIHByb2plY3QgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNSVQgbGljZW5zZVxuXG5cbi8vLy9cbi8vLyBpbmNsdWRlLW1lZGlhIGxpYnJhcnkgcHVibGljIGNvbmZpZ3VyYXRpb25cbi8vLyBAYXV0aG9yIEVkdWFyZG8gQm91Y2FzXG4vLy8gQGFjY2VzcyBwdWJsaWNcbi8vLy9cblxuXG4vLy9cbi8vLyBDcmVhdGVzIGEgbGlzdCBvZiBnbG9iYWwgYnJlYWtwb2ludHNcbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBDcmVhdGVzIGEgc2luZ2xlIGJyZWFrcG9pbnQgd2l0aCB0aGUgbGFiZWwgYHBob25lYFxuLy8vICAkYnJlYWtwb2ludHM6ICgncGhvbmUnOiAzMjBweCk7XG4vLy9cbiRicmVha3BvaW50czogKFxuICAncGhvbmUnOiAzMjBweCxcbiAgJ3RhYmxldCc6IDc2OHB4LFxuICAnZGVza3RvcCc6IDEwMjRweFxuKSAhZGVmYXVsdDtcblxuXG4vLy9cbi8vLyBDcmVhdGVzIGEgbGlzdCBvZiBzdGF0aWMgZXhwcmVzc2lvbnMgb3IgbWVkaWEgdHlwZXNcbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBDcmVhdGVzIGEgc2luZ2xlIG1lZGlhIHR5cGUgKHNjcmVlbilcbi8vLyAgJG1lZGlhLWV4cHJlc3Npb25zOiAoJ3NjcmVlbic6ICdzY3JlZW4nKTtcbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBDcmVhdGVzIGEgc3RhdGljIGV4cHJlc3Npb24gd2l0aCBsb2dpY2FsIGRpc2p1bmN0aW9uIChPUiBvcGVyYXRvcilcbi8vLyAgJG1lZGlhLWV4cHJlc3Npb25zOiAoXG4vLy8gICAgJ3JldGluYTJ4JzogJygtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLCAobWluLXJlc29sdXRpb246IDE5MmRwaSknXG4vLy8gICk7XG4vLy9cbiRtZWRpYS1leHByZXNzaW9uczogKFxuICAnc2NyZWVuJzogJ3NjcmVlbicsXG4gICdwcmludCc6ICdwcmludCcsXG4gICdoYW5kaGVsZCc6ICdoYW5kaGVsZCcsXG4gICdsYW5kc2NhcGUnOiAnKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpJyxcbiAgJ3BvcnRyYWl0JzogJyhvcmllbnRhdGlvbjogcG9ydHJhaXQpJyxcbiAgJ3JldGluYTJ4JzogJygtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLCAobWluLXJlc29sdXRpb246IDE5MmRwaSksIChtaW4tcmVzb2x1dGlvbjogMmRwcHgpJyxcbiAgJ3JldGluYTN4JzogJygtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDMpLCAobWluLXJlc29sdXRpb246IDM1MGRwaSksIChtaW4tcmVzb2x1dGlvbjogM2RwcHgpJ1xuKSAhZGVmYXVsdDtcblxuXG4vLy9cbi8vLyBEZWZpbmVzIGEgbnVtYmVyIHRvIGJlIGFkZGVkIG9yIHN1YnRyYWN0ZWQgZnJvbSBlYWNoIHVuaXQgd2hlbiBkZWNsYXJpbmcgYnJlYWtwb2ludHMgd2l0aCBleGNsdXNpdmUgaW50ZXJ2YWxzXG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gSW50ZXJ2YWwgZm9yIHBpeGVscyBpcyBkZWZpbmVkIGFzIGAxYCBieSBkZWZhdWx0XG4vLy8gIEBpbmNsdWRlIG1lZGlhKCc+MTI4cHgnKSB7fVxuLy8vXG4vLy8gIC8qIEdlbmVyYXRlczogKi9cbi8vLyAgQG1lZGlhIChtaW4td2lkdGg6IDEyOXB4KSB7fVxuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIEludGVydmFsIGZvciBlbXMgaXMgZGVmaW5lZCBhcyBgMC4wMWAgYnkgZGVmYXVsdFxuLy8vICBAaW5jbHVkZSBtZWRpYSgnPjIwZW0nKSB7fVxuLy8vXG4vLy8gIC8qIEdlbmVyYXRlczogKi9cbi8vLyAgQG1lZGlhIChtaW4td2lkdGg6IDIwLjAxZW0pIHt9XG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gSW50ZXJ2YWwgZm9yIHJlbXMgaXMgZGVmaW5lZCBhcyBgMC4xYCBieSBkZWZhdWx0LCB0byBiZSB1c2VkIHdpdGggYGZvbnQtc2l6ZTogNjIuNSU7YFxuLy8vICBAaW5jbHVkZSBtZWRpYSgnPjIuMHJlbScpIHt9XG4vLy9cbi8vLyAgLyogR2VuZXJhdGVzOiAqL1xuLy8vICBAbWVkaWEgKG1pbi13aWR0aDogMi4xcmVtKSB7fVxuLy8vXG4kdW5pdC1pbnRlcnZhbHM6IChcbiAgJ3B4JzogMSxcbiAgJ2VtJzogMC4wMSxcbiAgJ3JlbSc6IDAuMSxcbiAgJyc6IDBcbikgIWRlZmF1bHQ7XG5cbi8vL1xuLy8vIERlZmluZXMgd2hldGhlciBzdXBwb3J0IGZvciBtZWRpYSBxdWVyaWVzIGlzIGF2YWlsYWJsZSwgdXNlZnVsIGZvciBjcmVhdGluZyBzZXBhcmF0ZSBzdHlsZXNoZWV0c1xuLy8vIGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgbWVkaWEgcXVlcmllcy5cbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBEaXNhYmxlcyBzdXBwb3J0IGZvciBtZWRpYSBxdWVyaWVzXG4vLy8gICRpbS1tZWRpYS1zdXBwb3J0OiBmYWxzZTtcbi8vLyAgQGluY2x1ZGUgbWVkaWEoJz49dGFibGV0Jykge1xuLy8vICAgIC5mb28ge1xuLy8vICAgICAgY29sb3I6IHRvbWF0bztcbi8vLyAgICB9XG4vLy8gIH1cbi8vL1xuLy8vICAvKiBHZW5lcmF0ZXM6ICovXG4vLy8gIC5mb28ge1xuLy8vICAgIGNvbG9yOiB0b21hdG87XG4vLy8gIH1cbi8vL1xuJGltLW1lZGlhLXN1cHBvcnQ6IHRydWUgIWRlZmF1bHQ7XG5cbi8vL1xuLy8vIFNlbGVjdHMgd2hpY2ggYnJlYWtwb2ludCB0byBlbXVsYXRlIHdoZW4gc3VwcG9ydCBmb3IgbWVkaWEgcXVlcmllcyBpcyBkaXNhYmxlZC4gTWVkaWEgcXVlcmllcyB0aGF0IHN0YXJ0IGF0IG9yXG4vLy8gaW50ZXJjZXB0IHRoZSBicmVha3BvaW50IHdpbGwgYmUgZGlzcGxheWVkLCBhbnkgb3RoZXJzIHdpbGwgYmUgaWdub3JlZC5cbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBUaGlzIG1lZGlhIHF1ZXJ5IHdpbGwgc2hvdyBiZWNhdXNlIGl0IGludGVyY2VwdHMgdGhlIHN0YXRpYyBicmVha3BvaW50XG4vLy8gICRpbS1tZWRpYS1zdXBwb3J0OiBmYWxzZTtcbi8vLyAgJGltLW5vLW1lZGlhLWJyZWFrcG9pbnQ6ICdkZXNrdG9wJztcbi8vLyAgQGluY2x1ZGUgbWVkaWEoJz49dGFibGV0Jykge1xuLy8vICAgIC5mb28ge1xuLy8vICAgICAgY29sb3I6IHRvbWF0bztcbi8vLyAgICB9XG4vLy8gIH1cbi8vL1xuLy8vICAvKiBHZW5lcmF0ZXM6ICovXG4vLy8gIC5mb28ge1xuLy8vICAgIGNvbG9yOiB0b21hdG87XG4vLy8gIH1cbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBUaGlzIG1lZGlhIHF1ZXJ5IHdpbGwgTk9UIHNob3cgYmVjYXVzZSBpdCBkb2VzIG5vdCBpbnRlcmNlcHQgdGhlIGRlc2t0b3AgYnJlYWtwb2ludFxuLy8vICAkaW0tbWVkaWEtc3VwcG9ydDogZmFsc2U7XG4vLy8gICRpbS1uby1tZWRpYS1icmVha3BvaW50OiAndGFibGV0Jztcbi8vLyAgQGluY2x1ZGUgbWVkaWEoJz49ZGVza3RvcCcpIHtcbi8vLyAgICAuZm9vIHtcbi8vLyAgICAgIGNvbG9yOiB0b21hdG87XG4vLy8gICAgfVxuLy8vICB9XG4vLy9cbi8vLyAgLyogTm8gb3V0cHV0ICovXG4vLy9cbiRpbS1uby1tZWRpYS1icmVha3BvaW50OiAnZGVza3RvcCcgIWRlZmF1bHQ7XG5cbi8vL1xuLy8vIFNlbGVjdHMgd2hpY2ggbWVkaWEgZXhwcmVzc2lvbnMgYXJlIGFsbG93ZWQgaW4gYW4gZXhwcmVzc2lvbiBmb3IgaXQgdG8gYmUgdXNlZCB3aGVuIG1lZGlhIHF1ZXJpZXNcbi8vLyBhcmUgbm90IHN1cHBvcnRlZC5cbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBUaGlzIG1lZGlhIHF1ZXJ5IHdpbGwgc2hvdyBiZWNhdXNlIGl0IGludGVyY2VwdHMgdGhlIHN0YXRpYyBicmVha3BvaW50IGFuZCBjb250YWlucyBvbmx5IGFjY2VwdGVkIG1lZGlhIGV4cHJlc3Npb25zXG4vLy8gICRpbS1tZWRpYS1zdXBwb3J0OiBmYWxzZTtcbi8vLyAgJGltLW5vLW1lZGlhLWJyZWFrcG9pbnQ6ICdkZXNrdG9wJztcbi8vLyAgJGltLW5vLW1lZGlhLWV4cHJlc3Npb25zOiAoJ3NjcmVlbicpO1xuLy8vICBAaW5jbHVkZSBtZWRpYSgnPj10YWJsZXQnLCAnc2NyZWVuJykge1xuLy8vICAgIC5mb28ge1xuLy8vICAgICAgY29sb3I6IHRvbWF0bztcbi8vLyAgICB9XG4vLy8gIH1cbi8vL1xuLy8vICAgLyogR2VuZXJhdGVzOiAqL1xuLy8vICAgLmZvbyB7XG4vLy8gICAgIGNvbG9yOiB0b21hdG87XG4vLy8gICB9XG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gVGhpcyBtZWRpYSBxdWVyeSB3aWxsIE5PVCBzaG93IGJlY2F1c2UgaXQgaW50ZXJjZXB0cyB0aGUgc3RhdGljIGJyZWFrcG9pbnQgYnV0IGNvbnRhaW5zIGEgbWVkaWEgZXhwcmVzc2lvbiB0aGF0IGlzIG5vdCBhY2NlcHRlZFxuLy8vICAkaW0tbWVkaWEtc3VwcG9ydDogZmFsc2U7XG4vLy8gICRpbS1uby1tZWRpYS1icmVha3BvaW50OiAnZGVza3RvcCc7XG4vLy8gICRpbS1uby1tZWRpYS1leHByZXNzaW9uczogKCdzY3JlZW4nKTtcbi8vLyAgQGluY2x1ZGUgbWVkaWEoJz49dGFibGV0JywgJ3JldGluYTJ4Jykge1xuLy8vICAgIC5mb28ge1xuLy8vICAgICAgY29sb3I6IHRvbWF0bztcbi8vLyAgICB9XG4vLy8gIH1cbi8vL1xuLy8vICAvKiBObyBvdXRwdXQgKi9cbi8vL1xuJGltLW5vLW1lZGlhLWV4cHJlc3Npb25zOiAoJ3NjcmVlbicsICdwb3J0cmFpdCcsICdsYW5kc2NhcGUnKSAhZGVmYXVsdDtcblxuLy8vL1xuLy8vIENyb3NzLWVuZ2luZSBsb2dnaW5nIGVuZ2luZVxuLy8vIEBhdXRob3IgSHVnbyBHaXJhdWRlbFxuLy8vIEBhY2Nlc3MgcHJpdmF0ZVxuLy8vL1xuXG5cbi8vL1xuLy8vIExvZyBhIG1lc3NhZ2UgZWl0aGVyIHdpdGggYEBlcnJvcmAgaWYgc3VwcG9ydGVkXG4vLy8gZWxzZSB3aXRoIGBAd2FybmAsIHVzaW5nIGBmZWF0dXJlLWV4aXN0cygnYXQtZXJyb3InKWBcbi8vLyB0byBkZXRlY3Qgc3VwcG9ydC5cbi8vL1xuLy8vIEBwYXJhbSB7U3RyaW5nfSAkbWVzc2FnZSAtIE1lc3NhZ2UgdG8gbG9nXG4vLy9cbkBmdW5jdGlvbiBpbS1sb2coJG1lc3NhZ2UpIHtcbiAgQGlmIGZlYXR1cmUtZXhpc3RzKCdhdC1lcnJvcicpIHtcblx0QGVycm9yICRtZXNzYWdlO1xuICB9IEBlbHNlIHtcblx0QHdhcm4gJG1lc3NhZ2U7XG5cdCRfOiBub29wKCk7XG4gIH1cblxuICBAcmV0dXJuICRtZXNzYWdlO1xufVxuXG5cbi8vL1xuLy8vIFdyYXBwZXIgbWl4aW4gZm9yIHRoZSBsb2cgZnVuY3Rpb24gc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBhIG1vcmUgZnJpZW5kbHlcbi8vLyBBUEkgdGhhbiBgQGlmIGltLWxvZygnLi4nKSB7fWAgb3IgYCRfOiBpbS1sb2coJy4uJylgLiBCYXNpY2FsbHksIHVzZSB0aGUgZnVuY3Rpb25cbi8vLyB3aXRoaW4gZnVuY3Rpb25zIGJlY2F1c2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGluY2x1ZGUgYSBtaXhpbiBpbiBhIGZ1bmN0aW9uXG4vLy8gYW5kIHVzZSB0aGUgbWl4aW4gZXZlcnl3aGVyZSBlbHNlIGJlY2F1c2UgaXQncyBtdWNoIG1vcmUgZWxlZ2FudC5cbi8vL1xuLy8vIEBwYXJhbSB7U3RyaW5nfSAkbWVzc2FnZSAtIE1lc3NhZ2UgdG8gbG9nXG4vLy9cbkBtaXhpbiBsb2coJG1lc3NhZ2UpIHtcbiAgQGlmIGltLWxvZygkbWVzc2FnZSkge31cbn1cblxuXG4vLy9cbi8vLyBGdW5jdGlvbiB3aXRoIG5vIGBAcmV0dXJuYCBjYWxsZWQgbmV4dCB0byBgQHdhcm5gIGluIFNhc3MgMy4zXG4vLy8gdG8gdHJpZ2dlciBhIGNvbXBpbGluZyBlcnJvciBhbmQgc3RvcCB0aGUgcHJvY2Vzcy5cbi8vL1xuQGZ1bmN0aW9uIG5vb3AoKSB7fVxuXG4vLy9cbi8vLyBEZXRlcm1pbmVzIHdoZXRoZXIgYSBsaXN0IG9mIGNvbmRpdGlvbnMgaXMgaW50ZXJjZXB0ZWQgYnkgdGhlIHN0YXRpYyBicmVha3BvaW50LlxuLy8vXG4vLy8gQHBhcmFtIHtBcmdsaXN0fSAgICRjb25kaXRpb25zICAtIE1lZGlhIHF1ZXJ5IGNvbmRpdGlvbnNcbi8vL1xuLy8vIEByZXR1cm4ge0Jvb2xlYW59IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBjb25kaXRpb25zIGFyZSBpbnRlcmNlcHRlZCBieSB0aGUgc3RhdGljIGJyZWFrcG9pbnRcbi8vL1xuQGZ1bmN0aW9uIGltLWludGVyY2VwdHMtc3RhdGljLWJyZWFrcG9pbnQoJGNvbmRpdGlvbnMuLi4pIHtcbiAgJG5vLW1lZGlhLWJyZWFrcG9pbnQtdmFsdWU6IG1hcC1nZXQoJGJyZWFrcG9pbnRzLCAkaW0tbm8tbWVkaWEtYnJlYWtwb2ludCk7XG5cbiAgQGlmIG5vdCAkbm8tbWVkaWEtYnJlYWtwb2ludC12YWx1ZSB7XG5cdEBpZiBpbS1sb2coJ2AjeyRpbS1uby1tZWRpYS1icmVha3BvaW50fWAgaXMgbm90IGEgdmFsaWQgYnJlYWtwb2ludC4nKSB7fVxuICB9XG5cbiAgQGVhY2ggJGNvbmRpdGlvbiBpbiAkY29uZGl0aW9ucyB7XG5cdEBpZiBub3QgbWFwLWhhcy1rZXkoJG1lZGlhLWV4cHJlc3Npb25zLCAkY29uZGl0aW9uKSB7XG5cdCAgJG9wZXJhdG9yOiBnZXQtZXhwcmVzc2lvbi1vcGVyYXRvcigkY29uZGl0aW9uKTtcblx0ICAkcHJlZml4OiBnZXQtZXhwcmVzc2lvbi1wcmVmaXgoJG9wZXJhdG9yKTtcblx0ICAkdmFsdWU6IGdldC1leHByZXNzaW9uLXZhbHVlKCRjb25kaXRpb24sICRvcGVyYXRvcik7XG5cblx0ICBAaWYgKCRwcmVmaXggPT0gJ21heCcgYW5kICR2YWx1ZSA8PSAkbm8tbWVkaWEtYnJlYWtwb2ludC12YWx1ZSkgb3Jcblx0XHQgICgkcHJlZml4ID09ICdtaW4nIGFuZCAkdmFsdWUgPiAkbm8tbWVkaWEtYnJlYWtwb2ludC12YWx1ZSkge1xuXHRcdEByZXR1cm4gZmFsc2U7XG5cdCAgfVxuXHR9IEBlbHNlIGlmIG5vdCBpbmRleCgkaW0tbm8tbWVkaWEtZXhwcmVzc2lvbnMsICRjb25kaXRpb24pIHtcblx0ICBAcmV0dXJuIGZhbHNlO1xuXHR9XG4gIH1cblxuICBAcmV0dXJuIHRydWU7XG59XG5cbi8vLy9cbi8vLyBQYXJzaW5nIGVuZ2luZVxuLy8vIEBhdXRob3IgSHVnbyBHaXJhdWRlbFxuLy8vIEBhY2Nlc3MgcHJpdmF0ZVxuLy8vL1xuXG5cbi8vL1xuLy8vIEdldCBvcGVyYXRvciBvZiBhbiBleHByZXNzaW9uXG4vLy9cbi8vLyBAcGFyYW0ge1N0cmluZ30gJGV4cHJlc3Npb24gLSBFeHByZXNzaW9uIHRvIGV4dHJhY3Qgb3BlcmF0b3IgZnJvbVxuLy8vXG4vLy8gQHJldHVybiB7U3RyaW5nfSAtIEFueSBvZiBgPj1gLCBgPmAsIGA8PWAsIGA8YCwgYOKJpWAsIGDiiaRgXG4vLy9cbkBmdW5jdGlvbiBnZXQtZXhwcmVzc2lvbi1vcGVyYXRvcigkZXhwcmVzc2lvbikge1xuICBAZWFjaCAkb3BlcmF0b3IgaW4gKCc+PScsICc+JywgJzw9JywgJzwnLCAn4omlJywgJ+KJpCcpIHtcblx0QGlmIHN0ci1pbmRleCgkZXhwcmVzc2lvbiwgJG9wZXJhdG9yKSB7XG5cdCAgQHJldHVybiAkb3BlcmF0b3I7XG5cdH1cbiAgfVxuXG4gIC8vIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbmNsdWRlIGEgbWl4aW4gaW5zaWRlIGEgZnVuY3Rpb24sIHNvIHdlIGhhdmUgdG9cbiAgLy8gcmVseSBvbiB0aGUgYGltLWxvZyguLilgIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHRoZSBgbG9nKC4uKWAgbWl4aW4uIEJlY2F1c2VcbiAgLy8gZnVuY3Rpb25zIGNhbm5vdCBiZSBjYWxsZWQgYW55d2hlcmUgaW4gU2Fzcywgd2UgbmVlZCB0byBoYWNrIHRoZSBjYWxsIGluXG4gIC8vIGEgZHVtbXkgdmFyaWFibGUsIHN1Y2ggYXMgYCRfYC4gSWYgYW55Ym9keSBldmVyIHJhaXNlIGEgc2NvcGluZyBpc3N1ZSB3aXRoXG4gIC8vIFNhc3MgMy4zLCBjaGFuZ2UgdGhpcyBsaW5lIGluIGBAaWYgaW0tbG9nKC4uKSB7fWAgaW5zdGVhZC5cbiAgJF86IGltLWxvZygnTm8gb3BlcmF0b3IgZm91bmQgaW4gYCN7JGV4cHJlc3Npb259YC4nKTtcbn1cblxuXG4vLy9cbi8vLyBHZXQgZGltZW5zaW9uIG9mIGFuIGV4cHJlc3Npb24sIGJhc2VkIG9uIGEgZm91bmQgb3BlcmF0b3Jcbi8vL1xuLy8vIEBwYXJhbSB7U3RyaW5nfSAkZXhwcmVzc2lvbiAtIEV4cHJlc3Npb24gdG8gZXh0cmFjdCBkaW1lbnNpb24gZnJvbVxuLy8vIEBwYXJhbSB7U3RyaW5nfSAkb3BlcmF0b3IgLSBPcGVyYXRvciBmcm9tIGAkZXhwcmVzc2lvbmBcbi8vL1xuLy8vIEByZXR1cm4ge1N0cmluZ30gLSBgd2lkdGhgIG9yIGBoZWlnaHRgIChvciBwb3RlbnRpYWxseSBhbnl0aGluZyBlbHNlKVxuLy8vXG5AZnVuY3Rpb24gZ2V0LWV4cHJlc3Npb24tZGltZW5zaW9uKCRleHByZXNzaW9uLCAkb3BlcmF0b3IpIHtcbiAgJG9wZXJhdG9yLWluZGV4OiBzdHItaW5kZXgoJGV4cHJlc3Npb24sICRvcGVyYXRvcik7XG4gICRwYXJzZWQtZGltZW5zaW9uOiBzdHItc2xpY2UoJGV4cHJlc3Npb24sIDAsICRvcGVyYXRvci1pbmRleCAtIDEpO1xuICAkZGltZW5zaW9uOiAnd2lkdGgnO1xuXG4gIEBpZiBzdHItbGVuZ3RoKCRwYXJzZWQtZGltZW5zaW9uKSA+IDAge1xuXHQkZGltZW5zaW9uOiAkcGFyc2VkLWRpbWVuc2lvbjtcbiAgfVxuXG4gIEByZXR1cm4gJGRpbWVuc2lvbjtcbn1cblxuXG4vLy9cbi8vLyBHZXQgZGltZW5zaW9uIHByZWZpeCBiYXNlZCBvbiBhbiBvcGVyYXRvclxuLy8vXG4vLy8gQHBhcmFtIHtTdHJpbmd9ICRvcGVyYXRvciAtIE9wZXJhdG9yXG4vLy9cbi8vLyBAcmV0dXJuIHtTdHJpbmd9IC0gYG1pbmAgb3IgYG1heGBcbi8vL1xuQGZ1bmN0aW9uIGdldC1leHByZXNzaW9uLXByZWZpeCgkb3BlcmF0b3IpIHtcbiAgQHJldHVybiBpZihpbmRleCgoJzwnLCAnPD0nLCAn4omkJyksICRvcGVyYXRvciksICdtYXgnLCAnbWluJyk7XG59XG5cblxuLy8vXG4vLy8gR2V0IHZhbHVlIG9mIGFuIGV4cHJlc3Npb24sIGJhc2VkIG9uIGEgZm91bmQgb3BlcmF0b3Jcbi8vL1xuLy8vIEBwYXJhbSB7U3RyaW5nfSAkZXhwcmVzc2lvbiAtIEV4cHJlc3Npb24gdG8gZXh0cmFjdCB2YWx1ZSBmcm9tXG4vLy8gQHBhcmFtIHtTdHJpbmd9ICRvcGVyYXRvciAtIE9wZXJhdG9yIGZyb20gYCRleHByZXNzaW9uYFxuLy8vXG4vLy8gQHJldHVybiB7TnVtYmVyfSAtIEEgbnVtZXJpYyB2YWx1ZVxuLy8vXG5AZnVuY3Rpb24gZ2V0LWV4cHJlc3Npb24tdmFsdWUoJGV4cHJlc3Npb24sICRvcGVyYXRvcikge1xuICAkb3BlcmF0b3ItaW5kZXg6IHN0ci1pbmRleCgkZXhwcmVzc2lvbiwgJG9wZXJhdG9yKTtcbiAgJHZhbHVlOiBzdHItc2xpY2UoJGV4cHJlc3Npb24sICRvcGVyYXRvci1pbmRleCArIHN0ci1sZW5ndGgoJG9wZXJhdG9yKSk7XG5cbiAgQGlmIG1hcC1oYXMta2V5KCRicmVha3BvaW50cywgJHZhbHVlKSB7XG5cdCR2YWx1ZTogbWFwLWdldCgkYnJlYWtwb2ludHMsICR2YWx1ZSk7XG4gIH0gQGVsc2Uge1xuXHQkdmFsdWU6IHRvLW51bWJlcigkdmFsdWUpO1xuICB9XG5cbiAgJGludGVydmFsOiBtYXAtZ2V0KCR1bml0LWludGVydmFscywgdW5pdCgkdmFsdWUpKTtcblxuICBAaWYgbm90ICRpbnRlcnZhbCB7XG5cdC8vIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbmNsdWRlIGEgbWl4aW4gaW5zaWRlIGEgZnVuY3Rpb24sIHNvIHdlIGhhdmUgdG9cblx0Ly8gcmVseSBvbiB0aGUgYGltLWxvZyguLilgIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHRoZSBgbG9nKC4uKWAgbWl4aW4uIEJlY2F1c2Vcblx0Ly8gZnVuY3Rpb25zIGNhbm5vdCBiZSBjYWxsZWQgYW55d2hlcmUgaW4gU2Fzcywgd2UgbmVlZCB0byBoYWNrIHRoZSBjYWxsIGluXG5cdC8vIGEgZHVtbXkgdmFyaWFibGUsIHN1Y2ggYXMgYCRfYC4gSWYgYW55Ym9keSBldmVyIHJhaXNlIGEgc2NvcGluZyBpc3N1ZSB3aXRoXG5cdC8vIFNhc3MgMy4zLCBjaGFuZ2UgdGhpcyBsaW5lIGluIGBAaWYgaW0tbG9nKC4uKSB7fWAgaW5zdGVhZC5cblx0JF86IGltLWxvZygnVW5rbm93biB1bml0IGAje3VuaXQoJHZhbHVlKX1gLicpO1xuICB9XG5cbiAgQGlmICRvcGVyYXRvciA9PSAnPicge1xuXHQkdmFsdWU6ICR2YWx1ZSArICRpbnRlcnZhbDtcbiAgfSBAZWxzZSBpZiAkb3BlcmF0b3IgPT0gJzwnIHtcblx0JHZhbHVlOiAkdmFsdWUgLSAkaW50ZXJ2YWw7XG4gIH1cblxuICBAcmV0dXJuICR2YWx1ZTtcbn1cblxuXG4vLy9cbi8vLyBQYXJzZSBhbiBleHByZXNzaW9uIHRvIHJldHVybiBhIHZhbGlkIG1lZGlhLXF1ZXJ5IGV4cHJlc3Npb25cbi8vL1xuLy8vIEBwYXJhbSB7U3RyaW5nfSAkZXhwcmVzc2lvbiAtIEV4cHJlc3Npb24gdG8gcGFyc2Vcbi8vL1xuLy8vIEByZXR1cm4ge1N0cmluZ30gLSBWYWxpZCBtZWRpYSBxdWVyeVxuLy8vXG5AZnVuY3Rpb24gcGFyc2UtZXhwcmVzc2lvbigkZXhwcmVzc2lvbikge1xuICAvLyBJZiBpdCBpcyBwYXJ0IG9mICRtZWRpYS1leHByZXNzaW9ucywgaXQgaGFzIG5vIG9wZXJhdG9yXG4gIC8vIHRoZW4gdGhlcmUgaXMgbm8gbmVlZCB0byBnbyBhbnkgZnVydGhlciwganVzdCByZXR1cm4gdGhlIHZhbHVlXG4gIEBpZiBtYXAtaGFzLWtleSgkbWVkaWEtZXhwcmVzc2lvbnMsICRleHByZXNzaW9uKSB7XG5cdEByZXR1cm4gbWFwLWdldCgkbWVkaWEtZXhwcmVzc2lvbnMsICRleHByZXNzaW9uKTtcbiAgfVxuXG4gICRvcGVyYXRvcjogZ2V0LWV4cHJlc3Npb24tb3BlcmF0b3IoJGV4cHJlc3Npb24pO1xuICAkZGltZW5zaW9uOiBnZXQtZXhwcmVzc2lvbi1kaW1lbnNpb24oJGV4cHJlc3Npb24sICRvcGVyYXRvcik7XG4gICRwcmVmaXg6IGdldC1leHByZXNzaW9uLXByZWZpeCgkb3BlcmF0b3IpO1xuICAkdmFsdWU6IGdldC1leHByZXNzaW9uLXZhbHVlKCRleHByZXNzaW9uLCAkb3BlcmF0b3IpO1xuXG4gIEByZXR1cm4gJygjeyRwcmVmaXh9LSN7JGRpbWVuc2lvbn06ICN7JHZhbHVlfSknO1xufVxuXG4vLy9cbi8vLyBTbGljZSBgJGxpc3RgIGJldHdlZW4gYCRzdGFydGAgYW5kIGAkZW5kYCBpbmRleGVzXG4vLy9cbi8vLyBAYWNjZXNzIHByaXZhdGVcbi8vL1xuLy8vIEBwYXJhbSB7TGlzdH0gJGxpc3QgLSBMaXN0IHRvIHNsaWNlXG4vLy8gQHBhcmFtIHtOdW1iZXJ9ICRzdGFydCBbMV0gLSBTdGFydCBpbmRleFxuLy8vIEBwYXJhbSB7TnVtYmVyfSAkZW5kIFtsZW5ndGgoJGxpc3QpXSAtIEVuZCBpbmRleFxuLy8vXG4vLy8gQHJldHVybiB7TGlzdH0gU2xpY2VkIGxpc3Rcbi8vL1xuQGZ1bmN0aW9uIHNsaWNlKCRsaXN0LCAkc3RhcnQ6IDEsICRlbmQ6IGxlbmd0aCgkbGlzdCkpIHtcbiAgQGlmIGxlbmd0aCgkbGlzdCkgPCAxIG9yICRzdGFydCA+ICRlbmQge1xuXHRAcmV0dXJuICgpO1xuICB9XG5cbiAgJHJlc3VsdDogKCk7XG5cbiAgQGZvciAkaSBmcm9tICRzdGFydCB0aHJvdWdoICRlbmQge1xuXHQkcmVzdWx0OiBhcHBlbmQoJHJlc3VsdCwgbnRoKCRsaXN0LCAkaSkpO1xuICB9XG5cbiAgQHJldHVybiAkcmVzdWx0O1xufVxuXG4vLy8vXG4vLy8gU3RyaW5nIHRvIG51bWJlciBjb252ZXJ0ZXJcbi8vLyBAYXV0aG9yIEh1Z28gR2lyYXVkZWxcbi8vLyBAYWNjZXNzIHByaXZhdGVcbi8vLy9cblxuXG4vLy9cbi8vLyBDYXN0cyBhIHN0cmluZyBpbnRvIGEgbnVtYmVyXG4vLy9cbi8vLyBAcGFyYW0ge1N0cmluZyB8IE51bWJlcn0gJHZhbHVlIC0gVmFsdWUgdG8gYmUgcGFyc2VkXG4vLy9cbi8vLyBAcmV0dXJuIHtOdW1iZXJ9XG4vLy9cbkBmdW5jdGlvbiB0by1udW1iZXIoJHZhbHVlKSB7XG4gIEBpZiB0eXBlLW9mKCR2YWx1ZSkgPT0gJ251bWJlcicge1xuXHRAcmV0dXJuICR2YWx1ZTtcbiAgfSBAZWxzZSBpZiB0eXBlLW9mKCR2YWx1ZSkgIT0gJ3N0cmluZycge1xuXHQkXzogaW0tbG9nKCdWYWx1ZSBmb3IgYHRvLW51bWJlcmAgc2hvdWxkIGJlIGEgbnVtYmVyIG9yIGEgc3RyaW5nLicpO1xuICB9XG5cbiAgJGZpcnN0LWNoYXJhY3Rlcjogc3RyLXNsaWNlKCR2YWx1ZSwgMSwgMSk7XG4gICRyZXN1bHQ6IDA7XG4gICRkaWdpdHM6IDA7XG4gICRtaW51czogKCRmaXJzdC1jaGFyYWN0ZXIgPT0gJy0nKTtcbiAgJG51bWJlcnM6ICgnMCc6IDAsICcxJzogMSwgJzInOiAyLCAnMyc6IDMsICc0JzogNCwgJzUnOiA1LCAnNic6IDYsICc3JzogNywgJzgnOiA4LCAnOSc6IDkpO1xuXG4gIC8vIFJlbW92ZSArLy0gc2lnbiBpZiBwcmVzZW50IGF0IGZpcnN0IGNoYXJhY3RlclxuICBAaWYgKCRmaXJzdC1jaGFyYWN0ZXIgPT0gJysnIG9yICRmaXJzdC1jaGFyYWN0ZXIgPT0gJy0nKSB7XG5cdCR2YWx1ZTogc3RyLXNsaWNlKCR2YWx1ZSwgMik7XG4gIH1cblxuICBAZm9yICRpIGZyb20gMSB0aHJvdWdoIHN0ci1sZW5ndGgoJHZhbHVlKSB7XG5cdCRjaGFyYWN0ZXI6IHN0ci1zbGljZSgkdmFsdWUsICRpLCAkaSk7XG5cblx0QGlmIG5vdCAoaW5kZXgobWFwLWtleXMoJG51bWJlcnMpLCAkY2hhcmFjdGVyKSBvciAkY2hhcmFjdGVyID09ICcuJykge1xuXHQgIEByZXR1cm4gdG8tbGVuZ3RoKGlmKCRtaW51cywgLSRyZXN1bHQsICRyZXN1bHQpLCBzdHItc2xpY2UoJHZhbHVlLCAkaSkpXG5cdH1cblxuXHRAaWYgJGNoYXJhY3RlciA9PSAnLicge1xuXHQgICRkaWdpdHM6IDE7XG5cdH0gQGVsc2UgaWYgJGRpZ2l0cyA9PSAwIHtcblx0ICAkcmVzdWx0OiAkcmVzdWx0ICogMTAgKyBtYXAtZ2V0KCRudW1iZXJzLCAkY2hhcmFjdGVyKTtcblx0fSBAZWxzZSB7XG5cdCAgJGRpZ2l0czogJGRpZ2l0cyAqIDEwO1xuXHQgICRyZXN1bHQ6ICRyZXN1bHQgKyBtYXAtZ2V0KCRudW1iZXJzLCAkY2hhcmFjdGVyKSAvICRkaWdpdHM7XG5cdH1cbiAgfVxuXG4gIEByZXR1cm4gaWYoJG1pbnVzLCAtJHJlc3VsdCwgJHJlc3VsdCk7XG59XG5cblxuLy8vXG4vLy8gQWRkIGAkdW5pdGAgdG8gYCR2YWx1ZWBcbi8vL1xuLy8vIEBwYXJhbSB7TnVtYmVyfSAkdmFsdWUgLSBWYWx1ZSB0byBhZGQgdW5pdCB0b1xuLy8vIEBwYXJhbSB7U3RyaW5nfSAkdW5pdCAtIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5pdFxuLy8vXG4vLy8gQHJldHVybiB7TnVtYmVyfSAtIGAkdmFsdWVgIGV4cHJlc3NlZCBpbiBgJHVuaXRgXG4vLy9cbkBmdW5jdGlvbiB0by1sZW5ndGgoJHZhbHVlLCAkdW5pdCkge1xuICAkdW5pdHM6ICgncHgnOiAxcHgsICdjbSc6IDFjbSwgJ21tJzogMW1tLCAnJSc6IDElLCAnY2gnOiAxY2gsICdwYyc6IDFwYywgJ2luJzogMWluLCAnZW0nOiAxZW0sICdyZW0nOiAxcmVtLCAncHQnOiAxcHQsICdleCc6IDFleCwgJ3Z3JzogMXZ3LCAndmgnOiAxdmgsICd2bWluJzogMXZtaW4sICd2bWF4JzogMXZtYXgpO1xuXG4gIEBpZiBub3QgaW5kZXgobWFwLWtleXMoJHVuaXRzKSwgJHVuaXQpIHtcblx0JF86IGltLWxvZygnSW52YWxpZCB1bml0IGAjeyR1bml0fWAuJyk7XG4gIH1cblxuICBAcmV0dXJuICR2YWx1ZSAqIG1hcC1nZXQoJHVuaXRzLCAkdW5pdCk7XG59XG5cbi8vL1xuLy8vIFRoaXMgbWl4aW4gYWltcyBhdCByZWRlZmluaW5nIHRoZSBjb25maWd1cmF0aW9uIGp1c3QgZm9yIHRoZSBzY29wZSBvZlxuLy8vIHRoZSBjYWxsLiBJdCBpcyBoZWxwZnVsIHdoZW4gaGF2aW5nIGEgY29tcG9uZW50IG5lZWRpbmcgYW4gZXh0ZW5kZWRcbi8vLyBjb25maWd1cmF0aW9uIHN1Y2ggYXMgY3VzdG9tIGJyZWFrcG9pbnRzIChyZWZlcnJlZCB0byBhcyB0d2Vha3BvaW50cylcbi8vLyBmb3IgaW5zdGFuY2UuXG4vLy9cbi8vLyBAYXV0aG9yIEh1Z28gR2lyYXVkZWxcbi8vL1xuLy8vIEBwYXJhbSB7TWFwfSAkdHdlYWtwb2ludHMgWygpXSAtIE1hcCBvZiB0d2Vha3BvaW50cyB0byBiZSBtZXJnZWQgd2l0aCBgJGJyZWFrcG9pbnRzYFxuLy8vIEBwYXJhbSB7TWFwfSAkdHdlYWstbWVkaWEtZXhwcmVzc2lvbnMgWygpXSAtIE1hcCBvZiB0d2Vha2VkIG1lZGlhIGV4cHJlc3Npb25zIHRvIGJlIG1lcmdlZCB3aXRoIGAkbWVkaWEtZXhwcmVzc2lvbmBcbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBFeHRlbmQgdGhlIGdsb2JhbCBicmVha3BvaW50cyB3aXRoIGEgdHdlYWtwb2ludFxuLy8vICBAaW5jbHVkZSBtZWRpYS1jb250ZXh0KCgnY3VzdG9tJzogNjc4cHgpKSB7XG4vLy8gICAgLmZvbyB7XG4vLy8gICAgICBAaW5jbHVkZSBtZWRpYSgnPnBob25lJywgJzw9Y3VzdG9tJykge1xuLy8vICAgICAgIC8vIC4uLlxuLy8vICAgICAgfVxuLy8vICAgIH1cbi8vLyAgfVxuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIEV4dGVuZCB0aGUgZ2xvYmFsIG1lZGlhIGV4cHJlc3Npb25zIHdpdGggYSBjdXN0b20gb25lXG4vLy8gIEBpbmNsdWRlIG1lZGlhLWNvbnRleHQoJHR3ZWFrLW1lZGlhLWV4cHJlc3Npb25zOiAoJ2FsbCc6ICdhbGwnKSkge1xuLy8vICAgIC5mb28ge1xuLy8vICAgICAgQGluY2x1ZGUgbWVkaWEoJ2FsbCcsICc+cGhvbmUnKSB7XG4vLy8gICAgICAgLy8gLi4uXG4vLy8gICAgICB9XG4vLy8gICAgfVxuLy8vICB9XG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gRXh0ZW5kIGJvdGggY29uZmlndXJhdGlvbiBtYXBzXG4vLy8gIEBpbmNsdWRlIG1lZGlhLWNvbnRleHQoKCdjdXN0b20nOiA2NzhweCksICgnYWxsJzogJ2FsbCcpKSB7XG4vLy8gICAgLmZvbyB7XG4vLy8gICAgICBAaW5jbHVkZSBtZWRpYSgnYWxsJywgJz5waG9uZScsICc8PWN1c3RvbScpIHtcbi8vLyAgICAgICAvLyAuLi5cbi8vLyAgICAgIH1cbi8vLyAgICB9XG4vLy8gIH1cbi8vL1xuQG1peGluIG1lZGlhLWNvbnRleHQoJHR3ZWFrcG9pbnRzOiAoKSwgJHR3ZWFrLW1lZGlhLWV4cHJlc3Npb25zOiAoKSkge1xuICAvLyBTYXZlIGdsb2JhbCBjb25maWd1cmF0aW9uXG4gICRnbG9iYWwtYnJlYWtwb2ludHM6ICRicmVha3BvaW50cztcbiAgJGdsb2JhbC1tZWRpYS1leHByZXNzaW9uczogJG1lZGlhLWV4cHJlc3Npb25zO1xuXG4gIC8vIFVwZGF0ZSBnbG9iYWwgY29uZmlndXJhdGlvblxuICAkYnJlYWtwb2ludHM6IG1hcC1tZXJnZSgkYnJlYWtwb2ludHMsICR0d2Vha3BvaW50cykgIWdsb2JhbDtcbiAgJG1lZGlhLWV4cHJlc3Npb25zOiBtYXAtbWVyZ2UoJG1lZGlhLWV4cHJlc3Npb25zLCAkdHdlYWstbWVkaWEtZXhwcmVzc2lvbnMpICFnbG9iYWw7XG5cbiAgQGNvbnRlbnQ7XG5cbiAgLy8gUmVzdG9yZSBnbG9iYWwgY29uZmlndXJhdGlvblxuICAkYnJlYWtwb2ludHM6ICRnbG9iYWwtYnJlYWtwb2ludHMgIWdsb2JhbDtcbiAgJG1lZGlhLWV4cHJlc3Npb25zOiAkZ2xvYmFsLW1lZGlhLWV4cHJlc3Npb25zICFnbG9iYWw7XG59XG5cbi8vLy9cbi8vLyBpbmNsdWRlLW1lZGlhIHB1YmxpYyBleHBvc2VkIEFQSVxuLy8vIEBhdXRob3IgRWR1YXJkbyBCb3VjYXNcbi8vLyBAYWNjZXNzIHB1YmxpY1xuLy8vL1xuXG5cbi8vL1xuLy8vIEdlbmVyYXRlcyBhIG1lZGlhIHF1ZXJ5IGJhc2VkIG9uIGEgbGlzdCBvZiBjb25kaXRpb25zXG4vLy9cbi8vLyBAcGFyYW0ge0FyZ2xpc3R9ICAgJGNvbmRpdGlvbnMgIC0gTWVkaWEgcXVlcnkgY29uZGl0aW9uc1xuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIFdpdGggYSBzaW5nbGUgc2V0IGJyZWFrcG9pbnRcbi8vLyAgQGluY2x1ZGUgbWVkaWEoJz5waG9uZScpIHsgfVxuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIFdpdGggdHdvIHNldCBicmVha3BvaW50c1xuLy8vICBAaW5jbHVkZSBtZWRpYSgnPnBob25lJywgJzw9dGFibGV0JykgeyB9XG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gV2l0aCBjdXN0b20gdmFsdWVzXG4vLy8gIEBpbmNsdWRlIG1lZGlhKCc+PTM1OHB4JywgJzw4NTBweCcpIHsgfVxuLy8vXG4vLy8gQGV4YW1wbGUgc2NzcyAtIFdpdGggc2V0IGJyZWFrcG9pbnRzIHdpdGggY3VzdG9tIHZhbHVlc1xuLy8vICBAaW5jbHVkZSBtZWRpYSgnPmRlc2t0b3AnLCAnPD0xMzUwcHgnKSB7IH1cbi8vL1xuLy8vIEBleGFtcGxlIHNjc3MgLSBXaXRoIGEgc3RhdGljIGV4cHJlc3Npb25cbi8vLyAgQGluY2x1ZGUgbWVkaWEoJ3JldGluYTJ4JykgeyB9XG4vLy9cbi8vLyBAZXhhbXBsZSBzY3NzIC0gTWl4aW5nIGV2ZXJ5dGhpbmdcbi8vLyAgQGluY2x1ZGUgbWVkaWEoJz49MzUwcHgnLCAnPHRhYmxldCcsICdyZXRpbmEzeCcpIHsgfVxuLy8vXG5AbWl4aW4gbWVkaWEoJGNvbmRpdGlvbnMuLi4pIHtcbiAgQGlmICgkaW0tbWVkaWEtc3VwcG9ydCBhbmQgbGVuZ3RoKCRjb25kaXRpb25zKSA9PSAwKSBvclxuXHQgIChub3QgJGltLW1lZGlhLXN1cHBvcnQgYW5kIGltLWludGVyY2VwdHMtc3RhdGljLWJyZWFrcG9pbnQoJGNvbmRpdGlvbnMuLi4pKSB7XG5cdEBjb250ZW50O1xuICB9IEBlbHNlIGlmICgkaW0tbWVkaWEtc3VwcG9ydCBhbmQgbGVuZ3RoKCRjb25kaXRpb25zKSA+IDApIHtcblx0QG1lZGlhICN7dW5xdW90ZShwYXJzZS1leHByZXNzaW9uKG50aCgkY29uZGl0aW9ucywgMSkpKX0ge1xuXHQgIC8vIFJlY3Vyc2l2ZSBjYWxsXG5cdCAgQGluY2x1ZGUgbWVkaWEoc2xpY2UoJGNvbmRpdGlvbnMsIDIpLi4uKSB7XG5cdFx0QGNvbnRlbnQ7XG5cdCAgfVxuXHR9XG4gIH1cbn1cbiIsIkBpbXBvcnQgJ3ZhcmlhYmxlcyc7XG5AaW1wb3J0ICdzdHlsZXMnO1xuQGltcG9ydCAncnRsJzsiLCIkY2hvaWNlcy1zZWxlY3RvcjogJ2Nob2ljZXMnICFkZWZhdWx0O1xuJGNob2ljZXMtcnRsLXNlbGVjdG9yOiAnYm9keS5ydGwnICFkZWZhdWx0O1xuJGNob2ljZXMtZ3V0dGVyaW5nOiAyNHB4ICFkZWZhdWx0O1xuJGNob2ljZXMtYm9yZGVyLXJhZGl1czogM3B4ICFkZWZhdWx0O1xuJGNob2ljZXMtYm9yZGVyLXJhZGl1cy1pdGVtOiAzcHggIWRlZmF1bHQ7XG4kY2hvaWNlcy1iZy1jb2xvcjogI2ZmZiAhZGVmYXVsdDtcbiRjaG9pY2VzLWJnLWNvbG9yLWRpc2FibGVkOiAjZWFlYWVhICFkZWZhdWx0O1xuJGNob2ljZXMtYmctY29sb3ItZHJvcGRvd246ICNmZmYgIWRlZmF1bHQ7XG4kY2hvaWNlcy10ZXh0LWNvbG9yOiBjdXJyZW50Q29sb3IgIWRlZmF1bHQ7XG4kY2hvaWNlcy1rZXlsaW5lLWNvbG9yOiAjZGRkICFkZWZhdWx0O1xuJGNob2ljZXMtcHJpbWFyeS1jb2xvcjogJGJsdWUgIWRlZmF1bHQ7XG4kY2hvaWNlcy1kaXNhYmxlZC1jb2xvcjogI2VhZWFlYSAhZGVmYXVsdDtcbiRjaG9pY2VzLWhpZ2hsaWdodC1jb2xvcjogJGNob2ljZXMtcHJpbWFyeS1jb2xvciAhZGVmYXVsdDtcbiRjaG9pY2VzLWZvY3VzZWQtY29sb3I6ICMwMTZBQUIgIWRlZmF1bHQ7XG4kY2hvaWNlcy1idXR0b24tZGltZW5zaW9uOiA4cHggIWRlZmF1bHQ7XG4kY2hvaWNlcy1idXR0b24tb2Zmc2V0OiA4cHggIWRlZmF1bHQ7XG4kY2hvaWNlcy1idXR0b24taWNvbi1wYXRoOiAnLi4vaW1hZ2VzJyAhZGVmYXVsdDtcbiIsIi4jeyRjaG9pY2VzLXNlbGVjdG9yfSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWFyZ2luLWJvdHRvbTogJGNob2ljZXMtZ3V0dGVyaW5nO1xuICAmOmZvY3VzIHsgb3V0bGluZTogbm9uZTsgfVxuICAmOmxhc3QtY2hpbGQgeyBtYXJnaW4tYm90dG9tOiAwOyB9XG4gICYuaXMtZGlzYWJsZWQge1xuICAgIC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9faW5uZXIsIC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9faW5wdXQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJGNob2ljZXMtYmctY29sb3ItZGlzYWJsZWQ7XG4gICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICAgIC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9faXRlbSB7IGN1cnNvcjogbm90LWFsbG93ZWQ7IH1cbiAgfVxuICAmIFtoaWRkZW5dIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbiAgaW5wdXRbdHlwZT10ZXh0XS4jeyRjaG9pY2VzLXNlbGVjdG9yfV9faW5wdXQge1xuICBcdHdpZHRoOiBjYWxjKDEwMCUgLSAyMHB4KSAhaW1wb3J0YW50O1xuXHRtYXJnaW46IDEwcHggIWltcG9ydGFudDtcblx0cGFkZGluZzogN3B4IDEycHggIWltcG9ydGFudDtcblx0Ym94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50O1xuXHRib3JkZXI6IDFweCBzb2xpZCAjZGRkICFpbXBvcnRhbnQ7XG5cdGJvcmRlci1yYWRpdXM6IDNweCAhaW1wb3J0YW50O1xuXG5cdCY6Zm9jdXMge1xuXHQgIGJvcmRlcjogMXB4IHNvbGlkICRjaG9pY2VzLWZvY3VzZWQtY29sb3IgIWltcG9ydGFudDtcblx0ICBib3gtc2hhZG93OiAwIDAgMCAxcHggJGNob2ljZXMtZm9jdXNlZC1jb2xvciAhaW1wb3J0YW50O1xuXHQgIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcblx0fVxuICB9XG59XG5cbi4jeyRjaG9pY2VzLXNlbGVjdG9yfVtkYXRhLXR5cGUqPVwic2VsZWN0LW9uZVwiXSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgLiN7JGNob2ljZXMtc2VsZWN0b3J9X19pbnB1dCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiAxMHB4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICRjaG9pY2VzLWtleWxpbmUtY29sb3IgIWltcG9ydGFudDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGO1xuICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xuICB9XG4gIC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9fYnV0dG9uIHtcbiAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgkY2hvaWNlcy1idXR0b24taWNvbi1wYXRoICsgJy9jcm9zcy1pbnZlcnNlLnN2ZycpO1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIGJhY2tncm91bmQtc2l6ZTogOHB4O1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiA1MCU7XG4gICAgICByaWdodDogMDtcbiAgICAgIG1hcmdpbi10b3A6IC0xMHB4O1xuICAgICAgbWFyZ2luLXJpZ2h0OiAyNXB4O1xuICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICBib3JkZXItcmFkaXVzOiAxMGVtO1xuICAgICAgb3BhY2l0eTogLjU7XG4gICAgJjpob3ZlciwgJjpmb2N1cyB7IG9wYWNpdHk6IDE7IH1cbiAgICAmOmZvY3VzIHsgYm94LXNoYWRvdzogMCAwIDAgMnB4ICRjaG9pY2VzLWhpZ2hsaWdodC1jb2xvcjsgfVxuICB9XG4gIC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9faXRlbVtkYXRhLXZhbHVlPScnXSAuI3skY2hvaWNlcy1zZWxlY3Rvcn1fX2J1dHRvbiB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuICAmOmFmdGVyIHtcbiAgICBjb250ZW50OiBcIlwiO1xuICAgIGhlaWdodDogMDtcbiAgICB3aWR0aDogMDtcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICAgIGJvcmRlci1jb2xvcjogJGNob2ljZXMtdGV4dC1jb2xvciB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItd2lkdGg6IDVweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IDExLjVweDtcbiAgICB0b3A6IDUwJTtcbiAgICBtYXJnaW4tdG9wOiAtMi41cHg7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIH1cbiAgJi5pcy1vcGVuOmFmdGVyIHtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICRjaG9pY2VzLXRleHQtY29sb3IgdHJhbnNwYXJlbnQ7XG4gICAgbWFyZ2luLXRvcDogLTcuNXB4O1xuICB9XG4gICZbZGlyPVwicnRsXCJdIHtcbiAgICAmOmFmdGVyIHtcbiAgICAgIGxlZnQ6IDExLjVweDtcbiAgICAgIHJpZ2h0OiBhdXRvO1xuICAgIH1cbiAgICAuI3skY2hvaWNlcy1zZWxlY3Rvcn1fX2J1dHRvbiB7XG4gICAgICByaWdodDogYXV0bztcbiAgICAgIGxlZnQ6IDA7XG4gICAgICBtYXJnaW4tbGVmdDogMjVweDtcbiAgICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICB9XG4gIH1cbn1cblxuLiN7JGNob2ljZXMtc2VsZWN0b3J9W2RhdGEtdHlwZSo9XCJzZWxlY3QtbXVsdGlwbGVcIl0ge1xuICAuI3skY2hvaWNlcy1zZWxlY3Rvcn1fX2lubmVyIHtcbiAgICBwYWRkaW5nLXJpZ2h0OiAkY2hvaWNlcy1ndXR0ZXJpbmc7XG4gIH1cblxuICAmOmFmdGVyIHtcbiAgICBjb250ZW50OiBcIlwiO1xuICAgIGhlaWdodDogMDtcbiAgICB3aWR0aDogMDtcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICAgIGJvcmRlci1jb2xvcjogJGNob2ljZXMtdGV4dC1jb2xvciB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItd2lkdGg6IDVweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IDExLjVweDtcbiAgICB0b3A6IDFlbTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuICAmLmlzLW9wZW46YWZ0ZXIge1xuICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgJGNob2ljZXMtdGV4dC1jb2xvciB0cmFuc3BhcmVudDtcbiAgICBtYXJnaW4tdG9wOiAtNy41cHg7XG4gIH1cbn1cblxuLiN7JGNob2ljZXMtc2VsZWN0b3J9W2RhdGEtdHlwZSo9XCJzZWxlY3QtbXVsdGlwbGVcIl0sXG4uI3skY2hvaWNlcy1zZWxlY3Rvcn1bZGF0YS10eXBlKj1cInRleHRcIl0ge1xuICAuI3skY2hvaWNlcy1zZWxlY3Rvcn1fX2lubmVyIHsgY3Vyc29yOiB0ZXh0OyB9XG4gIC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9fYnV0dG9uIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICAgIG1hcmdpbi1yaWdodDogLSRjaG9pY2VzLWJ1dHRvbi1vZmZzZXQvMjtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIG1hcmdpbi1sZWZ0OiAkY2hvaWNlcy1idXR0b24tb2Zmc2V0O1xuICAgIHBhZGRpbmc6IDFweDtcbiAgICBwYWRkaW5nLWxlZnQ6ICRjaG9pY2VzLWJ1dHRvbi1vZmZzZXQqMjtcbiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIGRhcmtlbigkY2hvaWNlcy1wcmltYXJ5LWNvbG9yLCAxMCUpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgkY2hvaWNlcy1idXR0b24taWNvbi1wYXRoICsgJy9jcm9zcy5zdmcnKTtcbiAgICBiYWNrZ3JvdW5kLXNpemU6ICRjaG9pY2VzLWJ1dHRvbi1kaW1lbnNpb247XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIHdpZHRoOiAkY2hvaWNlcy1idXR0b24tZGltZW5zaW9uO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIG9wYWNpdHk6IC43NTtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgICY6aG92ZXIsICY6Zm9jdXMgeyBvcGFjaXR5OiAxOyB9XG4gIH1cbn1cblxuLiN7JGNob2ljZXMtc2VsZWN0b3J9X19pbm5lciB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgd2lkdGg6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICRjaG9pY2VzLWJnLWNvbG9yO1xuICBwYWRkaW5nOiA0cHggNy41cHggMXB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAkY2hvaWNlcy1rZXlsaW5lLWNvbG9yO1xuICBib3JkZXItcmFkaXVzOiAkY2hvaWNlcy1ib3JkZXItcmFkaXVzO1xuICBtaW4taGVpZ2h0OiAzNXB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uaXMtb3BlbiB7XG5cdC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9faW5uZXIge1xuXHRcdGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7XG5cdFx0Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG5cdH1cbn1cblxuLmlzLW9wZW4uaXMtZmxpcHBlZCB7XG5cdC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9faW5uZXIge1xuXHRcdGJvcmRlci1yYWRpdXM6IDAgMCAkY2hvaWNlcy1ib3JkZXItcmFkaXVzICRjaG9pY2VzLWJvcmRlci1yYWRpdXM7XG5cdH1cbn1cblxuLmlzLWZvY3VzZWQsXG4uaXMtb3BlbiB7XG4gIC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9faW5uZXIge1xuICAgIGJvcmRlci1jb2xvcjogJGNob2ljZXMtZm9jdXNlZC1jb2xvcjtcblx0Ym94LXNoYWRvdzogMCAwIDAgMXB4ICRjaG9pY2VzLWZvY3VzZWQtY29sb3I7XG5cdG91dGxpbmU6IG5vbmU7XG4gIH1cbn1cblxuLmlzLWZsaXBwZWQuaXMtb3BlbiB7XG4gIC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9faW5uZXIge1xuXHQgIGJvcmRlci1jb2xvcjogJGNob2ljZXMtZm9jdXNlZC1jb2xvcjtcblx0ICBib3gtc2hhZG93OiAwIDAgMCAxcHggJGNob2ljZXMtZm9jdXNlZC1jb2xvcjtcblx0ICBvdXRsaW5lOiBub25lO1xuICB9XG59XG5cbi4jeyRjaG9pY2VzLXNlbGVjdG9yfV9fbGlzdCB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBsaXN0LXN0eWxlOiBub25lO1xufVxuXG4uI3skY2hvaWNlcy1zZWxlY3Rvcn1fX2xpc3QtLXNpbmdsZSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogNHB4IDE2cHggNHB4IDA7XG4gIGZvbnQtc2l6ZTogMC44NzVlbTtcbiAgLiN7JGNob2ljZXMtc2VsZWN0b3J9X19pdGVtIHsgd2lkdGg6IDEwMCU7IH1cbn1cblxuLiN7JGNob2ljZXMtc2VsZWN0b3J9X19saXN0LS1tdWx0aXBsZSB7XG4gIGRpc3BsYXk6IGlubGluZTtcbiAgLiN7JGNob2ljZXMtc2VsZWN0b3J9X19pdGVtIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICBib3JkZXItcmFkaXVzOiAkY2hvaWNlcy1ib3JkZXItcmFkaXVzLWl0ZW07XG4gICAgcGFkZGluZzogNHB4IDEwcHg7XG4gICAgZm9udC1zaXplOiAuNzVlbTtcbiAgICBsaW5lLWhlaWdodDogMS4zO1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgbWFyZ2luLXJpZ2h0OiAzcHg7XG4gICAgbWFyZ2luLXRvcDogMHB4O1xuICAgIG1hcmdpbi1ib3R0b206IDNweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkY2hvaWNlcy1wcmltYXJ5LWNvbG9yO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIGRhcmtlbigkY2hvaWNlcy1wcmltYXJ5LWNvbG9yLCA1JSk7XG4gICAgY29sb3I6ICNGRkZGRkY7XG4gICAgd29yZC1icmVhazogYnJlYWstYWxsO1xuICAgICZbZGF0YS1kZWxldGFibGVdIHsgcGFkZGluZy1yaWdodDogNXB4OyB9XG4gICAgJi5pcy1oaWdobGlnaHRlZCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBkYXJrZW4oJGNob2ljZXMtcHJpbWFyeS1jb2xvciwgNSUpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgZGFya2VuKCRjaG9pY2VzLXByaW1hcnktY29sb3IsIDEwJSk7XG4gICAgfVxuICB9XG59XG5cbi4jeyRjaG9pY2VzLXNlbGVjdG9yfV9fbGlzdC0tbXVsdGlwbGUgKyBpbnB1dFt0eXBlPXRleHRdLiN7JGNob2ljZXMtc2VsZWN0b3J9X19pbnB1dCB7XG5cblx0Ym9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG5cdG1hcmdpbjogMCAhaW1wb3J0YW50O1xuXHR3aWR0aDogMTAwJSAhaW1wb3J0YW50O1xuXHRwYWRkaW5nOiAzcHggIWltcG9ydGFudDtcblxuXHQmOmZvY3VzIHtcblx0XHRib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG5cdFx0Ym9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG5cdH1cbn1cblxuLmlzLWRpc2FibGVkIHtcbiAgLiN7JGNob2ljZXMtc2VsZWN0b3J9X19saXN0LS1tdWx0aXBsZSB7XG4gICAgLiN7JGNob2ljZXMtc2VsZWN0b3J9X19pdGVtIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbigkY2hvaWNlcy1kaXNhYmxlZC1jb2xvciwgMjUlKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGRhcmtlbigkY2hvaWNlcy1kaXNhYmxlZC1jb2xvciwgMzUlKTtcbiAgICB9XG4gIH1cbn1cblxuLiN7JGNob2ljZXMtc2VsZWN0b3J9X19saXN0LS1kcm9wZG93biB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHotaW5kZXg6IDE7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICRjaG9pY2VzLWJnLWNvbG9yLWRyb3Bkb3duO1xuICBib3JkZXI6IDFweCBzb2xpZCAkY2hvaWNlcy1rZXlsaW5lLWNvbG9yO1xuICB0b3A6IDEwMCU7XG4gIG1hcmdpbi10b3A6IC0xcHg7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICRjaG9pY2VzLWJvcmRlci1yYWRpdXM7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAkY2hvaWNlcy1ib3JkZXItcmFkaXVzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3b3JkLWJyZWFrOiBicmVhay1hbGw7XG4gICYuaXMtYWN0aXZlIHsgZGlzcGxheTogYmxvY2s7IH1cbiAgLiN7JGNob2ljZXMtc2VsZWN0b3J9X19saXN0IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWF4LWhlaWdodDogMzAwcHg7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoO1xuICAgIHdpbGwtY2hhbmdlOiBzY3JvbGwtcG9zaXRpb247XG4gIH1cbiAgLiN7JGNob2ljZXMtc2VsZWN0b3J9X19pdGVtIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICBwYWRkaW5nOiAxMHB4O1xuICAgIGZvbnQtc2l6ZTogLjg3NWVtO1xuICB9XG4gIC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9faXRlbS0tc2VsZWN0YWJsZSB7XG4gICAgQG1lZGlhIChtaW4td2lkdGg6IDY0MHB4KSB7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAxMDBweDtcbiAgICAgICY6YWZ0ZXIge1xuICAgICAgICBjb250ZW50OiBhdHRyKGRhdGEtc2VsZWN0LXRleHQpO1xuICAgICAgICBmb250LXNpemU6IC43NWVtO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHJpZ2h0OiAxMHB4O1xuICAgICAgICB0b3A6IDUwJTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgfVxuICAgIH1cbiAgICAmLmlzLWhpZ2hsaWdodGVkIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IG1peCgjMDAwMDAwLCAjRkZGRkZGLCA1JSk7XG4gICAgICAmOmFmdGVyIHsgb3BhY2l0eTogLjU7IH1cbiAgICB9XG4gIH1cbiAgLiN7JGNob2ljZXMtc2VsZWN0b3J9X19wbGFjZWhvbGRlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG4uaXMtb3BlbiB7XG4gIC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9fbGlzdC0tZHJvcGRvd24ge1xuICAgIGJvcmRlci1jb2xvcjogJGNob2ljZXMtZm9jdXNlZC1jb2xvcjtcblx0Ym9yZGVyLXRvcC1jb2xvcjogZGFya2VuKCRjaG9pY2VzLWtleWxpbmUtY29sb3IsIDEwJSk7XG5cdGJvcmRlci1ib3R0b20tY29sb3I6ICRjaG9pY2VzLWJnLWNvbG9yLWRyb3Bkb3duO1xuICAgIGJveC1zaGFkb3c6IDAgMXB4IDAgMXB4ICRjaG9pY2VzLWZvY3VzZWQtY29sb3I7XG4gIH1cbn1cblxuLmlzLW9wZW4uaXMtZmxpcHBlZCB7XG5cdC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9fbGlzdC0tZHJvcGRvd24ge1xuXHRcdGJvcmRlci10b3AtY29sb3I6ICRjaG9pY2VzLWJnLWNvbG9yLWRyb3Bkb3duO1xuXHRcdGJvcmRlci1ib3R0b20tY29sb3I6IGRhcmtlbigkY2hvaWNlcy1rZXlsaW5lLWNvbG9yLCAxMCUpO1xuXHRcdGJveC1zaGFkb3c6IDAgLTFweCAwIDFweCAkY2hvaWNlcy1mb2N1c2VkLWNvbG9yO1xuXHR9XG59XG5cbi5pcy1mbGlwcGVkIHtcbiAgLiN7JGNob2ljZXMtc2VsZWN0b3J9X19saXN0LS1kcm9wZG93biB7XG4gICAgdG9wOiBhdXRvO1xuICAgIGJvdHRvbTogMTAwJTtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICAgIG1hcmdpbi1ib3R0b206IC0xcHg7XG4gICAgYm9yZGVyLXJhZGl1czogLjI1cmVtIC4yNXJlbSAwIDA7XG4gIH1cbn1cblxuLiN7JGNob2ljZXMtc2VsZWN0b3J9X19pdGVtIHsgY3Vyc29yOiBkZWZhdWx0OyB9XG4uI3skY2hvaWNlcy1zZWxlY3Rvcn1fX2l0ZW0tLXNlbGVjdGFibGUgeyBjdXJzb3I6IHBvaW50ZXI7IH1cbi4jeyRjaG9pY2VzLXNlbGVjdG9yfV9faXRlbS0tZGlzYWJsZWQge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgb3BhY2l0eTogLjU7XG59XG5cbi4jeyRjaG9pY2VzLXNlbGVjdG9yfV9faGVhZGluZyB7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGZvbnQtc2l6ZTogLjc1ZW07XG4gIHBhZGRpbmc6IDEwcHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBsaWdodGVuKCRjaG9pY2VzLWtleWxpbmUtY29sb3IsIDEwJSk7XG4gIGNvbG9yOiBsaWdodGVuKCMzMzMsIDMwJSk7XG59XG5cbi4jeyRjaG9pY2VzLXNlbGVjdG9yfV9fYnV0dG9uIHtcbiAgdGV4dC1pbmRlbnQ6IC05OTk5cHg7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgYXBwZWFyYW5jZTogbm9uZTtcbiAgYm9yZGVyOiAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gICY6Zm9jdXMgeyBvdXRsaW5lOiBub25lOyB9XG59XG5cbi4jeyRjaG9pY2VzLXNlbGVjdG9yfV9faW5wdXQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZSAhaW1wb3J0YW50O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgbWFyZ2luOiAwIDAgMnB4IDAgIWltcG9ydGFudDtcbiAgYm9yZGVyOiAwICFpbXBvcnRhbnQ7XG4gIGJvcmRlci1yYWRpdXM6IDAgIWltcG9ydGFudDtcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBtaW4taGVpZ2h0OiAwICFpbXBvcnRhbnQ7XG4gIHdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7XG4gIHBhZGRpbmc6IDRweCAwIDRweCAycHggIWltcG9ydGFudDtcbn1cblxuLiN7JGNob2ljZXMtc2VsZWN0b3J9IC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9faW5uZXIge1xuXHRpbnB1dC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9faW5wdXQ6Zm9jdXMge1xuXHRcdG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcblx0XHRib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG5cdFx0Ym9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG5cdH1cbn1cblxuLiN7JGNob2ljZXMtc2VsZWN0b3J9X19wbGFjZWhvbGRlciB7IG9wYWNpdHk6IC41OyB9XG4iLCIjeyRjaG9pY2VzLXJ0bC1zZWxlY3Rvcn0ge1xuICAuI3skY2hvaWNlcy1zZWxlY3Rvcn1bZGF0YS10eXBlKj1cInNlbGVjdC1tdWx0aXBsZVwiXSB7XG4gICAgLiN7JGNob2ljZXMtc2VsZWN0b3J9X19pbm5lciB7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7XG4gICAgICBwYWRkaW5nLWxlZnQ6ICRjaG9pY2VzLWd1dHRlcmluZztcbiAgICB9XG5cbiAgICAmOmFmdGVyIHtcbiAgICAgIHJpZ2h0OiBhdXRvO1xuICAgICAgbGVmdDogMTEuNXB4O1xuICAgIH1cbiAgfVxuXG4gIC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9fbGlzdC0tc2luZ2xlIHtcbiAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7XG4gICAgcGFkZGluZy1sZWZ0OiAxNnB4O1xuICB9XG5cbiAgLiN7JGNob2ljZXMtc2VsZWN0b3J9X19saXN0LS1tdWx0aXBsZSB7XG4gICAgLiN7JGNob2ljZXMtc2VsZWN0b3J9X19pdGVtIHtcbiAgICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICAgIG1hcmdpbi1sZWZ0OiAzLjc1cHg7XG5cbiAgICAgICZbZGF0YS1kZWxldGFibGVdIHtcbiAgICAgICAgcGFkZGluZy1yaWdodDogMTBweDtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiA1cHg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLiN7JGNob2ljZXMtc2VsZWN0b3J9X19saXN0LS1kcm9wZG93biB7XG4gICAgLiN7JGNob2ljZXMtc2VsZWN0b3J9X19pdGVtIHtcbiAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9faW5wdXQge1xuICAgIHBhZGRpbmctcmlnaHQ6IDJweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctbGVmdDogMCAhaW1wb3J0YW50O1xuICB9XG5cbiAgLiN7JGNob2ljZXMtc2VsZWN0b3J9W2RhdGEtdHlwZSo9XCJzZWxlY3QtbXVsdGlwbGVcIl0sIC4jeyRjaG9pY2VzLXNlbGVjdG9yfVtkYXRhLXR5cGUqPVwidGV4dFwiXSB7XG4gICAgLiN7JGNob2ljZXMtc2VsZWN0b3J9X19idXR0b24ge1xuICAgICAgbWFyZ2luLXJpZ2h0OiAkY2hvaWNlcy1idXR0b24tb2Zmc2V0O1xuICAgICAgbWFyZ2luLWxlZnQ6IC0kY2hvaWNlcy1idXR0b24tb2Zmc2V0LzI7XG4gICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCBkYXJrZW4oJGNob2ljZXMtcHJpbWFyeS1jb2xvciwgMTAlKTtcbiAgICAgIGJvcmRlci1sZWZ0OiBub25lO1xuICAgIH1cbiAgfVxuXG4gIEBtZWRpYSAobWluLXdpZHRoOiA2NDBweCkge1xuICAgIC4jeyRjaG9pY2VzLXNlbGVjdG9yfV9fbGlzdC0tZHJvcGRvd24ge1xuICAgICAgLiN7JGNob2ljZXMtc2VsZWN0b3J9X19pdGVtLS1zZWxlY3RhYmxlIHtcbiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICAgIHBhZGRpbmctbGVmdDogMTAwcHg7XG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG4gICAgICAgICY6YWZ0ZXIge1xuICAgICAgICAgIHJpZ2h0OiBhdXRvO1xuICAgICAgICAgIGxlZnQ6IDEwcHg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIi8vIEJ1dHRvbiBzdHlsZXMuXG4ud3Bmb3Jtcy1hZG1pbi1wYWdlIHtcblxuXHQud3Bmb3Jtcy1idG4ge1xuXHRcdGJvcmRlcjogMXB4O1xuXHRcdGJvcmRlci1zdHlsZTogc29saWQ7XG5cdFx0Ym9yZGVyLXJhZGl1czogM3B4O1xuXHRcdGN1cnNvcjogcG9pbnRlcjtcblx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0bWFyZ2luOiAwO1xuXHRcdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cdFx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcblx0XHR3aGl0ZS1zcGFjZTogbm93cmFwO1xuXHRcdGJveC1zaGFkb3c6IG5vbmU7XG5cdH1cblxuXHQud3Bmb3Jtcy1idG4tYmxvY2sge1xuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdHdpZHRoOiAxMDAlO1xuXHR9XG5cblx0LndwZm9ybXMtYnRuLW1kIHtcblx0XHRmb250LXNpemU6IDEzcHg7XG5cdFx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0XHRwYWRkaW5nOiA4cHggMTJweDtcblx0XHRtaW4taGVpZ2h0OiAzNXB4O1xuXHR9XG5cblx0LndwZm9ybXMtYnRuLWxnIHtcblx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0XHRwYWRkaW5nOiAxNnB4IDI4cHg7XG5cdH1cblxuXHQud3Bmb3Jtcy1idG4tb3JhbmdlIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAkb3JhbmdlO1xuXHRcdGJvcmRlci1jb2xvcjogJG9yYW5nZTtcblx0XHRjb2xvcjogI2ZmZjtcblxuXHRcdCY6aG92ZXIge1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogJGRhcmtvcmFuZ2U7XG5cdFx0XHRib3JkZXItY29sb3I6ICRkYXJrb3JhbmdlO1xuXHRcdFx0Y29sb3I6ICNmZmY7XG5cdFx0fVxuXHR9XG5cblx0LndwZm9ybXMtYnRuLWdyZXkge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG5cdFx0Ym9yZGVyLWNvbG9yOiAjY2NjO1xuXHRcdGNvbG9yOiAjNjY2O1xuXG5cdFx0Jjpob3ZlciB7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZDdkN2Q3O1xuXHRcdFx0Ym9yZGVyLWNvbG9yOiAjY2NjO1xuXHRcdFx0Y29sb3I6ICM0NDQ7XG5cdFx0fVxuXHR9XG5cblx0LndwZm9ybXMtYnRuLWxpZ2h0LWdyZXkge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XG5cdFx0Ym9yZGVyOiAxcHggc29saWQgI2NjYztcblx0XHRjb2xvcjogIzY2NjtcblxuXHRcdCY6aG92ZXIge1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2VlZTtcblx0XHRcdGJvcmRlci1jb2xvcjogI2NjYztcblx0XHRcdGNvbG9yOiAjNDQ0O1xuXHRcdH1cblx0fVxuXG5cdC53cGZvcm1zLWJ0bi10cmFucy1ncmVlbiB7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cdFx0Ym9yZGVyOiBub25lO1xuXHRcdGNvbG9yOiAkZ3JlZW47XG5cblx0XHQmOmhvdmVyIHtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICRncmVlbjtcblx0XHRcdGNvbG9yOiAjZmZmO1xuXHRcdH1cblxuXHRcdC51bmRlcmxpbmUge1xuXHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXG5cdFx0XHQmOmFmdGVyIHtcblx0XHRcdFx0Y29udGVudDogXCIgXCI7XG5cdFx0XHRcdGJvcmRlci1ib3R0b206IDFweCBkYXNoZWQgJGdyZWVuO1xuXHRcdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHRcdGJvdHRvbTogLTVweDtcblx0XHRcdFx0bGVmdDogMDtcblx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LmRhc2hpY29ucyB7XG5cdFx0XHRoZWlnaHQ6IDE4cHg7XG5cdFx0fVxuXHR9XG59XG4iLCIvLyBBbGVydCBzdHlsZXMuXG4vLyBTdHlsaW5nIHR3ZWFrcyBmb3IgalF1ZXJ5LWNvbmZpcm0gSlMgYWxlcnQgbGlicmFyeS5cbmJvZHkge1xuXG5cdGRpdi5qY29uZmlybSB7XG5cblx0XHQqLFxuXHRcdCo6OmJlZm9yZSxcblx0XHQqOjphZnRlciB7XG5cdFx0XHQtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdFx0XHQtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdFx0XHRib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHRcdH1cblxuXHRcdGRpdi5qY29uZmlybS1ib3gtY29udGFpbmVyIHtcblxuXHRcdFx0ZGl2Lmpjb25maXJtLWJveCB7XG5cdFx0XHRcdGJvcmRlci1yYWRpdXM6IDA7XG5cdFx0XHRcdGJveC1zaGFkb3c6IDAgMnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMik7XG5cblx0XHRcdFx0ZGl2Lmpjb25maXJtLWNsb3NlSWNvbiB7XG5cdFx0XHRcdFx0Y29sb3I6IHJnYmEoMCwwLDAsMC40KTtcblx0XHRcdFx0XHR0b3A6IDhweDtcblx0XHRcdFx0XHRyaWdodDogOHB4O1xuXG5cdFx0XHRcdFx0Jjpob3ZlciB7XG5cdFx0XHRcdFx0XHRjb2xvcjogcmdiYSgwLDAsMCwwLjgwKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRkaXYuamNvbmZpcm0tYm94IHtcblxuXHRcdFx0ZGl2Lmpjb25maXJtLXRpdGxlLWMge1xuXHRcdFx0XHRtYXJnaW46IDAgMCAyNnB4IDAgIWltcG9ydGFudDtcblx0XHRcdFx0cGFkZGluZzogMCAhaW1wb3J0YW50O1xuXG5cdFx0XHRcdHNwYW4uamNvbmZpcm0taWNvbi1jIHtcblx0XHRcdFx0XHRtYXJnaW46IDAgIWltcG9ydGFudDtcblx0XHRcdFx0XHRjb2xvcjogI2M0YzRjNCAhaW1wb3J0YW50O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c3Bhbi5qY29uZmlybS10aXRsZSB7XG5cdFx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdFx0Y29sb3I6ICMzMzM7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzcGFuLmpjb25maXJtLWljb24tYyArIHNwYW4uamNvbmZpcm0tdGl0bGUge1xuXHRcdFx0XHRcdG1hcmdpbi10b3A6IDIwcHggIWltcG9ydGFudDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRkaXYuamNvbmZpcm0tY29udGVudC1wYW5lIHtcblx0XHRcdFx0bWFyZ2luLWJvdHRvbTogMjZweDtcblx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cblx0XHRcdFx0Lmpjb25maXJtLWNvbnRlbnQge1xuXHRcdFx0XHRcdG92ZXJmbG93OiBpbmhlcml0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGRpdi5qY29uZmlybS1jb250ZW50IHtcblx0XHRcdFx0Zm9udC1zaXplOiAxNnB4O1xuXHRcdFx0XHRjb2xvcjogIzU1NTtcblx0XHRcdFx0bGluZS1oZWlnaHQ6IDEuNDtcblxuXHRcdFx0XHQmLmxpdGUtdXBncmFkZSB7XG5cdFx0XHRcdFx0cCB7XG5cdFx0XHRcdFx0XHRmb250LXNpemU6IDE4cHg7XG5cdFx0XHRcdFx0XHRwYWRkaW5nOiAwIDIwcHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cCB7XG5cdFx0XHRcdFx0bWFyZ2luOiAwIDAgMTZweDtcblx0XHRcdFx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0XHRcdFx0bGluZS1oZWlnaHQ6IDEuNTtcblxuXHRcdFx0XHRcdCY6bGFzdC1vZi10eXBlIHtcblx0XHRcdFx0XHRcdG1hcmdpbjogMDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQmLmxhcmdlIHtcblx0XHRcdFx0XHRcdGZvbnQtc2l6ZTogMThweDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQmLnNtYWxsIHtcblx0XHRcdFx0XHRcdGZvbnQtc2l6ZTogMTRweDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuYWxyZWFkeS1wdXJjaGFzZWQge1xuXHRcdFx0XHRcdGZvbnQtc2l6ZTogMTJweDtcblx0XHRcdFx0XHRjb2xvcjogI2NjYztcblx0XHRcdFx0XHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cblx0XHRcdFx0XHQmOmhvdmVyIHtcblx0XHRcdFx0XHRcdHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRkaXYuamNvbmZpcm0tYnV0dG9ucyB7XG5cblx0XHRcdFx0LmFscmVhZHktcHVyY2hhc2VkIHtcblx0XHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0XHRmb250LXNpemU6IDEycHg7XG5cdFx0XHRcdFx0Y29sb3I6ICNhYWE7XG5cdFx0XHRcdFx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXHRcdFx0XHRcdHBhZGRpbmctdG9wOiAyMHB4O1xuXG5cdFx0XHRcdFx0Jjpob3ZlciB7XG5cdFx0XHRcdFx0XHRjb2xvcjogIzk5OTtcblx0XHRcdFx0XHRcdHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQuZGlzY291bnQtbm90ZSB7XG5cdFx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHRcdFx0bWFyZ2luOiAzMHB4IDAgMDtcblxuXHRcdFx0XHRwIHtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmZmFjO1xuXHRcdFx0XHRcdG1hcmdpbjogMCAtMzBweDtcblx0XHRcdFx0XHRwYWRkaW5nOiAyNHB4IDYwcHggMjBweDtcblx0XHRcdFx0XHRmb250LXNpemU6IDE1cHg7XG5cdFx0XHRcdFx0Y29sb3I6ICM0ZDRkNGQ7XG5cdFx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXG5cdFx0XHRcdFx0JjphZnRlciB7XG5cdFx0XHRcdFx0XHRjb250ZW50OiAnXFxmMDU4Jztcblx0XHRcdFx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdFx0XHRcdGZvbnQ6IG5vcm1hbCBub3JtYWwgbm9ybWFsIDE0cHgvMSBGb250QXdlc29tZTtcblx0XHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG5cdFx0XHRcdFx0XHRmb250LXNpemU6IDI2cHg7XG5cdFx0XHRcdFx0XHRib3JkZXItcmFkaXVzOiA1MCU7XG5cdFx0XHRcdFx0XHRwYWRkaW5nOiA1cHggNnB4O1xuXHRcdFx0XHRcdFx0dGV4dC1yZW5kZXJpbmc6IGF1dG87XG5cdFx0XHRcdFx0XHQtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcblx0XHRcdFx0XHRcdC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHRcdFx0XHR0b3A6IC0yMHB4Oztcblx0XHRcdFx0XHRcdHJpZ2h0OiA1MCU7XG5cdFx0XHRcdFx0XHRtYXJnaW4tcmlnaHQ6IC0xOHB4O1xuXHRcdFx0XHRcdFx0Y29sb3I6ICMzYWJjMDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c3BhbiB7XG5cdFx0XHRcdFx0Zm9udC13ZWlnaHQ6IDcwMDtcblx0XHRcdFx0XHRjb2xvcjogIzNhYmMwMTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGEge1xuXHRcdFx0XHRcdGNvbG9yOiAjYWFhO1xuXHRcdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0XHRcdG1hcmdpbi10b3A6IDEycHg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aW5wdXRbdHlwZT10ZXh0XSB7XG5cdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0XHR3aWR0aDogOTklO1xuXHRcdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjZDZkNmQ2O1xuXHRcdFx0XHRwYWRkaW5nOiAxMHB4O1xuXHRcdFx0XHRib3gtc2hhZG93OiBub25lO1xuXHRcdFx0XHRtYXJnaW46IDIwcHggYXV0byAwIGF1dG87XG5cdFx0XHR9XG5cblx0XHRcdCN3cGZvcm1zLWVtYmVkLXNob3J0Y29kZSB7XG5cdFx0XHRcdG1hcmdpbjogMjBweCAwO1xuXHRcdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cdFx0XHRcdGZvbnQtc2l6ZTogMjRweDtcblx0XHRcdFx0cGFkZGluZzogOHB4IDVweDtcblx0XHRcdH1cblxuXHRcdFx0I3dwZm9ybXMtZW1iZWQtc2hvcnRjb2RlOmRpc2FibGVkIHtcblx0XHRcdFx0Y29sb3I6ICMzMzM7XG5cdFx0XHR9XG5cblx0XHRcdGJ1dHRvbi5idG4tY29uZmlybSB7XG5cdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICRvcmFuZ2U7XG5cdFx0XHRcdGNvbG9yOiAjZmZmO1xuXHRcdFx0XHRvdXRsaW5lOiBub25lO1xuXG5cdFx0XHRcdCY6aG92ZXIge1xuXHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICRkYXJrb3JhbmdlO1xuXHRcdFx0XHRcdGJvcmRlci1jb2xvcjogJGRhcmtvcmFuZ2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0YnV0dG9uLFxuXHRcdFx0YnV0dG9uLmJ0bi1kZWZhdWx0IHtcblx0XHRcdFx0Y29sb3I6ICM2NjY7XG5cdFx0XHR9XG5cblx0XHRcdGJ1dHRvbi5idG4tYmxvY2sge1xuXHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0bWFyZ2luOiAwIDAgMTBweCAwICFpbXBvcnRhbnQ7XG5cdFx0XHR9XG5cblx0XHRcdGJ1dHRvbi5idG4tbm9ybWFsLWNhc2Uge1xuXHRcdFx0XHR0ZXh0LXRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xuXHRcdFx0fVxuXG5cdFx0XHQuZXJyb3Ige1xuXHRcdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdFx0XHRjb2xvcjogcmVkO1xuXHRcdFx0fVxuXG5cdFx0XHQud3Bmb3Jtcy1lcnJvciB7XG5cdFx0XHRcdGJvcmRlcjogMXB4IHNvbGlkICNlYmNjZDEgIWltcG9ydGFudDtcblx0XHRcdH1cblxuXHRcdFx0Lmpjb25maXJtLXRpdGxlLWMgLmpjb25maXJtLWljb24tYyB7XG5cdFx0XHRcdC13ZWJraXQtdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50O1xuXHRcdFx0XHR0cmFuc2l0aW9uOiBub25lICFpbXBvcnRhbnQ7XG5cdFx0XHRcdC13ZWJraXQtdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XG5cdFx0XHRcdC1tcy10cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcblx0XHRcdFx0dHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XG5cdFx0XHRcdGZvbnQtc2l6ZTogNDVweCAhaW1wb3J0YW50O1xuXHRcdFx0fVxuXG5cdFx0XHQmLndwZm9ybXMtcHJvdmlkZXJzLWFjY291bnQtYWRkLW1vZGFsIHtcblxuXHRcdFx0XHRkaXYuamNvbmZpcm0tdGl0bGUtYyB7XG5cdFx0XHRcdFx0Zm9udC1zaXplOiAyMHB4O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGl2Lmpjb25maXJtLWNvbnRlbnQge1xuXG5cdFx0XHRcdFx0LmRlc2NyaXB0aW9uIHtcblx0XHRcdFx0XHRcdGZvbnQtc2l6ZTogMTNweDtcblx0XHRcdFx0XHRcdGxpbmUtaGVpZ2h0OiAxLjQ7XG5cdFx0XHRcdFx0XHRtYXJnaW4tdG9wOiAxNnB4O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlucHV0W3R5cGU9XCJ0ZXh0XCJdIHtcblx0XHRcdFx0XHRcdG1hcmdpbi10b3A6IDEwcHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LmNob2ljZXMge1xuXHRcdHRleHQtYWxpZ246IGxlZnQ7XG5cdFx0Zm9udC1zaXplOiAxNnB4O1xuXG5cdFx0aW5wdXRbdHlwZT10ZXh0XS5jaG9pY2VzX19pbnB1dCB7XG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcblx0XHR9XG5cdH1cbn1cbiIsIi8vIEFsZXJ0IHN0eWxlcy5cbi53cGZvcm1zLWFkbWluLXBhZ2Uge1xuXG5cdC53cGZvcm1zLWFsZXJ0IHtcblx0XHRwYWRkaW5nOiAxNnB4O1xuXHRcdG1hcmdpbi1ib3R0b206IDE4cHg7XG5cdFx0Ym9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG5cblx0XHRoNCB7XG5cdFx0XHRtYXJnaW4tdG9wOiAwO1xuXHRcdFx0Y29sb3I6IGluaGVyaXQ7XG5cdFx0fVxuXG5cdFx0cCB7XG5cdFx0XHRtYXJnaW46IDAgMCAxNXB4IDA7XG5cblx0XHRcdCY6bGFzdC1vZi10eXBlIHtcblx0XHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdCYud3Bmb3Jtcy1hbGVydC1ub21hcmdpbiB7XG5cdFx0XHRtYXJnaW46IDA7XG5cdFx0fVxuXG5cdFx0Ji53cGZvcm1zLWFsZXJ0LXNtYWxsIHtcblx0XHRcdGZvbnQtc2l6ZTogMTJweDtcblx0XHR9XG5cblx0XHQmLndwZm9ybXMtYWxlcnQtc3VjY2VzcyB7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4O1xuXHRcdFx0Ym9yZGVyLWNvbG9yOiAjZDZlOWM2O1xuXHRcdFx0Y29sb3I6ICMzYzc2M2Q7XG5cdFx0fVxuXG5cdFx0Ji53cGZvcm1zLWFsZXJ0LWluZm8ge1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2Q5ZWRmNztcblx0XHRcdGJvcmRlci1jb2xvcjogI2JjZThmMTtcblx0XHRcdGNvbG9yOiAjMzE3MDhmO1xuXHRcdH1cblxuXHRcdCYud3Bmb3Jtcy1hbGVydC13YXJuaW5nIHtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmY2Y4ZTM7XG5cdFx0XHRib3JkZXItY29sb3I6ICNmYWViY2M7XG5cdFx0XHRjb2xvcjogIzhhNmQzYjtcblx0XHR9XG5cblx0XHQmLndwZm9ybXMtYWxlcnQtZGFuZ2VyIHtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGU7XG5cdFx0XHRib3JkZXItY29sb3I6ICNlYmNjZDE7XG5cdFx0XHRjb2xvcjogI2E5NDQ0Mjtcblx0XHR9XG5cdH1cbn0iLCIvLyBGbGFnIGljb25zLlxuLndwZm9ybXMtZmxhZyB7XG5cdHdpZHRoOiAxNnB4O1xuXHRoZWlnaHQ6IDE2cHg7XG5cdGJhY2tncm91bmQ6dXJsKC4uL2ltYWdlcy9mbGFncy5wbmcpIG5vLXJlcGVhdDtcblx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1hZCB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggMH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWFlIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAwfVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctYWYge2JhY2tncm91bmQtcG9zaXRpb246IC00OHB4IDB9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1hZyB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggMH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWFpIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAwfVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctYWwge2JhY2tncm91bmQtcG9zaXRpb246IC05NnB4IDB9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1hbSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IDB9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1hbiB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IDB9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1hbyB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IDB9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1hciB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IDB9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1hcyB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IDB9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1hdCB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IDB9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1hdSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IDB9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1hdyB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IDB9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1heiB7YmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTZweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWJhIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTZweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWJiIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTZweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWJkIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTZweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWJlIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTZweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWJmIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTZweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWJnIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTZweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWJoIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE2cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1iaSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xNnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctYmoge2JhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTZweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWJtIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTE2cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1ibiB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xNnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctYm8ge2JhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtMTZweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWJyIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTE2cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1icyB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC0xNnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctYnQge2JhY2tncm91bmQtcG9zaXRpb246IDAgLTMycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1idyB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTMycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1ieSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTMycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1ieiB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTMycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1jYSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTMycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1jZCB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTMycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1jZiB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTMycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1jZyB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0zMnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctY2gge2JhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMzJweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWNpIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTMycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1jayB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0zMnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctY2wge2JhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMzJweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWNtIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTMycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1jbiB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC0zMnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctY28ge2JhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtMzJweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWNyIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC00OHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctY3Uge2JhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC00OHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctY3Yge2JhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC00OHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctY3kge2JhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC00OHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctY3oge2JhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC00OHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctZGUge2JhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC00OHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctZGoge2JhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC00OHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctZGsge2JhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtNDhweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWRtIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTQ4cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1kbyB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC00OHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctZHoge2JhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtNDhweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWVjIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTQ4cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1lZSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC00OHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctZWcge2JhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtNDhweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWVoIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTQ4cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1lciB7YmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNjRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWVzIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtNjRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWV0IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtNjRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWZpIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtNjRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWZqIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtNjRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWZtIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtNjRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWZvIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtNjRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWZyIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTY0cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1nYSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC02NHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctZ2Ige2JhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtNjRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWdkIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTY0cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1nZSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC02NHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctZ2cge2JhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtNjRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWdoIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTY0cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1naSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC02NHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctZ2wge2JhY2tncm91bmQtcG9zaXRpb246IDAgLTgwcHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1nbSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTgwcHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1nbiB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTgwcHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1ncCB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTgwcHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1ncSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTgwcHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1nciB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTgwcHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1ndCB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTgwcHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1ndSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC04MHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctZ3cge2JhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtODBweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWd5IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTgwcHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1oayB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC04MHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctaG4ge2JhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtODBweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWhyIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTgwcHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1odCB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC04MHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctaHUge2JhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtODBweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWlkIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC05NnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctaWUge2JhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC05NnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctaWwge2JhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC05NnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctaW0ge2JhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC05NnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctaW4ge2JhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC05NnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctaXEge2JhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC05NnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctaXIge2JhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC05NnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctaXMge2JhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtOTZweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWl0IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTk2cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1qZSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC05NnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctam0ge2JhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtOTZweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWpvIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTk2cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1qcCB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC05NnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWcta2Uge2JhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtOTZweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWtnIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTk2cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1raCB7YmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTEycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1raSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTExMnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWcta20ge2JhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xMTJweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWtuIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTEycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1rcCB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTExMnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWcta3Ige2JhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xMTJweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWt3IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTEycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1reSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xMTJweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWt6IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTExMnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctbGEge2JhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTEycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1sYiB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0xMTJweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWxjIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTExMnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctbGkge2JhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtMTEycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1sayB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC0xMTJweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWxyIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTExMnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctbHMge2JhY2tncm91bmQtcG9zaXRpb246IDAgLTEyOHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctbHQge2JhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xMjhweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLWx1IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1sdiB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTEyOHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctbHkge2JhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xMjhweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLW1hIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTI4cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1tYyB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTEyOHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctbWQge2JhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTI4cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1tZSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xMjhweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLW1nIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTEyOHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctbWgge2JhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtMTI4cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1tayB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xMjhweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLW1sIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTEyOHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctbW0ge2JhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtMTI4cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1tbiB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC0xMjhweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLW1vIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNDRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLW1xIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTQ0cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1tciB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTE0NHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctbXMge2JhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xNDRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLW10IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTQ0cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1tdSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTE0NHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctbXYge2JhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xNDRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLW13IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE0NHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctbXgge2JhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTQ0cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1teSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xNDRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLW16IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTE0NHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctbmEge2JhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMTQ0cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1uYyB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0xNDRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLW5lIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTE0NHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctbmcge2JhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtMTQ0cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1uaSB7YmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTYwcHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1ubCB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTE2MHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctbm8ge2JhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNjBweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLW5wIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTYwcHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1uciB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE2MHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctbnoge2JhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNjBweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLW9tIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTYwcHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1wYSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xNjBweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXBlIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTE2MHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctcGYge2JhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTYwcHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1wZyB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0xNjBweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXBoIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTE2MHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctcGsge2JhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtMTYwcHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1wbCB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC0xNjBweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXByIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTE2MHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctcHMge2JhY2tncm91bmQtcG9zaXRpb246IDAgLTE3NnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctcHQge2JhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xNzZweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXB3IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTc2cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1weSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE3NnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctcWEge2JhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xNzZweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXJlIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTc2cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1ybyB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTE3NnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctcnMge2JhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTc2cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1ydSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xNzZweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXJ3IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTE3NnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctc2Ege2JhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtMTc2cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1zYiB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xNzZweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXNjIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTE3NnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctc2Qge2JhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtMTc2cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1zZSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTIyNHB4IC0xNzZweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXNnIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xOTJweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXNpIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTkycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1zayB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTE5MnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctc2wge2JhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xOTJweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXNtIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTkycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1zbiB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTE5MnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctc28ge2JhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xOTJweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXNyIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE5MnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctc3Qge2JhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTkycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy1zdiB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xOTJweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXN5IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTE5MnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctc3oge2JhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMTkycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy10YyB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0xOTJweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXRkIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTE5MnB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctdGcge2JhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtMTkycHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy10aCB7YmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMjA4cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy10aiB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTIwOHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctdGwge2JhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0yMDhweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXRtIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMjA4cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy10biB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTIwOHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctdG8ge2JhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0yMDhweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXRyIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMjA4cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy10dCB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0yMDhweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXR2IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTIwOHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctdHcge2JhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMjA4cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy10eiB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0yMDhweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXVhIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTIwOHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctdWcge2JhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtMjA4cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy11cyB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC0yMDhweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXV5IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTIwOHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctdXoge2JhY2tncm91bmQtcG9zaXRpb246IDAgLTIyNHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctdmEge2JhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0yMjRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXZjIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMjI0cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy12ZSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTIyNHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctdmcge2JhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0yMjRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXZpIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMjI0cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy12biB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTIyNHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctdnUge2JhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMjI0cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy13cyB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0yMjRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXllIHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTIyNHB4fVxuLndwZm9ybXMtZmxhZy53cGZvcm1zLWZsYWctemEge2JhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtMjI0cHh9XG4ud3Bmb3Jtcy1mbGFnLndwZm9ybXMtZmxhZy16bSB7YmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0yMjRweH1cbi53cGZvcm1zLWZsYWcud3Bmb3Jtcy1mbGFnLXp3IHtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTkycHggLTIyNHB4fVxuIiwiLy8gSGVhZGVyIHN0eWxlcy5cblxuI3dwZm9ybXMtaGVhZGVyLXRlbXAge1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdG1hcmdpbjogMDtcblx0cG9zaXRpb246IGFic29sdXRlO1xuXHR0b3A6IC0xcHg7XG5cdGxlZnQ6IDIwcHg7XG5cdHJpZ2h0OiAyMHB4O1xuXHR6LWluZGV4OiA5OTtcbn1cblxuI3dwZm9ybXMtaGVhZGVyIHtcblx0Ym9yZGVyLXRvcDogM3B4IHNvbGlkICRvcmFuZ2U7XG5cdHBhZGRpbmc6IDIycHggMjBweDtcblxuXHRpbWcge1xuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdG1hcmdpbjogMDtcblx0XHRtYXgtd2lkdGg6IDIzNXB4O1xuXG5cdFx0QGluY2x1ZGUgbWVkaWEoXCI8PXRhYmxldFwiKSB7XG5cdFx0XHRtYXgtd2lkdGg6IDIwMHB4O1xuXHRcdH1cblx0fVxufVxuIiwiLy8gUGFnZSB0aXRsZSBhbmQgdGFicyBzdHlsZXMuXG4ud3Bmb3Jtcy1hZG1pbi13cmFwIHtcblxuXHQvLyBUaXRsZSBhcmVhLlxuXHQucGFnZS10aXRsZSB7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcblx0XHRtYXJnaW46IDAgMCAyMHB4IDA7XG5cdFx0cGFkZGluZzogMTVweCAyMHB4O1xuXG5cdFx0LmFkZC1uZXctaDIge1xuXHRcdFx0bWFyZ2luLWxlZnQ6IDI4cHg7XG5cdFx0fVxuXHR9XG59XG5cbi8vIFRhYiBuYXZpZ2F0aW9uLlxuLndwZm9ybXMtYWRtaW4tdGFicyB7XG5cdGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG5cdG1hcmdpbjogMCAwIDIwcHggMDtcblx0cGFkZGluZzogMCAyMHB4O1xuXHRsaXN0LXN0eWxlOiBub25lO1xuXHRvdmVyZmxvdzogYXV0bztcblx0Zm9udC1zaXplOiAxNHB4O1xuXG5cdGxpIHtcblx0XHRtYXJnaW46IDAgMzBweCAwIDA7XG5cdFx0cGFkZGluZzogMDtcblx0XHRmbG9hdDogbGVmdDtcblxuXHRcdCY6bGFzdC1vZi10eXBlIHtcblx0XHRcdG1hcmdpbjogMDtcblx0XHR9XG5cblx0XHRhIHtcblx0XHRcdGNvbG9yOiAjNjY2O1xuXHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRwYWRkaW5nOiAyMHB4IDAgMThweCAwO1xuXHRcdFx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXHRcdFx0Ym9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICNmZmY7XG5cdFx0XHRib3gtc2hhZG93OiBub25lO1xuXG5cdFx0XHQmOmhvdmVyIHtcblx0XHRcdFx0Ym9yZGVyLWNvbG9yOiAjOTk5O1xuXHRcdFx0fVxuXG5cdFx0XHQmLmFjdGl2ZSB7XG5cdFx0XHRcdGJvcmRlci1jb2xvcjogJG9yYW5nZTtcblx0XHRcdH1cblxuXHRcdFx0Jjpmb2N1cyB7XG5cdFx0XHRcdGJveC1zaGFkb3c6IG5vbmU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG4iLCIvLyBHZW5lcmFsIGFkbWluIHN0eWxpbmcuXG5cbi8vIENvcmUgYWRtaW4gc3R5bGUgb3ZlcnJpZGVzLlxuI3dwY29udGVudCB7XG5cdHBhZGRpbmctbGVmdDogMCAhaW1wb3J0YW50O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cblx0QGluY2x1ZGUgbWVkaWEoXCI8PXBob25lXCIpIHtcblx0XHRwYWRkaW5nLXRvcDogNDZweDtcblx0fVxufVxuXG4jd3Bib2R5IHtcblx0QGluY2x1ZGUgbWVkaWEoXCI8PXBob25lXCIpIHtcblx0XHRwYWRkaW5nLXRvcDogMDtcblx0fVxufVxuXG4vLyBUaGlzIGNsYXNzIGlzIGF1dG8gYXBwbGllZCB0byBfYWxsXyBXUEZvcm1zIGFkbWluIHBhZ2VzL3NjcmVlbnMuXG4ud3Bmb3Jtcy1hZG1pbi1wYWdlIHtcblxuXHQvLyBUaGlzIGlzIGhpZGRlbiBvbiBsb2FkLCB0aGVuIG1hZGUgdmlzaWJsZSB3aXRoIEpTLCB0b1xuXHQvLyBwcmV2ZW50IGl0IGZyb20gXCJqdW1waW5nXCIuXG5cdCNzY3JlZW4tbWV0YS1saW5rcyxcblx0I3NjcmVlbi1tZXRhIHtcblx0XHRkaXNwbGF5OiBub25lO1xuXHR9XG5cblx0Ly8gUmVzcG9uc2l2ZSB2aWRlbyBjb250YWluZXIsIHJlcGxhY2VzIEpTIG1ldGhvZC5cblx0LnZpZGVvLWNvbnRhaW5lciB7XG5cdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdHBhZGRpbmctYm90dG9tOiA1Ni4xJTtcblx0XHQvLyBwYWRkaW5nLXRvcDogMzBweDtcblx0XHRoZWlnaHQ6IDA7XG5cdFx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0fVxuXG5cdC52aWRlby1jb250YWluZXIgaWZyYW1lLFxuXHQudmlkZW8tY29udGFpbmVyIG9iamVjdCxcblx0LnZpZGVvLWNvbnRhaW5lciBlbWJlZCB7XG5cdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdHRvcDogMDtcblx0XHRsZWZ0OiAwO1xuXHRcdHdpZHRoOiAxMDAlO1xuXHRcdGhlaWdodDogMTAwJTtcblx0fVxuXG5cdC8vIEZhbmN5IGZpbGUgdXBsb2FkLlxuXHQud3Bmb3Jtcy1maWxlLXVwbG9hZCB7XG5cblx0XHRpbnB1dFt0eXBlPWZpbGVdIHtcblx0XHRcdHdpZHRoOiAwLjFweDtcblx0XHRcdGhlaWdodDogMC4xcHg7XG5cdFx0XHRvcGFjaXR5OiAwO1xuXHRcdFx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdHotaW5kZXg6IC0xO1xuXHRcdH1cblxuXHRcdGxhYmVsIHtcblx0XHRcdHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuXHRcdFx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcblx0XHRcdGN1cnNvcjogcG9pbnRlcjtcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdG92ZXJmbG93OiBoaWRkZW47XG5cdFx0XHRwYWRkaW5nOiAwO1xuXHRcdH1cblxuXHRcdGlucHV0W3R5cGU9ZmlsZV06Zm9jdXMgKyBsYWJlbCxcblx0XHRpbnB1dFt0eXBlPWZpbGVdLmhhcy1mb2N1cyArIGxhYmVsIHtcblx0XHRcdG91dGxpbmU6IDFweCBkb3R0ZWQgIzAwMDtcblx0XHRcdG91dGxpbmU6IC13ZWJraXQtZm9jdXMtcmluZy1jb2xvciBhdXRvIDVweDtcblx0XHR9XG5cblx0XHQuZmxkIHtcblx0XHRcdHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuXHRcdFx0d2hpdGUtc3BhY2U6IG5vd3JhcDtcblx0XHRcdG92ZXJmbG93OiBoaWRkZW47XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuXHRcdFx0Ym9yZGVyOiAxcHggc29saWQgI2RkZDtcblx0XHRcdGJvcmRlci1yYWRpdXM6IDNweDtcblx0XHRcdGJveC1zaGFkb3c6IG5vbmU7XG5cdFx0XHRjb2xvcjogIzMzMztcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG5cdFx0XHRwYWRkaW5nOiA3cHggMTJweDtcblx0XHRcdG1hcmdpbjogMCAxMHB4IDAgMDtcblx0XHRcdHdpZHRoOiA0MDBweDtcblx0XHRcdG1pbi1oZWlnaHQ6IDM1cHg7XG5cblx0XHRcdC5wbGFjZWhvbGRlciB7XG5cdFx0XHRcdGNvbG9yOiAjY2NjO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHN0cm9uZyAuZmEge1xuXHRcdFx0bWFyZ2luLXJpZ2h0OiA4cHg7XG5cdFx0fVxuXHR9XG5cblx0Ly8gR2VuZXJpYyBjbGFzcyBmb3IgaGlkaW5nIGRpc3BsYXk7XG5cdC53cGZvcm1zLWhpZGUge1xuXHRcdGRpc3BsYXk6IG5vbmU7XG5cdH1cblxuXHQvLyBQbGFjZWhvbGRlciBoMSBmb3IgYWRtaW4gbm90aWNlcy5cblx0LndwZm9ybXMtaDEtcGxhY2Vob2xkZXIge1xuXHRcdGRpc3BsYXk6IG5vbmU7XG5cdH1cblxuXHQvLyBIaWRlIG5vdGljZXMgb24gbG9hZCB0byBwcmV2ZW50IGp1bXBpbmcuIEpTIHdpbGwgcmV2ZWFsIHRoZW0uXG5cdC5ub3RpY2Uge1xuXHRcdGRpc3BsYXk6IG5vbmU7XG5cdH1cblxuXHQubGl0eSB7XG5cdFx0ei1pbmRleDogOTk5OTk5OTk5O1xuXHRcdHBhZGRpbmc6IDIwcHg7XG5cdH1cblxuXHQubGl0eS1jbG9zZSB7XG5cdFx0bWFyZ2luOiAxMHB4O1xuXHR9XG5cblx0LmxpdHktY29udGVudCB7XG5cdFx0bWF4LXdpZHRoOiA4MHZ3O1xuXHRcdG1heC1oZWlnaHQ6IDgwdmg7XG5cblx0XHRpbWcge1xuXHRcdFx0bWF4LWhlaWdodDogODB2aCFpbXBvcnRhbnQ7XG5cdFx0XHRtYXgtd2lkdGg6IDgwdnchaW1wb3J0YW50O1xuXHRcdH1cblx0fVxuXG5cdC8vIENob2ljZXMuanMgbXVwdGlscGxlIHNlbGVjdCBwbGFjZWhvbGRlciAoV1AgNS4zIGltcHJvdmVtZW50KS5cblx0aW5wdXQuY2hvaWNlc19faW5wdXQge1xuXHRcdGxpbmUtaGVpZ2h0OiBub3JtYWw7XG5cdH1cblxuXHQvLyBGb2N1cyBzdGF0ZS5cblx0aW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEge1xuXHRcdCY6Zm9jdXMge1xuXHRcdFx0Ym9yZGVyOiAxcHggc29saWQgIzAxNkFBQiAhaW1wb3J0YW50O1xuXHRcdFx0Ym94LXNoYWRvdzogMCAwIDAgMXB4ICMwMTZBQUIgIWltcG9ydGFudDtcblx0XHRcdG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcblx0XHR9XG5cdH1cblxuXHRhOmZvY3VzIHtcblx0XHRib3gtc2hhZG93OiAwIDAgMnB4IDFweCAjMDE2QUFCQ0M7XG5cdH1cbn1cblxuLy8gQWRtaW4gd3JhcCAtIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBoZWFkZXIuXG4ud3Bmb3Jtcy1hZG1pbi13cmFwIHtcblxuXHRtYXJnaW46IDA7XG5cblx0Lm5vdGljZSB7XG5cdFx0bWFyZ2luLWxlZnQ6IDIwcHggIWltcG9ydGFudDtcblx0XHRtYXJnaW4tcmlnaHQ6IDIwcHggIWltcG9ydGFudDtcblx0fVxufVxuXG4vLyBBZG1pbiBjb250ZW50LlxuLndwZm9ybXMtYWRtaW4tY29udGVudCB7XG5cdHBhZGRpbmctbGVmdDogMjBweDtcblx0cGFkZGluZy1yaWdodDogMjBweDtcblxuXHQmOmJlZm9yZSB7XG5cdFx0Y29udGVudDogXCIgXCI7XG5cdFx0ZGlzcGxheTogdGFibGU7XG5cdH1cblxuXHQmOmFmdGVyIHtcblx0XHRjbGVhcjogYm90aDtcblx0XHRjb250ZW50OiBcIiBcIjtcblx0XHRkaXNwbGF5OiB0YWJsZTtcblx0fVxuXG5cdGhyIHtcblx0XHRib3JkZXI6IG5vbmU7XG5cdFx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICNlNGU0ZTQ7XG5cdFx0bWFyZ2luOiAyMHB4IDA7XG5cdFx0YmFja2dyb3VuZDogbm9uZTtcblx0fVxufVxuXG4ud3Bmb3Jtcy1jbGVhciB7XG5cblx0JjpiZWZvcmUge1xuXHRcdGNvbnRlbnQ6IFwiIFwiO1xuXHRcdGRpc3BsYXk6IHRhYmxlO1xuXHR9XG5cblx0JjphZnRlciB7XG5cdFx0Y2xlYXI6IGJvdGg7XG5cdFx0Y29udGVudDogXCIgXCI7XG5cdFx0ZGlzcGxheTogdGFibGU7XG5cdH1cbn1cblxuLndwZm9ybXMtYWRtaW4tY29sdW1ucyB7XG5cblx0JiA+IGRpdltjbGFzcyo9XCItY29sdW1uLVwiXSB7XG5cdFx0ZmxvYXQ6IGxlZnQ7XG5cdH1cblxuXHQud3Bmb3Jtcy1hZG1pbi1jb2x1bW4tMjAge3dpZHRoOiAyMCV9XG5cdC53cGZvcm1zLWFkbWluLWNvbHVtbi0zMyB7d2lkdGg6IDMzLjMzMzMzJX1cblx0LndwZm9ybXMtYWRtaW4tY29sdW1uLTQwIHt3aWR0aDogNDAlfVxuXHQud3Bmb3Jtcy1hZG1pbi1jb2x1bW4tNTAge3dpZHRoOiA1MCV9XG5cdC53cGZvcm1zLWFkbWluLWNvbHVtbi02MCB7d2lkdGg6IDYwJX1cblx0LndwZm9ybXMtYWRtaW4tY29sdW1uLTgwIHt3aWR0aDogODAlfVxuXG5cdC53cGZvcm1zLWFkbWluLWNvbHVtbi1sYXN0IHtmbG9hdDogcmlnaHQgIWltcG9ydGFudH1cblxuXHQmOmFmdGVyIHtcblx0XHRjb250ZW50OiBcIlwiO1xuXHRcdGRpc3BsYXk6IHRhYmxlO1xuXHRcdGNsZWFyOiBib3RoO1xuXHR9XG59XG5cbi5saXR5LWFjdGl2ZSwgLmxpdHktYWN0aXZlIGJvZHkud3Bmb3Jtcy1hZG1pbi1wYWdlIHtcblx0b3ZlcmZsb3c6IHNjcm9sbDtcbn0iLCIvLyBGbHlvdXQgTWVudSBzdHlsZXMuXG5cbiN3cGZvcm1zLWZseW91dCB7XG5cblx0JHN0YXJ0OiA3NXB4O1xuXHQkc3RlcDogNTVweDtcblx0JHRyYW5zOiAwLjJzO1xuXHQkZGVsYXk6IDM1bXM7XG5cblx0cG9zaXRpb246IGZpeGVkO1xuXHR6LWluZGV4OiA5OTk5OTtcblx0dHJhbnNpdGlvbjogYWxsICR0cmFucyBlYXNlLWluLW91dDtcblx0cmlnaHQ6IDQwcHg7XG5cdGJvdHRvbTogNDBweDtcblx0b3BhY2l0eTogMTtcblxuXHRAaW5jbHVkZSBtZWRpYSgnPGRlc2t0b3AnKSB7XG5cdFx0ZGlzcGxheTogbm9uZTtcblx0fVxuXG5cdC53cGZvcm1zLWZseW91dC1oZWFkIHtcblxuXHRcdGRpc3BsYXk6IGJsb2NrO1xuXG5cdFx0aW1nIHtcblx0XHRcdHdpZHRoOiA1NHB4O1xuXHRcdFx0aGVpZ2h0OiA1NHB4O1xuXHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRib3JkZXItcmFkaXVzOiA1MCU7XG5cdFx0XHRib3JkZXI6IDNweCBzb2xpZCAjRTE3NzJGO1xuXHRcdFx0b3ZlcmZsb3c6IGhpZGRlbjtcblx0XHRcdGJveC1zaGFkb3c6IDAgM3B4IDIwcHggcmdiYSgwLDAsMCwuMik7XG5cdFx0XHR0cmFuc2l0aW9uOiBhbGwgJHRyYW5zIGVhc2UtaW4tb3V0O1xuXHRcdH1cblxuXHRcdCY6aG92ZXIgaW1nIHtcblx0XHRcdGJveC1zaGFkb3c6IDAgM3B4IDMwcHggcmdiYSgwLDAsMCwuMjUpO1xuXHRcdH1cblxuXHRcdC53cGZvcm1zLWZseW91dC1sYWJlbCB7XG5cdFx0XHRvcGFjaXR5OiAwO1xuXHRcdFx0dHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDApO1xuXHRcdFx0bWFyZ2luLXJpZ2h0OiAtNTBweDtcblx0XHR9XG5cblx0XHQmOmhvdmVyIC53cGZvcm1zLWZseW91dC1sYWJlbCB7XG5cdFx0XHRvcGFjaXR5OiAxO1xuXHRcdFx0dHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpIHNjYWxlKDEpO1xuXHRcdFx0bWFyZ2luLXJpZ2h0OiAwO1xuXHRcdH1cblxuXHRcdCY6Zm9jdXMge1xuXHRcdFx0Ym94LXNoYWRvdzogbm9uZTtcblx0XHR9XG5cblx0XHQud3Bmb3Jtcy1mbHlvdXQtbGFiZWwge1xuXHRcdFx0cmlnaHQ6IGNhbGMoMTAwJSArIDE1cHgpO1xuXHRcdH1cblx0fVxuXG5cdC53cGZvcm1zLWZseW91dC1sYWJlbCB7XG5cblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0dG9wOiA1MCU7XG5cdFx0cmlnaHQ6IGNhbGMoMTAwJSArIDI1cHgpO1xuXHRcdHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcblx0XHQtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcblx0XHQtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcblx0XHRjb2xvcjogI2ZmZjtcblx0XHRiYWNrZ3JvdW5kOiAjNUY1RTVFIDAgMCBuby1yZXBlYXQgcGFkZGluZy1ib3g7XG5cdFx0Zm9udC1zaXplOiAxMnB4O1xuXHRcdHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cdFx0cGFkZGluZzogNXB4IDEwcHg7XG5cdFx0aGVpZ2h0OiBhdXRvIWltcG9ydGFudDtcblx0XHRsaW5lLWhlaWdodDogaW5pdGlhbDtcblx0XHR0cmFuc2l0aW9uOiBhbGwgJHRyYW5zIGVhc2Utb3V0O1xuXHRcdGJvcmRlci1yYWRpdXM6IDNweDtcblx0XHQtbW96LWJvcmRlci1yYWRpdXM6IDNweDtcblx0XHQtd2Via2l0LWJvcmRlci1yYWRpdXM6IDNweDtcblx0fVxuXG5cdC53cGZvcm1zLWZseW91dC1pdGVtIHtcblxuXHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRsZWZ0OiAxMHB4O1xuXHRcdHdpZHRoOiA0MHB4O1xuXHRcdGhlaWdodDogNDBweDtcblx0XHRvcGFjaXR5OiAwO1xuXHRcdHZpc2liaWxpdHk6IGhpZGRlbjtcblx0XHR0cmFuc2l0aW9uOiBhbGwgJHRyYW5zIGVhc2UtaW4tb3V0O1xuXHRcdHRyYW5zZm9ybTogc2NhbGUoMCk7XG5cdFx0Ym9yZGVyLXJhZGl1czogNTAlO1xuXHRcdGJveC1zaGFkb3c6IDAgM3B4IDIwcHggcmdiYSgwLDAsMCwuMik7XG5cdFx0YmFja2dyb3VuZDogIzAzNkFBQiAwIDAgbm8tcmVwZWF0IHBhZGRpbmctYm94O1xuXHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXG5cdFx0aSB7XG5cdFx0XHRjb2xvcjogI2ZmZmZmZjtcblx0XHRcdGZvbnQtc2l6ZTogMjBweDtcblx0XHRcdGxpbmUtaGVpZ2h0OiA0MHB4O1xuXHRcdFx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcblx0XHR9XG5cblx0XHRAZm9yICRpIGZyb20gMCB0aHJvdWdoIDQge1xuXHRcdFx0Ji53cGZvcm1zLWZseW91dC1pdGVtLSN7JGl9IHtcblx0XHRcdFx0Ym90dG9tOiAkc3RhcnQgKyAkaSAqICRzdGVwO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdCY6aG92ZXIge1xuXG5cdFx0XHRib3gtc2hhZG93OiAwIDNweCAzMHB4IHJnYmEoMCwwLDAsLjI1KTtcblx0XHRcdGJhY2tncm91bmQ6ICMwMDk2RjAgMCAwIG5vLXJlcGVhdCBwYWRkaW5nLWJveDtcblxuXHRcdFx0LndwZm9ybXMtZmx5b3V0LWxhYmVsIHtcblx0XHRcdFx0YmFja2dyb3VuZDogIzQ0NDQ0NCAwIDAgbm8tcmVwZWF0IHBhZGRpbmctYm94O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdCYub3BlbmVkIHtcblxuXHRcdC53cGZvcm1zLWZseW91dC1pdGVtIHtcblx0XHRcdG9wYWNpdHk6IDE7XG5cdFx0XHR2aXNpYmlsaXR5OiB2aXNpYmxlO1xuXHRcdFx0dHJhbnNmb3JtOiBzY2FsZSgxKTtcblx0XHR9XG5cblx0XHQud3Bmb3Jtcy1mbHlvdXQtaGVhZCB7XG5cblx0XHRcdC53cGZvcm1zLWZseW91dC1sYWJlbCB7XG5cdFx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0QGZvciAkaSBmcm9tIDAgdGhyb3VnaCA0IHtcblx0XHRcdC53cGZvcm1zLWZseW91dC1pdGVtLSN7JGl9IHtcblx0XHRcdFx0dHJhbnNpdGlvbjogdHJhbnNmb3JtICR0cmFucyAkaSAqICRkZWxheSwgYmFja2dyb3VuZC1jb2xvciAkdHJhbnM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ji5vdXQge1xuXHRcdG9wYWNpdHk6IDA7XG5cdFx0dmlzaWJpbGl0eTogaGlkZGVuO1xuXHR9XG59XG4iLCIvLyBGb3JtIE92ZXJ2aWV3IC0gYWRtaW4ucGhwP3BhZ2U9d3Bmb3Jtcy1vdmVydmlld1xuI3dwZm9ybXMtb3ZlcnZpZXcge1xuXG5cdC8vIFJlbW92ZSB0aGUgdG9wIG1hcmdpbiBzbyBpdCBkaXNwbGF5cyAyMHB4IGJldHdlZW4gdGhlIGhlYWRlciBhcmVhXG5cdC8vIGFuZCB0aGUgY29udGVudCwgY29uc2lzdGVudCB3aXRoIG91ciBvdGhlciBhZG1pbiBwYWdlcy5cblx0LnRhYmxlbmF2LnRvcCB7XG5cdFx0bWFyZ2luLXRvcDogMDtcblx0fVxuXG5cdC8vIFNldCBjZXJ0YWluIGNvbHVtbiB3aWR0aHMuXG5cdC53cC1saXN0LXRhYmxlIHtcblxuXHRcdC5jb2x1bW4taWQge1xuXHRcdFx0d2lkdGg6IDMwcHg7XG5cdFx0fVxuXG5cdFx0LmNvbHVtbi1lbnRyaWVzIHtcblx0XHRcdHdpZHRoOiA3MHB4O1xuXHRcdH1cblxuXHRcdC5jb2x1bW4tc2hvcnRjb2RlIHtcblx0XHRcdHdpZHRoOiAxNTBweDtcblx0XHR9XG5cblx0XHQuY29sdW1uLWNyZWF0ZWQge1xuXHRcdFx0d2lkdGg6IDE0NXB4O1xuXHRcdH1cblx0fVxufVxuIiwiLy8gRW50cmllcyBTaW5nbGUgKERldGFpbHMpIC0gYWRtaW4ucGhwP3BhZ2U9d3Bmb3Jtcy1lbnRyaWVzJnZpZXc9ZGV0YWlsc1xuI3dwZm9ybXMtZW50cmllcy1zaW5nbGUge1xuXG5cdCNwb3N0c3R1ZmYge1xuXHRcdHBhZGRpbmc6IDA7XG5cdH1cblxuXHQvLyBNZXRhYm94ZXMgYXJlIG5vdCBtb3ZhYmxlIHNvIGRvbid0IGxldCB0aGUgdXNlciB0aGluayBzby5cblx0LnBvc3Rib3ggLmhuZGxlIHtcblx0XHRjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDtcblx0fVxuXG5cdC8vIEVudHJ5IG5hdmlnYXRpb24gLSBuZXh0L3ByZXYuXG5cdC53cGZvcm1zLWVudHJ5LW5hdmlnYXRpb24ge1xuXHRcdGZvbnQtc2l6ZTogMTNweDtcblx0XHRsaW5lLWhlaWdodDogMjlweDtcblx0XHRmbG9hdDogcmlnaHQ7XG5cdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdHBhZGRpbmctdG9wOiAycHg7XG5cdFx0cGFkZGluZy1yaWdodDogMXB4O1xuXHRcdHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cblx0XHRAaW5jbHVkZSBtZWRpYShcIjw9cGhvbmVcIikge1xuXHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHR9XG5cblx0XHQuYWRkLW5ldy1oMiB7XG5cdFx0XHR0b3A6IGF1dG87XG5cdFx0XHRtYXJnaW46IDA7XG5cdFx0XHRwYWRkaW5nOiA0cHggMHB4O1xuXHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXG5cdFx0XHRAaW5jbHVkZSBtZWRpYShcIjw9dGFibGV0XCIpIHtcblx0XHRcdFx0Zm9udC1zaXplOiAxM3B4O1xuXHRcdFx0fVxuXG5cdFx0XHQuZGFzaGljb25zIHtcblx0XHRcdFx0Zm9udC1zaXplOiAxNnB4O1xuXHRcdFx0XHRoZWlnaHQ6IGF1dG87XG5cdFx0XHRcdHdpZHRoOiAyOHB4O1xuXHRcdFx0XHRsaW5lLWhlaWdodDogMjlweDtcblx0XHRcdH1cblxuXHRcdFx0Ji5pbmFjdGl2ZSB7XG5cdFx0XHRcdG9wYWNpdHk6IDAuNTtcblx0XHRcdFx0cG9pbnRlci1ldmVudHM6IG5vbmU7XG5cdFx0XHRcdGN1cnNvcjogZGVmYXVsdDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQud3Bmb3Jtcy1lbnRyeS1uYXZpZ2F0aW9uLXRleHQge1xuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0bWFyZ2luLXJpZ2h0OiAxMHB4O1xuXHRcdH1cblxuXHRcdC53cGZvcm1zLWVudHJ5LWN1cnJlbnQge1xuXHRcdFx0dG9wOiBhdXRvO1xuXHRcdFx0bWFyZ2luOiAwIC01cHggMCAtM3B4O1xuXHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRcdFx0cGFkZGluZzogNHB4IDEwcHg7XG5cdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xuXHRcdFx0LXdlYmtpdC1ib3JkZXItcmFkaXVzOiAycHg7XG5cdFx0XHRib3JkZXItcmFkaXVzOiAycHg7XG5cdFx0XHRiYWNrZ3JvdW5kOiAjZmZmO1xuXHRcdFx0Zm9udC1zaXplOiAxM3B4O1xuXHRcdFx0bGluZS1oZWlnaHQ6IDI5cHg7XG5cdFx0XHR0ZXh0LXRyYW5zZm9ybTogY2VudGVyO1xuXHRcdH1cblxuXHR9XG5cblx0Ly8gRW50cnkgZmllbGRzIG1ldGFib3guXG5cdCN3cGZvcm1zLWVudHJ5LWZpZWxkcyB7XG5cblx0XHRoMi5obmRsZSB7XG5cdFx0XHRmb250LXNpemU6IDE4cHg7XG5cblx0XHRcdC5kYXNoaWNvbnMge1xuXHRcdFx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0XHRcdGhlaWdodDogMTZweDtcblx0XHRcdFx0d2lkdGg6IDE2cHg7XG5cdFx0XHRcdG1hcmdpbjogNHB4IDRweCAwIDA7XG5cdFx0XHRcdGNvbG9yOiAkb3JhbmdlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC5uby1maWVsZHMge1xuXHRcdFx0cGFkZGluZzogMTJweDtcblx0XHRcdG1hcmdpbjogMDtcblx0XHR9XG5cblx0XHQuaW5zaWRlIHtcblx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHRtYXJnaW46IDA7XG5cblx0XHRcdHAge1xuXHRcdFx0XHRwYWRkaW5nOiAwO1xuXHRcdFx0XHRtYXJnaW46IDA7XG5cdFx0XHR9XG5cblx0XHRcdC53cGZvcm1zLWVudHJ5LWZpZWxkLW5hbWUge1xuXHRcdFx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdFx0XHRiYWNrZ3JvdW5kOiAjZWJmM2ZiO1xuXHRcdFx0XHRwYWRkaW5nOiA4cHggMTJweDtcblx0XHRcdH1cblxuXHRcdFx0LndwZm9ybXMtZW50cnktZmllbGQtdmFsdWUge1xuXHRcdFx0XHRiYWNrZ3JvdW5kOiAjZmZmO1xuXHRcdFx0XHRwYWRkaW5nOiA4cHggMTJweDtcblx0XHRcdH1cblxuXHRcdFx0LmVtcHR5IC53cGZvcm1zLWVudHJ5LWZpZWxkLXZhbHVlIHtcblx0XHRcdFx0Zm9udC1zdHlsZTogaXRhbGljO1xuXHRcdFx0XHRjb2xvcjogIzk5OTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQud3Bmb3Jtcy1lbXB0eS1maWVsZC10b2dnbGUge1xuXHRcdFx0ZmxvYXQ6IHJpZ2h0O1xuXHRcdFx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXHRcdFx0cGFkZGluZzogNXB4IDAgMDtcblx0XHR9XG5cdH1cblxuXHQvLyBFbnRyeSBOb3RlcyBtZXRhYm94LlxuXHQjd3Bmb3Jtcy1lbnRyeS1ub3RlcyB7XG5cblx0XHQuaW5zaWRlIHtcblx0XHRcdG1hcmdpbjogMDtcblx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0fVxuXG5cdFx0LndwZm9ybXMtZW50cnktbm90ZXMtbmV3IHtcblx0XHRcdHBhZGRpbmc6IDEwcHg7XG5cdFx0fVxuXG5cdFx0Zm9ybSB7XG5cdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdH1cblxuXHRcdC5idG5zIHtcblx0XHRcdG92ZXJmbG93OiBhdXRvO1xuXHRcdFx0cGFkZGluZzogOHB4IDA7XG5cdFx0fVxuXG5cdFx0Lm5vLW5vdGVzIHtcblx0XHRcdG1hcmdpbjogMDtcblx0XHRcdHBhZGRpbmc6IDRweCAxMHB4IDhweDtcblx0XHR9XG5cblx0XHQud3Bmb3Jtcy1lbnRyeS1ub3Rlcy1zaW5nbGUge1xuXHRcdFx0cGFkZGluZzogMTBweDtcblx0XHRcdGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTNlMWUzO1xuXG5cdFx0XHRwOmxhc3Qtb2YtdHlwZSB7XG5cdFx0XHRcdG1hcmdpbi1ib3R0b206IDA7XG5cdFx0XHR9XG5cblx0XHRcdCYuZXZlbiB7XG5cdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LndwZm9ybXMtZW50cnktbm90ZXMtYnlsaW5lIHtcblx0XHRcdGNvbG9yOiAjODg4O1xuXHRcdFx0bWFyZ2luLWJvdHRvbTogMTBweDtcblxuXHRcdFx0LnNlcCB7XG5cdFx0XHRcdGNvbG9yOiAjZGRkO1xuXHRcdFx0fVxuXG5cdFx0XHQubm90ZXMtdXNlciB7XG5cdFx0XHRcdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblx0XHRcdFx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0XHRcdH1cblxuXHRcdFx0Lm5vdGUtZGVsZXRlIHtcblx0XHRcdFx0Y29sb3I6ICNhMDA7XG5cdFx0XHRcdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblxuXHRcdFx0XHQmOmhvdmVyIHtcblx0XHRcdFx0XHRjb2xvcjogcmVkO1xuXHRcdFx0XHRcdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEVudHJ5IExvZ3MgbWV0YWJveC5cblx0I3dwZm9ybXMtZW50cnktbG9ncyB7XG5cblx0XHQuaW5zaWRlIHtcblx0XHRcdG1hcmdpbjogMDtcblx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0fVxuXG5cdFx0Zm9ybSB7XG5cdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdH1cblxuXHRcdC5idG5zIHtcblx0XHRcdG92ZXJmbG93OiBhdXRvO1xuXHRcdFx0cGFkZGluZzogOHB4IDA7XG5cdFx0fVxuXG5cdFx0Lm5vLWxvZ3Mge1xuXHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0cGFkZGluZzogNHB4IDEwcHggOHB4O1xuXHRcdH1cblxuXHRcdC53cGZvcm1zLWVudHJ5LWxvZ3Mtc2luZ2xlIHtcblx0XHRcdHBhZGRpbmc6IDEwcHg7XG5cdFx0XHRib3JkZXItdG9wOiAxcHggc29saWQgI2UzZTFlMztcblxuXHRcdFx0JjpmaXJzdC1vZi10eXBlIHtcblx0XHRcdFx0Ym9yZGVyLXRvcDogMDtcblx0XHRcdH1cblxuXHRcdFx0cDpsYXN0LW9mLXR5cGUge1xuXHRcdFx0XHRtYXJnaW4tYm90dG9tOiAwO1xuXHRcdFx0fVxuXG5cdFx0XHQmLmV2ZW4ge1xuXHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC53cGZvcm1zLWVudHJ5LWxvZ3MtYnlsaW5lIHtcblx0XHRcdGNvbG9yOiAjODg4O1xuXHRcdFx0bWFyZ2luLWJvdHRvbTogMTBweDtcblxuXHRcdFx0Lm5vdGVzLXVzZXIge1xuXHRcdFx0XHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cdFx0XHRcdGZvbnQtd2VpZ2h0OiA2MDA7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gRW50cnkgRGV0YWlscywgQWN0aW9ucywgYW5kIFBheW1lbnRzLlxuXHQjd3Bmb3Jtcy1lbnRyeS1kZXRhaWxzIC5pbnNpZGUsXG5cdCN3cGZvcm1zLWVudHJ5LXBheW1lbnQgLmluc2lkZSxcblx0I3dwZm9ybXMtZW50cnktYWN0aW9ucyAuaW5zaWRlIHtcblx0XHRtYXJnaW46IDA7XG5cdFx0cGFkZGluZzogMDtcblx0fVxuXG5cdC53cGZvcm1zLWVudHJ5LWRldGFpbHMtbWV0YSxcblx0LndwZm9ybXMtZW50cnktYWN0aW9ucy1tZXRhICB7XG5cdFx0cGFkZGluZzogNnB4IDAgMDtcblx0fVxuXG5cdC53cGZvcm1zLWVudHJ5LWRldGFpbHMtbWV0YSBwLFxuXHQud3Bmb3Jtcy1lbnRyeS1wYXltZW50LW1ldGEgcCxcblx0LndwZm9ybXMtZW50cnktYWN0aW9ucy1tZXRhIHAge1xuXHRcdHBhZGRpbmc6IDZweCAxMHB4IDhweDtcblx0XHRtYXJnaW46IDA7XG5cdH1cblxuXHQud3Bmb3Jtcy1lbnRyeS1wYXltZW50LW1ldGEge1xuXHRcdHBhZGRpbmc6IDA7XG5cdH1cblxuXHQud3Bmb3Jtcy1lbnRyeS1wYXltZW50LW1ldGEgcCB7XG5cdFx0Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7XG5cdFx0cGFkZGluZzogMTBweDtcblx0fVxuXG5cdC53cGZvcm1zLWVudHJ5LXBheW1lbnQtbWV0YSBwOmxhc3Qtb2YtdHlwZSB7XG5cdFx0Ym9yZGVyLWJvdHRvbTogMDtcblx0fVxuXG5cdC53cGZvcm1zLWVudHJ5LWRldGFpbHMtbWV0YSBzdHJvbmcsXG5cdC53cGZvcm1zLWVudHJ5LWFjdGlvbnMtbWV0YSBzdHJvbmcge1xuXHRcdGZvbnQtd2VpZ2h0OiA2MDA7XG5cdH1cblxuXHQud3Bmb3Jtcy1lbnRyeS1kZXRhaWxzLW1ldGEgLmRhc2hpY29ucyxcblx0LndwZm9ybXMtZW50cnktYWN0aW9ucy1tZXRhIC5kYXNoaWNvbnMge1xuXHRcdHBhZGRpbmc6IDAgMnB4IDAgMDtcblx0XHRjb2xvcjogIzgyODc4QTtcblx0XHR0b3A6IC0xcHg7XG5cdFx0bGVmdDogLTFweDtcblx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXHR9XG5cblx0I3dwZm9ybXMtZW50cnktZGV0YWlscyAuc3VibWl0ZGVsZXRlIHtcblx0XHRjb2xvcjogI2EwMDtcblx0XHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cdFx0cGFkZGluZzogMXB4IDJweDtcblx0fVxuXG5cdCN3cGZvcm1zLWVudHJ5LWRldGFpbHMgLnN1Ym1pdGRlbGV0ZTpob3ZlciB7XG5cdFx0Y29sb3I6IHJlZDtcblx0fVxuXG5cdC53cGZvcm1zLWVudHJ5LWFjdGlvbnMtbWV0YSBhIHtcblx0XHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cdH1cblxuXHQud3Bmb3Jtcy1lbnRyeS1hY3Rpb25zLW1ldGEgYTpob3ZlciB7XG5cdFx0dGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG5cdH1cblxuXHQvLyBFbnRyeSBMb2NhdGlvbi5cblx0I3dwZm9ybXMtZW50cnktZ2VvbG9jYXRpb24ge1xuXG5cdFx0Lmluc2lkZSB7XG5cdFx0XHRwYWRkaW5nOiAwO1xuXHRcdFx0bWFyZ2luOiAwO1xuXHRcdH1cblxuXHRcdHVsIHtcblx0XHRcdG1hcmdpbjogMDtcblxuXHRcdFx0bGkge1xuXHRcdFx0XHRib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTtcblx0XHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0XHRvdmVyZmxvdzogYXV0bztcblxuXHRcdFx0XHQmOmxhc3Qtb2YtdHlwZSB7XG5cdFx0XHRcdFx0Ym9yZGVyLWJvdHRvbTogMDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC53cGZvcm1zLWdlb2xvY2F0aW9uLW1ldGEge1xuXHRcdFx0d2lkdGg6IDg1cHg7XG5cdFx0XHRmbG9hdDogbGVmdDtcblx0XHRcdGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlZWU7XG5cdFx0XHRwYWRkaW5nOiAxMHB4IDIwcHggMTBweCAxMnB4O1xuXHRcdH1cblxuXHRcdC53cGZvcm1zLWdlb2xvY2F0aW9uLXZhbHVlIHtcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdHBhZGRpbmc6IDEwcHggMTJweCAxMHB4IDIwcHg7XG5cdFx0fVxuXG5cdFx0LndwZm9ybXMtZmxhZyB7XG5cdFx0XHR2ZXJ0aWNhbC1hbGlnbjogdGV4dC10b3A7XG5cdFx0XHRtYXJnaW4tcmlnaHQ6IDRweDtcblx0XHR9XG5cdH1cbn1cbiIsIi8vIEVudHJpZXMgTGlzdCAtIGFkbWluLnBocD9wYWdlPXdwZm9ybXMtZW50cmllcyZ2aWV3PWxpc3RcbiN3cGZvcm1zLWVudHJpZXMtbGlzdCB7XG5cblx0LmZvcm0tZGV0YWlscyB7XG5cdFx0Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG5cdFx0cGFkZGluZy1ib3R0b206IDE1cHg7XG5cdFx0bWFyZ2luOiAwIDAgMTBweDtcblxuXHRcdC5mb3JtLWRldGFpbHMtc3ViIHtcblx0XHRcdGNvbG9yOiAjOTk5O1xuXHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRmb250LXNpemU6IDEwcHg7XG5cdFx0XHR0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuXHRcdFx0bWFyZ2luOiAwIDAgOHB4IDA7XG5cdFx0fVxuXG5cdFx0LmZvcm0tZGV0YWlscy10aXRsZSB7XG5cdFx0XHRmbG9hdDogbGVmdDtcblx0XHRcdGZvbnQtc2l6ZTogMThweDtcblx0XHRcdGZvbnQtd2VpZ2h0OiA0MDA7XG5cdFx0XHRtYXJnaW46IDA7XG5cblx0XHRcdEBpbmNsdWRlIG1lZGlhKFwiPDEyMDBweFwiKSB7XG5cdFx0XHRcdGZsb2F0OiBub25lO1xuXHRcdFx0XHRtYXJnaW4tYm90dG9tOiAxMHB4O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC5mb3JtLXNlbGVjdG9yIHtcblx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG5cblx0XHRcdC50b2dnbGUge1xuXHRcdFx0XHRib3JkZXItcmFkaXVzOiA1MCU7XG5cdFx0XHRcdGNvbG9yOiAjNDQ0O1xuXHRcdFx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0XHRcdGJveC1zaGFkb3c6IG5vbmU7XG5cblx0XHRcdFx0Jjpob3Zlcixcblx0XHRcdFx0Ji5hY3RpdmUge1xuXHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNlM2UzZTM7XG5cdFx0XHRcdFx0b3V0bGluZTogbm9uZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCY6YmVmb3JlIHtcblx0XHRcdFx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC5mb3JtLWxpc3Qge1xuXHRcdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdFx0XHRiYWNrZ3JvdW5kOiAjZmZmO1xuXHRcdFx0XHRib3JkZXItcmFkaXVzOiAzcHg7XG5cdFx0XHRcdGJveC1zaGFkb3c6IDAgMnB4IDhweCAwIHJnYmEoMCwwLDAsMC4xKTtcblx0XHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0XHR0b3A6IDI3cHg7XG5cdFx0XHRcdGxlZnQ6IC0xMDhweDtcblx0XHRcdFx0d2lkdGg6IDIzMHB4O1xuXHRcdFx0XHRwYWRkaW5nOiAxMHB4IDA7XG5cdFx0XHRcdHotaW5kZXg6IDk5OTE7XG5cblx0XHRcdFx0JjpiZWZvcmUge1xuXHRcdFx0XHRcdGNvbnRlbnQ6IFwiIFwiO1xuXHRcdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdFx0XHR0b3A6IC0xMHB4O1xuXHRcdFx0XHRcdGxlZnQ6IDExMHB4O1xuXHRcdFx0XHRcdHdpZHRoOiAwO1xuXHRcdFx0XHRcdGhlaWdodDogMDtcblx0XHRcdFx0XHRib3JkZXItc3R5bGU6IHNvbGlkO1xuXHRcdFx0XHRcdGJvcmRlci13aWR0aDogMCA4cHggMTBweCA4cHg7XG5cdFx0XHRcdFx0Ym9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjZmZmIHRyYW5zcGFyZW50O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHVsIHtcblx0XHRcdFx0bWF4LWhlaWdodDogMTk2cHg7XG5cdFx0XHRcdG92ZXJmbG93LXg6IGhpZGRlbjtcblx0XHRcdFx0cGFkZGluZzogMDtcblx0XHRcdFx0bWFyZ2luOiAwO1xuXG5cdFx0XHRcdGxpIHtcblx0XHRcdFx0XHRsaXN0LXN0eWxlOiBub25lO1xuXHRcdFx0XHRcdG1hcmdpbjogMDtcblx0XHRcdFx0XHRmb250LXNpemU6IDEzcHg7XG5cblx0XHRcdFx0XHRhIHtcblx0XHRcdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0XHRcdFx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXHRcdFx0XHRcdFx0cGFkZGluZzogNXB4IDE1cHg7XG5cdFx0XHRcdFx0XHRjb2xvcjogIzQ0NDtcblxuXHRcdFx0XHRcdFx0Jjpob3ZlciB7XG5cdFx0XHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmN2Y3Zjc7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LmZvcm0tZGV0YWlscy1hY3Rpb25zIHtcblx0XHRcdGZsb2F0OiByaWdodDtcblxuXHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8MTIwMHB4XCIpIHtcblx0XHRcdFx0ZmxvYXQ6IG5vbmU7XG5cdFx0XHR9XG5cblx0XHRcdGEge1xuXHRcdFx0XHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cdFx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdFx0bWFyZ2luOiAwIDEycHggMCAwO1xuXG5cdFx0XHRcdCY6bGFzdC1vZi10eXBlIHtcblx0XHRcdFx0XHRtYXJnaW46IDBcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC5kYXNoaWNvbnMge1xuXHRcdFx0XHRcdHdpZHRoOiAxNnB4O1xuXHRcdFx0XHRcdGhlaWdodDogMTZweDtcblx0XHRcdFx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZWFyY2guXG5cdC5zZWFyY2gtYm94IHtcblx0XHQud3Bmb3Jtcy1mb3JtLXNlYXJjaC1ib3gtZmllbGQge1xuXHRcdFx0bWF4LXdpZHRoOiAxODBweDtcblx0XHRcdHZlcnRpY2FsLWFsaWduOiB0b3A7XG5cdFx0XHRtYXJnaW46IDAgMnB4IDAgMDtcblx0XHR9XG5cblx0XHQud3Bmb3Jtcy1mb3JtLXNlYXJjaC1ib3gtY29tcGFyaXNvbiB7XG5cdFx0XHRtYXgtd2lkdGg6IDkwcHg7XG5cdFx0XHR2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuXHRcdFx0bWFyZ2luOiAwIDJweCAwIDA7XG5cdFx0fVxuXG5cdFx0LndwZm9ybXMtZm9ybS1zZWFyY2gtYm94LXRlcm0ge1xuXHRcdFx0bWluLWhlaWdodDogMjhweDtcblx0XHRcdGxpbmUtaGVpZ2h0OiBub3JtYWw7XG5cdFx0XHRtYXJnaW46IDAgMnB4IDAgMDtcblx0XHR9XG5cdH1cblxuXHQvLyBGaWx0ZXJpbmcuXG5cdC53cGZvcm1zLWZpbHRlci1kYXRlIHtcblxuXHRcdC53cGZvcm1zLWZpbHRlci1kYXRlLXNlbGVjdG9yIHtcblx0XHRcdG1pbi1oZWlnaHQ6IDI4cHg7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuXHRcdFx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcblx0XHRcdG1heC13aWR0aDogMjEwcHg7XG5cdFx0XHRsaW5lLWhlaWdodDogbm9ybWFsO1xuXHRcdH1cblxuXHRcdGJ1dHRvbiB7XG5cdFx0XHRtYXJnaW46IDFweCA4cHggMCAwO1xuXHRcdFx0dmVydGljYWwtYWxpZ246IHRvcDtcblx0XHR9XG5cdH1cblxuXHQvLyBXUCBUYWJsZSBzdHlsaW5nLlxuXHQud3AtbGlzdC10YWJsZSB7XG5cblx0XHQubmV3LWVudHJpZXMtbm90aWZpY2F0aW9uIHRkIHtcblx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cdFx0XHRhIHtcblx0XHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHRcdFx0cGFkZGluZzogMTBweDtcblx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2Q5ZWRmNztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQuY29sdW1uLWluZGljYXRvcnMge1xuXHRcdFx0d2lkdGg6IDM1cHg7XG5cdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cblx0XHRcdGE6Zm9jdXMge1xuXHRcdFx0XHQtd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7XG5cdFx0XHRcdGJveC1zaGFkb3c6IG5vbmU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LmNvbHVtbi1pbmRpY2F0b3JzIC5kYXNoaWNvbnMge1xuXHRcdFx0d2lkdGg6IDE0cHg7XG5cdFx0XHRoZWlnaHQ6IDE0cHg7XG5cdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRtYXJnaW4tdG9wOiAzcHg7XG5cdFx0fVxuXG5cdFx0LmluZGljYXRvci1zdGFyIC5kYXNoaWNvbnMge1xuXHRcdFx0bWFyZ2luLXJpZ2h0OiA2cHg7XG5cdFx0fVxuXG5cdFx0LmluZGljYXRvci1zdGFyIHtcblx0XHRcdGNvbG9yOiAjZTRlNGU0O1xuXG5cdFx0XHQmOmhvdmVyLFxuXHRcdFx0Ji51bnN0YXIge1xuXHRcdFx0XHRjb2xvcjogJG9yYW5nZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQuaW5kaWNhdG9yLXJlYWQge1xuXHRcdFx0Y29sb3I6ICM5ZWRlODQ7XG5cblx0XHRcdCY6aG92ZXIsXG5cdFx0XHQmLnVucmVhZCB7XG5cdFx0XHRcdGNvbG9yOiAjZTRlNGU0O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC5jb2x1bW4tZGF0ZSB7XG5cdFx0XHR3aWR0aDogMTUwcHg7XG5cdFx0fVxuXG5cdFx0LmNvbHVtbi1zdGF0dXMge1xuXHRcdFx0d2lkdGg6IDEyMHB4O1xuXG5cdFx0XHRpbWcge1xuXHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0XHRcdGhlaWdodDogMTJweDtcblx0XHRcdFx0d2lkdGg6IGF1dG87XG5cdFx0XHRcdG1hcmdpbjogMCAwIDAgM3B4O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC5jb2x1bW4tcGF5bWVudF90b3RhbCB7XG5cdFx0XHR3aWR0aDogMTAwcHg7XG5cdFx0fVxuXG5cdFx0LmNvbHVtbi1hY3Rpb25zIHtcblx0XHRcdHdpZHRoOiAxMDBweDtcblx0XHR9XG5cblx0XHQuc2VwIHtcblx0XHRcdGNvbG9yOiAjZGRkO1xuXHRcdH1cblxuXHRcdC5kZWxldGU6aG92ZXIge1xuXHRcdFx0Y29sb3I6IHJlZDtcblx0XHR9XG5cdH1cblxuXHQjd3Bmb3Jtcy1lbnRyaWVzLXRhYmxlLWVkaXQtY29sdW1ucyB7XG5cdFx0ZmxvYXQ6IHJpZ2h0O1xuXHRcdGNvbG9yOiAjY2NjO1xuXG5cdFx0Jjpob3ZlciB7XG5cdFx0XHRjb2xvcjogIzY2Njtcblx0XHR9XG5cdH1cblxuXHQud3Bmb3Jtcy1kYXNoLXdpZGdldC1jaGFydC1ibG9jayB7XG5cdFx0cGFkZGluZzogMTJweCAxMnB4IDAgOHB4O1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XG5cdFx0Ym9yZGVyOiAxcHggc29saWQgI2U1ZTVlNTtcblx0XHRtYXJnaW4tdG9wOiAyMHB4O1xuXHRcdGJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNCk7XG5cblx0XHQud3Bmb3Jtcy1lcnJvci1uby1kYXRhLWNoYXJ0IHtcblx0XHRcdGJvcmRlcjogbm9uZTtcblx0XHR9XG5cdH1cblxuXHQjd3Bmb3Jtcy1kYXNoLXdpZGdldC1jaGFydC10aXRsZSB7XG5cdFx0bWFyZ2luLWxlZnQ6IC0xMnB4O1xuXHRcdGZvbnQtc2l6ZTogMThweDtcblx0fVxuXG5cdC53cGZvcm1zLWRhc2gtd2lkZ2V0LWJsb2NrOmZpcnN0LWNoaWxkIHtcblx0XHRtYXJnaW4tdG9wOiAwO1xuXHR9XG5cblx0LndwZm9ybXMtZGFzaC13aWRnZXQtcmVzZXQtY2hhcnQge1xuXG5cdFx0Y29sb3I6ICNkODM2Mzg7XG5cdFx0b3BhY2l0eTogMTtcblx0XHR2ZXJ0aWNhbC1hbGlnbjogdGV4dC1ib3R0b207XG5cdFx0bWFyZ2luOiAwIDAgLTFweCAwO1xuXG5cdFx0Jjpob3ZlciB7XG5cdFx0XHRjb2xvcjogI2FkMmIyYztcblx0XHR9XG5cblx0XHQuZGFzaGljb25zIHtcblx0XHRcdGZvbnQtc2l6ZTogMjBweDtcblx0XHRcdGhlaWdodDogMjBweDtcblx0XHRcdHdpZHRoOiAyMHB4O1xuXHRcdH1cblx0fVxuXG5cdCN3cGZvcm1zLWRhc2gtd2lkZ2V0LXRpbWVzcGFuIHtcblx0XHRtYXJnaW46IDVweCAtMTJweCAwIDA7XG5cdH1cblxuXHQjd3Bmb3Jtcy1kYXNoLXdpZGdldC1mb3Jtcy1saXN0LWJsb2NrIHtcblx0XHRvdmVyZmxvdzogdmlzaWJsZTtcblx0fVxuXG5cdCN3cGZvcm1zLWRhc2gtd2lkZ2V0LWZvcm1zLWxpc3QtdGFibGUge1xuXHRcdGJvcmRlcjogMXB4IHNvbGlkICNlNWU1ZTU7XG5cdFx0Ym94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA0KTtcblxuXHRcdC53cGZvcm1zLWRhc2gtd2lkZ2V0LWZvcm1zLWxpc3QtY29sdW1ucyB7XG5cdFx0XHR0ZCB7XG5cdFx0XHRcdHBhZGRpbmc6IDEycHggMjBweDtcblx0XHRcdFx0Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlMWUxZTE7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGJvZHkge1xuXHRcdFx0Ym9yZGVyLXRvcDogMDtcblx0XHR9XG5cblx0XHR0ciB7XG5cdFx0XHRib3JkZXItYm90dG9tOiAwO1xuXHRcdH1cblxuXHRcdHRyOmZpcnN0LWNoaWxkIHtcblx0XHRcdGJvcmRlci10b3A6IDA7XG5cblx0XHRcdHRkIHtcblx0XHRcdFx0Ym9yZGVyLXRvcDogMDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0cjpudGgtY2hpbGQoZXZlbikgdGQge1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcblx0XHR9XG5cblx0XHR0ZCB7XG5cdFx0XHR0ZXh0LWFsaWduOiBsZWZ0O1xuXHRcdFx0cGFkZGluZzogMjBweCAyMHB4O1xuXHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdFx0Ym9yZGVyOiBub25lO1xuXHRcdFx0Y29sb3I6ICM1NTU7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuXHRcdH1cblxuXHRcdHRyID4gdGQ6bnRoLWNoaWxkKDIpIHtcblx0XHRcdHdpZHRoOiAxODBweDtcblx0XHR9XG5cblx0XHR0ciA+IHRkOm50aC1jaGlsZCgzKSB7XG5cdFx0XHR3aWR0aDogNjBweDtcblx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHR9XG5cblx0XHR0ciA+IHRkOm50aC1jaGlsZCg0KSB7XG5cdFx0XHR3aWR0aDogOTBweDtcblx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHR9XG5cblx0XHR0ciA+IHRkOm50aC1jaGlsZCg1KSB7XG5cdFx0XHR3aWR0aDogNjBweDtcblx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHRcdHBhZGRpbmctdG9wOiAwO1xuXHRcdFx0cGFkZGluZy1ib3R0b206IDA7XG5cdFx0fVxuXG5cdFx0LndwZm9ybXMtZGFzaC13aWRnZXQtZm9ybS1hY3RpdmUgdGQ6Zmlyc3QtY2hpbGQge1xuXHRcdFx0Ym9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjMDA3M2FhO1xuXHRcdFx0cGFkZGluZy1sZWZ0OiAxN3B4O1xuXHRcdH1cblxuXHRcdC53cGZvcm1zLWRhc2gtd2lkZ2V0LWZvcm0tYWN0aXZlIC53cGZvcm1zLWRhc2gtd2lkZ2V0LXNpbmdsZS1jaGFydC1idG4ge1xuXHRcdFx0ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuXHRcdH1cblxuXHRcdC53cGZvcm1zLWRhc2gtd2lkZ2V0LWZvcm0tYWN0aXZlIC53cGZvcm1zLWRhc2gtd2lkZ2V0LXJlc2V0LWNoYXJ0IHtcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xuXHRcdFx0Ym9yZGVyOiBub25lO1xuXHRcdFx0YmFja2dyb3VuZDogbm9uZTtcblx0XHRcdG1hcmdpbjogMDtcblx0XHR9XG5cblx0XHQud3Bmb3Jtcy1kYXNoLXdpZGdldC1mb3Jtcy1saXN0LWNvbHVtbnMge1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcblx0XHRcdGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuXHRcdH1cblxuXHRcdGEge1xuXHRcdFx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXG5cdFx0XHQmOmhvdmVyIHtcblx0XHRcdFx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC53cGZvcm1zLWRhc2gtd2lkZ2V0LWZvcm0tdGl0bGUgYSB7XG5cdFx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdH1cblx0fVxufVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3ODJweCkge1xuXG5cdC53cGZvcm1zLWFkbWluLWNvbnRlbnQge1xuXHRcdHBhZGRpbmctbGVmdDogMTBweDtcblx0XHRwYWRkaW5nLXJpZ2h0OiAxMHB4O1xuXHR9XG5cblx0LndwLWxpc3QtdGFibGUge1xuXHRcdG1hcmdpbjogMCAtMTBweCAwIC0xMHB4O1xuXHRcdHdpZHRoOiAxMDB2dztcblx0XHR0YWJsZS1sYXlvdXQ6IGF1dG87XG5cdH1cblxuXHQud3AtbGlzdC10YWJsZS5lbnRyaWVzIHtcblxuXHRcdC5jb2x1bW4taW5kaWNhdG9ycyB7XG5cdFx0XHR3aWR0aDogYXV0byAhaW1wb3J0YW50O1xuXHRcdH1cblxuXHRcdC5pbmRpY2F0b3JzIHtcblx0XHRcdC5pbmRpY2F0b3Itc3RhciB7XG5cdFx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0XHR9XG5cdFx0XHQuaW5kaWNhdG9yLXJlYWQge1xuXHRcdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRyOm5vdCguaW5saW5lLWVkaXQtcm93KTpub3QoLm5vLWl0ZW1zKSB0ZC5jb2x1bW4tcHJpbWFyeSB7XG5cdFx0XHRoZWlnaHQ6IDhweDtcblx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHR6LWluZGV4OiArMTtcblx0XHRcdG1hcmdpbi1yaWdodDogMDtcblx0XHRcdG92ZXJmbG93OiB2aXNpYmxlO1xuXHRcdH1cblxuXHRcdC50b2dnbGUtcm93IHtcblx0XHRcdHJpZ2h0OiA1cHg7XG5cdFx0XHR0b3A6IDE1cHg7XG5cdFx0fVxuXG5cdFx0dHI6bm90KC5pbmxpbmUtZWRpdC1yb3cpOm5vdCgubm8taXRlbXMpIHRkLmNvbHVtbi1wcmltYXJ5K3RkIHtcblx0XHRcdGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG5cdFx0fVxuXG5cdFx0dHI6bm90KC5pbmxpbmUtZWRpdC1yb3cpOm5vdCgubm8taXRlbXMpIHRkLmNvbHVtbi1wcmltYXJ5fnRkIHtcblx0XHRcdG1hcmdpbi1yaWdodDogNXB4O1xuXHRcdFx0bWluLXdpZHRoOiA1MHZ3O1xuXHRcdH1cblxuXG5cdH1cblxuXHRwLnNlYXJjaC1ib3gge1xuXHRcdG1hcmdpbjogMDtcblx0XHR3aWR0aDogYXV0bztcblx0fVxuXG5cdGlucHV0W3R5cGU9Y2hlY2tib3hdLCBpbnB1dFt0eXBlPXJhZGlvXSB7XG5cdFx0aGVpZ2h0OiAxNnB4O1xuXHRcdHdpZHRoOiAxNnB4O1xuXHR9XG5cbn1cblxuLy8gUlRMIHN1cHBvcnQuXG5ib2R5LnJ0bCB7XG5cdCN3cGZvcm1zLWVudHJpZXMtbGlzdCB7XG5cdFx0LndwLWxpc3QtdGFibGUge1xuXHRcdFx0ZGl2W2RhdGEtZmllbGQtdHlwZT1cInBob25lXCJdIHtcblx0XHRcdFx0ZGlyZWN0aW9uOiBsdHI7XG5cdFx0XHRcdHVuaWNvZGUtYmlkaTogZW1iZWQ7XG5cdFx0XHRcdHRleHQtYWxpZ246IHJpZ2h0O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuIiwiLy8gV2VsY29tZSBBY3RpdmF0aW9uIC0gaW5kZXgucGhwP3BhZ2U9d3Bmb3Jtcy1nZXR0aW5nLXN0YXJ0ZWRcbiN3cGZvcm1zLXdlbGNvbWUge1xuXHRib3JkZXItdG9wOiAzcHggc29saWQgJG9yYW5nZTtcblx0Y29sb3I6ICM1NTU7XG5cdHBhZGRpbmctdG9wOiAxMTBweDtcblxuXHRAaW5jbHVkZSBtZWRpYShcIjxpcGFkXCIpIHtcblx0XHRwYWRkaW5nLXRvcDogNjRweDtcblx0fVxuXG5cdCosXG5cdCo6OmJlZm9yZSxcblx0Kjo6YWZ0ZXIge1xuXHRcdC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcblx0XHQtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdFx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcblx0fVxuXG5cdC5jb250YWluZXIge1xuXHRcdG1hcmdpbjogMCBhdXRvO1xuXHRcdG1heC13aWR0aDogNzIwcHg7XG5cdFx0cGFkZGluZzogMDtcblx0fVxuXG5cdC5ibG9jayB7XG5cdFx0cGFkZGluZzogNDBweDtcblxuXHRcdEBpbmNsdWRlIG1lZGlhKFwiPGlwYWRcIikge1xuXHRcdFx0cGFkZGluZzogMjBweDtcblx0XHR9XG5cdH1cblxuXHRpbWcge1xuXHRcdG1heC13aWR0aDogMTAwJTtcblx0XHRoZWlnaHQ6IGF1dG87XG5cdH1cblxuXHRoMSB7XG5cdFx0Y29sb3I6ICMyMjI7XG5cdFx0Zm9udC1zaXplOiAyNHB4O1xuXHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHRtYXJnaW46IDAgMCAxNnB4IDA7XG5cdH1cblxuXHRoNSB7XG5cdFx0Y29sb3I6ICMyMjI7XG5cdFx0Zm9udC1zaXplOiAxNnB4O1xuXHRcdG1hcmdpbjogMCAwIDhweCAwO1xuXHR9XG5cblx0aDYge1xuXHRcdGZvbnQtc2l6ZTogMTZweDtcblx0XHRmb250LXdlaWdodDogNDAwO1xuXHRcdGxpbmUtaGVpZ2h0OiAxLjY7XG5cdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRcdG1hcmdpbjogMDtcblx0fVxuXG5cdHAge1xuXHRcdGZvbnQtc2l6ZTogMTRweDtcblx0XHRtYXJnaW46IDAgMCAyMHB4IDA7XG5cdH1cblxuXHQuYnV0dG9uLXdyYXAge1xuXHRcdG1heC13aWR0aDogNTkwcHg7XG5cdFx0bWFyZ2luOiAwIGF1dG8gMCBhdXRvO1xuXG5cdFx0LmxlZnQge1xuXHRcdFx0ZmxvYXQ6IGxlZnQ7XG5cdFx0XHR3aWR0aDogNTAlO1xuXHRcdFx0cGFkZGluZy1yaWdodDogMjBweDtcblxuXHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8aXBhZFwiKSB7XG5cdFx0XHRcdGZsb2F0OiBub25lO1xuXHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0cGFkZGluZzogMDtcblx0XHRcdFx0bWFyZ2luLWJvdHRvbTogMjBweDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQucmlnaHQge1xuXHRcdFx0ZmxvYXQ6IHJpZ2h0O1xuXHRcdFx0d2lkdGg6IDUwJTtcblx0XHRcdHBhZGRpbmctbGVmdDogMjBweDtcblxuXHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8aXBhZFwiKSB7XG5cdFx0XHRcdGZsb2F0OiBub25lO1xuXHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0cGFkZGluZzogMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQuaW50cm8ge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG5cdFx0Ym9yZGVyOiAycHggc29saWQgI2UxZTFlMTtcblx0XHRib3JkZXItcmFkaXVzOiAycHg7XG5cdFx0bWFyZ2luLWJvdHRvbTogMzBweDtcblx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0cGFkZGluZy10b3A6IDQwcHg7XG5cblx0XHQuc3VsbGllIHtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG5cdFx0XHRib3JkZXI6IDJweCBzb2xpZCAjZTFlMWUxO1xuXHRcdFx0Ym9yZGVyLXJhZGl1czogNTAlO1xuXHRcdFx0aGVpZ2h0OiAxMTBweDtcblx0XHRcdHdpZHRoOiAxMTBweDtcblx0XHRcdHBhZGRpbmc6IDE4cHggMTRweCAwIDE0cHg7XG5cdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHR0b3A6IC01OHB4O1xuXHRcdFx0bGVmdDogNTAlO1xuXHRcdFx0bWFyZ2luLWxlZnQ6IC01NXB4O1xuXHRcdH1cblxuXHRcdC52aWRlby10aHVtYm5haWwge1xuXHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRtYXJnaW46IDAgYXV0bztcblx0XHR9XG5cblx0XHQuYnV0dG9uLXdyYXAge1xuXHRcdFx0bWFyZ2luLXRvcDogMjVweDtcblx0XHR9XG5cdH1cblxuXHQuZmVhdHVyZXMge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG5cdFx0Ym9yZGVyOiAycHggc29saWQgI2UxZTFlMTtcblx0XHRib3JkZXItYm90dG9tOiAwO1xuXHRcdGJvcmRlci1yYWRpdXM6IDJweCAycHggMCAwO1xuXHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0XHRwYWRkaW5nLXRvcDogMjBweDtcblx0XHRwYWRkaW5nLWJvdHRvbTogMjBweDtcblxuXHRcdC5mZWF0dXJlLWxpc3Qge1xuXHRcdFx0bWFyZ2luLXRvcDogNjBweDtcblx0XHR9XG5cblx0XHQuZmVhdHVyZS1ibG9jayB7XG5cdFx0XHRmbG9hdDogbGVmdDtcblx0XHRcdHdpZHRoOiA1MCU7XG5cdFx0XHRwYWRkaW5nLWJvdHRvbTogMzVweDtcblx0XHRcdG92ZXJmbG93OiBhdXRvO1xuXG5cdFx0XHRAaW5jbHVkZSBtZWRpYShcIjxpcGFkXCIpIHtcblx0XHRcdFx0ZmxvYXQ6IG5vbmU7XG5cdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0fVxuXG5cdFx0XHQmLmZpcnN0IHtcblx0XHRcdFx0cGFkZGluZy1yaWdodDogMjBweDtcblx0XHRcdFx0Y2xlYXI6IGJvdGg7XG5cblx0XHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8aXBhZFwiKSB7XG5cdFx0XHRcdFx0cGFkZGluZy1yaWdodDogMDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQmLmxhc3Qge1xuXHRcdFx0XHRwYWRkaW5nLWxlZnQ6IDIwcHg7XG5cblx0XHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8aXBhZFwiKSB7XG5cdFx0XHRcdFx0cGFkZGluZy1sZWZ0OiAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGltZyB7XG5cdFx0XHRcdGZsb2F0OiBsZWZ0O1xuXHRcdFx0XHRtYXgtd2lkdGg6IDQ2cHg7XG5cdFx0XHR9XG5cblx0XHRcdGg1IHtcblx0XHRcdFx0bWFyZ2luLWxlZnQ6IDY4cHhcblx0XHRcdH1cblxuXHRcdFx0cCB7XG5cdFx0XHRcdG1hcmdpbjogMDtcblx0XHRcdFx0bWFyZ2luLWxlZnQ6IDY4cHhcblx0XHRcdH1cblx0XHR9XG5cblx0XHQuYnV0dG9uLXdyYXAge1xuXHRcdFx0bWFyZ2luLXRvcDogMjVweDtcblx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHR9XG5cdH1cblxuXHQudXBncmFkZS1jdGEge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICMwMDA7XG5cdFx0Ym9yZGVyOiAycHggc29saWQgI2UxZTFlMTtcblx0XHRib3JkZXItdG9wOiAwO1xuXHRcdGJvcmRlci1ib3R0b206IDA7XG5cdFx0Y29sb3I6ICNmZmY7XG5cblx0XHRoMiB7XG5cdFx0XHRjb2xvcjogI2ZmZjtcblx0XHRcdGZvbnQtc2l6ZTogMjBweDtcblx0XHRcdG1hcmdpbjogMCAwIDMwcHggMDtcblx0XHR9XG5cblx0XHR1bCB7XG5cdFx0XHRkaXNwbGF5OiAtbXMtZmxleDtcblx0XHRcdGRpc3BsYXk6IC13ZWJraXQtZmxleDtcblx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHQtd2Via2l0LWZsZXgtd3JhcDogd3JhcDtcblx0XHRcdGZsZXgtd3JhcDogd3JhcDtcblx0XHRcdGZvbnQtc2l6ZTogMTVweDtcblx0XHRcdG1hcmdpbjogMDtcblx0XHRcdHBhZGRpbmc6IDA7XG5cblx0XHRcdGxpIHtcblx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdHdpZHRoOiA1MCU7XG5cdFx0XHRcdG1hcmdpbjogMCAwIDhweCAwO1xuXHRcdFx0XHRwYWRkaW5nOiAwO1xuXG5cdFx0XHRcdC5kYXNoaWNvbnMge1xuXHRcdFx0XHRcdGNvbG9yOiAkZ3JlZW47XG5cdFx0XHRcdFx0bWFyZ2luLXJpZ2h0OiA1cHg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQubGVmdCB7XG5cdFx0XHRmbG9hdDogbGVmdDtcblx0XHRcdHdpZHRoOiA2Ni42NjY2NjYlO1xuXHRcdFx0cGFkZGluZy1yaWdodDogMjBweDtcblxuXHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8aXBhZFwiKSB7XG5cdFx0XHRcdGZsb2F0OiBub25lO1xuXHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0cGFkZGluZy1yaWdodDogMDtcblx0XHRcdFx0bWFyZ2luLWJvdHRvbTogMjBweDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQucmlnaHQge1xuXHRcdFx0ZmxvYXQ6IHJpZ2h0O1xuXHRcdFx0d2lkdGg6IDMzLjMzMzMzMyU7XG5cdFx0XHRwYWRkaW5nOiAyMHB4IDAgMCAyMHB4O1xuXHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXG5cdFx0XHRAaW5jbHVkZSBtZWRpYShcIjxpcGFkXCIpIHtcblx0XHRcdFx0ZmxvYXQ6IG5vbmU7XG5cdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0XHRwYWRkaW5nLWxlZnQ6IDA7XG5cdFx0XHR9XG5cblx0XHRcdGgyIHtcblx0XHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRcdFx0XHRtYXJnaW46IDA7XG5cblx0XHRcdFx0c3BhbiB7XG5cdFx0XHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0XHRcdGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNTU1O1xuXHRcdFx0XHRcdHBhZGRpbmc6IDAgMTVweCAxMnB4O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC5wcmljZSB7XG5cdFx0XHRcdHBhZGRpbmc6IDI2cHggMDtcblxuXHRcdFx0XHQuYW1vdW50IHtcblx0XHRcdFx0XHRmb250LXNpemU6IDQ4cHg7XG5cdFx0XHRcdFx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0XHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXG5cdFx0XHRcdFx0JjpiZWZvcmUge1xuXHRcdFx0XHRcdFx0Y29udGVudDogJyQnO1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0XHRcdFx0dG9wOiAtOHB4O1xuXHRcdFx0XHRcdFx0bGVmdDogLTE2cHg7XG5cdFx0XHRcdFx0XHRmb250LXNpemU6IDE4cHg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0LnRlcm0ge1xuXHRcdFx0XHRcdGZvbnQtc2l6ZTogMTJweDtcblx0XHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblxuXHR9XG5cblx0LnRlc3RpbW9uaWFscyB7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcblx0XHRib3JkZXI6IDJweCBzb2xpZCAjZTFlMWUxO1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdFx0cGFkZGluZzogMjBweCAwO1xuXG5cdFx0LnRlc3RpbW9uaWFsLWJsb2NrIHtcblx0XHRcdG1hcmdpbjogNTBweCAwIDAgMDs7XG5cblx0XHRcdGltZyB7XG5cdFx0XHRcdGJvcmRlci1yYWRpdXM6IDUwJTtcblx0XHRcdFx0ZmxvYXQ6IGxlZnQ7XG5cdFx0XHRcdG1heC13aWR0aDogMTAwcHg7XG5cdFx0XHRcdGJveC1zaGFkb3c6IDAgMCAxOHB4IHJnYmEoMCwwLDAsLjIpO1xuXG5cdFx0XHRcdEBpbmNsdWRlIG1lZGlhKFwiPGlwYWRcIikge1xuXHRcdFx0XHRcdHdpZHRoOiA2NXB4O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHAge1xuXHRcdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRcdG1hcmdpbjogMCAwIDEycHggMTQwcHg7XG5cblx0XHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8aXBhZFwiKSB7XG5cdFx0XHRcdFx0bWFyZ2luLWxlZnQ6IDEwMHB4O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0JjpsYXN0LW9mLXR5cGUge1xuXHRcdFx0XHRcdG1hcmdpbi1ib3R0b206IDA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQuZm9vdGVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmMWYxO1xuXHRcdGJvcmRlcjogMnB4IHNvbGlkICNlMWUxZTE7XG5cdFx0Ym9yZGVyLXRvcDogMDtcblx0XHRib3JkZXItcmFkaXVzOiAwIDAgMnB4IDJweDtcblx0fVxuXG5cdC8vIENoYW5nZXMgZm9yIHBhaWQgdmVyc2lvbi5cblx0Ji5wcm8ge1xuXG5cdFx0LmZlYXR1cmVzIHtcblx0XHRcdGJvcmRlcjogMnB4IHNvbGlkICNlMWUxZTE7XG5cdFx0XHRtYXJnaW4tYm90dG9tOiAzMHB4O1xuXHRcdH1cblxuXHRcdC51cGdyYWRlLFxuXHRcdC5mb290ZXIge1xuXHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHR9XG5cblx0XHQudGVzdGltb25pYWxzIHtcblx0XHRcdGJvcmRlcjogMnB4IHNvbGlkICNlMWUxZTE7XG5cdFx0fVxuXHR9XG59XG5cbi5kYXNoYm9hcmRfcGFnZV93cGZvcm1zLWdldHRpbmctc3RhcnRlZCB7XG5cblx0LnZpZGVvLWNvbnRhaW5lciB7XG5cdFx0Ym9yZGVyOiAycHggc29saWQgI2UxZTFlMTtcblx0fVxuXG5cdC8vIEhpZGUgYWRtaW4gZm9vdGVyLlxuXHQjd3Bmb290ZXIsXG5cdGRpdi5ub3RpY2Uge1xuXHRcdGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcblx0fVxufVxuIiwiLy8gQWRkb25zIExpc3QgLSBhZG1pbi5waHA/cGFnZT13cGZvcm1zLWFkZG9uc1xuI3dwZm9ybXMtYWRtaW4tYWRkb25zIHtcblxuXHQqLFxuXHQqOjpiZWZvcmUsXG5cdCo6OmFmdGVyIHtcblx0XHQtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdFx0LW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHRcdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdH1cblxuXHQuYWRkb25zLWNvbnRhaW5lciB7XG5cdFx0bWFyZ2luLWxlZnQ6IC0yMHB4O1xuXHRcdG1hcmdpbi1yaWdodDogLTIwcHg7XG5cdH1cblxuXHQudW5sb2NrLW1zZyB7XG5cdFx0cGFkZGluZzogMCAyMHB4O1xuXHRcdG1hcmdpbi10b3A6IC0yMHB4O1xuXHRcdGNsZWFyOiBib3RoO1xuXHR9XG5cblx0I3dwZm9ybXMtYWRtaW4tYWRkb25zLXNlYXJjaCB7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcblx0XHRib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuXHRcdGJvcmRlci1yYWRpdXM6IDNweDtcblx0XHRib3gtc2hhZG93OiBub25lO1xuXHRcdGNvbG9yOiAjMzMzO1xuXHRcdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG5cdFx0cGFkZGluZzogN3B4IDEycHg7XG5cdFx0bWFyZ2luOiAtM3B4IDEwcHggMCAwO1xuXHRcdHdpZHRoOiAyMDBweDtcblx0XHRtaW4taGVpZ2h0OiAzNXB4O1xuXHRcdGZsb2F0OiByaWdodDtcblxuXHRcdCY6Zm9jdXMge1xuXHRcdFx0Ym9yZGVyLWNvbG9yOiAjYmJiO1xuXHRcdH1cblx0fVxuXG5cdC5hZGRvbi1jb250YWluZXIge1xuXHRcdHBhZGRpbmc6IDAgMjBweDtcblx0XHRmbG9hdDogbGVmdDtcblx0XHR3aWR0aDogMzMuMzMzMzMzJTtcblx0XHRtYXJnaW4tYm90dG9tOiAyMHB4O1xuXG5cdFx0QGluY2x1ZGUgbWVkaWEoXCI8MTI1MHB4XCIpIHtcblx0XHRcdHdpZHRoOiA1MCU7XG5cdFx0fVxuXG5cdFx0QGluY2x1ZGUgbWVkaWEoXCI8aXBhZFwiKSB7XG5cdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdG1hcmdpbi1ib3R0b206IDIwcHg7XG5cdFx0fVxuXHR9XG5cblx0aDQge1xuXHRcdGZvbnQtc2l6ZTogMTdweDtcblx0XHRmb250LXdlaWdodDogNzAwO1xuXHR9XG5cblx0LmFkZG9uLWl0ZW0ge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG5cdFx0Ym9yZGVyOiAxcHggc29saWQgI2RkZDtcblx0XHRib3JkZXItcmFkaXVzOiAzcHg7XG5cdFx0bWFyZ2luOiAwO1xuXG5cdFx0QGluY2x1ZGUgbWVkaWEoXCI8aXBhZFwiKSB7XG5cdFx0XHRtYXJnaW46IDAgMFxuXHRcdH1cblxuXHRcdGltZyB7XG5cdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjZWVlO1xuXHRcdFx0ZmxvYXQ6IGxlZnQ7XG5cdFx0XHRtYXgtd2lkdGg6IDc1cHg7XG5cdFx0fVxuXG5cdFx0aDUge1xuXHRcdFx0bWFyZ2luOiAwIDAgMTBweCAxMDBweDtcblx0XHRcdGZvbnQtc2l6ZTogMTZweDtcblx0XHR9XG5cblx0XHRwIHtcblx0XHRcdG1hcmdpbjogMCAwIDAgMTAwcHg7XG5cdFx0fVxuXG5cdFx0LmRldGFpbHMge1xuXHRcdFx0cGFkZGluZzogMzBweCAyMHB4O1xuXG5cdFx0fVxuXG5cdFx0LmFjdGlvbnMge1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNztcblx0XHRcdGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuXHRcdFx0cGFkZGluZzogMjBweDtcblx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuXHRcdFx0Lm1zZyB7XG5cdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmN2Y3Zjc7XG5cdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXHRcdFx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdFx0XHR0b3A6IDA7XG5cdFx0XHRcdGxlZnQ6IDA7XG5cdFx0XHRcdGhlaWdodDogMTAwJTtcblx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRcdHotaW5kZXg6IDk5O1xuXHRcdFx0XHRwYWRkaW5nOiAyMHB4O1xuXHRcdFx0XHRkaXNwbGF5OiAtd2Via2l0LWJveDtcblx0XHRcdFx0ZGlzcGxheTogLW1vei1ib3g7XG5cdFx0XHRcdGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuXHRcdFx0XHRkaXNwbGF5OiAtd2Via2l0LWZsZXg7XG5cdFx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHRcdC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjtcblx0XHRcdFx0LW1zLWFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdFx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdFx0XHRcdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXG5cdFx0XHRcdCYuc3VjY2VzcyB7XG5cdFx0XHRcdFx0Y29sb3I6ICRncmVlbjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCYuZXJyb3Ige1xuXHRcdFx0XHRcdGNvbG9yOiByZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQuc3RhdHVzIHtcblx0XHRcdGZsb2F0OiBsZWZ0O1xuXHRcdFx0cGFkZGluZy10b3A6IDhweDtcblxuXHRcdFx0LnN0YXR1cy1pbmFjdGl2ZSB7XG5cdFx0XHRcdGNvbG9yOiByZWQ7XG5cdFx0XHR9XG5cblx0XHRcdC5zdGF0dXMtZG93bmxvYWQge1xuXHRcdFx0XHRjb2xvcjogIzY2Njtcblx0XHRcdH1cblxuXHRcdFx0LnN0YXR1cy1hY3RpdmUge1xuXHRcdFx0XHRjb2xvcjogJGdyZWVuO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC51cGdyYWRlLWJ1dHRvbiB7XG5cdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cblx0XHRcdGEge1xuXHRcdFx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdFx0XHR3aWR0aDogMTQwcHg7XG5cdFx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHRcdFx0cGFkZGluZzogOHB4IDVweDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQuYWN0aW9uLWJ1dHRvbiB7XG5cdFx0XHRmbG9hdDogcmlnaHQ7XG5cblx0XHRcdGJ1dHRvbiB7XG5cdFx0XHRcdGJhY2tncm91bmQ6IG5vbmU7XG5cdFx0XHRcdGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG5cdFx0XHRcdGJvcmRlci1yYWRpdXM6IDNweDtcblx0XHRcdFx0Ym94LXNoYWRvdzogbm9uZTtcblx0XHRcdFx0Y3Vyc29yOiBwb2ludGVyO1xuXHRcdFx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdFx0XHR3aWR0aDogMTQwcHg7XG5cdFx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHRcdFx0cGFkZGluZzogOHB4IDVweDtcblxuXHRcdFx0XHQmOmhvdmVyLFxuXHRcdFx0XHQmLmxvYWRpbmcge1xuXHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuZmEge1xuXHRcdFx0XHRcdG1hcmdpbi1yaWdodDogOHB4O1xuXG5cdFx0XHRcdFx0Ji5mYS1zcGlubmVyIHtcblx0XHRcdFx0XHRcdG1hcmdpbi1yaWdodDogMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQmLnN0YXR1cy1hY3RpdmUge1xuXG5cdFx0XHRcdFx0LmZhIHtcblx0XHRcdFx0XHRcdGNvbG9yOiAkZ3JlZW47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ji5zdGF0dXMtaW5hY3RpdmUge1xuXG5cdFx0XHRcdFx0LmZhIHtcblx0XHRcdFx0XHRcdGNvbG9yOiByZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ji5zdGF0dXMtZG93bmxvYWQge1xuXG5cdFx0XHRcdFx0LmZhIHtcblx0XHRcdFx0XHRcdGNvbG9yOiAjOTk5O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdCYuZGlzYWJsZWQge1xuXHRcdFx0XHRcdGN1cnNvcjogZGVmYXVsdDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCYubG9hZGluZyB7XG5cblx0XHRcdFx0XHQuZmEge1xuXHRcdFx0XHRcdFx0Y29sb3I6ICM2NjY7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG4iLCIvLyBBYm91dCBXUEZvcm1zIC0gYWRtaW4ucGhwP3BhZ2U9d3Bmb3Jtcy1hYm91dFxuXG4kcGFkZGluZy1kZWZhdWx0OiAzMHB4O1xuJGJvcmRlcjogMXB4IHNvbGlkICNEREREREQ7XG5cbi8vIEBpbmNsdWRlIG1lZGlhKFwiPGlwYWRcIikge1xuLy8gXHR3aWR0aDogNTAlO1xuLy8gfVxuXG4vKlxuJ3hzLXBob25lJzogMzIwcHgsXG5cdCdwaG9uZSc6IDYwMHB4LFxuXHQnaXBhZCc6IDc2OHB4LFxuXHQndGFibGV0JzogNzgycHgsXG5cdCdkZXNrdG9wJzogOTYwcHgsXG4qL1xuXG4jd3Bmb3Jtcy1hZG1pbi1hYm91dCB7XG5cblx0KiwgKjo6YmVmb3JlLCAqOjphZnRlciB7XG5cdFx0LXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHRcdC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcblx0XHRib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHR9XG5cblx0LndwZm9ybXMtYWRtaW4tYWJvdXQtc2VjdGlvbiB7XG5cdFx0bWFyZ2luOiAwIDIwcHggMjBweDtcblx0XHRwYWRkaW5nOiAkcGFkZGluZy1kZWZhdWx0O1xuXHRcdGJhY2tncm91bmQ6ICNmZmY7XG5cdFx0Ym9yZGVyOiAkYm9yZGVyO1xuXHRcdGxpbmUtaGVpZ2h0OiAyO1xuXG5cdFx0aDEsIGgyLCBoMywgaDQsIGg1IHtcblx0XHRcdG1hcmdpbi10b3A6IDA7XG5cdFx0XHRwYWRkaW5nLXRvcDogMDtcblx0XHRcdGxpbmUtaGVpZ2h0OiAxLjY7XG5cdFx0fVxuXG5cdFx0aDIge1xuXHRcdFx0Zm9udC1zaXplOiAyNHB4O1xuXHRcdH1cblxuXHRcdGgzIHtcblx0XHRcdGZvbnQtc2l6ZTogMThweDtcblx0XHRcdG1hcmdpbi1ib3R0b206IDMwcHg7XG5cdFx0XHRjb2xvcjogIzIzMjgyQztcblx0XHR9XG5cblx0XHR1bCwgcCB7XG5cdFx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0fVxuXG5cdFx0cCB7XG5cdFx0XHRtYXJnaW4tYm90dG9tOiAyMHB4O1xuXG5cdFx0XHQmLmJpZ2dlcntcblx0XHRcdFx0Zm9udC1zaXplOiAxOHB4O1xuXHRcdFx0fVxuXHRcdFx0Ji5zbWFsbGVyIHtcblx0XHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdFx0fVxuXG5cdFx0XHQmOmxhc3QtY2hpbGQge1xuXHRcdFx0XHRtYXJnaW4tYm90dG9tOiAwO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGhyIHtcblx0XHRcdG1hcmdpbjogJHBhZGRpbmctZGVmYXVsdCAwO1xuXHRcdH1cblxuXHRcdGZpZ3VyZSB7XG5cdFx0XHRtYXJnaW46IDA7XG5cblx0XHRcdGltZyB7XG5cdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0fVxuXG5cdFx0XHRmaWdjYXB0aW9uIHtcblx0XHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdFx0XHRjb2xvcjogIzg4ODg4ODtcblx0XHRcdFx0bWFyZ2luLXRvcDogNXB4O1xuXHRcdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cdFx0XHRcdGxpbmUtaGVpZ2h0OiBpbml0aWFsO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC53cGZvcm1zLWFkbWluLWNvbHVtbi00MCB7XG5cdFx0XHRwYWRkaW5nLWxlZnQ6ICRwYWRkaW5nLWRlZmF1bHQvMjtcblxuXHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8aXBhZFwiKSB7XG5cdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0XHRwYWRkaW5nLWxlZnQ6IDA7XG5cdFx0XHRcdHBhZGRpbmctdG9wOiAyMHB4O1xuXHRcdFx0fVxuXHRcdH1cblx0XHQud3Bmb3Jtcy1hZG1pbi1jb2x1bW4tNjAge1xuXHRcdFx0cGFkZGluZy1yaWdodDogJHBhZGRpbmctZGVmYXVsdC8yO1xuXG5cdFx0XHRAaW5jbHVkZSBtZWRpYShcIjxpcGFkXCIpIHtcblx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRcdHBhZGRpbmctcmlnaHQ6IDA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dWwubGlzdC1wbGFpbiB7XG5cdFx0XHRtYXJnaW4tdG9wOiAwO1xuXHRcdFx0bWFyZ2luLWJvdHRvbTogMDtcblxuXHRcdFx0bGkge1xuXHRcdFx0XHRtYXJnaW4tYm90dG9tOiAwO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHVsLmxpc3QtZmVhdHVyZXMge1xuXHRcdFx0bGkgLmZhIHtcblx0XHRcdFx0Y29sb3I6ICMyYTliMzk7XG5cdFx0XHRcdG1hcmdpbjogMCA4cHggMCAwO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC5mYS1zdGFyIHtjb2xvcjogZ29sZH1cblxuXHRcdC5uby1tYXJnaW4ge21hcmdpbjogMCAhaW1wb3J0YW50fVxuXHRcdC5uby1wYWRkaW5nIHtwYWRkaW5nOiAwICFpbXBvcnRhbnR9XG5cdFx0LmNlbnRlcmVkIHt0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudH1cblx0fVxuXG5cdC53cGZvcm1zLWFkbWluLWFib3V0LXNlY3Rpb24tZmlyc3QtZm9ybSB7XG5cdFx0ZGlzcGxheTogZmxleDtcblxuXHRcdEBpbmNsdWRlIG1lZGlhKFwiPGlwYWRcIikge1xuXHRcdFx0ZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcblx0XHR9XG5cblx0XHQud3Bmb3Jtcy1hZG1pbi1hYm91dC1zZWN0aW9uLWZpcnN0LWZvcm0tdGV4dCB7XG5cdFx0XHRmbGV4OiAxO1xuXHRcdFx0cGFkZGluZy1yaWdodDogJHBhZGRpbmctZGVmYXVsdDtcblxuXHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8aXBhZFwiKSB7XG5cdFx0XHRcdGZsZXg6IG5vbmU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LndwZm9ybXMtYWRtaW4tYWJvdXQtc2VjdGlvbi1maXJzdC1mb3JtLXZpZGVvIHtcblx0XHRcdGlmcmFtZSB7XG5cdFx0XHRcdGJvcmRlcjogJGJvcmRlcjtcblx0XHRcdH1cblxuXHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8aXBhZFwiKSB7XG5cdFx0XHRcdHBhZGRpbmctdG9wOiAyMHB4O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC53cGZvcm1zLWFkbWluLWFib3V0LXNlY3Rpb24taGVybyB7XG5cdFx0cGFkZGluZzogMDtcblxuXHRcdC53cGZvcm1zLWFkbWluLWFib3V0LXNlY3Rpb24taGVyby1tYWluLFxuXHRcdC53cGZvcm1zLWFkbWluLWFib3V0LXNlY3Rpb24taGVyby1leHRyYSB7XG5cdFx0XHRwYWRkaW5nOiAkcGFkZGluZy1kZWZhdWx0O1xuXHRcdH1cblxuXHRcdC53cGZvcm1zLWFkbWluLWFib3V0LXNlY3Rpb24taGVyby1leHRyYSB7XG5cblx0XHRcdC53cGZvcm1zLWFkbWluLWNvbHVtbi01MCB7XG5cblx0XHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8aXBhZFwiKSB7XG5cdFx0XHRcdFx0ZmxvYXQ6IG5vbmU7XG5cdFx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQud3Bmb3Jtcy1hZG1pbi1hYm91dC1zZWN0aW9uLWhlcm8tbWFpbiB7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjRkFGQUZBO1xuXHRcdFx0Ym9yZGVyLWJvdHRvbTogJGJvcmRlcjtcblxuXHRcdFx0Ji5uby1ib3JkZXIge1xuXHRcdFx0XHRib3JkZXItYm90dG9tOiAwO1xuXHRcdFx0fVxuXG5cdFx0XHRwIHtcblx0XHRcdFx0Y29sb3I6ICM2NjY7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aDMuY2FsbC10by1hY3Rpb24ge1xuXHRcdFx0bWFyZ2luLWJvdHRvbTogLTEwcHg7XG5cdFx0fVxuXG5cdFx0c3Bhbi5wcmljZS0yMC1vZmYge1xuXHRcdFx0Y29sb3I6ICM2QUIyNTU7XG5cdFx0fVxuXHR9XG5cblx0LndwZm9ybXMtYWRtaW4tYWJvdXQtc2VjdGlvbi1zcXVhc2hlZCB7XG5cdFx0bWFyZ2luLWJvdHRvbTogMDtcblxuXHRcdCY6bm90KDpsYXN0LW9mLXR5cGUpIHtcblx0XHRcdGJvcmRlci1ib3R0b206IDA7XG5cdFx0fVxuXHR9XG5cblx0LndwZm9ybXMtYWRtaW4tYWJvdXQtc2VjdGlvbi1wb3N0IHtcblxuXHRcdGgyIHtcblx0XHRcdG1hcmdpbi1ib3R0b206IC0xMHB4O1xuXHRcdH1cblxuXHRcdGgzIHtcblx0XHRcdG1hcmdpbi1ib3R0b206IDE1cHg7XG5cdFx0fVxuXG5cdFx0cDpsYXN0LW9mLXR5cGUge1xuXHRcdFx0bWFyZ2luLWJvdHRvbTogMzBweDtcblx0XHR9XG5cblx0XHQud3Bmb3Jtcy1hZG1pbi1jb2x1bW4tMjAge1xuXHRcdFx0cGFkZGluZy1yaWdodDogMjBweDtcblx0XHRcdHdpZHRoOiBhdXRvO1xuXG5cdFx0XHRpbWcge1xuXHRcdFx0XHR3aWR0aDogMjcwcHg7XG5cdFx0XHR9XG5cblx0XHRcdEBpbmNsdWRlIG1lZGlhKFwiPGlwYWRcIikge1xuXHRcdFx0XHR3aWR0aDogMjAlO1xuXHRcdFx0XHRpbWcge1xuXHRcdFx0XHRcdHdpZHRoOiBhdXRvO1xuXHRcdFx0XHRcdG1heC13aWR0aDogMTAwJTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC53cGZvcm1zLWFkbWluLWNvbHVtbi04MCB7XG5cdFx0XHRwYWRkaW5nLWxlZnQ6IDIwcHg7XG5cdFx0XHR3aWR0aDogY2FsYygxMDAlIC0gMjBweCAtIDI3MHB4KTtcblxuXHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8aXBhZFwiKSB7XG5cdFx0XHRcdHdpZHRoOiA4MCU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LndwZm9ybXMtYWRtaW4tYWJvdXQtc2VjdGlvbi1wb3N0LWxpbmsge1xuXHRcdFx0cGFkZGluZzogMTBweCAkcGFkZGluZy1kZWZhdWx0LzI7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjREY3NzM5O1xuXHRcdFx0Y29sb3I6ICNmZmY7XG5cdFx0XHRib3JkZXItcmFkaXVzOiAzcHg7XG5cdFx0XHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cdFx0XHRtYXJnaW4tdG9wOiAxNXB4O1xuXHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXG5cdFx0XHQmOmhvdmVyIHtcblx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI0I4NUExQjtcblx0XHRcdH1cblxuXHRcdFx0LmZhIHtcblx0XHRcdFx0Y29sb3I6ICNFREJBOUU7XG5cdFx0XHRcdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG5cdFx0XHRcdG1hcmdpbi1sZWZ0OiA4cHg7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LndwZm9ybXMtYWRtaW4tYWJvdXQtc2VjdGlvbi10YWJsZSB7XG5cblx0XHR0YWJsZSB7XG5cdFx0XHRib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuXG5cdFx0XHR0ciB7XG5cdFx0XHRcdHRkIHtcblx0XHRcdFx0XHRib3JkZXItYm90dG9tOiAkYm9yZGVyO1xuXHRcdFx0XHRcdGJvcmRlci1yaWdodDogJGJvcmRlcjtcblx0XHRcdFx0XHRwYWRkaW5nOiAkcGFkZGluZy1kZWZhdWx0O1xuXHRcdFx0XHRcdHZlcnRpY2FsLWFsaWduOiB0b3A7XG5cblx0XHRcdFx0XHQmOmxhc3Qtb2YtdHlwZSB7XG5cdFx0XHRcdFx0XHRib3JkZXItcmlnaHQ6IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0JjpsYXN0LWNoaWxkIHRkIHtcblx0XHRcdFx0XHRib3JkZXItYm90dG9tOiBub25lO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHAge1xuXHRcdFx0XHRiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuXHRcdFx0XHRiYWNrZ3JvdW5kLXNpemU6IDE1cHggYXV0bztcblx0XHRcdFx0YmFja2dyb3VuZC1wb3NpdGlvbjogMCA2cHg7XG5cdFx0XHRcdG1hcmdpbjogMDtcblxuXHRcdFx0XHQmLmZlYXR1cmVzLWZ1bGwge1xuXHRcdFx0XHRcdHBhZGRpbmctbGVmdDogJHBhZGRpbmctZGVmYXVsdDtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2Fib3V0L2ljb24tZnVsbC5zdmcpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCYuZmVhdHVyZXMtbm9uZSB7XG5cdFx0XHRcdFx0cGFkZGluZy1sZWZ0OiAkcGFkZGluZy1kZWZhdWx0O1xuXHRcdFx0XHRcdGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvYWJvdXQvaWNvbi1ub25lLnN2Zyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ji5mZWF0dXJlcy1wYXJ0aWFsIHtcblx0XHRcdFx0XHRwYWRkaW5nLWxlZnQ6ICRwYWRkaW5nLWRlZmF1bHQ7XG5cdFx0XHRcdFx0YmFja2dyb3VuZC1wb3NpdGlvbjogLTNweCAwO1xuXHRcdFx0XHRcdGJhY2tncm91bmQtc2l6ZTogMjNweCBhdXRvO1xuXHRcdFx0XHRcdGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvYWJvdXQvaWNvbi1wYXJ0aWFsLnN2Zyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQud3Bmb3Jtcy1hZG1pbi1hYm91dC1zZWN0aW9uLWhlcm8tbWFpbiB7XG5cdFx0XHRwYWRkaW5nOiAwO1xuXHRcdFx0aDMge1xuXHRcdFx0XHRwYWRkaW5nOiAkcGFkZGluZy1kZWZhdWx0ICRwYWRkaW5nLWRlZmF1bHQgJHBhZGRpbmctZGVmYXVsdCAkcGFkZGluZy1kZWZhdWx0KjI7XG5cdFx0XHR9XG5cdFx0XHQud3Bmb3Jtcy1hZG1pbi1jb2x1bW4tMzM6Zmlyc3QtY2hpbGQgaDMge1xuXHRcdFx0XHRwYWRkaW5nOiAkcGFkZGluZy1kZWZhdWx0O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdCN3cGZvcm1zLWFkbWluLWFkZG9ucyB7XG5cdFx0cGFkZGluZzogMCAkcGFkZGluZy1kZWZhdWx0O1xuXG5cdFx0LmFkZG9uLWNvbnRhaW5lciB7XG5cdFx0XHRwYWRkaW5nOiAwIDEwcHg7XG5cdFx0fVxuXG5cdFx0LmFkZG9uLWl0ZW0ge1xuXG5cdFx0XHQuZGV0YWlscyB7XG5cdFx0XHRcdHBhZGRpbmc6IDIwcHg7XG5cdFx0XHR9XG5cblx0XHRcdGltZyB7XG5cdFx0XHRcdHBhZGRpbmc6IDEwcHg7XG5cblx0XHRcdFx0JltzcmMqPVwiLW1pXCJdIHtcblx0XHRcdFx0XHRwYWRkaW5nOiAxM3B4O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC5hY3Rpb24tYnV0dG9uIC5idXR0b24ge1xuXHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0XHRcdHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblx0XHRcdFx0Zm9udC1zaXplOiAxM3B4O1xuXHRcdFx0XHRsaW5lLWhlaWdodDogMjZweDtcblx0XHRcdFx0aGVpZ2h0OiAyOHB4O1xuXHRcdFx0XHRtYXJnaW46IDA7XG5cdFx0XHRcdHBhZGRpbmc6IDAgMTBweCAxcHg7XG5cdFx0XHRcdGN1cnNvcjogcG9pbnRlcjtcblx0XHRcdFx0LXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuXHRcdFx0XHRib3JkZXItcmFkaXVzOiAzcHg7XG5cdFx0XHRcdGJvcmRlcjogMXB4IHNvbGlkICNjY2NjY2M7XG5cdFx0XHRcdGJhY2tncm91bmQ6ICNmN2Y3Zjc7XG5cdFx0XHRcdGJveC1zaGFkb3c6IDAgMXB4IDAgI2NjY2NjYztcblx0XHRcdFx0Zm9udC13ZWlnaHQ6IG5vcm1hbDtcblxuXHRcdFx0XHQmOmhvdmVyLCAmOmZvY3VzICB7XG5cdFx0XHRcdFx0YmFja2dyb3VuZDogI2ZhZmFmYTtcblx0XHRcdFx0XHRib3JkZXItY29sb3I6ICM5OTk7XG5cdFx0XHRcdFx0Y29sb3I6ICMyMzI4MmQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQmLmJ1dHRvbi1wcmltYXJ5IHtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kOiAjMDA4NWJhO1xuXHRcdFx0XHRcdGJvcmRlci1jb2xvcjogIzAwNzNhYSAjMDA2Nzk5ICMwMDY3OTk7XG5cdFx0XHRcdFx0Ym94LXNoYWRvdzogMCAxcHggMCAjMDA2Nzk5O1xuXHRcdFx0XHRcdGNvbG9yOiAjZmZmO1xuXHRcdFx0XHRcdHRleHQtc2hhZG93OiAwIC0xcHggMXB4ICMwMDY3OTksIDFweCAwIDFweCAjMDA2Nzk5LCAwIDFweCAxcHggIzAwNjc5OSwgLTFweCAwIDFweCAjMDA2Nzk5O1xuXG5cdFx0XHRcdFx0Jjpob3ZlciwgJjpmb2N1cyB7XG5cdFx0XHRcdFx0XHRiYWNrZ3JvdW5kOiAjMDA4ZWMyO1xuXHRcdFx0XHRcdFx0Ym9yZGVyLWNvbG9yOiAjMDA2Nzk5O1xuXHRcdFx0XHRcdFx0Y29sb3I6ICNmZmY7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LmZhLXNwaW5uZXIge1xuXHRcdFx0XHRcdFx0Y29sb3I6ICNmZmY7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ji5idXR0b24tc2Vjb25kYXJ5IHtcblx0XHRcdFx0XHRjb2xvcjogIzU1NTtcblx0XHRcdFx0XHRib3JkZXItY29sb3I6ICNjY2NjY2M7XG5cdFx0XHRcdFx0YmFja2dyb3VuZDogI2Y3ZjdmNztcblx0XHRcdFx0XHRib3gtc2hhZG93OiAwIDFweCAwICNjY2NjY2M7XG5cblx0XHRcdFx0XHQmOmhvdmVyLCAmOmZvY3VzICB7XG5cdFx0XHRcdFx0XHRiYWNrZ3JvdW5kOiAjZmFmYWZhO1xuXHRcdFx0XHRcdFx0Ym9yZGVyLWNvbG9yOiAjOTk5O1xuXHRcdFx0XHRcdFx0Y29sb3I6ICMyMzI4MmQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ji5kaXNhYmxlZCB7XG5cdFx0XHRcdFx0Y3Vyc29yOiBkZWZhdWx0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG4iLCIvLyBDb21tdW5pdHkgLSBhZG1pbi5waHA/cGFnZT13cGZvcm1zLWNvbW11bml0eVxuXG5AbWVkaWEgKG1pbi13aWR0aDogMTI1MHB4KSB7XG5cdCN3cGZvcm1zLWFkbWluLWNvbW11bml0eSAuaXRlbSB7XG5cdFx0d2lkdGg6IGNhbGMoMzMuMzMzMzMzMyUgLSAxMy4zMzMzMzMzcHgpO1xuXG5cdFx0JjpudGgtY2hpbGQoM24pIHtcblx0XHRcdG1hcmdpbi1yaWdodDogMDtcblx0XHR9XG5cdH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDEyNDlweCkge1xuXHQjd3Bmb3Jtcy1hZG1pbi1jb21tdW5pdHkgLml0ZW0ge1xuXHRcdHdpZHRoOiBjYWxjKDUwJSAtIDEwcHgpO1xuXG5cdFx0JjpudGgtY2hpbGQoMm4pIHtcblx0XHRcdG1hcmdpbi1yaWdodDogMDtcblx0XHR9XG5cdH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDc2N3B4KSB7XG5cdCN3cGZvcm1zLWFkbWluLWNvbW11bml0eSAuaXRlbSB7XG5cdFx0d2lkdGg6IDEwMCU7XG5cdFx0bWFyZ2luLXJpZ2h0OiAwO1xuXHR9XG59XG5cbiN3cGZvcm1zLWFkbWluLWNvbW11bml0eSB7XG5cblx0KiwgKjo6YmVmb3JlLCAqOjphZnRlciB7XG5cdFx0LXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHRcdC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcblx0XHRib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHR9XG5cblx0Lml0ZW1zIHtcblx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdGZsZXgtd3JhcDogd3JhcDtcblx0XHRtYXJnaW46IDIwcHg7XG5cdH1cblxuXHQuaXRlbSB7XG5cdFx0Ym9yZGVyOiAxcHggc29saWQgI0RERERERDtcblx0XHRtYXJnaW46IDAgMjBweCAyMHB4IDA7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcblx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdH1cblxuXHQuaXRlbS1jb3ZlciB7XG5cdFx0d2lkdGg6IDEwMCU7XG5cdFx0aGVpZ2h0OiAyMjNweDtcblx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0ZGlzcGxheTogYmxvY2s7XG5cdH1cblxuXHQuaXRlbS1pbWcge1xuXHRcdHdpZHRoOiBhdXRvO1xuXHRcdGhlaWdodDogYXV0bztcblx0XHRtYXgtd2lkdGg6IDEwMHB4O1xuXHRcdG1heC1oZWlnaHQ6IDEwMHB4O1xuXHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHR0b3A6IDA7XG5cdFx0Ym90dG9tOiAwO1xuXHRcdGxlZnQ6IDA7XG5cdFx0cmlnaHQ6IDA7XG5cdFx0bWFyZ2luOiBhdXRvO1xuXHR9XG5cblx0Lml0ZW0tdGl0bGUge1xuXHRcdG1hcmdpbjogMTdweCAyMHB4IDEwcHggMjBweDtcblx0XHRmb250LXNpemU6IDE2cHg7XG5cdH1cblxuXHQuaXRlbS1kZXNjcmlwdGlvbiB7XG5cdFx0bWFyZ2luOiAwIDIwcHggOThweCAyMHB4O1xuXHRcdGZvbnQtc2l6ZTogMTRweDtcblx0fVxuXG5cdC5pdGVtLWZvb3RlciB7XG5cdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdHdpZHRoOiAxMDAlO1xuXHRcdGJvdHRvbTogMDtcblx0XHRwYWRkaW5nOiAyMHB4O1xuXHRcdGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkZGRkO1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICNGN0Y3Rjc7XG5cdH1cblxuXHQuYnV0dG9uIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjMWM3NWE2O1xuXHRcdGNvbG9yOiAjZmZmZmZmO1xuXHRcdGZvbnQtd2VpZ2h0OiBib2xkO1xuXHRcdC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMHB4IC0ycHggMHB4IDBweCAjMGU2ODk3O1xuXHRcdC1tb3otYm94LXNoYWRvdzogaW5zZXQgMHB4IC0ycHggMHB4IDBweCAjMGU2ODk3O1xuXHRcdGJveC1zaGFkb3c6IGluc2V0IDBweCAtMnB4IDBweCAwcHggIzBlNjg5Nztcblx0XHRib3JkZXI6IDFweCBzb2xpZCAjMGU2ODk3O1xuXHRcdHBhZGRpbmc6IDEycHg7XG5cdFx0aGVpZ2h0OiBhdXRvO1xuXHRcdGxpbmUtaGVpZ2h0OiAxM3B4O1xuXHRcdHRleHQtc2hhZG93OiAxcHggMXB4IDEuNXB4IHJnYmEoMCwwLDAsLjM1KTtcblxuXHRcdCY6aG92ZXIge1xuXHRcdFx0YmFja2dyb3VuZDogIzAwOGVjMjtcblx0XHRcdGJvcmRlci1jb2xvcjogIzAwNjc5OTtcblx0XHR9XG5cdH1cblxufVxuIiwiLy8gQ29tbW9uIHN0eWxlcyBmb3IgcGx1Z2luIGxhbmRpbmcgcGFnZXMgKGxpa2UgQW5hbHl0aWNzIG9yIFNNVFApLlxuXG4ud3Bmb3Jtcy1hZG1pbi1wbHVnaW4tbGFuZGluZyB7XG5cdC5ub3RpY2Uge1xuXHRcdGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcblx0fVxuXHQubG9hZGVyIHtcblx0XHRtYXJnaW46IDAgYXV0bztcblx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0dGV4dC1pbmRlbnQ6IC05OTk5ZW07XG5cdFx0Ym9yZGVyLXRvcDogNHB4IHNvbGlkICM5Njk2OTY7XG5cdFx0Ym9yZGVyLXJpZ2h0OiA0cHggc29saWQgIzk2OTY5Njtcblx0XHRib3JkZXItYm90dG9tOiA0cHggc29saWQgIzk2OTY5Njtcblx0XHRib3JkZXItbGVmdDogNHB4IHNvbGlkICM0MDQwNDA7XG5cdFx0LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7XG5cdFx0LW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTtcblx0XHR0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7XG5cdFx0LXdlYmtpdC1hbmltYXRpb246IGxvYWQ4IDEuMXMgaW5maW5pdGUgbGluZWFyO1xuXHRcdGFuaW1hdGlvbjogbG9hZDggMS4xcyBpbmZpbml0ZSBsaW5lYXI7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cblx0XHQmLCAmOmFmdGVyIHtcblx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0Ym9yZGVyLXJhZGl1czogNTAlO1xuXHRcdFx0d2lkdGg6IDUwcHg7XG5cdFx0XHRoZWlnaHQ6IDUwcHg7XG5cdFx0fVxuXHR9XG59XG5cbkAtd2Via2l0LWtleWZyYW1lcyBsb2FkOCB7XG5cdDAlIHtcblx0XHQtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuXHRcdHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuXHR9XG5cdDEwMCUge1xuXHRcdC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcblx0XHR0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuXHR9XG59XG5Aa2V5ZnJhbWVzIGxvYWQ4IHtcblx0MCUge1xuXHRcdC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG5cdFx0dHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG5cdH1cblx0MTAwJSB7XG5cdFx0LXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuXHRcdHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG5cdH1cbn1cbiIsIi8vIFNNVFAgLSBhZG1pbi5waHA/cGFnZT13cGZvcm1zLXNtdHBcbiN3cGZvcm1zLWFkbWluLXNtdHAge1xuXG5cdHdpZHRoOiA3MDBweDtcblx0bWFyZ2luOiAwIGF1dG87XG5cblx0KiwgKjo6YmVmb3JlLCAqOjphZnRlciB7XG5cdFx0LXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHRcdC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcblx0XHRib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHR9XG5cblx0c2VjdGlvbiB7XG5cdFx0bWFyZ2luOiA1MHB4IDA7XG5cdFx0dGV4dC1hbGlnbjogbGVmdDtcblx0XHRjbGVhcjogYm90aDtcblx0fVxuXG5cdHAge1xuXHRcdGZvbnQtc2l6ZTogMTVweDtcblx0fVxuXG5cdC50b3Age1xuXHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblxuXHRcdGltZyB7XG5cdFx0XHRtYXJnaW4tYm90dG9tOiAzOHB4O1xuXHRcdH1cblx0XHRoMSB7XG5cdFx0XHRmb250LXNpemU6IDI2cHg7XG5cdFx0XHRmb250LXdlaWdodDogNjAwO1xuXHRcdFx0bWFyZ2luLWJvdHRvbTogMDtcblx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0fVxuXHRcdHAge1xuXHRcdFx0Zm9udC1zaXplOiAxN3B4O1xuXHRcdFx0Y29sb3I6ICM3Nzc3Nzc7XG5cdFx0XHRtYXJnaW4tdG9wOiAuNWVtO1xuXHRcdH1cblxuXHRcdC51cGRhdGVkIHtcblx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0fVxuXHR9XG5cblx0LnNjcmVlbnNob3Qge1xuXHRcdCYgPiAqIHtcblx0XHRcdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG5cdFx0fVxuXHRcdC5jb250IHtcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0XHRcdHdpZHRoOiAzMTVweDtcblx0XHRcdHBhZGRpbmc6IDVweDtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XG5cdFx0XHQtd2Via2l0LWJveC1zaGFkb3c6IDBweCAycHggNXB4IDBweCByZ2JhKDAsMCwwLDAuMDUpO1xuXHRcdFx0LW1vei1ib3gtc2hhZG93OiAwcHggMnB4IDVweCAwcHggcmdiYSgwLDAsMCwwLjA1KTtcblx0XHRcdGJveC1zaGFkb3c6IDBweCAycHggNXB4IDBweCByZ2JhKDAsMCwwLDAuMDUpO1xuXHRcdFx0Ym9yZGVyLXJhZGl1czogM3B4O1xuXHRcdFx0aW1nIHtcblx0XHRcdFx0bWF4LXdpZHRoOiAxMDAlO1xuXHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdH1cblx0XHRcdC5ob3ZlciB7XG5cdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdFx0b3BhY2l0eTogMDtcblx0XHRcdFx0aGVpZ2h0OiAxMDAlO1xuXHRcdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdFx0dG9wOiAwO1xuXHRcdFx0XHRsZWZ0OiAwO1xuXHRcdFx0XHRib3JkZXI6IDVweCBzb2xpZCAjZmZmZmZmO1xuXHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLDAuMTUpO1xuXHRcdFx0XHRiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy4uL2ltYWdlcy96b29tLnN2ZycpO1xuXHRcdFx0XHRiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuXHRcdFx0XHRiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG5cdFx0XHRcdGJhY2tncm91bmQtc2l6ZTogNTBweDtcblx0XHRcdFx0dHJhbnNpdGlvbjogYWxsIDAuM3M7XG5cdFx0XHR9XG5cdFx0XHQmOmhvdmVyIC5ob3ZlciB7XG5cdFx0XHRcdG9wYWNpdHk6IDE7XG5cdFx0XHRcdHRyYW5zaXRpb246IGFsbCAwLjNzO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR1bCB7XG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0XHRtYXJnaW46IDAgMCAwIDMwcHg7XG5cdFx0XHRsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG5cdFx0XHRtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDM1MHB4KTtcblx0XHR9XG5cdFx0bGkge1xuXHRcdFx0bWFyZ2luOiAxNnB4IDA7XG5cdFx0XHRwYWRkaW5nOiAwIDAgMCAyNHB4O1xuXHRcdFx0Zm9udC1zaXplOiAxNXB4O1xuXHRcdFx0YmFja2dyb3VuZC1pbWFnZTogdXJsKCcuLi9pbWFnZXMvYXJyb3ctcmlnaHQuc3ZnJyk7XG5cdFx0XHRiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0IDNweDtcblx0XHRcdGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG5cdFx0XHRiYWNrZ3JvdW5kLXNpemU6IDE0cHg7XG5cdFx0XHRjb2xvcjogIzc3Nzc3Nztcblx0XHR9XG5cdH1cblxuXHQuc3RlcCB7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogI0Y5RjlGOTtcblx0XHQtd2Via2l0LWJveC1zaGFkb3c6IDBweCAycHggNXB4IDBweCByZ2JhKDAsMCwwLDAuMDUpO1xuXHRcdC1tb3otYm94LXNoYWRvdzogMHB4IDJweCA1cHggMHB4IHJnYmEoMCwwLDAsMC4wNSk7XG5cdFx0Ym94LXNoYWRvdzogMHB4IDJweCA1cHggMHB4IHJnYmEoMCwwLDAsMC4wNSk7XG5cdFx0Ym9yZGVyOiAxcHggc29saWQgI0U1RTVFNTtcblx0XHRtYXJnaW46IDAgMCAyNXB4IDA7XG5cblx0XHQmID4gKiB7XG5cdFx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHRcdH1cblx0XHQubnVtIHtcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0XHRcdHdpZHRoOiAxMDBweDtcblx0XHRcdGhlaWdodDogNTBweDtcblx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHR9XG5cdFx0LmxvYWRlciB7XG5cdFx0XHRtYXJnaW4tdG9wOiAtNTRweDtcblx0XHRcdHRyYW5zaXRpb246IGFsbCAuM3M7XG5cdFx0XHRvcGFjaXR5OiAxO1xuXHRcdH1cblx0XHRkaXYge1xuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0d2lkdGg6IGNhbGMoMTAwJSAtIDEwNHB4KTtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XG5cdFx0XHRwYWRkaW5nOiAzMHB4O1xuXHRcdFx0Ym9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZWVlZWVlO1xuXHRcdH1cblx0XHRoMiB7XG5cdFx0XHRmb250LXNpemU6IDI0cHg7XG5cdFx0XHRsaW5lLWhlaWdodDogMjJweDtcblx0XHRcdG1hcmdpbi10b3A6IDA7XG5cdFx0XHRtYXJnaW4tYm90dG9tOiAxNXB4O1xuXHRcdH1cblx0XHRwIHtcblx0XHRcdGZvbnQtc2l6ZTogMTZweDtcblx0XHRcdGNvbG9yOiAjNzc3Nzc3O1xuXHRcdH1cblx0XHQuZXJyb3Ige1xuXHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXHRcdFx0Y29sb3I6ICNiOTc0NzQ7XG5cdFx0XHRtYXJnaW4tYm90dG9tOiAwO1xuXHRcdH1cblx0XHQuYnV0dG9uIHtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICMwMDdjYmE7XG5cdFx0XHRjb2xvcjogI2ZmZmZmZjtcblx0XHRcdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdFx0XHRib3gtc2hhZG93OiBub25lO1xuXHRcdFx0cGFkZGluZzogMTJweDtcblx0XHRcdG1pbi13aWR0aDogMjAwcHg7XG5cdFx0XHRoZWlnaHQ6IGF1dG87XG5cdFx0XHRsaW5lLWhlaWdodDogMTNweDtcblx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHRcdGZvbnQtc2l6ZTogMTVweDtcblx0XHRcdGJvcmRlcjogbm9uZTtcblx0XHRcdHRyYW5zaXRpb246IGFsbCAuM3M7XG5cblx0XHRcdCY6aG92ZXIge1xuXHRcdFx0XHRiYWNrZ3JvdW5kOiAjMDA3MWExO1xuXHRcdFx0fVxuXG5cdFx0XHQmLmdyZXkge1xuXHRcdFx0XHRiYWNrZ3JvdW5kOiAjRjZGNkY2O1xuXHRcdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkO1xuXHRcdFx0XHR0ZXh0LXNoYWRvdzogbm9uZTtcblx0XHRcdFx0Y29sb3I6ICM5RkE1QUE7XG5cdFx0XHR9XG5cblx0XHRcdCYuZGlzYWJsZWQge1xuXHRcdFx0XHRjdXJzb3I6IGRlZmF1bHQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC5oaWRkZW4ge1xuXHRcdFx0b3BhY2l0eTogMDtcblx0XHRcdHRyYW5zaXRpb246IGFsbCAuM3M7XG5cdFx0fVxuXHR9XG5cblx0LmdyZXkge1xuXHRcdG9wYWNpdHk6IDAuNTtcblx0fVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHtcblxuXHQjd3Bmb3Jtcy1hZG1pbi1zbXRwIHtcblxuXHRcdHdpZHRoOiBhdXRvO1xuXHRcdG1hcmdpbjogMCAyMHB4O1xuXG5cdFx0LnNjcmVlbnNob3Qge1xuXHRcdFx0LmNvbnQge1xuXHRcdFx0XHR3aWR0aDogYXV0bztcblx0XHRcdH1cblxuXHRcdFx0dWwge1xuXHRcdFx0XHRtYXJnaW46IDIwcHggMCAwIDE1cHg7XG5cdFx0XHRcdG1heC13aWR0aDogMTAwJTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQuYnV0dG9uIHtcblx0XHRcdHdoaXRlLXNwYWNlOiBub3JtYWw7XG5cdFx0fVxuXHR9XG59IiwiLy8gQW5hbHl0aWNzIC0gYWRtaW4ucGhwP3BhZ2U9d3Bmb3Jtcy1hbmFseXRpY3NcbiN3cGZvcm1zLWFkbWluLWFuYWx5dGljcyB7XG5cblx0d2lkdGg6IDcwMHB4O1xuXHRtYXJnaW46IDAgYXV0bztcblxuXHQqLCAqOjpiZWZvcmUsICo6OmFmdGVyIHtcblx0XHQtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdFx0LW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHRcdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdH1cblxuXHRzZWN0aW9uIHtcblx0XHRtYXJnaW46IDUwcHggMDtcblx0XHR0ZXh0LWFsaWduOiBsZWZ0O1xuXHRcdGNsZWFyOiBib3RoO1xuXHR9XG5cblx0cCB7XG5cdFx0Zm9udC1zaXplOiAxNXB4O1xuXHR9XG5cblx0LnRvcCB7XG5cdFx0dGV4dC1hbGlnbjogY2VudGVyO1xuXG5cdFx0aW1nIHtcblx0XHRcdG1hcmdpbi1ib3R0b206IDM4cHg7XG5cdFx0fVxuXHRcdGgxIHtcblx0XHRcdGZvbnQtc2l6ZTogMjZweDtcblx0XHRcdGZvbnQtd2VpZ2h0OiA2MDA7XG5cdFx0XHRtYXJnaW4tYm90dG9tOiAwO1xuXHRcdFx0cGFkZGluZzogMDtcblx0XHR9XG5cdFx0cCB7XG5cdFx0XHRmb250LXNpemU6IDE3cHg7XG5cdFx0XHRjb2xvcjogIzc3Nzc3Nztcblx0XHRcdG1hcmdpbi10b3A6IC41ZW07XG5cdFx0fVxuXG5cdFx0LnVwZGF0ZWQge1xuXHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHR9XG5cdH1cblxuXHQuc2NyZWVuc2hvdCB7XG5cdFx0JiA+ICoge1xuXHRcdFx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcblx0XHR9XG5cdFx0LmNvbnQge1xuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdFx0d2lkdGg6IDMxNXB4O1xuXHRcdFx0cGFkZGluZzogNXB4O1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcblx0XHRcdC13ZWJraXQtYm94LXNoYWRvdzogMHB4IDJweCA1cHggMHB4IHJnYmEoMCwwLDAsMC4wNSk7XG5cdFx0XHQtbW96LWJveC1zaGFkb3c6IDBweCAycHggNXB4IDBweCByZ2JhKDAsMCwwLDAuMDUpO1xuXHRcdFx0Ym94LXNoYWRvdzogMHB4IDJweCA1cHggMHB4IHJnYmEoMCwwLDAsMC4wNSk7XG5cdFx0XHRib3JkZXItcmFkaXVzOiAzcHg7XG5cdFx0XHRpbWcge1xuXHRcdFx0XHRtYXgtd2lkdGg6IDEwMCU7XG5cdFx0XHR9XG5cdFx0XHQuaG92ZXIge1xuXHRcdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHRcdG9wYWNpdHk6IDA7XG5cdFx0XHRcdGhlaWdodDogMTAwJTtcblx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRcdHRvcDogMDtcblx0XHRcdFx0bGVmdDogMDtcblx0XHRcdFx0Ym9yZGVyOiA1cHggc29saWQgI2ZmZmZmZjtcblx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwLjE1KTtcblx0XHRcdFx0YmFja2dyb3VuZC1pbWFnZTogdXJsKCcuLi9pbWFnZXMvem9vbS5zdmcnKTtcblx0XHRcdFx0YmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcblx0XHRcdFx0YmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xuXHRcdFx0XHRiYWNrZ3JvdW5kLXNpemU6IDUwcHg7XG5cdFx0XHRcdHRyYW5zaXRpb246IGFsbCAwLjNzO1xuXHRcdFx0fVxuXHRcdFx0Jjpob3ZlciAuaG92ZXIge1xuXHRcdFx0XHRvcGFjaXR5OiAxO1xuXHRcdFx0XHR0cmFuc2l0aW9uOiBhbGwgMC4zcztcblx0XHRcdH1cblx0XHR9XG5cdFx0dWwge1xuXHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0bWFyZ2luLWxlZnQ6IDMwcHg7XG5cdFx0XHRsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG5cdFx0fVxuXHRcdGxpIHtcblx0XHRcdG1hcmdpbjogMTZweCAwO1xuXHRcdFx0cGFkZGluZzogMCAwIDAgMjRweDtcblx0XHRcdGZvbnQtc2l6ZTogMTVweDtcblx0XHRcdGJhY2tncm91bmQtaW1hZ2U6IHVybCgnLi4vaW1hZ2VzL2Fycm93LXJpZ2h0LnN2ZycpO1xuXHRcdFx0YmFja2dyb3VuZC1wb3NpdGlvbjogbGVmdCBjZW50ZXI7XG5cdFx0XHRiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuXHRcdFx0YmFja2dyb3VuZC1zaXplOiAxNHB4O1xuXHRcdFx0Y29sb3I6ICM3Nzc3Nzc7XG5cdFx0fVxuXHR9XG5cblx0LnN0ZXAge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICNGOUY5Rjk7XG5cdFx0LXdlYmtpdC1ib3gtc2hhZG93OiAwcHggMnB4IDVweCAwcHggcmdiYSgwLDAsMCwwLjA1KTtcblx0XHQtbW96LWJveC1zaGFkb3c6IDBweCAycHggNXB4IDBweCByZ2JhKDAsMCwwLDAuMDUpO1xuXHRcdGJveC1zaGFkb3c6IDBweCAycHggNXB4IDBweCByZ2JhKDAsMCwwLDAuMDUpO1xuXHRcdGJvcmRlcjogMXB4IHNvbGlkICNFNUU1RTU7XG5cdFx0bWFyZ2luOiAwIDAgMjVweCAwO1xuXG5cdFx0JiA+ICoge1xuXHRcdFx0dmVydGljYWwtYWxpZ246IG1pZGRsZTtcblx0XHR9XG5cdFx0Lm51bSB7XG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHR3aWR0aDogMTAwcHg7XG5cdFx0XHRoZWlnaHQ6IDUwcHg7XG5cdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cdFx0fVxuXHRcdC5sb2FkZXIge1xuXHRcdFx0bWFyZ2luLXRvcDogLTU0cHg7XG5cdFx0XHR0cmFuc2l0aW9uOiBhbGwgLjNzO1xuXHRcdFx0b3BhY2l0eTogMTtcblx0XHR9XG5cdFx0ZGl2IHtcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdHdpZHRoOiBjYWxjKDEwMCUgLSAxMDRweCk7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xuXHRcdFx0cGFkZGluZzogMzBweDtcblx0XHRcdGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2VlZWVlZTtcblx0XHR9XG5cdFx0aDIge1xuXHRcdFx0Zm9udC1zaXplOiAyNHB4O1xuXHRcdFx0bWFyZ2luLXRvcDogMDtcblx0XHRcdG1hcmdpbi1ib3R0b206IDE1cHg7XG5cdFx0fVxuXHRcdHAge1xuXHRcdFx0Zm9udC1zaXplOiAxNnB4O1xuXHRcdFx0Y29sb3I6ICM3Nzc3Nzc7XG5cdFx0fVxuXHRcdC5lcnJvciB7XG5cdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRjb2xvcjogI2I5NzQ3NDtcblx0XHRcdG1hcmdpbi1ib3R0b206IDA7XG5cdFx0fVxuXHRcdC5idXR0b24ge1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogIzAwN2NiYTtcblx0XHRcdGNvbG9yOiAjZmZmZmZmO1xuXHRcdFx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0XHRcdHBhZGRpbmc6IDEycHg7XG5cdFx0XHRtaW4td2lkdGg6IDIwMHB4O1xuXHRcdFx0aGVpZ2h0OiBhdXRvO1xuXHRcdFx0bGluZS1oZWlnaHQ6IDEzcHg7XG5cdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cdFx0XHRmb250LXNpemU6IDE1cHg7XG5cdFx0XHRib3JkZXI6IG5vbmU7XG5cdFx0XHR0cmFuc2l0aW9uOiBhbGwgLjNzO1xuXG5cdFx0XHQmOmhvdmVyIHtcblx0XHRcdFx0YmFja2dyb3VuZDogIzAwNzFhMTtcblx0XHRcdH1cblxuXHRcdFx0Ji5ncmV5IHtcblx0XHRcdFx0YmFja2dyb3VuZDogI0Y2RjZGNjtcblx0XHRcdFx0Ym9yZGVyOiAxcHggc29saWQgI2RkZGRkZDtcblx0XHRcdFx0Ym94LXNoYWRvdzogbm9uZTtcblx0XHRcdFx0dGV4dC1zaGFkb3c6IG5vbmU7XG5cdFx0XHRcdGNvbG9yOiAjOUZBNUFBO1xuXHRcdFx0fVxuXG5cdFx0XHQmLmRpc2FibGVkIHtcblx0XHRcdFx0Y3Vyc29yOiBkZWZhdWx0O1xuXHRcdFx0fVxuXHRcdH1cblx0XHQuaGlkZGVuIHtcblx0XHRcdG9wYWNpdHk6IDA7XG5cdFx0XHR0cmFuc2l0aW9uOiBhbGwgLjNzO1xuXHRcdH1cblx0fVxuXG5cdC5ncmV5IHtcblx0XHRvcGFjaXR5OiAwLjU7XG5cdH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDc2N3B4KSB7XG5cblx0I3dwZm9ybXMtYWRtaW4tYW5hbHl0aWNzIHtcblxuXHRcdHdpZHRoOiBhdXRvO1xuXHRcdG1hcmdpbjogMCAyMHB4O1xuXG5cdFx0LnNjcmVlbnNob3Qge1xuXHRcdFx0LmNvbnQge1xuXHRcdFx0XHR3aWR0aDogYXV0bztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQuYnV0dG9uIHtcblx0XHRcdHdoaXRlLXNwYWNlOiBub3JtYWw7XG5cdFx0fVxuXHR9XG59XG4iLCIvLyBTZXR0aW5ncyAtIGFkbWluLnBocD9wYWdlPXdwZm9ybXMtc2V0dGluZ3Ncbi8vIFRvb2xzIC0gYWRtaW4ucGhwP3BhZ2U9d3Bmb3Jtcy10b29sc1xuLndwZm9ybXMtYWRtaW4tc2V0dGluZ3Mge1xuXG5cdCosXG5cdCo6OmJlZm9yZSxcblx0Kjo6YWZ0ZXIge1xuXHRcdC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcblx0XHQtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdFx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcblx0fVxuXG5cdC8vIFNldHRpbmcgcm93cywgZWcgZmllbGQgcm93LlxuXHQud3Bmb3Jtcy1zZXR0aW5nLXJvdyB7XG5cdFx0Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNGU0ZTQ7XG5cdFx0cGFkZGluZzogMzBweCAwO1xuXHRcdGZvbnQtc2l6ZTogMTRweDtcblx0XHRsaW5lLWhlaWdodDogMS4zO1xuXG5cdFx0JjpmaXJzdC1vZi10eXBlIHtcblx0XHRcdHBhZGRpbmctdG9wOiAxMHB4ICFpbXBvcnRhbnQ7XG5cdFx0fVxuXG5cdFx0QGluY2x1ZGUgbWVkaWEoXCI8dGFibGV0XCIpIHtcblx0XHRcdHBhZGRpbmc6IDIwcHggMDtcblx0XHR9XG5cblx0XHQvLyBTZWN0aW9uIGhlYWRpbmcuXG5cdFx0Ji5zZWN0aW9uLWhlYWRpbmcge1xuXHRcdFx0cGFkZGluZzogMjBweCAwO1xuXG5cdFx0XHQmLm5vLWRlc2Mge1xuXHRcdFx0XHRoNCB7XG5cdFx0XHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC53cGZvcm1zLXNldHRpbmctZmllbGQge1xuXHRcdFx0XHRtYXJnaW46IDA7XG5cdFx0XHRcdG1heC13aWR0aDogMTAwMHB4O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFRvb2xzIGZ1bGwgd2lkdGggZmllbGRzLlxuXHRcdCYudG9vbHMge1xuXG5cdFx0XHRwLFxuXHRcdFx0cDpmaXJzdC1vZi10eXBle1xuXHRcdFx0XHRtYXJnaW46IDAgMCAxNnB4IDA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2tib3ggc2V0dGluZ3MgZmllbGQuXG5cdFx0Ji53cGZvcm1zLXNldHRpbmctcm93LWNoZWNrYm94IHtcblxuXHRcdFx0aW5wdXRbdHlwZT1jaGVja2JveF0ge1xuXHRcdFx0XHRmbG9hdDogbGVmdDtcblx0XHRcdFx0bWFyZ2luOiAxcHggMCAwIDA7XG5cdFx0XHR9XG5cblx0XHRcdC5kZXNjIHtcblx0XHRcdFx0bWFyZ2luOiAwIDAgMCAzMHB4O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIExpY2Vuc2Ugc2V0dGluZ3MgZmllbGQuXG5cdFx0Ji53cGZvcm1zLXNldHRpbmctcm93LWxpY2Vuc2Uge1xuXG5cdFx0XHQud3Bmb3Jtcy1zZXR0aW5nLWxhYmVsIHtcblx0XHRcdFx0cGFkZGluZy10b3A6IDhweDtcblx0XHRcdH1cblxuXHRcdFx0cC50eXBlIHtcblx0XHRcdFx0bWFyZ2luLXRvcDogMTJweDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBUZXh0L251bWJlciBzZXR0aW5ncyBmaWVsZC5cblx0XHQmLndwZm9ybXMtc2V0dGluZy1yb3ctdGV4dCxcblx0XHQmLndwZm9ybXMtc2V0dGluZy1yb3ctbnVtYmVyIHtcblxuXHRcdFx0LndwZm9ybXMtc2V0dGluZy1sYWJlbCB7XG5cdFx0XHRcdHBhZGRpbmctdG9wOiA4cHg7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2VsZWN0IHNldHRpbmdzIGZpZWxkLlxuXHRcdCYud3Bmb3Jtcy1zZXR0aW5nLXJvdy1zZWxlY3Qge1xuXG5cdFx0XHQud3Bmb3Jtcy1zZXR0aW5nLWxhYmVsIHtcblx0XHRcdFx0cGFkZGluZy10b3A6IDhweDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSYWRpbyBzZXR0aW5ncyBmaWVsZC5cblx0XHQmLndwZm9ybXMtc2V0dGluZy1yb3ctcmFkaW8ge1xuXG5cdFx0XHQud3Bmb3Jtcy1zZXR0aW5nLWZpZWxkIHtcblxuXHRcdFx0XHRpbnB1dFt0eXBlPXJhZGlvXSB7XG5cdFx0XHRcdFx0bWFyZ2luOiAtM3B4IDEwcHggMCAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGFiZWwge1xuXHRcdFx0XHRcdG1hcmdpbi1yaWdodDogMzBweDtcblx0XHRcdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIEVtYWlsIFRlbXBsYXRlIHNldHRpbmcgZmllbGQuXG5cdFx0JiN3cGZvcm1zLXNldHRpbmctcm93LWVtYWlsLXRlbXBsYXRlIHtcblxuXHRcdFx0LndwZm9ybXMtc2V0dGluZy1maWVsZCB7XG5cblx0XHRcdFx0bGFiZWw6YmVmb3JlIHtcblx0XHRcdFx0XHRjb250ZW50OiBcIiBcIjtcblx0XHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0XHR3aWR0aDogMTU1cHg7XG5cdFx0XHRcdFx0aGVpZ2h0OiAxODBweDtcblx0XHRcdFx0XHRtYXJnaW46IDAgMCAxMHB4IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQub3B0aW9uLWRlZmF1bHQ6YmVmb3JlIHtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kOiB1cmwoLi4vaW1hZ2VzL3NldHRpbmdzLWVtYWlsLWh0bWwucG5nKSBjZW50ZXIgY2VudGVyO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Lm9wdGlvbi1ub25lOmJlZm9yZSB7XG5cdFx0XHRcdFx0YmFja2dyb3VuZDogdXJsKC4uL2ltYWdlcy9zZXR0aW5ncy1lbWFpbC1wbGFpbnRleHQucG5nKSBjZW50ZXIgY2VudGVyO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmFkaW8gc2V0dGluZ3MgZmllbGQuXG5cdFx0Ji53cGZvcm1zLXNldHRpbmctcm93LWltYWdlIHtcblxuXHRcdFx0LndwZm9ybXMtc2V0dGluZy1maWVsZCB7XG5cblx0XHRcdFx0aW1nIHtcblx0XHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdFx0XHRtYXJnaW46IDAgMCAyMHB4IDA7XG5cdFx0XHRcdFx0bWF4LXdpZHRoOiA0MDBweDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvbG9yIHBpY2tlciBzZXR0aW5ncyBmaWVsZC5cblx0XHQmLndwZm9ybXMtc2V0dGluZy1yb3ctY29sb3Ige1xuXG5cdFx0XHQud3Bmb3Jtcy1jb2xvci1waWNrZXIge1xuXHRcdFx0XHRwYWRkaW5nLWxlZnQ6IDQwcHg7XG5cdFx0XHR9XG5cblx0XHRcdC5taW5pY29sb3JzLWlucHV0LXN3YXRjaCB7XG5cdFx0XHRcdHRvcDogN3B4O1xuXHRcdFx0XHRsZWZ0OiA3cHg7XG5cdFx0XHRcdGhlaWdodDogMjFweDtcblx0XHRcdFx0d2lkdGg6IDIxcHg7XG5cdFx0XHRcdGJvcmRlci1yYWRpdXM6IDJweDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb2x1bW5zIHNldHRpbmdzIGZpZWxkLlxuXHRcdCYud3Bmb3Jtcy1zZXR0aW5nLXJvdy1jb2x1bW5zIHtcblxuXHRcdFx0ZGlzcGxheTogZmxleDtcblxuXHRcdFx0LndwZm9ybXMtc2V0dGluZy1sYWJlbCB7XG5cdFx0XHRcdGZsb2F0OiBub25lO1xuXHRcdFx0XHRhbGlnbi1zZWxmOiBjZW50ZXI7XG5cdFx0XHRcdGZsZXg6IDAgMCAyMDBweDtcblx0XHRcdH1cblxuXHRcdFx0LndwZm9ybXMtc2V0dGluZy1maWVsZCB7XG5cdFx0XHRcdG1hcmdpbjogMDtcblx0XHRcdFx0ZmxleDogMTtcblx0XHRcdH1cblxuXHRcdFx0LndwZm9ybXMtc2V0dGluZy1jb2x1bW5zIHtcblx0XHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0XHRmbGV4LXdyYXA6IHdyYXA7XG5cdFx0XHRcdGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjtcblx0XHRcdH1cblxuXHRcdFx0LndwZm9ybXMtc2V0dGluZy1jb2x1bW4ge1xuXG5cdFx0XHRcdG1hcmdpbi1yaWdodDogNXB4O1xuXHRcdFx0XHRmbGV4LWJhc2lzOiAzOTBweDtcblxuXHRcdFx0XHQmID4gKiB7XG5cdFx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsYWJlbCB7XG5cdFx0XHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0XHRcdG1hcmdpbi1ib3R0b206IDEwcHg7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuZGVzYyB7XG5cdFx0XHRcdFx0bWFyZ2luLWJvdHRvbTogMTBweDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEdlbmVyYWwgZWxlbWVudHMuXG5cdFx0aDUge1xuXHRcdFx0Zm9udC1zaXplOiAxNnB4O1xuXHRcdFx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0XHRcdG1hcmdpbjogMCAwIDIwcHggMDtcblx0XHR9XG5cblx0XHRoNCB7XG5cdFx0XHRmb250LXNpemU6IDIwcHg7XG5cdFx0XHRmb250LXdlaWdodDogNzAwO1xuXHRcdFx0bWFyZ2luOiAwIDAgNnB4IDA7XG5cdFx0fVxuXG5cdFx0aDMge1xuXHRcdFx0Zm9udC1zaXplOiAyNHB4O1xuXHRcdFx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0XHRcdG1hcmdpbjogMCAwIDIwcHggMDtcblx0XHR9XG5cblx0XHRwIHtcblx0XHRcdG1hcmdpbjogMTJweCAwIDA7XG5cdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRsaW5lLWhlaWdodDogMS4zO1xuXG5cdFx0XHQmOmZpcnN0LW9mLXR5cGUge1xuXHRcdFx0XHRtYXJnaW46IDhweCAwIDA7XG5cdFx0XHR9XG5cblx0XHRcdCYuZGVzYyB7XG5cdFx0XHRcdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0XHRcdFx0Y29sb3I6ICM2NjY7XG5cdFx0XHR9XG5cblx0XHRcdCYuZGlzY291bnQtbm90ZSB7XG5cdFx0XHRcdGZvbnQtc3R5bGU6IGl0YWxpYztcblx0XHRcdFx0Y29sb3I6ICM2NjY7XG5cblx0XHRcdFx0c3Ryb25nIHtcblx0XHRcdFx0XHRjb2xvcjogZ3JlZW47XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGb3JtIGVsZW1lbnRzLlxuXHRcdGlucHV0W3R5cGU9dGV4dF0sXG5cdFx0aW5wdXRbdHlwZT1wYXNzd29yZF0sXG5cdFx0aW5wdXRbdHlwZT1udW1iZXJdLFxuXHRcdHNlbGVjdCB7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuXHRcdFx0Ym9yZGVyOiAxcHggc29saWQgI2RkZDtcblx0XHRcdGJvcmRlci1yYWRpdXM6IDNweDtcblx0XHRcdGJveC1zaGFkb3c6IG5vbmU7XG5cdFx0XHRjb2xvcjogIzMzMztcblx0XHRcdGRpc3BsYXk6IGlubGluZS1ibG9jaztcblx0XHRcdHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG5cdFx0XHRwYWRkaW5nOiA3cHggMTJweDtcblx0XHRcdG1hcmdpbjogMCAxMHB4IDAgMDtcblx0XHRcdHdpZHRoOiA0MDBweDtcblx0XHRcdG1pbi1oZWlnaHQ6IDM1cHg7XG5cdFx0XHRsaW5lLWhlaWdodDogMS4zO1xuXG5cdFx0XHRAaW5jbHVkZSBtZWRpYShcIjxkZXNrdG9wXCIpIHtcblx0XHRcdFx0d2lkdGg6IDMwMHB4O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlucHV0W3R5cGU9bnVtYmVyXSB7XG5cdFx0XHR3aWR0aDogMTAwcHg7XG5cdFx0fVxuXG5cdFx0dGV4dGFyZWEge1xuXG5cdFx0fVxuXG5cdFx0YnV0dG9uIHtcblx0XHRcdG1hcmdpbi1yaWdodDogMTBweDtcblx0XHR9XG5cblx0XHQuY2hvaWNlc2pzLXNlbGVjdC13cmFwIHtcblx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0bWF4LXdpZHRoOiA0MDBweDtcblxuXHRcdFx0QGluY2x1ZGUgbWVkaWEoXCI8ZGVza3RvcFwiKSB7XG5cdFx0XHRcdHdpZHRoOiAzMDBweDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQucHJvZ3Jlc3MtYmFyIHtcblx0XHRcdGJhY2tncm91bmQ6ICNmZmY7XG5cdFx0XHRib3JkZXI6IDFweCBzb2xpZCAkb3JhbmdlO1xuXHRcdFx0aGVpZ2h0OiAzMHB4O1xuXHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHRib3JkZXItcmFkaXVzOiAzcHg7XG5cdFx0XHRtYXJnaW46IDAgMCAxNnB4IDA7XG5cblx0XHRcdCYuY29tcGxldGUge1xuXHRcdFx0XHRib3JkZXI6IDFweCBzb2xpZCAkZ3JlZW47XG5cblx0XHRcdFx0LmJhciB7XG5cdFx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogJGdyZWVuO1xuXG5cdFx0XHRcdFx0JjphZnRlciB7XG5cdFx0XHRcdFx0XHRjb250ZW50OiBub25lO1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0LmJhciB7XG5cdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0XHRiYWNrZ3JvdW5kOiAkb3JhbmdlO1xuXHRcdFx0XHRoZWlnaHQ6IDEwMCU7XG5cdFx0XHRcdGxlZnQ6IDA7XG5cdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdFx0LXdlYmtpdC10cmFuc2l0aW9uOiB3aWR0aCAwLjVzIGVhc2UtaW4tb3V0O1xuXHRcdFx0XHQtbW96LXRyYW5zaXRpb246IHdpZHRoIDAuNXMgZWFzZS1pbi1vdXQ7XG5cdFx0XHRcdC1vLXRyYW5zaXRpb246IHdpZHRoIDAuNXMgZWFzZS1pbi1vdXQ7XG5cdFx0XHRcdHRyYW5zaXRpb246IHdpZHRoIDAuNXMgZWFzZS1pbi1vdXQ7XG5cblx0XHRcdFx0QC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzIHtcblx0XHRcdFx0XHR0byB7IGJhY2tncm91bmQtcG9zaXRpb246IDYwcHggMDsgfVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0QC1tb3ota2V5ZnJhbWVzIHByb2dyZXNzIHtcblx0XHRcdFx0ICB0byB7IGJhY2tncm91bmQtcG9zaXRpb246IDYwcHggMDsgfVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0QGtleWZyYW1lcyBwcm9ncmVzcyB7XG5cdFx0XHRcdCAgdG8geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA2MHB4IDA7IH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdCY6YWZ0ZXIge1xuXHRcdFx0XHRcdGNvbnRlbnQ6ICcnO1xuXHRcdFx0XHRcdGRpc3BsYXk6YmxvY2s7XG5cdFx0XHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0XHRcdHRvcDogMDtcblx0XHRcdFx0XHRsZWZ0OiAwO1xuXHRcdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0XHRcdGhlaWdodDogMTAwJTtcblx0XHRcdFx0XHQtd2Via2l0LWFuaW1hdGlvbjogcHJvZ3Jlc3MgMXMgbGluZWFyIGluZmluaXRlO1xuXHRcdFx0XHRcdC1tb3otYW5pbWF0aW9uOiBwcm9ncmVzcyAxcyBsaW5lYXIgaW5maW5pdGU7XG5cdFx0XHRcdFx0YW5pbWF0aW9uOiBwcm9ncmVzcyAxcyBsaW5lYXIgaW5maW5pdGU7XG5cdFx0XHRcdFx0YmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xuXHRcdFx0XHRcdGJhY2tncm91bmQtc2l6ZTogNjBweCA2MHB4O1xuXHRcdFx0XHRcdGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KC00NWRlZywgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA1MCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSkgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcblx0XHRcdFx0XHRiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoLTQ1ZGVnLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpIDUwJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KSA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUm93IGxhYmVsIChsZWZ0KS5cblx0LndwZm9ybXMtc2V0dGluZy1sYWJlbCB7XG5cdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0ZmxvYXQ6IGxlZnQ7XG5cdFx0d2lkdGg6IDIwMHB4O1xuXHRcdHBhZGRpbmc6IDA7XG5cblx0XHRAaW5jbHVkZSBtZWRpYShcIjx0YWJsZXRcIikge1xuXHRcdFx0ZmxvYXQ6IG5vbmU7XG5cdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdHBhZGRpbmctYm90dG9tOiAxNXB4O1xuXHRcdH1cblxuXHRcdGxhYmVsIHtcblx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0XHR9XG5cdH1cblxuXHQvLyBSb3cgZmllbGQgKHJpZ2h0KS5cblx0LndwZm9ybXMtc2V0dGluZy1maWVsZCB7XG5cdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0bWFyZ2luOiAwIDAgMCAyMDBweDtcblx0XHRtYXgtd2lkdGg6IDgwMHB4O1xuXG5cdFx0QGluY2x1ZGUgbWVkaWEoXCI8dGFibGV0XCIpIHtcblx0XHRcdG1hcmdpbjogMDtcblx0XHR9XG5cdH1cblxuXHRwLnN1Ym1pdCB7XG5cdFx0bWFyZ2luOiAwO1xuXHRcdHBhZGRpbmc6IDI1cHggMDtcblx0fVxuXG5cdC8vIEdlbmVyaWMgaW5mby9jb2RlIGluZm9ybWF0aW9uLlxuXHQuaW5mby1hcmVhLFxuXHQucHJlLWVycm9yIHtcblx0XHRkaXNwbGF5OiBibG9jaztcblx0XHR3aWR0aDogMTAwJTtcblx0XHRtYXgtd2lkdGg6IDEwMDBweDtcblx0XHRoZWlnaHQ6IDQ1MHB4O1xuXHRcdGZvbnQtZmFtaWx5OiBNZW5sbyxNb25hY28sbW9ub3NwYWNlO1xuXHRcdGZvbnQtc2l6ZTogMTJweDtcblx0XHRiYWNrZ3JvdW5kOiAjZmZmO1xuXHRcdGJveC1zaGFkb3c6IG5vbmU7XG5cdFx0Ym9yZGVyOiAxcHggc29saWQgI2RkZDtcblx0XHR3aGl0ZS1zcGFjZTogcHJlO1xuXHRcdG92ZXJmbG93OiBhdXRvO1xuXHRcdHBhZGRpbmc6IDIwcHg7XG5cdH1cblxuXHQucHJlLWVycm9yIHtcblx0XHRoZWlnaHQ6IGF1dG87XG5cdFx0bWF4LWhlaWdodDogMjUwcHg7XG5cdFx0bWFyZ2luLWJvdHRvbTogMjBweDtcblx0fVxuXG5cdC8vIENoZWNrYm94IG11bHRpLXNlbGVjdCBjb2x1bW5zLlxuXHQuY2hlY2tib3gtbXVsdGlzZWxlY3QtY29sdW1ucyB7XG5cdFx0bWF4LXdpZHRoOiA2MDBweDtcblx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cblx0XHQmOmFmdGVyIHtcblx0XHRcdGNvbnRlbnQ6IFwiLlwiO1xuXHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRoZWlnaHQ6IDA7XG5cdFx0XHRsaW5lLWhlaWdodDogMDtcblx0XHRcdGZvbnQtc2l6ZTogMDtcblx0XHRcdGNsZWFyOiBib3RoO1xuXHRcdFx0bWluLWhlaWdodDogMDtcblx0XHRcdHZpc2liaWxpdHk6IGhpZGRlbjtcblx0XHR9XG5cblx0XHQmOmJlZm9yZSB7XG5cdFx0XHRjb250ZW50OiBcIlxcZjBlY1wiO1xuXHRcdFx0Y29sb3I6ICM5OTk7XG5cdFx0XHRmb250OiBub3JtYWwgbm9ybWFsIG5vcm1hbCAyMHB4LzEgRm9udEF3ZXNvbWU7XG5cdFx0XHR0ZXh0LXJlbmRlcmluZzogYXV0bztcblx0XHRcdC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xuXHRcdFx0LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTtcblx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdHRvcDogMTMwcHg7XG5cdFx0XHRsZWZ0OiA1MCU7XG5cdFx0XHRtYXJnaW46IDAgMCAwIC0xMHB4O1xuXHRcdH1cblxuXHRcdC5oZWFkZXIge1xuXHRcdFx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0XHRcdGZvbnQtc2l6ZTogMTNweDtcblx0XHRcdG1hcmdpbjogMDtcblx0XHRcdHBhZGRpbmc6IDAgMCA1cHggMDtcblx0XHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHR9XG5cblx0XHQuZmlyc3QtY29sdW1uLFxuXHRcdC5zZWNvbmQtY29sdW1uIHtcblx0XHRcdHdpZHRoOiA0NSU7XG5cdFx0XHRmbG9hdDogbGVmdDtcblx0XHR9XG5cblx0XHQuZmlyc3QtY29sdW1uIHtcblxuXHRcdH1cblxuXHRcdC5zZWNvbmQtY29sdW1uIHtcblx0XHRcdGZsb2F0OiByaWdodDtcblxuXHRcdFx0dWwge1xuXHRcdFx0XHRsaSB7XG5cdFx0XHRcdFx0cGFkZGluZzogMTBweDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHVsIHtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG5cdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuXHRcdFx0Ym9yZGVyLXJhZGl1czogM3B4O1xuXHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdFx0aGVpZ2h0OiAyNTBweDtcblx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHRvdmVyZmxvdy15OiBhdXRvO1xuXHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0bGlzdC1zdHlsZS10eXBlOiBub25lO1xuXG5cdFx0XHRsaSB7XG5cdFx0XHRcdGJvcmRlci1ib3R0b206IDFweCAjZWVlIHNvbGlkO1xuXHRcdFx0XHRtYXJnaW46IDA7XG5cdFx0XHRcdGZvbnQtc2l6ZTogMTRweDtcblxuXHRcdFx0XHRsYWJlbCB7XG5cdFx0XHRcdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0XHRcdFx0cGFkZGluZzogMTBweCAxMHB4IDEwcHggMzJweDtcblx0XHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHRcdFx0dmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xuXG5cdFx0XHRcdFx0Jjpob3ZlciB7XG5cdFx0XHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAkb3JhbmdlO1xuXHRcdFx0XHRcdFx0Y29sb3I6ICNmZmY7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0JjpiZWZvcmUge1xuXHRcdFx0XHRcdFx0Y29udGVudDogXCJcXGYwYzhcIjtcblx0XHRcdFx0XHRcdGNvbG9yOiAjZGRkO1xuXHRcdFx0XHRcdFx0Zm9udDogbm9ybWFsIG5vcm1hbCBub3JtYWwgMTZweC8xIEZvbnRBd2Vzb21lO1xuXHRcdFx0XHRcdFx0dGV4dC1yZW5kZXJpbmc6IGF1dG87XG5cdFx0XHRcdFx0XHQtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcblx0XHRcdFx0XHRcdC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHRcdFx0XHR0b3A6IDEycHg7XG5cdFx0XHRcdFx0XHRsZWZ0OiAxMHB4O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCYuY2hlY2tlZCB7XG5cdFx0XHRcdFx0XHRvcGFjaXR5OiAwLjY7XG5cblx0XHRcdFx0XHRcdCY6YmVmb3JlIHtcblx0XHRcdFx0XHRcdFx0Y29udGVudDogXCJcXGYxNGFcIjtcblx0XHRcdFx0XHRcdFx0Y29sb3I6ICRncmVlbjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpbnB1dCB7XG5cdFx0XHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC5hbGwge1xuXHRcdFx0Y29sb3I6ICM5OTk7XG5cdFx0XHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cdFx0XHRmb250LXNpemU6IDEzcHg7XG5cdFx0XHRtYXJnaW46IDEwcHggMCAwO1xuXHRcdH1cblx0fVxuXG5cdC8vIE90aGVyIEltcG9ydGVycy4gKFRvb2xzKVxuXHQjd3Bmb3Jtcy1pbXBvcnRlci1hbmFseXplIHtcblx0XHRkaXNwbGF5OiBub25lO1xuXG5cdFx0LnByb2Nlc3MtY291bnQsXG5cdFx0cCB7XG5cdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0fVxuXG5cdFx0LnVwZ3JhZGUge1xuXHRcdFx0ZGlzcGxheTogbm9uZTtcblx0XHRcdGZvbnQtc2l6ZTogMTRweDtcblxuXHRcdFx0aDUge1xuXHRcdFx0XHRmb250LXNpemU6IDE4cHg7XG5cdFx0XHRcdGZvbnQtd2VpZ2h0OiA2MDA7XG5cdFx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHRcdG1hcmdpbjogMzBweCAwIDIwcHggMDtcblx0XHRcdH1cblxuXHRcdFx0aHIge1xuXHRcdFx0XHRib3JkZXI6IG5vbmU7XG5cdFx0XHRcdGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTRlNGU0O1xuXHRcdFx0XHRtYXJnaW46IDQwcHggMDtcblx0XHRcdH1cblxuXHRcdFx0LndwZm9ybXMtYnRuIHtcblx0XHRcdFx0bWFyZ2luLXJpZ2h0OiAxMHB4O1xuXHRcdFx0fVxuXG5cdFx0XHR1bCB7XG5cdFx0XHRcdGxpIHtcblx0XHRcdFx0XHRsaXN0LXN0eWxlLXR5cGU6IGRpc2M7XG5cdFx0XHRcdFx0bWFyZ2luLWxlZnQ6IDE0cHg7XG5cblx0XHRcdFx0XHQmLmZvcm0ge1xuXHRcdFx0XHRcdFx0bGlzdC1zdHlsZS10eXBlOiBub25lO1xuXHRcdFx0XHRcdFx0bWFyZ2luLWxlZnQ6IDA7XG5cdFx0XHRcdFx0XHRmb250LXdlaWdodDogNzAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEV4cG9ydCBlbnRyaWVzLiAoVG9vbHMpXG5cdCN3cGZvcm1zLXRvb2xzLWVudHJpZXMtZXhwb3J0IHtcblxuXHRcdGg1IHtcblx0XHRcdGNsZWFyOiBib3RoO1xuXHRcdFx0bWFyZ2luOiAyMHB4IDAgMTBweCAwO1xuXHRcdH1cblxuXHRcdGxhYmVsIHtcblx0XHRcdGNsZWFyOiBib3RoO1xuXHRcdFx0ZmxvYXQ6IGxlZnQ7XG5cdFx0XHRtYXJnaW46IDNweCAwIDNweCAwO1xuXHRcdH1cblxuXHRcdC5jaG9pY2VzanMtc2VsZWN0LXdyYXAge1xuXHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXG5cdFx0XHQuY2hvaWNlcyB7XG5cdFx0XHRcdG1hcmdpbi1ib3R0b206IDA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0I3dwZm9ybXMtdG9vbHMtZW50cmllcy1leHBvcnQtc2VsZWN0Zm9ybS1zcGlubmVyIHtcblx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdHRvcDogNnB4O1xuXHRcdFx0cmlnaHQ6IC0zMHB4O1xuXHRcdH1cblxuXHRcdC53cGZvcm1zLWRhdGUtc2VsZWN0b3Ige1xuXHRcdFx0d2lkdGg6IDIwMHB4O1xuXHRcdFx0Y3Vyc29yOiBwb2ludGVyO1xuXHRcdH1cblxuXHRcdC53cGZvcm1zLXNlYXJjaC1ib3gtZmllbGQge1xuXHRcdFx0d2lkdGg6IDIwMHB4O1xuXHRcdH1cblx0XHQud3Bmb3Jtcy1zZWFyY2gtYm94LWNvbXBhcmlzb24ge1xuXHRcdFx0d2lkdGg6IDE0MHB4O1xuXHRcdH1cblx0XHQud3Bmb3Jtcy1zZWFyY2gtYm94LXRlcm0ge1xuXHRcdFx0d2lkdGg6IDMwMHB4O1xuXHRcdH1cblxuXHRcdHNlY3Rpb24ge1xuXHRcdFx0bWFyZ2luLXRvcDogMjBweDtcblx0XHR9XG5cblx0XHRpZnJhbWUge1xuXHRcdFx0d2lkdGg6IDA7XG5cdFx0XHRoZWlnaHQ6IDA7XG5cdFx0XHR2aXNpYmlsaXR5OiBoaWRkZW47XG5cdFx0fVxuXG5cdFx0LndwZm9ybXMtYnRuLXRleHQge1xuXHRcdFx0b3BhY2l0eTogMTtcblx0XHRcdHRyYW5zaXRpb246IGFsbCAuNXM7XG5cdFx0fVxuXHRcdC53cGZvcm1zLWJ0bi1zcGlubmVyIHtcblx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcblx0XHRcdGxlZnQ6IDUwJTtcblx0XHRcdHRvcDogNTAlO1xuXHRcdFx0dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG5cdFx0XHRvcGFjaXR5OiAwO1xuXHRcdFx0dHJhbnNpdGlvbjogYWxsIC41cztcblx0XHR9XG5cblx0XHQud3Bmb3Jtcy1idG4tc3Bpbm5lci1vbiB7XG5cdFx0XHQud3Bmb3Jtcy1idG4tdGV4dCB7XG5cdFx0XHRcdG9wYWNpdHk6IDAgIWltcG9ydGFudDtcblx0XHRcdFx0dHJhbnNpdGlvbjogYWxsIC41cztcblx0XHRcdH1cblx0XHRcdC53cGZvcm1zLWJ0bi1zcGlubmVyIHtcblx0XHRcdFx0b3BhY2l0eTogMSAhaW1wb3J0YW50O1xuXHRcdFx0XHR0cmFuc2l0aW9uOiBhbGwgLjVzO1xuXHRcdFx0fVxuXHRcdFx0Y3Vyc29yOiBkZWZhdWx0O1xuXHRcdFx0b3BhY2l0eTogMC43NTtcblx0XHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0XHR9XG5cblx0XHQud3Bmb3Jtcy1idG4tc3Bpbm5lci1vbjpob3ZlciB7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZTI3NzMwO1xuXHRcdFx0Ym9yZGVyLWNvbG9yOiAjZTI3NzMwO1xuXHRcdH1cblxuXHRcdCN3cGZvcm1zLXRvb2xzLWVudHJpZXMtZXhwb3J0LXByb2Nlc3MtbXNnLFxuXHRcdCN3cGZvcm1zLXRvb2xzLWVudHJpZXMtZXhwb3J0LXNlbGVjdGZvcm0tbXNnIHtcblx0XHRcdGJhY2tncm91bmQ6ICNmZmY7XG5cdFx0XHRib3JkZXItbGVmdDogNHB4IHNvbGlkICMyMkEwRDA7XG5cdFx0XHRsaW5lLWhlaWdodDogMS41ZW07XG5cdFx0XHRtYXJnaW46IDIwcHggMCAwIDA7XG5cdFx0XHRwYWRkaW5nOiAxMHB4O1xuXG5cdFx0XHQmLndwZm9ybXMtZXJyb3Ige1xuXHRcdFx0XHRib3JkZXItY29sb3I6ICNkYzMyMzI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0I3dwZm9ybXMtaW1wb3J0ZXItcHJvY2VzcyB7XG5cdFx0ZGlzcGxheTogbm9uZTtcblxuXHRcdC5wcm9jZXNzLWNvdW50LFxuXHRcdC5wcm9jZXNzLWNvbXBsZXRlZCB7XG5cdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0fVxuXG5cdFx0LnByb2Nlc3MtY29tcGxldGVkIHtcblx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0fVxuXG5cdFx0LnN0YXR1cyB7XG5cdFx0XHRtYXJnaW46IDIwcHggMCAzMHB4O1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcblx0XHRcdGJvcmRlci1yYWRpdXM6IDNweDtcblx0XHRcdGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG5cdFx0XHRtYXgtaGVpZ2h0OiA4MDBweDtcblx0XHRcdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cblx0XHRcdC5pdGVtLXdyYXAge1xuXG5cdFx0XHR9XG5cblx0XHRcdC5pdGVtIHtcblx0XHRcdFx0Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG5cdFx0XHRcdHBhZGRpbmc6IDIwcHg7XG5cblx0XHRcdFx0JjpsYXN0LW9mLXR5cGUge1xuXHRcdFx0XHRcdGJvcmRlcjogbm9uZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHAge1xuXHRcdFx0XHRcdGZvbnQtc2l6ZTogMTNweDtcblx0XHRcdFx0XHRtYXJnaW46IDEycHggMCAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dWwge1xuXHRcdFx0XHRcdGZvbnQtc2l6ZTogMTNweDtcblx0XHRcdFx0XHRtYXJnaW46IDEycHggMCAwIDE2cHg7XG5cblx0XHRcdFx0XHRsaSB7XG5cdFx0XHRcdFx0XHRsaXN0LXN0eWxlOiBkaXNjO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC5zdGF0dXMtaWNvbiB7XG5cdFx0XHRcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXHRcdFx0XHRcdG1hcmdpbjogMCAxMHB4IDAgMDtcblxuXHRcdFx0XHRcdCYuZmEtaW5mby1jaXJjbGUge1xuXHRcdFx0XHRcdFx0Y29sb3I6ICMwMGEwZDJcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQmLmZhLWNoZWNrIHtcblx0XHRcdFx0XHRcdGNvbG9yOiAjNDZiNDUwXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ji5mYS1leGNsYW1hdGlvbi10cmlhbmdsZSB7XG5cdFx0XHRcdFx0XHRjb2xvcjogI2ZmYjkwMFxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCYuZmEtdGltZXMsXG5cdFx0XHRcdFx0Ji5mYS1leGNsYW1hdGlvbi1jaXJjbGUge1xuXHRcdFx0XHRcdFx0Y29sb3I6ICNkYzMyMzI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Lm5hbWUge1xuXHRcdFx0XHRcdGZvbnQtc2l6ZTogMTRweDtcblx0XHRcdFx0XHRmbG9hdDogbGVmdDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC5hY3Rpb25zIHtcblx0XHRcdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRcdFx0ZmxvYXQ6IHJpZ2h0O1xuXG5cdFx0XHRcdFx0LnNlcCB7XG5cdFx0XHRcdFx0XHRjb2xvcjogI2RkZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBMaXRlIHVwZ3JhZGUuXG5cdC5zZXR0aW5ncy1saXRlLWN0YXtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuXHRcdGJvcmRlcjogMXB4IHNvbGlkICNkYWRhZGE7XG5cdFx0cGFkZGluZzogMjVweCAyMHB4O1xuXHRcdG1hcmdpbjogMTBweCAwIDAgMDtcblx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cblx0XHQuZGlzbWlzcyB7XG5cdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHR0b3A6IDEwcHg7XG5cdFx0XHRyaWdodDogMTBweDtcblx0XHRcdGNvbG9yOiAjNjY2O1xuXHRcdFx0Zm9udC1zaXplOiAxNnB4O1xuXHRcdH1cblxuXHRcdGg1IHtcblx0XHRcdG1hcmdpbjogMCAwIDE2cHg7XG5cdFx0XHRmb250LXNpemU6IDE4cHg7XG5cdFx0XHRmb250LXdlaWdodDogNzAwO1xuXHRcdH1cblxuXHRcdGg2IHtcblx0XHRcdGZvbnQtd2VpZ2h0OiA3MDA7XG5cdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRtYXJnaW46IDAgMCAxNnB4O1xuXHRcdH1cblxuXHRcdHAge1xuXHRcdFx0Y29sb3I6ICM1NTU7XG5cdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0XHRtYXJnaW46IDAgMCAxNnB4O1xuXG5cdFx0XHQmOmxhc3Qtb2YtdHlwZSB7XG5cdFx0XHRcdG1hcmdpbjogMDtcblx0XHRcdH1cblxuXHRcdFx0YSB7XG5cdFx0XHRcdGNvbG9yOiAkb3JhbmdlO1xuXG5cdFx0XHRcdCY6aG92ZXIge1xuXHRcdFx0XHRcdGNvbG9yOiAkZGFya29yYW5nZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHVsIHtcblx0XHRcdG1hcmdpbjogMDtcblx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHR3aWR0aDogNTAlO1xuXHRcdFx0ZmxvYXQ6IGxlZnQ7XG5cblx0XHRcdEBpbmNsdWRlIG1lZGlhKFwiPD1waG9uZVwiKSB7XG5cdFx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0XHRmbG9hdDogbm9uZTtcblx0XHRcdH1cblxuXHRcdFx0bGkge1xuXHRcdFx0XHRtYXJnaW46IDA7XG5cdFx0XHRcdHBhZGRpbmc6IDAgMCAycHggMTZweDtcblx0XHRcdFx0Y29sb3I6ICM1NTU7XG5cdFx0XHRcdGZvbnQtc2l6ZTogMTRweDtcblx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXG5cdFx0XHRcdCY6YmVmb3JlIHtcblx0XHRcdFx0XHRjb250ZW50OiAnKyc7XG5cdFx0XHRcdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0XHRcdHRvcDogLTFweDtcblx0XHRcdFx0XHRsZWZ0OiAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Lmxpc3Qge1xuXHRcdFx0bWFyZ2luOiAwIDAgMTZweCAwO1xuXHRcdFx0b3ZlcmZsb3c6IGF1dG87XG5cdFx0XHRtYXgtd2lkdGg6IDkwMHB4O1xuXHRcdH1cblxuXHRcdC5ncmVlbiB7XG5cdFx0XHRjb2xvcjogIzIxODkwMDtcblx0XHRcdGZvbnQtd2VpZ2h0OiA3MDA7XG5cdFx0fVxuXG5cdFx0LmZhLXN0YXIge1xuXHRcdFx0Y29sb3I6ICNmZjk4MmQ7XG5cdFx0fVxuXHR9XG59XG4iLCIvLyBJbnRlZ3JhdGlvbnMgdGFiIGNvbnRlbnQuXG4vLyBMZWdhY3kgQ1NTIGFuZCBzaG91bGQgYmUgY2xlYW5lZCB1cCB3aGVuIHRpbWUgcGVybWl0cy5cbiN3cGZvcm1zLXNldHRpbmdzLXByb3ZpZGVycyB7XG5cblx0LndwZm9ybXMtc2V0dGluZ3MtcHJvdmlkZXIge1xuXHRcdGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuXHRcdHBhZGRpbmc6IDMwcHggMDtcblxuXHRcdCYuZm9jdXMtb3V0IHtcblx0XHRcdG9wYWNpdHk6IDAuNDtcblx0XHR9XG5cdH1cblxuXHQud3Bmb3Jtcy1zZXR0aW5ncy1wcm92aWRlci1oZWFkZXIge1xuXHRcdGN1cnNvcjogcG9pbnRlcjtcblx0XHRtYXgtd2lkdGg6IDEwMDBweDtcblx0fVxuXG5cdC53cGZvcm1zLXNldHRpbmdzLXByb3ZpZGVyLWxvZ28ge1xuXHRcdGZsb2F0OiBsZWZ0O1xuXHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuXHRcdC5mYSB7XG5cdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHR0b3A6IDUwJTtcblx0XHRcdG1hcmdpbjogLTlweCAwIDAgMDtcblx0XHRcdGxlZnQ6IDEwcHg7XG5cdFx0XHRjb2xvcjogIzY2Njtcblx0XHRcdGZvbnQtc2l6ZTogMThweDtcblx0XHR9XG5cblx0XHRpbWcge1xuXHRcdFx0YmFja2dyb3VuZDogI2ZmZjtcblx0XHRcdGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG5cdFx0XHRtYXgtd2lkdGg6IDkwcHg7XG5cdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdG1hcmdpbjogMCAwIDAgNDBweDtcblx0XHR9XG5cdH1cblxuXHQud3Bmb3Jtcy1zZXR0aW5ncy1wcm92aWRlci1pbmZvIHtcblx0XHRtYXJnaW46IDAgMCAwIDE2MHB4O1xuXHRcdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0XHRwYWRkaW5nOiAyMHB4IDAgMDtcblxuXHRcdGgzIHtcblx0XHRcdG1hcmdpbjogMCAwIDEwcHggMDtcblx0XHRcdGZvbnQtc2l6ZTogMjBweDtcblx0XHRcdGZvbnQtd2VpZ2h0OiA2MDA7XG5cdFx0fVxuXG5cdFx0cCB7XG5cdFx0XHRtYXJnaW46IDA7XG5cdFx0XHRmb250LXNpemU6IDE0cHg7XG5cdFx0fVxuXG5cdFx0LmNvbm5lY3RlZC1pbmRpY2F0b3Ige1xuXHRcdFx0Y29sb3I6ICM4M2MxMWY7XG5cdFx0XHR3aWR0aDogMTM1cHg7XG5cdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjODNjMTFmO1xuXHRcdFx0Ym9yZGVyLXJhZGl1czogNHB4O1xuXHRcdFx0cGFkZGluZzogOHB4IDE0cHg7XG5cdFx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHR0b3A6IDI4cHg7XG5cdFx0XHRyaWdodDogMDtcblx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0fVxuXHR9XG5cblx0LmNvbm5lY3RlZCAud3Bmb3Jtcy1zZXR0aW5ncy1wcm92aWRlci1pbmZvIC5jb25uZWN0ZWQtaW5kaWNhdG9yIHtcblx0XHRkaXNwbGF5OiBibG9jaztcblx0fVxuXG5cdC53cGZvcm1zLXNldHRpbmdzLXByb3ZpZGVyLWFjY291bnRzIHtcblx0XHRtYXJnaW46IDAgMCAwIDE2MHB4O1xuXHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0bWF4LXdpZHRoOiA4NDBweDtcblx0fVxuXG5cdC5mb2N1cy1pbiAud3Bmb3Jtcy1zZXR0aW5ncy1wcm92aWRlci1hY2NvdW50cyB7XG5cdFx0ZGlzcGxheTogYmxvY2s7XG5cdH1cblxuXHQud3Bmb3Jtcy1zZXR0aW5ncy1wcm92aWRlci1hY2NvdW50cy1saXN0IHVsIHtcblx0XHRwYWRkaW5nOiAwO1xuXHRcdG1hcmdpbjogMDtcblxuXHRcdGxpIHtcblx0XHRcdGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuXHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0cGFkZGluZzogMTBweCAwO1xuXHRcdFx0Zm9udC1zaXplOiAxNHB4O1xuXG5cdFx0XHQmOmZpcnN0LW9mLXR5cGUge1xuXHRcdFx0XHRib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcblx0XHRcdH1cblxuXHRcdFx0JjpsYXN0LW9mLXR5cGUge1xuXHRcdFx0XHRtYXJnaW4tYm90dG9tOiAxNnB4O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHNwYW4ubGFiZWwge1xuXHRcdFx0ZmxvYXQ6IGxlZnQ7XG5cdFx0XHR3aWR0aDogNTAlO1xuXHRcdH1cblxuXHRcdHNwYW4uZGF0ZSB7XG5cdFx0XHRjb2xvcjogIzk5OTtcblx0XHRcdGZsb2F0OiBsZWZ0O1xuXHRcdFx0d2lkdGg6IDM1JTtcblx0XHR9XG5cblx0XHRzcGFuLnJlbW92ZSB7XG5cdFx0XHRmbG9hdDogcmlnaHQ7XG5cdFx0XHR3aWR0aDogMTUlO1xuXHRcdFx0dGV4dC1hbGlnbjogcmlnaHRcblx0XHR9XG5cdH1cblxuXHQud3Bmb3Jtcy1zZXR0aW5ncy1wcm92aWRlci1hY2NvdW50cy1jb25uZWN0IHtcblx0XHRkaXNwbGF5OiBub25lO1xuXHRcdHBhZGRpbmc6IDIwcHg7XG5cdFx0YmFja2dyb3VuZC1jb2xvcjogJGxpZ2h0Qmx1ZTtcblx0XHRib3JkZXI6IDFweCBzb2xpZCAkYmx1ZTtcblxuXHRcdGlucHV0W3R5cGU9dGV4dF0ge1xuXHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcblx0XHRcdGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG5cdFx0XHRib3JkZXItcmFkaXVzOiAzcHg7XG5cdFx0XHRib3gtc2hhZG93OiBub25lO1xuXHRcdFx0Y29sb3I6ICMzMzM7XG5cdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdHBhZGRpbmc6IDdweCAxMnB4O1xuXHRcdFx0bWFyZ2luOiA1cHggMDtcblx0XHRcdHdpZHRoOiA0MDBweDtcblx0XHRcdG1pbi1oZWlnaHQ6IDM1cHg7XG5cdFx0XHRsaW5lLWhlaWdodDogMS4zO1xuXG5cdFx0fVxuXHR9XG5cblx0LmZvY3VzLWluIC53cGZvcm1zLXNldHRpbmdzLXByb3ZpZGVyLWFjY291bnRzLWNvbm5lY3QgIHtcblx0XHRkaXNwbGF5OiBibG9jaztcblx0fVxuXG5cdC53cGZvcm1zLXNldHRpbmdzLXByb3ZpZGVyLWFjY291bnRzLWNvbm5lY3QgLmZhIHtcblx0XHRkaXNwbGF5OiBub25lO1xuXHR9XG5cblx0LndwZm9ybXMtc2V0dGluZ3MtcHJvdmlkZXItYWNjb3VudHMtY29ubmVjdCBwLFxuXHQud3Bmb3Jtcy1zZXR0aW5ncy1wcm92aWRlci1hY2NvdW50cyBwIHtcblx0XHRtYXJnaW46IDAgMCAxNXB4IDA7XG5cdFx0Zm9udC1zaXplOiAxNHB4O1xuXHR9XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFLQUEsQUFBQSxRQUFRLENBQWM7RUFDcEIsUUFBUSxFQUFFLFFBQVE7RUFDbEIsYUFBYSxFREFLLElBQUk7Q0M0QnZCOztBQTlCRCxBQUdFLFFBSE0sQUFHTCxNQUFNLENBQUM7RUFBRSxPQUFPLEVBQUUsSUFBSTtDQUFJOztBQUg3QixBQUlFLFFBSk0sQUFJTCxXQUFXLENBQUM7RUFBRSxhQUFhLEVBQUUsQ0FBQztDQUFJOztBQUpyQyxBQU1JLFFBTkksQUFLTCxZQUFZLENBQ1gsZUFBZSxFQU5uQixRQUFRLEFBS0wsWUFBWSxDQUNNLGVBQWUsQ0FBMkI7RUFDekQsZ0JBQWdCLEVERE0sT0FBTztFQ0U3QixNQUFNLEVBQUUsV0FBVztFQUNuQixXQUFXLEVBQUUsSUFBSTtDQUNsQjs7QUFWTCxBQVdJLFFBWEksQUFLTCxZQUFZLENBTVgsY0FBYyxDQUFjO0VBQUUsTUFBTSxFQUFFLFdBQVc7Q0FBSTs7QUFYekQsQUFhRSxRQWJNLEVBYUosQUFBQSxNQUFDLEFBQUEsRUFBUTtFQUNULE9BQU8sRUFBRSxlQUFlO0NBQ3pCOztBQWZILEFBZ0JFLFFBaEJNLENBZ0JOLEtBQUssQ0FBQSxBQUFBLElBQUMsQ0FBRCxJQUFDLEFBQUEsQ0FBVSxlQUFlLENBQWM7RUFDNUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLFVBQVU7RUFDckMsTUFBTSxFQUFFLGVBQWU7RUFDdkIsT0FBTyxFQUFFLG1CQUFtQjtFQUM1QixVQUFVLEVBQUUscUJBQXFCO0VBQ2pDLE1BQU0sRUFBRSx5QkFBeUI7RUFDakMsYUFB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QztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsWUFBWTtDQUFFOztBQUNsRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsWUFBWTtDQUFFOztBQUNsRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsUUFBUTtDQUFFOztBQUM5RCxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsWUFBWTtDQUFFOztBQUNsRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsWUFBWTtDQUFFOztBQUNsRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsYUFBYTtDQUFFOztBQUNuRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsYUFBYTtDQUFFOztBQUNuRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsUUFBUTtDQUFFOztBQUM5RCxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsWUFBWTtDQUFFOztBQUNsRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsWUFBWTtDQUFFOztBQUNsRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsYUFBYTtDQUFFOztBQUNuRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsYUFBYTtDQUFFOztBQUNuRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsUUFBUTtDQUFFOztBQUM5RCxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsWUFBWTtDQUFFOztBQUNsRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsWUFBWTtDQUFFOztBQUNsRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsYUFBYTtDQUFFOztBQUNuRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsYUFBYTtDQUFFOztBQUNuRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsUUFBUTtDQUFFOztBQUM5RCxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsWUFBWTtDQUFFOztBQUNsRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsWUFBWTtDQUFFOztBQUNsRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsYUFBYTtDQUFFOztBQUNuRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsYUFBYTtDQUFFOztBQUNuRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsUUFBUTtDQUFFOztBQUM5RCxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsWUFBWTtDQUFFOztBQUNsRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsWUFBWTtDQUFFOztBQUNsRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsYUFBYTtDQUFFOztBQUNuRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsYUFBYTtDQUFFOztBQUNuRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsUUFBUTtDQUFFOztBQUM5RCxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsWUFBWTtDQUFFOztBQUNsRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsWUFBWTtDQUFFOztBQUNsRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsYUFBYTtDQUFFOztBQUNuRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsYUFBYTtDQUFFOztBQUNuRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsUUFBUTtDQUFFOztBQUM5RCxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsWUFBWTtDQUFFOztBQUNsRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsWUFBWTtDQUFFOztBQUNsRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsYUFBYTtDQUFFOztBQUNuRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsYUFBYTtDQUFFOztBQUNuRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLGFBQWE7Q0FBRTs7QUFDbkUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxhQUFhO0NBQUU7O0FBQ25FLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsUUFBUTtDQUFFOztBQUM5RCxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7RUFBQyxtQkFBbUIsRUFBRSxZQUFZO0NBQUU7O0FBQ2xFLEFBQUEsYUFBYSxBQUFBLGdCQUFnQixDQUFDO0VBQUMsbUJBQW1CLEVBQUUsWUFBWTtDQUFFOztBQUNsRSxBQUFBLGFBQWEsQUFBQSxnQkFBZ0IsQ0FBQztFQUFDLG1CQUFtQixFQUFFLFlBQVk7Q0FBRTs7QUFDbEUsQUFBQSxhQUFhLEFBQUEsZ0JBQWdCLENBQUM7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 */
css/admin/aioseop-flyout.css ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #aioseop-flyout {
2
+ position: fixed;
3
+ z-index: 99999;
4
+ transition: all 0.2s ease-in-out;
5
+ right: 40px;
6
+ bottom: 40px;
7
+ opacity: 1;
8
+ }
9
+
10
+ @media (max-width: 959px) {
11
+ #aioseop-flyout {
12
+ display: none;
13
+ }
14
+ }
15
+
16
+ #aioseop-flyout .aioseop-flyout-head {
17
+ display: block;
18
+ }
19
+
20
+ #aioseop-flyout .aioseop-flyout-head img {
21
+ width: 54px;
22
+ height: 54px;
23
+ padding: 5px;
24
+ display: block;
25
+ border: 2px solid rgb(13, 44, 129);
26
+ border-radius: 50%;
27
+ overflow: hidden;
28
+ box-shadow: 0 3px 20px rgba(0, 0, 0, 0.2);
29
+ transition: all 0.2s ease-in-out;
30
+ background-color: white;
31
+ }
32
+
33
+ #aioseop-flyout .aioseop-flyout-head:hover img {
34
+ box-shadow: 0 3px 30px rgba(0, 0, 0, 0.25);
35
+ }
36
+
37
+ #aioseop-flyout .aioseop-flyout-head .aioseop-flyout-label {
38
+ opacity: 0;
39
+ transform: translateY(-50%) scale(0);
40
+ margin-right: -50px;
41
+ }
42
+
43
+ #aioseop-flyout .aioseop-flyout-head:hover .aioseop-flyout-label {
44
+ opacity: 1;
45
+ transform: translateY(-50%) scale(1);
46
+ margin-right: 0;
47
+ }
48
+
49
+ #aioseop-flyout .aioseop-flyout-head:focus {
50
+ box-shadow: none;
51
+ }
52
+
53
+ #aioseop-flyout .aioseop-flyout-head .aioseop-flyout-label {
54
+ right: calc(100% + 15px);
55
+ }
56
+
57
+ #aioseop-flyout .aioseop-flyout-label {
58
+ position: absolute;
59
+ display: block;
60
+ top: 50%;
61
+ right: calc(100% + 25px);
62
+ transform: translateY(-50%);
63
+ -moz-transform: translateY(-50%);
64
+ -webkit-transform: translateY(-50%);
65
+ color: #fff;
66
+ background: #5F5E5E 0 0 no-repeat padding-box;
67
+ font-size: 12px;
68
+ white-space: nowrap;
69
+ padding: 5px 10px;
70
+ height: auto !important;
71
+ line-height: initial;
72
+ transition: all 0.2s ease-out;
73
+ border-radius: 3px;
74
+ -moz-border-radius: 3px;
75
+ -webkit-border-radius: 3px;
76
+ }
77
+
78
+ #aioseop-flyout .aioseop-flyout-item {
79
+ position: absolute;
80
+ left: 15px;
81
+ width: 40px;
82
+ height: 40px;
83
+ opacity: 0;
84
+ visibility: hidden;
85
+ transition: all 0.2s ease-in-out;
86
+ transform: scale(0);
87
+ border-radius: 50%;
88
+ box-shadow: 0 3px 20px rgba(0, 0, 0, 0.2);
89
+ background: #036AAB 0 0 no-repeat padding-box;
90
+ text-align: center;
91
+ vertical-align: middle;
92
+ }
93
+
94
+ #aioseop-flyout .aioseop-flyout-item img {
95
+ width: 20px;
96
+ height: 20px;
97
+ position: relative;
98
+ top: 22%;
99
+ }
100
+
101
+ #aioseop-flyout .aioseop-flyout-item.aioseop-flyout-item-0 {
102
+ bottom: 75px;
103
+ }
104
+
105
+ #aioseop-flyout .aioseop-flyout-item.aioseop-flyout-item-1 {
106
+ bottom: 130px;
107
+ }
108
+
109
+ #aioseop-flyout .aioseop-flyout-item.aioseop-flyout-item-2 {
110
+ bottom: 185px;
111
+ }
112
+
113
+ #aioseop-flyout .aioseop-flyout-item.aioseop-flyout-item-3 {
114
+ bottom: 240px;
115
+ }
116
+
117
+ #aioseop-flyout .aioseop-flyout-item.aioseop-flyout-item-4 {
118
+ bottom: 295px;
119
+ }
120
+
121
+ #aioseop-flyout .aioseop-flyout-item:hover {
122
+ box-shadow: 0 3px 30px rgba(0, 0, 0, 0.25);
123
+ background: #0096F0 0 0 no-repeat padding-box;
124
+ }
125
+
126
+ #aioseop-flyout .aioseop-flyout-item:hover .aioseop-flyout-label {
127
+ background: #444444 0 0 no-repeat padding-box;
128
+ }
129
+
130
+ #aioseop-flyout.opened .aioseop-flyout-item {
131
+ opacity: 1;
132
+ visibility: visible;
133
+ transform: scale(1);
134
+ }
135
+
136
+ #aioseop-flyout.opened .aioseop-flyout-head .aioseop-flyout-label {
137
+ display: none;
138
+ }
139
+
140
+ #aioseop-flyout.opened .aioseop-flyout-item-0 {
141
+ transition: transform 0.2s 0ms, background-color 0.2s;
142
+ }
143
+
144
+ #aioseop-flyout.opened .aioseop-flyout-item-1 {
145
+ transition: transform 0.2s 35ms, background-color 0.2s;
146
+ }
147
+
148
+ #aioseop-flyout.opened .aioseop-flyout-item-2 {
149
+ transition: transform 0.2s 70ms, background-color 0.2s;
150
+ }
151
+
152
+ #aioseop-flyout.opened .aioseop-flyout-item-3 {
153
+ transition: transform 0.2s 105ms, background-color 0.2s;
154
+ }
155
+
156
+ #aioseop-flyout.opened .aioseop-flyout-item-4 {
157
+ transition: transform 0.2s 140ms, background-color 0.2s;
158
+ }
159
+
160
+ #aioseop-flyout.out {
161
+ opacity: 0;
162
+ visibility: hidden;
163
+ }
css/admin/selectize-v0.12.6/selectize.css ADDED
@@ -0,0 +1,333 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * selectize.css (v0.12.6)
3
+ * Copyright (c) 2013–2015 Brian Reavis & contributors
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
6
+ * file except in compliance with the License. You may obtain a copy of the License at:
7
+ * http://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under
10
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ * ANY KIND, either express or implied. See the License for the specific language
12
+ * governing permissions and limitations under the License.
13
+ *
14
+ * @author Brian Reavis <brian@thirdroute.com>
15
+ */
16
+
17
+ .selectize-control.plugin-drag_drop.multi > .selectize-input > div.ui-sortable-placeholder {
18
+ visibility: visible !important;
19
+ background: #f2f2f2 !important;
20
+ background: rgba(0, 0, 0, 0.06) !important;
21
+ border: 0 none !important;
22
+ -webkit-box-shadow: inset 0 0 12px 4px #fff;
23
+ box-shadow: inset 0 0 12px 4px #fff;
24
+ }
25
+ .selectize-control.plugin-drag_drop .ui-sortable-placeholder::after {
26
+ content: '!';
27
+ visibility: hidden;
28
+ }
29
+ .selectize-control.plugin-drag_drop .ui-sortable-helper {
30
+ -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
31
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
32
+ }
33
+ .selectize-dropdown-header {
34
+ position: relative;
35
+ padding: 5px 8px;
36
+ border-bottom: 1px solid #d0d0d0;
37
+ background: #f8f8f8;
38
+ -webkit-border-radius: 3px 3px 0 0;
39
+ -moz-border-radius: 3px 3px 0 0;
40
+ border-radius: 3px 3px 0 0;
41
+ }
42
+ .selectize-dropdown-header-close {
43
+ position: absolute;
44
+ right: 8px;
45
+ top: 50%;
46
+ color: #303030;
47
+ opacity: 0.4;
48
+ margin-top: -12px;
49
+ line-height: 20px;
50
+ font-size: 20px !important;
51
+ }
52
+ .selectize-dropdown-header-close:hover {
53
+ color: #000000;
54
+ }
55
+ .selectize-dropdown.plugin-optgroup_columns .optgroup {
56
+ border-right: 1px solid #f2f2f2;
57
+ border-top: 0 none;
58
+ float: left;
59
+ -webkit-box-sizing: border-box;
60
+ -moz-box-sizing: border-box;
61
+ box-sizing: border-box;
62
+ }
63
+ .selectize-dropdown.plugin-optgroup_columns .optgroup:last-child {
64
+ border-right: 0 none;
65
+ }
66
+ .selectize-dropdown.plugin-optgroup_columns .optgroup:before {
67
+ display: none;
68
+ }
69
+ .selectize-dropdown.plugin-optgroup_columns .optgroup-header {
70
+ border-top: 0 none;
71
+ }
72
+ .selectize-control.plugin-remove_button [data-value] {
73
+ position: relative;
74
+ padding-right: 24px !important;
75
+ }
76
+ .selectize-control.plugin-remove_button [data-value] .remove {
77
+ z-index: 1;
78
+ /* fixes ie bug (see #392) */
79
+ position: absolute;
80
+ top: 0;
81
+ right: 0;
82
+ bottom: 0;
83
+ width: 17px;
84
+ text-align: center;
85
+ font-weight: bold;
86
+ font-size: 12px;
87
+ color: inherit;
88
+ text-decoration: none;
89
+ vertical-align: middle;
90
+ display: inline-block;
91
+ padding: 2px 0 0 0;
92
+ border-left: 1px solid #d0d0d0;
93
+ -webkit-border-radius: 0 2px 2px 0;
94
+ -moz-border-radius: 0 2px 2px 0;
95
+ border-radius: 0 2px 2px 0;
96
+ -webkit-box-sizing: border-box;
97
+ -moz-box-sizing: border-box;
98
+ box-sizing: border-box;
99
+ }
100
+ .selectize-control.plugin-remove_button [data-value] .remove:hover {
101
+ background: rgba(0, 0, 0, 0.05);
102
+ }
103
+ .selectize-control.plugin-remove_button [data-value].active .remove {
104
+ border-left-color: #cacaca;
105
+ }
106
+ .selectize-control.plugin-remove_button .disabled [data-value] .remove:hover {
107
+ background: none;
108
+ }
109
+ .selectize-control.plugin-remove_button .disabled [data-value] .remove {
110
+ border-left-color: #ffffff;
111
+ }
112
+ .selectize-control.plugin-remove_button .remove-single {
113
+ position: absolute;
114
+ right: 0;
115
+ top: 0;
116
+ font-size: 23px;
117
+ }
118
+ .selectize-control {
119
+ position: relative;
120
+ }
121
+ .selectize-dropdown,
122
+ .selectize-input,
123
+ .selectize-input input {
124
+ color: #303030;
125
+ font-family: inherit;
126
+ font-size: 13px;
127
+ line-height: 18px;
128
+ -webkit-font-smoothing: inherit;
129
+ }
130
+ .selectize-input,
131
+ .selectize-control.single .selectize-input.input-active {
132
+ background: #fff;
133
+ cursor: text;
134
+ display: inline-block;
135
+ }
136
+ .selectize-input {
137
+ border: 1px solid #d0d0d0;
138
+ padding: 8px 8px;
139
+ display: inline-block;
140
+ width: 100%;
141
+ overflow: hidden;
142
+ position: relative;
143
+ z-index: 1;
144
+ -webkit-box-sizing: border-box;
145
+ -moz-box-sizing: border-box;
146
+ box-sizing: border-box;
147
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
148
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
149
+ -webkit-border-radius: 3px;
150
+ -moz-border-radius: 3px;
151
+ border-radius: 3px;
152
+ }
153
+ .selectize-control.multi .selectize-input.has-items {
154
+ padding: 6px 8px 3px;
155
+ }
156
+ .selectize-input.full {
157
+ background-color: #fff;
158
+ }
159
+ .selectize-input.disabled,
160
+ .selectize-input.disabled * {
161
+ cursor: default !important;
162
+ }
163
+ .selectize-input.focus {
164
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
165
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
166
+ }
167
+ .selectize-input.dropdown-active {
168
+ -webkit-border-radius: 3px 3px 0 0;
169
+ -moz-border-radius: 3px 3px 0 0;
170
+ border-radius: 3px 3px 0 0;
171
+ }
172
+ .selectize-input > * {
173
+ vertical-align: baseline;
174
+ display: -moz-inline-stack;
175
+ display: inline-block;
176
+ zoom: 1;
177
+ *display: inline;
178
+ }
179
+ .selectize-control.multi .selectize-input > div {
180
+ cursor: pointer;
181
+ margin: 0 3px 3px 0;
182
+ padding: 2px 6px;
183
+ background: #f2f2f2;
184
+ color: #303030;
185
+ border: 0 solid #d0d0d0;
186
+ }
187
+ .selectize-control.multi .selectize-input > div.active {
188
+ background: #e8e8e8;
189
+ color: #303030;
190
+ border: 0 solid #cacaca;
191
+ }
192
+ .selectize-control.multi .selectize-input.disabled > div,
193
+ .selectize-control.multi .selectize-input.disabled > div.active {
194
+ color: #7d7d7d;
195
+ background: #ffffff;
196
+ border: 0 solid #ffffff;
197
+ }
198
+ .selectize-input > input {
199
+ display: inline-block !important;
200
+ padding: 0 !important;
201
+ min-height: 0 !important;
202
+ max-height: none !important;
203
+ max-width: 100% !important;
204
+ margin: 0 2px 0 0 !important;
205
+ text-indent: 0 !important;
206
+ border: 0 none !important;
207
+ background: none !important;
208
+ line-height: inherit !important;
209
+ -webkit-user-select: auto !important;
210
+ -webkit-box-shadow: none !important;
211
+ box-shadow: none !important;
212
+ }
213
+ .selectize-input > input::-ms-clear {
214
+ display: none;
215
+ }
216
+ .selectize-input > input:focus {
217
+ outline: none !important;
218
+ }
219
+ .selectize-input::after {
220
+ content: ' ';
221
+ display: block;
222
+ clear: left;
223
+ }
224
+ .selectize-input.dropdown-active::before {
225
+ content: ' ';
226
+ display: block;
227
+ position: absolute;
228
+ background: #f0f0f0;
229
+ height: 1px;
230
+ bottom: 0;
231
+ left: 0;
232
+ right: 0;
233
+ }
234
+ .selectize-dropdown {
235
+ position: absolute;
236
+ z-index: 10;
237
+ border: 1px solid #d0d0d0;
238
+ background: #fff;
239
+ margin: -1px 0 0 0;
240
+ border-top: 0 none;
241
+ -webkit-box-sizing: border-box;
242
+ -moz-box-sizing: border-box;
243
+ box-sizing: border-box;
244
+ -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
245
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
246
+ -webkit-border-radius: 0 0 3px 3px;
247
+ -moz-border-radius: 0 0 3px 3px;
248
+ border-radius: 0 0 3px 3px;
249
+ }
250
+ .selectize-dropdown [data-selectable] {
251
+ cursor: pointer;
252
+ overflow: hidden;
253
+ }
254
+ .selectize-dropdown [data-selectable] .highlight {
255
+ background: rgba(125, 168, 208, 0.2);
256
+ -webkit-border-radius: 1px;
257
+ -moz-border-radius: 1px;
258
+ border-radius: 1px;
259
+ }
260
+ .selectize-dropdown .option,
261
+ .selectize-dropdown .optgroup-header {
262
+ padding: 5px 8px;
263
+ }
264
+ .selectize-dropdown .option,
265
+ .selectize-dropdown [data-disabled],
266
+ .selectize-dropdown [data-disabled] [data-selectable].option {
267
+ cursor: inherit;
268
+ opacity: 0.5;
269
+ }
270
+ .selectize-dropdown [data-selectable].option {
271
+ opacity: 1;
272
+ }
273
+ .selectize-dropdown .optgroup:first-child .optgroup-header {
274
+ border-top: 0 none;
275
+ }
276
+ .selectize-dropdown .optgroup-header {
277
+ color: #303030;
278
+ background: #fff;
279
+ cursor: default;
280
+ }
281
+ .selectize-dropdown .active {
282
+ background-color: #f5fafd;
283
+ color: #495c68;
284
+ }
285
+ .selectize-dropdown .active.create {
286
+ color: #495c68;
287
+ }
288
+ .selectize-dropdown .create {
289
+ color: rgba(48, 48, 48, 0.5);
290
+ }
291
+ .selectize-dropdown-content {
292
+ overflow-y: auto;
293
+ overflow-x: hidden;
294
+ max-height: 200px;
295
+ -webkit-overflow-scrolling: touch;
296
+ }
297
+ .selectize-control.single .selectize-input,
298
+ .selectize-control.single .selectize-input input {
299
+ cursor: pointer;
300
+ }
301
+ .selectize-control.single .selectize-input.input-active,
302
+ .selectize-control.single .selectize-input.input-active input {
303
+ cursor: text;
304
+ }
305
+ .selectize-control.single .selectize-input:after {
306
+ content: ' ';
307
+ display: block;
308
+ position: absolute;
309
+ top: 50%;
310
+ right: 15px;
311
+ margin-top: -3px;
312
+ width: 0;
313
+ height: 0;
314
+ border-style: solid;
315
+ border-width: 5px 5px 0 5px;
316
+ border-color: #808080 transparent transparent transparent;
317
+ }
318
+ .selectize-control.single .selectize-input.dropdown-active:after {
319
+ margin-top: -4px;
320
+ border-width: 0 5px 5px 5px;
321
+ border-color: transparent transparent #808080 transparent;
322
+ }
323
+ .selectize-control.rtl.single .selectize-input:after {
324
+ left: 15px;
325
+ right: auto;
326
+ }
327
+ .selectize-control.rtl .selectize-input > input {
328
+ margin: 0 4px 0 -2px !important;
329
+ }
330
+ .selectize-control .selectize-input.disabled {
331
+ opacity: 0.5;
332
+ background-color: #fafafa;
333
+ }
css/admin/selectize-v0.12.6/selectize.default.css ADDED
@@ -0,0 +1,403 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * selectize.default.css (v0.12.6) - Default Theme
3
+ * Copyright (c) 2013–2015 Brian Reavis & contributors
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
6
+ * file except in compliance with the License. You may obtain a copy of the License at:
7
+ * http://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under
10
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ * ANY KIND, either express or implied. See the License for the specific language
12
+ * governing permissions and limitations under the License.
13
+ *
14
+ * @author Brian Reavis <brian@thirdroute.com>
15
+ */
16
+ .selectize-control.plugin-drag_drop.multi > .selectize-input > div.ui-sortable-placeholder {
17
+ visibility: visible !important;
18
+ background: #f2f2f2 !important;
19
+ background: rgba(0, 0, 0, 0.06) !important;
20
+ border: 0 none !important;
21
+ -webkit-box-shadow: inset 0 0 12px 4px #fff;
22
+ box-shadow: inset 0 0 12px 4px #fff;
23
+ }
24
+ .selectize-control.plugin-drag_drop .ui-sortable-placeholder::after {
25
+ content: '!';
26
+ visibility: hidden;
27
+ }
28
+ .selectize-control.plugin-drag_drop .ui-sortable-helper {
29
+ -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
30
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
31
+ }
32
+ .selectize-dropdown-header {
33
+ position: relative;
34
+ padding: 5px 8px;
35
+ border-bottom: 1px solid #d0d0d0;
36
+ background: #f8f8f8;
37
+ -webkit-border-radius: 3px 3px 0 0;
38
+ -moz-border-radius: 3px 3px 0 0;
39
+ border-radius: 3px 3px 0 0;
40
+ }
41
+ .selectize-dropdown-header-close {
42
+ position: absolute;
43
+ right: 8px;
44
+ top: 50%;
45
+ color: #303030;
46
+ opacity: 0.4;
47
+ margin-top: -12px;
48
+ line-height: 20px;
49
+ font-size: 20px !important;
50
+ }
51
+ .selectize-dropdown-header-close:hover {
52
+ color: #000000;
53
+ }
54
+ .selectize-dropdown.plugin-optgroup_columns .optgroup {
55
+ border-right: 1px solid #f2f2f2;
56
+ border-top: 0 none;
57
+ float: left;
58
+ -webkit-box-sizing: border-box;
59
+ -moz-box-sizing: border-box;
60
+ box-sizing: border-box;
61
+ }
62
+ .selectize-dropdown.plugin-optgroup_columns .optgroup:last-child {
63
+ border-right: 0 none;
64
+ }
65
+ .selectize-dropdown.plugin-optgroup_columns .optgroup:before {
66
+ display: none;
67
+ }
68
+ .selectize-dropdown.plugin-optgroup_columns .optgroup-header {
69
+ border-top: 0 none;
70
+ }
71
+ .selectize-control.plugin-remove_button [data-value] {
72
+ position: relative;
73
+ padding-right: 24px !important;
74
+ }
75
+ .selectize-control.plugin-remove_button [data-value] .remove {
76
+ z-index: 1;
77
+ /* fixes ie bug (see #392) */
78
+ position: absolute;
79
+ top: 0;
80
+ right: 0;
81
+ bottom: 0;
82
+ width: 17px;
83
+ text-align: center;
84
+ font-weight: bold;
85
+ font-size: 12px;
86
+ color: inherit;
87
+ text-decoration: none;
88
+ vertical-align: middle;
89
+ display: inline-block;
90
+ padding: 2px 0 0 0;
91
+ border-left: 1px solid #0073bb;
92
+ -webkit-border-radius: 0 2px 2px 0;
93
+ -moz-border-radius: 0 2px 2px 0;
94
+ border-radius: 0 2px 2px 0;
95
+ -webkit-box-sizing: border-box;
96
+ -moz-box-sizing: border-box;
97
+ box-sizing: border-box;
98
+ }
99
+ .selectize-control.plugin-remove_button [data-value] .remove:hover {
100
+ background: rgba(0, 0, 0, 0.05);
101
+ }
102
+ .selectize-control.plugin-remove_button [data-value].active .remove {
103
+ border-left-color: #00578d;
104
+ }
105
+ .selectize-control.plugin-remove_button .disabled [data-value] .remove:hover {
106
+ background: none;
107
+ }
108
+ .selectize-control.plugin-remove_button .disabled [data-value] .remove {
109
+ border-left-color: #aaaaaa;
110
+ }
111
+ .selectize-control.plugin-remove_button .remove-single {
112
+ position: absolute;
113
+ right: 0;
114
+ top: 0;
115
+ font-size: 23px;
116
+ }
117
+ .selectize-control {
118
+ position: relative;
119
+ }
120
+ .selectize-dropdown,
121
+ .selectize-input,
122
+ .selectize-input input {
123
+ color: #303030;
124
+ font-family: inherit;
125
+ font-size: 13px;
126
+ line-height: 18px;
127
+ -webkit-font-smoothing: inherit;
128
+ }
129
+ .selectize-input,
130
+ .selectize-control.single .selectize-input.input-active {
131
+ background: #fff;
132
+ cursor: text;
133
+ display: inline-block;
134
+ }
135
+ .selectize-input {
136
+ border: 1px solid #d0d0d0;
137
+ padding: 8px 8px;
138
+ display: inline-block;
139
+ width: 100%;
140
+ overflow: hidden;
141
+ position: relative;
142
+ z-index: 1;
143
+ -webkit-box-sizing: border-box;
144
+ -moz-box-sizing: border-box;
145
+ box-sizing: border-box;
146
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
147
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
148
+ -webkit-border-radius: 3px;
149
+ -moz-border-radius: 3px;
150
+ border-radius: 3px;
151
+ }
152
+ .selectize-control.multi .selectize-input.has-items {
153
+ padding: 5px 8px 2px;
154
+ }
155
+ .selectize-input.full {
156
+ background-color: #fff;
157
+ }
158
+ .selectize-input.disabled,
159
+ .selectize-input.disabled * {
160
+ cursor: default !important;
161
+ }
162
+ .selectize-input.focus {
163
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
164
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
165
+ }
166
+ .selectize-input.dropdown-active {
167
+ -webkit-border-radius: 3px 3px 0 0;
168
+ -moz-border-radius: 3px 3px 0 0;
169
+ border-radius: 3px 3px 0 0;
170
+ }
171
+ .selectize-input > * {
172
+ vertical-align: baseline;
173
+ display: -moz-inline-stack;
174
+ display: inline-block;
175
+ zoom: 1;
176
+ *display: inline;
177
+ }
178
+ .selectize-control.multi .selectize-input > div {
179
+ cursor: pointer;
180
+ margin: 0 3px 3px 0;
181
+ padding: 2px 6px;
182
+ background: #1da7ee;
183
+ color: #fff;
184
+ border: 1px solid #0073bb;
185
+ }
186
+ .selectize-control.multi .selectize-input > div.active {
187
+ background: #92c836;
188
+ color: #fff;
189
+ border: 1px solid #00578d;
190
+ }
191
+ .selectize-control.multi .selectize-input.disabled > div,
192
+ .selectize-control.multi .selectize-input.disabled > div.active {
193
+ color: #ffffff;
194
+ background: #d2d2d2;
195
+ border: 1px solid #aaaaaa;
196
+ }
197
+ .selectize-input > input {
198
+ display: inline-block !important;
199
+ padding: 0 !important;
200
+ min-height: 0 !important;
201
+ max-height: none !important;
202
+ max-width: 100% !important;
203
+ margin: 0 1px !important;
204
+ text-indent: 0 !important;
205
+ border: 0 none !important;
206
+ background: none !important;
207
+ line-height: inherit !important;
208
+ -webkit-user-select: auto !important;
209
+ -webkit-box-shadow: none !important;
210
+ box-shadow: none !important;
211
+ }
212
+ .selectize-input > input::-ms-clear {
213
+ display: none;
214
+ }
215
+ .selectize-input > input:focus {
216
+ outline: none !important;
217
+ }
218
+ .selectize-input::after {
219
+ content: ' ';
220
+ display: block;
221
+ clear: left;
222
+ }
223
+ .selectize-input.dropdown-active::before {
224
+ content: ' ';
225
+ display: block;
226
+ position: absolute;
227
+ background: #f0f0f0;
228
+ height: 1px;
229
+ bottom: 0;
230
+ left: 0;
231
+ right: 0;
232
+ }
233
+ .selectize-dropdown {
234
+ position: absolute;
235
+ z-index: 10;
236
+ border: 1px solid #d0d0d0;
237
+ background: #fff;
238
+ margin: -1px 0 0 0;
239
+ border-top: 0 none;
240
+ -webkit-box-sizing: border-box;
241
+ -moz-box-sizing: border-box;
242
+ box-sizing: border-box;
243
+ -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
244
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
245
+ -webkit-border-radius: 0 0 3px 3px;
246
+ -moz-border-radius: 0 0 3px 3px;
247
+ border-radius: 0 0 3px 3px;
248
+ }
249
+ .selectize-dropdown [data-selectable] {
250
+ cursor: pointer;
251
+ overflow: hidden;
252
+ }
253
+ .selectize-dropdown [data-selectable] .highlight {
254
+ background: rgba(125, 168, 208, 0.2);
255
+ -webkit-border-radius: 1px;
256
+ -moz-border-radius: 1px;
257
+ border-radius: 1px;
258
+ }
259
+ .selectize-dropdown .option,
260
+ .selectize-dropdown .optgroup-header {
261
+ padding: 5px 8px;
262
+ }
263
+ .selectize-dropdown .option,
264
+ .selectize-dropdown [data-disabled],
265
+ .selectize-dropdown [data-disabled] [data-selectable].option {
266
+ cursor: inherit;
267
+ opacity: 0.5;
268
+ }
269
+ .selectize-dropdown [data-selectable].option {
270
+ opacity: 1;
271
+ }
272
+ .selectize-dropdown .optgroup:first-child .optgroup-header {
273
+ border-top: 0 none;
274
+ }
275
+ .selectize-dropdown .optgroup-header {
276
+ color: #303030;
277
+ background: #fff;
278
+ cursor: default;
279
+ }
280
+ .selectize-dropdown .active {
281
+ background-color: #f5fafd;
282
+ color: #495c68;
283
+ }
284
+ .selectize-dropdown .active.create {
285
+ color: #495c68;
286
+ }
287
+ .selectize-dropdown .create {
288
+ color: rgba(48, 48, 48, 0.5);
289
+ }
290
+ .selectize-dropdown-content {
291
+ overflow-y: auto;
292
+ overflow-x: hidden;
293
+ max-height: 200px;
294
+ -webkit-overflow-scrolling: touch;
295
+ }
296
+ .selectize-control.single .selectize-input,
297
+ .selectize-control.single .selectize-input input {
298
+ cursor: pointer;
299
+ }
300
+ .selectize-control.single .selectize-input.input-active,
301
+ .selectize-control.single .selectize-input.input-active input {
302
+ cursor: text;
303
+ }
304
+ .selectize-control.single .selectize-input:after {
305
+ content: ' ';
306
+ display: block;
307
+ position: absolute;
308
+ top: 50%;
309
+ right: 15px;
310
+ margin-top: -3px;
311
+ width: 0;
312
+ height: 0;
313
+ border-style: solid;
314
+ border-width: 5px 5px 0 5px;
315
+ border-color: #808080 transparent transparent transparent;
316
+ }
317
+ .selectize-control.single .selectize-input.dropdown-active:after {
318
+ margin-top: -4px;
319
+ border-width: 0 5px 5px 5px;
320
+ border-color: transparent transparent #808080 transparent;
321
+ }
322
+ .selectize-control.rtl.single .selectize-input:after {
323
+ left: 15px;
324
+ right: auto;
325
+ }
326
+ .selectize-control.rtl .selectize-input > input {
327
+ margin: 0 4px 0 -2px !important;
328
+ }
329
+ .selectize-control .selectize-input.disabled {
330
+ opacity: 0.5;
331
+ background-color: #fafafa;
332
+ }
333
+ .selectize-control.multi .selectize-input.has-items {
334
+ padding-left: 5px;
335
+ padding-right: 5px;
336
+ }
337
+ .selectize-control.multi .selectize-input.disabled [data-value] {
338
+ color: #999;
339
+ text-shadow: none;
340
+ background: none;
341
+ -webkit-box-shadow: none;
342
+ box-shadow: none;
343
+ }
344
+ .selectize-control.multi .selectize-input.disabled [data-value],
345
+ .selectize-control.multi .selectize-input.disabled [data-value] .remove {
346
+ border-color: #e6e6e6;
347
+ }
348
+ .selectize-control.multi .selectize-input.disabled [data-value] .remove {
349
+ background: none;
350
+ }
351
+ .selectize-control.multi .selectize-input [data-value] {
352
+ text-shadow: 0 1px 0 rgba(0, 51, 83, 0.3);
353
+ -webkit-border-radius: 3px;
354
+ -moz-border-radius: 3px;
355
+ border-radius: 3px;
356
+ background-color: #1b9dec;
357
+ background-image: -moz-linear-gradient(top, #1da7ee, #178ee9);
358
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#1da7ee), to(#178ee9));
359
+ background-image: -webkit-linear-gradient(top, #1da7ee, #178ee9);
360
+ background-image: -o-linear-gradient(top, #1da7ee, #178ee9);
361
+ background-image: linear-gradient(to bottom, #1da7ee, #178ee9);
362
+ background-repeat: repeat-x;
363
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1da7ee', endColorstr='#ff178ee9', GradientType=0);
364
+ -webkit-box-shadow: 0 1px 0 rgba(0,0,0,0.2),inset 0 1px rgba(255,255,255,0.03);
365
+ box-shadow: 0 1px 0 rgba(0,0,0,0.2),inset 0 1px rgba(255,255,255,0.03);
366
+ }
367
+ .selectize-control.multi .selectize-input [data-value].active {
368
+ background-color: #0085d4;
369
+ background-image: -moz-linear-gradient(top, #008fd8, #0075cf);
370
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#008fd8), to(#0075cf));
371
+ background-image: -webkit-linear-gradient(top, #008fd8, #0075cf);
372
+ background-image: -o-linear-gradient(top, #008fd8, #0075cf);
373
+ background-image: linear-gradient(to bottom, #008fd8, #0075cf);
374
+ background-repeat: repeat-x;
375
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff008fd8', endColorstr='#ff0075cf', GradientType=0);
376
+ }
377
+ .selectize-control.single .selectize-input {
378
+ -webkit-box-shadow: 0 1px 0 rgba(0,0,0,0.05), inset 0 1px 0 rgba(255,255,255,0.8);
379
+ box-shadow: 0 1px 0 rgba(0,0,0,0.05), inset 0 1px 0 rgba(255,255,255,0.8);
380
+ background-color: #f9f9f9;
381
+ background-image: -moz-linear-gradient(top, #fefefe, #f2f2f2);
382
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fefefe), to(#f2f2f2));
383
+ background-image: -webkit-linear-gradient(top, #fefefe, #f2f2f2);
384
+ background-image: -o-linear-gradient(top, #fefefe, #f2f2f2);
385
+ background-image: linear-gradient(to bottom, #fefefe, #f2f2f2);
386
+ background-repeat: repeat-x;
387
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffefefe', endColorstr='#fff2f2f2', GradientType=0);
388
+ }
389
+ .selectize-control.single .selectize-input,
390
+ .selectize-dropdown.single {
391
+ border-color: #b8b8b8;
392
+ }
393
+ .selectize-dropdown .optgroup-header {
394
+ padding-top: 7px;
395
+ font-weight: bold;
396
+ font-size: 0.85em;
397
+ }
398
+ .selectize-dropdown .optgroup {
399
+ border-top: 1px solid #f0f0f0;
400
+ }
401
+ .selectize-dropdown .optgroup:first-child {
402
+ border-top: 0 none;
403
+ }
css/admin/selectize-v0.12.6/selectize.default.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .selectize-control.plugin-drag_drop.multi>.selectize-input>div.ui-sortable-placeholder{visibility:visible!important;background:#f2f2f2!important;background:rgba(0,0,0,.06)!important;border:0 none!important;-webkit-box-shadow:inset 0 0 12px 4px #fff;box-shadow:inset 0 0 12px 4px #fff}.selectize-control.plugin-drag_drop .ui-sortable-placeholder::after{content:'!';visibility:hidden}.selectize-control.plugin-drag_drop .ui-sortable-helper{-webkit-box-shadow:0 2px 5px rgba(0,0,0,.2);box-shadow:0 2px 5px rgba(0,0,0,.2)}.selectize-dropdown-header{position:relative;padding:5px 8px;border-bottom:1px solid #d0d0d0;background:#f8f8f8;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.selectize-dropdown-header-close{position:absolute;right:8px;top:50%;color:#303030;opacity:.4;margin-top:-12px;line-height:20px;font-size:20px!important}.selectize-dropdown-header-close:hover{color:#000}.selectize-dropdown.plugin-optgroup_columns .optgroup{border-right:1px solid #f2f2f2;border-top:0 none;float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.selectize-dropdown.plugin-optgroup_columns .optgroup:last-child{border-right:0 none}.selectize-dropdown.plugin-optgroup_columns .optgroup:before{display:none}.selectize-dropdown.plugin-optgroup_columns .optgroup-header{border-top:0 none}.selectize-control.plugin-remove_button [data-value]{position:relative;padding-right:24px!important}.selectize-control.plugin-remove_button [data-value] .remove{z-index:1;position:absolute;top:0;right:0;bottom:0;width:17px;text-align:center;font-weight:700;font-size:12px;color:inherit;text-decoration:none;vertical-align:middle;display:inline-block;padding:2px 0 0 0;border-left:1px solid #0073bb;-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.selectize-control.plugin-remove_button [data-value] .remove:hover{background:rgba(0,0,0,.05)}.selectize-control.plugin-remove_button [data-value].active .remove{border-left-color:#00578d}.selectize-control.plugin-remove_button .disabled [data-value] .remove:hover{background:0 0}.selectize-control.plugin-remove_button .disabled [data-value] .remove{border-left-color:#aaa}.selectize-control.plugin-remove_button .remove-single{position:absolute;right:0;top:0;font-size:23px}.selectize-control{position:relative}.selectize-dropdown,.selectize-input,.selectize-input input{color:#303030;font-family:inherit;font-size:13px;line-height:18px;-webkit-font-smoothing:inherit}.selectize-control.single .selectize-input.input-active,.selectize-input{background:#fff;cursor:text;display:inline-block}.selectize-input{border:1px solid #d0d0d0;padding:8px 8px;display:inline-block;width:100%;overflow:hidden;position:relative;z-index:1;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.1);box-shadow:inset 0 1px 1px rgba(0,0,0,.1);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.selectize-control.multi .selectize-input.has-items{padding:5px 8px 2px}.selectize-input.full{background-color:#fff}.selectize-input.disabled,.selectize-input.disabled *{cursor:default!important}.selectize-input.focus{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.15)}.selectize-input.dropdown-active{-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.selectize-input>*{vertical-align:baseline;display:-moz-inline-stack;display:inline-block;zoom:1}.selectize-control.multi .selectize-input>div{cursor:pointer;margin:0 3px 3px 0;padding:2px 6px;background:#1da7ee;color:#fff;border:1px solid #0073bb}.selectize-control.multi .selectize-input>div.active{background:#92c836;color:#fff;border:1px solid #00578d}.selectize-control.multi .selectize-input.disabled>div,.selectize-control.multi .selectize-input.disabled>div.active{color:#fff;background:#d2d2d2;border:1px solid #aaa}.selectize-input>input{display:inline-block!important;padding:0!important;min-height:0!important;max-height:none!important;max-width:100%!important;margin:0 1px!important;text-indent:0!important;border:0 none!important;background:0 0!important;line-height:inherit!important;-webkit-user-select:auto!important;-webkit-box-shadow:none!important;box-shadow:none!important}.selectize-input>input::-ms-clear{display:none}.selectize-input>input:focus{outline:0!important}.selectize-input::after{content:' ';display:block;clear:left}.selectize-input.dropdown-active::before{content:' ';display:block;position:absolute;background:#f0f0f0;height:1px;bottom:0;left:0;right:0}.selectize-dropdown{position:absolute;z-index:10;border:1px solid #d0d0d0;background:#fff;margin:-1px 0 0 0;border-top:0 none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.1);-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.selectize-dropdown [data-selectable]{cursor:pointer;overflow:hidden}.selectize-dropdown [data-selectable] .highlight{background:rgba(125,168,208,.2);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.selectize-dropdown .optgroup-header,.selectize-dropdown .option{padding:5px 8px}.selectize-dropdown .option,.selectize-dropdown [data-disabled],.selectize-dropdown [data-disabled] [data-selectable].option{cursor:inherit;opacity:.5}.selectize-dropdown [data-selectable].option{opacity:1}.selectize-dropdown .optgroup:first-child .optgroup-header{border-top:0 none}.selectize-dropdown .optgroup-header{color:#303030;background:#fff;cursor:default}.selectize-dropdown .active{background-color:#f5fafd;color:#495c68}.selectize-dropdown .active.create{color:#495c68}.selectize-dropdown .create{color:rgba(48,48,48,.5)}.selectize-dropdown-content{overflow-y:auto;overflow-x:hidden;max-height:200px;-webkit-overflow-scrolling:touch}.selectize-control.single .selectize-input,.selectize-control.single .selectize-input input{cursor:pointer}.selectize-control.single .selectize-input.input-active,.selectize-control.single .selectize-input.input-active input{cursor:text}.selectize-control.single .selectize-input:after{content:' ';display:block;position:absolute;top:50%;right:15px;margin-top:-3px;width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:grey transparent transparent transparent}.selectize-control.single .selectize-input.dropdown-active:after{margin-top:-4px;border-width:0 5px 5px 5px;border-color:transparent transparent grey transparent}.selectize-control.rtl.single .selectize-input:after{left:15px;right:auto}.selectize-control.rtl .selectize-input>input{margin:0 4px 0 -2px!important}.selectize-control .selectize-input.disabled{opacity:.5;background-color:#fafafa}.selectize-control.multi .selectize-input.has-items{padding-left:5px;padding-right:5px}.selectize-control.multi .selectize-input.disabled [data-value]{color:#999;text-shadow:none;background:0 0;-webkit-box-shadow:none;box-shadow:none}.selectize-control.multi .selectize-input.disabled [data-value],.selectize-control.multi .selectize-input.disabled [data-value] .remove{border-color:#e6e6e6}.selectize-control.multi .selectize-input.disabled [data-value] .remove{background:0 0}.selectize-control.multi .selectize-input [data-value]{text-shadow:0 1px 0 rgba(0,51,83,.3);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background-color:#1b9dec;background-image:-moz-linear-gradient(top,#1da7ee,#178ee9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#1da7ee),to(#178ee9));background-image:-webkit-linear-gradient(top,#1da7ee,#178ee9);background-image:-o-linear-gradient(top,#1da7ee,#178ee9);background-image:linear-gradient(to bottom,#1da7ee,#178ee9);background-repeat:repeat-x;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 1px rgba(255,255,255,.03);box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 1px rgba(255,255,255,.03)}.selectize-control.multi .selectize-input [data-value].active{background-color:#0085d4;background-image:-moz-linear-gradient(top,#008fd8,#0075cf);background-image:-webkit-gradient(linear,0 0,0 100%,from(#008fd8),to(#0075cf));background-image:-webkit-linear-gradient(top,#008fd8,#0075cf);background-image:-o-linear-gradient(top,#008fd8,#0075cf);background-image:linear-gradient(to bottom,#008fd8,#0075cf);background-repeat:repeat-x}.selectize-control.single .selectize-input{-webkit-box-shadow:0 1px 0 rgba(0,0,0,.05),inset 0 1px 0 rgba(255,255,255,.8);box-shadow:0 1px 0 rgba(0,0,0,.05),inset 0 1px 0 rgba(255,255,255,.8);background-color:#f9f9f9;background-image:-moz-linear-gradient(top,#fefefe,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fefefe),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fefefe,#f2f2f2);background-image:-o-linear-gradient(top,#fefefe,#f2f2f2);background-image:linear-gradient(to bottom,#fefefe,#f2f2f2);background-repeat:repeat-x}.selectize-control.single .selectize-input,.selectize-dropdown.single{border-color:#b8b8b8}.selectize-dropdown .optgroup-header{padding-top:7px;font-weight:700;font-size:.85em}.selectize-dropdown .optgroup{border-top:1px solid #f0f0f0}.selectize-dropdown .optgroup:first-child{border-top:0 none}
css/admin/selectize-v0.12.6/selectize.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .selectize-control.plugin-drag_drop.multi>.selectize-input>div.ui-sortable-placeholder{visibility:visible!important;background:#f2f2f2!important;background:rgba(0,0,0,.06)!important;border:0 none!important;-webkit-box-shadow:inset 0 0 12px 4px #fff;box-shadow:inset 0 0 12px 4px #fff}.selectize-control.plugin-drag_drop .ui-sortable-placeholder::after{content:'!';visibility:hidden}.selectize-control.plugin-drag_drop .ui-sortable-helper{-webkit-box-shadow:0 2px 5px rgba(0,0,0,.2);box-shadow:0 2px 5px rgba(0,0,0,.2)}.selectize-dropdown-header{position:relative;padding:5px 8px;border-bottom:1px solid #d0d0d0;background:#f8f8f8;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.selectize-dropdown-header-close{position:absolute;right:8px;top:50%;color:#303030;opacity:.4;margin-top:-12px;line-height:20px;font-size:20px!important}.selectize-dropdown-header-close:hover{color:#000}.selectize-dropdown.plugin-optgroup_columns .optgroup{border-right:1px solid #f2f2f2;border-top:0 none;float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.selectize-dropdown.plugin-optgroup_columns .optgroup:last-child{border-right:0 none}.selectize-dropdown.plugin-optgroup_columns .optgroup:before{display:none}.selectize-dropdown.plugin-optgroup_columns .optgroup-header{border-top:0 none}.selectize-control.plugin-remove_button [data-value]{position:relative;padding-right:24px!important}.selectize-control.plugin-remove_button [data-value] .remove{z-index:1;position:absolute;top:0;right:0;bottom:0;width:17px;text-align:center;font-weight:700;font-size:12px;color:inherit;text-decoration:none;vertical-align:middle;display:inline-block;padding:2px 0 0 0;border-left:1px solid #d0d0d0;-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.selectize-control.plugin-remove_button [data-value] .remove:hover{background:rgba(0,0,0,.05)}.selectize-control.plugin-remove_button [data-value].active .remove{border-left-color:#cacaca}.selectize-control.plugin-remove_button .disabled [data-value] .remove:hover{background:0 0}.selectize-control.plugin-remove_button .disabled [data-value] .remove{border-left-color:#fff}.selectize-control.plugin-remove_button .remove-single{position:absolute;right:0;top:0;font-size:23px}.selectize-control{position:relative}.selectize-dropdown,.selectize-input,.selectize-input input{color:#303030;font-family:inherit;font-size:13px;line-height:18px;-webkit-font-smoothing:inherit}.selectize-control.single .selectize-input.input-active,.selectize-input{background:#fff;cursor:text;display:inline-block}.selectize-input{border:1px solid #d0d0d0;padding:8px 8px;display:inline-block;width:100%;overflow:hidden;position:relative;z-index:1;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.1);box-shadow:inset 0 1px 1px rgba(0,0,0,.1);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.selectize-control.multi .selectize-input.has-items{padding:6px 8px 3px}.selectize-input.full{background-color:#fff}.selectize-input.disabled,.selectize-input.disabled *{cursor:default!important}.selectize-input.focus{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.15)}.selectize-input.dropdown-active{-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.selectize-input>*{vertical-align:baseline;display:-moz-inline-stack;display:inline-block;zoom:1}.selectize-control.multi .selectize-input>div{cursor:pointer;margin:0 3px 3px 0;padding:2px 6px;background:#f2f2f2;color:#303030;border:0 solid #d0d0d0}.selectize-control.multi .selectize-input>div.active{background:#e8e8e8;color:#303030;border:0 solid #cacaca}.selectize-control.multi .selectize-input.disabled>div,.selectize-control.multi .selectize-input.disabled>div.active{color:#7d7d7d;background:#fff;border:0 solid #fff}.selectize-input>input{display:inline-block!important;padding:0!important;min-height:0!important;max-height:none!important;max-width:100%!important;margin:0 2px 0 0!important;text-indent:0!important;border:0 none!important;background:0 0!important;line-height:inherit!important;-webkit-user-select:auto!important;-webkit-box-shadow:none!important;box-shadow:none!important}.selectize-input>input::-ms-clear{display:none}.selectize-input>input:focus{outline:0!important}.selectize-input::after{content:' ';display:block;clear:left}.selectize-input.dropdown-active::before{content:' ';display:block;position:absolute;background:#f0f0f0;height:1px;bottom:0;left:0;right:0}.selectize-dropdown{position:absolute;z-index:10;border:1px solid #d0d0d0;background:#fff;margin:-1px 0 0 0;border-top:0 none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.1);-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.selectize-dropdown [data-selectable]{cursor:pointer;overflow:hidden}.selectize-dropdown [data-selectable] .highlight{background:rgba(125,168,208,.2);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.selectize-dropdown .optgroup-header,.selectize-dropdown .option{padding:5px 8px}.selectize-dropdown .option,.selectize-dropdown [data-disabled],.selectize-dropdown [data-disabled] [data-selectable].option{cursor:inherit;opacity:.5}.selectize-dropdown [data-selectable].option{opacity:1}.selectize-dropdown .optgroup:first-child .optgroup-header{border-top:0 none}.selectize-dropdown .optgroup-header{color:#303030;background:#fff;cursor:default}.selectize-dropdown .active{background-color:#f5fafd;color:#495c68}.selectize-dropdown .active.create{color:#495c68}.selectize-dropdown .create{color:rgba(48,48,48,.5)}.selectize-dropdown-content{overflow-y:auto;overflow-x:hidden;max-height:200px;-webkit-overflow-scrolling:touch}.selectize-control.single .selectize-input,.selectize-control.single .selectize-input input{cursor:pointer}.selectize-control.single .selectize-input.input-active,.selectize-control.single .selectize-input.input-active input{cursor:text}.selectize-control.single .selectize-input:after{content:' ';display:block;position:absolute;top:50%;right:15px;margin-top:-3px;width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:grey transparent transparent transparent}.selectize-control.single .selectize-input.dropdown-active:after{margin-top:-4px;border-width:0 5px 5px 5px;border-color:transparent transparent grey transparent}.selectize-control.rtl.single .selectize-input:after{left:15px;right:auto}.selectize-control.rtl .selectize-input>input{margin:0 4px 0 -2px!important}.selectize-control .selectize-input.disabled{opacity:.5;background-color:#fafafa}
css/aioseop-font-icons.css CHANGED
@@ -1,8 +1,7 @@
1
  /**
2
  * GlyphIcons / Custom Icons.
3
  *
4
- * @author Michael Torbert.
5
- * @author Semper Fi Web Design.
6
  * @copyright http://semperplugins.com
7
  * @package All-in-One-SEO-Pack.
8
  */
@@ -99,29 +98,6 @@
99
  content: '\71';
100
  }
101
 
102
- /* QUICKEDIT */
103
-
104
- .aioseop_edit_link {
105
- display: inline-block;
106
- position: absolute;
107
- }
108
-
109
- .aioseop-icon-cog-edit {
110
- color: #72777c;
111
- }
112
-
113
- .aioseop-icon-cog-edit:hover {
114
- color: #0073aa;
115
- }
116
-
117
- .aioseop-icon-cog-edit:before {
118
- content: '\6e';
119
- }
120
-
121
- .aioseop-label-quickedit {
122
- padding-left: 20px;
123
- }
124
-
125
  /* TIP ICON ( Robots ) */
126
 
127
  div.aioseop_tip_icon {
1
  /**
2
  * GlyphIcons / Custom Icons.
3
  *
4
+ * @author All in One SEO Team.
 
5
  * @copyright http://semperplugins.com
6
  * @package All-in-One-SEO-Pack.
7
  */
98
  content: '\71';
99
  }
100
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  /* TIP ICON ( Robots ) */
102
 
103
  div.aioseop_tip_icon {
css/aiosp_admin.css CHANGED
@@ -1,70 +1,446 @@
1
  #aioseop_settings_header #message {
2
- padding: 5px 0px 5px 50px;
3
- background-image: url(../images/update32.png);
4
- background-repeat: no-repeat;
5
- background-position: 10px;
6
- font-size: 14px;
7
- min-height: 32px;
8
- clear: none;
9
  }
10
 
11
- @media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and ( min--moz-device-pixel-ratio: 1.5), only screen and ( -o-min-device-pixel-ratio: 3/2), only screen and ( min-device-pixel-ratio: 1.5), only screen and ( min-resolution: 1.5dppx) {
12
-
13
- #aioseop_settings_header #message {
14
- background-image: url(../images/update64.png) !important;
15
- -webkit-background-size: 32px 32px !important;
16
- -moz-background-size: 32px 32px !important;
17
- background-size: 32px 32px !important;
18
- }
 
 
 
19
  }
20
 
21
  .proupgrade a {
22
- font-weight: 900;
23
- color: #d54e21;
24
- font-size: 105%;
 
 
 
 
 
 
25
  }
26
 
27
  li#wp-admin-bar-aioseop-pro-upgrade a.ab-item {
28
- font-weight: 900;
29
- color: #d54e21 !important;
30
- font-size: 110%;
 
 
 
 
 
 
 
31
  }
32
 
33
- #aio-pro-update{
34
- font-weight: 900;
35
- color: #CC4B1F !important;
36
- font-size: 110%;
37
  }
38
 
39
  .upgrade_menu_link {
40
- font-weight: 900;
41
- color: #d54e21;
42
- font-size: 105%;
43
  }
44
 
45
- label[for=aioseop_edit_profile_header]
46
- {
47
- font-size: 1.3em;
48
  }
49
 
50
  #aioseop_edit_profile_header {
51
- display: none;
52
  }
53
 
54
  .ui-tooltip.ui-widget.ui-corner-all.ui-widget-content.aioseop-ui-tooltip {
55
- font-family: 'Open Sans', sans-serif;
56
- -webkit-box-shadow: 0px 1px 6px -2px #0073AA;
57
- box-shadow: 0px 1px 6px -2px #0073AA;
58
- border: 0px;
59
- border-radius: 0px;
60
- background: #FEFEFE;
61
  }
62
 
63
  .ui-tooltip.ui-widget.ui-corner-all.ui-widget-content.aioseop-ui-tooltip a {
64
- color: #0073AA;
65
- text-decoration: none;
66
  }
67
 
68
  .ui-tooltip.ui-widget.ui-corner-all.ui-widget-content.aioseop-ui-tooltip dt {
69
- font-weight: bold;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  #aioseop_settings_header #message {
2
+ padding: 5px 0px 5px 50px;
3
+ background-image: url(../images/update32.png);
4
+ background-repeat: no-repeat;
5
+ background-position: 10px;
6
+ font-size: 14px;
7
+ min-height: 32px;
8
+ clear: none;
9
  }
10
 
11
+ @media only screen and (-webkit-min-device-pixel-ratio: 1.5),
12
+ only screen and ( min--moz-device-pixel-ratio: 1.5),
13
+ only screen and ( -o-min-device-pixel-ratio: 3/2),
14
+ only screen and ( min-device-pixel-ratio: 1.5),
15
+ only screen and ( min-resolution: 1.5dppx) {
16
+ #aioseop_settings_header #message {
17
+ background-image: url(../images/update64.png) !important;
18
+ -webkit-background-size: 32px 32px !important;
19
+ -moz-background-size: 32px 32px !important;
20
+ background-size: 32px 32px !important;
21
+ }
22
  }
23
 
24
  .proupgrade a {
25
+ font-weight: 900;
26
+ color: #d54e21;
27
+ font-size: 105%;
28
+ }
29
+
30
+ .proupgrade a:hover {
31
+ font-weight: 900;
32
+ color: #ca3909;
33
+ font-size: 105%;
34
  }
35
 
36
  li#wp-admin-bar-aioseop-pro-upgrade a.ab-item {
37
+ font-weight: 900;
38
+ color: #d54e21 !important;
39
+ font-size: 110%;
40
+ }
41
+
42
+ .aioseop-metabox-pro-cta {
43
+ font-weight: 800;
44
+ color: #9a1313 !important;
45
+ font-size: 110%;
46
+ text-decoration: none;
47
  }
48
 
49
+ .aioseop-metabox-pro-cta:hover {
50
+ color: #ca1111 !important;
51
+ box-shadow: none;
 
52
  }
53
 
54
  .upgrade_menu_link {
55
+ font-weight: 900;
56
+ color: #d54e21;
57
+ font-size: 105%;
58
  }
59
 
60
+ label[for=aioseop_edit_profile_header] {
61
+ font-size: 1.3em;
 
62
  }
63
 
64
  #aioseop_edit_profile_header {
65
+ display: none;
66
  }
67
 
68
  .ui-tooltip.ui-widget.ui-corner-all.ui-widget-content.aioseop-ui-tooltip {
69
+ font-family: 'Open Sans', sans-serif;
70
+ -webkit-box-shadow: 0px 1px 6px -2px #0073AA;
71
+ box-shadow: 0px 1px 6px -2px #0073AA;
72
+ border: 0px;
73
+ border-radius: 0px;
74
+ background: #FEFEFE;
75
  }
76
 
77
  .ui-tooltip.ui-widget.ui-corner-all.ui-widget-content.aioseop-ui-tooltip a {
78
+ color: #0073AA;
79
+ text-decoration: none;
80
  }
81
 
82
  .ui-tooltip.ui-widget.ui-corner-all.ui-widget-content.aioseop-ui-tooltip dt {
83
+ font-weight: bold;
84
+ }
85
+
86
+
87
+ /** --- Product Education --- **/
88
+
89
+
90
+ /** License box **/
91
+
92
+ .license-box {
93
+ max-width: 800px;
94
+ }
95
+
96
+ .license-box p:first-of-type {
97
+ margin-top: 0;
98
+ }
99
+
100
+ .license-box a {
101
+ font-weight: bold;
102
+ }
103
+
104
+ .license-box p:last-of-type {
105
+ font-style: italic;
106
+ }
107
+
108
+
109
+ /** Notice bar **/
110
+
111
+ #aioseop-notice-bar {
112
+ background-color: #DDDDDD;
113
+ border-top: 3px solid #007cba;
114
+ color: #777777;
115
+ text-align: center;
116
+ position: relative;
117
+ padding: 7px;
118
+ margin-left: -20px;
119
+ margin-bottom: -4px;
120
+ opacity: 1;
121
+ transition: all .3s ease-in-out;
122
+ max-height: 100px;
123
+ overflow: hidden;
124
+ }
125
+
126
+ #aioseop-notice-bar a {
127
+ color: #007cba;
128
+ }
129
+
130
+ #aioseop-notice-bar a:hover {
131
+ color: #00a0d2;
132
+ }
133
+
134
+ #aioseop-notice-bar .dismiss {
135
+ position: absolute;
136
+ top: 0;
137
+ right: 0;
138
+ border: none;
139
+ padding: 5px;
140
+ margin-top: 1px;
141
+ background: 0 0;
142
+ color: #72777c;
143
+ cursor: pointer;
144
+ }
145
+
146
+ #aioseop-notice-bar .dismiss:before {
147
+ background: 0 0;
148
+ color: #72777c;
149
+ content: "\f335";
150
+ display: block;
151
+ font: normal 20px/20px dashicons;
152
+ speak: none;
153
+ height: 20px;
154
+ text-align: center;
155
+ width: 20px;
156
+ -webkit-font-smoothing: antialiased;
157
+ }
158
+
159
+ #aioseop-notice-bar.out {
160
+ opacity: .5;
161
+ max-height: 0;
162
+ }
163
+
164
+
165
+ /** Video sitemap upsell **/
166
+
167
+ #aioseop-video-sitemap-upsell {
168
+ padding: 25px 20px;
169
+ margin: 10px 0 0 0;
170
+ position: relative;
171
+ background-color: #fff;
172
+ border: 1px solid #dadada;
173
+ }
174
+
175
+ #aioseop-video-sitemap-upsell h5 {
176
+ margin: 0;
177
+ font-size: 18px;
178
+ font-weight: 700;
179
+ }
180
+
181
+ #aioseop-video-sitemap-upsell p {
182
+ font-size: rem;
183
+ }
184
+
185
+ #aioseop-video-sitemap-upsell .dismiss {
186
+ position: absolute;
187
+ top: 10px;
188
+ right: 10px;
189
+ color: #666;
190
+ font-size: 1rem;
191
+ }
192
+
193
+ #aioseop-video-sitemap-upsell .dismiss:hover {
194
+ cursor: pointer;
195
+ color: rgb(72, 70, 70);
196
+ }
197
+
198
+ .aioseop-rating-star {
199
+ width: 15px;
200
+ height: 15px;
201
+ font-size: 15px;
202
+ line-height: 1.5;
203
+ color: orange;
204
+ }
205
+
206
+
207
+ /** Taxonomies upsell **/
208
+
209
+ .aioseop-preview-wrapper{
210
+ max-width:800px;
211
+ margin-top:30px;
212
+ }
213
+
214
+ .aioseop-upsell-blurred {
215
+ -webkit-filter: blur(3px);
216
+ -moz-filter: blur(3px);
217
+ -ms-filter: blur(3px);
218
+ -o-filter: blur(3px);
219
+ filter: blur(3px);
220
+ -webkit-touch-callout: none;
221
+ -webkit-user-select: none;
222
+ -khtml-user-select: none;
223
+ -moz-user-select: none;
224
+ -ms-user-select: none;
225
+ user-select: none;
226
+ }
227
+
228
+ .aioseop-taxonomies-upsell-modal {
229
+ text-align: center;
230
+ width: 750px;
231
+ box-shadow: 0 0 60px 30px rgba(0, 0, 0, 0.15);
232
+ border-radius: 3px;
233
+
234
+ position: absolute;
235
+ margin-top: -750px;
236
+ margin-left: 25px;
237
+ z-index: 100;
238
+ background-color: white;
239
+ }
240
+
241
+ @media (max-width: 1000px) {
242
+ body .aioseop-preview-wrapper {
243
+ display: none;
244
+ }
245
+ }
246
+
247
+ .aioseop-taxonomies-upsell-modal *,
248
+ .aioseop-taxonomies-upsell-modal *::before,
249
+ .aioseop-taxonomies-upsell-modal *::after {
250
+ -webkit-box-sizing: border-box;
251
+ -moz-box-sizing: border-box;
252
+ box-sizing: border-box;
253
+ }
254
+
255
+ .aioseop-taxonomies-upsell-modal h2 {
256
+ font-size: 20px;
257
+ margin: 0 0 16px 0;
258
+ padding: 0;
259
  }
260
+
261
+ .aioseop-taxonomies-upsell-modal p {
262
+ font-size: 16px;
263
+ color: #666;
264
+ margin: 0 0 30px 0;
265
+ padding: 0;
266
+ }
267
+
268
+ .aioseop-taxonomies-upsell-modal-content {
269
+ background-color: #fff;
270
+ border-radius: 3px 3px 0 0;
271
+ padding: 40px;
272
+ height: 350px;
273
+ }
274
+
275
+ .aioseop-taxonomies-upsell-modal ul {
276
+ float: left;
277
+ width: 50%;
278
+ margin: 0;
279
+ padding: 0 0 0 30px;
280
+ text-align: left;
281
+ }
282
+
283
+ .aioseop-taxonomies-upsell-modal li {
284
+ color: #666;
285
+ font-size: 16px;
286
+ padding: 6px 0;
287
+ }
288
+
289
+ .aioseop-taxonomies-upsell-modal li .fa {
290
+ color: #2a9b39;
291
+ margin: 0 8px 0 0;
292
+ }
293
+
294
+ .aioseop-taxonomies-upsell-modal-button {
295
+ border-radius: 0 0 3px 3px;
296
+ padding: 30px;
297
+ background: #f5f5f5;
298
+ text-align: center;
299
+ }
300
+
301
+ .aioseop-taxonomies-upsell-modal-button a:first-of-type {
302
+ font-weight: 500;
303
+ }
304
+
305
+ .aioseop-modal-checkmark {
306
+ display: inline-block;
307
+ margin-right: 20px;
308
+ color: rgb(15, 156, 15);
309
+ font-size: 1.8rem;
310
+ line-height: 0.5;
311
+ }
312
+
313
+
314
+ /** Sidebar **/
315
+
316
+ .button.button-primary.button-hero.button-pro-cta {
317
+ display: block;
318
+ margin: 0 auto;
319
+ max-width: 300px;
320
+ text-align: center;
321
+ }
322
+
323
+
324
+ /** Other **/
325
+
326
+ .aioseop-upsell-discount-amount {
327
+ color: green;
328
+ font-weight: bold;
329
+ }
330
+
331
+ .aioseop-sitemap-prio-upsell {
332
+ position: absolute;
333
+ margin: 30px 0 0 20px;
334
+ font-style: italic;
335
+ font-weight: bold;
336
+ text-decoration: none;
337
+ color: #0073AA !important;
338
+ }
339
+
340
+ #aiosp_feature_manager_default_metabox a.feature-manager-cta-button{
341
+ float:right;
342
+ margin: 0 10px 10px 0;
343
+ background: #d54e21;
344
+ border-color: #aa3e1a;
345
+ -webkit-box-shadow: 0 1px 0 #aa3e1a;
346
+ box-shadow: 0 1px 0 #aa3e1a;
347
+ color: #fff;
348
+ text-decoration: none;
349
+ text-shadow: 0 -1px 1px #d54e21,1px 0 1px #d54e21,0 1px 1px #d54e21,-1px 0 1px #d54e21;
350
+ }
351
+
352
+ /* Image SEO - Media Library */
353
+
354
+ .aioseop-image-attribute {
355
+ height: 100px;
356
+ }
357
+
358
+ .aioseop-media-lib-dashicon:hover {
359
+ cursor: help;
360
+ color: #00a0d2;
361
+ }
362
+
363
+ .aioseop-media-lib-tooltip {
364
+ display: inline-block;
365
+ position: relative;
366
+ }
367
+
368
+ .aioseop-media-lib-tooltip .aioseop-media-lib-tooltip-text {
369
+ visibility: hidden;
370
+ position: absolute;
371
+ width: 120px;
372
+
373
+ border-radius: 6px;
374
+ padding: 10px;
375
+ z-index: 1;
376
+ bottom: 125%;
377
+ left: 50%;
378
+ margin-left: -70px;
379
+
380
+ color: #fff;
381
+ background-color: rgb(95, 95, 95);
382
+
383
+ text-align: center;
384
+ font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;
385
+ font-size: 0.8rem;
386
+ line-height: 1rem;
387
+
388
+ opacity: 0;
389
+ transition: opacity 0.3s;
390
+ }
391
+
392
+ .aioseop-media-lib-tooltip .aioseop-media-lib-tooltip-text::after {
393
+ content: "";
394
+ position: absolute;
395
+ top: 100%;
396
+ left: 50%;
397
+ margin-left: -5px;
398
+
399
+ border-width: 5px;
400
+ border-style: solid;
401
+ border-color: #555 transparent transparent transparent;
402
+ }
403
+
404
+ .aioseop-media-lib-tooltip:hover .aioseop-media-lib-tooltip-text {
405
+ visibility: visible;
406
+ opacity: 1;
407
+ }
408
+
409
+ /* QUICKEDIT */
410
+
411
+ .aioseop-quickedit-pencil {
412
+ margin-right: 5px;
413
+ color: #72777c;
414
+ }
415
+
416
+ .aioseop-quickedit-pencil:hover {
417
+ color: #0073aa;
418
+ outline: 0;
419
+ }
420
+
421
+ .aioseop-quickedit-input {
422
+ float:left;
423
+ position:relative;
424
+ margin-bottom: 10px;
425
+ font-size:13px;
426
+ width:100%;
427
+ z-index:1;
428
+ }
429
+
430
+ .aioseop-quickedit-input-save {
431
+ margin-right: 5px;
432
+ color: rgb(22, 204, 22);
433
+ }
434
+
435
+ .aioseop-quickedit-input-cancel {
436
+ color: red;
437
+ }
438
+
439
+ .aioseop-quickedit-pencil:focus, .aioseop-quickedit-input-save:focus, .aioseop-quickedit-input-cancel:focus {
440
+ box-shadow: none;
441
+ }
442
+
443
+ .aioseop-quickedit-spinner {
444
+ float:left;
445
+ width:20px;
446
+ margin-right:5px;
css/modules/aioseop_module.css CHANGED
@@ -1,8 +1,7 @@
1
  /**
2
  * Controls all the styling of the plugin.
3
  *
4
- * @author Michael Torbert.
5
- * @author Semper Fi Web Design.
6
  * @copyright http://semperplugins.com
7
  * @package All-in-One-SEO-Pack.
8
  */
@@ -87,7 +86,7 @@
87
 
88
  .aioseop_tabs .aioseop_meta_box_help,
89
  .aioseop_tabs .aioseop_meta_box_help:active {
90
- margin-top: 10px;
91
  }
92
 
93
  .aioseop_tabs #aioseop_opengraph_settings .aioseop_meta_box_help,
@@ -122,7 +121,7 @@
122
  border: 1px solid #e1e1e1;
123
  }
124
 
125
- .aioseop input[type="text"],
126
  .aioseop input[type="url"] {
127
  color: #515151;
128
  min-height: 40px;
@@ -144,7 +143,7 @@
144
  min-height: 36px;
145
  }
146
 
147
- .aioseop input,
148
  .aioseop textarea {
149
  border-radius: 4px;
150
  border: 1px solid #8d96a0;
@@ -152,7 +151,7 @@
152
  font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif !important;
153
  }
154
 
155
- .aioseop input:focus,
156
  .aioseop textarea:focus {
157
  box-shadow: 0 0 0 1px #007cba;
158
  }
@@ -263,23 +262,6 @@
263
  float: right;
264
  }
265
 
266
- .wincherad {
267
- width: 100%;
268
- height: 100%;
269
- background-size: 100%;
270
- background-repeat: no-repeat;
271
- margin-bottom: 0;
272
- border: none;
273
- }
274
-
275
- #wincher21 {
276
- background-image: url(../../modules/images/banner21.jpg);
277
- }
278
-
279
- #wincher22 {
280
- background-image: url(../../modules/images/banner22.jpg);
281
- }
282
-
283
  .aioseop_content {
284
  min-width: 760px;
285
  clear: left;
@@ -385,10 +367,7 @@
385
  }
386
 
387
  .aioseop_sidebar #mc-embedded-subscribe-form {
388
- margin: 0 0 10px 0;
389
- background: white;
390
- padding: 10px 10px;
391
- border: 1px solid #DDD;
392
  }
393
 
394
  #aioseop-about .aioseop_metabox_text ul {
@@ -428,7 +407,7 @@ body.all-in-one-seo_page_all-in-one-seo-pack-pro-aioseop_feature_manager .aioseo
428
 
429
  .aioseop_top {
430
  margin: 10px 10px 0 0;
431
- /* margin: 10px 477px 0px 0px; */
432
  }
433
 
434
  .aioseop_top #aioseop-list {
@@ -441,7 +420,7 @@ body.all-in-one-seo_page_all-in-one-seo-pack-pro-aioseop_feature_manager .aioseo
441
 
442
  .aioseop_right_sidebar {
443
  float: right;
444
- margin-top: 55px;
445
  }
446
 
447
  #aiosp_settings_form .button-primary.hidden {
@@ -529,10 +508,6 @@ div.aioseop_feature {
529
  right: 0;
530
  }
531
 
532
- .aioseop_feature .flag.pro {
533
- display: none;
534
- }
535
-
536
  #aioseop_coming_soon .free.flag,
537
  .all-in-one-seo_page_all-in-one-seo-pack-pro-modules-aioseop_feature_manager .aioseop_feature .free.flag {
538
  display: none;
@@ -635,12 +610,12 @@ div.aioseop_feature#aioseop_opengraph .aioseop_featured_image.active {
635
  background-image: url(../../modules/images/SocialMeta-Color-Standard.png);
636
  }
637
 
638
- div.aioseop_feature#aioseop_robots .aioseop_featured_image,
639
  div.aioseop_feature#aioseop_bad_robots .aioseop_featured_image {
640
  background-image: url(../../modules/images/Robots-BW-Standard.png);
641
  }
642
 
643
- div.aioseop_feature#aioseop_robots .aioseop_featured_image.active,
644
  div.aioseop_feature#aioseop_bad_robots .aioseop_featured_image.active {
645
  background-image: url(../../modules/images/Robots-Color-Standard.png);
646
  }
@@ -737,12 +712,12 @@ div.aioseop_feature#aioseop_coming_soon2 .aioseop_featured_image {
737
  background-image: url(../../modules/images/SocialMeta-Color-Retina.png);
738
  }
739
 
740
- div.aioseop_feature#aioseop_robots .aioseop_featured_image,
741
  div.aioseop_feature#aioseop_bad_robots .aioseop_featured_image {
742
  background-image: url(../../modules/images/Robots-BW-Retina.png);
743
  }
744
 
745
- div.aioseop_feature#aioseop_robots .aioseop_featured_image.active,
746
  div.aioseop_feature#aioseop_bad_robots .aioseop_featured_image.active {
747
  background-image: url(../../modules/images/Robots-Color-Retina.png);
748
  }
@@ -811,7 +786,7 @@ div.aioseop_feature#aioseop_coming_soon2 .aioseop_featured_image {
811
  margin: 0;
812
  padding-left: 1px;
813
  min-width: 160px;
814
- /* max-width: 900px; */
815
  }
816
 
817
  /*** Sitemap Additional Pages section ***/
@@ -967,7 +942,7 @@ table.aioseop_table td {
967
  padding-right: 2%;
968
  }
969
 
970
- table.aioseop_table td,
971
  table.aioseop_table th {
972
  padding: 3px;
973
  }
@@ -1047,7 +1022,7 @@ table.aioseop_table th {
1047
  margin: 1.5em 0.6em 0.3em;
1048
  }
1049
 
1050
- #aiosp_settings_form .aioseop_no_label,
1051
  .aioseop_no_label {
1052
  float: left;
1053
  width: 92%;
@@ -1263,16 +1238,6 @@ div.aioseop_notice a.aioseop_dismiss_link {
1263
  padding: 10px;
1264
  }
1265
 
1266
- .aioseop_loading {
1267
- background-image: url('../../images/activity.gif');
1268
- display: inline-block;
1269
- width: 24px;
1270
- height: 24px;
1271
- margin: 0;
1272
- padding: 0;
1273
- vertical-align: bottom;
1274
- }
1275
-
1276
  .aioseop_tabs.ui-widget-content {
1277
  background: none !important;
1278
  }
@@ -1387,7 +1352,7 @@ div.sfwd_debug_error {
1387
  max-height: 420px;
1388
  }
1389
 
1390
- #aioseop_coming_soon,
1391
  #aioseop_coming_soon2 {
1392
  padding-top: 40px;
1393
  text-align: center;
@@ -1462,9 +1427,8 @@ div.sfwd_debug_error {
1462
  margin: 0;
1463
  }
1464
 
1465
- #aioseop_opengraph_settings .aioseop_options {
1466
- clear: both;
1467
- margin-top: 35px;
1468
  }
1469
 
1470
  /**
1
  /**
2
  * Controls all the styling of the plugin.
3
  *
4
+ * @author All in One SEO Team.
 
5
  * @copyright http://semperplugins.com
6
  * @package All-in-One-SEO-Pack.
7
  */
86
 
87
  .aioseop_tabs .aioseop_meta_box_help,
88
  .aioseop_tabs .aioseop_meta_box_help:active {
89
+ margin: 15px 0;
90
  }
91
 
92
  .aioseop_tabs #aioseop_opengraph_settings .aioseop_meta_box_help,
121
  border: 1px solid #e1e1e1;
122
  }
123
 
124
+ .aioseop input[type="text"],
125
  .aioseop input[type="url"] {
126
  color: #515151;
127
  min-height: 40px;
143
  min-height: 36px;
144
  }
145
 
146
+ .aioseop input,
147
  .aioseop textarea {
148
  border-radius: 4px;
149
  border: 1px solid #8d96a0;
151
  font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif !important;
152
  }
153
 
154
+ .aioseop input:focus,
155
  .aioseop textarea:focus {
156
  box-shadow: 0 0 0 1px #007cba;
157
  }
262
  float: right;
263
  }
264
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
265
  .aioseop_content {
266
  min-width: 760px;
267
  clear: left;
367
  }
368
 
369
  .aioseop_sidebar #mc-embedded-subscribe-form {
370
+ padding: 0px 10px;
 
 
 
371
  }
372
 
373
  #aioseop-about .aioseop_metabox_text ul {
407
 
408
  .aioseop_top {
409
  margin: 10px 10px 0 0;
410
+ /* margin: 10px 477px 0px 0px; */
411
  }
412
 
413
  .aioseop_top #aioseop-list {
420
 
421
  .aioseop_right_sidebar {
422
  float: right;
423
+ margin-top: 50px;
424
  }
425
 
426
  #aiosp_settings_form .button-primary.hidden {
508
  right: 0;
509
  }
510
 
 
 
 
 
511
  #aioseop_coming_soon .free.flag,
512
  .all-in-one-seo_page_all-in-one-seo-pack-pro-modules-aioseop_feature_manager .aioseop_feature .free.flag {
513
  display: none;
610
  background-image: url(../../modules/images/SocialMeta-Color-Standard.png);
611
  }
612
 
613
+ div.aioseop_feature#aioseop_robots .aioseop_featured_image,
614
  div.aioseop_feature#aioseop_bad_robots .aioseop_featured_image {
615
  background-image: url(../../modules/images/Robots-BW-Standard.png);
616
  }
617
 
618
+ div.aioseop_feature#aioseop_robots .aioseop_featured_image.active,
619
  div.aioseop_feature#aioseop_bad_robots .aioseop_featured_image.active {
620
  background-image: url(../../modules/images/Robots-Color-Standard.png);
621
  }
712
  background-image: url(../../modules/images/SocialMeta-Color-Retina.png);
713
  }
714
 
715
+ div.aioseop_feature#aioseop_robots .aioseop_featured_image,
716
  div.aioseop_feature#aioseop_bad_robots .aioseop_featured_image {
717
  background-image: url(../../modules/images/Robots-BW-Retina.png);
718
  }
719
 
720
+ div.aioseop_feature#aioseop_robots .aioseop_featured_image.active,
721
  div.aioseop_feature#aioseop_bad_robots .aioseop_featured_image.active {
722
  background-image: url(../../modules/images/Robots-Color-Retina.png);
723
  }
786
  margin: 0;
787
  padding-left: 1px;
788
  min-width: 160px;
789
+ /* max-width: 900px; */
790
  }
791
 
792
  /*** Sitemap Additional Pages section ***/
942
  padding-right: 2%;
943
  }
944
 
945
+ table.aioseop_table td,
946
  table.aioseop_table th {
947
  padding: 3px;
948
  }
1022
  margin: 1.5em 0.6em 0.3em;
1023
  }
1024
 
1025
+ #aiosp_settings_form .aioseop_no_label,
1026
  .aioseop_no_label {
1027
  float: left;
1028
  width: 92%;
1238
  padding: 10px;
1239
  }
1240
 
 
 
 
 
 
 
 
 
 
 
1241
  .aioseop_tabs.ui-widget-content {
1242
  background: none !important;
1243
  }
1352
  max-height: 420px;
1353
  }
1354
 
1355
+ #aioseop_coming_soon,
1356
  #aioseop_coming_soon2 {
1357
  padding-top: 40px;
1358
  text-align: center;
1427
  margin: 0;
1428
  }
1429
 
1430
+ #aioseop_opengraph_settings_upgrade_wrapper {
1431
+ margin-top: 10px;
 
1432
  }
1433
 
1434
  /**
images/about/about-team.jpg ADDED
Binary file
images/about/icon-full.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg viewBox="0 0 37 28" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M12.29 26.462c.328.375.75.562 1.266.562s.937-.187 1.266-.562L35.563 5.79c.329-.328.493-.75.493-1.265 0-.516-.164-.938-.493-1.266L32.962.728a1.567 1.567 0 00-1.23-.563c-.493 0-.926.188-1.301.563L13.556 17.603 5.681 9.728c-.375-.375-.808-.563-1.301-.563-.492 0-.902.188-1.23.563L.548 12.259c-.328.328-.492.75-.492 1.265 0 .516.164.938.492 1.266L12.29 26.462z" fill="#6ab255" fill-rule="nonzero"/></svg>
images/about/icon-none.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg viewBox="0 0 33 33" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M27.592 32.359a1.928 1.928 0 01-1.417.583 1.928 1.928 0 01-1.416-.583l-8.084-8.084-8.083 8.084a1.928 1.928 0 01-1.417.583 1.93 1.93 0 01-1.417-.583l-4.5-4.5a1.932 1.932 0 01-.583-1.417c0-.555.195-1.028.583-1.417l8.084-8.083-8.084-8.084a1.931 1.931 0 01-.583-1.416c0-.556.195-1.028.583-1.417l4.5-4.5A1.93 1.93 0 017.175.942c.556 0 1.028.194 1.417.583l8.083 8.083 8.084-8.083a1.928 1.928 0 011.416-.583c.556 0 1.028.194 1.417.583l4.5 4.5c.389.389.583.861.583 1.417 0 .555-.194 1.027-.583 1.416l-8.083 8.084 8.083 8.083c.389.389.583.862.583 1.417 0 .556-.194 1.028-.583 1.417l-4.5 4.5z" fill="#d83638" fill-rule="nonzero"/></svg>
images/about/icon-partial.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg viewBox="0 0 53 53" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-miterlimit="10"><path d="M37.592 42.359a1.928 1.928 0 01-1.417.583 1.928 1.928 0 01-1.416-.583l-8.084-8.084-8.083 8.084a1.928 1.928 0 01-1.417.583 1.93 1.93 0 01-1.417-.583l-4.5-4.5a1.932 1.932 0 01-.583-1.417c0-.556.195-1.028.583-1.417l8.084-8.083-8.084-8.084a1.93 1.93 0 01-.583-1.416c0-.556.195-1.028.583-1.417l4.5-4.5a1.93 1.93 0 011.417-.584 1.93 1.93 0 011.417.584l8.083 8.083 8.084-8.083a1.928 1.928 0 011.416-.584 1.93 1.93 0 011.417.584l4.5 4.5c.389.389.583.861.583 1.417 0 .555-.194 1.028-.583 1.416l-8.083 8.084 8.083 8.083c.389.389.583.861.583 1.417s-.194 1.028-.583 1.417l-4.5 4.5z" fill="none" stroke="#d83638" stroke-width="2" stroke-dasharray="4,2"/></svg>
images/about/plugin-mi.png ADDED
Binary file
images/about/plugin-om.png ADDED
Binary file
images/about/plugin-rp.png ADDED
Binary file
images/about/plugin-smtp.png ADDED
Binary file
images/about/plugin-wpforms.png ADDED
Binary file
images/flyout/comments-solid.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="comments" class="svg-inline--fa fa-comments fa-w-18" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path fill="white" d="M416 192c0-88.4-93.1-160-208-160S0 103.6 0 192c0 34.3 14.1 65.9 38 92-13.4 30.2-35.5 54.2-35.8 54.5-2.2 2.3-2.8 5.7-1.5 8.7S4.8 352 8 352c36.6 0 66.9-12.3 88.7-25 32.2 15.7 70.3 25 111.3 25 114.9 0 208-71.6 208-160zm122 220c23.9-26 38-57.7 38-92 0-66.9-53.5-124.2-129.3-148.1.9 6.6 1.3 13.3 1.3 20.1 0 105.9-107.7 192-240 192-10.8 0-21.3-.8-31.7-1.9C207.8 439.6 281.8 480 368 480c41 0 79.1-9.2 111.3-25 21.8 12.7 52.1 25 88.7 25 3.2 0 6.1-1.9 7.3-4.8 1.3-2.9.7-6.3-1.5-8.7-.3-.3-22.4-24.2-35.8-54.5z"></path></svg>
images/flyout/gear-default.png ADDED
Binary file
images/flyout/life-ring-regular.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg aria-hidden="true" fill="#fffff" focusable="false" data-prefix="far" data-icon="life-ring" class="svg-inline--fa fa-life-ring fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="white" d="M256 504c136.967 0 248-111.033 248-248S392.967 8 256 8 8 119.033 8 256s111.033 248 248 248zm-103.398-76.72l53.411-53.411c31.806 13.506 68.128 13.522 99.974 0l53.411 53.411c-63.217 38.319-143.579 38.319-206.796 0zM336 256c0 44.112-35.888 80-80 80s-80-35.888-80-80 35.888-80 80-80 80 35.888 80 80zm91.28 103.398l-53.411-53.411c13.505-31.806 13.522-68.128 0-99.974l53.411-53.411c38.319 63.217 38.319 143.579 0 206.796zM359.397 84.72l-53.411 53.411c-31.806-13.505-68.128-13.522-99.973 0L152.602 84.72c63.217-38.319 143.579-38.319 206.795 0zM84.72 152.602l53.411 53.411c-13.506 31.806-13.522 68.128 0 99.974L84.72 359.398c-38.319-63.217-38.319-143.579 0-206.796z"></path></svg>
images/flyout/lightbulb-regular.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg aria-hidden="true" focusable="false" data-prefix="far" data-icon="lightbulb" class="svg-inline--fa fa-lightbulb fa-w-11" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 352 512"><path fill="white" d="M176 80c-52.94 0-96 43.06-96 96 0 8.84 7.16 16 16 16s16-7.16 16-16c0-35.3 28.72-64 64-64 8.84 0 16-7.16 16-16s-7.16-16-16-16zM96.06 459.17c0 3.15.93 6.22 2.68 8.84l24.51 36.84c2.97 4.46 7.97 7.14 13.32 7.14h78.85c5.36 0 10.36-2.68 13.32-7.14l24.51-36.84c1.74-2.62 2.67-5.7 2.68-8.84l.05-43.18H96.02l.04 43.18zM176 0C73.72 0 0 82.97 0 176c0 44.37 16.45 84.85 43.56 115.78 16.64 18.99 42.74 58.8 52.42 92.16v.06h48v-.12c-.01-4.77-.72-9.51-2.15-14.07-5.59-17.81-22.82-64.77-62.17-109.67-20.54-23.43-31.52-53.15-31.61-84.14-.2-73.64 59.67-128 127.95-128 70.58 0 128 57.42 128 128 0 30.97-11.24 60.85-31.65 84.14-39.11 44.61-56.42 91.47-62.1 109.46a47.507 47.507 0 0 0-2.22 14.3v.1h48v-.05c9.68-33.37 35.78-73.18 52.42-92.16C335.55 260.85 352 220.37 352 176 352 78.8 273.2 0 176 0z"></path></svg>
images/flyout/star-solid.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="star" class="svg-inline--fa fa-star fa-w-18" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path fill="white" d="M259.3 17.8L194 150.2 47.9 171.5c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.3 23.2 46 46.4 33.7L288 439.6l130.7 68.7c23.2 12.2 50.9-7.4 46.4-33.7l-25-145.5 105.7-103c19-18.5 8.5-50.8-17.7-54.6L382 150.2 316.7 17.8c-11.7-23.6-45.6-23.9-57.4 0z"></path></svg>
inc/admin/class-aioseop-education.php ADDED
@@ -0,0 +1,964 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * AIOSEOP_Education
4
+ *
5
+ * @package All_in_One_SEO_Pack
6
+ * @since 3.4.0
7
+ */
8
+
9
+ /**
10
+ * Contains all Product Education related code.
11
+ *
12
+ * @author Arnaud Broes
13
+ * @since 3.4.0
14
+ */
15
+ class AIOSEOP_Education {
16
+
17
+ /**
18
+ * Initializes the code.
19
+ *
20
+ * @since 3.4.0
21
+ */
22
+ public static function init() {
23
+ self::register_hooks();
24
+ self::register_wp_ajax_endpoints();
25
+ }
26
+
27
+ /**
28
+ * Registers our hooks.
29
+ *
30
+ * @since 3.4.0
31
+ */
32
+ private static function register_hooks() {
33
+ if ( is_admin() ) {
34
+ add_action( 'admin_footer_text', array( 'AIOSEOP_Education', 'admin_footer_text' ) );
35
+ add_action( 'admin_enqueue_scripts', array( 'AIOSEOP_Education', 'admin_enqueue_scripts' ) );
36
+
37
+ return;
38
+ }
39
+
40
+ add_filter( 'admin_bar_menu', array( 'AIOSEOP_Education', 'wp_admin_bar_menu' ) );
41
+ }
42
+
43
+ /**
44
+ * Registers our AJAX endpoints.
45
+ *
46
+ * @since 3.4.0
47
+ */
48
+ private static function register_wp_ajax_endpoints() {
49
+ if ( ! is_admin() ) {
50
+ return;
51
+ }
52
+
53
+ add_action( 'wp_ajax_aioseop_deactivate_conflicting_plugins', array( 'AIOSEOP_Education', 'deactivate_conflicting_plugins' ) );
54
+
55
+ if ( AIOSEOPPRO ) {
56
+ return;
57
+ }
58
+
59
+ add_action( 'wp_ajax_aioseop_get_license_box', array( 'AIOSEOP_Education', 'get_license_box' ) );
60
+
61
+ add_action( 'wp_ajax_aioseop_get_notice_bar', array( 'AIOSEOP_Education', 'get_notice_bar' ) );
62
+ add_action( 'wp_ajax_aioseop_get_video_sitemap_upsell', array( 'AIOSEOP_Education', 'get_video_sitemap_upsell' ) );
63
+ add_action( 'wp_ajax_aioseop_get_taxonomies_upsell', array( 'AIOSEOP_Education', 'get_taxonomies_upsell' ) );
64
+ add_action( 'wp_ajax_aioseop_get_sitemap_prio_upsell', array( 'AIOSEOP_Education', 'get_sitemap_prio_upsell' ) );
65
+
66
+ add_action( 'wp_ajax_aioseop_dismiss_notice_bar', array( 'AIOSEOP_Education', 'dismiss_notice_bar' ) );
67
+ add_action( 'wp_ajax_aioseop_dismiss_video_sitemap_upsell', array( 'AIOSEOP_Education', 'dismiss_video_sitemap_upsell' ) );
68
+ }
69
+
70
+ /**
71
+ * Enqueues our scripts.
72
+ *
73
+ * @since 3.4.0
74
+ */
75
+ public static function admin_enqueue_scripts() {
76
+ self::enqueue_deactivate_conflicting_plugins_script();
77
+
78
+ if ( AIOSEOPPRO ) {
79
+ return;
80
+ }
81
+
82
+ self::enqueue_license_box_script();
83
+ self::enqueue_notice_bar_script();
84
+ self::enqueue_video_sitemap_upsell_script();
85
+ self::enqueue_taxonomies_upsell_script();
86
+ self::enqueue_sitemap_prio_upsell_script();
87
+ }
88
+
89
+ /**
90
+ * Enqueues the license box script.
91
+ *
92
+ * @since 3.4.0
93
+ */
94
+ private static function enqueue_license_box_script() {
95
+ if ( 'toplevel_page_' . AIOSEOP_PLUGIN_DIRNAME . '/aioseop_class' !== get_current_screen()->id ) {
96
+ return;
97
+ }
98
+
99
+ wp_enqueue_script( 'aioseop-license-box', AIOSEOP_PLUGIN_URL . 'js/admin/education/aioseop-license-box.js', array( 'jquery' ), AIOSEOP_VERSION, false );
100
+
101
+ $ajax_data = array(
102
+ 'requestUrl' => admin_url( 'admin-ajax.php' ),
103
+ 'nonce' => wp_create_nonce( 'license-box' ),
104
+ );
105
+
106
+ wp_localize_script( 'aioseop-license-box', 'aioseopLicenseBoxData', $ajax_data );
107
+ }
108
+
109
+ /**
110
+ * Enqueues the notice bar script.
111
+ *
112
+ * @since 3.4.0
113
+ */
114
+ private static function enqueue_notice_bar_script() {
115
+ if ( ! in_array( get_current_screen()->id, aioseop_get_admin_screens(), true ) ) {
116
+ return;
117
+ }
118
+
119
+ wp_enqueue_script( 'aioseop-notice-bar', AIOSEOP_PLUGIN_URL . 'js/admin/education/aioseop-notice-bar.js', array( 'jquery' ), AIOSEOP_VERSION, false );
120
+
121
+ $ajax_data = array(
122
+ 'requestUrl' => admin_url( 'admin-ajax.php' ),
123
+ 'nonce' => wp_create_nonce( 'notice-bar' ),
124
+ );
125
+
126
+ wp_localize_script( 'aioseop-notice-bar', 'aioseopNoticeBarData', $ajax_data );
127
+ }
128
+
129
+ /**
130
+ * Enqueues the video sitemap upsell script.
131
+ *
132
+ * @since 3.4.0
133
+ */
134
+ private static function enqueue_video_sitemap_upsell_script() {
135
+ if ( 'all-in-one-seo_page_' . AIOSEOP_PLUGIN_DIRNAME . '/modules/aioseop_sitemap' !== get_current_screen()->id ) {
136
+ return;
137
+ }
138
+
139
+ wp_enqueue_script( 'aioseop-video-sitemap-upsell', AIOSEOP_PLUGIN_URL . 'js/admin/education/aioseop-video-sitemap-upsell.js', array( 'jquery' ), AIOSEOP_VERSION, false );
140
+
141
+ $ajax_data = array(
142
+ 'requestUrl' => admin_url( 'admin-ajax.php' ),
143
+ 'nonce' => wp_create_nonce( 'video-sitemap-upsell' ),
144
+ );
145
+
146
+ wp_localize_script( 'aioseop-video-sitemap-upsell', 'aioseopVideoSitemapUpsellData', $ajax_data );
147
+ }
148
+
149
+ /**
150
+ * Enqueues the taxonomy upsell script.
151
+ *
152
+ * @since 3.4.0
153
+ */
154
+ private static function enqueue_taxonomies_upsell_script() {
155
+ $allowed_screens = array(
156
+ 'edit-category',
157
+ 'edit-post_tag',
158
+ 'edit-product_cat',
159
+ 'edit-product_tag',
160
+ );
161
+
162
+ $screen = get_current_screen();
163
+ if ( 'term' !== $screen->base || ! in_array( $screen->id, $allowed_screens ) ) {
164
+ return;
165
+ }
166
+
167
+ wp_enqueue_script( 'aioseop-taxonomies-upsell', AIOSEOP_PLUGIN_URL . 'js/admin/education/aioseop-taxonomies-upsell.js', array( 'jquery' ), AIOSEOP_VERSION, true );
168
+
169
+ $ajax_data = array(
170
+ 'requestUrl' => admin_url( 'admin-ajax.php' ),
171
+ 'nonce' => wp_create_nonce( "taxonomies-upsell-$screen->id" ),
172
+ 'pageId' => $screen->id,
173
+ );
174
+
175
+ wp_localize_script( 'aioseop-taxonomies-upsell', 'aioseopTaxonomiesUpsellData', $ajax_data );
176
+ }
177
+
178
+ /**
179
+ * Enqueues the deactivate conflicting plugins script.
180
+ *
181
+ * @since 3.4.0
182
+ */
183
+ private static function enqueue_deactivate_conflicting_plugins_script() {
184
+ global $aioseop_notices;
185
+
186
+ if ( ! isset( $aioseop_notices->active_notices['conflicting_plugin'] ) ) {
187
+ return;
188
+ }
189
+
190
+ wp_enqueue_script( 'aioseop-deactivate-conflicting-plugins', AIOSEOP_PLUGIN_URL . 'js/admin/education/aioseop-deactivate-conflicting-plugins.js', array( 'jquery' ), AIOSEOP_VERSION, true );
191
+
192
+ $ajax_data = array(
193
+ 'requestUrl' => admin_url( 'admin-ajax.php' ),
194
+ 'nonce' => wp_create_nonce( 'aioseop-deactivate-conflicting-plugins' ),
195
+ );
196
+
197
+ wp_localize_script( 'aioseop-deactivate-conflicting-plugins', 'aioseopDeactivateConflictingPluginsData', $ajax_data );
198
+ }
199
+
200
+
201
+ /**
202
+ * Enqueues the sitemap prio upsell script.
203
+ *
204
+ * @since 3.4.0
205
+ */
206
+ private static function enqueue_sitemap_prio_upsell_script() {
207
+ $screen = get_current_screen();
208
+ if ( 'post' !== $screen->base ) {
209
+ return;
210
+ }
211
+
212
+ wp_enqueue_script( 'aioseop-sitemap-prio-upsell', AIOSEOP_PLUGIN_URL . 'js/admin/education/aioseop-sitemap-prio-upsell.js', array( 'jquery' ), AIOSEOP_VERSION, true );
213
+
214
+ $ajax_data = array(
215
+ 'requestUrl' => admin_url( 'admin-ajax.php' ),
216
+ 'nonce' => wp_create_nonce( 'aioseop-sitemap-prio-upsell' ),
217
+ 'pageId' => $screen->id,
218
+ );
219
+
220
+ wp_localize_script( 'aioseop-sitemap-prio-upsell', 'aioseopSitemapPrioUpsellData', $ajax_data );
221
+ }
222
+
223
+ /**
224
+ * Returns the license box markup for the General Settings menu.
225
+ *
226
+ * Acts as a callback for our "wp_ajax_aioseop_get_license_box" endpoint.
227
+ *
228
+ * @since 3.4.0
229
+ */
230
+ public static function get_license_box() {
231
+ if ( ! isset( $_GET ) ) {
232
+ return;
233
+ }
234
+
235
+ check_ajax_referer( 'license-box', '_ajax_nonce' );
236
+
237
+ /* translators: %s: "All in One SEO Pack" */
238
+ $link_title = sprintf( __( 'Upgrade to %s', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME . '&nbsp;Pro' );
239
+
240
+ $link = sprintf(
241
+ '<a href="%1$s" target="_blank" title="%2$s">%3$s</a>',
242
+ aioseop_get_utm_url( 'license-box' ),
243
+ $link_title,
244
+ /* translators: The full sentence reads as: "To unlock more features consider upgrading to Pro." */
245
+ __( 'upgrading to PRO', 'all-in-one-seo-pack' )
246
+ );
247
+
248
+ $span = sprintf(
249
+ "<span class='aioseop-upsell-discount-amount'>%s</span>",
250
+ /* translators: This refers to a discount. The full sentence reads as: "As a valued user you receive 30% off, automatically applied at checkout!" */
251
+ __( '30% off', 'all-in-one-seo-pack' )
252
+ );
253
+
254
+ $license_box_content = array(
255
+ /* translators: %s: "All in One SEO Pack" */
256
+ 'p1' => sprintf( __( "You're using %s - no license needed. Enjoy! 🙂", 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME . '&nbsp;Lite' ),
257
+ /* translators: %s: "upgrading to Pro" */
258
+ 'p2' => sprintf( __( 'To unlock more features consider %s', 'all-in-one-seo-pack' ), $link ),
259
+ /* translators: %1$s: "All in One SEO Pack" - %2$s: "30% off" */
260
+ 'p3' => sprintf( __( 'As a valued %1$s user you receive %2$s, automatically applied at checkout!', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME, $span ),
261
+ );
262
+
263
+ printf(
264
+ '<div class="license-box">
265
+ <p>%1$s</p>
266
+ <p>%2$s</p>
267
+ <p>%3$s</p>
268
+ </div>',
269
+ $license_box_content['p1'],
270
+ $license_box_content['p2'],
271
+ $license_box_content['p3']
272
+ );
273
+
274
+ wp_die();
275
+ }
276
+
277
+ /**
278
+ * Returns the notice bar markup.
279
+ *
280
+ * Acts as a callback for our "wp_ajax_aioseop_get_notice_bar" endpoint.
281
+ *
282
+ * @since 3.4.0
283
+ */
284
+ public static function get_notice_bar() {
285
+ if ( ! isset( $_GET ) ) {
286
+ return;
287
+ }
288
+
289
+ check_ajax_referer( 'notice-bar', '_ajax_nonce' );
290
+
291
+ if ( self::check_if_dismissed( 'notice-bar' ) ) {
292
+ return;
293
+ }
294
+
295
+ /* translators: %s: "All in One SEO Pack" */
296
+ $link_title = sprintf( __( 'Upgrade to %s', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME . '&nbsp;Pro' );
297
+
298
+ $link = sprintf(
299
+ '<a href="%1$s" target="_blank" title="%2$s">%3$s</a>',
300
+ aioseop_get_utm_url( 'notice-bar' ),
301
+ $link_title,
302
+ /* translators: The full sentence reads as: "To unlock more features consider upgrading to Pro." */
303
+ __( 'upgrading to PRO', 'all-in-one-seo-pack' )
304
+ );
305
+
306
+ $message = sprintf(
307
+ /* translators: %1$s: "ALl in One SEO Pack" - %2$s: "upgrading to Pro" */
308
+ __( 'You’re using %1$s. To unlock more features consider %2$s.', 'all-in-one-seo-pack' ),
309
+ AIOSEOP_PLUGIN_NAME . '&nbsp;Lite',
310
+ $link
311
+ );
312
+
313
+ printf(
314
+ '<div id="aioseop-notice-bar">
315
+ <span class="aioseop-notice-bar-message">%1$s</span>
316
+ <button type="button" class="dismiss" title="%2$s" />
317
+ </div>',
318
+ $message,
319
+ __( 'Dismiss this message.', 'all-in-one-seo-pack' )
320
+ );
321
+
322
+ wp_die();
323
+ }
324
+
325
+ /**
326
+ * Returns the video sitemap upsell markup.
327
+ *
328
+ * Acts as a callback for our "wp_ajax_aioseop_get_notice_bar" endpoint.
329
+ *
330
+ * @since 3.4.0
331
+ */
332
+ public static function get_video_sitemap_upsell() {
333
+ if ( ! isset( $_GET ) ) {
334
+ return;
335
+ }
336
+
337
+ check_ajax_referer( 'video-sitemap-upsell', '_ajax_nonce' );
338
+
339
+ if ( self::check_if_dismissed( 'video-sitemap-upsell' ) ) {
340
+ return;
341
+ }
342
+
343
+ /* translators: %s: "All in One SEO Pack" */
344
+ $header = sprintf( __( 'Get %s and Unlock all the Powerful Features', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME . '&nbsp;Pro' );
345
+ $p1 = sprintf(
346
+ 'Thanks for being a loyal %1$s user. Did you know that our premium version also supports video sitemaps?
347
+ Upgrade to %2$s to unlock all the awesome features and experience why %3$s is considered the best WordPress SEO plugin.',
348
+ AIOSEOP_PLUGIN_NAME . '&nbsp;Lite',
349
+ AIOSEOP_PLUGIN_NAME . '&nbsp;Pro',
350
+ AIOSEOP_PLUGIN_NAME
351
+ );
352
+ $p2 = sprintf(
353
+ __( 'We know that you will truly love %1$s. It has over 300+ five star ratings (%2$s) and is active on over 2 million websites.', 'all-in-one-seo-pack' ),
354
+ AIOSEOP_PLUGIN_NAME,
355
+ str_repeat( '<span class="dashicons dashicons-star-filled aioseop-rating-star"></span>', 5 )
356
+ );
357
+ $p3 = sprintf(
358
+ __( 'Bonus: %1$s users get %2$s the regular price, automatically applied at checkout.', 'all-in-one-seo-pack' ),
359
+ AIOSEOP_PLUGIN_NAME . '&nbsp;Lite',
360
+ sprintf(
361
+ '<span class="aioseop-upsell-discount-amount">%s</span>',
362
+ __( '30% off', 'all-in-one-seo-pack' )
363
+ )
364
+ );
365
+
366
+ /* translators: %s: "All in One SEO Pack" */
367
+ $link_title = sprintf( __( 'Upgrade to %s', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME . '&nbsp;Pro' );
368
+
369
+ $link = sprintf(
370
+ '<a href="%1$s" target="_blank" title="%2$s">%3$s</a>',
371
+ aioseop_get_utm_url( 'video-sitemap-upsell' ),
372
+ $link_title,
373
+ $header . '&nbsp;»'
374
+ );
375
+
376
+ echo
377
+ "<div id='aioseop-video-sitemap-upsell'>
378
+ <span class='dashicons dashicons-dismiss dismiss'></span><h5>$header</h5><br/><p>$p1</p><p>$p2</p></p><p>$link</p><p>$p3</p>
379
+ </div>";
380
+
381
+ wp_die();
382
+ }
383
+
384
+ /**
385
+ * Returns the taxonomies upsell markup.
386
+ *
387
+ * Acts as a callback for our "wp_ajax_aioseop_get_taxonomies_upsell" endpoint.
388
+ *
389
+ * @since 3.4.0
390
+ */
391
+ public static function get_taxonomies_upsell() {
392
+ if ( ! isset( $_GET ) ) {
393
+ return;
394
+ }
395
+
396
+ $page_id = $_GET['page_id'];
397
+
398
+ check_ajax_referer( "taxonomies-upsell-$page_id", '_ajax_nonce' );
399
+
400
+ $content = self::get_taxonomies_upsell_content( $page_id );
401
+ if ( ! empty( $content ) ) {
402
+ echo $content;
403
+ }
404
+
405
+ die();
406
+ }
407
+
408
+ /**
409
+ * Returns the sitemap prio upsell markup.
410
+ *
411
+ * Acts as a callback for our "wp_ajax_aioseop_get_sitemap_prio_upsell" endpoint.
412
+ *
413
+ * @since 3.4.0
414
+ */
415
+ public static function get_sitemap_prio_upsell() {
416
+ check_ajax_referer( 'aioseop-sitemap-prio-upsell', '_ajax_nonce' );
417
+
418
+ printf(
419
+ '<a class="aioseop-sitemap-prio-upsell" href="%1$s" title="%2$s" target="_blank">%3$s</a>',
420
+ aioseop_get_utm_url( 'sitemap-prio-upsell' ),
421
+ /* translators: %s: "All in One SEO Pack Pro" */
422
+ sprintf( __( 'Upgrade to %s', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME . '&nbsp;Pro' ),
423
+ __( 'Upgrade to Pro to unlock this feature.', 'all-in-one-seo-pack' )
424
+ );
425
+
426
+ die();
427
+ }
428
+
429
+ /**
430
+ * Checks if an upsell with a given key has been dismissed by the user.
431
+ *
432
+ * @since 3.4.0
433
+ *
434
+ * @param string $key The name of the upsell.
435
+ * @return bool Whether or not the upsell has been dismissed.
436
+ */
437
+ private static function check_if_dismissed( $key ) {
438
+
439
+ $current_user = wp_get_current_user();
440
+ $dismissed = get_user_meta( $current_user->ID, 'aioseop_dismissed', true );
441
+
442
+ if ( ! empty( $dismissed[ $key ] ) ) {
443
+ return true;
444
+ }
445
+
446
+ return false;
447
+ }
448
+
449
+ /**
450
+ * Dismisses the notice bar for the current user.
451
+ *
452
+ * @since 3.4.0
453
+ */
454
+ public static function dismiss_notice_bar() {
455
+ if ( ! isset( $_GET ) ) {
456
+ return;
457
+ }
458
+
459
+ self::dismiss_upsell( 'notice-bar' );
460
+ }
461
+
462
+ /**
463
+ * Dismisses the video sitemap upsell for the current user.
464
+ *
465
+ * @since 3.4.0
466
+ */
467
+ public static function dismiss_video_sitemap_upsell() {
468
+ if ( ! isset( $_GET ) ) {
469
+ return;
470
+ }
471
+
472
+ self::dismiss_upsell( 'video-sitemap-upsell' );
473
+ }
474
+
475
+ /**
476
+ * Dismisses an upsell with a given key.
477
+ *
478
+ * @since 3.4.0
479
+ *
480
+ * @param string $key The name of the upsell.
481
+ */
482
+ private static function dismiss_upsell( $key ) {
483
+ $current_user = wp_get_current_user();
484
+ $dismissed = get_user_meta( $current_user->ID, 'aioseop_dismissed', true );
485
+
486
+ if ( empty( $dismissed ) ) {
487
+ $dismissed = array();
488
+ }
489
+
490
+ $dismissed[ $key ] = time();
491
+
492
+ update_user_meta( $current_user->ID, 'aioseop_dismissed', $dismissed );
493
+ wp_send_json_success();
494
+ }
495
+
496
+ /**
497
+ * Deactivates all conflicting seo & sitemap plugins.
498
+ *
499
+ * @since 3.4.0
500
+ *
501
+ * @param string $key The name of the upsell.
502
+ */
503
+ public static function deactivate_conflicting_plugins() {
504
+ if ( ! is_admin() ) {
505
+ return;
506
+ }
507
+
508
+ $plugins = array_merge(
509
+ self::get_conflicting_plugins( 'seo' ),
510
+ self::get_conflicting_plugins( 'sitemap' )
511
+ );
512
+
513
+ if ( empty( $plugins ) ) {
514
+ return;
515
+ }
516
+
517
+ include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
518
+ foreach ( $plugins as $plugin_name => $plugin_path ) {
519
+ if ( is_plugin_active( $plugin_path ) ) {
520
+ deactivate_plugins( $plugin_path );
521
+ }
522
+ }
523
+ }
524
+
525
+ /**
526
+ * Adds external tools to our admin bar menu.
527
+ *
528
+ * Acts as a callback for the "wp_admin_bar_menu" action hook.
529
+ *
530
+ * @param Object $wp_admin_bar
531
+ */
532
+ public static function wp_admin_bar_menu( $wp_admin_bar ) {
533
+ $url = get_permalink();
534
+
535
+ if ( ! $url ) {
536
+ return;
537
+ }
538
+
539
+ $wp_admin_bar->add_menu(
540
+ array(
541
+ 'id' => 'aioseop-external-tools',
542
+ 'parent' => AIOSEOP_PLUGIN_DIRNAME,
543
+ 'title' => __( 'Analyze this page', 'all-in-one-seo-pack' ),
544
+ )
545
+ );
546
+
547
+ $url = urlencode( $url );
548
+
549
+ $submenu_items = array(
550
+ array(
551
+ 'id' => 'aioseop-external-tools-inlinks',
552
+ 'title' => __( 'Check links to this URL', 'all-in-one-seo-pack' ),
553
+ 'href' => 'https://search.google.com/search-console/links/drilldown?resource_id=' . urlencode( get_option( 'siteurl' ) ) . '&type=EXTERNAL&target=' . $url . '&domain=',
554
+ ),
555
+ array(
556
+ 'id' => 'aioseop-external-tools-cache',
557
+ 'title' => __( 'Check Google Cache', 'all-in-one-seo-pack' ),
558
+ 'href' => '//webcache.googleusercontent.com/search?strip=1&q=cache:' . $url,
559
+ ),
560
+ array(
561
+ 'id' => 'aioseop-external-tools-structureddata',
562
+ 'title' => __( 'Google Structured Data Test', 'all-in-one-seo-pack' ),
563
+ 'href' => 'https://search.google.com/structured-data/testing-tool#url=' . $url,
564
+ ),
565
+ array(
566
+ 'id' => 'aioseop-external-tools-facebookdebug',
567
+ 'title' => __( 'Facebook Debugger', 'all-in-one-seo-pack' ),
568
+ 'href' => '//developers.facebook.com/tools/debug/og/object?q=' . $url,
569
+ ),
570
+ array(
571
+ 'id' => 'aioseop-external-tools-pinterestvalidator',
572
+ 'title' => __( 'Pinterest Rich Pins Validator', 'all-in-one-seo-pack' ),
573
+ 'href' => 'https://developers.pinterest.com/tools/url-debugger/?link=' . $url,
574
+ ),
575
+ array(
576
+ 'id' => 'aioseop-external-tools-htmlvalidation',
577
+ 'title' => __( 'HTML Validator', 'all-in-one-seo-pack' ),
578
+ 'href' => '//validator.w3.org/check?uri=' . $url,
579
+ ),
580
+ array(
581
+ 'id' => 'aioseop-external-tools-cssvalidation',
582
+ 'title' => __( 'CSS Validator', 'all-in-one-seo-pack' ),
583
+ 'href' => '//jigsaw.w3.org/css-validator/validator?uri=' . $url,
584
+ ),
585
+ array(
586
+ 'id' => 'aioseop-external-tools-pagespeed',
587
+ 'title' => __( 'Google Page Speed Test', 'all-in-one-seo-pack' ),
588
+ 'href' => '//developers.google.com/speed/pagespeed/insights/?url=' . $url,
589
+ ),
590
+ array(
591
+ 'id' => 'aioseop-external-tools-google-mobile-friendly',
592
+ 'title' => __( 'Mobile-Friendly Test', 'all-in-one-seo-pack' ),
593
+ 'href' => 'https://www.google.com/webmasters/tools/mobile-friendly/?url=' . $url,
594
+ ),
595
+ );
596
+
597
+ foreach ( $submenu_items as $menu_item ) {
598
+ $menu_args = array(
599
+ 'parent' => 'aioseop-external-tools',
600
+ 'id' => $menu_item['id'],
601
+ 'title' => $menu_item['title'],
602
+ 'href' => $menu_item['href'],
603
+ 'meta' => array( 'target' => '_blank' ),
604
+ );
605
+
606
+ $wp_admin_bar->add_menu( $menu_args );
607
+ }
608
+
609
+ return $wp_admin_bar;
610
+ }
611
+
612
+ /**
613
+ * Adds our rating request as a footer to our screens.
614
+ *
615
+ * @since 3.4.0
616
+ */
617
+ public static function admin_footer_text() {
618
+ if ( ! in_array( get_current_screen()->base, aioseop_get_admin_screens(), true ) ) {
619
+ return;
620
+ }
621
+
622
+ $href = 'https://wordpress.org/support/plugin/all-in-one-seo-pack/reviews/?filter=5#new-post';
623
+
624
+ $link1 = sprintf(
625
+ '<a href="%1$s" target="_blank" title="%2$s">&#9733;&#9733;&#9733;&#9733;&#9733;</a>',
626
+ $href,
627
+ __( 'Give us a 5-star rating!', 'all-in-one-seo-pack' )
628
+ );
629
+
630
+ $link2 = sprintf(
631
+ '<a href="%1$s" target="_blank" title="%2$s">WordPress.org</a>',
632
+ $href,
633
+ __( 'Give us a 5-star rating!', 'all-in-one-seo-pack' )
634
+ );
635
+
636
+ printf(
637
+ /* translators: %1$s: "All in One SEO Pack" - %2$s: This placeholder will be replaced with star icons. - %3$s: "WordPress.org" - %4$s: "All in One SEO Pack" */
638
+ __( 'Please rate %1$s %2$s on %3$s to help us spread the word. Thank you from the %4$s team!', 'all-in-one-seo-pack' ),
639
+ sprintf( '<strong>%s</strong>', AIOSEOP_PLUGIN_NAME ),
640
+ $link1,
641
+ $link2,
642
+ AIOSEOP_PLUGIN_NAME
643
+ );
644
+ }
645
+
646
+ /**
647
+ * Register a notice if conflicting plugins have been detected.
648
+ *
649
+ * @since 3.4.0
650
+ */
651
+ public static function register_conflicting_plugin_notice() {
652
+ global $aioseop_notices;
653
+ global $aioseop_options;
654
+
655
+ $conflicting_seo_plugins = self::get_conflicting_plugins( 'seo' );
656
+ $conflicting_sitemap_plugins = array();
657
+
658
+ if ( // This value does not exist if user has never (de)activated a module before.
659
+ ! isset( $aioseop_options['modules']['aiosp_feature_manager_options'] ) ||
660
+ ! empty( $aioseop_options['modules']['aiosp_feature_manager_options']['aiosp_feature_manager_enable_sitemap'] ) ) {
661
+ $conflicting_sitemap_plugins = self::get_conflicting_plugins( 'sitemap' );
662
+ }
663
+
664
+ if ( empty( $conflicting_seo_plugins ) && empty( $conflicting_sitemap_plugins ) ) {
665
+ if ( isset( $aioseop_notices->active_notices['conflicting_plugin'] ) ) {
666
+ $aioseop_notices->remove_notice( 'conflicting_plugin' );
667
+ }
668
+ return;
669
+ }
670
+
671
+ $aioseop_notices->activate_notice( 'conflicting_plugin' );
672
+ add_filter( 'aioseop_admin_notice-conflicting_plugin', array( 'AIOSEOP_Education', 'filter_conflicting_plugin_notice_data' ) );
673
+ }
674
+
675
+ /**
676
+ * Filters the data that goes into our conflicting plugins notice.
677
+ *
678
+ * @since 3.4.0
679
+ *
680
+ * @param Object $notice_data The default data of the notice.
681
+ */
682
+ public static function filter_conflicting_plugin_notice_data( $notice_data ) {
683
+ global $aioseop_options;
684
+ $seo_plugin_list = '';
685
+ $sitemap_plugin_list = '';
686
+
687
+ $conflicting_seo_plugins = self::get_conflicting_plugins( 'seo' );
688
+ $conflicting_sitemap_plugins = self::get_conflicting_plugins( 'sitemap' );
689
+
690
+ if ( ! empty( $conflicting_seo_plugins ) ) {
691
+ $list_header = sprintf( '<strong>%s</strong>', __( 'SEO Plugins', 'all-in-one-seo-pack' ) );
692
+
693
+ $list = '';
694
+ foreach ( $conflicting_seo_plugins as $plugin_name => $plugin_path ) {
695
+ $plugin_name = str_replace( '_', ' ', $plugin_name );
696
+ $list .= "<li>${plugin_name}</li>";
697
+ }
698
+
699
+ $seo_plugin_list = sprintf( '%s<ul class="aioseop-notice-list">%s</ul>', $list_header, $list );
700
+ }
701
+
702
+ if ( ! empty( $conflicting_sitemap_plugins ) &&
703
+ // This value does not exist if user has never (de)activated a module before.
704
+ ( ! isset( $aioseop_options['modules']['aiosp_feature_manager_options'] ) || ! empty( $aioseop_options['modules']['aiosp_feature_manager_options']['aiosp_feature_manager_enable_sitemap'] ) )
705
+ ) {
706
+ $list_header = sprintf( '<strong>%s</strong>', __( 'Sitemap Plugins', 'all-in-one-seo-pack' ) );
707
+
708
+ $list = '';
709
+ foreach ( $conflicting_sitemap_plugins as $plugin_name => $plugin_path ) {
710
+ $plugin_name = str_replace( '_', ' ', $plugin_name );
711
+ $list .= "<li>${plugin_name}</li>";
712
+ }
713
+
714
+ $sitemap_plugin_list = sprintf( '%s<ul class="aioseop-notice-list">%s</ul>', $list_header, $list );
715
+ }
716
+
717
+ $notice_data['html'] =
718
+ '<div><p>' .
719
+
720
+ sprintf(
721
+ __(
722
+ '<strong>Warning</strong>: %s has detected other active SEO or sitemap plugins.
723
+ We recommend that you deactivate the following plugins to prevent any conflicts:',
724
+ 'all-in-one-seo-pack'
725
+ ),
726
+ AIOSEOP_PLUGIN_NAME
727
+ ) .
728
+
729
+ '</p><div class="aioseop-notice-indented">' . $seo_plugin_list . $sitemap_plugin_list . '</div></div>';
730
+
731
+ return $notice_data;
732
+ }
733
+
734
+ /**
735
+ * Returns an unordered list of SEO plugins that are known to conflict with All in One SEO Pack.
736
+ *
737
+ * @since 3.4.0
738
+ *
739
+ * @param string $type The type of conflicting plugin ("seo" or "sitemap").
740
+ *
741
+ * @return array The list of plugins that are known to conflict.
742
+ */
743
+ private static function get_conflicting_plugins( $type ) {
744
+ $active_plugins = get_option( 'active_plugins' );
745
+
746
+ $conflicting_plugins = array();
747
+ switch ( $type ) {
748
+ case 'seo': {
749
+ $conflicting_plugins = array(
750
+ 'Yoast SEO' => 'wordpress-seo/wp-seo.php',
751
+ 'Yoast SEO Premium' => 'wordpress-seo-premium/wp-seo-premium.php',
752
+ 'Rank Math SEO' => 'seo-by-rank-math/rank-math.php',
753
+ 'SEOPress' => 'wp-seopress/seopress.php',
754
+ 'The SEO Framework' => 'autodescription/autodescription.php',
755
+ );
756
+ break;
757
+ }
758
+ case 'sitemap': {
759
+ $conflicting_plugins = array(
760
+ 'Google XML Sitemaps' => 'google-sitemap-generator/sitemap.php',
761
+ 'XML Sitemap & Google News' => 'xml-sitemap-feed/xml-sitemap.php',
762
+ 'Google XML Sitemap Generator' => 'www-xml-sitemap-generator-org/www-xml-sitemap-generator-org.php',
763
+ 'Sitemap by BestWebSoft' => 'google-sitemap-plugin/google-sitemap-plugin.php',
764
+ );
765
+ break;
766
+ }
767
+ }
768
+
769
+ return array_intersect( $conflicting_plugins, $active_plugins );
770
+ }
771
+
772
+ /**
773
+ * Returns the taxonomies upsell markup.
774
+ *
775
+ * @since 3.4.0
776
+ *
777
+ * @param string $page_id The ID of the current page.
778
+ *
779
+ * @return string The taxonomies upsell markup.
780
+ */
781
+ private static function get_taxonomies_upsell_content( $page_id ) {
782
+ $is_woocommerce_page = false;
783
+ if ( 'edit-product_cat' === $page_id || 'edit-product_tag' === $page_id ) {
784
+ $is_woocommerce_page = true;
785
+ }
786
+
787
+ return self::get_taxonomies_upsell_markup( $page_id, $is_woocommerce_page );
788
+ }
789
+
790
+ /**
791
+ * Returns the modal markup for the taxonomies upsell.
792
+ *
793
+ * @since 3.4.0
794
+ *
795
+ * @param string $page_id The ID of the current page.
796
+ * @param bool $is_woocommerce_page Whether or not the current page is a WooCommerce taxonomy page.
797
+ *
798
+ * @return string The taxonomies upsell modal markup.
799
+ */
800
+ private static function get_taxonomies_upsell_modal_markup( $page_id, $is_woocommerce_page = false ) {
801
+ $header = ( $is_woocommerce_page ) ? __( 'Unlock SEO for WooCommerce Product Categories & Product Tags', 'all-in-one-seo-pack' ) : __( 'Unlock SEO for Categories, Tags and Custom Taxonomies', 'all-in-one-seo-pack' );
802
+
803
+ return
804
+ '<div class="aioseop-taxonomies-upsell-modal">
805
+ <div class="aioseop-taxonomies-upsell-modal-content">
806
+ <h2>' . $header . '</h2>
807
+ <p>
808
+ <strong>' .
809
+ __( 'This feature is exclusive to our premium version.', 'all-in-one-seo-pack' ) .
810
+ '</strong><br>' .
811
+ /* translators: %s: "All in One SEO Pack Pro" */
812
+ sprintf( __( 'Once you upgrade to %s, you will gain access to all of our exclusive premium features, providing you with even more control over your SEO.', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME . '&nbsp;Pro' ) .
813
+ '
814
+ </p>
815
+ <div>
816
+ <ul class="left">
817
+ <li><span class="dashicons dashicons-yes aioseop-modal-checkmark"></span>' . __( 'SEO and Social Meta for Taxonomies', 'all-in-one-seo-pack' ) . '</li>
818
+ <li><span class="dashicons dashicons-yes aioseop-modal-checkmark"></span>' . __( 'Advanced support for WooCommerce', 'all-in-one-seo-pack' ) . '</li>
819
+ <li><span class="dashicons dashicons-yes aioseop-modal-checkmark"></span>' . __( 'Video Sitemap Module', 'all-in-one-seo-pack' ) . '</li>
820
+ <li><span class="dashicons dashicons-yes aioseop-modal-checkmark"></span>' . __( 'Image SEO Module', 'all-in-one-seo-pack' ) . '</li>
821
+ </ul>
822
+ <ul class="right">
823
+ <li><span class="dashicons dashicons-yes aioseop-modal-checkmark"></span>' . __( 'Support for Google Tag Manager', 'all-in-one-seo-pack' ) . '</li>
824
+ <li><span class="dashicons dashicons-yes aioseop-modal-checkmark"></span>' . __( 'Advanced Google Analytics tracking', 'all-in-one-seo-pack' ) . '</li>
825
+ <li><span class="dashicons dashicons-yes aioseop-modal-checkmark"></span>' . __( 'Access to Premium Support', 'all-in-one-seo-pack' ) . '</li>
826
+ <li><span class="dashicons dashicons-yes aioseop-modal-checkmark"></span>' . __( 'Ad free (no banner adverts)', 'all-in-one-seo-pack' ) . '</li>
827
+ </ul>
828
+ </div>
829
+ </div>
830
+ <div class="aioseop-taxonomies-upsell-modal-button">
831
+ <a href="' . aioseop_get_utm_url( "taxonomies-upsell-{$page_id}" ) . '" class="button button-primary button-hero" target="_blank" rel="noopener noreferrer">' .
832
+ /* translators: %s: "All in One SEO Pack Pro" */
833
+ sprintf( __( 'Upgrade to %s Now', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME . '&nbsp;Pro' ) .
834
+ '</a>
835
+ </div>
836
+ </div>';
837
+ }
838
+
839
+ /**
840
+ * Returns the markup for the taxonomies upsell.
841
+ *
842
+ * @since 3.4.0
843
+ *
844
+ * @param string $page_id The ID of the current page.
845
+ * @param bool $is_woocommerce_page Whether or not the current page is a WooCommerce taxonomy page.
846
+ *
847
+ * @return string The taxonomies upsell AIOSEOP metabox markup.
848
+ */
849
+ private static function get_taxonomies_upsell_markup( $page_id, $is_woocommerce_page ) {
850
+ return
851
+ '<div class="aioseop-preview-wrapper">
852
+ <div id="poststuff" class="aioseop-upsell-blurred">
853
+ <div id="advanced-sortables" class="meta-box-sortables">
854
+ <div id="aiosp_tabbed" class="postbox ">
855
+ <button type="button" class="handlediv" aria-expanded="true" disabled="disabled"><span class="screen-reader-text">Toggle panel: All in One SEO Pack Pro</span><span class="toggle-indicator" aria-hidden="true"></span></button>
856
+ <h2 class="hndle"><span>All in One SEO Pack Pro</span></h2>
857
+ <div class="inside">
858
+ <div class="aioseop_tabs ui-tabs ui-widget ui-widget-content ui-corner-all">
859
+ <ul class="aioseop_header_tabs hide ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" role="tablist">
860
+ <li class="ui-state-default ui-corner-top ui-tabs-active ui-state-active" role="tab" tabindex="0" aria-controls="aiosp" aria-labelledby="ui-id-1" aria-selected="true" aria-expanded="true"><label class="aioseop_header_nav"><a class="aioseop_header_tab active ui-tabs-anchor" href="#aiosp" role="presentation" tabindex="-1" id="ui-id-1">Main Settings</a></label></li>
861
+ <li class="ui-state-default ui-corner-top" role="tab" tabindex="-1" aria-controls="aioseop_opengraph_settings" aria-labelledby="ui-id-2" aria-selected="false" aria-expanded="false"><label class="aioseop_header_nav"><a class="aioseop_header_tab ui-tabs-anchor" href="#aioseop_opengraph_settings" role="presentation" tabindex="-1" id="ui-id-2">Social Settings</a></label></li>
862
+ </ul>
863
+ <div id="aiosp" class="aioseop_tab ui-tabs-panel ui-widget-content ui-corner-bottom" aria-labelledby="ui-id-1" role="tabpanel" aria-hidden="false">
864
+ <input name="aiosp_edit" type="hidden" value="aiosp_edit" autocomplete="aioseop-1583681284" disabled="disabled">
865
+ <div class="aioseop aioseop_options aiosp_settings">
866
+ <div class="aioseop_wrapper aioseop_html_type" id="aiosp_snippet_wrapper">
867
+ <div class="aioseop_input"><span class="aioseop_option_label" style="text-align:left;vertical-align:top;"><a tabindex="0" class="aioseop_help_text_link"></a><label class="aioseop_label textinput">Preview Snippet</label></span></div>
868
+ <div class="aioseop_input aioseop_top_label">
869
+ <div class="aioseop_option_input">
870
+ <div class="aioseop_option_div">
871
+ <div class="preview_snippet">
872
+ <div id="aioseop_snippet">
873
+ <h3><a>Bacon Ipsum | Dev AIOSEOP</a></h3>
874
+ <div>
875
+ <div><cite id="aioseop_snippet_link">http://bacon-ipsum</cite></div>
876
+ <span id="aioseop_snippet_description">Bacon ipsum dolor brisket beef ribs pork chop. Pig venison bresaola alcatra buffalo t-bone tail.</span>
877
+ </div>
878
+ </div>
879
+ </div>
880
+ </div>
881
+ </div>
882
+ <p style="clear:left"></p>
883
+ </div>
884
+ </div>
885
+ <div class="aioseop_wrapper aioseop_text_type" id="aiosp_title_wrapper">
886
+ <div class="aioseop_input">
887
+ <span class="aioseop_option_label" style="text-align:right;vertical-align:top;"><a tabindex="0" class="aioseop_help_text_link"></a><label class="aioseop_label textinput">Title</label></span>
888
+ <div class="aioseop_option_input">
889
+ <div class="aioseop_option_div"><input name="aiosp_title" type="text" size="60" placeholder="Bacon Ipsum" class=" aioseop_count_chars" data-length-field="length1" value="Bacon Ipsum" autocomplete="aioseop-1583681284" disabled="disabled">
890
+ <br><input readonly="" tabindex="-1" type="text" name="length1" size="3" maxlength="3" style="width:53px;height:23px;margin:0px;padding:0px 0px 0px 10px;" value="11" class="aioseop_count_good" disabled="disabled"> characters. Most search engines use a maximum of 60 chars for the title.
891
+ </div>
892
+ </div>
893
+ <p style="clear:left"></p>
894
+ </div>
895
+ </div>
896
+ <div class="aioseop_wrapper aioseop_textarea_type" id="aiosp_description_wrapper">
897
+ <div class="aioseop_input">
898
+ <span class="aioseop_option_label" style="text-align:right;vertical-align:top;"><a tabindex="0" class="aioseop_help_text_link"></a><label class="aioseop_label textinput">Description</label></span>
899
+ <div class="aioseop_option_input">
900
+ <div class="aioseop_option_div"><textarea name="aiosp_description" placeholder="Bacon ipsum dolor brisket beef ribs pork chop. Pig venison bresaola alcatra buffalo t-bone tail." rows="2" cols="80" class=" aioseop_count_chars" data-length-field="length2" disabled="disabled" style="margin-top: 1px; margin-bottom: 1px; height: 143px;"></textarea><br><input readonly="" tabindex="-1" type="text" name="length2" size="3" maxlength="3" style="width:53px;height:23px;margin:0px;padding:0px 0px 0px 10px;" value="139" class="aioseop_count_good" disabled="disabled"> characters. Most search engines use a maximum of 160 chars for the description.</div>
901
+ </div>
902
+ <p style="clear:left"></p>
903
+ </div>
904
+ </div>
905
+ <div class="aioseop_wrapper aioseop_text_type" id="aiosp_custom_link_wrapper">
906
+ <div class="aioseop_input">
907
+ <span class="aioseop_option_label" style="text-align:right;vertical-align:top;"><a tabindex="0" class="aioseop_help_text_link"></a><label class="aioseop_label textinput">Custom Canonical URL</label></span>
908
+ <div class="aioseop_option_input">
909
+ <div class="aioseop_option_div"><input name="aiosp_custom_link" type="text" size="60" value="bacon-ipsum" autocomplete="aioseop-1583681284" disabled="disabled">
910
+ </div>
911
+ </div>
912
+ <p style="clear:left"></p>
913
+ </div>
914
+ </div>
915
+ <div class="aioseop_wrapper aioseop_checkbox_type" id="aiosp_noindex_wrapper">
916
+ <div class="aioseop_input">
917
+ <span class="aioseop_option_label" style="text-align:right;vertical-align:top;"><a tabindex="0" class="aioseop_help_text_link"></a><label class="aioseop_label textinput">NOINDEX this page/post</label></span>
918
+ <div class="aioseop_option_input">
919
+ <div class="aioseop_option_div"><input name="aiosp_noindex" type="checkbox" disabled="disabled">
920
+ </div>
921
+ </div>
922
+ <p style="clear:left"></p>
923
+ </div>
924
+ </div>
925
+ <div class="aioseop_wrapper aioseop_checkbox_type" id="aiosp_nofollow_wrapper">
926
+ <div class="aioseop_input">
927
+ <span class="aioseop_option_label" style="text-align:right;vertical-align:top;"><a tabindex="0" class="aioseop_help_text_link"></a><label class="aioseop_label textinput">NOFOLLOW this page/post</label></span>
928
+ <div class="aioseop_option_input">
929
+ <div class="aioseop_option_div"><input name="aiosp_nofollow" type="checkbox" checked="" disabled="disabled">
930
+ </div>
931
+ </div>
932
+ <p style="clear:left"></p>
933
+ </div>
934
+ </div>
935
+ <div class="aioseop_wrapper aioseop_checkbox_type" id="aiosp_disable_wrapper">
936
+ <div class="aioseop_input">
937
+ <span class="aioseop_option_label" style="text-align:right;vertical-align:top;"><a tabindex="0" class="aioseop_help_text_link"></a><label class="aioseop_label textinput">Disable on this page/post</label></span>
938
+ <div class="aioseop_option_input">
939
+ <div class="aioseop_option_div"><input name="aiosp_disable" type="checkbox" disabled="disabled">
940
+ </div>
941
+ </div>
942
+ <p style="clear:left"></p>
943
+ </div>
944
+ </div>
945
+ <div class="aioseop_wrapper aioseop_checkbox_type" id="aiosp_disable_analytics_wrapper" style="display: none;">
946
+ <div class="aioseop_input">
947
+ <span class="aioseop_option_label" style="text-align:right;vertical-align:top;"><a tabindex="0" class="aioseop_help_text_link" style=";" title="<h4 aria-hidden>Disable Google Analytics:</h4> Disable Google Analytics on this page.<br /><br /><a href=&quot;https://semperplugins.com/documentation/post-settings/#disable-google-analytics&quot; target=&quot;_blank&quot;>Click here for documentation on this setting.</a>"></a><label class="aioseop_label textinput">Disable Google Analytics</label></span>
948
+ <div class="aioseop_option_input">
949
+ <div class="aioseop_option_div"><input name="aiosp_disable_analytics" type="checkbox" disabled="disabled">
950
+ </div>
951
+ </div>
952
+ <p style="clear:left"></p>
953
+ </div>
954
+ </div>
955
+ </div>
956
+ </div>
957
+ </div>
958
+ </div>
959
+ </div>
960
+ </div>
961
+ </div>' .
962
+ self::get_taxonomies_upsell_modal_markup( $page_id, $is_woocommerce_page ) . '</div>';
963
+ }
964
+ }
inc/admin/class-aioseop-link-attributes.php ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Extends the Gutenberg Editor and Classic Editor with extra rich text features.
4
+ *
5
+ * @since 3.4.0
6
+ * @package All-in-One-SEO-Pack
7
+ */
8
+
9
+ /**
10
+ * Enqueues scripts that allow users to add nofollow, sponsored and title attributes to links in the Gutenberg Editor and Classic Editor.
11
+ *
12
+ * @since 3.4.0
13
+ */
14
+ class AIOSEOP_Link_Attributes {
15
+
16
+ /**
17
+ * Enqueues the script for the Classic Editor.
18
+ *
19
+ * Acts as a callback for the wp_enqueue_editor action hook.
20
+ *
21
+ * @since 3.4.0
22
+ *
23
+ * @return void
24
+ */
25
+ public static function enqueue_link_attributes_classic_editor() {
26
+ wp_deregister_script( 'wplink' );
27
+ wp_enqueue_script(
28
+ 'aioseop-link-attributes-classic-editor',
29
+ AIOSEOP_PLUGIN_URL . 'js/admin/aioseop-link-attributes-classic-editor.js',
30
+ array( 'jquery', 'wp-a11y' ),
31
+ AIOSEOP_VERSION,
32
+ true
33
+ );
34
+
35
+ wp_localize_script(
36
+ 'aioseop-link-attributes-classic-editor',
37
+ 'aioseopL10n',
38
+ array(
39
+ 'update' => __( 'Update', 'all-in-one-seo-pack' ),
40
+ 'save' => __( 'Add Link', 'all-in-one-seo-pack' ),
41
+ 'noTitle' => __( '(no title)', 'all-in-one-seo-pack' ),
42
+ 'labelTitle' => __( 'Title', 'all-in-one-seo-pack' ),
43
+ 'noMatchesFound' => __( 'No results found.', 'all-in-one-seo-pack' ),
44
+ 'linkInserted' => __( 'Link has been inserted.', 'all-in-one-seo-pack' ),
45
+ 'noFollow' => __( '&nbsp;Add <code>rel="nofollow"</code> to link', 'all-in-one-seo-pack' ),
46
+ 'sponsored' => __( '&nbsp;Add <code>rel="sponsored"</code> to link', 'all-in-one-seo-pack' ),
47
+ )
48
+ );
49
+ }
50
+
51
+ /**
52
+ * Registers the script for the Gutenberg Editor.
53
+ *
54
+ * Acts as a callback for the admin_init action hook.
55
+ *
56
+ * @since 3.4.0
57
+ *
58
+ * @return void
59
+ */
60
+ public static function register_link_attributes_gutenberg_editor() {
61
+ wp_register_script(
62
+ 'aioseop-link-attributes-gutenberg-editor',
63
+ AIOSEOP_PLUGIN_URL . 'build/aioseop-link-attributes-gutenberg-editor.js',
64
+ array(
65
+ 'wp-blocks',
66
+ 'wp-i18n',
67
+ 'wp-element',
68
+ 'wp-plugins',
69
+ 'wp-components',
70
+ 'wp-edit-post',
71
+ 'wp-api',
72
+ 'wp-editor',
73
+ 'wp-hooks',
74
+ 'lodash',
75
+ ),
76
+ AIOSEOP_VERSION,
77
+ true
78
+ );
79
+ }
80
+
81
+ /**
82
+ * Enqueues the script for the Gutenberg Editor.
83
+ *
84
+ * Acts as a callback for the enqueue_block_editor_assets action hook.
85
+ *
86
+ * @since 3.4.0
87
+ *
88
+ * @return void
89
+ */
90
+ public static function enqueue_link_attributes_gutenberg_editor() {
91
+ wp_enqueue_script( 'aioseop-link-attributes-gutenberg-editor' );
92
+ }
93
+ }
inc/admin/helpers/PluginSilentUpgrader.php ADDED
@@ -0,0 +1,571 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // phpcs:ignoreFile
3
+
4
+ /** \WP_Upgrader class */
5
+ require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
6
+
7
+ /** \Plugin_Upgrader class */
8
+ require_once ABSPATH . 'wp-admin/includes/class-plugin-upgrader.php';
9
+
10
+ /**
11
+ * In WP 5.3 a PHP 5.6 splat operator (...$args) was added to \WP_Upgrader_Skin::feedback().
12
+ * We need to remove all calls to *Skin::feedback() method, as we can't override it in own Skins
13
+ * without breaking support for PHP 5.3-5.5.
14
+ *
15
+ * @internal Please do not use this class outside of core All in One SEO development. May be removed at any time.
16
+ *
17
+ * @since 1.5.6.1
18
+ */
19
+ class PluginSilentUpgrader extends \Plugin_Upgrader {
20
+
21
+ /**
22
+ * Run an upgrade/installation.
23
+ *
24
+ * Attempts to download the package (if it is not a local file), unpack it, and
25
+ * install it in the destination folder.
26
+ *
27
+ * @since 1.5.6.1
28
+ *
29
+ * @param array $options {
30
+ * Array or string of arguments for upgrading/installing a package.
31
+ *
32
+ * @type string $package The full path or URI of the package to install.
33
+ * Default empty.
34
+ * @type string $destination The full path to the destination folder.
35
+ * Default empty.
36
+ * @type bool $clear_destination Whether to delete any files already in the
37
+ * destination folder. Default false.
38
+ * @type bool $clear_working Whether to delete the files form the working
39
+ * directory after copying to the destination.
40
+ * Default false.
41
+ * @type bool $abort_if_destination_exists Whether to abort the installation if the destination
42
+ * folder already exists. When true, `$clear_destination`
43
+ * should be false. Default true.
44
+ * @type bool $is_multi Whether this run is one of multiple upgrade/installation
45
+ * actions being performed in bulk. When true, the skin
46
+ * WP_Upgrader::header() and WP_Upgrader::footer()
47
+ * aren't called. Default false.
48
+ * @type array $hook_extra Extra arguments to pass to the filter hooks called by
49
+ * WP_Upgrader::run().
50
+ * }
51
+ * @return array|false|WP_error The result from self::install_package() on success, otherwise a WP_Error,
52
+ * or false if unable to connect to the filesystem.
53
+ */
54
+ public function run( $options ) {
55
+
56
+ $defaults = array(
57
+ 'package' => '', // Please always pass this.
58
+ 'destination' => '', // And this
59
+ 'clear_destination' => false,
60
+ 'abort_if_destination_exists' => true, // Abort if the Destination directory exists, Pass clear_destination as false please
61
+ 'clear_working' => true,
62
+ 'is_multi' => false,
63
+ 'hook_extra' => array(), // Pass any extra $hook_extra args here, this will be passed to any hooked filters.
64
+ );
65
+
66
+ $options = wp_parse_args( $options, $defaults );
67
+
68
+ /**
69
+ * Filters the package options before running an update.
70
+ *
71
+ * See also {@see 'upgrader_process_complete'}.
72
+ *
73
+ * @since 4.3.0
74
+ *
75
+ * @param array $options {
76
+ * Options used by the upgrader.
77
+ *
78
+ * @type string $package Package for update.
79
+ * @type string $destination Update location.
80
+ * @type bool $clear_destination Clear the destination resource.
81
+ * @type bool $clear_working Clear the working resource.
82
+ * @type bool $abort_if_destination_exists Abort if the Destination directory exists.
83
+ * @type bool $is_multi Whether the upgrader is running multiple times.
84
+ * @type array $hook_extra {
85
+ * Extra hook arguments.
86
+ *
87
+ * @type string $action Type of action. Default 'update'.
88
+ * @type string $type Type of update process. Accepts 'plugin', 'theme', or 'core'.
89
+ * @type bool $bulk Whether the update process is a bulk update. Default true.
90
+ * @type string $plugin Path to the plugin file relative to the plugins directory.
91
+ * @type string $theme The stylesheet or template name of the theme.
92
+ * @type string $language_update_type The language pack update type. Accepts 'plugin', 'theme',
93
+ * or 'core'.
94
+ * @type object $language_update The language pack update offer.
95
+ * }
96
+ * }
97
+ */
98
+ $options = apply_filters( 'upgrader_package_options', $options );
99
+
100
+ if ( ! $options['is_multi'] ) { // call $this->header separately if running multiple times
101
+ $this->skin->header();
102
+ }
103
+
104
+ // Connect to the Filesystem first.
105
+ $res = $this->fs_connect( array( WP_CONTENT_DIR, $options['destination'] ) );
106
+ // Mainly for non-connected filesystem.
107
+ if ( ! $res ) {
108
+ if ( ! $options['is_multi'] ) {
109
+ $this->skin->footer();
110
+ }
111
+ return false;
112
+ }
113
+
114
+ $this->skin->before();
115
+
116
+ if ( is_wp_error( $res ) ) {
117
+ $this->skin->error( $res );
118
+ $this->skin->after();
119
+ if ( ! $options['is_multi'] ) {
120
+ $this->skin->footer();
121
+ }
122
+ return $res;
123
+ }
124
+
125
+ /*
126
+ * Download the package (Note, This just returns the filename
127
+ * of the file if the package is a local file)
128
+ */
129
+ $download = $this->download_package( $options['package'], true );
130
+
131
+ // Allow for signature soft-fail.
132
+ // WARNING: This may be removed in the future.
133
+ if ( is_wp_error( $download ) && $download->get_error_data( 'softfail-filename' ) ) {
134
+
135
+ // Don't output the 'no signature could be found' failure message for now.
136
+ if ( 'signature_verification_no_signature' != $download->get_error_code() || WP_DEBUG ) {
137
+ // Outout the failure error as a normal feedback, and not as an error:
138
+ // $this->skin->feedback( $download->get_error_message() );
139
+
140
+ // Report this failure back to WordPress.org for debugging purposes.
141
+ wp_version_check(
142
+ array(
143
+ 'signature_failure_code' => $download->get_error_code(),
144
+ 'signature_failure_data' => $download->get_error_data(),
145
+ )
146
+ );
147
+ }
148
+
149
+ // Pretend this error didn't happen.
150
+ $download = $download->get_error_data( 'softfail-filename' );
151
+ }
152
+
153
+ if ( is_wp_error( $download ) ) {
154
+ $this->skin->error( $download );
155
+ $this->skin->after();
156
+ if ( ! $options['is_multi'] ) {
157
+ $this->skin->footer();
158
+ }
159
+ return $download;
160
+ }
161
+
162
+ $delete_package = ( $download != $options['package'] ); // Do not delete a "local" file
163
+
164
+ // Unzips the file into a temporary directory.
165
+ $working_dir = $this->unpack_package( $download, $delete_package );
166
+ if ( is_wp_error( $working_dir ) ) {
167
+ $this->skin->error( $working_dir );
168
+ $this->skin->after();
169
+ if ( ! $options['is_multi'] ) {
170
+ $this->skin->footer();
171
+ }
172
+ return $working_dir;
173
+ }
174
+
175
+ // With the given options, this installs it to the destination directory.
176
+ $result = $this->install_package(
177
+ array(
178
+ 'source' => $working_dir,
179
+ 'destination' => $options['destination'],
180
+ 'clear_destination' => $options['clear_destination'],
181
+ 'abort_if_destination_exists' => $options['abort_if_destination_exists'],
182
+ 'clear_working' => $options['clear_working'],
183
+ 'hook_extra' => $options['hook_extra'],
184
+ )
185
+ );
186
+
187
+ $this->skin->set_result( $result );
188
+ if ( is_wp_error( $result ) ) {
189
+ $this->skin->error( $result );
190
+ // $this->skin->feedback( 'process_failed' );
191
+ } else {
192
+ // Installation succeeded.
193
+ // $this->skin->feedback( 'process_success' );
194
+ }
195
+
196
+ $this->skin->after();
197
+
198
+ if ( ! $options['is_multi'] ) {
199
+
200
+ /**
201
+ * Fires when the upgrader process is complete.
202
+ *
203
+ * See also {@see 'upgrader_package_options'}.
204
+ *
205
+ * @since 3.6.0
206
+ * @since 3.7.0 Added to WP_Upgrader::run().
207
+ * @since 4.6.0 `$translations` was added as a possible argument to `$hook_extra`.
208
+ *
209
+ * @param WP_Upgrader $this WP_Upgrader instance. In other contexts, $this, might be a
210
+ * Theme_Upgrader, Plugin_Upgrader, Core_Upgrade, or Language_Pack_Upgrader instance.
211
+ * @param array $hook_extra {
212
+ * Array of bulk item update data.
213
+ *
214
+ * @type string $action Type of action. Default 'update'.
215
+ * @type string $type Type of update process. Accepts 'plugin', 'theme', 'translation', or 'core'.
216
+ * @type bool $bulk Whether the update process is a bulk update. Default true.
217
+ * @type array $plugins Array of the basename paths of the plugins' main files.
218
+ * @type array $themes The theme slugs.
219
+ * @type array $translations {
220
+ * Array of translations update data.
221
+ *
222
+ * @type string $language The locale the translation is for.
223
+ * @type string $type Type of translation. Accepts 'plugin', 'theme', or 'core'.
224
+ * @type string $slug Text domain the translation is for. The slug of a theme/plugin or
225
+ * 'default' for core translations.
226
+ * @type string $version The version of a theme, plugin, or core.
227
+ * }
228
+ * }
229
+ */
230
+ do_action( 'upgrader_process_complete', $this, $options['hook_extra'] );
231
+
232
+ $this->skin->footer();
233
+ }
234
+
235
+ return $result;
236
+ }
237
+
238
+ /**
239
+ * Toggle maintenance mode for the site.
240
+ *
241
+ * Create/delete the maintenance file to enable/disable maintenance mode.
242
+ *
243
+ * @since 2.8.0
244
+ *
245
+ * @global WP_Filesystem_Base $wp_filesystem Subclass
246
+ *
247
+ * @param bool $enable True to enable maintenance mode, false to disable.
248
+ */
249
+ public function maintenance_mode( $enable = false ) {
250
+ global $wp_filesystem;
251
+ $file = $wp_filesystem->abspath() . '.maintenance';
252
+ if ( $enable ) {
253
+ // $this->skin->feedback( 'maintenance_start' );
254
+ // Create maintenance file to signal that we are upgrading
255
+ $maintenance_string = '<?php $upgrading = ' . time() . '; ?>';
256
+ $wp_filesystem->delete( $file );
257
+ $wp_filesystem->put_contents( $file, $maintenance_string, FS_CHMOD_FILE );
258
+ } elseif ( ! $enable && $wp_filesystem->exists( $file ) ) {
259
+ // $this->skin->feedback( 'maintenance_end' );
260
+ $wp_filesystem->delete( $file );
261
+ }
262
+ }
263
+
264
+ /**
265
+ * Download a package.
266
+ *
267
+ * @since 2.8.0
268
+ *
269
+ * @param string $package The URI of the package. If this is the full path to an
270
+ * existing local file, it will be returned untouched.
271
+ * @param bool $check_signatures Whether to validate file signatures. Default false.
272
+ * @return string|WP_Error The full path to the downloaded package file, or a WP_Error object.
273
+ */
274
+ public function download_package( $package, $check_signatures = false ) {
275
+
276
+ /**
277
+ * Filters whether to return the package.
278
+ *
279
+ * @since 3.7.0
280
+ *
281
+ * @param bool $reply Whether to bail without returning the package.
282
+ * Default false.
283
+ * @param string $package The package file name.
284
+ * @param WP_Upgrader $this The WP_Upgrader instance.
285
+ */
286
+ $reply = apply_filters( 'upgrader_pre_download', false, $package, $this );
287
+ if ( false !== $reply ) {
288
+ return $reply;
289
+ }
290
+
291
+ if ( ! preg_match( '!^(http|https|ftp)://!i', $package ) && file_exists( $package ) ) { // Local file or remote?
292
+ return $package; // must be a local file..
293
+ }
294
+
295
+ if ( empty( $package ) ) {
296
+ return new WP_Error( 'no_package', $this->strings['no_package'] );
297
+ }
298
+
299
+ // $this->skin->feedback( 'downloading_package', $package );
300
+
301
+ $download_file = download_url( $package, 300, $check_signatures );
302
+
303
+ if ( is_wp_error( $download_file ) && ! $download_file->get_error_data( 'softfail-filename' ) ) {
304
+ return new WP_Error( 'download_failed', $this->strings['download_failed'], $download_file->get_error_message() );
305
+ }
306
+
307
+ return $download_file;
308
+ }
309
+
310
+ /**
311
+ * Unpack a compressed package file.
312
+ *
313
+ * @since 2.8.0
314
+ *
315
+ * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
316
+ *
317
+ * @param string $package Full path to the package file.
318
+ * @param bool $delete_package Optional. Whether to delete the package file after attempting
319
+ * to unpack it. Default true.
320
+ * @return string|WP_Error The path to the unpacked contents, or a WP_Error on failure.
321
+ */
322
+ public function unpack_package( $package, $delete_package = true ) {
323
+ global $wp_filesystem;
324
+
325
+ // $this->skin->feedback( 'unpack_package' );
326
+
327
+ $upgrade_folder = $wp_filesystem->wp_content_dir() . 'upgrade/';
328
+
329
+ // Clean up contents of upgrade directory beforehand.
330
+ $upgrade_files = $wp_filesystem->dirlist( $upgrade_folder );
331
+ if ( ! empty( $upgrade_files ) ) {
332
+ foreach ( $upgrade_files as $file ) {
333
+ $wp_filesystem->delete( $upgrade_folder . $file['name'], true );
334
+ }
335
+ }
336
+
337
+ // We need a working directory - Strip off any .tmp or .zip suffixes
338
+ $working_dir = $upgrade_folder . basename( basename( $package, '.tmp' ), '.zip' );
339
+
340
+ // Clean up working directory
341
+ if ( $wp_filesystem->is_dir( $working_dir ) ) {
342
+ $wp_filesystem->delete( $working_dir, true );
343
+ }
344
+
345
+ // Unzip package to working directory
346
+ $result = unzip_file( $package, $working_dir );
347
+
348
+ // Once extracted, delete the package if required.
349
+ if ( $delete_package ) {
350
+ unlink( $package );
351
+ }
352
+
353
+ if ( is_wp_error( $result ) ) {
354
+ $wp_filesystem->delete( $working_dir, true );
355
+ if ( 'incompatible_archive' == $result->get_error_code() ) {
356
+ return new WP_Error( 'incompatible_archive', $this->strings['incompatible_archive'], $result->get_error_data() );
357
+ }
358
+ return $result;
359
+ }
360
+
361
+ return $working_dir;
362
+ }
363
+
364
+ /**
365
+ * Install a package.
366
+ *
367
+ * Copies the contents of a package form a source directory, and installs them in
368
+ * a destination directory. Optionally removes the source. It can also optionally
369
+ * clear out the destination folder if it already exists.
370
+ *
371
+ * @since 2.8.0
372
+ *
373
+ * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
374
+ * @global array $wp_theme_directories
375
+ *
376
+ * @param array|string $args {
377
+ * Optional. Array or string of arguments for installing a package. Default empty array.
378
+ *
379
+ * @type string $source Required path to the package source. Default empty.
380
+ * @type string $destination Required path to a folder to install the package in.
381
+ * Default empty.
382
+ * @type bool $clear_destination Whether to delete any files already in the destination
383
+ * folder. Default false.
384
+ * @type bool $clear_working Whether to delete the files form the working directory
385
+ * after copying to the destination. Default false.
386
+ * @type bool $abort_if_destination_exists Whether to abort the installation if
387
+ * the destination folder already exists. Default true.
388
+ * @type array $hook_extra Extra arguments to pass to the filter hooks called by
389
+ * WP_Upgrader::install_package(). Default empty array.
390
+ * }
391
+ *
392
+ * @return array|WP_Error The result (also stored in `WP_Upgrader::$result`), or a WP_Error on failure.
393
+ */
394
+ public function install_package( $args = array() ) {
395
+ global $wp_filesystem, $wp_theme_directories;
396
+
397
+ $defaults = array(
398
+ 'source' => '', // Please always pass this
399
+ 'destination' => '', // and this
400
+ 'clear_destination' => false,
401
+ 'clear_working' => false,
402
+ 'abort_if_destination_exists' => true,
403
+ 'hook_extra' => array(),
404
+ );
405
+
406
+ $args = wp_parse_args( $args, $defaults );
407
+
408
+ // These were previously extract()'d.
409
+ $source = $args['source'];
410
+ $destination = $args['destination'];
411
+ $clear_destination = $args['clear_destination'];
412
+
413
+ set_time_limit( 300 );
414
+
415
+ if ( empty( $source ) || empty( $destination ) ) {
416
+ return new WP_Error( 'bad_request', $this->strings['bad_request'] );
417
+ }
418
+ // $this->skin->feedback( 'installing_package' );
419
+
420
+ /**
421
+ * Filters the install response before the installation has started.
422
+ *
423
+ * Returning a truthy value, or one that could be evaluated as a WP_Error
424
+ * will effectively short-circuit the installation, returning that value
425
+ * instead.
426
+ *
427
+ * @since 2.8.0
428
+ *
429
+ * @param bool|WP_Error $response Response.
430
+ * @param array $hook_extra Extra arguments passed to hooked filters.
431
+ */
432
+ $res = apply_filters( 'upgrader_pre_install', true, $args['hook_extra'] );
433
+
434
+ if ( is_wp_error( $res ) ) {
435
+ return $res;
436
+ }
437
+
438
+ // Retain the Original source and destinations
439
+ $remote_source = $args['source'];
440
+ $local_destination = $destination;
441
+
442
+ $source_files = array_keys( $wp_filesystem->dirlist( $remote_source ) );
443
+ $remote_destination = $wp_filesystem->find_folder( $local_destination );
444
+
445
+ // Locate which directory to copy to the new folder, This is based on the actual folder holding the files.
446
+ if ( 1 == count( $source_files ) && $wp_filesystem->is_dir( trailingslashit( $args['source'] ) . $source_files[0] . '/' ) ) { // Only one folder? Then we want its contents.
447
+ $source = trailingslashit( $args['source'] ) . trailingslashit( $source_files[0] );
448
+ } elseif ( count( $source_files ) == 0 ) {
449
+ return new WP_Error( 'incompatible_archive_empty', $this->strings['incompatible_archive'], $this->strings['no_files'] ); // There are no files?
450
+ } else { // It's only a single file, the upgrader will use the folder name of this file as the destination folder. Folder name is based on zip filename.
451
+ $source = trailingslashit( $args['source'] );
452
+ }
453
+
454
+ /**
455
+ * Filters the source file location for the upgrade package.
456
+ *
457
+ * @since 2.8.0
458
+ * @since 4.4.0 The $hook_extra parameter became available.
459
+ *
460
+ * @param string $source File source location.
461
+ * @param string $remote_source Remote file source location.
462
+ * @param WP_Upgrader $this WP_Upgrader instance.
463
+ * @param array $hook_extra Extra arguments passed to hooked filters.
464
+ */
465
+ $source = apply_filters( 'upgrader_source_selection', $source, $remote_source, $this, $args['hook_extra'] );
466
+
467
+ if ( is_wp_error( $source ) ) {
468
+ return $source;
469
+ }
470
+
471
+ // Has the source location changed? If so, we need a new source_files list.
472
+ if ( $source !== $remote_source ) {
473
+ $source_files = array_keys( $wp_filesystem->dirlist( $source ) );
474
+ }
475
+
476
+ /*
477
+ * Protection against deleting files in any important base directories.
478
+ * Theme_Upgrader & Plugin_Upgrader also trigger this, as they pass the
479
+ * destination directory (WP_PLUGIN_DIR / wp-content/themes) intending
480
+ * to copy the directory into the directory, whilst they pass the source
481
+ * as the actual files to copy.
482
+ */
483
+ $protected_directories = array( ABSPATH, WP_CONTENT_DIR, WP_PLUGIN_DIR, WP_CONTENT_DIR . '/themes' );
484
+
485
+ if ( is_array( $wp_theme_directories ) ) {
486
+ $protected_directories = array_merge( $protected_directories, $wp_theme_directories );
487
+ }
488
+
489
+ if ( in_array( $destination, $protected_directories ) ) {
490
+ $remote_destination = trailingslashit( $remote_destination ) . trailingslashit( basename( $source ) );
491
+ $destination = trailingslashit( $destination ) . trailingslashit( basename( $source ) );
492
+ }
493
+
494
+ if ( $clear_destination ) {
495
+ // We're going to clear the destination if there's something there.
496
+ // $this->skin->feedback( 'remove_old' );
497
+
498
+ $removed = $this->clear_destination( $remote_destination );
499
+
500
+ /**
501
+ * Filters whether the upgrader cleared the destination.
502
+ *
503
+ * @since 2.8.0
504
+ *
505
+ * @param mixed $removed Whether the destination was cleared. true on success, WP_Error on failure
506
+ * @param string $local_destination The local package destination.
507
+ * @param string $remote_destination The remote package destination.
508
+ * @param array $hook_extra Extra arguments passed to hooked filters.
509
+ */
510
+ $removed = apply_filters( 'upgrader_clear_destination', $removed, $local_destination, $remote_destination, $args['hook_extra'] );
511
+
512
+ if ( is_wp_error( $removed ) ) {
513
+ return $removed;
514
+ }
515
+ } elseif ( $args['abort_if_destination_exists'] && $wp_filesystem->exists( $remote_destination ) ) {
516
+ // If we're not clearing the destination folder and something exists there already, Bail.
517
+ // But first check to see if there are actually any files in the folder.
518
+ $_files = $wp_filesystem->dirlist( $remote_destination );
519
+ if ( ! empty( $_files ) ) {
520
+ $wp_filesystem->delete( $remote_source, true ); // Clear out the source files.
521
+ return new WP_Error( 'folder_exists', $this->strings['folder_exists'], $remote_destination );
522
+ }
523
+ }
524
+
525
+ // Create destination if needed
526
+ if ( ! $wp_filesystem->exists( $remote_destination ) ) {
527
+ if ( ! $wp_filesystem->mkdir( $remote_destination, FS_CHMOD_DIR ) ) {
528
+ return new WP_Error( 'mkdir_failed_destination', $this->strings['mkdir_failed'], $remote_destination );
529
+ }
530
+ }
531
+ // Copy new version of item into place.
532
+ $result = copy_dir( $source, $remote_destination );
533
+ if ( is_wp_error( $result ) ) {
534
+ if ( $args['clear_working'] ) {
535
+ $wp_filesystem->delete( $remote_source, true );
536
+ }
537
+ return $result;
538
+ }
539
+
540
+ // Clear the Working folder?
541
+ if ( $args['clear_working'] ) {
542
+ $wp_filesystem->delete( $remote_source, true );
543
+ }
544
+
545
+ $destination_name = basename( str_replace( $local_destination, '', $destination ) );
546
+ if ( '.' == $destination_name ) {
547
+ $destination_name = '';
548
+ }
549
+
550
+ $this->result = compact( 'source', 'source_files', 'destination', 'destination_name', 'local_destination', 'remote_destination', 'clear_destination' );
551
+
552
+ /**
553
+ * Filters the installation response after the installation has finished.
554
+ *
555
+ * @since 2.8.0
556
+ *
557
+ * @param bool $response Installation response.
558
+ * @param array $hook_extra Extra arguments passed to hooked filters.
559
+ * @param array $result Installation result data.
560
+ */
561
+ $res = apply_filters( 'upgrader_post_install', true, $args['hook_extra'], $this->result );
562
+
563
+ if ( is_wp_error( $res ) ) {
564
+ $this->result = $res;
565
+ return $res;
566
+ }
567
+
568
+ // Bombard the calling function will all the info which we've just used.
569
+ return $this->result;
570
+ }
571
+ }
inc/admin/helpers/PluginSilentUpgraderSkin.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // phpcs:ignoreFile
3
+
4
+ /** \WP_Upgrader_Skin class */
5
+ require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader-skin.php';
6
+
7
+ /**
8
+ * Class PluginSilentUpgraderSkin.
9
+ *
10
+ * @internal Please do not use this class outside of core All in One SEO development. May be removed at any time.
11
+ *
12
+ * @since 1.5.6.1
13
+ */
14
+ class PluginSilentUpgraderSkin extends \WP_Upgrader_Skin {
15
+
16
+ /**
17
+ * Empty out the header of its HTML content and only check to see if it has
18
+ * been performed or not.
19
+ *
20
+ * @since 1.5.6.1
21
+ */
22
+ public function header() {
23
+ }
24
+
25
+ /**
26
+ * Empty out the footer of its HTML contents.
27
+ *
28
+ * @since 1.5.6.1
29
+ */
30
+ public function footer() {
31
+ }
32
+
33
+ /**
34
+ * Instead of outputting HTML for errors, just return them.
35
+ * Ajax request will just ignore it.
36
+ *
37
+ * @since 1.5.6.1
38
+ *
39
+ * @param array $errors Array of errors with the install process.
40
+ *
41
+ * @return array
42
+ */
43
+ public function error( $errors ) {
44
+ return $errors;
45
+ }
46
+
47
+ /**
48
+ * Empty out JavaScript output that calls function to decrement the update counts.
49
+ *
50
+ * @since 1.5.6.1
51
+ *
52
+ * @param string $type Type of update count to decrement.
53
+ */
54
+ public function decrement_update_count( $type ) {
55
+ }
56
+ }
inc/admin/helpers/class-install-skin.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // phpcs:ignoreFile
3
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/admin/helpers/PluginSilentUpgraderSkin.php';
4
+
5
+ /**
6
+ * @since 3.4.0
7
+ */
8
+ class AIOSEOP_Install_Skin extends PluginSilentUpgraderSkin {
9
+
10
+ /**
11
+ * @since 3.4.0
12
+ */
13
+ public function error( $errors ) {
14
+
15
+ if ( ! empty( $errors ) ) {
16
+ wp_send_json_error( $errors );
17
+ }
18
+ }
19
+ }
inc/admin/views/class-aioseop-about.php ADDED
@@ -0,0 +1,830 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * AIOSEOP_About
4
+ *
5
+ * @package All_in_One_SEO_Pack
6
+ * @since 3.4.0
7
+ */
8
+
9
+ /**
10
+ * Handles the About Us page.
11
+ *
12
+ * @since 3.4.0
13
+ */
14
+ class AIOSEOP_About {
15
+
16
+ /**
17
+ * The current view.
18
+ *
19
+ * @var string
20
+ */
21
+ private static $view;
22
+
23
+ /**
24
+ * Initializes the code.
25
+ *
26
+ * @since 3.4.0
27
+ */
28
+ public static function init() {
29
+ if ( ! is_admin() ||
30
+ ! get_current_screen()->id === aioseop_get_admin_screens()
31
+ ) {
32
+ return;
33
+ }
34
+
35
+ self::$view = 'about';
36
+ if ( isset( $_GET['view'] ) ) {
37
+ self::$view = $_GET['view'];
38
+ }
39
+
40
+ self::enqueue_files();
41
+ self::render_page();
42
+ }
43
+
44
+ /**
45
+ * Enqueues the required files.
46
+ *
47
+ * @since 3.4.0
48
+ */
49
+ private static function enqueue_files() {
50
+ wp_enqueue_style(
51
+ 'aioseop-about',
52
+ AIOSEOP_PLUGIN_URL . 'css/admin/aioseop-about.css',
53
+ array(),
54
+ AIOSEOP_VERSION
55
+ );
56
+
57
+ if ( 'about' !== self::$view ) {
58
+ return;
59
+ }
60
+
61
+ wp_enqueue_script(
62
+ 'jquery-matchheight',
63
+ AIOSEOP_PLUGIN_URL . 'js/dependencies/jquery.matchHeight-min.js',
64
+ array( 'jquery' ),
65
+ '0.7.0',
66
+ false
67
+ );
68
+
69
+ wp_enqueue_script( 'aioseop-about', AIOSEOP_PLUGIN_URL . 'js/admin/aioseop-about.js', array( 'jquery' ), AIOSEOP_VERSION, false );
70
+
71
+ $ajax_data = array(
72
+ 'requestUrl' => admin_url( 'admin-ajax.php' ),
73
+ 'nonce' => wp_create_nonce( 'aioseop-am-plugins' ),
74
+ 'aioseopL10n' => array(
75
+ 'active' => __( 'Active', 'all-in-one-seo-pack' ),
76
+ 'inactive' => __( 'Inactive', 'all-in-one-seo-pack' ),
77
+ 'activated' => __( 'Activated', 'all-in-one-seo-pack' ),
78
+ 'install' => __( 'Install Plugin', 'all-in-one-seo-pack' ),
79
+ 'activate' => __( 'Activate', 'all-in-one-seo-pack' ),
80
+ 'install_failed' => __( 'Installation Failed', 'all-in-one-seo-pack' ),
81
+ 'activation_failed' => __( 'Activation Failed', 'all-in-one-seo-pack' ),
82
+ 'wait' => __( 'Please wait...', 'all-in-one-seo-pack' ),
83
+ ),
84
+ );
85
+
86
+ wp_localize_script( 'aioseop-about', 'aioseopAboutData', $ajax_data );
87
+ }
88
+
89
+ private static function require_files() {
90
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/admin/helpers/class-install-skin.php';
91
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/admin/helpers/PluginSilentUpgraderSkin.php';
92
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/admin/helpers/PluginSilentUpgrader.php';
93
+ }
94
+
95
+ /**
96
+ * Installs a given plugin.
97
+ *
98
+ * Acts as a callback for our "wp_ajax_aioseop_install_plugin" endpoint.
99
+ *
100
+ * @since 3.4.0
101
+ */
102
+ public static function install_plugin() {
103
+ check_ajax_referer( 'aioseop-am-plugins', '_ajax_nonce' );
104
+
105
+ if ( ! current_user_can( 'administrator' ) ) {
106
+ wp_send_json_error();
107
+ }
108
+
109
+ if ( empty( $_POST['plugin'] ) ) {
110
+ wp_send_json_error();
111
+ }
112
+
113
+ $url = esc_url_raw(
114
+ add_query_arg(
115
+ array(
116
+ 'page' => 'aioseop-addons',
117
+ ),
118
+ admin_url( 'admin.php' )
119
+ )
120
+ );
121
+
122
+ $creds = request_filesystem_credentials( $url, '', false, false, null );
123
+
124
+ // Check for file system permissions.
125
+ if ( false === $creds ) {
126
+ wp_send_json_error();
127
+ }
128
+
129
+ if ( ! WP_Filesystem( $creds ) ) {
130
+ wp_send_json_error();
131
+ }
132
+
133
+ self::require_files();
134
+
135
+ // Do not allow WordPress to search for translations as this will break JS output.
136
+ remove_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 );
137
+
138
+ // Create the plugin upgrader with our custom skin.
139
+ $installer = new PluginSilentUpgrader( new AIOSEOP_Install_Skin() );
140
+
141
+ if ( ! method_exists( $installer, 'install' ) || empty( $_POST['plugin'] ) ) {
142
+ wp_send_json_error();
143
+ }
144
+
145
+ $installer->install( $_POST['plugin'] );
146
+
147
+ // Flush the cache and return the installed plugin's basename.
148
+ wp_cache_flush();
149
+
150
+ $plugin_basename = $installer->plugin_info();
151
+
152
+ if ( $plugin_basename ) {
153
+
154
+ $activated = activate_plugin( $plugin_basename );
155
+
156
+ if ( ! is_wp_error( $activated ) ) {
157
+ wp_send_json_success(
158
+ array(
159
+ 'msg' => __( 'Plugin installed & activated.', 'all-in-one-seo-pack' ),
160
+ 'is_activated' => true,
161
+ 'basename' => $plugin_basename,
162
+ )
163
+ );
164
+ } else {
165
+ wp_send_json_success(
166
+ array(
167
+ 'msg' => __( 'Plugin installed.', 'all-in-one-seo-pack' ),
168
+ 'is_activated' => false,
169
+ 'basename' => $plugin_basename,
170
+ )
171
+ );
172
+ }
173
+ }
174
+
175
+ wp_send_json_error();
176
+ }
177
+
178
+ /**
179
+ * Activates a given plugin.
180
+ *
181
+ * Acts as a callback for our "wp_ajax_aioseop_activate_plugin" endpoint.
182
+ *
183
+ * @since 3.4.0
184
+ */
185
+ public static function activate_plugin() {
186
+
187
+ check_ajax_referer( 'aioseop-am-plugins', '_ajax_nonce' );
188
+
189
+ if ( ! current_user_can( 'administrator' ) ) {
190
+ wp_send_json_error();
191
+ }
192
+
193
+ if ( isset( $_POST['plugin'] ) ) {
194
+
195
+ $activate = activate_plugins( $_POST['plugin'] );
196
+
197
+ if ( ! is_wp_error( $activate ) ) {
198
+ wp_send_json_success(
199
+ array(
200
+ 'msg' => __( 'Plugin activated.', 'all-in-one-seo-pack' ),
201
+ )
202
+ );
203
+ }
204
+ }
205
+ }
206
+
207
+ /**
208
+ * Renders a given view on the About Us page.
209
+ *
210
+ * @since 3.4.0
211
+ */
212
+ private static function render_page() {
213
+ echo '<div id="aioseop-admin-about" class="wrap aioseop-admin-wrap">';
214
+
215
+ switch ( self::$view ) {
216
+ case 'about': {
217
+ self::output_tab_bar();
218
+ self::output_about_info();
219
+ self::output_about_addons();
220
+ break;
221
+ }
222
+ case 'versus': {
223
+ self::output_tab_bar();
224
+ self::output_versus_grid();
225
+ break;
226
+ }
227
+ }
228
+
229
+ echo '</div>';
230
+
231
+ }
232
+
233
+ /**
234
+ * Outputs the tab bar.
235
+ *
236
+ * @since 3.4.0
237
+ */
238
+ private static function output_tab_bar() {
239
+ $views = array(
240
+ 'About Us' => 'about',
241
+ );
242
+
243
+ if ( ! AIOSEOPPRO ) {
244
+ $views['Lite vs Pro'] = 'versus';
245
+ }
246
+
247
+ if ( 1 >= count( $views ) ) {
248
+ return;
249
+ }
250
+
251
+ echo '<ul class="aioseop-admin-tabs">';
252
+ foreach ( $views as $label => $view ) {
253
+ echo '<li>';
254
+ printf(
255
+ '<a href="%s" class="%s">%s</a>',
256
+ esc_url( admin_url( 'admin.php?page=aioseop-about&view=' . $view ) ),
257
+ ( $view === self::$view ) ? 'active' : '',
258
+ esc_html( $label )
259
+ );
260
+ echo '</li>';
261
+ }
262
+ echo '</ul>';
263
+ }
264
+
265
+ /**
266
+ * Outputs the About Us info section.
267
+ *
268
+ * @since 3.4.0
269
+ */
270
+ private static function output_about_info() {
271
+
272
+ ?>
273
+
274
+ <div class="aioseop-admin-about-section aioseop-admin-columns">
275
+
276
+ <div class="aioseop-admin-column-60">
277
+ <h3>
278
+ <?php
279
+ printf(
280
+ /* translators: %1$s: "All in One SEO Pack" */
281
+ __( 'Welcome to %1$s, the original SEO plugin for WordPress. At %2$s, we build software that helps you rank your website in search results and gain organic traffic.', 'all-in-one-seo-pack' ),
282
+ AIOSEOP_PLUGIN_NAME,
283
+ AIOSEOP_PLUGIN_NAME
284
+ );
285
+ ?>
286
+ </h3>
287
+
288
+ <p>
289
+ <?php esc_html_e( 'Over the years, we found that most other WordPress SEO plugins were bloated, buggy, slow, and very hard to use. So we designed our plugin as an easy and powerful tool.', 'all-in-one-seo-pack' ); ?>
290
+ </p>
291
+ <p>
292
+ <?php esc_html_e( 'Our goal is to take the pain out of optimizing your website for search engines.', 'all-in-one-seo-pack' ); ?>
293
+ </p>
294
+ <p>
295
+ <?php
296
+ printf(
297
+ wp_kses(
298
+ /* translators: %1$s: "All in One SEO Pack" - %2$s: hyperlink - %3$s: hyperlink - %4$s: hyperlink */
299
+ __( '%1$s is brought to you by Awesome Motive, the same team that’s behind the largest WordPress resource site, <a href="%2$s" target="_blank" rel="noopener noreferrer">WPBeginner</a>, the most popular lead-generation software, <a href="%3$s" target="_blank" rel="noopener noreferrer">OptinMonster</a>, the best WordPress analytics plugin, <a href="%4$s" target="_blank" rel="noopener noreferrer">MonsterInsights</a> and many more.', 'all-in-one-seo-pack' ),
300
+ array(
301
+ 'a' => array(
302
+ 'href' => array(),
303
+ 'rel' => array(),
304
+ 'target' => array(),
305
+ ),
306
+ )
307
+ ),
308
+ AIOSEOP_PLUGIN_NAME,
309
+ 'https://www.wpbeginner.com/?utm_source=WordPress&utm_medium=aioseop&utm_campaign=aioseop-about',
310
+ 'https://optinmonster.com/?utm_source=WordPress&utm_medium=aioseop&utm_campaign=aioseop-about',
311
+ 'https://www.monsterinsights.com/?utm_source=WordPress&utm_medium=aioseop&utm_campaign=aioseop-about'
312
+ );
313
+ ?>
314
+ </p>
315
+ <p>
316
+ <?php esc_html_e( 'Yup, we know a thing or two about building awesome products that customers love.', 'all-in-one-seo-pack' ); ?>
317
+ </p>
318
+ </div>
319
+
320
+ <div class="aioseop-admin-column-40 aioseop-admin-column-last">
321
+ <figure>
322
+ <img src="<?php echo AIOSEOP_PLUGIN_URL; ?>images/about/about-team.jpg" alt="<?php esc_attr_e( 'The Awesome Motive Team photo', 'all-in-one-seo-pack' ); ?>">
323
+ <figcaption>
324
+ <?php esc_html_e( 'The Awesome Motive Team', 'all-in-one-seo-pack' ); ?><br>
325
+ </figcaption>
326
+ </figure>
327
+ </div>
328
+
329
+ </div>
330
+ <?php
331
+ }
332
+
333
+ /**
334
+ * Outputs the About Us addon section.
335
+ *
336
+ * @since 3.4.0
337
+ */
338
+ private static function output_about_addons() {
339
+ $all_plugins = get_plugins();
340
+ $am_plugins = self::get_am_plugins();
341
+
342
+ ?>
343
+ <div id="aioseop-admin-addons">
344
+ <div class="addons-container">
345
+ <?php
346
+ foreach ( $am_plugins as $plugin => $details ) :
347
+
348
+ $plugin_data = self::get_plugin_data( $plugin, $details, $all_plugins );
349
+
350
+ ?>
351
+ <div class="addon-container">
352
+ <div class="addon-item">
353
+ <div class="details aioseop-clear">
354
+ <img src="<?php echo esc_url( $plugin_data['details']['icon'] ); ?>">
355
+ <h5 class="addon-name">
356
+ <?php echo esc_html( $plugin_data['details']['name'] ); ?>
357
+ </h5>
358
+ <p class="addon-desc">
359
+ <?php echo wp_kses_post( $plugin_data['details']['desc'] ); ?>
360
+ </p>
361
+ </div>
362
+ <div class="actions aioseop-clear">
363
+ <div class="status">
364
+ <strong>
365
+ <?php
366
+ printf(
367
+ esc_html__( 'Status: %s', 'all-in-one-seo-pack' ),
368
+ '<span class="status-label ' . esc_attr( $plugin_data['status_class'] ) . '">' . wp_kses_post( $plugin_data['status_text'] ) . '</span>'
369
+ );
370
+ ?>
371
+ </strong>
372
+ </div>
373
+ <div class="action-button">
374
+ <button class="<?php echo esc_attr( $plugin_data['action_class'] ); ?>" data-plugin="<?php echo esc_attr( $plugin_data['plugin_src'] ); ?>" data-type="plugin">
375
+ <?php echo wp_kses_post( $plugin_data['action_text'] ); ?>
376
+ </button>
377
+ </div>
378
+ </div>
379
+ </div>
380
+ </div>
381
+ <?php endforeach; ?>
382
+ </div>
383
+ </div>
384
+ <?php
385
+ }
386
+
387
+ /**
388
+ * Outputs the Lite vs Pro tab content.
389
+ *
390
+ * @since 3.4.0
391
+ */
392
+ private static function output_versus_grid() {
393
+ $license = 'Lite';
394
+ $next_license = 'Pro';
395
+
396
+ $license_features = array(
397
+ 'seo' => esc_html__( 'Search Engine Optimization (SEO)', 'all-in-one-seo-pack' ),
398
+ 'open_graph' => esc_html__( 'Social Meta (Open Graph Markup)', 'all-in-one-seo-pack' ),
399
+ 'woocommerce' => esc_html__( 'WooCommerce Integration', 'all-in-one-seo-pack' ),
400
+ 'xml_sitemap' => esc_html__( 'XML Sitemap', 'all-in-one-seo-pack' ),
401
+ 'video_sitemap' => esc_html__( 'Video XML Sitemap', 'all-in-one-seo-pack' ),
402
+ // 'news_sitemap' => esc_html__( 'News Sitemap', 'all-in-one-seo-pack' ),
403
+ 'google_tag_manager' => esc_html__( 'Google Tag Manager', 'all-in-one-seo-pack' ),
404
+ 'image_seo' => esc_html__( 'Image SEO', 'all-in-one-seo-pack' ),
405
+ 'schema' => esc_html__( 'Schema Rich Snippets', 'all-in-one-seo-pack' ),
406
+ 'support' => esc_html__( 'Customer Support', 'all-in-one-seo-pack' ),
407
+ );
408
+
409
+ ?>
410
+
411
+ <div class="aioseop-admin-about-section aioseop-admin-about-section-squashed">
412
+ <h1 class="centered">
413
+ <strong><?php echo esc_html( ucfirst( $license ) ); ?></strong> vs <strong><?php echo esc_html( $next_license ); ?></strong>
414
+ </h1>
415
+
416
+ <p class="centered">
417
+ <?php
418
+ /* translators: %s: "All in One SEO Pack" */
419
+ printf( __( 'Get the most out of %s by upgrading to Pro and unlocking all of the powerful features.', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME );
420
+ ?>
421
+ </p>
422
+ </div>
423
+
424
+ <div class="aioseop-admin-about-section aioseop-admin-about-section-squashed aioseop-admin-about-section-hero aioseop-admin-about-section-table">
425
+
426
+ <div class="aioseop-admin-about-section-hero-main aioseop-admin-columns">
427
+ <div class="aioseop-admin-column-33">
428
+ <h3 class="no-margin">
429
+ <?php esc_html_e( 'Feature', 'all-in-one-seo-pack' ); ?>
430
+ </h3>
431
+ </div>
432
+ <div class="aioseop-admin-column-33">
433
+ <h3 class="no-margin">
434
+ <?php echo esc_html( ucfirst( $license ) ); ?>
435
+ </h3>
436
+ </div>
437
+ <div class="aioseop-admin-column-33">
438
+ <h3 class="no-margin">
439
+ <?php echo esc_html( $next_license ); ?>
440
+ </h3>
441
+ </div>
442
+ </div>
443
+ <div class="aioseop-admin-about-section-hero-extra no-padding aioseop-admin-columns">
444
+
445
+ <table>
446
+ <?php
447
+ foreach ( $license_features as $slug => $name ) {
448
+ $current = self::get_license_data( $slug, $license );
449
+ $next = self::get_license_data( $slug, strtolower( $next_license ) );
450
+
451
+ if ( empty( $current ) || empty( $next ) ) {
452
+ continue;
453
+ }
454
+ ?>
455
+ <tr class="aioseop-admin-columns">
456
+ <td class="aioseop-admin-column-33">
457
+ <p><?php echo esc_html( $name ); ?></p>
458
+ </td>
459
+ <td class="aioseop-admin-column-33">
460
+ <?php if ( is_array( $current ) ) : ?>
461
+ <p class="features-<?php echo esc_attr( $current['status'] ); ?>">
462
+ <?php echo wp_kses_post( implode( '<br>', $current['text'] ) ); ?>
463
+ </p>
464
+ <?php endif; ?>
465
+ </td>
466
+ <td class="aioseop-admin-column-33">
467
+ <?php if ( is_array( $current ) ) : ?>
468
+ <p class="features-full">
469
+ <?php echo wp_kses_post( implode( '<br>', $next['text'] ) ); ?>
470
+ </p>
471
+ <?php endif; ?>
472
+ </td>
473
+ </tr>
474
+ <?php
475
+ }
476
+ ?>
477
+ </table>
478
+
479
+ </div>
480
+
481
+ </div>
482
+
483
+ <div class="aioseop-admin-about-section aioseop-admin-about-section-hero">
484
+ <div class="aioseop-admin-about-section-hero-main no-border">
485
+ <h3 class="call-to-action centered">
486
+ <?php
487
+ echo '<a href="' . aioseop_get_utm_url( 'lite-vs-pro' ) . '" target="_blank" rel="noopener noreferrer">';
488
+
489
+ printf(
490
+ /* translators: %s: "All in One SEO Pack Pro" */
491
+ sprintf( __( 'Get %s Today and Unlock all the Powerful Features', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME . '&nbsp;Pro' ),
492
+ esc_html( $next_license )
493
+ );
494
+ ?>
495
+ </a>
496
+ </h3>
497
+
498
+ <p class="centered">
499
+ <?php
500
+ echo wp_kses(
501
+ sprintf(
502
+ /* translators: %s: "All in One SEO Pack Lite" */
503
+ __( 'Bonus: %s users get <span class="price-20-off">30%% off regular price</span>, automatically applied at checkout.', 'all-in-one-seo-pack' ),
504
+ AIOSEOP_PLUGIN_NAME . '&nbsp;Lite'
505
+ ),
506
+ array(
507
+ 'span' => array(
508
+ 'class' => array(),
509
+ ),
510
+ )
511
+ );
512
+ ?>
513
+ </p>
514
+ </div>
515
+ </div>
516
+
517
+ <?php
518
+ }
519
+
520
+ private static function get_license_data( $feature, $license ) {
521
+
522
+ $license = strtolower( $license );
523
+
524
+ $data = array(
525
+ 'seo' => array(
526
+ 'lite' => array(
527
+ 'status' => 'partial',
528
+ 'text' => array(
529
+ '<strong>' . esc_html__( 'Limited Support', 'all-in-one-seo-pack' ) . '</strong>',
530
+ esc_html__( 'Posts, Pages and Custom Post Types Only', 'all-in-one-seo-pack' ),
531
+ ),
532
+ ),
533
+ 'pro' => array(
534
+ 'status' => 'full',
535
+ 'text' => array(
536
+ '<strong>' . esc_html__( 'Complete Support', 'all-in-one-seo-pack' ) . '</strong>',
537
+ esc_html__( 'Posts, Pages, Custom Post Types + Categories, Tags and Custom Taxonomies', 'all-in-one-seo-pack' ),
538
+ ),
539
+ ),
540
+ ),
541
+ 'open_graph' => array(
542
+ 'lite' => array(
543
+ 'status' => 'partial',
544
+ 'text' => array(
545
+ '<strong>' . esc_html__( 'Limited Support', 'all-in-one-seo-pack' ) . '</strong>',
546
+ esc_html__( 'Posts, Pages and Custom Post Types Only', 'all-in-one-seo-pack' ),
547
+ ),
548
+ ),
549
+ 'pro' => array(
550
+ 'status' => 'full',
551
+ 'text' => array(
552
+ '<strong>' . esc_html__( 'Complete Support', 'all-in-one-seo-pack' ) . '</strong>',
553
+ esc_html__( 'Posts, Pages, Custom Post Types + Categories, Tags and Custom Taxonomies', 'all-in-one-seo-pack' ),
554
+ ),
555
+ ),
556
+ ),
557
+ 'woocommerce' => array(
558
+ 'lite' => array(
559
+ 'status' => 'partial',
560
+ 'text' => array(
561
+ '<strong>' . esc_html__( 'Limited Support', 'all-in-one-seo-pack' ) . '</strong>',
562
+ esc_html__( 'WooCommerce Products Only', 'all-in-one-seo-pack' ),
563
+ ),
564
+ ),
565
+ 'pro' => array(
566
+ 'status' => 'full',
567
+ 'text' => array(
568
+ '<strong>' . esc_html__( 'Complete Support', 'all-in-one-seo-pack' ) . '</strong>',
569
+ esc_html__( 'WooCommerce Products, Product Categories, Product Tags and Other Product Attributes', 'all-in-one-seo-pack' ),
570
+ ),
571
+ ),
572
+ ),
573
+ 'xml_sitemap' => array(
574
+ 'lite' => array(
575
+ 'status' => 'partial',
576
+ 'text' => array(
577
+ '<strong>' . esc_html__( 'Limited Support', 'all-in-one-seo-pack' ) . '</strong>',
578
+ esc_html__( 'Basic Control of Sitemap Priority & Frequency', 'all-in-one-seo-pack' ),
579
+ ),
580
+ ),
581
+ 'pro' => array(
582
+ 'status' => 'full',
583
+ 'text' => array(
584
+ '<strong>' . esc_html__( 'Complete Support', 'all-in-one-seo-pack' ) . '</strong>',
585
+ esc_html__( 'Granular Control of Sitemap Priority & Frequency for Each Post, Page, Category, Tag, etc.', 'all-in-one-seo-pack' ),
586
+ ),
587
+ ),
588
+ ),
589
+ 'video_sitemap' => array(
590
+ 'lite' => array(
591
+ 'status' => 'none',
592
+ 'text' => array(
593
+ '<strong>' . esc_html__( 'Not Available', 'all-in-one-seo-pack' ) . '</strong>',
594
+ ),
595
+ ),
596
+ 'pro' => array(
597
+ 'status' => 'full',
598
+ 'text' => array(
599
+ '<strong>' . esc_html__( 'Submit Your Videos to Search Engines', 'all-in-one-seo-pack' ) . '</strong>',
600
+ ),
601
+ ),
602
+ ),
603
+ 'news_sitemap' => array(
604
+ 'lite' => array(
605
+ 'status' => 'none',
606
+ 'text' => array(
607
+ '<strong>' . esc_html__( 'Not Available', 'all-in-one-seo-pack' ) . '</strong>',
608
+ ),
609
+ ),
610
+ 'pro' => array(
611
+ 'status' => 'full',
612
+ 'text' => array(
613
+ '<strong>' . esc_html__( 'Submit Your Latest News Stories to Search Engines', 'all-in-one-seo-pack' ) . '</strong>',
614
+ ),
615
+ ),
616
+ ),
617
+ 'image_seo' => array(
618
+ 'lite' => array(
619
+ 'status' => 'none',
620
+ 'text' => array(
621
+ '<strong>' . esc_html__( 'Not Available', 'all-in-one-seo-pack' ) . '</strong>',
622
+ ),
623
+ ),
624
+ 'pro' => array(
625
+ 'status' => 'full',
626
+ 'text' => array(
627
+ '<strong>' . esc_html__( 'Control The Title & Alt Tag Attribute of Your Images', 'all-in-one-seo-pack' ) . '</strong>',
628
+ ),
629
+ ),
630
+ ),
631
+ 'google_tag_manager' => array(
632
+ 'lite' => array(
633
+ 'status' => 'none',
634
+ 'text' => array(
635
+ '<strong>' . esc_html__( 'Not Available', 'all-in-one-seo-pack' ) . '</strong>',
636
+ ),
637
+ ),
638
+ 'pro' => array(
639
+ 'status' => 'full',
640
+ 'text' => array(
641
+ '<strong>' . esc_html__( 'Connect to Google Tag Manager for Advanced Analytics', 'all-in-one-seo-pack' ) . '</strong>',
642
+ ),
643
+ ),
644
+ ),
645
+ 'schema' => array(
646
+ 'lite' => array(
647
+ 'status' => 'partial',
648
+ 'text' => array(
649
+ '<strong>' . esc_html__( 'Limited Support', 'all-in-one-seo-pack' ) . '</strong>',
650
+ esc_html__( 'Posts, Pages, Categories and Tags Only', 'all-in-one-seo-pack' ),
651
+ ),
652
+ ),
653
+ 'pro' => array(
654
+ 'status' => 'full',
655
+ 'text' => array(
656
+ '<strong>' . esc_html__( 'Complete Support', 'all-in-one-seo-pack' ) . '</strong>',
657
+ esc_html__( 'Posts, Pages, Categories, Tags + Breadcrumb Navigation', 'all-in-one-seo-pack' ),
658
+ ),
659
+ ),
660
+ ),
661
+ 'support' => array(
662
+ 'lite' => array(
663
+ 'status' => 'partial',
664
+ 'text' => array(
665
+ '<strong>' . esc_html__( 'Limited Support', 'all-in-one-seo-pack' ) . '</strong>',
666
+ ),
667
+ ),
668
+ 'pro' => array(
669
+ 'status' => 'full',
670
+ 'text' => array(
671
+ '<strong>' . esc_html__( 'Priority Support', 'all-in-one-seo-pack' ) . '</strong>',
672
+ ),
673
+ ),
674
+ ),
675
+ );
676
+
677
+ if ( ! isset( $data[ $feature ] ) ) {
678
+ return false;
679
+ }
680
+
681
+ if ( isset( $data[ $feature ][ $license ] ) ) {
682
+ return $data[ $feature ][ $license ];
683
+ }
684
+ }
685
+
686
+ /**
687
+ * Returns a list with all Awesome Motive plugins and their data.
688
+ *
689
+ * @since 3.4.0
690
+ *
691
+ * @return array
692
+ */
693
+ private static function get_am_plugins() {
694
+
695
+ $images_url = AIOSEOP_PLUGIN_URL . 'images/about/';
696
+
697
+ return array(
698
+
699
+ 'google-analytics-for-wordpress/googleanalytics.php' => array(
700
+ 'icon' => $images_url . 'plugin-mi.png',
701
+ 'name' => 'MonsterInsights',
702
+ 'desc' => esc_html__( 'MonsterInsights makes it “effortless” to properly connect your WordPress site with Google Analytics, so you can start making data-driven decisions to grow your business.', 'all-in-one-seo-pack' ),
703
+ 'url' => 'https://downloads.wordpress.org/plugin/google-analytics-for-wordpress.zip',
704
+ 'pro' => array(
705
+ 'plug' => 'google-analytics-premium/googleanalytics-premium.php',
706
+ 'icon' => $images_url . 'plugin-mi.png',
707
+ 'name' => 'MonsterInsights Pro',
708
+ 'desc' => esc_html__( 'MonsterInsights makes it “effortless” to properly connect your WordPress site with Google Analytics, so you can start making data-driven decisions to grow your business.', 'all-in-one-seo-pack' ),
709
+ 'url' => 'https://www.monsterinsights.com/?utm_source=proplugin&utm_medium=pluginheader&utm_campaign=pluginurl&utm_content=7%2E0%2E0',
710
+ 'act' => 'go-to-url',
711
+ ),
712
+ ),
713
+
714
+ 'optinmonster/optin-monster-wp-api.php' => array(
715
+ 'icon' => $images_url . 'plugin-om.png',
716
+ 'name' => 'OptinMonster',
717
+ 'desc' => esc_html__( 'Our high-converting optin forms like Exit-Intent® popups, Fullscreen Welcome Mats, and Scroll boxes help you dramatically boost conversions and get more email subscribers.', 'all-in-one-seo-pack' ),
718
+ 'url' => 'https://downloads.wordpress.org/plugin/optinmonster.zip',
719
+ ),
720
+
721
+ 'wp-mail-smtp/wp_mail_smtp.php' => array(
722
+ 'icon' => $images_url . 'plugin-smtp.png',
723
+ 'name' => 'WP Mail SMTP',
724
+ 'desc' => esc_html__( 'Make sure your website\'s emails reach the inbox. Our goal is to make email deliverability easy and reliable. Trusted by over 1 million websites.', 'all-in-one-seo-pack' ),
725
+ 'url' => 'https://downloads.wordpress.org/plugin/wp-mail-smtp.zip',
726
+ 'pro' => array(
727
+ 'plug' => 'wp-mail-smtp-pro/wp_mail_smtp.php',
728
+ 'icon' => $images_url . 'plugin-smtp.png',
729
+ 'name' => 'WP Mail SMTP Pro',
730
+ 'desc' => esc_html__( 'Make sure your website\'s emails reach the inbox. Our goal is to make email deliverability easy and reliable. Trusted by over 1 million websites.', 'all-in-one-seo-pack' ),
731
+ 'url' => 'https://wpmailsmtp.com/pricing/',
732
+ 'act' => 'go-to-url',
733
+ ),
734
+ ),
735
+
736
+ 'wpforms-lite/wpforms.php' => array(
737
+ 'icon' => $images_url . 'plugin-wpforms.png',
738
+ 'name' => 'WPForms',
739
+ 'desc' => esc_html__( 'WPForms allows you to create beautiful contact forms for your site in minutes, not hours!', 'all-in-one-seo-pack' ),
740
+ 'url' => 'https://downloads.wordpress.org/plugin/wpforms-lite.zip',
741
+ ),
742
+
743
+ 'rafflepress/rafflepress.php' => array(
744
+ 'icon' => $images_url . 'plugin-rp.png',
745
+ 'name' => 'RafflePress',
746
+ 'desc' => esc_html__( 'Turn your visitors into brand ambassadors! Easily grow your email list, website traffic, and social media followers with powerful viral giveaways & contests.', 'all-in-one-seo-pack' ),
747
+ 'url' => 'https://downloads.wordpress.org/plugin/rafflepress.zip',
748
+ 'pro' => array(
749
+ 'plug' => 'rafflepress-pro/rafflepress-pro.php',
750
+ 'icon' => $images_url . 'plugin-rp.png',
751
+ 'name' => 'RafflePress Pro',
752
+ 'desc' => esc_html__( 'Turn your visitors into brand ambassadors! Easily grow your email list, website traffic, and social media followers with powerful viral giveaways & contests.', 'all-in-one-seo-pack' ),
753
+ 'url' => 'https://rafflepress.com/pricing/',
754
+ 'act' => 'go-to-url',
755
+ ),
756
+ ),
757
+ );
758
+ }
759
+
760
+ /**
761
+ * Returns AM plugin data for the Addons section of the About Us tab.
762
+ *
763
+ * @since 3.4.0
764
+ *
765
+ * @param string $plugin The plugin slug.
766
+ * @param array $details The details of the plugin.
767
+ * @param array $all_plugins The list of all plugins.
768
+ *
769
+ * @return array
770
+ */
771
+ private static function get_plugin_data( $plugin, $details, $all_plugins ) {
772
+
773
+ $have_pro = ( ! empty( $details['pro'] ) && ! empty( $details['pro']['plug'] ) );
774
+ $show_pro = false;
775
+
776
+ $plugin_data = array();
777
+
778
+ if ( $have_pro ) {
779
+ if ( array_key_exists( $details['pro']['plug'], $all_plugins ) ) {
780
+ if ( is_plugin_active( $details['pro']['plug'] ) ) {
781
+ $show_pro = true;
782
+ }
783
+ }
784
+ if ( $show_pro ) {
785
+ $plugin = $details['pro']['plug'];
786
+ $details = $details['pro'];
787
+ }
788
+ }
789
+
790
+ if ( array_key_exists( $plugin, $all_plugins ) ) {
791
+ if ( is_plugin_active( $plugin ) ) {
792
+
793
+ // Status text/status.
794
+ $plugin_data['status_class'] = 'status-active';
795
+ $plugin_data['status_text'] = esc_html__( 'Active', 'all-in-one-seo-pack' );
796
+
797
+ // Button text/status.
798
+ $plugin_data['action_class'] = $plugin_data['status_class'] . ' button button-secondary disabled';
799
+ $plugin_data['action_text'] = esc_html__( 'Activated', 'all-in-one-seo-pack' );
800
+ $plugin_data['plugin_src'] = esc_attr( $plugin );
801
+ } else {
802
+
803
+ // Status text/status.
804
+ $plugin_data['status_class'] = 'status-inactive';
805
+ $plugin_data['status_text'] = esc_html__( 'Inactive', 'all-in-one-seo-pack' );
806
+
807
+ // Button text/status.
808
+ $plugin_data['action_class'] = $plugin_data['status_class'] . ' button button-secondary';
809
+ $plugin_data['action_text'] = esc_html__( 'Activate', 'all-in-one-seo-pack' );
810
+ $plugin_data['plugin_src'] = esc_attr( $plugin );
811
+ }
812
+ } else {
813
+ // Doesn't exist, install.
814
+ // Status text/status.
815
+ $plugin_data['status_class'] = 'status-download';
816
+ if ( isset( $details['act'] ) && 'go-to-url' === $details['act'] ) {
817
+ $plugin_data['status_class'] = 'status-go-to-url';
818
+ }
819
+ $plugin_data['status_text'] = esc_html__( 'Not Installed', 'all-in-one-seo-pack' );
820
+ // Button text/status.
821
+ $plugin_data['action_class'] = $plugin_data['status_class'] . ' button button-primary';
822
+ $plugin_data['action_text'] = esc_html__( 'Install Plugin', 'all-in-one-seo-pack' );
823
+ $plugin_data['plugin_src'] = esc_url( $details['url'] );
824
+ }
825
+
826
+ $plugin_data['details'] = $details;
827
+
828
+ return $plugin_data;
829
+ }
830
+ }
inc/admin/views/class-aioseop-flyout.php ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * AIOSEOP_FLyout
4
+ *
5
+ * @package All-in-One-SEO-Pack
6
+ * @since 3.4.0
7
+ */
8
+
9
+ /**
10
+ * Handles our flyout menu.
11
+ *
12
+ * @since
13
+ */
14
+ class AIOSEOP_Flyout {
15
+
16
+ /**
17
+ * Initializes the code.
18
+ *
19
+ * @since 3.4.0
20
+ */
21
+ public static function init() {
22
+ if ( ! is_admin() ) {
23
+ return;
24
+ }
25
+
26
+ if ( ! apply_filters( 'aioseop_admin_flyout_menu', true ) ) {
27
+ return;
28
+ }
29
+
30
+ add_action( 'admin_enqueue_scripts', array( 'AIOSEOP_Flyout', 'enqueue_files' ) );
31
+ add_action( 'admin_footer', array( 'AIOSEOP_Flyout', 'output_flyout_menu' ) );
32
+ }
33
+
34
+ /**
35
+ * Enqueues the required files.
36
+ *
37
+ * @since 3.4.0
38
+ */
39
+ public static function enqueue_files() {
40
+ if ( ! in_array( get_current_screen()->id, aioseop_get_admin_screens() ) ) {
41
+ return;
42
+ }
43
+
44
+ wp_enqueue_style(
45
+ 'aioseop-flyout',
46
+ AIOSEOP_PLUGIN_URL . 'css/admin/aioseop-flyout.css',
47
+ array(),
48
+ AIOSEOP_VERSION
49
+ );
50
+
51
+ wp_enqueue_script(
52
+ 'aioseop-flyout',
53
+ AIOSEOP_PLUGIN_URL . 'js/admin/aioseop-flyout.js',
54
+ array(),
55
+ AIOSEOP_VERSION,
56
+ false
57
+ );
58
+ }
59
+
60
+ /**
61
+ * Outputs our flyout menu.
62
+ *
63
+ * @since 3.4.0
64
+ */
65
+ public static function output_flyout_menu() {
66
+ if ( ! in_array( get_current_screen()->id, aioseop_get_admin_screens() ) ) {
67
+ return;
68
+ }
69
+
70
+ printf(
71
+ '<div id="aioseop-flyout">
72
+ <div id="aioseop-flyout-items">
73
+ %1$s
74
+ </div>
75
+ <a href="#" class="aioseop-flyout-button aioseop-flyout-head">
76
+ <div class="aioseop-flyout-label">%2$s</div>
77
+ <img src="%3$s" alt="%2$s" data-active="%4$s" />
78
+ </a>
79
+ </div>',
80
+ self::get_items_html(), // phpcs:ignore
81
+ esc_attr__( 'See Quick Links', 'all-in-one-seo-pack' ),
82
+ esc_url( AIOSEOP_PLUGIN_URL . 'images/flyout/gear-default.png' ),
83
+ esc_url( AIOSEOP_PLUGIN_URL . 'images/flyout/gear-default.png' )
84
+ );
85
+ }
86
+
87
+ /**
88
+ * Returns the HTML markup for our flyout menu items.
89
+ *
90
+ * @since 3.4.0
91
+ *
92
+ * @return string $items_html
93
+ */
94
+ private static function get_items_html() {
95
+
96
+ $items = array_reverse( self::menu_items() );
97
+ $items_html = '';
98
+
99
+ foreach ( $items as $item_key => $item ) {
100
+ $items_html .= sprintf(
101
+ '<a href="%1$s" target="_blank" rel="noopener noreferrer" class="aioseop-flyout-button aioseop-flyout-item aioseop-flyout-item-%2$d"%5$s%6$s>
102
+ <div class="aioseop-flyout-label">%3$s</div>
103
+ <img src="' . AIOSEOP_PLUGIN_URL . 'images/flyout/' . $item['icon'] . '.svg"/>
104
+ </a>',
105
+ esc_url( $item['url'] ),
106
+ (int) $item_key,
107
+ esc_html( $item['title'] ),
108
+ sanitize_html_class( $item['icon'] ),
109
+ ! empty( $item['bgcolor'] ) ? ' style="background-color: ' . esc_attr( $item['bgcolor'] ) . '"' : '',
110
+ ! empty( $item['hover_bgcolor'] ) ? ' onMouseOver="this.style.backgroundColor=\'' . esc_attr( $item['hover_bgcolor'] ) . '\'" onMouseOut="this.style.backgroundColor=\'' . esc_attr( $item['bgcolor'] ) . '\'"' : ''
111
+ );
112
+ }
113
+
114
+ return $items_html;
115
+ }
116
+
117
+ /**
118
+ * Returns a list of items for our flyout menu.
119
+ *
120
+ * @since 3.4.0
121
+ *
122
+ * @return array
123
+ */
124
+ private static function menu_items() {
125
+ $medium = ( AIOSEOPPRO ) ? 'proplugin' : 'liteplugin';
126
+ $utm_campaign = 'flyout-menu';
127
+
128
+ $items = array(
129
+ array(
130
+ 'title' => sprintf( __( 'Upgrade to All in One SEO Pack Pro', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME . '&nbsp;Pro' ),
131
+ 'url' => aioseop_get_utm_url( $utm_campaign, 'WordPress', $medium ) . '&utm_content=Upgrade',
132
+ 'icon' => 'star-solid',
133
+ 'bgcolor' => '#E1772F',
134
+ 'hover_bgcolor' => '#ff8931',
135
+ ),
136
+ array(
137
+ 'title' => esc_html__( 'Support & Docs', 'all-in-one-seo-pack' ),
138
+ 'url' => 'https://semperplugins.com/documentation/?utm_source=WordPress&utm_medium=' . $medium . '&utm_campaign=' . $utm_campaign . '&utm_content=Support',
139
+ 'icon' => 'life-ring-regular',
140
+ ),
141
+ array(
142
+ 'title' => esc_html__( 'Join Our Community', 'all-in-one-seo-pack' ),
143
+ 'url' => 'https://www.facebook.com/groups/wpbeginner/',
144
+ 'icon' => 'comments-solid',
145
+ ),
146
+ array(
147
+ 'title' => esc_html__( 'Suggest a Feature', 'all-in-one-seo-pack' ),
148
+ 'url' => 'https://semperplugins.com/suggest-a-feature/?utm_source=WordPress&utm_medium=' . $medium . '&utm_campaign=' . $utm_campaign . '&utm_content=Feature',
149
+ 'icon' => 'lightbulb-regular',
150
+ ),
151
+ );
152
+
153
+ if ( AIOSEOPPRO ) {
154
+ array_shift( $items );
155
+ }
156
+
157
+ return $items;
158
+ }
159
+ }
inc/aioseop_functions.php CHANGED
@@ -202,11 +202,11 @@ if ( ! function_exists( 'aioseop_addmycolumns' ) ) {
202
  add_filter( 'manage_posts_columns', 'aioseop_mrt_pcolumns' );
203
  }
204
  if ( 'attachment' === $post_type ) {
205
- add_action( 'manage_media_custom_column', 'aioseop_mrt_pccolumn', 10, 2 );
206
  } elseif ( is_post_type_hierarchical( $post_type ) ) {
207
- add_action( 'manage_pages_custom_column', 'aioseop_mrt_pccolumn', 10, 2 );
208
  } else {
209
- add_action( 'manage_posts_custom_column', 'aioseop_mrt_pccolumn', 10, 2 );
210
  }
211
  }
212
  }
@@ -242,7 +242,7 @@ if ( ! function_exists( 'aioseop_admin_head' ) ) {
242
  * @since ?
243
  */
244
  function aioseop_admin_head() {
245
- wp_enqueue_script( 'aioseop_welcome_js', AIOSEOP_PLUGIN_URL . 'js/quickedit_functions.js', array( 'jquery' ), AIOSEOP_VERSION );
246
  ?>
247
  <style>
248
  .aioseop_mpc_admin_meta_options {
@@ -295,7 +295,13 @@ if ( ! function_exists( 'aioseop_admin_head' ) ) {
295
  pleaseWait: "<?php _e( 'Please wait...', 'all-in-one-seo-pack' ); ?>",
296
  slugEmpty: "<?php _e( 'Slug may not be empty!', 'all-in-one-seo-pack' ); ?>",
297
  Revisions: "<?php _e( 'Revisions', 'all-in-one-seo-pack' ); ?>",
298
- Time: "<?php _e( 'Insert time', 'all-in-one-seo-pack' ); ?>"
 
 
 
 
 
 
299
  }
300
  //]]>
301
  </script>
@@ -386,55 +392,6 @@ if ( ! function_exists( 'aioseop_output_dismissable_notice' ) ) {
386
  }
387
  }
388
 
389
- if ( ! function_exists( 'aioseop_ajax_save_meta' ) ) {
390
-
391
- /**
392
- * AIOSEOP AJAX Save Meta
393
- */
394
- function aioseop_ajax_save_meta() {
395
- if ( ! empty( $_POST['_inline_edit'] ) && ( 'undefined' !== $_POST['_inline_edit'] ) ) {
396
- check_ajax_referer( 'inlineeditnonce', '_inline_edit' );
397
- }
398
- $post_id = intval( $_POST['post_id'] );
399
- $new_meta = strip_tags( $_POST['new_meta'] );
400
- $target = $_POST['target_meta'];
401
- check_ajax_referer( 'aioseop_meta_' . $target . '_' . $post_id, '_nonce' );
402
- $result = '';
403
- if ( in_array(
404
- $target,
405
- array(
406
- 'title',
407
- 'description',
408
- 'keywords',
409
- )
410
- ) && current_user_can( 'edit_post', $post_id )
411
- ) {
412
- update_post_meta( $post_id, '_aioseop_' . $target, esc_attr( $new_meta ) );
413
- $result = get_post_meta( $post_id, '_aioseop_' . $target, true );
414
- } else {
415
- die();
416
- }
417
- if ( '' != $result ) :
418
- $label = "<label id='aioseop_label_{$target}_{$post_id}' class='aioseop-label-quickedit' for='{$target}editlink{$post_id}'>" . $result . '</label>';
419
- else :
420
- $label = "<label id='aioseop_label_{$target}_{$post_id}' class='aioseop-label-quickedit' for='{$target}editlink{$post_id}'></label><strong><i>" . __( 'No', 'all-in-one-seo-pack' ) . ' ' . $target . '</i></strong>';
421
- endif;
422
- $nonce = wp_create_nonce( "aioseop_meta_{$target}_{$post_id}" );
423
- $output = '<a id="' . $target . 'editlink' . $post_id . '" '
424
- . 'class="aioseop_edit_link aioseop-icon-cog-edit" '
425
- . 'href="javascript:void(0);" '
426
- . 'onclick=\'aioseop_ajax_edit_meta_form(' . $post_id . ', "' . $target . '", "' . $nonce . '");return false;\' '
427
- . 'title="' . __( 'Edit', 'all-in-one-seo-pack' ) . '"></a>';
428
- $output .= $label;
429
- die(
430
- "jQuery('div#aioseop_" . $target . '_' . $post_id . "').fadeOut('fast', function() {
431
- var my_label = " . json_encode( $output ) . ";
432
- jQuery('div#aioseop_" . $target . '_' . $post_id . "').html(my_label).fadeIn('fast');
433
- });"
434
- );
435
- }
436
- }
437
-
438
  if ( ! function_exists( 'aioseop_ajax_init' ) ) {
439
 
440
  /**
@@ -514,7 +471,11 @@ if ( ! function_exists( 'aioseop_ajax_save_url' ) ) {
514
  } elseif ( ! empty( $_POST['settings'] ) && ( 'news_sitemap_addl_pages' === $_POST['settings'] ) ) {
515
  $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_News_Sitemap' );
516
  } else {
517
- $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_Sitemap' );
 
 
 
 
518
  }
519
  $_POST['location'] = null;
520
  $_POST['Submit'] = 'ajax';
@@ -561,7 +522,10 @@ if ( ! function_exists( 'aioseop_ajax_delete_url' ) ) {
561
  global $aiosp, $aioseop_modules;
562
  aioseop_load_modules();
563
  $aiosp->admin_menu();
564
- $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_Sitemap' );
 
 
 
565
  $_POST['location'] = null;
566
  $_POST['Submit'] = 'ajax';
567
  $module->add_page_hooks();
@@ -812,57 +776,151 @@ if ( ! function_exists( 'aioseop_ajax_get_menu_links' ) ) {
812
  }
813
  }
814
 
815
- if ( ! function_exists( 'aioseop_mrt_pccolumn' ) ) {
816
 
817
  /**
818
- * AIOSEOP (MRT) Column
819
  *
820
- * @since ?
 
 
 
821
  *
822
- * @param $aioseopcn
823
- * @param $aioseoppi
824
  */
825
- function aioseop_mrt_pccolumn( $aioseopcn, $aioseoppi ) {
826
- $id = $aioseoppi;
827
- $target = null;
828
- if ( 'seotitle' === $aioseopcn ) {
829
- $target = 'title';
 
 
830
  }
831
- if ( 'seokeywords' === $aioseopcn ) {
832
- $target = 'keywords';
 
 
 
 
 
 
 
 
 
833
  }
834
- if ( 'seodesc' === $aioseopcn ) {
835
- $target = 'description';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
836
  }
837
- if ( ! $target ) {
838
- return;
 
839
  }
840
- if ( current_user_can( 'edit_post', $id ) ) {
841
- ?>
842
- <div class="aioseop_mpc_admin_meta_container">
843
- <div
844
- class="aioseop_mpc_admin_meta_options"
845
- id="aioseop_<?php print $target; ?>_<?php echo $id; ?>"
846
- style="float:left;">
847
- <?php
848
- $content = strip_tags( stripslashes( get_post_meta( $id, '_aioseop_' . $target, true ) ) );
849
- if ( ! empty( $content ) ) :
850
- $label = "<label id='aioseop_label_{$target}_{$id}' class='aioseop-label-quickedit'>" . $content . '</label>';
851
- else :
852
- $label = "<label id='aioseop_label_{$target}_{$id}' class='aioseop-label-quickedit'></label><strong><i>" . __( 'No', 'all-in-one-seo-pack' ) . ' ' . $target . '</i></strong>';
853
- endif;
854
- $nonce = wp_create_nonce( "aioseop_meta_{$target}_{$id}" );
855
- echo '<a id="' . $target . 'editlink' . $id . '" '
856
- . 'class="aioseop_edit_link aioseop-icon-cog-edit" '
857
- . 'href="javascript:void(0);" '
858
- . 'onclick=\'aioseop_ajax_edit_meta_form(' . $id . ', "' . $target . '", "' . $nonce . '");return false;\' '
859
- . 'title="' . __( 'Edit', 'all-in-one-seo-pack' ) . '"></a>';
860
- echo $label;
861
- ?>
862
- </div>
863
- </div>
864
- <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
865
  }
 
 
866
  }
867
  }
868
 
@@ -1278,6 +1336,7 @@ function aioseop_do_shortcodes( $content ) {
1278
  'WooCommerce Checkout' => '[woocommerce_checkout]',
1279
  'WooCommerce Order Tracking' => '[woocommerce_order_tracking]',
1280
  'WooCommerce Cart' => '[woocommerce_cart]',
 
1281
  );
1282
 
1283
  $rtn_conflict_shortcodes = array();
@@ -1397,3 +1456,92 @@ function get_major_version( $version ) {
1397
 
1398
  return $major_version;
1399
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
202
  add_filter( 'manage_posts_columns', 'aioseop_mrt_pcolumns' );
203
  }
204
  if ( 'attachment' === $post_type ) {
205
+ add_action( 'manage_media_custom_column', 'render_seo_column', 10, 2 );
206
  } elseif ( is_post_type_hierarchical( $post_type ) ) {
207
+ add_action( 'manage_pages_custom_column', 'render_seo_column', 10, 2 );
208
  } else {
209
+ add_action( 'manage_posts_custom_column', 'render_seo_column', 10, 2 );
210
  }
211
  }
212
  }
242
  * @since ?
243
  */
244
  function aioseop_admin_head() {
245
+ wp_enqueue_script( 'aioseop-quickedit', AIOSEOP_PLUGIN_URL . 'js/admin/aioseop-quickedit.js', array( 'jquery' ), AIOSEOP_VERSION );
246
  ?>
247
  <style>
248
  .aioseop_mpc_admin_meta_options {
295
  pleaseWait: "<?php _e( 'Please wait...', 'all-in-one-seo-pack' ); ?>",
296
  slugEmpty: "<?php _e( 'Slug may not be empty!', 'all-in-one-seo-pack' ); ?>",
297
  Revisions: "<?php _e( 'Revisions', 'all-in-one-seo-pack' ); ?>",
298
+ Time: "<?php _e( 'Insert time', 'all-in-one-seo-pack' ); ?>",
299
+ i18n: {
300
+ save: "<?php _e( 'Save', 'all-in-one-seo-pack' ); ?>",
301
+ cancel: "<?php _e( 'Cancel', 'all-in-one-seo-pack' ); ?>",
302
+ wait: "<?php _e( 'Please wait...', 'all-in-one-seo-pack' ); ?>",
303
+ noValue: "<?php _e( 'No value', 'all-in-one-seo-pack' ); ?>"
304
+ }
305
  }
306
  //]]>
307
  </script>
392
  }
393
  }
394
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
395
  if ( ! function_exists( 'aioseop_ajax_init' ) ) {
396
 
397
  /**
471
  } elseif ( ! empty( $_POST['settings'] ) && ( 'news_sitemap_addl_pages' === $_POST['settings'] ) ) {
472
  $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_News_Sitemap' );
473
  } else {
474
+ if ( AIOSEOPPRO ) {
475
+ $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_Sitemap_Pro' );
476
+ } else {
477
+ $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_Sitemap' );
478
+ }
479
  }
480
  $_POST['location'] = null;
481
  $_POST['Submit'] = 'ajax';
522
  global $aiosp, $aioseop_modules;
523
  aioseop_load_modules();
524
  $aiosp->admin_menu();
525
+ $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_Sitemap' );
526
+ if ( AIOSEOPPRO ) {
527
+ $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_Sitemap_Pro' );
528
+ }
529
  $_POST['location'] = null;
530
  $_POST['Submit'] = 'ajax';
531
  $module->add_page_hooks();
776
  }
777
  }
778
 
779
+ if ( ! function_exists( 'render_seo_column' ) ) {
780
 
781
  /**
782
+ * Generates the content for a given SEO column.
783
  *
784
+ * @since 3.4.0 Added support for image title attribute and alt tag attribute. Refactored + renamed function to better reflect purpose.
785
+ *
786
+ * @param string $column_name The name of the column.
787
+ * @param int $post_id The ID of the post.
788
  *
789
+ * @return void
 
790
  */
791
+ function render_seo_column( $column_name, $post_id ) {
792
+ $name = '';
793
+ $value = '';
794
+ $label = '';
795
+
796
+ if ( ! current_user_can( 'edit_post', $post_id ) && ! current_user_can( 'manage_aiosp' ) ) {
797
+ return;
798
  }
799
+
800
+ $post_type = get_post_type( $post_id );
801
+
802
+ if ( 'attachment' === $post_type ) {
803
+ $image_seo_columns = array( 'image_title', 'image_alt_tag' );
804
+ $supported_mime_types = array( 'image/jpeg', 'image/jpg', 'image/png', 'image/gif' );
805
+ $mime_type = get_post_mime_type( $post_id );
806
+
807
+ if ( in_array( $column_name, $image_seo_columns ) && ! in_array( $mime_type, $supported_mime_types ) ) {
808
+ return;
809
+ }
810
  }
811
+
812
+ switch ( $column_name ) {
813
+ case 'seotitle': {
814
+ $name = __( 'title', 'all-in-one-seo-pack' );
815
+ $value = get_post_meta( $post_id, '_aioseop_title', true );
816
+ break;
817
+ }
818
+ case 'seodesc': {
819
+ $name = __( 'description', 'all-in-one-seo-pack' );
820
+ $value = get_post_meta( $post_id, '_aioseop_description', true );
821
+ break;
822
+ }
823
+ case 'seokeywords': {
824
+ $name = __( 'keywords', 'all-in-one-seo-pack' );
825
+ $value = get_post_meta( $post_id, '_aioseop_keywords', true );
826
+ break;
827
+ }
828
+ case 'image_title': {
829
+ $name = __( 'image_title', 'all-in-one-seo-pack' );
830
+ $value = get_the_title( get_post( $post_id ) );
831
+ break;
832
+ }
833
+ case 'image_alt_tag': {
834
+ $name = __( 'image_alt_tag', 'all-in-one-seo-pack' );
835
+ $value = get_post_meta( $post_id, '_wp_attachment_image_alt', true );
836
+ break;
837
+ }
838
+ default: {
839
+ return;
840
+ }
841
  }
842
+
843
+ if ( empty( $value ) ) {
844
+ $value = sprintf( '<strong>%s</strong>', sprintf( __( 'No value', 'all-in-one-seo-pack' ), str_replace( '_', ' ', $name ) ) );
845
  }
846
+
847
+ $span = "<span id='aioseop_{$column_name}_{$post_id}_value'>" . trim( $value ) . '</span>';
848
+ $nonce = wp_create_nonce( "aioseop_meta_{$column_name}_{$post_id}" );
849
+
850
+ ?>
851
+ <div id="<?php echo "aioseop_${column_name}_${post_id}"; ?>" class="aioseop_mpc_admin_meta_options aio_editing">
852
+ <a
853
+ class="dashicons dashicons-edit aioseop-quickedit-pencil"
854
+ href="javascript:void(0);"
855
+ onclick="<?php printf( 'aioseopQuickEdit.aioseop_ajax_edit_meta_form(%s, \'%s\', \'%s\'); return false;', $post_id, $column_name, $nonce ); ?>"
856
+ title="<?php _e( 'Edit', 'all-in-one-seo-pack' ); ?>"
857
+ >
858
+ </a><?php echo $span; ?></div>
859
+ <?php
860
+ }
861
+ }
862
+
863
+ if ( ! function_exists( 'aioseop_ajax_save_meta' ) ) {
864
+
865
+ /**
866
+ * Updates the post meta value for a given key.
867
+ *
868
+ * @since 3.4.0 Added support for image title attribute and alt tag attribute. Refactored.
869
+ */
870
+ function aioseop_ajax_save_meta() {
871
+ $post_id = intval( $_POST['post_id'] );
872
+ $value = sanitize_text_field( $_POST['value'] );
873
+ $key = $_POST['key'];
874
+
875
+ check_ajax_referer( "aioseop_meta_${key}_${post_id}" );
876
+
877
+ $allowed_attributes = array(
878
+ 'seotitle',
879
+ 'seodesc',
880
+ 'seokeywords',
881
+ 'image_title',
882
+ 'image_alt_tag',
883
+ );
884
+
885
+ $result = '';
886
+
887
+ if ( ! current_user_can( 'edit_post', $post_id ) && ! current_user_can( 'manage_aiosp' ) ) {
888
+ die();
889
+ }
890
+
891
+ if ( ! in_array( $key, $allowed_attributes ) ) {
892
+ die();
893
+ }
894
+
895
+ switch ( $key ) {
896
+ case 'seotitle': {
897
+ $key = '_aioseop_title';
898
+ break;
899
+ }
900
+ case 'seodesc': {
901
+ $key = '_aioseop_description';
902
+ break;
903
+ }
904
+ case 'seokeywords': {
905
+ $key = '_aioseop_keywords';
906
+ break;
907
+ }
908
+ case 'image_title': {
909
+ wp_update_post(
910
+ array(
911
+ 'ID' => $post_id,
912
+ 'post_title' => $value,
913
+ )
914
+ );
915
+ die();
916
+ }
917
+ case 'image_alt_tag': {
918
+ $key = '_wp_attachment_image_alt';
919
+ break;
920
+ }
921
  }
922
+
923
+ update_post_meta( $post_id, $key, $value );
924
  }
925
  }
926
 
1336
  'WooCommerce Checkout' => '[woocommerce_checkout]',
1337
  'WooCommerce Order Tracking' => '[woocommerce_order_tracking]',
1338
  'WooCommerce Cart' => '[woocommerce_cart]',
1339
+ 'WooCommerce Registration' => '[wwp_registration_form]',
1340
  );
1341
 
1342
  $rtn_conflict_shortcodes = array();
1456
 
1457
  return $major_version;
1458
  }
1459
+
1460
+ if ( ! function_exists( 'aioseop_get_admin_screens' ) ) {
1461
+
1462
+ /**
1463
+ * Returns a list with our admin screens.
1464
+ *
1465
+ * @since 3.4.0
1466
+ *
1467
+ * @return array A key-value array with our admin screens.
1468
+ */
1469
+ function aioseop_get_admin_screens() {
1470
+ return array(
1471
+ 'General Settings' => 'toplevel_page_' . AIOSEOP_PLUGIN_DIRNAME . '/aioseop_class',
1472
+ 'Performance' => 'all-in-one-seo_page_' . AIOSEOP_PLUGIN_DIRNAME . '/modules/aioseop_performance',
1473
+ 'XML Sitemap' => AIOSEOPPRO ? 'all-in-one-seo_page_' . AIOSEOP_PLUGIN_DIRNAME . '/pro/class-aioseop-pro-sitemap' : 'all-in-one-seo_page_' . AIOSEOP_PLUGIN_DIRNAME . '/modules/aioseop_sitemap',
1474
+ 'Social Meta' => 'all-in-one-seo_page_aiosp_opengraph',
1475
+ 'Robots Generator' => 'all-in-one-seo_page_aiosp_robots_generator',
1476
+ 'Robots.txt' => 'all-in-one-seo_page_' . AIOSEOP_PLUGIN_DIRNAME . '/modules/aioseop_robots',
1477
+ 'File Editor' => 'all-in-one-seo_page_' . AIOSEOP_PLUGIN_DIRNAME . '/modules/aioseop_file_editor',
1478
+ 'Importer/Exporter' => 'all-in-one-seo_page_' . AIOSEOP_PLUGIN_DIRNAME . '/modules/aioseop_importer_exporter',
1479
+ 'Bad Robots Blocker' => 'all-in-one-seo_page_' . AIOSEOP_PLUGIN_DIRNAME . '/modules/aioseop_bad_robots',
1480
+ 'Feature Manager' => 'all-in-one-seo_page_' . AIOSEOP_PLUGIN_DIRNAME . '/modules/aioseop_feature_manager',
1481
+ 'Video Sitemap' => 'all-in-one-seo_page_' . AIOSEOP_PLUGIN_DIRNAME . '/pro/video_sitemap',
1482
+ 'Image SEO' => 'all-in-one-seo_page_aiosp_image_seo',
1483
+ 'About Us' => 'all-in-one-seo_page_aioseop-about',
1484
+ );
1485
+ }
1486
+ }
1487
+
1488
+ if ( ! function_exists( 'aioseop_get_utm_url' ) ) {
1489
+
1490
+ /**
1491
+ * Returns a UTM structured URL to our product page.
1492
+ *
1493
+ * @since 3.4.0
1494
+ *
1495
+ * @param string $medium
1496
+ * @param string $source
1497
+ * @param string $campaign
1498
+ *
1499
+ * @return string $href
1500
+ */
1501
+ function aioseop_get_utm_url( $medium, $source = 'WordPress', $campaign = 'liteplugin' ) {
1502
+
1503
+ $href = 'https://semperplugins.com/all-in-one-seo-pack-pro-version/';
1504
+
1505
+ $href = add_query_arg(
1506
+ array(
1507
+ 'utm_source' => $source,
1508
+ 'utm_campaign' => $campaign,
1509
+ 'utm_medium' => $medium,
1510
+ ),
1511
+ $href
1512
+ );
1513
+
1514
+ return $href;
1515
+ }
1516
+ }
1517
+
1518
+ if ( ! function_exists( 'aioseop_get_site_logo_url' ) ) {
1519
+ /**
1520
+ * Returns the URL of the site logo if it exists.
1521
+ *
1522
+ * @since 3.4.0
1523
+ *
1524
+ * @return string
1525
+ */
1526
+ function aioseop_get_site_logo_url() {
1527
+ if ( ! get_theme_support( 'custom-logo' ) ) {
1528
+ return false;
1529
+ }
1530
+
1531
+ $custom_logo_id = get_theme_mod( 'custom_logo' );
1532
+ $image = wp_get_attachment_image_src( $custom_logo_id, 'full' );
1533
+
1534
+ if ( empty( $image ) ) {
1535
+ return false;
1536
+ }
1537
+
1538
+ return $image[0];
1539
+ }
1540
+ }
1541
+
1542
+ if ( ! function_exists( 'aioseop_filter_styles' ) ) {
1543
+ function aioseop_filter_styles( $styles ) {
1544
+ $styles[] = 'display';
1545
+ return $styles;
1546
+ }
1547
+ }
inc/aioseop_updates_class.php CHANGED
@@ -133,12 +133,6 @@ class AIOSEOP_Updates {
133
  $this->sitemap_excl_terms_201905();
134
  }
135
 
136
- if (
137
- version_compare( $old_version, '3.0.3', '<' )
138
- ) {
139
- $this->reset_review_notice_201906();
140
- }
141
-
142
  if (
143
  version_compare( $old_version, '3.1', '<' )
144
  ) {
@@ -348,18 +342,6 @@ class AIOSEOP_Updates {
348
  }
349
  }
350
 
351
- /**
352
- * Removes Review Plugin Notice
353
- *
354
- * @since 3.0.3
355
- */
356
- public function reset_review_notice_201906() {
357
- global $aioseop_notices;
358
-
359
- $aioseop_notices->reset_notice( 'review_plugin' );
360
- $aioseop_notices->remove_notice( 'review_plugin' );
361
- }
362
-
363
  /**
364
  * Flushes rewrite rules for XML Sitemap URL changes
365
  *
@@ -421,5 +403,3 @@ class AIOSEOP_Updates {
421
  }
422
 
423
  }
424
-
425
-
133
  $this->sitemap_excl_terms_201905();
134
  }
135
 
 
 
 
 
 
 
136
  if (
137
  version_compare( $old_version, '3.1', '<' )
138
  ) {
342
  }
343
  }
344
 
 
 
 
 
 
 
 
 
 
 
 
 
345
  /**
346
  * Flushes rewrite rules for XML Sitemap URL changes
347
  *
403
  }
404
 
405
  }
 
 
inc/compatibility/abstract/aiosep_compatible.php CHANGED
@@ -12,7 +12,7 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Compatible' ) ) {
12
  *
13
  * @package All-in-One-SEO-Pack
14
  * @author Alejandro Mostajo
15
- * @copyright Semperfi Web Design <https://semperplugins.com/>
16
  * @version 2.3.13
17
  * @since 2.3.12.3
18
  */
12
  *
13
  * @package All-in-One-SEO-Pack
14
  * @author Alejandro Mostajo
15
+ * @copyright All in One SEO <https://semperplugins.com/>
16
  * @version 2.3.13
17
  * @since 2.3.12.3
18
  */
inc/compatibility/class-aioseop-php-functions.php ADDED
@@ -0,0 +1,196 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * AIOSEOP_PHP_Functions class
4
+ *
5
+ * Alternative PHP functions for improved operations or compatibility with pre-existing functions that had param changes.
6
+ *
7
+ * @package All-in-One-SEO-Pack
8
+ * @since 3.4.0
9
+ */
10
+
11
+ /**
12
+ * Class AIOSEOP_PHP_Functions
13
+ *
14
+ * Access to these methods is done statically.
15
+ * Adding any additional methods for PHP functions should be reserved only for pre-existing functions.
16
+ * Any non-existing functions in older PHP versions should use `inc/compatibility/php-functions.php`.
17
+ *
18
+ * @since 3.4.0
19
+ */
20
+ class AIOSEOP_PHP_Functions {
21
+
22
+ /**
23
+ * Convert a string to lower case
24
+ * Compatible with mb_strtolower(), an UTF-8 friendly replacement for strtolower()
25
+ *
26
+ * @since ?
27
+ * @since 3.4.0 Change to static method.
28
+ *
29
+ * @param string $str
30
+ * @return string
31
+ */
32
+ public static function strtolower( $str ) {
33
+ return AIOSEOP_PHP_Functions::convert_case( $str, 'lower' );
34
+ }
35
+
36
+ /**
37
+ * Convert a string to upper case
38
+ * Compatible with mb_strtoupper(), an UTF-8 friendly replacement for strtoupper()
39
+ *
40
+ * @since ?
41
+ * @since 3.4.0 Change to static method.
42
+ *
43
+ * @param string $str
44
+ * @return string
45
+ */
46
+ public static function strtoupper( $str ) {
47
+ return AIOSEOP_PHP_Functions::convert_case( $str, 'upper' );
48
+ }
49
+
50
+ /**
51
+ * Convert a string to title case
52
+ * Compatible with mb_convert_case(), an UTF-8 friendly replacement for ucwords()
53
+ *
54
+ * @since ?
55
+ * @since 3.4.0 Change to static method.
56
+ *
57
+ * @param string $str
58
+ * @return string
59
+ */
60
+ public static function ucwords( $str ) {
61
+ return AIOSEOP_PHP_Functions::convert_case( $str, 'title' );
62
+ }
63
+
64
+ /**
65
+ * Case conversion; handle non UTF-8 encodings and fallback **
66
+ *
67
+ * @since ?
68
+ * @since 3.4.0 Change to static method.
69
+ *
70
+ * @param string $str
71
+ * @param string $mode
72
+ * @return string
73
+ */
74
+ private static function convert_case( $str, $mode = 'upper' ) {
75
+ static $charset = null;
76
+ if ( null == $charset ) {
77
+ $charset = get_bloginfo( 'charset' );
78
+ }
79
+ $str = (string) $str;
80
+ if ( 'title' == $mode ) {
81
+ if ( function_exists( 'mb_convert_case' ) ) {
82
+ return mb_convert_case( $str, MB_CASE_TITLE, $charset );
83
+ } else {
84
+ return ucwords( $str );
85
+ }
86
+ }
87
+
88
+ if ( 'UTF-8' == $charset ) {
89
+ // phpcs:disable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
90
+ global $UTF8_TABLES;
91
+ include_once( AIOSEOP_PLUGIN_DIR . 'inc/aioseop_UTF8.php' );
92
+ if ( is_array( $UTF8_TABLES ) ) {
93
+ if ( 'upper' == $mode ) {
94
+ return strtr( $str, $UTF8_TABLES['strtoupper'] );
95
+ }
96
+ if ( 'lower' == $mode ) {
97
+ return strtr( $str, $UTF8_TABLES['strtolower'] );
98
+ }
99
+ }
100
+ // phpcs:enable
101
+ }
102
+
103
+ if ( 'upper' == $mode ) {
104
+ if ( function_exists( 'mb_strtoupper' ) ) {
105
+ return mb_strtoupper( $str, $charset );
106
+ } else {
107
+ return strtoupper( $str );
108
+ }
109
+ }
110
+
111
+ if ( 'lower' == $mode ) {
112
+ if ( function_exists( 'mb_strtolower' ) ) {
113
+ return mb_strtolower( $str, $charset );
114
+ } else {
115
+ return strtolower( $str );
116
+ }
117
+ }
118
+
119
+ return $str;
120
+ }
121
+
122
+ /**
123
+ * Wrapper for strlen() - uses mb_strlen() if possible.
124
+ *
125
+ * @since ?
126
+ * @since 3.4.0 Change to static method.
127
+ *
128
+ * @param $string
129
+ * @return int
130
+ */
131
+ public static function strlen( $string ) {
132
+ if ( function_exists( 'mb_strlen' ) ) {
133
+ return mb_strlen( $string, 'UTF-8' );
134
+ }
135
+
136
+ return strlen( $string );
137
+ }
138
+
139
+ /**
140
+ * Wrapper for substr() - uses mb_substr() if possible.
141
+ *
142
+ * @since ?
143
+ * @since 3.4.0 Change to static method.
144
+ *
145
+ * @param $string
146
+ * @param int $start
147
+ * @param int $length
148
+ * @return mixed
149
+ */
150
+ public static function substr( $string, $start = 0, $length = 2147483647 ) {
151
+ $args = func_get_args();
152
+ if ( function_exists( 'mb_substr' ) ) {
153
+ return call_user_func_array( 'mb_substr', $args );
154
+ }
155
+
156
+ return call_user_func_array( 'substr', $args );
157
+ }
158
+
159
+ /**
160
+ * Wrapper for strpos() - uses mb_strpos() if possible.
161
+ *
162
+ * @since ?
163
+ * @since 3.4.0 Change to static method.
164
+ *
165
+ * @param $haystack
166
+ * @param string $needle
167
+ * @param int $offset
168
+ * @return bool|int
169
+ */
170
+ public static function strpos( $haystack, $needle, $offset = 0 ) {
171
+ if ( function_exists( 'mb_strpos' ) ) {
172
+ return mb_strpos( $haystack, $needle, $offset, 'UTF-8' );
173
+ }
174
+
175
+ return strpos( $haystack, $needle, $offset );
176
+ }
177
+
178
+ /**
179
+ * Wrapper for strrpos() - uses mb_strrpos() if possible.
180
+ *
181
+ * @since ?
182
+ * @since 3.4.0 Change to static method.
183
+ *
184
+ * @param $haystack
185
+ * @param string $needle
186
+ * @param int $offset
187
+ * @return bool|int
188
+ */
189
+ public static function strrpos( $haystack, $needle, $offset = 0 ) {
190
+ if ( function_exists( 'mb_strrpos' ) ) {
191
+ return mb_strrpos( $haystack, $needle, $offset, 'UTF-8' );
192
+ }
193
+
194
+ return strrpos( $haystack, $needle, $offset );
195
+ }
196
+ }
inc/compatibility/compat-wpml.php CHANGED
@@ -13,7 +13,7 @@ if ( ! class_exists( 'All_in_One_SEO_Pack_Wpml' ) ) {
13
  * @link https://wpml.org/
14
  * @package All-in-One-SEO-Pack
15
  * @author Alejandro Mostajo
16
- * @copyright Semperfi Web Design <https://semperplugins.com/>
17
  * @version 2.3.13
18
  */
19
  class All_in_One_SEO_Pack_Wpml extends All_in_One_SEO_Pack_Compatible {
13
  * @link https://wpml.org/
14
  * @package All-in-One-SEO-Pack
15
  * @author Alejandro Mostajo
16
+ * @copyright All in One SEO <https://semperplugins.com/>
17
  * @version 2.3.13
18
  */
19
  class All_in_One_SEO_Pack_Wpml extends All_in_One_SEO_Pack_Compatible {
inc/compatibility/gutenberg-chrome.php CHANGED
@@ -13,7 +13,7 @@ aioseop_chrome_fix_overlapping_metabox();
13
  * Fixes a CSS compatibility issue between Gutenberg and Chrome v77 that affects meta boxes.
14
  *
15
  * @see https://github.com/WordPress/gutenberg/issues/17406
16
- * @link https://github.com/semperfiwebdesign/all-in-one-seo-pack/issues/2914
17
  *
18
  * @since 3.2.8
19
  *
@@ -36,7 +36,7 @@ function aioseop_chrome_fix_overlapping_metabox() {
36
  * Change height of a specific Gutenberg CSS class.
37
  *
38
  * @see https://github.com/WordPress/gutenberg/issues/17406
39
- * @link https://github.com/semperfiwebdesign/all-in-one-seo-pack/issues/2914
40
  *
41
  * @since 3.2.8
42
  *
13
  * Fixes a CSS compatibility issue between Gutenberg and Chrome v77 that affects meta boxes.
14
  *
15
  * @see https://github.com/WordPress/gutenberg/issues/17406
16
+ * @link https://github.com/awesomemotive/all-in-one-seo-pack/issues/2914
17
  *
18
  * @since 3.2.8
19
  *
36
  * Change height of a specific Gutenberg CSS class.
37
  *
38
  * @see https://github.com/WordPress/gutenberg/issues/17406
39
+ * @link https://github.com/awesomemotive/all-in-one-seo-pack/issues/2914
40
  *
41
  * @since 3.2.8
42
  *
inc/schema/aioseop-context.php ADDED
@@ -0,0 +1,877 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Context Handler
4
+ *
5
+ * @package All_in_One_SEO_Pack
6
+ */
7
+
8
+ /**
9
+ * Website Context Handler.
10
+ *
11
+ * Handles data from multiple WordPress classes which contain content, structure, and properties.
12
+ *
13
+ * Multiton (Multi-Singleton)
14
+ *
15
+ * @since 3.4.0
16
+ */
17
+ class AIOSEOP_Context {
18
+
19
+ /**
20
+ * Multi-Instances
21
+ *
22
+ * @since 3.4.0
23
+ *
24
+ * @var array $type {
25
+ * @type array $key {
26
+ * @type AIOSEOP_Context
27
+ * }
28
+ * }
29
+ */
30
+ protected static $instances = array();
31
+
32
+ /**
33
+ * Context Key (ID|slug).
34
+ *
35
+ * @since 3.4.0
36
+ *
37
+ * @var string
38
+ */
39
+ public $context_type = '';
40
+
41
+ /**
42
+ * Unique key for WP Objects
43
+ *
44
+ * Could be a numeric ID or a string Slug.
45
+ *
46
+ * @since 3.4.0
47
+ *
48
+ * @var string
49
+ */
50
+ public $context_key = '';
51
+
52
+ /**
53
+ * WP Class Properties
54
+ *
55
+ * Stores essential properties to query by or potentially reduce querying.
56
+ *
57
+ * These properties can also be used with `$context` param to query by.
58
+ *
59
+ * @since 3.4.0
60
+ *
61
+ * @var array {
62
+ * @type string $taxonomy (Optional) Terms limited to those matching `taxonomy`.
63
+ * Used with: WP_Terms.
64
+ * @type array|string $object_type Name(s) of the post type(s) the taxonomy object is registered for.
65
+ * Used with: WP_Taxonomy.
66
+ * @type string $user_login Username.
67
+ * Used with: WP_User.
68
+ * @type int $site_id Site ID.
69
+ * Used with: WP_User.
70
+ * }
71
+ */
72
+ public $wp_props = array();
73
+
74
+ /**
75
+ * Get Instance
76
+ *
77
+ * @since 3.4.0
78
+ *
79
+ * @param string|array|AIOSEOP_Context|WP_Site|WP_Post|WP_Post_Type|WP_Taxonomy|WP_Term|WP_User $context
80
+ * @return AIOSEOP_Context
81
+ */
82
+ public static function get_instance( $context = '' ) {
83
+ $type = self::get_context_type( $context );
84
+ $key = self::get_context_key( $context, $type );
85
+ $props = self::get_wp_props( $context, $type, $key );
86
+
87
+ if ( ! isset( self::$instances[ $type ] ) ) {
88
+ self::$instances[ $type ] = array();
89
+ }
90
+ if ( ! isset( self::$instances[ $type ][ $key ] ) ) {
91
+ if ( ! $context instanceof $type ) {
92
+ $context = self::get_object( $type, $key, $props );
93
+ }
94
+
95
+ self::$instances[ $type ][ $key ] = new self( $context );
96
+ }
97
+
98
+ return self::$instances[ $type ][ $key ];
99
+ }
100
+
101
+ /**
102
+ * AIOSEOP_Context constructor.
103
+ *
104
+ * @since 3.4.0
105
+ *
106
+ * @param string $context
107
+ */
108
+ protected function __construct( $context = '' ) {
109
+ $type = self::get_context_type( $context );
110
+ $this->context_type = $type;
111
+ $key = self::get_context_key( $context, $type );
112
+ $this->context_key = $key;
113
+ $props = self::get_wp_props( $context, $type, $key );
114
+ $this->wp_props = $props;
115
+ }
116
+
117
+ /**
118
+ * Get current is_*() state.
119
+ *
120
+ * @since 3.4.0
121
+ *
122
+ * @return string
123
+ */
124
+ public static function get_is() {
125
+ $state_is = '';
126
+ if ( is_front_page() || is_home() ) {
127
+ global $wp_query;
128
+
129
+ if ( $wp_query->is_front_page() ) {
130
+ $state_is = 'front_page';
131
+ } elseif ( $wp_query->is_posts_page ) {
132
+ $state_is = 'posts_page';
133
+ } else {
134
+ $state_is = 'home'; // Static front page.
135
+ }
136
+ } elseif ( is_archive() ) {
137
+ if ( is_author() ) {
138
+ $state_is = 'author_archive';
139
+ } elseif ( is_post_type_archive() ) {
140
+ $state_is = 'post_type_archive';
141
+ } elseif ( is_tax() || is_category() || is_tag() ) {
142
+ $state_is = 'taxonomy_term_archive';
143
+ } elseif ( is_date() ) {
144
+ $state_is = 'date_archive';
145
+ if ( is_year() ) {
146
+ $state_is = 'year_date_archive';
147
+ } elseif ( is_month() ) {
148
+ $state_is = 'month_date_archive';
149
+ } elseif ( is_day() ) {
150
+ $state_is = 'day_date_archive';
151
+ }
152
+ }
153
+ } elseif ( is_singular() || is_single() ) {
154
+ $post = get_post();
155
+
156
+ $state_is = 'single_post';
157
+ if ( is_post_type_hierarchical( $post->post_type ) ) {
158
+ $state_is = 'single_page';
159
+ } elseif ( is_attachment() ) {
160
+ $state_is = 'single_attachment';
161
+ }
162
+ } elseif ( is_search() ) {
163
+ $state_is = 'search';
164
+ } elseif ( is_attachment() ) {
165
+ $state_is = 'attachment';
166
+ } elseif ( is_404() ) {
167
+ $state_is = '404';
168
+ }
169
+
170
+ return $state_is;
171
+ }
172
+
173
+ /**
174
+ * Get Object Type of Context
175
+ *
176
+ * @since 3.4.0
177
+ *
178
+ * @param string $context
179
+ * @return string
180
+ */
181
+ public static function get_context_type( $context = '' ) {
182
+ if ( is_array( $context ) && isset( $context['context_type'] ) ) {
183
+ if ( 'WP_Site' === $context['context_type'] && ! class_exists( 'WP_Site' ) ) {
184
+ $context['context_type'] = 'var_site';
185
+ }
186
+ return $context['context_type'];
187
+ } elseif ( $context instanceof AIOSEOP_Context || ! empty( $context->context_type ) ) {
188
+ if ( 'WP_Site' === $context->context_type && ! class_exists( 'WP_Site' ) ) {
189
+ $context->context_type = 'var_site';
190
+ }
191
+ return $context->context_type;
192
+ }
193
+
194
+ $obj_type = '';
195
+ if ( $context instanceof WP_Network ) {
196
+ $obj_type = 'WP_Site';
197
+ } elseif ( $context instanceof WP_Site ) {
198
+ $obj_type = 'WP_Site';
199
+ } elseif ( $context instanceof WP_Post_Type ) {
200
+ $obj_type = 'WP_Post_Type';
201
+ } elseif ( $context instanceof WP_Taxonomy ) {
202
+ $obj_type = 'WP_Taxonomy';
203
+ } elseif ( $context instanceof WP_Term ) {
204
+ $obj_type = 'WP_Term';
205
+ } elseif ( $context instanceof WP_Post ) {
206
+ $obj_type = 'WP_Post';
207
+ } elseif ( $context instanceof WP_User ) {
208
+ $obj_type = 'WP_User';
209
+ }
210
+
211
+ // If context isn't a WP object, or is empty, then set by current is_*() condition.
212
+ if ( empty( $obj_type ) ) {
213
+ $current_is = self::get_is();
214
+
215
+ switch ( $current_is ) {
216
+ case 'front_page':
217
+ if ( is_multisite() ) {
218
+ $obj_type = 'WP_Site';
219
+ } else {
220
+ $obj_type = 'var_site';
221
+ }
222
+ break;
223
+
224
+ case 'author_archive':
225
+ $obj_type = 'WP_User';
226
+ break;
227
+
228
+ case 'post_type_archive':
229
+ $obj_type = 'WP_Post_Type';
230
+ break;
231
+
232
+ case 'taxonomy_term_archive':
233
+ $obj_type = 'WP_Term';
234
+ break;
235
+
236
+ case 'home':
237
+ case 'posts_page':
238
+ case 'single_page':
239
+ case 'single_post':
240
+ case 'single_attachment':
241
+ case 'attachment':
242
+ $obj_type = 'WP_Post';
243
+ break;
244
+
245
+ case 'date_archive':
246
+ $obj_type = 'var_date';
247
+ break;
248
+
249
+ case 'year_date_archive':
250
+ $obj_type = 'var_date_year';
251
+ break;
252
+
253
+ case 'month_date_archive':
254
+ $obj_type = 'var_date_month';
255
+ break;
256
+
257
+ case 'day_date_archive':
258
+ $obj_type = 'var_date_day';
259
+ break;
260
+
261
+ case 'search':
262
+ $obj_type = 'var_search';
263
+ break;
264
+
265
+ case '404':
266
+ // TODO Find current object.
267
+ break;
268
+ }
269
+ }
270
+
271
+ return $obj_type;
272
+ }
273
+
274
+ /**
275
+ * Get (WP) Object ID
276
+ *
277
+ * Searches for an object's ID, if there is not an ID then the current ID available is fetched.
278
+ * This would also contain majority of the query operations for (individual) objects since this
279
+ * is a Unique Key for a given class type; wp_props is also used to refine a query.
280
+ *
281
+ * @since 3.4.0
282
+ *
283
+ * @param $context
284
+ * @param string $type
285
+ * @return int
286
+ */
287
+ public static function get_context_key( $context, $type = '' ) {
288
+ if ( is_array( $context ) && isset( $context['context_key'] ) ) {
289
+ return $context['context_key'];
290
+ } elseif ( $context instanceof AIOSEOP_Context || ! empty( $context->context_key ) ) {
291
+ return $context->context_key;
292
+ }
293
+
294
+ $key = 0;
295
+ if ( empty( $type ) ) {
296
+ $type = self::get_context_type( $context );
297
+ }
298
+ switch ( $type ) {
299
+ case 'var_site':
300
+ $key = 0;
301
+ break;
302
+
303
+ case 'WP_Site':
304
+ if ( $context instanceof WP_Site ) {
305
+ $key = $context->blog_id;
306
+ } else {
307
+ $key = get_current_blog_id();
308
+ }
309
+ break;
310
+
311
+ case 'WP_Post':
312
+ if ( ! $context instanceof WP_Post ) {
313
+ if ( 'posts_page' === self::get_is() ) {
314
+ $context = get_queried_object();
315
+ } else {
316
+ global $post;
317
+ $context = $post;
318
+ }
319
+ }
320
+ $key = $context->ID;
321
+ break;
322
+
323
+ case 'WP_Taxonomy':
324
+ if ( ! $context instanceof WP_Taxonomy ) {
325
+ get_queried_object();
326
+ }
327
+ $key = $context->name;
328
+ break;
329
+
330
+ case 'WP_Term':
331
+ if ( ! $context instanceof WP_Term ) {
332
+ $context = get_queried_object();
333
+ }
334
+ $key = $context->term_id;
335
+ break;
336
+
337
+ case 'WP_User':
338
+ if ( $context instanceof WP_User ) {
339
+ $key = $context->ID;
340
+ break;
341
+ }
342
+
343
+ if ( is_array( $context ) && is_array( $context['wp_props'] ) ) {
344
+ if ( ! empty( $context['wp_props']['user_nicename'] ) ) {
345
+ $context = get_user_by( 'slug', $context['wp_props']['user_nicename'] );
346
+ } elseif ( ! empty( $context['wp_props']['user_email'] ) ) {
347
+ $context = get_user_by( 'email', $context['wp_props']['user_email'] );
348
+ } elseif ( ! empty( $context['wp_props']['user_login'] ) ) {
349
+ $context = get_user_by( 'login', $context['wp_props']['user_login'] );
350
+ }
351
+ }
352
+
353
+ if ( $context instanceof WP_User ) {
354
+ $key = $context->ID;
355
+ } else {
356
+ // Current author/user page on frontend.
357
+ $key = get_the_author_meta( 'ID' );
358
+ }
359
+ break;
360
+
361
+ default:
362
+ // Do stuff.
363
+ }
364
+
365
+ return $key;
366
+ }
367
+
368
+ /**
369
+ * Get (Required/Requested) WP Object Fields
370
+ *
371
+ * @since 3.4.0
372
+ *
373
+ * @param mixed $context
374
+ * @param string $type
375
+ * @param string $key
376
+ * @return array|mixed
377
+ */
378
+ public static function get_wp_props( $context, $type = '', $key = '' ) {
379
+ $wp_props = array();
380
+ if ( empty( $type ) ) {
381
+ $type = self::get_context_type( $context );
382
+ }
383
+ if ( empty( $key ) && 0 !== $key ) {
384
+ $key = self::get_context_key( $context, $type );
385
+ }
386
+
387
+ if ( is_array( $context ) && isset( $context['wp_props'] ) ) {
388
+ $wp_props = $context['wp_props'];
389
+ } elseif ( $context instanceof AIOSEOP_Context || ! empty( $context->wp_props ) ) {
390
+ $wp_props = $context->wp_props;
391
+ }
392
+
393
+ $object = new stdClass();
394
+ switch ( $type ) {
395
+ case 'WP_Taxonomy':
396
+ $object = self::get_object( $type, $key, $wp_props );
397
+ $wp_props['object_type'] = $object->object_type;
398
+ break;
399
+ case 'WP_Term':
400
+ // $object = self::get_object( $type, $key, $wp_props );
401
+ // $wp_props['taxonomy'] = $object->taxonomy;
402
+ break;
403
+ case 'WP_User':
404
+ $object = self::get_object( $type, $key, $wp_props );
405
+ // $wp_props['user_login'] = $object->user_login;
406
+ $wp_props['site_id'] = $object->site_id;
407
+ break;
408
+ }
409
+
410
+ // Also get only the object properties that match in $context['wp_props'] | $context->wp_props.
411
+ foreach ( $wp_props as $key => $value ) {
412
+ if ( isset( $object->$key ) ) {
413
+ $wp_props[ $key ] = $object->$key;
414
+ }
415
+ }
416
+
417
+ return $wp_props;
418
+ }
419
+
420
+ /**
421
+ * Get Object
422
+ *
423
+ * @since 3.4.0
424
+ *
425
+ * @param string $type WP object type.
426
+ * @param string $key Integer or slug.
427
+ * @param array $args
428
+ * @return false|WP_Site|WP_Post|WP_Post_Type|WP_Taxonomy|WP_Term|WP_User
429
+ */
430
+ public static function get_object( $type, $key, $args = array() ) {
431
+ $object = false;
432
+ switch ( $type ) {
433
+ case 'var_site':
434
+ case 'var_date':
435
+ case 'var_date_year':
436
+ case 'var_date_month':
437
+ case 'var_date_day':
438
+ $object = array(
439
+ 'context_type' => $type,
440
+ 'context_key' => $key,
441
+ );
442
+ break;
443
+
444
+ case 'WP_Site':
445
+ /*
446
+ * PHP 5.2 conflict. Could merge WP_Site & WP_Post together after WP 5.1 becomes the required version.
447
+ *
448
+ * Change to...
449
+ * $object = $type::get_instance( $key );
450
+ */
451
+
452
+ $object = WP_Site::get_instance( $key );
453
+ break;
454
+
455
+ case 'WP_Post':
456
+ $object = WP_Post::get_instance( $key );
457
+ break;
458
+
459
+ case 'WP_Taxonomy':
460
+ $object_type = isset( $args['object_type'] ) ? $args['object_type'] : 'post';
461
+ $object = new WP_Taxonomy( $key, $object_type );
462
+ break;
463
+
464
+ case 'WP_Term':
465
+ $taxonomy = isset( $args['taxonomy'] ) ? $args['taxonomy'] : null;
466
+ $object = WP_Term::get_instance( $key, $taxonomy );
467
+ break;
468
+
469
+ case 'WP_User':
470
+ $name = isset( $args['user_login'] ) ? $args['user_login'] : '';
471
+ $site_id = isset( $args['site_id'] ) ? $args['site_id'] : '';
472
+ $object = new WP_User( $key, $name, $site_id );
473
+ break;
474
+ }
475
+
476
+ return $object;
477
+ }
478
+
479
+ /**
480
+ * Get Slug
481
+ *
482
+ * @since 3.4.0
483
+ *
484
+ * @return string
485
+ */
486
+ public function get_slug() {
487
+ $slug = '';
488
+ $wp_obj = self::get_object( $this->context_type, $this->context_key, $this->wp_props );
489
+ switch ( $this->context_type ) {
490
+ case 'var_site':
491
+ break;
492
+ case 'WP_Post':
493
+ $slug = $wp_obj->post_name;
494
+ break;
495
+ case 'WP_Taxonomy':
496
+ $slug = $wp_obj->name;
497
+ break;
498
+ case 'WP_Term':
499
+ $slug = $wp_obj->slug;
500
+ break;
501
+ case 'WP_User':
502
+ $slug = $wp_obj->user_login;
503
+ break;
504
+ }
505
+
506
+ return $slug;
507
+ }
508
+
509
+ public function get_nicename() {}
510
+
511
+ /**
512
+ * Get Display Name
513
+ *
514
+ * @since 3.4.0
515
+ *
516
+ * @return string
517
+ */
518
+ public function get_display_name() {
519
+ $display_name = '';
520
+ switch ( $this->context_type ) {
521
+ case 'var_site':
522
+ $display_name = get_bloginfo( 'name' );
523
+ break;
524
+
525
+ case 'WP_Site':
526
+ $wp_obj = self::get_object( $this->context_type, $this->context_key );
527
+ $display_name = $wp_obj->blogname;
528
+ break;
529
+
530
+ case 'WP_Post':
531
+ $wp_obj = self::get_object( $this->context_type, $this->context_key );
532
+ $display_name = $wp_obj->post_title;
533
+ break;
534
+
535
+ case 'WP_Term':
536
+ $wp_obj = self::get_object( $this->context_type, $this->context_key, $this->wp_props );
537
+ $display_name = $wp_obj->name;
538
+ break;
539
+
540
+ case 'WP_User':
541
+ $wp_obj = self::get_object( $this->context_type, $this->context_key, $this->wp_props );
542
+ $display_name = $wp_obj->display_name;
543
+ break;
544
+
545
+ case 'var_search':
546
+ $display_name = sprintf( __( 'Search results for \'%s\'', 'all-in-one-seo-pack' ), esc_html( get_search_query() ) );
547
+ break;
548
+
549
+ case 'var_date_year':
550
+ $display_name = sprintf( __( 'Year: %s', 'all-in-one-seo-pack' ), get_the_date( 'Y' ) );
551
+ break;
552
+
553
+ case 'var_date_month':
554
+ $display_name = sprintf( __( 'Month: %s', 'all-in-one-seo-pack' ), get_the_date( 'F Y' ) );
555
+ break;
556
+
557
+ case 'var_date_day':
558
+ case 'var_date':
559
+ $display_name = sprintf( __( 'Day: %s', 'all-in-one-seo-pack' ), get_the_date( 'F j, Y' ) );
560
+ break;
561
+ }
562
+
563
+ return $display_name;
564
+ }
565
+
566
+ /**
567
+ * Get URL (Page)
568
+ *
569
+ * Uses a static variable for performance faulty operations; only use with heavy operations.
570
+ *
571
+ * @since 3.4.0
572
+ *
573
+ * @return string
574
+ */
575
+ public function get_url() {
576
+ static $s_url;
577
+ if ( is_null( $s_url ) ) {
578
+ $s_url = array();
579
+ }
580
+ if ( ! isset( $s_url[ $this->context_type ] ) || ! is_array( $s_url[ $this->context_type ] ) ) {
581
+ $s_url[ $this->context_type ] = array();
582
+ }
583
+ if ( ! empty( $s_url[ $this->context_type ][ $this->context_key ] ) ) {
584
+ return $s_url[ $this->context_type ][ $this->context_key ];
585
+ }
586
+
587
+ $url = '';
588
+ switch ( $this->context_type ) {
589
+ case 'var_site':
590
+ $url = home_url();
591
+ break;
592
+
593
+ case 'WP_Site':
594
+ $url = get_site_url( $this->context_key );
595
+ break;
596
+
597
+ case 'WP_Post':
598
+ $wp_obj = self::get_object( $this->context_type, $this->context_key );
599
+
600
+ if ( 'attachment' === $wp_obj->post_type ) {
601
+ // Source URL.
602
+ // May need to check setting for attachment redirect.
603
+ // Use $this->get_images() to get attachment link.
604
+ // $url = wp_get_attachment_url( $wp_obj->ID );
605
+ // (Attachment) Post URL.
606
+ $url = get_permalink( $wp_obj );
607
+ } else {
608
+ $url = wp_get_canonical_url( $wp_obj );
609
+ }
610
+
611
+ if ( false === $url ) {
612
+ $url = '';
613
+ }
614
+
615
+ $s_url[ $this->context_type ][ $this->context_key ] = $url;
616
+ break;
617
+
618
+ case 'WP_Taxonomy':
619
+ // Does not exist.
620
+ break;
621
+
622
+ case 'WP_Term':
623
+ $taxonomy = isset( $this->wp_props['taxonomy'] ) ? $this->wp_props['taxonomy'] : '';
624
+ $url = get_term_link( $this->context_key, $taxonomy );
625
+
626
+ $s_url[ $this->context_type ][ $this->context_key ] = $url;
627
+ break;
628
+ case 'WP_User':
629
+ $url = get_author_posts_url( $this->context_key );
630
+ break;
631
+
632
+ case 'var_search':
633
+ $url = get_search_link();
634
+ break;
635
+
636
+ case 'var_date_year':
637
+ $url = get_year_link( false );
638
+ break;
639
+
640
+ case 'var_date_month':
641
+ $url = get_month_link( false, false );
642
+ break;
643
+
644
+ case 'var_date_day':
645
+ case 'var_date':
646
+ $url = get_day_link( false, false, false );
647
+ break;
648
+ }
649
+
650
+ return $url;
651
+ }
652
+
653
+ /**
654
+ * Get Description
655
+ *
656
+ * @since 3.4.0
657
+ *
658
+ * @return string
659
+ */
660
+ public function get_description() {
661
+ $desc = '';
662
+
663
+ switch ( $this->context_type ) {
664
+ case 'var_site':
665
+ $desc = get_bloginfo( 'description' );
666
+ break;
667
+ case 'WP_Term':
668
+ case 'WP_User':
669
+ $wp_obj = self::get_object( $this->context_type, $this->context_key, $this->wp_props );
670
+ $desc = $wp_obj->description;
671
+ break;
672
+ }
673
+
674
+ return $desc;
675
+ }
676
+
677
+ /**
678
+ * Get Image Context
679
+ *
680
+ * Returns Image ID (Context Key) if possible, and Image URL.
681
+ *
682
+ * This is used to get the Image WP_Post object via $context.
683
+ *
684
+ * attachment post parent.
685
+ * registered images to post.
686
+ * post content.
687
+ *
688
+ * @param string|array
689
+ * @return array {
690
+ * @type int|string $id
691
+ * @type string $url
692
+ * }
693
+ */
694
+ public function get_images( $sources = 'all' ) {
695
+ $image = array();
696
+ switch ( $this->context_type ) {
697
+ case 'WP_Post':
698
+ $wp_obj = self::get_object( $this->context_type, $this->context_key );
699
+ if ( 'attachment' === $wp_obj->post_type ) {
700
+ $images['attachments'][] = array(
701
+ 'id' => $wp_obj->ID,
702
+ 'url' => wp_get_attachment_url( $wp_obj->ID ),
703
+ );
704
+ }
705
+
706
+ $media_list = get_attached_media( 'image', $wp_obj );
707
+
708
+ break;
709
+ }
710
+ }
711
+
712
+ /**
713
+ * Get Breadcrumb
714
+ *
715
+ * @since 3.4.0
716
+ *
717
+ * @return array {
718
+ * @type array $index {
719
+ * @type int $position
720
+ * @type string $title
721
+ * @type string $url
722
+ * }
723
+ * }
724
+ */
725
+ public function get_breadcrumb() {
726
+ $rtn_list = array();
727
+ // WP_Post & WP_Terms could be merged once a parent_id() method is created.
728
+ $context = $this;
729
+ switch ( $this->context_type ) {
730
+ case 'var_site':
731
+ case 'WP_Site':
732
+ // Site data added at last.
733
+ break;
734
+
735
+ case 'WP_Post':
736
+ $object = self::get_object( $this->context_type, $this->context_key );
737
+ while ( ! empty( $object->post_parent ) ) {
738
+ array_unshift(
739
+ $rtn_list,
740
+ array(
741
+ 'name' => $context->get_display_name(),
742
+ 'url' => $context->get_url(),
743
+ )
744
+ );
745
+
746
+ $context = array(
747
+ 'context_type' => $context->context_type,
748
+ 'context_key' => $object->post_parent, // Create get_parent().
749
+ );
750
+ $context = self::get_instance( $context );
751
+ $object = self::get_object( $context->context_type, $context->context_key );
752
+ }
753
+ array_unshift(
754
+ $rtn_list,
755
+ array(
756
+ 'name' => $context->get_display_name(),
757
+ 'url' => $context->get_url(),
758
+ )
759
+ );
760
+ break;
761
+
762
+ case 'WP_Taxonomy':
763
+ // No URL destination exists to trigger this.
764
+ break;
765
+
766
+ case 'WP_Term':
767
+ $object = self::get_object( $context->context_type, $context->context_key, $context->wp_props );
768
+ while ( ! empty( $object->parent ) ) {
769
+ array_unshift(
770
+ $rtn_list,
771
+ array(
772
+ 'name' => $context->get_display_name(),
773
+ 'url' => $context->get_url(),
774
+ )
775
+ );
776
+
777
+ $context = array(
778
+ 'context_type' => $context->context_type,
779
+ 'context_key' => $object->parent, // Create get_parent().
780
+ 'wp_props' => $context->wp_props,
781
+ );
782
+ $context = self::get_instance( $context );
783
+ $object = self::get_object( $context->context_type, $context->context_key, $context->wp_props );
784
+ }
785
+ array_unshift(
786
+ $rtn_list,
787
+ array(
788
+ 'name' => $context->get_display_name(),
789
+ 'url' => $context->get_url(),
790
+ )
791
+ );
792
+ break;
793
+
794
+ case 'var_date':
795
+ case 'var_date_day':
796
+ array_unshift(
797
+ $rtn_list,
798
+ array(
799
+ 'name' => $context->get_display_name(),
800
+ 'url' => $context->get_url(),
801
+ )
802
+ );
803
+ $context = array(
804
+ 'context_type' => 'var_date_month',
805
+ 'context_key' => 0,
806
+ );
807
+ $context = AIOSEOP_Context::get_instance( $context );
808
+ // Fall through.
809
+ case 'var_date_month':
810
+ array_unshift(
811
+ $rtn_list,
812
+ array(
813
+ 'name' => $context->get_display_name(),
814
+ 'url' => $context->get_url(),
815
+ )
816
+ );
817
+ $context = array(
818
+ 'context_type' => 'var_date_year',
819
+ 'context_key' => 0,
820
+ );
821
+ $context = AIOSEOP_Context::get_instance( $context );
822
+ // Fall through.
823
+ case 'var_date_year':
824
+ case 'WP_User':
825
+ case 'var_search':
826
+ array_unshift(
827
+ $rtn_list,
828
+ array(
829
+ 'name' => $context->get_display_name(),
830
+ 'url' => $context->get_url(),
831
+ )
832
+ );
833
+ break;
834
+ }
835
+
836
+ // Add Homepage as root/base.
837
+ $site_context = array();
838
+ if ( is_multisite() ) {
839
+ $site_context['context_type'] = 'WP_Site';
840
+ $site_context['context_key'] = get_current_blog_id();
841
+ } else {
842
+ $site_context['context_type'] = 'var_site';
843
+ $site_context['context_key'] = 0;
844
+ }
845
+ $site_context = self::get_instance( $site_context );
846
+
847
+ global $aioseop_options;
848
+ $title = $aioseop_options['aiosp_home_title'];
849
+ if ( empty( $title ) ) {
850
+ $title = $site_context->get_display_name();
851
+ }
852
+ if ( empty( $title ) ) {
853
+ preg_match(
854
+ '/^(?:https|http)(?:\:\/\/)(?:www\.)?([a-zA-Z0-9-]+\.)?([a-zA-Z0-9-]+)(?:\.[a-z]+\/|\.[a-z]+)$/',
855
+ $site_context->get_url(),
856
+ $matches
857
+ );
858
+ $title = $matches[1] . $matches[2];
859
+ }
860
+
861
+ array_unshift(
862
+ $rtn_list,
863
+ array(
864
+ 'name' => $title,
865
+ 'url' => $site_context->get_url() . '/',
866
+ )
867
+ );
868
+
869
+ // Add position values.
870
+ foreach ( $rtn_list as $index => &$item ) {
871
+ $item['position'] = $index + 1;
872
+ }
873
+
874
+ return $rtn_list;
875
+ }
876
+
877
+ }
inc/schema/graphs/graph-breadcrumblist.php ADDED
@@ -0,0 +1,150 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Schema Graph BreadcrumbList Class
4
+ *
5
+ * Acts as the Breadcrumb List class for Schema BreadcrumbList.
6
+ *
7
+ * @package All_in_One_SEO_Pack
8
+ */
9
+
10
+ /**
11
+ * Class AIOSEOP_Graph_BreadcrumbList
12
+ *
13
+ * @see Schema BreadcrumbList
14
+ * @link https://schema.org/BreadcrumbList
15
+ */
16
+ class AIOSEOP_Graph_BreadcrumbList extends AIOSEOP_Graph_ItemList {
17
+
18
+ /**
19
+ * Get Graph Slug.
20
+ *
21
+ * @since 3.4.0
22
+ *
23
+ * @return string
24
+ */
25
+ protected function get_slug() {
26
+ return 'BreadcrumbList';
27
+ }
28
+
29
+ /**
30
+ * Get Graph Name.
31
+ *
32
+ * Intended for frontend use when displaying which schema graphs are available.
33
+ *
34
+ * @since 3.4.0
35
+ *
36
+ * @return string
37
+ */
38
+ protected function get_name() {
39
+ return 'Breadcrumb List';
40
+ }
41
+
42
+ /**
43
+ * Prepare data.
44
+ *
45
+ * @since 3.4.0
46
+ *
47
+ * @return array
48
+ */
49
+ protected function prepare( $data = array() ) {
50
+ $context = AIOSEOP_Context::get_instance();
51
+ $rtn_data = array(
52
+ '@type' => $this->slug,
53
+ '@id' => $context->get_url() . '#' . strtolower( $this->slug ),
54
+ 'itemListElement' => array(),
55
+ );
56
+
57
+ $breadcrumb_list = $context->get_breadcrumb();
58
+ foreach ( $breadcrumb_list as $list_item ) {
59
+ $list_item_data = array(
60
+ 'position' => $list_item['position'],
61
+ 'item' => array(
62
+ 'url' => $list_item['url'],
63
+ 'name' => $list_item['name'],
64
+ ),
65
+ );
66
+
67
+ $rtn_data['itemListElement'][] = $this->prepare_listitem( $list_item_data );
68
+ }
69
+
70
+ return $rtn_data;
71
+ }
72
+
73
+ /**
74
+ * ListItem Defaults.
75
+ *
76
+ * @since 3.4.0
77
+ *
78
+ * @return array
79
+ */
80
+ protected function listitem_defaults() {
81
+ return array(
82
+ 'position' => 1,
83
+ 'item' => array(),
84
+ );
85
+ }
86
+
87
+ /**
88
+ * Item Defaults.
89
+ *
90
+ * @since 3.4.0
91
+ *
92
+ * @return array
93
+ */
94
+ protected function item_defaults() {
95
+ return array(
96
+ 'url' => '',
97
+ 'name' => '',
98
+ );
99
+ }
100
+
101
+ /**
102
+ * Prepare ListItem Schema.
103
+ *
104
+ * @since 3.4.0
105
+ *
106
+ * @param array $list_item_data
107
+ * @return array
108
+ */
109
+ protected function prepare_listitem( $list_item_data ) {
110
+ $rtn_data = array(
111
+ '@type' => 'ListItem',
112
+ );
113
+
114
+ // Only use valid variables from defaults.
115
+ foreach ( array_keys( $this->listitem_defaults() ) as $key ) {
116
+ if ( 'item' === $key ) {
117
+ $list_item_data[ $key ] = $this->prepare_item( $list_item_data[ $key ], 'WebPage', $list_item_data['item']['url'] );
118
+ }
119
+ if ( isset( $list_item_data[ $key ] ) ) {
120
+ $rtn_data[ $key ] = $list_item_data[ $key ];
121
+ }
122
+ }
123
+
124
+ return $rtn_data;
125
+ }
126
+
127
+ /**
128
+ * Prepare Item Schema.
129
+ *
130
+ * @since 3.4.0
131
+ *
132
+ * @param array $item_data
133
+ * @param string $schema_type
134
+ * @param int|string $schema_id
135
+ * @return array
136
+ */
137
+ protected function prepare_item( $item_data, $schema_type, $schema_id ) {
138
+ $rtn_data = array(
139
+ '@type' => $schema_type,
140
+ '@id' => $schema_id,
141
+ );
142
+ foreach ( array_keys( $this->item_defaults() ) as $key ) {
143
+ if ( isset( $item_data[ $key ] ) ) {
144
+ $rtn_data[ $key ] = $item_data[ $key ];
145
+ }
146
+ }
147
+
148
+ return $rtn_data;
149
+ }
150
+ }
inc/schema/graphs/graph-itemlist.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Schema Graph ItemList Class
4
+ *
5
+ * Acts as the Item List class for Schema ItemList.
6
+ *
7
+ * @package All_in_One_SEO_Pack
8
+ */
9
+
10
+ /**
11
+ * Class AIOSEOP_Graph_ItemList
12
+ *
13
+ * @see Schema ItemList
14
+ * @link https://schema.org/ItemList
15
+ */
16
+ class AIOSEOP_Graph_ItemList extends AIOSEOP_Graph {
17
+
18
+ /**
19
+ * Get Graph Slug.
20
+ *
21
+ * @since 3.4.0
22
+ *
23
+ * @return string
24
+ */
25
+ protected function get_slug() {
26
+ return 'ItemList';
27
+ }
28
+
29
+ /**
30
+ * Get Graph Name.
31
+ *
32
+ * Intended for frontend use when displaying which schema graphs are available.
33
+ *
34
+ * @since 3.4.0
35
+ *
36
+ * @return string
37
+ */
38
+ protected function get_name() {
39
+ return 'Item List';
40
+ }
41
+
42
+ /**
43
+ * Prepare data.
44
+ *
45
+ * @since 3.4.0
46
+ *
47
+ * @return array
48
+ */
49
+ protected function prepare() {
50
+ return parent::prepare();
51
+ }
52
+ }
inc/schema/graphs/graph-webpage.php CHANGED
@@ -51,6 +51,8 @@ class AIOSEOP_Graph_WebPage extends AIOSEOP_Graph_Creativework {
51
  global $post;
52
  global $aioseop_options;
53
 
 
 
54
  $current_url = '';
55
  $current_name = '';
56
  $current_desc = '';
@@ -75,6 +77,26 @@ class AIOSEOP_Graph_WebPage extends AIOSEOP_Graph_Creativework {
75
  $current_url = home_url() . '/';
76
  $current_name = get_the_title();
77
  $current_desc = $this->get_post_description( $post );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  } elseif ( is_singular() || is_single() ) {
79
  $current_url = wp_get_canonical_url( $post );
80
  $current_name = get_the_title();
@@ -118,11 +140,17 @@ class AIOSEOP_Graph_WebPage extends AIOSEOP_Graph_Creativework {
118
  'isPartOf' => array(
119
  '@id' => home_url() . '/#website',
120
  ),
121
-
 
 
122
  );
123
 
124
  // Handles pages.
125
  if ( is_singular() || is_single() ) {
 
 
 
 
126
  if ( has_post_thumbnail( $post ) ) {
127
  $image_id = get_post_thumbnail_id();
128
 
51
  global $post;
52
  global $aioseop_options;
53
 
54
+ $context = AIOSEOP_Context::get_instance();
55
+
56
  $current_url = '';
57
  $current_name = '';
58
  $current_desc = '';
77
  $current_url = home_url() . '/';
78
  $current_name = get_the_title();
79
  $current_desc = $this->get_post_description( $post );
80
+ } elseif ( is_post_type_archive() ) {
81
+ if (
82
+ function_exists( 'is_shop' ) &&
83
+ function_exists( 'wc_get_page_id' ) &&
84
+ is_shop()
85
+ ) {
86
+ // WooCommerce - Shop Page.
87
+ $shop_page = get_post( wc_get_page_id( 'shop' ) );
88
+
89
+ $current_url = wp_get_canonical_url( $shop_page );
90
+ $current_name = get_the_title( $shop_page );
91
+ $current_desc = $this->get_post_description( $shop_page );
92
+ } else {
93
+ // WP - Post Type.
94
+ $wp_obj = get_queried_object();
95
+
96
+ $current_url = get_post_type_archive_link( $post );
97
+ $current_name = $wp_obj->label;
98
+ $current_desc = $wp_obj->description;
99
+ }
100
  } elseif ( is_singular() || is_single() ) {
101
  $current_url = wp_get_canonical_url( $post );
102
  $current_name = get_the_title();
140
  'isPartOf' => array(
141
  '@id' => home_url() . '/#website',
142
  ),
143
+ 'breadcrumb' => array(
144
+ '@id' => $context->get_url() . '#breadcrumblist',
145
+ ),
146
  );
147
 
148
  // Handles pages.
149
  if ( is_singular() || is_single() ) {
150
+ if ( is_attachment() ) {
151
+ unset( $rtn_data['breadcrumb'] );
152
+ }
153
+
154
  if ( has_post_thumbnail( $post ) ) {
155
  $image_id = get_post_thumbnail_id();
156
 
inc/schema/graphs/graph.php CHANGED
@@ -152,7 +152,7 @@ abstract class AIOSEOP_Graph {
152
 
153
  // Encode to json string, and remove string type around shortcodes.
154
  if ( version_compare( PHP_VERSION, '5.4', '>=' ) ) {
155
- $schema_data = wp_json_encode( (object) $schema_data, JSON_UNESCAPED_SLASHES ); // phpcs:ignore PHPCompatibility.Constants.NewConstants.json_unescaped_slashesFound
156
  } else {
157
  // PHP <= 5.3 compatibility.
158
  $schema_data = wp_json_encode( (object) $schema_data );
152
 
153
  // Encode to json string, and remove string type around shortcodes.
154
  if ( version_compare( PHP_VERSION, '5.4', '>=' ) ) {
155
+ $schema_data = wp_json_encode( (object) $schema_data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); // phpcs:ignore PHPCompatibility.Constants.NewConstants
156
  } else {
157
  // PHP <= 5.3 compatibility.
158
  $schema_data = wp_json_encode( (object) $schema_data );
inc/schema/schema-builder.php CHANGED
@@ -44,6 +44,9 @@ class AIOSEOP_Schema_Builder {
44
  require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/graphs/graph-organization.php';
45
  require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/graphs/graph-person.php';
46
 
 
 
 
47
  require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/graphs/graph-creativework.php';
48
  require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/graphs/graph-article.php';
49
  require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/graphs/graph-website.php';
@@ -53,9 +56,12 @@ class AIOSEOP_Schema_Builder {
53
  require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/graphs/graph-profilepage.php';
54
  require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/graphs/graph-searchresultspage.php';
55
 
 
 
56
  $graphs = array(
57
  // Keys/Slugs follow Schema's @type format.
58
  'Article' => new AIOSEOP_Graph_Article(),
 
59
  'CollectionPage' => new AIOSEOP_Graph_CollectionPage(),
60
  'Organization' => new AIOSEOP_Graph_Organization(),
61
  'Person' => new AIOSEOP_Graph_Person(),
@@ -70,7 +76,7 @@ class AIOSEOP_Schema_Builder {
70
  *
71
  * @since 3.2
72
  *
73
- * @param $graphs Array containing schema objects that are currently active.
74
  */
75
  $graphs = apply_filters( 'aioseop_register_schema_objects', $graphs );
76
 
@@ -109,20 +115,25 @@ class AIOSEOP_Schema_Builder {
109
  // TODO Add layout customizations to settings.
110
  if ( is_front_page() || is_home() ) {
111
  array_push( $layout['@graph'], '[aioseop_schema_WebPage]' );
 
112
  } elseif ( is_archive() ) {
113
  if ( is_author() ) {
114
  array_push( $layout['@graph'], '[aioseop_schema_ProfilePage]' );
115
  array_push( $layout['@graph'], '[aioseop_schema_Person]' );
 
116
  } elseif ( is_post_type_archive() ) {
117
  array_push( $layout['@graph'], '[aioseop_schema_CollectionPage]' );
 
118
  } elseif ( is_tax() || is_category() || is_tag() ) {
119
  array_push( $layout['@graph'], '[aioseop_schema_CollectionPage]' );
 
120
  // Remove when Custom Taxonomies is supported.
121
  if ( is_tax() ) {
122
  $layout = array();
123
  }
124
  } elseif ( is_date() ) {
125
  array_push( $layout['@graph'], '[aioseop_schema_CollectionPage]' );
 
126
  }
127
  } elseif ( is_singular() || is_single() ) {
128
  global $post;
@@ -134,6 +145,7 @@ class AIOSEOP_Schema_Builder {
134
  array_push( $layout['@graph'], '[aioseop_schema_Article]' );
135
  array_push( $layout['@graph'], '[aioseop_schema_Person]' );
136
  }
 
137
 
138
  // Remove when CPT is supported.
139
  if ( ! in_array( get_post_type( $post ), array( 'post', 'page' ) ) ) {
@@ -141,6 +153,7 @@ class AIOSEOP_Schema_Builder {
141
  }
142
  } elseif ( is_search() ) {
143
  array_push( $layout['@graph'], '[aioseop_schema_SearchResultsPage]' );
 
144
  } elseif ( is_404() ) {
145
  // Do 404 page.
146
  }
44
  require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/graphs/graph-organization.php';
45
  require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/graphs/graph-person.php';
46
 
47
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/graphs/graph-itemlist.php';
48
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/graphs/graph-breadcrumblist.php';
49
+
50
  require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/graphs/graph-creativework.php';
51
  require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/graphs/graph-article.php';
52
  require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/graphs/graph-website.php';
56
  require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/graphs/graph-profilepage.php';
57
  require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/graphs/graph-searchresultspage.php';
58
 
59
+ require_once AIOSEOP_PLUGIN_DIR . 'inc/schema/aioseop-context.php';
60
+
61
  $graphs = array(
62
  // Keys/Slugs follow Schema's @type format.
63
  'Article' => new AIOSEOP_Graph_Article(),
64
+ 'BreadcrumbList' => new AIOSEOP_Graph_BreadcrumbList(),
65
  'CollectionPage' => new AIOSEOP_Graph_CollectionPage(),
66
  'Organization' => new AIOSEOP_Graph_Organization(),
67
  'Person' => new AIOSEOP_Graph_Person(),
76
  *
77
  * @since 3.2
78
  *
79
+ * @param $graphs array containing schema objects that are currently active.
80
  */
81
  $graphs = apply_filters( 'aioseop_register_schema_objects', $graphs );
82
 
115
  // TODO Add layout customizations to settings.
116
  if ( is_front_page() || is_home() ) {
117
  array_push( $layout['@graph'], '[aioseop_schema_WebPage]' );
118
+ array_push( $layout['@graph'], '[aioseop_schema_BreadcrumbList]' );
119
  } elseif ( is_archive() ) {
120
  if ( is_author() ) {
121
  array_push( $layout['@graph'], '[aioseop_schema_ProfilePage]' );
122
  array_push( $layout['@graph'], '[aioseop_schema_Person]' );
123
+ array_push( $layout['@graph'], '[aioseop_schema_BreadcrumbList]' );
124
  } elseif ( is_post_type_archive() ) {
125
  array_push( $layout['@graph'], '[aioseop_schema_CollectionPage]' );
126
+ array_push( $layout['@graph'], '[aioseop_schema_BreadcrumbList]' );
127
  } elseif ( is_tax() || is_category() || is_tag() ) {
128
  array_push( $layout['@graph'], '[aioseop_schema_CollectionPage]' );
129
+ array_push( $layout['@graph'], '[aioseop_schema_BreadcrumbList]' );
130
  // Remove when Custom Taxonomies is supported.
131
  if ( is_tax() ) {
132
  $layout = array();
133
  }
134
  } elseif ( is_date() ) {
135
  array_push( $layout['@graph'], '[aioseop_schema_CollectionPage]' );
136
+ array_push( $layout['@graph'], '[aioseop_schema_BreadcrumbList]' );
137
  }
138
  } elseif ( is_singular() || is_single() ) {
139
  global $post;
145
  array_push( $layout['@graph'], '[aioseop_schema_Article]' );
146
  array_push( $layout['@graph'], '[aioseop_schema_Person]' );
147
  }
148
+ array_push( $layout['@graph'], '[aioseop_schema_BreadcrumbList]' );
149
 
150
  // Remove when CPT is supported.
151
  if ( ! in_array( get_post_type( $post ), array( 'post', 'page' ) ) ) {
153
  }
154
  } elseif ( is_search() ) {
155
  array_push( $layout['@graph'], '[aioseop_schema_SearchResultsPage]' );
156
+ array_push( $layout['@graph'], '[aioseop_schema_BreadcrumbList]' );
157
  } elseif ( is_404() ) {
158
  // Do 404 page.
159
  }
js/admin/aioseop-about.js ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var aioseopAbout;
2
+
3
+ jQuery(function ($) {
4
+
5
+ aioseopAbout = {
6
+
7
+ /**
8
+ * Initializes the code.
9
+ *
10
+ * @since 3.4.0
11
+ */
12
+ init: function () {
13
+ aioseopAbout.addEventListeners();
14
+ },
15
+
16
+ /**
17
+ * Adds the required event listener to the addon buttons.
18
+ *
19
+ * @since 3.4.0
20
+ */
21
+ addEventListeners: function () {
22
+ if (!$('#aioseop-admin-addons').length) {
23
+ return;
24
+ }
25
+
26
+ $( '.addon-item .details' ).matchHeight( { byrow: false, property: 'height' } );
27
+
28
+ $(document).on('click', '#aioseop-admin-addons .addon-item button', function (event) {
29
+ event.preventDefault();
30
+
31
+ if ($(this).hasClass('disabled')) {
32
+ return false;
33
+ }
34
+
35
+ aioseopAbout.addonToggle($(this));
36
+ });
37
+ },
38
+
39
+ addonToggle: function (button) {
40
+
41
+ let pluginContainer = button.closest('.addon-item');
42
+ let downloadUrl = button.attr('data-plugin');
43
+ let action,
44
+ cssClass,
45
+ statusText,
46
+ successText,
47
+ successButtonText,
48
+ errorText,
49
+ errorButtonText;
50
+
51
+ if (button.hasClass('status-go-to-url')) {
52
+ window.open(button.attr('data-plugin'), '_blank');
53
+ return;
54
+ }
55
+
56
+ button.prop('disabled', true).addClass('loading');
57
+ button.text(aioseopAboutData.aioseopL10n.wait);
58
+
59
+ if (button.hasClass('status-download')) {
60
+ action = 'aioseop_install_plugin';
61
+ cssClass = 'status-active button disabled';
62
+
63
+ statusText = aioseopAboutData.aioseopL10n.active;
64
+ successButtonText = aioseopAboutData.aioseopL10n.activated;
65
+
66
+ errorText = aioseopAboutData.aioseopL10n.install_failed;
67
+ errorButtonText = aioseopAboutData.aioseopL10n.install;
68
+ }
69
+
70
+ else if( button.hasClass('status-inactive')) {
71
+ action = 'aioseop_activate_plugin';
72
+ cssClass = 'status-active button disabled';
73
+
74
+ statusText = aioseopAboutData.aioseopL10n.active;
75
+ successButtonText = aioseopAboutData.aioseopL10n.activated;
76
+
77
+ errorText = aioseopAboutData.aioseopL10n.activation_failed;
78
+ errorButtonText = aioseopAboutData.aioseopL10n.activate;
79
+ }
80
+
81
+ else {
82
+ return;
83
+ }
84
+
85
+ $.ajax(
86
+ {
87
+ type: "POST",
88
+ url: aioseopAboutData.requestUrl,
89
+ data: {
90
+ action: action,
91
+ _ajax_nonce: aioseopAboutData.nonce,
92
+ plugin: downloadUrl,
93
+ },
94
+ success: function (response) {
95
+ if (response.success) {
96
+ successText = response.data.msg;
97
+
98
+ if ('aioseop_install_plugin' === action) {
99
+ button.attr('data-plugin', response.data.basename);
100
+
101
+ if (!response.data.is_activated) {
102
+ cssClass = 'status-inactive button';
103
+ statusText = aioseopAboutData.aioseopL10n.inactive;
104
+ }
105
+ }
106
+
107
+ pluginContainer.find('.actions').append('<div class="msg success">' + successText + '</div>');
108
+ pluginContainer.find('span.status-label')
109
+ .removeClass('status-active status-inactive status-download')
110
+ .addClass(cssClass)
111
+ .removeClass('button button-primary button-secondary disabled')
112
+ .text(statusText);
113
+ button
114
+ .removeClass('status-active status-inactive status-download')
115
+ .removeClass('button button-primary button-secondary disabled')
116
+ .addClass(cssClass).html(successButtonText);
117
+ } else {
118
+ pluginContainer.find('.actions').append('<div class="msg error">' + errorText + '</div>');
119
+ button.text(errorButtonText);
120
+ }
121
+
122
+ button.prop('disabled', false).removeClass('loading');
123
+
124
+ // Clear messages after 3 seconds.
125
+ setTimeout(function () {
126
+ $('.addon-item .msg').remove();
127
+ }, 3000);
128
+ },
129
+ error: function () {
130
+ console.log("Couldn't download or install add-on.");
131
+ }
132
+ }
133
+ );
134
+ }
135
+ }
136
+
137
+ aioseopAbout.init();
138
+
139
+ });
js/admin/aioseop-count-chars-old.js CHANGED
@@ -4,8 +4,7 @@
4
  * @summary Binds input elements and counts characters for Title and Description on Post Edit, Post New,
5
  * & AIOSEOP General Settings screens.
6
  *
7
- * @author Michael Torbert.
8
- * @author Semper Fi Web Design.
9
  * @copyright https://semperplugins.com
10
  * @version 2.9.2
11
  */
4
  * @summary Binds input elements and counts characters for Title and Description on Post Edit, Post New,
5
  * & AIOSEOP General Settings screens.
6
  *
7
+ * @author All in One SEO Team.
 
8
  * @copyright https://semperplugins.com
9
  * @version 2.9.2
10
  */
js/admin/aioseop-flyout.js ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var aioseopFlyout;
2
+
3
+ jQuery(function($) {
4
+
5
+ aioseopFlyout = {
6
+
7
+ init: function() {
8
+
9
+ // Flyout Menu Elements.
10
+ var $flyoutMenu = $( '#aioseop-flyout' );
11
+
12
+ if ( $flyoutMenu.length === 0 ) {
13
+ return;
14
+ }
15
+
16
+ var $head = $flyoutMenu.find( '.aioseop-flyout-head' ),
17
+ $sullie = $head.find( 'img' ),
18
+ menu = {
19
+ state: 'inactive',
20
+ srcInactive: $sullie.attr( 'src' ),
21
+ srcActive: $sullie.data( 'active' ),
22
+ };
23
+
24
+ // Click on the menu head icon.
25
+ $head.on( 'click', function( e ) {
26
+
27
+ e.preventDefault();
28
+
29
+ if ( menu.state === 'active' ) {
30
+ $flyoutMenu.removeClass( 'opened' );
31
+ $sullie.attr( 'src', menu.srcInactive );
32
+ menu.state = 'inactive';
33
+ } else {
34
+ $flyoutMenu.addClass( 'opened' );
35
+ $sullie.attr( 'src', menu.srcActive );
36
+ menu.state = 'active';
37
+ }
38
+ } );
39
+
40
+ /*
41
+
42
+ // Page elements and other values.
43
+ var $wpfooter = $( '#wpfooter' );
44
+
45
+ if ( $wpfooter.length === 0 ) {
46
+ return;
47
+ }
48
+
49
+ var $overlap = $( '#aioseop-overview, #aioseop-entries-list' ),
50
+ wpfooterTop = $wpfooter.offset().top,
51
+ wpfooterBottom = wpfooterTop + $wpfooter.height(),
52
+ overlapBottom = $overlap.length > 0 ? $overlap.offset().top + $overlap.height() + 85 : 0;
53
+
54
+ // Hide menu if scrolled down to the bottom of the page.
55
+ $( window ).on( 'resize scroll', _.debounce( function( e ) {
56
+
57
+ var viewTop = $( window ).scrollTop(),
58
+ viewBottom = viewTop + $( window ).height();
59
+
60
+ if ( wpfooterBottom <= viewBottom && wpfooterTop >= viewTop && overlapBottom > viewBottom ) {
61
+ $flyoutMenu.addClass( 'out' );
62
+ } else {
63
+ $flyoutMenu.removeClass( 'out' );
64
+ }
65
+ }, 50 ) );
66
+
67
+ $( window ).trigger( 'scroll' );
68
+
69
+ */
70
+ },
71
+ }
72
+
73
+ aioseopFlyout.init();
74
+ });
js/admin/aioseop-link-attributes-classic-editor.js ADDED
@@ -0,0 +1,886 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // jshint ignore: start
2
+ /* eslint-disable */
3
+
4
+ /**
5
+ * Allows users to add nofollow, sponsored and title attributes to links in the Classic Editor.
6
+ *
7
+ * @since 3.4.0
8
+ * @link https://github.com/WordPress/WordPress/blob/master/wp-includes/js/wplink.js
9
+ */
10
+
11
+ (function ($, aioseopL10n, wp) {
12
+ var editor, searchTimer, River, Query, correctedURL,
13
+ emailRegexp = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,63}$/i,
14
+ urlRegexp = /^(https?|ftp):\/\/[A-Z0-9.-]+\.[A-Z]{2,63}[^ "]*$/i,
15
+ inputs = {},
16
+ rivers = {},
17
+ isTouch = ('ontouchend' in document);
18
+
19
+ function getLink() {
20
+ if (editor) {
21
+ return editor.$('a[data-wplink-edit="true"]');
22
+ }
23
+
24
+ return null;
25
+ }
26
+
27
+ window.wpLink = {
28
+ timeToTriggerRiver: 150,
29
+ minRiverAJAXDuration: 200,
30
+ riverBottomThreshold: 5,
31
+ keySensitivity: 100,
32
+ lastSearch: '',
33
+ textarea: '',
34
+ modalOpen: false,
35
+
36
+ init: function () {
37
+ // All in One SEO Pack - Begin
38
+ $("#wp-link .link-target").append('<br><label style="padding-left: 4px;"><span>&nbsp;</span><input type="checkbox" id="tanfl-add-nofollow">' + aioseopL10n.noFollow + "</label>");
39
+ $("#wp-link .link-target").append('<br><label style="padding-left: 4px;"><span>&nbsp;</span><input type="checkbox" id="tanfl-add-sponsored">' + aioseopL10n.sponsored + '</label><br>');
40
+ $(".wp-link-text-field").before('<div class="link-title-field"><label><span style="padding-left: 4px;">' + aioseopL10n.labelTitle + '</span><input id="wp-link-title" type="text" name="linktitle" /></label></div>');
41
+ $('<style type="text/css"> .has-text-field #wp-link .query-results { top: 256px !important; } #wp-link-wrap.search-panel-visible {height: 549px !important;}</style>').appendTo("head");
42
+ // All in One SEO Pack - End
43
+
44
+ inputs.wrap = $('#wp-link-wrap');
45
+ inputs.dialog = $('#wp-link');
46
+ inputs.backdrop = $('#wp-link-backdrop');
47
+ inputs.submit = $('#wp-link-submit');
48
+ inputs.close = $('#wp-link-close');
49
+
50
+ // All in One SEO Pack - Begin
51
+ inputs.tanfl = $('#tanfl-add-nofollow');
52
+ inputs.tanfl_sponsored = $('#tanfl-add-sponsored');
53
+ inputs.title = $('#wp-link-title');
54
+ // All in One SEO Pack - End
55
+
56
+ // Input.
57
+ inputs.text = $('#wp-link-text');
58
+ inputs.url = $('#wp-link-url');
59
+ inputs.nonce = $('#_ajax_linking_nonce');
60
+ inputs.openInNewTab = $('#wp-link-target');
61
+ inputs.search = $('#wp-link-search');
62
+
63
+ // Build rivers.
64
+ rivers.search = new River($('#search-results'));
65
+ rivers.recent = new River($('#most-recent-results'));
66
+ rivers.elements = inputs.dialog.find('.query-results');
67
+
68
+ // Get search notice text.
69
+ inputs.queryNotice = $('#query-notice-message');
70
+ inputs.queryNoticeTextDefault = inputs.queryNotice.find('.query-notice-default');
71
+ inputs.queryNoticeTextHint = inputs.queryNotice.find('.query-notice-hint');
72
+
73
+ // Bind event handlers.
74
+ inputs.dialog.keydown(wpLink.keydown);
75
+ inputs.dialog.keyup(wpLink.keyup);
76
+ inputs.submit.click(function (event) {
77
+ event.preventDefault();
78
+ wpLink.update();
79
+ });
80
+
81
+ inputs.close.add(inputs.backdrop).add('#wp-link-cancel button').click(function (event) {
82
+ event.preventDefault();
83
+ wpLink.close();
84
+ });
85
+
86
+ rivers.elements.on('river-select', wpLink.updateFields);
87
+
88
+ // Display 'hint' message when search field or 'query-results' box are focused.
89
+ inputs.search.on('focus.wplink', function () {
90
+ inputs.queryNoticeTextDefault.hide();
91
+ inputs.queryNoticeTextHint.removeClass('screen-reader-text').show();
92
+ }).on('blur.wplink', function () {
93
+ inputs.queryNoticeTextDefault.show();
94
+ inputs.queryNoticeTextHint.addClass('screen-reader-text').hide();
95
+ });
96
+
97
+ inputs.search.on('keyup input', function () {
98
+ window.clearTimeout(searchTimer);
99
+ searchTimer = window.setTimeout(function () {
100
+ wpLink.searchInternalLinks();
101
+ }, 500);
102
+ });
103
+
104
+ inputs.url.on('paste', function () {
105
+ setTimeout(wpLink.correctURL, 0);
106
+ });
107
+
108
+ inputs.url.on('blur', wpLink.correctURL);
109
+ },
110
+
111
+ // If URL wasn't corrected last time and doesn't start with http:, https:, ? # or /, prepend http://.
112
+ correctURL: function () {
113
+ var url = $.trim(inputs.url.val());
114
+
115
+ if (url && correctedURL !== url && ! /^(?:[a-z]+:|#|\?|\.|\/)/.test(url)) {
116
+ inputs.url.val('http://' + url);
117
+ correctedURL = url;
118
+ }
119
+ },
120
+
121
+ open: function (editorId, url, text) {
122
+ var ed,
123
+ $body = $(document.body);
124
+
125
+ $body.addClass('modal-open');
126
+ wpLink.modalOpen = true;
127
+
128
+ wpLink.range = null;
129
+
130
+ if (editorId) {
131
+ window.wpActiveEditor = editorId;
132
+ }
133
+
134
+ if (!window.wpActiveEditor) {
135
+ return;
136
+ }
137
+
138
+ this.textarea = $('#' + window.wpActiveEditor).get(0);
139
+
140
+ if (typeof window.tinymce !== 'undefined') {
141
+ // Make sure the link wrapper is the last element in the body,
142
+ // or the inline editor toolbar may show above the backdrop.
143
+ $body.append(inputs.backdrop, inputs.wrap);
144
+
145
+ ed = window.tinymce.get(window.wpActiveEditor);
146
+
147
+ if (ed && !ed.isHidden()) {
148
+ editor = ed;
149
+ } else {
150
+ editor = null;
151
+ }
152
+ }
153
+
154
+ if (!wpLink.isMCE() && document.selection) {
155
+ this.textarea.focus();
156
+ this.range = document.selection.createRange();
157
+ }
158
+
159
+ inputs.wrap.show();
160
+ inputs.backdrop.show();
161
+
162
+ wpLink.refresh(url, text);
163
+
164
+ $(document).trigger('wplink-open', inputs.wrap);
165
+ },
166
+
167
+ isMCE: function () {
168
+ return editor && !editor.isHidden();
169
+ },
170
+
171
+ refresh: function (url, text) {
172
+ var linkText = '';
173
+
174
+ // Refresh rivers (clear links, check visibility).
175
+ rivers.search.refresh();
176
+ rivers.recent.refresh();
177
+
178
+ if (wpLink.isMCE()) {
179
+ wpLink.mceRefresh(url, text);
180
+ } else {
181
+ // For the Text editor the "Link text" field is always shown.
182
+ if (!inputs.wrap.hasClass('has-text-field')) {
183
+ inputs.wrap.addClass('has-text-field');
184
+ }
185
+
186
+ if (document.selection) {
187
+ // Old IE.
188
+ linkText = document.selection.createRange().text || text || '';
189
+ } else if (typeof this.textarea.selectionStart !== 'undefined' &&
190
+ (this.textarea.selectionStart !== this.textarea.selectionEnd)) {
191
+ // W3C.
192
+ text = this.textarea.value.substring(this.textarea.selectionStart, this.textarea.selectionEnd) || text || '';
193
+ }
194
+
195
+ inputs.text.val(text);
196
+ wpLink.setDefaultValues();
197
+ }
198
+
199
+ if (isTouch) {
200
+ // Close the onscreen keyboard.
201
+ inputs.url.focus().blur();
202
+ } else {
203
+ /*
204
+ * Focus the URL field and highlight its contents.
205
+ * If this is moved above the selection changes,
206
+ * IE will show a flashing cursor over the dialog.
207
+ */
208
+ window.setTimeout(function () {
209
+ inputs.url[0].select();
210
+ inputs.url.focus();
211
+ });
212
+ }
213
+
214
+ // Load the most recent results if this is the first time opening the panel.
215
+ if (!rivers.recent.ul.children().length) {
216
+ rivers.recent.ajax();
217
+ }
218
+
219
+ correctedURL = inputs.url.val().replace(/^http:\/\//, '');
220
+
221
+ // All in One SEO Pack - Begin
222
+ jQuery('.has-text-field #wp-link .query-results').css('margin-top', 25);
223
+ // All in One SEO Pack - End
224
+ },
225
+
226
+ hasSelectedText: function (linkNode) {
227
+ var node, nodes, i, html = editor.selection.getContent();
228
+
229
+ // Partial html and not a fully selected anchor element.
230
+ if (/</.test(html) && (! /^<a [^>]+>[^<]+<\/a>$/.test(html) || html.indexOf('href=') === -1)) {
231
+ return false;
232
+ }
233
+
234
+ if (linkNode.length) {
235
+ nodes = linkNode[0].childNodes;
236
+
237
+ if (!nodes || !nodes.length) {
238
+ return false;
239
+ }
240
+
241
+ for (i = nodes.length - 1; i >= 0; i--) {
242
+ node = nodes[i];
243
+
244
+ if (node.nodeType != 3 && !window.tinymce.dom.BookmarkManager.isBookmarkNode(node)) {
245
+ return false;
246
+ }
247
+ }
248
+ }
249
+
250
+ return true;
251
+ },
252
+
253
+ mceRefresh: function (searchStr, text) {
254
+ var linkText, href,
255
+ linkNode = getLink(),
256
+ onlyText = this.hasSelectedText(linkNode);
257
+
258
+ if (linkNode.length) {
259
+ linkText = linkNode.text();
260
+ href = linkNode.attr('href');
261
+
262
+ if (!$.trim(linkText)) {
263
+ linkText = text || '';
264
+ }
265
+
266
+ if (searchStr && (urlRegexp.test(searchStr) || emailRegexp.test(searchStr))) {
267
+ href = searchStr;
268
+ }
269
+
270
+ if (href !== '_wp_link_placeholder') {
271
+ inputs.url.val(href);
272
+ inputs.openInNewTab.prop('checked', '_blank' === linkNode.attr('target'));
273
+ inputs.submit.val(aioseopL10n.update);
274
+ } else {
275
+ this.setDefaultValues(linkText);
276
+ }
277
+
278
+ if (searchStr && searchStr !== href) {
279
+ // All in One SEO Pack - Begin
280
+ inputs.url.val(searchStr);
281
+ // All in One SEO Pack - End
282
+ // The user has typed something in the inline dialog. Trigger a search with it.
283
+ inputs.search.val(searchStr);
284
+ } else {
285
+ inputs.search.val('');
286
+ }
287
+
288
+ // All in One SEO Pack - Begin
289
+ if (editor.dom.getAttrib(linkNode, 'rel').indexOf("nofollow") >= 0) {
290
+ inputs.tanfl.prop('checked', true);
291
+ } else {
292
+ inputs.tanfl.prop('checked', false);
293
+ }
294
+ if (editor.dom.getAttrib(linkNode, 'rel').indexOf("sponsored") >= 0) {
295
+ inputs.tanfl_sponsored.prop('checked', true);
296
+ } else {
297
+ inputs.tanfl_sponsored.prop('checked', false);
298
+ }
299
+ inputs.title.val(editor.dom.getAttrib(linkNode, 'title'));
300
+ // All in One SEO Pack - End
301
+
302
+ // Always reset the search.
303
+ window.setTimeout(function () {
304
+ wpLink.searchInternalLinks();
305
+ });
306
+ } else {
307
+ linkText = editor.selection.getContent({ format: 'text' }) || text || '';
308
+ this.setDefaultValues(linkText);
309
+ // All in One SEO Pack - Begin
310
+ inputs.url.val(searchStr);
311
+ // All in One SEO Pack - End
312
+ }
313
+
314
+ if (onlyText) {
315
+ inputs.text.val(linkText);
316
+ inputs.wrap.addClass('has-text-field');
317
+ } else {
318
+ inputs.text.val('');
319
+ inputs.wrap.removeClass('has-text-field');
320
+ }
321
+ },
322
+
323
+ close: function (reset) {
324
+ $(document.body).removeClass('modal-open');
325
+ wpLink.modalOpen = false;
326
+
327
+ if (reset !== 'noReset') {
328
+ if (!wpLink.isMCE()) {
329
+ wpLink.textarea.focus();
330
+
331
+ if (wpLink.range) {
332
+ wpLink.range.moveToBookmark(wpLink.range.getBookmark());
333
+ wpLink.range.select();
334
+ }
335
+ } else {
336
+ if (editor.plugins.wplink) {
337
+ editor.plugins.wplink.close();
338
+ }
339
+
340
+ editor.focus();
341
+ }
342
+ }
343
+
344
+ inputs.backdrop.hide();
345
+ inputs.wrap.hide();
346
+
347
+ correctedURL = false;
348
+
349
+ $(document).trigger('wplink-close', inputs.wrap);
350
+ },
351
+
352
+ getAttrs: function () {
353
+ wpLink.correctURL();
354
+
355
+ // All in One SEO Pack - Begin
356
+ var tanfl_value = '';
357
+ if (inputs.tanfl.prop('checked')) {
358
+ tanfl_value += 'nofollow ';
359
+ }
360
+ if (inputs.tanfl_sponsored.prop('checked')) {
361
+ tanfl_value += 'sponsored';
362
+ }
363
+ // All in One SEO Pack - End
364
+
365
+ return {
366
+ href: $.trim(inputs.url.val()),
367
+ target: inputs.openInNewTab.prop('checked') ? '_blank' : null,
368
+ // All in One SEO Pack - Begin
369
+ rel: '' !== tanfl_value ? tanfl_value : null,
370
+ title: '' !== inputs.title.val() ? $.trim(inputs.title.val()) : null
371
+ // All in One SEO Pack - End
372
+ };
373
+ },
374
+
375
+ buildHtml: function (attrs) {
376
+ var html = '<a href="' + attrs.href + '"';
377
+
378
+ // All in One SEO Pack - Begin
379
+ if (attrs.title) {
380
+ title = attrs.title.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
381
+ html += ' title="' + title + '"';
382
+ }
383
+
384
+ if (attrs.target) {
385
+ if (attrs.rel) {
386
+ html += ' rel="noopener ' + attrs.rel + '" target="' + attrs.target + '"';
387
+ }
388
+ else {
389
+ html += ' rel="noopener" target="' + attrs.target + '"';
390
+ }
391
+ } else {
392
+ if (attrs.rel) {
393
+ html += ' rel="' + attrs.rel + '"';
394
+ }
395
+ }
396
+ // All in One SEO Pack - End
397
+
398
+ return html + '>';
399
+ },
400
+
401
+ update: function () {
402
+ if (wpLink.isMCE()) {
403
+ wpLink.mceUpdate();
404
+ } else {
405
+ wpLink.htmlUpdate();
406
+ }
407
+ },
408
+
409
+ htmlUpdate: function () {
410
+ var attrs, text, html, begin, end, cursor, selection,
411
+ textarea = wpLink.textarea;
412
+
413
+ if (!textarea) {
414
+ return;
415
+ }
416
+
417
+ attrs = wpLink.getAttrs();
418
+ text = inputs.text.val();
419
+
420
+ var parser = document.createElement('a');
421
+ parser.href = attrs.href;
422
+
423
+ if ('javascript:' === parser.protocol || 'data:' === parser.protocol) { // jshint ignore:line
424
+ attrs.href = '';
425
+ }
426
+
427
+ // If there's no href, return.
428
+ if (!attrs.href) {
429
+ return;
430
+ }
431
+
432
+ html = wpLink.buildHtml(attrs);
433
+
434
+ // Insert HTML.
435
+ if (document.selection && wpLink.range) {
436
+ // IE.
437
+ // Note: If no text is selected, IE will not place the cursor
438
+ // inside the closing tag.
439
+ textarea.focus();
440
+ wpLink.range.text = html + (text || wpLink.range.text) + '</a>';
441
+ wpLink.range.moveToBookmark(wpLink.range.getBookmark());
442
+ wpLink.range.select();
443
+
444
+ wpLink.range = null;
445
+ } else if (typeof textarea.selectionStart !== 'undefined') {
446
+ // W3C.
447
+ begin = textarea.selectionStart;
448
+ end = textarea.selectionEnd;
449
+ selection = text || textarea.value.substring(begin, end);
450
+ html = html + selection + '</a>';
451
+ cursor = begin + html.length;
452
+
453
+ // If no text is selected, place the cursor inside the closing tag.
454
+ if (begin === end && !selection) {
455
+ cursor -= 4;
456
+ }
457
+
458
+ textarea.value = (
459
+ textarea.value.substring(0, begin) +
460
+ html +
461
+ textarea.value.substring(end, textarea.value.length)
462
+ );
463
+
464
+ // Update cursor position.
465
+ textarea.selectionStart = textarea.selectionEnd = cursor;
466
+ }
467
+
468
+ wpLink.close();
469
+ textarea.focus();
470
+ $(textarea).trigger('change');
471
+
472
+ // Audible confirmation message when a link has been inserted in the Editor.
473
+ wp.a11y.speak(aioseopL10n.linkInserted);
474
+ },
475
+
476
+ mceUpdate: function () {
477
+ var attrs = wpLink.getAttrs(),
478
+ $link, text, hasText;
479
+
480
+ var parser = document.createElement('a');
481
+ parser.href = attrs.href;
482
+
483
+ if ('javascript:' === parser.protocol || 'data:' === parser.protocol) { // jshint ignore:line
484
+ attrs.href = '';
485
+ }
486
+
487
+ if (!attrs.href) {
488
+ editor.execCommand('unlink');
489
+ wpLink.close();
490
+ return;
491
+ }
492
+
493
+ $link = getLink();
494
+
495
+ editor.undoManager.transact(function () {
496
+ if (!$link.length) {
497
+ editor.execCommand('mceInsertLink', false, { href: '_wp_link_placeholder', 'data-wp-temp-link': 1 });
498
+ $link = editor.$('a[data-wp-temp-link="1"]').removeAttr('data-wp-temp-link');
499
+ hasText = $.trim($link.text());
500
+ }
501
+
502
+ if (!$link.length) {
503
+ editor.execCommand('unlink');
504
+ } else {
505
+ if (inputs.wrap.hasClass('has-text-field')) {
506
+ text = inputs.text.val();
507
+
508
+ if (text) {
509
+ $link.text(text);
510
+ } else if (!hasText) {
511
+ $link.text(attrs.href);
512
+ }
513
+ }
514
+
515
+ attrs['data-wplink-edit'] = null;
516
+ attrs['data-mce-href'] = attrs.href;
517
+ $link.attr(attrs);
518
+ }
519
+ });
520
+
521
+ // All in One SEO Pack - Begin
522
+ $link = editor.$('a[data-wplink-url-error="1"]').removeAttr('data-wplink-url-error');
523
+ // All in One SEO Pack - End
524
+
525
+ wpLink.close('noReset');
526
+ editor.focus();
527
+
528
+ if ($link.length) {
529
+ editor.selection.select($link[0]);
530
+
531
+ if (editor.plugins.wplink) {
532
+ editor.plugins.wplink.checkLink($link[0]);
533
+ }
534
+ }
535
+
536
+ editor.nodeChanged();
537
+
538
+ // Audible confirmation message when a link has been inserted in the Editor.
539
+ wp.a11y.speak(aioseopL10n.linkInserted);
540
+ },
541
+
542
+ updateFields: function (e, li) {
543
+ inputs.url.val(li.children('.item-permalink').val());
544
+ // All in One SEO Pack - Begin
545
+ inputs.title.val(li.hasClass('no-title') ? '' : li.children('.item-title').text());
546
+ // All in One SEO Pack - End
547
+
548
+ if (inputs.wrap.hasClass('has-text-field') && !inputs.text.val()) {
549
+ inputs.text.val(li.children('.item-title').text());
550
+ }
551
+ },
552
+
553
+ getUrlFromSelection: function (selection) {
554
+ if (!selection) {
555
+ if (this.isMCE()) {
556
+ selection = editor.selection.getContent({ format: 'text' });
557
+ } else if (document.selection && wpLink.range) {
558
+ selection = wpLink.range.text;
559
+ } else if (typeof this.textarea.selectionStart !== 'undefined') {
560
+ selection = this.textarea.value.substring(this.textarea.selectionStart, this.textarea.selectionEnd);
561
+ }
562
+ }
563
+
564
+ selection = $.trim(selection);
565
+
566
+ if (selection && emailRegexp.test(selection)) {
567
+ // Selection is email address.
568
+ return 'mailto:' + selection;
569
+ } else if (selection && urlRegexp.test(selection)) {
570
+ // Selection is URL.
571
+ return selection.replace(/&amp;|&#0?38;/gi, '&');
572
+ }
573
+
574
+ return '';
575
+ },
576
+
577
+ setDefaultValues: function (selection) {
578
+ inputs.url.val(this.getUrlFromSelection(selection));
579
+
580
+ // All in One SEO Pack - Begin
581
+ inputs.title.val('');
582
+ inputs.openInNewTab.prop('checked', false);
583
+ inputs.tanfl.prop('checked', false);
584
+ inputs.tanfl_sponsored.prop('checked', false);
585
+ // All in One SEO Pack - End
586
+
587
+ // Empty the search field and swap the "rivers".
588
+ inputs.search.val('');
589
+ wpLink.searchInternalLinks();
590
+
591
+ // Update save prompt.
592
+ inputs.submit.val(aioseopL10n.save);
593
+ },
594
+
595
+ searchInternalLinks: function () {
596
+ var waiting,
597
+ search = inputs.search.val() || '',
598
+ minInputLength = parseInt(aioseopL10n.minInputLength, 10) || 3;
599
+
600
+ if (search.length >= minInputLength) {
601
+ rivers.recent.hide();
602
+ rivers.search.show();
603
+
604
+ // Don't search if the keypress didn't change the title.
605
+ if (wpLink.lastSearch == search)
606
+ return;
607
+
608
+ wpLink.lastSearch = search;
609
+ waiting = inputs.search.parent().find('.spinner').addClass('is-active');
610
+
611
+ rivers.search.change(search);
612
+ rivers.search.ajax(function () {
613
+ waiting.removeClass('is-active');
614
+ });
615
+ } else {
616
+ rivers.search.hide();
617
+ rivers.recent.show();
618
+ }
619
+ },
620
+
621
+ next: function () {
622
+ rivers.search.next();
623
+ rivers.recent.next();
624
+ },
625
+
626
+ prev: function () {
627
+ rivers.search.prev();
628
+ rivers.recent.prev();
629
+ },
630
+
631
+ keydown: function (event) {
632
+ var fn, id;
633
+
634
+ // Escape key.
635
+ if (27 === event.keyCode) {
636
+ wpLink.close();
637
+ event.stopImmediatePropagation();
638
+ // Tab key.
639
+ } else if (9 === event.keyCode) {
640
+ id = event.target.id;
641
+
642
+ // wp-link-submit must always be the last focusable element in the dialog.
643
+ // Following focusable elements will be skipped on keyboard navigation.
644
+ if (id === 'wp-link-submit' && !event.shiftKey) {
645
+ inputs.close.focus();
646
+ event.preventDefault();
647
+ } else if (id === 'wp-link-close' && event.shiftKey) {
648
+ inputs.submit.focus();
649
+ event.preventDefault();
650
+ }
651
+ }
652
+
653
+ // Up Arrow and Down Arrow keys.
654
+ if (event.shiftKey || (38 !== event.keyCode && 40 !== event.keyCode)) {
655
+ return;
656
+ }
657
+
658
+ if (document.activeElement &&
659
+ (document.activeElement.id === 'link-title-field' || document.activeElement.id === 'url-field')) {
660
+ return;
661
+ }
662
+
663
+ // Up Arrow key.
664
+ fn = 38 === event.keyCode ? 'prev' : 'next';
665
+ clearInterval(wpLink.keyInterval);
666
+ wpLink[fn]();
667
+ wpLink.keyInterval = setInterval(wpLink[fn], wpLink.keySensitivity);
668
+ event.preventDefault();
669
+ },
670
+
671
+ keyup: function (event) {
672
+ // Up Arrow and Down Arrow keys.
673
+ if (38 === event.keyCode || 40 === event.keyCode) {
674
+ clearInterval(wpLink.keyInterval);
675
+ event.preventDefault();
676
+ }
677
+ },
678
+
679
+ delayedCallback: function (func, delay) {
680
+ var timeoutTriggered, funcTriggered, funcArgs, funcContext;
681
+
682
+ if (!delay)
683
+ return func;
684
+
685
+ setTimeout(function () {
686
+ if (funcTriggered)
687
+ return func.apply(funcContext, funcArgs);
688
+ // Otherwise, wait.
689
+ timeoutTriggered = true;
690
+ }, delay);
691
+
692
+ return function () {
693
+ if (timeoutTriggered)
694
+ return func.apply(this, arguments);
695
+ // Otherwise, wait.
696
+ funcArgs = arguments;
697
+ funcContext = this;
698
+ funcTriggered = true;
699
+ };
700
+ }
701
+ };
702
+
703
+ River = function (element, search) {
704
+ var self = this;
705
+ this.element = element;
706
+ this.ul = element.children('ul');
707
+ this.contentHeight = element.children('#link-selector-height');
708
+ this.waiting = element.find('.river-waiting');
709
+
710
+ this.change(search);
711
+ this.refresh();
712
+
713
+ $('#wp-link .query-results, #wp-link #link-selector').scroll(function () {
714
+ self.maybeLoad();
715
+ });
716
+ element.on('click', 'li', function (event) {
717
+ self.select($(this), event);
718
+ });
719
+ };
720
+
721
+ $.extend(River.prototype, {
722
+ refresh: function () {
723
+ this.deselect();
724
+ this.visible = this.element.is(':visible');
725
+ },
726
+ show: function () {
727
+ if (!this.visible) {
728
+ this.deselect();
729
+ this.element.show();
730
+ this.visible = true;
731
+ }
732
+ },
733
+ hide: function () {
734
+ this.element.hide();
735
+ this.visible = false;
736
+ },
737
+ // Selects a list item and triggers the river-select event.
738
+ select: function (li, event) {
739
+ var liHeight, elHeight, liTop, elTop;
740
+
741
+ if (li.hasClass('unselectable') || li == this.selected)
742
+ return;
743
+
744
+ this.deselect();
745
+ this.selected = li.addClass('selected');
746
+ // Make sure the element is visible.
747
+ liHeight = li.outerHeight();
748
+ elHeight = this.element.height();
749
+ liTop = li.position().top;
750
+ elTop = this.element.scrollTop();
751
+
752
+ if (liTop < 0) // Make first visible element.
753
+ this.element.scrollTop(elTop + liTop);
754
+ else if (liTop + liHeight > elHeight) // Make last visible element.
755
+ this.element.scrollTop(elTop + liTop - elHeight + liHeight);
756
+
757
+ // Trigger the river-select event.
758
+ this.element.trigger('river-select', [li, event, this]);
759
+ },
760
+ deselect: function () {
761
+ if (this.selected)
762
+ this.selected.removeClass('selected');
763
+ this.selected = false;
764
+ },
765
+ prev: function () {
766
+ if (!this.visible)
767
+ return;
768
+
769
+ var to;
770
+ if (this.selected) {
771
+ to = this.selected.prev('li');
772
+ if (to.length)
773
+ this.select(to);
774
+ }
775
+ },
776
+ next: function () {
777
+ if (!this.visible)
778
+ return;
779
+
780
+ var to = this.selected ? this.selected.next('li') : $('li:not(.unselectable):first', this.element);
781
+ if (to.length)
782
+ this.select(to);
783
+ },
784
+ ajax: function (callback) {
785
+ var self = this,
786
+ delay = this.query.page == 1 ? 0 : wpLink.minRiverAJAXDuration,
787
+ response = wpLink.delayedCallback(function (results, params) {
788
+ self.process(results, params);
789
+ if (callback)
790
+ callback(results, params);
791
+ }, delay);
792
+
793
+ this.query.ajax(response);
794
+ },
795
+ change: function (search) {
796
+ if (this.query && this._search == search)
797
+ return;
798
+
799
+ this._search = search;
800
+ this.query = new Query(search);
801
+ this.element.scrollTop(0);
802
+ },
803
+ process: function (results, params) {
804
+ var list = '', alt = true, classes = '',
805
+ firstPage = params.page == 1;
806
+
807
+ if (!results) {
808
+ if (firstPage) {
809
+ list += '<li class="unselectable no-matches-found"><span class="item-title"><em>' +
810
+ aioseopL10n.noMatchesFound + '</em></span></li>';
811
+ }
812
+ } else {
813
+ $.each(results, function () {
814
+ classes = alt ? 'alternate' : '';
815
+ classes += this.title ? '' : ' no-title';
816
+ list += classes ? '<li class="' + classes + '">' : '<li>';
817
+ list += '<input type="hidden" class="item-permalink" value="' + this.permalink + '" />';
818
+ list += '<span class="item-title">';
819
+ list += this.title ? this.title : aioseopL10n.noTitle;
820
+ list += '</span><span class="item-info">' + this.info + '</span></li>';
821
+ alt = !alt;
822
+ });
823
+ }
824
+
825
+ this.ul[firstPage ? 'html' : 'append'](list);
826
+ },
827
+ maybeLoad: function () {
828
+ var self = this,
829
+ el = this.element,
830
+ bottom = el.scrollTop() + el.height();
831
+
832
+ if (!this.query.ready() || bottom < this.contentHeight.height() - wpLink.riverBottomThreshold)
833
+ return;
834
+
835
+ setTimeout(function () {
836
+ var newTop = el.scrollTop(),
837
+ newBottom = newTop + el.height();
838
+
839
+ if (!self.query.ready() || newBottom < self.contentHeight.height() - wpLink.riverBottomThreshold)
840
+ return;
841
+
842
+ self.waiting.addClass('is-active');
843
+ el.scrollTop(newTop + self.waiting.outerHeight());
844
+
845
+ self.ajax(function () {
846
+ self.waiting.removeClass('is-active');
847
+ });
848
+ }, wpLink.timeToTriggerRiver);
849
+ }
850
+ });
851
+
852
+ Query = function (search) {
853
+ this.page = 1;
854
+ this.allLoaded = false;
855
+ this.querying = false;
856
+ this.search = search;
857
+ };
858
+
859
+ $.extend(Query.prototype, {
860
+ ready: function () {
861
+ return !(this.querying || this.allLoaded);
862
+ },
863
+ ajax: function (callback) {
864
+ var self = this,
865
+ query = {
866
+ action: 'wp-link-ajax',
867
+ page: this.page,
868
+ '_ajax_linking_nonce': inputs.nonce.val()
869
+ };
870
+
871
+ if (this.search)
872
+ query.search = this.search;
873
+
874
+ this.querying = true;
875
+
876
+ $.post(window.ajaxurl, query, function (r) {
877
+ self.page++;
878
+ self.querying = false;
879
+ self.allLoaded = !r;
880
+ callback(r, query);
881
+ }, 'json');
882
+ }
883
+ });
884
+
885
+ $(document).ready(wpLink.init);
886
+ })(jQuery, window.aioseopL10n, window.wp);
js/admin/aioseop-preview-snippet.js CHANGED
@@ -19,6 +19,7 @@ jQuery(function($){
19
  let timeout = 0;
20
  let autogenerateDescriptions = aioseop_preview_snippet.autogenerateDescriptions;
21
  let skipExcerpt = aioseop_preview_snippet.skipExcerpt;
 
22
  let isGutenbergEditor = aioseopIsGutenbergEditor();
23
 
24
  $(window).on("load", function() {
@@ -40,18 +41,18 @@ jQuery(function($){
40
  let postExcerpt = $('#excerpt');
41
 
42
  inputFields.push(docTitle, postExcerpt);
43
- aioseopAddPreviewSnippetEventListeners(inputFields)
44
 
45
  aioseopSetClassicEditorTabSwitchEventListener(aioseopUpdatePreviewSnippet);
46
  aioseopSetClassicEditorEventListener(aioseopUpdatePreviewSnippet);
47
 
48
- $('#content_ifr').load(function() {
49
  aioseopUpdatePreviewSnippet();
50
  });
51
  }
52
  else {
53
  aioseopSetGutenbergEditorEventListener(aioseopUpdatePreviewSnippet);
54
- aioseopAddPreviewSnippetEventListeners(inputFields)
55
  aioseopUpdatePreviewSnippet();
56
  }
57
  }
@@ -138,7 +139,11 @@ jQuery(function($){
138
  * @param string postContent
139
  * @return string description
140
  */
141
- function aioseopGetDescription(postContent) {
 
 
 
 
142
  // Shorten content first to avoid performance drops.
143
  let description = postContent.substring(0, 5000);
144
 
19
  let timeout = 0;
20
  let autogenerateDescriptions = aioseop_preview_snippet.autogenerateDescriptions;
21
  let skipExcerpt = aioseop_preview_snippet.skipExcerpt;
22
+ let dontShortenDescriptions = aioseop_preview_snippet.dontTruncateDescriptions;
23
  let isGutenbergEditor = aioseopIsGutenbergEditor();
24
 
25
  $(window).on("load", function() {
41
  let postExcerpt = $('#excerpt');
42
 
43
  inputFields.push(docTitle, postExcerpt);
44
+ aioseopAddPreviewSnippetEventListeners(inputFields);
45
 
46
  aioseopSetClassicEditorTabSwitchEventListener(aioseopUpdatePreviewSnippet);
47
  aioseopSetClassicEditorEventListener(aioseopUpdatePreviewSnippet);
48
 
49
+ $('#content_ifr').ready(function() {
50
  aioseopUpdatePreviewSnippet();
51
  });
52
  }
53
  else {
54
  aioseopSetGutenbergEditorEventListener(aioseopUpdatePreviewSnippet);
55
+ aioseopAddPreviewSnippetEventListeners(inputFields);
56
  aioseopUpdatePreviewSnippet();
57
  }
58
  }
139
  * @param string postContent
140
  * @return string description
141
  */
142
+ function aioseopGetDescription(postContent) {
143
+ if( 'on' === dontShortenDescriptions ) {
144
+ return aioseopStripMarkup(postContent);
145
+ }
146
+
147
  // Shorten content first to avoid performance drops.
148
  let description = postContent.substring(0, 5000);
149
 
js/admin/aioseop-quickedit.js ADDED
@@ -0,0 +1,171 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var aioseopQuickEdit;
2
+
3
+ (function ($) {
4
+ aioseopQuickEdit = {
5
+
6
+ /**
7
+ * Generates the textarea element and buttons that are used to edit post meta via a column.
8
+ *
9
+ * @since 3.4.0 Refactored function.
10
+ *
11
+ * @param Integer postId The ID of the post.
12
+ * @param String columnName The name of the column/attribute.
13
+ * @param String nonce The nonce.
14
+ */
15
+ aioseop_ajax_edit_meta_form: function (postId, columnName, nonce) {
16
+ let field = $(`#aioseop_${columnName}_${postId}`);
17
+ let dashicon = field.parent().find('.aioseop-quickedit-pencil').first();
18
+ let previousElements = field.html();
19
+ let value = field.text().trim();
20
+
21
+ let textarea = document.createElement('textarea');
22
+ textarea.id = `aioseop_new_${columnName}_${postId}`;
23
+ textarea.classList.add('aioseop-quickedit-input');
24
+ textarea.rows = 4;
25
+ textarea.cols = 32;
26
+
27
+ if( aioseopadmin.i18n.noValue !== value) {
28
+ textarea.innerText = value;
29
+ }
30
+
31
+ let buttons = document.createElement('div');
32
+
33
+ let btnSave = document.createElement('a');
34
+ btnSave.id = `aioseop_save_${columnName}_${postId}`;
35
+ btnSave.classList.add('dashicons', 'dashicons-yes-alt', 'aioseop-quickedit-input-save');
36
+ btnSave.href = 'javascript:void(0);';
37
+ btnSave.title = aioseopadmin.i18n.save;
38
+
39
+ btnSave.addEventListener('click', function () {
40
+ aioseopQuickEdit.handle_post_meta(postId, textarea.value, columnName, nonce, previousElements);
41
+ });
42
+
43
+ let btnCancel = document.createElement('a');
44
+ btnCancel.id = `aioseop_cancel_${columnName}_${postId}`;
45
+ btnCancel.classList.add('dashicons', 'dashicons-dismiss', 'aioseop-quickedit-input-cancel');
46
+ btnCancel.href = 'javascript:void(0);';
47
+ btnCancel.title = aioseopadmin.i18n.cancel;
48
+
49
+ btnCancel.addEventListener('click', function () {
50
+ dashicon.show();
51
+ field.html(previousElements);
52
+ });
53
+
54
+ buttons.append(btnSave, btnCancel);
55
+
56
+ dashicon.hide();
57
+ field.empty().append(textarea, buttons);
58
+ },
59
+
60
+ /**
61
+ * Updates the post meta value via AJAX.
62
+ *
63
+ * @since 3.4.0 Refactored function.
64
+ *
65
+ * @param Integer postId The ID of the post.
66
+ * @param String value The new value of the attribute.
67
+ * @param String columnName The name of the column/attribute.
68
+ * @param String nonce The nonce.
69
+ * @param Object previousElements The initial column elements (dashicon + span).
70
+ */
71
+ handle_post_meta: function (postId, value, columnName, nonce, previousElements) {
72
+ let field = $(`div#aioseop_${columnName}_${postId}`);
73
+
74
+ let message = document.createElement('span');
75
+
76
+ let spinner = document.createElement('img');
77
+ spinner.src = `${aioseopadmin.imgUrl}activity.gif`;
78
+ spinner.classList.add('aioseop-quickedit-spinner');
79
+ spinner.align = 'absmiddle';
80
+
81
+ let span = document.createElement('span');
82
+ span.innerText = aioseopadmin.i18n.wait;
83
+ span.style.float = 'left';
84
+
85
+ message.append(spinner, span);
86
+
87
+ field.fadeOut('fast', function () {
88
+ field.html(message);
89
+
90
+ field.fadeIn('fast', function () {
91
+
92
+ $.ajax({
93
+ type: "POST",
94
+ dataType: "json",
95
+ url: aioseopadmin.requestUrl,
96
+ data: {
97
+ action: "aioseop_ajax_save_meta",
98
+ post_id: postId,
99
+ value: value.trim(),
100
+ key: columnName,
101
+ _ajax_nonce: nonce
102
+ },
103
+ success: function () {
104
+ field.empty().append(previousElements);
105
+
106
+ if('image_title' === columnName) {
107
+ aioseopMediaColumns.updatePostTitle(postId, value);
108
+ }
109
+
110
+ if('' === value) {
111
+ value = `<strong>${aioseopadmin.i18n.noValue}</strong>`;
112
+ }
113
+ $(`#aioseop_${columnName}_${postId}_value`).html(value);
114
+ },
115
+ error: function () {
116
+ field.empty().append(previousElements);
117
+ console.log(`Request to update ${columnName} failed.`);
118
+ }
119
+ });
120
+ });
121
+ });
122
+ }
123
+ }
124
+
125
+ })(jQuery);
126
+
127
+
128
+ //TODO This needs to be moved to another file.
129
+ jQuery(document).on('click', '.visibility-notice', function () {
130
+
131
+ $.ajax({
132
+ url: ajaxurl,
133
+ data: {
134
+ action: 'aioseo_dismiss_visibility_notice'
135
+ }
136
+ });
137
+
138
+ });
139
+
140
+ jQuery(document).on('click', '.yst_notice', function () {
141
+
142
+ $.ajax({
143
+ url: ajaxurl,
144
+ data: {
145
+ action: 'aioseo_dismiss_yst_notice'
146
+ }
147
+ });
148
+
149
+ });
150
+
151
+ jQuery(document).on('click', '.woo-upgrade-notice', function () {
152
+
153
+ $.ajax({
154
+ url: ajaxurl,
155
+ data: {
156
+ action: 'aioseo_dismiss_woo_upgrade_notice'
157
+ }
158
+ });
159
+
160
+ });
161
+
162
+ jQuery(document).on('click', '.sitemap_max_urls_notice', function () {
163
+
164
+ $.ajax({
165
+ url: ajaxurl,
166
+ data: {
167
+ action: 'aioseo_dismiss_sitemap_max_url_notice'
168
+ }
169
+ });
170
+
171
+ });
js/admin/education/aioseop-deactivate-conflicting-plugins.js ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var aioseopDeactivateConflictingPlugins;
2
+
3
+ jQuery(function($) {
4
+
5
+ aioseopDeactivateConflictingPlugins = {
6
+
7
+ init: function() {
8
+ aioseopDeactivateConflictingPlugins.addEventListener();
9
+ },
10
+
11
+ addEventListener: function() {
12
+ let button = $('#aioseop-notice-delay-conflicting_plugin-0');
13
+ button.removeAttr("href");
14
+
15
+ button.on('click', function() {
16
+ $.ajax(
17
+ {
18
+ type: "GET",
19
+ url: aioseopDeactivateConflictingPluginsData.requestUrl,
20
+ data: {
21
+ action: "aioseop_deactivate_conflicting_plugins",
22
+ _ajax_nonce: aioseopDeactivateConflictingPluginsData.nonce
23
+ },
24
+ success: function (response) {
25
+ let isMatch = window.location.href.match(/.*plugins.php.*/g);
26
+ if(isMatch) {
27
+ window.location.reload();
28
+ }
29
+ },
30
+ error: function () {
31
+ console.log("Couldn't deactivate conflicting plugins.");
32
+ }
33
+ }
34
+ );
35
+ });
36
+
37
+ }
38
+ }
39
+
40
+ aioseopDeactivateConflictingPlugins.init();
41
+ });
js/admin/education/aioseop-license-box.js ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var aioseopLicenseBox;
2
+
3
+ jQuery(function ($) {
4
+
5
+ aioseopLicenseBox = {
6
+
7
+ licenseField: $('#aiosp_license_key_wrapper input'),
8
+
9
+ /**
10
+ * Initializes the code.
11
+ *
12
+ * @since 3.4.0
13
+ */
14
+ init: function () {
15
+ aioseopLicenseBox.hideLicenseField();
16
+ aioseopLicenseBox.getLicenseBox();
17
+ },
18
+
19
+ /**
20
+ * Hides the license key field.
21
+ *
22
+ * @since 3.4.0
23
+ */
24
+ hideLicenseField: function() {
25
+ aioseopLicenseBox.licenseField
26
+ .prop( "disabled", true )
27
+ .hide();
28
+ },
29
+
30
+ /**
31
+ * Gets the license box markup from our AJAX endpoint.
32
+ *
33
+ * @since 3.4.0
34
+ */
35
+ getLicenseBox: function () {
36
+ $.ajax(
37
+ {
38
+ type: "GET",
39
+ url: aioseopLicenseBoxData.requestUrl,
40
+ data: {
41
+ action: "aioseop_get_license_box",
42
+ _ajax_nonce: aioseopLicenseBoxData.nonce
43
+ },
44
+ success: function (response) {
45
+ aioseopLicenseBox.prependLicenseBox(response);
46
+ },
47
+ error: function () {
48
+ console.log("Couldn't fetch license box content from our endpoint.");
49
+ }
50
+ }
51
+ );
52
+ },
53
+
54
+ /**
55
+ * Prepends the license box to the General Settings menu.
56
+ *
57
+ * @since 3.4.0
58
+ */
59
+ prependLicenseBox: function (content) {
60
+ aioseopLicenseBox.licenseField.parent().append(content);
61
+ }
62
+ }
63
+
64
+ aioseopLicenseBox.init();
65
+
66
+ });
js/admin/education/aioseop-notice-bar.js ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var aioseopNoticeBar;
2
+
3
+ jQuery(function ($) {
4
+
5
+ aioseopNoticeBar = {
6
+
7
+ /**
8
+ * Initializes the code.
9
+ *
10
+ * @since 3.4.0
11
+ */
12
+ init: function () {
13
+ aioseopNoticeBar.getNoticeBar();
14
+ },
15
+
16
+ /**
17
+ * Gets the notice bar markup from our endpoint.
18
+ *
19
+ * @since 3.4.0
20
+ */
21
+ getNoticeBar: function () {
22
+ $.ajax(
23
+ {
24
+ type: "GET",
25
+ url: aioseopNoticeBarData.requestUrl,
26
+ data: {
27
+ action: "aioseop_get_notice_bar",
28
+ _ajax_nonce: aioseopNoticeBarData.nonce
29
+ },
30
+ success: function (response) {
31
+ if (0 === parseInt(response, 10)) {
32
+ return;
33
+ }
34
+ aioseopNoticeBar.prependNoticeBar(response);
35
+ },
36
+ error: function () {
37
+ console.log("Couldn't fetch notice bar content from our endpoint.");
38
+ }
39
+ }
40
+ );
41
+ },
42
+
43
+ /**
44
+ * Prepends the notice bar to the current screen.
45
+ *
46
+ * @since 3.4.0
47
+ */
48
+ prependNoticeBar: function (content) {
49
+ let wpBody = jQuery('#wpbody-content');
50
+ wpBody.prepend(content);
51
+
52
+ aioseopNoticeBar.addDismissEventListener();
53
+ },
54
+
55
+ /**
56
+ * Adds the required event listener to the dismiss button.
57
+ *
58
+ * @since 3.4.0
59
+ */
60
+ addDismissEventListener: function () {
61
+ $('#aioseop-notice-bar').on('click', '.dismiss', function () {
62
+ let noticeBar = $('#aioseop-notice-bar');
63
+
64
+ noticeBar.addClass('out');
65
+ setTimeout(
66
+ function () {
67
+ noticeBar.remove();
68
+ },
69
+ 300
70
+ );
71
+
72
+ aioseopNoticeBar.dismissNoticeBar();
73
+ });
74
+ },
75
+
76
+ /**
77
+ * Dismisses the notice bar via our endpoint.
78
+ *
79
+ * @since 3.4.0
80
+ */
81
+ dismissNoticeBar: function () {
82
+ $.ajax({
83
+ type: "GET",
84
+ url: aioseopNoticeBarData.requestUrl,
85
+ data: {
86
+ action: "aioseop_dismiss_notice_bar",
87
+ _ajax_nonce: aioseopNoticeBarData.nonce
88
+ },
89
+ error: function () {
90
+ console.log("Couldn't dismiss notice bar.");
91
+ }
92
+ });
93
+ }
94
+ }
95
+
96
+ aioseopNoticeBar.init();
97
+
98
+ });
js/admin/education/aioseop-sitemap-prio-upsell.js ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var aioseopSitemapPrioUpsell;
2
+
3
+ jQuery(function($) {
4
+
5
+ aioseopSitemapPrioUpsell = {
6
+
7
+ init: function() {
8
+ aioseopSitemapPrioUpsell.getSitemapPrioUpsell();
9
+ },
10
+
11
+ getSitemapPrioUpsell: function() {
12
+ $.ajax(
13
+ {
14
+ type: "GET",
15
+ url: aioseopSitemapPrioUpsellData.requestUrl,
16
+ data: {
17
+ action: "aioseop_get_sitemap_prio_upsell",
18
+ _ajax_nonce: aioseopSitemapPrioUpsellData.nonce
19
+ },
20
+ success: function (response) {
21
+ let option = $('#aiosp_sitemap_priority_wrapper .aioseop_option_div').first();
22
+ option.append(response);
23
+ },
24
+ error: function () {
25
+ console.log("Couldn't get sitemap prio upsell content.");
26
+ }
27
+ }
28
+ );
29
+ }
30
+ }
31
+
32
+ aioseopSitemapPrioUpsell.init();
33
+ });
js/admin/education/aioseop-taxonomies-upsell.js ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var aioseopTaxonomiesUpsell;
2
+
3
+ jQuery(function($) {
4
+
5
+ aioseopTaxonomiesUpsell = {
6
+
7
+ /**
8
+ * Initializes the code.
9
+ *
10
+ * @since 3.4.0
11
+ */
12
+ init: function() {
13
+ aioseopTaxonomiesUpsell.getTaxonomiesUpsell();
14
+ },
15
+
16
+ /**
17
+ * Gets the taxonomies upsell markup from our AJAX endpoint.
18
+ *
19
+ * @since 3.4.0
20
+ */
21
+ getTaxonomiesUpsell: function() {
22
+ $.ajax({
23
+ type: "GET",
24
+ url: aioseopTaxonomiesUpsellData.requestUrl,
25
+ data: {
26
+ action: "aioseop_get_taxonomies_upsell",
27
+ _ajax_nonce: aioseopTaxonomiesUpsellData.nonce,
28
+ page_id: aioseopTaxonomiesUpsellData.pageId
29
+ },
30
+ success: function(response) {
31
+ if (0 === parseInt(response, 10) || '' === response) {
32
+ return;
33
+ }
34
+ aioseopTaxonomiesUpsell.appendUpsell(response);
35
+ },
36
+ error: function() {
37
+ console.log("Couldn't fetch taxonomies upsell content from our endpoint.");
38
+ }
39
+ });
40
+ },
41
+
42
+ /**
43
+ * Hides the screen content and shows our upsell.
44
+ *
45
+ * @since 3.4.0
46
+ */
47
+ appendUpsell: function(content) {
48
+ let wrapper = $('#wpcontent .wrap');
49
+ wrapper.append(content);
50
+
51
+ let metaboxPreview = wrapper.find('#poststuff');
52
+ metaboxPreview.find(':input').attr("disabled", true);
53
+
54
+ aioseopTaxonomiesUpsell.addDismissEventListener();
55
+ }
56
+ }
57
+
58
+ aioseopTaxonomiesUpsell.init();
59
+ });
js/admin/education/aioseop-video-sitemap-upsell.js ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var aioseopVideoSitemapUpsell;
2
+
3
+ jQuery(function($) {
4
+
5
+ aioseopVideoSitemapUpsell = {
6
+
7
+ /**
8
+ * Initializes the code.
9
+ *
10
+ * @since 3.4.0
11
+ */
12
+ init: function() {
13
+ aioseopVideoSitemapUpsell.getVideoSitemapUpsell();
14
+ },
15
+
16
+ /**
17
+ * Gets the video sitemap module upsell markup from our endpoint.
18
+ *
19
+ * @since 3.4.0
20
+ */
21
+ getVideoSitemapUpsell: function() {
22
+ $.ajax({
23
+ type: "GET",
24
+ url: aioseopVideoSitemapUpsellData.requestUrl,
25
+ data: {
26
+ action: "aioseop_get_video_sitemap_upsell",
27
+ _ajax_nonce: aioseopVideoSitemapUpsellData.nonce
28
+ },
29
+ success: function(response) {
30
+ if (0 === parseInt(response, 10)) {
31
+ return;
32
+ }
33
+ aioseopVideoSitemapUpsell.appendVideoSitemapUpsell(response);
34
+ },
35
+ error: function() {
36
+ console.log("Couldn't fetch video sitemap upsell content from our endpoint.");
37
+ }
38
+ });
39
+ },
40
+
41
+ appendVideoSitemapUpsell: function(content) {
42
+ $('.submit').first().append(content);
43
+ aioseopVideoSitemapUpsell.addDismissEventListener();
44
+ },
45
+
46
+ /**
47
+ * Adds the required event listener to the dismiss button.
48
+ *
49
+ * @since 3.4.0
50
+ */
51
+ addDismissEventListener: function() {
52
+ $('#aioseop-video-sitemap-upsell').on('click', '.dismiss', function() {
53
+ let videoSitemapUpsell = $('#aioseop-video-sitemap-upsell');
54
+
55
+ setTimeout(
56
+ function() {
57
+ videoSitemapUpsell.remove();
58
+ },
59
+ 300
60
+ );
61
+
62
+ aioseopVideoSitemapUpsell.dismissVideoSitemapUpsell();
63
+ });
64
+ },
65
+
66
+ /**
67
+ * Dismisses the video sitemap upsell via our endpoint.
68
+ *
69
+ * @since 3.4.0
70
+ */
71
+ dismissVideoSitemapUpsell: function() {
72
+ $.ajax({
73
+ type: "GET",
74
+ url: aioseopVideoSitemapUpsellData.requestUrl,
75
+ data: {
76
+ action: "aioseop_dismiss_video_sitemap_upsell",
77
+ _ajax_nonce: aioseopVideoSitemapUpsellData.nonce
78
+ },
79
+ error: function() {
80
+ console.log("Couldn't dismiss notice bar.");
81
+ }
82
+ });
83
+ }
84
+ }
85
+
86
+ aioseopVideoSitemapUpsell.init();
87
+ });
js/admin/selectize-v0.12.6/selectize.js ADDED
@@ -0,0 +1,3891 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * sifter.js
3
+ * Copyright (c) 2013 Brian Reavis & contributors
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
6
+ * file except in compliance with the License. You may obtain a copy of the License at:
7
+ * http://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under
10
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ * ANY KIND, either express or implied. See the License for the specific language
12
+ * governing permissions and limitations under the License.
13
+ *
14
+ * @author Brian Reavis <brian@thirdroute.com>
15
+ */
16
+
17
+ (function(root, factory) {
18
+ if (typeof define === 'function' && define.amd) {
19
+ define('sifter', factory);
20
+ } else if (typeof exports === 'object') {
21
+ module.exports = factory();
22
+ } else {
23
+ root.Sifter = factory();
24
+ }
25
+ }(this, function() {
26
+
27
+ /**
28
+ * Textually searches arrays and hashes of objects
29
+ * by property (or multiple properties). Designed
30
+ * specifically for autocomplete.
31
+ *
32
+ * @constructor
33
+ * @param {array|object} items
34
+ * @param {object} items
35
+ */
36
+ var Sifter = function(items, settings) {
37
+ this.items = items;
38
+ this.settings = settings || {diacritics: true};
39
+ };
40
+
41
+ /**
42
+ * Splits a search string into an array of individual
43
+ * regexps to be used to match results.
44
+ *
45
+ * @param {string} query
46
+ * @returns {array}
47
+ */
48
+ Sifter.prototype.tokenize = function(query) {
49
+ query = trim(String(query || '').toLowerCase());
50
+ if (!query || !query.length) return [];
51
+
52
+ var i, n, regex, letter;
53
+ var tokens = [];
54
+ var words = query.split(/ +/);
55
+
56
+ for (i = 0, n = words.length; i < n; i++) {
57
+ regex = escape_regex(words[i]);
58
+ if (this.settings.diacritics) {
59
+ for (letter in DIACRITICS) {
60
+ if (DIACRITICS.hasOwnProperty(letter)) {
61
+ regex = regex.replace(new RegExp(letter, 'g'), DIACRITICS[letter]);
62
+ }
63
+ }
64
+ }
65
+ tokens.push({
66
+ string : words[i],
67
+ regex : new RegExp(regex, 'i')
68
+ });
69
+ }
70
+
71
+ return tokens;
72
+ };
73
+
74
+ /**
75
+ * Iterates over arrays and hashes.
76
+ *
77
+ * ```
78
+ * this.iterator(this.items, function(item, id) {
79
+ * // invoked for each item
80
+ * });
81
+ * ```
82
+ *
83
+ * @param {array|object} object
84
+ */
85
+ Sifter.prototype.iterator = function(object, callback) {
86
+ var iterator;
87
+ if (is_array(object)) {
88
+ iterator = Array.prototype.forEach || function(callback) {
89
+ for (var i = 0, n = this.length; i < n; i++) {
90
+ callback(this[i], i, this);
91
+ }
92
+ };
93
+ } else {
94
+ iterator = function(callback) {
95
+ for (var key in this) {
96
+ if (this.hasOwnProperty(key)) {
97
+ callback(this[key], key, this);
98
+ }
99
+ }
100
+ };
101
+ }
102
+
103
+ iterator.apply(object, [callback]);
104
+ };
105
+
106
+ /**
107
+ * Returns a function to be used to score individual results.
108
+ *
109
+ * Good matches will have a higher score than poor matches.
110
+ * If an item is not a match, 0 will be returned by the function.
111
+ *
112
+ * @param {object|string} search
113
+ * @param {object} options (optional)
114
+ * @returns {function}
115
+ */
116
+ Sifter.prototype.getScoreFunction = function(search, options) {
117
+ var self, fields, tokens, token_count, nesting;
118
+
119
+ self = this;
120
+ search = self.prepareSearch(search, options);
121
+ tokens = search.tokens;
122
+ fields = search.options.fields;
123
+ token_count = tokens.length;
124
+ nesting = search.options.nesting;
125
+
126
+ /**
127
+ * Calculates how close of a match the
128
+ * given value is against a search token.
129
+ *
130
+ * @param {mixed} value
131
+ * @param {object} token
132
+ * @return {number}
133
+ */
134
+ var scoreValue = function(value, token) {
135
+ var score, pos;
136
+
137
+ if (!value) return 0;
138
+ value = String(value || '');
139
+ pos = value.search(token.regex);
140
+ if (pos === -1) return 0;
141
+ score = token.string.length / value.length;
142
+ if (pos === 0) score += 0.5;
143
+ return score;
144
+ };
145
+
146
+ /**
147
+ * Calculates the score of an object
148
+ * against the search query.
149
+ *
150
+ * @param {object} token
151
+ * @param {object} data
152
+ * @return {number}
153
+ */
154
+ var scoreObject = (function() {
155
+ var field_count = fields.length;
156
+ if (!field_count) {
157
+ return function() { return 0; };
158
+ }
159
+ if (field_count === 1) {
160
+ return function(token, data) {
161
+ return scoreValue(getattr(data, fields[0], nesting), token);
162
+ };
163
+ }
164
+ return function(token, data) {
165
+ for (var i = 0, sum = 0; i < field_count; i++) {
166
+ sum += scoreValue(getattr(data, fields[i], nesting), token);
167
+ }
168
+ return sum / field_count;
169
+ };
170
+ })();
171
+
172
+ if (!token_count) {
173
+ return function() { return 0; };
174
+ }
175
+ if (token_count === 1) {
176
+ return function(data) {
177
+ return scoreObject(tokens[0], data);
178
+ };
179
+ }
180
+
181
+ if (search.options.conjunction === 'and') {
182
+ return function(data) {
183
+ var score;
184
+ for (var i = 0, sum = 0; i < token_count; i++) {
185
+ score = scoreObject(tokens[i], data);
186
+ if (score <= 0) return 0;
187
+ sum += score;
188
+ }
189
+ return sum / token_count;
190
+ };
191
+ } else {
192
+ return function(data) {
193
+ for (var i = 0, sum = 0; i < token_count; i++) {
194
+ sum += scoreObject(tokens[i], data);
195
+ }
196
+ return sum / token_count;
197
+ };
198
+ }
199
+ };
200
+
201
+ /**
202
+ * Returns a function that can be used to compare two
203
+ * results, for sorting purposes. If no sorting should
204
+ * be performed, `null` will be returned.
205
+ *
206
+ * @param {string|object} search
207
+ * @param {object} options
208
+ * @return function(a,b)
209
+ */
210
+ Sifter.prototype.getSortFunction = function(search, options) {
211
+ var i, n, self, field, fields, fields_count, multiplier, multipliers, get_field, implicit_score, sort;
212
+
213
+ self = this;
214
+ search = self.prepareSearch(search, options);
215
+ sort = (!search.query && options.sort_empty) || options.sort;
216
+
217
+ /**
218
+ * Fetches the specified sort field value
219
+ * from a search result item.
220
+ *
221
+ * @param {string} name
222
+ * @param {object} result
223
+ * @return {mixed}
224
+ */
225
+ get_field = function(name, result) {
226
+ if (name === '$score') return result.score;
227
+ return getattr(self.items[result.id], name, options.nesting);
228
+ };
229
+
230
+ // parse options
231
+ fields = [];
232
+ if (sort) {
233
+ for (i = 0, n = sort.length; i < n; i++) {
234
+ if (search.query || sort[i].field !== '$score') {
235
+ fields.push(sort[i]);
236
+ }
237
+ }
238
+ }
239
+
240
+ // the "$score" field is implied to be the primary
241
+ // sort field, unless it's manually specified
242
+ if (search.query) {
243
+ implicit_score = true;
244
+ for (i = 0, n = fields.length; i < n; i++) {
245
+ if (fields[i].field === '$score') {
246
+ implicit_score = false;
247
+ break;
248
+ }
249
+ }
250
+ if (implicit_score) {
251
+ fields.unshift({field: '$score', direction: 'desc'});
252
+ }
253
+ } else {
254
+ for (i = 0, n = fields.length; i < n; i++) {
255
+ if (fields[i].field === '$score') {
256
+ fields.splice(i, 1);
257
+ break;
258
+ }
259
+ }
260
+ }
261
+
262
+ multipliers = [];
263
+ for (i = 0, n = fields.length; i < n; i++) {
264
+ multipliers.push(fields[i].direction === 'desc' ? -1 : 1);
265
+ }
266
+
267
+ // build function
268
+ fields_count = fields.length;
269
+ if (!fields_count) {
270
+ return null;
271
+ } else if (fields_count === 1) {
272
+ field = fields[0].field;
273
+ multiplier = multipliers[0];
274
+ return function(a, b) {
275
+ return multiplier * cmp(
276
+ get_field(field, a),
277
+ get_field(field, b)
278
+ );
279
+ };
280
+ } else {
281
+ return function(a, b) {
282
+ var i, result, a_value, b_value, field;
283
+ for (i = 0; i < fields_count; i++) {
284
+ field = fields[i].field;
285
+ result = multipliers[i] * cmp(
286
+ get_field(field, a),
287
+ get_field(field, b)
288
+ );
289
+ if (result) return result;
290
+ }
291
+ return 0;
292
+ };
293
+ }
294
+ };
295
+
296
+ /**
297
+ * Parses a search query and returns an object
298
+ * with tokens and fields ready to be populated
299
+ * with results.
300
+ *
301
+ * @param {string} query
302
+ * @param {object} options
303
+ * @returns {object}
304
+ */
305
+ Sifter.prototype.prepareSearch = function(query, options) {
306
+ if (typeof query === 'object') return query;
307
+
308
+ options = extend({}, options);
309
+
310
+ var option_fields = options.fields;
311
+ var option_sort = options.sort;
312
+ var option_sort_empty = options.sort_empty;
313
+
314
+ if (option_fields && !is_array(option_fields)) options.fields = [option_fields];
315
+ if (option_sort && !is_array(option_sort)) options.sort = [option_sort];
316
+ if (option_sort_empty && !is_array(option_sort_empty)) options.sort_empty = [option_sort_empty];
317
+
318
+ return {
319
+ options : options,
320
+ query : String(query || '').toLowerCase(),
321
+ tokens : this.tokenize(query),
322
+ total : 0,
323
+ items : []
324
+ };
325
+ };
326
+
327
+ /**
328
+ * Searches through all items and returns a sorted array of matches.
329
+ *
330
+ * The `options` parameter can contain:
331
+ *
332
+ * - fields {string|array}
333
+ * - sort {array}
334
+ * - score {function}
335
+ * - filter {bool}
336
+ * - limit {integer}
337
+ *
338
+ * Returns an object containing:
339
+ *
340
+ * - options {object}
341
+ * - query {string}
342
+ * - tokens {array}
343
+ * - total {int}
344
+ * - items {array}
345
+ *
346
+ * @param {string} query
347
+ * @param {object} options
348
+ * @returns {object}
349
+ */
350
+ Sifter.prototype.search = function(query, options) {
351
+ var self = this, value, score, search, calculateScore;
352
+ var fn_sort;
353
+ var fn_score;
354
+
355
+ search = this.prepareSearch(query, options);
356
+ options = search.options;
357
+ query = search.query;
358
+
359
+ // generate result scoring function
360
+ fn_score = options.score || self.getScoreFunction(search);
361
+
362
+ // perform search and sort
363
+ if (query.length) {
364
+ self.iterator(self.items, function(item, id) {
365
+ score = fn_score(item);
366
+ if (options.filter === false || score > 0) {
367
+ search.items.push({'score': score, 'id': id});
368
+ }
369
+ });
370
+ } else {
371
+ self.iterator(self.items, function(item, id) {
372
+ search.items.push({'score': 1, 'id': id});
373
+ });
374
+ }
375
+
376
+ fn_sort = self.getSortFunction(search, options);
377
+ if (fn_sort) search.items.sort(fn_sort);
378
+
379
+ // apply limits
380
+ search.total = search.items.length;
381
+ if (typeof options.limit === 'number') {
382
+ search.items = search.items.slice(0, options.limit);
383
+ }
384
+
385
+ return search;
386
+ };
387
+
388
+ // utilities
389
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
390
+
391
+ var cmp = function(a, b) {
392
+ if (typeof a === 'number' && typeof b === 'number') {
393
+ return a > b ? 1 : (a < b ? -1 : 0);
394
+ }
395
+ a = asciifold(String(a || ''));
396
+ b = asciifold(String(b || ''));
397
+ if (a > b) return 1;
398
+ if (b > a) return -1;
399
+ return 0;
400
+ };
401
+
402
+ var extend = function(a, b) {
403
+ var i, n, k, object;
404
+ for (i = 1, n = arguments.length; i < n; i++) {
405
+ object = arguments[i];
406
+ if (!object) continue;
407
+ for (k in object) {
408
+ if (object.hasOwnProperty(k)) {
409
+ a[k] = object[k];
410
+ }
411
+ }
412
+ }
413
+ return a;
414
+ };
415
+
416
+ /**
417
+ * A property getter resolving dot-notation
418
+ * @param {Object} obj The root object to fetch property on
419
+ * @param {String} name The optionally dotted property name to fetch
420
+ * @param {Boolean} nesting Handle nesting or not
421
+ * @return {Object} The resolved property value
422
+ */
423
+ var getattr = function(obj, name, nesting) {
424
+ if (!obj || !name) return;
425
+ if (!nesting) return obj[name];
426
+ var names = name.split(".");
427
+ while(names.length && (obj = obj[names.shift()]));
428
+ return obj;
429
+ };
430
+
431
+ var trim = function(str) {
432
+ return (str + '').replace(/^\s+|\s+$|/g, '');
433
+ };
434
+
435
+ var escape_regex = function(str) {
436
+ return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1');
437
+ };
438
+
439
+ var is_array = Array.isArray || (typeof $ !== 'undefined' && $.isArray) || function(object) {
440
+ return Object.prototype.toString.call(object) === '[object Array]';
441
+ };
442
+
443
+ var DIACRITICS = {
444
+ 'a': '[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]',
445
+ 'b': '[b␢βΒB฿𐌁ᛒ]',
446
+ 'c': '[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄCc]',
447
+ 'd': '[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅDdð]',
448
+ 'e': '[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇEeɘǝƏƐε]',
449
+ 'f': '[fƑƒḞḟ]',
450
+ 'g': '[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]',
451
+ 'h': '[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]',
452
+ 'i': '[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪIi]',
453
+ 'j': '[jȷĴĵɈɉʝɟʲ]',
454
+ 'k': '[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]',
455
+ 'l': '[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟLl]',
456
+ 'n': '[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴNnŊŋ]',
457
+ 'o': '[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]',
458
+ 'p': '[pṔṕṖṗⱣᵽƤƥᵱ]',
459
+ 'q': '[qꝖꝗʠɊɋꝘꝙq̃]',
460
+ 'r': '[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]',
461
+ 's': '[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]',
462
+ 't': '[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]',
463
+ 'u': '[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]',
464
+ 'v': '[vṼṽṾṿƲʋꝞꝟⱱʋ]',
465
+ 'w': '[wẂẃẀẁŴŵẄẅẆẇẈẉ]',
466
+ 'x': '[xẌẍẊẋχ]',
467
+ 'y': '[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]',
468
+ 'z': '[zŹźẐẑŽžŻżẒẓẔẕƵƶ]'
469
+ };
470
+
471
+ var asciifold = (function() {
472
+ var i, n, k, chunk;
473
+ var foreignletters = '';
474
+ var lookup = {};
475
+ for (k in DIACRITICS) {
476
+ if (DIACRITICS.hasOwnProperty(k)) {
477
+ chunk = DIACRITICS[k].substring(2, DIACRITICS[k].length - 1);
478
+ foreignletters += chunk;
479
+ for (i = 0, n = chunk.length; i < n; i++) {
480
+ lookup[chunk.charAt(i)] = k;
481
+ }
482
+ }
483
+ }
484
+ var regexp = new RegExp('[' + foreignletters + ']', 'g');
485
+ return function(str) {
486
+ return str.replace(regexp, function(foreignletter) {
487
+ return lookup[foreignletter];
488
+ }).toLowerCase();
489
+ };
490
+ })();
491
+
492
+
493
+ // export
494
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
495
+
496
+ return Sifter;
497
+ }));
498
+
499
+
500
+
501
+ /**
502
+ * microplugin.js
503
+ * Copyright (c) 2013 Brian Reavis & contributors
504
+ *
505
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
506
+ * file except in compliance with the License. You may obtain a copy of the License at:
507
+ * http://www.apache.org/licenses/LICENSE-2.0
508
+ *
509
+ * Unless required by applicable law or agreed to in writing, software distributed under
510
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
511
+ * ANY KIND, either express or implied. See the License for the specific language
512
+ * governing permissions and limitations under the License.
513
+ *
514
+ * @author Brian Reavis <brian@thirdroute.com>
515
+ */
516
+
517
+ (function(root, factory) {
518
+ if (typeof define === 'function' && define.amd) {
519
+ define('microplugin', factory);
520
+ } else if (typeof exports === 'object') {
521
+ module.exports = factory();
522
+ } else {
523
+ root.MicroPlugin = factory();
524
+ }
525
+ }(this, function() {
526
+ var MicroPlugin = {};
527
+
528
+ MicroPlugin.mixin = function(Interface) {
529
+ Interface.plugins = {};
530
+
531
+ /**
532
+ * Initializes the listed plugins (with options).
533
+ * Acceptable formats:
534
+ *
535
+ * List (without options):
536
+ * ['a', 'b', 'c']
537
+ *
538
+ * List (with options):
539
+ * [{'name': 'a', options: {}}, {'name': 'b', options: {}}]
540
+ *
541
+ * Hash (with options):
542
+ * {'a': { ... }, 'b': { ... }, 'c': { ... }}
543
+ *
544
+ * @param {mixed} plugins
545
+ */
546
+ Interface.prototype.initializePlugins = function(plugins) {
547
+ var i, n, key;
548
+ var self = this;
549
+ var queue = [];
550
+
551
+ self.plugins = {
552
+ names : [],
553
+ settings : {},
554
+ requested : {},
555
+ loaded : {}
556
+ };
557
+
558
+ if (utils.isArray(plugins)) {
559
+ for (i = 0, n = plugins.length; i < n; i++) {
560
+ if (typeof plugins[i] === 'string') {
561
+ queue.push(plugins[i]);
562
+ } else {
563
+ self.plugins.settings[plugins[i].name] = plugins[i].options;
564
+ queue.push(plugins[i].name);
565
+ }
566
+ }
567
+ } else if (plugins) {
568
+ for (key in plugins) {
569
+ if (plugins.hasOwnProperty(key)) {
570
+ self.plugins.settings[key] = plugins[key];
571
+ queue.push(key);
572
+ }
573
+ }
574
+ }
575
+
576
+ while (queue.length) {
577
+ self.require(queue.shift());
578
+ }
579
+ };
580
+
581
+ Interface.prototype.loadPlugin = function(name) {
582
+ var self = this;
583
+ var plugins = self.plugins;
584
+ var plugin = Interface.plugins[name];
585
+
586
+ if (!Interface.plugins.hasOwnProperty(name)) {
587
+ throw new Error('Unable to find "' + name + '" plugin');
588
+ }
589
+
590
+ plugins.requested[name] = true;
591
+ plugins.loaded[name] = plugin.fn.apply(self, [self.plugins.settings[name] || {}]);
592
+ plugins.names.push(name);
593
+ };
594
+
595
+ /**
596
+ * Initializes a plugin.
597
+ *
598
+ * @param {string} name
599
+ */
600
+ Interface.prototype.require = function(name) {
601
+ var self = this;
602
+ var plugins = self.plugins;
603
+
604
+ if (!self.plugins.loaded.hasOwnProperty(name)) {
605
+ if (plugins.requested[name]) {
606
+ throw new Error('Plugin has circular dependency ("' + name + '")');
607
+ }
608
+ self.loadPlugin(name);
609
+ }
610
+
611
+ return plugins.loaded[name];
612
+ };
613
+
614
+ /**
615
+ * Registers a plugin.
616
+ *
617
+ * @param {string} name
618
+ * @param {function} fn
619
+ */
620
+ Interface.define = function(name, fn) {
621
+ Interface.plugins[name] = {
622
+ 'name' : name,
623
+ 'fn' : fn
624
+ };
625
+ };
626
+ };
627
+
628
+ var utils = {
629
+ isArray: Array.isArray || function(vArg) {
630
+ return Object.prototype.toString.call(vArg) === '[object Array]';
631
+ }
632
+ };
633
+
634
+ return MicroPlugin;
635
+ }));
636
+
637
+ /**
638
+ * selectize.js (v0.12.6)
639
+ * Copyright (c) 2013–2015 Brian Reavis & contributors
640
+ *
641
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
642
+ * file except in compliance with the License. You may obtain a copy of the License at:
643
+ * http://www.apache.org/licenses/LICENSE-2.0
644
+ *
645
+ * Unless required by applicable law or agreed to in writing, software distributed under
646
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
647
+ * ANY KIND, either express or implied. See the License for the specific language
648
+ * governing permissions and limitations under the License.
649
+ *
650
+ * @author Brian Reavis <brian@thirdroute.com>
651
+ */
652
+
653
+ /*jshint curly:false */
654
+ /*jshint browser:true */
655
+
656
+ (function(root, factory) {
657
+ if (typeof define === 'function' && define.amd) {
658
+ define('selectize', ['jquery','sifter','microplugin'], factory);
659
+ } else if (typeof exports === 'object') {
660
+ module.exports = factory(require('jquery'), require('sifter'), require('microplugin'));
661
+ } else {
662
+ root.Selectize = factory(root.jQuery, root.Sifter, root.MicroPlugin);
663
+ }
664
+ }(this, function($, Sifter, MicroPlugin) {
665
+ 'use strict';
666
+
667
+ var highlight = function($element, pattern) {
668
+ if (typeof pattern === 'string' && !pattern.length) return;
669
+ var regex = (typeof pattern === 'string') ? new RegExp(pattern, 'i') : pattern;
670
+
671
+ var highlight = function(node) {
672
+ var skip = 0;
673
+ // Wrap matching part of text node with highlighting <span>, e.g.
674
+ // Soccer -> <span class="highlight">Soc</span>cer for regex = /soc/i
675
+ if (node.nodeType === 3) {
676
+ var pos = node.data.search(regex);
677
+ if (pos >= 0 && node.data.length > 0) {
678
+ var match = node.data.match(regex);
679
+ var spannode = document.createElement('span');
680
+ spannode.className = 'highlight';
681
+ var middlebit = node.splitText(pos);
682
+ var endbit = middlebit.splitText(match[0].length);
683
+ var middleclone = middlebit.cloneNode(true);
684
+ spannode.appendChild(middleclone);
685
+ middlebit.parentNode.replaceChild(spannode, middlebit);
686
+ skip = 1;
687
+ }
688
+ }
689
+ // Recurse element node, looking for child text nodes to highlight, unless element
690
+ // is childless, <script>, <style>, or already highlighted: <span class="hightlight">
691
+ else if (node.nodeType === 1 && node.childNodes && !/(script|style)/i.test(node.tagName) && ( node.className !== 'highlight' || node.tagName !== 'SPAN' )) {
692
+ for (var i = 0; i < node.childNodes.length; ++i) {
693
+ i += highlight(node.childNodes[i]);
694
+ }
695
+ }
696
+ return skip;
697
+ };
698
+
699
+ return $element.each(function() {
700
+ highlight(this);
701
+ });
702
+ };
703
+
704
+ /**
705
+ * removeHighlight fn copied from highlight v5 and
706
+ * edited to remove with() and pass js strict mode
707
+ */
708
+ $.fn.removeHighlight = function() {
709
+ return this.find("span.highlight").each(function() {
710
+ this.parentNode.firstChild.nodeName;
711
+ var parent = this.parentNode;
712
+ parent.replaceChild(this.firstChild, this);
713
+ parent.normalize();
714
+ }).end();
715
+ };
716
+
717
+
718
+ var MicroEvent = function() {};
719
+ MicroEvent.prototype = {
720
+ on: function(event, fct){
721
+ this._events = this._events || {};
722
+ this._events[event] = this._events[event] || [];
723
+ this._events[event].push(fct);
724
+ },
725
+ off: function(event, fct){
726
+ var n = arguments.length;
727
+ if (n === 0) return delete this._events;
728
+ if (n === 1) return delete this._events[event];
729
+
730
+ this._events = this._events || {};
731
+ if (event in this._events === false) return;
732
+ this._events[event].splice(this._events[event].indexOf(fct), 1);
733
+ },
734
+ trigger: function(event /* , args... */){
735
+ this._events = this._events || {};
736
+ if (event in this._events === false) return;
737
+ for (var i = 0; i < this._events[event].length; i++){
738
+ this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1));
739
+ }
740
+ }
741
+ };
742
+
743
+ /**
744
+ * Mixin will delegate all MicroEvent.js function in the destination object.
745
+ *
746
+ * - MicroEvent.mixin(Foobar) will make Foobar able to use MicroEvent
747
+ *
748
+ * @param {object} the object which will support MicroEvent
749
+ */
750
+ MicroEvent.mixin = function(destObject){
751
+ var props = ['on', 'off', 'trigger'];
752
+ for (var i = 0; i < props.length; i++){
753
+ destObject.prototype[props[i]] = MicroEvent.prototype[props[i]];
754
+ }
755
+ };
756
+
757
+ var IS_MAC = /Mac/.test(navigator.userAgent);
758
+
759
+ var KEY_A = 65;
760
+ var KEY_COMMA = 188;
761
+ var KEY_RETURN = 13;
762
+ var KEY_ESC = 27;
763
+ var KEY_LEFT = 37;
764
+ var KEY_UP = 38;
765
+ var KEY_P = 80;
766
+ var KEY_RIGHT = 39;
767
+ var KEY_DOWN = 40;
768
+ var KEY_N = 78;
769
+ var KEY_BACKSPACE = 8;
770
+ var KEY_DELETE = 46;
771
+ var KEY_SHIFT = 16;
772
+ var KEY_CMD = IS_MAC ? 91 : 17;
773
+ var KEY_CTRL = IS_MAC ? 18 : 17;
774
+ var KEY_TAB = 9;
775
+
776
+ var TAG_SELECT = 1;
777
+ var TAG_INPUT = 2;
778
+
779
+ // for now, android support in general is too spotty to support validity
780
+ var SUPPORTS_VALIDITY_API = !/android/i.test(window.navigator.userAgent) && !!document.createElement('input').validity;
781
+
782
+
783
+ var isset = function(object) {
784
+ return typeof object !== 'undefined';
785
+ };
786
+
787
+ /**
788
+ * Converts a scalar to its best string representation
789
+ * for hash keys and HTML attribute values.
790
+ *
791
+ * Transformations:
792
+ * 'str' -> 'str'
793
+ * null -> ''
794
+ * undefined -> ''
795
+ * true -> '1'
796
+ * false -> '0'
797
+ * 0 -> '0'
798
+ * 1 -> '1'
799
+ *
800
+ * @param {string} value
801
+ * @returns {string|null}
802
+ */
803
+ var hash_key = function(value) {
804
+ if (typeof value === 'undefined' || value === null) return null;
805
+ if (typeof value === 'boolean') return value ? '1' : '0';
806
+ return value + '';
807
+ };
808
+
809
+ /**
810
+ * Escapes a string for use within HTML.
811
+ *
812
+ * @param {string} str
813
+ * @returns {string}
814
+ */
815
+ var escape_html = function(str) {
816
+ return (str + '')
817
+ .replace(/&/g, '&amp;')
818
+ .replace(/</g, '&lt;')
819
+ .replace(/>/g, '&gt;')
820
+ .replace(/"/g, '&quot;');
821
+ };
822
+
823
+ /**
824
+ * Escapes "$" characters in replacement strings.
825
+ *
826
+ * @param {string} str
827
+ * @returns {string}
828
+ */
829
+ var escape_replace = function(str) {
830
+ return (str + '').replace(/\$/g, '$$$$');
831
+ };
832
+
833
+ var hook = {};
834
+
835
+ /**
836
+ * Wraps `method` on `self` so that `fn`
837
+ * is invoked before the original method.
838
+ *
839
+ * @param {object} self
840
+ * @param {string} method
841
+ * @param {function} fn
842
+ */
843
+ hook.before = function(self, method, fn) {
844
+ var original = self[method];
845
+ self[method] = function() {
846
+ fn.apply(self, arguments);
847
+ return original.apply(self, arguments);
848
+ };
849
+ };
850
+
851
+ /**
852
+ * Wraps `method` on `self` so that `fn`
853
+ * is invoked after the original method.
854
+ *
855
+ * @param {object} self
856
+ * @param {string} method
857
+ * @param {function} fn
858
+ */
859
+ hook.after = function(self, method, fn) {
860
+ var original = self[method];
861
+ self[method] = function() {
862
+ var result = original.apply(self, arguments);
863
+ fn.apply(self, arguments);
864
+ return result;
865
+ };
866
+ };
867
+
868
+ /**
869
+ * Wraps `fn` so that it can only be invoked once.
870
+ *
871
+ * @param {function} fn
872
+ * @returns {function}
873
+ */
874
+ var once = function(fn) {
875
+ var called = false;
876
+ return function() {
877
+ if (called) return;
878
+ called = true;
879
+ fn.apply(this, arguments);
880
+ };
881
+ };
882
+
883
+ /**
884
+ * Wraps `fn` so that it can only be called once
885
+ * every `delay` milliseconds (invoked on the falling edge).
886
+ *
887
+ * @param {function} fn
888
+ * @param {int} delay
889
+ * @returns {function}
890
+ */
891
+ var debounce = function(fn, delay) {
892
+ var timeout;
893
+ return function() {
894
+ var self = this;
895
+ var args = arguments;
896
+ window.clearTimeout(timeout);
897
+ timeout = window.setTimeout(function() {
898
+ fn.apply(self, args);
899
+ }, delay);
900
+ };
901
+ };
902
+
903
+ /**
904
+ * Debounce all fired events types listed in `types`
905
+ * while executing the provided `fn`.
906
+ *
907
+ * @param {object} self
908
+ * @param {array} types
909
+ * @param {function} fn
910
+ */
911
+ var debounce_events = function(self, types, fn) {
912
+ var type;
913
+ var trigger = self.trigger;
914
+ var event_args = {};
915
+
916
+ // override trigger method
917
+ self.trigger = function() {
918
+ var type = arguments[0];
919
+ if (types.indexOf(type) !== -1) {
920
+ event_args[type] = arguments;
921
+ } else {
922
+ return trigger.apply(self, arguments);
923
+ }
924
+ };
925
+
926
+ // invoke provided function
927
+ fn.apply(self, []);
928
+ self.trigger = trigger;
929
+
930
+ // trigger queued events
931
+ for (type in event_args) {
932
+ if (event_args.hasOwnProperty(type)) {
933
+ trigger.apply(self, event_args[type]);
934
+ }
935
+ }
936
+ };
937
+
938
+ /**
939
+ * A workaround for http://bugs.jquery.com/ticket/6696
940
+ *
941
+ * @param {object} $parent - Parent element to listen on.
942
+ * @param {string} event - Event name.
943
+ * @param {string} selector - Descendant selector to filter by.
944
+ * @param {function} fn - Event handler.
945
+ */
946
+ var watchChildEvent = function($parent, event, selector, fn) {
947
+ $parent.on(event, selector, function(e) {
948
+ var child = e.target;
949
+ while (child && child.parentNode !== $parent[0]) {
950
+ child = child.parentNode;
951
+ }
952
+ e.currentTarget = child;
953
+ return fn.apply(this, [e]);
954
+ });
955
+ };
956
+
957
+ /**
958
+ * Determines the current selection within a text input control.
959
+ * Returns an object containing:
960
+ * - start
961
+ * - length
962
+ *
963
+ * @param {object} input
964
+ * @returns {object}
965
+ */
966
+ var getSelection = function(input) {
967
+ var result = {};
968
+ if ('selectionStart' in input) {
969
+ result.start = input.selectionStart;
970
+ result.length = input.selectionEnd - result.start;
971
+ } else if (document.selection) {
972
+ input.focus();
973
+ var sel = document.selection.createRange();
974
+ var selLen = document.selection.createRange().text.length;
975
+ sel.moveStart('character', -input.value.length);
976
+ result.start = sel.text.length - selLen;
977
+ result.length = selLen;
978
+ }
979
+ return result;
980
+ };
981
+
982
+ /**
983
+ * Copies CSS properties from one element to another.
984
+ *
985
+ * @param {object} $from
986
+ * @param {object} $to
987
+ * @param {array} properties
988
+ */
989
+ var transferStyles = function($from, $to, properties) {
990
+ var i, n, styles = {};
991
+ if (properties) {
992
+ for (i = 0, n = properties.length; i < n; i++) {
993
+ styles[properties[i]] = $from.css(properties[i]);
994
+ }
995
+ } else {
996
+ styles = $from.css();
997
+ }
998
+ $to.css(styles);
999
+ };
1000
+
1001
+ /**
1002
+ * Measures the width of a string within a
1003
+ * parent element (in pixels).
1004
+ *
1005
+ * @param {string} str
1006
+ * @param {object} $parent
1007
+ * @returns {int}
1008
+ */
1009
+ var measureString = function(str, $parent) {
1010
+ if (!str) {
1011
+ return 0;
1012
+ }
1013
+
1014
+ if (!Selectize.$testInput) {
1015
+ Selectize.$testInput = $('<span />').css({
1016
+ position: 'absolute',
1017
+ top: -99999,
1018
+ left: -99999,
1019
+ width: 'auto',
1020
+ padding: 0,
1021
+ whiteSpace: 'pre'
1022
+ }).appendTo('body');
1023
+ }
1024
+
1025
+ Selectize.$testInput.text(str);
1026
+
1027
+ transferStyles($parent, Selectize.$testInput, [
1028
+ 'letterSpacing',
1029
+ 'fontSize',
1030
+ 'fontFamily',
1031
+ 'fontWeight',
1032
+ 'textTransform'
1033
+ ]);
1034
+
1035
+ return Selectize.$testInput.width();
1036
+ };
1037
+
1038
+ /**
1039
+ * Sets up an input to grow horizontally as the user
1040
+ * types. If the value is changed manually, you can
1041
+ * trigger the "update" handler to resize:
1042
+ *
1043
+ * $input.trigger('update');
1044
+ *
1045
+ * @param {object} $input
1046
+ */
1047
+ var autoGrow = function($input) {
1048
+ var currentWidth = null;
1049
+
1050
+ var update = function(e, options) {
1051
+ var value, keyCode, printable, placeholder, width;
1052
+ var shift, character, selection;
1053
+ e = e || window.event || {};
1054
+ options = options || {};
1055
+
1056
+ if (e.metaKey || e.altKey) return;
1057
+ if (!options.force && $input.data('grow') === false) return;
1058
+
1059
+ value = $input.val();
1060
+ if (e.type && e.type.toLowerCase() === 'keydown') {
1061
+ keyCode = e.keyCode;
1062
+ printable = (
1063
+ (keyCode >= 48 && keyCode <= 57) || // 0-9
1064
+ (keyCode >= 65 && keyCode <= 90) || // a-z
1065
+ (keyCode >= 96 && keyCode <= 111) || // numpad 0-9, numeric operators
1066
+ (keyCode >= 186 && keyCode <= 222) || // semicolon, equal, comma, dash, etc.
1067
+ keyCode === 32 // space
1068
+ );
1069
+
1070
+ if (keyCode === KEY_DELETE || keyCode === KEY_BACKSPACE) {
1071
+ selection = getSelection($input[0]);
1072
+ if (selection.length) {
1073
+ value = value.substring(0, selection.start) + value.substring(selection.start + selection.length);
1074
+ } else if (keyCode === KEY_BACKSPACE && selection.start) {
1075
+ value = value.substring(0, selection.start - 1) + value.substring(selection.start + 1);
1076
+ } else if (keyCode === KEY_DELETE && typeof selection.start !== 'undefined') {
1077
+ value = value.substring(0, selection.start) + value.substring(selection.start + 1);
1078
+ }
1079
+ } else if (printable) {
1080
+ shift = e.shiftKey;
1081
+ character = String.fromCharCode(e.keyCode);
1082
+ if (shift) character = character.toUpperCase();
1083
+ else character = character.toLowerCase();
1084
+ value += character;
1085
+ }
1086
+ }
1087
+
1088
+ placeholder = $input.attr('placeholder');
1089
+ if (!value && placeholder) {
1090
+ value = placeholder;
1091
+ }
1092
+
1093
+ width = measureString(value, $input) + 4;
1094
+ if (width !== currentWidth) {
1095
+ currentWidth = width;
1096
+ $input.width(width);
1097
+ $input.triggerHandler('resize');
1098
+ }
1099
+ };
1100
+
1101
+ $input.on('keydown keyup update blur', update);
1102
+ update();
1103
+ };
1104
+
1105
+ var domToString = function(d) {
1106
+ var tmp = document.createElement('div');
1107
+
1108
+ tmp.appendChild(d.cloneNode(true));
1109
+
1110
+ return tmp.innerHTML;
1111
+ };
1112
+
1113
+ var logError = function(message, options){
1114
+ if(!options) options = {};
1115
+ var component = "Selectize";
1116
+
1117
+ console.error(component + ": " + message)
1118
+
1119
+ if(options.explanation){
1120
+ // console.group is undefined in <IE11
1121
+ if(console.group) console.group();
1122
+ console.error(options.explanation);
1123
+ if(console.group) console.groupEnd();
1124
+ }
1125
+ }
1126
+
1127
+
1128
+ var Selectize = function($input, settings) {
1129
+ var key, i, n, dir, input, self = this;
1130
+ input = $input[0];
1131
+ input.selectize = self;
1132
+
1133
+ // detect rtl environment
1134
+ var computedStyle = window.getComputedStyle && window.getComputedStyle(input, null);
1135
+ dir = computedStyle ? computedStyle.getPropertyValue('direction') : input.currentStyle && input.currentStyle.direction;
1136
+ dir = dir || $input.parents('[dir]:first').attr('dir') || '';
1137
+
1138
+ // setup default state
1139
+ $.extend(self, {
1140
+ order : 0,
1141
+ settings : settings,
1142
+ $input : $input,
1143
+ tabIndex : $input.attr('tabindex') || '',
1144
+ tagType : input.tagName.toLowerCase() === 'select' ? TAG_SELECT : TAG_INPUT,
1145
+ rtl : /rtl/i.test(dir),
1146
+
1147
+ eventNS : '.selectize' + (++Selectize.count),
1148
+ highlightedValue : null,
1149
+ isBlurring : false,
1150
+ isOpen : false,
1151
+ isDisabled : false,
1152
+ isRequired : $input.is('[required]'),
1153
+ isInvalid : false,
1154
+ isLocked : false,
1155
+ isFocused : false,
1156
+ isInputHidden : false,
1157
+ isSetup : false,
1158
+ isShiftDown : false,
1159
+ isCmdDown : false,
1160
+ isCtrlDown : false,
1161
+ ignoreFocus : false,
1162
+ ignoreBlur : false,
1163
+ ignoreHover : false,
1164
+ hasOptions : false,
1165
+ currentResults : null,
1166
+ lastValue : '',
1167
+ caretPos : 0,
1168
+ loading : 0,
1169
+ loadedSearches : {},
1170
+
1171
+ $activeOption : null,
1172
+ $activeItems : [],
1173
+
1174
+ optgroups : {},
1175
+ options : {},
1176
+ userOptions : {},
1177
+ items : [],
1178
+ renderCache : {},
1179
+ onSearchChange : settings.loadThrottle === null ? self.onSearchChange : debounce(self.onSearchChange, settings.loadThrottle)
1180
+ });
1181
+
1182
+ // search system
1183
+ self.sifter = new Sifter(this.options, {diacritics: settings.diacritics});
1184
+
1185
+ // build options table
1186
+ if (self.settings.options) {
1187
+ for (i = 0, n = self.settings.options.length; i < n; i++) {
1188
+ self.registerOption(self.settings.options[i]);
1189
+ }
1190
+ delete self.settings.options;
1191
+ }
1192
+
1193
+ // build optgroup table
1194
+ if (self.settings.optgroups) {
1195
+ for (i = 0, n = self.settings.optgroups.length; i < n; i++) {
1196
+ self.registerOptionGroup(self.settings.optgroups[i]);
1197
+ }
1198
+ delete self.settings.optgroups;
1199
+ }
1200
+
1201
+ // option-dependent defaults
1202
+ self.settings.mode = self.settings.mode || (self.settings.maxItems === 1 ? 'single' : 'multi');
1203
+ if (typeof self.settings.hideSelected !== 'boolean') {
1204
+ self.settings.hideSelected = self.settings.mode === 'multi';
1205
+ }
1206
+
1207
+ self.initializePlugins(self.settings.plugins);
1208
+ self.setupCallbacks();
1209
+ self.setupTemplates();
1210
+ self.setup();
1211
+ };
1212
+
1213
+ // mixins
1214
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1215
+
1216
+ MicroEvent.mixin(Selectize);
1217
+
1218
+ if(typeof MicroPlugin !== "undefined"){
1219
+ MicroPlugin.mixin(Selectize);
1220
+ }else{
1221
+ logError("Dependency MicroPlugin is missing",
1222
+ {explanation:
1223
+ "Make sure you either: (1) are using the \"standalone\" "+
1224
+ "version of Selectize, or (2) require MicroPlugin before you "+
1225
+ "load Selectize."}
1226
+ );
1227
+ }
1228
+
1229
+
1230
+ // methods
1231
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1232
+
1233
+ $.extend(Selectize.prototype, {
1234
+
1235
+ /**
1236
+ * Creates all elements and sets up event bindings.
1237
+ */
1238
+ setup: function() {
1239
+ var self = this;
1240
+ var settings = self.settings;
1241
+ var eventNS = self.eventNS;
1242
+ var $window = $(window);
1243
+ var $document = $(document);
1244
+ var $input = self.$input;
1245
+
1246
+ var $wrapper;
1247
+ var $control;
1248
+ var $control_input;
1249
+ var $dropdown;
1250
+ var $dropdown_content;
1251
+ var $dropdown_parent;
1252
+ var inputMode;
1253
+ var timeout_blur;
1254
+ var timeout_focus;
1255
+ var classes;
1256
+ var classes_plugins;
1257
+ var inputId;
1258
+
1259
+ inputMode = self.settings.mode;
1260
+ classes = $input.attr('class') || '';
1261
+
1262
+ $wrapper = $('<div>').addClass(settings.wrapperClass).addClass(classes).addClass(inputMode);
1263
+ $control = $('<div>').addClass(settings.inputClass).addClass('items').appendTo($wrapper);
1264
+ $control_input = $('<input type="text" autocomplete="off" />').appendTo($control).attr('tabindex', $input.is(':disabled') ? '-1' : self.tabIndex);
1265
+ $dropdown_parent = $(settings.dropdownParent || $wrapper);
1266
+ $dropdown = $('<div>').addClass(settings.dropdownClass).addClass(inputMode).hide().appendTo($dropdown_parent);
1267
+ $dropdown_content = $('<div>').addClass(settings.dropdownContentClass).appendTo($dropdown);
1268
+
1269
+ if(inputId = $input.attr('id')) {
1270
+ $control_input.attr('id', inputId + '-selectized');
1271
+ $("label[for='"+inputId+"']").attr('for', inputId + '-selectized');
1272
+ }
1273
+
1274
+ if(self.settings.copyClassesToDropdown) {
1275
+ $dropdown.addClass(classes);
1276
+ }
1277
+
1278
+ $wrapper.css({
1279
+ width: $input[0].style.width
1280
+ });
1281
+
1282
+ if (self.plugins.names.length) {
1283
+ classes_plugins = 'plugin-' + self.plugins.names.join(' plugin-');
1284
+ $wrapper.addClass(classes_plugins);
1285
+ $dropdown.addClass(classes_plugins);
1286
+ }
1287
+
1288
+ if ((settings.maxItems === null || settings.maxItems > 1) && self.tagType === TAG_SELECT) {
1289
+ $input.attr('multiple', 'multiple');
1290
+ }
1291
+
1292
+ if (self.settings.placeholder) {
1293
+ $control_input.attr('placeholder', settings.placeholder);
1294
+ }
1295
+
1296
+ // if splitOn was not passed in, construct it from the delimiter to allow pasting universally
1297
+ if (!self.settings.splitOn && self.settings.delimiter) {
1298
+ var delimiterEscaped = self.settings.delimiter.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
1299
+ self.settings.splitOn = new RegExp('\\s*' + delimiterEscaped + '+\\s*');
1300
+ }
1301
+
1302
+ if ($input.attr('autocorrect')) {
1303
+ $control_input.attr('autocorrect', $input.attr('autocorrect'));
1304
+ }
1305
+
1306
+ if ($input.attr('autocapitalize')) {
1307
+ $control_input.attr('autocapitalize', $input.attr('autocapitalize'));
1308
+ }
1309
+ $control_input[0].type = $input[0].type;
1310
+
1311
+ self.$wrapper = $wrapper;
1312
+ self.$control = $control;
1313
+ self.$control_input = $control_input;
1314
+ self.$dropdown = $dropdown;
1315
+ self.$dropdown_content = $dropdown_content;
1316
+
1317
+ $dropdown.on('mouseenter mousedown click', '[data-disabled]>[data-selectable]', function(e) { e.stopImmediatePropagation(); });
1318
+ $dropdown.on('mouseenter', '[data-selectable]', function() { return self.onOptionHover.apply(self, arguments); });
1319
+ $dropdown.on('mousedown click', '[data-selectable]', function() { return self.onOptionSelect.apply(self, arguments); });
1320
+ watchChildEvent($control, 'mousedown', '*:not(input)', function() { return self.onItemSelect.apply(self, arguments); });
1321
+ autoGrow($control_input);
1322
+
1323
+ $control.on({
1324
+ mousedown : function() { return self.onMouseDown.apply(self, arguments); },
1325
+ click : function() { return self.onClick.apply(self, arguments); }
1326
+ });
1327
+
1328
+ $control_input.on({
1329
+ mousedown : function(e) { e.stopPropagation(); },
1330
+ keydown : function() { return self.onKeyDown.apply(self, arguments); },
1331
+ keyup : function() { return self.onKeyUp.apply(self, arguments); },
1332
+ keypress : function() { return self.onKeyPress.apply(self, arguments); },
1333
+ resize : function() { self.positionDropdown.apply(self, []); },
1334
+ blur : function() { return self.onBlur.apply(self, arguments); },
1335
+ focus : function() { self.ignoreBlur = false; return self.onFocus.apply(self, arguments); },
1336
+ paste : function() { return self.onPaste.apply(self, arguments); }
1337
+ });
1338
+
1339
+ $document.on('keydown' + eventNS, function(e) {
1340
+ self.isCmdDown = e[IS_MAC ? 'metaKey' : 'ctrlKey'];
1341
+ self.isCtrlDown = e[IS_MAC ? 'altKey' : 'ctrlKey'];
1342
+ self.isShiftDown = e.shiftKey;
1343
+ });
1344
+
1345
+ $document.on('keyup' + eventNS, function(e) {
1346
+ if (e.keyCode === KEY_CTRL) self.isCtrlDown = false;
1347
+ if (e.keyCode === KEY_SHIFT) self.isShiftDown = false;
1348
+ if (e.keyCode === KEY_CMD) self.isCmdDown = false;
1349
+ });
1350
+
1351
+ $document.on('mousedown' + eventNS, function(e) {
1352
+ if (self.isFocused) {
1353
+ // prevent events on the dropdown scrollbar from causing the control to blur
1354
+ if (e.target === self.$dropdown[0] || e.target.parentNode === self.$dropdown[0]) {
1355
+ return false;
1356
+ }
1357
+ // blur on click outside
1358
+ if (!self.$control.has(e.target).length && e.target !== self.$control[0]) {
1359
+ self.blur(e.target);
1360
+ }
1361
+ }
1362
+ });
1363
+
1364
+ $window.on(['scroll' + eventNS, 'resize' + eventNS].join(' '), function() {
1365
+ if (self.isOpen) {
1366
+ self.positionDropdown.apply(self, arguments);
1367
+ }
1368
+ });
1369
+ $window.on('mousemove' + eventNS, function() {
1370
+ self.ignoreHover = false;
1371
+ });
1372
+
1373
+ // store original children and tab index so that they can be
1374
+ // restored when the destroy() method is called.
1375
+ this.revertSettings = {
1376
+ $children : $input.children().detach(),
1377
+ tabindex : $input.attr('tabindex')
1378
+ };
1379
+
1380
+ $input.attr('tabindex', -1).hide().after(self.$wrapper);
1381
+
1382
+ if ($.isArray(settings.items)) {
1383
+ self.setValue(settings.items);
1384
+ delete settings.items;
1385
+ }
1386
+
1387
+ // feature detect for the validation API
1388
+ if (SUPPORTS_VALIDITY_API) {
1389
+ $input.on('invalid' + eventNS, function(e) {
1390
+ e.preventDefault();
1391
+ self.isInvalid = true;
1392
+ self.refreshState();
1393
+ });
1394
+ }
1395
+
1396
+ self.updateOriginalInput();
1397
+ self.refreshItems();
1398
+ self.refreshState();
1399
+ self.updatePlaceholder();
1400
+ self.isSetup = true;
1401
+
1402
+ if ($input.is(':disabled')) {
1403
+ self.disable();
1404
+ }
1405
+
1406
+ self.on('change', this.onChange);
1407
+
1408
+ $input.data('selectize', self);
1409
+ $input.addClass('selectized');
1410
+ self.trigger('initialize');
1411
+
1412
+ // preload options
1413
+ if (settings.preload === true) {
1414
+ self.onSearchChange('');
1415
+ }
1416
+
1417
+ },
1418
+
1419
+ /**
1420
+ * Sets up default rendering functions.
1421
+ */
1422
+ setupTemplates: function() {
1423
+ var self = this;
1424
+ var field_label = self.settings.labelField;
1425
+ var field_optgroup = self.settings.optgroupLabelField;
1426
+
1427
+ var templates = {
1428
+ 'optgroup': function(data) {
1429
+ return '<div class="optgroup">' + data.html + '</div>';
1430
+ },
1431
+ 'optgroup_header': function(data, escape) {
1432
+ return '<div class="optgroup-header">' + escape(data[field_optgroup]) + '</div>';
1433
+ },
1434
+ 'option': function(data, escape) {
1435
+ return '<div class="option">' + escape(data[field_label]) + '</div>';
1436
+ },
1437
+ 'item': function(data, escape) {
1438
+ return '<div class="item">' + escape(data[field_label]) + '</div>';
1439
+ },
1440
+ 'option_create': function(data, escape) {
1441
+ return '<div class="create">Add <strong>' + escape(data.input) + '</strong>&hellip;</div>';
1442
+ }
1443
+ };
1444
+
1445
+ self.settings.render = $.extend({}, templates, self.settings.render);
1446
+ },
1447
+
1448
+ /**
1449
+ * Maps fired events to callbacks provided
1450
+ * in the settings used when creating the control.
1451
+ */
1452
+ setupCallbacks: function() {
1453
+ var key, fn, callbacks = {
1454
+ 'initialize' : 'onInitialize',
1455
+ 'change' : 'onChange',
1456
+ 'item_add' : 'onItemAdd',
1457
+ 'item_remove' : 'onItemRemove',
1458
+ 'clear' : 'onClear',
1459
+ 'option_add' : 'onOptionAdd',
1460
+ 'option_remove' : 'onOptionRemove',
1461
+ 'option_clear' : 'onOptionClear',
1462
+ 'optgroup_add' : 'onOptionGroupAdd',
1463
+ 'optgroup_remove' : 'onOptionGroupRemove',
1464
+ 'optgroup_clear' : 'onOptionGroupClear',
1465
+ 'dropdown_open' : 'onDropdownOpen',
1466
+ 'dropdown_close' : 'onDropdownClose',
1467
+ 'type' : 'onType',
1468
+ 'load' : 'onLoad',
1469
+ 'focus' : 'onFocus',
1470
+ 'blur' : 'onBlur'
1471
+ };
1472
+
1473
+ for (key in callbacks) {
1474
+ if (callbacks.hasOwnProperty(key)) {
1475
+ fn = this.settings[callbacks[key]];
1476
+ if (fn) this.on(key, fn);
1477
+ }
1478
+ }
1479
+ },
1480
+
1481
+ /**
1482
+ * Triggered when the main control element
1483
+ * has a click event.
1484
+ *
1485
+ * @param {object} e
1486
+ * @return {boolean}
1487
+ */
1488
+ onClick: function(e) {
1489
+ var self = this;
1490
+
1491
+ // necessary for mobile webkit devices (manual focus triggering
1492
+ // is ignored unless invoked within a click event)
1493
+ // also necessary to reopen a dropdown that has been closed by
1494
+ // closeAfterSelect
1495
+ if (!self.isFocused || !self.isOpen) {
1496
+ self.focus();
1497
+ e.preventDefault();
1498
+ }
1499
+ },
1500
+
1501
+ /**
1502
+ * Triggered when the main control element
1503
+ * has a mouse down event.
1504
+ *
1505
+ * @param {object} e
1506
+ * @return {boolean}
1507
+ */
1508
+ onMouseDown: function(e) {
1509
+ var self = this;
1510
+ var defaultPrevented = e.isDefaultPrevented();
1511
+ var $target = $(e.target);
1512
+
1513
+ if (self.isFocused) {
1514
+ // retain focus by preventing native handling. if the
1515
+ // event target is the input it should not be modified.
1516
+ // otherwise, text selection within the input won't work.
1517
+ if (e.target !== self.$control_input[0]) {
1518
+ if (self.settings.mode === 'single') {
1519
+ // toggle dropdown
1520
+ self.isOpen ? self.close() : self.open();
1521
+ } else if (!defaultPrevented) {
1522
+ self.setActiveItem(null);
1523
+ }
1524
+ return false;
1525
+ }
1526
+ } else {
1527
+ // give control focus
1528
+ if (!defaultPrevented) {
1529
+ window.setTimeout(function() {
1530
+ self.focus();
1531
+ }, 0);
1532
+ }
1533
+ }
1534
+ },
1535
+
1536
+ /**
1537
+ * Triggered when the value of the control has been changed.
1538
+ * This should propagate the event to the original DOM
1539
+ * input / select element.
1540
+ */
1541
+ onChange: function() {
1542
+ this.$input.trigger('change');
1543
+ },
1544
+
1545
+ /**
1546
+ * Triggered on <input> paste.
1547
+ *
1548
+ * @param {object} e
1549
+ * @returns {boolean}
1550
+ */
1551
+ onPaste: function(e) {
1552
+ var self = this;
1553
+
1554
+ if (self.isFull() || self.isInputHidden || self.isLocked) {
1555
+ e.preventDefault();
1556
+ return;
1557
+ }
1558
+
1559
+ // If a regex or string is included, this will split the pasted
1560
+ // input and create Items for each separate value
1561
+ if (self.settings.splitOn) {
1562
+
1563
+ // Wait for pasted text to be recognized in value
1564
+ setTimeout(function() {
1565
+ var pastedText = self.$control_input.val();
1566
+ if(!pastedText.match(self.settings.splitOn)){ return }
1567
+
1568
+ var splitInput = $.trim(pastedText).split(self.settings.splitOn);
1569
+ for (var i = 0, n = splitInput.length; i < n; i++) {
1570
+ self.createItem(splitInput[i]);
1571
+ }
1572
+ }, 0);
1573
+ }
1574
+ },
1575
+
1576
+ /**
1577
+ * Triggered on <input> keypress.
1578
+ *
1579
+ * @param {object} e
1580
+ * @returns {boolean}
1581
+ */
1582
+ onKeyPress: function(e) {
1583
+ if (this.isLocked) return e && e.preventDefault();
1584
+ var character = String.fromCharCode(e.keyCode || e.which);
1585
+ if (this.settings.create && this.settings.mode === 'multi' && character === this.settings.delimiter) {
1586
+ this.createItem();
1587
+ e.preventDefault();
1588
+ return false;
1589
+ }
1590
+ },
1591
+
1592
+ /**
1593
+ * Triggered on <input> keydown.
1594
+ *
1595
+ * @param {object} e
1596
+ * @returns {boolean}
1597
+ */
1598
+ onKeyDown: function(e) {
1599
+ var isInput = e.target === this.$control_input[0];
1600
+ var self = this;
1601
+
1602
+ if (self.isLocked) {
1603
+ if (e.keyCode !== KEY_TAB) {
1604
+ e.preventDefault();
1605
+ }
1606
+ return;
1607
+ }
1608
+
1609
+ switch (e.keyCode) {
1610
+ case KEY_A:
1611
+ if (self.isCmdDown) {
1612
+ self.selectAll();
1613
+ return;
1614
+ }
1615
+ break;
1616
+ case KEY_ESC:
1617
+ if (self.isOpen) {
1618
+ e.preventDefault();
1619
+ e.stopPropagation();
1620
+ self.close();
1621
+ }
1622
+ return;
1623
+ case KEY_N:
1624
+ if (!e.ctrlKey || e.altKey) break;
1625
+ case KEY_DOWN:
1626
+ if (!self.isOpen && self.hasOptions) {
1627
+ self.open();
1628
+ } else if (self.$activeOption) {
1629
+ self.ignoreHover = true;
1630
+ var $next = self.getAdjacentOption(self.$activeOption, 1);
1631
+ if ($next.length) self.setActiveOption($next, true, true);
1632
+ }
1633
+ e.preventDefault();
1634
+ return;
1635
+ case KEY_P:
1636
+ if (!e.ctrlKey || e.altKey) break;
1637
+ case KEY_UP:
1638
+ if (self.$activeOption) {
1639
+ self.ignoreHover = true;
1640
+ var $prev = self.getAdjacentOption(self.$activeOption, -1);
1641
+ if ($prev.length) self.setActiveOption($prev, true, true);
1642
+ }
1643
+ e.preventDefault();
1644
+ return;
1645
+ case KEY_RETURN:
1646
+ if (self.isOpen && self.$activeOption) {
1647
+ self.onOptionSelect({currentTarget: self.$activeOption});
1648
+ e.preventDefault();
1649
+ }
1650
+ return;
1651
+ case KEY_LEFT:
1652
+ self.advanceSelection(-1, e);
1653
+ return;
1654
+ case KEY_RIGHT:
1655
+ self.advanceSelection(1, e);
1656
+ return;
1657
+ case KEY_TAB:
1658
+ if (self.settings.selectOnTab && self.isOpen && self.$activeOption) {
1659
+ self.onOptionSelect({currentTarget: self.$activeOption});
1660
+
1661
+ // Default behaviour is to jump to the next field, we only want this
1662
+ // if the current field doesn't accept any more entries
1663
+ if (!self.isFull()) {
1664
+ e.preventDefault();
1665
+ }
1666
+ }
1667
+ if (self.settings.create && self.createItem()) {
1668
+ e.preventDefault();
1669
+ }
1670
+ return;
1671
+ case KEY_BACKSPACE:
1672
+ case KEY_DELETE:
1673
+ self.deleteSelection(e);
1674
+ return;
1675
+ }
1676
+
1677
+ if ((self.isFull() || self.isInputHidden) && !(IS_MAC ? e.metaKey : e.ctrlKey)) {
1678
+ e.preventDefault();
1679
+ return;
1680
+ }
1681
+ },
1682
+
1683
+ /**
1684
+ * Triggered on <input> keyup.
1685
+ *
1686
+ * @param {object} e
1687
+ * @returns {boolean}
1688
+ */
1689
+ onKeyUp: function(e) {
1690
+ var self = this;
1691
+
1692
+ if (self.isLocked) return e && e.preventDefault();
1693
+ var value = self.$control_input.val() || '';
1694
+ if (self.lastValue !== value) {
1695
+ self.lastValue = value;
1696
+ self.onSearchChange(value);
1697
+ self.refreshOptions();
1698
+ self.trigger('type', value);
1699
+ }
1700
+ },
1701
+
1702
+ /**
1703
+ * Invokes the user-provide option provider / loader.
1704
+ *
1705
+ * Note: this function is debounced in the Selectize
1706
+ * constructor (by `settings.loadThrottle` milliseconds)
1707
+ *
1708
+ * @param {string} value
1709
+ */
1710
+ onSearchChange: function(value) {
1711
+ var self = this;
1712
+ var fn = self.settings.load;
1713
+ if (!fn) return;
1714
+ if (self.loadedSearches.hasOwnProperty(value)) return;
1715
+ self.loadedSearches[value] = true;
1716
+ self.load(function(callback) {
1717
+ fn.apply(self, [value, callback]);
1718
+ });
1719
+ },
1720
+
1721
+ /**
1722
+ * Triggered on <input> focus.
1723
+ *
1724
+ * @param {object} e (optional)
1725
+ * @returns {boolean}
1726
+ */
1727
+ onFocus: function(e) {
1728
+ var self = this;
1729
+ var wasFocused = self.isFocused;
1730
+
1731
+ if (self.isDisabled) {
1732
+ self.blur();
1733
+ e && e.preventDefault();
1734
+ return false;
1735
+ }
1736
+
1737
+ if (self.ignoreFocus) return;
1738
+ self.isFocused = true;
1739
+ if (self.settings.preload === 'focus') self.onSearchChange('');
1740
+
1741
+ if (!wasFocused) self.trigger('focus');
1742
+
1743
+ if (!self.$activeItems.length) {
1744
+ self.showInput();
1745
+ self.setActiveItem(null);
1746
+ self.refreshOptions(!!self.settings.openOnFocus);
1747
+ }
1748
+
1749
+ self.refreshState();
1750
+ },
1751
+
1752
+ /**
1753
+ * Triggered on <input> blur.
1754
+ *
1755
+ * @param {object} e
1756
+ * @param {Element} dest
1757
+ */
1758
+ onBlur: function(e, dest) {
1759
+ var self = this;
1760
+ if (!self.isFocused) return;
1761
+ self.isFocused = false;
1762
+
1763
+ if (self.ignoreFocus) {
1764
+ return;
1765
+ } else if (!self.ignoreBlur && document.activeElement === self.$dropdown_content[0]) {
1766
+ // necessary to prevent IE closing the dropdown when the scrollbar is clicked
1767
+ self.ignoreBlur = true;
1768
+ self.onFocus(e);
1769
+ return;
1770
+ }
1771
+
1772
+ var deactivate = function() {
1773
+ self.close();
1774
+ self.setTextboxValue('');
1775
+ self.setActiveItem(null);
1776
+ self.setActiveOption(null);
1777
+ self.setCaret(self.items.length);
1778
+ self.refreshState();
1779
+
1780
+ // IE11 bug: element still marked as active
1781
+ dest && dest.focus && dest.focus();
1782
+
1783
+ self.isBlurring = false;
1784
+ self.ignoreFocus = false;
1785
+ self.trigger('blur');
1786
+ };
1787
+
1788
+ self.isBlurring = true;
1789
+ self.ignoreFocus = true;
1790
+ if (self.settings.create && self.settings.createOnBlur) {
1791
+ self.createItem(null, false, deactivate);
1792
+ } else {
1793
+ deactivate();
1794
+ }
1795
+ },
1796
+
1797
+ /**
1798
+ * Triggered when the user rolls over
1799
+ * an option in the autocomplete dropdown menu.
1800
+ *
1801
+ * @param {object} e
1802
+ * @returns {boolean}
1803
+ */
1804
+ onOptionHover: function(e) {
1805
+ if (this.ignoreHover) return;
1806
+ this.setActiveOption(e.currentTarget, false);
1807
+ },
1808
+
1809
+ /**
1810
+ * Triggered when the user clicks on an option
1811
+ * in the autocomplete dropdown menu.
1812
+ *
1813
+ * @param {object} e
1814
+ * @returns {boolean}
1815
+ */
1816
+ onOptionSelect: function(e) {
1817
+ var value, $target, $option, self = this;
1818
+
1819
+ if (e.preventDefault) {
1820
+ e.preventDefault();
1821
+ e.stopPropagation();
1822
+ }
1823
+
1824
+ $target = $(e.currentTarget);
1825
+ if ($target.hasClass('create')) {
1826
+ self.createItem(null, function() {
1827
+ if (self.settings.closeAfterSelect) {
1828
+ self.close();
1829
+ }
1830
+ });
1831
+ } else {
1832
+ value = $target.attr('data-value');
1833
+ if (typeof value !== 'undefined') {
1834
+ self.lastQuery = null;
1835
+ self.setTextboxValue('');
1836
+ self.addItem(value);
1837
+ if (self.settings.closeAfterSelect) {
1838
+ self.close();
1839
+ } else if (!self.settings.hideSelected && e.type && /mouse/.test(e.type)) {
1840
+ self.setActiveOption(self.getOption(value));
1841
+ }
1842
+ }
1843
+ }
1844
+ },
1845
+
1846
+ /**
1847
+ * Triggered when the user clicks on an item
1848
+ * that has been selected.
1849
+ *
1850
+ * @param {object} e
1851
+ * @returns {boolean}
1852
+ */
1853
+ onItemSelect: function(e) {
1854
+ var self = this;
1855
+
1856
+ if (self.isLocked) return;
1857
+ if (self.settings.mode === 'multi') {
1858
+ e.preventDefault();
1859
+ self.setActiveItem(e.currentTarget, e);
1860
+ }
1861
+ },
1862
+
1863
+ /**
1864
+ * Invokes the provided method that provides
1865
+ * results to a callback---which are then added
1866
+ * as options to the control.
1867
+ *
1868
+ * @param {function} fn
1869
+ */
1870
+ load: function(fn) {
1871
+ var self = this;
1872
+ var $wrapper = self.$wrapper.addClass(self.settings.loadingClass);
1873
+
1874
+ self.loading++;
1875
+ fn.apply(self, [function(results) {
1876
+ self.loading = Math.max(self.loading - 1, 0);
1877
+ if (results && results.length) {
1878
+ self.addOption(results);
1879
+ self.refreshOptions(self.isFocused && !self.isInputHidden);
1880
+ }
1881
+ if (!self.loading) {
1882
+ $wrapper.removeClass(self.settings.loadingClass);
1883
+ }
1884
+ self.trigger('load', results);
1885
+ }]);
1886
+ },
1887
+
1888
+ /**
1889
+ * Sets the input field of the control to the specified value.
1890
+ *
1891
+ * @param {string} value
1892
+ */
1893
+ setTextboxValue: function(value) {
1894
+ var $input = this.$control_input;
1895
+ var changed = $input.val() !== value;
1896
+ if (changed) {
1897
+ $input.val(value).triggerHandler('update');
1898
+ this.lastValue = value;
1899
+ }
1900
+ },
1901
+
1902
+ /**
1903
+ * Returns the value of the control. If multiple items
1904
+ * can be selected (e.g. <select multiple>), this returns
1905
+ * an array. If only one item can be selected, this
1906
+ * returns a string.
1907
+ *
1908
+ * @returns {mixed}
1909
+ */
1910
+ getValue: function() {
1911
+ if (this.tagType === TAG_SELECT && this.$input.attr('multiple')) {
1912
+ return this.items;
1913
+ } else {
1914
+ return this.items.join(this.settings.delimiter);
1915
+ }
1916
+ },
1917
+
1918
+ /**
1919
+ * Resets the selected items to the given value.
1920
+ *
1921
+ * @param {mixed} value
1922
+ */
1923
+ setValue: function(value, silent) {
1924
+ var events = silent ? [] : ['change'];
1925
+
1926
+ debounce_events(this, events, function() {
1927
+ this.clear(silent);
1928
+ this.addItems(value, silent);
1929
+ });
1930
+ },
1931
+
1932
+ /**
1933
+ * Sets the selected item.
1934
+ *
1935
+ * @param {object} $item
1936
+ * @param {object} e (optional)
1937
+ */
1938
+ setActiveItem: function($item, e) {
1939
+ var self = this;
1940
+ var eventName;
1941
+ var i, idx, begin, end, item, swap;
1942
+ var $last;
1943
+
1944
+ if (self.settings.mode === 'single') return;
1945
+ $item = $($item);
1946
+
1947
+ // clear the active selection
1948
+ if (!$item.length) {
1949
+ $(self.$activeItems).removeClass('active');
1950
+ self.$activeItems = [];
1951
+ if (self.isFocused) {
1952
+ self.showInput();
1953
+ }
1954
+ return;
1955
+ }
1956
+
1957
+ // modify selection
1958
+ eventName = e && e.type.toLowerCase();
1959
+
1960
+ if (eventName === 'mousedown' && self.isShiftDown && self.$activeItems.length) {
1961
+ $last = self.$control.children('.active:last');
1962
+ begin = Array.prototype.indexOf.apply(self.$control[0].childNodes, [$last[0]]);
1963
+ end = Array.prototype.indexOf.apply(self.$control[0].childNodes, [$item[0]]);
1964
+ if (begin > end) {
1965
+ swap = begin;
1966
+ begin = end;
1967
+ end = swap;
1968
+ }
1969
+ for (i = begin; i <= end; i++) {
1970
+ item = self.$control[0].childNodes[i];
1971
+ if (self.$activeItems.indexOf(item) === -1) {
1972
+ $(item).addClass('active');
1973
+ self.$activeItems.push(item);
1974
+ }
1975
+ }
1976
+ e.preventDefault();
1977
+ } else if ((eventName === 'mousedown' && self.isCtrlDown) || (eventName === 'keydown' && this.isShiftDown)) {
1978
+ if ($item.hasClass('active')) {
1979
+ idx = self.$activeItems.indexOf($item[0]);
1980
+ self.$activeItems.splice(idx, 1);
1981
+ $item.removeClass('active');
1982
+ } else {
1983
+ self.$activeItems.push($item.addClass('active')[0]);
1984
+ }
1985
+ } else {
1986
+ $(self.$activeItems).removeClass('active');
1987
+ self.$activeItems = [$item.addClass('active')[0]];
1988
+ }
1989
+
1990
+ // ensure control has focus
1991
+ self.hideInput();
1992
+ if (!this.isFocused) {
1993
+ self.focus();
1994
+ }
1995
+ },
1996
+
1997
+ /**
1998
+ * Sets the selected item in the dropdown menu
1999
+ * of available options.
2000
+ *
2001
+ * @param {object} $object
2002
+ * @param {boolean} scroll
2003
+ * @param {boolean} animate
2004
+ */
2005
+ setActiveOption: function($option, scroll, animate) {
2006
+ var height_menu, height_item, y;
2007
+ var scroll_top, scroll_bottom;
2008
+ var self = this;
2009
+
2010
+ if (self.$activeOption) self.$activeOption.removeClass('active');
2011
+ self.$activeOption = null;
2012
+
2013
+ $option = $($option);
2014
+ if (!$option.length) return;
2015
+
2016
+ self.$activeOption = $option.addClass('active');
2017
+
2018
+ if (scroll || !isset(scroll)) {
2019
+
2020
+ height_menu = self.$dropdown_content.height();
2021
+ height_item = self.$activeOption.outerHeight(true);
2022
+ scroll = self.$dropdown_content.scrollTop() || 0;
2023
+ y = self.$activeOption.offset().top - self.$dropdown_content.offset().top + scroll;
2024
+ scroll_top = y;
2025
+ scroll_bottom = y - height_menu + height_item;
2026
+
2027
+ if (y + height_item > height_menu + scroll) {
2028
+ self.$dropdown_content.stop().animate({scrollTop: scroll_bottom}, animate ? self.settings.scrollDuration : 0);
2029
+ } else if (y < scroll) {
2030
+ self.$dropdown_content.stop().animate({scrollTop: scroll_top}, animate ? self.settings.scrollDuration : 0);
2031
+ }
2032
+
2033
+ }
2034
+ },
2035
+
2036
+ /**
2037
+ * Selects all items (CTRL + A).
2038
+ */
2039
+ selectAll: function() {
2040
+ var self = this;
2041
+ if (self.settings.mode === 'single') return;
2042
+
2043
+ self.$activeItems = Array.prototype.slice.apply(self.$control.children(':not(input)').addClass('active'));
2044
+ if (self.$activeItems.length) {
2045
+ self.hideInput();
2046
+ self.close();
2047
+ }
2048
+ self.focus();
2049
+ },
2050
+
2051
+ /**
2052
+ * Hides the input element out of view, while
2053
+ * retaining its focus.
2054
+ */
2055
+ hideInput: function() {
2056
+ var self = this;
2057
+
2058
+ self.setTextboxValue('');
2059
+ self.$control_input.css({opacity: 0, position: 'absolute', left: self.rtl ? 10000 : -10000});
2060
+ self.isInputHidden = true;
2061
+ },
2062
+
2063
+ /**
2064
+ * Restores input visibility.
2065
+ */
2066
+ showInput: function() {
2067
+ this.$control_input.css({opacity: 1, position: 'relative', left: 0});
2068
+ this.isInputHidden = false;
2069
+ },
2070
+
2071
+ /**
2072
+ * Gives the control focus.
2073
+ */
2074
+ focus: function() {
2075
+ var self = this;
2076
+ if (self.isDisabled) return;
2077
+
2078
+ self.ignoreFocus = true;
2079
+ self.$control_input[0].focus();
2080
+ window.setTimeout(function() {
2081
+ self.ignoreFocus = false;
2082
+ self.onFocus();
2083
+ }, 0);
2084
+ },
2085
+
2086
+ /**
2087
+ * Forces the control out of focus.
2088
+ *
2089
+ * @param {Element} dest
2090
+ */
2091
+ blur: function(dest) {
2092
+ this.$control_input[0].blur();
2093
+ this.onBlur(null, dest);
2094
+ },
2095
+
2096
+ /**
2097
+ * Returns a function that scores an object
2098
+ * to show how good of a match it is to the
2099
+ * provided query.
2100
+ *
2101
+ * @param {string} query
2102
+ * @param {object} options
2103
+ * @return {function}
2104
+ */
2105
+ getScoreFunction: function(query) {
2106
+ return this.sifter.getScoreFunction(query, this.getSearchOptions());
2107
+ },
2108
+
2109
+ /**
2110
+ * Returns search options for sifter (the system
2111
+ * for scoring and sorting results).
2112
+ *
2113
+ * @see https://github.com/brianreavis/sifter.js
2114
+ * @return {object}
2115
+ */
2116
+ getSearchOptions: function() {
2117
+ var settings = this.settings;
2118
+ var sort = settings.sortField;
2119
+ if (typeof sort === 'string') {
2120
+ sort = [{field: sort}];
2121
+ }
2122
+
2123
+ return {
2124
+ fields : settings.searchField,
2125
+ conjunction : settings.searchConjunction,
2126
+ sort : sort,
2127
+ nesting : settings.nesting
2128
+ };
2129
+ },
2130
+
2131
+ /**
2132
+ * Searches through available options and returns
2133
+ * a sorted array of matches.
2134
+ *
2135
+ * Returns an object containing:
2136
+ *
2137
+ * - query {string}
2138
+ * - tokens {array}
2139
+ * - total {int}
2140
+ * - items {array}
2141
+ *
2142
+ * @param {string} query
2143
+ * @returns {object}
2144
+ */
2145
+ search: function(query) {
2146
+ var i, value, score, result, calculateScore;
2147
+ var self = this;
2148
+ var settings = self.settings;
2149
+ var options = this.getSearchOptions();
2150
+
2151
+ // validate user-provided result scoring function
2152
+ if (settings.score) {
2153
+ calculateScore = self.settings.score.apply(this, [query]);
2154
+ if (typeof calculateScore !== 'function') {
2155
+ throw new Error('Selectize "score" setting must be a function that returns a function');
2156
+ }
2157
+ }
2158
+
2159
+ // perform search
2160
+ if (query !== self.lastQuery) {
2161
+ self.lastQuery = query;
2162
+ result = self.sifter.search(query, $.extend(options, {score: calculateScore}));
2163
+ self.currentResults = result;
2164
+ } else {
2165
+ result = $.extend(true, {}, self.currentResults);
2166
+ }
2167
+
2168
+ // filter out selected items
2169
+ if (settings.hideSelected) {
2170
+ for (i = result.items.length - 1; i >= 0; i--) {
2171
+ if (self.items.indexOf(hash_key(result.items[i].id)) !== -1) {
2172
+ result.items.splice(i, 1);
2173
+ }
2174
+ }
2175
+ }
2176
+
2177
+ return result;
2178
+ },
2179
+
2180
+ /**
2181
+ * Refreshes the list of available options shown
2182
+ * in the autocomplete dropdown menu.
2183
+ *
2184
+ * @param {boolean} triggerDropdown
2185
+ */
2186
+ refreshOptions: function(triggerDropdown) {
2187
+ var i, j, k, n, groups, groups_order, option, option_html, optgroup, optgroups, html, html_children, has_create_option;
2188
+ var $active, $active_before, $create;
2189
+
2190
+ if (typeof triggerDropdown === 'undefined') {
2191
+ triggerDropdown = true;
2192
+ }
2193
+
2194
+ var self = this;
2195
+ var query = $.trim(self.$control_input.val());
2196
+ var results = self.search(query);
2197
+ var $dropdown_content = self.$dropdown_content;
2198
+ var active_before = self.$activeOption && hash_key(self.$activeOption.attr('data-value'));
2199
+
2200
+ // build markup
2201
+ n = results.items.length;
2202
+ if (typeof self.settings.maxOptions === 'number') {
2203
+ n = Math.min(n, self.settings.maxOptions);
2204
+ }
2205
+
2206
+ // render and group available options individually
2207
+ groups = {};
2208
+ groups_order = [];
2209
+
2210
+ for (i = 0; i < n; i++) {
2211
+ option = self.options[results.items[i].id];
2212
+ option_html = self.render('option', option);
2213
+ optgroup = option[self.settings.optgroupField] || '';
2214
+ optgroups = $.isArray(optgroup) ? optgroup : [optgroup];
2215
+
2216
+ for (j = 0, k = optgroups && optgroups.length; j < k; j++) {
2217
+ optgroup = optgroups[j];
2218
+ if (!self.optgroups.hasOwnProperty(optgroup)) {
2219
+ optgroup = '';
2220
+ }
2221
+ if (!groups.hasOwnProperty(optgroup)) {
2222
+ groups[optgroup] = document.createDocumentFragment();
2223
+ groups_order.push(optgroup);
2224
+ }
2225
+ groups[optgroup].appendChild(option_html);
2226
+ }
2227
+ }
2228
+
2229
+ // sort optgroups
2230
+ if (this.settings.lockOptgroupOrder) {
2231
+ groups_order.sort(function(a, b) {
2232
+ var a_order = self.optgroups[a].$order || 0;
2233
+ var b_order = self.optgroups[b].$order || 0;
2234
+ return a_order - b_order;
2235
+ });
2236
+ }
2237
+
2238
+ // render optgroup headers & join groups
2239
+ html = document.createDocumentFragment();
2240
+ for (i = 0, n = groups_order.length; i < n; i++) {
2241
+ optgroup = groups_order[i];
2242
+ if (self.optgroups.hasOwnProperty(optgroup) && groups[optgroup].childNodes.length) {
2243
+ // render the optgroup header and options within it,
2244
+ // then pass it to the wrapper template
2245
+ html_children = document.createDocumentFragment();
2246
+ html_children.appendChild(self.render('optgroup_header', self.optgroups[optgroup]));
2247
+ html_children.appendChild(groups[optgroup]);
2248
+
2249
+ html.appendChild(self.render('optgroup', $.extend({}, self.optgroups[optgroup], {
2250
+ html: domToString(html_children),
2251
+ dom: html_children
2252
+ })));
2253
+ } else {
2254
+ html.appendChild(groups[optgroup]);
2255
+ }
2256
+ }
2257
+
2258
+ $dropdown_content.html(html);
2259
+
2260
+ // highlight matching terms inline
2261
+ if (self.settings.highlight) {
2262
+ $dropdown_content.removeHighlight();
2263
+ if (results.query.length && results.tokens.length) {
2264
+ for (i = 0, n = results.tokens.length; i < n; i++) {
2265
+ highlight($dropdown_content, results.tokens[i].regex);
2266
+ }
2267
+ }
2268
+ }
2269
+
2270
+ // add "selected" class to selected options
2271
+ if (!self.settings.hideSelected) {
2272
+ for (i = 0, n = self.items.length; i < n; i++) {
2273
+ self.getOption(self.items[i]).addClass('selected');
2274
+ }
2275
+ }
2276
+
2277
+ // add create option
2278
+ has_create_option = self.canCreate(query);
2279
+ if (has_create_option) {
2280
+ $dropdown_content.prepend(self.render('option_create', {input: query}));
2281
+ $create = $($dropdown_content[0].childNodes[0]);
2282
+ }
2283
+
2284
+ // activate
2285
+ self.hasOptions = results.items.length > 0 || has_create_option;
2286
+ if (self.hasOptions) {
2287
+ if (results.items.length > 0) {
2288
+ $active_before = active_before && self.getOption(active_before);
2289
+ if ($active_before && $active_before.length) {
2290
+ $active = $active_before;
2291
+ } else if (self.settings.mode === 'single' && self.items.length) {
2292
+ $active = self.getOption(self.items[0]);
2293
+ }
2294
+ if (!$active || !$active.length) {
2295
+ if ($create && !self.settings.addPrecedence) {
2296
+ $active = self.getAdjacentOption($create, 1);
2297
+ } else {
2298
+ $active = $dropdown_content.find('[data-selectable]:first');
2299
+ }
2300
+ }
2301
+ } else {
2302
+ $active = $create;
2303
+ }
2304
+ self.setActiveOption($active);
2305
+ if (triggerDropdown && !self.isOpen) { self.open(); }
2306
+ } else {
2307
+ self.setActiveOption(null);
2308
+ if (triggerDropdown && self.isOpen) { self.close(); }
2309
+ }
2310
+ },
2311
+
2312
+ /**
2313
+ * Adds an available option. If it already exists,
2314
+ * nothing will happen. Note: this does not refresh
2315
+ * the options list dropdown (use `refreshOptions`
2316
+ * for that).
2317
+ *
2318
+ * Usage:
2319
+ *
2320
+ * this.addOption(data)
2321
+ *
2322
+ * @param {object|array} data
2323
+ */
2324
+ addOption: function(data) {
2325
+ var i, n, value, self = this;
2326
+
2327
+ if ($.isArray(data)) {
2328
+ for (i = 0, n = data.length; i < n; i++) {
2329
+ self.addOption(data[i]);
2330
+ }
2331
+ return;
2332
+ }
2333
+
2334
+ if (value = self.registerOption(data)) {
2335
+ self.userOptions[value] = true;
2336
+ self.lastQuery = null;
2337
+ self.trigger('option_add', value, data);
2338
+ }
2339
+ },
2340
+
2341
+ /**
2342
+ * Registers an option to the pool of options.
2343
+ *
2344
+ * @param {object} data
2345
+ * @return {boolean|string}
2346
+ */
2347
+ registerOption: function(data) {
2348
+ var key = hash_key(data[this.settings.valueField]);
2349
+ if (typeof key === 'undefined' || key === null || this.options.hasOwnProperty(key)) return false;
2350
+ data.$order = data.$order || ++this.order;
2351
+ this.options[key] = data;
2352
+ return key;
2353
+ },
2354
+
2355
+ /**
2356
+ * Registers an option group to the pool of option groups.
2357
+ *
2358
+ * @param {object} data
2359
+ * @return {boolean|string}
2360
+ */
2361
+ registerOptionGroup: function(data) {
2362
+ var key = hash_key(data[this.settings.optgroupValueField]);
2363
+ if (!key) return false;
2364
+
2365
+ data.$order = data.$order || ++this.order;
2366
+ this.optgroups[key] = data;
2367
+ return key;
2368
+ },
2369
+
2370
+ /**
2371
+ * Registers a new optgroup for options
2372
+ * to be bucketed into.
2373
+ *
2374
+ * @param {string} id
2375
+ * @param {object} data
2376
+ */
2377
+ addOptionGroup: function(id, data) {
2378
+ data[this.settings.optgroupValueField] = id;
2379
+ if (id = this.registerOptionGroup(data)) {
2380
+ this.trigger('optgroup_add', id, data);
2381
+ }
2382
+ },
2383
+
2384
+ /**
2385
+ * Removes an existing option group.
2386
+ *
2387
+ * @param {string} id
2388
+ */
2389
+ removeOptionGroup: function(id) {
2390
+ if (this.optgroups.hasOwnProperty(id)) {
2391
+ delete this.optgroups[id];
2392
+ this.renderCache = {};
2393
+ this.trigger('optgroup_remove', id);
2394
+ }
2395
+ },
2396
+
2397
+ /**
2398
+ * Clears all existing option groups.
2399
+ */
2400
+ clearOptionGroups: function() {
2401
+ this.optgroups = {};
2402
+ this.renderCache = {};
2403
+ this.trigger('optgroup_clear');
2404
+ },
2405
+
2406
+ /**
2407
+ * Updates an option available for selection. If
2408
+ * it is visible in the selected items or options
2409
+ * dropdown, it will be re-rendered automatically.
2410
+ *
2411
+ * @param {string} value
2412
+ * @param {object} data
2413
+ */
2414
+ updateOption: function(value, data) {
2415
+ var self = this;
2416
+ var $item, $item_new;
2417
+ var value_new, index_item, cache_items, cache_options, order_old;
2418
+
2419
+ value = hash_key(value);
2420
+ value_new = hash_key(data[self.settings.valueField]);
2421
+
2422
+ // sanity checks
2423
+ if (value === null) return;
2424
+ if (!self.options.hasOwnProperty(value)) return;
2425
+ if (typeof value_new !== 'string') throw new Error('Value must be set in option data');
2426
+
2427
+ order_old = self.options[value].$order;
2428
+
2429
+ // update references
2430
+ if (value_new !== value) {
2431
+ delete self.options[value];
2432
+ index_item = self.items.indexOf(value);
2433
+ if (index_item !== -1) {
2434
+ self.items.splice(index_item, 1, value_new);
2435
+ }
2436
+ }
2437
+ data.$order = data.$order || order_old;
2438
+ self.options[value_new] = data;
2439
+
2440
+ // invalidate render cache
2441
+ cache_items = self.renderCache['item'];
2442
+ cache_options = self.renderCache['option'];
2443
+
2444
+ if (cache_items) {
2445
+ delete cache_items[value];
2446
+ delete cache_items[value_new];
2447
+ }
2448
+ if (cache_options) {
2449
+ delete cache_options[value];
2450
+ delete cache_options[value_new];
2451
+ }
2452
+
2453
+ // update the item if it's selected
2454
+ if (self.items.indexOf(value_new) !== -1) {
2455
+ $item = self.getItem(value);
2456
+ $item_new = $(self.render('item', data));
2457
+ if ($item.hasClass('active')) $item_new.addClass('active');
2458
+ $item.replaceWith($item_new);
2459
+ }
2460
+
2461
+ // invalidate last query because we might have updated the sortField
2462
+ self.lastQuery = null;
2463
+
2464
+ // update dropdown contents
2465
+ if (self.isOpen) {
2466
+ self.refreshOptions(false);
2467
+ }
2468
+ },
2469
+
2470
+ /**
2471
+ * Removes a single option.
2472
+ *
2473
+ * @param {string} value
2474
+ * @param {boolean} silent
2475
+ */
2476
+ removeOption: function(value, silent) {
2477
+ var self = this;
2478
+ value = hash_key(value);
2479
+
2480
+ var cache_items = self.renderCache['item'];
2481
+ var cache_options = self.renderCache['option'];
2482
+ if (cache_items) delete cache_items[value];
2483
+ if (cache_options) delete cache_options[value];
2484
+
2485
+ delete self.userOptions[value];
2486
+ delete self.options[value];
2487
+ self.lastQuery = null;
2488
+ self.trigger('option_remove', value);
2489
+ self.removeItem(value, silent);
2490
+ },
2491
+
2492
+ /**
2493
+ * Clears all options.
2494
+ */
2495
+ clearOptions: function() {
2496
+ var self = this;
2497
+
2498
+ self.loadedSearches = {};
2499
+ self.userOptions = {};
2500
+ self.renderCache = {};
2501
+ var options = self.options;
2502
+ $.each(self.options, function(key, value) {
2503
+ if(self.items.indexOf(key) == -1) {
2504
+ delete options[key];
2505
+ }
2506
+ });
2507
+ self.options = self.sifter.items = options;
2508
+ self.lastQuery = null;
2509
+ self.trigger('option_clear');
2510
+ },
2511
+
2512
+ /**
2513
+ * Returns the jQuery element of the option
2514
+ * matching the given value.
2515
+ *
2516
+ * @param {string} value
2517
+ * @returns {object}
2518
+ */
2519
+ getOption: function(value) {
2520
+ return this.getElementWithValue(value, this.$dropdown_content.find('[data-selectable]'));
2521
+ },
2522
+
2523
+ /**
2524
+ * Returns the jQuery element of the next or
2525
+ * previous selectable option.
2526
+ *
2527
+ * @param {object} $option
2528
+ * @param {int} direction can be 1 for next or -1 for previous
2529
+ * @return {object}
2530
+ */
2531
+ getAdjacentOption: function($option, direction) {
2532
+ var $options = this.$dropdown.find('[data-selectable]');
2533
+ var index = $options.index($option) + direction;
2534
+
2535
+ return index >= 0 && index < $options.length ? $options.eq(index) : $();
2536
+ },
2537
+
2538
+ /**
2539
+ * Finds the first element with a "data-value" attribute
2540
+ * that matches the given value.
2541
+ *
2542
+ * @param {mixed} value
2543
+ * @param {object} $els
2544
+ * @return {object}
2545
+ */
2546
+ getElementWithValue: function(value, $els) {
2547
+ value = hash_key(value);
2548
+
2549
+ if (typeof value !== 'undefined' && value !== null) {
2550
+ for (var i = 0, n = $els.length; i < n; i++) {
2551
+ if ($els[i].getAttribute('data-value') === value) {
2552
+ return $($els[i]);
2553
+ }
2554
+ }
2555
+ }
2556
+
2557
+ return $();
2558
+ },
2559
+
2560
+ /**
2561
+ * Returns the jQuery element of the item
2562
+ * matching the given value.
2563
+ *
2564
+ * @param {string} value
2565
+ * @returns {object}
2566
+ */
2567
+ getItem: function(value) {
2568
+ return this.getElementWithValue(value, this.$control.children());
2569
+ },
2570
+
2571
+ /**
2572
+ * "Selects" multiple items at once. Adds them to the list
2573
+ * at the current caret position.
2574
+ *
2575
+ * @param {string} value
2576
+ * @param {boolean} silent
2577
+ */
2578
+ addItems: function(values, silent) {
2579
+ this.buffer = document.createDocumentFragment();
2580
+
2581
+ var childNodes = this.$control[0].childNodes;
2582
+ for (var i = 0; i < childNodes.length; i++) {
2583
+ this.buffer.appendChild(childNodes[i]);
2584
+ }
2585
+
2586
+ var items = $.isArray(values) ? values : [values];
2587
+ for (var i = 0, n = items.length; i < n; i++) {
2588
+ this.isPending = (i < n - 1);
2589
+ this.addItem(items[i], silent);
2590
+ }
2591
+
2592
+ var control = this.$control[0];
2593
+ control.insertBefore(this.buffer, control.firstChild);
2594
+
2595
+ this.buffer = null;
2596
+ },
2597
+
2598
+ /**
2599
+ * "Selects" an item. Adds it to the list
2600
+ * at the current caret position.
2601
+ *
2602
+ * @param {string} value
2603
+ * @param {boolean} silent
2604
+ */
2605
+ addItem: function(value, silent) {
2606
+ var events = silent ? [] : ['change'];
2607
+
2608
+ debounce_events(this, events, function() {
2609
+ var $item, $option, $options;
2610
+ var self = this;
2611
+ var inputMode = self.settings.mode;
2612
+ var i, active, value_next, wasFull;
2613
+ value = hash_key(value);
2614
+
2615
+ if (self.items.indexOf(value) !== -1) {
2616
+ if (inputMode === 'single') self.close();
2617
+ return;
2618
+ }
2619
+
2620
+ if (!self.options.hasOwnProperty(value)) return;
2621
+ if (inputMode === 'single') self.clear(silent);
2622
+ if (inputMode === 'multi' && self.isFull()) return;
2623
+
2624
+ $item = $(self.render('item', self.options[value]));
2625
+ wasFull = self.isFull();
2626
+ self.items.splice(self.caretPos, 0, value);
2627
+ self.insertAtCaret($item);
2628
+ if (!self.isPending || (!wasFull && self.isFull())) {
2629
+ self.refreshState();
2630
+ }
2631
+
2632
+ if (self.isSetup) {
2633
+ $options = self.$dropdown_content.find('[data-selectable]');
2634
+
2635
+ // update menu / remove the option (if this is not one item being added as part of series)
2636
+ if (!self.isPending) {
2637
+ $option = self.getOption(value);
2638
+ value_next = self.getAdjacentOption($option, 1).attr('data-value');
2639
+ self.refreshOptions(self.isFocused && inputMode !== 'single');
2640
+ if (value_next) {
2641
+ self.setActiveOption(self.getOption(value_next));
2642
+ }
2643
+ }
2644
+
2645
+ // hide the menu if the maximum number of items have been selected or no options are left
2646
+ if (!$options.length || self.isFull()) {
2647
+ self.close();
2648
+ } else if (!self.isPending) {
2649
+ self.positionDropdown();
2650
+ }
2651
+
2652
+ self.updatePlaceholder();
2653
+ self.trigger('item_add', value, $item);
2654
+
2655
+ if (!self.isPending) {
2656
+ self.updateOriginalInput({silent: silent});
2657
+ }
2658
+ }
2659
+ });
2660
+ },
2661
+
2662
+ /**
2663
+ * Removes the selected item matching
2664
+ * the provided value.
2665
+ *
2666
+ * @param {string} value
2667
+ */
2668
+ removeItem: function(value, silent) {
2669
+ var self = this;
2670
+ var $item, i, idx;
2671
+
2672
+ $item = (value instanceof $) ? value : self.getItem(value);
2673
+ value = hash_key($item.attr('data-value'));
2674
+ i = self.items.indexOf(value);
2675
+
2676
+ if (i !== -1) {
2677
+ $item.remove();
2678
+ if ($item.hasClass('active')) {
2679
+ idx = self.$activeItems.indexOf($item[0]);
2680
+ self.$activeItems.splice(idx, 1);
2681
+ }
2682
+
2683
+ self.items.splice(i, 1);
2684
+ self.lastQuery = null;
2685
+ if (!self.settings.persist && self.userOptions.hasOwnProperty(value)) {
2686
+ self.removeOption(value, silent);
2687
+ }
2688
+
2689
+ if (i < self.caretPos) {
2690
+ self.setCaret(self.caretPos - 1);
2691
+ }
2692
+
2693
+ self.refreshState();
2694
+ self.updatePlaceholder();
2695
+ self.updateOriginalInput({silent: silent});
2696
+ self.positionDropdown();
2697
+ self.trigger('item_remove', value, $item);
2698
+ }
2699
+ },
2700
+
2701
+ /**
2702
+ * Invokes the `create` method provided in the
2703
+ * selectize options that should provide the data
2704
+ * for the new item, given the user input.
2705
+ *
2706
+ * Once this completes, it will be added
2707
+ * to the item list.
2708
+ *
2709
+ * @param {string} value
2710
+ * @param {boolean} [triggerDropdown]
2711
+ * @param {function} [callback]
2712
+ * @return {boolean}
2713
+ */
2714
+ createItem: function(input, triggerDropdown) {
2715
+ var self = this;
2716
+ var caret = self.caretPos;
2717
+ input = input || $.trim(self.$control_input.val() || '');
2718
+
2719
+ var callback = arguments[arguments.length - 1];
2720
+ if (typeof callback !== 'function') callback = function() {};
2721
+
2722
+ if (typeof triggerDropdown !== 'boolean') {
2723
+ triggerDropdown = true;
2724
+ }
2725
+
2726
+ if (!self.canCreate(input)) {
2727
+ callback();
2728
+ return false;
2729
+ }
2730
+
2731
+ self.lock();
2732
+
2733
+ var setup = (typeof self.settings.create === 'function') ? this.settings.create : function(input) {
2734
+ var data = {};
2735
+ data[self.settings.labelField] = input;
2736
+ data[self.settings.valueField] = input;
2737
+ return data;
2738
+ };
2739
+
2740
+ var create = once(function(data) {
2741
+ self.unlock();
2742
+
2743
+ if (!data || typeof data !== 'object') return callback();
2744
+ var value = hash_key(data[self.settings.valueField]);
2745
+ if (typeof value !== 'string') return callback();
2746
+
2747
+ self.setTextboxValue('');
2748
+ self.addOption(data);
2749
+ self.setCaret(caret);
2750
+ self.addItem(value);
2751
+ self.refreshOptions(triggerDropdown && self.settings.mode !== 'single');
2752
+ callback(data);
2753
+ });
2754
+
2755
+ var output = setup.apply(this, [input, create]);
2756
+ if (typeof output !== 'undefined') {
2757
+ create(output);
2758
+ }
2759
+
2760
+ return true;
2761
+ },
2762
+
2763
+ /**
2764
+ * Re-renders the selected item lists.
2765
+ */
2766
+ refreshItems: function() {
2767
+ this.lastQuery = null;
2768
+
2769
+ if (this.isSetup) {
2770
+ this.addItem(this.items);
2771
+ }
2772
+
2773
+ this.refreshState();
2774
+ this.updateOriginalInput();
2775
+ },
2776
+
2777
+ /**
2778
+ * Updates all state-dependent attributes
2779
+ * and CSS classes.
2780
+ */
2781
+ refreshState: function() {
2782
+ this.refreshValidityState();
2783
+ this.refreshClasses();
2784
+ },
2785
+
2786
+ /**
2787
+ * Update the `required` attribute of both input and control input.
2788
+ *
2789
+ * The `required` property needs to be activated on the control input
2790
+ * for the error to be displayed at the right place. `required` also
2791
+ * needs to be temporarily deactivated on the input since the input is
2792
+ * hidden and can't show errors.
2793
+ */
2794
+ refreshValidityState: function() {
2795
+ if (!this.isRequired) return false;
2796
+
2797
+ var invalid = !this.items.length;
2798
+
2799
+ this.isInvalid = invalid;
2800
+ this.$control_input.prop('required', invalid);
2801
+ this.$input.prop('required', !invalid);
2802
+ },
2803
+
2804
+ /**
2805
+ * Updates all state-dependent CSS classes.
2806
+ */
2807
+ refreshClasses: function() {
2808
+ var self = this;
2809
+ var isFull = self.isFull();
2810
+ var isLocked = self.isLocked;
2811
+
2812
+ self.$wrapper
2813
+ .toggleClass('rtl', self.rtl);
2814
+
2815
+ self.$control
2816
+ .toggleClass('focus', self.isFocused)
2817
+ .toggleClass('disabled', self.isDisabled)
2818
+ .toggleClass('required', self.isRequired)
2819
+ .toggleClass('invalid', self.isInvalid)
2820
+ .toggleClass('locked', isLocked)
2821
+ .toggleClass('full', isFull).toggleClass('not-full', !isFull)
2822
+ .toggleClass('input-active', self.isFocused && !self.isInputHidden)
2823
+ .toggleClass('dropdown-active', self.isOpen)
2824
+ .toggleClass('has-options', !$.isEmptyObject(self.options))
2825
+ .toggleClass('has-items', self.items.length > 0);
2826
+
2827
+ self.$control_input.data('grow', !isFull && !isLocked);
2828
+ },
2829
+
2830
+ /**
2831
+ * Determines whether or not more items can be added
2832
+ * to the control without exceeding the user-defined maximum.
2833
+ *
2834
+ * @returns {boolean}
2835
+ */
2836
+ isFull: function() {
2837
+ return this.settings.maxItems !== null && this.items.length >= this.settings.maxItems;
2838
+ },
2839
+
2840
+ /**
2841
+ * Refreshes the original <select> or <input>
2842
+ * element to reflect the current state.
2843
+ */
2844
+ updateOriginalInput: function(opts) {
2845
+ var i, n, options, label, self = this;
2846
+ opts = opts || {};
2847
+
2848
+ if (self.tagType === TAG_SELECT) {
2849
+ options = [];
2850
+ for (i = 0, n = self.items.length; i < n; i++) {
2851
+ label = self.options[self.items[i]][self.settings.labelField] || '';
2852
+ options.push('<option value="' + escape_html(self.items[i]) + '" selected="selected">' + escape_html(label) + '</option>');
2853
+ }
2854
+ if (!options.length && !this.$input.attr('multiple')) {
2855
+ options.push('<option value="" selected="selected"></option>');
2856
+ }
2857
+ self.$input.html(options.join(''));
2858
+ } else {
2859
+ self.$input.val(self.getValue());
2860
+ self.$input.attr('value',self.$input.val());
2861
+ }
2862
+
2863
+ if (self.isSetup) {
2864
+ if (!opts.silent) {
2865
+ self.trigger('change', self.$input.val());
2866
+ }
2867
+ }
2868
+ },
2869
+
2870
+ /**
2871
+ * Shows/hide the input placeholder depending
2872
+ * on if there items in the list already.
2873
+ */
2874
+ updatePlaceholder: function() {
2875
+ if (!this.settings.placeholder) return;
2876
+ var $input = this.$control_input;
2877
+
2878
+ if (this.items.length) {
2879
+ $input.removeAttr('placeholder');
2880
+ } else {
2881
+ $input.attr('placeholder', this.settings.placeholder);
2882
+ }
2883
+ $input.triggerHandler('update', {force: true});
2884
+ },
2885
+
2886
+ /**
2887
+ * Shows the autocomplete dropdown containing
2888
+ * the available options.
2889
+ */
2890
+ open: function() {
2891
+ var self = this;
2892
+
2893
+ if (self.isLocked || self.isOpen || (self.settings.mode === 'multi' && self.isFull())) return;
2894
+ self.focus();
2895
+ self.isOpen = true;
2896
+ self.refreshState();
2897
+ self.$dropdown.css({visibility: 'hidden', display: 'block'});
2898
+ self.positionDropdown();
2899
+ self.$dropdown.css({visibility: 'visible'});
2900
+ self.trigger('dropdown_open', self.$dropdown);
2901
+ },
2902
+
2903
+ /**
2904
+ * Closes the autocomplete dropdown menu.
2905
+ */
2906
+ close: function() {
2907
+ var self = this;
2908
+ var trigger = self.isOpen;
2909
+
2910
+ if (self.settings.mode === 'single' && self.items.length) {
2911
+ self.hideInput();
2912
+
2913
+ // Do not trigger blur while inside a blur event,
2914
+ // this fixes some weird tabbing behavior in FF and IE.
2915
+ // See #1164
2916
+ if (!self.isBlurring) {
2917
+ self.$control_input.blur(); // close keyboard on iOS
2918
+ }
2919
+ }
2920
+
2921
+ self.isOpen = false;
2922
+ self.$dropdown.hide();
2923
+ self.setActiveOption(null);
2924
+ self.refreshState();
2925
+
2926
+ if (trigger) self.trigger('dropdown_close', self.$dropdown);
2927
+ },
2928
+
2929
+ /**
2930
+ * Calculates and applies the appropriate
2931
+ * position of the dropdown.
2932
+ */
2933
+ positionDropdown: function() {
2934
+ var $control = this.$control;
2935
+ var offset = this.settings.dropdownParent === 'body' ? $control.offset() : $control.position();
2936
+ offset.top += $control.outerHeight(true);
2937
+
2938
+ this.$dropdown.css({
2939
+ width : $control[0].getBoundingClientRect().width,
2940
+ top : offset.top,
2941
+ left : offset.left
2942
+ });
2943
+ },
2944
+
2945
+ /**
2946
+ * Resets / clears all selected items
2947
+ * from the control.
2948
+ *
2949
+ * @param {boolean} silent
2950
+ */
2951
+ clear: function(silent) {
2952
+ var self = this;
2953
+
2954
+ if (!self.items.length) return;
2955
+ self.$control.children(':not(input)').remove();
2956
+ self.items = [];
2957
+ self.lastQuery = null;
2958
+ self.setCaret(0);
2959
+ self.setActiveItem(null);
2960
+ self.updatePlaceholder();
2961
+ self.updateOriginalInput({silent: silent});
2962
+ self.refreshState();
2963
+ self.showInput();
2964
+ self.trigger('clear');
2965
+ },
2966
+
2967
+ /**
2968
+ * A helper method for inserting an element
2969
+ * at the current caret position.
2970
+ *
2971
+ * @param {object} $el
2972
+ */
2973
+ insertAtCaret: function($el) {
2974
+ var caret = Math.min(this.caretPos, this.items.length);
2975
+ var el = $el[0];
2976
+ var target = this.buffer || this.$control[0];
2977
+
2978
+ if (caret === 0) {
2979
+ target.insertBefore(el, target.firstChild);
2980
+ } else {
2981
+ target.insertBefore(el, target.childNodes[caret]);
2982
+ }
2983
+
2984
+ this.setCaret(caret + 1);
2985
+ },
2986
+
2987
+ /**
2988
+ * Removes the current selected item(s).
2989
+ *
2990
+ * @param {object} e (optional)
2991
+ * @returns {boolean}
2992
+ */
2993
+ deleteSelection: function(e) {
2994
+ var i, n, direction, selection, values, caret, option_select, $option_select, $tail;
2995
+ var self = this;
2996
+
2997
+ direction = (e && e.keyCode === KEY_BACKSPACE) ? -1 : 1;
2998
+ selection = getSelection(self.$control_input[0]);
2999
+
3000
+ if (self.$activeOption && !self.settings.hideSelected) {
3001
+ option_select = self.getAdjacentOption(self.$activeOption, -1).attr('data-value');
3002
+ }
3003
+
3004
+ // determine items that will be removed
3005
+ values = [];
3006
+
3007
+ if (self.$activeItems.length) {
3008
+ $tail = self.$control.children('.active:' + (direction > 0 ? 'last' : 'first'));
3009
+ caret = self.$control.children(':not(input)').index($tail);
3010
+ if (direction > 0) { caret++; }
3011
+
3012
+ for (i = 0, n = self.$activeItems.length; i < n; i++) {
3013
+ values.push($(self.$activeItems[i]).attr('data-value'));
3014
+ }
3015
+ if (e) {
3016
+ e.preventDefault();
3017
+ e.stopPropagation();
3018
+ }
3019
+ } else if ((self.isFocused || self.settings.mode === 'single') && self.items.length) {
3020
+ if (direction < 0 && selection.start === 0 && selection.length === 0) {
3021
+ values.push(self.items[self.caretPos - 1]);
3022
+ } else if (direction > 0 && selection.start === self.$control_input.val().length) {
3023
+ values.push(self.items[self.caretPos]);
3024
+ }
3025
+ }
3026
+
3027
+ // allow the callback to abort
3028
+ if (!values.length || (typeof self.settings.onDelete === 'function' && self.settings.onDelete.apply(self, [values]) === false)) {
3029
+ return false;
3030
+ }
3031
+
3032
+ // perform removal
3033
+ if (typeof caret !== 'undefined') {
3034
+ self.setCaret(caret);
3035
+ }
3036
+ while (values.length) {
3037
+ self.removeItem(values.pop());
3038
+ }
3039
+
3040
+ self.showInput();
3041
+ self.positionDropdown();
3042
+ self.refreshOptions(true);
3043
+
3044
+ // select previous option
3045
+ if (option_select) {
3046
+ $option_select = self.getOption(option_select);
3047
+ if ($option_select.length) {
3048
+ self.setActiveOption($option_select);
3049
+ }
3050
+ }
3051
+
3052
+ return true;
3053
+ },
3054
+
3055
+ /**
3056
+ * Selects the previous / next item (depending
3057
+ * on the `direction` argument).
3058
+ *
3059
+ * > 0 - right
3060
+ * < 0 - left
3061
+ *
3062
+ * @param {int} direction
3063
+ * @param {object} e (optional)
3064
+ */
3065
+ advanceSelection: function(direction, e) {
3066
+ var tail, selection, idx, valueLength, cursorAtEdge, $tail;
3067
+ var self = this;
3068
+
3069
+ if (direction === 0) return;
3070
+ if (self.rtl) direction *= -1;
3071
+
3072
+ tail = direction > 0 ? 'last' : 'first';
3073
+ selection = getSelection(self.$control_input[0]);
3074
+
3075
+ if (self.isFocused && !self.isInputHidden) {
3076
+ valueLength = self.$control_input.val().length;
3077
+ cursorAtEdge = direction < 0
3078
+ ? selection.start === 0 && selection.length === 0
3079
+ : selection.start === valueLength;
3080
+
3081
+ if (cursorAtEdge && !valueLength) {
3082
+ self.advanceCaret(direction, e);
3083
+ }
3084
+ } else {
3085
+ $tail = self.$control.children('.active:' + tail);
3086
+ if ($tail.length) {
3087
+ idx = self.$control.children(':not(input)').index($tail);
3088
+ self.setActiveItem(null);
3089
+ self.setCaret(direction > 0 ? idx + 1 : idx);
3090
+ }
3091
+ }
3092
+ },
3093
+
3094
+ /**
3095
+ * Moves the caret left / right.
3096
+ *
3097
+ * @param {int} direction
3098
+ * @param {object} e (optional)
3099
+ */
3100
+ advanceCaret: function(direction, e) {
3101
+ var self = this, fn, $adj;
3102
+
3103
+ if (direction === 0) return;
3104
+
3105
+ fn = direction > 0 ? 'next' : 'prev';
3106
+ if (self.isShiftDown) {
3107
+ $adj = self.$control_input[fn]();
3108
+ if ($adj.length) {
3109
+ self.hideInput();
3110
+ self.setActiveItem($adj);
3111
+ e && e.preventDefault();
3112
+ }
3113
+ } else {
3114
+ self.setCaret(self.caretPos + direction);
3115
+ }
3116
+ },
3117
+
3118
+ /**
3119
+ * Moves the caret to the specified index.
3120
+ *
3121
+ * @param {int} i
3122
+ */
3123
+ setCaret: function(i) {
3124
+ var self = this;
3125
+
3126
+ if (self.settings.mode === 'single') {
3127
+ i = self.items.length;
3128
+ } else {
3129
+ i = Math.max(0, Math.min(self.items.length, i));
3130
+ }
3131
+
3132
+ if(!self.isPending) {
3133
+ // the input must be moved by leaving it in place and moving the
3134
+ // siblings, due to the fact that focus cannot be restored once lost
3135
+ // on mobile webkit devices
3136
+ var j, n, fn, $children, $child;
3137
+ $children = self.$control.children(':not(input)');
3138
+ for (j = 0, n = $children.length; j < n; j++) {
3139
+ $child = $($children[j]).detach();
3140
+ if (j < i) {
3141
+ self.$control_input.before($child);
3142
+ } else {
3143
+ self.$control.append($child);
3144
+ }
3145
+ }
3146
+ }
3147
+
3148
+ self.caretPos = i;
3149
+ },
3150
+
3151
+ /**
3152
+ * Disables user input on the control. Used while
3153
+ * items are being asynchronously created.
3154
+ */
3155
+ lock: function() {
3156
+ this.close();
3157
+ this.isLocked = true;
3158
+ this.refreshState();
3159
+ },
3160
+
3161
+ /**
3162
+ * Re-enables user input on the control.
3163
+ */
3164
+ unlock: function() {
3165
+ this.isLocked = false;
3166
+ this.refreshState();
3167
+ },
3168
+
3169
+ /**
3170
+ * Disables user input on the control completely.
3171
+ * While disabled, it cannot receive focus.
3172
+ */
3173
+ disable: function() {
3174
+ var self = this;
3175
+ self.$input.prop('disabled', true);
3176
+ self.$control_input.prop('disabled', true).prop('tabindex', -1);
3177
+ self.isDisabled = true;
3178
+ self.lock();
3179
+ },
3180
+
3181
+ /**
3182
+ * Enables the control so that it can respond
3183
+ * to focus and user input.
3184
+ */
3185
+ enable: function() {
3186
+ var self = this;
3187
+ self.$input.prop('disabled', false);
3188
+ self.$control_input.prop('disabled', false).prop('tabindex', self.tabIndex);
3189
+ self.isDisabled = false;
3190
+ self.unlock();
3191
+ },
3192
+
3193
+ /**
3194
+ * Completely destroys the control and
3195
+ * unbinds all event listeners so that it can
3196
+ * be garbage collected.
3197
+ */
3198
+ destroy: function() {
3199
+ var self = this;
3200
+ var eventNS = self.eventNS;
3201
+ var revertSettings = self.revertSettings;
3202
+
3203
+ self.trigger('destroy');
3204
+ self.off();
3205
+ self.$wrapper.remove();
3206
+ self.$dropdown.remove();
3207
+
3208
+ self.$input
3209
+ .html('')
3210
+ .append(revertSettings.$children)
3211
+ .removeAttr('tabindex')
3212
+ .removeClass('selectized')
3213
+ .attr({tabindex: revertSettings.tabindex})
3214
+ .show();
3215
+
3216
+ self.$control_input.removeData('grow');
3217
+ self.$input.removeData('selectize');
3218
+
3219
+ if (--Selectize.count == 0 && Selectize.$testInput) {
3220
+ Selectize.$testInput.remove();
3221
+ Selectize.$testInput = undefined;
3222
+ }
3223
+
3224
+ $(window).off(eventNS);
3225
+ $(document).off(eventNS);
3226
+ $(document.body).off(eventNS);
3227
+
3228
+ delete self.$input[0].selectize;
3229
+ },
3230
+
3231
+ /**
3232
+ * A helper method for rendering "item" and
3233
+ * "option" templates, given the data.
3234
+ *
3235
+ * @param {string} templateName
3236
+ * @param {object} data
3237
+ * @returns {string}
3238
+ */
3239
+ render: function(templateName, data) {
3240
+ var value, id, label;
3241
+ var html = '';
3242
+ var cache = false;
3243
+ var self = this;
3244
+ var regex_tag = /^[\t \r\n]*<([a-z][a-z0-9\-_]*(?:\:[a-z][a-z0-9\-_]*)?)/i;
3245
+
3246
+ if (templateName === 'option' || templateName === 'item') {
3247
+ value = hash_key(data[self.settings.valueField]);
3248
+ cache = !!value;
3249
+ }
3250
+
3251
+ // pull markup from cache if it exists
3252
+ if (cache) {
3253
+ if (!isset(self.renderCache[templateName])) {
3254
+ self.renderCache[templateName] = {};
3255
+ }
3256
+ if (self.renderCache[templateName].hasOwnProperty(value)) {
3257
+ return self.renderCache[templateName][value];
3258
+ }
3259
+ }
3260
+
3261
+ // render markup
3262
+ html = $(self.settings.render[templateName].apply(this, [data, escape_html]));
3263
+
3264
+ // add mandatory attributes
3265
+ if (templateName === 'option' || templateName === 'option_create') {
3266
+ if (!data[self.settings.disabledField]) {
3267
+ html.attr('data-selectable', '');
3268
+ }
3269
+ }
3270
+ else if (templateName === 'optgroup') {
3271
+ id = data[self.settings.optgroupValueField] || '';
3272
+ html.attr('data-group', id);
3273
+ if(data[self.settings.disabledField]) {
3274
+ html.attr('data-disabled', '');
3275
+ }
3276
+ }
3277
+ if (templateName === 'option' || templateName === 'item') {
3278
+ html.attr('data-value', value || '');
3279
+ }
3280
+
3281
+ // update cache
3282
+ if (cache) {
3283
+ self.renderCache[templateName][value] = html[0];
3284
+ }
3285
+
3286
+ return html[0];
3287
+ },
3288
+
3289
+ /**
3290
+ * Clears the render cache for a template. If
3291
+ * no template is given, clears all render
3292
+ * caches.
3293
+ *
3294
+ * @param {string} templateName
3295
+ */
3296
+ clearCache: function(templateName) {
3297
+ var self = this;
3298
+ if (typeof templateName === 'undefined') {
3299
+ self.renderCache = {};
3300
+ } else {
3301
+ delete self.renderCache[templateName];
3302
+ }
3303
+ },
3304
+
3305
+ /**
3306
+ * Determines whether or not to display the
3307
+ * create item prompt, given a user input.
3308
+ *
3309
+ * @param {string} input
3310
+ * @return {boolean}
3311
+ */
3312
+ canCreate: function(input) {
3313
+ var self = this;
3314
+ if (!self.settings.create) return false;
3315
+ var filter = self.settings.createFilter;
3316
+ return input.length
3317
+ && (typeof filter !== 'function' || filter.apply(self, [input]))
3318
+ && (typeof filter !== 'string' || new RegExp(filter).test(input))
3319
+ && (!(filter instanceof RegExp) || filter.test(input));
3320
+ }
3321
+
3322
+ });
3323
+
3324
+
3325
+ Selectize.count = 0;
3326
+ Selectize.defaults = {
3327
+ options: [],
3328
+ optgroups: [],
3329
+
3330
+ plugins: [],
3331
+ delimiter: ',',
3332
+ splitOn: null, // regexp or string for splitting up values from a paste command
3333
+ persist: true,
3334
+ diacritics: true,
3335
+ create: false,
3336
+ createOnBlur: false,
3337
+ createFilter: null,
3338
+ highlight: true,
3339
+ openOnFocus: true,
3340
+ maxOptions: 1000,
3341
+ maxItems: null,
3342
+ hideSelected: null,
3343
+ addPrecedence: false,
3344
+ selectOnTab: false,
3345
+ preload: false,
3346
+ allowEmptyOption: false,
3347
+ closeAfterSelect: false,
3348
+
3349
+ scrollDuration: 60,
3350
+ loadThrottle: 300,
3351
+ loadingClass: 'loading',
3352
+
3353
+ dataAttr: 'data-data',
3354
+ optgroupField: 'optgroup',
3355
+ valueField: 'value',
3356
+ labelField: 'text',
3357
+ disabledField: 'disabled',
3358
+ optgroupLabelField: 'label',
3359
+ optgroupValueField: 'value',
3360
+ lockOptgroupOrder: false,
3361
+
3362
+ sortField: '$order',
3363
+ searchField: ['text'],
3364
+ searchConjunction: 'and',
3365
+
3366
+ mode: null,
3367
+ wrapperClass: 'selectize-control',
3368
+ inputClass: 'selectize-input',
3369
+ dropdownClass: 'selectize-dropdown',
3370
+ dropdownContentClass: 'selectize-dropdown-content',
3371
+
3372
+ dropdownParent: null,
3373
+
3374
+ copyClassesToDropdown: true,
3375
+
3376
+ /*
3377
+ load : null, // function(query, callback) { ... }
3378
+ score : null, // function(search) { ... }
3379
+ onInitialize : null, // function() { ... }
3380
+ onChange : null, // function(value) { ... }
3381
+ onItemAdd : null, // function(value, $item) { ... }
3382
+ onItemRemove : null, // function(value) { ... }
3383
+ onClear : null, // function() { ... }
3384
+ onOptionAdd : null, // function(value, data) { ... }
3385
+ onOptionRemove : null, // function(value) { ... }
3386
+ onOptionClear : null, // function() { ... }
3387
+ onOptionGroupAdd : null, // function(id, data) { ... }
3388
+ onOptionGroupRemove : null, // function(id) { ... }
3389
+ onOptionGroupClear : null, // function() { ... }
3390
+ onDropdownOpen : null, // function($dropdown) { ... }
3391
+ onDropdownClose : null, // function($dropdown) { ... }
3392
+ onType : null, // function(str) { ... }
3393
+ onDelete : null, // function(values) { ... }
3394
+ */
3395
+
3396
+ render: {
3397
+ /*
3398
+ item: null,
3399
+ optgroup: null,
3400
+ optgroup_header: null,
3401
+ option: null,
3402
+ option_create: null
3403
+ */
3404
+ }
3405
+ };
3406
+
3407
+
3408
+ $.fn.selectize = function(settings_user) {
3409
+ var defaults = $.fn.selectize.defaults;
3410
+ var settings = $.extend({}, defaults, settings_user);
3411
+ var attr_data = settings.dataAttr;
3412
+ var field_label = settings.labelField;
3413
+ var field_value = settings.valueField;
3414
+ var field_disabled = settings.disabledField;
3415
+ var field_optgroup = settings.optgroupField;
3416
+ var field_optgroup_label = settings.optgroupLabelField;
3417
+ var field_optgroup_value = settings.optgroupValueField;
3418
+
3419
+ /**
3420
+ * Initializes selectize from a <input type="text"> element.
3421
+ *
3422
+ * @param {object} $input
3423
+ * @param {object} settings_element
3424
+ */
3425
+ var init_textbox = function($input, settings_element) {
3426
+ var i, n, values, option;
3427
+
3428
+ var data_raw = $input.attr(attr_data);
3429
+
3430
+ if (!data_raw) {
3431
+ var value = $.trim($input.val() || '');
3432
+ if (!settings.allowEmptyOption && !value.length) return;
3433
+ values = value.split(settings.delimiter);
3434
+ for (i = 0, n = values.length; i < n; i++) {
3435
+ option = {};
3436
+ option[field_label] = values[i];
3437
+ option[field_value] = values[i];
3438
+ settings_element.options.push(option);
3439
+ }
3440
+ settings_element.items = values;
3441
+ } else {
3442
+ settings_element.options = JSON.parse(data_raw);
3443
+ for (i = 0, n = settings_element.options.length; i < n; i++) {
3444
+ settings_element.items.push(settings_element.options[i][field_value]);
3445
+ }
3446
+ }
3447
+ };
3448
+
3449
+ /**
3450
+ * Initializes selectize from a <select> element.
3451
+ *
3452
+ * @param {object} $input
3453
+ * @param {object} settings_element
3454
+ */
3455
+ var init_select = function($input, settings_element) {
3456
+ var i, n, tagName, $children, order = 0;
3457
+ var options = settings_element.options;
3458
+ var optionsMap = {};
3459
+
3460
+ var readData = function($el) {
3461
+ var data = attr_data && $el.attr(attr_data);
3462
+ if (typeof data === 'string' && data.length) {
3463
+ return JSON.parse(data);
3464
+ }
3465
+ return null;
3466
+ };
3467
+
3468
+ var addOption = function($option, group) {
3469
+ $option = $($option);
3470
+
3471
+ var value = hash_key($option.val());
3472
+ if (!value && !settings.allowEmptyOption) return;
3473
+
3474
+ // if the option already exists, it's probably been
3475
+ // duplicated in another optgroup. in this case, push
3476
+ // the current group to the "optgroup" property on the
3477
+ // existing option so that it's rendered in both places.
3478
+ if (optionsMap.hasOwnProperty(value)) {
3479
+ if (group) {
3480
+ var arr = optionsMap[value][field_optgroup];
3481
+ if (!arr) {
3482
+ optionsMap[value][field_optgroup] = group;
3483
+ } else if (!$.isArray(arr)) {
3484
+ optionsMap[value][field_optgroup] = [arr, group];
3485
+ } else {
3486
+ arr.push(group);
3487
+ }
3488
+ }
3489
+ return;
3490
+ }
3491
+
3492
+ var option = readData($option) || {};
3493
+ option[field_label] = option[field_label] || $option.text();
3494
+ option[field_value] = option[field_value] || value;
3495
+ option[field_disabled] = option[field_disabled] || $option.prop('disabled');
3496
+ option[field_optgroup] = option[field_optgroup] || group;
3497
+
3498
+ optionsMap[value] = option;
3499
+ options.push(option);
3500
+
3501
+ if ($option.is(':selected')) {
3502
+ settings_element.items.push(value);
3503
+ }
3504
+ };
3505
+
3506
+ var addGroup = function($optgroup) {
3507
+ var i, n, id, optgroup, $options;
3508
+
3509
+ $optgroup = $($optgroup);
3510
+ id = $optgroup.attr('label');
3511
+
3512
+ if (id) {
3513
+ optgroup = readData($optgroup) || {};
3514
+ optgroup[field_optgroup_label] = id;
3515
+ optgroup[field_optgroup_value] = id;
3516
+ optgroup[field_disabled] = $optgroup.prop('disabled');
3517
+ settings_element.optgroups.push(optgroup);
3518
+ }
3519
+
3520
+ $options = $('option', $optgroup);
3521
+ for (i = 0, n = $options.length; i < n; i++) {
3522
+ addOption($options[i], id);
3523
+ }
3524
+ };
3525
+
3526
+ settings_element.maxItems = $input.attr('multiple') ? null : 1;
3527
+
3528
+ $children = $input.children();
3529
+ for (i = 0, n = $children.length; i < n; i++) {
3530
+ tagName = $children[i].tagName.toLowerCase();
3531
+ if (tagName === 'optgroup') {
3532
+ addGroup($children[i]);
3533
+ } else if (tagName === 'option') {
3534
+ addOption($children[i]);
3535
+ }
3536
+ }
3537
+ };
3538
+
3539
+ return this.each(function() {
3540
+ if (this.selectize) return;
3541
+
3542
+ var instance;
3543
+ var $input = $(this);
3544
+ var tag_name = this.tagName.toLowerCase();
3545
+ var placeholder = $input.attr('placeholder') || $input.attr('data-placeholder');
3546
+ if (!placeholder && !settings.allowEmptyOption) {
3547
+ placeholder = $input.children('option[value=""]').text();
3548
+ }
3549
+
3550
+ var settings_element = {
3551
+ 'placeholder' : placeholder,
3552
+ 'options' : [],
3553
+ 'optgroups' : [],
3554
+ 'items' : []
3555
+ };
3556
+
3557
+ if (tag_name === 'select') {
3558
+ init_select($input, settings_element);
3559
+ } else {
3560
+ init_textbox($input, settings_element);
3561
+ }
3562
+
3563
+ instance = new Selectize($input, $.extend(true, {}, defaults, settings_element, settings_user));
3564
+ });
3565
+ };
3566
+
3567
+ $.fn.selectize.defaults = Selectize.defaults;
3568
+ $.fn.selectize.support = {
3569
+ validity: SUPPORTS_VALIDITY_API
3570
+ };
3571
+
3572
+
3573
+ Selectize.define('drag_drop', function(options) {
3574
+ if (!$.fn.sortable) throw new Error('The "drag_drop" plugin requires jQuery UI "sortable".');
3575
+ if (this.settings.mode !== 'multi') return;
3576
+ var self = this;
3577
+
3578
+ self.lock = (function() {
3579
+ var original = self.lock;
3580
+ return function() {
3581
+ var sortable = self.$control.data('sortable');
3582
+ if (sortable) sortable.disable();
3583
+ return original.apply(self, arguments);
3584
+ };
3585
+ })();
3586
+
3587
+ self.unlock = (function() {
3588
+ var original = self.unlock;
3589
+ return function() {
3590
+ var sortable = self.$control.data('sortable');
3591
+ if (sortable) sortable.enable();
3592
+ return original.apply(self, arguments);
3593
+ };
3594
+ })();
3595
+
3596
+ self.setup = (function() {
3597
+ var original = self.setup;
3598
+ return function() {
3599
+ original.apply(this, arguments);
3600
+
3601
+ var $control = self.$control.sortable({
3602
+ items: '[data-value]',
3603
+ forcePlaceholderSize: true,
3604
+ disabled: self.isLocked,
3605
+ start: function(e, ui) {
3606
+ ui.placeholder.css('width', ui.helper.css('width'));
3607
+ $control.css({overflow: 'visible'});
3608
+ },
3609
+ stop: function() {
3610
+ $control.css({overflow: 'hidden'});
3611
+ var active = self.$activeItems ? self.$activeItems.slice() : null;
3612
+ var values = [];
3613
+ $control.children('[data-value]').each(function() {
3614
+ values.push($(this).attr('data-value'));
3615
+ });
3616
+ self.setValue(values);
3617
+ self.setActiveItem(active);
3618
+ }
3619
+ });
3620
+ };
3621
+ })();
3622
+
3623
+ });
3624
+
3625
+ Selectize.define('dropdown_header', function(options) {
3626
+ var self = this;
3627
+
3628
+ options = $.extend({
3629
+ title : 'Untitled',
3630
+ headerClass : 'selectize-dropdown-header',
3631
+ titleRowClass : 'selectize-dropdown-header-title',
3632
+ labelClass : 'selectize-dropdown-header-label',
3633
+ closeClass : 'selectize-dropdown-header-close',
3634
+
3635
+ html: function(data) {
3636
+ return (
3637
+ '<div class="' + data.headerClass + '">' +
3638
+ '<div class="' + data.titleRowClass + '">' +
3639
+ '<span class="' + data.labelClass + '">' + data.title + '</span>' +
3640
+ '<a href="javascript:void(0)" class="' + data.closeClass + '">&times;</a>' +
3641
+ '</div>' +
3642
+ '</div>'
3643
+ );
3644
+ }
3645
+ }, options);
3646
+
3647
+ self.setup = (function() {
3648
+ var original = self.setup;
3649
+ return function() {
3650
+ original.apply(self, arguments);
3651
+ self.$dropdown_header = $(options.html(options));
3652
+ self.$dropdown.prepend(self.$dropdown_header);
3653
+ };
3654
+ })();
3655
+
3656
+ });
3657
+
3658
+ Selectize.define('optgroup_columns', function(options) {
3659
+ var self = this;
3660
+
3661
+ options = $.extend({
3662
+ equalizeWidth : true,
3663
+ equalizeHeight : true
3664
+ }, options);
3665
+
3666
+ this.getAdjacentOption = function($option, direction) {
3667
+ var $options = $option.closest('[data-group]').find('[data-selectable]');
3668
+ var index = $options.index($option) + direction;
3669
+
3670
+ return index >= 0 && index < $options.length ? $options.eq(index) : $();
3671
+ };
3672
+
3673
+ this.onKeyDown = (function() {
3674
+ var original = self.onKeyDown;
3675
+ return function(e) {
3676
+ var index, $option, $options, $optgroup;
3677
+
3678
+ if (this.isOpen && (e.keyCode === KEY_LEFT || e.keyCode === KEY_RIGHT)) {
3679
+ self.ignoreHover = true;
3680
+ $optgroup = this.$activeOption.closest('[data-group]');
3681
+ index = $optgroup.find('[data-selectable]').index(this.$activeOption);
3682
+
3683
+ if(e.keyCode === KEY_LEFT) {
3684
+ $optgroup = $optgroup.prev('[data-group]');
3685
+ } else {
3686
+ $optgroup = $optgroup.next('[data-group]');
3687
+ }
3688
+
3689
+ $options = $optgroup.find('[data-selectable]');
3690
+ $option = $options.eq(Math.min($options.length - 1, index));
3691
+ if ($option.length) {
3692
+ this.setActiveOption($option);
3693
+ }
3694
+ return;
3695
+ }
3696
+
3697
+ return original.apply(this, arguments);
3698
+ };
3699
+ })();
3700
+
3701
+ var getScrollbarWidth = function() {
3702
+ var div;
3703
+ var width = getScrollbarWidth.width;
3704
+ var doc = document;
3705
+
3706
+ if (typeof width === 'undefined') {
3707
+ div = doc.createElement('div');
3708
+ div.innerHTML = '<div style="width:50px;height:50px;position:absolute;left:-50px;top:-50px;overflow:auto;"><div style="width:1px;height:100px;"></div></div>';
3709
+ div = div.firstChild;
3710
+ doc.body.appendChild(div);
3711
+ width = getScrollbarWidth.width = div.offsetWidth - div.clientWidth;
3712
+ doc.body.removeChild(div);
3713
+ }
3714
+ return width;
3715
+ };
3716
+
3717
+ var equalizeSizes = function() {
3718
+ var i, n, height_max, width, width_last, width_parent, $optgroups;
3719
+
3720
+ $optgroups = $('[data-group]', self.$dropdown_content);
3721
+ n = $optgroups.length;
3722
+ if (!n || !self.$dropdown_content.width()) return;
3723
+
3724
+ if (options.equalizeHeight) {
3725
+ height_max = 0;
3726
+ for (i = 0; i < n; i++) {
3727
+ height_max = Math.max(height_max, $optgroups.eq(i).height());
3728
+ }
3729
+ $optgroups.css({height: height_max});
3730
+ }
3731
+
3732
+ if (options.equalizeWidth) {
3733
+ width_parent = self.$dropdown_content.innerWidth() - getScrollbarWidth();
3734
+ width = Math.round(width_parent / n);
3735
+ $optgroups.css({width: width});
3736
+ if (n > 1) {
3737
+ width_last = width_parent - width * (n - 1);
3738
+ $optgroups.eq(n - 1).css({width: width_last});
3739
+ }
3740
+ }
3741
+ };
3742
+
3743
+ if (options.equalizeHeight || options.equalizeWidth) {
3744
+ hook.after(this, 'positionDropdown', equalizeSizes);
3745
+ hook.after(this, 'refreshOptions', equalizeSizes);
3746
+ }
3747
+
3748
+
3749
+ });
3750
+
3751
+ Selectize.define('remove_button', function(options) {
3752
+ options = $.extend({
3753
+ label : '&times;',
3754
+ title : 'Remove',
3755
+ className : 'remove',
3756
+ append : true
3757
+ }, options);
3758
+
3759
+ var singleClose = function(thisRef, options) {
3760
+
3761
+ options.className = 'remove-single';
3762
+
3763
+ var self = thisRef;
3764
+ var html = '<a href="javascript:void(0)" class="' + options.className + '" tabindex="-1" title="' + escape_html(options.title) + '">' + options.label + '</a>';
3765
+
3766
+ /**
3767
+ * Appends an element as a child (with raw HTML).
3768
+ *
3769
+ * @param {string} html_container
3770
+ * @param {string} html_element
3771
+ * @return {string}
3772
+ */
3773
+ var append = function(html_container, html_element) {
3774
+ return $('<span>').append(html_container)
3775
+ .append(html_element);
3776
+ };
3777
+
3778
+ thisRef.setup = (function() {
3779
+ var original = self.setup;
3780
+ return function() {
3781
+ // override the item rendering method to add the button to each
3782
+ if (options.append) {
3783
+ var id = $(self.$input.context).attr('id');
3784
+ var selectizer = $('#'+id);
3785
+
3786
+ var render_item = self.settings.render.item;
3787
+ self.settings.render.item = function(data) {
3788
+ return append(render_item.apply(thisRef, arguments), html);
3789
+ };
3790
+ }
3791
+
3792
+ original.apply(thisRef, arguments);
3793
+
3794
+ // add event listener
3795
+ thisRef.$control.on('click', '.' + options.className, function(e) {
3796
+ e.preventDefault();
3797
+ if (self.isLocked) return;
3798
+
3799
+ self.clear();
3800
+ });
3801
+
3802
+ };
3803
+ })();
3804
+ };
3805
+
3806
+ var multiClose = function(thisRef, options) {
3807
+
3808
+ var self = thisRef;
3809
+ var html = '<a href="javascript:void(0)" class="' + options.className + '" tabindex="-1" title="' + escape_html(options.title) + '">' + options.label + '</a>';
3810
+
3811
+ /**
3812
+ * Appends an element as a child (with raw HTML).
3813
+ *
3814
+ * @param {string} html_container
3815
+ * @param {string} html_element
3816
+ * @return {string}
3817
+ */
3818
+ var append = function(html_container, html_element) {
3819
+ var pos = html_container.search(/(<\/[^>]+>\s*)$/);
3820
+ return html_container.substring(0, pos) + html_element + html_container.substring(pos);
3821
+ };
3822
+
3823
+ thisRef.setup = (function() {
3824
+ var original = self.setup;
3825
+ return function() {
3826
+ // override the item rendering method to add the button to each
3827
+ if (options.append) {
3828
+ var render_item = self.settings.render.item;
3829
+ self.settings.render.item = function(data) {
3830
+ return append(render_item.apply(thisRef, arguments), html);
3831
+ };
3832
+ }
3833
+
3834
+ original.apply(thisRef, arguments);
3835
+
3836
+ // add event listener
3837
+ thisRef.$control.on('click', '.' + options.className, function(e) {
3838
+ e.preventDefault();
3839
+ if (self.isLocked) return;
3840
+
3841
+ var $item = $(e.currentTarget).parent();
3842
+ self.setActiveItem($item);
3843
+ if (self.deleteSelection()) {
3844
+ self.setCaret(self.items.length);
3845
+ }
3846
+ });
3847
+
3848
+ };
3849
+ })();
3850
+ };
3851
+
3852
+ if (this.settings.mode === 'single') {
3853
+ singleClose(this, options);
3854
+ return;
3855
+ } else {
3856
+ multiClose(this, options);
3857
+ }
3858
+ });
3859
+
3860
+
3861
+ Selectize.define('restore_on_backspace', function(options) {
3862
+ var self = this;
3863
+
3864
+ options.text = options.text || function(option) {
3865
+ return option[this.settings.labelField];
3866
+ };
3867
+
3868
+ this.onKeyDown = (function() {
3869
+ var original = self.onKeyDown;
3870
+ return function(e) {
3871
+ var index, option;
3872
+ if (e.keyCode === KEY_BACKSPACE && this.$control_input.val() === '' && !this.$activeItems.length) {
3873
+ index = this.caretPos - 1;
3874
+ if (index >= 0 && index < this.items.length) {
3875
+ option = this.options[this.items[index]];
3876
+ if (this.deleteSelection(e)) {
3877
+ this.setTextboxValue(options.text.apply(this, [option]));
3878
+ this.refreshOptions(true);
3879
+ }
3880
+ e.preventDefault();
3881
+ return;
3882
+ }
3883
+ }
3884
+ return original.apply(this, arguments);
3885
+ };
3886
+ })();
3887
+ });
3888
+
3889
+
3890
+ return Selectize;
3891
+ }));
js/admin/selectize-v0.12.6/selectize.min.js ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ /*! selectize.js - v0.12.6 | https://github.com/selectize/selectize.js | Apache License (v2) */
2
+
3
+ !function(a,b){"function"==typeof define&&define.amd?define("sifter",b):"object"==typeof exports?module.exports=b():a.Sifter=b()}(this,function(){var a=function(a,b){this.items=a,this.settings=b||{diacritics:!0}};a.prototype.tokenize=function(a){if(!(a=e(String(a||"").toLowerCase()))||!a.length)return[];var b,c,d,g,i=[],j=a.split(/ +/);for(b=0,c=j.length;b<c;b++){if(d=f(j[b]),this.settings.diacritics)for(g in h)h.hasOwnProperty(g)&&(d=d.replace(new RegExp(g,"g"),h[g]));i.push({string:j[b],regex:new RegExp(d,"i")})}return i},a.prototype.iterator=function(a,b){var c;c=g(a)?Array.prototype.forEach||function(a){for(var b=0,c=this.length;b<c;b++)a(this[b],b,this)}:function(a){for(var b in this)this.hasOwnProperty(b)&&a(this[b],b,this)},c.apply(a,[b])},a.prototype.getScoreFunction=function(a,b){var c,e,f,g,h;c=this,a=c.prepareSearch(a,b),f=a.tokens,e=a.options.fields,g=f.length,h=a.options.nesting;var i=function(a,b){var c,d;return a?(a=String(a||""),-1===(d=a.search(b.regex))?0:(c=b.string.length/a.length,0===d&&(c+=.5),c)):0},j=function(){var a=e.length;return a?1===a?function(a,b){return i(d(b,e[0],h),a)}:function(b,c){for(var f=0,g=0;f<a;f++)g+=i(d(c,e[f],h),b);return g/a}:function(){return 0}}();return g?1===g?function(a){return j(f[0],a)}:"and"===a.options.conjunction?function(a){for(var b,c=0,d=0;c<g;c++){if((b=j(f[c],a))<=0)return 0;d+=b}return d/g}:function(a){for(var b=0,c=0;b<g;b++)c+=j(f[b],a);return c/g}:function(){return 0}},a.prototype.getSortFunction=function(a,c){var e,f,g,h,i,j,k,l,m,n,o;if(g=this,a=g.prepareSearch(a,c),o=!a.query&&c.sort_empty||c.sort,m=function(a,b){return"$score"===a?b.score:d(g.items[b.id],a,c.nesting)},i=[],o)for(e=0,f=o.length;e<f;e++)(a.query||"$score"!==o[e].field)&&i.push(o[e]);if(a.query){for(n=!0,e=0,f=i.length;e<f;e++)if("$score"===i[e].field){n=!1;break}n&&i.unshift({field:"$score",direction:"desc"})}else for(e=0,f=i.length;e<f;e++)if("$score"===i[e].field){i.splice(e,1);break}for(l=[],e=0,f=i.length;e<f;e++)l.push("desc"===i[e].direction?-1:1);return j=i.length,j?1===j?(h=i[0].field,k=l[0],function(a,c){return k*b(m(h,a),m(h,c))}):function(a,c){var d,e,f;for(d=0;d<j;d++)if(f=i[d].field,e=l[d]*b(m(f,a),m(f,c)))return e;return 0}:null},a.prototype.prepareSearch=function(a,b){if("object"==typeof a)return a;b=c({},b);var d=b.fields,e=b.sort,f=b.sort_empty;return d&&!g(d)&&(b.fields=[d]),e&&!g(e)&&(b.sort=[e]),f&&!g(f)&&(b.sort_empty=[f]),{options:b,query:String(a||"").toLowerCase(),tokens:this.tokenize(a),total:0,items:[]}},a.prototype.search=function(a,b){var c,d,e,f,g=this;return d=this.prepareSearch(a,b),b=d.options,a=d.query,f=b.score||g.getScoreFunction(d),a.length?g.iterator(g.items,function(a,e){c=f(a),(!1===b.filter||c>0)&&d.items.push({score:c,id:e})}):g.iterator(g.items,function(a,b){d.items.push({score:1,id:b})}),e=g.getSortFunction(d,b),e&&d.items.sort(e),d.total=d.items.length,"number"==typeof b.limit&&(d.items=d.items.slice(0,b.limit)),d};var b=function(a,b){return"number"==typeof a&&"number"==typeof b?a>b?1:a<b?-1:0:(a=i(String(a||"")),b=i(String(b||"")),a>b?1:b>a?-1:0)},c=function(a,b){var c,d,e,f;for(c=1,d=arguments.length;c<d;c++)if(f=arguments[c])for(e in f)f.hasOwnProperty(e)&&(a[e]=f[e]);return a},d=function(a,b,c){if(a&&b){if(!c)return a[b];for(var d=b.split(".");d.length&&(a=a[d.shift()]););return a}},e=function(a){return(a+"").replace(/^\s+|\s+$|/g,"")},f=function(a){return(a+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")},g=Array.isArray||"undefined"!=typeof $&&$.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)},h={a:"[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]",b:"[b␢βΒB฿𐌁ᛒ]",c:"[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄCc]",d:"[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅDdð]",e:"[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇEeɘǝƏƐε]",f:"[fƑƒḞḟ]",g:"[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]",h:"[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]",i:"[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪIi]",j:"[jȷĴĵɈɉʝɟʲ]",k:"[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]",l:"[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟLl]",n:"[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴNnŊŋ]",o:"[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]",p:"[pṔṕṖṗⱣᵽƤƥᵱ]",q:"[qꝖꝗʠɊɋꝘꝙq̃]",r:"[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]",s:"[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]",t:"[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]",u:"[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]",v:"[vṼṽṾṿƲʋꝞꝟⱱʋ]",w:"[wẂẃẀẁŴŵẄẅẆẇẈẉ]",x:"[xẌẍẊẋχ]",y:"[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]",z:"[zŹźẐẑŽžŻżẒẓẔẕƵƶ]"},i=function(){var a,b,c,d,e="",f={};for(c in h)if(h.hasOwnProperty(c))for(d=h[c].substring(2,h[c].length-1),e+=d,a=0,b=d.length;a<b;a++)f[d.charAt(a)]=c;var g=new RegExp("["+e+"]","g");return function(a){return a.replace(g,function(a){return f[a]}).toLowerCase()}}();return a}),function(a,b){"function"==typeof define&&define.amd?define("microplugin",b):"object"==typeof exports?module.exports=b():a.MicroPlugin=b()}(this,function(){var a={};a.mixin=function(a){a.plugins={},a.prototype.initializePlugins=function(a){var c,d,e,f=this,g=[];if(f.plugins={names:[],settings:{},requested:{},loaded:{}},b.isArray(a))for(c=0,d=a.length;c<d;c++)"string"==typeof a[c]?g.push(a[c]):(f.plugins.settings[a[c].name]=a[c].options,g.push(a[c].name));else if(a)for(e in a)a.hasOwnProperty(e)&&(f.plugins.settings[e]=a[e],g.push(e));for(;g.length;)f.require(g.shift())},a.prototype.loadPlugin=function(b){var c=this,d=c.plugins,e=a.plugins[b];if(!a.plugins.hasOwnProperty(b))throw new Error('Unable to find "'+b+'" plugin');d.requested[b]=!0,d.loaded[b]=e.fn.apply(c,[c.plugins.settings[b]||{}]),d.names.push(b)},a.prototype.require=function(a){var b=this,c=b.plugins;if(!b.plugins.loaded.hasOwnProperty(a)){if(c.requested[a])throw new Error('Plugin has circular dependency ("'+a+'")');b.loadPlugin(a)}return c.loaded[a]},a.define=function(b,c){a.plugins[b]={name:b,fn:c}}};var b={isArray:Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)}};return a}),function(a,b){"function"==typeof define&&define.amd?define("selectize",["jquery","sifter","microplugin"],b):"object"==typeof exports?module.exports=b(require("jquery"),require("sifter"),require("microplugin")):a.Selectize=b(a.jQuery,a.Sifter,a.MicroPlugin)}(this,function(a,b,c){"use strict";var d=function(a,b){if("string"!=typeof b||b.length){var c="string"==typeof b?new RegExp(b,"i"):b,d=function(a){var b=0;if(3===a.nodeType){var e=a.data.search(c);if(e>=0&&a.data.length>0){var f=a.data.match(c),g=document.createElement("span");g.className="highlight";var h=a.splitText(e),i=(h.splitText(f[0].length),h.cloneNode(!0));g.appendChild(i),h.parentNode.replaceChild(g,h),b=1}}else if(1===a.nodeType&&a.childNodes&&!/(script|style)/i.test(a.tagName)&&("highlight"!==a.className||"SPAN"!==a.tagName))for(var j=0;j<a.childNodes.length;++j)j+=d(a.childNodes[j]);return b};return a.each(function(){d(this)})}};a.fn.removeHighlight=function(){return this.find("span.highlight").each(function(){this.parentNode.firstChild.nodeName;var a=this.parentNode;a.replaceChild(this.firstChild,this),a.normalize()}).end()};var e=function(){};e.prototype={on:function(a,b){this._events=this._events||{},this._events[a]=this._events[a]||[],this._events[a].push(b)},off:function(a,b){var c=arguments.length;return 0===c?delete this._events:1===c?delete this._events[a]:(this._events=this._events||{},void(a in this._events!=!1&&this._events[a].splice(this._events[a].indexOf(b),1)))},trigger:function(a){if(this._events=this._events||{},a in this._events!=!1)for(var b=0;b<this._events[a].length;b++)this._events[a][b].apply(this,Array.prototype.slice.call(arguments,1))}},e.mixin=function(a){for(var b=["on","off","trigger"],c=0;c<b.length;c++)a.prototype[b[c]]=e.prototype[b[c]]};var f=/Mac/.test(navigator.userAgent),g=f?91:17,h=f?18:17,i=!/android/i.test(window.navigator.userAgent)&&!!document.createElement("input").validity,j=function(a){return void 0!==a},k=function(a){return void 0===a||null===a?null:"boolean"==typeof a?a?"1":"0":a+""},l=function(a){return(a+"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")},m={};m.before=function(a,b,c){var d=a[b];a[b]=function(){return c.apply(a,arguments),d.apply(a,arguments)}},m.after=function(a,b,c){var d=a[b];a[b]=function(){var b=d.apply(a,arguments);return c.apply(a,arguments),b}};var n=function(a){var b=!1;return function(){b||(b=!0,a.apply(this,arguments))}},o=function(a,b){var c;return function(){var d=this,e=arguments;window.clearTimeout(c),c=window.setTimeout(function(){a.apply(d,e)},b)}},p=function(a,b,c){var d,e=a.trigger,f={};a.trigger=function(){var c=arguments[0];if(-1===b.indexOf(c))return e.apply(a,arguments);f[c]=arguments},c.apply(a,[]),a.trigger=e;for(d in f)f.hasOwnProperty(d)&&e.apply(a,f[d])},q=function(a,b,c,d){a.on(b,c,function(b){for(var c=b.target;c&&c.parentNode!==a[0];)c=c.parentNode;return b.currentTarget=c,d.apply(this,[b])})},r=function(a){var b={};if("selectionStart"in a)b.start=a.selectionStart,b.length=a.selectionEnd-b.start;else if(document.selection){a.focus();var c=document.selection.createRange(),d=document.selection.createRange().text.length;c.moveStart("character",-a.value.length),b.start=c.text.length-d,b.length=d}return b},s=function(a,b,c){var d,e,f={};if(c)for(d=0,e=c.length;d<e;d++)f[c[d]]=a.css(c[d]);else f=a.css();b.css(f)},t=function(b,c){return b?(w.$testInput||(w.$testInput=a("<span />").css({position:"absolute",top:-99999,left:-99999,width:"auto",padding:0,whiteSpace:"pre"}).appendTo("body")),w.$testInput.text(b),s(c,w.$testInput,["letterSpacing","fontSize","fontFamily","fontWeight","textTransform"]),w.$testInput.width()):0},u=function(a){var b=null,c=function(c,d){var e,f,g,h,i,j,k,l;c=c||window.event||{},d=d||{},c.metaKey||c.altKey||(d.force||!1!==a.data("grow"))&&(e=a.val(),c.type&&"keydown"===c.type.toLowerCase()&&(f=c.keyCode,g=f>=48&&f<=57||f>=65&&f<=90||f>=96&&f<=111||f>=186&&f<=222||32===f,46===f||8===f?(l=r(a[0]),l.length?e=e.substring(0,l.start)+e.substring(l.start+l.length):8===f&&l.start?e=e.substring(0,l.start-1)+e.substring(l.start+1):46===f&&void 0!==l.start&&(e=e.substring(0,l.start)+e.substring(l.start+1))):g&&(j=c.shiftKey,k=String.fromCharCode(c.keyCode),k=j?k.toUpperCase():k.toLowerCase(),e+=k)),h=a.attr("placeholder"),!e&&h&&(e=h),(i=t(e,a)+4)!==b&&(b=i,a.width(i),a.triggerHandler("resize")))};a.on("keydown keyup update blur",c),c()},v=function(a){var b=document.createElement("div");return b.appendChild(a.cloneNode(!0)),b.innerHTML},w=function(c,d){var e,f,g,h,i=this;h=c[0],h.selectize=i;var j=window.getComputedStyle&&window.getComputedStyle(h,null);if(g=j?j.getPropertyValue("direction"):h.currentStyle&&h.currentStyle.direction,g=g||c.parents("[dir]:first").attr("dir")||"",a.extend(i,{order:0,settings:d,$input:c,tabIndex:c.attr("tabindex")||"",tagType:"select"===h.tagName.toLowerCase()?1:2,rtl:/rtl/i.test(g),eventNS:".selectize"+ ++w.count,highlightedValue:null,isBlurring:!1,isOpen:!1,isDisabled:!1,isRequired:c.is("[required]"),isInvalid:!1,isLocked:!1,isFocused:!1,isInputHidden:!1,isSetup:!1,isShiftDown:!1,isCmdDown:!1,isCtrlDown:!1,ignoreFocus:!1,ignoreBlur:!1,ignoreHover:!1,hasOptions:!1,currentResults:null,lastValue:"",caretPos:0,loading:0,loadedSearches:{},$activeOption:null,$activeItems:[],optgroups:{},options:{},userOptions:{},items:[],renderCache:{},onSearchChange:null===d.loadThrottle?i.onSearchChange:o(i.onSearchChange,d.loadThrottle)}),i.sifter=new b(this.options,{diacritics:d.diacritics}),i.settings.options){for(e=0,f=i.settings.options.length;e<f;e++)i.registerOption(i.settings.options[e]);delete i.settings.options}if(i.settings.optgroups){for(e=0,f=i.settings.optgroups.length;e<f;e++)i.registerOptionGroup(i.settings.optgroups[e]);delete i.settings.optgroups}i.settings.mode=i.settings.mode||(1===i.settings.maxItems?"single":"multi"),"boolean"!=typeof i.settings.hideSelected&&(i.settings.hideSelected="multi"===i.settings.mode),i.initializePlugins(i.settings.plugins),i.setupCallbacks(),i.setupTemplates(),i.setup()};return e.mixin(w),void 0!==c?c.mixin(w):function(a,b){b||(b={});console.error("Selectize: "+a),b.explanation&&(console.group&&console.group(),console.error(b.explanation),console.group&&console.groupEnd())}("Dependency MicroPlugin is missing",{explanation:'Make sure you either: (1) are using the "standalone" version of Selectize, or (2) require MicroPlugin before you load Selectize.'}),a.extend(w.prototype,{setup:function(){var b,c,d,e,j,k,l,m,n,o,p=this,r=p.settings,s=p.eventNS,t=a(window),v=a(document),w=p.$input;if(l=p.settings.mode,m=w.attr("class")||"",b=a("<div>").addClass(r.wrapperClass).addClass(m).addClass(l),c=a("<div>").addClass(r.inputClass).addClass("items").appendTo(b),d=a('<input type="text" autocomplete="off" />').appendTo(c).attr("tabindex",w.is(":disabled")?"-1":p.tabIndex),k=a(r.dropdownParent||b),e=a("<div>").addClass(r.dropdownClass).addClass(l).hide().appendTo(k),j=a("<div>").addClass(r.dropdownContentClass).appendTo(e),(o=w.attr("id"))&&(d.attr("id",o+"-selectized"),a("label[for='"+o+"']").attr("for",o+"-selectized")),p.settings.copyClassesToDropdown&&e.addClass(m),b.css({width:w[0].style.width}),p.plugins.names.length&&(n="plugin-"+p.plugins.names.join(" plugin-"),b.addClass(n),e.addClass(n)),(null===r.maxItems||r.maxItems>1)&&1===p.tagType&&w.attr("multiple","multiple"),p.settings.placeholder&&d.attr("placeholder",r.placeholder),!p.settings.splitOn&&p.settings.delimiter){var x=p.settings.delimiter.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&");p.settings.splitOn=new RegExp("\\s*"+x+"+\\s*")}w.attr("autocorrect")&&d.attr("autocorrect",w.attr("autocorrect")),w.attr("autocapitalize")&&d.attr("autocapitalize",w.attr("autocapitalize")),d[0].type=w[0].type,p.$wrapper=b,p.$control=c,p.$control_input=d,p.$dropdown=e,p.$dropdown_content=j,e.on("mouseenter mousedown click","[data-disabled]>[data-selectable]",function(a){a.stopImmediatePropagation()}),e.on("mouseenter","[data-selectable]",function(){return p.onOptionHover.apply(p,arguments)}),e.on("mousedown click","[data-selectable]",function(){return p.onOptionSelect.apply(p,arguments)}),q(c,"mousedown","*:not(input)",function(){return p.onItemSelect.apply(p,arguments)}),u(d),c.on({mousedown:function(){return p.onMouseDown.apply(p,arguments)},click:function(){return p.onClick.apply(p,arguments)}}),d.on({mousedown:function(a){a.stopPropagation()},keydown:function(){return p.onKeyDown.apply(p,arguments)},keyup:function(){return p.onKeyUp.apply(p,arguments)},keypress:function(){return p.onKeyPress.apply(p,arguments)},resize:function(){p.positionDropdown.apply(p,[])},blur:function(){return p.onBlur.apply(p,arguments)},focus:function(){return p.ignoreBlur=!1,p.onFocus.apply(p,arguments)},paste:function(){return p.onPaste.apply(p,arguments)}}),v.on("keydown"+s,function(a){p.isCmdDown=a[f?"metaKey":"ctrlKey"],p.isCtrlDown=a[f?"altKey":"ctrlKey"],p.isShiftDown=a.shiftKey}),v.on("keyup"+s,function(a){a.keyCode===h&&(p.isCtrlDown=!1),16===a.keyCode&&(p.isShiftDown=!1),a.keyCode===g&&(p.isCmdDown=!1)}),v.on("mousedown"+s,function(a){if(p.isFocused){if(a.target===p.$dropdown[0]||a.target.parentNode===p.$dropdown[0])return!1;p.$control.has(a.target).length||a.target===p.$control[0]||p.blur(a.target)}}),t.on(["scroll"+s,"resize"+s].join(" "),function(){p.isOpen&&p.positionDropdown.apply(p,arguments)}),t.on("mousemove"+s,function(){p.ignoreHover=!1}),this.revertSettings={$children:w.children().detach(),tabindex:w.attr("tabindex")},w.attr("tabindex",-1).hide().after(p.$wrapper),a.isArray(r.items)&&(p.setValue(r.items),delete r.items),i&&w.on("invalid"+s,function(a){a.preventDefault(),p.isInvalid=!0,p.refreshState()}),p.updateOriginalInput(),p.refreshItems(),p.refreshState(),p.updatePlaceholder(),p.isSetup=!0,w.is(":disabled")&&p.disable(),p.on("change",this.onChange),w.data("selectize",p),w.addClass("selectized"),p.trigger("initialize"),!0===r.preload&&p.onSearchChange("")},setupTemplates:function(){var b=this,c=b.settings.labelField,d=b.settings.optgroupLabelField,e={optgroup:function(a){return'<div class="optgroup">'+a.html+"</div>"},optgroup_header:function(a,b){return'<div class="optgroup-header">'+b(a[d])+"</div>"},option:function(a,b){return'<div class="option">'+b(a[c])+"</div>"},item:function(a,b){return'<div class="item">'+b(a[c])+"</div>"},option_create:function(a,b){return'<div class="create">Add <strong>'+b(a.input)+"</strong>&hellip;</div>"}};b.settings.render=a.extend({},e,b.settings.render)},setupCallbacks:function(){var a,b,c={initialize:"onInitialize",change:"onChange",item_add:"onItemAdd",item_remove:"onItemRemove",clear:"onClear",option_add:"onOptionAdd",option_remove:"onOptionRemove",option_clear:"onOptionClear",optgroup_add:"onOptionGroupAdd",optgroup_remove:"onOptionGroupRemove",optgroup_clear:"onOptionGroupClear",dropdown_open:"onDropdownOpen",dropdown_close:"onDropdownClose",type:"onType",load:"onLoad",focus:"onFocus",blur:"onBlur"};for(a in c)c.hasOwnProperty(a)&&(b=this.settings[c[a]])&&this.on(a,b)},onClick:function(a){var b=this;b.isFocused&&b.isOpen||(b.focus(),a.preventDefault())},onMouseDown:function(b){var c=this,d=b.isDefaultPrevented();a(b.target);if(c.isFocused){if(b.target!==c.$control_input[0])return"single"===c.settings.mode?c.isOpen?c.close():c.open():d||c.setActiveItem(null),!1}else d||window.setTimeout(function(){c.focus()},0)},onChange:function(){this.$input.trigger("change")},onPaste:function(b){var c=this;if(c.isFull()||c.isInputHidden||c.isLocked)return void b.preventDefault();c.settings.splitOn&&setTimeout(function(){var b=c.$control_input.val();if(b.match(c.settings.splitOn))for(var d=a.trim(b).split(c.settings.splitOn),e=0,f=d.length;e<f;e++)c.createItem(d[e])},0)},onKeyPress:function(a){if(this.isLocked)return a&&a.preventDefault();var b=String.fromCharCode(a.keyCode||a.which);return this.settings.create&&"multi"===this.settings.mode&&b===this.settings.delimiter?(this.createItem(),a.preventDefault(),!1):void 0},onKeyDown:function(a){var b=(a.target,this.$control_input[0],this);if(b.isLocked)return void(9!==a.keyCode&&a.preventDefault());switch(a.keyCode){case 65:if(b.isCmdDown)return void b.selectAll();break;case 27:return void(b.isOpen&&(a.preventDefault(),a.stopPropagation(),b.close()));case 78:if(!a.ctrlKey||a.altKey)break;case 40:if(!b.isOpen&&b.hasOptions)b.open();else if(b.$activeOption){b.ignoreHover=!0;var c=b.getAdjacentOption(b.$activeOption,1);c.length&&b.setActiveOption(c,!0,!0)}return void a.preventDefault();case 80:if(!a.ctrlKey||a.altKey)break;case 38:if(b.$activeOption){b.ignoreHover=!0;var d=b.getAdjacentOption(b.$activeOption,-1);d.length&&b.setActiveOption(d,!0,!0)}return void a.preventDefault();case 13:return void(b.isOpen&&b.$activeOption&&(b.onOptionSelect({currentTarget:b.$activeOption}),a.preventDefault()));case 37:return void b.advanceSelection(-1,a);case 39:return void b.advanceSelection(1,a);case 9:return b.settings.selectOnTab&&b.isOpen&&b.$activeOption&&(b.onOptionSelect({currentTarget:b.$activeOption}),b.isFull()||a.preventDefault()),void(b.settings.create&&b.createItem()&&a.preventDefault());case 8:case 46:return void b.deleteSelection(a)}return!b.isFull()&&!b.isInputHidden||(f?a.metaKey:a.ctrlKey)?void 0:void a.preventDefault()},onKeyUp:function(a){var b=this;if(b.isLocked)return a&&a.preventDefault();var c=b.$control_input.val()||"";b.lastValue!==c&&(b.lastValue=c,b.onSearchChange(c),b.refreshOptions(),b.trigger("type",c))},onSearchChange:function(a){var b=this,c=b.settings.load;c&&(b.loadedSearches.hasOwnProperty(a)||(b.loadedSearches[a]=!0,b.load(function(d){c.apply(b,[a,d])})))},onFocus:function(a){var b=this,c=b.isFocused;if(b.isDisabled)return b.blur(),a&&a.preventDefault(),!1;b.ignoreFocus||(b.isFocused=!0,"focus"===b.settings.preload&&b.onSearchChange(""),c||b.trigger("focus"),b.$activeItems.length||(b.showInput(),b.setActiveItem(null),b.refreshOptions(!!b.settings.openOnFocus)),b.refreshState())},onBlur:function(a,b){var c=this;if(c.isFocused&&(c.isFocused=!1,!c.ignoreFocus)){if(!c.ignoreBlur&&document.activeElement===c.$dropdown_content[0])return c.ignoreBlur=!0,void c.onFocus(a);var d=function(){c.close(),c.setTextboxValue(""),c.setActiveItem(null),c.setActiveOption(null),c.setCaret(c.items.length),c.refreshState(),b&&b.focus&&b.focus(),c.isBlurring=!1,c.ignoreFocus=!1,c.trigger("blur")};c.isBlurring=!0,c.ignoreFocus=!0,c.settings.create&&c.settings.createOnBlur?c.createItem(null,!1,d):d()}},onOptionHover:function(a){this.ignoreHover||this.setActiveOption(a.currentTarget,!1)},onOptionSelect:function(b){var c,d,e=this;b.preventDefault&&(b.preventDefault(),b.stopPropagation()),d=a(b.currentTarget),d.hasClass("create")?e.createItem(null,function(){e.settings.closeAfterSelect&&e.close()}):void 0!==(c=d.attr("data-value"))&&(e.lastQuery=null,e.setTextboxValue(""),e.addItem(c),e.settings.closeAfterSelect?e.close():!e.settings.hideSelected&&b.type&&/mouse/.test(b.type)&&e.setActiveOption(e.getOption(c)))},onItemSelect:function(a){var b=this;b.isLocked||"multi"===b.settings.mode&&(a.preventDefault(),b.setActiveItem(a.currentTarget,a))},load:function(a){var b=this,c=b.$wrapper.addClass(b.settings.loadingClass);b.loading++,a.apply(b,[function(a){b.loading=Math.max(b.loading-1,0),a&&a.length&&(b.addOption(a),b.refreshOptions(b.isFocused&&!b.isInputHidden)),b.loading||c.removeClass(b.settings.loadingClass),b.trigger("load",a)}])},setTextboxValue:function(a){var b=this.$control_input;b.val()!==a&&(b.val(a).triggerHandler("update"),this.lastValue=a)},getValue:function(){return 1===this.tagType&&this.$input.attr("multiple")?this.items:this.items.join(this.settings.delimiter)},setValue:function(a,b){p(this,b?[]:["change"],function(){this.clear(b),this.addItems(a,b)})},setActiveItem:function(b,c){var d,e,f,g,h,i,j,k,l=this;if("single"!==l.settings.mode){if(b=a(b),!b.length)return a(l.$activeItems).removeClass("active"),l.$activeItems=[],void(l.isFocused&&l.showInput());if("mousedown"===(d=c&&c.type.toLowerCase())&&l.isShiftDown&&l.$activeItems.length){for(k=l.$control.children(".active:last"),g=Array.prototype.indexOf.apply(l.$control[0].childNodes,[k[0]]),h=Array.prototype.indexOf.apply(l.$control[0].childNodes,[b[0]]),g>h&&(j=g,g=h,h=j),e=g;e<=h;e++)i=l.$control[0].childNodes[e],-1===l.$activeItems.indexOf(i)&&(a(i).addClass("active"),l.$activeItems.push(i));c.preventDefault()}else"mousedown"===d&&l.isCtrlDown||"keydown"===d&&this.isShiftDown?b.hasClass("active")?(f=l.$activeItems.indexOf(b[0]),l.$activeItems.splice(f,1),b.removeClass("active")):l.$activeItems.push(b.addClass("active")[0]):(a(l.$activeItems).removeClass("active"),l.$activeItems=[b.addClass("active")[0]]);l.hideInput(),this.isFocused||l.focus()}},setActiveOption:function(b,c,d){var e,f,g,h,i,k=this;k.$activeOption&&k.$activeOption.removeClass("active"),k.$activeOption=null,b=a(b),b.length&&(k.$activeOption=b.addClass("active"),!c&&j(c)||(e=k.$dropdown_content.height(),f=k.$activeOption.outerHeight(!0),c=k.$dropdown_content.scrollTop()||0,g=k.$activeOption.offset().top-k.$dropdown_content.offset().top+c,h=g,i=g-e+f,g+f>e+c?k.$dropdown_content.stop().animate({scrollTop:i},d?k.settings.scrollDuration:0):g<c&&k.$dropdown_content.stop().animate({scrollTop:h},d?k.settings.scrollDuration:0)))},selectAll:function(){var a=this;"single"!==a.settings.mode&&(a.$activeItems=Array.prototype.slice.apply(a.$control.children(":not(input)").addClass("active")),a.$activeItems.length&&(a.hideInput(),a.close()),a.focus())},hideInput:function(){var a=this;a.setTextboxValue(""),a.$control_input.css({opacity:0,position:"absolute",left:a.rtl?1e4:-1e4}),a.isInputHidden=!0},showInput:function(){this.$control_input.css({opacity:1,position:"relative",left:0}),this.isInputHidden=!1},focus:function(){var a=this;a.isDisabled||(a.ignoreFocus=!0,a.$control_input[0].focus(),window.setTimeout(function(){a.ignoreFocus=!1,a.onFocus()},0))},blur:function(a){this.$control_input[0].blur(),this.onBlur(null,a)},getScoreFunction:function(a){return this.sifter.getScoreFunction(a,this.getSearchOptions())},getSearchOptions:function(){var a=this.settings,b=a.sortField;return"string"==typeof b&&(b=[{field:b}]),{fields:a.searchField,conjunction:a.searchConjunction,sort:b,nesting:a.nesting}},search:function(b){var c,d,e,f=this,g=f.settings,h=this.getSearchOptions();if(g.score&&"function"!=typeof(e=f.settings.score.apply(this,[b])))throw new Error('Selectize "score" setting must be a function that returns a function');if(b!==f.lastQuery?(f.lastQuery=b,d=f.sifter.search(b,a.extend(h,{score:e})),f.currentResults=d):d=a.extend(!0,{},f.currentResults),g.hideSelected)for(c=d.items.length-1;c>=0;c--)-1!==f.items.indexOf(k(d.items[c].id))&&d.items.splice(c,1);return d},refreshOptions:function(b){var c,e,f,g,h,i,j,l,m,n,o,p,q,r,s,t;void 0===b&&(b=!0);var u=this,w=a.trim(u.$control_input.val()),x=u.search(w),y=u.$dropdown_content,z=u.$activeOption&&k(u.$activeOption.attr("data-value"));for(g=x.items.length,"number"==typeof u.settings.maxOptions&&(g=Math.min(g,u.settings.maxOptions)),h={},i=[],c=0;c<g;c++)for(j=u.options[x.items[c].id],l=u.render("option",j),m=j[u.settings.optgroupField]||"",n=a.isArray(m)?m:[m],e=0,f=n&&n.length;e<f;e++)m=n[e],u.optgroups.hasOwnProperty(m)||(m=""),h.hasOwnProperty(m)||(h[m]=document.createDocumentFragment(),i.push(m)),h[m].appendChild(l);for(this.settings.lockOptgroupOrder&&i.sort(function(a,b){return(u.optgroups[a].$order||0)-(u.optgroups[b].$order||0)}),o=document.createDocumentFragment(),c=0,g=i.length;c<g;c++)m=i[c],u.optgroups.hasOwnProperty(m)&&h[m].childNodes.length?(p=document.createDocumentFragment(),p.appendChild(u.render("optgroup_header",u.optgroups[m])),p.appendChild(h[m]),o.appendChild(u.render("optgroup",a.extend({},u.optgroups[m],{html:v(p),dom:p})))):o.appendChild(h[m]);if(y.html(o),u.settings.highlight&&(y.removeHighlight(),x.query.length&&x.tokens.length))for(c=0,g=x.tokens.length;c<g;c++)d(y,x.tokens[c].regex);if(!u.settings.hideSelected)for(c=0,g=u.items.length;c<g;c++)u.getOption(u.items[c]).addClass("selected");q=u.canCreate(w),q&&(y.prepend(u.render("option_create",{input:w})),t=a(y[0].childNodes[0])),u.hasOptions=x.items.length>0||q,u.hasOptions?(x.items.length>0?(s=z&&u.getOption(z),s&&s.length?r=s:"single"===u.settings.mode&&u.items.length&&(r=u.getOption(u.items[0])),r&&r.length||(r=t&&!u.settings.addPrecedence?u.getAdjacentOption(t,1):y.find("[data-selectable]:first"))):r=t,u.setActiveOption(r),b&&!u.isOpen&&u.open()):(u.setActiveOption(null),b&&u.isOpen&&u.close())},addOption:function(b){var c,d,e,f=this;if(a.isArray(b))for(c=0,d=b.length;c<d;c++)f.addOption(b[c]);else(e=f.registerOption(b))&&(f.userOptions[e]=!0,f.lastQuery=null,f.trigger("option_add",e,b))},registerOption:function(a){var b=k(a[this.settings.valueField]);return void 0!==b&&null!==b&&!this.options.hasOwnProperty(b)&&(a.$order=a.$order||++this.order,this.options[b]=a,b)},registerOptionGroup:function(a){var b=k(a[this.settings.optgroupValueField]);return!!b&&(a.$order=a.$order||++this.order,this.optgroups[b]=a,b)},addOptionGroup:function(a,b){b[this.settings.optgroupValueField]=a,(a=this.registerOptionGroup(b))&&this.trigger("optgroup_add",a,b)},removeOptionGroup:function(a){this.optgroups.hasOwnProperty(a)&&(delete this.optgroups[a],this.renderCache={},this.trigger("optgroup_remove",a))},clearOptionGroups:function(){this.optgroups={},this.renderCache={},this.trigger("optgroup_clear")},updateOption:function(b,c){var d,e,f,g,h,i,j,l=this;if(b=k(b),f=k(c[l.settings.valueField]),null!==b&&l.options.hasOwnProperty(b)){if("string"!=typeof f)throw new Error("Value must be set in option data");j=l.options[b].$order,f!==b&&(delete l.options[b],-1!==(g=l.items.indexOf(b))&&l.items.splice(g,1,f)),c.$order=c.$order||j,l.options[f]=c,h=l.renderCache.item,i=l.renderCache.option,h&&(delete h[b],delete h[f]),i&&(delete i[b],delete i[f]),-1!==l.items.indexOf(f)&&(d=l.getItem(b),e=a(l.render("item",c)),d.hasClass("active")&&e.addClass("active"),d.replaceWith(e)),l.lastQuery=null,l.isOpen&&l.refreshOptions(!1)}},removeOption:function(a,b){var c=this;a=k(a);var d=c.renderCache.item,e=c.renderCache.option;d&&delete d[a],e&&delete e[a],delete c.userOptions[a],delete c.options[a],c.lastQuery=null,c.trigger("option_remove",a),c.removeItem(a,b)},clearOptions:function(){var b=this;b.loadedSearches={},b.userOptions={},b.renderCache={};var c=b.options;a.each(b.options,function(a,d){-1==b.items.indexOf(a)&&delete c[a]}),b.options=b.sifter.items=c,b.lastQuery=null,b.trigger("option_clear")},getOption:function(a){return this.getElementWithValue(a,this.$dropdown_content.find("[data-selectable]"))},getAdjacentOption:function(b,c){var d=this.$dropdown.find("[data-selectable]"),e=d.index(b)+c;return e>=0&&e<d.length?d.eq(e):a()},getElementWithValue:function(b,c){if(void 0!==(b=k(b))&&null!==b)for(var d=0,e=c.length;d<e;d++)if(c[d].getAttribute("data-value")===b)return a(c[d]);return a()},getItem:function(a){return this.getElementWithValue(a,this.$control.children())},addItems:function(b,c){this.buffer=document.createDocumentFragment();for(var d=this.$control[0].childNodes,e=0;e<d.length;e++)this.buffer.appendChild(d[e]);for(var f=a.isArray(b)?b:[b],e=0,g=f.length;e<g;e++)this.isPending=e<g-1,this.addItem(f[e],c);var h=this.$control[0];h.insertBefore(this.buffer,h.firstChild),this.buffer=null},addItem:function(b,c){p(this,c?[]:["change"],function(){var d,e,f,g,h,i=this,j=i.settings.mode;if(b=k(b),-1!==i.items.indexOf(b))return void("single"===j&&i.close());i.options.hasOwnProperty(b)&&("single"===j&&i.clear(c),"multi"===j&&i.isFull()||(d=a(i.render("item",i.options[b])),h=i.isFull(),i.items.splice(i.caretPos,0,b),i.insertAtCaret(d),(!i.isPending||!h&&i.isFull())&&i.refreshState(),i.isSetup&&(f=i.$dropdown_content.find("[data-selectable]"),i.isPending||(e=i.getOption(b),g=i.getAdjacentOption(e,1).attr("data-value"),i.refreshOptions(i.isFocused&&"single"!==j),g&&i.setActiveOption(i.getOption(g))),!f.length||i.isFull()?i.close():i.isPending||i.positionDropdown(),i.updatePlaceholder(),i.trigger("item_add",b,d),i.isPending||i.updateOriginalInput({silent:c}))))})},removeItem:function(b,c){var d,e,f,g=this;d=b instanceof a?b:g.getItem(b),b=k(d.attr("data-value")),-1!==(e=g.items.indexOf(b))&&(d.remove(),d.hasClass("active")&&(f=g.$activeItems.indexOf(d[0]),g.$activeItems.splice(f,1)),g.items.splice(e,1),g.lastQuery=null,!g.settings.persist&&g.userOptions.hasOwnProperty(b)&&g.removeOption(b,c),e<g.caretPos&&g.setCaret(g.caretPos-1),g.refreshState(),g.updatePlaceholder(),g.updateOriginalInput({silent:c}),g.positionDropdown(),g.trigger("item_remove",b,d))},createItem:function(b,c){var d=this,e=d.caretPos;b=b||a.trim(d.$control_input.val()||"");var f=arguments[arguments.length-1];if("function"!=typeof f&&(f=function(){}),"boolean"!=typeof c&&(c=!0),!d.canCreate(b))return f(),!1;d.lock();var g="function"==typeof d.settings.create?this.settings.create:function(a){var b={};return b[d.settings.labelField]=a,b[d.settings.valueField]=a,b},h=n(function(a){if(d.unlock(),!a||"object"!=typeof a)return f();var b=k(a[d.settings.valueField]);if("string"!=typeof b)return f();d.setTextboxValue(""),d.addOption(a),d.setCaret(e),d.addItem(b),d.refreshOptions(c&&"single"!==d.settings.mode),f(a)}),i=g.apply(this,[b,h]);return void 0!==i&&h(i),!0},refreshItems:function(){this.lastQuery=null,this.isSetup&&this.addItem(this.items),this.refreshState(),this.updateOriginalInput()},refreshState:function(){this.refreshValidityState(),this.refreshClasses()},refreshValidityState:function(){if(!this.isRequired)return!1;var a=!this.items.length;this.isInvalid=a,this.$control_input.prop("required",a),this.$input.prop("required",!a)},refreshClasses:function(){var b=this,c=b.isFull(),d=b.isLocked;b.$wrapper.toggleClass("rtl",b.rtl),b.$control.toggleClass("focus",b.isFocused).toggleClass("disabled",b.isDisabled).toggleClass("required",b.isRequired).toggleClass("invalid",b.isInvalid).toggleClass("locked",d).toggleClass("full",c).toggleClass("not-full",!c).toggleClass("input-active",b.isFocused&&!b.isInputHidden).toggleClass("dropdown-active",b.isOpen).toggleClass("has-options",!a.isEmptyObject(b.options)).toggleClass("has-items",b.items.length>0),b.$control_input.data("grow",!c&&!d)},isFull:function(){
4
+ return null!==this.settings.maxItems&&this.items.length>=this.settings.maxItems},updateOriginalInput:function(a){var b,c,d,e,f=this;if(a=a||{},1===f.tagType){for(d=[],b=0,c=f.items.length;b<c;b++)e=f.options[f.items[b]][f.settings.labelField]||"",d.push('<option value="'+l(f.items[b])+'" selected="selected">'+l(e)+"</option>");d.length||this.$input.attr("multiple")||d.push('<option value="" selected="selected"></option>'),f.$input.html(d.join(""))}else f.$input.val(f.getValue()),f.$input.attr("value",f.$input.val());f.isSetup&&(a.silent||f.trigger("change",f.$input.val()))},updatePlaceholder:function(){if(this.settings.placeholder){var a=this.$control_input;this.items.length?a.removeAttr("placeholder"):a.attr("placeholder",this.settings.placeholder),a.triggerHandler("update",{force:!0})}},open:function(){var a=this;a.isLocked||a.isOpen||"multi"===a.settings.mode&&a.isFull()||(a.focus(),a.isOpen=!0,a.refreshState(),a.$dropdown.css({visibility:"hidden",display:"block"}),a.positionDropdown(),a.$dropdown.css({visibility:"visible"}),a.trigger("dropdown_open",a.$dropdown))},close:function(){var a=this,b=a.isOpen;"single"===a.settings.mode&&a.items.length&&(a.hideInput(),a.isBlurring||a.$control_input.blur()),a.isOpen=!1,a.$dropdown.hide(),a.setActiveOption(null),a.refreshState(),b&&a.trigger("dropdown_close",a.$dropdown)},positionDropdown:function(){var a=this.$control,b="body"===this.settings.dropdownParent?a.offset():a.position();b.top+=a.outerHeight(!0),this.$dropdown.css({width:a[0].getBoundingClientRect().width,top:b.top,left:b.left})},clear:function(a){var b=this;b.items.length&&(b.$control.children(":not(input)").remove(),b.items=[],b.lastQuery=null,b.setCaret(0),b.setActiveItem(null),b.updatePlaceholder(),b.updateOriginalInput({silent:a}),b.refreshState(),b.showInput(),b.trigger("clear"))},insertAtCaret:function(a){var b=Math.min(this.caretPos,this.items.length),c=a[0],d=this.buffer||this.$control[0];0===b?d.insertBefore(c,d.firstChild):d.insertBefore(c,d.childNodes[b]),this.setCaret(b+1)},deleteSelection:function(b){var c,d,e,f,g,h,i,j,k,l=this;if(e=b&&8===b.keyCode?-1:1,f=r(l.$control_input[0]),l.$activeOption&&!l.settings.hideSelected&&(i=l.getAdjacentOption(l.$activeOption,-1).attr("data-value")),g=[],l.$activeItems.length){for(k=l.$control.children(".active:"+(e>0?"last":"first")),h=l.$control.children(":not(input)").index(k),e>0&&h++,c=0,d=l.$activeItems.length;c<d;c++)g.push(a(l.$activeItems[c]).attr("data-value"));b&&(b.preventDefault(),b.stopPropagation())}else(l.isFocused||"single"===l.settings.mode)&&l.items.length&&(e<0&&0===f.start&&0===f.length?g.push(l.items[l.caretPos-1]):e>0&&f.start===l.$control_input.val().length&&g.push(l.items[l.caretPos]));if(!g.length||"function"==typeof l.settings.onDelete&&!1===l.settings.onDelete.apply(l,[g]))return!1;for(void 0!==h&&l.setCaret(h);g.length;)l.removeItem(g.pop());return l.showInput(),l.positionDropdown(),l.refreshOptions(!0),i&&(j=l.getOption(i),j.length&&l.setActiveOption(j)),!0},advanceSelection:function(a,b){var c,d,e,f,g,h=this;0!==a&&(h.rtl&&(a*=-1),c=a>0?"last":"first",d=r(h.$control_input[0]),h.isFocused&&!h.isInputHidden?(f=h.$control_input.val().length,(a<0?0===d.start&&0===d.length:d.start===f)&&!f&&h.advanceCaret(a,b)):(g=h.$control.children(".active:"+c),g.length&&(e=h.$control.children(":not(input)").index(g),h.setActiveItem(null),h.setCaret(a>0?e+1:e))))},advanceCaret:function(a,b){var c,d,e=this;0!==a&&(c=a>0?"next":"prev",e.isShiftDown?(d=e.$control_input[c](),d.length&&(e.hideInput(),e.setActiveItem(d),b&&b.preventDefault())):e.setCaret(e.caretPos+a))},setCaret:function(b){var c=this;if(b="single"===c.settings.mode?c.items.length:Math.max(0,Math.min(c.items.length,b)),!c.isPending){var d,e,f,g;for(f=c.$control.children(":not(input)"),d=0,e=f.length;d<e;d++)g=a(f[d]).detach(),d<b?c.$control_input.before(g):c.$control.append(g)}c.caretPos=b},lock:function(){this.close(),this.isLocked=!0,this.refreshState()},unlock:function(){this.isLocked=!1,this.refreshState()},disable:function(){var a=this;a.$input.prop("disabled",!0),a.$control_input.prop("disabled",!0).prop("tabindex",-1),a.isDisabled=!0,a.lock()},enable:function(){var a=this;a.$input.prop("disabled",!1),a.$control_input.prop("disabled",!1).prop("tabindex",a.tabIndex),a.isDisabled=!1,a.unlock()},destroy:function(){var b=this,c=b.eventNS,d=b.revertSettings;b.trigger("destroy"),b.off(),b.$wrapper.remove(),b.$dropdown.remove(),b.$input.html("").append(d.$children).removeAttr("tabindex").removeClass("selectized").attr({tabindex:d.tabindex}).show(),b.$control_input.removeData("grow"),b.$input.removeData("selectize"),0==--w.count&&w.$testInput&&(w.$testInput.remove(),w.$testInput=void 0),a(window).off(c),a(document).off(c),a(document.body).off(c),delete b.$input[0].selectize},render:function(b,c){var d,e,f="",g=!1,h=this;return"option"!==b&&"item"!==b||(d=k(c[h.settings.valueField]),g=!!d),g&&(j(h.renderCache[b])||(h.renderCache[b]={}),h.renderCache[b].hasOwnProperty(d))?h.renderCache[b][d]:(f=a(h.settings.render[b].apply(this,[c,l])),"option"===b||"option_create"===b?c[h.settings.disabledField]||f.attr("data-selectable",""):"optgroup"===b&&(e=c[h.settings.optgroupValueField]||"",f.attr("data-group",e),c[h.settings.disabledField]&&f.attr("data-disabled","")),"option"!==b&&"item"!==b||f.attr("data-value",d||""),g&&(h.renderCache[b][d]=f[0]),f[0])},clearCache:function(a){var b=this;void 0===a?b.renderCache={}:delete b.renderCache[a]},canCreate:function(a){var b=this;if(!b.settings.create)return!1;var c=b.settings.createFilter;return a.length&&("function"!=typeof c||c.apply(b,[a]))&&("string"!=typeof c||new RegExp(c).test(a))&&(!(c instanceof RegExp)||c.test(a))}}),w.count=0,w.defaults={options:[],optgroups:[],plugins:[],delimiter:",",splitOn:null,persist:!0,diacritics:!0,create:!1,createOnBlur:!1,createFilter:null,highlight:!0,openOnFocus:!0,maxOptions:1e3,maxItems:null,hideSelected:null,addPrecedence:!1,selectOnTab:!1,preload:!1,allowEmptyOption:!1,closeAfterSelect:!1,scrollDuration:60,loadThrottle:300,loadingClass:"loading",dataAttr:"data-data",optgroupField:"optgroup",valueField:"value",labelField:"text",disabledField:"disabled",optgroupLabelField:"label",optgroupValueField:"value",lockOptgroupOrder:!1,sortField:"$order",searchField:["text"],searchConjunction:"and",mode:null,wrapperClass:"selectize-control",inputClass:"selectize-input",dropdownClass:"selectize-dropdown",dropdownContentClass:"selectize-dropdown-content",dropdownParent:null,copyClassesToDropdown:!0,render:{}},a.fn.selectize=function(b){var c=a.fn.selectize.defaults,d=a.extend({},c,b),e=d.dataAttr,f=d.labelField,g=d.valueField,h=d.disabledField,i=d.optgroupField,j=d.optgroupLabelField,l=d.optgroupValueField,m=function(b,c){var h,i,j,k,l=b.attr(e);if(l)for(c.options=JSON.parse(l),h=0,i=c.options.length;h<i;h++)c.items.push(c.options[h][g]);else{var m=a.trim(b.val()||"");if(!d.allowEmptyOption&&!m.length)return;for(j=m.split(d.delimiter),h=0,i=j.length;h<i;h++)k={},k[f]=j[h],k[g]=j[h],c.options.push(k);c.items=j}},n=function(b,c){var m,n,o,p,q=c.options,r={},s=function(a){var b=e&&a.attr(e);return"string"==typeof b&&b.length?JSON.parse(b):null},t=function(b,e){b=a(b);var j=k(b.val());if(j||d.allowEmptyOption)if(r.hasOwnProperty(j)){if(e){var l=r[j][i];l?a.isArray(l)?l.push(e):r[j][i]=[l,e]:r[j][i]=e}}else{var m=s(b)||{};m[f]=m[f]||b.text(),m[g]=m[g]||j,m[h]=m[h]||b.prop("disabled"),m[i]=m[i]||e,r[j]=m,q.push(m),b.is(":selected")&&c.items.push(j)}};for(c.maxItems=b.attr("multiple")?null:1,p=b.children(),m=0,n=p.length;m<n;m++)o=p[m].tagName.toLowerCase(),"optgroup"===o?function(b){var d,e,f,g,i;for(b=a(b),f=b.attr("label"),f&&(g=s(b)||{},g[j]=f,g[l]=f,g[h]=b.prop("disabled"),c.optgroups.push(g)),i=a("option",b),d=0,e=i.length;d<e;d++)t(i[d],f)}(p[m]):"option"===o&&t(p[m])};return this.each(function(){if(!this.selectize){var e=a(this),f=this.tagName.toLowerCase(),g=e.attr("placeholder")||e.attr("data-placeholder");g||d.allowEmptyOption||(g=e.children('option[value=""]').text());var h={placeholder:g,options:[],optgroups:[],items:[]};"select"===f?n(e,h):m(e,h),new w(e,a.extend(!0,{},c,h,b))}})},a.fn.selectize.defaults=w.defaults,a.fn.selectize.support={validity:i},w.define("drag_drop",function(b){if(!a.fn.sortable)throw new Error('The "drag_drop" plugin requires jQuery UI "sortable".');if("multi"===this.settings.mode){var c=this;c.lock=function(){var a=c.lock;return function(){var b=c.$control.data("sortable");return b&&b.disable(),a.apply(c,arguments)}}(),c.unlock=function(){var a=c.unlock;return function(){var b=c.$control.data("sortable");return b&&b.enable(),a.apply(c,arguments)}}(),c.setup=function(){var b=c.setup;return function(){b.apply(this,arguments);var d=c.$control.sortable({items:"[data-value]",forcePlaceholderSize:!0,disabled:c.isLocked,start:function(a,b){b.placeholder.css("width",b.helper.css("width")),d.css({overflow:"visible"})},stop:function(){d.css({overflow:"hidden"});var b=c.$activeItems?c.$activeItems.slice():null,e=[];d.children("[data-value]").each(function(){e.push(a(this).attr("data-value"))}),c.setValue(e),c.setActiveItem(b)}})}}()}}),w.define("dropdown_header",function(b){var c=this;b=a.extend({title:"Untitled",headerClass:"selectize-dropdown-header",titleRowClass:"selectize-dropdown-header-title",labelClass:"selectize-dropdown-header-label",closeClass:"selectize-dropdown-header-close",html:function(a){return'<div class="'+a.headerClass+'"><div class="'+a.titleRowClass+'"><span class="'+a.labelClass+'">'+a.title+'</span><a href="javascript:void(0)" class="'+a.closeClass+'">&times;</a></div></div>'}},b),c.setup=function(){var d=c.setup;return function(){d.apply(c,arguments),c.$dropdown_header=a(b.html(b)),c.$dropdown.prepend(c.$dropdown_header)}}()}),w.define("optgroup_columns",function(b){var c=this;b=a.extend({equalizeWidth:!0,equalizeHeight:!0},b),this.getAdjacentOption=function(b,c){var d=b.closest("[data-group]").find("[data-selectable]"),e=d.index(b)+c;return e>=0&&e<d.length?d.eq(e):a()},this.onKeyDown=function(){var a=c.onKeyDown;return function(b){var d,e,f,g;return!this.isOpen||37!==b.keyCode&&39!==b.keyCode?a.apply(this,arguments):(c.ignoreHover=!0,g=this.$activeOption.closest("[data-group]"),d=g.find("[data-selectable]").index(this.$activeOption),g=37===b.keyCode?g.prev("[data-group]"):g.next("[data-group]"),f=g.find("[data-selectable]"),e=f.eq(Math.min(f.length-1,d)),void(e.length&&this.setActiveOption(e)))}}();var d=function(){var a,b=d.width,c=document;return void 0===b&&(a=c.createElement("div"),a.innerHTML='<div style="width:50px;height:50px;position:absolute;left:-50px;top:-50px;overflow:auto;"><div style="width:1px;height:100px;"></div></div>',a=a.firstChild,c.body.appendChild(a),b=d.width=a.offsetWidth-a.clientWidth,c.body.removeChild(a)),b},e=function(){var e,f,g,h,i,j,k;if(k=a("[data-group]",c.$dropdown_content),(f=k.length)&&c.$dropdown_content.width()){if(b.equalizeHeight){for(g=0,e=0;e<f;e++)g=Math.max(g,k.eq(e).height());k.css({height:g})}b.equalizeWidth&&(j=c.$dropdown_content.innerWidth()-d(),h=Math.round(j/f),k.css({width:h}),f>1&&(i=j-h*(f-1),k.eq(f-1).css({width:i})))}};(b.equalizeHeight||b.equalizeWidth)&&(m.after(this,"positionDropdown",e),m.after(this,"refreshOptions",e))}),w.define("remove_button",function(b){b=a.extend({label:"&times;",title:"Remove",className:"remove",append:!0},b);if("single"===this.settings.mode)return void function(b,c){c.className="remove-single";var d=b,e='<a href="javascript:void(0)" class="'+c.className+'" tabindex="-1" title="'+l(c.title)+'">'+c.label+"</a>",f=function(b,c){return a("<span>").append(b).append(c)};b.setup=function(){var g=d.setup;return function(){if(c.append){var h=a(d.$input.context).attr("id"),i=(a("#"+h),d.settings.render.item);d.settings.render.item=function(a){return f(i.apply(b,arguments),e)}}g.apply(b,arguments),b.$control.on("click","."+c.className,function(a){a.preventDefault(),d.isLocked||d.clear()})}}()}(this,b);!function(b,c){var d=b,e='<a href="javascript:void(0)" class="'+c.className+'" tabindex="-1" title="'+l(c.title)+'">'+c.label+"</a>",f=function(a,b){var c=a.search(/(<\/[^>]+>\s*)$/);return a.substring(0,c)+b+a.substring(c)};b.setup=function(){var g=d.setup;return function(){if(c.append){var h=d.settings.render.item;d.settings.render.item=function(a){return f(h.apply(b,arguments),e)}}g.apply(b,arguments),b.$control.on("click","."+c.className,function(b){if(b.preventDefault(),!d.isLocked){var c=a(b.currentTarget).parent();d.setActiveItem(c),d.deleteSelection()&&d.setCaret(d.items.length)}})}}()}(this,b)}),w.define("restore_on_backspace",function(a){var b=this;a.text=a.text||function(a){return a[this.settings.labelField]},this.onKeyDown=function(){var c=b.onKeyDown;return function(b){var d,e;return 8===b.keyCode&&""===this.$control_input.val()&&!this.$activeItems.length&&(d=this.caretPos-1)>=0&&d<this.items.length?(e=this.options[this.items[d]],this.deleteSelection(b)&&(this.setTextbo