WordPress Page Builder – Beaver Builder - Version 2.2.1.4

Version Description

Download this release

Release Info

Developer pross
Plugin Icon 128x128 WordPress Page Builder – Beaver Builder
Version 2.2.1.4
Comparing to
See all releases

Code changes from version 2.2.0.6 to 2.2.1.4

Files changed (77) hide show
  1. changelog.txt +82 -0
  2. classes/class-fl-builder-admin-posts.php +63 -15
  3. classes/class-fl-builder-admin-settings.php +65 -44
  4. classes/class-fl-builder-admin.php +20 -14
  5. classes/class-fl-builder-ajax-layout.php +111 -74
  6. classes/class-fl-builder-art.php +179 -175
  7. classes/class-fl-builder-auto-suggest.php +33 -34
  8. classes/class-fl-builder-color.php +24 -24
  9. classes/class-fl-builder-css.php +81 -76
  10. classes/class-fl-builder-debug.php +8 -2
  11. classes/class-fl-builder-export.php +5 -5
  12. classes/class-fl-builder-filesystem.php +3 -3
  13. classes/class-fl-builder-fonts.php +27 -2
  14. classes/class-fl-builder-icons.php +49 -42
  15. classes/class-fl-builder-import.php +1 -1
  16. classes/class-fl-builder-importer.php +8 -8
  17. classes/class-fl-builder-loader.php +5 -5
  18. classes/class-fl-builder-loop.php +94 -78
  19. classes/class-fl-builder-model.php +614 -564
  20. classes/class-fl-builder-module.php +21 -21
  21. classes/class-fl-builder-notifications.php +32 -18
  22. classes/class-fl-builder-privacy.php +9 -9
  23. classes/class-fl-builder-revisions.php +11 -11
  24. classes/class-fl-builder-service-activecampaign.php +62 -63
  25. classes/class-fl-builder-service-aweber.php +40 -41
  26. classes/class-fl-builder-service-campaign-monitor.php +32 -32
  27. classes/class-fl-builder-service-campayn.php +51 -52
  28. classes/class-fl-builder-service-constant-contact.php +48 -49
  29. classes/class-fl-builder-service-convertkit.php +24 -24
  30. classes/class-fl-builder-service-drip.php +47 -48
  31. classes/class-fl-builder-service-email-address.php +10 -10
  32. classes/class-fl-builder-service-enormail.php +22 -22
  33. classes/class-fl-builder-service-getresponse.php +36 -36
  34. classes/class-fl-builder-service-godaddy-email-marketing.php +35 -36
  35. classes/class-fl-builder-service-hatchbuck.php +36 -37
  36. classes/class-fl-builder-service-icontact-pro.php +77 -81
  37. classes/class-fl-builder-service-icontact.php +54 -56
  38. classes/class-fl-builder-service-infusionsoft.php +45 -46
  39. classes/class-fl-builder-service-madmimi.php +34 -35
  40. classes/class-fl-builder-service-mailchimp.php +37 -36
  41. classes/class-fl-builder-service-mailerlite.php +24 -24
  42. classes/class-fl-builder-service-mailpoet.php +21 -21
  43. classes/class-fl-builder-service-mailrelay.php +44 -45
  44. classes/class-fl-builder-service-mautic.php +56 -57
  45. classes/class-fl-builder-service-ontraport.php +35 -37
  46. classes/class-fl-builder-service-sendinblue.php +21 -21
  47. classes/class-fl-builder-service-sendy.php +33 -33
  48. classes/class-fl-builder-services.php +138 -138
  49. classes/class-fl-builder-settings-compat-helper.php +6 -6
  50. classes/class-fl-builder-settings-compat.php +1 -1
  51. classes/class-fl-builder-settings-presets.php +20 -10
  52. classes/class-fl-builder-shortcodes.php +5 -5
  53. classes/class-fl-builder-ui-content-panel.php +71 -71
  54. classes/class-fl-builder-ui-settings-forms.php +86 -83
  55. classes/class-fl-builder-update.php +14 -12
  56. classes/class-fl-builder-usage.php +138 -136
  57. classes/class-fl-builder-user-access.php +4 -4
  58. classes/class-fl-builder-user-settings.php +4 -4
  59. classes/class-fl-builder-utils.php +16 -16
  60. classes/class-fl-builder-wp-blocks-layout.php +19 -19
  61. classes/class-fl-builder-wp-blocks.php +16 -16
  62. classes/class-fl-builder-wpcli-command.php +8 -4
  63. classes/class-fl-builder-wpml.php +12 -8
  64. classes/class-fl-builder.php +483 -369
  65. css/fl-builder-layout-auto-spacing.css +0 -2
  66. css/fl-builder-layout.css +1 -1
  67. css/fl-builder-rtl.css +8 -0
  68. css/fl-builder.css +7 -4
  69. css/fl-builder.min.css +1 -1
  70. extensions/fl-builder-cache-helper/classes/class-fl-builder-cache-helper.php +10 -10
  71. extensions/fl-builder-cache-helper/plugins/defines.php +1 -1
  72. extensions/fl-builder-cache-helper/plugins/hummingbird.php +2 -2
  73. extensions/fl-builder-multisite/classes/class-fl-builder-multisite.php +9 -9
  74. fl-builder.php +1 -1
  75. fonts/fontawesome/css/all.min.css +1 -5
  76. fonts/fontawesome/webfonts/fa-brands-400.eot +0 -0
  77. fonts/fontawesome/webfonts/fa-brands-400.svg +8 -259
changelog.txt CHANGED
@@ -1,3 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <h4>2.2.0.6 - 01/24/2019</h4>
2
  <p><strong>Hot Fix</strong></p>
3
  <ul>
1
+ <h4>2.2.1.4 - 03/05/2019</h4>
2
+ <p><strong>Hot Fix</strong></p>
3
+ <ul>
4
+ <li>Fixed PHP notice in WPML global node filter.</li>
5
+ <li>Fixed fatal JS error with SumoMe plugin.</li>
6
+ <li>Fixed PHP notice if a deleted font is registered.</li>
7
+ <li>Run fl_builder_cache_cleared after plugin update.</li>
8
+ </ul>
9
+
10
+ <h4>2.2.1.3 - 02/27/2019</h4>
11
+ <p><strong>Hot Fix</strong></p>
12
+ <ul>
13
+ <li>Updated translations, introduced de_formal and finally fixed de_de.</li>
14
+ <li>Fixed the form filter for settings presets throwing an error when sections or fields aren't defined.</li>
15
+ <li>Fixed a recursion bug when rendering WPML translated global columns.</li>
16
+ <li>Fixed more issues with SiteGround plugin.</li>
17
+ </ul>
18
+
19
+ <h4>2.2.1.2 - 02/20/2019</h4>
20
+ <p><strong>Hot Fix</strong></p>
21
+ <ul>
22
+ <li>Fixed Prebuilt Rows on multisite.</li>
23
+ <li>Fixed Text Editor links and relative urls on images.</li>
24
+ <li>Fixed Content Slider button colors.</li>
25
+ </ul>
26
+
27
+ <h4>2.2.1.1 - 02/14/2019</h4>
28
+ <p><strong>Hot Fix</strong></p>
29
+ <ul>
30
+ <li>Fixed JS issue on module setting.</li>
31
+ <li>Fixed background overlay z-index issues.</li>
32
+ </ul>
33
+
34
+ <h4>2.2.1 - 02/13/2019</h4>
35
+ <p><strong>Enhancements</strong></p>
36
+ <ul>
37
+ <li>Allow admin post type list to be sorted by builder enabled.</li>
38
+ <li>Add support for vw units for font-size in the Typography settings for modules.</li>
39
+ <li>Show recently used fonts in font selector.</li>
40
+ <li>Filter <code>fl_get_fa5_url</code> added to change the actual URL enqueued for FA5.</li>
41
+ <li>Added new filter to Map Module <code>fl_builder_map_args</code>.</li>
42
+ <li>Updated jQuery.validate to 1.18 to allow for customizable error messages.</li>
43
+ <li>Updated Flyout Menu icon to use FA5.</li>
44
+ <li>Changed Template taxonomy label from Categories to Categories ( Beaver Builder ) to avoid confusion in CPT plugins.</li>
45
+ <li>Allow modules to only display certain parts of the typography settings.</li>
46
+ <li>Add optional limit for multiple setting types, when limit is reached user can not add/copy.</li>
47
+ <li>Pass Youtube Embed Parameters StartTime and EndTime to Youtube Player API.</li>
48
+ <li>Convert notifications to use native WP cron.</li>
49
+ <li>Updated inline action and filter docs for use on hooks.wpbeaverbuilder.com</li>
50
+ </ul>
51
+ <p><strong>Bug Fixes</strong></p>
52
+ <ul>
53
+ <li>Fixed relative urls issue when adding images to rich-text module.</li>
54
+ <li>Fixed an issue with IE11 in layout css.</li>
55
+ <li>Fixed submenu issue in IE11 caused by z-index.</li>
56
+ <li>Fixed subject field connections not working with insert.</li>
57
+ <li>Fixed custom svg icons and groups not working for module aliases.</li>
58
+ <li>Fixed select fields not displaying selected value if all values are numbers.</li>
59
+ <li>Fixed modules ordering and sorted alphabetically.</li>
60
+ <li>Fixed Number Counter issue with Firefox and decimal numbers.</li>
61
+ <li>Fixed PHP notice when no image is selected but lightbox is used in Photo Module.</li>
62
+ <li>Fixed mega-menu issue with hide-heading on mobile menu.</li>
63
+ <li>Fixed fatal error in MailPoet 3 integration.</li>
64
+ <li>Fixed HTML module RTL language layout issue.</li>
65
+ <li>Fixed below row style in menu module when animation is enabled.</li>
66
+ <li>Fixed content slider buttons CSS not being applied.</li>
67
+ <li>Fixed invalid css if text color happens to be empty.</li>
68
+ <li>Fixed heading color not working when editing saved heading module.</li>
69
+ <li>Fixed auto spacing issue on mobile for columns.</li>
70
+ <li>Fixed rich-text module dropdowns being transparent if white text is selected in theme.</li>
71
+ <li>Changed row overlay background pseudo selector to :before to prevent z-index issues.</li>
72
+ <li>Posts module - Feed layout - hide image width option when it doesn't apply.</li>
73
+ <li>Fixed unnecessary large queries being used for demo usage stats data.</li>
74
+ </ul>
75
+
76
+ <h4>2.2.0.7 - 02/06/2019</h4>
77
+ <p><strong>Hot Fix</strong></p>
78
+ <ul>
79
+ <li>Multisite saved rows templates issue fixed.</li>
80
+ <li>Font Awesome updated to 5.7.1</li>
81
+ </ul>
82
+
83
  <h4>2.2.0.6 - 01/24/2019</h4>
84
  <p><strong>Hot Fix</strong></p>
85
  <ul>
classes/class-fl-builder-admin-posts.php CHANGED
@@ -15,12 +15,13 @@ final class FLBuilderAdminPosts {
15
  */
16
  static public function init() {
17
  /* Actions */
18
- add_action( 'current_screen', __CLASS__ . '::init_rendering' );
19
 
20
  /* Filters */
21
- add_filter( 'redirect_post_location', __CLASS__ . '::redirect_post_location' );
22
- add_filter( 'page_row_actions', __CLASS__ . '::render_row_actions_link' );
23
- add_filter( 'post_row_actions', __CLASS__ . '::render_row_actions_link' );
 
24
  }
25
 
26
  /**
@@ -63,6 +64,22 @@ final class FLBuilderAdminPosts {
63
  return use_block_editor_for_post_type( $post_type );
64
  }
65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  /**
67
  * Sets the body class, loads assets and renders the UI
68
  * if we are on a post type that supports the builder.
@@ -75,14 +92,45 @@ final class FLBuilderAdminPosts {
75
 
76
  if ( in_array( $pagenow, array( 'post.php', 'post-new.php' ) ) ) {
77
 
78
- $render_ui = apply_filters( 'fl_builder_render_admin_edit_ui', true );
79
- $post_type = self::get_post_type();
80
  $post_types = FLBuilderModel::get_post_types();
81
 
82
  if ( $render_ui && in_array( $post_type, $post_types ) ) {
83
- add_filter( 'admin_body_class', __CLASS__ . '::body_class', 99 );
84
- add_action( 'admin_enqueue_scripts', __CLASS__ . '::styles_scripts' );
85
- add_action( 'edit_form_after_title', __CLASS__ . '::render' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  }
87
  }
88
  }
@@ -141,9 +189,9 @@ final class FLBuilderAdminPosts {
141
  static public function render() {
142
  global $post;
143
 
144
- $post_type_obj = get_post_type_object( $post->post_type );
145
  $post_type_name = strtolower( $post_type_obj->labels->singular_name );
146
- $enabled = FLBuilderModel::is_builder_enabled();
147
 
148
  include FL_BUILDER_DIR . 'includes/admin-posts.php';
149
  }
@@ -161,12 +209,12 @@ final class FLBuilderAdminPosts {
161
  if ( 'trash' != $post->post_status && current_user_can( 'edit_post', $post->ID ) && wp_check_post_lock( $post->ID ) === false ) {
162
 
163
  $is_post_editable = (bool) apply_filters( 'fl_builder_is_post_editable', true, $post );
164
- $user_access = FLBuilderUserAccess::current_user_can( 'builder_access' );
165
- $post_types = FLBuilderModel::get_post_types();
166
 
167
  if ( in_array( $post->post_type, $post_types ) && $is_post_editable && $user_access ) {
168
- $enabled = get_post_meta( $post->ID, '_fl_builder_enabled', true );
169
- $dot = ' <span style="color:' . ( $enabled ? '#6bc373' : '#d9d9d9' ) . '; font-size:18px;">&bull;</span>';
170
  $actions['fl-builder'] = '<a href="' . FLBuilderModel::get_edit_url() . '">' . FLBuilderModel::get_branding() . $dot . '</a>';
171
  }
172
  }
15
  */
16
  static public function init() {
17
  /* Actions */
18
+ add_action( 'current_screen', __CLASS__ . '::init_rendering' );
19
 
20
  /* Filters */
21
+ add_filter( 'redirect_post_location', __CLASS__ . '::redirect_post_location' );
22
+ add_filter( 'page_row_actions', __CLASS__ . '::render_row_actions_link' );
23
+ add_filter( 'post_row_actions', __CLASS__ . '::render_row_actions_link' );
24
+ add_action( 'pre_get_posts', __CLASS__ . '::sort_builder_enabled' );
25
  }
26
 
27
  /**
64
  return use_block_editor_for_post_type( $post_type );
65
  }
66
 
67
+ /**
68
+ * Allow sorting by builder enabled in pages list.
69
+ * @since 2.2.1
70
+ */
71
+ static public function sort_builder_enabled( $query ) {
72
+ global $pagenow;
73
+ if ( is_admin()
74
+ && 'edit.php' == $pagenow
75
+ && ! isset( $_GET['orderby'] )
76
+ && isset( $_GET['post_type'] )
77
+ && isset( $_GET['bbsort'] ) ) {
78
+ $query->set( 'meta_key', '_fl_builder_enabled' );
79
+ $query->set( 'meta_value', '1' );
80
+ }
81
+ }
82
+
83
  /**
84
  * Sets the body class, loads assets and renders the UI
85
  * if we are on a post type that supports the builder.
92
 
93
  if ( in_array( $pagenow, array( 'post.php', 'post-new.php' ) ) ) {
94
 
95
+ $render_ui = apply_filters( 'fl_builder_render_admin_edit_ui', true );
96
+ $post_type = self::get_post_type();
97
  $post_types = FLBuilderModel::get_post_types();
98
 
99
  if ( $render_ui && in_array( $post_type, $post_types ) ) {
100
+ add_filter( 'admin_body_class', __CLASS__ . '::body_class', 99 );
101
+ add_action( 'admin_enqueue_scripts', __CLASS__ . '::styles_scripts' );
102
+ add_action( 'edit_form_after_title', __CLASS__ . '::render' );
103
+ }
104
+ }
105
+
106
+ if ( 'edit.php' == $pagenow && true === apply_filters( 'fl_builder_admin_edit_sort_bb_enabled', true ) ) {
107
+ $post_types = FLBuilderModel::get_post_types();
108
+ $post_type = self::get_post_type();
109
+ if ( in_array( $post_type, $post_types ) ) {
110
+ wp_enqueue_script( 'fl-builder-admin-posts-list', FL_BUILDER_URL . 'js/fl-builder-admin-posts-list.js', array( 'jquery' ), FL_BUILDER_VERSION );
111
+ $args = array(
112
+ 'post_type' => $post_type,
113
+ 'posts_per_page' => -1,
114
+ 'meta_query' => array(
115
+ array(
116
+ 'key' => '_fl_builder_enabled',
117
+ 'compare' => '!=',
118
+ 'value' => '',
119
+ ),
120
+ ),
121
+ );
122
+ $result = new WP_Query( $args );
123
+ $count = is_array( $result->posts ) ? count( $result->posts ) : 0;
124
+ $clicked = isset( $_GET['bbsort'] ) ? true : false;
125
+ wp_localize_script( 'fl-builder-admin-posts-list',
126
+ 'fl_builder_enabled_count',
127
+ array(
128
+ 'count' => $count,
129
+ 'brand' => FLBuilderModel::get_branding(),
130
+ 'clicked' => $clicked,
131
+ 'type' => $post_type,
132
+ )
133
+ );
134
  }
135
  }
136
  }
189
  static public function render() {
190
  global $post;
191
 
192
+ $post_type_obj = get_post_type_object( $post->post_type );
193
  $post_type_name = strtolower( $post_type_obj->labels->singular_name );
194
+ $enabled = FLBuilderModel::is_builder_enabled();
195
 
196
  include FL_BUILDER_DIR . 'includes/admin-posts.php';
197
  }
209
  if ( 'trash' != $post->post_status && current_user_can( 'edit_post', $post->ID ) && wp_check_post_lock( $post->ID ) === false ) {
210
 
211
  $is_post_editable = (bool) apply_filters( 'fl_builder_is_post_editable', true, $post );
212
+ $user_access = FLBuilderUserAccess::current_user_can( 'builder_access' );
213
+ $post_types = FLBuilderModel::get_post_types();
214
 
215
  if ( in_array( $post->post_type, $post_types ) && $is_post_editable && $user_access ) {
216
+ $enabled = get_post_meta( $post->ID, '_fl_builder_enabled', true );
217
+ $dot = ' <span style="color:' . ( $enabled ? '#6bc373' : '#d9d9d9' ) . '; font-size:18px;">&bull;</span>';
218
  $actions['fl-builder'] = '<a href="' . FLBuilderModel::get_edit_url() . '">' . FLBuilderModel::get_branding() . $dot . '</a>';
219
  }
220
  }
classes/class-fl-builder-admin-settings.php CHANGED
@@ -153,52 +153,52 @@ final class FLBuilderAdminSettings {
153
  */
154
  static public function render_nav_items() {
155
  $item_data = apply_filters( 'fl_builder_admin_settings_nav_items', array(
156
- 'welcome' => array(
157
- 'title' => __( 'Welcome', 'fl-builder' ),
158
- 'show' => ! FLBuilderModel::is_white_labeled() && ( is_network_admin() || ! self::multisite_support() ),
159
- 'priority' => 50,
160
  ),
161
- 'license' => array(
162
- 'title' => __( 'License', 'fl-builder' ),
163
- 'show' => FL_BUILDER_LITE !== true && ( is_network_admin() || ! self::multisite_support() ),
164
- 'priority' => 100,
165
  ),
166
- 'upgrade' => array(
167
- 'title' => __( 'Upgrade', 'fl-builder' ),
168
- 'show' => FL_BUILDER_LITE === true,
169
- 'priority' => 200,
170
  ),
171
- 'modules' => array(
172
- 'title' => __( 'Modules', 'fl-builder' ),
173
- 'show' => true,
174
- 'priority' => 300,
175
  ),
176
- 'post-types' => array(
177
- 'title' => __( 'Post Types', 'fl-builder' ),
178
- 'show' => true,
179
- 'priority' => 400,
180
  ),
181
  'user-access' => array(
182
- 'title' => __( 'User Access', 'fl-builder' ),
183
- 'show' => true,
184
- 'priority' => 500,
185
  ),
186
- 'icons' => array(
187
- 'title' => __( 'Icons', 'fl-builder' ),
188
- 'show' => FL_BUILDER_LITE !== true,
189
- 'priority' => 600,
190
  ),
191
- 'tools' => array(
192
- 'title' => __( 'Tools', 'fl-builder' ),
193
- 'show' => true,
194
- 'priority' => 700,
195
  ),
196
  ) );
197
 
198
  $sorted_data = array();
199
 
200
  foreach ( $item_data as $key => $data ) {
201
- $data['key'] = $key;
202
  $sorted_data[ $data['priority'] ] = $data;
203
  }
204
 
@@ -248,7 +248,10 @@ final class FLBuilderAdminSettings {
248
  // Tools
249
  self::render_form( 'tools' );
250
 
251
- // Let extensions hook into form rendering.
 
 
 
252
  do_action( 'fl_builder_admin_settings_render_forms' );
253
  }
254
 
@@ -347,7 +350,10 @@ final class FLBuilderAdminSettings {
347
  self::debug();
348
  self::uninstall();
349
 
350
- // Let extensions hook into saving.
 
 
 
351
  do_action( 'fl_builder_admin_settings_save' );
352
  }
353
 
@@ -449,23 +455,30 @@ final class FLBuilderAdminSettings {
449
  fl_builder_filesystem()->rmdir( $sets[ $key ]['path'], true );
450
  FLBuilderIcons::remove_set( $key );
451
  }
452
-
 
 
 
453
  do_action( 'fl_builder_admin_settings_remove_icon_set', $key );
454
  }
455
 
456
  // Upload a new set?
457
  if ( ! empty( $_POST['fl-new-icon-set'] ) ) {
458
 
459
- $dir = FLBuilderModel::get_cache_dir( 'icons' );
460
- $id = (int) $_POST['fl-new-icon-set'];
461
- $path = apply_filters( 'fl_builder_icon_set_upload_path', get_attached_file( $id ) );
462
- $new_path = apply_filters( 'fl_builder_icon_set_new_path', $dir['path'] . 'icon-' . time() . '/' );
463
 
464
  fl_builder_filesystem()->get_filesystem();
465
 
 
 
 
 
466
  do_action( 'fl_builder_before_unzip_icon_set', $id, $path, $new_path );
467
 
468
- $unzipped = unzip_file( $path, $new_path );
469
 
470
  // unzip returned a WP_Error
471
  if ( is_wp_error( $unzipped ) ) {
@@ -484,9 +497,9 @@ final class FLBuilderAdminSettings {
484
 
485
  if ( 1 == count( $files ) ) {
486
 
487
- $values = array_values( $files );
488
  $subfolder_info = array_shift( $values );
489
- $subfolder = $new_path . $subfolder_info['name'] . '/';
490
 
491
  if ( fl_builder_filesystem()->file_exists( $subfolder ) && fl_builder_filesystem()->is_dir( $subfolder ) ) {
492
 
@@ -502,12 +515,16 @@ final class FLBuilderAdminSettings {
502
  }
503
  }
504
 
 
 
 
 
505
  do_action( 'fl_builder_after_unzip_icon_set', $new_path );
506
 
507
  $check_path = apply_filters( 'fl_builder_icon_set_check_path', $new_path );
508
 
509
  // Check for supported sets.
510
- $is_icomoon = fl_builder_filesystem()->file_exists( $check_path . 'selection.json' );
511
  $is_fontello = fl_builder_filesystem()->file_exists( $check_path . 'config.json' );
512
 
513
  // Show an error if we don't have a supported icon set.
@@ -529,7 +546,7 @@ final class FLBuilderAdminSettings {
529
 
530
  // Enable the new set.
531
  if ( is_array( $enabled_icons ) ) {
532
- $key = FLBuilderIcons::get_key_from_path( $check_path );
533
  $enabled_icons[] = $key;
534
  }
535
  }
@@ -586,6 +603,10 @@ final class FLBuilderAdminSettings {
586
  FLCustomizer::clear_all_css_cache();
587
  }
588
  }
 
 
 
 
589
  do_action( 'fl_builder_cache_cleared' );
590
  }
591
  }
153
  */
154
  static public function render_nav_items() {
155
  $item_data = apply_filters( 'fl_builder_admin_settings_nav_items', array(
156
+ 'welcome' => array(
157
+ 'title' => __( 'Welcome', 'fl-builder' ),
158
+ 'show' => ! FLBuilderModel::is_white_labeled() && ( is_network_admin() || ! self::multisite_support() ),
159
+ 'priority' => 50,
160
  ),
161
+ 'license' => array(
162
+ 'title' => __( 'License', 'fl-builder' ),
163
+ 'show' => FL_BUILDER_LITE !== true && ( is_network_admin() || ! self::multisite_support() ),
164
+ 'priority' => 100,
165
  ),
166
+ 'upgrade' => array(
167
+ 'title' => __( 'Upgrade', 'fl-builder' ),
168
+ 'show' => FL_BUILDER_LITE === true,
169
+ 'priority' => 200,
170
  ),
171
+ 'modules' => array(
172
+ 'title' => __( 'Modules', 'fl-builder' ),
173
+ 'show' => true,
174
+ 'priority' => 300,
175
  ),
176
+ 'post-types' => array(
177
+ 'title' => __( 'Post Types', 'fl-builder' ),
178
+ 'show' => true,
179
+ 'priority' => 400,
180
  ),
181
  'user-access' => array(
182
+ 'title' => __( 'User Access', 'fl-builder' ),
183
+ 'show' => true,
184
+ 'priority' => 500,
185
  ),
186
+ 'icons' => array(
187
+ 'title' => __( 'Icons', 'fl-builder' ),
188
+ 'show' => FL_BUILDER_LITE !== true,
189
+ 'priority' => 600,
190
  ),
191
+ 'tools' => array(
192
+ 'title' => __( 'Tools', 'fl-builder' ),
193
+ 'show' => true,
194
+ 'priority' => 700,
195
  ),
196
  ) );
197
 
198
  $sorted_data = array();
199
 
200
  foreach ( $item_data as $key => $data ) {
201
+ $data['key'] = $key;
202
  $sorted_data[ $data['priority'] ] = $data;
203
  }
204
 
248
  // Tools
249
  self::render_form( 'tools' );
250
 
251
+ /**
252
+ * Let extensions hook into form rendering.
253
+ * @see fl_builder_admin_settings_render_forms
254
+ */
255
  do_action( 'fl_builder_admin_settings_render_forms' );
256
  }
257
 
350
  self::debug();
351
  self::uninstall();
352
 
353
+ /**
354
+ * Let extensions hook into saving.
355
+ * @see fl_builder_admin_settings_save
356
+ */
357
  do_action( 'fl_builder_admin_settings_save' );
358
  }
359
 
455
  fl_builder_filesystem()->rmdir( $sets[ $key ]['path'], true );
456
  FLBuilderIcons::remove_set( $key );
457
  }
458
+ /**
459
+ * After set is deleted.
460
+ * @see fl_builder_admin_settings_remove_icon_set
461
+ */
462
  do_action( 'fl_builder_admin_settings_remove_icon_set', $key );
463
  }
464
 
465
  // Upload a new set?
466
  if ( ! empty( $_POST['fl-new-icon-set'] ) ) {
467
 
468
+ $dir = FLBuilderModel::get_cache_dir( 'icons' );
469
+ $id = (int) $_POST['fl-new-icon-set'];
470
+ $path = apply_filters( 'fl_builder_icon_set_upload_path', get_attached_file( $id ) );
471
+ $new_path = apply_filters( 'fl_builder_icon_set_new_path', $dir['path'] . 'icon-' . time() . '/' );
472
 
473
  fl_builder_filesystem()->get_filesystem();
474
 
475
+ /**
476
+ * Before set is unziped.
477
+ * @see fl_builder_before_unzip_icon_set
478
+ */
479
  do_action( 'fl_builder_before_unzip_icon_set', $id, $path, $new_path );
480
 
481
+ $unzipped = unzip_file( $path, $new_path );
482
 
483
  // unzip returned a WP_Error
484
  if ( is_wp_error( $unzipped ) ) {
497
 
498
  if ( 1 == count( $files ) ) {
499
 
500
+ $values = array_values( $files );
501
  $subfolder_info = array_shift( $values );
502
+ $subfolder = $new_path . $subfolder_info['name'] . '/';
503
 
504
  if ( fl_builder_filesystem()->file_exists( $subfolder ) && fl_builder_filesystem()->is_dir( $subfolder ) ) {
505
 
515
  }
516
  }
517
 
518
+ /**
519
+ * After set is unzipped.
520
+ * @see fl_builder_after_unzip_icon_set
521
+ */
522
  do_action( 'fl_builder_after_unzip_icon_set', $new_path );
523
 
524
  $check_path = apply_filters( 'fl_builder_icon_set_check_path', $new_path );
525
 
526
  // Check for supported sets.
527
+ $is_icomoon = fl_builder_filesystem()->file_exists( $check_path . 'selection.json' );
528
  $is_fontello = fl_builder_filesystem()->file_exists( $check_path . 'config.json' );
529
 
530
  // Show an error if we don't have a supported icon set.
546
 
547
  // Enable the new set.
548
  if ( is_array( $enabled_icons ) ) {
549
+ $key = FLBuilderIcons::get_key_from_path( $check_path );
550
  $enabled_icons[] = $key;
551
  }
552
  }
603
  FLCustomizer::clear_all_css_cache();
604
  }
605
  }
606
+ /**
607
+ * Fires after cache is cleared.
608
+ * @see fl_builder_cache_cleared
609
+ */
610
  do_action( 'fl_builder_cache_cleared' );
611
  }
612
  }
classes/class-fl-builder-admin.php CHANGED
@@ -17,14 +17,14 @@ final class FLBuilderAdmin {
17
  $basename = plugin_basename( FL_BUILDER_FILE );
18
 
19
  // Activation
20
- register_activation_hook( FL_BUILDER_FILE, __CLASS__ . '::activate' );
21
 
22
  // Actions
23
- add_action( 'admin_init', __CLASS__ . '::show_activate_notice' );
24
- add_action( 'admin_init', __CLASS__ . '::sanity_checks' );
25
 
26
  // Filters
27
- add_filter( 'plugin_action_links_' . $basename, __CLASS__ . '::render_plugin_action_links' );
28
  }
29
 
30
  /**
@@ -43,7 +43,10 @@ final class FLBuilderAdmin {
43
  self::show_activate_error( __( 'The <strong>Page Builder</strong> plugin requires WordPress version 3.5 or greater. Please update WordPress before activating the plugin.', 'fl-builder' ) );
44
  }
45
 
46
- // Allow extensions to hook activation.
 
 
 
47
  $activate = apply_filters( 'fl_builder_activate', true );
48
 
49
  // Should we continue with activation?
@@ -52,8 +55,8 @@ final class FLBuilderAdmin {
52
  // Check for multisite.
53
  if ( is_multisite() ) {
54
  $url = FLBuilderModel::get_upgrade_url( array(
55
- 'utm_medium' => 'bb-pro',
56
- 'utm_source' => 'plugins-admin-page',
57
  'utm_campaign' => 'no-multisite-support',
58
  ) );
59
  self::show_activate_error( sprintf( __( 'This version of the <strong>Page Builder</strong> plugin is not compatible with WordPress Multisite. <a%s>Please upgrade</a> to the Multisite version of this plugin.', 'fl-builder' ), ' href="' . $url . '" target="_blank"' ) );
@@ -65,7 +68,10 @@ final class FLBuilderAdmin {
65
  // Trigger the activation notice.
66
  self::trigger_activate_notice();
67
 
68
- // Allow add-ons to hook into activation.
 
 
 
69
  do_action( 'fl_builder_activated' );
70
 
71
  // Flush the rewrite rules.
@@ -216,18 +222,18 @@ final class FLBuilderAdmin {
216
  */
217
  static public function render_plugin_action_links( $actions ) {
218
  if ( FL_BUILDER_LITE === true ) {
219
- $url = FLBuilderModel::get_upgrade_url( array(
220
- 'utm_medium' => 'bb-lite',
221
- 'utm_source' => 'plugins-admin-page',
222
  'utm_campaign' => 'plugins-admin-upgrade',
223
  ) );
224
  $actions[] = '<a href="' . $url . '" style="color:#3db634;" target="_blank">' . _x( 'Upgrade', 'Plugin action link label.', 'fl-builder' ) . '</a>';
225
  }
226
 
227
  if ( ! FLBuilderModel::is_white_labeled() ) {
228
- $url = FLBuilderModel::get_store_url( 'change-logs', array(
229
- 'utm_medium' => 'bb-pro',
230
- 'utm_source' => 'plugins-admin-page',
231
  'utm_campaign' => 'plugins-admin-changelog',
232
  ) );
233
  $actions[] = '<a href="' . $url . '" target="_blank">' . _x( 'Change Log', 'Plugin action link label.', 'fl-builder' ) . '</a>';
17
  $basename = plugin_basename( FL_BUILDER_FILE );
18
 
19
  // Activation
20
+ register_activation_hook( FL_BUILDER_FILE, __CLASS__ . '::activate' );
21
 
22
  // Actions
23
+ add_action( 'admin_init', __CLASS__ . '::show_activate_notice' );
24
+ add_action( 'admin_init', __CLASS__ . '::sanity_checks' );
25
 
26
  // Filters
27
+ add_filter( 'plugin_action_links_' . $basename, __CLASS__ . '::render_plugin_action_links' );
28
  }
29
 
30
  /**
43
  self::show_activate_error( __( 'The <strong>Page Builder</strong> plugin requires WordPress version 3.5 or greater. Please update WordPress before activating the plugin.', 'fl-builder' ) );
44
  }
45
 
46
+ /**
47
+ * Allow extensions to hook activation.
48
+ * @see fl_builder_activate
49
+ */
50
  $activate = apply_filters( 'fl_builder_activate', true );
51
 
52
  // Should we continue with activation?
55
  // Check for multisite.
56
  if ( is_multisite() ) {
57
  $url = FLBuilderModel::get_upgrade_url( array(
58
+ 'utm_medium' => 'bb-pro',
59
+ 'utm_source' => 'plugins-admin-page',
60
  'utm_campaign' => 'no-multisite-support',
61
  ) );
62
  self::show_activate_error( sprintf( __( 'This version of the <strong>Page Builder</strong> plugin is not compatible with WordPress Multisite. <a%s>Please upgrade</a> to the Multisite version of this plugin.', 'fl-builder' ), ' href="' . $url . '" target="_blank"' ) );
68
  // Trigger the activation notice.
69
  self::trigger_activate_notice();
70
 
71
+ /**
72
+ * Allow add-ons to hook into activation.
73
+ * @see fl_builder_activated
74
+ */
75
  do_action( 'fl_builder_activated' );
76
 
77
  // Flush the rewrite rules.
222
  */
223
  static public function render_plugin_action_links( $actions ) {
224
  if ( FL_BUILDER_LITE === true ) {
225
+ $url = FLBuilderModel::get_upgrade_url( array(
226
+ 'utm_medium' => 'bb-lite',
227
+ 'utm_source' => 'plugins-admin-page',
228
  'utm_campaign' => 'plugins-admin-upgrade',
229
  ) );
230
  $actions[] = '<a href="' . $url . '" style="color:#3db634;" target="_blank">' . _x( 'Upgrade', 'Plugin action link label.', 'fl-builder' ) . '</a>';
231
  }
232
 
233
  if ( ! FLBuilderModel::is_white_labeled() ) {
234
+ $url = FLBuilderModel::get_store_url( 'change-logs', array(
235
+ 'utm_medium' => 'bb-pro',
236
+ 'utm_source' => 'plugins-admin-page',
237
  'utm_campaign' => 'plugins-admin-changelog',
238
  ) );
239
  $actions[] = '<a href="' . $url . '" target="_blank">' . _x( 'Change Log', 'Plugin action link label.', 'fl-builder' ) . '</a>';
classes/class-fl-builder-ajax-layout.php CHANGED
@@ -25,6 +25,10 @@ final class FLBuilderAJAXLayout {
25
  * @return array
26
  */
27
  static public function render( $node_id = null, $old_node_id = null ) {
 
 
 
 
28
  do_action( 'fl_builder_before_render_ajax_layout' );
29
 
30
  // Update the node ID in the post data?
@@ -50,18 +54,25 @@ final class FLBuilderAJAXLayout {
50
  // Render the assets.
51
  $assets = self::render_assets();
52
 
 
 
 
 
53
  do_action( 'fl_builder_after_render_ajax_layout' );
54
 
55
- // Return the response.
 
 
 
56
  return apply_filters( 'fl_builder_ajax_layout_response', array(
57
- 'partial' => $partial_refresh_data['is_partial_refresh'],
58
- 'nodeId' => $partial_refresh_data['node_id'],
59
- 'nodeType' => $partial_refresh_data['node_type'],
60
- 'oldNodeId' => $old_node_id,
61
- 'html' => $html,
62
- 'scriptsStyles' => $scripts_styles,
63
- 'css' => $assets['css'],
64
- 'js' => $assets['js'],
65
  ) );
66
  }
67
 
@@ -78,19 +89,27 @@ final class FLBuilderAJAXLayout {
78
  // Add the row.
79
  $row = FLBuilderModel::add_row( $cols, $position, $module );
80
 
81
- // Render the row.
 
 
 
82
  do_action( 'fl_builder_before_render_ajax_layout_html' );
83
  ob_start();
84
  FLBuilder::render_row( $row );
85
  $html = ob_get_clean();
 
 
 
 
 
86
  do_action( 'fl_builder_after_render_ajax_layout_html' );
87
 
88
  // Return the response.
89
  return array(
90
- 'partial' => true,
91
- 'nodeType' => $row->type,
92
- 'html' => $html,
93
- 'js' => 'FLBuilder._renderLayoutComplete();',
94
  );
95
  }
96
 
@@ -104,7 +123,9 @@ final class FLBuilderAJAXLayout {
104
  * @return array
105
  */
106
  static public function render_new_row_template( $position, $template_id, $template_type = 'user' ) {
107
- if ( 'core' == $template_type ) {
 
 
108
  $template = FLBuilderModel::get_template( $template_id, 'row' );
109
  $row = FLBuilderModel::apply_node_template( $template_id, null, $position, $template );
110
  } else {
@@ -146,19 +167,27 @@ final class FLBuilderAJAXLayout {
146
  // Add the group.
147
  $group = FLBuilderModel::add_col_group( $node_id, $cols, $position, $module );
148
 
149
- // Render the group.
 
 
 
150
  do_action( 'fl_builder_before_render_ajax_layout_html' );
151
  ob_start();
152
  FLBuilder::render_column_group( $group );
153
  $html = ob_get_clean();
 
 
 
 
 
154
  do_action( 'fl_builder_after_render_ajax_layout_html' );
155
 
156
  // Return the response.
157
  return array(
158
- 'partial' => true,
159
- 'nodeType' => $group->type,
160
- 'html' => $html,
161
- 'js' => 'FLBuilder._renderLayoutComplete();',
162
  );
163
  }
164
 
@@ -204,13 +233,13 @@ final class FLBuilderAJAXLayout {
204
 
205
  // Get the node to render.
206
  if ( ! $parent ) {
207
- $row = FLBuilderModel::get_col_parent( 'row', $column );
208
- $render_id = $row->node;
209
  } elseif ( 'row' == $parent->type ) {
210
- $group = FLBuilderModel::get_col_parent( 'column-group', $column );
211
- $render_id = $group->node;
212
  } elseif ( 'column-group' == $parent->type ) {
213
- $render_id = $parent->node;
214
  } else {
215
  $render_id = $column->node;
216
  }
@@ -272,13 +301,13 @@ final class FLBuilderAJAXLayout {
272
 
273
  // Get the node to render.
274
  if ( ! $parent ) {
275
- $row = FLBuilderModel::get_module_parent( 'row', $module );
276
- $render_id = $row->node;
277
  } elseif ( 'row' == $parent->type ) {
278
- $group = FLBuilderModel::get_module_parent( 'column-group', $module );
279
- $render_id = $group->node;
280
  } elseif ( 'column-group' == $parent->type ) {
281
- $render_id = $parent->node;
282
  } else {
283
  $render_id = $module->node;
284
  }
@@ -288,13 +317,13 @@ final class FLBuilderAJAXLayout {
288
 
289
  // Return the response.
290
  return array(
291
- 'type' => $module->settings->type,
292
- 'nodeId' => $module->node,
293
- 'parentId' => $module->parent,
294
- 'global' => FLBuilderModel::is_node_global( $module ),
295
- 'layout' => self::render( $render_id ),
296
- 'settings' => null === $template_id && ! $alias ? null : $module->settings,
297
- 'legacy' => FLBuilderUISettingsForms::pre_render_legacy_module_settings( $module->settings->type, $module->settings ),
298
  );
299
  }
300
 
@@ -323,39 +352,39 @@ final class FLBuilderAJAXLayout {
323
  // Get the data if it's not cached.
324
  if ( ! self::$partial_refresh_data ) {
325
 
326
- $post_data = FLBuilderModel::get_post_data();
327
  $partial_refresh = false;
328
- $node_type = null;
329
 
330
  // Check for partial refresh if we have a node ID.
331
  if ( isset( $post_data['node_id'] ) ) {
332
 
333
  // Get the node.
334
- $node_id = $post_data['node_id'];
335
- $node = FLBuilderModel::get_node( $post_data['node_id'] );
336
  $node_type = null;
337
 
338
  // Check a module for partial refresh.
339
  if ( $node && 'module' == $node->type ) {
340
- $node = FLBuilderModel::get_module( $node_id );
341
- $node_type = 'module';
342
- $partial_refresh = $node->partial_refresh;
343
  } elseif ( $node ) {
344
- $node_type = $node->type;
345
- $partial_refresh = self::node_modules_support_partial_refresh( $node );
346
  }
347
  } else {
348
- $node_id = null;
349
- $node = null;
350
- $node_type = null;
351
  }
352
 
353
  // Cache the partial refresh data.
354
  self::$partial_refresh_data = array(
355
  'is_partial_refresh' => $partial_refresh,
356
- 'node_id' => $node_id,
357
- 'node' => $node,
358
- 'node_type' => $node_type,
359
  );
360
  }
361
 
@@ -372,7 +401,7 @@ final class FLBuilderAJAXLayout {
372
  * @return bool
373
  */
374
  static private function node_modules_support_partial_refresh( $node ) {
375
- $nodes = FLBuilderModel::get_categorized_nodes();
376
 
377
  if ( 'row' == $node->type ) {
378
 
@@ -426,6 +455,10 @@ final class FLBuilderAJAXLayout {
426
  * @return string
427
  */
428
  static private function render_html() {
 
 
 
 
429
  do_action( 'fl_builder_before_render_ajax_layout_html' );
430
 
431
  // Get the partial refresh data.
@@ -441,19 +474,19 @@ final class FLBuilderAJAXLayout {
441
 
442
  case 'row':
443
  FLBuilder::render_row( $partial_refresh_data['node'] );
444
- break;
445
 
446
  case 'column-group':
447
  FLBuilder::render_column_group( $partial_refresh_data['node'] );
448
- break;
449
 
450
  case 'column':
451
  FLBuilder::render_column( $partial_refresh_data['node'] );
452
- break;
453
 
454
  case 'module':
455
  FLBuilder::render_module( $partial_refresh_data['node'] );
456
- break;
457
  }
458
  } else {
459
  FLBuilder::render_nodes();
@@ -474,7 +507,10 @@ final class FLBuilderAJAXLayout {
474
  echo do_shortcode( $html );
475
  $html = ob_get_clean();
476
  }
477
-
 
 
 
478
  do_action( 'fl_builder_after_render_ajax_layout_html' );
479
 
480
  // Return the rendered HTML.
@@ -489,12 +525,12 @@ final class FLBuilderAJAXLayout {
489
  * @return array
490
  */
491
  static private function render_assets() {
492
- $partial_refresh_data = self::get_partial_refresh_data();
493
- $asset_info = FLBuilderModel::get_asset_info();
494
- $asset_ver = FLBuilderModel::get_asset_version();
495
- $enqueuemethod = FLBuilderModel::get_asset_enqueue_method();
496
- $assets = array(
497
- 'js' => '',
498
  'css' => '',
499
  );
500
 
@@ -511,28 +547,29 @@ final class FLBuilderAJAXLayout {
511
  switch ( $partial_refresh_data['node']->type ) {
512
 
513
  case 'row':
514
- $assets['js'] = FLBuilder::render_row_js( $partial_refresh_data['node'] );
515
  $assets['js'] .= FLBuilder::render_row_modules_js( $partial_refresh_data['node'] );
516
- break;
517
 
518
  case 'column-group':
519
  $assets['js'] = FLBuilder::render_column_group_modules_js( $partial_refresh_data['node'] );
520
- break;
521
 
522
  case 'column':
523
  $assets['js'] = FLBuilder::render_column_modules_js( $partial_refresh_data['node'] );
524
- break;
525
 
526
  case 'module':
527
  $assets['js'] = FLBuilder::render_module_js( $partial_refresh_data['node'] );
528
- break;
529
  }
530
 
531
  $assets['js'] .= 'FLBuilder._renderLayoutComplete();';
532
 
533
  try {
534
  $min = FLJSMin::minify( $assets['js'] );
535
- } catch ( Exception $e ) {}
 
536
 
537
  if ( $min ) {
538
  $assets['js'] = $min;
@@ -608,9 +645,9 @@ final class FLBuilderAJAXLayout {
608
  global $wp_scripts;
609
  global $wp_styles;
610
 
611
- $partial_refresh_data = self::get_partial_refresh_data();
612
- $modules = array();
613
- $scripts_styles = '';
614
 
615
  // Enqueue module font styles.
616
  if ( ! $partial_refresh_data['is_partial_refresh'] ) {
@@ -620,7 +657,7 @@ final class FLBuilderAJAXLayout {
620
  foreach ( $nodes as $node ) {
621
  if ( 'module' === $node->type && isset( FLBuilderModel::$modules[ $node->settings->type ] ) ) {
622
  $node->form = FLBuilderModel::$modules[ $node->settings->type ]->form;
623
- $modules[] = $node;
624
  }
625
  }
626
  } else {
25
  * @return array
26
  */
27
  static public function render( $node_id = null, $old_node_id = null ) {
28
+ /**
29
+ * Before ajax layout rendered.
30
+ * @see fl_builder_before_render_ajax_layout
31
+ */
32
  do_action( 'fl_builder_before_render_ajax_layout' );
33
 
34
  // Update the node ID in the post data?
54
  // Render the assets.
55
  $assets = self::render_assets();
56
 
57
+ /**
58
+ * After ajax layout rendered.
59
+ * @see fl_builder_after_render_ajax_layout
60
+ */
61
  do_action( 'fl_builder_after_render_ajax_layout' );
62
 
63
+ /**
64
+ * Return filtered response.
65
+ * @see fl_builder_ajax_layout_response
66
+ */
67
  return apply_filters( 'fl_builder_ajax_layout_response', array(
68
+ 'partial' => $partial_refresh_data['is_partial_refresh'],
69
+ 'nodeId' => $partial_refresh_data['node_id'],
70
+ 'nodeType' => $partial_refresh_data['node_type'],
71
+ 'oldNodeId' => $old_node_id,
72
+ 'html' => $html,
73
+ 'scriptsStyles' => $scripts_styles,
74
+ 'css' => $assets['css'],
75
+ 'js' => $assets['js'],
76
  ) );
77
  }
78
 
89
  // Add the row.
90
  $row = FLBuilderModel::add_row( $cols, $position, $module );
91
 
92
+ /**
93
+ * Render the row.
94
+ * @see fl_builder_before_render_ajax_layout_html
95
+ */
96
  do_action( 'fl_builder_before_render_ajax_layout_html' );
97
  ob_start();
98
  FLBuilder::render_row( $row );
99
  $html = ob_get_clean();
100
+
101
+ /**
102
+ * After rendering row.
103
+ * @see fl_builder_after_render_ajax_layout_html
104
+ */
105
  do_action( 'fl_builder_after_render_ajax_layout_html' );
106
 
107
  // Return the response.
108
  return array(
109
+ 'partial' => true,
110
+ 'nodeType' => $row->type,
111
+ 'html' => $html,
112
+ 'js' => 'FLBuilder._renderLayoutComplete();',
113
  );
114
  }
115
 
123
  * @return array
124
  */
125
  static public function render_new_row_template( $position, $template_id, $template_type = 'user' ) {
126
+ if ( class_exists( 'FLBuilderTemplatesOverride' ) && FLBuilderTemplatesOverride::show_rows() && FLBuilderTemplatesOverride::get_source_site_id() ) {
127
+ $row = FLBuilderModel::apply_node_template( $template_id, null, $position );
128
+ } elseif ( 'core' == $template_type ) {
129
  $template = FLBuilderModel::get_template( $template_id, 'row' );
130
  $row = FLBuilderModel::apply_node_template( $template_id, null, $position, $template );
131
  } else {
167
  // Add the group.
168
  $group = FLBuilderModel::add_col_group( $node_id, $cols, $position, $module );
169
 
170
+ /**
171
+ * Render the group.
172
+ * @see fl_builder_before_render_ajax_layout_html
173
+ */
174
  do_action( 'fl_builder_before_render_ajax_layout_html' );
175
  ob_start();
176
  FLBuilder::render_column_group( $group );
177
  $html = ob_get_clean();
178
+
179
+ /**
180
+ * After rendering group.
181
+ * @see fl_builder_after_render_ajax_layout_html
182
+ */
183
  do_action( 'fl_builder_after_render_ajax_layout_html' );
184
 
185
  // Return the response.
186
  return array(
187
+ 'partial' => true,
188
+ 'nodeType' => $group->type,
189
+ 'html' => $html,
190
+ 'js' => 'FLBuilder._renderLayoutComplete();',
191
  );
192
  }
193
 
233
 
234
  // Get the node to render.
235
  if ( ! $parent ) {
236
+ $row = FLBuilderModel::get_col_parent( 'row', $column );
237
+ $render_id = $row->node;
238
  } elseif ( 'row' == $parent->type ) {
239
+ $group = FLBuilderModel::get_col_parent( 'column-group', $column );
240
+ $render_id = $group->node;
241
  } elseif ( 'column-group' == $parent->type ) {
242
+ $render_id = $parent->node;
243
  } else {
244
  $render_id = $column->node;
245
  }
301
 
302
  // Get the node to render.
303
  if ( ! $parent ) {
304
+ $row = FLBuilderModel::get_module_parent( 'row', $module );
305
+ $render_id = $row->node;
306
  } elseif ( 'row' == $parent->type ) {
307
+ $group = FLBuilderModel::get_module_parent( 'column-group', $module );
308
+ $render_id = $group->node;
309
  } elseif ( 'column-group' == $parent->type ) {
310
+ $render_id = $parent->node;
311
  } else {
312
  $render_id = $module->node;
313
  }
317
 
318
  // Return the response.
319
  return array(
320
+ 'type' => $module->settings->type,
321
+ 'nodeId' => $module->node,
322
+ 'parentId' => $module->parent,
323
+ 'global' => FLBuilderModel::is_node_global( $module ),
324
+ 'layout' => self::render( $render_id ),
325
+ 'settings' => null === $template_id && ! $alias ? null : $module->settings,
326
+ 'legacy' => FLBuilderUISettingsForms::pre_render_legacy_module_settings( $module->settings->type, $module->settings ),
327
  );
328
  }
329
 
352
  // Get the data if it's not cached.
353
  if ( ! self::$partial_refresh_data ) {
354
 
355
+ $post_data = FLBuilderModel::get_post_data();
356
  $partial_refresh = false;
357
+ $node_type = null;
358
 
359
  // Check for partial refresh if we have a node ID.
360
  if ( isset( $post_data['node_id'] ) ) {
361
 
362
  // Get the node.
363
+ $node_id = $post_data['node_id'];
364
+ $node = FLBuilderModel::get_node( $post_data['node_id'] );
365
  $node_type = null;
366
 
367
  // Check a module for partial refresh.
368
  if ( $node && 'module' == $node->type ) {
369
+ $node = FLBuilderModel::get_module( $node_id );
370
+ $node_type = 'module';
371
+ $partial_refresh = $node->partial_refresh;
372
  } elseif ( $node ) {
373
+ $node_type = $node->type;
374
+ $partial_refresh = self::node_modules_support_partial_refresh( $node );
375
  }
376
  } else {
377
+ $node_id = null;
378
+ $node = null;
379
+ $node_type = null;
380
  }
381
 
382
  // Cache the partial refresh data.
383
  self::$partial_refresh_data = array(
384
  'is_partial_refresh' => $partial_refresh,
385
+ 'node_id' => $node_id,
386
+ 'node' => $node,
387
+ 'node_type' => $node_type,
388
  );
389
  }
390
 
401
  * @return bool
402
  */
403
  static private function node_modules_support_partial_refresh( $node ) {
404
+ $nodes = FLBuilderModel::get_categorized_nodes();
405
 
406
  if ( 'row' == $node->type ) {
407
 
455
  * @return string
456
  */
457
  static private function render_html() {
458
+ /**
459
+ * Before html for layout or node is rendered.
460
+ * @see fl_builder_before_render_ajax_layout_html
461
+ */
462
  do_action( 'fl_builder_before_render_ajax_layout_html' );
463
 
464
  // Get the partial refresh data.
474
 
475
  case 'row':
476
  FLBuilder::render_row( $partial_refresh_data['node'] );
477
+ break;
478
 
479
  case 'column-group':
480
  FLBuilder::render_column_group( $partial_refresh_data['node'] );
481
+ break;
482
 
483
  case 'column':
484
  FLBuilder::render_column( $partial_refresh_data['node'] );
485
+ break;
486
 
487
  case 'module':
488
  FLBuilder::render_module( $partial_refresh_data['node'] );
489
+ break;
490
  }
491
  } else {
492
  FLBuilder::render_nodes();
507
  echo do_shortcode( $html );
508
  $html = ob_get_clean();
509
  }
510
+ /**
511
+ * After html for layout or node is rendered.
512
+ * @see fl_builder_after_render_ajax_layout_html
513
+ */
514
  do_action( 'fl_builder_after_render_ajax_layout_html' );
515
 
516
  // Return the rendered HTML.
525
  * @return array
526
  */
527
  static private function render_assets() {
528
+ $partial_refresh_data = self::get_partial_refresh_data();
529
+ $asset_info = FLBuilderModel::get_asset_info();
530
+ $asset_ver = FLBuilderModel::get_asset_version();
531
+ $enqueuemethod = FLBuilderModel::get_asset_enqueue_method();
532
+ $assets = array(
533
+ 'js' => '',
534
  'css' => '',
535
  );
536
 
547
  switch ( $partial_refresh_data['node']->type ) {
548
 
549
  case 'row':
550
+ $assets['js'] = FLBuilder::render_row_js( $partial_refresh_data['node'] );
551
  $assets['js'] .= FLBuilder::render_row_modules_js( $partial_refresh_data['node'] );
552
+ break;
553
 
554
  case 'column-group':
555
  $assets['js'] = FLBuilder::render_column_group_modules_js( $partial_refresh_data['node'] );
556
+ break;
557
 
558
  case 'column':
559
  $assets['js'] = FLBuilder::render_column_modules_js( $partial_refresh_data['node'] );
560
+ break;
561
 
562
  case 'module':
563
  $assets['js'] = FLBuilder::render_module_js( $partial_refresh_data['node'] );
564
+ break;
565
  }
566
 
567
  $assets['js'] .= 'FLBuilder._renderLayoutComplete();';
568
 
569
  try {
570
  $min = FLJSMin::minify( $assets['js'] );
571
+ } catch ( Exception $e ) {
572
+ }
573
 
574
  if ( $min ) {
575
  $assets['js'] = $min;
645
  global $wp_scripts;
646
  global $wp_styles;
647
 
648
+ $partial_refresh_data = self::get_partial_refresh_data();
649
+ $modules = array();
650
+ $scripts_styles = '';
651
 
652
  // Enqueue module font styles.
653
  if ( ! $partial_refresh_data['is_partial_refresh'] ) {
657
  foreach ( $nodes as $node ) {
658
  if ( 'module' === $node->type && isset( FLBuilderModel::$modules[ $node->settings->type ] ) ) {
659
  $node->form = FLBuilderModel::$modules[ $node->settings->type ]->form;
660
+ $modules[] = $node;
661
  }
662
  }
663
  } else {
classes/class-fl-builder-art.php CHANGED
@@ -41,73 +41,77 @@ class FLBuilderArt {
41
  $art_dir = FL_BUILDER_DIR . 'includes/shapes/';
42
 
43
  self::register_shape(array(
44
- 'label' => __( 'Slanted Edge', 'fl-builder' ),
45
- 'name' => 'edge-slant',
46
- 'width' => 422,
47
  'height' => 33.98,
48
  'render' => $art_dir . 'edge-slant.svg.php',
49
  ));
50
 
51
  self::register_shape(array(
52
- 'label' => __( 'Waves', 'fl-builder' ),
53
- 'name' => 'wavy',
54
- 'width' => 800,
55
  'height' => 102,
56
  'render' => $art_dir . 'wavy.svg.php',
57
  ));
58
 
59
  self::register_shape( array(
60
- 'label' => __( 'Midpoint', 'fl-builder' ),
61
- 'name' => 'midpoint',
62
- 'width' => 800,
63
  'height' => 50,
64
  'render' => $art_dir . 'midpoint.svg.php',
65
  ));
66
 
67
  self::register_shape( array(
68
- 'label' => __( 'Triangle', 'fl-builder' ),
69
- 'name' => 'triangle',
70
- 'width' => 50,
71
  'height' => 34,
72
  'render' => $art_dir . 'triangle.svg.php',
73
  ));
74
  self::register_shape( array(
75
- 'label' => __( 'Circle', 'fl-builder' ),
76
- 'name' => 'circle',
77
- 'width' => 100,
78
  'height' => 100,
79
  'render' => $art_dir . 'circle.svg.php',
80
  ));
81
  self::register_shape( array(
82
- 'label' => __( 'Concave', 'fl-builder' ),
83
- 'name' => 'concave',
84
- 'width' => 800,
85
  'height' => 50,
86
  'render' => $art_dir . 'concave.svg.php',
87
  ));
88
  self::register_shape( array(
89
- 'label' => __( 'Spots', 'fl-builder' ),
90
- 'name' => 'dot-cluster',
91
- 'width' => 800,
92
  'height' => 315,
93
  'render' => $art_dir . 'dot-cluster.svg.php',
94
  ));
95
  self::register_shape( array(
96
- 'label' => __( 'Topography', 'fl-builder' ),
97
- 'name' => 'topography',
98
- 'width' => 600,
99
  'height' => 600,
100
  'render' => $art_dir . 'topography.svg.php',
101
  ));
102
  self::register_shape( array(
103
- 'label' => __( 'Rectangle', 'fl-builder' ),
104
- 'name' => 'rect',
105
- 'width' => 800,
106
  'height' => 450,
107
  'render' => $art_dir . 'rect.svg.php',
108
  ));
109
 
110
- // Trigger registration process for external shapes
 
 
 
 
111
  do_action( 'fl_register_art' );
112
  }
113
 
@@ -119,33 +123,33 @@ class FLBuilderArt {
119
  */
120
  static public function register_shape( $args = array() ) {
121
  $defaults = array(
122
- 'label' => __( 'Untitled Shape', 'fl-builder' ),
123
- 'name' => 'untitled-shape',
124
- 'x' => 0,
125
- 'y' => 0,
126
- 'width' => 0,
127
- 'height' => 0,
128
  'preserve_aspect_ratio' => 'none',
129
- 'render' => '',
130
- 'preset_settings' => array(),
131
  );
132
 
133
  $args = wp_parse_args( $args, $defaults );
134
- $key = $args['name'];
135
 
136
  /**
137
  * Setup a preset to reference the shape's initial configuration later
138
  * This is so when you choose a shape, we can also setup other fields for the optimal inital appearance.
139
  */
140
  FLBuilderSettingsPresets::register( 'shape', array(
141
- 'name' => $args['name'],
142
- 'label' => $args['label'],
143
  'settings' => $args['preset_settings'],
144
- 'data' => array(
145
  'viewBox' => array(
146
- 'x' => $args['x'],
147
- 'y' => $args['y'],
148
- 'width' => $args['width'],
149
  'height' => $args['height'],
150
  ),
151
  ),
@@ -236,17 +240,17 @@ class FLBuilderArt {
236
 
237
  if ( ! empty( $settings->{'top_edge_shape'} ) ) {
238
  $layers['top'] = array(
239
- 'label' => __( 'Top Shape Layer', 'fl-builder' ),
240
- 'type' => 'shape',
241
- 'prefix' => 'top_edge_',
242
  'position' => 'top',
243
  );
244
  }
245
  if ( ! empty( $settings->{'bottom_edge_shape'} ) ) {
246
  $layers['bottom'] = array(
247
- 'label' => __( 'Bottom Shape Layer', 'fl-builder' ),
248
- 'type' => 'shape',
249
- 'prefix' => 'bottom_edge_',
250
  'position' => 'bottom',
251
  );
252
  }
@@ -294,23 +298,23 @@ class FLBuilderArt {
294
  */
295
  static public function render_node_shape_layer( $layer, $node ) {
296
 
297
- $settings = $node->settings;
298
- $id = $node->node;
299
- $position = $layer['position'];
300
- $prefix = $layer['prefix'];
301
  $shape_name = $settings->{ $prefix . 'shape' };
302
  $shape_args = self::get_art( $shape_name );
303
- $content = self::render_art( $shape_args, $settings );
304
 
305
- $x = $shape_args['x'];
306
- $y = $shape_args['y'];
307
- $width = $shape_args['width'];
308
- $height = $shape_args['height'];
309
- $view_box = "$x $y $width $height";
310
  $preserve_aspect_ratio = $shape_args['preserve_aspect_ratio'];
311
 
312
- $align = $settings->{ $prefix . 'align' };
313
- $ending = str_replace( ' ', '-', $align );
314
  $svg_class = 'fl-builder-layer-align-' . $ending;
315
  include FL_BUILDER_DIR . 'includes/shape-layer.php';
316
  }
@@ -323,8 +327,8 @@ class FLBuilderArt {
323
  */
324
  static public function get_shape_settings_sections() {
325
  $sections = array();
326
- $layers = array(
327
- 'top' => __( 'Top', 'fl-builder' ),
328
  'bottom' => __( 'Bottom', 'fl-builder' ),
329
  );
330
 
@@ -333,18 +337,18 @@ class FLBuilderArt {
333
 
334
  // Preset & Shape Section
335
  $sections[ $prefix . 'shape' ] = array(
336
- 'title' => sprintf( __( '%s Shape', 'fl-builder' ), $position_label ),
337
  'fields' => array(
338
  $prefix . 'shape' => array(
339
- 'type' => 'select',
340
- 'label' => __( 'Shape', 'fl-builder' ),
341
  'options' => 'shapes',
342
- 'hide' => array(
343
  '' => array(
344
  'sections' => array(
345
  $prefix . 'style',
346
  ),
347
- 'fields' => array(
348
  $prefix . 'size',
349
  $prefix . 'align',
350
  $prefix . 'z_pos',
@@ -352,21 +356,21 @@ class FLBuilderArt {
352
  ),
353
  ),
354
  'preview' => array(
355
- 'type' => 'callback',
356
  'callback' => 'previewShape',
357
- 'prefix' => $prefix,
358
  'position' => $position,
359
  ),
360
  ),
361
- $prefix . 'size' => array(
362
- 'type' => 'dimension',
363
- 'label' => __( 'Size', 'fl-builder' ),
364
- 'units' => array( 'px', 'vw', 'vh', '%' ),
365
- 'slider' => array(
366
- 'width' => array(
367
  'px' => array(
368
- 'min' => 0,
369
- 'max' => 5000,
370
  'step' => 10,
371
  ),
372
  'vw' => array(
@@ -377,15 +381,15 @@ class FLBuilderArt {
377
  'min' => 0,
378
  'max' => 500,
379
  ),
380
- '%' => array(
381
  'min' => 0,
382
  'max' => 300,
383
  ),
384
  ),
385
  'height' => array(
386
  'px' => array(
387
- 'min' => 0,
388
- 'max' => 2000,
389
  'step' => 10,
390
  ),
391
  'vw' => array(
@@ -396,12 +400,12 @@ class FLBuilderArt {
396
  'min' => 0,
397
  'max' => 200,
398
  ),
399
- '%' => array(
400
  'min' => 0,
401
  'max' => 100,
402
  ),
403
  ),
404
- 'top' => array(
405
  'px' => array(
406
  'min' => -500,
407
  'max' => 500,
@@ -414,43 +418,43 @@ class FLBuilderArt {
414
  'min' => -20,
415
  'max' => 20,
416
  ),
417
- '%' => array(
418
  'min' => 0,
419
  'max' => 100,
420
  ),
421
  ),
422
  ),
423
- 'keys' => array(
424
- 'width' => __( 'Width', 'fl-builder' ),
425
  'height' => __( 'Height', 'fl-builder' ),
426
- 'top' => __( 'Y Offset', 'fl-builder' ),
427
  ),
428
  'preview' => array(
429
- 'type' => 'callback',
430
  'callback' => 'previewShapeLayerSize',
431
- 'prefix' => $prefix,
432
  'position' => $position,
433
  ),
434
  ),
435
  $prefix . 'align' => array(
436
- 'type' => 'select',
437
- 'label' => __( 'Align', 'fl-builder' ),
438
  'default' => $position . ' center',
439
  'options' => array(
440
- 'top left' => __( 'Top Left', 'fl-builder' ),
441
- 'top center' => __( 'Top Center', 'fl-builder' ),
442
- 'top right' => __( 'Top Right', 'fl-builder' ),
443
- 'center left' => __( 'Center Left', 'fl-builder' ),
444
  'center center' => __( 'Center', 'fl-builder' ),
445
- 'center right' => __( 'Center Right', 'fl-builder' ),
446
- 'bottom left' => __( 'Bottom Left', 'fl-builder' ),
447
  'bottom center' => __( 'Bottom Center', 'fl-builder' ),
448
- 'bottom right' => __( 'Bottom Right', 'fl-builder' ),
449
  ),
450
  'preview' => array(
451
- 'type' => 'callback',
452
  'callback' => 'previewShapeAlign',
453
- 'prefix' => $prefix,
454
  'selector' => ".fl-builder-$position-edge-layer > *",
455
  ),
456
  ),
@@ -459,66 +463,66 @@ class FLBuilderArt {
459
 
460
  // Shape Styles
461
  $sections[ $prefix . 'style' ] = array(
462
- 'title' => sprintf( __( '%s Shape Style', 'fl-builder' ), $position_label ),
463
  'fields' => array(
464
- $prefix . 'fill_style' => array(
465
- 'type' => 'button-group',
466
  'options' => array(
467
- 'color' => __( 'Color Fill', 'fl-builder' ),
468
  'gradient' => __( 'Gradient Fill', 'fl-builder' ),
469
  ),
470
  'default' => 'color',
471
  'preview' => array(
472
- 'type' => 'callback',
473
  'callback' => 'previewShapeFillStyle',
474
  'position' => $position,
475
- 'prefix' => $prefix,
476
  'selector' => ".fl-builder-$position-edge-layer .fl-shape-content .fl-shape",
477
  ),
478
- 'toggle' => array(
479
- 'color' => array(
480
  'fields' => array(
481
- $prefix . 'fill_color'
482
  ),
483
  ),
484
  'gradient' => array(
485
  'fields' => array(
486
- $prefix . 'fill_gradient'
487
  ),
488
  ),
489
  ),
490
  ),
491
- $prefix . 'fill_color' => array(
492
- 'type' => 'color',
493
- 'connections' => array( 'color' ),
494
- 'label' => __( 'Color', 'fl-builder' ),
495
- 'show_reset' => true,
496
- 'show_alpha' => true,
497
- 'responsive' => true,
498
- 'default' => 'aaa',
499
- 'preview' => array(
500
- 'type' => 'css',
501
  'selector' => ".fl-builder-$position-edge-layer .fl-shape-content .fl-shape",
502
  'property' => 'fill',
503
  ),
504
  ),
505
  $prefix . 'fill_gradient' => array(
506
- 'type' => 'gradient',
507
- 'label' => __( 'Gradient', 'fl-builder' ),
508
  'default' => '',
509
  'preview' => array(
510
- 'type' => 'callback',
511
  'callback' => 'previewShapeGradientFill',
512
  'position' => $position,
513
- 'prefix' => $prefix,
514
  ),
515
  ),
516
 
517
- $prefix . 'transform' => array(
518
- 'type' => 'shape-transform',
519
- 'label' => __( 'Transform', 'fl-builder' ),
520
  'preview' => array(
521
- 'type' => 'callback',
522
  'callback' => 'previewShapeTransform',
523
  'selector' => ".fl-builder-$position-edge-layer",
524
  'position' => $position,
@@ -529,17 +533,17 @@ class FLBuilderArt {
529
  }
530
 
531
  $sections['shapes_container'] = array(
532
- 'title' => __( 'Shape Container', 'fl-builder' ),
533
  'fields' => array(
534
  'container_overflow' => array(
535
- 'type' => 'select',
536
- 'label' => __( 'Clip Within Container', 'fl-builder' ),
537
  'options' => array(
538
- '' => __( 'No Clip', 'fl-builder' ),
539
  'hidden' => __( 'Clip Contents', 'fl-builder' ),
540
  ),
541
  'preview' => array(
542
- 'type' => 'css',
543
  'selector' => '.fl-row-content-wrap',
544
  'property' => 'overflow',
545
  ),
@@ -557,7 +561,7 @@ class FLBuilderArt {
557
  */
558
  static public function render_shape_layers_css( $node ) {
559
  $settings = $node->settings;
560
- $id = $node->node;
561
 
562
  $layers = array( 'top', 'bottom' );
563
 
@@ -567,44 +571,44 @@ class FLBuilderArt {
567
  if ( ! empty( $settings->{ $prefix . 'shape' } ) ) {
568
 
569
  $shape_name = $settings->{ $prefix . 'shape' };
570
- $presets = FLBuilderSettingsPresets::get_presets();
571
- $preset = $presets['shape'][ $shape_name ];
572
 
573
  FLBuilderCSS::rule( array(
574
  'selector' => ".fl-node-$id .fl-builder-$position-edge-layer",
575
- 'enabled' => $settings->{ $prefix . 'size_top'} && $settings->{ $prefix . 'size_unit' },
576
- 'props' => array(
577
  $position => $settings->{ $prefix . 'size_top'} . $settings->{ $prefix . 'size_unit' },
578
  ),
579
  ) );
580
 
581
  // Width, Height & Align
582
  $shape_selector = ".fl-node-$id .fl-builder-$position-edge-layer > *";
583
- $shape_align = explode( ' ', $settings->{ $prefix . 'align' } );
584
- $align_y = $shape_align[0];
585
- $align_x = $shape_align[1];
586
- $width = $settings->{ $prefix . 'size_width'};
587
- $height = $settings->{ $prefix . 'size_height' };
588
- $size_unit = $settings->{ $prefix . 'size_unit' };
589
 
590
  // Defaults
591
  $shape_size_rule = array(
592
  'selector' => $shape_selector,
593
- 'enabled' => true,
594
- 'props' => array(),
595
  );
596
- $size_props = array(
597
- 'width' => '100%',
598
- 'left' => 'auto',
599
- 'right' => 'auto',
600
  'height' => 'auto',
601
- 'top' => 'auto',
602
  'bottom' => 'auto',
603
  );
604
 
605
  if ( ! empty( $width ) ) {
606
  $size_props['width'] = $width . $size_unit;
607
- $width_offset = ( $width / 2 ) . $size_unit;
608
 
609
  switch ( $align_x ) {
610
  case 'left':
@@ -621,12 +625,12 @@ class FLBuilderArt {
621
 
622
  $height_offset = '';
623
  if ( ! empty( $height ) ) {
624
- $height_offset = ( $height / 2 ) . $size_unit;
625
  $size_props['height'] = $height . $size_unit;
626
  } elseif ( $width ) {
627
  $view_box_height = $preset['data']['viewBox']['width'];
628
- $implied_height = ( $width / $view_box_height ) * 100;
629
- $height_offset = ( $implied_height / 2 ) . $size_unit;
630
  }
631
 
632
  switch ( $align_y ) {
@@ -635,7 +639,7 @@ class FLBuilderArt {
635
  break;
636
  case 'bottom':
637
  $size_props['bottom'] = '0';
638
- $size_props['top'] = 'auto';
639
  break;
640
  case 'center':
641
  $size_props['top'] = "calc( 50% - $height_offset )";
@@ -647,10 +651,10 @@ class FLBuilderArt {
647
 
648
  // Shape Transforms
649
 
650
- $transforms = $settings->{ $prefix . 'transform' };
651
  $layer_transforms = array();
652
  $shape_transforms = array();
653
- $sign = '';
654
  if ( ! empty( $transforms ) ) {
655
 
656
  foreach ( $transforms as $prop => $value ) {
@@ -681,14 +685,14 @@ class FLBuilderArt {
681
  $value = abs( $value );
682
  }
683
 
684
- $value = $prop . '(' . $value . ')';
685
  $shape_transforms[] = $value;
686
  break;
687
 
688
  case 'translateX':
689
  case 'translateY':
690
  if ( ! empty( $value ) ) {
691
- $value = $prop . '(' . $value . 'px)';
692
  $shape_transforms[] = $value;
693
  }
694
  break;
@@ -710,9 +714,9 @@ class FLBuilderArt {
710
  // Shape Transforms
711
  FLBuilderCSS::rule( array(
712
  'settings' => $settings,
713
- 'enabled' => ! empty( $shape_transforms ),
714
  'selector' => ".fl-node-$id .fl-builder-$position-edge-layer > *",
715
- 'props' => array(
716
  'transform' => implode( ' ', $shape_transforms ),
717
  ),
718
  ) );
@@ -724,20 +728,20 @@ class FLBuilderArt {
724
 
725
  case 'color':
726
  FLBuilderCSS::responsive_rule( array(
727
- 'settings' => $settings,
728
  'setting_name' => $prefix . 'fill_color',
729
- 'selector' => ".fl-node-$id .fl-builder-$position-edge-layer .fl-shape-content .fl-shape",
730
- 'prop' => 'fill',
731
  ) );
732
  break;
733
 
734
  case 'gradient':
735
  $gradient_type = $settings->{ $prefix . 'fill_gradient' }['type'];
736
- $gradient_id = "fl-row-$id-$prefix-$gradient_type-gradient";
737
  FLBuilderCSS::rule( array(
738
  'selector' => ".fl-node-$id .fl-builder-$position-edge-layer .fl-shape",
739
- 'enabled' => $settings->{ $prefix . 'fill_gradient' },
740
- 'props' => array(
741
  'fill' => 'url(#' . $gradient_id . ')',
742
  ),
743
  ) );
@@ -746,15 +750,15 @@ class FLBuilderArt {
746
  $pattern_id = "fl-row-$id-$prefix-pattern";
747
  FLBuilderCSS::rule( array(
748
  'selector' => ".fl-node-$id .fl-builder-$position-edge-layer .fl-shape-content .fl-shape",
749
- 'enabled' => true,
750
- 'props' => array(
751
  'fill' => 'url(#' . $pattern_id . ')',
752
  ),
753
  ) );
754
  FLBuilderCSS::rule( array(
755
  'selector' => ".fl-node-$id .fl-builder-$position-edge-layer pattern .fl-shape",
756
- 'enabled' => true,
757
- 'props' => array(
758
  'fill' => $settings->{ $prefix . 'fill_pattern_shape_color' },
759
  ),
760
  ) );
@@ -766,10 +770,10 @@ class FLBuilderArt {
766
 
767
  // Shared styles
768
  FLBuilderCSS::responsive_rule( array(
769
- 'settings' => $settings,
770
  'setting_name' => 'container_overflow',
771
- 'selector' => ".fl-node-$id .fl-row-content-wrap",
772
- 'prop' => 'overflow',
773
  ) );
774
  }
775
 
41
  $art_dir = FL_BUILDER_DIR . 'includes/shapes/';
42
 
43
  self::register_shape(array(
44
+ 'label' => __( 'Slanted Edge', 'fl-builder' ),
45
+ 'name' => 'edge-slant',
46
+ 'width' => 422,
47
  'height' => 33.98,
48
  'render' => $art_dir . 'edge-slant.svg.php',
49
  ));
50
 
51
  self::register_shape(array(
52
+ 'label' => __( 'Waves', 'fl-builder' ),
53
+ 'name' => 'wavy',
54
+ 'width' => 800,
55
  'height' => 102,
56
  'render' => $art_dir . 'wavy.svg.php',
57
  ));
58
 
59
  self::register_shape( array(
60
+ 'label' => __( 'Midpoint', 'fl-builder' ),
61
+ 'name' => 'midpoint',
62
+ 'width' => 800,
63
  'height' => 50,
64
  'render' => $art_dir . 'midpoint.svg.php',
65
  ));
66
 
67
  self::register_shape( array(
68
+ 'label' => __( 'Triangle', 'fl-builder' ),
69
+ 'name' => 'triangle',
70
+ 'width' => 50,
71
  'height' => 34,
72
  'render' => $art_dir . 'triangle.svg.php',
73
  ));
74
  self::register_shape( array(
75
+ 'label' => __( 'Circle', 'fl-builder' ),
76
+ 'name' => 'circle',
77
+ 'width' => 100,
78
  'height' => 100,
79
  'render' => $art_dir . 'circle.svg.php',
80
  ));
81
  self::register_shape( array(
82
+ 'label' => __( 'Concave', 'fl-builder' ),
83
+ 'name' => 'concave',
84
+ 'width' => 800,
85
  'height' => 50,
86
  'render' => $art_dir . 'concave.svg.php',
87
  ));
88
  self::register_shape( array(
89
+ 'label' => __( 'Spots', 'fl-builder' ),
90
+ 'name' => 'dot-cluster',
91
+ 'width' => 800,
92
  'height' => 315,
93
  'render' => $art_dir . 'dot-cluster.svg.php',
94
  ));
95
  self::register_shape( array(
96
+ 'label' => __( 'Topography', 'fl-builder' ),
97
+ 'name' => 'topography',
98
+ 'width' => 600,
99
  'height' => 600,
100
  'render' => $art_dir . 'topography.svg.php',
101
  ));
102
  self::register_shape( array(
103
+ 'label' => __( 'Rectangle', 'fl-builder' ),
104
+ 'name' => 'rect',
105
+ 'width' => 800,
106
  'height' => 450,
107
  'render' => $art_dir . 'rect.svg.php',
108
  ));
109
 
110
+ /**
111
+ * Trigger registration process for external shapes.
112
+ * @see fl_register_art
113
+ * @link https://kb.wpbeaverbuilder.com/article/687-add-custom-shape-art
114
+ */
115
  do_action( 'fl_register_art' );
116
  }
117
 
123
  */
124
  static public function register_shape( $args = array() ) {
125
  $defaults = array(
126
+ 'label' => __( 'Untitled Shape', 'fl-builder' ),
127
+ 'name' => 'untitled-shape',
128
+ 'x' => 0,
129
+ 'y' => 0,
130
+ 'width' => 0,
131
+ 'height' => 0,
132
  'preserve_aspect_ratio' => 'none',
133
+ 'render' => '',
134
+ 'preset_settings' => array(),
135
  );
136
 
137
  $args = wp_parse_args( $args, $defaults );
138
+ $key = $args['name'];
139
 
140
  /**
141
  * Setup a preset to reference the shape's initial configuration later
142
  * This is so when you choose a shape, we can also setup other fields for the optimal inital appearance.
143
  */
144
  FLBuilderSettingsPresets::register( 'shape', array(
145
+ 'name' => $args['name'],
146
+ 'label' => $args['label'],
147
  'settings' => $args['preset_settings'],
148
+ 'data' => array(
149
  'viewBox' => array(
150
+ 'x' => $args['x'],
151
+ 'y' => $args['y'],
152
+ 'width' => $args['width'],
153
  'height' => $args['height'],
154
  ),
155
  ),
240
 
241
  if ( ! empty( $settings->{'top_edge_shape'} ) ) {
242
  $layers['top'] = array(
243
+ 'label' => __( 'Top Shape Layer', 'fl-builder' ),
244
+ 'type' => 'shape',
245
+ 'prefix' => 'top_edge_',
246
  'position' => 'top',
247
  );
248
  }
249
  if ( ! empty( $settings->{'bottom_edge_shape'} ) ) {
250
  $layers['bottom'] = array(
251
+ 'label' => __( 'Bottom Shape Layer', 'fl-builder' ),
252
+ 'type' => 'shape',
253
+ 'prefix' => 'bottom_edge_',
254
  'position' => 'bottom',
255
  );
256
  }
298
  */
299
  static public function render_node_shape_layer( $layer, $node ) {
300
 
301
+ $settings = $node->settings;
302
+ $id = $node->node;
303
+ $position = $layer['position'];
304
+ $prefix = $layer['prefix'];
305
  $shape_name = $settings->{ $prefix . 'shape' };
306
  $shape_args = self::get_art( $shape_name );
307
+ $content = self::render_art( $shape_args, $settings );
308
 
309
+ $x = $shape_args['x'];
310
+ $y = $shape_args['y'];
311
+ $width = $shape_args['width'];
312
+ $height = $shape_args['height'];
313
+ $view_box = "$x $y $width $height";
314
  $preserve_aspect_ratio = $shape_args['preserve_aspect_ratio'];
315
 
316
+ $align = $settings->{ $prefix . 'align' };
317
+ $ending = str_replace( ' ', '-', $align );
318
  $svg_class = 'fl-builder-layer-align-' . $ending;
319
  include FL_BUILDER_DIR . 'includes/shape-layer.php';
320
  }
327
  */
328
  static public function get_shape_settings_sections() {
329
  $sections = array();
330
+ $layers = array(
331
+ 'top' => __( 'Top', 'fl-builder' ),
332
  'bottom' => __( 'Bottom', 'fl-builder' ),
333
  );
334
 
337
 
338
  // Preset & Shape Section
339
  $sections[ $prefix . 'shape' ] = array(
340
+ 'title' => sprintf( __( '%s Shape', 'fl-builder' ), $position_label ),
341
  'fields' => array(
342
  $prefix . 'shape' => array(
343
+ 'type' => 'select',
344
+ 'label' => __( 'Shape', 'fl-builder' ),
345
  'options' => 'shapes',
346
+ 'hide' => array(
347
  '' => array(
348
  'sections' => array(
349
  $prefix . 'style',
350
  ),
351
+ 'fields' => array(
352
  $prefix . 'size',
353
  $prefix . 'align',
354
  $prefix . 'z_pos',
356
  ),
357
  ),
358
  'preview' => array(
359
+ 'type' => 'callback',
360
  'callback' => 'previewShape',
361
+ 'prefix' => $prefix,
362
  'position' => $position,
363
  ),
364
  ),
365
+ $prefix . 'size' => array(
366
+ 'type' => 'dimension',
367
+ 'label' => __( 'Size', 'fl-builder' ),
368
+ 'units' => array( 'px', 'vw', 'vh', '%' ),
369
+ 'slider' => array(
370
+ 'width' => array(
371
  'px' => array(
372
+ 'min' => 0,
373
+ 'max' => 5000,
374
  'step' => 10,
375
  ),
376
  'vw' => array(
381
  'min' => 0,
382
  'max' => 500,
383
  ),
384
+ '%' => array(
385
  'min' => 0,
386
  'max' => 300,
387
  ),
388
  ),
389
  'height' => array(
390
  'px' => array(
391
+ 'min' => 0,
392
+ 'max' => 2000,
393
  'step' => 10,
394
  ),
395
  'vw' => array(
400
  'min' => 0,
401
  'max' => 200,
402
  ),
403
+ '%' => array(
404
  'min' => 0,
405
  'max' => 100,
406
  ),
407
  ),
408
+ 'top' => array(
409
  'px' => array(
410
  'min' => -500,
411
  'max' => 500,
418
  'min' => -20,
419
  'max' => 20,
420
  ),
421
+ '%' => array(
422
  'min' => 0,
423
  'max' => 100,
424
  ),
425
  ),
426
  ),
427
+ 'keys' => array(
428
+ 'width' => __( 'Width', 'fl-builder' ),
429
  'height' => __( 'Height', 'fl-builder' ),
430
+ 'top' => __( 'Y Offset', 'fl-builder' ),
431
  ),
432
  'preview' => array(
433
+ 'type' => 'callback',
434
  'callback' => 'previewShapeLayerSize',
435
+ 'prefix' => $prefix,
436
  'position' => $position,
437
  ),
438
  ),
439
  $prefix . 'align' => array(
440
+ 'type' => 'select',
441
+ 'label' => __( 'Align', 'fl-builder' ),
442
  'default' => $position . ' center',
443
  'options' => array(
444
+ 'top left' => __( 'Top Left', 'fl-builder' ),
445
+ 'top center' => __( 'Top Center', 'fl-builder' ),
446
+ 'top right' => __( 'Top Right', 'fl-builder' ),
447
+ 'center left' => __( 'Center Left', 'fl-builder' ),
448
  'center center' => __( 'Center', 'fl-builder' ),
449
+ 'center right' => __( 'Center Right', 'fl-builder' ),
450
+ 'bottom left' => __( 'Bottom Left', 'fl-builder' ),
451
  'bottom center' => __( 'Bottom Center', 'fl-builder' ),
452
+ 'bottom right' => __( 'Bottom Right', 'fl-builder' ),
453
  ),
454
  'preview' => array(
455
+ 'type' => 'callback',
456
  'callback' => 'previewShapeAlign',
457
+ 'prefix' => $prefix,
458
  'selector' => ".fl-builder-$position-edge-layer > *",
459
  ),
460
  ),
463
 
464
  // Shape Styles
465
  $sections[ $prefix . 'style' ] = array(
466
+ 'title' => sprintf( __( '%s Shape Style', 'fl-builder' ), $position_label ),
467
  'fields' => array(
468
+ $prefix . 'fill_style' => array(
469
+ 'type' => 'button-group',
470
  'options' => array(
471
+ 'color' => __( 'Color Fill', 'fl-builder' ),
472
  'gradient' => __( 'Gradient Fill', 'fl-builder' ),
473
  ),
474
  'default' => 'color',
475
  'preview' => array(
476
+ 'type' => 'callback',
477
  'callback' => 'previewShapeFillStyle',
478
  'position' => $position,
479
+ 'prefix' => $prefix,
480
  'selector' => ".fl-builder-$position-edge-layer .fl-shape-content .fl-shape",
481
  ),
482
+ 'toggle' => array(
483
+ 'color' => array(
484
  'fields' => array(
485
+ $prefix . 'fill_color',
486
  ),
487
  ),
488
  'gradient' => array(
489
  'fields' => array(
490
+ $prefix . 'fill_gradient',
491
  ),
492
  ),
493
  ),
494
  ),
495
+ $prefix . 'fill_color' => array(
496
+ 'type' => 'color',
497
+ 'connections' => array( 'color' ),
498
+ 'label' => __( 'Color', 'fl-builder' ),
499
+ 'show_reset' => true,
500
+ 'show_alpha' => true,
501
+ 'responsive' => true,
502
+ 'default' => 'aaa',
503
+ 'preview' => array(
504
+ 'type' => 'css',
505
  'selector' => ".fl-builder-$position-edge-layer .fl-shape-content .fl-shape",
506
  'property' => 'fill',
507
  ),
508
  ),
509
  $prefix . 'fill_gradient' => array(
510
+ 'type' => 'gradient',
511
+ 'label' => __( 'Gradient', 'fl-builder' ),
512
  'default' => '',
513
  'preview' => array(
514
+ 'type' => 'callback',
515
  'callback' => 'previewShapeGradientFill',
516
  'position' => $position,
517
+ 'prefix' => $prefix,
518
  ),
519
  ),
520
 
521
+ $prefix . 'transform' => array(
522
+ 'type' => 'shape-transform',
523
+ 'label' => __( 'Transform', 'fl-builder' ),
524
  'preview' => array(
525
+ 'type' => 'callback',
526
  'callback' => 'previewShapeTransform',
527
  'selector' => ".fl-builder-$position-edge-layer",
528
  'position' => $position,
533
  }
534
 
535
  $sections['shapes_container'] = array(
536
+ 'title' => __( 'Shape Container', 'fl-builder' ),
537
  'fields' => array(
538
  'container_overflow' => array(
539
+ 'type' => 'select',
540
+ 'label' => __( 'Clip Within Container', 'fl-builder' ),
541
  'options' => array(
542
+ '' => __( 'No Clip', 'fl-builder' ),
543
  'hidden' => __( 'Clip Contents', 'fl-builder' ),
544
  ),
545
  'preview' => array(
546
+ 'type' => 'css',
547
  'selector' => '.fl-row-content-wrap',
548
  'property' => 'overflow',
549
  ),
561
  */
562
  static public function render_shape_layers_css( $node ) {
563
  $settings = $node->settings;
564
+ $id = $node->node;
565
 
566
  $layers = array( 'top', 'bottom' );
567
 
571
  if ( ! empty( $settings->{ $prefix . 'shape' } ) ) {
572
 
573
  $shape_name = $settings->{ $prefix . 'shape' };
574
+ $presets = FLBuilderSettingsPresets::get_presets();
575
+ $preset = $presets['shape'][ $shape_name ];
576
 
577
  FLBuilderCSS::rule( array(
578
  'selector' => ".fl-node-$id .fl-builder-$position-edge-layer",
579
+ 'enabled' => $settings->{ $prefix . 'size_top'} && $settings->{ $prefix . 'size_unit' },
580
+ 'props' => array(
581
  $position => $settings->{ $prefix . 'size_top'} . $settings->{ $prefix . 'size_unit' },
582
  ),
583
  ) );
584
 
585
  // Width, Height & Align
586
  $shape_selector = ".fl-node-$id .fl-builder-$position-edge-layer > *";
587
+ $shape_align = explode( ' ', $settings->{ $prefix . 'align' } );
588
+ $align_y = $shape_align[0];
589
+ $align_x = $shape_align[1];
590
+ $width = $settings->{ $prefix . 'size_width'};
591
+ $height = $settings->{ $prefix . 'size_height' };
592
+ $size_unit = $settings->{ $prefix . 'size_unit' };
593
 
594
  // Defaults
595
  $shape_size_rule = array(
596
  'selector' => $shape_selector,
597
+ 'enabled' => true,
598
+ 'props' => array(),
599
  );
600
+ $size_props = array(
601
+ 'width' => '100%',
602
+ 'left' => 'auto',
603
+ 'right' => 'auto',
604
  'height' => 'auto',
605
+ 'top' => 'auto',
606
  'bottom' => 'auto',
607
  );
608
 
609
  if ( ! empty( $width ) ) {
610
  $size_props['width'] = $width . $size_unit;
611
+ $width_offset = ( $width / 2 ) . $size_unit;
612
 
613
  switch ( $align_x ) {
614
  case 'left':
625
 
626
  $height_offset = '';
627
  if ( ! empty( $height ) ) {
628
+ $height_offset = ( $height / 2 ) . $size_unit;
629
  $size_props['height'] = $height . $size_unit;
630
  } elseif ( $width ) {
631
  $view_box_height = $preset['data']['viewBox']['width'];
632
+ $implied_height = ( $width / $view_box_height ) * 100;
633
+ $height_offset = ( $implied_height / 2 ) . $size_unit;
634
  }
635
 
636
  switch ( $align_y ) {
639
  break;
640
  case 'bottom':
641
  $size_props['bottom'] = '0';
642
+ $size_props['top'] = 'auto';
643
  break;
644
  case 'center':
645
  $size_props['top'] = "calc( 50% - $height_offset )";
651
 
652
  // Shape Transforms
653
 
654
+ $transforms = $settings->{ $prefix . 'transform' };
655
  $layer_transforms = array();
656
  $shape_transforms = array();
657
+ $sign = '';
658
  if ( ! empty( $transforms ) ) {
659
 
660
  foreach ( $transforms as $prop => $value ) {
685
  $value = abs( $value );
686
  }
687
 
688
+ $value = $prop . '(' . $value . ')';
689
  $shape_transforms[] = $value;
690
  break;
691
 
692
  case 'translateX':
693
  case 'translateY':
694
  if ( ! empty( $value ) ) {
695
+ $value = $prop . '(' . $value . 'px)';
696
  $shape_transforms[] = $value;
697
  }
698
  break;
714
  // Shape Transforms
715
  FLBuilderCSS::rule( array(
716
  'settings' => $settings,
717
+ 'enabled' => ! empty( $shape_transforms ),
718
  'selector' => ".fl-node-$id .fl-builder-$position-edge-layer > *",
719
+ 'props' => array(
720
  'transform' => implode( ' ', $shape_transforms ),
721
  ),
722
  ) );
728
 
729
  case 'color':
730
  FLBuilderCSS::responsive_rule( array(
731
+ 'settings' => $settings,
732
  'setting_name' => $prefix . 'fill_color',
733
+ 'selector' => ".fl-node-$id .fl-builder-$position-edge-layer .fl-shape-content .fl-shape",
734
+ 'prop' => 'fill',
735
  ) );
736
  break;
737
 
738
  case 'gradient':
739
  $gradient_type = $settings->{ $prefix . 'fill_gradient' }['type'];
740
+ $gradient_id = "fl-row-$id-$prefix-$gradient_type-gradient";
741
  FLBuilderCSS::rule( array(
742
  'selector' => ".fl-node-$id .fl-builder-$position-edge-layer .fl-shape",
743
+ 'enabled' => $settings->{ $prefix . 'fill_gradient' },
744
+ 'props' => array(
745
  'fill' => 'url(#' . $gradient_id . ')',
746
  ),
747
  ) );
750
  $pattern_id = "fl-row-$id-$prefix-pattern";
751
  FLBuilderCSS::rule( array(
752
  'selector' => ".fl-node-$id .fl-builder-$position-edge-layer .fl-shape-content .fl-shape",
753
+ 'enabled' => true,
754
+ 'props' => array(
755
  'fill' => 'url(#' . $pattern_id . ')',
756
  ),
757
  ) );
758
  FLBuilderCSS::rule( array(
759
  'selector' => ".fl-node-$id .fl-builder-$position-edge-layer pattern .fl-shape",
760
+ 'enabled' => true,
761
+ 'props' => array(
762
  'fill' => $settings->{ $prefix . 'fill_pattern_shape_color' },
763
  ),
764
  ) );
770
 
771
  // Shared styles
772
  FLBuilderCSS::responsive_rule( array(
773
+ 'settings' => $settings,
774
  'setting_name' => 'container_overflow',
775
+ 'selector' => ".fl-node-$id .fl-row-content-wrap",
776
+ 'prop' => 'overflow',
777
  ) );
778
  }
779
 
classes/class-fl-builder-auto-suggest.php CHANGED
@@ -21,19 +21,19 @@ final class FLBuilderAutoSuggest {
21
 
22
  case 'fl_as_posts':
23
  $data = self::posts();
24
- break;
25
 
26
  case 'fl_as_terms':
27
  $data = self::terms();
28
- break;
29
 
30
  case 'fl_as_users':
31
  $data = self::users();
32
- break;
33
 
34
  case 'fl_as_links':
35
  $data = self::links();
36
- break;
37
  }
38
 
39
  if ( isset( $data ) ) {
@@ -56,23 +56,22 @@ final class FLBuilderAutoSuggest {
56
 
57
  case 'fl_as_posts':
58
  $data = self::posts_value( $value );
59
- break;
60
 
61
  case 'fl_as_terms':
62
  $data = self::terms_value( $value, $data );
63
- break;
64
 
65
  case 'fl_as_users':
66
  $data = self::users_value( $value );
67
- break;
68
-
69
- default :
70
 
 
71
  if ( function_exists( $action . '_value' ) ) {
72
  $data = call_user_func_array( $action . '_value', array( $value, $data ) );
73
  }
74
 
75
- break;
76
  }
77
 
78
  return isset( $data ) ? str_replace( "'", '&#39;', json_encode( $data ) ) : '';
@@ -124,9 +123,9 @@ final class FLBuilderAutoSuggest {
124
  static public function posts() {
125
  global $wpdb;
126
 
127
- $data = array();
128
- $like = self::get_like();
129
- $types = explode( ',', esc_sql( $_REQUEST['fl_as_action_data'] ) );
130
  $types_in = join( "', '", array_map( 'esc_sql', $types ) );
131
 
132
  // @codingStandardsIgnoreStart
@@ -140,7 +139,7 @@ final class FLBuilderAutoSuggest {
140
 
141
  foreach ( $posts as $post ) {
142
  $data[] = array(
143
- 'name' => $post->post_title,
144
  'value' => $post->ID,
145
  );
146
  }
@@ -162,11 +161,11 @@ final class FLBuilderAutoSuggest {
162
 
163
  if ( ! empty( $ids ) ) {
164
 
165
- $order = implode( ',', array_filter( explode( ',', $ids ), 'intval' ) );
166
- $list = explode( ',', $ids );
167
- $how_many = count( $list );
168
  $placeholders = array_fill( 0, $how_many, '%d' );
169
- $format = implode( ', ', $placeholders );
170
 
171
  $query = "SELECT ID, post_title FROM {$wpdb->posts} WHERE ID IN ($format) ORDER BY FIELD(ID, $order)";
172
 
@@ -176,7 +175,7 @@ final class FLBuilderAutoSuggest {
176
 
177
  foreach ( $posts as $post ) {
178
  $data[] = array(
179
- 'name' => $post->post_title,
180
  'value' => $post->ID,
181
  );
182
  }
@@ -195,12 +194,12 @@ final class FLBuilderAutoSuggest {
195
  $data = array();
196
  $cats = get_categories(array(
197
  'hide_empty' => 0,
198
- 'taxonomy' => $_REQUEST['fl_as_action_data'],
199
  ));
200
 
201
  foreach ( $cats as $cat ) {
202
  $data[] = array(
203
- 'name' => $cat->name,
204
  'value' => $cat->term_id,
205
  );
206
  }
@@ -223,13 +222,13 @@ final class FLBuilderAutoSuggest {
223
 
224
  $cats = get_categories(array(
225
  'hide_empty' => 0,
226
- 'taxonomy' => $taxonomy,
227
- 'include' => $ids,
228
  ));
229
 
230
  foreach ( $cats as $cat ) {
231
  $data[] = array(
232
- 'name' => $cat->name,
233
  'value' => $cat->term_id,
234
  );
235
  }
@@ -253,7 +252,7 @@ final class FLBuilderAutoSuggest {
253
 
254
  foreach ( $users as $user ) {
255
  $data[] = array(
256
- 'name' => $user->user_login,
257
  'value' => $user->ID,
258
  );
259
  }
@@ -275,10 +274,10 @@ final class FLBuilderAutoSuggest {
275
 
276
  if ( ! empty( $ids ) ) {
277
 
278
- $list = explode( ',', $ids );
279
- $how_many = count( $list );
280
  $placeholders = array_fill( 0, $how_many, '%d' );
281
- $format = implode( ', ', $placeholders );
282
 
283
  $query = "SELECT * FROM {$wpdb->users} WHERE ID IN ($format)";
284
 
@@ -288,7 +287,7 @@ final class FLBuilderAutoSuggest {
288
 
289
  foreach ( $users as $user ) {
290
  $data[] = array(
291
- 'name' => $user->user_login,
292
  'value' => $user->ID,
293
  );
294
  }
@@ -305,10 +304,10 @@ final class FLBuilderAutoSuggest {
305
  static public function links() {
306
  global $wpdb;
307
 
308
- $data = array();
309
- $like = self::get_like();
310
- $types = FLBuilderLoop::post_types();
311
- $slugs = array();
312
 
313
  foreach ( $types as $slug => $type ) {
314
  $slugs[] = esc_sql( $slug );
@@ -328,7 +327,7 @@ final class FLBuilderAutoSuggest {
328
 
329
  foreach ( $posts as $post ) {
330
  $data[] = array(
331
- 'name' => $post->post_title,
332
  'value' => get_permalink( $post->ID ),
333
  );
334
  }
21
 
22
  case 'fl_as_posts':
23
  $data = self::posts();
24
+ break;
25
 
26
  case 'fl_as_terms':
27
  $data = self::terms();
28
+ break;
29
 
30
  case 'fl_as_users':
31
  $data = self::users();
32
+ break;
33
 
34
  case 'fl_as_links':
35
  $data = self::links();
36
+ break;
37
  }
38
 
39
  if ( isset( $data ) ) {
56
 
57
  case 'fl_as_posts':
58
  $data = self::posts_value( $value );
59
+ break;
60
 
61
  case 'fl_as_terms':
62
  $data = self::terms_value( $value, $data );
63
+ break;
64
 
65
  case 'fl_as_users':
66
  $data = self::users_value( $value );
67
+ break;
 
 
68
 
69
+ default:
70
  if ( function_exists( $action . '_value' ) ) {
71
  $data = call_user_func_array( $action . '_value', array( $value, $data ) );
72
  }
73
 
74
+ break;
75
  }
76
 
77
  return isset( $data ) ? str_replace( "'", '&#39;', json_encode( $data ) ) : '';
123
  static public function posts() {
124
  global $wpdb;
125
 
126
+ $data = array();
127
+ $like = self::get_like();
128
+ $types = explode( ',', esc_sql( $_REQUEST['fl_as_action_data'] ) );
129
  $types_in = join( "', '", array_map( 'esc_sql', $types ) );
130
 
131
  // @codingStandardsIgnoreStart
139
 
140
  foreach ( $posts as $post ) {
141
  $data[] = array(
142
+ 'name' => $post->post_title,
143
  'value' => $post->ID,
144
  );
145
  }
161
 
162
  if ( ! empty( $ids ) ) {
163
 
164
+ $order = implode( ',', array_filter( explode( ',', $ids ), 'intval' ) );
165
+ $list = explode( ',', $ids );
166
+ $how_many = count( $list );
167
  $placeholders = array_fill( 0, $how_many, '%d' );
168
+ $format = implode( ', ', $placeholders );
169
 
170
  $query = "SELECT ID, post_title FROM {$wpdb->posts} WHERE ID IN ($format) ORDER BY FIELD(ID, $order)";
171
 
175
 
176
  foreach ( $posts as $post ) {
177
  $data[] = array(
178
+ 'name' => $post->post_title,
179
  'value' => $post->ID,
180
  );
181
  }
194
  $data = array();
195
  $cats = get_categories(array(
196
  'hide_empty' => 0,
197
+ 'taxonomy' => $_REQUEST['fl_as_action_data'],
198
  ));
199
 
200
  foreach ( $cats as $cat ) {
201
  $data[] = array(
202
+ 'name' => $cat->name,
203
  'value' => $cat->term_id,
204
  );
205
  }
222
 
223
  $cats = get_categories(array(
224
  'hide_empty' => 0,
225
+ 'taxonomy' => $taxonomy,
226
+ 'include' => $ids,
227
  ));
228
 
229
  foreach ( $cats as $cat ) {
230
  $data[] = array(
231
+ 'name' => $cat->name,
232
  'value' => $cat->term_id,
233
  );
234
  }
252
 
253
  foreach ( $users as $user ) {
254
  $data[] = array(
255
+ 'name' => $user->user_login,
256
  'value' => $user->ID,
257
  );
258
  }
274
 
275
  if ( ! empty( $ids ) ) {
276
 
277
+ $list = explode( ',', $ids );
278
+ $how_many = count( $list );
279
  $placeholders = array_fill( 0, $how_many, '%d' );
280
+ $format = implode( ', ', $placeholders );
281
 
282
  $query = "SELECT * FROM {$wpdb->users} WHERE ID IN ($format)";
283
 
287
 
288
  foreach ( $users as $user ) {
289
  $data[] = array(
290
+ 'name' => $user->user_login,
291
  'value' => $user->ID,
292
  );
293
  }
304
  static public function links() {
305
  global $wpdb;
306
 
307
+ $data = array();
308
+ $like = self::get_like();
309
+ $types = FLBuilderLoop::post_types();
310
+ $slugs = array();
311
 
312
  foreach ( $types as $slug => $type ) {
313
  $slugs[] = esc_sql( $slug );
327
 
328
  foreach ( $posts as $post ) {
329
  $data[] = array(
330
+ 'name' => $post->post_title,
331
  'value' => get_permalink( $post->ID ),
332
  );
333
  }
classes/class-fl-builder-color.php CHANGED
@@ -63,15 +63,15 @@ final class FLBuilderColor {
63
  // Get rgb vars.
64
  if ( $is_rgb ) {
65
  $rgb = explode( ',', preg_replace( '/[a-z\(\)]/', '', $value ) );
66
- $r = $rgb[0];
67
- $g = $rgb[1];
68
- $b = $rgb[2];
69
- $a = count( $rgb ) > 3 ? $rgb[3] : false;
70
  } else {
71
  $rgb = self::hex_to_rgb( $value );
72
- $r = $rgb['r'];
73
- $g = $rgb['g'];
74
- $b = $rgb['b'];
75
  }
76
 
77
  // Should we darken the color?
@@ -83,9 +83,9 @@ final class FLBuilderColor {
83
 
84
  // Adjustr the rgb values.
85
  $steps = max( -255, min( 255, $steps ) );
86
- $r = max( 0, min( 255, $r + $steps ) );
87
- $g = max( 0, min( 255, $g + $steps ) );
88
- $b = max( 0, min( 255, $b + $steps ) );
89
 
90
  // Return the adjusted color value.
91
  if ( $is_rgb ) {
@@ -110,7 +110,7 @@ final class FLBuilderColor {
110
  */
111
  static public function gradient( $setting ) {
112
  $gradient = '';
113
- $values = array();
114
 
115
  if ( ! is_array( $setting ) ) {
116
  return $gradient;
@@ -175,7 +175,7 @@ final class FLBuilderColor {
175
  $setting['color'] = '#' . $setting['color'];
176
  }
177
 
178
- $shadow = $setting['horizontal'] . 'px ';
179
  $shadow .= $setting['vertical'] . 'px ';
180
  $shadow .= $setting['blur'] . 'px ';
181
 
@@ -202,25 +202,25 @@ final class FLBuilderColor {
202
  // Get rgb vars.
203
  if ( $is_rgb ) {
204
  $rgb = explode( ',', preg_replace( '/[a-z\(\)]/', '', $value ) );
205
- $r = $rgb[0];
206
- $g = $rgb[1];
207
- $b = $rgb[2];
208
- $a = count( $rgb ) > 3 ? $rgb[3] : false;
209
  } else {
210
  $rgb = self::hex_to_rgb( $value );
211
- $r = $rgb['r'];
212
- $g = $rgb['g'];
213
- $b = $rgb['b'];
214
- $a = 1;
215
  }
216
  if ( count( $rgb ) === 4 ) {
217
  $rgb = array_slice( $rgb, 0, 3 );
218
  }
219
  return array(
220
- 'r' => $r,
221
- 'g' => $g,
222
- 'b' => $b,
223
- 'a' => $a,
224
  'rgb' => 'rgb(' . implode( ',', $rgb ) . ')',
225
  );
226
  }
63
  // Get rgb vars.
64
  if ( $is_rgb ) {
65
  $rgb = explode( ',', preg_replace( '/[a-z\(\)]/', '', $value ) );
66
+ $r = $rgb[0];
67
+ $g = $rgb[1];
68
+ $b = $rgb[2];
69
+ $a = count( $rgb ) > 3 ? $rgb[3] : false;
70
  } else {
71
  $rgb = self::hex_to_rgb( $value );
72
+ $r = $rgb['r'];
73
+ $g = $rgb['g'];
74
+ $b = $rgb['b'];
75
  }
76
 
77
  // Should we darken the color?
83
 
84
  // Adjustr the rgb values.
85
  $steps = max( -255, min( 255, $steps ) );
86
+ $r = max( 0, min( 255, $r + $steps ) );
87
+ $g = max( 0, min( 255, $g + $steps ) );
88
+ $b = max( 0, min( 255, $b + $steps ) );
89
 
90
  // Return the adjusted color value.
91
  if ( $is_rgb ) {
110
  */
111
  static public function gradient( $setting ) {
112
  $gradient = '';
113
+ $values = array();
114
 
115
  if ( ! is_array( $setting ) ) {
116
  return $gradient;
175
  $setting['color'] = '#' . $setting['color'];
176
  }
177
 
178
+ $shadow = $setting['horizontal'] . 'px ';
179
  $shadow .= $setting['vertical'] . 'px ';
180
  $shadow .= $setting['blur'] . 'px ';
181
 
202
  // Get rgb vars.
203
  if ( $is_rgb ) {
204
  $rgb = explode( ',', preg_replace( '/[a-z\(\)]/', '', $value ) );
205
+ $r = $rgb[0];
206
+ $g = $rgb[1];
207
+ $b = $rgb[2];
208
+ $a = count( $rgb ) > 3 ? $rgb[3] : false;
209
  } else {
210
  $rgb = self::hex_to_rgb( $value );
211
+ $r = $rgb['r'];
212
+ $g = $rgb['g'];
213
+ $b = $rgb['b'];
214
+ $a = 1;
215
  }
216
  if ( count( $rgb ) === 4 ) {
217
  $rgb = array_slice( $rgb, 0, 3 );
218
  }
219
  return array(
220
+ 'r' => $r,
221
+ 'g' => $g,
222
+ 'b' => $b,
223
+ 'a' => $a,
224
  'rgb' => 'rgb(' . implode( ',', $rgb ) . ')',
225
  );
226
  }
classes/class-fl-builder-css.php CHANGED
@@ -35,29 +35,29 @@ final class FLBuilderCSS {
35
  * @return void
36
  */
37
  static public function responsive_rule( $args = array() ) {
38
- $global_settings = FLBuilderModel::get_global_settings();
39
- $default_args = array(
40
- 'settings' => null,
41
- 'setting_name' => '',
42
  'setting_base_name' => '',
43
- 'selector' => '',
44
- 'prop' => '',
45
- 'props' => array(),
46
- 'unit' => '',
47
- 'enabled' => true,
48
  'ignore' => array(),
49
  );
50
- $args = wp_parse_args( $args, $default_args );
51
- $settings = $args['settings'];
52
- $setting_name = $args['setting_name'];
53
  $setting_base_name = $args['setting_base_name'];
54
- $selector = $args['selector'];
55
- $prop = $args['prop'];
56
- $props = $args['props'];
57
- $default_unit = $args['unit'];
58
- $enabled = $args['enabled'];
59
- $breakpoints = array( '', 'medium', 'responsive' );
60
- $ignore = $args['ignore'];
61
 
62
  if ( ! $settings || empty( $setting_name ) || empty( $selector ) ) {
63
  return;
@@ -69,10 +69,10 @@ final class FLBuilderCSS {
69
  continue;
70
  }
71
 
72
- $suffix = empty( $breakpoint ) ? '' : "_{$breakpoint}";
73
- $name = $setting_name . $suffix;
74
  $base_name = empty( $setting_base_name ) ? $name : $setting_base_name . $suffix;
75
- $setting = isset( $settings->{$name} ) ? $settings->{$name} : null;
76
 
77
  if ( null === $setting ) {
78
  continue;
@@ -83,14 +83,14 @@ final class FLBuilderCSS {
83
  if ( ! empty( $prop ) ) {
84
  $props[ $prop ] = array(
85
  'value' => $setting,
86
- 'unit' => FLBuilderCSS::get_unit( $base_name, $settings, $default_unit ),
87
  );
88
  }
89
 
90
  self::$rules[] = array(
91
- 'media' => $breakpoint,
92
  'selector' => $selector,
93
- 'props' => $props,
94
  );
95
  }
96
  }
@@ -104,18 +104,18 @@ final class FLBuilderCSS {
104
  * @return void
105
  */
106
  static public function dimension_field_rule( $args = array() ) {
107
- $args = wp_parse_args( $args, array(
108
- 'settings' => null,
109
- 'setting_name' => '',
110
- 'selector' => '',
111
- 'props' => array(),
112
- 'unit' => '',
113
  ) );
114
- $settings = $args['settings'];
115
  $setting_base_name = $args['setting_name'];
116
- $selector = $args['selector'];
117
- $props = $args['props'];
118
- $unit = $args['unit'];
119
 
120
  if ( ! $settings || empty( $setting_base_name ) || empty( $selector ) ) {
121
  return;
@@ -123,12 +123,12 @@ final class FLBuilderCSS {
123
 
124
  foreach ( $props as $prop => $settings_name ) {
125
  $rules = self::responsive_rule( array(
126
- 'settings' => $settings,
127
- 'setting_name' => $settings_name,
128
  'setting_base_name' => $setting_base_name,
129
- 'selector' => $selector,
130
- 'prop' => $prop,
131
- 'unit' => $unit,
132
  ) );
133
 
134
  if ( ! empty( $rules ) ) {
@@ -146,17 +146,17 @@ final class FLBuilderCSS {
146
  */
147
  static public function compound_field_rule( $args = array() ) {
148
  $global_settings = FLBuilderModel::get_global_settings();
149
- $args = wp_parse_args( $args, array(
150
- 'type' => '',
151
- 'selector' => '',
152
- 'settings' => null,
153
- 'setting_name' => '',
154
  ) );
155
- $type = $args['type'];
156
- $selector = $args['selector'];
157
- $settings = $args['settings'];
158
- $setting_name = $args['setting_name'];
159
- $breakpoints = array( '', 'medium', 'responsive' );
160
 
161
  if ( empty( $type ) || empty( $selector ) || ! $settings || empty( $setting_name ) ) {
162
  return;
@@ -168,10 +168,10 @@ final class FLBuilderCSS {
168
  continue;
169
  }
170
 
171
- $name = empty( $breakpoint ) ? $setting_name : "{$setting_name}_{$breakpoint}";
172
- $setting = isset( $settings->{$name} ) ? $settings->{$name} : null;
173
  $callback = "{$type}_field_props";
174
- $props = array();
175
 
176
  // Settings must be an array. Settings in nested forms can become objects when encoded.
177
  if ( is_object( $setting ) ) {
@@ -191,9 +191,9 @@ final class FLBuilderCSS {
191
  }
192
 
193
  self::$rules[] = array(
194
- 'media' => $breakpoint,
195
  'selector' => $selector,
196
- 'props' => $props,
197
  );
198
  }
199
  }
@@ -221,8 +221,8 @@ final class FLBuilderCSS {
221
  $props = array();
222
 
223
  if ( isset( $setting['style'] ) && ! empty( $setting['style'] ) ) {
224
- $props['border-style'] = $setting['style'];
225
- $props['border-width'] = '0'; // Default to zero.
226
  $props['background-clip'] = 'padding-box';
227
  }
228
  if ( isset( $setting['color'] ) && ! empty( $setting['color'] ) ) {
@@ -283,7 +283,8 @@ final class FLBuilderCSS {
283
  * @return array
284
  */
285
  static public function typography_field_props( $setting = array() ) {
286
- $props = array();
 
287
 
288
  if ( isset( $setting['font_family'] ) && 'Default' !== $setting['font_family'] ) {
289
  $fallback = FLBuilderFonts::get_font_fallback( $setting['font_family'] );
@@ -297,7 +298,11 @@ final class FLBuilderCSS {
297
  $props['font-weight'] = $setting['font_weight'];
298
  }
299
  if ( isset( $setting['font_size'] ) && ! empty( $setting['font_size']['length'] ) ) {
300
- $props['font-size'] = $setting['font_size']['length'] . $setting['font_size']['unit'];
 
 
 
 
301
  }
302
  if ( isset( $setting['line_height'] ) && ! empty( $setting['line_height']['length'] ) ) {
303
  $props['line-height'] = $setting['line_height']['length'] . $setting['line_height']['unit'];
@@ -336,20 +341,20 @@ final class FLBuilderCSS {
336
  */
337
  static public function render() {
338
  $rendered = array();
339
- $css = '';
340
 
341
  foreach ( self::$rules as $args ) {
342
  $defaults = array(
343
- 'media' => '',
344
  'selector' => '',
345
- 'enabled' => true,
346
- 'props' => array(),
347
  );
348
 
349
- $args = array_merge( $defaults, $args );
350
- $media = self::media_value( $args['media'] );
351
  $selector = $args['selector'];
352
- $props = self::properties( $args['props'] );
353
 
354
  if ( ! $args['enabled'] || empty( $selector ) || empty( $props ) ) {
355
  continue;
@@ -370,7 +375,7 @@ final class FLBuilderCSS {
370
 
371
  if ( ! empty( $media ) ) {
372
  $css .= "@media($media) {\n";
373
- $tab = "\t";
374
  } else {
375
  $tab = '';
376
  }
@@ -401,10 +406,10 @@ final class FLBuilderCSS {
401
  * @return string
402
  */
403
  static public function properties( $props ) {
404
- $css = '';
405
  $defaults = array(
406
- 'value' => '',
407
- 'unit' => '',
408
  'enabled' => true,
409
  );
410
 
@@ -416,9 +421,9 @@ final class FLBuilderCSS {
416
  );
417
  }
418
 
419
- $args = array_merge( $defaults, $args );
420
  $value = $args['value'];
421
- $type = self::property_type( $name );
422
 
423
  if ( '' === $value || ! $args['enabled'] ) {
424
  continue;
@@ -432,12 +437,12 @@ final class FLBuilderCSS {
432
  } else {
433
  $css .= "\t$name: #$value;\n";
434
  if ( isset( $args['opacity'] ) && '' !== $args['opacity'] ) {
435
- $rgb = implode( ',', FLBuilderColor::hex_to_rgb( $value ) );
436
- $a = $args['opacity'] / 100;
437
  $css .= "\t$name: rgba($rgb,$a);\n";
438
  }
439
  }
440
- break;
441
 
442
  case 'image':
443
  if ( stristr( $value, 'gradient(' ) ) {
@@ -445,7 +450,7 @@ final class FLBuilderCSS {
445
  } else {
446
  $css .= "\t$name: url($value);\n";
447
  }
448
- break;
449
 
450
  default:
451
  $css .= "\t$name: $value";
35
  * @return void
36
  */
37
  static public function responsive_rule( $args = array() ) {
38
+ $global_settings = FLBuilderModel::get_global_settings();
39
+ $default_args = array(
40
+ 'settings' => null,
41
+ 'setting_name' => '',
42
  'setting_base_name' => '',
43
+ 'selector' => '',
44
+ 'prop' => '',
45
+ 'props' => array(),
46
+ 'unit' => '',
47
+ 'enabled' => true,
48
  'ignore' => array(),
49
  );
50
+ $args = wp_parse_args( $args, $default_args );
51
+ $settings = $args['settings'];
52
+ $setting_name = $args['setting_name'];
53
  $setting_base_name = $args['setting_base_name'];
54
+ $selector = $args['selector'];
55
+ $prop = $args['prop'];
56
+ $props = $args['props'];
57
+ $default_unit = $args['unit'];
58
+ $enabled = $args['enabled'];
59
+ $breakpoints = array( '', 'medium', 'responsive' );
60
+ $ignore = $args['ignore'];
61
 
62
  if ( ! $settings || empty( $setting_name ) || empty( $selector ) ) {
63
  return;
69
  continue;
70
  }
71
 
72
+ $suffix = empty( $breakpoint ) ? '' : "_{$breakpoint}";
73
+ $name = $setting_name . $suffix;
74
  $base_name = empty( $setting_base_name ) ? $name : $setting_base_name . $suffix;
75
+ $setting = isset( $settings->{$name} ) ? $settings->{$name} : null;
76
 
77
  if ( null === $setting ) {
78
  continue;
83
  if ( ! empty( $prop ) ) {
84
  $props[ $prop ] = array(
85
  'value' => $setting,
86
+ 'unit' => FLBuilderCSS::get_unit( $base_name, $settings, $default_unit ),
87
  );
88
  }
89
 
90
  self::$rules[] = array(
91
+ 'media' => $breakpoint,
92
  'selector' => $selector,
93
+ 'props' => $props,
94
  );
95
  }
96
  }
104
  * @return void
105
  */
106
  static public function dimension_field_rule( $args = array() ) {
107
+ $args = wp_parse_args( $args, array(
108
+ 'settings' => null,
109
+ 'setting_name' => '',
110
+ 'selector' => '',
111
+ 'props' => array(),
112
+ 'unit' => '',
113
  ) );
114
+ $settings = $args['settings'];
115
  $setting_base_name = $args['setting_name'];
116
+ $selector = $args['selector'];
117
+ $props = $args['props'];
118
+ $unit = $args['unit'];
119
 
120
  if ( ! $settings || empty( $setting_base_name ) || empty( $selector ) ) {
121
  return;
123
 
124
  foreach ( $props as $prop => $settings_name ) {
125
  $rules = self::responsive_rule( array(
126
+ 'settings' => $settings,
127
+ 'setting_name' => $settings_name,
128
  'setting_base_name' => $setting_base_name,
129
+ 'selector' => $selector,
130
+ 'prop' => $prop,
131
+ 'unit' => $unit,
132
  ) );
133
 
134
  if ( ! empty( $rules ) ) {
146
  */
147
  static public function compound_field_rule( $args = array() ) {
148
  $global_settings = FLBuilderModel::get_global_settings();
149
+ $args = wp_parse_args( $args, array(
150
+ 'type' => '',
151
+ 'selector' => '',
152
+ 'settings' => null,
153
+ 'setting_name' => '',
154
  ) );
155
+ $type = $args['type'];
156
+ $selector = $args['selector'];
157
+ $settings = $args['settings'];
158
+ $setting_name = $args['setting_name'];
159
+ $breakpoints = array( '', 'medium', 'responsive' );
160
 
161
  if ( empty( $type ) || empty( $selector ) || ! $settings || empty( $setting_name ) ) {
162
  return;
168
  continue;
169
  }
170
 
171
+ $name = empty( $breakpoint ) ? $setting_name : "{$setting_name}_{$breakpoint}";
172
+ $setting = isset( $settings->{$name} ) ? $settings->{$name} : null;
173
  $callback = "{$type}_field_props";
174
+ $props = array();
175
 
176
  // Settings must be an array. Settings in nested forms can become objects when encoded.
177
  if ( is_object( $setting ) ) {
191
  }
192
 
193
  self::$rules[] = array(
194
+ 'media' => $breakpoint,
195
  'selector' => $selector,
196
+ 'props' => $props,
197
  );
198
  }
199
  }
221
  $props = array();
222
 
223
  if ( isset( $setting['style'] ) && ! empty( $setting['style'] ) ) {
224
+ $props['border-style'] = $setting['style'];
225
+ $props['border-width'] = '0'; // Default to zero.
226
  $props['background-clip'] = 'padding-box';
227
  }
228
  if ( isset( $setting['color'] ) && ! empty( $setting['color'] ) ) {
283
  * @return array
284
  */
285
  static public function typography_field_props( $setting = array() ) {
286
+ $props = array();
287
+ $settings = FLBuilderModel::get_global_settings();
288
 
289
  if ( isset( $setting['font_family'] ) && 'Default' !== $setting['font_family'] ) {
290
  $fallback = FLBuilderFonts::get_font_fallback( $setting['font_family'] );
298
  $props['font-weight'] = $setting['font_weight'];
299
  }
300
  if ( isset( $setting['font_size'] ) && ! empty( $setting['font_size']['length'] ) ) {
301
+ if ( 'vw' == $setting['font_size']['unit'] && isset( $settings->responsive_base_fontsize ) ) {
302
+ $props['font-size'] = sprintf( 'calc(%spx + %svw)', $settings->responsive_base_fontsize, $setting['font_size']['length'] );
303
+ } else {
304
+ $props['font-size'] = $setting['font_size']['length'] . $setting['font_size']['unit'];
305
+ }
306
  }
307
  if ( isset( $setting['line_height'] ) && ! empty( $setting['line_height']['length'] ) ) {
308
  $props['line-height'] = $setting['line_height']['length'] . $setting['line_height']['unit'];
341
  */
342
  static public function render() {
343
  $rendered = array();
344
+ $css = '';
345
 
346
  foreach ( self::$rules as $args ) {
347
  $defaults = array(
348
+ 'media' => '',
349
  'selector' => '',
350
+ 'enabled' => true,
351
+ 'props' => array(),
352
  );
353
 
354
+ $args = array_merge( $defaults, $args );
355
+ $media = self::media_value( $args['media'] );
356
  $selector = $args['selector'];
357
+ $props = self::properties( $args['props'] );
358
 
359
  if ( ! $args['enabled'] || empty( $selector ) || empty( $props ) ) {
360
  continue;
375
 
376
  if ( ! empty( $media ) ) {
377
  $css .= "@media($media) {\n";
378
+ $tab = "\t";
379
  } else {
380
  $tab = '';
381
  }
406
  * @return string
407
  */
408
  static public function properties( $props ) {
409
+ $css = '';
410
  $defaults = array(
411
+ 'value' => '',
412
+ 'unit' => '',
413
  'enabled' => true,
414
  );
415
 
421
  );
422
  }
423
 
424
+ $args = array_merge( $defaults, $args );
425
  $value = $args['value'];
426
+ $type = self::property_type( $name );
427
 
428
  if ( '' === $value || ! $args['enabled'] ) {
429
  continue;
437
  } else {
438
  $css .= "\t$name: #$value;\n";
439
  if ( isset( $args['opacity'] ) && '' !== $args['opacity'] ) {
440
+ $rgb = implode( ',', FLBuilderColor::hex_to_rgb( $value ) );
441
+ $a = $args['opacity'] / 100;
442
  $css .= "\t$name: rgba($rgb,$a);\n";
443
  }
444
  }
445
+ break;
446
 
447
  case 'image':
448
  if ( stristr( $value, 'gradient(' ) ) {
450
  } else {
451
  $css .= "\t$name: url($value);\n";
452
  }
453
+ break;
454
 
455
  default:
456
  $css .= "\t$name: $value";
classes/class-fl-builder-debug.php CHANGED
@@ -316,7 +316,7 @@ final class FL_Debug {
316
  $cache = FLBuilderModel::get_cache_dir();
317
 
318
  $args = array(
319
- 'name' => 'Beaver Builder Path',
320
  'data' => $cache['path'],
321
  );
322
  self::register( 'bb_cache_path', $args );
@@ -331,7 +331,7 @@ final class FL_Debug {
331
  $cache = FLCustomizer::get_cache_dir();
332
 
333
  $args = array(
334
- 'name' => 'Beaver Theme Path',
335
  'data' => $cache['path'],
336
  );
337
  self::register( 'bb_theme_cache_path', $args );
@@ -343,6 +343,12 @@ final class FL_Debug {
343
  self::register( 'bb_theme_cache_path_writable', $args );
344
  }
345
 
 
 
 
 
 
 
346
  $args = array(
347
  'name' => 'License',
348
  'data' => self::divider(),
316
  $cache = FLBuilderModel::get_cache_dir();
317
 
318
  $args = array(
319
+ 'name' => 'Beaver Builder Cache Path',
320
  'data' => $cache['path'],
321
  );
322
  self::register( 'bb_cache_path', $args );
331
  $cache = FLCustomizer::get_cache_dir();
332
 
333
  $args = array(
334
+ 'name' => 'Beaver Theme Cache Path',
335
  'data' => $cache['path'],
336
  );
337
  self::register( 'bb_theme_cache_path', $args );
343
  self::register( 'bb_theme_cache_path_writable', $args );
344
  }
345
 
346
+ $args = array(
347
+ 'name' => 'WordPress Content Path',
348
+ 'data' => WP_CONTENT_DIR,
349
+ );
350
+ self::register( 'bb_content_path', $args );
351
+
352
  $args = array(
353
  'name' => 'License',
354
  'data' => self::divider(),
classes/class-fl-builder-export.php CHANGED
@@ -61,15 +61,15 @@ final class FLBuilderExport {
61
  $type = isset( $_POST['type'] ) ? sanitize_text_field( $_POST['type'] ) : 'fl-builder-template';
62
  $data = array();
63
  $query = new WP_Query( array(
64
- 'post_type' => $type,
65
- 'orderby' => 'title',
66
- 'order' => 'ASC',
67
- 'posts_per_page' => '-1',
68
  ) );
69
 
70
  foreach ( $query->posts as $post ) {
71
  $data[] = array(
72
- 'id' => $post->ID,
73
  'title' => $post->post_title,
74
  );
75
  }
61
  $type = isset( $_POST['type'] ) ? sanitize_text_field( $_POST['type'] ) : 'fl-builder-template';
62
  $data = array();
63
  $query = new WP_Query( array(
64
+ 'post_type' => $type,
65
+ 'orderby' => 'title',
66
+ 'order' => 'ASC',
67
+ 'posts_per_page' => '-1',
68
  ) );
69
 
70
  foreach ( $query->posts as $post ) {
71
  $data[] = array(
72
+ 'id' => $post->ID,
73
  'title' => $post->post_title,
74
  );
75
  }
classes/class-fl-builder-filesystem.php CHANGED
@@ -9,7 +9,7 @@ class FL_Filesystem {
9
 
10
  public static function instance() {
11
  if ( is_null( self::$_instance ) ) {
12
- $filtered = apply_filters( 'fl_filesystem_instance', null );
13
  self::$_instance = $filtered instanceof FL_Filesystem ? $filtered : new self();
14
  }
15
  return self::$_instance;
@@ -135,14 +135,14 @@ class FL_Filesystem {
135
 
136
  $context = apply_filters( 'request_filesystem_credentials_context', false );
137
 
138
- add_filter( 'filesystem_method', array( $this, 'filesystem_method' ) );
139
  add_filter( 'request_filesystem_credentials', array( $this, 'request_filesystem_credentials' ) );
140
 
141
  $creds = request_filesystem_credentials( site_url(), '', true, $context, null );
142
 
143
  WP_Filesystem( $creds, $context );
144
 
145
- remove_filter( 'filesystem_method', array( $this, 'filesystem_method' ) );
146
  remove_filter( 'request_filesystem_credentials', array( $this, 'FLBuilderUtils::request_filesystem_credentials' ) );
147
  }
148
 
9
 
10
  public static function instance() {
11
  if ( is_null( self::$_instance ) ) {
12
+ $filtered = apply_filters( 'fl_filesystem_instance', null );
13
  self::$_instance = $filtered instanceof FL_Filesystem ? $filtered : new self();
14
  }
15
  return self::$_instance;
135
 
136
  $context = apply_filters( 'request_filesystem_credentials_context', false );
137
 
138
+ add_filter( 'filesystem_method', array( $this, 'filesystem_method' ) );
139
  add_filter( 'request_filesystem_credentials', array( $this, 'request_filesystem_credentials' ) );
140
 
141
  $creds = request_filesystem_credentials( site_url(), '', true, $context, null );
142
 
143
  WP_Filesystem( $creds, $context );
144
 
145
+ remove_filter( 'filesystem_method', array( $this, 'filesystem_method' ) );
146
  remove_filter( 'request_filesystem_credentials', array( $this, 'FLBuilderUtils::request_filesystem_credentials' ) );
147
  }
148
 
classes/class-fl-builder-fonts.php CHANGED
@@ -61,8 +61,20 @@ final class FLBuilderFonts {
61
  static public function display_select_font( $font ) {
62
  $system_fonts = apply_filters( 'fl_builder_font_families_system', FLBuilderFontFamilies::$system );
63
  $google_fonts = apply_filters( 'fl_builder_font_families_google', FLBuilderFontFamilies::google() );
 
64
 
65
  echo '<option value="Default" ' . selected( 'Default', $font, false ) . '>' . __( 'Default', 'fl-builder' ) . '</option>';
 
 
 
 
 
 
 
 
 
 
 
66
  echo '<optgroup label="System">';
67
 
68
  foreach ( $system_fonts as $name => $variants ) {
@@ -312,7 +324,10 @@ final class FLBuilderFonts {
312
  */
313
  static public function add_font( $font ) {
314
 
315
- if ( is_array( $font ) && 'Default' != $font['family'] ) {
 
 
 
316
 
317
  $system_fonts = apply_filters( 'fl_builder_font_families_system', FLBuilderFontFamilies::$system );
318
 
@@ -332,7 +347,17 @@ final class FLBuilderFonts {
332
 
333
  }
334
  }
 
 
 
 
 
 
 
 
 
335
  }
 
336
  }
337
 
338
  /**
@@ -608,7 +633,7 @@ final class FLBuilderFontFamilies {
608
  if ( ! empty( self::$_google_json ) ) {
609
  $json = self::$_google_json;
610
  } else {
611
- $json = (array) json_decode( file_get_contents( trailingslashit( FL_BUILDER_DIR ) . 'json/fonts.json' ), true );
612
  self::$_google_json = $json;
613
  }
614
  /**
61
  static public function display_select_font( $font ) {
62
  $system_fonts = apply_filters( 'fl_builder_font_families_system', FLBuilderFontFamilies::$system );
63
  $google_fonts = apply_filters( 'fl_builder_font_families_google', FLBuilderFontFamilies::google() );
64
+ $recent_fonts = get_option( 'fl_builder_recent_fonts', array() );
65
 
66
  echo '<option value="Default" ' . selected( 'Default', $font, false ) . '>' . __( 'Default', 'fl-builder' ) . '</option>';
67
+
68
+ if ( is_array( $recent_fonts ) && ! empty( $recent_fonts ) ) {
69
+ echo '<optgroup label="Recently Used" class="recent-fonts">';
70
+ foreach ( $recent_fonts as $name => $variants ) {
71
+ if ( 'Default' == $name ) {
72
+ continue;
73
+ }
74
+ echo '<option value="' . $name . '">' . $name . '</option>';
75
+ }
76
+ }
77
+
78
  echo '<optgroup label="System">';
79
 
80
  foreach ( $system_fonts as $name => $variants ) {
324
  */
325
  static public function add_font( $font ) {
326
 
327
+ $recent_fonts_db = get_option( 'fl_builder_recent_fonts', array() );
328
+ $recent_fonts = array();
329
+
330
+ if ( is_array( $font ) && isset( $font['family'] ) && isset( $font['weight'] ) && 'Default' != $font['family'] ) {
331
 
332
  $system_fonts = apply_filters( 'fl_builder_font_families_system', FLBuilderFontFamilies::$system );
333
 
347
 
348
  }
349
  }
350
+ if ( ! isset( $recent_fonts_db[ $font['family'] ] ) ) {
351
+ $recent_fonts[ $font['family'] ] = $font['weight'];
352
+ }
353
+ }
354
+
355
+ $recent = array_merge( $recent_fonts, $recent_fonts_db );
356
+
357
+ if ( isset( $_GET['fl_builder'] ) && ! empty( $recent ) && serialize( $recent ) !== serialize( $recent_fonts_db ) ) {
358
+ update_option( 'fl_builder_recent_fonts', array_slice( $recent, -11 ) );
359
  }
360
+
361
  }
362
 
363
  /**
633
  if ( ! empty( self::$_google_json ) ) {
634
  $json = self::$_google_json;
635
  } else {
636
+ $json = (array) json_decode( file_get_contents( trailingslashit( FL_BUILDER_DIR ) . 'json/fonts.json' ), true );
637
  self::$_google_json = $json;
638
  }
639
  /**
classes/class-fl-builder-icons.php CHANGED
@@ -33,8 +33,8 @@ final class FLBuilderIcons {
33
  // Check to see if we should pull sets from the main site.
34
  if ( is_multisite() ) {
35
 
36
- $id = defined( 'BLOG_ID_CURRENT_SITE' ) ? BLOG_ID_CURRENT_SITE : 1;
37
- $enabled_icons = get_option( '_fl_builder_enabled_icons' );
38
 
39
  if ( ( $id != $blog_id ) && empty( $enabled_icons ) ) {
40
  switch_to_blog( $id );
@@ -51,7 +51,10 @@ final class FLBuilderIcons {
51
  restore_current_blog();
52
  }
53
 
54
- // Filter the sets
 
 
 
55
  self::$sets = apply_filters( 'fl_builder_icon_sets', self::$sets );
56
 
57
  // Return the sets.
@@ -126,33 +129,33 @@ final class FLBuilderIcons {
126
  */
127
  static private function register_core_sets() {
128
  $enabled_icons = FLBuilderModel::get_enabled_icons();
129
- $core_sets = apply_filters( 'fl_builder_core_icon_sets', array(
130
- 'font-awesome' => array(
131
- 'name' => 'Font Awesome 4',
132
  'prefix' => 'fa',
133
  ),
134
- 'font-awesome-5-solid' => array(
135
- 'name' => 'Font Awesome 5 Solid',
136
  'prefix' => 'fas',
137
  ),
138
  'font-awesome-5-regular' => array(
139
- 'name' => 'Font Awesome 5 Regular',
140
  'prefix' => 'far',
141
  ),
142
- 'font-awesome-5-light' => array(
143
- 'name' => 'Font Awesome 5 Light (pro only)',
144
  'prefix' => 'fal',
145
  ),
146
- 'font-awesome-5-brands' => array(
147
- 'name' => 'Font Awesome 5 Brands',
148
  'prefix' => 'fab',
149
  ),
150
- 'foundation-icons' => array(
151
- 'name' => 'Foundation Icons',
152
  'prefix' => '',
153
  ),
154
- 'dashicons' => array(
155
- 'name' => 'WordPress Dashicons',
156
  'prefix' => 'dashicons dashicons-before',
157
  ),
158
  ) );
@@ -165,9 +168,9 @@ final class FLBuilderIcons {
165
  foreach ( $core_sets as $set_key => $set_data ) {
166
  if ( is_admin() || in_array( $set_key, $enabled_icons ) ) {
167
  self::$sets[ $set_key ] = array(
168
- 'name' => $set_data['name'],
169
  'prefix' => $set_data['prefix'],
170
- 'type' => 'core',
171
  );
172
  }
173
  }
@@ -185,15 +188,15 @@ final class FLBuilderIcons {
185
 
186
  if ( apply_filters( 'fl_enable_fa5_pro', false ) ) {
187
  switch ( $set_key ) {
188
- case 'font-awesome-5-light' :
189
  $key = 'font-awesome-5-light-pro';
190
  break;
191
 
192
- case 'font-awesome-5-regular' :
193
  $key = 'font-awesome-5-regular-pro';
194
  break;
195
 
196
- case 'font-awesome-5-solid' :
197
  $key = 'font-awesome-5-solid-pro';
198
  break;
199
  }
@@ -201,7 +204,7 @@ final class FLBuilderIcons {
201
 
202
  $config_path = apply_filters( 'fl_builder_core_icon_set_config', FL_BUILDER_DIR . 'json/' . $key . '.json', $set_data );
203
 
204
- $icons = json_decode( file_get_contents( $config_path ) );
205
  self::$sets[ $set_key ]['icons'] = $icons;
206
  }
207
  }
@@ -218,7 +221,7 @@ final class FLBuilderIcons {
218
  // Get uploaded sets.
219
  $enabled_icons = FLBuilderModel::get_enabled_icons();
220
  $upload_info = FLBuilderModel::get_cache_dir( 'icons' );
221
- $folders = glob( $upload_info['path'] . '*' );
222
 
223
  // Make sure we have an array.
224
  if ( ! is_array( $folders ) ) {
@@ -247,18 +250,18 @@ final class FLBuilderIcons {
247
  if ( is_admin() || in_array( $key, $enabled_icons ) ) {
248
 
249
  self::$sets[ $key ] = array(
250
- 'name' => $data->metadata->name,
251
- 'prefix' => '',
252
- 'type' => 'icomoon',
253
- 'path' => $folder,
254
- 'url' => $url,
255
  'stylesheet' => $url . 'style.css',
256
- 'icons' => array(),
257
  );
258
 
259
  foreach ( $data->icons as $icon ) {
260
 
261
- $prefs = $data->preferences->fontPref;
262
  $postfix = isset( $prefs->postfix ) ? $prefs->postfix : '';
263
 
264
  if ( isset( $prefs->selector ) && 'class' == $prefs->selector ) {
@@ -282,11 +285,11 @@ final class FLBuilderIcons {
282
 
283
  // Append the date to the name?
284
  if ( empty( $data->name ) ) {
285
- $time = str_replace( 'icon-', '', $key );
286
- $date_format = get_option( 'date_format' );
287
- $time_format = get_option( 'time_format' );
288
- $date = date( $date_format . ' ' . $time_format );
289
- $name .= ' (' . $date . ')';
290
  }
291
 
292
  if ( isset( $data->glyphs ) ) {
@@ -294,13 +297,13 @@ final class FLBuilderIcons {
294
  if ( is_admin() || in_array( $key, $enabled_icons ) ) {
295
 
296
  self::$sets[ $key ] = array(
297
- 'name' => $name,
298
- 'prefix' => '',
299
- 'type' => 'fontello',
300
- 'path' => $folder,
301
- 'url' => $url,
302
  'stylesheet' => $url . 'css/' . $style . '.css',
303
- 'icons' => array(),
304
  );
305
 
306
  foreach ( $data->glyphs as $icon ) {
@@ -392,6 +395,10 @@ final class FLBuilderIcons {
392
  * @return void
393
  */
394
  static private function enqueue_styles_for_icon( $icon ) {
 
 
 
 
395
  do_action( 'fl_builder_enqueue_styles_for_icon', $icon );
396
 
397
  // Is this a core icon?
33
  // Check to see if we should pull sets from the main site.
34
  if ( is_multisite() ) {
35
 
36
+ $id = defined( 'BLOG_ID_CURRENT_SITE' ) ? BLOG_ID_CURRENT_SITE : 1;
37
+ $enabled_icons = get_option( '_fl_builder_enabled_icons' );
38
 
39
  if ( ( $id != $blog_id ) && empty( $enabled_icons ) ) {
40
  switch_to_blog( $id );
51
  restore_current_blog();
52
  }
53
 
54
+ /**
55
+ * Filter the icon sets.
56
+ * @see fl_builder_icon_sets
57
+ */
58
  self::$sets = apply_filters( 'fl_builder_icon_sets', self::$sets );
59
 
60
  // Return the sets.
129
  */
130
  static private function register_core_sets() {
131
  $enabled_icons = FLBuilderModel::get_enabled_icons();
132
+ $core_sets = apply_filters( 'fl_builder_core_icon_sets', array(
133
+ 'font-awesome' => array(
134
+ 'name' => 'Font Awesome 4',
135
  'prefix' => 'fa',
136
  ),
137
+ 'font-awesome-5-solid' => array(
138
+ 'name' => 'Font Awesome 5 Solid',
139
  'prefix' => 'fas',
140
  ),
141
  'font-awesome-5-regular' => array(
142
+ 'name' => 'Font Awesome 5 Regular',
143
  'prefix' => 'far',
144
  ),
145
+ 'font-awesome-5-light' => array(
146
+ 'name' => 'Font Awesome 5 Light (pro only)',
147
  'prefix' => 'fal',
148
  ),
149
+ 'font-awesome-5-brands' => array(
150
+ 'name' => 'Font Awesome 5 Brands',
151
  'prefix' => 'fab',
152
  ),
153
+ 'foundation-icons' => array(
154
+ 'name' => 'Foundation Icons',
155
  'prefix' => '',
156
  ),
157
+ 'dashicons' => array(
158
+ 'name' => 'WordPress Dashicons',
159
  'prefix' => 'dashicons dashicons-before',
160
  ),
161
  ) );
168
  foreach ( $core_sets as $set_key => $set_data ) {
169
  if ( is_admin() || in_array( $set_key, $enabled_icons ) ) {
170
  self::$sets[ $set_key ] = array(
171
+ 'name' => $set_data['name'],
172
  'prefix' => $set_data['prefix'],
173
+ 'type' => 'core',
174
  );
175
  }
176
  }
188
 
189
  if ( apply_filters( 'fl_enable_fa5_pro', false ) ) {
190
  switch ( $set_key ) {
191
+ case 'font-awesome-5-light':
192
  $key = 'font-awesome-5-light-pro';
193
  break;
194
 
195
+ case 'font-awesome-5-regular':
196
  $key = 'font-awesome-5-regular-pro';
197
  break;
198
 
199
+ case 'font-awesome-5-solid':
200
  $key = 'font-awesome-5-solid-pro';
201
  break;
202
  }
204
 
205
  $config_path = apply_filters( 'fl_builder_core_icon_set_config', FL_BUILDER_DIR . 'json/' . $key . '.json', $set_data );
206
 
207
+ $icons = json_decode( file_get_contents( $config_path ) );
208
  self::$sets[ $set_key ]['icons'] = $icons;
209
  }
210
  }
221
  // Get uploaded sets.
222
  $enabled_icons = FLBuilderModel::get_enabled_icons();
223
  $upload_info = FLBuilderModel::get_cache_dir( 'icons' );
224
+ $folders = glob( $upload_info['path'] . '*' );
225
 
226
  // Make sure we have an array.
227
  if ( ! is_array( $folders ) ) {
250
  if ( is_admin() || in_array( $key, $enabled_icons ) ) {
251
 
252
  self::$sets[ $key ] = array(
253
+ 'name' => $data->metadata->name,
254
+ 'prefix' => '',
255
+ 'type' => 'icomoon',
256
+ 'path' => $folder,
257
+ 'url' => $url,
258
  'stylesheet' => $url . 'style.css',
259
+ 'icons' => array(),
260
  );
261
 
262
  foreach ( $data->icons as $icon ) {
263
 
264
+ $prefs = $data->preferences->fontPref;
265
  $postfix = isset( $prefs->postfix ) ? $prefs->postfix : '';
266
 
267
  if ( isset( $prefs->selector ) && 'class' == $prefs->selector ) {
285
 
286
  // Append the date to the name?
287
  if ( empty( $data->name ) ) {
288
+ $time = str_replace( 'icon-', '', $key );
289
+ $date_format = get_option( 'date_format' );
290
+ $time_format = get_option( 'time_format' );
291
+ $date = date( $date_format . ' ' . $time_format );
292
+ $name .= ' (' . $date . ')';
293
  }
294
 
295
  if ( isset( $data->glyphs ) ) {
297
  if ( is_admin() || in_array( $key, $enabled_icons ) ) {
298
 
299
  self::$sets[ $key ] = array(
300
+ 'name' => $name,
301
+ 'prefix' => '',
302
+ 'type' => 'fontello',
303
+ 'path' => $folder,
304
+ 'url' => $url,
305
  'stylesheet' => $url . 'css/' . $style . '.css',
306
+ 'icons' => array(),
307
  );
308
 
309
  foreach ( $data->glyphs as $icon ) {
395
  * @return void
396
  */
397
  static private function enqueue_styles_for_icon( $icon ) {
398
+ /**
399
+ * Enqueue the stylesheet for an icon.
400
+ * @see fl_builder_enqueue_styles_for_icon
401
+ */
402
  do_action( 'fl_builder_enqueue_styles_for_icon', $icon );
403
 
404
  // Is this a core icon?
classes/class-fl-builder-import.php CHANGED
@@ -23,7 +23,7 @@ final class FLBuilderImport {
23
  return;
24
  }
25
 
26
- require_once FL_BUILDER_DIR . '/classes/class-fl-builder-importer.php';
27
 
28
  // Remove the WordPress importer.
29
  remove_action( 'admin_init', 'wordpress_importer_init' );
23
  return;
24
  }
25
 
26
+ require_once FL_BUILDER_DIR . 'classes/class-fl-builder-importer.php';
27
 
28
  // Remove the WordPress importer.
29
  remove_action( 'admin_init', 'wordpress_importer_init' );
classes/class-fl-builder-importer.php CHANGED
@@ -82,7 +82,7 @@ class FLBuilderImportParserRegex extends WXR_Parser_Regex {
82
  continue;
83
  }
84
  if ( false !== strpos( $importline, '<item>' ) ) {
85
- $post = '';
86
  $in_post = true;
87
  continue;
88
  }
@@ -120,13 +120,13 @@ class FLBuilderImportParserRegex extends WXR_Parser_Regex {
120
  }
121
 
122
  return array(
123
- 'authors' => $this->authors,
124
- 'posts' => $this->posts,
125
  'categories' => $this->categories,
126
- 'tags' => $this->tags,
127
- 'terms' => $this->terms,
128
- 'base_url' => $this->base_url,
129
- 'version' => $wxr_version,
130
  );
131
  }
132
 
@@ -209,7 +209,7 @@ final class FLBuilderImporterDataFix {
209
  */
210
  static private function unescape_mysql( $value ) {
211
  return str_replace( array( '\\\\', "\\0", "\\n", "\\r", '\Z', "\'", '\"' ),
212
- array( '\\', "\0", "\n", "\r", "\x1a", "'", '"' ),
213
  $value );
214
  }
215
 
82
  continue;
83
  }
84
  if ( false !== strpos( $importline, '<item>' ) ) {
85
+ $post = '';
86
  $in_post = true;
87
  continue;
88
  }
120
  }
121
 
122
  return array(
123
+ 'authors' => $this->authors,
124
+ 'posts' => $this->posts,
125
  'categories' => $this->categories,
126
+ 'tags' => $this->tags,
127
+ 'terms' => $this->terms,
128
+ 'base_url' => $this->base_url,
129
+ 'version' => $wxr_version,
130
  );
131
  }
132
 
209
  */
210
  static private function unescape_mysql( $value ) {
211
  return str_replace( array( '\\\\', "\\0", "\\n", "\\r", '\Z', "\'", '\"' ),
212
+ array( '\\', "\0", "\n", "\r", "\x1a", "'", '"' ),
213
  $value );
214
  }
215
 
classes/class-fl-builder-loader.php CHANGED
@@ -29,8 +29,8 @@ if ( ! class_exists( 'FLBuilderLoader' ) ) {
29
  deactivate_plugins( array( $lite_dirname . '/fl-builder.php' ), false, is_network_admin() );
30
  return;
31
  } elseif ( class_exists( 'FLBuilder' ) ) {
32
- add_action( 'admin_notices', __CLASS__ . '::double_install_admin_notice' );
33
- add_action( 'network_admin_notices', __CLASS__ . '::double_install_admin_notice' );
34
  return;
35
  }
36
 
@@ -46,7 +46,7 @@ if ( ! class_exists( 'FLBuilderLoader' ) ) {
46
  * @return void
47
  */
48
  static private function define_constants() {
49
- define( 'FL_BUILDER_VERSION', '2.2.0.6' );
50
  define( 'FL_BUILDER_FILE', trailingslashit( dirname( dirname( __FILE__ ) ) ) . 'fl-builder.php' );
51
  define( 'FL_BUILDER_DIR', plugin_dir_path( FL_BUILDER_FILE ) );
52
  define( 'FL_BUILDER_URL', plugins_url( '/', FL_BUILDER_FILE ) );
@@ -140,8 +140,8 @@ if ( ! class_exists( 'FLBuilderLoader' ) ) {
140
  $bb_upload_dir = FLBuilderModel::get_upload_dir();
141
 
142
  if ( ! fl_builder_filesystem()->is_writable( $wp_upload_dir['basedir'] ) || ! fl_builder_filesystem()->is_writable( $bb_upload_dir['path'] ) ) {
143
- add_action( 'admin_notices', __CLASS__ . '::permissions_admin_notice' );
144
- add_action( 'network_admin_notices', __CLASS__ . '::permissions_admin_notice' );
145
  }
146
  }
147
  }
29
  deactivate_plugins( array( $lite_dirname . '/fl-builder.php' ), false, is_network_admin() );
30
  return;
31
  } elseif ( class_exists( 'FLBuilder' ) ) {
32
+ add_action( 'admin_notices', __CLASS__ . '::double_install_admin_notice' );
33
+ add_action( 'network_admin_notices', __CLASS__ . '::double_install_admin_notice' );
34
  return;
35
  }
36
 
46
  * @return void
47
  */
48
  static private function define_constants() {
49
+ define( 'FL_BUILDER_VERSION', '2.2.1.4' );
50
  define( 'FL_BUILDER_FILE', trailingslashit( dirname( dirname( __FILE__ ) ) ) . 'fl-builder.php' );
51
  define( 'FL_BUILDER_DIR', plugin_dir_path( FL_BUILDER_FILE ) );
52
  define( 'FL_BUILDER_URL', plugins_url( '/', FL_BUILDER_FILE ) );
140
  $bb_upload_dir = FLBuilderModel::get_upload_dir();
141
 
142
  if ( ! fl_builder_filesystem()->is_writable( $wp_upload_dir['basedir'] ) || ! fl_builder_filesystem()->is_writable( $bb_upload_dir['path'] ) ) {
143
+ add_action( 'admin_notices', __CLASS__ . '::permissions_admin_notice' );
144
+ add_action( 'network_admin_notices', __CLASS__ . '::permissions_admin_notice' );
145
  }
146
  }
147
  }
classes/class-fl-builder-loop.php CHANGED
@@ -26,11 +26,11 @@ final class FLBuilderLoop {
26
  /**
27
  * Cache the custom pagination data.
28
  * Format:
29
- * array(
30
- * 'current_page' => '',
31
- * 'current_loop' => '',
32
- * 'paged' => ''
33
- * )
34
  *
35
  * @since 1.10.7
36
  * @var array
@@ -62,17 +62,17 @@ final class FLBuilderLoop {
62
  static public function init() {
63
  // Actions
64
  add_action( 'fl_builder_before_control_suggest', __CLASS__ . '::render_match_select', 10, 4 );
65
- add_action( 'init', __CLASS__ . '::init_rewrite_rules', 20 );
66
- add_action( 'fl_builder_activated', __CLASS__ . '::init_rewrite_rules', 10 );
67
- add_action( 'registered_post_type', __CLASS__ . '::post_type_rewrite_rules', 10, 2 );
68
- add_action( 'registered_taxonomy', __CLASS__ . '::taxonomy_rewrite_rules', 10, 3 );
69
- add_action( 'wp_loaded', __CLASS__ . '::flush_rewrite_rules', 1 );
70
 
71
  // Filters
72
- add_filter( 'found_posts', __CLASS__ . '::found_posts', 1, 2 );
73
- add_filter( 'redirect_canonical', __CLASS__ . '::override_canonical', 1, 2 );
74
- add_filter( 'pre_handle_404', __CLASS__ . '::pre_404_pagination', 1, 2 );
75
- add_filter( 'paginate_links', __CLASS__ . '::filter_paginate_links', 1 );
76
  }
77
 
78
  /**
@@ -84,8 +84,16 @@ final class FLBuilderLoop {
84
  * @return object A WP_Query instance.
85
  */
86
  static public function query( $settings ) {
 
 
 
 
87
  $settings = apply_filters( 'fl_builder_loop_before_query_settings', $settings );
88
 
 
 
 
 
89
  do_action( 'fl_builder_loop_before_query', $settings );
90
 
91
  // Count how many times this method has been called
@@ -97,8 +105,16 @@ final class FLBuilderLoop {
97
  $query = self::custom_query( $settings );
98
  }
99
 
 
 
 
 
100
  do_action( 'fl_builder_loop_after_query', $settings );
101
 
 
 
 
 
102
  return apply_filters( 'fl_builder_loop_query', $query, $settings );
103
  }
104
 
@@ -117,9 +133,9 @@ final class FLBuilderLoop {
117
 
118
  $query_args = $wp_query->query_vars;
119
 
120
- $query_args['paged'] = self::get_paged();
121
  $query_args['fl_original_offset'] = 0;
122
- $query_args['fl_builder_loop'] = true;
123
 
124
  $query = new WP_Query( $query_args );
125
  } else {
@@ -141,13 +157,13 @@ final class FLBuilderLoop {
141
  */
142
  static public function custom_query( $settings ) {
143
  global $post;
144
- $posts_per_page = empty( $settings->posts_per_page ) ? 10 : $settings->posts_per_page;
145
- $post_type = empty( $settings->post_type ) ? 'post' : $settings->post_type;
146
- $order_by = empty( $settings->order_by ) ? 'date' : $settings->order_by;
147
- $order = empty( $settings->order ) ? 'DESC' : $settings->order;
148
- $users = empty( $settings->users ) ? '' : $settings->users;
149
- $fields = empty( $settings->fields ) ? '' : $settings->fields;
150
- $exclude_self = '';
151
  if ( isset( $settings->exclude_self ) && 'yes' == $settings->exclude_self ) {
152
  $exclude_self = $post->ID;
153
  }
@@ -170,12 +186,12 @@ final class FLBuilderLoop {
170
 
171
  // Build the query args.
172
  $args = array(
173
- 'paged' => $paged,
174
- 'posts_per_page' => $posts_per_page,
175
- 'post_type' => $post_type,
176
- 'orderby' => $order_by,
177
- 'order' => $order,
178
- 'tax_query' => array(
179
  'relation' => 'AND',
180
  ),
181
  'ignore_sticky_posts' => true,
@@ -195,7 +211,7 @@ final class FLBuilderLoop {
195
  if ( 'author' == $order_by ) {
196
  $args['orderby'] = array(
197
  'author' => $order,
198
- 'date' => $order,
199
  );
200
  }
201
 
@@ -250,7 +266,7 @@ final class FLBuilderLoop {
250
  } elseif ( 'related' === $tax_matching ) {
251
  // Match posts by related terms from the global post.
252
  global $post;
253
- $terms = wp_get_post_terms( $post->ID, $tax_slug );
254
  $related = array();
255
 
256
  foreach ( $terms as $term ) {
@@ -266,10 +282,10 @@ final class FLBuilderLoop {
266
 
267
  // Don't include posts with terms selected in the suggest field.
268
  $args['tax_query'][] = array(
269
- 'taxonomy' => $tax_slug,
270
- 'field' => 'id',
271
- 'terms' => $term_ids,
272
- 'operator' => 'NOT IN',
273
  );
274
 
275
  // Set the term IDs to the related terms.
@@ -281,10 +297,10 @@ final class FLBuilderLoop {
281
  if ( ! empty( $term_ids ) ) {
282
 
283
  $args['tax_query'][] = array(
284
- 'taxonomy' => $tax_slug,
285
- 'field' => 'id',
286
- 'terms' => $term_ids,
287
- 'operator' => $operator,
288
  );
289
  }
290
  }
@@ -353,7 +369,7 @@ final class FLBuilderLoop {
353
  */
354
  static public function init_rewrite_rules() {
355
 
356
- $fronts = self::get_rewrite_fronts();
357
  $paged_regex = self::$paged_regex_base;
358
 
359
  $flpaged_rules = array(
@@ -383,7 +399,7 @@ final class FLBuilderLoop {
383
  '(.?.+?)/' . $paged_regex . '/?([0-9]{1,})/?$' => 'index.php?pagename=$matches[1]&flpaged=$matches[2]',
384
 
385
  // Post single
386
- '(.+?)/' . $paged_regex . '/?([0-9]{1,})/?$' => 'index.php?name=$matches[1]&flpaged=$matches[2]',
387
  );
388
 
389
  // Frontpage static
@@ -429,11 +445,11 @@ final class FLBuilderLoop {
429
  $author_base = $front . $wp_rewrite->author_base . '/';
430
 
431
  return array(
432
- 'category' => $category_base,
433
- 'tag' => $tag_base,
434
- 'date' => $date_base,
435
- 'author' => $author_base,
436
- 'default' => $front,
437
  );
438
  }
439
 
@@ -490,10 +506,10 @@ final class FLBuilderLoop {
490
 
491
  // Append $custom_paged[ 'current_page' ] to slug if it's single.
492
  if ( $is_single ) {
493
- $regex = $slug . '/' . $custom_paged['current_page'] . '/' . self::$paged_regex_base . '/?([0-9]{1,})/?$';
494
  $redirect = 'index.php?post_type=' . $post_type . '&name=' . $custom_paged['current_page'] . '&flpaged=$matches[1]';
495
  } else {
496
- $regex = $slug . '/' . self::$paged_regex_base . '/?([0-9]{1,})/?$';
497
  $redirect = 'index.php?post_type=' . $post_type . '&flpaged=$matches[1]';
498
  }
499
 
@@ -608,7 +624,7 @@ final class FLBuilderLoop {
608
  }
609
 
610
  self::$_rewrote_post_type = false;
611
- self::$_rewrote_taxonomy = false;
612
  }
613
 
614
  /**
@@ -634,8 +650,8 @@ final class FLBuilderLoop {
634
 
635
  // Disable canonical on single post pagination for all post types.
636
  if ( true === $wp_the_query->is_singular
637
- && - 1 == $wp_the_query->current_post
638
- && true === $wp_the_query->is_paged
639
  ) {
640
  $redirect_url = false;
641
  }
@@ -648,7 +664,7 @@ final class FLBuilderLoop {
648
  * Theme Builder support - Check to see if current page has Themer layout.
649
  * Short-circuit default header status handling when paginating on themer layout content.
650
  *
651
- * @param bool $prevent_404 Whether to short-circuit default header status handling. Default false.
652
  * @param object $query WP Query object.
653
  * @since 1.10.7
654
  * @return bool
@@ -675,7 +691,7 @@ final class FLBuilderLoop {
675
  }
676
 
677
  $is_global_hack = false;
678
- $layout_type = '';
679
 
680
  // Manually set globals since filter `pre_handle_404`
681
  // doesn't reach `$wp_query->register_globals()`.
@@ -686,7 +702,7 @@ final class FLBuilderLoop {
686
  $wp_actions['wp'] = 1;
687
 
688
  if ( $query->is_post_type_archive ) {
689
- $post = new stdClass();
690
  $post->post_type = $query->get( 'post_type' );
691
  $GLOBALS['post'] = $post;
692
  }
@@ -716,11 +732,11 @@ final class FLBuilderLoop {
716
  * @return void
717
  */
718
  static public function pagination( $query ) {
719
- $total_pages = $query->max_num_pages;
720
  $permalink_structure = get_option( 'permalink_structure' );
721
- $paged = self::get_paged();
722
- $base = html_entity_decode( get_pagenum_link() );
723
- $add_args = false;
724
 
725
  if ( $total_pages > 1 ) {
726
 
@@ -728,7 +744,7 @@ final class FLBuilderLoop {
728
  $current_page = 1;
729
  }
730
 
731
- $base = self::build_base_url( $permalink_structure, $base );
732
  $format = self::paged_format( $permalink_structure, $base );
733
 
734
  // Flag if it's a first posts module in an archive page.
@@ -742,11 +758,11 @@ final class FLBuilderLoop {
742
  }
743
 
744
  echo paginate_links(array(
745
- 'base' => $base . '%_%',
746
  'format' => $format,
747
  'current' => $current_page,
748
- 'total' => $total_pages,
749
- 'type' => 'list',
750
  'add_args' => $add_args,
751
  ));
752
  }
@@ -762,8 +778,8 @@ final class FLBuilderLoop {
762
  */
763
  static public function filter_paginate_links( $link ) {
764
  $permalink_structure = get_option( 'permalink_structure' );
765
- $base = html_entity_decode( get_pagenum_link() );
766
- $link_params = wp_parse_url( $link, PHP_URL_QUERY );
767
 
768
  if ( empty( $permalink_structure ) && strrpos( $base, 'paged-' ) ) {
769
 
@@ -773,10 +789,10 @@ final class FLBuilderLoop {
773
  $current_paged_args = array_values( preg_grep( '/^paged-(\d+)/', array_keys( $base_args ) ) );
774
 
775
  if ( ! empty( $current_paged_args ) ) {
776
- $current_flpaged = $current_paged_args[0];
777
  $current_paged_param = $current_flpaged . '=' . $base_args[ $current_flpaged ];
778
 
779
- $link_params = str_replace( $current_paged_param, '' , $link_params );
780
  wp_parse_str( $link_params, $link_args );
781
 
782
  $link = strtok( $link, '?' );
@@ -848,14 +864,14 @@ final class FLBuilderLoop {
848
  }
849
 
850
  if ( ! empty( $permalink_structure ) ) {
851
- $format = substr( $base, -1 ) != '/' ? '/' : '';
852
  $format .= $page_prefix . '/';
853
  $format .= '%#%';
854
  $format .= substr( $permalink_structure, -1 ) == '/' ? '/' : '';
855
  } elseif ( empty( $permalink_structure ) || is_search() ) {
856
  $parse_url = wp_parse_url( $base, PHP_URL_QUERY );
857
- $format = empty( $parse_url ) ? '?' : '&';
858
- $format .= $page_prefix . '=%#%';
859
  }
860
 
861
  return $format;
@@ -889,10 +905,10 @@ final class FLBuilderLoop {
889
 
890
  if ( $paged_matches ) {
891
  self::$custom_paged_data = array(
892
- 'parent_page' => $matches[1],
893
- 'current_page' => $matches[2],
894
- 'current_loop' => $matches[3],
895
- 'paged' => $matches[4],
896
  );
897
  }
898
 
@@ -933,13 +949,13 @@ final class FLBuilderLoop {
933
 
934
  // In case the site is using default permalink structure and it has multiple paginations.
935
  $permalink_structure = get_option( 'permalink_structure' );
936
- $base = html_entity_decode( get_pagenum_link() );
937
 
938
  if ( is_numeric( $flpaged ) && self::is_paginated_loop() ) {
939
  return $flpaged;
940
  } elseif ( empty( $permalink_structure ) && strrpos( $base, 'paged-' ) && self::$loop_counter > 1 ) {
941
 
942
- $flpaged = 0;
943
  $url_parts = wp_parse_url( $base, PHP_URL_QUERY );
944
  wp_parse_str( $url_parts, $url_params );
945
 
@@ -993,8 +1009,8 @@ final class FLBuilderLoop {
993
  */
994
  static public function post_types() {
995
  $post_types = get_post_types(array(
996
- 'public' => true,
997
- 'show_ui' => true,
998
  ), 'objects');
999
 
1000
  unset( $post_types['attachment'] );
@@ -1013,7 +1029,7 @@ final class FLBuilderLoop {
1013
  */
1014
  static public function taxonomies( $post_type ) {
1015
  $taxonomies = get_object_taxonomies( $post_type, 'objects' );
1016
- $data = array();
1017
 
1018
  foreach ( $taxonomies as $tax_slug => $tax ) {
1019
 
26
  /**
27
  * Cache the custom pagination data.
28
  * Format:
29
+ * array(
30
+ * 'current_page' => '',
31
+ * 'current_loop' => '',
32
+ * 'paged' => ''
33
+ * )
34
  *
35
  * @since 1.10.7
36
  * @var array
62
  static public function init() {
63
  // Actions
64
  add_action( 'fl_builder_before_control_suggest', __CLASS__ . '::render_match_select', 10, 4 );
65
+ add_action( 'init', __CLASS__ . '::init_rewrite_rules', 20 );
66
+ add_action( 'fl_builder_activated', __CLASS__ . '::init_rewrite_rules', 10 );
67
+ add_action( 'registered_post_type', __CLASS__ . '::post_type_rewrite_rules', 10, 2 );
68
+ add_action( 'registered_taxonomy', __CLASS__ . '::taxonomy_rewrite_rules', 10, 3 );
69
+ add_action( 'wp_loaded', __CLASS__ . '::flush_rewrite_rules', 1 );
70
 
71
  // Filters
72
+ add_filter( 'found_posts', __CLASS__ . '::found_posts', 1, 2 );
73
+ add_filter( 'redirect_canonical', __CLASS__ . '::override_canonical', 1, 2 );
74
+ add_filter( 'pre_handle_404', __CLASS__ . '::pre_404_pagination', 1, 2 );
75
+ add_filter( 'paginate_links', __CLASS__ . '::filter_paginate_links', 1 );
76
  }
77
 
78
  /**
84
  * @return object A WP_Query instance.
85
  */
86
  static public function query( $settings ) {
87
+ /**
88
+ * Filter the settings variable before query is performed.
89
+ * @see fl_builder_loop_before_query_settings
90
+ */
91
  $settings = apply_filters( 'fl_builder_loop_before_query_settings', $settings );
92
 
93
+ /**
94
+ * Before query is performed.
95
+ * @see fl_builder_loop_before_query
96
+ */
97
  do_action( 'fl_builder_loop_before_query', $settings );
98
 
99
  // Count how many times this method has been called
105
  $query = self::custom_query( $settings );
106
  }
107
 
108
+ /**
109
+ * Aftert the query is performed.
110
+ * @see fl_builder_loop_after_query
111
+ */
112
  do_action( 'fl_builder_loop_after_query', $settings );
113
 
114
+ /**
115
+ * Filter the query results.
116
+ * @see fl_builder_loop_query
117
+ */
118
  return apply_filters( 'fl_builder_loop_query', $query, $settings );
119
  }
120
 
133
 
134
  $query_args = $wp_query->query_vars;
135
 
136
+ $query_args['paged'] = self::get_paged();
137
  $query_args['fl_original_offset'] = 0;
138
+ $query_args['fl_builder_loop'] = true;
139
 
140
  $query = new WP_Query( $query_args );
141
  } else {
157
  */
158
  static public function custom_query( $settings ) {
159
  global $post;
160
+ $posts_per_page = empty( $settings->posts_per_page ) ? 10 : $settings->posts_per_page;
161
+ $post_type = empty( $settings->post_type ) ? 'post' : $settings->post_type;
162
+ $order_by = empty( $settings->order_by ) ? 'date' : $settings->order_by;
163
+ $order = empty( $settings->order ) ? 'DESC' : $settings->order;
164
+ $users = empty( $settings->users ) ? '' : $settings->users;
165
+ $fields = empty( $settings->fields ) ? '' : $settings->fields;
166
+ $exclude_self = '';
167
  if ( isset( $settings->exclude_self ) && 'yes' == $settings->exclude_self ) {
168
  $exclude_self = $post->ID;
169
  }
186
 
187
  // Build the query args.
188
  $args = array(
189
+ 'paged' => $paged,
190
+ 'posts_per_page' => $posts_per_page,
191
+ 'post_type' => $post_type,
192
+ 'orderby' => $order_by,
193
+ 'order' => $order,
194
+ 'tax_query' => array(
195
  'relation' => 'AND',
196
  ),
197
  'ignore_sticky_posts' => true,
211
  if ( 'author' == $order_by ) {
212
  $args['orderby'] = array(
213
  'author' => $order,
214
+ 'date' => $order,
215
  );
216
  }
217
 
266
  } elseif ( 'related' === $tax_matching ) {
267
  // Match posts by related terms from the global post.
268
  global $post;
269
+ $terms = wp_get_post_terms( $post->ID, $tax_slug );
270
  $related = array();
271
 
272
  foreach ( $terms as $term ) {
282
 
283
  // Don't include posts with terms selected in the suggest field.
284
  $args['tax_query'][] = array(
285
+ 'taxonomy' => $tax_slug,
286
+ 'field' => 'id',
287
+ 'terms' => $term_ids,
288
+ 'operator' => 'NOT IN',
289
  );
290
 
291
  // Set the term IDs to the related terms.
297
  if ( ! empty( $term_ids ) ) {
298
 
299
  $args['tax_query'][] = array(
300
+ 'taxonomy' => $tax_slug,
301
+ 'field' => 'id',
302
+ 'terms' => $term_ids,
303
+ 'operator' => $operator,
304
  );
305
  }
306
  }
369
  */
370
  static public function init_rewrite_rules() {
371
 
372
+ $fronts = self::get_rewrite_fronts();
373
  $paged_regex = self::$paged_regex_base;
374
 
375
  $flpaged_rules = array(
399
  '(.?.+?)/' . $paged_regex . '/?([0-9]{1,})/?$' => 'index.php?pagename=$matches[1]&flpaged=$matches[2]',
400
 
401
  // Post single
402
+ '(.+?)/' . $paged_regex . '/?([0-9]{1,})/?$' => 'index.php?name=$matches[1]&flpaged=$matches[2]',
403
  );
404
 
405
  // Frontpage static
445
  $author_base = $front . $wp_rewrite->author_base . '/';
446
 
447
  return array(
448
+ 'category' => $category_base,
449
+ 'tag' => $tag_base,
450
+ 'date' => $date_base,
451
+ 'author' => $author_base,
452
+ 'default' => $front,
453
  );
454
  }
455
 
506
 
507
  // Append $custom_paged[ 'current_page' ] to slug if it's single.
508
  if ( $is_single ) {
509
+ $regex = $slug . '/' . $custom_paged['current_page'] . '/' . self::$paged_regex_base . '/?([0-9]{1,})/?$';
510
  $redirect = 'index.php?post_type=' . $post_type . '&name=' . $custom_paged['current_page'] . '&flpaged=$matches[1]';
511
  } else {
512
+ $regex = $slug . '/' . self::$paged_regex_base . '/?([0-9]{1,})/?$';
513
  $redirect = 'index.php?post_type=' . $post_type . '&flpaged=$matches[1]';
514
  }
515
 
624
  }
625
 
626
  self::$_rewrote_post_type = false;
627
+ self::$_rewrote_taxonomy = false;
628
  }
629
 
630
  /**
650
 
651
  // Disable canonical on single post pagination for all post types.
652
  if ( true === $wp_the_query->is_singular
653
+ && - 1 == $wp_the_query->current_post
654
+ && true === $wp_the_query->is_paged
655
  ) {
656
  $redirect_url = false;
657
  }
664
  * Theme Builder support - Check to see if current page has Themer layout.
665
  * Short-circuit default header status handling when paginating on themer layout content.
666
  *
667
+ * @param bool $prevent_404 Whether to short-circuit default header status handling. Default false.
668
  * @param object $query WP Query object.
669
  * @since 1.10.7
670
  * @return bool
691
  }
692
 
693
  $is_global_hack = false;
694
+ $layout_type = '';
695
 
696
  // Manually set globals since filter `pre_handle_404`
697
  // doesn't reach `$wp_query->register_globals()`.
702
  $wp_actions['wp'] = 1;
703
 
704
  if ( $query->is_post_type_archive ) {
705
+ $post = new stdClass();
706
  $post->post_type = $query->get( 'post_type' );
707
  $GLOBALS['post'] = $post;
708
  }
732
  * @return void
733
  */
734
  static public function pagination( $query ) {
735
+ $total_pages = $query->max_num_pages;
736
  $permalink_structure = get_option( 'permalink_structure' );
737
+ $paged = self::get_paged();
738
+ $base = html_entity_decode( get_pagenum_link() );
739
+ $add_args = false;
740
 
741
  if ( $total_pages > 1 ) {
742
 
744
  $current_page = 1;
745
  }
746
 
747
+ $base = self::build_base_url( $permalink_structure, $base );
748
  $format = self::paged_format( $permalink_structure, $base );
749
 
750
  // Flag if it's a first posts module in an archive page.
758
  }
759
 
760
  echo paginate_links(array(
761
+ 'base' => $base . '%_%',
762
  'format' => $format,
763
  'current' => $current_page,
764
+ 'total' => $total_pages,
765
+ 'type' => 'list',
766
  'add_args' => $add_args,
767
  ));
768
  }
778
  */
779
  static public function filter_paginate_links( $link ) {
780
  $permalink_structure = get_option( 'permalink_structure' );
781
+ $base = html_entity_decode( get_pagenum_link() );
782
+ $link_params = wp_parse_url( $link, PHP_URL_QUERY );
783
 
784
  if ( empty( $permalink_structure ) && strrpos( $base, 'paged-' ) ) {
785
 
789
  $current_paged_args = array_values( preg_grep( '/^paged-(\d+)/', array_keys( $base_args ) ) );
790
 
791
  if ( ! empty( $current_paged_args ) ) {
792
+ $current_flpaged = $current_paged_args[0];
793
  $current_paged_param = $current_flpaged . '=' . $base_args[ $current_flpaged ];
794
 
795
+ $link_params = str_replace( $current_paged_param, '', $link_params );
796
  wp_parse_str( $link_params, $link_args );
797
 
798
  $link = strtok( $link, '?' );
864
  }
865
 
866
  if ( ! empty( $permalink_structure ) ) {
867
+ $format = substr( $base, -1 ) != '/' ? '/' : '';
868
  $format .= $page_prefix . '/';
869
  $format .= '%#%';
870
  $format .= substr( $permalink_structure, -1 ) == '/' ? '/' : '';
871
  } elseif ( empty( $permalink_structure ) || is_search() ) {
872
  $parse_url = wp_parse_url( $base, PHP_URL_QUERY );
873
+ $format = empty( $parse_url ) ? '?' : '&';
874
+ $format .= $page_prefix . '=%#%';
875
  }
876
 
877
  return $format;
905
 
906
  if ( $paged_matches ) {
907
  self::$custom_paged_data = array(
908
+ 'parent_page' => $matches[1],
909
+ 'current_page' => $matches[2],
910
+ 'current_loop' => $matches[3],
911
+ 'paged' => $matches[4],
912
  );
913
  }
914
 
949
 
950
  // In case the site is using default permalink structure and it has multiple paginations.
951
  $permalink_structure = get_option( 'permalink_structure' );
952
+ $base = html_entity_decode( get_pagenum_link() );
953
 
954
  if ( is_numeric( $flpaged ) && self::is_paginated_loop() ) {
955
  return $flpaged;
956
  } elseif ( empty( $permalink_structure ) && strrpos( $base, 'paged-' ) && self::$loop_counter > 1 ) {
957
 
958
+ $flpaged = 0;
959
  $url_parts = wp_parse_url( $base, PHP_URL_QUERY );
960
  wp_parse_str( $url_parts, $url_params );
961
 
1009
  */
1010
  static public function post_types() {
1011
  $post_types = get_post_types(array(
1012
+ 'public' => true,
1013
+ 'show_ui' => true,
1014
  ), 'objects');
1015
 
1016
  unset( $post_types['attachment'] );
1029
  */
1030
  static public function taxonomies( $post_type ) {
1031
  $taxonomies = get_object_taxonomies( $post_type, 'objects' );
1032
+ $data = array();
1033
 
1034
  foreach ( $taxonomies as $tax_slug => $tax ) {
1035
 
classes/class-fl-builder-model.php CHANGED
@@ -16,15 +16,15 @@ final class FLBuilderModel {
16
  * @var array $row_layouts
17
  */
18
  static public $row_layouts = array(
19
- '1-col' => array( 100 ),
20
- '2-cols' => array( 50, 50 ),
21
- '3-cols' => array( 33.33, 33.33, 33.33 ),
22
- '4-cols' => array( 25, 25, 25, 25 ),
23
- '5-cols' => array( 20, 20, 20, 20, 20 ),
24
- '6-cols' => array( 16.65, 16.65, 16.65, 16.65, 16.65, 16.65 ),
25
- 'left-sidebar' => array( 33.33, 66.66 ),
26
- 'right-sidebar' => array( 66.66, 33.33 ),
27
- 'left-right-sidebar' => array( 25, 50, 25 ),
28
  );
29
 
30
  /**
@@ -175,23 +175,23 @@ final class FLBuilderModel {
175
  */
176
  static public function init() {
177
  /* Admin AJAX */
178
- add_action( 'wp_ajax_fl_builder_disable', __CLASS__ . '::disable' );
179
- add_action( 'wp_ajax_fl_builder_duplicate_wpml_layout', __CLASS__ . '::duplicate_wpml_layout' );
180
 
181
  /* Actions */
182
- add_action( 'init', __CLASS__ . '::load_settings', 1 );
183
- add_action( 'init', __CLASS__ . '::load_modules', 2 );
184
- add_action( 'before_delete_post', __CLASS__ . '::delete_post' );
185
- add_action( 'save_post', __CLASS__ . '::save_revision' );
186
- add_action( 'save_post', __CLASS__ . '::set_node_template_default_type', 10, 3 );
187
- add_action( 'wp_restore_post_revision', __CLASS__ . '::restore_revision', 10, 2 );
188
- add_action( 'fl_builder_after_save_layout', __CLASS__ . '::save_layout_revision' );
189
- add_action( 'fl_builder_after_save_user_template', __CLASS__ . '::save_layout_revision' );
190
 
191
  /* Filters */
192
- add_filter( 'heartbeat_received', __CLASS__ . '::lock_post', 10, 2 );
193
- add_filter( 'fl_builder_register_settings_form', __CLASS__ . '::filter_row_settings_for_resize', 10, 2 );
194
- add_filter( 'wp_revisions_to_keep', __CLASS__ . '::limit_revisions', 10, 2 );
195
 
196
  /* Core Templates */
197
  self::register_core_templates();
@@ -281,7 +281,7 @@ final class FLBuilderModel {
281
  $_POST['fl_builder_data']['node_settings'] = FLBuilderUtils::modsec_fix_decode( $_POST['fl_builder_data']['node_settings'] );
282
  }
283
 
284
- $data = FLBuilderUtils::json_decode_deep( wp_unslash( $_POST['fl_builder_data'] ) );
285
 
286
  foreach ( $data as $key => $val ) {
287
  self::$post_data[ $key ] = $val;
@@ -306,9 +306,9 @@ final class FLBuilderModel {
306
  * @return void
307
  */
308
  static public function update_post_data( $key, $value ) {
309
- $post_data = self::get_post_data();
310
  $post_data[ $key ] = $value;
311
- self::$post_data = $post_data;
312
  }
313
 
314
  /**
@@ -461,9 +461,9 @@ final class FLBuilderModel {
461
 
462
  if ( is_singular() && isset( $wp_the_query->post ) ) {
463
 
464
- $post = $wp_the_query->post;
465
  $post_types = self::get_post_types();
466
- $user_can = current_user_can( 'edit_post', $post->ID );
467
  $user_access = FLBuilderUserAccess::current_user_can( 'builder_access' );
468
 
469
  if ( in_array( $post->post_type, $post_types ) && $user_can && $user_access ) {
@@ -515,7 +515,7 @@ final class FLBuilderModel {
515
  return true;
516
  } else {
517
  $post_types = self::get_post_types();
518
- $post = get_post( $post_id );
519
 
520
  if ( $post && in_array( $post->post_type, $post_types ) ) {
521
  return get_post_meta( $post->ID, '_fl_builder_enabled', true );
@@ -546,7 +546,7 @@ final class FLBuilderModel {
546
  } elseif ( is_customize_preview() ) {
547
  self::$active = false;
548
  } elseif ( self::is_post_editable() && ! is_admin() && ! post_password_required() ) {
549
- $post_data = self::get_post_data();
550
  self::$active = isset( $_GET['fl_builder'] ) || isset( $post_data['fl_builder'] );
551
  }
552
 
@@ -573,8 +573,8 @@ final class FLBuilderModel {
573
  static public function is_new_user() {
574
  if ( self::is_builder_active() ) {
575
 
576
- $current_user = wp_get_current_user();
577
- $launched = get_user_meta( $current_user->ID, '_fl_builder_launched', true );
578
 
579
  if ( empty( $launched ) ) {
580
  update_user_meta( $current_user->ID, '_fl_builder_launched', 1 );
@@ -629,18 +629,18 @@ final class FLBuilderModel {
629
 
630
  if ( self::is_post_editable() && is_object( $wp_the_query->post ) ) {
631
 
632
- $post = $wp_the_query->post;
633
- $published = self::get_layout_data( 'published' );
634
- $draft = self::get_layout_data( 'draft' );
635
- $content = apply_filters( 'fl_builder_migrated_post_content', $post->post_content );
636
 
637
  // Migrate existing post content to the builder?
638
  if ( empty( $published ) && empty( $draft ) && ! empty( $content ) ) {
639
 
640
- $row = self::add_row();
641
- $cols = self::get_nodes( 'column' );
642
- $col = array_shift( $cols );
643
- $settings = self::get_module_defaults( 'rich-text' );
644
  $settings->text = $content;
645
 
646
  self::add_module( 'rich-text', $settings, $col->node );
@@ -656,7 +656,10 @@ final class FLBuilderModel {
656
  require_once ABSPATH . 'wp-admin/includes/post.php';
657
  wp_set_post_lock( $post->ID );
658
 
659
- // Allow devs to hook into when editing is enabled.
 
 
 
660
  do_action( 'fl_builder_editing_enabled' );
661
  }
662
  }
@@ -684,8 +687,8 @@ final class FLBuilderModel {
684
 
685
  // Build the paths.
686
  $dir_info = array(
687
- 'path' => $wp_info['basedir'] . '/' . $dir_name . '/',
688
- 'url' => $wp_info['baseurl'] . '/' . $dir_name . '/',
689
  );
690
 
691
  // Create the upload dir if it doesn't exist.
@@ -716,7 +719,7 @@ final class FLBuilderModel {
716
  */
717
  static public function get_cache_dir( $name = 'cache' ) {
718
  $upload_info = self::get_upload_dir();
719
- $allowed = array( 'cache', 'icons' );
720
 
721
  // Make sure the dir name is allowed.
722
  if ( ! in_array( $name, $allowed ) ) {
@@ -725,8 +728,8 @@ final class FLBuilderModel {
725
 
726
  // Build the paths.
727
  $dir_info = array(
728
- 'path' => $upload_info['path'] . $name . '/',
729
- 'url' => $upload_info['url'] . $name . '/',
730
  );
731
 
732
  // Create the cache dir if it doesn't exist.
@@ -757,7 +760,7 @@ final class FLBuilderModel {
757
  */
758
  static public function get_asset_version() {
759
  $post_id = self::get_post_id();
760
- $active = self::is_builder_active();
761
  $preview = self::is_builder_draft_preview();
762
 
763
  if ( $active || $preview ) {
@@ -790,13 +793,13 @@ final class FLBuilderModel {
790
  }
791
 
792
  $info = array(
793
- 'css' => $cache_dir['path'] . $post_id . $suffix . '.css',
794
  'css_url' => $cache_dir['url'] . $post_id . $suffix . '.css',
795
- 'css_partial' => $cache_dir['path'] . $post_id . $suffix . '-partial.css',
796
  'css_partial_url' => $cache_dir['url'] . $post_id . $suffix . '-partial.css',
797
- 'js' => $cache_dir['path'] . $post_id . $suffix . '.js',
798
  'js_url' => $cache_dir['url'] . $post_id . $suffix . '.js',
799
- 'js_partial' => $cache_dir['path'] . $post_id . $suffix . '-partial.js',
800
  'js_partial_url' => $cache_dir['url'] . $post_id . $suffix . '-partial.js',
801
  );
802
 
@@ -905,9 +908,9 @@ final class FLBuilderModel {
905
  * @return void
906
  */
907
  static public function delete_asset_cache_for_all_posts() {
908
- $cache_dir = self::get_cache_dir();
909
- $css = glob( $cache_dir['path'] . '*.css' );
910
- $js = glob( $cache_dir['path'] . '*.js' );
911
 
912
  if ( is_array( $css ) ) {
913
  array_map( array( fl_builder_filesystem(), 'unlink' ), $css );
@@ -955,7 +958,7 @@ final class FLBuilderModel {
955
  // Replace the old node ids.
956
  foreach ( $data as $node_id => $node ) {
957
 
958
- $nodes[ $map[ $node_id ] ] = $node;
959
  $nodes[ $map[ $node_id ] ]->node = $map[ $node_id ];
960
 
961
  if ( ! empty( $node->parent ) && isset( $map[ $node->parent ] ) ) {
@@ -1089,11 +1092,11 @@ final class FLBuilderModel {
1089
 
1090
  // Helper array of parent types and their categories for each node type
1091
  $parent_types = array(
1092
- 'module' => array(
1093
  'type' => 'column',
1094
  'category' => 'columns',
1095
  ),
1096
- 'column' => array(
1097
  'type' => 'column-group',
1098
  'category' => 'groups',
1099
  ),
@@ -1237,7 +1240,7 @@ final class FLBuilderModel {
1237
  */
1238
  static public function get_categorized_nodes() {
1239
  $nodes = array(
1240
- 'rows' => array(),
1241
  'groups' => array(),
1242
  'columns' => array(),
1243
  'modules' => array(),
@@ -1249,7 +1252,7 @@ final class FLBuilderModel {
1249
  $root_col = self::get_node_template_root( 'column' );
1250
 
1251
  $nodes['columns'][ $root_col->node ] = $root_col;
1252
- $col_children = self::get_nodes( null, $root_col );
1253
 
1254
  foreach ( $col_children as $col_child ) {
1255
 
@@ -1263,12 +1266,12 @@ final class FLBuilderModel {
1263
  } elseif ( 'column-group' == $col_child->type ) {
1264
 
1265
  $nodes['groups'][ $col_child->node ] = $col_child;
1266
- $group_cols = self::get_nodes( 'column', $col_child );
1267
 
1268
  foreach ( $group_cols as $group_col ) {
1269
 
1270
  $nodes['columns'][ $group_col->node ] = $group_col;
1271
- $modules = self::get_modules( $group_col );
1272
 
1273
  foreach ( $modules as $module ) {
1274
  $nodes['modules'][ $module->node ] = $module;
@@ -1282,17 +1285,17 @@ final class FLBuilderModel {
1282
  foreach ( $rows as $row ) {
1283
 
1284
  $nodes['rows'][ $row->node ] = $row;
1285
- $groups = self::get_nodes( 'column-group', $row );
1286
 
1287
  foreach ( $groups as $group ) {
1288
 
1289
  $nodes['groups'][ $group->node ] = $group;
1290
- $cols = self::get_nodes( 'column', $group );
1291
 
1292
  foreach ( $cols as $col ) {
1293
 
1294
  $nodes['columns'][ $col->node ] = $col;
1295
- $col_children = self::get_nodes( null, $col );
1296
 
1297
  foreach ( $col_children as $col_child ) {
1298
 
@@ -1306,12 +1309,12 @@ final class FLBuilderModel {
1306
  } elseif ( 'column-group' == $col_child->type ) {
1307
 
1308
  $nodes['groups'][ $col_child->node ] = $col_child;
1309
- $group_cols = self::get_nodes( 'column', $col_child );
1310
 
1311
  foreach ( $group_cols as $group_col ) {
1312
 
1313
  $nodes['columns'][ $group_col->node ] = $group_col;
1314
- $modules = self::get_modules( $group_col );
1315
 
1316
  foreach ( $modules as $module ) {
1317
  $nodes['modules'][ $module->node ] = $module;
@@ -1337,13 +1340,13 @@ final class FLBuilderModel {
1337
  * @return object
1338
  */
1339
  static public function get_node_settings( $node, $filter = true ) {
1340
- $node = is_object( $node ) ? $node : self::get_node( $node );
1341
  $post_data = self::get_post_data();
1342
 
1343
  // Get the node settings for a node template's root node?
1344
  if ( self::is_node_template_root( $node ) && ! self::is_post_node_template() ) {
1345
  $template_post_id = self::get_node_template_post_id( $node->template_id );
1346
- $template_data = self::get_layout_data( 'published', $template_post_id );
1347
 
1348
  // Fallback to draft data if we don't have published data.
1349
  if ( ! isset( $template_data[ $node->template_node_id ] ) ) {
@@ -1352,7 +1355,7 @@ final class FLBuilderModel {
1352
 
1353
  // Set the node settings to the template node settings.
1354
  if ( isset( $template_data[ $node->template_node_id ] ) ) {
1355
- $template_node = $template_data[ $node->template_node_id ];
1356
  $template_settings = clone $template_node->settings;
1357
 
1358
  if ( 'column' == $node->type ) {
@@ -1586,10 +1589,10 @@ final class FLBuilderModel {
1586
  */
1587
  static public function call_module_delete( $node ) {
1588
  if ( 'module' == $node->type && isset( self::$modules[ $node->settings->type ] ) ) {
1589
- $class = get_class( self::$modules[ $node->settings->type ] );
1590
- $instance = new $class();
1591
- $instance->node = $node->node;
1592
- $instance->parent = $node->parent;
1593
  $instance->settings = $node->settings;
1594
  $instance->delete();
1595
  $instance->remove();
@@ -1606,11 +1609,11 @@ final class FLBuilderModel {
1606
  * @return void
1607
  */
1608
  static public function reorder_node( $node_id = null, $position = 0 ) {
1609
- $data = self::get_layout_data();
1610
- $node = $data[ $node_id ];
1611
- $type = ! $node->parent ? $node->type : null;
1612
- $nodes = self::get_nodes( $type, $node->parent );
1613
- $new_pos = 0;
1614
 
1615
  // Make sure node positions start at zero.
1616
  foreach ( $nodes as $node ) {
@@ -1619,9 +1622,9 @@ final class FLBuilderModel {
1619
  }
1620
 
1621
  // Get the node and remove it from the array.
1622
- $node = $data[ $node_id ];
1623
- $removed = array_splice( $nodes, $node->position, 1 );
1624
- $new_pos = 0;
1625
 
1626
  // Reposition it in the array.
1627
  array_splice( $nodes, $position, 0, $removed );
@@ -1646,11 +1649,11 @@ final class FLBuilderModel {
1646
  * @return void
1647
  */
1648
  static public function move_node( $node_id = null, $new_parent_id = null, $position = 0 ) {
1649
- $data = self::get_layout_data();
1650
- $new_parent = self::get_node( $new_parent_id );
1651
- $node = self::get_node( $node_id );
1652
- $siblings = self::get_nodes( null, $node->parent );
1653
- $sibling_pos = 0;
1654
 
1655
  // Set the node's new parent.
1656
  $data[ $node_id ]->parent = $new_parent->node;
@@ -1681,17 +1684,17 @@ final class FLBuilderModel {
1681
  * @return object The new row object.
1682
  */
1683
  static public function add_row( $cols = '1-col', $position = false, $module = null ) {
1684
- $data = self::get_layout_data();
1685
- $settings = self::get_row_defaults();
1686
- $row_node_id = self::generate_node_id();
1687
 
1688
  // Add the row.
1689
- $data[ $row_node_id ] = new StdClass();
1690
- $data[ $row_node_id ]->node = $row_node_id;
1691
- $data[ $row_node_id ]->type = 'row';
1692
- $data[ $row_node_id ]->parent = null;
1693
- $data[ $row_node_id ]->position = self::next_node_position( 'row' );
1694
- $data[ $row_node_id ]->settings = $settings;
1695
 
1696
  // Update the layout data.
1697
  self::update_layout_data( $data );
@@ -1707,7 +1710,7 @@ final class FLBuilderModel {
1707
  // Move an existing module to the row.
1708
  if ( $module ) {
1709
  $cols = self::get_nodes( 'column', $group->node );
1710
- $col = array_shift( $cols );
1711
  self::move_node( $module, $col->node, 0 );
1712
  }
1713
 
@@ -1725,17 +1728,17 @@ final class FLBuilderModel {
1725
  * @return void
1726
  */
1727
  static public function copy_row( $node_id = null, $settings = null, $settings_id = null ) {
1728
- $layout_data = self::get_layout_data();
1729
- $row = self::get_node( $node_id );
1730
- $new_row_id = self::generate_node_id();
1731
- $col_groups = self::get_nodes( 'column-group', $row );
1732
- $new_nodes = array();
1733
- $template_cols = array();
1734
 
1735
  // Add the new row.
1736
- $layout_data[ $new_row_id ] = clone $row;
1737
- $layout_data[ $new_row_id ]->settings = clone $row->settings;
1738
- $layout_data[ $new_row_id ]->node = $new_row_id;
1739
 
1740
  // Unset row template data.
1741
  if ( isset( $layout_data[ $new_row_id ]->template_id ) ) {
@@ -1747,14 +1750,14 @@ final class FLBuilderModel {
1747
  // Get the new child nodes.
1748
  foreach ( $col_groups as $col_group ) {
1749
 
1750
- $new_nodes[ $col_group->node ] = clone $col_group;
1751
- $cols = self::get_nodes( 'column', $col_group );
1752
 
1753
  foreach ( $cols as $col ) {
1754
 
1755
- $new_nodes[ $col->node ] = clone $col;
1756
- $new_nodes[ $col->node ]->settings = clone $col->settings;
1757
- $nodes = self::get_nodes( null, $col );
1758
 
1759
  foreach ( $nodes as $node ) {
1760
 
@@ -1768,12 +1771,12 @@ final class FLBuilderModel {
1768
 
1769
  foreach ( $nested_cols as $nested_col ) {
1770
 
1771
- $new_nodes[ $nested_col->node ] = clone $nested_col;
1772
  $new_nodes[ $nested_col->node ]->settings = clone $nested_col->settings;
1773
- $modules = self::get_nodes( 'module', $nested_col );
1774
 
1775
  foreach ( $modules as $module ) {
1776
- $new_nodes[ $module->node ] = clone $module;
1777
  $new_nodes[ $module->node ]->settings = self::clone_module_settings( $module->settings );
1778
  }
1779
  }
@@ -1866,9 +1869,9 @@ final class FLBuilderModel {
1866
  $mp4 = FLBuilderPhoto::get_attachment_data( $new_settings->bg_video );
1867
 
1868
  if ( $mp4 ) {
1869
- $parts = explode( '.', $mp4->filename );
1870
- $mp4->extension = array_pop( $parts );
1871
- $new_settings->bg_video_data = $mp4;
1872
  $new_settings->bg_video_data->fallback = $fallback;
1873
  }
1874
 
@@ -1876,9 +1879,9 @@ final class FLBuilderModel {
1876
  $webm = FLBuilderPhoto::get_attachment_data( $new_settings->bg_video_webm );
1877
 
1878
  if ( $webm ) {
1879
- $parts = explode( '.', $webm->filename );
1880
- $webm->extension = array_pop( $parts );
1881
- $new_settings->bg_video_webm_data = $webm;
1882
  $new_settings->bg_video_webm_data->fallback = $fallback;
1883
  }
1884
  }
@@ -1893,11 +1896,11 @@ final class FLBuilderModel {
1893
  }
1894
 
1895
  // Hijack the slideshow module to get WordPress photo data.
1896
- $ss = new FLSlideshowModule();
1897
- $ss->settings = new StdClass();
1898
- $ss->settings->photos = $new_settings->ss_photos;
1899
- $ss->settings->photo_data = $row->settings->ss_photo_data;
1900
- $new_settings->ss_photo_data = $ss->get_wordpress_photos();
1901
  }
1902
 
1903
  return $new_settings;
@@ -1917,7 +1920,7 @@ final class FLBuilderModel {
1917
  if ( 'video' == $row->settings->bg_type ) {
1918
 
1919
  if ( isset( $row->settings->bg_video_data ) ) {
1920
- $data = array();
1921
  $data['mp4'] = $row->settings->bg_video_data;
1922
  }
1923
  if ( isset( $row->settings->bg_video_webm_data ) ) {
@@ -1954,12 +1957,12 @@ final class FLBuilderModel {
1954
  }
1955
 
1956
  // Hijack the slideshow module to get the source.
1957
- $ss = new FLSlideshowModule();
1958
- $ss->settings = new StdClass();
1959
- $ss->settings->source = $row->settings->ss_source;
1960
- $ss->settings->photos = $row->settings->ss_photos;
1961
- $ss->settings->feed_url = $row->settings->ss_feed_url;
1962
- $ss->settings->photo_data = $row->settings->ss_photo_data;
1963
 
1964
  // Return the slideshow source.
1965
  return $ss->get_source();
@@ -1974,10 +1977,10 @@ final class FLBuilderModel {
1974
  * @return void
1975
  */
1976
  static public function resize_row_content( $node_id, $width ) {
1977
- $data = self::get_layout_data();
1978
- $row = self::get_node( $node_id );
1979
  $row->settings->max_content_width = $width;
1980
- $data[ $node_id ] = $row;
1981
  self::update_layout_data( $data );
1982
  }
1983
 
@@ -1992,22 +1995,22 @@ final class FLBuilderModel {
1992
  * @return object The new column group object.
1993
  */
1994
  static public function add_col_group( $node_id = null, $cols = '1-col', $position = false, $module = null ) {
1995
- $data = self::get_layout_data();
1996
- $group_node_id = self::generate_node_id();
1997
- $parent = self::get_node( $node_id );
1998
- $old_group = null;
1999
 
2000
  // Add the column group.
2001
- $data[ $group_node_id ] = new StdClass();
2002
- $data[ $group_node_id ]->node = $group_node_id;
2003
- $data[ $group_node_id ]->type = 'column-group';
2004
- $data[ $group_node_id ]->parent = $node_id;
2005
- $data[ $group_node_id ]->position = self::next_node_position( null, $node_id );
2006
- $data[ $group_node_id ]->settings = '';
2007
 
2008
  // Add node template data.
2009
  if ( self::is_node_global( $parent ) ) {
2010
- $data[ $group_node_id ]->template_id = $parent->template_id;
2011
  $data[ $group_node_id ]->template_node_id = $group_node_id;
2012
  }
2013
 
@@ -2016,17 +2019,17 @@ final class FLBuilderModel {
2016
 
2017
  for ( $i = 0; $i < count( self::$row_layouts[ $cols ] ); $i++ ) {
2018
 
2019
- $col_node_id = self::generate_node_id();
2020
- $data[ $col_node_id ] = new StdClass();
2021
- $data[ $col_node_id ]->node = $col_node_id;
2022
- $data[ $col_node_id ]->type = 'column';
2023
- $data[ $col_node_id ]->parent = $group_node_id;
2024
- $data[ $col_node_id ]->position = $i;
2025
- $data[ $col_node_id ]->settings = new StdClass();
2026
  $data[ $col_node_id ]->settings->size = self::$row_layouts[ $cols ][ $i ];
2027
 
2028
  if ( self::is_node_global( $parent ) ) {
2029
- $data[ $col_node_id ]->template_id = $parent->template_id;
2030
  $data[ $col_node_id ]->template_node_id = $col_node_id;
2031
  }
2032
  }
@@ -2042,7 +2045,7 @@ final class FLBuilderModel {
2042
  $data[ $cols ]->settings->size = 100;
2043
 
2044
  if ( self::is_node_global( $parent ) ) {
2045
- $data[ $cols ]->template_id = $parent->template_id;
2046
  $data[ $cols ]->template_node_id = $data[ $cols ]->node;
2047
  }
2048
 
@@ -2076,7 +2079,7 @@ final class FLBuilderModel {
2076
  // Move an existing module to the group.
2077
  if ( $module ) {
2078
  $cols = self::get_nodes( 'column', $group_node_id );
2079
- $col = array_shift( $cols );
2080
  self::move_node( $module, $col->node, 0 );
2081
  }
2082
 
@@ -2104,16 +2107,16 @@ final class FLBuilderModel {
2104
  $new_settings->size = self::resize_col( $col->node, $new_settings->size );
2105
 
2106
  // Update other sibling vars as needed.
2107
- $equal_height = false;
2108
- $content_alignment = false;
2109
- $responsive_order = false;
2110
 
2111
  // Adjust sibling equal height?
2112
  if ( $col->settings->equal_height != $new_settings->equal_height ) {
2113
  $equal_height = $new_settings->equal_height;
2114
  }
2115
 
2116
- // Adjust sibling content alignment?
2117
  if ( $col->settings->content_alignment != $new_settings->content_alignment ) {
2118
  $content_alignment = $new_settings->content_alignment;
2119
  }
@@ -2241,16 +2244,16 @@ final class FLBuilderModel {
2241
  * @return int The new width
2242
  */
2243
  static public function resize_col( $node_id = null, $new_width = 100 ) {
2244
- $data = self::get_layout_data();
2245
- $col = $data[ $node_id ];
2246
- $group = $data[ $col->parent ];
2247
- $cols = array_values( self::get_nodes( 'column', $group->node ) );
2248
- $pos = $col->position;
2249
- $siblings = array();
2250
  $siblings_width = 0;
2251
- $num_cols = count( $cols );
2252
- $min_width = 8;
2253
- $max_width = 100 - $min_width;
2254
 
2255
  // Don't resize if only one column or width isn't a number.
2256
  if ( 1 == $num_cols || ! is_numeric( $new_width ) ) {
@@ -2279,8 +2282,8 @@ final class FLBuilderModel {
2279
  continue;
2280
  }
2281
 
2282
- $siblings[] = $c;
2283
- $max_width -= $c->settings->size;
2284
  $siblings_width += $c->settings->size;
2285
  }
2286
 
@@ -2345,10 +2348,10 @@ final class FLBuilderModel {
2345
  return;
2346
  }
2347
 
2348
- $data = self::get_layout_data();
2349
- $post_data = self::get_post_data();
2350
- $cols = self::get_nodes( 'column', $group_id );
2351
- $width = round( 100 / count( $cols ), 3 );
2352
 
2353
  foreach ( $cols as $col_id => $col ) {
2354
  $data[ $col_id ]->settings->size = $width;
@@ -2406,13 +2409,13 @@ final class FLBuilderModel {
2406
  * @return object
2407
  */
2408
  static public function add_cols( $col_id, $insert = 'before', $type = '1-col', $nested = false, $module = null ) {
2409
- $data = self::get_layout_data();
2410
- $col = self::get_node( $col_id );
2411
- $parent = self::get_node( $col->parent );
2412
- $cols = self::get_nodes( 'column', $col->parent );
2413
  $global = self::is_node_global( $parent );
2414
  $num_new_cols = count( self::$row_layouts[ $type ] );
2415
- $num_cols = count( $cols );
2416
  $max_cols = $nested ? 4 : 12;
2417
  $reposition = false;
2418
  $position = 0;
@@ -2444,18 +2447,18 @@ final class FLBuilderModel {
2444
  // Add the new columns.
2445
  for ( $i = 0; $i < $num_new_cols; $i++ ) {
2446
 
2447
- $new_col_id = self::generate_node_id();
2448
- $data[ $new_col_id ] = new StdClass();
2449
- $data[ $new_col_id ]->node = $new_col_id;
2450
- $data[ $new_col_id ]->type = 'column';
2451
- $data[ $new_col_id ]->parent = $parent->node;
2452
- $data[ $new_col_id ]->position = $new_col_position;
2453
- $data[ $new_col_id ]->settings = new StdClass();
2454
- $data[ $new_col_id ]->settings->size = $new_width;
2455
 
2456
  // Add node template data.
2457
  if ( $global ) {
2458
- $data[ $new_col_id ]->template_id = $parent->template_id;
2459
  $data[ $new_col_id ]->template_node_id = $new_col_id;
2460
  }
2461
 
@@ -2506,19 +2509,19 @@ final class FLBuilderModel {
2506
  * @return string|null The new parent ID or null if none exists.
2507
  */
2508
  static public function add_col_parent( $parent_id = null, $position = null ) {
2509
- $data = self::get_layout_data();
2510
- $parent = ! $parent_id ? null : self::get_node( $parent_id );
2511
 
2512
  if ( ! $parent ) {
2513
  // Add a new row if we don't have a parent, but don't add column.
2514
- $row = self::add_row( null, $position );
2515
  $col_groups = self::get_nodes( 'column-group', $row->node );
2516
- $col_group = array_shift( $col_groups );
2517
- $parent_id = $col_group->node;
2518
  } elseif ( 'row' == $parent->type ) {
2519
  // Add a new column group if the parent is a row, but don't add column.
2520
- $col_group = self::add_col_group( $parent->node, null, $position );
2521
- $parent_id = $col_group->node;
2522
  }
2523
 
2524
  return $parent_id;
@@ -2534,7 +2537,7 @@ final class FLBuilderModel {
2534
  */
2535
  static public function get_col_parent( $type, $column_id ) {
2536
  $column = is_object( $column_id ) ? $column_id : self::get_node( $column_id );
2537
- $nodes = self::get_categorized_nodes();
2538
 
2539
  foreach ( $nodes['groups'] as $group ) {
2540
 
@@ -2567,16 +2570,16 @@ final class FLBuilderModel {
2567
  */
2568
  static public function copy_col( $node_id = null, $settings = null, $settings_id = null ) {
2569
  $layout_data = self::get_layout_data();
2570
- $col = self::get_node( $node_id );
2571
- $new_col_id = self::generate_node_id();
2572
- $nodes = self::get_nodes( null, $col );
2573
- $parent = self::get_node_parent( $node_id );
2574
- $new_nodes = array();
2575
 
2576
  // Add the new column.
2577
- $layout_data[ $new_col_id ] = clone $col;
2578
- $layout_data[ $new_col_id ]->settings = clone $col->settings;
2579
- $layout_data[ $new_col_id ]->node = $new_col_id;
2580
 
2581
  // Unset column template data.
2582
  if ( isset( $layout_data[ $new_col_id ]->template_id ) ) {
@@ -2588,7 +2591,7 @@ final class FLBuilderModel {
2588
 
2589
  // Check if parent is a global node.
2590
  if ( self::is_node_global( $parent ) ) {
2591
- $layout_data[ $new_col_id ]->template_id = $parent->template_id;
2592
  $layout_data[ $new_col_id ]->template_node_id = $new_col_id;
2593
  } else {
2594
  unset( $layout_data[ $new_col_id ]->template_id );
@@ -2611,12 +2614,12 @@ final class FLBuilderModel {
2611
 
2612
  foreach ( $nested_cols as $nested_col ) {
2613
 
2614
- $new_nodes[ $nested_col->node ] = clone $nested_col;
2615
  $new_nodes[ $nested_col->node ]->settings = clone $nested_col->settings;
2616
- $modules = self::get_nodes( 'module', $nested_col );
2617
 
2618
  foreach ( $modules as $module ) {
2619
- $new_nodes[ $module->node ] = clone $module;
2620
  $new_nodes[ $module->node ]->settings = self::clone_module_settings( $module->settings );
2621
  }
2622
  }
@@ -2643,7 +2646,7 @@ final class FLBuilderModel {
2643
  if ( isset( $new_nodes[ $child_node_id ]->template_id ) ) {
2644
  // Check if the column is global.
2645
  if ( isset( $layout_data[ $new_col_id ]->template_node_id ) ) {
2646
- $new_nodes[ $child_node_id ]->template_id = $parent->template_id;
2647
  $new_nodes[ $child_node_id ]->template_node_id = $child_node_id;
2648
  } else {
2649
  unset( $new_nodes[ $child_node_id ]->template_id );
@@ -2688,7 +2691,11 @@ final class FLBuilderModel {
2688
  */
2689
  static public function load_modules() {
2690
  $paths = glob( FL_BUILDER_DIR . 'modules/*' );
2691
- $paths = apply_filters( 'fl_builder_load_modules_paths', $paths );
 
 
 
 
2692
  $module_path = '';
2693
 
2694
  // Make sure we have an array.
@@ -2708,10 +2715,10 @@ final class FLBuilderModel {
2708
  $slug = basename( $path );
2709
 
2710
  // Paths to check.
2711
- $module_path = $slug . '/' . $slug . '.php';
2712
- $child_path = get_stylesheet_directory() . '/fl-builder/modules/' . $module_path;
2713
- $theme_path = get_template_directory() . '/fl-builder/modules/' . $module_path;
2714
- $builder_path = FL_BUILDER_DIR . 'modules/' . $module_path;
2715
 
2716
  // Check for the module class in a child theme.
2717
  if ( is_child_theme() && file_exists( $child_path ) ) {
@@ -2722,7 +2729,10 @@ final class FLBuilderModel {
2722
  require_once $builder_path;
2723
  }
2724
  }
2725
-
 
 
 
2726
  do_action( 'fl_builder_register_extensions' );
2727
  }
2728
 
@@ -2761,7 +2771,7 @@ final class FLBuilderModel {
2761
  * @see fl_builder_register_settings_form
2762
  * @link https://kb.wpbeaverbuilder.com/article/117-plugin-filter-reference
2763
  */
2764
- self::$modules[ $instance->slug ]->form = apply_filters( 'fl_builder_register_settings_form', $form, $instance->slug );
2765
  self::$modules[ $instance->slug ]->form['advanced'] = self::$settings_forms['module_advanced'];
2766
  }
2767
  }
@@ -2780,17 +2790,21 @@ final class FLBuilderModel {
2780
  _doing_it_wrong( __CLASS__ . '::register_module_alias', sprintf( _x( 'The module alias %s already exists! Please namespace your module aliases to ensure compatibility with Beaver Builder.', '%s stands for the module alias key', 'fl-builder' ), $alias ), '1.10' );
2781
  return;
2782
  }
 
 
 
2783
 
2784
- $instance = new stdClass;
2785
- $instance->alias = $alias;
2786
- $instance->slug = isset( $config['module'] ) ? $config['module'] : null;
2787
- $instance->name = isset( $config['name'] ) ? $config['name'] : $slug;
2788
- $instance->description = isset( $config['description'] ) ? $config['description'] : '';
2789
- $instance->category = isset( $config['category'] ) ? $config['category'] : null;
2790
- $instance->group = isset( $config['group'] ) ? $config['group'] : null;
2791
- $instance->settings = isset( $config['settings'] ) ? $config['settings'] : array();
2792
- $instance->enabled = isset( $config['enabled'] ) ? $config['enabled'] : true;
2793
- $instance->icon = isset( $config['icon'] ) ? $config['icon'] : FLBuilderModule::get_default_icon();
 
2794
 
2795
  self::$module_aliases[ $alias ] = $instance;
2796
  }
@@ -2860,7 +2874,7 @@ final class FLBuilderModel {
2860
  $setting = self::get_default_enabled_modules();
2861
  } elseif ( in_array( 'all', $setting ) ) {
2862
  // Redefine $setting in case new modules have been installed since the last save.
2863
- $setting = array_keys( self::$modules );
2864
  $setting[] = 'all';
2865
  }
2866
 
@@ -2903,6 +2917,20 @@ final class FLBuilderModel {
2903
  }
2904
  }
2905
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2906
  // Add module template groups.
2907
  if ( isset( $templates['groups'] ) ) {
2908
  foreach ( $templates['groups'] as $slug => $data ) {
@@ -2936,14 +2964,14 @@ final class FLBuilderModel {
2936
  }
2937
 
2938
  // Build the default category arrays.
2939
- $categories[ __( 'Basic', 'fl-builder' ) ] = array();
2940
- $categories[ __( 'Media', 'fl-builder' ) ] = array();
2941
- $categories[ __( 'Actions', 'fl-builder' ) ] = array();
2942
- $categories[ __( 'Layout', 'fl-builder' ) ] = array();
2943
- $categories[ __( 'Info', 'fl-builder' ) ] = array();
2944
- $categories[ __( 'Posts', 'fl-builder' ) ] = array();
2945
  $categories[ __( 'Advanced', 'fl-builder' ) ] = array();
2946
- $categories[ __( 'Other', 'fl-builder' ) ] = array();
2947
 
2948
  return $categories;
2949
  }
@@ -2956,11 +2984,11 @@ final class FLBuilderModel {
2956
  * @return array
2957
  */
2958
  static public function get_categorized_modules( $show_disabled = false ) {
2959
- $enabled_modules = self::get_enabled_modules();
2960
- $widgets = null;
2961
- $categories = self::get_module_categories();
2962
- $other_key = __( 'Other', 'fl-builder' );
2963
- $widgets_key = __( 'WordPress Widgets', 'fl-builder' );
2964
 
2965
  // Build the categories array.
2966
  foreach ( self::$modules as $module ) {
@@ -3023,9 +3051,9 @@ final class FLBuilderModel {
3023
  */
3024
  static public function get_uncategorized_modules( $show_disabled = false ) {
3025
  $enabled_modules = self::get_enabled_modules();
3026
- $modules = array();
3027
- $aliases = self::$module_aliases;
3028
- $widgets = FLBuilderModel::get_wp_widgets();
3029
 
3030
  foreach ( self::$modules as $module ) {
3031
 
@@ -3037,11 +3065,11 @@ final class FLBuilderModel {
3037
  continue;
3038
  }
3039
 
3040
- $module = clone (object) $module;
3041
- $module->kind = 'module';
3042
  $module->isWidget = false; // @codingStandardsIgnoreLine
3043
- $module->isAlias = false; // @codingStandardsIgnoreLine
3044
- $module->group = $module->group ? array( sanitize_key( $module->group ) ) : array( 'standard' );
3045
 
3046
  if ( ! isset( $module->icon ) || '' == $module->icon ) {
3047
  $module->icon = FLBuilderModule::get_default_icon();
@@ -3072,10 +3100,10 @@ final class FLBuilderModel {
3072
  $categories[ $config->category ] = array();
3073
  }
3074
 
3075
- $config->kind = 'module';
3076
  $config->isWidget = false; // @codingStandardsIgnoreLine
3077
  $config->isAlias = true; // @codingStandardsIgnoreLine
3078
- $config->group = $config->group ? array( sanitize_key( $config->group ) ) : array( 'standard' );
3079
 
3080
  $modules[] = $config;
3081
  }
@@ -3084,13 +3112,13 @@ final class FLBuilderModel {
3084
  if ( in_array( 'widget', $enabled_modules ) ) {
3085
  foreach ( $widgets as $widget ) {
3086
 
3087
- $data = new stdClass;
3088
- $widget = (object) $widget;
3089
- $data->id = $widget->id;
3090
- $data->name = $widget->name;
3091
- $data->class = $widget->class;
3092
- $data->category = $widget->category;
3093
- $data->kind = 'module';
3094
  $data->isWidget = true; // @codingStandardsIgnoreLine
3095
  $data->isAlias = false; // @codingStandardsIgnoreLine
3096
  $data->description = isset( $widget->widget_options['description'] ) ? $widget->widget_options['description'] : '';
@@ -3119,19 +3147,19 @@ final class FLBuilderModel {
3119
 
3120
  if ( self::is_module_registered( $module->settings->type ) ) {
3121
 
3122
- $class = get_class( self::$modules[ $module->settings->type ] );
3123
- $instance = new $class();
3124
- $instance->node = $module->node;
3125
- $instance->parent = $module->parent;
3126
  $instance->position = $module->position;
3127
  $instance->settings = $module->settings;
3128
- $instance->type = 'module';
3129
- $instance->form = self::$modules[ $module->settings->type ]->form;
3130
- $instance->icon = isset( $module->icon ) ? $module->icon : FLBuilderModule::get_default_icon();
3131
 
3132
  if ( isset( $module->template_id ) ) {
3133
- $instance->template_id = $module->template_id;
3134
- $instance->template_node_id = $module->template_node_id;
3135
  }
3136
  if ( isset( $module->template_root_node ) ) {
3137
  $instance->template_root_node = true;
@@ -3152,27 +3180,27 @@ final class FLBuilderModel {
3152
  * @return array
3153
  */
3154
  static public function get_modules( $col_id = null ) {
3155
- $col = is_object( $col_id ) ? $col_id : self::get_node( $col_id );
3156
- $modules = self::get_nodes( 'module', $col );
3157
- $instances = array();
3158
- $i = 0;
3159
 
3160
  foreach ( $modules as $module ) {
3161
 
3162
  if ( self::is_module_registered( $module->settings->type ) ) {
3163
 
3164
- $class = get_class( self::$modules[ $module->settings->type ] );
3165
- $instances[ $i ] = new $class();
3166
- $instances[ $i ]->node = $module->node;
3167
- $instances[ $i ]->parent = $module->parent;
3168
- $instances[ $i ]->position = $module->position;
3169
- $instances[ $i ]->settings = $module->settings;
3170
- $instances[ $i ]->type = 'module';
3171
- $instances[ $i ]->icon = isset( $module->icon ) ? $module->icon : FLBuilderModule::get_default_icon();
3172
- $instances[ $i ]->form = self::$modules[ $module->settings->type ]->form;
3173
 
3174
  if ( isset( $module->template_id ) ) {
3175
- $instances[ $i ]->template_id = $module->template_id;
3176
  $instances[ $i ]->template_node_id = $module->template_node_id;
3177
  }
3178
  if ( isset( $module->template_root_node ) ) {
@@ -3207,30 +3235,30 @@ final class FLBuilderModel {
3207
  * @return object The new module object.
3208
  */
3209
  static public function add_module( $type = null, $settings = array(), $parent_id = null, $position = false ) {
3210
- $data = self::get_layout_data();
3211
- $parent = self::get_node( $parent_id );
3212
- $module_node_id = self::generate_node_id();
3213
- $settings->type = $type;
3214
 
3215
  // Run module update method.
3216
- $class = get_class( self::$modules[ $type ] );
3217
- $instance = new $class();
3218
- $instance->node = $module_node_id;
3219
- $instance->settings = $settings;
3220
- $settings = $instance->update( $settings );
3221
 
3222
  // Save the module.
3223
- $data[ $module_node_id ] = new StdClass();
3224
- $data[ $module_node_id ]->node = $module_node_id;
3225
- $data[ $module_node_id ]->type = 'module';
3226
- $data[ $module_node_id ]->parent = $parent_id;
3227
- $data[ $module_node_id ]->position = self::next_node_position( 'module', $parent_id );
3228
- $data[ $module_node_id ]->settings = $settings;
3229
 
3230
  // Add node template data.
3231
  if ( self::is_node_global( $parent ) ) {
3232
- $data[ $module_node_id ]->template_id = $parent->template_id;
3233
- $data[ $module_node_id ]->template_node_id = $module_node_id;
3234
  }
3235
 
3236
  // Update the layout data.
@@ -3259,22 +3287,22 @@ final class FLBuilderModel {
3259
 
3260
  if ( ! $parent ) {
3261
  // Add a new row if we don't have a parent.
3262
- $row = self::add_row( '1-col', $position );
3263
  $col_groups = self::get_nodes( 'column-group', $row->node );
3264
- $col_group = array_shift( $col_groups );
3265
- $cols = self::get_nodes( 'column', $col_group->node );
3266
- $parent = array_shift( $cols );
3267
- $parent_id = $parent->node;
3268
  } elseif ( 'row' == $parent->type ) {
3269
  // Add a new column group if the parent is a row.
3270
- $col_group = self::add_col_group( $parent->node, '1-col', $position );
3271
- $cols = self::get_nodes( 'column', $col_group->node );
3272
- $parent = array_shift( $cols );
3273
- $parent_id = $parent->node;
3274
  } elseif ( 'column-group' == $parent->type ) {
3275
  // Add a new column if the parent is a column group.
3276
- $parent = self::add_col( $parent->node, $position );
3277
- $parent_id = $parent->node;
3278
  }
3279
 
3280
  return $parent_id;
@@ -3290,7 +3318,7 @@ final class FLBuilderModel {
3290
  */
3291
  static public function get_module_parent( $type, $module_id ) {
3292
  $module = is_object( $module_id ) ? $module_id : self::get_module( $module_id );
3293
- $nodes = self::get_categorized_nodes();
3294
 
3295
  foreach ( $nodes['columns'] as $column ) {
3296
 
@@ -3334,14 +3362,14 @@ final class FLBuilderModel {
3334
  * @return array $defaults Default settings for the module.
3335
  */
3336
  static public function add_default_module( $parent_id = null, $type = null, $position = null, $defaults = null ) {
3337
- $parent = ( 0 == $parent_id ) ? null : self::get_node( $parent_id );
3338
- $settings = self::get_module_defaults( $type );
3339
  $module_node_id = self::generate_node_id();
3340
 
3341
  // Add a new parent if one is needed.
3342
  if ( ! $parent || 'row' == $parent->type || 'column-group' == $parent->type ) {
3343
  $parent_id = self::add_module_parent( $parent_id, $position );
3344
- $parent = self::get_node( $parent_id );
3345
  $position = null;
3346
  }
3347
 
@@ -3351,25 +3379,25 @@ final class FLBuilderModel {
3351
  }
3352
 
3353
  // Run module update method.
3354
- $class = get_class( self::$modules[ $type ] );
3355
- $instance = new $class();
3356
- $instance->node = $module_node_id;
3357
- $instance->settings = $settings;
3358
- $settings = $instance->update( $settings );
3359
 
3360
  // Save the module.
3361
- $data = self::get_layout_data();
3362
- $data[ $module_node_id ] = new StdClass();
3363
- $data[ $module_node_id ]->node = $module_node_id;
3364
- $data[ $module_node_id ]->type = 'module';
3365
- $data[ $module_node_id ]->parent = $parent_id;
3366
- $data[ $module_node_id ]->position = self::next_node_position( 'module', $parent_id );
3367
- $data[ $module_node_id ]->settings = $settings;
3368
 
3369
  // Add node template data.
3370
  if ( self::is_node_global( $parent ) ) {
3371
- $data[ $module_node_id ]->template_id = $parent->template_id;
3372
- $data[ $module_node_id ]->template_node_id = $module_node_id;
3373
  }
3374
 
3375
  // Update the layout data.
@@ -3393,7 +3421,7 @@ final class FLBuilderModel {
3393
  * @return object The new module object.
3394
  */
3395
  static public function copy_module( $node_id = null, $settings = null ) {
3396
- $module = self::get_module( $node_id );
3397
 
3398
  if ( $settings ) {
3399
  $module->settings = (object) array_merge( (array) $module->settings, (array) $settings );
@@ -3412,10 +3440,10 @@ final class FLBuilderModel {
3412
  */
3413
  static public function process_module_settings( $module, $new_settings ) {
3414
  // Get a new node instance to work with.
3415
- $class = get_class( self::$modules[ $module->settings->type ] );
3416
- $instance = new $class();
3417
- $instance->node = $module->node;
3418
- $instance->parent = $module->parent;
3419
  $instance->settings = $module->settings;
3420
 
3421
  // Run node delete to clear any cache.
@@ -3423,7 +3451,7 @@ final class FLBuilderModel {
3423
 
3424
  // Run node update.
3425
  $instance->settings = $new_settings;
3426
- $new_settings = $instance->update( $new_settings );
3427
 
3428
  return $new_settings;
3429
  }
@@ -3460,8 +3488,8 @@ final class FLBuilderModel {
3460
  $defaults = new StdClass();
3461
 
3462
  if ( isset( self::$modules[ $type ]->form ) ) {
3463
- $defaults = self::get_settings_form_defaults( $type );
3464
- $defaults = self::merge_nested_module_defaults( $type, $defaults );
3465
  $defaults->type = $type;
3466
  }
3467
  } else {
@@ -3499,7 +3527,10 @@ final class FLBuilderModel {
3499
 
3500
  $widgets = array();
3501
 
3502
- // These are known widgets that won't work in the builder.
 
 
 
3503
  $exclude = apply_filters( 'fl_get_wp_widgets_exclude', array(
3504
  'WP_Widget_Media_Audio',
3505
  'WP_Widget_Media_Image',
@@ -3553,48 +3584,48 @@ final class FLBuilderModel {
3553
  static public function get_column_groups() {
3554
  $cols = array(
3555
  array(
3556
- 'name' => __( '1 Column', 'fl-builder' ),
3557
- 'id' => '1-col',
3558
  'count' => 1,
3559
  ),
3560
  array(
3561
- 'name' => __( '2 Columns', 'fl-builder' ),
3562
- 'id' => '2-cols',
3563
  'count' => 2,
3564
  ),
3565
  array(
3566
- 'name' => __( '3 Columns', 'fl-builder' ),
3567
- 'id' => '3-cols',
3568
  'count' => 3,
3569
  ),
3570
  array(
3571
- 'name' => __( '4 Columns', 'fl-builder' ),
3572
- 'id' => '4-cols',
3573
  'count' => 4,
3574
  ),
3575
  array(
3576
- 'name' => __( '5 Columns', 'fl-builder' ),
3577
- 'id' => '5-cols',
3578
  'count' => 5,
3579
  ),
3580
  array(
3581
- 'name' => __( '6 Columns', 'fl-builder' ),
3582
- 'id' => '6-cols',
3583
  'count' => 6,
3584
  ),
3585
  array(
3586
- 'name' => __( 'Left Sidebar', 'fl-builder' ),
3587
- 'id' => 'left-sidebar',
3588
  'count' => 2,
3589
  ),
3590
  array(
3591
- 'name' => __( 'Right Sidebar', 'fl-builder' ),
3592
- 'id' => 'right-sidebar',
3593
  'count' => 2,
3594
  ),
3595
  array(
3596
- 'name' => __( 'Left & Right Sidebar', 'fl-builder' ),
3597
- 'id' => 'left-right-sidebar',
3598
  'count' => 3,
3599
  ),
3600
  );
@@ -3712,10 +3743,10 @@ final class FLBuilderModel {
3712
  // Check the registered forms first.
3713
  if ( isset( self::$settings_forms[ $type ] ) ) {
3714
  $form_type = $type;
3715
- $tabs = self::$settings_forms[ $type ]['tabs'];
3716
  } elseif ( isset( self::$modules[ $type ] ) ) {
3717
  $form_type = $type . '-module';
3718
- $tabs = self::$modules[ $type ]->form;
3719
  } else {
3720
  return $defaults;
3721
  }
@@ -3729,7 +3760,7 @@ final class FLBuilderModel {
3729
  // Add the root name if needed later for synthetic fields like
3730
  // the dimension fields being synthesized below.
3731
  $fields[ $name ]['root_name'] = $name;
3732
- $field['root_name'] = $name;
3733
 
3734
  // Handle dimension fields. We have to do it this way for backwards compat
3735
  // with old margin, padding, and border fields as the settings expect margin_top
@@ -3775,7 +3806,7 @@ final class FLBuilderModel {
3775
 
3776
  $response_suffix = ( 'default' == $device ? '' : '_' . $device );
3777
  $responsive_name = $name . $response_suffix;
3778
- $unit_name = $field['root_name'] . $response_suffix . '_unit';
3779
 
3780
  // Add the default value.
3781
  if ( is_array( $responsive ) && isset( $responsive['default'] ) && isset( $responsive['default'][ $device ] ) ) {
@@ -3878,15 +3909,15 @@ final class FLBuilderModel {
3878
  * @return void
3879
  */
3880
  static public function save_settings( $node_id = null, $settings = null ) {
3881
- $node = self::get_node( $node_id );
3882
- $new_settings = (object) array_merge( (array) $node->settings, (array) $settings );
3883
- $template_post_id = self::is_node_global( $node );
3884
 
3885
  // Process the settings.
3886
  $new_settings = self::process_node_settings( $node, $new_settings );
3887
 
3888
  // Save the settings to the node.
3889
- $data = self::get_layout_data();
3890
  $data[ $node_id ]->settings = $new_settings;
3891
 
3892
  // Update the layout data.
@@ -4033,26 +4064,26 @@ final class FLBuilderModel {
4033
  static public function duplicate_post() {
4034
  global $wpdb;
4035
 
4036
- $post_id = self::get_post_id();
4037
- $post = get_post( $post_id );
4038
  $current_user = wp_get_current_user();
4039
  $template_id = false;
4040
 
4041
  // Duplicate the post.
4042
  $data = array(
4043
  'comment_status' => $post->comment_status,
4044
- 'ping_status' => $post->ping_status,
4045
- 'post_author' => $current_user->ID,
4046
- 'post_content' => $post->post_content,
4047
- 'post_excerpt' => $post->post_excerpt,
4048
- 'post_name' => $post->post_name . '-copy',
4049
- 'post_parent' => $post->post_parent,
4050
- 'post_password' => $post->post_password,
4051
- 'post_status' => 'draft',
4052
- 'post_title' => sprintf( _x( 'Copy of %s', '%s stands for post/page title.', 'fl-builder' ), $post->post_title ),
4053
- 'post_type' => $post->post_type,
4054
- 'to_ping' => $post->to_ping,
4055
- 'menu_order' => $post->menu_order,
4056
  );
4057
 
4058
  // Get the new post id.
@@ -4103,11 +4134,11 @@ final class FLBuilderModel {
4103
 
4104
  // Update template ID and template node ID
4105
  $template_id = get_post_meta( $new_post_id, '_fl_builder_template_id', true );
4106
- $global = get_post_meta( $post_id, '_fl_builder_template_global', true );
4107
 
4108
  if ( $template_id && $global ) {
4109
  foreach ( $data as $node_id => $node ) {
4110
- $data[ $node_id ]->template_id = $template_id;
4111
  $data[ $node_id ]->template_node_id = $node_id;
4112
  }
4113
  }
@@ -4148,15 +4179,15 @@ final class FLBuilderModel {
4148
  * @param int $post_id
4149
  * @return void
4150
  */
4151
- static public function save_revision( $post_id ) {
4152
 
4153
  $parent_id = wp_is_post_revision( $post_id );
4154
 
4155
  if ( $parent_id ) {
4156
 
4157
- $parent = get_post( $parent_id );
4158
- $data = self::get_layout_data( 'published', $parent->ID );
4159
- $settings = self::get_layout_settings( 'published', $parent->ID );
4160
 
4161
  if ( ! empty( $data ) ) {
4162
  self::update_layout_data( $data, 'published', $post_id );
@@ -4186,7 +4217,7 @@ final class FLBuilderModel {
4186
  * @since 2.1.5
4187
  */
4188
  static public function save_layout_revision( $post_id ) {
4189
- add_filter( 'wp_save_post_revision_post_has_changed', array( __CLASS__, 'save_layout_revision_changed_filter' ), 10, 3 );
4190
  wp_save_post_revision( $post_id );
4191
  remove_filter( 'wp_save_post_revision_post_has_changed', array( __CLASS__, 'save_layout_revision_changed_filter' ), 10, 3 );
4192
  }
@@ -4200,7 +4231,7 @@ final class FLBuilderModel {
4200
 
4201
  // get builder data for compare
4202
  $old = serialize( get_post_meta( $last_revision->ID, '_fl_builder_data', true ) );
4203
- $new = serialize( get_post_meta( $post->ID, '_fl_builder_data', true ) );
4204
 
4205
  return $old != $new;
4206
  }
@@ -4214,12 +4245,12 @@ final class FLBuilderModel {
4214
  * @return void
4215
  */
4216
  static public function restore_revision( $post_id, $revision_id ) {
4217
- $post = get_post( $post_id );
4218
  $revision = get_post( $revision_id );
4219
 
4220
  if ( $revision ) {
4221
 
4222
- $data = self::get_layout_data( 'published', $revision->ID );
4223
  $settings = self::get_layout_settings( 'published', $revision->ID );
4224
 
4225
  if ( ! empty( $data ) ) {
@@ -4248,26 +4279,26 @@ final class FLBuilderModel {
4248
  * @return array
4249
  */
4250
  static public function get_layout_data( $status = null, $post_id = null ) {
4251
- $post_id = ! $post_id ? self::get_post_id() : $post_id;
4252
- $status = ! $status ? self::get_node_status() : $status;
4253
 
4254
  // Get layout metadata.
4255
  if ( 'published' == $status || 'revision' == get_post_type( $post_id ) ) {
4256
  if ( isset( self::$published_layout_data[ $post_id ] ) ) {
4257
  $data = self::$published_layout_data[ $post_id ];
4258
  } else {
4259
- $data = get_metadata( 'post', $post_id, '_fl_builder_data', true );
4260
- $data = self::clean_layout_data( $data );
4261
- $data = FLBuilderSettingsCompat::filter_layout_data( $data );
4262
  self::$published_layout_data[ $post_id ] = apply_filters( 'fl_builder_get_layout_metadata', $data, $status, $post_id );
4263
  }
4264
  } elseif ( 'draft' == $status ) {
4265
  if ( isset( self::$draft_layout_data[ $post_id ] ) ) {
4266
  $data = self::$draft_layout_data[ $post_id ];
4267
  } else {
4268
- $data = get_metadata( 'post', $post_id, '_fl_builder_draft', true );
4269
- $data = self::clean_layout_data( $data );
4270
- $data = FLBuilderSettingsCompat::filter_layout_data( $data );
4271
  self::$draft_layout_data[ $post_id ] = apply_filters( 'fl_builder_get_layout_metadata', $data, $status, $post_id );
4272
  }
4273
  }
@@ -4284,7 +4315,10 @@ final class FLBuilderModel {
4284
  }
4285
  }
4286
 
4287
- // Return the data.
 
 
 
4288
  return apply_filters( 'fl_builder_layout_data', $data, $status, $post_id );
4289
  }
4290
 
@@ -4299,11 +4333,11 @@ final class FLBuilderModel {
4299
  * @return void
4300
  */
4301
  static public function update_layout_data( $data, $status = null, $post_id = null ) {
4302
- $post_id = ! $post_id ? self::get_post_id() : $post_id;
4303
- $status = ! $status ? self::get_node_status() : $status;
4304
- $key = 'published' == $status ? '_fl_builder_data' : '_fl_builder_draft';
4305
- $raw_data = get_metadata( 'post', $post_id, $key );
4306
- $data = self::slash_settings( self::clean_layout_data( $data ) );
4307
 
4308
  // Update the data.
4309
  if ( 0 === count( $raw_data ) ) {
@@ -4392,9 +4426,9 @@ final class FLBuilderModel {
4392
  * @return bool
4393
  */
4394
  static public function layout_has_drafted_changes() {
4395
- $post_id = FLBuilderModel::get_post_id();
4396
  $published = serialize( self::get_layout_data( 'published', $post_id ) );
4397
- $draft = serialize( self::get_layout_data( 'draft', $post_id ) );
4398
 
4399
  if ( $published != $draft ) {
4400
  return true;
@@ -4412,11 +4446,11 @@ final class FLBuilderModel {
4412
  * @return object
4413
  */
4414
  static public function get_layout_settings( $status = null, $post_id = null ) {
4415
- $status = ! $status ? self::get_node_status() : $status;
4416
- $post_id = ! $post_id ? self::get_post_id() : $post_id;
4417
- $key = 'published' == $status ? '_fl_builder_data_settings' : '_fl_builder_draft_settings';
4418
- $settings = get_metadata( 'post', $post_id, $key, true );
4419
- $defaults = self::get_settings_form_defaults( 'layout' );
4420
 
4421
  if ( ! $settings ) {
4422
  $settings = new StdClass();
@@ -4437,12 +4471,12 @@ final class FLBuilderModel {
4437
  * @return object
4438
  */
4439
  static public function update_layout_settings( $settings = array(), $status = null, $post_id = null ) {
4440
- $status = ! $status ? self::get_node_status() : $status;
4441
- $post_id = ! $post_id ? self::get_post_id() : $post_id;
4442
- $key = 'published' == $status ? '_fl_builder_data_settings' : '_fl_builder_draft_settings';
4443
- $raw_settings = get_metadata( 'post', $post_id, $key );
4444
- $old_settings = self::get_layout_settings( $status, $post_id );
4445
- $new_settings = (object) array_merge( (array) $old_settings, (array) $settings );
4446
 
4447
  if ( 0 === count( $raw_settings ) ) {
4448
  add_metadata( 'post', $post_id, $key, self::slash_settings( $new_settings ) );
@@ -4475,9 +4509,9 @@ final class FLBuilderModel {
4475
  * @return void
4476
  */
4477
  static public function delete_layout_settings( $status = null, $post_id = null ) {
4478
- $status = ! $status ? self::get_node_status() : $status;
4479
- $post_id = ! $post_id ? self::get_post_id() : $post_id;
4480
- $key = 'published' == $status ? '_fl_builder_data_settings' : '_fl_builder_draft_settings';
4481
 
4482
  update_metadata( 'post', $post_id, $key, array() );
4483
  }
@@ -4520,9 +4554,9 @@ final class FLBuilderModel {
4520
  * @return void
4521
  */
4522
  static public function clear_draft_layout() {
4523
- $post_id = self::get_post_id();
4524
- $data = self::get_layout_data( 'published', $post_id );
4525
- $settings = self::get_layout_settings( 'published', $post_id );
4526
 
4527
  // Delete the old draft layout.
4528
  self::delete_layout_data( 'draft' );
@@ -4546,9 +4580,9 @@ final class FLBuilderModel {
4546
  */
4547
  static public function save_layout( $publish = true ) {
4548
  $editor_content = FLBuilder::render_editor_content();
4549
- $post_id = self::get_post_id();
4550
- $data = self::get_layout_data( 'draft', $post_id );
4551
- $settings = self::get_layout_settings( 'draft', $post_id );
4552
 
4553
  /**
4554
  * This action allows you to hook into before the data is saved for a layout.
@@ -4578,8 +4612,8 @@ final class FLBuilderModel {
4578
  // Publish the post?
4579
  if ( $publish ) {
4580
 
4581
- $is_draft = strstr( $post_status, 'draft' );
4582
- $is_pending = strstr( $post_status, 'pending' );
4583
 
4584
  if ( current_user_can( 'publish_posts' ) ) {
4585
  $post_status = $is_draft || $is_pending ? 'publish' : $post_status;
@@ -4590,9 +4624,9 @@ final class FLBuilderModel {
4590
 
4591
  // Update the post with stripped down content.
4592
  wp_update_post(array(
4593
- 'ID' => self::get_post_id(),
4594
- 'post_status' => $post_status,
4595
- 'post_content' => $editor_content,
4596
  ));
4597
 
4598
  // Rerender the assets for this layout.
@@ -4617,13 +4651,17 @@ final class FLBuilderModel {
4617
  * @return void
4618
  */
4619
  static public function save_draft() {
4620
- $post_id = self::get_post_id();
4621
  $post_status = get_post_status( $post_id );
4622
 
4623
  if ( strstr( $post_status, 'draft' ) ) {
4624
  self::save_layout( false );
4625
  }
4626
 
 
 
 
 
4627
  do_action( 'fl_builder_after_save_draft', $post_id, $post_status );
4628
  }
4629
 
@@ -4637,15 +4675,15 @@ final class FLBuilderModel {
4637
  * @return array
4638
  */
4639
  static public function duplicate_wpml_layout( $original_post_id = null, $new_post_id = null ) {
4640
- $post_data = self::get_post_data();
4641
- $original_post_id = isset( $post_data['original_post_id'] ) ? $post_data['original_post_id'] : $original_post_id;
4642
- $new_post_id = isset( $post_data['post_id'] ) ? $post_data['post_id'] : $new_post_id;
4643
- $enabled = get_post_meta( $original_post_id, '_fl_builder_enabled', true );
4644
- $published = self::get_layout_data( 'published', $original_post_id );
4645
- $draft = self::get_layout_data( 'draft', $original_post_id );
4646
 
4647
  $response = array(
4648
- 'enabled' => false,
4649
  'has_layout' => false,
4650
  );
4651
 
@@ -4715,10 +4753,10 @@ final class FLBuilderModel {
4715
  static public function save_user_template( $settings = array() ) {
4716
  // Save the user template post.
4717
  $post_id = wp_insert_post(array(
4718
- 'post_title' => $settings['name'],
4719
- 'post_type' => 'fl-builder-template',
4720
- 'post_status' => 'publish',
4721
- 'ping_status' => 'closed',
4722
  'comment_status' => 'closed',
4723
  ));
4724
 
@@ -4726,15 +4764,15 @@ final class FLBuilderModel {
4726
  wp_set_post_terms( $post_id, 'layout', 'fl-builder-template-type' );
4727
 
4728
  // Add category
4729
- $cat = isset( $settings['category'] ) ? $settings['category'] : '';
4730
  $cat_added = '';
4731
  if ( __( 'Uncategorized', 'fl-builder' ) !== $cat && 'uncategorized' !== $cat ) {
4732
  $cat_added = wp_set_object_terms( $post_id, $cat, 'fl-builder-template-category' );
4733
  }
4734
 
4735
  // Get the layout data and settings to copy.
4736
- $data = self::get_layout_data();
4737
- $layout_settings = self::get_layout_settings();
4738
 
4739
  // Generate new node ids.
4740
  $data = self::generate_new_node_ids( $data );
@@ -4746,24 +4784,27 @@ final class FLBuilderModel {
4746
  // Enable the builder for this template.
4747
  update_post_meta( $post_id, '_fl_builder_enabled', true );
4748
 
4749
- // Allow extensions to hook into saving a user template.
 
 
 
4750
  do_action( 'fl_builder_after_save_user_template', $post_id );
4751
 
4752
  $response = array(
4753
- 'name' => $settings['name'],
4754
- 'id' => get_post_meta( $post_id, '_fl_builder_template_id', true ),
4755
- 'postId' => $post_id,
4756
- 'image' => FL_BUILDER_URL . 'img/templates/blank.jpg',
4757
- 'kind' => 'template',
4758
- 'content' => 'layout',
4759
- 'type' => 'user',
4760
  'isGlobal' => false,
4761
- 'link' => add_query_arg( 'fl_builder', '', get_permalink( $post_id ) ),
4762
  'category' => array(),
4763
  );
4764
 
4765
  if ( is_array( $cat_added ) && ! empty( $cat_added ) ) {
4766
- $term = get_term( $cat_added[0] );
4767
  $response['category'][ $term->slug ] = $term->name;
4768
  } else {
4769
  $response['category']['uncategorized'] = __( 'Uncategorized', 'fl-builder' );
@@ -4783,8 +4824,8 @@ final class FLBuilderModel {
4783
  static public function get_user_templates( $type = 'layout' ) {
4784
  $categorized = array(
4785
  'uncategorized' => array(
4786
- 'name' => _x( 'Uncategorized', 'Default user template category.', 'fl-builder' ),
4787
- 'templates' => array(),
4788
  ),
4789
  );
4790
 
@@ -4794,7 +4835,7 @@ final class FLBuilderModel {
4794
  'order' => 'ASC',
4795
  'posts_per_page' => '-1',
4796
  'suppress_filters' => false,
4797
- 'tax_query' => array(
4798
  array(
4799
  'taxonomy' => 'fl-builder-template-type',
4800
  'field' => 'slug',
@@ -4810,22 +4851,22 @@ final class FLBuilderModel {
4810
 
4811
  if ( has_post_thumbnail( $post->ID ) ) {
4812
  $image_data = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'medium_large' );
4813
- $image = $image_data[0];
4814
  } else {
4815
  $image = FL_BUILDER_URL . 'img/templates/blank.jpg';
4816
  }
4817
 
4818
  $templates[] = array(
4819
- 'id' => get_post_meta( $post->ID, '_fl_builder_template_id', true ),
4820
- 'postId' => $post->ID,
4821
- 'name' => $post->post_title,
4822
- 'image' => $image,
4823
- 'kind' => 'template',
4824
- 'type' => 'user',
4825
- 'content' => FLBuilderModel::get_user_template_type( $post->ID ),
4826
- 'isGlobal' => FLBuilderModel::is_post_global_node_template( $post->ID ),
4827
- 'link' => add_query_arg( 'fl_builder', '', get_permalink( $post->ID ) ),
4828
- 'category' => array(),
4829
  );
4830
  }
4831
 
@@ -4835,7 +4876,7 @@ final class FLBuilderModel {
4835
  $cats = wp_get_post_terms( $template['postId'], 'fl-builder-template-category' );
4836
 
4837
  if ( 0 === count( $cats ) || is_wp_error( $cats ) ) {
4838
- $template['category'] = array(
4839
  'uncategorized' => __( 'Uncategorized', 'fl-builder' ),
4840
  );
4841
  $categorized['uncategorized']['templates'][] = $template;
@@ -4848,8 +4889,8 @@ final class FLBuilderModel {
4848
  foreach ( $cats as $cat ) {
4849
  if ( ! isset( $categorized[ $cat->slug ] ) ) {
4850
  $categorized[ $cat->slug ] = array(
4851
- 'name' => $cat->name,
4852
- 'templates' => array(),
4853
  );
4854
  }
4855
  $categorized[ $cat->slug ]['templates'][] = $template;
@@ -4868,8 +4909,8 @@ final class FLBuilderModel {
4868
  asort( $categorized );
4869
 
4870
  return array(
4871
- 'templates' => $templates,
4872
- 'categorized' => $categorized,
4873
  );
4874
  }
4875
 
@@ -4936,9 +4977,9 @@ final class FLBuilderModel {
4936
 
4937
  // Get the template data if $template is not an object.
4938
  if ( ! is_object( $template ) ) {
4939
- $template_id = $template;
4940
- $template = new StdClass();
4941
- $template->nodes = self::get_layout_data( 'published', $template_id );
4942
  $template->settings = self::get_layout_settings( 'published', $template_id );
4943
  }
4944
 
@@ -4946,7 +4987,7 @@ final class FLBuilderModel {
4946
  $template->nodes = self::generate_new_node_ids( $template->nodes );
4947
 
4948
  // Get the existing layout data and settings.
4949
- $layout_data = self::get_layout_data();
4950
  $layout_settings = self::get_layout_settings();
4951
 
4952
  // Reposition rows if we are appending.
@@ -4963,7 +5004,7 @@ final class FLBuilderModel {
4963
  }
4964
 
4965
  // Merge the layout data and settings.
4966
- $data = array_merge( $layout_data, $template->nodes );
4967
  $settings = self::merge_layout_settings( $layout_settings, $template->settings );
4968
 
4969
  // Update the layout data and settings.
@@ -4979,8 +5020,8 @@ final class FLBuilderModel {
4979
  // Return the layout.
4980
  return array(
4981
  'layout_css' => isset( $settings ) ? $settings->css : null,
4982
- 'layout' => FLBuilderAJAXLayout::render(),
4983
- 'config' => FLBuilderUISettingsForms::get_node_js_config(),
4984
  );
4985
  }
4986
 
@@ -5078,7 +5119,7 @@ final class FLBuilderModel {
5078
 
5079
  $is_visible = true;
5080
 
5081
- if ( isset( $node->settings->visibility_display ) && ('' != $node->settings->visibility_display) ) {
5082
 
5083
  // For logged out users
5084
  if ( 'logged_out' == $node->settings->visibility_display && ! is_user_logged_in() ) {
@@ -5134,15 +5175,15 @@ final class FLBuilderModel {
5134
  */
5135
  static public function get_node_templates( $type = '' ) {
5136
  $posts = get_posts( array(
5137
- 'post_type' => 'fl-builder-template',
5138
- 'orderby' => 'title',
5139
- 'order' => 'ASC',
5140
- 'posts_per_page' => '-1',
5141
- 'tax_query' => array(
5142
  array(
5143
  'taxonomy' => 'fl-builder-template-type',
5144
- 'field' => 'slug',
5145
- 'terms' => $type,
5146
  ),
5147
  ),
5148
  ) );
@@ -5152,10 +5193,10 @@ final class FLBuilderModel {
5152
  foreach ( $posts as $post ) {
5153
 
5154
  $templates[] = array(
5155
- 'id' => get_post_meta( $post->ID, '_fl_builder_template_id', true ),
5156
- 'global' => get_post_meta( $post->ID, '_fl_builder_template_global', true ),
5157
- 'link' => add_query_arg( 'fl_builder', '', get_permalink( $post->ID ) ),
5158
- 'name' => $post->post_title,
5159
  );
5160
  }
5161
 
@@ -5203,19 +5244,19 @@ final class FLBuilderModel {
5203
  } else {
5204
 
5205
  $posts = get_posts( array(
5206
- 'post_type' => 'fl-builder-template',
5207
- 'post_status' => array( 'any', 'trash' ),
5208
- 'posts_per_page' => '-1',
5209
- 'post_status' => 'any',
5210
- 'meta_key' => '_fl_builder_template_id',
5211
- 'meta_value' => $template_id,
5212
  ) );
5213
 
5214
  if ( 0 === count( $posts ) ) {
5215
  return false;
5216
  }
5217
 
5218
- $post_id = apply_filters( 'fl_builder_node_template_post_id', $posts[0]->ID );
5219
  self::$node_template_post_ids[ $template_id ] = $post_id;
5220
  return $post_id;
5221
  }
@@ -5259,9 +5300,9 @@ final class FLBuilderModel {
5259
  'key' => '_fl_builder_draft',
5260
  'value' => $template_id,
5261
  'compare' => 'LIKE',
5262
- )
5263
  ),
5264
- 'post_type' => 'any',
5265
  'post_status' => 'any',
5266
  'post__not_in' => array( $post_id ),
5267
  ) );
@@ -5281,18 +5322,18 @@ final class FLBuilderModel {
5281
  * @return void
5282
  */
5283
  static public function save_node_template( $template_node_id, $settings ) {
5284
- $root_node = self::get_node( $template_node_id );
5285
- $nodes = self::get_nested_nodes( $template_node_id );
5286
- $template_id = self::generate_node_id();
5287
- $original_parent = $root_node->parent;
5288
- $original_position = $root_node->position;
5289
 
5290
  // Save the node template post.
5291
  $post_id = wp_insert_post( array(
5292
- 'post_title' => $settings['name'],
5293
- 'post_type' => 'fl-builder-template',
5294
- 'post_status' => 'publish',
5295
- 'ping_status' => 'closed',
5296
  'comment_status' => 'closed',
5297
  ) );
5298
 
@@ -5304,7 +5345,7 @@ final class FLBuilderModel {
5304
 
5305
  // Remove root parent for column template.
5306
  if ( 'column' == $root_node->type ) {
5307
- $root_node->parent = null;
5308
  $root_node->settings->size = 100;
5309
  }
5310
 
@@ -5322,7 +5363,7 @@ final class FLBuilderModel {
5322
 
5323
  foreach ( $nodes as $node_id => $node ) {
5324
 
5325
- $nodes[ $node_id ]->template_id = $template_id;
5326
  $nodes[ $node_id ]->template_node_id = $node_id;
5327
 
5328
  if ( $node_id == $root_node->node ) {
@@ -5374,14 +5415,14 @@ final class FLBuilderModel {
5374
 
5375
  // Return an array of template settings.
5376
  return array(
5377
- 'id' => $template_id,
5378
- 'global' => $settings['global'] ? true : false,
5379
- 'link' => add_query_arg( 'fl_builder', '', get_permalink( $post_id ) ),
5380
- 'name' => $settings['name'],
5381
- 'type' => $root_node->type,
5382
- 'layout' => $settings['global'] ? FLBuilderAJAXLayout::render( $root_node->node, $template_node_id ) : null,
5383
- 'config' => $settings['global'] ? FLBuilderUISettingsForms::get_node_js_config() : null,
5384
- 'postID' => $post_id,
5385
  );
5386
  }
5387
 
@@ -5455,7 +5496,7 @@ final class FLBuilderModel {
5455
  static public function unlink_global_node_template_from_all_posts( $template_post_id ) {
5456
  if ( self::is_post_global_node_template( $template_post_id ) ) {
5457
 
5458
- $posts = self::get_posts_with_global_node_template( $template_post_id );
5459
  $template_id = get_post_meta( $template_post_id, '_fl_builder_template_id', true );
5460
 
5461
  foreach ( $posts as $post ) {
@@ -5480,9 +5521,9 @@ final class FLBuilderModel {
5480
  * @return void
5481
  */
5482
  static public function unlink_global_node_template_from_post( $status, $post_id, $template_post_id, $template_id ) {
5483
- $template_data = self::get_layout_data( $status, $template_post_id );
5484
- $layout_data = self::get_layout_data( $status, $post_id );
5485
- $update = false;
5486
 
5487
  // Loop through the layout data.
5488
  foreach ( $layout_data as $node_id => $node ) {
@@ -5542,7 +5583,7 @@ final class FLBuilderModel {
5542
  static public function delete_global_node_template_from_all_posts( $template_post_id ) {
5543
  if ( self::is_post_global_node_template( $template_post_id ) ) {
5544
 
5545
- $posts = self::get_posts_with_global_node_template( $template_post_id );
5546
  $template_id = get_post_meta( $template_post_id, '_fl_builder_template_id', true );
5547
 
5548
  foreach ( $posts as $post ) {
@@ -5621,7 +5662,10 @@ final class FLBuilderModel {
5621
  $template_post_id = self::get_node_template_post_id( $template_id );
5622
  $is_col_template = false;
5623
 
5624
- // Allow extensions to hook into applying a node template.
 
 
 
5625
  $override = apply_filters( 'fl_builder_override_apply_node_template', false, array(
5626
  'template_id' => $template_id,
5627
  'parent_id' => $parent_id,
@@ -5637,15 +5681,15 @@ final class FLBuilderModel {
5637
 
5638
  // Get the template data from $template if we have it.
5639
  if ( is_object( $template ) ) {
5640
- $template_data = $template->nodes;
5641
- $template_settings = $template->settings;
5642
- $type = $template->type;
5643
- $global = $template->global;
5644
  } else {
5645
- $template_data = self::get_layout_data( 'published', $template_post_id );
5646
- $template_settings = self::get_layout_settings( 'published', $template_post_id );
5647
- $type = self::get_user_template_type( $template_post_id );
5648
- $global = get_post_meta( $template_post_id, '_fl_builder_template_global', true );
5649
  }
5650
 
5651
  // Generate new node ids.
@@ -5664,7 +5708,7 @@ final class FLBuilderModel {
5664
  $parent_id = self::add_module_parent( $parent_id, $position );
5665
  $position = null;
5666
  } elseif ( 'column' == $root_node->type ) {
5667
- $parent_id = self::add_col_parent( $parent_id, $position );
5668
  $is_col_template = self::is_node_global( $root_node );
5669
  }
5670
 
@@ -5673,7 +5717,7 @@ final class FLBuilderModel {
5673
 
5674
  // Set the node's template data if the parent is a global node.
5675
  if ( self::is_node_global( $parent ) && ! $is_col_template ) {
5676
- $template_data[ $root_node->node ]->template_id = $parent->template_id;
5677
  $template_data[ $root_node->node ]->template_node_id = $root_node->node;
5678
  unset( $template_data[ $root_node->node ]->template_root_node );
5679
  $global = true;
@@ -5684,7 +5728,7 @@ final class FLBuilderModel {
5684
  $template_data[ $root_node->node ]->parent = ! $parent_id ? null : $parent_id;
5685
 
5686
  // Get the layout data and settings.
5687
- $layout_data = self::get_layout_data( 'draft' );
5688
  $layout_settings = self::get_layout_settings( 'draft' );
5689
 
5690
  // Only merge the root node for global templates.
@@ -5802,7 +5846,10 @@ final class FLBuilderModel {
5802
  * @return void
5803
  */
5804
  static public function apply_template( $index = 0, $append = false, $type = 'layout' ) {
5805
- // Allow extensions to hook into applying a template.
 
 
 
5806
  $override = apply_filters( 'fl_builder_override_apply_template', false, array(
5807
  'index' => $index,
5808
  'append' => $append,
@@ -5828,7 +5875,7 @@ final class FLBuilderModel {
5828
  * @return array
5829
  */
5830
  static public function apply_core_template( $index = 0, $append = false, $type = 'layout' ) {
5831
- $template = self::get_template( $index, $type );
5832
  $row_position = self::next_node_position( 'row' );
5833
 
5834
  // Delete existing nodes and settings?
@@ -5847,7 +5894,7 @@ final class FLBuilderModel {
5847
  $template->nodes = FLBuilderSettingsCompat::filter_layout_data( $template->nodes );
5848
 
5849
  // Get the existing layout data and settings.
5850
- $layout_data = self::get_layout_data();
5851
  $layout_settings = self::get_layout_settings();
5852
 
5853
  // Reposition rows?
@@ -5989,10 +6036,10 @@ final class FLBuilderModel {
5989
  * @return array
5990
  */
5991
  static public function get_template_selector_data( $type = 'layout' ) {
5992
- $type = apply_filters( 'fl_builder_template_selector_data_type', $type );
5993
- $categorized = array();
5994
- $templates = array();
5995
- $groups = array();
5996
 
5997
  // This is needed for backwards compat with the old core templates category.
5998
  $core_categories = array(
@@ -6026,10 +6073,10 @@ final class FLBuilderModel {
6026
  'image' => $image,
6027
  'author' => '',
6028
  'category' => isset( $template->category ) ? $template->category : $template->categories,
6029
- 'tags' => array(),
6030
- 'group' => $template->group,
6031
  'type' => 'core',
6032
- 'kind' => 'template',
6033
  'content' => ! in_array( $type, array( 'row', 'column', 'module' ) ) ? 'layout' : $type,
6034
  ), $template );
6035
  }
@@ -6075,7 +6122,7 @@ final class FLBuilderModel {
6075
  $group_key = sanitize_key( $group_name );
6076
  if ( ! isset( $groups[ $group_key ] ) ) {
6077
  $groups[ $group_key ] = array(
6078
- 'name' => $group_name,
6079
  'categories' => array(),
6080
  );
6081
  }
@@ -6096,8 +6143,8 @@ final class FLBuilderModel {
6096
  // Add the category if we don't have it yet.
6097
  if ( ! isset( $categorized[ $cat_key ] ) ) {
6098
  $categorized[ $cat_key ] = array(
6099
- 'name' => $cat_name,
6100
- 'templates' => array(),
6101
  );
6102
  }
6103
 
@@ -6107,11 +6154,14 @@ final class FLBuilderModel {
6107
  $templates[ $i ] = $template;
6108
  }
6109
 
6110
- // Return both the templates and categorized templates array.
 
 
 
6111
  return apply_filters( 'fl_builder_template_selector_data', array(
6112
- 'templates' => $templates,
6113
- 'categorized' => $categorized,
6114
- 'groups' => $groups,
6115
  ), $type );
6116
  }
6117
 
@@ -6263,7 +6313,7 @@ final class FLBuilderModel {
6263
  /**
6264
  * Check if the current user has the specific capabilities
6265
  *
6266
- * @param string $cap The capability to evaluate if it's single or multiple (comma separated) value
6267
  * @return bool
6268
  */
6269
  static public function current_user_has_capability( $cap ) {
@@ -6291,20 +6341,20 @@ final class FLBuilderModel {
6291
  */
6292
  static public function get_help_button_defaults() {
6293
  $defaults = array(
6294
- 'enabled' => true,
6295
- 'tour' => true,
6296
- 'video' => true,
6297
- 'video_embed' => '<iframe src="https://player.vimeo.com/video/240550556?autoplay=1" width="420" height="315" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>',
6298
- 'knowledge_base' => true,
6299
- 'knowledge_base_url' => self::get_store_url( 'knowledge-base', array(
6300
- 'utm_medium' => ( true === FL_BUILDER_LITE ? 'bb-lite' : 'bb-pro' ),
6301
- 'utm_source' => 'builder-ui',
6302
  'utm_campaign' => 'kb-help-button',
6303
  ) ),
6304
- 'forums' => true,
6305
- 'forums_url' => self::get_store_url( 'knowledge-base', array(
6306
- 'utm_medium' => ( true === FL_BUILDER_LITE ? 'bb-lite' : 'bb-pro' ),
6307
- 'utm_source' => 'builder-ui',
6308
  'utm_campaign' => 'forums-help-button',
6309
  ) ),
6310
  );
@@ -6335,8 +6385,8 @@ final class FLBuilderModel {
6335
  static public function get_row_resize_settings() {
6336
  $defaults = array(
6337
  'userCanResizeRows' => true,
6338
- 'minAllowedWidth' => 300,
6339
- 'maxAllowedWidth' => false,
6340
  );
6341
 
6342
  $settings = apply_filters( 'fl_row_resize_settings', $defaults );
@@ -6535,7 +6585,7 @@ final class FLBuilderModel {
6535
  delete_metadata( 'user', 0, '_fl_builder_launched', 1, true );
6536
 
6537
  // Delete uploaded files and folders.
6538
- $upload_dir = self::get_upload_dir();
6539
  fl_builder_filesystem()->rmdir( $upload_dir['path'], true );
6540
 
6541
  // Deactivate and delete the plugin.
16
  * @var array $row_layouts
17
  */
18
  static public $row_layouts = array(
19
+ '1-col' => array( 100 ),
20
+ '2-cols' => array( 50, 50 ),
21
+ '3-cols' => array( 33.33, 33.33, 33.33 ),
22
+ '4-cols' => array( 25, 25, 25, 25 ),
23
+ '5-cols' => array( 20, 20, 20, 20, 20 ),
24
+ '6-cols' => array( 16.65, 16.65, 16.65, 16.65, 16.65, 16.65 ),
25
+ 'left-sidebar' => array( 33.33, 66.66 ),
26
+ 'right-sidebar' => array( 66.66, 33.33 ),
27
+ 'left-right-sidebar' => array( 25, 50, 25 ),
28
  );
29
 
30
  /**
175
  */
176
  static public function init() {
177
  /* Admin AJAX */
178
+ add_action( 'wp_ajax_fl_builder_disable', __CLASS__ . '::disable' );
179
+ add_action( 'wp_ajax_fl_builder_duplicate_wpml_layout', __CLASS__ . '::duplicate_wpml_layout' );
180
 
181
  /* Actions */
182
+ add_action( 'init', __CLASS__ . '::load_settings', 1 );
183
+ add_action( 'init', __CLASS__ . '::load_modules', 2 );
184
+ add_action( 'before_delete_post', __CLASS__ . '::delete_post' );
185
+ add_action( 'save_post', __CLASS__ . '::save_revision', 10, 3 );
186
+ add_action( 'save_post', __CLASS__ . '::set_node_template_default_type', 10, 3 );
187
+ add_action( 'wp_restore_post_revision', __CLASS__ . '::restore_revision', 10, 2 );
188
+ add_action( 'fl_builder_after_save_layout', __CLASS__ . '::save_layout_revision' );
189
+ add_action( 'fl_builder_after_save_user_template', __CLASS__ . '::save_layout_revision' );
190
 
191
  /* Filters */
192
+ add_filter( 'heartbeat_received', __CLASS__ . '::lock_post', 10, 2 );
193
+ add_filter( 'fl_builder_register_settings_form', __CLASS__ . '::filter_row_settings_for_resize', 10, 2 );
194
+ add_filter( 'wp_revisions_to_keep', __CLASS__ . '::limit_revisions', 10, 2 );
195
 
196
  /* Core Templates */
197
  self::register_core_templates();
281
  $_POST['fl_builder_data']['node_settings'] = FLBuilderUtils::modsec_fix_decode( $_POST['fl_builder_data']['node_settings'] );
282
  }
283
 
284
+ $data = FLBuilderUtils::json_decode_deep( wp_unslash( $_POST['fl_builder_data'] ) );
285
 
286
  foreach ( $data as $key => $val ) {
287
  self::$post_data[ $key ] = $val;
306
  * @return void
307
  */
308
  static public function update_post_data( $key, $value ) {
309
+ $post_data = self::get_post_data();
310
  $post_data[ $key ] = $value;
311
+ self::$post_data = $post_data;
312
  }
313
 
314
  /**
461
 
462
  if ( is_singular() && isset( $wp_the_query->post ) ) {
463
 
464
+ $post = $wp_the_query->post;
465
  $post_types = self::get_post_types();
466
+ $user_can = current_user_can( 'edit_post', $post->ID );
467
  $user_access = FLBuilderUserAccess::current_user_can( 'builder_access' );
468
 
469
  if ( in_array( $post->post_type, $post_types ) && $user_can && $user_access ) {
515
  return true;
516
  } else {
517
  $post_types = self::get_post_types();
518
+ $post = get_post( $post_id );
519
 
520
  if ( $post && in_array( $post->post_type, $post_types ) ) {
521
  return get_post_meta( $post->ID, '_fl_builder_enabled', true );
546
  } elseif ( is_customize_preview() ) {
547
  self::$active = false;
548
  } elseif ( self::is_post_editable() && ! is_admin() && ! post_password_required() ) {
549
+ $post_data = self::get_post_data();
550
  self::$active = isset( $_GET['fl_builder'] ) || isset( $post_data['fl_builder'] );
551
  }
552
 
573
  static public function is_new_user() {
574
  if ( self::is_builder_active() ) {
575
 
576
+ $current_user = wp_get_current_user();
577
+ $launched = get_user_meta( $current_user->ID, '_fl_builder_launched', true );
578
 
579
  if ( empty( $launched ) ) {
580
  update_user_meta( $current_user->ID, '_fl_builder_launched', 1 );
629
 
630
  if ( self::is_post_editable() && is_object( $wp_the_query->post ) ) {
631
 
632
+ $post = $wp_the_query->post;
633
+ $published = self::get_layout_data( 'published' );
634
+ $draft = self::get_layout_data( 'draft' );
635
+ $content = apply_filters( 'fl_builder_migrated_post_content', $post->post_content );
636
 
637
  // Migrate existing post content to the builder?
638
  if ( empty( $published ) && empty( $draft ) && ! empty( $content ) ) {
639
 
640
+ $row = self::add_row();
641
+ $cols = self::get_nodes( 'column' );
642
+ $col = array_shift( $cols );
643
+ $settings = self::get_module_defaults( 'rich-text' );
644
  $settings->text = $content;
645
 
646
  self::add_module( 'rich-text', $settings, $col->node );
656
  require_once ABSPATH . 'wp-admin/includes/post.php';
657
  wp_set_post_lock( $post->ID );
658
 
659
+ /**
660
+ * Allow devs to hook into when editing is enabled.
661
+ * @see fl_builder_editing_enabled
662
+ */
663
  do_action( 'fl_builder_editing_enabled' );
664
  }
665
  }
687
 
688
  // Build the paths.
689
  $dir_info = array(
690
+ 'path' => $wp_info['basedir'] . '/' . $dir_name . '/',
691
+ 'url' => $wp_info['baseurl'] . '/' . $dir_name . '/',
692
  );
693
 
694
  // Create the upload dir if it doesn't exist.
719
  */
720
  static public function get_cache_dir( $name = 'cache' ) {
721
  $upload_info = self::get_upload_dir();
722
+ $allowed = array( 'cache', 'icons' );
723
 
724
  // Make sure the dir name is allowed.
725
  if ( ! in_array( $name, $allowed ) ) {
728
 
729
  // Build the paths.
730
  $dir_info = array(
731
+ 'path' => $upload_info['path'] . $name . '/',
732
+ 'url' => $upload_info['url'] . $name . '/',
733
  );
734
 
735
  // Create the cache dir if it doesn't exist.
760
  */
761
  static public function get_asset_version() {
762
  $post_id = self::get_post_id();
763
+ $active = self::is_builder_active();
764
  $preview = self::is_builder_draft_preview();
765
 
766
  if ( $active || $preview ) {
793
  }
794
 
795
  $info = array(
796
+ 'css' => $cache_dir['path'] . $post_id . $suffix . '.css',
797
  'css_url' => $cache_dir['url'] . $post_id . $suffix . '.css',
798
+ 'css_partial' => $cache_dir['path'] . $post_id . $suffix . '-partial.css',
799
  'css_partial_url' => $cache_dir['url'] . $post_id . $suffix . '-partial.css',
800
+ 'js' => $cache_dir['path'] . $post_id . $suffix . '.js',
801
  'js_url' => $cache_dir['url'] . $post_id . $suffix . '.js',
802
+ 'js_partial' => $cache_dir['path'] . $post_id . $suffix . '-partial.js',
803
  'js_partial_url' => $cache_dir['url'] . $post_id . $suffix . '-partial.js',
804
  );
805
 
908
  * @return void
909
  */
910
  static public function delete_asset_cache_for_all_posts() {
911
+ $cache_dir = self::get_cache_dir();
912
+ $css = glob( $cache_dir['path'] . '*.css' );
913
+ $js = glob( $cache_dir['path'] . '*.js' );
914
 
915
  if ( is_array( $css ) ) {
916
  array_map( array( fl_builder_filesystem(), 'unlink' ), $css );
958
  // Replace the old node ids.
959
  foreach ( $data as $node_id => $node ) {
960
 
961
+ $nodes[ $map[ $node_id ] ] = $node;
962
  $nodes[ $map[ $node_id ] ]->node = $map[ $node_id ];
963
 
964
  if ( ! empty( $node->parent ) && isset( $map[ $node->parent ] ) ) {
1092
 
1093
  // Helper array of parent types and their categories for each node type
1094
  $parent_types = array(
1095
+ 'module' => array(
1096
  'type' => 'column',
1097
  'category' => 'columns',
1098
  ),
1099
+ 'column' => array(
1100
  'type' => 'column-group',
1101
  'category' => 'groups',
1102
  ),
1240
  */
1241
  static public function get_categorized_nodes() {
1242
  $nodes = array(
1243
+ 'rows' => array(),
1244
  'groups' => array(),
1245
  'columns' => array(),
1246
  'modules' => array(),
1252
  $root_col = self::get_node_template_root( 'column' );
1253
 
1254
  $nodes['columns'][ $root_col->node ] = $root_col;
1255
+ $col_children = self::get_nodes( null, $root_col );
1256
 
1257
  foreach ( $col_children as $col_child ) {
1258
 
1266
  } elseif ( 'column-group' == $col_child->type ) {
1267
 
1268
  $nodes['groups'][ $col_child->node ] = $col_child;
1269
+ $group_cols = self::get_nodes( 'column', $col_child );
1270
 
1271
  foreach ( $group_cols as $group_col ) {
1272
 
1273
  $nodes['columns'][ $group_col->node ] = $group_col;
1274
+ $modules = self::get_modules( $group_col );
1275
 
1276
  foreach ( $modules as $module ) {
1277
  $nodes['modules'][ $module->node ] = $module;
1285
  foreach ( $rows as $row ) {
1286
 
1287
  $nodes['rows'][ $row->node ] = $row;
1288
+ $groups = self::get_nodes( 'column-group', $row );
1289
 
1290
  foreach ( $groups as $group ) {
1291
 
1292
  $nodes['groups'][ $group->node ] = $group;
1293
+ $cols = self::get_nodes( 'column', $group );
1294
 
1295
  foreach ( $cols as $col ) {
1296
 
1297
  $nodes['columns'][ $col->node ] = $col;
1298
+ $col_children = self::get_nodes( null, $col );
1299
 
1300
  foreach ( $col_children as $col_child ) {
1301
 
1309
  } elseif ( 'column-group' == $col_child->type ) {
1310
 
1311
  $nodes['groups'][ $col_child->node ] = $col_child;
1312
+ $group_cols = self::get_nodes( 'column', $col_child );
1313
 
1314
  foreach ( $group_cols as $group_col ) {
1315
 
1316
  $nodes['columns'][ $group_col->node ] = $group_col;
1317
+ $modules = self::get_modules( $group_col );
1318
 
1319
  foreach ( $modules as $module ) {
1320
  $nodes['modules'][ $module->node ] = $module;
1340
  * @return object
1341
  */
1342
  static public function get_node_settings( $node, $filter = true ) {
1343
+ $node = is_object( $node ) ? $node : self::get_node( $node );
1344
  $post_data = self::get_post_data();
1345
 
1346
  // Get the node settings for a node template's root node?
1347
  if ( self::is_node_template_root( $node ) && ! self::is_post_node_template() ) {
1348
  $template_post_id = self::get_node_template_post_id( $node->template_id );
1349
+ $template_data = self::get_layout_data( 'published', $template_post_id );
1350
 
1351
  // Fallback to draft data if we don't have published data.
1352
  if ( ! isset( $template_data[ $node->template_node_id ] ) ) {
1355
 
1356
  // Set the node settings to the template node settings.
1357
  if ( isset( $template_data[ $node->template_node_id ] ) ) {
1358
+ $template_node = $template_data[ $node->template_node_id ];
1359
  $template_settings = clone $template_node->settings;
1360
 
1361
  if ( 'column' == $node->type ) {
1589
  */
1590
  static public function call_module_delete( $node ) {
1591
  if ( 'module' == $node->type && isset( self::$modules[ $node->settings->type ] ) ) {
1592
+ $class = get_class( self::$modules[ $node->settings->type ] );
1593
+ $instance = new $class();
1594
+ $instance->node = $node->node;
1595
+ $instance->parent = $node->parent;
1596
  $instance->settings = $node->settings;
1597
  $instance->delete();
1598
  $instance->remove();
1609
  * @return void
1610
  */
1611
  static public function reorder_node( $node_id = null, $position = 0 ) {
1612
+ $data = self::get_layout_data();
1613
+ $node = $data[ $node_id ];
1614
+ $type = ! $node->parent ? $node->type : null;
1615
+ $nodes = self::get_nodes( $type, $node->parent );
1616
+ $new_pos = 0;
1617
 
1618
  // Make sure node positions start at zero.
1619
  foreach ( $nodes as $node ) {
1622
  }
1623
 
1624
  // Get the node and remove it from the array.
1625
+ $node = $data[ $node_id ];
1626
+ $removed = array_splice( $nodes, $node->position, 1 );
1627
+ $new_pos = 0;
1628
 
1629
  // Reposition it in the array.
1630
  array_splice( $nodes, $position, 0, $removed );
1649
  * @return void
1650
  */
1651
  static public function move_node( $node_id = null, $new_parent_id = null, $position = 0 ) {
1652
+ $data = self::get_layout_data();
1653
+ $new_parent = self::get_node( $new_parent_id );
1654
+ $node = self::get_node( $node_id );
1655
+ $siblings = self::get_nodes( null, $node->parent );
1656
+ $sibling_pos = 0;
1657
 
1658
  // Set the node's new parent.
1659
  $data[ $node_id ]->parent = $new_parent->node;
1684
  * @return object The new row object.
1685
  */
1686
  static public function add_row( $cols = '1-col', $position = false, $module = null ) {
1687
+ $data = self::get_layout_data();
1688
+ $settings = self::get_row_defaults();
1689
+ $row_node_id = self::generate_node_id();
1690
 
1691
  // Add the row.
1692
+ $data[ $row_node_id ] = new StdClass();
1693
+ $data[ $row_node_id ]->node = $row_node_id;
1694
+ $data[ $row_node_id ]->type = 'row';
1695
+ $data[ $row_node_id ]->parent = null;
1696
+ $data[ $row_node_id ]->position = self::next_node_position( 'row' );
1697
+ $data[ $row_node_id ]->settings = $settings;
1698
 
1699
  // Update the layout data.
1700
  self::update_layout_data( $data );
1710
  // Move an existing module to the row.
1711
  if ( $module ) {
1712
  $cols = self::get_nodes( 'column', $group->node );
1713
+ $col = array_shift( $cols );
1714
  self::move_node( $module, $col->node, 0 );
1715
  }
1716
 
1728
  * @return void
1729
  */
1730
  static public function copy_row( $node_id = null, $settings = null, $settings_id = null ) {
1731
+ $layout_data = self::get_layout_data();
1732
+ $row = self::get_node( $node_id );
1733
+ $new_row_id = self::generate_node_id();
1734
+ $col_groups = self::get_nodes( 'column-group', $row );
1735
+ $new_nodes = array();
1736
+ $template_cols = array();
1737
 
1738
  // Add the new row.
1739
+ $layout_data[ $new_row_id ] = clone $row;
1740
+ $layout_data[ $new_row_id ]->settings = clone $row->settings;
1741
+ $layout_data[ $new_row_id ]->node = $new_row_id;
1742
 
1743
  // Unset row template data.
1744
  if ( isset( $layout_data[ $new_row_id ]->template_id ) ) {
1750
  // Get the new child nodes.
1751
  foreach ( $col_groups as $col_group ) {
1752
 
1753
+ $new_nodes[ $col_group->node ] = clone $col_group;
1754
+ $cols = self::get_nodes( 'column', $col_group );
1755
 
1756
  foreach ( $cols as $col ) {
1757
 
1758
+ $new_nodes[ $col->node ] = clone $col;
1759
+ $new_nodes[ $col->node ]->settings = clone $col->settings;
1760
+ $nodes = self::get_nodes( null, $col );
1761
 
1762
  foreach ( $nodes as $node ) {
1763
 
1771
 
1772
  foreach ( $nested_cols as $nested_col ) {
1773
 
1774
+ $new_nodes[ $nested_col->node ] = clone $nested_col;
1775
  $new_nodes[ $nested_col->node ]->settings = clone $nested_col->settings;
1776
+ $modules = self::get_nodes( 'module', $nested_col );
1777
 
1778
  foreach ( $modules as $module ) {
1779
+ $new_nodes[ $module->node ] = clone $module;
1780
  $new_nodes[ $module->node ]->settings = self::clone_module_settings( $module->settings );
1781
  }
1782
  }
1869
  $mp4 = FLBuilderPhoto::get_attachment_data( $new_settings->bg_video );
1870
 
1871
  if ( $mp4 ) {
1872
+ $parts = explode( '.', $mp4->filename );
1873
+ $mp4->extension = array_pop( $parts );
1874
+ $new_settings->bg_video_data = $mp4;
1875
  $new_settings->bg_video_data->fallback = $fallback;
1876
  }
1877
 
1879
  $webm = FLBuilderPhoto::get_attachment_data( $new_settings->bg_video_webm );
1880
 
1881
  if ( $webm ) {
1882
+ $parts = explode( '.', $webm->filename );
1883
+ $webm->extension = array_pop( $parts );
1884
+ $new_settings->bg_video_webm_data = $webm;
1885
  $new_settings->bg_video_webm_data->fallback = $fallback;
1886
  }
1887
  }
1896
  }
1897
 
1898
  // Hijack the slideshow module to get WordPress photo data.
1899
+ $ss = new FLSlideshowModule();
1900
+ $ss->settings = new StdClass();
1901
+ $ss->settings->photos = $new_settings->ss_photos;
1902
+ $ss->settings->photo_data = $row->settings->ss_photo_data;
1903
+ $new_settings->ss_photo_data = $ss->get_wordpress_photos();
1904
  }
1905
 
1906
  return $new_settings;
1920
  if ( 'video' == $row->settings->bg_type ) {
1921
 
1922
  if ( isset( $row->settings->bg_video_data ) ) {
1923
+ $data = array();
1924
  $data['mp4'] = $row->settings->bg_video_data;
1925
  }
1926
  if ( isset( $row->settings->bg_video_webm_data ) ) {
1957
  }
1958
 
1959
  // Hijack the slideshow module to get the source.
1960
+ $ss = new FLSlideshowModule();
1961
+ $ss->settings = new StdClass();
1962
+ $ss->settings->source = $row->settings->ss_source;
1963
+ $ss->settings->photos = $row->settings->ss_photos;
1964
+ $ss->settings->feed_url = $row->settings->ss_feed_url;
1965
+ $ss->settings->photo_data = $row->settings->ss_photo_data;
1966
 
1967
  // Return the slideshow source.
1968
  return $ss->get_source();
1977
  * @return void
1978
  */
1979
  static public function resize_row_content( $node_id, $width ) {
1980
+ $data = self::get_layout_data();
1981
+ $row = self::get_node( $node_id );
1982
  $row->settings->max_content_width = $width;
1983
+ $data[ $node_id ] = $row;
1984
  self::update_layout_data( $data );
1985
  }
1986
 
1995
  * @return object The new column group object.
1996
  */
1997
  static public function add_col_group( $node_id = null, $cols = '1-col', $position = false, $module = null ) {
1998
+ $data = self::get_layout_data();
1999
+ $group_node_id = self::generate_node_id();
2000
+ $parent = self::get_node( $node_id );
2001
+ $old_group = null;
2002
 
2003
  // Add the column group.
2004
+ $data[ $group_node_id ] = new StdClass();
2005
+ $data[ $group_node_id ]->node = $group_node_id;
2006
+ $data[ $group_node_id ]->type = 'column-group';
2007
+ $data[ $group_node_id ]->parent = $node_id;
2008
+ $data[ $group_node_id ]->position = self::next_node_position( null, $node_id );
2009
+ $data[ $group_node_id ]->settings = '';
2010
 
2011
  // Add node template data.
2012
  if ( self::is_node_global( $parent ) ) {
2013
+ $data[ $group_node_id ]->template_id = $parent->template_id;
2014
  $data[ $group_node_id ]->template_node_id = $group_node_id;
2015
  }
2016
 
2019
 
2020
  for ( $i = 0; $i < count( self::$row_layouts[ $cols ] ); $i++ ) {
2021
 
2022
+ $col_node_id = self::generate_node_id();
2023
+ $data[ $col_node_id ] = new StdClass();
2024
+ $data[ $col_node_id ]->node = $col_node_id;
2025
+ $data[ $col_node_id ]->type = 'column';
2026
+ $data[ $col_node_id ]->parent = $group_node_id;
2027
+ $data[ $col_node_id ]->position = $i;
2028
+ $data[ $col_node_id ]->settings = new StdClass();
2029
  $data[ $col_node_id ]->settings->size = self::$row_layouts[ $cols ][ $i ];
2030
 
2031
  if ( self::is_node_global( $parent ) ) {
2032
+ $data[ $col_node_id ]->template_id = $parent->template_id;
2033
  $data[ $col_node_id ]->template_node_id = $col_node_id;
2034
  }
2035
  }
2045
  $data[ $cols ]->settings->size = 100;
2046
 
2047
  if ( self::is_node_global( $parent ) ) {
2048
+ $data[ $cols ]->template_id = $parent->template_id;
2049
  $data[ $cols ]->template_node_id = $data[ $cols ]->node;
2050
  }
2051
 
2079
  // Move an existing module to the group.
2080
  if ( $module ) {
2081
  $cols = self::get_nodes( 'column', $group_node_id );
2082
+ $col = array_shift( $cols );
2083
  self::move_node( $module, $col->node, 0 );
2084
  }
2085
 
2107
  $new_settings->size = self::resize_col( $col->node, $new_settings->size );
2108
 
2109
  // Update other sibling vars as needed.
2110
+ $equal_height = false;
2111
+ $content_alignment = false;
2112
+ $responsive_order = false;
2113
 
2114
  // Adjust sibling equal height?
2115
  if ( $col->settings->equal_height != $new_settings->equal_height ) {
2116
  $equal_height = $new_settings->equal_height;
2117
  }
2118
 
2119
+ // Adjust sibling content alignment?
2120
  if ( $col->settings->content_alignment != $new_settings->content_alignment ) {
2121
  $content_alignment = $new_settings->content_alignment;
2122
  }
2244
  * @return int The new width
2245
  */
2246
  static public function resize_col( $node_id = null, $new_width = 100 ) {
2247
+ $data = self::get_layout_data();
2248
+ $col = $data[ $node_id ];
2249
+ $group = $data[ $col->parent ];
2250
+ $cols = array_values( self::get_nodes( 'column', $group->node ) );
2251
+ $pos = $col->position;
2252
+ $siblings = array();
2253
  $siblings_width = 0;
2254
+ $num_cols = count( $cols );
2255
+ $min_width = 8;
2256
+ $max_width = 100 - $min_width;
2257
 
2258
  // Don't resize if only one column or width isn't a number.
2259
  if ( 1 == $num_cols || ! is_numeric( $new_width ) ) {
2282
  continue;
2283
  }
2284
 
2285
+ $siblings[] = $c;
2286
+ $max_width -= $c->settings->size;
2287
  $siblings_width += $c->settings->size;
2288
  }
2289
 
2348
  return;
2349
  }
2350
 
2351
+ $data = self::get_layout_data();
2352
+ $post_data = self::get_post_data();
2353
+ $cols = self::get_nodes( 'column', $group_id );
2354
+ $width = round( 100 / count( $cols ), 3 );
2355
 
2356
  foreach ( $cols as $col_id => $col ) {
2357
  $data[ $col_id ]->settings->size = $width;
2409
  * @return object
2410
  */
2411
  static public function add_cols( $col_id, $insert = 'before', $type = '1-col', $nested = false, $module = null ) {
2412
+ $data = self::get_layout_data();
2413
+ $col = self::get_node( $col_id );
2414
+ $parent = self::get_node( $col->parent );
2415
+ $cols = self::get_nodes( 'column', $col->parent );
2416
  $global = self::is_node_global( $parent );
2417
  $num_new_cols = count( self::$row_layouts[ $type ] );
2418
+ $num_cols = count( $cols );
2419
  $max_cols = $nested ? 4 : 12;
2420
  $reposition = false;
2421
  $position = 0;
2447
  // Add the new columns.
2448
  for ( $i = 0; $i < $num_new_cols; $i++ ) {
2449
 
2450
+ $new_col_id = self::generate_node_id();
2451
+ $data[ $new_col_id ] = new StdClass();
2452
+ $data[ $new_col_id ]->node = $new_col_id;
2453
+ $data[ $new_col_id ]->type = 'column';
2454
+ $data[ $new_col_id ]->parent = $parent->node;
2455
+ $data[ $new_col_id ]->position = $new_col_position;
2456
+ $data[ $new_col_id ]->settings = new StdClass();
2457
+ $data[ $new_col_id ]->settings->size = $new_width;
2458
 
2459
  // Add node template data.
2460
  if ( $global ) {
2461
+ $data[ $new_col_id ]->template_id = $parent->template_id;
2462
  $data[ $new_col_id ]->template_node_id = $new_col_id;
2463
  }
2464
 
2509
  * @return string|null The new parent ID or null if none exists.
2510
  */
2511
  static public function add_col_parent( $parent_id = null, $position = null ) {
2512
+ $data = self::get_layout_data();
2513
+ $parent = ! $parent_id ? null : self::get_node( $parent_id );
2514
 
2515
  if ( ! $parent ) {
2516
  // Add a new row if we don't have a parent, but don't add column.
2517
+ $row = self::add_row( null, $position );
2518
  $col_groups = self::get_nodes( 'column-group', $row->node );
2519
+ $col_group = array_shift( $col_groups );
2520
+ $parent_id = $col_group->node;
2521
  } elseif ( 'row' == $parent->type ) {
2522
  // Add a new column group if the parent is a row, but don't add column.
2523
+ $col_group = self::add_col_group( $parent->node, null, $position );
2524
+ $parent_id = $col_group->node;
2525
  }
2526
 
2527
  return $parent_id;
2537
  */
2538
  static public function get_col_parent( $type, $column_id ) {
2539
  $column = is_object( $column_id ) ? $column_id : self::get_node( $column_id );
2540
+ $nodes = self::get_categorized_nodes();
2541
 
2542
  foreach ( $nodes['groups'] as $group ) {
2543
 
2570
  */
2571
  static public function copy_col( $node_id = null, $settings = null, $settings_id = null ) {
2572
  $layout_data = self::get_layout_data();
2573
+ $col = self::get_node( $node_id );
2574
+ $new_col_id = self::generate_node_id();
2575
+ $nodes = self::get_nodes( null, $col );
2576
+ $parent = self::get_node_parent( $node_id );
2577
+ $new_nodes = array();
2578
 
2579
  // Add the new column.
2580
+ $layout_data[ $new_col_id ] = clone $col;
2581
+ $layout_data[ $new_col_id ]->settings = clone $col->settings;
2582
+ $layout_data[ $new_col_id ]->node = $new_col_id;
2583
 
2584
  // Unset column template data.
2585
  if ( isset( $layout_data[ $new_col_id ]->template_id ) ) {
2591
 
2592
  // Check if parent is a global node.
2593
  if ( self::is_node_global( $parent ) ) {
2594
+ $layout_data[ $new_col_id ]->template_id = $parent->template_id;
2595
  $layout_data[ $new_col_id ]->template_node_id = $new_col_id;
2596
  } else {
2597
  unset( $layout_data[ $new_col_id ]->template_id );
2614
 
2615
  foreach ( $nested_cols as $nested_col ) {
2616
 
2617
+ $new_nodes[ $nested_col->node ] = clone $nested_col;
2618
  $new_nodes[ $nested_col->node ]->settings = clone $nested_col->settings;
2619
+ $modules = self::get_nodes( 'module', $nested_col );
2620
 
2621
  foreach ( $modules as $module ) {
2622
+ $new_nodes[ $module->node ] = clone $module;
2623
  $new_nodes[ $module->node ]->settings = self::clone_module_settings( $module->settings );
2624
  }
2625
  }
2646
  if ( isset( $new_nodes[ $child_node_id ]->template_id ) ) {
2647
  // Check if the column is global.
2648
  if ( isset( $layout_data[ $new_col_id ]->template_node_id ) ) {
2649
+ $new_nodes[ $child_node_id ]->template_id = $parent->template_id;
2650
  $new_nodes[ $child_node_id ]->template_node_id = $child_node_id;
2651
  } else {
2652
  unset( $new_nodes[ $child_node_id ]->template_id );
2691
  */
2692
  static public function load_modules() {
2693
  $paths = glob( FL_BUILDER_DIR . 'modules/*' );
2694
+ /**
2695
+ * Filter the modules paths.
2696
+ * @see fl_builder_load_modules_paths
2697
+ */
2698
+ $paths = apply_filters( 'fl_builder_load_modules_paths', $paths );
2699
  $module_path = '';
2700
 
2701
  // Make sure we have an array.
2715
  $slug = basename( $path );
2716
 
2717
  // Paths to check.
2718
+ $module_path = $slug . '/' . $slug . '.php';
2719
+ $child_path = get_stylesheet_directory() . '/fl-builder/modules/' . $module_path;
2720
+ $theme_path = get_template_directory() . '/fl-builder/modules/' . $module_path;
2721
+ $builder_path = FL_BUILDER_DIR . 'modules/' . $module_path;
2722
 
2723
  // Check for the module class in a child theme.
2724
  if ( is_child_theme() && file_exists( $child_path ) ) {
2729
  require_once $builder_path;
2730
  }
2731
  }
2732
+ /**
2733
+ * After modules are included.
2734
+ * @see fl_builder_register_extensions
2735
+ */
2736
  do_action( 'fl_builder_register_extensions' );
2737
  }
2738
 
2771
  * @see fl_builder_register_settings_form
2772
  * @link https://kb.wpbeaverbuilder.com/article/117-plugin-filter-reference
2773
  */
2774
+ self::$modules[ $instance->slug ]->form = apply_filters( 'fl_builder_register_settings_form', $form, $instance->slug );
2775
  self::$modules[ $instance->slug ]->form['advanced'] = self::$settings_forms['module_advanced'];
2776
  }
2777
  }
2790
  _doing_it_wrong( __CLASS__ . '::register_module_alias', sprintf( _x( 'The module alias %s already exists! Please namespace your module aliases to ensure compatibility with Beaver Builder.', '%s stands for the module alias key', 'fl-builder' ), $alias ), '1.10' );
2791
  return;
2792
  }
2793
+ if ( ! $config['module'] || ! isset( self::$modules[ $config['module'] ] ) ) {
2794
+ return;
2795
+ }
2796
 
2797
+ $module = self::$modules[ $config['module'] ];
2798
+ $instance = new stdClass;
2799
+ $instance->alias = $alias;
2800
+ $instance->slug = isset( $config['module'] ) ? $config['module'] : null;
2801
+ $instance->name = isset( $config['name'] ) ? $config['name'] : $instance->slug;
2802
+ $instance->description = isset( $config['description'] ) ? $config['description'] : '';
2803
+ $instance->category = isset( $config['category'] ) ? $config['category'] : null;
2804
+ $instance->group = isset( $config['group'] ) ? $config['group'] : null;
2805
+ $instance->settings = isset( $config['settings'] ) ? $config['settings'] : array();
2806
+ $instance->enabled = isset( $config['enabled'] ) ? $config['enabled'] : true;
2807
+ $instance->icon = isset( $config['icon'] ) ? $module->get_icon( $config['icon'] ) : FLBuilderModule::get_default_icon();
2808
 
2809
  self::$module_aliases[ $alias ] = $instance;
2810
  }
2874
  $setting = self::get_default_enabled_modules();
2875
  } elseif ( in_array( 'all', $setting ) ) {
2876
  // Redefine $setting in case new modules have been installed since the last save.
2877
+ $setting = array_keys( self::$modules );
2878
  $setting[] = 'all';
2879
  }
2880
 
2917
  }
2918
  }
2919
 
2920
+ // Add module alias groups.
2921
+ foreach ( self::$module_aliases as $alias => $config ) {
2922
+
2923
+ if ( ! $config->group || ! $config->enabled ) {
2924
+ continue;
2925
+ }
2926
+
2927
+ $slug = sanitize_key( $config->group );
2928
+
2929
+ if ( ! isset( $groups[ $slug ] ) ) {
2930
+ $groups[ $slug ] = $config->group;
2931
+ }
2932
+ }
2933
+
2934
  // Add module template groups.
2935
  if ( isset( $templates['groups'] ) ) {
2936
  foreach ( $templates['groups'] as $slug => $data ) {
2964
  }
2965
 
2966
  // Build the default category arrays.
2967
+ $categories[ __( 'Basic', 'fl-builder' ) ] = array();
2968
+ $categories[ __( 'Media', 'fl-builder' ) ] = array();
2969
+ $categories[ __( 'Actions', 'fl-builder' ) ] = array();
2970
+ $categories[ __( 'Layout', 'fl-builder' ) ] = array();
2971
+ $categories[ __( 'Info', 'fl-builder' ) ] = array();
2972
+ $categories[ __( 'Posts', 'fl-builder' ) ] = array();
2973
  $categories[ __( 'Advanced', 'fl-builder' ) ] = array();
2974
+ $categories[ __( 'Other', 'fl-builder' ) ] = array();
2975
 
2976
  return $categories;
2977
  }
2984
  * @return array
2985
  */
2986
  static public function get_categorized_modules( $show_disabled = false ) {
2987
+ $enabled_modules = self::get_enabled_modules();
2988
+ $widgets = null;
2989
+ $categories = self::get_module_categories();
2990
+ $other_key = __( 'Other', 'fl-builder' );
2991
+ $widgets_key = __( 'WordPress Widgets', 'fl-builder' );
2992
 
2993
  // Build the categories array.
2994
  foreach ( self::$modules as $module ) {
3051
  */
3052
  static public function get_uncategorized_modules( $show_disabled = false ) {
3053
  $enabled_modules = self::get_enabled_modules();
3054
+ $modules = array();
3055
+ $aliases = self::$module_aliases;
3056
+ $widgets = FLBuilderModel::get_wp_widgets();
3057
 
3058
  foreach ( self::$modules as $module ) {
3059
 
3065
  continue;
3066
  }
3067
 
3068
+ $module = clone $module;
3069
+ $module->kind = 'module';
3070
  $module->isWidget = false; // @codingStandardsIgnoreLine
3071
+ $module->isAlias = false; // @codingStandardsIgnoreLine
3072
+ $module->group = $module->group ? array( sanitize_key( $module->group ) ) : array( 'standard' );
3073
 
3074
  if ( ! isset( $module->icon ) || '' == $module->icon ) {
3075
  $module->icon = FLBuilderModule::get_default_icon();
3100
  $categories[ $config->category ] = array();
3101
  }
3102
 
3103
+ $config->kind = 'module';
3104
  $config->isWidget = false; // @codingStandardsIgnoreLine
3105
  $config->isAlias = true; // @codingStandardsIgnoreLine
3106
+ $config->group = $config->group ? array( sanitize_key( $config->group ) ) : array( 'standard' );
3107
 
3108
  $modules[] = $config;
3109
  }
3112
  if ( in_array( 'widget', $enabled_modules ) ) {
3113
  foreach ( $widgets as $widget ) {
3114
 
3115
+ $data = new stdClass;
3116
+ $widget = (object) $widget;
3117
+ $data->id = $widget->id;
3118
+ $data->name = $widget->name;
3119
+ $data->class = $widget->class;
3120
+ $data->category = $widget->category;
3121
+ $data->kind = 'module';
3122
  $data->isWidget = true; // @codingStandardsIgnoreLine
3123
  $data->isAlias = false; // @codingStandardsIgnoreLine
3124
  $data->description = isset( $widget->widget_options['description'] ) ? $widget->widget_options['description'] : '';
3147
 
3148
  if ( self::is_module_registered( $module->settings->type ) ) {
3149
 
3150
+ $class = get_class( self::$modules[ $module->settings->type ] );
3151
+ $instance = new $class();
3152
+ $instance->node = $module->node;
3153
+ $instance->parent = $module->parent;
3154
  $instance->position = $module->position;
3155
  $instance->settings = $module->settings;
3156
+ $instance->type = 'module';
3157
+ $instance->form = self::$modules[ $module->settings->type ]->form;
3158
+ $instance->icon = isset( $module->icon ) ? $module->icon : FLBuilderModule::get_default_icon();
3159
 
3160
  if ( isset( $module->template_id ) ) {
3161
+ $instance->template_id = $module->template_id;
3162
+ $instance->template_node_id = $module->template_node_id;
3163
  }
3164
  if ( isset( $module->template_root_node ) ) {
3165
  $instance->template_root_node = true;
3180
  * @return array
3181
  */
3182
  static public function get_modules( $col_id = null ) {
3183
+ $col = is_object( $col_id ) ? $col_id : self::get_node( $col_id );
3184
+ $modules = self::get_nodes( 'module', $col );
3185
+ $instances = array();
3186
+ $i = 0;
3187
 
3188
  foreach ( $modules as $module ) {
3189
 
3190
  if ( self::is_module_registered( $module->settings->type ) ) {
3191
 
3192
+ $class = get_class( self::$modules[ $module->settings->type ] );
3193
+ $instances[ $i ] = new $class();
3194
+ $instances[ $i ]->node = $module->node;
3195
+ $instances[ $i ]->parent = $module->parent;
3196
+ $instances[ $i ]->position = $module->position;
3197
+ $instances[ $i ]->settings = $module->settings;
3198
+ $instances[ $i ]->type = 'module';
3199
+ $instances[ $i ]->icon = isset( $module->icon ) ? $module->icon : FLBuilderModule::get_default_icon();
3200
+ $instances[ $i ]->form = self::$modules[ $module->settings->type ]->form;
3201
 
3202
  if ( isset( $module->template_id ) ) {
3203
+ $instances[ $i ]->template_id = $module->template_id;
3204
  $instances[ $i ]->template_node_id = $module->template_node_id;
3205
  }
3206
  if ( isset( $module->template_root_node ) ) {
3235
  * @return object The new module object.
3236
  */
3237
  static public function add_module( $type = null, $settings = array(), $parent_id = null, $position = false ) {
3238
+ $data = self::get_layout_data();
3239
+ $parent = self::get_node( $parent_id );
3240
+ $module_node_id = self::generate_node_id();
3241
+ $settings->type = $type;
3242
 
3243
  // Run module update method.
3244
+ $class = get_class( self::$modules[ $type ] );
3245
+ $instance = new $class();
3246
+ $instance->node = $module_node_id;
3247
+ $instance->settings = $settings;
3248
+ $settings = $instance->update( $settings );
3249
 
3250
  // Save the module.
3251
+ $data[ $module_node_id ] = new StdClass();
3252
+ $data[ $module_node_id ]->node = $module_node_id;
3253
+ $data[ $module_node_id ]->type = 'module';
3254
+ $data[ $module_node_id ]->parent = $parent_id;
3255
+ $data[ $module_node_id ]->position = self::next_node_position( 'module', $parent_id );
3256
+ $data[ $module_node_id ]->settings = $settings;
3257
 
3258
  // Add node template data.
3259
  if ( self::is_node_global( $parent ) ) {
3260
+ $data[ $module_node_id ]->template_id = $parent->template_id;
3261
+ $data[ $module_node_id ]->template_node_id = $module_node_id;
3262
  }
3263
 
3264
  // Update the layout data.
3287
 
3288
  if ( ! $parent ) {
3289
  // Add a new row if we don't have a parent.
3290
+ $row = self::add_row( '1-col', $position );
3291
  $col_groups = self::get_nodes( 'column-group', $row->node );
3292
+ $col_group = array_shift( $col_groups );
3293
+ $cols = self::get_nodes( 'column', $col_group->node );
3294
+ $parent = array_shift( $cols );
3295
+ $parent_id = $parent->node;
3296
  } elseif ( 'row' == $parent->type ) {
3297
  // Add a new column group if the parent is a row.
3298
+ $col_group = self::add_col_group( $parent->node, '1-col', $position );
3299
+ $cols = self::get_nodes( 'column', $col_group->node );
3300
+ $parent = array_shift( $cols );
3301
+ $parent_id = $parent->node;
3302
  } elseif ( 'column-group' == $parent->type ) {
3303
  // Add a new column if the parent is a column group.
3304
+ $parent = self::add_col( $parent->node, $position );
3305
+ $parent_id = $parent->node;
3306
  }
3307
 
3308
  return $parent_id;
3318
  */
3319
  static public function get_module_parent( $type, $module_id ) {
3320
  $module = is_object( $module_id ) ? $module_id : self::get_module( $module_id );
3321
+ $nodes = self::get_categorized_nodes();
3322
 
3323
  foreach ( $nodes['columns'] as $column ) {
3324
 
3362
  * @return array $defaults Default settings for the module.
3363
  */
3364
  static public function add_default_module( $parent_id = null, $type = null, $position = null, $defaults = null ) {
3365
+ $parent = ( 0 == $parent_id ) ? null : self::get_node( $parent_id );
3366
+ $settings = self::get_module_defaults( $type );
3367
  $module_node_id = self::generate_node_id();
3368
 
3369
  // Add a new parent if one is needed.
3370
  if ( ! $parent || 'row' == $parent->type || 'column-group' == $parent->type ) {
3371
  $parent_id = self::add_module_parent( $parent_id, $position );
3372
+ $parent = self::get_node( $parent_id );
3373
  $position = null;
3374
  }
3375
 
3379
  }
3380
 
3381
  // Run module update method.
3382
+ $class = get_class( self::$modules[ $type ] );
3383
+ $instance = new $class();
3384
+ $instance->node = $module_node_id;
3385
+ $instance->settings = $settings;
3386
+ $settings = $instance->update( $settings );
3387
 
3388
  // Save the module.
3389
+ $data = self::get_layout_data();
3390
+ $data[ $module_node_id ] = new StdClass();
3391
+ $data[ $module_node_id ]->node = $module_node_id;
3392
+ $data[ $module_node_id ]->type = 'module';
3393
+ $data[ $module_node_id ]->parent = $parent_id;
3394
+ $data[ $module_node_id ]->position = self::next_node_position( 'module', $parent_id );
3395
+ $data[ $module_node_id ]->settings = $settings;
3396
 
3397
  // Add node template data.
3398
  if ( self::is_node_global( $parent ) ) {
3399
+ $data[ $module_node_id ]->template_id = $parent->template_id;
3400
+ $data[ $module_node_id ]->template_node_id = $module_node_id;
3401
  }
3402
 
3403
  // Update the layout data.
3421
  * @return object The new module object.
3422
  */
3423
  static public function copy_module( $node_id = null, $settings = null ) {
3424
+ $module = self::get_module( $node_id );
3425
 
3426
  if ( $settings ) {
3427
  $module->settings = (object) array_merge( (array) $module->settings, (array) $settings );
3440
  */
3441
  static public function process_module_settings( $module, $new_settings ) {
3442
  // Get a new node instance to work with.
3443
+ $class = get_class( self::$modules[ $module->settings->type ] );
3444
+ $instance = new $class();
3445
+ $instance->node = $module->node;
3446
+ $instance->parent = $module->parent;
3447
  $instance->settings = $module->settings;
3448
 
3449
  // Run node delete to clear any cache.
3451
 
3452
  // Run node update.
3453
  $instance->settings = $new_settings;
3454
+ $new_settings = $instance->update( $new_settings );
3455
 
3456
  return $new_settings;
3457
  }
3488
  $defaults = new StdClass();
3489
 
3490
  if ( isset( self::$modules[ $type ]->form ) ) {
3491
+ $defaults = self::get_settings_form_defaults( $type );
3492
+ $defaults = self::merge_nested_module_defaults( $type, $defaults );
3493
  $defaults->type = $type;
3494
  }
3495
  } else {
3527
 
3528
  $widgets = array();
3529
 
3530
+ /**
3531
+ * Array of known widgets that won't work in the builder.
3532
+ * @see fl_get_wp_widgets_exclude
3533
+ */
3534
  $exclude = apply_filters( 'fl_get_wp_widgets_exclude', array(
3535
  'WP_Widget_Media_Audio',
3536
  'WP_Widget_Media_Image',
3584
  static public function get_column_groups() {
3585
  $cols = array(
3586
  array(
3587
+ 'name' => __( '1 Column', 'fl-builder' ),
3588
+ 'id' => '1-col',
3589
  'count' => 1,
3590
  ),
3591
  array(
3592
+ 'name' => __( '2 Columns', 'fl-builder' ),
3593
+ 'id' => '2-cols',
3594
  'count' => 2,
3595
  ),
3596
  array(
3597
+ 'name' => __( '3 Columns', 'fl-builder' ),
3598
+ 'id' => '3-cols',
3599
  'count' => 3,
3600
  ),
3601
  array(
3602
+ 'name' => __( '4 Columns', 'fl-builder' ),
3603
+ 'id' => '4-cols',
3604
  'count' => 4,
3605
  ),
3606
  array(
3607
+ 'name' => __( '5 Columns', 'fl-builder' ),
3608
+ 'id' => '5-cols',
3609
  'count' => 5,
3610
  ),
3611
  array(
3612
+ 'name' => __( '6 Columns', 'fl-builder' ),
3613
+ 'id' => '6-cols',
3614
  'count' => 6,
3615
  ),
3616
  array(
3617
+ 'name' => __( 'Left Sidebar', 'fl-builder' ),
3618
+ 'id' => 'left-sidebar',
3619
  'count' => 2,
3620
  ),
3621
  array(
3622
+ 'name' => __( 'Right Sidebar', 'fl-builder' ),
3623
+ 'id' => 'right-sidebar',
3624
  'count' => 2,
3625
  ),
3626
  array(
3627
+ 'name' => __( 'Left & Right Sidebar', 'fl-builder' ),
3628
+ 'id' => 'left-right-sidebar',
3629
  'count' => 3,
3630
  ),
3631
  );
3743
  // Check the registered forms first.
3744
  if ( isset( self::$settings_forms[ $type ] ) ) {
3745
  $form_type = $type;
3746
+ $tabs = self::$settings_forms[ $type ]['tabs'];
3747
  } elseif ( isset( self::$modules[ $type ] ) ) {
3748
  $form_type = $type . '-module';
3749
+ $tabs = self::$modules[ $type ]->form;
3750
  } else {
3751
  return $defaults;
3752
  }
3760
  // Add the root name if needed later for synthetic fields like
3761
  // the dimension fields being synthesized below.
3762
  $fields[ $name ]['root_name'] = $name;
3763
+ $field['root_name'] = $name;
3764
 
3765
  // Handle dimension fields. We have to do it this way for backwards compat
3766
  // with old margin, padding, and border fields as the settings expect margin_top
3806
 
3807
  $response_suffix = ( 'default' == $device ? '' : '_' . $device );
3808
  $responsive_name = $name . $response_suffix;
3809
+ $unit_name = $field['root_name'] . $response_suffix . '_unit';
3810
 
3811
  // Add the default value.
3812
  if ( is_array( $responsive ) && isset( $responsive['default'] ) && isset( $responsive['default'][ $device ] ) ) {
3909
  * @return void
3910
  */
3911
  static public function save_settings( $node_id = null, $settings = null ) {
3912
+ $node = self::get_node( $node_id );
3913
+ $new_settings = (object) array_merge( (array) $node->settings, (array) $settings );
3914
+ $template_post_id = self::is_node_global( $node );
3915
 
3916
  // Process the settings.
3917
  $new_settings = self::process_node_settings( $node, $new_settings );
3918
 
3919
  // Save the settings to the node.
3920
+ $data = self::get_layout_data();
3921
  $data[ $node_id ]->settings = $new_settings;
3922
 
3923
  // Update the layout data.
4064
  static public function duplicate_post() {
4065
  global $wpdb;
4066
 
4067
+ $post_id = self::get_post_id();
4068
+ $post = get_post( $post_id );
4069
  $current_user = wp_get_current_user();
4070
  $template_id = false;
4071
 
4072
  // Duplicate the post.
4073
  $data = array(
4074
  'comment_status' => $post->comment_status,
4075
+ 'ping_status' => $post->ping_status,
4076
+ 'post_author' => $current_user->ID,
4077
+ 'post_content' => $post->post_content,
4078
+ 'post_excerpt' => $post->post_excerpt,
4079
+ 'post_name' => $post->post_name . '-copy',
4080
+ 'post_parent' => $post->post_parent,
4081
+ 'post_password' => $post->post_password,
4082
+ 'post_status' => 'draft',
4083
+ 'post_title' => sprintf( _x( 'Copy of %s', '%s stands for post/page title.', 'fl-builder' ), $post->post_title ),
4084
+ 'post_type' => $post->post_type,
4085
+ 'to_ping' => $post->to_ping,
4086
+ 'menu_order' => $post->menu_order,
4087
  );
4088
 
4089
  // Get the new post id.
4134
 
4135
  // Update template ID and template node ID
4136
  $template_id = get_post_meta( $new_post_id, '_fl_builder_template_id', true );
4137
+ $global = get_post_meta( $post_id, '_fl_builder_template_global', true );
4138
 
4139
  if ( $template_id && $global ) {
4140
  foreach ( $data as $node_id => $node ) {
4141
+ $data[ $node_id ]->template_id = $template_id;
4142
  $data[ $node_id ]->template_node_id = $node_id;
4143
  }
4144
  }
4179
  * @param int $post_id
4180
  * @return void
4181
  */
4182
+ static public function save_revision( $post_id, $post, $update ) {
4183
 
4184
  $parent_id = wp_is_post_revision( $post_id );
4185
 
4186
  if ( $parent_id ) {
4187
 
4188
+ $parent = get_post( $parent_id );
4189
+ $data = self::get_layout_data( 'published', $parent->ID );
4190
+ $settings = self::get_layout_settings( 'published', $parent->ID );
4191
 
4192
  if ( ! empty( $data ) ) {
4193
  self::update_layout_data( $data, 'published', $post_id );
4217
  * @since 2.1.5
4218
  */
4219
  static public function save_layout_revision( $post_id ) {
4220
+ add_filter( 'wp_save_post_revision_post_has_changed', array( __CLASS__, 'save_layout_revision_changed_filter' ), 10, 3 );
4221
  wp_save_post_revision( $post_id );
4222
  remove_filter( 'wp_save_post_revision_post_has_changed', array( __CLASS__, 'save_layout_revision_changed_filter' ), 10, 3 );
4223
  }
4231
 
4232
  // get builder data for compare
4233
  $old = serialize( get_post_meta( $last_revision->ID, '_fl_builder_data', true ) );
4234
+ $new = serialize( get_post_meta( $post->ID, '_fl_builder_data', true ) );
4235
 
4236
  return $old != $new;
4237
  }
4245
  * @return void
4246
  */
4247
  static public function restore_revision( $post_id, $revision_id ) {
4248
+ $post = get_post( $post_id );
4249
  $revision = get_post( $revision_id );
4250
 
4251
  if ( $revision ) {
4252
 
4253
+ $data = self::get_layout_data( 'published', $revision->ID );
4254
  $settings = self::get_layout_settings( 'published', $revision->ID );
4255
 
4256
  if ( ! empty( $data ) ) {
4279
  * @return array
4280
  */
4281
  static public function get_layout_data( $status = null, $post_id = null ) {
4282
+ $post_id = ! $post_id ? self::get_post_id() : $post_id;
4283
+ $status = ! $status ? self::get_node_status() : $status;
4284
 
4285
  // Get layout metadata.
4286
  if ( 'published' == $status || 'revision' == get_post_type( $post_id ) ) {
4287
  if ( isset( self::$published_layout_data[ $post_id ] ) ) {
4288
  $data = self::$published_layout_data[ $post_id ];
4289
  } else {
4290
+ $data = get_metadata( 'post', $post_id, '_fl_builder_data', true );
4291
+ $data = self::clean_layout_data( $data );
4292
+ $data = FLBuilderSettingsCompat::filter_layout_data( $data );
4293
  self::$published_layout_data[ $post_id ] = apply_filters( 'fl_builder_get_layout_metadata', $data, $status, $post_id );
4294
  }
4295
  } elseif ( 'draft' == $status ) {
4296
  if ( isset( self::$draft_layout_data[ $post_id ] ) ) {
4297
  $data = self::$draft_layout_data[ $post_id ];
4298
  } else {
4299
+ $data = get_metadata( 'post', $post_id, '_fl_builder_draft', true );
4300
+ $data = self::clean_layout_data( $data );
4301
+ $data = FLBuilderSettingsCompat::filter_layout_data( $data );
4302
  self::$draft_layout_data[ $post_id ] = apply_filters( 'fl_builder_get_layout_metadata', $data, $status, $post_id );
4303
  }
4304
  }
4315
  }
4316
  }
4317
 
4318
+ /**
4319
+ * Return the data.
4320
+ * @see fl_builder_layout_data
4321
+ */
4322
  return apply_filters( 'fl_builder_layout_data', $data, $status, $post_id );
4323
  }
4324
 
4333
  * @return void
4334
  */
4335
  static public function update_layout_data( $data, $status = null, $post_id = null ) {
4336
+ $post_id = ! $post_id ? self::get_post_id() : $post_id;
4337
+ $status = ! $status ? self::get_node_status() : $status;
4338
+ $key = 'published' == $status ? '_fl_builder_data' : '_fl_builder_draft';
4339
+ $raw_data = get_metadata( 'post', $post_id, $key );
4340
+ $data = self::slash_settings( self::clean_layout_data( $data ) );
4341
 
4342
  // Update the data.
4343
  if ( 0 === count( $raw_data ) ) {
4426
  * @return bool
4427
  */
4428
  static public function layout_has_drafted_changes() {
4429
+ $post_id = FLBuilderModel::get_post_id();
4430
  $published = serialize( self::get_layout_data( 'published', $post_id ) );
4431
+ $draft = serialize( self::get_layout_data( 'draft', $post_id ) );
4432
 
4433
  if ( $published != $draft ) {
4434
  return true;
4446
  * @return object
4447
  */
4448
  static public function get_layout_settings( $status = null, $post_id = null ) {
4449
+ $status = ! $status ? self::get_node_status() : $status;
4450
+ $post_id = ! $post_id ? self::get_post_id() : $post_id;
4451
+ $key = 'published' == $status ? '_fl_builder_data_settings' : '_fl_builder_draft_settings';
4452
+ $settings = get_metadata( 'post', $post_id, $key, true );
4453
+ $defaults = self::get_settings_form_defaults( 'layout' );
4454
 
4455
  if ( ! $settings ) {
4456
  $settings = new StdClass();
4471
  * @return object
4472
  */
4473
  static public function update_layout_settings( $settings = array(), $status = null, $post_id = null ) {
4474
+ $status = ! $status ? self::get_node_status() : $status;
4475
+ $post_id = ! $post_id ? self::get_post_id() : $post_id;
4476
+ $key = 'published' == $status ? '_fl_builder_data_settings' : '_fl_builder_draft_settings';
4477
+ $raw_settings = get_metadata( 'post', $post_id, $key );
4478
+ $old_settings = self::get_layout_settings( $status, $post_id );
4479
+ $new_settings = (object) array_merge( (array) $old_settings, (array) $settings );
4480
 
4481
  if ( 0 === count( $raw_settings ) ) {
4482
  add_metadata( 'post', $post_id, $key, self::slash_settings( $new_settings ) );
4509
  * @return void
4510
  */
4511
  static public function delete_layout_settings( $status = null, $post_id = null ) {
4512
+ $status = ! $status ? self::get_node_status() : $status;
4513
+ $post_id = ! $post_id ? self::get_post_id() : $post_id;
4514
+ $key = 'published' == $status ? '_fl_builder_data_settings' : '_fl_builder_draft_settings';
4515
 
4516
  update_metadata( 'post', $post_id, $key, array() );
4517
  }
4554
  * @return void
4555
  */
4556
  static public function clear_draft_layout() {
4557
+ $post_id = self::get_post_id();
4558
+ $data = self::get_layout_data( 'published', $post_id );
4559
+ $settings = self::get_layout_settings( 'published', $post_id );
4560
 
4561
  // Delete the old draft layout.
4562
  self::delete_layout_data( 'draft' );
4580
  */
4581
  static public function save_layout( $publish = true ) {
4582
  $editor_content = FLBuilder::render_editor_content();
4583
+ $post_id = self::get_post_id();
4584
+ $data = self::get_layout_data( 'draft', $post_id );
4585
+ $settings = self::get_layout_settings( 'draft', $post_id );
4586
 
4587
  /**
4588
  * This action allows you to hook into before the data is saved for a layout.
4612
  // Publish the post?
4613
  if ( $publish ) {
4614
 
4615
+ $is_draft = strstr( $post_status, 'draft' );
4616
+ $is_pending = strstr( $post_status, 'pending' );
4617
 
4618
  if ( current_user_can( 'publish_posts' ) ) {
4619
  $post_status = $is_draft || $is_pending ? 'publish' : $post_status;
4624
 
4625
  // Update the post with stripped down content.
4626
  wp_update_post(array(
4627
+ 'ID' => self::get_post_id(),
4628
+ 'post_status' => $post_status,
4629
+ 'post_content' => $editor_content,
4630
  ));
4631
 
4632
  // Rerender the assets for this layout.
4651
  * @return void
4652
  */
4653
  static public function save_draft() {
4654
+ $post_id = self::get_post_id();
4655
  $post_status = get_post_status( $post_id );
4656
 
4657
  if ( strstr( $post_status, 'draft' ) ) {
4658
  self::save_layout( false );
4659
  }
4660
 
4661
+ /**
4662
+ * After draft is saved.
4663
+ * @see fl_builder_after_save_draft
4664
+ */
4665
  do_action( 'fl_builder_after_save_draft', $post_id, $post_status );
4666
  }
4667
 
4675
  * @return array
4676
  */
4677
  static public function duplicate_wpml_layout( $original_post_id = null, $new_post_id = null ) {
4678
+ $post_data = self::get_post_data();
4679
+ $original_post_id = isset( $post_data['original_post_id'] ) ? $post_data['original_post_id'] : $original_post_id;
4680
+ $new_post_id = isset( $post_data['post_id'] ) ? $post_data['post_id'] : $new_post_id;
4681
+ $enabled = get_post_meta( $original_post_id, '_fl_builder_enabled', true );
4682
+ $published = self::get_layout_data( 'published', $original_post_id );
4683
+ $draft = self::get_layout_data( 'draft', $original_post_id );
4684
 
4685
  $response = array(
4686
+ 'enabled' => false,
4687
  'has_layout' => false,
4688
  );
4689
 
4753
  static public function save_user_template( $settings = array() ) {
4754
  // Save the user template post.
4755
  $post_id = wp_insert_post(array(
4756
+ 'post_title' => $settings['name'],
4757
+ 'post_type' => 'fl-builder-template',
4758
+ 'post_status' => 'publish',
4759
+ 'ping_status' => 'closed',
4760
  'comment_status' => 'closed',
4761
  ));
4762
 
4764
  wp_set_post_terms( $post_id, 'layout', 'fl-builder-template-type' );
4765
 
4766
  // Add category
4767
+ $cat = isset( $settings['category'] ) ? $settings['category'] : '';
4768
  $cat_added = '';
4769
  if ( __( 'Uncategorized', 'fl-builder' ) !== $cat && 'uncategorized' !== $cat ) {
4770
  $cat_added = wp_set_object_terms( $post_id, $cat, 'fl-builder-template-category' );
4771
  }
4772
 
4773
  // Get the layout data and settings to copy.
4774
+ $data = self::get_layout_data();
4775
+ $layout_settings = self::get_layout_settings();
4776
 
4777
  // Generate new node ids.
4778
  $data = self::generate_new_node_ids( $data );
4784
  // Enable the builder for this template.
4785
  update_post_meta( $post_id, '_fl_builder_enabled', true );
4786
 
4787
+ /**
4788
+ * Allow extensions to hook into saving a user template.
4789
+ * @see fl_builder_after_save_user_template
4790
+ */
4791
  do_action( 'fl_builder_after_save_user_template', $post_id );
4792
 
4793
  $response = array(
4794
+ 'name' => $settings['name'],
4795
+ 'id' => get_post_meta( $post_id, '_fl_builder_template_id', true ),
4796
+ 'postId' => $post_id,
4797
+ 'image' => FL_BUILDER_URL . 'img/templates/blank.jpg',
4798
+ 'kind' => 'template',
4799
+ 'content' => 'layout',
4800
+ 'type' => 'user',
4801
  'isGlobal' => false,
4802
+ 'link' => add_query_arg( 'fl_builder', '', get_permalink( $post_id ) ),
4803
  'category' => array(),
4804
  );
4805
 
4806
  if ( is_array( $cat_added ) && ! empty( $cat_added ) ) {
4807
+ $term = get_term( $cat_added[0] );
4808
  $response['category'][ $term->slug ] = $term->name;
4809
  } else {
4810
  $response['category']['uncategorized'] = __( 'Uncategorized', 'fl-builder' );
4824
  static public function get_user_templates( $type = 'layout' ) {
4825
  $categorized = array(
4826
  'uncategorized' => array(
4827
+ 'name' => _x( 'Uncategorized', 'Default user template category.', 'fl-builder' ),
4828
+ 'templates' => array(),
4829
  ),
4830
  );
4831
 
4835
  'order' => 'ASC',
4836
  'posts_per_page' => '-1',
4837
  'suppress_filters' => false,
4838
+ 'tax_query' => array(
4839
  array(
4840
  'taxonomy' => 'fl-builder-template-type',
4841
  'field' => 'slug',
4851
 
4852
  if ( has_post_thumbnail( $post->ID ) ) {
4853
  $image_data = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'medium_large' );
4854
+ $image = $image_data[0];
4855
  } else {
4856
  $image = FL_BUILDER_URL . 'img/templates/blank.jpg';
4857
  }
4858
 
4859
  $templates[] = array(
4860
+ 'id' => get_post_meta( $post->ID, '_fl_builder_template_id', true ),
4861
+ 'postId' => $post->ID,
4862
+ 'name' => $post->post_title,
4863
+ 'image' => $image,
4864
+ 'kind' => 'template',
4865
+ 'type' => 'user',
4866
+ 'content' => FLBuilderModel::get_user_template_type( $post->ID ),
4867
+ 'isGlobal' => FLBuilderModel::is_post_global_node_template( $post->ID ),
4868
+ 'link' => add_query_arg( 'fl_builder', '', get_permalink( $post->ID ) ),
4869
+ 'category' => array(),
4870
  );
4871
  }
4872
 
4876
  $cats = wp_get_post_terms( $template['postId'], 'fl-builder-template-category' );
4877
 
4878
  if ( 0 === count( $cats ) || is_wp_error( $cats ) ) {
4879
+ $template['category'] = array(
4880
  'uncategorized' => __( 'Uncategorized', 'fl-builder' ),
4881
  );
4882
  $categorized['uncategorized']['templates'][] = $template;
4889
  foreach ( $cats as $cat ) {
4890
  if ( ! isset( $categorized[ $cat->slug ] ) ) {
4891
  $categorized[ $cat->slug ] = array(
4892
+ 'name' => $cat->name,
4893
+ 'templates' => array(),
4894
  );
4895
  }
4896
  $categorized[ $cat->slug ]['templates'][] = $template;
4909
  asort( $categorized );
4910
 
4911
  return array(
4912
+ 'templates' => $templates,
4913
+ 'categorized' => $categorized,
4914
  );
4915
  }
4916
 
4977
 
4978
  // Get the template data if $template is not an object.
4979
  if ( ! is_object( $template ) ) {
4980
+ $template_id = $template;
4981
+ $template = new StdClass();
4982
+ $template->nodes = self::get_layout_data( 'published', $template_id );
4983
  $template->settings = self::get_layout_settings( 'published', $template_id );
4984
  }
4985
 
4987
  $template->nodes = self::generate_new_node_ids( $template->nodes );
4988
 
4989
  // Get the existing layout data and settings.
4990
+ $layout_data = self::get_layout_data();
4991
  $layout_settings = self::get_layout_settings();
4992
 
4993
  // Reposition rows if we are appending.
5004
  }
5005
 
5006
  // Merge the layout data and settings.
5007
+ $data = array_merge( $layout_data, $template->nodes );
5008
  $settings = self::merge_layout_settings( $layout_settings, $template->settings );
5009
 
5010
  // Update the layout data and settings.
5020
  // Return the layout.
5021
  return array(
5022
  'layout_css' => isset( $settings ) ? $settings->css : null,
5023
+ 'layout' => FLBuilderAJAXLayout::render(),
5024
+ 'config' => FLBuilderUISettingsForms::get_node_js_config(),
5025
  );
5026
  }
5027
 
5119
 
5120
  $is_visible = true;
5121
 
5122
+ if ( isset( $node->settings->visibility_display ) && ( '' != $node->settings->visibility_display ) ) {
5123
 
5124
  // For logged out users
5125
  if ( 'logged_out' == $node->settings->visibility_display && ! is_user_logged_in() ) {
5175
  */
5176
  static public function get_node_templates( $type = '' ) {
5177
  $posts = get_posts( array(
5178
+ 'post_type' => 'fl-builder-template',
5179
+ 'orderby' => 'title',
5180
+ 'order' => 'ASC',
5181
+ 'posts_per_page' => '-1',
5182
+ 'tax_query' => array(
5183
  array(
5184
  'taxonomy' => 'fl-builder-template-type',
5185
+ 'field' => 'slug',
5186
+ 'terms' => $type,
5187
  ),
5188
  ),
5189
  ) );
5193
  foreach ( $posts as $post ) {
5194
 
5195
  $templates[] = array(
5196
+ 'id' => get_post_meta( $post->ID, '_fl_builder_template_id', true ),
5197
+ 'global' => get_post_meta( $post->ID, '_fl_builder_template_global', true ),
5198
+ 'link' => add_query_arg( 'fl_builder', '', get_permalink( $post->ID ) ),
5199
+ 'name' => $post->post_title,
5200
  );
5201
  }
5202
 
5244
  } else {
5245
 
5246
  $posts = get_posts( array(
5247
+ 'post_type' => 'fl-builder-template',
5248
+ 'post_status' => array( 'any', 'trash' ),
5249
+ 'posts_per_page' => '-1',
5250
+ 'post_status' => 'any',
5251
+ 'meta_key' => '_fl_builder_template_id',
5252
+ 'meta_value' => $template_id,
5253
  ) );
5254
 
5255
  if ( 0 === count( $posts ) ) {
5256
  return false;
5257
  }
5258
 
5259
+ $post_id = apply_filters( 'fl_builder_node_template_post_id', $posts[0]->ID );
5260
  self::$node_template_post_ids[ $template_id ] = $post_id;
5261
  return $post_id;
5262
  }
5300
  'key' => '_fl_builder_draft',
5301
  'value' => $template_id,
5302
  'compare' => 'LIKE',
5303
+ ),
5304
  ),
5305
+ 'post_type' => 'any',
5306
  'post_status' => 'any',
5307
  'post__not_in' => array( $post_id ),
5308
  ) );
5322
  * @return void
5323
  */
5324
  static public function save_node_template( $template_node_id, $settings ) {
5325
+ $root_node = self::get_node( $template_node_id );
5326
+ $nodes = self::get_nested_nodes( $template_node_id );
5327
+ $template_id = self::generate_node_id();
5328
+ $original_parent = $root_node->parent;
5329
+ $original_position = $root_node->position;
5330
 
5331
  // Save the node template post.
5332
  $post_id = wp_insert_post( array(
5333
+ 'post_title' => $settings['name'],
5334
+ 'post_type' => 'fl-builder-template',
5335
+ 'post_status' => 'publish',
5336
+ 'ping_status' => 'closed',
5337
  'comment_status' => 'closed',
5338
  ) );
5339
 
5345
 
5346
  // Remove root parent for column template.
5347
  if ( 'column' == $root_node->type ) {
5348
+ $root_node->parent = null;
5349
  $root_node->settings->size = 100;
5350
  }
5351
 
5363
 
5364
  foreach ( $nodes as $node_id => $node ) {
5365
 
5366
+ $nodes[ $node_id ]->template_id = $template_id;
5367
  $nodes[ $node_id ]->template_node_id = $node_id;
5368
 
5369
  if ( $node_id == $root_node->node ) {
5415
 
5416
  // Return an array of template settings.
5417
  return array(
5418
+ 'id' => $template_id,
5419
+ 'global' => $settings['global'] ? true : false,
5420
+ 'link' => add_query_arg( 'fl_builder', '', get_permalink( $post_id ) ),
5421
+ 'name' => $settings['name'],
5422
+ 'type' => $root_node->type,
5423
+ 'layout' => $settings['global'] ? FLBuilderAJAXLayout::render( $root_node->node, $template_node_id ) : null,
5424
+ 'config' => $settings['global'] ? FLBuilderUISettingsForms::get_node_js_config() : null,
5425
+ 'postID' => $post_id,
5426
  );
5427
  }
5428
 
5496
  static public function unlink_global_node_template_from_all_posts( $template_post_id ) {
5497
  if ( self::is_post_global_node_template( $template_post_id ) ) {
5498
 
5499
+ $posts = self::get_posts_with_global_node_template( $template_post_id );
5500
  $template_id = get_post_meta( $template_post_id, '_fl_builder_template_id', true );
5501
 
5502
  foreach ( $posts as $post ) {
5521
  * @return void
5522
  */
5523
  static public function unlink_global_node_template_from_post( $status, $post_id, $template_post_id, $template_id ) {
5524
+ $template_data = self::get_layout_data( $status, $template_post_id );
5525
+ $layout_data = self::get_layout_data( $status, $post_id );
5526
+ $update = false;
5527
 
5528
  // Loop through the layout data.
5529
  foreach ( $layout_data as $node_id => $node ) {
5583
  static public function delete_global_node_template_from_all_posts( $template_post_id ) {
5584
  if ( self::is_post_global_node_template( $template_post_id ) ) {
5585
 
5586
+ $posts = self::get_posts_with_global_node_template( $template_post_id );
5587
  $template_id = get_post_meta( $template_post_id, '_fl_builder_template_id', true );
5588
 
5589
  foreach ( $posts as $post ) {
5662
  $template_post_id = self::get_node_template_post_id( $template_id );
5663
  $is_col_template = false;
5664
 
5665
+ /**
5666
+ * Allow extensions to hook into applying a node template.
5667
+ * @see fl_builder_override_apply_node_template
5668
+ */
5669
  $override = apply_filters( 'fl_builder_override_apply_node_template', false, array(
5670
  'template_id' => $template_id,
5671
  'parent_id' => $parent_id,
5681
 
5682
  // Get the template data from $template if we have it.
5683
  if ( is_object( $template ) ) {
5684
+ $template_data = $template->nodes;
5685
+ $template_settings = $template->settings;
5686
+ $type = $template->type;
5687
+ $global = $template->global;
5688
  } else {
5689
+ $template_data = self::get_layout_data( 'published', $template_post_id );
5690
+ $template_settings = self::get_layout_settings( 'published', $template_post_id );
5691
+ $type = self::get_user_template_type( $template_post_id );
5692
+ $global = get_post_meta( $template_post_id, '_fl_builder_template_global', true );
5693
  }
5694
 
5695
  // Generate new node ids.
5708
  $parent_id = self::add_module_parent( $parent_id, $position );
5709
  $position = null;
5710
  } elseif ( 'column' == $root_node->type ) {
5711
+ $parent_id = self::add_col_parent( $parent_id, $position );
5712
  $is_col_template = self::is_node_global( $root_node );
5713
  }
5714
 
5717
 
5718
  // Set the node's template data if the parent is a global node.
5719
  if ( self::is_node_global( $parent ) && ! $is_col_template ) {
5720
+ $template_data[ $root_node->node ]->template_id = $parent->template_id;
5721
  $template_data[ $root_node->node ]->template_node_id = $root_node->node;
5722
  unset( $template_data[ $root_node->node ]->template_root_node );
5723
  $global = true;
5728
  $template_data[ $root_node->node ]->parent = ! $parent_id ? null : $parent_id;
5729
 
5730
  // Get the layout data and settings.
5731
+ $layout_data = self::get_layout_data( 'draft' );
5732
  $layout_settings = self::get_layout_settings( 'draft' );
5733
 
5734
  // Only merge the root node for global templates.
5846
  * @return void
5847
  */
5848
  static public function apply_template( $index = 0, $append = false, $type = 'layout' ) {
5849
+ /**
5850
+ * Allow extensions to hook into applying a template.
5851
+ * @see fl_builder_override_apply_template
5852
+ */
5853
  $override = apply_filters( 'fl_builder_override_apply_template', false, array(
5854
  'index' => $index,
5855
  'append' => $append,
5875
  * @return array
5876
  */
5877
  static public function apply_core_template( $index = 0, $append = false, $type = 'layout' ) {
5878
+ $template = self::get_template( $index, $type );
5879
  $row_position = self::next_node_position( 'row' );
5880
 
5881
  // Delete existing nodes and settings?
5894
  $template->nodes = FLBuilderSettingsCompat::filter_layout_data( $template->nodes );
5895
 
5896
  // Get the existing layout data and settings.
5897
+ $layout_data = self::get_layout_data();
5898
  $layout_settings = self::get_layout_settings();
5899
 
5900
  // Reposition rows?
6036
  * @return array
6037
  */
6038
  static public function get_template_selector_data( $type = 'layout' ) {
6039
+ $type = apply_filters( 'fl_builder_template_selector_data_type', $type );
6040
+ $categorized = array();
6041
+ $templates = array();
6042
+ $groups = array();
6043
 
6044
  // This is needed for backwards compat with the old core templates category.
6045
  $core_categories = array(
6073
  'image' => $image,
6074
  'author' => '',
6075
  'category' => isset( $template->category ) ? $template->category : $template->categories,
6076
+ 'tags' => array(),
6077
+ 'group' => $template->group,
6078
  'type' => 'core',
6079
+ 'kind' => 'template',
6080
  'content' => ! in_array( $type, array( 'row', 'column', 'module' ) ) ? 'layout' : $type,
6081
  ), $template );
6082
  }
6122
  $group_key = sanitize_key( $group_name );
6123
  if ( ! isset( $groups[ $group_key ] ) ) {
6124
  $groups[ $group_key ] = array(
6125
+ 'name' => $group_name,
6126
  'categories' => array(),
6127
  );
6128
  }
6143
  // Add the category if we don't have it yet.
6144
  if ( ! isset( $categorized[ $cat_key ] ) ) {
6145
  $categorized[ $cat_key ] = array(
6146
+ 'name' => $cat_name,
6147
+ 'templates' => array(),
6148
  );
6149
  }
6150
 
6154
  $templates[ $i ] = $template;
6155
  }
6156
 
6157
+ /**
6158
+ * Return both the templates and categorized templates array.
6159
+ * @see fl_builder_template_selector_data
6160
+ */
6161
  return apply_filters( 'fl_builder_template_selector_data', array(
6162
+ 'templates' => $templates,
6163
+ 'categorized' => $categorized,
6164
+ 'groups' => $groups,
6165
  ), $type );
6166
  }
6167
 
6313
  /**
6314
  * Check if the current user has the specific capabilities
6315
  *
6316
+ * @param string $cap The capability to evaluate if it's single or multiple (comma separated) value
6317
  * @return bool
6318
  */
6319
  static public function current_user_has_capability( $cap ) {
6341
  */
6342
  static public function get_help_button_defaults() {
6343
  $defaults = array(
6344
+ 'enabled' => true,
6345
+ 'tour' => true,
6346
+ 'video' => true,
6347
+ 'video_embed' => '<iframe src="https://player.vimeo.com/video/240550556?autoplay=1" width="420" height="315" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>',
6348
+ 'knowledge_base' => true,
6349
+ 'knowledge_base_url' => self::get_store_url( 'knowledge-base', array(
6350
+ 'utm_medium' => ( true === FL_BUILDER_LITE ? 'bb-lite' : 'bb-pro' ),
6351
+ 'utm_source' => 'builder-ui',
6352
  'utm_campaign' => 'kb-help-button',
6353
  ) ),
6354
+ 'forums' => true,
6355
+ 'forums_url' => self::get_store_url( 'knowledge-base', array(
6356
+ 'utm_medium' => ( true === FL_BUILDER_LITE ? 'bb-lite' : 'bb-pro' ),
6357
+ 'utm_source' => 'builder-ui',
6358
  'utm_campaign' => 'forums-help-button',
6359
  ) ),
6360
  );
6385
  static public function get_row_resize_settings() {
6386
  $defaults = array(
6387
  'userCanResizeRows' => true,
6388
+ 'minAllowedWidth' => 300,
6389
+ 'maxAllowedWidth' => false,
6390
  );
6391
 
6392
  $settings = apply_filters( 'fl_row_resize_settings', $defaults );
6585
  delete_metadata( 'user', 0, '_fl_builder_launched', 1, true );
6586
 
6587
  // Delete uploaded files and folders.
6588
+ $upload_dir = self::get_upload_dir();
6589
  fl_builder_filesystem()->rmdir( $upload_dir['path'], true );
6590
 
6591
  // Deactivate and delete the plugin.
classes/class-fl-builder-module.php CHANGED
@@ -151,23 +151,23 @@ class FLBuilderModule {
151
  * @since 1.0
152
  */
153
  public function __construct( $params ) {
154
- $class_info = new ReflectionClass( $this );
155
- $class_path = $class_info->getFileName();
156
- $dir_path = dirname( $class_path );
157
- $this->slug = basename( $class_path, '.php' );
158
- $this->enabled = isset( $params['enabled'] ) ? $params['enabled'] : true;
159
- $this->editor_export = isset( $params['editor_export'] ) ? $params['editor_export'] : true;
160
- $this->partial_refresh = isset( $params['partial_refresh'] ) ? $params['partial_refresh'] : false;
161
 
162
  // We need to normalize the paths here since path comparisons
163
  // break on Windows because they use backslashes.
164
- $abspath = str_replace( '\\', '/', ABSPATH );
165
- $fl_builder_dir = str_replace( '\\', '/', FL_BUILDER_DIR );
166
- $dir_path = str_replace( '\\', '/', $dir_path );
167
- $stylesheet_directory = str_replace( '\\', '/', get_stylesheet_directory() );
168
- $stylesheet_directory_uri = str_replace( '\\', '/', get_stylesheet_directory_uri() );
169
- $template_directory = str_replace( '\\', '/', get_template_directory() );
170
- $template_directory_uri = str_replace( '\\', '/', get_template_directory_uri() );
171
 
172
  // Find the right paths.
173
  if ( is_child_theme() && stristr( $dir_path, $stylesheet_directory ) ) {
@@ -193,15 +193,15 @@ class FLBuilderModule {
193
  'name' => $params['name'],
194
  'description' => $params['description'],
195
  'category' => $this->normalize_category_name( $params['category'] ),
196
- 'group' => isset( $params['group'] ) ? $params['group'] : false,
197
- 'icon' => $this->icon,
198
  ), $this->slug );
199
 
200
- $this->name = $details['name'];
201
- $this->description = $details['description'];
202
- $this->category = $details['category'];
203
- $this->group = $details['group'];
204
- $this->icon = $details['icon'];
205
  }
206
 
207
  /**
151
  * @since 1.0
152
  */
153
  public function __construct( $params ) {
154
+ $class_info = new ReflectionClass( $this );
155
+ $class_path = $class_info->getFileName();
156
+ $dir_path = dirname( $class_path );
157
+ $this->slug = basename( $class_path, '.php' );
158
+ $this->enabled = isset( $params['enabled'] ) ? $params['enabled'] : true;
159
+ $this->editor_export = isset( $params['editor_export'] ) ? $params['editor_export'] : true;
160
+ $this->partial_refresh = isset( $params['partial_refresh'] ) ? $params['partial_refresh'] : false;
161
 
162
  // We need to normalize the paths here since path comparisons
163
  // break on Windows because they use backslashes.
164
+ $abspath = str_replace( '\\', '/', ABSPATH );
165
+ $fl_builder_dir = str_replace( '\\', '/', FL_BUILDER_DIR );
166
+ $dir_path = str_replace( '\\', '/', $dir_path );
167
+ $stylesheet_directory = str_replace( '\\', '/', get_stylesheet_directory() );
168
+ $stylesheet_directory_uri = str_replace( '\\', '/', get_stylesheet_directory_uri() );
169
+ $template_directory = str_replace( '\\', '/', get_template_directory() );
170
+ $template_directory_uri = str_replace( '\\', '/', get_template_directory_uri() );
171
 
172
  // Find the right paths.
173
  if ( is_child_theme() && stristr( $dir_path, $stylesheet_directory ) ) {
193
  'name' => $params['name'],
194
  'description' => $params['description'],
195
  'category' => $this->normalize_category_name( $params['category'] ),
196
+ 'group' => isset( $params['group'] ) ? $params['group'] : false,
197
+ 'icon' => $this->icon,
198
  ), $this->slug );
199
 
200
+ $this->name = $details['name'];
201
+ $this->description = $details['description'];
202
+ $this->category = $details['category'];
203
+ $this->group = $details['group'];
204
+ $this->icon = $details['icon'];
205
  }
206
 
207
  /**
classes/class-fl-builder-notifications.php CHANGED
@@ -5,22 +5,36 @@
5
  */
6
  final class FLBuilderNotifications {
7
 
8
- static $url = 'https://www.wpbeaverbuilder.com/wp-json/wp/v2/fl_notification';
9
 
10
- static $option = 'fl_notifications';
 
 
11
 
12
  public static function init() {
13
 
14
  if ( FLBuilderModel::is_white_labeled() || true == apply_filters( 'fl_disable_notifications', false ) ) {
15
  return false;
16
  }
17
- add_action( 'pre_set_site_transient_update_plugins', array( 'FLBuilderNotifications', 'fetch_notifications_trigger' ) );
18
- add_action( 'fl_fetch_notifications', array( 'FLBuilderNotifications', 'fetch_notifications' ) );
19
  FLBuilderAJAX::add_action( 'fl_builder_notifications', array( 'FLBuilderNotifications', 'notications_ajax' ), array( 'read' ) );
20
  }
21
 
 
 
 
 
 
 
 
 
 
 
 
22
  /**
23
  * Transient is passed by reference here, lets not mess with it and just trigger our fetch.
 
24
  */
25
  public static function fetch_notifications_trigger( $transient ) {
26
  if ( ! did_action( 'fl_fetch_notifications' ) ) {
@@ -52,14 +66,14 @@ final class FLBuilderNotifications {
52
  public static function fetch_notifications() {
53
 
54
  $defaults = array(
55
- 'read' => false,
56
  'checksum' => '',
57
- 'data' => '{}',
58
  );
59
 
60
- $url = ( isset( $_GET['force-check'] ) ) ? self::$url . '/?a=' . rand() : self::$url;
61
- $stored_data = get_option( self::$option, $defaults );
62
- $response = wp_remote_get( $url );
63
 
64
  $response_code = wp_remote_retrieve_response_code( $response );
65
  $body = wp_remote_retrieve_body( $response );
@@ -81,9 +95,9 @@ final class FLBuilderNotifications {
81
  $unread = self::compare_checksums( $stored_checksum, $latest_checksum );
82
 
83
  $stored_data = array(
84
- 'read' => true,
85
  'checksum' => $latest_checksum,
86
- 'data' => wp_json_encode( $body ),
87
  );
88
 
89
  if ( $unread ) {
@@ -142,10 +156,10 @@ final class FLBuilderNotifications {
142
  */
143
  public static function get_notifications() {
144
 
145
- $defaults = array(
146
- 'read' => false,
147
  'checksum' => '',
148
- 'data' => '{}',
149
  );
150
  $notifications = get_option( self::$option, $defaults );
151
 
@@ -161,12 +175,12 @@ final class FLBuilderNotifications {
161
  * @since 2.1
162
  */
163
  public static function update_state( $state ) {
164
- $defaults = array(
165
- 'read' => false,
166
  'checksum' => '',
167
- 'data' => '{}',
168
  );
169
- $notifications = get_option( self::$option, $defaults );
170
  $notifications['read'] = $state;
171
  update_option( self::$option, $notifications );
172
  }
5
  */
6
  final class FLBuilderNotifications {
7
 
8
+ protected static $url = 'https://www.wpbeaverbuilder.com/wp-json/wp/v2/fl_notification';
9
 
10
+ protected static $option = 'fl_notifications';
11
+
12
+ protected static $seconds = 172800; // 48 hours
13
 
14
  public static function init() {
15
 
16
  if ( FLBuilderModel::is_white_labeled() || true == apply_filters( 'fl_disable_notifications', false ) ) {
17
  return false;
18
  }
19
+ add_action( 'init', array( 'FLBuilderNotifications', 'set_schedule' ) );
20
+ add_action( 'fl_builder_notifications_event', array( 'FLBuilderNotifications', 'fetch_notifications' ) );
21
  FLBuilderAJAX::add_action( 'fl_builder_notifications', array( 'FLBuilderNotifications', 'notications_ajax' ), array( 'read' ) );
22
  }
23
 
24
+ /**
25
+ * Add scheduled event
26
+ * @since 2.2.1
27
+ */
28
+ public static function set_schedule() {
29
+
30
+ if ( ! wp_next_scheduled( 'fl_builder_notifications_event' ) ) {
31
+ wp_schedule_single_event( time() + self::$seconds, 'fl_builder_notifications_event' );
32
+ }
33
+ }
34
+
35
  /**
36
  * Transient is passed by reference here, lets not mess with it and just trigger our fetch.
37
+ * @deprecated 2.2.1
38
  */
39
  public static function fetch_notifications_trigger( $transient ) {
40
  if ( ! did_action( 'fl_fetch_notifications' ) ) {
66
  public static function fetch_notifications() {
67
 
68
  $defaults = array(
69
+ 'read' => false,
70
  'checksum' => '',
71
+ 'data' => '{}',
72
  );
73
 
74
+ $url = self::$url;
75
+ $stored_data = get_option( self::$option, $defaults );
76
+ $response = wp_remote_get( $url );
77
 
78
  $response_code = wp_remote_retrieve_response_code( $response );
79
  $body = wp_remote_retrieve_body( $response );
95
  $unread = self::compare_checksums( $stored_checksum, $latest_checksum );
96
 
97
  $stored_data = array(
98
+ 'read' => true,
99
  'checksum' => $latest_checksum,
100
+ 'data' => wp_json_encode( $body ),
101
  );
102
 
103
  if ( $unread ) {
156
  */
157
  public static function get_notifications() {
158
 
159
+ $defaults = array(
160
+ 'read' => false,
161
  'checksum' => '',
162
+ 'data' => '{}',
163
  );
164
  $notifications = get_option( self::$option, $defaults );
165
 
175
  * @since 2.1
176
  */
177
  public static function update_state( $state ) {
178
+ $defaults = array(
179
+ 'read' => false,
180
  'checksum' => '',
181
+ 'data' => '{}',
182
  );
183
+ $notifications = get_option( self::$option, $defaults );
184
  $notifications['read'] = $state;
185
  update_option( self::$option, $notifications );
186
  }
classes/class-fl-builder-privacy.php CHANGED
@@ -28,7 +28,7 @@ final class FLBuilderPrivacy {
28
  static public function exporter( $email, $page = 1 ) {
29
 
30
  $export_items = array();
31
- $data = array();
32
 
33
  $user = get_user_by( 'email', $email );
34
  $meta = (array) get_user_meta( $user->ID, 'fl_builder_user_settings', true );
@@ -47,8 +47,8 @@ final class FLBuilderPrivacy {
47
  $setting = 'false';
48
  }
49
  $data[] = array(
50
- 'name' => $key,
51
- 'value' => $setting,
52
  );
53
  }
54
  }
@@ -61,15 +61,15 @@ final class FLBuilderPrivacy {
61
  }
62
 
63
  $export_items[] = array(
64
- 'group_id' => 'bb-settings',
65
- 'group_label' => 'Beaver Builder Settings',
66
- 'item_id' => 'bb-settings',
67
- 'data' => $data,
68
  );
69
 
70
  return array(
71
- 'data' => $export_items,
72
- 'done' => true,
73
  );
74
  }
75
 
28
  static public function exporter( $email, $page = 1 ) {
29
 
30
  $export_items = array();
31
+ $data = array();
32
 
33
  $user = get_user_by( 'email', $email );
34
  $meta = (array) get_user_meta( $user->ID, 'fl_builder_user_settings', true );
47
  $setting = 'false';
48
  }
49
  $data[] = array(
50
+ 'name' => $key,
51
+ 'value' => $setting,
52
  );
53
  }
54
  }
61
  }
62
 
63
  $export_items[] = array(
64
+ 'group_id' => 'bb-settings',
65
+ 'group_label' => 'Beaver Builder Settings',
66
+ 'item_id' => 'bb-settings',
67
+ 'data' => $data,
68
  );
69
 
70
  return array(
71
+ 'data' => $export_items,
72
+ 'done' => true,
73
  );
74
  }
75
 
classes/class-fl-builder-revisions.php CHANGED
@@ -14,8 +14,8 @@ final class FLBuilderRevisions {
14
  * @return void
15
  */
16
  static public function init() {
17
- add_filter( 'fl_builder_ui_js_config', __CLASS__ . '::ui_js_config' );
18
- add_filter( 'fl_builder_main_menu', __CLASS__ . '::main_menu_config' );
19
  }
20
 
21
  /**
@@ -44,8 +44,8 @@ final class FLBuilderRevisions {
44
  ) );
45
  $current_time = current_time( 'timestamp' );
46
  $config = array(
47
- 'posts' => array(),
48
- 'authors' => array(),
49
  );
50
 
51
  $current_data = serialize( get_post_meta( $post_id, '_fl_builder_data', true ) );
@@ -70,11 +70,11 @@ final class FLBuilderRevisions {
70
  $timestamp = strtotime( $revision->post_date );
71
 
72
  $config['posts'][] = array(
73
- 'id' => $revision->ID,
74
  'author' => $revision->post_author,
75
  'date' => array(
76
- 'published' => date( 'F j', $timestamp ),
77
- 'diff' => human_time_diff( $timestamp, $current_time ),
78
  ),
79
  );
80
 
@@ -100,15 +100,15 @@ final class FLBuilderRevisions {
100
  static public function main_menu_config( $config ) {
101
  $config['main']['items'][35] = array(
102
  'label' => __( 'Revisions', 'fl-builder' ),
103
- 'type' => 'view',
104
- 'view' => 'revisions',
105
  );
106
 
107
  $config['revisions'] = array(
108
- 'name' => __( 'Revisions', 'fl-builder' ),
109
  'isShowing' => false,
110
  'isRootView' => false,
111
- 'items' => array(),
112
  );
113
 
114
  return $config;
14
  * @return void
15
  */
16
  static public function init() {
17
+ add_filter( 'fl_builder_ui_js_config', __CLASS__ . '::ui_js_config' );
18
+ add_filter( 'fl_builder_main_menu', __CLASS__ . '::main_menu_config' );
19
  }
20
 
21
  /**
44
  ) );
45
  $current_time = current_time( 'timestamp' );
46
  $config = array(
47
+ 'posts' => array(),
48
+ 'authors' => array(),
49
  );
50
 
51
  $current_data = serialize( get_post_meta( $post_id, '_fl_builder_data', true ) );
70
  $timestamp = strtotime( $revision->post_date );
71
 
72
  $config['posts'][] = array(
73
+ 'id' => $revision->ID,
74
  'author' => $revision->post_author,
75
  'date' => array(
76
+ 'published' => date( 'F j', $timestamp ),
77
+ 'diff' => human_time_diff( $timestamp, $current_time ),
78
  ),
79
  );
80
 
100
  static public function main_menu_config( $config ) {
101
  $config['main']['items'][35] = array(
102
  'label' => __( 'Revisions', 'fl-builder' ),
103
+ 'type' => 'view',
104
+ 'view' => 'revisions',
105
  );
106
 
107
  $config['revisions'] = array(
108
+ 'name' => __( 'Revisions', 'fl-builder' ),
109
  'isShowing' => false,
110
  'isRootView' => false,
111
+ 'items' => array(),
112
  );
113
 
114
  return $config;
classes/class-fl-builder-service-activecampaign.php CHANGED
@@ -58,8 +58,8 @@ final class FLBuilderServiceActiveCampaign extends FLBuilderService {
58
  */
59
  public function connect( $fields = array() ) {
60
  $response = array(
61
- 'error' => false,
62
- 'data' => array(),
63
  );
64
 
65
  // Make sure we have an API url.
@@ -67,8 +67,7 @@ final class FLBuilderServiceActiveCampaign extends FLBuilderService {
67
  $response['error'] = __( 'Error: You must provide an API URL.', 'fl-builder' );
68
  } elseif ( ! isset( $fields['api_key'] ) || empty( $fields['api_key'] ) ) {
69
  $response['error'] = __( 'Error: You must provide an API key.', 'fl-builder' );
70
- } // Try to connect and store the connection data.
71
- else {
72
 
73
  $api = $this->get_api( $fields['api_url'], $fields['api_key'] );
74
 
@@ -95,24 +94,24 @@ final class FLBuilderServiceActiveCampaign extends FLBuilderService {
95
  ob_start();
96
 
97
  FLBuilder::render_settings_field( 'api_url', array(
98
- 'row_class' => 'fl-builder-service-connect-row',
99
- 'class' => 'fl-builder-service-connect-input',
100
- 'type' => 'text',
101
- 'label' => __( 'API URL', 'fl-builder' ),
102
- 'help' => __( 'Your API url can be found in your ActiveCampaign account under My Settings > Developer > API.', 'fl-builder' ),
103
- 'preview' => array(
104
- 'type' => 'none',
105
  ),
106
  ));
107
 
108
  FLBuilder::render_settings_field( 'api_key', array(
109
- 'row_class' => 'fl-builder-service-connect-row',
110
- 'class' => 'fl-builder-service-connect-input',
111
- 'type' => 'text',
112
- 'label' => __( 'API Key', 'fl-builder' ),
113
- 'help' => __( 'Your API key can be found in your ActiveCampaign account under My Settings > Developer > API.', 'fl-builder' ),
114
- 'preview' => array(
115
- 'type' => 'none',
116
  ),
117
  ));
118
 
@@ -131,26 +130,26 @@ final class FLBuilderServiceActiveCampaign extends FLBuilderService {
131
  * }
132
  */
133
  public function render_fields( $account, $settings ) {
134
- $post_data = FLBuilderModel::get_post_data();
135
- $account_data = $this->get_account_data( $account );
136
- $api = $this->get_api( $account_data['api_url'], $account_data['api_key'] );
137
- $response = array(
138
- 'error' => false,
139
- 'html' => '',
140
  );
141
 
142
  if ( ! isset( $post_data['list_type'] ) ) {
143
  $response['html'] = $this->render_list_type_field( $settings );
144
  }
145
 
146
- $lists = $api->api( 'list/list?ids=all' );
147
- $render_type_html = $this->render_list_field( $lists, $settings );
148
 
149
  if ( isset( $post_data['list_type'] ) || isset( $settings->list_type ) ) {
150
  $list_type = isset( $post_data['list_type'] ) ? $post_data['list_type'] : $settings->list_type;
151
 
152
  if ( ! empty( $list_type ) && 'form' == $list_type ) {
153
- $forms = $api->api( 'form/getforms' );
154
  $render_type_html = $this->render_form_field( $forms, $settings );
155
  }
156
  }
@@ -175,17 +174,17 @@ final class FLBuilderServiceActiveCampaign extends FLBuilderService {
175
  private function render_list_type_field( $settings ) {
176
  ob_start();
177
  FLBuilder::render_settings_field( 'list_type', array(
178
- 'row_class' => 'fl-builder-service-field-row',
179
- 'class' => 'fl-builder-activecampaign-list_type-select',
180
- 'type' => 'select',
181
- 'label' => _x( 'Type', 'Select the list type.', 'fl-builder' ),
182
- 'default' => 'list',
183
- 'options' => array(
184
- 'list' => __( 'List', 'fl-builder' ),
185
- 'form' => __( 'Form', 'fl-builder' ),
186
  ),
187
- 'preview' => array(
188
- 'type' => 'none',
189
  ),
190
  ), $settings);
191
  return ob_get_clean();
@@ -212,13 +211,13 @@ final class FLBuilderServiceActiveCampaign extends FLBuilderService {
212
  }
213
  }
214
  FLBuilder::render_settings_field( 'form_id', array(
215
- 'row_class' => 'fl-builder-service-field-row',
216
- 'class' => 'fl-builder-service-list-select',
217
- 'type' => 'select',
218
- 'label' => _x( 'Form', 'Select a form a ActiveCampaign.', 'fl-builder' ),
219
- 'options' => $options,
220
- 'preview' => array(
221
- 'type' => 'none',
222
  ),
223
  ), $settings);
224
  return ob_get_clean();
@@ -247,13 +246,13 @@ final class FLBuilderServiceActiveCampaign extends FLBuilderService {
247
  }
248
 
249
  FLBuilder::render_settings_field( 'list_id', array(
250
- 'row_class' => 'fl-builder-service-field-row',
251
- 'class' => 'fl-builder-service-list-select',
252
- 'type' => 'select',
253
- 'label' => _x( 'List', 'An email list from ActiveCampaign.', 'fl-builder' ),
254
- 'options' => $options,
255
- 'preview' => array(
256
- 'type' => 'none',
257
  ),
258
  ), $settings);
259
 
@@ -272,16 +271,16 @@ final class FLBuilderServiceActiveCampaign extends FLBuilderService {
272
  ob_start();
273
 
274
  FLBuilder::render_settings_field( 'tags', array(
275
- 'row_class' => 'fl-builder-service-connect-row',
276
- 'class' => 'fl-builder-service-connect-input',
277
- 'type' => 'text',
278
- 'default' => '',
279
- 'label' => _x( 'Tags', 'A comma separated list of tags.', 'fl-builder' ),
280
- 'help' => __( 'A comma separated list of tags.', 'fl-builder' ),
281
- 'preview' => array(
282
- 'type' => 'none',
283
  ),
284
- ),$settings);
285
 
286
  return ob_get_clean();
287
  }
@@ -308,7 +307,7 @@ final class FLBuilderServiceActiveCampaign extends FLBuilderService {
308
  $response['error'] = __( 'There was an error subscribing to ActiveCampaign. The account is no longer connected.', 'fl-builder' );
309
  } else {
310
 
311
- $api = $this->get_api( $account_data['api_url'], $account_data['api_key'] );
312
 
313
  $data['email'] = $email;
314
  if ( isset( $settings->list_type ) && 'form' == $settings->list_type ) {
@@ -334,11 +333,11 @@ final class FLBuilderServiceActiveCampaign extends FLBuilderService {
334
  }
335
  } else {
336
  $data['p'] = array( $settings->list_id );
337
- $list_id = $settings->list_id;
338
  }
339
 
340
  if ( $list_id ) {
341
- $data['status'] = array(
342
  $list_id => 1,
343
  );
344
  $data['instantresponders'] = array(
58
  */
59
  public function connect( $fields = array() ) {
60
  $response = array(
61
+ 'error' => false,
62
+ 'data' => array(),
63
  );
64
 
65
  // Make sure we have an API url.
67
  $response['error'] = __( 'Error: You must provide an API URL.', 'fl-builder' );
68
  } elseif ( ! isset( $fields['api_key'] ) || empty( $fields['api_key'] ) ) {
69
  $response['error'] = __( 'Error: You must provide an API key.', 'fl-builder' );
70
+ } else { // Try to connect and store the connection data.
 
71
 
72
  $api = $this->get_api( $fields['api_url'], $fields['api_key'] );
73
 
94
  ob_start();
95
 
96
  FLBuilder::render_settings_field( 'api_url', array(
97
+ 'row_class' => 'fl-builder-service-connect-row',
98
+ 'class' => 'fl-builder-service-connect-input',
99
+ 'type' => 'text',
100
+ 'label' => __( 'API URL', 'fl-builder' ),
101
+ 'help' => __( 'Your API url can be found in your ActiveCampaign account under My Settings > Developer > API.', 'fl-builder' ),
102
+ 'preview' => array(
103
+ 'type' => 'none',
104
  ),
105
  ));
106
 
107
  FLBuilder::render_settings_field( 'api_key', array(
108
+ 'row_class' => 'fl-builder-service-connect-row',
109
+ 'class' => 'fl-builder-service-connect-input',
110
+ 'type' => 'text',
111
+ 'label' => __( 'API Key', 'fl-builder' ),
112
+ 'help' => __( 'Your API key can be found in your ActiveCampaign account under My Settings > Developer > API.', 'fl-builder' ),
113
+ 'preview' => array(
114
+ 'type' => 'none',
115
  ),
116
  ));
117
 
130
  * }
131
  */
132
  public function render_fields( $account, $settings ) {
133
+ $post_data = FLBuilderModel::get_post_data();
134
+ $account_data = $this->get_account_data( $account );
135
+ $api = $this->get_api( $account_data['api_url'], $account_data['api_key'] );
136
+ $response = array(
137
+ 'error' => false,
138
+ 'html' => '',
139
  );
140
 
141
  if ( ! isset( $post_data['list_type'] ) ) {
142
  $response['html'] = $this->render_list_type_field( $settings );
143
  }
144
 
145
+ $lists = $api->api( 'list/list?ids=all' );
146
+ $render_type_html = $this->render_list_field( $lists, $settings );
147
 
148
  if ( isset( $post_data['list_type'] ) || isset( $settings->list_type ) ) {
149
  $list_type = isset( $post_data['list_type'] ) ? $post_data['list_type'] : $settings->list_type;
150
 
151
  if ( ! empty( $list_type ) && 'form' == $list_type ) {
152
+ $forms = $api->api( 'form/getforms' );
153
  $render_type_html = $this->render_form_field( $forms, $settings );
154
  }
155
  }
174
  private function render_list_type_field( $settings ) {
175
  ob_start();
176
  FLBuilder::render_settings_field( 'list_type', array(
177
+ 'row_class' => 'fl-builder-service-field-row',
178
+ 'class' => 'fl-builder-activecampaign-list_type-select',
179
+ 'type' => 'select',
180
+ 'label' => _x( 'Type', 'Select the list type.', 'fl-builder' ),
181
+ 'default' => 'list',
182
+ 'options' => array(
183
+ 'list' => __( 'List', 'fl-builder' ),
184
+ 'form' => __( 'Form', 'fl-builder' ),
185
  ),
186
+ 'preview' => array(
187
+ 'type' => 'none',
188
  ),
189
  ), $settings);
190
  return ob_get_clean();
211
  }
212
  }
213
  FLBuilder::render_settings_field( 'form_id', array(
214
+ 'row_class' => 'fl-builder-service-field-row',
215
+ 'class' => 'fl-builder-service-list-select',
216
+ 'type' => 'select',
217
+ 'label' => _x( 'Form', 'Select a form a ActiveCampaign.', 'fl-builder' ),
218
+ 'options' => $options,
219
+ 'preview' => array(
220
+ 'type' => 'none',
221
  ),
222
  ), $settings);
223
  return ob_get_clean();
246
  }
247
 
248
  FLBuilder::render_settings_field( 'list_id', array(
249
+ 'row_class' => 'fl-builder-service-field-row',
250
+ 'class' => 'fl-builder-service-list-select',
251
+ 'type' => 'select',
252
+ 'label' => _x( 'List', 'An email list from ActiveCampaign.', 'fl-builder' ),
253
+ 'options' => $options,
254
+ 'preview' => array(
255
+ 'type' => 'none',
256
  ),
257
  ), $settings);
258
 
271
  ob_start();
272
 
273
  FLBuilder::render_settings_field( 'tags', array(
274
+ 'row_class' => 'fl-builder-service-connect-row',
275
+ 'class' => 'fl-builder-service-connect-input',
276
+ 'type' => 'text',
277
+ 'default' => '',
278
+ 'label' => _x( 'Tags', 'A comma separated list of tags.', 'fl-builder' ),
279
+ 'help' => __( 'A comma separated list of tags.', 'fl-builder' ),
280
+ 'preview' => array(
281
+ 'type' => 'none',
282
  ),
283
+ ), $settings);
284
 
285
  return ob_get_clean();
286
  }
307
  $response['error'] = __( 'There was an error subscribing to ActiveCampaign. The account is no longer connected.', 'fl-builder' );
308
  } else {
309
 
310
+ $api = $this->get_api( $account_data['api_url'], $account_data['api_key'] );
311
 
312
  $data['email'] = $email;
313
  if ( isset( $settings->list_type ) && 'form' == $settings->list_type ) {
333
  }
334
  } else {
335
  $data['p'] = array( $settings->list_id );
336
+ $list_id = $settings->list_id;
337
  }
338
 
339
  if ( $list_id ) {
340
+ $data['status'] = array(
341
  $list_id => 1,
342
  );
343
  $data['instantresponders'] = array(
classes/class-fl-builder-service-aweber.php CHANGED
@@ -61,8 +61,8 @@ final class FLBuilderServiceAWeber extends FLBuilderService {
61
  */
62
  public function connect( $fields = array() ) {
63
  $response = array(
64
- 'error' => false,
65
- 'data' => array(),
66
  );
67
 
68
  // Make sure we have an authorization code.
@@ -70,8 +70,7 @@ final class FLBuilderServiceAWeber extends FLBuilderService {
70
  $response['error'] = __( 'Error: You must provide an Authorization Code.', 'fl-builder' );
71
  } elseif ( 6 != count( explode( '|', $fields['auth_code'] ) ) ) {
72
  $response['error'] = __( 'Error: Please enter a valid Authorization Code.', 'fl-builder' );
73
- } // Try to connect and store the connection data.
74
- else {
75
 
76
  $api = $this->get_api( $fields['auth_code'] );
77
 
@@ -93,9 +92,9 @@ final class FLBuilderServiceAWeber extends FLBuilderService {
93
  if ( ! $response['error'] ) {
94
 
95
  $response['data'] = array(
96
- 'auth_code' => $fields['auth_code'],
97
- 'access_token' => $access_token,
98
- 'access_secret' => $access_token_secret,
99
  );
100
  }
101
  }
@@ -113,13 +112,13 @@ final class FLBuilderServiceAWeber extends FLBuilderService {
113
  ob_start();
114
 
115
  FLBuilder::render_settings_field( 'auth_code', array(
116
- 'row_class' => 'fl-builder-service-connect-row',
117
- 'class' => 'fl-builder-service-connect-input',
118
- 'type' => 'text',
119
- 'label' => __( 'Authorization Code', 'fl-builder' ),
120
- 'description' => sprintf( __( 'Please register this website with AWeber to get your Authorization Code. <a%s>Register Now</a>', 'fl-builder' ), ' href="https://auth.aweber.com/1.0/oauth/authorize_app/baa1f131" target="_blank"' ),
121
- 'preview' => array(
122
- 'type' => 'none',
123
  ),
124
  ));
125
 
@@ -138,17 +137,17 @@ final class FLBuilderServiceAWeber extends FLBuilderService {
138
  * }
139
  */
140
  public function render_fields( $account, $settings ) {
141
- $account_data = $this->get_account_data( $account );
142
- $api = $this->get_api( $account_data['auth_code'] );
143
- $response = array(
144
- 'error' => false,
145
- 'html' => '',
146
  );
147
 
148
  try {
149
- $account = $api->getAccount( $account_data['access_token'], $account_data['access_secret'] );
150
- $lists = $account->loadFromUrl( '/accounts/' . $account->id . '/lists' );
151
- $response['html'] = $this->render_list_field( $lists, $settings );
152
  $response['html'] .= $this->render_tags_field( $settings );
153
  } catch ( AWeberException $e ) {
154
  $response['error'] = $e->getMessage();
@@ -178,13 +177,13 @@ final class FLBuilderServiceAWeber extends FLBuilderService {
178
  }
179
 
180
  FLBuilder::render_settings_field( 'list_id', array(
181
- 'row_class' => 'fl-builder-service-field-row',
182
- 'class' => 'fl-builder-service-list-select',
183
- 'type' => 'select',
184
- 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
185
- 'options' => $options,
186
- 'preview' => array(
187
- 'type' => 'none',
188
  ),
189
  ), $settings);
190
 
@@ -203,15 +202,15 @@ final class FLBuilderServiceAWeber extends FLBuilderService {
203
  ob_start();
204
 
205
  FLBuilder::render_settings_field( 'tags', array(
206
- 'row_class' => 'fl-builder-service-connect-row',
207
- 'class' => 'fl-builder-service-connect-input',
208
- 'type' => 'text',
209
- 'label' => _x( 'Tags', 'A comma separated list of tags.', 'fl-builder' ),
210
- 'help' => __( 'A comma separated list of tags.', 'fl-builder' ),
211
- 'preview' => array(
212
- 'type' => 'none',
213
  ),
214
- ),$settings);
215
 
216
  return ob_get_clean();
217
  }
@@ -237,8 +236,8 @@ final class FLBuilderServiceAWeber extends FLBuilderService {
237
  $response['error'] = __( 'There was an error subscribing to AWeber. The account is no longer connected.', 'fl-builder' );
238
  } else {
239
 
240
- $api = $this->get_api( $account_data['auth_code'] );
241
- $data = array(
242
  'email' => $email,
243
  );
244
 
@@ -273,7 +272,7 @@ final class FLBuilderServiceAWeber extends FLBuilderService {
273
  }
274
 
275
  try {
276
- $result = $api->adapter->request( 'PATCH', $url . '/' . $subscriber_id, $data, array(
277
  'return' => 'headers',
278
  ) );
279
 
@@ -290,7 +289,7 @@ final class FLBuilderServiceAWeber extends FLBuilderService {
290
  }
291
  } else {
292
  $data['ws.op'] = 'create';
293
- $result = $api->adapter->request( 'POST', $url, $data, array(
294
  'return' => 'headers',
295
  ) );
296
 
61
  */
62
  public function connect( $fields = array() ) {
63
  $response = array(
64
+ 'error' => false,
65
+ 'data' => array(),
66
  );
67
 
68
  // Make sure we have an authorization code.
70
  $response['error'] = __( 'Error: You must provide an Authorization Code.', 'fl-builder' );
71
  } elseif ( 6 != count( explode( '|', $fields['auth_code'] ) ) ) {
72
  $response['error'] = __( 'Error: Please enter a valid Authorization Code.', 'fl-builder' );
73
+ } else { // Try to connect and store the connection data.
 
74
 
75
  $api = $this->get_api( $fields['auth_code'] );
76
 
92
  if ( ! $response['error'] ) {
93
 
94
  $response['data'] = array(
95
+ 'auth_code' => $fields['auth_code'],
96
+ 'access_token' => $access_token,
97
+ 'access_secret' => $access_token_secret,
98
  );
99
  }
100
  }
112
  ob_start();
113
 
114
  FLBuilder::render_settings_field( 'auth_code', array(
115
+ 'row_class' => 'fl-builder-service-connect-row',
116
+ 'class' => 'fl-builder-service-connect-input',
117
+ 'type' => 'text',
118
+ 'label' => __( 'Authorization Code', 'fl-builder' ),
119
+ 'description' => sprintf( __( 'Please register this website with AWeber to get your Authorization Code. <a%s>Register Now</a>', 'fl-builder' ), ' href="https://auth.aweber.com/1.0/oauth/authorize_app/baa1f131" target="_blank"' ),
120
+ 'preview' => array(
121
+ 'type' => 'none',
122
  ),
123
  ));
124
 
137
  * }
138
  */
139
  public function render_fields( $account, $settings ) {
140
+ $account_data = $this->get_account_data( $account );
141
+ $api = $this->get_api( $account_data['auth_code'] );
142
+ $response = array(
143
+ 'error' => false,
144
+ 'html' => '',
145
  );
146
 
147
  try {
148
+ $account = $api->getAccount( $account_data['access_token'], $account_data['access_secret'] );
149
+ $lists = $account->loadFromUrl( '/accounts/' . $account->id . '/lists' );
150
+ $response['html'] = $this->render_list_field( $lists, $settings );
151
  $response['html'] .= $this->render_tags_field( $settings );
152
  } catch ( AWeberException $e ) {
153
  $response['error'] = $e->getMessage();
177
  }
178
 
179
  FLBuilder::render_settings_field( 'list_id', array(
180
+ 'row_class' => 'fl-builder-service-field-row',
181
+ 'class' => 'fl-builder-service-list-select',
182
+ 'type' => 'select',
183
+ 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
184
+ 'options' => $options,
185
+ 'preview' => array(
186
+ 'type' => 'none',
187
  ),
188
  ), $settings);
189
 
202
  ob_start();
203
 
204
  FLBuilder::render_settings_field( 'tags', array(
205
+ 'row_class' => 'fl-builder-service-connect-row',
206
+ 'class' => 'fl-builder-service-connect-input',
207
+ 'type' => 'text',
208
+ 'label' => _x( 'Tags', 'A comma separated list of tags.', 'fl-builder' ),
209
+ 'help' => __( 'A comma separated list of tags.', 'fl-builder' ),
210
+ 'preview' => array(
211
+ 'type' => 'none',
212
  ),
213
+ ), $settings);
214
 
215
  return ob_get_clean();
216
  }
236
  $response['error'] = __( 'There was an error subscribing to AWeber. The account is no longer connected.', 'fl-builder' );
237
  } else {
238
 
239
+ $api = $this->get_api( $account_data['auth_code'] );
240
+ $data = array(
241
  'email' => $email,
242
  );
243
 
272
  }
273
 
274
  try {
275
+ $result = $api->adapter->request( 'PATCH', $url . '/' . $subscriber_id, $data, array(
276
  'return' => 'headers',
277
  ) );
278
 
289
  }
290
  } else {
291
  $data['ws.op'] = 'create';
292
+ $result = $api->adapter->request( 'POST', $url, $data, array(
293
  'return' => 'headers',
294
  ) );
295
 
classes/class-fl-builder-service-campaign-monitor.php CHANGED
@@ -44,8 +44,8 @@ final class FLBuilderServiceCampaignMonitor extends FLBuilderService {
44
  */
45
  public function connect( $fields = array() ) {
46
  $response = array(
47
- 'error' => false,
48
- 'data' => array(),
49
  );
50
 
51
  // Make sure we have an API key.
@@ -80,13 +80,13 @@ final class FLBuilderServiceCampaignMonitor extends FLBuilderService {
80
  ob_start();
81
 
82
  FLBuilder::render_settings_field( 'api_key', array(
83
- 'row_class' => 'fl-builder-service-connect-row',
84
- 'class' => 'fl-builder-service-connect-input',
85
- 'type' => 'text',
86
- 'label' => __( 'API Key', 'fl-builder' ),
87
- 'help' => __( 'Your API key can be found in your Campaign Monitor account under Account Settings > API Key.', 'fl-builder' ),
88
- 'preview' => array(
89
- 'type' => 'none',
90
  ),
91
  ));
92
 
@@ -105,13 +105,13 @@ final class FLBuilderServiceCampaignMonitor extends FLBuilderService {
105
  * }
106
  */
107
  public function render_fields( $account, $settings ) {
108
- $post_data = FLBuilderModel::get_post_data();
109
- $account_data = $this->get_account_data( $account );
110
- $api = new CS_REST_General( $account_data );
111
- $result = $api->get_clients();
112
- $response = array(
113
- 'error' => false,
114
- 'html' => '',
115
  );
116
 
117
  if ( $result->was_successful() ) {
@@ -150,13 +150,13 @@ final class FLBuilderServiceCampaignMonitor extends FLBuilderService {
150
  }
151
 
152
  FLBuilder::render_settings_field( 'client_id', array(
153
- 'row_class' => 'fl-builder-service-field-row',
154
- 'class' => 'fl-builder-campaign-monitor-client-select',
155
- 'type' => 'select',
156
- 'label' => _x( 'Client', 'A client account in Campaign Monitor.', 'fl-builder' ),
157
- 'options' => $options,
158
- 'preview' => array(
159
- 'type' => 'none',
160
  ),
161
  ), $settings);
162
 
@@ -201,13 +201,13 @@ final class FLBuilderServiceCampaignMonitor extends FLBuilderService {
201
  }
202
 
203
  FLBuilder::render_settings_field( 'list_id', array(
204
- 'row_class' => 'fl-builder-service-field-row',
205
- 'class' => 'fl-builder-service-list-select',
206
- 'type' => 'select',
207
- 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
208
- 'options' => $options,
209
- 'preview' => array(
210
- 'type' => 'none',
211
  ),
212
  ), $settings);
213
 
@@ -235,8 +235,8 @@ final class FLBuilderServiceCampaignMonitor extends FLBuilderService {
235
  $response['error'] = __( 'There was an error subscribing to Campaign Monitor. The account is no longer connected.', 'fl-builder' );
236
  } else {
237
 
238
- $api = new CS_Rest_Subscribers( $settings->list_id, $account_data );
239
- $data = array(
240
  'EmailAddress' => $email,
241
  'Resubscribe' => true,
242
  );
44
  */
45
  public function connect( $fields = array() ) {
46
  $response = array(
47
+ 'error' => false,
48
+ 'data' => array(),
49
  );
50
 
51
  // Make sure we have an API key.
80
  ob_start();
81
 
82
  FLBuilder::render_settings_field( 'api_key', array(
83
+ 'row_class' => 'fl-builder-service-connect-row',
84
+ 'class' => 'fl-builder-service-connect-input',
85
+ 'type' => 'text',
86
+ 'label' => __( 'API Key', 'fl-builder' ),
87
+ 'help' => __( 'Your API key can be found in your Campaign Monitor account under Account Settings > API Key.', 'fl-builder' ),
88
+ 'preview' => array(
89
+ 'type' => 'none',
90
  ),
91
  ));
92
 
105
  * }
106
  */
107
  public function render_fields( $account, $settings ) {
108
+ $post_data = FLBuilderModel::get_post_data();
109
+ $account_data = $this->get_account_data( $account );
110
+ $api = new CS_REST_General( $account_data );
111
+ $result = $api->get_clients();
112
+ $response = array(
113
+ 'error' => false,
114
+ 'html' => '',
115
  );
116
 
117
  if ( $result->was_successful() ) {
150
  }
151
 
152
  FLBuilder::render_settings_field( 'client_id', array(
153
+ 'row_class' => 'fl-builder-service-field-row',
154
+ 'class' => 'fl-builder-campaign-monitor-client-select',
155
+ 'type' => 'select',
156
+ 'label' => _x( 'Client', 'A client account in Campaign Monitor.', 'fl-builder' ),
157
+ 'options' => $options,
158
+ 'preview' => array(
159
+ 'type' => 'none',
160
  ),
161
  ), $settings);
162
 
201
  }
202
 
203
  FLBuilder::render_settings_field( 'list_id', array(
204
+ 'row_class' => 'fl-builder-service-field-row',
205
+ 'class' => 'fl-builder-service-list-select',
206
+ 'type' => 'select',
207
+ 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
208
+ 'options' => $options,
209
+ 'preview' => array(
210
+ 'type' => 'none',
211
  ),
212
  ), $settings);
213
 
235
  $response['error'] = __( 'There was an error subscribing to Campaign Monitor. The account is no longer connected.', 'fl-builder' );
236
  } else {
237
 
238
+ $api = new CS_Rest_Subscribers( $settings->list_id, $account_data );
239
+ $data = array(
240
  'EmailAddress' => $email,
241
  'Resubscribe' => true,
242
  );
classes/class-fl-builder-service-campayn.php CHANGED
@@ -37,27 +37,27 @@ final class FLBuilderServiceCampayn extends FLBuilderService {
37
  * Request data from the thir party API.
38
  *
39
  * @since 1.5.4
40
- * @param string $base_url Base URL where API is available
41
- * @param string $api_key API Key provided by this service
42
- * @param string $endpoint Method to request available from this service.
43
- * @param array $params Data to be passed to API
44
- * @return array|object The API response.
45
  */
46
  private function get_api_response( $base_url, $api_key, $endpoint, $params = array() ) {
47
  // Exclude http:// from the user's input
48
- $request_uri = $this->api_protocol . '://' . preg_replace( '#^https?://#', '', $base_url ) . '/api/v' . $this->api_version . $endpoint;
49
 
50
- $params['timeout'] = 60;
51
- $params['body'] = isset( $params['data'] ) && $params['data'] ? json_encode( $params['data'] ) : '';
52
- $params['headers'] = array(
53
  'Authorization' => 'TRUEREST apikey=' . $api_key,
54
  );
55
- $response = wp_remote_get( $request_uri, $params );
56
- $response_code = wp_remote_retrieve_response_code( $response );
57
- $response_message = wp_remote_retrieve_response_message( $response );
58
- $get_response = json_decode( wp_remote_retrieve_body( $response ), true );
59
 
60
- if ( is_wp_error( $response ) || (200 != $response_code) ) {
61
 
62
  if ( is_wp_error( $response ) ) {
63
  $data['error'] = $response->get_error_message();
@@ -89,8 +89,8 @@ final class FLBuilderServiceCampayn extends FLBuilderService {
89
  */
90
  public function connect( $fields = array() ) {
91
  $response = array(
92
- 'error' => false,
93
- 'data' => array(),
94
  );
95
 
96
  // Make sure we have the Host.
@@ -98,15 +98,14 @@ final class FLBuilderServiceCampayn extends FLBuilderService {
98
  $response['error'] = __( 'Error: You must provide a Host.', 'fl-builder' );
99
  } elseif ( ! isset( $fields['api_key'] ) || empty( $fields['api_key'] ) ) {
100
  $response['error'] = __( 'Error: You must provide an API key.', 'fl-builder' );
101
- } // Try to connect and store the connection data.
102
- else {
103
 
104
  $result = $this->get_api_response( $fields['api_host'], $fields['api_key'], '/lists.json' );
105
 
106
  if ( ! isset( $result['error'] ) ) {
107
  $response['data'] = array(
108
  'api_host' => $fields['api_host'],
109
- 'api_key' => $fields['api_key'],
110
  );
111
  } else {
112
  $response['error'] = sprintf( __( 'Error: Could not connect to Campayn. %s', 'fl-builder' ), $result['error'] );
@@ -126,24 +125,24 @@ final class FLBuilderServiceCampayn extends FLBuilderService {
126
  ob_start();
127
 
128
  FLBuilder::render_settings_field( 'api_host', array(
129
- 'row_class' => 'fl-builder-service-connect-row',
130
- 'class' => 'fl-builder-service-connect-input',
131
- 'type' => 'text',
132
- 'label' => __( 'Host', 'fl-builder' ),
133
- 'help' => __( 'The host you chose when you signed up for your account. Check your welcome email if you forgot it. Please enter it without the initial http:// (for example: demo.campayn.com).', 'fl-builder' ),
134
- 'preview' => array(
135
- 'type' => 'none',
136
  ),
137
  ));
138
 
139
  FLBuilder::render_settings_field( 'api_key', array(
140
- 'row_class' => 'fl-builder-service-connect-row',
141
- 'class' => 'fl-builder-service-connect-input',
142
- 'type' => 'text',
143
- 'label' => __( 'API Key', 'fl-builder' ),
144
- 'help' => __( 'Your API key can be found in your Campayn account under Settings > API Key.', 'fl-builder' ),
145
- 'preview' => array(
146
- 'type' => 'none',
147
  ),
148
  ));
149
 
@@ -162,12 +161,12 @@ final class FLBuilderServiceCampayn extends FLBuilderService {
162
  * }
163
  */
164
  public function render_fields( $account, $settings ) {
165
- $account_data = $this->get_account_data( $account );
166
- $results = $this->get_api_response( $account_data['api_host'], $account_data['api_key'], '/lists.json' );
167
 
168
- $response = array(
169
- 'error' => false,
170
- 'html' => '',
171
  );
172
 
173
  if ( isset( $results['error'] ) ) {
@@ -200,13 +199,13 @@ final class FLBuilderServiceCampayn extends FLBuilderService {
200
  }
201
 
202
  FLBuilder::render_settings_field( 'list_id', array(
203
- 'row_class' => 'fl-builder-service-field-row',
204
- 'class' => 'fl-builder-service-list-select',
205
- 'type' => 'select',
206
- 'label' => _x( 'List', 'An email list from third party provider.', 'fl-builder' ),
207
- 'options' => $options,
208
- 'preview' => array(
209
- 'type' => 'none',
210
  ),
211
  ), $settings);
212
 
@@ -229,7 +228,7 @@ final class FLBuilderServiceCampayn extends FLBuilderService {
229
  $response = array(
230
  'error' => false,
231
  );
232
- $contact_id = null;
233
 
234
  if ( ! $account_data ) {
235
  $response['error'] = __( 'There was an error subscribing to Campayn. The account is no longer connected.', 'fl-builder' );
@@ -259,23 +258,23 @@ final class FLBuilderServiceCampayn extends FLBuilderService {
259
  );
260
 
261
  // Already exists
262
- if ( ! isset( $result['error'] ) && (is_array( $result ) && isset( $result[0]['id'] )) ) {
263
  $contact_id = $result[0]['id'];
264
  }
265
 
266
  // Add the contact if it doesn't exist.
267
  if ( ! $contact_id ) {
268
  $endpoint = "/lists/{$settings->list_id}/contacts.json";
269
- $method = 'POST';
270
  } else {
271
- $endpoint = "/contacts/{$contact_id}.json";
272
- $method = 'PUT';
273
  $data['id'] = $contact_id;
274
  }
275
 
276
  $result = $this->get_api_response( $account_data['api_host'], $account_data['api_key'], $endpoint, array(
277
- 'data' => $data,
278
- 'method' => $method,
279
  ) );
280
 
281
  if ( isset( $result['error'] ) ) {
37
  * Request data from the thir party API.
38
  *
39
  * @since 1.5.4
40
+ * @param string $base_url Base URL where API is available
41
+ * @param string $api_key API Key provided by this service
42
+ * @param string $endpoint Method to request available from this service.
43
+ * @param array $params Data to be passed to API
44
+ * @return array|object The API response.
45
  */
46
  private function get_api_response( $base_url, $api_key, $endpoint, $params = array() ) {
47
  // Exclude http:// from the user's input
48
+ $request_uri = $this->api_protocol . '://' . preg_replace( '#^https?://#', '', $base_url ) . '/api/v' . $this->api_version . $endpoint;
49
 
50
+ $params['timeout'] = 60;
51
+ $params['body'] = isset( $params['data'] ) && $params['data'] ? json_encode( $params['data'] ) : '';
52
+ $params['headers'] = array(
53
  'Authorization' => 'TRUEREST apikey=' . $api_key,
54
  );
55
+ $response = wp_remote_get( $request_uri, $params );
56
+ $response_code = wp_remote_retrieve_response_code( $response );
57
+ $response_message = wp_remote_retrieve_response_message( $response );
58
+ $get_response = json_decode( wp_remote_retrieve_body( $response ), true );
59
 
60
+ if ( is_wp_error( $response ) || ( 200 != $response_code ) ) {
61
 
62
  if ( is_wp_error( $response ) ) {
63
  $data['error'] = $response->get_error_message();
89
  */
90
  public function connect( $fields = array() ) {
91
  $response = array(
92
+ 'error' => false,
93
+ 'data' => array(),
94
  );
95
 
96
  // Make sure we have the Host.
98
  $response['error'] = __( 'Error: You must provide a Host.', 'fl-builder' );
99
  } elseif ( ! isset( $fields['api_key'] ) || empty( $fields['api_key'] ) ) {
100
  $response['error'] = __( 'Error: You must provide an API key.', 'fl-builder' );
101
+ } else { // Try to connect and store the connection data.
 
102
 
103
  $result = $this->get_api_response( $fields['api_host'], $fields['api_key'], '/lists.json' );
104
 
105
  if ( ! isset( $result['error'] ) ) {
106
  $response['data'] = array(
107
  'api_host' => $fields['api_host'],
108
+ 'api_key' => $fields['api_key'],
109
  );
110
  } else {
111
  $response['error'] = sprintf( __( 'Error: Could not connect to Campayn. %s', 'fl-builder' ), $result['error'] );
125
  ob_start();
126
 
127
  FLBuilder::render_settings_field( 'api_host', array(
128
+ 'row_class' => 'fl-builder-service-connect-row',
129
+ 'class' => 'fl-builder-service-connect-input',
130
+ 'type' => 'text',
131
+ 'label' => __( 'Host', 'fl-builder' ),
132
+ 'help' => __( 'The host you chose when you signed up for your account. Check your welcome email if you forgot it. Please enter it without the initial http:// (for example: demo.campayn.com).', 'fl-builder' ),
133
+ 'preview' => array(
134
+ 'type' => 'none',
135
  ),
136
  ));
137
 
138
  FLBuilder::render_settings_field( 'api_key', array(
139
+ 'row_class' => 'fl-builder-service-connect-row',
140
+ 'class' => 'fl-builder-service-connect-input',
141
+ 'type' => 'text',
142
+ 'label' => __( 'API Key', 'fl-builder' ),
143
+ 'help' => __( 'Your API key can be found in your Campayn account under Settings > API Key.', 'fl-builder' ),
144
+ 'preview' => array(
145
+ 'type' => 'none',
146
  ),
147
  ));
148
 
161
  * }
162
  */
163
  public function render_fields( $account, $settings ) {
164
+ $account_data = $this->get_account_data( $account );
165
+ $results = $this->get_api_response( $account_data['api_host'], $account_data['api_key'], '/lists.json' );
166
 
167
+ $response = array(
168
+ 'error' => false,
169
+ 'html' => '',
170
  );
171
 
172
  if ( isset( $results['error'] ) ) {
199
  }
200
 
201
  FLBuilder::render_settings_field( 'list_id', array(
202
+ 'row_class' => 'fl-builder-service-field-row',
203
+ 'class' => 'fl-builder-service-list-select',
204
+ 'type' => 'select',
205
+ 'label' => _x( 'List', 'An email list from third party provider.', 'fl-builder' ),
206
+ 'options' => $options,
207
+ 'preview' => array(
208
+ 'type' => 'none',
209
  ),
210
  ), $settings);
211
 
228
  $response = array(
229
  'error' => false,
230
  );
231
+ $contact_id = null;
232
 
233
  if ( ! $account_data ) {
234
  $response['error'] = __( 'There was an error subscribing to Campayn. The account is no longer connected.', 'fl-builder' );
258
  );
259
 
260
  // Already exists
261
+ if ( ! isset( $result['error'] ) && ( is_array( $result ) && isset( $result[0]['id'] ) ) ) {
262
  $contact_id = $result[0]['id'];
263
  }
264
 
265
  // Add the contact if it doesn't exist.
266
  if ( ! $contact_id ) {
267
  $endpoint = "/lists/{$settings->list_id}/contacts.json";
268
+ $method = 'POST';
269
  } else {
270
+ $endpoint = "/contacts/{$contact_id}.json";
271
+ $method = 'PUT';
272
  $data['id'] = $contact_id;
273
  }
274
 
275
  $result = $this->get_api_response( $account_data['api_host'], $account_data['api_key'], $endpoint, array(
276
+ 'data' => $data,
277
+ 'method' => $method,
278
  ) );
279
 
280
  if ( isset( $result['error'] ) ) {
classes/class-fl-builder-service-constant-contact.php CHANGED
@@ -38,8 +38,8 @@ final class FLBuilderServiceConstantContact extends FLBuilderService {
38
  */
39
  public function connect( $fields = array() ) {
40
  $response = array(
41
- 'error' => false,
42
- 'data' => array(),
43
  );
44
 
45
  // Make sure we have an API key.
@@ -47,18 +47,17 @@ final class FLBuilderServiceConstantContact extends FLBuilderService {
47
  $response['error'] = __( 'Error: You must provide an API key.', 'fl-builder' );
48
  } elseif ( ! isset( $fields['access_token'] ) || empty( $fields['access_token'] ) ) {
49
  $response['error'] = __( 'Error: You must provide an access token.', 'fl-builder' );
50
- } // Try to connect and store the connection data.
51
- else {
52
 
53
- $url = $this->api_url . 'lists?api_key=' . $fields['api_key'] . '&access_token=' . $fields['access_token'];
54
- $request = json_decode( wp_remote_retrieve_body( wp_remote_get( $url ) ) );
55
 
56
  if ( ! is_array( $request ) || ( isset( $request[0] ) && isset( $request[0]->error_message ) ) ) {
57
  $response['error'] = sprintf( __( 'Error: Could not connect to Constant Contact. %s', 'fl-builder' ), $request[0]->error_message );
58
  } else {
59
  $response['data'] = array(
60
- 'api_key' => $fields['api_key'],
61
- 'access_token' => $fields['access_token'],
62
  );
63
  }
64
  }
@@ -76,25 +75,25 @@ final class FLBuilderServiceConstantContact extends FLBuilderService {
76
  ob_start();
77
 
78
  FLBuilder::render_settings_field( 'api_key', array(
79
- 'row_class' => 'fl-builder-service-connect-row',
80
- 'class' => 'fl-builder-service-connect-input',
81
- 'type' => 'text',
82
- 'label' => __( 'API Key', 'fl-builder' ),
83
- 'help' => __( 'Your Constant Contact API key.', 'fl-builder' ),
84
- 'preview' => array(
85
- 'type' => 'none',
86
  ),
87
  ));
88
 
89
  FLBuilder::render_settings_field( 'access_token', array(
90
- 'row_class' => 'fl-builder-service-connect-row',
91
- 'class' => 'fl-builder-service-connect-input',
92
- 'type' => 'text',
93
- 'label' => __( 'Access Token', 'fl-builder' ),
94
- 'help' => __( 'Your Constant Contact access token.', 'fl-builder' ),
95
- 'description' => sprintf( __( 'You must register a <a%1$s>Developer Account</a> with Constant Contact to obtain an API key and access token. Please see <a%2$s>Getting an API key</a> for complete instructions.', 'fl-builder' ), ' href="https://constantcontact.mashery.com/member/register" target="_blank"', ' href="https://developer.constantcontact.com/home/api-keys.html" target="_blank"' ),
96
- 'preview' => array(
97
- 'type' => 'none',
98
  ),
99
  ));
100
 
@@ -113,14 +112,14 @@ final class FLBuilderServiceConstantContact extends FLBuilderService {
113
  * }
114
  */
115
  public function render_fields( $account, $settings ) {
116
- $account_data = $this->get_account_data( $account );
117
- $api_key = $account_data['api_key'];
118
- $access_token = $account_data['access_token'];
119
- $url = $this->api_url . 'lists?api_key=' . $api_key . '&access_token=' . $access_token;
120
- $request = json_decode( wp_remote_retrieve_body( wp_remote_get( $url ) ) );
121
- $response = array(
122
- 'error' => false,
123
- 'html' => '',
124
  );
125
 
126
  if ( ! is_array( $request ) || ( isset( $request[0] ) && isset( $request[0]->error_message ) ) ) {
@@ -153,13 +152,13 @@ final class FLBuilderServiceConstantContact extends FLBuilderService {
153
  }
154
 
155
  FLBuilder::render_settings_field( 'list_id', array(
156
- 'row_class' => 'fl-builder-service-field-row',
157
- 'class' => 'fl-builder-service-list-select',
158
- 'type' => 'select',
159
- 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
160
- 'options' => $options,
161
- 'preview' => array(
162
- 'type' => 'none',
163
  ),
164
  ), $settings);
165
 
@@ -178,8 +177,8 @@ final class FLBuilderServiceConstantContact extends FLBuilderService {
178
  * }
179
  */
180
  public function subscribe( $settings, $email, $name = false ) {
181
- $account_data = $this->get_account_data( $settings->service_account );
182
- $response = array(
183
  'error' => false,
184
  );
185
 
@@ -187,12 +186,12 @@ final class FLBuilderServiceConstantContact extends FLBuilderService {
187
  $response['error'] = __( 'There was an error subscribing to Constant Contact. The account is no longer connected.', 'fl-builder' );
188
  } else {
189
 
190
- $api_key = $account_data['api_key'];
191
- $access_token = $account_data['access_token'];
192
- $url = $this->api_url . 'contacts?api_key=' . $api_key . '&access_token=' . $access_token . '&email=' . $email;
193
- $request = wp_remote_get( $url );
194
- $contact = json_decode( wp_remote_retrieve_body( $request ) );
195
- $list_id = $settings->list_id;
196
 
197
  // This contact exists.
198
  if ( ! empty( $contact->results ) ) {
@@ -239,9 +238,9 @@ final class FLBuilderServiceConstantContact extends FLBuilderService {
239
  } else {
240
  // @codingStandardsIgnoreLine
241
  $args = $data = array();
242
- $data['email_addresses'] = array();
243
- $data['email_addresses'][0]['id'] = $list_id;
244
- $data['email_addresses'][0]['status'] = 'ACTIVE';
245
  $data['email_addresses'][0]['confirm_status'] = 'CONFIRMED';
246
  $data['email_addresses'][0]['email_address'] = $email;
247
  $data['lists'] = array();
38
  */
39
  public function connect( $fields = array() ) {
40
  $response = array(
41
+ 'error' => false,
42
+ 'data' => array(),
43
  );
44
 
45
  // Make sure we have an API key.
47
  $response['error'] = __( 'Error: You must provide an API key.', 'fl-builder' );
48
  } elseif ( ! isset( $fields['access_token'] ) || empty( $fields['access_token'] ) ) {
49
  $response['error'] = __( 'Error: You must provide an access token.', 'fl-builder' );
50
+ } else { // Try to connect and store the connection data.
 
51
 
52
+ $url = $this->api_url . 'lists?api_key=' . $fields['api_key'] . '&access_token=' . $fields['access_token'];
53
+ $request = json_decode( wp_remote_retrieve_body( wp_remote_get( $url ) ) );
54
 
55
  if ( ! is_array( $request ) || ( isset( $request[0] ) && isset( $request[0]->error_message ) ) ) {
56
  $response['error'] = sprintf( __( 'Error: Could not connect to Constant Contact. %s', 'fl-builder' ), $request[0]->error_message );
57
  } else {
58
  $response['data'] = array(
59
+ 'api_key' => $fields['api_key'],
60
+ 'access_token' => $fields['access_token'],
61
  );
62
  }
63
  }
75
  ob_start();
76
 
77
  FLBuilder::render_settings_field( 'api_key', array(
78
+ 'row_class' => 'fl-builder-service-connect-row',
79
+ 'class' => 'fl-builder-service-connect-input',
80
+ 'type' => 'text',
81
+ 'label' => __( 'API Key', 'fl-builder' ),
82
+ 'help' => __( 'Your Constant Contact API key.', 'fl-builder' ),
83
+ 'preview' => array(
84
+ 'type' => 'none',
85
  ),
86
  ));
87
 
88
  FLBuilder::render_settings_field( 'access_token', array(
89
+ 'row_class' => 'fl-builder-service-connect-row',
90
+ 'class' => 'fl-builder-service-connect-input',
91
+ 'type' => 'text',
92
+ 'label' => __( 'Access Token', 'fl-builder' ),
93
+ 'help' => __( 'Your Constant Contact access token.', 'fl-builder' ),
94
+ 'description' => sprintf( __( 'You must register a <a%1$s>Developer Account</a> with Constant Contact to obtain an API key and access token. Please see <a%2$s>Getting an API key</a> for complete instructions.', 'fl-builder' ), ' href="https://constantcontact.mashery.com/member/register" target="_blank"', ' href="https://developer.constantcontact.com/home/api-keys.html" target="_blank"' ),
95
+ 'preview' => array(
96
+ 'type' => 'none',
97
  ),
98
  ));
99
 
112
  * }
113
  */
114
  public function render_fields( $account, $settings ) {
115
+ $account_data = $this->get_account_data( $account );
116
+ $api_key = $account_data['api_key'];
117
+ $access_token = $account_data['access_token'];
118
+ $url = $this->api_url . 'lists?api_key=' . $api_key . '&access_token=' . $access_token;
119
+ $request = json_decode( wp_remote_retrieve_body( wp_remote_get( $url ) ) );
120
+ $response = array(
121
+ 'error' => false,
122
+ 'html' => '',
123
  );
124
 
125
  if ( ! is_array( $request ) || ( isset( $request[0] ) && isset( $request[0]->error_message ) ) ) {
152
  }
153
 
154
  FLBuilder::render_settings_field( 'list_id', array(
155
+ 'row_class' => 'fl-builder-service-field-row',
156
+ 'class' => 'fl-builder-service-list-select',
157
+ 'type' => 'select',
158
+ 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
159
+ 'options' => $options,
160
+ 'preview' => array(
161
+ 'type' => 'none',
162
  ),
163
  ), $settings);
164
 
177
  * }
178
  */
179
  public function subscribe( $settings, $email, $name = false ) {
180
+ $account_data = $this->get_account_data( $settings->service_account );
181
+ $response = array(
182
  'error' => false,
183
  );
184
 
186
  $response['error'] = __( 'There was an error subscribing to Constant Contact. The account is no longer connected.', 'fl-builder' );
187
  } else {
188
 
189
+ $api_key = $account_data['api_key'];
190
+ $access_token = $account_data['access_token'];
191
+ $url = $this->api_url . 'contacts?api_key=' . $api_key . '&access_token=' . $access_token . '&email=' . $email;
192
+ $request = wp_remote_get( $url );
193
+ $contact = json_decode( wp_remote_retrieve_body( $request ) );
194
+ $list_id = $settings->list_id;
195
 
196
  // This contact exists.
197
  if ( ! empty( $contact->results ) ) {
238
  } else {
239
  // @codingStandardsIgnoreLine
240
  $args = $data = array();
241
+ $data['email_addresses'] = array();
242
+ $data['email_addresses'][0]['id'] = $list_id;
243
+ $data['email_addresses'][0]['status'] = 'ACTIVE';
244
  $data['email_addresses'][0]['confirm_status'] = 'CONFIRMED';
245
  $data['email_addresses'][0]['email_address'] = $email;
246
  $data['lists'] = array();
classes/class-fl-builder-service-convertkit.php CHANGED
@@ -56,8 +56,8 @@ final class FLBuilderServiceConvertKit extends FLBuilderService {
56
  */
57
  public function connect( $fields = array() ) {
58
  $response = array(
59
- 'error' => false,
60
- 'data' => array(),
61
  );
62
 
63
  // Make sure we have an API key.
@@ -89,13 +89,13 @@ final class FLBuilderServiceConvertKit extends FLBuilderService {
89
  ob_start();
90
 
91
  FLBuilder::render_settings_field( 'api_key', array(
92
- 'row_class' => 'fl-builder-service-connect-row',
93
- 'class' => 'fl-builder-service-connect-input',
94
- 'type' => 'text',
95
- 'label' => __( 'API Key', 'fl-builder' ),
96
- 'help' => __( 'Your API key can be found in your ConvertKit account under Account > Account Settings > API Key.', 'fl-builder' ),
97
- 'preview' => array(
98
- 'type' => 'none',
99
  ),
100
  ));
101
 
@@ -114,12 +114,12 @@ final class FLBuilderServiceConvertKit extends FLBuilderService {
114
  * }
115
  */
116
  public function render_fields( $account, $settings ) {
117
- $account_data = $this->get_account_data( $account );
118
- $api = $this->get_api( $account_data['api_key'] );
119
- $forms = $api->get_resources( 'forms' );
120
- $response = array(
121
- 'error' => false,
122
- 'html' => '',
123
  );
124
 
125
  if ( ! $forms ) {
@@ -154,13 +154,13 @@ final class FLBuilderServiceConvertKit extends FLBuilderService {
154
  }
155
 
156
  FLBuilder::render_settings_field( 'list_id', array(
157
- 'row_class' => 'fl-builder-service-field-row',
158
- 'class' => 'fl-builder-service-list-select',
159
- 'type' => 'select',
160
- 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
161
- 'options' => $options,
162
- 'preview' => array(
163
- 'type' => 'none',
164
  ),
165
  ), $settings);
166
 
@@ -188,7 +188,7 @@ final class FLBuilderServiceConvertKit extends FLBuilderService {
188
  $response['error'] = __( 'There was an error subscribing to ConvertKit. The account is no longer connected.', 'fl-builder' );
189
  } else {
190
 
191
- $api = $this->get_api( $account_data['api_key'] );
192
  $data = array(
193
  'email' => $email,
194
  );
@@ -200,7 +200,7 @@ final class FLBuilderServiceConvertKit extends FLBuilderService {
200
  $result = $api->form_subscribe( $settings->list_id, $data );
201
 
202
  if ( isset( $result->error ) ) {
203
- $message = isset( $result->message ) ? $result->message : '';
204
  $response['error'] = sprintf(
205
  __( 'There was an error subscribing to ConvertKit. Error: %s', 'fl-builder' ),
206
  $message
56
  */
57
  public function connect( $fields = array() ) {
58
  $response = array(
59
+ 'error' => false,
60
+ 'data' => array(),
61
  );
62
 
63
  // Make sure we have an API key.
89
  ob_start();
90
 
91
  FLBuilder::render_settings_field( 'api_key', array(
92
+ 'row_class' => 'fl-builder-service-connect-row',
93
+ 'class' => 'fl-builder-service-connect-input',
94
+ 'type' => 'text',
95
+ 'label' => __( 'API Key', 'fl-builder' ),
96
+ 'help' => __( 'Your API key can be found in your ConvertKit account under Account > Account Settings > API Key.', 'fl-builder' ),
97
+ 'preview' => array(
98
+ 'type' => 'none',
99
  ),
100
  ));
101
 
114
  * }
115
  */
116
  public function render_fields( $account, $settings ) {
117
+ $account_data = $this->get_account_data( $account );
118
+ $api = $this->get_api( $account_data['api_key'] );
119
+ $forms = $api->get_resources( 'forms' );
120
+ $response = array(
121
+ 'error' => false,
122
+ 'html' => '',
123
  );
124
 
125
  if ( ! $forms ) {
154
  }
155
 
156
  FLBuilder::render_settings_field( 'list_id', array(
157
+ 'row_class' => 'fl-builder-service-field-row',
158
+ 'class' => 'fl-builder-service-list-select',
159
+ 'type' => 'select',
160
+ 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
161
+ 'options' => $options,
162
+ 'preview' => array(
163
+ 'type' => 'none',
164
  ),
165
  ), $settings);
166
 
188
  $response['error'] = __( 'There was an error subscribing to ConvertKit. The account is no longer connected.', 'fl-builder' );
189
  } else {
190
 
191
+ $api = $this->get_api( $account_data['api_key'] );
192
  $data = array(
193
  'email' => $email,
194
  );
200
  $result = $api->form_subscribe( $settings->list_id, $data );
201
 
202
  if ( isset( $result->error ) ) {
203
+ $message = isset( $result->message ) ? $result->message : '';
204
  $response['error'] = sprintf(
205
  __( 'There was an error subscribing to ConvertKit. Error: %s', 'fl-builder' ),
206
  $message
classes/class-fl-builder-service-drip.php CHANGED
@@ -56,8 +56,8 @@ final class FLBuilderServiceDrip extends FLBuilderService {
56
  */
57
  public function connect( $fields = array() ) {
58
  $response = array(
59
- 'error' => false,
60
- 'data' => array(),
61
  );
62
 
63
  // Make sure we have an API token.
@@ -65,21 +65,20 @@ final class FLBuilderServiceDrip extends FLBuilderService {
65
  $response['error'] = __( 'Error: You must provide an API token.', 'fl-builder' );
66
  } elseif ( ! isset( $fields['api_account_id'] ) || empty( $fields['api_account_id'] ) ) {
67
  $response['error'] = __( 'Error: You must provide an Account ID.', 'fl-builder' );
68
- } // Try to connect and store the connection data.
69
- else {
70
  try {
71
 
72
- $api = $this->get_api( $fields['api_key'] );
73
  try {
74
 
75
- $account = $api->fetch_account( $fields['api_account_id'] );
76
  $error_message = $api->get_error_message();
77
 
78
  if ( ! empty( $error_message ) ) {
79
  $response['error'] = $error_message;
80
  } else {
81
  $response['data'] = array(
82
- 'api_key' => $fields['api_key'],
83
  'api_account_id' => $fields['api_account_id'],
84
  );
85
  }
@@ -110,24 +109,24 @@ final class FLBuilderServiceDrip extends FLBuilderService {
110
  ob_start();
111
 
112
  FLBuilder::render_settings_field( 'api_key', array(
113
- 'row_class' => 'fl-builder-service-connect-row',
114
- 'class' => 'fl-builder-service-connect-input',
115
- 'type' => 'text',
116
- 'label' => __( 'API Token', 'fl-builder' ),
117
- 'description' => sprintf( __( 'Your API Token can be found in your Drip account under Settings > My User Settings. Or, you can click this <a%s>direct link</a>.', 'fl-builder' ), ' href="https://www.getdrip.com/user/edit" target="_blank"' ),
118
- 'preview' => array(
119
- 'type' => 'none',
120
  ),
121
  ));
122
 
123
  FLBuilder::render_settings_field( 'api_account_id', array(
124
- 'row_class' => 'fl-builder-service-connect-row',
125
- 'class' => 'fl-builder-service-connect-input',
126
- 'type' => 'text',
127
- 'label' => __( 'Account ID', 'fl-builder' ),
128
- 'help' => __( 'Your Account ID can be found in your Drip account under Settings > Site Setup.', 'fl-builder' ),
129
- 'preview' => array(
130
- 'type' => 'none',
131
  ),
132
  ));
133
 
@@ -146,15 +145,15 @@ final class FLBuilderServiceDrip extends FLBuilderService {
146
  * }
147
  */
148
  public function render_fields( $account, $settings ) {
149
- $account_data = $this->get_account_data( $account );
150
- $api = $this->get_api( $account_data['api_key'] );
151
- $campaigns = $api->get_campaigns( array(
152
  'account_id' => $account_data['api_account_id'],
153
  ) );
154
 
155
- $response = array(
156
- 'error' => false,
157
- 'html' => $this->render_campaigns_field( $campaigns, $settings ) . $this->render_tag_field( $settings ),
158
  );
159
 
160
  return $response;
@@ -181,13 +180,13 @@ final class FLBuilderServiceDrip extends FLBuilderService {
181
  }
182
 
183
  FLBuilder::render_settings_field( 'campaign_id', array(
184
- 'row_class' => 'fl-builder-service-field-row',
185
- 'class' => 'fl-builder-service-campaign-select',
186
- 'type' => 'select',
187
- 'label' => _x( 'Campaign', 'An email campaign from your GetDrip account.', 'fl-builder' ),
188
- 'options' => $options,
189
- 'preview' => array(
190
- 'type' => 'none',
191
  ),
192
  ), $settings);
193
 
@@ -206,13 +205,13 @@ final class FLBuilderServiceDrip extends FLBuilderService {
206
  ob_start();
207
 
208
  FLBuilder::render_settings_field( 'list_id', array(
209
- 'row_class' => 'fl-builder-service-field-row',
210
- 'class' => 'fl-builder-service-list-select',
211
- 'type' => 'text',
212
- 'label' => _x( 'Tags', 'A tag to add to contacts in Drip when they subscribe.', 'fl-builder' ),
213
- 'help' => __( 'For multiple tags, separate with comma.', 'fl-builder' ),
214
- 'preview' => array(
215
- 'type' => 'none',
216
  ),
217
  ), $settings);
218
 
@@ -231,20 +230,20 @@ final class FLBuilderServiceDrip extends FLBuilderService {
231
  * }
232
  */
233
  public function subscribe( $settings, $email, $name = '' ) {
234
- $account_data = $this->get_account_data( $settings->service_account );
235
- $response = array(
236
  'error' => false,
237
  );
238
- $subscriber_id = null;
239
 
240
  if ( ! $account_data ) {
241
  $response['error'] = __( 'There was an error subscribing to Drip. The account is no longer connected.', 'fl-builder' );
242
  } else {
243
 
244
- $api = $this->get_api( $account_data['api_key'] );
245
  $args = array(
246
  'account_id' => $account_data['api_account_id'],
247
- 'email' => $email,
248
  );
249
 
250
  // Check if the contact already exists
@@ -282,9 +281,9 @@ final class FLBuilderServiceDrip extends FLBuilderService {
282
  $result = $api->create_or_update_subscriber( $args );
283
 
284
  if ( isset( $result['id'] ) && isset( $settings->campaign_id ) ) {
285
- $args['campaign_id'] = $settings->campaign_id;
286
  $args['double_optin'] = false;
287
- $get_res = $api->subscribe_subscriber( $args );
288
  }
289
  } catch ( Exception $e ) {
290
  $response['error'] = sprintf(
56
  */
57
  public function connect( $fields = array() ) {
58
  $response = array(
59
+ 'error' => false,
60
+ 'data' => array(),
61
  );
62
 
63
  // Make sure we have an API token.
65
  $response['error'] = __( 'Error: You must provide an API token.', 'fl-builder' );
66
  } elseif ( ! isset( $fields['api_account_id'] ) || empty( $fields['api_account_id'] ) ) {
67
  $response['error'] = __( 'Error: You must provide an Account ID.', 'fl-builder' );
68
+ } else { // Try to connect and store the connection data.
 
69
  try {
70
 
71
+ $api = $this->get_api( $fields['api_key'] );
72
  try {
73
 
74
+ $account = $api->fetch_account( $fields['api_account_id'] );
75
  $error_message = $api->get_error_message();
76
 
77
  if ( ! empty( $error_message ) ) {
78
  $response['error'] = $error_message;
79
  } else {
80
  $response['data'] = array(
81
+ 'api_key' => $fields['api_key'],
82
  'api_account_id' => $fields['api_account_id'],
83
  );
84
  }
109
  ob_start();
110
 
111
  FLBuilder::render_settings_field( 'api_key', array(
112
+ 'row_class' => 'fl-builder-service-connect-row',
113
+ 'class' => 'fl-builder-service-connect-input',
114
+ 'type' => 'text',
115
+ 'label' => __( 'API Token', 'fl-builder' ),
116
+ 'description' => sprintf( __( 'Your API Token can be found in your Drip account under Settings > My User Settings. Or, you can click this <a%s>direct link</a>.', 'fl-builder' ), ' href="https://www.getdrip.com/user/edit" target="_blank"' ),
117
+ 'preview' => array(
118
+ 'type' => 'none',
119
  ),
120
  ));
121
 
122
  FLBuilder::render_settings_field( 'api_account_id', array(
123
+ 'row_class' => 'fl-builder-service-connect-row',
124
+ 'class' => 'fl-builder-service-connect-input',
125
+ 'type' => 'text',
126
+ 'label' => __( 'Account ID', 'fl-builder' ),
127
+ 'help' => __( 'Your Account ID can be found in your Drip account under Settings > Site Setup.', 'fl-builder' ),
128
+ 'preview' => array(
129
+ 'type' => 'none',
130
  ),
131
  ));
132
 
145
  * }
146
  */
147
  public function render_fields( $account, $settings ) {
148
+ $account_data = $this->get_account_data( $account );
149
+ $api = $this->get_api( $account_data['api_key'] );
150
+ $campaigns = $api->get_campaigns( array(
151
  'account_id' => $account_data['api_account_id'],
152
  ) );
153
 
154
+ $response = array(
155
+ 'error' => false,
156
+ 'html' => $this->render_campaigns_field( $campaigns, $settings ) . $this->render_tag_field( $settings ),
157
  );
158
 
159
  return $response;
180
  }
181
 
182
  FLBuilder::render_settings_field( 'campaign_id', array(
183
+ 'row_class' => 'fl-builder-service-field-row',
184
+ 'class' => 'fl-builder-service-campaign-select',
185
+ 'type' => 'select',
186
+ 'label' => _x( 'Campaign', 'An email campaign from your GetDrip account.', 'fl-builder' ),
187
+ 'options' => $options,
188
+ 'preview' => array(
189
+ 'type' => 'none',
190
  ),
191
  ), $settings);
192
 
205
  ob_start();
206
 
207
  FLBuilder::render_settings_field( 'list_id', array(
208
+ 'row_class' => 'fl-builder-service-field-row',
209
+ 'class' => 'fl-builder-service-list-select',
210
+ 'type' => 'text',
211
+ 'label' => _x( 'Tags', 'A tag to add to contacts in Drip when they subscribe.', 'fl-builder' ),
212
+ 'help' => __( 'For multiple tags, separate with comma.', 'fl-builder' ),
213
+ 'preview' => array(
214
+ 'type' => 'none',
215
  ),
216
  ), $settings);
217
 
230
  * }
231
  */
232
  public function subscribe( $settings, $email, $name = '' ) {
233
+ $account_data = $this->get_account_data( $settings->service_account );
234
+ $response = array(
235
  'error' => false,
236
  );
237
+ $subscriber_id = null;
238
 
239
  if ( ! $account_data ) {
240
  $response['error'] = __( 'There was an error subscribing to Drip. The account is no longer connected.', 'fl-builder' );
241
  } else {
242
 
243
+ $api = $this->get_api( $account_data['api_key'] );
244
  $args = array(
245
  'account_id' => $account_data['api_account_id'],
246
+ 'email' => $email,
247
  );
248
 
249
  // Check if the contact already exists
281
  $result = $api->create_or_update_subscriber( $args );
282
 
283
  if ( isset( $result['id'] ) && isset( $settings->campaign_id ) ) {
284
+ $args['campaign_id'] = $settings->campaign_id;
285
  $args['double_optin'] = false;
286
+ $get_res = $api->subscribe_subscriber( $args );
287
  }
288
  } catch ( Exception $e ) {
289
  $response['error'] = sprintf(
classes/class-fl-builder-service-email-address.php CHANGED
@@ -29,8 +29,8 @@ final class FLBuilderServiceEmailAddress extends FLBuilderService {
29
  */
30
  public function connect( $fields = array() ) {
31
  $response = array(
32
- 'error' => false,
33
- 'data' => array(),
34
  );
35
 
36
  // Make sure we have an email address.
@@ -55,12 +55,12 @@ final class FLBuilderServiceEmailAddress extends FLBuilderService {
55
  ob_start();
56
 
57
  FLBuilder::render_settings_field( 'email', array(
58
- 'row_class' => 'fl-builder-service-connect-row',
59
- 'class' => 'fl-builder-service-connect-input',
60
- 'type' => 'text',
61
- 'label' => __( 'Email Address', 'fl-builder' ),
62
- 'preview' => array(
63
- 'type' => 'none',
64
  ),
65
  ));
66
 
@@ -80,8 +80,8 @@ final class FLBuilderServiceEmailAddress extends FLBuilderService {
80
  */
81
  public function render_fields( $account, $settings ) {
82
  $response = array(
83
- 'error' => false,
84
- 'html' => '',
85
  );
86
 
87
  return $response;
29
  */
30
  public function connect( $fields = array() ) {
31
  $response = array(
32
+ 'error' => false,
33
+ 'data' => array(),
34
  );
35
 
36
  // Make sure we have an email address.
55
  ob_start();
56
 
57
  FLBuilder::render_settings_field( 'email', array(
58
+ 'row_class' => 'fl-builder-service-connect-row',
59
+ 'class' => 'fl-builder-service-connect-input',
60
+ 'type' => 'text',
61
+ 'label' => __( 'Email Address', 'fl-builder' ),
62
+ 'preview' => array(
63
+ 'type' => 'none',
64
  ),
65
  ));
66
 
80
  */
81
  public function render_fields( $account, $settings ) {
82
  $response = array(
83
+ 'error' => false,
84
+ 'html' => '',
85
  );
86
 
87
  return $response;
classes/class-fl-builder-service-enormail.php CHANGED
@@ -58,8 +58,8 @@ final class FLBuilderServiceEnormail extends FLBuilderService {
58
  */
59
  public function connect( $fields = array() ) {
60
  $response = array(
61
- 'error' => false,
62
- 'data' => array(),
63
  );
64
 
65
  // Make sure we have an API key.
@@ -96,13 +96,13 @@ final class FLBuilderServiceEnormail extends FLBuilderService {
96
  ob_start();
97
 
98
  FLBuilder::render_settings_field( 'api_key', array(
99
- 'row_class' => 'fl-builder-service-connect-row',
100
- 'class' => 'fl-builder-service-connect-input',
101
- 'type' => 'text',
102
- 'label' => __( 'API Key', 'fl-builder' ),
103
- 'help' => __( 'Found in your Sendy application under Settings.', 'fl-builder' ),
104
- 'preview' => array(
105
- 'type' => 'none',
106
  ),
107
  ));
108
 
@@ -121,12 +121,12 @@ final class FLBuilderServiceEnormail extends FLBuilderService {
121
  * }
122
  */
123
  public function render_fields( $account, $settings ) {
124
- $account_data = $this->get_account_data( $account );
125
- $api = $this->get_api( $account_data['api_key'] );
126
- $lists = json_decode( $api->lists->get() );
127
- $response = array(
128
- 'error' => false,
129
- 'html' => '',
130
  );
131
 
132
  if ( ! $lists ) {
@@ -161,13 +161,13 @@ final class FLBuilderServiceEnormail extends FLBuilderService {
161
  }
162
 
163
  FLBuilder::render_settings_field( 'list_id', array(
164
- 'row_class' => 'fl-builder-service-field-row',
165
- 'class' => 'fl-builder-service-list-select',
166
- 'type' => 'select',
167
- 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
168
- 'options' => $options,
169
- 'preview' => array(
170
- 'type' => 'none',
171
  ),
172
  ), $settings);
173
 
58
  */
59
  public function connect( $fields = array() ) {
60
  $response = array(
61
+ 'error' => false,
62
+ 'data' => array(),
63
  );
64
 
65
  // Make sure we have an API key.
96
  ob_start();
97
 
98
  FLBuilder::render_settings_field( 'api_key', array(
99
+ 'row_class' => 'fl-builder-service-connect-row',
100
+ 'class' => 'fl-builder-service-connect-input',
101
+ 'type' => 'text',
102
+ 'label' => __( 'API Key', 'fl-builder' ),
103
+ 'help' => __( 'Found in your Sendy application under Settings.', 'fl-builder' ),
104
+ 'preview' => array(
105
+ 'type' => 'none',
106
  ),
107
  ));
108
 
121
  * }
122
  */
123
  public function render_fields( $account, $settings ) {
124
+ $account_data = $this->get_account_data( $account );
125
+ $api = $this->get_api( $account_data['api_key'] );
126
+ $lists = json_decode( $api->lists->get() );
127
+ $response = array(
128
+ 'error' => false,
129
+ 'html' => '',
130
  );
131
 
132
  if ( ! $lists ) {
161
  }
162
 
163
  FLBuilder::render_settings_field( 'list_id', array(
164
+ 'row_class' => 'fl-builder-service-field-row',
165
+ 'class' => 'fl-builder-service-list-select',
166
+ 'type' => 'select',
167
+ 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
168
+ 'options' => $options,
169
+ 'preview' => array(
170
+ 'type' => 'none',
171
  ),
172
  ), $settings);
173
 
classes/class-fl-builder-service-getresponse.php CHANGED
@@ -56,8 +56,8 @@ final class FLBuilderServiceGetResponse extends FLBuilderService {
56
  */
57
  public function connect( $fields = array() ) {
58
  $response = array(
59
- 'error' => false,
60
- 'data' => array(),
61
  );
62
 
63
  // Make sure we have an API key.
@@ -90,13 +90,13 @@ final class FLBuilderServiceGetResponse extends FLBuilderService {
90
  ob_start();
91
 
92
  FLBuilder::render_settings_field( 'api_key', array(
93
- 'row_class' => 'fl-builder-service-connect-row',
94
- 'class' => 'fl-builder-service-connect-input',
95
- 'type' => 'text',
96
- 'label' => __( 'API Key', 'fl-builder' ),
97
- 'help' => __( 'Your API key can be found in your GetResponse account under My Account > API & OAuth.', 'fl-builder' ),
98
- 'preview' => array(
99
- 'type' => 'none',
100
  ),
101
  ));
102
 
@@ -115,12 +115,12 @@ final class FLBuilderServiceGetResponse extends FLBuilderService {
115
  * }
116
  */
117
  public function render_fields( $account, $settings ) {
118
- $account_data = $this->get_account_data( $account );
119
- $api = $this->get_api( $account_data['api_key'] );
120
- $lists = $api->getCampaigns();
121
- $response = array(
122
- 'error' => false,
123
- 'html' => '',
124
  );
125
 
126
  if ( ! $lists ) {
@@ -154,25 +154,25 @@ final class FLBuilderServiceGetResponse extends FLBuilderService {
154
  }
155
 
156
  FLBuilder::render_settings_field( 'list_id', array(
157
- 'row_class' => 'fl-builder-service-field-row',
158
- 'class' => 'fl-builder-service-list-select',
159
- 'type' => 'select',
160
- 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
161
- 'options' => $options,
162
- 'preview' => array(
163
- 'type' => 'none',
164
  ),
165
  ), $settings);
166
 
167
  FLBuilder::render_settings_field( 'cycle_day', array(
168
- 'row_class' => 'fl-builder-service-field-row',
169
- 'class' => 'fl-builder-service-cycleday-select',
170
- 'type' => 'select',
171
- 'label' => _x( 'Cycle Day', 'Day of autoresponder cycle.', 'fl-builder' ),
172
- 'help' => __( 'This should match the cycle day settings for the selected list\'s Autoresponder.', 'fl-builder' ),
173
- 'options' => range( 0, 30 ),
174
- 'preview' => array(
175
- 'type' => 'none',
176
  ),
177
  ), $settings);
178
 
@@ -207,15 +207,15 @@ final class FLBuilderServiceGetResponse extends FLBuilderService {
207
  // Fix, name should not be empty
208
  if ( ! $name ) {
209
  $names = explode( '@', $email );
210
- $name = $names[0];
211
  }
212
 
213
  $cyle_day = isset( $settings->cycle_day ) ? $settings->cycle_day : 0;
214
 
215
  $data = array(
216
- 'email' => $email,
217
- 'name' => $name,
218
- 'campaign' => array(
219
  'campaignId' => $settings->list_id,
220
  ),
221
  'dayOfCycle' => $cyle_day,
@@ -223,8 +223,8 @@ final class FLBuilderServiceGetResponse extends FLBuilderService {
223
 
224
  // Check if email exists
225
  $get_contact = $api->getContacts(array(
226
- 'query' => array(
227
- 'email' => $email,
228
  'campaignId' => $settings->list_id,
229
  ),
230
  'fields' => 'name, email',
56
  */
57
  public function connect( $fields = array() ) {
58
  $response = array(
59
+ 'error' => false,
60
+ 'data' => array(),
61
  );
62
 
63
  // Make sure we have an API key.
90
  ob_start();
91
 
92
  FLBuilder::render_settings_field( 'api_key', array(
93
+ 'row_class' => 'fl-builder-service-connect-row',
94
+ 'class' => 'fl-builder-service-connect-input',
95
+ 'type' => 'text',
96
+ 'label' => __( 'API Key', 'fl-builder' ),
97
+ 'help' => __( 'Your API key can be found in your GetResponse account under My Account > API & OAuth.', 'fl-builder' ),
98
+ 'preview' => array(
99
+ 'type' => 'none',
100
  ),
101
  ));
102
 
115
  * }
116
  */
117
  public function render_fields( $account, $settings ) {
118
+ $account_data = $this->get_account_data( $account );
119
+ $api = $this->get_api( $account_data['api_key'] );
120
+ $lists = $api->getCampaigns();
121
+ $response = array(
122
+ 'error' => false,
123
+ 'html' => '',
124
  );
125
 
126
  if ( ! $lists ) {
154
  }
155
 
156
  FLBuilder::render_settings_field( 'list_id', array(
157
+ 'row_class' => 'fl-builder-service-field-row',
158
+ 'class' => 'fl-builder-service-list-select',
159
+ 'type' => 'select',
160
+ 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
161
+ 'options' => $options,
162
+ 'preview' => array(
163
+ 'type' => 'none',
164
  ),
165
  ), $settings);
166
 
167
  FLBuilder::render_settings_field( 'cycle_day', array(
168
+ 'row_class' => 'fl-builder-service-field-row',
169
+ 'class' => 'fl-builder-service-cycleday-select',
170
+ 'type' => 'select',
171
+ 'label' => _x( 'Cycle Day', 'Day of autoresponder cycle.', 'fl-builder' ),
172
+ 'help' => __( 'This should match the cycle day settings for the selected list\'s Autoresponder.', 'fl-builder' ),
173
+ 'options' => range( 0, 30 ),
174
+ 'preview' => array(
175
+ 'type' => 'none',
176
  ),
177
  ), $settings);
178
 
207
  // Fix, name should not be empty
208
  if ( ! $name ) {
209
  $names = explode( '@', $email );
210
+ $name = $names[0];
211
  }
212
 
213
  $cyle_day = isset( $settings->cycle_day ) ? $settings->cycle_day : 0;
214
 
215
  $data = array(
216
+ 'email' => $email,
217
+ 'name' => $name,
218
+ 'campaign' => array(
219
  'campaignId' => $settings->list_id,
220
  ),
221
  'dayOfCycle' => $cyle_day,
223
 
224
  // Check if email exists
225
  $get_contact = $api->getContacts(array(
226
+ 'query' => array(
227
+ 'email' => $email,
228
  'campaignId' => $settings->list_id,
229
  ),
230
  'fields' => 'name, email',
classes/class-fl-builder-service-godaddy-email-marketing.php CHANGED
@@ -58,8 +58,8 @@ final class FLBuilderServiceGoDaddyEmailMarketing extends FLBuilderService {
58
  */
59
  public function connect( $fields = array() ) {
60
  $response = array(
61
- 'error' => false,
62
- 'data' => array(),
63
  );
64
 
65
  // Make sure we have an email address.
@@ -67,8 +67,7 @@ final class FLBuilderServiceGoDaddyEmailMarketing extends FLBuilderService {
67
  $response['error'] = __( 'Error: You must provide an API username.', 'fl-builder' );
68
  } elseif ( ! isset( $fields['api_key'] ) || empty( $fields['api_key'] ) ) {
69
  $response['error'] = __( 'Error: You must provide an API key.', 'fl-builder' );
70
- } // Try to connect and store the connection data.
71
- else {
72
 
73
  $api = $this->get_api( $fields['api_username'], $fields['api_key'] );
74
 
@@ -77,7 +76,7 @@ final class FLBuilderServiceGoDaddyEmailMarketing extends FLBuilderService {
77
  } else {
78
  $response['data'] = array(
79
  'api_username' => $fields['api_username'],
80
- 'api_key' => $fields['api_key'],
81
  );
82
  }
83
  }
@@ -95,25 +94,25 @@ final class FLBuilderServiceGoDaddyEmailMarketing extends FLBuilderService {
95
  ob_start();
96
 
97
  FLBuilder::render_settings_field( 'api_username', array(
98
- 'row_class' => 'fl-builder-service-connect-row',
99
- 'class' => 'fl-builder-service-connect-input',
100
- 'type' => 'text',
101
- 'label' => __( 'API Username', 'fl-builder' ),
102
- 'help' => __( 'The username associated with your GoDaddy Email Marketing account.', 'fl-builder' ),
103
- 'preview' => array(
104
- 'type' => 'none',
105
  ),
106
  ));
107
 
108
  FLBuilder::render_settings_field( 'api_key', array(
109
- 'row_class' => 'fl-builder-service-connect-row',
110
- 'class' => 'fl-builder-service-connect-input',
111
- 'type' => 'text',
112
- 'label' => __( 'API Key', 'fl-builder' ),
113
- 'help' => __( 'Your API key from your GoDaddy Email Marketing account.', 'fl-builder' ),
114
- 'description' => sprintf( __( '<a%1$s>Sign in</a> to get your username and API key. <a%2$s>Signup</a> if you don\'t have a GoDaddy Email Marketing account.', 'fl-builder' ), ' href="https://gem.godaddy.com/mwp/accounts" target="_blank"', ' href="https://sso.godaddy.com/account/create?path=/wordpress_plugin&app=gem&realm=idp&ssoreturnpath=/%3Fpath%3D%2Fwordpress_plugin%26app%3Dgem%26realm%3Didp" target="_blank"' ),
115
- 'preview' => array(
116
- 'type' => 'none',
117
  ),
118
  ));
119
 
@@ -132,11 +131,11 @@ final class FLBuilderServiceGoDaddyEmailMarketing extends FLBuilderService {
132
  * }
133
  */
134
  public function render_fields( $account, $settings ) {
135
- $account_data = $this->get_account_data( $account );
136
- $api = $this->get_api( $account_data['api_username'], $account_data['api_key'] );
137
- $response = array(
138
- 'error' => false,
139
- 'html' => '',
140
  );
141
 
142
  $result = $api::get_forms();
@@ -173,13 +172,13 @@ final class FLBuilderServiceGoDaddyEmailMarketing extends FLBuilderService {
173
  }
174
 
175
  FLBuilder::render_settings_field( 'form_id', array(
176
- 'row_class' => 'fl-builder-service-field-row',
177
- 'class' => 'fl-builder-service-list-select',
178
- 'type' => 'select',
179
- 'label' => _x( 'Form', 'A signup form from your GoDaddy Email Marketing account.', 'fl-builder' ),
180
- 'options' => $options,
181
- 'preview' => array(
182
- 'type' => 'none',
183
  ),
184
  ), $settings);
185
 
@@ -207,10 +206,10 @@ final class FLBuilderServiceGoDaddyEmailMarketing extends FLBuilderService {
207
  $response['error'] = __( 'There was an error subscribing to GoDaddy Email Marketing. The account is no longer connected.', 'fl-builder' );
208
  } else {
209
 
210
- $api = $this->get_api( $account_data['api_username'], $account_data['api_key'] );
211
- $data = array(
212
- 'email' => $email,
213
- 'form_id' => $settings->form_id,
214
  );
215
 
216
  if ( $name ) {
58
  */
59
  public function connect( $fields = array() ) {
60
  $response = array(
61
+ 'error' => false,
62
+ 'data' => array(),
63
  );
64
 
65
  // Make sure we have an email address.
67
  $response['error'] = __( 'Error: You must provide an API username.', 'fl-builder' );
68
  } elseif ( ! isset( $fields['api_key'] ) || empty( $fields['api_key'] ) ) {
69
  $response['error'] = __( 'Error: You must provide an API key.', 'fl-builder' );
70
+ } else { // Try to connect and store the connection data.
 
71
 
72
  $api = $this->get_api( $fields['api_username'], $fields['api_key'] );
73
 
76
  } else {
77
  $response['data'] = array(
78
  'api_username' => $fields['api_username'],
79
+ 'api_key' => $fields['api_key'],
80
  );
81
  }
82
  }
94
  ob_start();
95
 
96
  FLBuilder::render_settings_field( 'api_username', array(
97
+ 'row_class' => 'fl-builder-service-connect-row',
98
+ 'class' => 'fl-builder-service-connect-input',
99
+ 'type' => 'text',
100
+ 'label' => __( 'API Username', 'fl-builder' ),
101
+ 'help' => __( 'The username associated with your GoDaddy Email Marketing account.', 'fl-builder' ),
102
+ 'preview' => array(
103
+ 'type' => 'none',
104
  ),
105
  ));
106
 
107
  FLBuilder::render_settings_field( 'api_key', array(
108
+ 'row_class' => 'fl-builder-service-connect-row',
109
+ 'class' => 'fl-builder-service-connect-input',
110
+ 'type' => 'text',
111
+ 'label' => __( 'API Key', 'fl-builder' ),
112
+ 'help' => __( 'Your API key from your GoDaddy Email Marketing account.', 'fl-builder' ),
113
+ 'description' => sprintf( __( '<a%1$s>Sign in</a> to get your username and API key. <a%2$s>Signup</a> if you don\'t have a GoDaddy Email Marketing account.', 'fl-builder' ), ' href="https://gem.godaddy.com/mwp/accounts" target="_blank"', ' href="https://sso.godaddy.com/account/create?path=/wordpress_plugin&app=gem&realm=idp&ssoreturnpath=/%3Fpath%3D%2Fwordpress_plugin%26app%3Dgem%26realm%3Didp" target="_blank"' ),
114
+ 'preview' => array(
115
+ 'type' => 'none',
116
  ),
117
  ));
118
 
131
  * }
132
  */
133
  public function render_fields( $account, $settings ) {
134
+ $account_data = $this->get_account_data( $account );
135
+ $api = $this->get_api( $account_data['api_username'], $account_data['api_key'] );
136
+ $response = array(
137
+ 'error' => false,
138
+ 'html' => '',
139
  );
140
 
141
  $result = $api::get_forms();
172
  }
173
 
174
  FLBuilder::render_settings_field( 'form_id', array(
175
+ 'row_class' => 'fl-builder-service-field-row',
176
+ 'class' => 'fl-builder-service-list-select',
177
+ 'type' => 'select',
178
+ 'label' => _x( 'Form', 'A signup form from your GoDaddy Email Marketing account.', 'fl-builder' ),
179
+ 'options' => $options,
180
+ 'preview' => array(
181
+ 'type' => 'none',
182
  ),
183
  ), $settings);
184
 
206
  $response['error'] = __( 'There was an error subscribing to GoDaddy Email Marketing. The account is no longer connected.', 'fl-builder' );
207
  } else {
208
 
209
+ $api = $this->get_api( $account_data['api_username'], $account_data['api_key'] );
210
+ $data = array(
211
+ 'email' => $email,
212
+ 'form_id' => $settings->form_id,
213
  );
214
 
215
  if ( $name ) {
classes/class-fl-builder-service-hatchbuck.php CHANGED
@@ -38,8 +38,8 @@ final class FLBuilderServiceHatchbuck extends FLBuilderService {
38
  */
39
  public function connect( $fields = array() ) {
40
  $response = array(
41
- 'error' => false,
42
- 'data' => array(),
43
  );
44
 
45
  // Make sure we have an API key.
@@ -48,12 +48,12 @@ final class FLBuilderServiceHatchbuck extends FLBuilderService {
48
  } else {
49
 
50
  $result = wp_remote_post( $this->api_url . 'search?api_key=' . $fields['api_key'], array(
51
- 'method' => 'POST',
52
- 'timeout' => 60,
53
- 'headers' => array(
54
  'Content-Type' => 'application/json',
55
  ),
56
- 'body' => array(),
57
  ) );
58
 
59
  if ( 401 == $result['response']['code'] ) {
@@ -78,13 +78,13 @@ final class FLBuilderServiceHatchbuck extends FLBuilderService {
78
  ob_start();
79
 
80
  FLBuilder::render_settings_field( 'api_key', array(
81
- 'row_class' => 'fl-builder-service-connect-row',
82
- 'class' => 'fl-builder-service-connect-input',
83
- 'type' => 'text',
84
- 'label' => __( 'API Key', 'fl-builder' ),
85
- 'help' => __( 'Your API key can be found in your Hatchbuck account under Account Settings > Web API.', 'fl-builder' ),
86
- 'preview' => array(
87
- 'type' => 'none',
88
  ),
89
  ));
90
 
@@ -104,8 +104,8 @@ final class FLBuilderServiceHatchbuck extends FLBuilderService {
104
  */
105
  public function render_fields( $account, $settings ) {
106
  $response = array(
107
- 'error' => false,
108
- 'html' => $this->render_tag_field( $settings ),
109
  );
110
 
111
  return $response;
@@ -123,12 +123,12 @@ final class FLBuilderServiceHatchbuck extends FLBuilderService {
123
  ob_start();
124
 
125
  FLBuilder::render_settings_field( 'list_id', array(
126
- 'row_class' => 'fl-builder-service-field-row',
127
- 'class' => 'fl-builder-service-list-select',
128
- 'type' => 'text',
129
- 'label' => _x( 'Tag', 'A tag to add to contacts in Hatchbuck when they subscribe.', 'fl-builder' ),
130
- 'preview' => array(
131
- 'type' => 'none',
132
  ),
133
  ), $settings);
134
 
@@ -147,7 +147,7 @@ final class FLBuilderServiceHatchbuck extends FLBuilderService {
147
  * }
148
  */
149
  public function subscribe( $settings, $email, $name = false ) {
150
- $contact_id = null;
151
  $account_data = $this->get_account_data( $settings->service_account );
152
  $response = array(
153
  'error' => false,
@@ -162,7 +162,7 @@ final class FLBuilderServiceHatchbuck extends FLBuilderService {
162
  'emails' => array(
163
  array(
164
  'address' => $email,
165
- 'type' => 'Work',
166
  ),
167
  ),
168
  'status' => array(
@@ -172,12 +172,12 @@ final class FLBuilderServiceHatchbuck extends FLBuilderService {
172
 
173
  // Check if the contact exists.
174
  $result = wp_remote_post( $this->api_url . 'search?api_key=' . $account_data['api_key'], array(
175
- 'method' => 'POST',
176
- 'timeout' => 60,
177
- 'headers' => array(
178
  'Content-Type' => 'application/json',
179
  ),
180
- 'body' => json_encode( $data ),
181
  ) );
182
 
183
  // Return if we have an API key error.
@@ -187,8 +187,7 @@ final class FLBuilderServiceHatchbuck extends FLBuilderService {
187
  } elseif ( 200 == $result['response']['code'] ) {
188
  $result_data = json_decode( $result['body'] );
189
  $contact_id = $result_data[0]->contactId;
190
- } // Generic error. Contact not found should be 400.
191
- elseif ( 400 != $result['response']['code'] ) {
192
  $response['error'] = __( 'There was an error subscribing to Hatchbuck.', 'fl-builder' );
193
  return $response;
194
  }
@@ -211,12 +210,12 @@ final class FLBuilderServiceHatchbuck extends FLBuilderService {
211
 
212
  // Add the contact to Hatchbuck.
213
  $result = wp_remote_post( $this->api_url . '?api_key=' . $account_data['api_key'], array(
214
- 'method' => 'POST',
215
- 'timeout' => 60,
216
- 'headers' => array(
217
  'Content-Type' => 'application/json',
218
  ),
219
- 'body' => json_encode( $data ),
220
  ) );
221
 
222
  // Return if we have an error.
@@ -233,12 +232,12 @@ final class FLBuilderServiceHatchbuck extends FLBuilderService {
233
 
234
  // Add the tag to the contact.
235
  $result = wp_remote_post( $this->api_url . $contact_id . '/Tags?api_key=' . $account_data['api_key'], array(
236
- 'method' => 'POST',
237
- 'timeout' => 60,
238
- 'headers' => array(
239
  'Content-Type' => 'application/json',
240
  ),
241
- 'body' => json_encode( array(
242
  array(
243
  'name' => $settings->list_id,
244
  ),
38
  */
39
  public function connect( $fields = array() ) {
40
  $response = array(
41
+ 'error' => false,
42
+ 'data' => array(),
43
  );
44
 
45
  // Make sure we have an API key.
48
  } else {
49
 
50
  $result = wp_remote_post( $this->api_url . 'search?api_key=' . $fields['api_key'], array(
51
+ 'method' => 'POST',
52
+ 'timeout' => 60,
53
+ 'headers' => array(
54
  'Content-Type' => 'application/json',
55
  ),
56
+ 'body' => array(),
57
  ) );
58
 
59
  if ( 401 == $result['response']['code'] ) {
78
  ob_start();
79
 
80
  FLBuilder::render_settings_field( 'api_key', array(
81
+ 'row_class' => 'fl-builder-service-connect-row',
82
+ 'class' => 'fl-builder-service-connect-input',
83
+ 'type' => 'text',
84
+ 'label' => __( 'API Key', 'fl-builder' ),
85
+ 'help' => __( 'Your API key can be found in your Hatchbuck account under Account Settings > Web API.', 'fl-builder' ),
86
+ 'preview' => array(
87
+ 'type' => 'none',
88
  ),
89
  ));
90
 
104
  */
105
  public function render_fields( $account, $settings ) {
106
  $response = array(
107
+ 'error' => false,
108
+ 'html' => $this->render_tag_field( $settings ),
109
  );
110
 
111
  return $response;
123
  ob_start();
124
 
125
  FLBuilder::render_settings_field( 'list_id', array(
126
+ 'row_class' => 'fl-builder-service-field-row',
127
+ 'class' => 'fl-builder-service-list-select',
128
+ 'type' => 'text',
129
+ 'label' => _x( 'Tag', 'A tag to add to contacts in Hatchbuck when they subscribe.', 'fl-builder' ),
130
+ 'preview' => array(
131
+ 'type' => 'none',
132
  ),
133
  ), $settings);
134
 
147
  * }
148
  */
149
  public function subscribe( $settings, $email, $name = false ) {
150
+ $contact_id = null;
151
  $account_data = $this->get_account_data( $settings->service_account );
152
  $response = array(
153
  'error' => false,
162
  'emails' => array(
163
  array(
164
  'address' => $email,
165
+ 'type' => 'Work',
166
  ),
167
  ),
168
  'status' => array(
172
 
173
  // Check if the contact exists.
174
  $result = wp_remote_post( $this->api_url . 'search?api_key=' . $account_data['api_key'], array(
175
+ 'method' => 'POST',
176
+ 'timeout' => 60,
177
+ 'headers' => array(
178
  'Content-Type' => 'application/json',
179
  ),
180
+ 'body' => json_encode( $data ),
181
  ) );
182
 
183
  // Return if we have an API key error.
187
  } elseif ( 200 == $result['response']['code'] ) {
188
  $result_data = json_decode( $result['body'] );
189
  $contact_id = $result_data[0]->contactId;
190
+ } elseif ( 400 != $result['response']['code'] ) { // Generic error. Contact not found should be 400.
 
191
  $response['error'] = __( 'There was an error subscribing to Hatchbuck.', 'fl-builder' );
192
  return $response;
193
  }
210
 
211
  // Add the contact to Hatchbuck.
212
  $result = wp_remote_post( $this->api_url . '?api_key=' . $account_data['api_key'], array(
213
+ 'method' => 'POST',
214
+ 'timeout' => 60,
215
+ 'headers' => array(
216
  'Content-Type' => 'application/json',
217
  ),
218
+ 'body' => json_encode( $data ),
219
  ) );
220
 
221
  // Return if we have an error.
232
 
233
  // Add the tag to the contact.
234
  $result = wp_remote_post( $this->api_url . $contact_id . '/Tags?api_key=' . $account_data['api_key'], array(
235
+ 'method' => 'POST',
236
+ 'timeout' => 60,
237
+ 'headers' => array(
238
  'Content-Type' => 'application/json',
239
  ),
240
+ 'body' => json_encode( array(
241
  array(
242
  'name' => $settings->list_id,
243
  ),
classes/class-fl-builder-service-icontact-pro.php CHANGED
@@ -68,8 +68,8 @@ final class FLBuilderServiceIContactPro extends FLBuilderService {
68
  */
69
  public function connect( $fields = array() ) {
70
  $response = array(
71
- 'error' => false,
72
- 'data' => array(),
73
  );
74
 
75
  // Make sure we have a username.
@@ -77,17 +77,13 @@ final class FLBuilderServiceIContactPro extends FLBuilderService {
77
  $response['error'] = __( 'Error: You must provide a username.', 'fl-builder' );
78
  } elseif ( ! isset( $fields['app_id'] ) || empty( $fields['app_id'] ) ) {
79
  $response['error'] = __( 'Error: You must provide an app ID.', 'fl-builder' );
80
- } // Make sure we have an app password.
81
- elseif ( ! isset( $fields['app_password'] ) || empty( $fields['app_password'] ) ) {
82
  $response['error'] = __( 'Error: You must provide an app password.', 'fl-builder' );
83
- } // Make sure we have a company ID
84
- elseif ( ! isset( $fields['company_id'] ) || empty( $fields['company_id'] ) ) {
85
  $response['error'] = __( 'Error: You must provide a company ID.', 'fl-builder' );
86
- } // Make sure we have a profile ID
87
- elseif ( ! isset( $fields['profile_id'] ) || empty( $fields['profile_id'] ) ) {
88
  $response['error'] = __( 'Error: You must provide a profile ID.', 'fl-builder' );
89
- } // Try to connect and store the connection data.
90
- else {
91
 
92
  $api = $this->get_api( array(
93
  'apiUsername' => $fields['username'],
@@ -100,14 +96,14 @@ final class FLBuilderServiceIContactPro extends FLBuilderService {
100
  try {
101
  $api->getLists();
102
  $response['data'] = array(
103
- 'username' => $fields['username'],
104
- 'app_id' => $fields['app_id'],
105
- 'app_password' => $fields['app_password'],
106
- 'company_id' => $fields['company_id'],
107
- 'profile_id' => $fields['profile_id'],
108
  );
109
  } catch ( Exception $e ) {
110
- $errors = $api->getErrors();
111
  $response['error'] = sprintf( __( 'Error: Could not connect to iContact Pro. %s', 'fl-builder' ), $errors[0] );
112
  }
113
  }
@@ -125,59 +121,59 @@ final class FLBuilderServiceIContactPro extends FLBuilderService {
125
  ob_start();
126
 
127
  FLBuilder::render_settings_field( 'username', array(
128
- 'row_class' => 'fl-builder-service-connect-row',
129
- 'class' => 'fl-builder-service-connect-input',
130
- 'type' => 'text',
131
- 'label' => __( 'Username', 'fl-builder' ),
132
- 'help' => __( 'Your iContact Pro username.', 'fl-builder' ),
133
- 'preview' => array(
134
- 'type' => 'none',
135
  ),
136
  ));
137
 
138
  FLBuilder::render_settings_field( 'app_id', array(
139
- 'row_class' => 'fl-builder-service-connect-row',
140
- 'class' => 'fl-builder-service-connect-input',
141
- 'type' => 'text',
142
- 'label' => __( 'App ID', 'fl-builder' ),
143
- 'help' => __( 'Your iContact Pro app ID.', 'fl-builder' ),
144
- 'preview' => array(
145
- 'type' => 'none',
146
  ),
147
  ));
148
 
149
  FLBuilder::render_settings_field( 'app_password', array(
150
- 'row_class' => 'fl-builder-service-connect-row',
151
- 'class' => 'fl-builder-service-connect-input',
152
- 'type' => 'text',
153
- 'label' => __( 'App Password', 'fl-builder' ),
154
- 'help' => __( 'Your iContact Pro app password.', 'fl-builder' ),
155
- 'description' => sprintf( __( 'You must <a%1$s>create an app</a> in iContact Pro to obtain an app ID and password. Please see <a%2$s>the iContact docs</a> for complete instructions.', 'fl-builder' ), ' href="https://app.icontactpro.com/MKT/Settings/Api?returnUrl=/MKT/Settings" target="_blank"', ' href="http://www.icontact.com/developerportal/api-documentation/vocus-register-your-app/" target="_blank"' ),
156
- 'preview' => array(
157
- 'type' => 'none',
158
  ),
159
  ));
160
 
161
  FLBuilder::render_settings_field( 'company_id', array(
162
- 'row_class' => 'fl-builder-service-connect-row',
163
- 'class' => 'fl-builder-service-connect-input',
164
- 'type' => 'text',
165
- 'label' => __( 'Company ID', 'fl-builder' ),
166
- 'help' => __( 'Your iContact Pro Company ID.', 'fl-builder' ),
167
- 'preview' => array(
168
- 'type' => 'none',
169
  ),
170
  ));
171
 
172
  FLBuilder::render_settings_field( 'profile_id', array(
173
- 'row_class' => 'fl-builder-service-connect-row',
174
- 'class' => 'fl-builder-service-connect-input',
175
- 'type' => 'text',
176
- 'label' => __( 'Profile ID', 'fl-builder' ),
177
- 'help' => __( 'Your iContact Pro Profile ID.', 'fl-builder' ),
178
- 'description' => sprintf( __( 'Your Company and Profile ID can also be found in the <a%1$s>iContact Pro API settings</a> under Account Information.', 'fl-builder' ), ' href="https://app.icontactpro.com/MKT/Settings/Api?returnUrl=/MKT/Settings" target="_blank"' ),
179
- 'preview' => array(
180
- 'type' => 'none',
181
  ),
182
  ));
183
 
@@ -196,24 +192,24 @@ final class FLBuilderServiceIContactPro extends FLBuilderService {
196
  * }
197
  */
198
  public function render_fields( $account, $settings ) {
199
- $account_data = $this->get_account_data( $account );
200
- $api = $this->get_api( array(
201
- 'apiUsername' => $account_data['username'],
202
- 'appId' => $account_data['app_id'],
203
- 'apiPassword' => $account_data['app_password'],
204
- 'companyId' => $account_data['company_id'],
205
- 'profileId' => $account_data['profile_id'],
206
  ));
207
- $response = array(
208
- 'error' => false,
209
- 'html' => '',
210
  );
211
 
212
  try {
213
- $lists = $api->getLists();
214
  $response['html'] = $this->render_list_field( $lists, $settings );
215
  } catch ( Exception $e ) {
216
- $errors = $api->getErrors();
217
  $response['error'] = sprintf( __( 'Error: Could not connect to iContact Pro. %s', 'fl-builder' ), $errors[0] );
218
  }
219
 
@@ -241,13 +237,13 @@ final class FLBuilderServiceIContactPro extends FLBuilderService {
241
  }
242
 
243
  FLBuilder::render_settings_field( 'list_id', array(
244
- 'row_class' => 'fl-builder-service-field-row',
245
- 'class' => 'fl-builder-service-list-select',
246
- 'type' => 'select',
247
- 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
248
- 'options' => $options,
249
- 'preview' => array(
250
- 'type' => 'none',
251
  ),
252
  ), $settings);
253
 
@@ -275,22 +271,22 @@ final class FLBuilderServiceIContactPro extends FLBuilderService {
275
  $response['error'] = __( 'There was an error subscribing to iContact. The account is no longer connected.', 'fl-builder' );
276
  } else {
277
 
278
- $data = array(
279
  'email' => $email,
280
  );
281
- $api = $this->get_api( array(
282
- 'apiUsername' => $account_data['username'],
283
- 'appId' => $account_data['app_id'],
284
- 'apiPassword' => $account_data['app_password'],
285
- 'companyId' => $account_data['company_id'],
286
- 'profileId' => $account_data['profile_id'],
287
  ));
288
 
289
  try {
290
 
291
  if ( $name ) {
292
 
293
- $names = explode( ' ', $name );
294
  $data['first_name'] = null;
295
  $data['last_name'] = null;
296
 
@@ -308,7 +304,7 @@ final class FLBuilderServiceIContactPro extends FLBuilderService {
308
 
309
  $api->subscribeContactToList( $result->contactId, $settings->list_id ); // @codingStandardsIgnoreLine
310
  } catch ( Exception $e ) {
311
- $errors = $api->getErrors();
312
  $response['error'] = sprintf( __( 'There was an error subscribing to iContact Pro. %s', 'fl-builder' ), $errors[0] );
313
  }
314
  }
68
  */
69
  public function connect( $fields = array() ) {
70
  $response = array(
71
+ 'error' => false,
72
+ 'data' => array(),
73
  );
74
 
75
  // Make sure we have a username.
77
  $response['error'] = __( 'Error: You must provide a username.', 'fl-builder' );
78
  } elseif ( ! isset( $fields['app_id'] ) || empty( $fields['app_id'] ) ) {
79
  $response['error'] = __( 'Error: You must provide an app ID.', 'fl-builder' );
80
+ } elseif ( ! isset( $fields['app_password'] ) || empty( $fields['app_password'] ) ) { // Make sure we have an app password.
 
81
  $response['error'] = __( 'Error: You must provide an app password.', 'fl-builder' );
82
+ } elseif ( ! isset( $fields['company_id'] ) || empty( $fields['company_id'] ) ) { // Make sure we have a company ID
 
83
  $response['error'] = __( 'Error: You must provide a company ID.', 'fl-builder' );
84
+ } elseif ( ! isset( $fields['profile_id'] ) || empty( $fields['profile_id'] ) ) { // Make sure we have a profile ID
 
85
  $response['error'] = __( 'Error: You must provide a profile ID.', 'fl-builder' );
86
+ } else { // Try to connect and store the connection data.
 
87
 
88
  $api = $this->get_api( array(
89
  'apiUsername' => $fields['username'],
96
  try {
97
  $api->getLists();
98
  $response['data'] = array(
99
+ 'username' => $fields['username'],
100
+ 'app_id' => $fields['app_id'],
101
+ 'app_password' => $fields['app_password'],
102
+ 'company_id' => $fields['company_id'],
103
+ 'profile_id' => $fields['profile_id'],
104
  );
105
  } catch ( Exception $e ) {
106
+ $errors = $api->getErrors();
107
  $response['error'] = sprintf( __( 'Error: Could not connect to iContact Pro. %s', 'fl-builder' ), $errors[0] );
108
  }
109
  }
121
  ob_start();
122
 
123
  FLBuilder::render_settings_field( 'username', array(
124
+ 'row_class' => 'fl-builder-service-connect-row',
125
+ 'class' => 'fl-builder-service-connect-input',
126
+ 'type' => 'text',
127
+ 'label' => __( 'Username', 'fl-builder' ),
128
+ 'help' => __( 'Your iContact Pro username.', 'fl-builder' ),
129
+ 'preview' => array(
130
+ 'type' => 'none',
131
  ),
132
  ));
133
 
134
  FLBuilder::render_settings_field( 'app_id', array(
135
+ 'row_class' => 'fl-builder-service-connect-row',
136
+ 'class' => 'fl-builder-service-connect-input',
137
+ 'type' => 'text',
138
+ 'label' => __( 'App ID', 'fl-builder' ),
139
+ 'help' => __( 'Your iContact Pro app ID.', 'fl-builder' ),
140
+ 'preview' => array(
141
+ 'type' => 'none',
142
  ),
143
  ));
144
 
145
  FLBuilder::render_settings_field( 'app_password', array(
146
+ 'row_class' => 'fl-builder-service-connect-row',
147
+ 'class' => 'fl-builder-service-connect-input',
148
+ 'type' => 'text',
149
+ 'label' => __( 'App Password', 'fl-builder' ),
150
+ 'help' => __( 'Your iContact Pro app password.', 'fl-builder' ),
151
+ 'description' => sprintf( __( 'You must <a%1$s>create an app</a> in iContact Pro to obtain an app ID and password. Please see <a%2$s>the iContact docs</a> for complete instructions.', 'fl-builder' ), ' href="https://app.icontactpro.com/MKT/Settings/Api?returnUrl=/MKT/Settings" target="_blank"', ' href="http://www.icontact.com/developerportal/api-documentation/vocus-register-your-app/" target="_blank"' ),
152
+ 'preview' => array(
153
+ 'type' => 'none',
154
  ),
155
  ));
156
 
157
  FLBuilder::render_settings_field( 'company_id', array(
158
+ 'row_class' => 'fl-builder-service-connect-row',
159
+ 'class' => 'fl-builder-service-connect-input',
160
+ 'type' => 'text',
161
+ 'label' => __( 'Company ID', 'fl-builder' ),
162
+ 'help' => __( 'Your iContact Pro Company ID.', 'fl-builder' ),
163
+ 'preview' => array(
164
+ 'type' => 'none',
165
  ),
166
  ));
167
 
168
  FLBuilder::render_settings_field( 'profile_id', array(
169
+ 'row_class' => 'fl-builder-service-connect-row',
170
+ 'class' => 'fl-builder-service-connect-input',
171
+ 'type' => 'text',
172
+ 'label' => __( 'Profile ID', 'fl-builder' ),
173
+ 'help' => __( 'Your iContact Pro Profile ID.', 'fl-builder' ),
174
+ 'description' => sprintf( __( 'Your Company and Profile ID can also be found in the <a%1$s>iContact Pro API settings</a> under Account Information.', 'fl-builder' ), ' href="https://app.icontactpro.com/MKT/Settings/Api?returnUrl=/MKT/Settings" target="_blank"' ),
175
+ 'preview' => array(
176
+ 'type' => 'none',
177
  ),
178
  ));
179
 
192
  * }
193
  */
194
  public function render_fields( $account, $settings ) {
195
+ $account_data = $this->get_account_data( $account );
196
+ $api = $this->get_api( array(
197
+ 'apiUsername' => $account_data['username'],
198
+ 'appId' => $account_data['app_id'],
199
+ 'apiPassword' => $account_data['app_password'],
200
+ 'companyId' => $account_data['company_id'],
201
+ 'profileId' => $account_data['profile_id'],
202
  ));
203
+ $response = array(
204
+ 'error' => false,
205
+ 'html' => '',
206
  );
207
 
208
  try {
209
+ $lists = $api->getLists();
210
  $response['html'] = $this->render_list_field( $lists, $settings );
211
  } catch ( Exception $e ) {
212
+ $errors = $api->getErrors();
213
  $response['error'] = sprintf( __( 'Error: Could not connect to iContact Pro. %s', 'fl-builder' ), $errors[0] );
214
  }
215
 
237
  }
238
 
239
  FLBuilder::render_settings_field( 'list_id', array(
240
+ 'row_class' => 'fl-builder-service-field-row',
241
+ 'class' => 'fl-builder-service-list-select',
242
+ 'type' => 'select',
243
+ 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
244
+ 'options' => $options,
245
+ 'preview' => array(
246
+ 'type' => 'none',
247
  ),
248
  ), $settings);
249
 
271
  $response['error'] = __( 'There was an error subscribing to iContact. The account is no longer connected.', 'fl-builder' );
272
  } else {
273
 
274
+ $data = array(
275
  'email' => $email,
276
  );
277
+ $api = $this->get_api( array(
278
+ 'apiUsername' => $account_data['username'],
279
+ 'appId' => $account_data['app_id'],
280
+ 'apiPassword' => $account_data['app_password'],
281
+ 'companyId' => $account_data['company_id'],
282
+ 'profileId' => $account_data['profile_id'],
283
  ));
284
 
285
  try {
286
 
287
  if ( $name ) {
288
 
289
+ $names = explode( ' ', $name );
290
  $data['first_name'] = null;
291
  $data['last_name'] = null;
292
 
304
 
305
  $api->subscribeContactToList( $result->contactId, $settings->list_id ); // @codingStandardsIgnoreLine
306
  } catch ( Exception $e ) {
307
+ $errors = $api->getErrors();
308
  $response['error'] = sprintf( __( 'There was an error subscribing to iContact Pro. %s', 'fl-builder' ), $errors[0] );
309
  }
310
  }
classes/class-fl-builder-service-icontact.php CHANGED
@@ -64,8 +64,8 @@ final class FLBuilderServiceIContact extends FLBuilderService {
64
  */
65
  public function connect( $fields = array() ) {
66
  $response = array(
67
- 'error' => false,
68
- 'data' => array(),
69
  );
70
 
71
  // Make sure we have a username.
@@ -73,11 +73,9 @@ final class FLBuilderServiceIContact extends FLBuilderService {
73
  $response['error'] = __( 'Error: You must provide a username.', 'fl-builder' );
74
  } elseif ( ! isset( $fields['app_id'] ) || empty( $fields['app_id'] ) ) {
75
  $response['error'] = __( 'Error: You must provide a app ID.', 'fl-builder' );
76
- } // Make sure we have an app password.
77
- elseif ( ! isset( $fields['app_password'] ) || empty( $fields['app_password'] ) ) {
78
  $response['error'] = __( 'Error: You must provide a app password.', 'fl-builder' );
79
- } // Try to connect and store the connection data.
80
- else {
81
 
82
  $api = $this->get_api( array(
83
  'apiUsername' => $fields['username'],
@@ -88,12 +86,12 @@ final class FLBuilderServiceIContact extends FLBuilderService {
88
  try {
89
  $api->getLists();
90
  $response['data'] = array(
91
- 'username' => $fields['username'],
92
- 'app_id' => $fields['app_id'],
93
- 'app_password' => $fields['app_password'],
94
  );
95
  } catch ( Exception $e ) {
96
- $errors = $api->getErrors();
97
  $response['error'] = sprintf( __( 'Error: Could not connect to iContact. %s', 'fl-builder' ), $errors[0] );
98
  }
99
  }
@@ -111,36 +109,36 @@ final class FLBuilderServiceIContact extends FLBuilderService {
111
  ob_start();
112
 
113
  FLBuilder::render_settings_field( 'username', array(
114
- 'row_class' => 'fl-builder-service-connect-row',
115
- 'class' => 'fl-builder-service-connect-input',
116
- 'type' => 'text',
117
- 'label' => __( 'Username', 'fl-builder' ),
118
- 'help' => __( 'Your iContact username.', 'fl-builder' ),
119
- 'preview' => array(
120
- 'type' => 'none',
121
  ),
122
  ));
123
 
124
  FLBuilder::render_settings_field( 'app_id', array(
125
- 'row_class' => 'fl-builder-service-connect-row',
126
- 'class' => 'fl-builder-service-connect-input',
127
- 'type' => 'text',
128
- 'label' => __( 'App ID', 'fl-builder' ),
129
- 'help' => __( 'Your iContact app ID.', 'fl-builder' ),
130
- 'preview' => array(
131
- 'type' => 'none',
132
  ),
133
  ));
134
 
135
  FLBuilder::render_settings_field( 'app_password', array(
136
- 'row_class' => 'fl-builder-service-connect-row',
137
- 'class' => 'fl-builder-service-connect-input',
138
- 'type' => 'text',
139
- 'label' => __( 'App Password', 'fl-builder' ),
140
- 'help' => __( 'Your iContact app password.', 'fl-builder' ),
141
- 'description' => sprintf( __( 'You must <a%1$s>create an app</a> in iContact to obtain an app ID and password. Please see <a%2$s>the iContact docs</a> for complete instructions.', 'fl-builder' ), ' href="https://app.icontact.com/icp/core/registerapp/" target="_blank"', ' href="http://www.icontact.com/developerportal/api-documentation/vocus-register-your-app/" target="_blank"' ),
142
- 'preview' => array(
143
- 'type' => 'none',
144
  ),
145
  ));
146
 
@@ -159,22 +157,22 @@ final class FLBuilderServiceIContact extends FLBuilderService {
159
  * }
160
  */
161
  public function render_fields( $account, $settings ) {
162
- $account_data = $this->get_account_data( $account );
163
- $api = $this->get_api( array(
164
- 'apiUsername' => $account_data['username'],
165
- 'appId' => $account_data['app_id'],
166
- 'apiPassword' => $account_data['app_password'],
167
  ));
168
- $response = array(
169
- 'error' => false,
170
- 'html' => '',
171
  );
172
 
173
  try {
174
- $lists = $api->getLists();
175
  $response['html'] = $this->render_list_field( $lists, $settings );
176
  } catch ( Exception $e ) {
177
- $errors = $api->getErrors();
178
  $response['error'] = sprintf( __( 'Error: Could not connect to iContact. %s', 'fl-builder' ), $errors[0] );
179
  }
180
 
@@ -203,13 +201,13 @@ final class FLBuilderServiceIContact extends FLBuilderService {
203
  }
204
 
205
  FLBuilder::render_settings_field( 'list_id', array(
206
- 'row_class' => 'fl-builder-service-field-row',
207
- 'class' => 'fl-builder-service-list-select',
208
- 'type' => 'select',
209
- 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
210
- 'options' => $options,
211
- 'preview' => array(
212
- 'type' => 'none',
213
  ),
214
  ), $settings);
215
 
@@ -237,20 +235,20 @@ final class FLBuilderServiceIContact extends FLBuilderService {
237
  $response['error'] = __( 'There was an error subscribing to iContact. The account is no longer connected.', 'fl-builder' );
238
  } else {
239
 
240
- $data = array(
241
  'email' => $email,
242
  );
243
- $api = $this->get_api( array(
244
- 'apiUsername' => $account_data['username'],
245
- 'appId' => $account_data['app_id'],
246
- 'apiPassword' => $account_data['app_password'],
247
  ));
248
 
249
  try {
250
 
251
  if ( $name ) {
252
 
253
- $names = explode( ' ', $name );
254
  $data['first_name'] = null;
255
  $data['last_name'] = null;
256
 
@@ -269,7 +267,7 @@ final class FLBuilderServiceIContact extends FLBuilderService {
269
  // @codingStandardsIgnoreLine
270
  $api->subscribeContactToList( $result->contactId, $settings->list_id );
271
  } catch ( Exception $e ) {
272
- $errors = $api->getErrors();
273
  $response['error'] = sprintf( __( 'There was an error subscribing to iContact. %s', 'fl-builder' ), $errors[0] );
274
  }
275
  }
64
  */
65
  public function connect( $fields = array() ) {
66
  $response = array(
67
+ 'error' => false,
68
+ 'data' => array(),
69
  );
70
 
71
  // Make sure we have a username.
73
  $response['error'] = __( 'Error: You must provide a username.', 'fl-builder' );
74
  } elseif ( ! isset( $fields['app_id'] ) || empty( $fields['app_id'] ) ) {
75
  $response['error'] = __( 'Error: You must provide a app ID.', 'fl-builder' );
76
+ } elseif ( ! isset( $fields['app_password'] ) || empty( $fields['app_password'] ) ) { // Make sure we have an app password.
 
77
  $response['error'] = __( 'Error: You must provide a app password.', 'fl-builder' );
78
+ } else { // Try to connect and store the connection data.
 
79
 
80
  $api = $this->get_api( array(
81
  'apiUsername' => $fields['username'],
86
  try {
87
  $api->getLists();
88
  $response['data'] = array(
89
+ 'username' => $fields['username'],
90
+ 'app_id' => $fields['app_id'],
91
+ 'app_password' => $fields['app_password'],
92
  );
93
  } catch ( Exception $e ) {
94
+ $errors = $api->getErrors();
95
  $response['error'] = sprintf( __( 'Error: Could not connect to iContact. %s', 'fl-builder' ), $errors[0] );
96
  }
97
  }
109
  ob_start();
110
 
111
  FLBuilder::render_settings_field( 'username', array(
112
+ 'row_class' => 'fl-builder-service-connect-row',
113
+ 'class' => 'fl-builder-service-connect-input',
114
+ 'type' => 'text',
115
+ 'label' => __( 'Username', 'fl-builder' ),
116
+ 'help' => __( 'Your iContact username.', 'fl-builder' ),
117
+ 'preview' => array(
118
+ 'type' => 'none',
119
  ),
120
  ));
121
 
122
  FLBuilder::render_settings_field( 'app_id', array(
123
+ 'row_class' => 'fl-builder-service-connect-row',
124
+ 'class' => 'fl-builder-service-connect-input',
125
+ 'type' => 'text',
126
+ 'label' => __( 'App ID', 'fl-builder' ),
127
+ 'help' => __( 'Your iContact app ID.', 'fl-builder' ),
128
+ 'preview' => array(
129
+ 'type' => 'none',
130
  ),
131
  ));
132
 
133
  FLBuilder::render_settings_field( 'app_password', array(
134
+ 'row_class' => 'fl-builder-service-connect-row',
135
+ 'class' => 'fl-builder-service-connect-input',
136
+ 'type' => 'text',
137
+ 'label' => __( 'App Password', 'fl-builder' ),
138
+ 'help' => __( 'Your iContact app password.', 'fl-builder' ),
139
+ 'description' => sprintf( __( 'You must <a%1$s>create an app</a> in iContact to obtain an app ID and password. Please see <a%2$s>the iContact docs</a> for complete instructions.', 'fl-builder' ), ' href="https://app.icontact.com/icp/core/registerapp/" target="_blank"', ' href="http://www.icontact.com/developerportal/api-documentation/vocus-register-your-app/" target="_blank"' ),
140
+ 'preview' => array(
141
+ 'type' => 'none',
142
  ),
143
  ));
144
 
157
  * }
158
  */
159
  public function render_fields( $account, $settings ) {
160
+ $account_data = $this->get_account_data( $account );
161
+ $api = $this->get_api( array(
162
+ 'apiUsername' => $account_data['username'],
163
+ 'appId' => $account_data['app_id'],
164
+ 'apiPassword' => $account_data['app_password'],
165
  ));
166
+ $response = array(
167
+ 'error' => false,
168
+ 'html' => '',
169
  );
170
 
171
  try {
172
+ $lists = $api->getLists();
173
  $response['html'] = $this->render_list_field( $lists, $settings );
174
  } catch ( Exception $e ) {
175
+ $errors = $api->getErrors();
176
  $response['error'] = sprintf( __( 'Error: Could not connect to iContact. %s', 'fl-builder' ), $errors[0] );
177
  }
178
 
201
  }
202
 
203
  FLBuilder::render_settings_field( 'list_id', array(
204
+ 'row_class' => 'fl-builder-service-field-row',
205
+ 'class' => 'fl-builder-service-list-select',
206
+ 'type' => 'select',
207
+ 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
208
+ 'options' => $options,
209
+ 'preview' => array(
210
+ 'type' => 'none',
211
  ),
212
  ), $settings);
213
 
235
  $response['error'] = __( 'There was an error subscribing to iContact. The account is no longer connected.', 'fl-builder' );
236
  } else {
237
 
238
+ $data = array(
239
  'email' => $email,
240
  );
241
+ $api = $this->get_api( array(
242
+ 'apiUsername' => $account_data['username'],
243
+ 'appId' => $account_data['app_id'],
244
+ 'apiPassword' => $account_data['app_password'],
245
  ));
246
 
247
  try {
248
 
249
  if ( $name ) {
250
 
251
+ $names = explode( ' ', $name );
252
  $data['first_name'] = null;
253
  $data['last_name'] = null;
254
 
267
  // @codingStandardsIgnoreLine
268
  $api->subscribeContactToList( $result->contactId, $settings->list_id );
269
  } catch ( Exception $e ) {
270
+ $errors = $api->getErrors();
271
  $response['error'] = sprintf( __( 'There was an error subscribing to iContact. %s', 'fl-builder' ), $errors[0] );
272
  }
273
  }
classes/class-fl-builder-service-infusionsoft.php CHANGED
@@ -42,7 +42,7 @@ final class FLBuilderServiceInfusionsoft extends FLBuilderService {
42
  $this->api_instance = new iSDK();
43
  $this->api_instance->cfgCon( $app_id, $api_key, 'throw' );
44
  } catch ( iSDKException $e ) {
45
- $this->api_instance = new stdClass();
46
  $this->api_instance->error = sprintf(
47
  __( 'There was an error connecting to Infusionsoft. %s', 'fl-builder' ),
48
  $e->getMessage()
@@ -57,18 +57,18 @@ final class FLBuilderServiceInfusionsoft extends FLBuilderService {
57
  *
58
  * @since 1.5.7
59
  * @param array $fields {
60
- * @type string $app_id A valid app ID.
61
- * @type string $api_key A valid API key.
62
  * }
63
  * @return array{
64
- * @type bool|string $error The error message or false if no error.
65
- * @type array $data An array of data used to make the connection.
66
  * }
67
  */
68
  public function connect( $fields = array() ) {
69
  $response = array(
70
- 'error' => false,
71
- 'data' => array(),
72
  );
73
 
74
  // Make sure we have an API key.
@@ -76,8 +76,7 @@ final class FLBuilderServiceInfusionsoft extends FLBuilderService {
76
  $response['error'] = __( 'Error: You must provide an API key.', 'fl-builder' );
77
  } elseif ( ! isset( $fields['app_id'] ) || empty( $fields['app_id'] ) ) {
78
  $response['error'] = __( 'Error: You must provide an app ID.', 'fl-builder' );
79
- } // Try to connect and store the connection data.
80
- else {
81
 
82
  $api = $this->get_api( $fields['app_id'], $fields['api_key'] );
83
 
@@ -104,24 +103,24 @@ final class FLBuilderServiceInfusionsoft extends FLBuilderService {
104
  ob_start();
105
 
106
  FLBuilder::render_settings_field( 'app_id', array(
107
- 'row_class' => 'fl-builder-service-connect-row',
108
- 'class' => 'fl-builder-service-connect-input',
109
- 'type' => 'text',
110
- 'label' => __( 'App ID', 'fl-builder' ),
111
- 'help' => __( 'Your App ID can be found in the URL for your account. For example, if the URL for your account is myaccount.infusionsoft.com, your App ID would be <strong>myaccount</strong>.', 'fl-builder' ),
112
- 'preview' => array(
113
- 'type' => 'none',
114
  ),
115
  ));
116
 
117
  FLBuilder::render_settings_field( 'api_key', array(
118
- 'row_class' => 'fl-builder-service-connect-row',
119
- 'class' => 'fl-builder-service-connect-input',
120
- 'type' => 'text',
121
- 'label' => __( 'API Key', 'fl-builder' ),
122
- 'help' => __( 'Your API key can be found in your Infusionsoft account under Admin > Settings > Application > API > Encrypted Key.', 'fl-builder' ),
123
- 'preview' => array(
124
- 'type' => 'none',
125
  ),
126
  ));
127
 
@@ -135,18 +134,18 @@ final class FLBuilderServiceInfusionsoft extends FLBuilderService {
135
  * @param string $account The name of the saved account.
136
  * @param object $settings Saved module settings.
137
  * @return array {
138
- * @type bool|string $error The error message or false if no error.
139
- * @type string $html The field markup.
140
  * }
141
  */
142
  public function render_fields( $account, $settings ) {
143
- $account_data = $this->get_account_data( $account );
144
- $api = $this->get_api( $account_data['app_id'], $account_data['api_key'] );
145
- $page = 0;
146
- $lists = array();
147
- $response = array(
148
- 'error' => false,
149
- 'html' => '',
150
  );
151
 
152
  if ( isset( $api->error ) ) {
@@ -201,13 +200,13 @@ final class FLBuilderServiceInfusionsoft extends FLBuilderService {
201
  }
202
 
203
  FLBuilder::render_settings_field( 'list_id', array(
204
- 'row_class' => 'fl-builder-service-field-row',
205
- 'class' => 'fl-builder-service-list-select',
206
- 'type' => 'select',
207
- 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
208
- 'options' => $options,
209
- 'preview' => array(
210
- 'type' => 'none',
211
  ),
212
  ), $settings);
213
 
@@ -222,15 +221,15 @@ final class FLBuilderServiceInfusionsoft extends FLBuilderService {
222
  * @param string $email The email to subscribe.
223
  * @param string $name Optional. The full name of the person subscribing.
224
  * @return array {
225
- * @type bool|string $error The error message or false if no error.
226
  * }
227
  */
228
  public function subscribe( $settings, $email, $name = false ) {
229
  $account_data = $this->get_account_data( $settings->service_account );
230
- $response = array(
231
  'error' => false,
232
  );
233
- $data = array();
234
 
235
  if ( ! $account_data ) {
236
  $response['error'] = __( 'There was an error subscribing to Infusionsoft. The account is no longer connected.', 'fl-builder' );
@@ -249,13 +248,13 @@ final class FLBuilderServiceInfusionsoft extends FLBuilderService {
249
  if ( isset( $names[0] ) && isset( $names[1] ) ) {
250
  $data = array(
251
  'FirstName' => $names[0],
252
- 'LastName' => $names[1],
253
- 'Email' => $email,
254
  );
255
  } else {
256
  $data = array(
257
  'FirstName' => $name,
258
- 'Email' => $email,
259
  );
260
  }
261
  } else {
@@ -274,7 +273,7 @@ final class FLBuilderServiceInfusionsoft extends FLBuilderService {
274
  $group = $api->grpAssign( $contact[0]['Id'], $settings->list_id );
275
  } else {
276
  $contact_id = $api->addCon( $data );
277
- $group_add = $api->grpAssign( $contact_id, $settings->list_id );
278
  }
279
  } catch ( iSDKException $e ) {
280
  $response['error'] = sprintf(
42
  $this->api_instance = new iSDK();
43
  $this->api_instance->cfgCon( $app_id, $api_key, 'throw' );
44
  } catch ( iSDKException $e ) {
45
+ $this->api_instance = new stdClass();
46
  $this->api_instance->error = sprintf(
47
  __( 'There was an error connecting to Infusionsoft. %s', 'fl-builder' ),
48
  $e->getMessage()
57
  *
58
  * @since 1.5.7
59
  * @param array $fields {
60
+ * @type string $app_id A valid app ID.
61
+ * @type string $api_key A valid API key.
62
  * }
63
  * @return array{
64
+ * @type bool|string $error The error message or false if no error.
65
+ * @type array $data An array of data used to make the connection.
66
  * }
67
  */
68
  public function connect( $fields = array() ) {
69
  $response = array(
70
+ 'error' => false,
71
+ 'data' => array(),
72
  );
73
 
74
  // Make sure we have an API key.
76
  $response['error'] = __( 'Error: You must provide an API key.', 'fl-builder' );
77
  } elseif ( ! isset( $fields['app_id'] ) || empty( $fields['app_id'] ) ) {
78
  $response['error'] = __( 'Error: You must provide an app ID.', 'fl-builder' );
79
+ } else { // Try to connect and store the connection data.
 
80
 
81
  $api = $this->get_api( $fields['app_id'], $fields['api_key'] );
82
 
103
  ob_start();
104
 
105
  FLBuilder::render_settings_field( 'app_id', array(
106
+ 'row_class' => 'fl-builder-service-connect-row',
107
+ 'class' => 'fl-builder-service-connect-input',
108
+ 'type' => 'text',
109
+ 'label' => __( 'App ID', 'fl-builder' ),
110
+ 'help' => __( 'Your App ID can be found in the URL for your account. For example, if the URL for your account is myaccount.infusionsoft.com, your App ID would be <strong>myaccount</strong>.', 'fl-builder' ),
111
+ 'preview' => array(
112
+ 'type' => 'none',
113
  ),
114
  ));
115
 
116
  FLBuilder::render_settings_field( 'api_key', array(
117
+ 'row_class' => 'fl-builder-service-connect-row',
118
+ 'class' => 'fl-builder-service-connect-input',
119
+ 'type' => 'text',
120
+ 'label' => __( 'API Key', 'fl-builder' ),
121
+ 'help' => __( 'Your API key can be found in your Infusionsoft account under Admin > Settings > Application > API > Encrypted Key.', 'fl-builder' ),
122
+ 'preview' => array(
123
+ 'type' => 'none',
124
  ),
125
  ));
126
 
134
  * @param string $account The name of the saved account.
135
  * @param object $settings Saved module settings.
136
  * @return array {
137
+ * @type bool|string $error The error message or false if no error.
138
+ * @type string $html The field markup.
139
  * }
140
  */
141
  public function render_fields( $account, $settings ) {
142
+ $account_data = $this->get_account_data( $account );
143
+ $api = $this->get_api( $account_data['app_id'], $account_data['api_key'] );
144
+ $page = 0;
145
+ $lists = array();
146
+ $response = array(
147
+ 'error' => false,
148
+ 'html' => '',
149
  );
150
 
151
  if ( isset( $api->error ) ) {
200
  }
201
 
202
  FLBuilder::render_settings_field( 'list_id', array(
203
+ 'row_class' => 'fl-builder-service-field-row',
204
+ 'class' => 'fl-builder-service-list-select',
205
+ 'type' => 'select',
206
+ 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
207
+ 'options' => $options,
208
+ 'preview' => array(
209
+ 'type' => 'none',
210
  ),
211
  ), $settings);
212
 
221
  * @param string $email The email to subscribe.
222
  * @param string $name Optional. The full name of the person subscribing.
223
  * @return array {
224
+ * @type bool|string $error The error message or false if no error.
225
  * }
226
  */
227
  public function subscribe( $settings, $email, $name = false ) {
228
  $account_data = $this->get_account_data( $settings->service_account );
229
+ $response = array(
230
  'error' => false,
231
  );
232
+ $data = array();
233
 
234
  if ( ! $account_data ) {
235
  $response['error'] = __( 'There was an error subscribing to Infusionsoft. The account is no longer connected.', 'fl-builder' );
248
  if ( isset( $names[0] ) && isset( $names[1] ) ) {
249
  $data = array(
250
  'FirstName' => $names[0],
251
+ 'LastName' => $names[1],
252
+ 'Email' => $email,
253
  );
254
  } else {
255
  $data = array(
256
  'FirstName' => $name,
257
+ 'Email' => $email,
258
  );
259
  }
260
  } else {
273
  $group = $api->grpAssign( $contact[0]['Id'], $settings->list_id );
274
  } else {
275
  $contact_id = $api->addCon( $data );
276
+ $group_add = $api->grpAssign( $contact_id, $settings->list_id );
277
  }
278
  } catch ( iSDKException $e ) {
279
  $response['error'] = sprintf(
classes/class-fl-builder-service-madmimi.php CHANGED
@@ -58,8 +58,8 @@ final class FLBuilderServiceMadMimi extends FLBuilderService {
58
  */
59
  public function connect( $fields = array() ) {
60
  $response = array(
61
- 'error' => false,
62
- 'data' => array(),
63
  );
64
 
65
  // Make sure we have an email address.
@@ -67,8 +67,7 @@ final class FLBuilderServiceMadMimi extends FLBuilderService {
67
  $response['error'] = __( 'Error: You must provide an email address.', 'fl-builder' );
68
  } elseif ( ! isset( $fields['api_key'] ) || empty( $fields['api_key'] ) ) {
69
  $response['error'] = __( 'Error: You must provide an API key.', 'fl-builder' );
70
- } // Try to connect and store the connection data.
71
- else {
72
 
73
  $api = $this->get_api( $fields['api_email'], $fields['api_key'] );
74
 
@@ -79,7 +78,7 @@ final class FLBuilderServiceMadMimi extends FLBuilderService {
79
  } else {
80
  $response['data'] = array(
81
  'api_email' => $fields['api_email'],
82
- 'api_key' => $fields['api_key'],
83
  );
84
  }
85
  }
@@ -97,24 +96,24 @@ final class FLBuilderServiceMadMimi extends FLBuilderService {
97
  ob_start();
98
 
99
  FLBuilder::render_settings_field( 'api_email', array(
100
- 'row_class' => 'fl-builder-service-connect-row',
101
- 'class' => 'fl-builder-service-connect-input',
102
- 'type' => 'text',
103
- 'label' => __( 'Email Address', 'fl-builder' ),
104
- 'help' => __( 'The email address associated with your Mad Mimi account.', 'fl-builder' ),
105
- 'preview' => array(
106
- 'type' => 'none',
107
  ),
108
  ));
109
 
110
  FLBuilder::render_settings_field( 'api_key', array(
111
- 'row_class' => 'fl-builder-service-connect-row',
112
- 'class' => 'fl-builder-service-connect-input',
113
- 'type' => 'text',
114
- 'label' => __( 'API Key', 'fl-builder' ),
115
- 'help' => __( 'Your API key can be found in your Mad Mimi account under Account > Settings &amp; Billing > API.', 'fl-builder' ),
116
- 'preview' => array(
117
- 'type' => 'none',
118
  ),
119
  ));
120
 
@@ -133,11 +132,11 @@ final class FLBuilderServiceMadMimi extends FLBuilderService {
133
  * }
134
  */
135
  public function render_fields( $account, $settings ) {
136
- $account_data = $this->get_account_data( $account );
137
- $api = $this->get_api( $account_data['api_email'], $account_data['api_key'] );
138
- $response = array(
139
- 'error' => false,
140
- 'html' => '',
141
  );
142
 
143
  libxml_use_internal_errors( true );
@@ -174,13 +173,13 @@ final class FLBuilderServiceMadMimi extends FLBuilderService {
174
  }
175
 
176
  FLBuilder::render_settings_field( 'list_id', array(
177
- 'row_class' => 'fl-builder-service-field-row',
178
- 'class' => 'fl-builder-service-list-select',
179
- 'type' => 'select',
180
- 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
181
- 'options' => $options,
182
- 'preview' => array(
183
- 'type' => 'none',
184
  ),
185
  ), $settings);
186
 
@@ -208,10 +207,10 @@ final class FLBuilderServiceMadMimi extends FLBuilderService {
208
  $response['error'] = __( 'There was an error subscribing to Mad Mimi. The account is no longer connected.', 'fl-builder' );
209
  } else {
210
 
211
- $api = $this->get_api( $account_data['api_email'], $account_data['api_key'] );
212
- $data = array(
213
- 'email' => $email,
214
- 'add_list' => $settings->list_id,
215
  );
216
 
217
  if ( $name ) {
58
  */
59
  public function connect( $fields = array() ) {
60
  $response = array(
61
+ 'error' => false,
62
+ 'data' => array(),
63
  );
64
 
65
  // Make sure we have an email address.
67
  $response['error'] = __( 'Error: You must provide an email address.', 'fl-builder' );
68
  } elseif ( ! isset( $fields['api_key'] ) || empty( $fields['api_key'] ) ) {
69
  $response['error'] = __( 'Error: You must provide an API key.', 'fl-builder' );
70
+ } else { // Try to connect and store the connection data.
 
71
 
72
  $api = $this->get_api( $fields['api_email'], $fields['api_key'] );
73
 
78
  } else {
79
  $response['data'] = array(
80
  'api_email' => $fields['api_email'],
81
+ 'api_key' => $fields['api_key'],
82
  );
83
  }
84
  }
96
  ob_start();
97
 
98
  FLBuilder::render_settings_field( 'api_email', array(
99
+ 'row_class' => 'fl-builder-service-connect-row',
100
+ 'class' => 'fl-builder-service-connect-input',
101
+ 'type' => 'text',
102
+ 'label' => __( 'Email Address', 'fl-builder' ),
103
+ 'help' => __( 'The email address associated with your Mad Mimi account.', 'fl-builder' ),
104
+ 'preview' => array(
105
+ 'type' => 'none',
106
  ),
107
  ));
108
 
109
  FLBuilder::render_settings_field( 'api_key', array(
110
+ 'row_class' => 'fl-builder-service-connect-row',
111
+ 'class' => 'fl-builder-service-connect-input',
112
+ 'type' => 'text',
113
+ 'label' => __( 'API Key', 'fl-builder' ),
114
+ 'help' => __( 'Your API key can be found in your Mad Mimi account under Account > Settings &amp; Billing > API.', 'fl-builder' ),
115
+ 'preview' => array(
116
+ 'type' => 'none',
117
  ),
118
  ));
119
 
132
  * }
133
  */
134
  public function render_fields( $account, $settings ) {
135
+ $account_data = $this->get_account_data( $account );
136
+ $api = $this->get_api( $account_data['api_email'], $account_data['api_key'] );
137
+ $response = array(
138
+ 'error' => false,
139
+ 'html' => '',
140
  );
141
 
142
  libxml_use_internal_errors( true );
173
  }
174
 
175
  FLBuilder::render_settings_field( 'list_id', array(
176
+ 'row_class' => 'fl-builder-service-field-row',
177
+ 'class' => 'fl-builder-service-list-select',
178
+ 'type' => 'select',
179
+ 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
180
+ 'options' => $options,
181
+ 'preview' => array(
182
+ 'type' => 'none',
183
  ),
184
  ), $settings);
185
 
207
  $response['error'] = __( 'There was an error subscribing to Mad Mimi. The account is no longer connected.', 'fl-builder' );
208
  } else {
209
 
210
+ $api = $this->get_api( $account_data['api_email'], $account_data['api_key'] );
211
+ $data = array(
212
+ 'email' => $email,
213
+ 'add_list' => $settings->list_id,
214
  );
215
 
216
  if ( $name ) {
classes/class-fl-builder-service-mailchimp.php CHANGED
@@ -56,8 +56,8 @@ final class FLBuilderServiceMailChimp extends FLBuilderService {
56
  */
57
  public function connect( $fields = array() ) {
58
  $response = array(
59
- 'error' => false,
60
- 'data' => array(),
61
  );
62
 
63
  // Make sure we have an API key.
@@ -94,13 +94,13 @@ final class FLBuilderServiceMailChimp extends FLBuilderService {
94
  ob_start();
95
 
96
  FLBuilder::render_settings_field( 'api_key', array(
97
- 'row_class' => 'fl-builder-service-connect-row',
98
- 'class' => 'fl-builder-service-connect-input',
99
- 'type' => 'text',
100
- 'label' => __( 'API Key', 'fl-builder' ),
101
- 'help' => __( 'Your API key can be found in your MailChimp account under Account > Extras > API Keys.', 'fl-builder' ),
102
- 'preview' => array(
103
- 'type' => 'none',
104
  ),
105
  ));
106
 
@@ -119,11 +119,11 @@ final class FLBuilderServiceMailChimp extends FLBuilderService {
119
  * }
120
  */
121
  public function render_fields( $account, $settings ) {
122
- $post_data = FLBuilderModel::get_post_data();
123
- $account_data = $this->get_account_data( $account );
124
- $response = array(
125
- 'error' => false,
126
- 'html' => '',
127
  );
128
 
129
  // Lists field
@@ -131,7 +131,7 @@ final class FLBuilderServiceMailChimp extends FLBuilderService {
131
  $api = $this->get_api( $account_data['api_key'] );
132
 
133
  if ( ! isset( $post_data['list_id'] ) ) {
134
- $lists = $api->getLists();
135
  $response['html'] .= $this->render_list_field( $lists, $settings );
136
  }
137
  } catch ( Exception $e ) {
@@ -149,10 +149,11 @@ final class FLBuilderServiceMailChimp extends FLBuilderService {
149
  $list_id = $settings->list_id;
150
  }
151
 
152
- $groups = $api->interestGroupings( $list_id );
153
  $response['html'] .= $this->render_groups_field( $list_id, $groups, $settings );
154
  }
155
- } catch ( Exception $e ) {}
 
156
 
157
  return $response;
158
  }
@@ -180,13 +181,13 @@ final class FLBuilderServiceMailChimp extends FLBuilderService {
180
  }
181
 
182
  FLBuilder::render_settings_field( 'list_id', array(
183
- 'row_class' => 'fl-builder-service-field-row',
184
- 'class' => 'fl-builder-service-list-select fl-builder-mailchimp-list-select',
185
- 'type' => 'select',
186
- 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
187
- 'options' => $options,
188
- 'preview' => array(
189
- 'type' => 'none',
190
  ),
191
  ), $settings);
192
 
@@ -221,14 +222,14 @@ final class FLBuilderServiceMailChimp extends FLBuilderService {
221
  }
222
 
223
  FLBuilder::render_settings_field( 'groups', array(
224
- 'row_class' => 'fl-builder-service-field-row',
225
- 'class' => 'fl-builder-mailchimp-group-select',
226
- 'type' => 'select',
227
- 'label' => _x( 'Groups', 'MailChimp list group.', 'fl-builder' ),
228
- 'multi-select' => true,
229
- 'options' => $options,
230
- 'preview' => array(
231
- 'type' => 'none',
232
  ),
233
  ), $settings);
234
 
@@ -257,7 +258,7 @@ final class FLBuilderServiceMailChimp extends FLBuilderService {
257
  } else {
258
 
259
  try {
260
- $api = $this->get_api( $account_data['api_key'] );
261
  /**
262
  * Use this filter to enable double opt-ins for MailChimp integrations.
263
  * Returning true enables double opt-ins; returning false enables single opt-ins.
@@ -265,8 +266,8 @@ final class FLBuilderServiceMailChimp extends FLBuilderService {
265
  * @see fl_builder_mailchimp_double_option
266
  * @link https://kb.wpbeaverbuilder.com/article/117-plugin-filter-reference
267
  */
268
- $double = apply_filters( 'fl_builder_mailchimp_double_option', false );
269
- $data = array(
270
  'email' => $email,
271
  'double_optin' => (bool) $double,
272
  );
@@ -308,7 +309,7 @@ final class FLBuilderServiceMailChimp extends FLBuilderService {
308
  // Get the subgroup names from the API and add to the $data array.
309
  if ( count( $groups ) > 0 ) {
310
 
311
- $subgroup_ids = array();
312
  $groups_result = $api->interestGroupings( $settings->list_id );
313
 
314
  if ( is_array( $groups_result ) && count( $groups_result ) > 0 ) {
56
  */
57
  public function connect( $fields = array() ) {
58
  $response = array(
59
+ 'error' => false,
60
+ 'data' => array(),
61
  );
62
 
63
  // Make sure we have an API key.
94
  ob_start();
95
 
96
  FLBuilder::render_settings_field( 'api_key', array(
97
+ 'row_class' => 'fl-builder-service-connect-row',
98
+ 'class' => 'fl-builder-service-connect-input',
99
+ 'type' => 'text',
100
+ 'label' => __( 'API Key', 'fl-builder' ),
101
+ 'help' => __( 'Your API key can be found in your MailChimp account under Account > Extras > API Keys.', 'fl-builder' ),
102
+ 'preview' => array(
103
+ 'type' => 'none',
104
  ),
105
  ));
106
 
119
  * }
120
  */
121
  public function render_fields( $account, $settings ) {
122
+ $post_data = FLBuilderModel::get_post_data();
123
+ $account_data = $this->get_account_data( $account );
124
+ $response = array(
125
+ 'error' => false,
126
+ 'html' => '',
127
  );
128
 
129
  // Lists field
131
  $api = $this->get_api( $account_data['api_key'] );
132
 
133
  if ( ! isset( $post_data['list_id'] ) ) {
134
+ $lists = $api->getLists();
135
  $response['html'] .= $this->render_list_field( $lists, $settings );
136
  }
137
  } catch ( Exception $e ) {
149
  $list_id = $settings->list_id;
150
  }
151
 
152
+ $groups = $api->interestGroupings( $list_id );
153
  $response['html'] .= $this->render_groups_field( $list_id, $groups, $settings );
154
  }
155
+ } catch ( Exception $e ) {
156
+ }
157
 
158
  return $response;
159
  }
181
  }
182
 
183
  FLBuilder::render_settings_field( 'list_id', array(
184
+ 'row_class' => 'fl-builder-service-field-row',
185
+ 'class' => 'fl-builder-service-list-select fl-builder-mailchimp-list-select',
186
+ 'type' => 'select',
187
+ 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
188
+ 'options' => $options,
189
+ 'preview' => array(
190
+ 'type' => 'none',
191
  ),
192
  ), $settings);
193
 
222
  }
223
 
224
  FLBuilder::render_settings_field( 'groups', array(
225
+ 'row_class' => 'fl-builder-service-field-row',
226
+ 'class' => 'fl-builder-mailchimp-group-select',
227
+ 'type' => 'select',
228
+ 'label' => _x( 'Groups', 'MailChimp list group.', 'fl-builder' ),
229
+ 'multi-select' => true,
230
+ 'options' => $options,
231
+ 'preview' => array(
232
+ 'type' => 'none',
233
  ),
234
  ), $settings);
235
 
258
  } else {
259
 
260
  try {
261
+ $api = $this->get_api( $account_data['api_key'] );
262
  /**
263
  * Use this filter to enable double opt-ins for MailChimp integrations.
264
  * Returning true enables double opt-ins; returning false enables single opt-ins.
266
  * @see fl_builder_mailchimp_double_option
267
  * @link https://kb.wpbeaverbuilder.com/article/117-plugin-filter-reference
268
  */
269
+ $double = apply_filters( 'fl_builder_mailchimp_double_option', false );
270
+ $data = array(
271
  'email' => $email,
272
  'double_optin' => (bool) $double,
273
  );
309
  // Get the subgroup names from the API and add to the $data array.
310
  if ( count( $groups ) > 0 ) {
311
 
312
+ $subgroup_ids = array();
313
  $groups_result = $api->interestGroupings( $settings->list_id );
314
 
315
  if ( is_array( $groups_result ) && count( $groups_result ) > 0 ) {
classes/class-fl-builder-service-mailerlite.php CHANGED
@@ -65,8 +65,8 @@ final class FLBuilderServiceMailerLite extends FLBuilderService {
65
  */
66
  public function connect( $fields = array() ) {
67
  $response = array(
68
- 'error' => false,
69
- 'data' => array(),
70
  );
71
 
72
  // Make sure we have an API token.
@@ -101,13 +101,13 @@ final class FLBuilderServiceMailerLite extends FLBuilderService {
101
  ob_start();
102
 
103
  FLBuilder::render_settings_field( 'api_key', array(
104
- 'row_class' => 'fl-builder-service-connect-row',
105
- 'class' => 'fl-builder-service-connect-input',
106
- 'type' => 'text',
107
- 'label' => __( 'API Key', 'fl-builder' ),
108
- 'help' => __( 'Found in your MailerLite account under Integrations > Developer API.', 'fl-builder' ),
109
- 'preview' => array(
110
- 'type' => 'none',
111
  ),
112
  ));
113
 
@@ -126,19 +126,19 @@ final class FLBuilderServiceMailerLite extends FLBuilderService {
126
  * }
127
  */
128
  public function render_fields( $account, $settings ) {
129
- $account_data = $this->get_account_data( $account );
130
- $api = $this->get_api( $account_data['api_key'] );
131
  $api->setPath( 'groups' );
132
  $get_lists = json_decode( $api->getAll() );
133
- $lists = array();
134
 
135
  if ( $get_lists && count( $get_lists ) > 0 ) {
136
  $lists = $get_lists;
137
  }
138
 
139
- $response = array(
140
- 'error' => false,
141
- 'html' => $this->render_list_field( $lists, $settings ),
142
  );
143
 
144
  return $response;
@@ -166,13 +166,13 @@ final class FLBuilderServiceMailerLite extends FLBuilderService {
166
  }
167
 
168
  FLBuilder::render_settings_field( 'list_id', array(
169
- 'row_class' => 'fl-builder-service-field-row',
170
- 'class' => 'fl-builder-service-list-select',
171
- 'type' => 'select',
172
- 'label' => _x( 'Group', 'An email list from a third party provider.', 'fl-builder' ),
173
- 'options' => $options,
174
- 'preview' => array(
175
- 'type' => 'none',
176
  ),
177
  ), $settings);
178
 
@@ -191,8 +191,8 @@ final class FLBuilderServiceMailerLite extends FLBuilderService {
191
  * }
192
  */
193
  public function subscribe( $settings, $email, $name = '' ) {
194
- $account_data = $this->get_account_data( $settings->service_account );
195
- $response = array(
196
  'error' => false,
197
  );
198
 
65
  */
66
  public function connect( $fields = array() ) {
67
  $response = array(
68
+ 'error' => false,
69
+ 'data' => array(),
70
  );
71
 
72
  // Make sure we have an API token.
101
  ob_start();
102
 
103
  FLBuilder::render_settings_field( 'api_key', array(
104
+ 'row_class' => 'fl-builder-service-connect-row',
105
+ 'class' => 'fl-builder-service-connect-input',
106
+ 'type' => 'text',
107
+ 'label' => __( 'API Key', 'fl-builder' ),
108
+ 'help' => __( 'Found in your MailerLite account under Integrations > Developer API.', 'fl-builder' ),
109
+ 'preview' => array(
110
+ 'type' => 'none',
111
  ),
112
  ));
113
 
126
  * }
127
  */
128
  public function render_fields( $account, $settings ) {
129
+ $account_data = $this->get_account_data( $account );
130
+ $api = $this->get_api( $account_data['api_key'] );
131
  $api->setPath( 'groups' );
132
  $get_lists = json_decode( $api->getAll() );
133
+ $lists = array();
134
 
135
  if ( $get_lists && count( $get_lists ) > 0 ) {
136
  $lists = $get_lists;
137
  }
138
 
139
+ $response = array(
140
+ 'error' => false,
141
+ 'html' => $this->render_list_field( $lists, $settings ),
142
  );
143
 
144
  return $response;
166
  }
167
 
168
  FLBuilder::render_settings_field( 'list_id', array(
169
+ 'row_class' => 'fl-builder-service-field-row',
170
+ 'class' => 'fl-builder-service-list-select',
171
+ 'type' => 'select',
172
+ 'label' => _x( 'Group', 'An email list from a third party provider.', 'fl-builder' ),
173
+ 'options' => $options,
174
+ 'preview' => array(
175
+ 'type' => 'none',
176
  ),
177
  ), $settings);
178
 
191
  * }
192
  */
193
  public function subscribe( $settings, $email, $name = '' ) {
194
+ $account_data = $this->get_account_data( $settings->service_account );
195
+ $response = array(
196
  'error' => false,
197
  );
198
 
classes/class-fl-builder-service-mailpoet.php CHANGED
@@ -27,8 +27,8 @@ final class FLBuilderServiceMailPoet extends FLBuilderService {
27
  */
28
  public function connect( $fields = array() ) {
29
  $response = array(
30
- 'error' => false,
31
- 'data' => array(),
32
  );
33
 
34
  return $response;
@@ -57,36 +57,36 @@ final class FLBuilderServiceMailPoet extends FLBuilderService {
57
  */
58
  public function render_fields( $account, $settings ) {
59
  $response = array(
60
- 'error' => false,
61
- 'html' => '',
62
  );
63
- $lists = array();
64
 
65
  try {
66
  // MailPoet 2+
67
  if ( class_exists( 'WYSIJA' ) ) {
68
- $list_model = WYSIJA::get( 'list', 'model' );
69
- $lists = $list_model->get( array( 'name', 'list_id' ), array(
70
  'is_enabled' => 1,
71
  ) );
72
 
73
  // MailPoet 3.0
74
  } elseif ( defined( 'MAILPOET_INITIALIZED' ) && true === MAILPOET_INITIALIZED ) {
75
 
76
- $listing = new MailPoet\Listing\Handler( '\MailPoet\Models\Segment' );
77
- $listing_data = $listing->get();
78
 
79
  if ( isset( $listing_data['items'] ) ) {
80
  foreach ( $listing_data['items'] as $segment ) {
81
  $lists[] = array(
82
- 'list_id' => $segment->id,
83
- 'name' => $segment->name,
84
  );
85
  }
86
  }
87
  }
88
 
89
- $response['html'] = self::render_list_field( $lists, $settings );
90
  } catch ( Exception $e ) {
91
  $response['error'] = __( 'There was an error retrieveing your lists.', 'fl-builder' );
92
  }
@@ -115,13 +115,13 @@ final class FLBuilderServiceMailPoet extends FLBuilderService {
115
  }
116
 
117
  FLBuilder::render_settings_field( 'list_id', array(
118
- 'row_class' => 'fl-builder-service-field-row',
119
- 'class' => 'fl-builder-service-list-select',
120
- 'type' => 'select',
121
- 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
122
- 'options' => $options,
123
- 'preview' => array(
124
- 'type' => 'none',
125
  ),
126
  ), $settings);
127
 
@@ -149,7 +149,7 @@ final class FLBuilderServiceMailPoet extends FLBuilderService {
149
 
150
  if ( ! class_exists( 'WYSIJA' )
151
  && ( ! defined( 'MAILPOET_INITIALIZED' ) || ( defined( 'MAILPOET_INITIALIZED' ) && false === MAILPOET_INITIALIZED ) )
152
- ) {
153
  $response['error'] = __( 'There was an error subscribing. MailPoet is not installed.', 'fl-builder' );
154
  } else {
155
 
@@ -188,7 +188,7 @@ final class FLBuilderServiceMailPoet extends FLBuilderService {
188
  }
189
 
190
  $subscribed = $subscriber::subscribe( $user, array( $settings->list_id ) );
191
- $errors = $subscribed->getErrors();
192
 
193
  if ( false !== $errors ) {
194
  $response['error'] = sprintf( __( 'There was an error subscribing to MailPoet. %s', 'fl-builder' ), $errors[0] );
27
  */
28
  public function connect( $fields = array() ) {
29
  $response = array(
30
+ 'error' => false,
31
+ 'data' => array(),
32
  );
33
 
34
  return $response;
57
  */
58
  public function render_fields( $account, $settings ) {
59
  $response = array(
60
+ 'error' => false,
61
+ 'html' => '',
62
  );
63
+ $lists = array();
64
 
65
  try {
66
  // MailPoet 2+
67
  if ( class_exists( 'WYSIJA' ) ) {
68
+ $list_model = WYSIJA::get( 'list', 'model' );
69
+ $lists = $list_model->get( array( 'name', 'list_id' ), array(
70
  'is_enabled' => 1,
71
  ) );
72
 
73
  // MailPoet 3.0
74
  } elseif ( defined( 'MAILPOET_INITIALIZED' ) && true === MAILPOET_INITIALIZED ) {
75
 
76
+ $listing = new MailPoet\Listing\Handler();
77
+ $listing_data = $listing->get( '\MailPoet\Models\Segment', array() );
78
 
79
  if ( isset( $listing_data['items'] ) ) {
80
  foreach ( $listing_data['items'] as $segment ) {
81
  $lists[] = array(
82
+ 'list_id' => $segment->id,
83
+ 'name' => $segment->name,
84
  );
85
  }
86
  }
87
  }
88
 
89
+ $response['html'] = self::render_list_field( $lists, $settings );
90
  } catch ( Exception $e ) {
91
  $response['error'] = __( 'There was an error retrieveing your lists.', 'fl-builder' );
92
  }
115
  }
116
 
117
  FLBuilder::render_settings_field( 'list_id', array(
118
+ 'row_class' => 'fl-builder-service-field-row',
119
+ 'class' => 'fl-builder-service-list-select',
120
+ 'type' => 'select',
121
+ 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
122
+ 'options' => $options,
123
+ 'preview' => array(
124
+ 'type' => 'none',
125
  ),
126
  ), $settings);
127
 
149
 
150
  if ( ! class_exists( 'WYSIJA' )
151
  && ( ! defined( 'MAILPOET_INITIALIZED' ) || ( defined( 'MAILPOET_INITIALIZED' ) && false === MAILPOET_INITIALIZED ) )
152
+ ) {
153
  $response['error'] = __( 'There was an error subscribing. MailPoet is not installed.', 'fl-builder' );
154
  } else {
155
 
188
  }
189
 
190
  $subscribed = $subscriber::subscribe( $user, array( $settings->list_id ) );
191
+ $errors = $subscribed->getErrors();
192
 
193
  if ( false !== $errors ) {
194
  $response['error'] = sprintf( __( 'There was an error subscribing to MailPoet. %s', 'fl-builder' ), $errors[0] );
classes/class-fl-builder-service-mailrelay.php CHANGED
@@ -38,10 +38,10 @@ final class FLBuilderServiceMailrelay extends FLBuilderService {
38
  $base_url = preg_replace( '#^https?://#', '', $base_url );
39
  $response = wp_remote_post( 'https://' . $base_url . $this->api_url, array(
40
  'timeout' => 60,
41
- 'body' => $params,
42
  ) );
43
 
44
- if ( is_wp_error( $response ) || (isset( $response->status ) && 0 == $response->status ) ) {
45
  if ( isset( $response->status ) ) {
46
  $data = json_decode( $response, true );
47
  } else {
@@ -68,8 +68,8 @@ final class FLBuilderServiceMailrelay extends FLBuilderService {
68
  */
69
  public function connect( $fields = array() ) {
70
  $response = array(
71
- 'error' => false,
72
- 'data' => array(),
73
  );
74
 
75
  // Make sure we have the Host.
@@ -77,20 +77,19 @@ final class FLBuilderServiceMailrelay extends FLBuilderService {
77
  $response['error'] = __( 'Error: You must provide a Host.', 'fl-builder' );
78
  } elseif ( ! isset( $fields['api_key'] ) || empty( $fields['api_key'] ) ) {
79
  $response['error'] = __( 'Error: You must provide an API key.', 'fl-builder' );
80
- } // Try to connect and store the connection data.
81
- else {
82
 
83
  $result = $this->get_api_response( $fields['api_host'], array(
84
- 'function' => 'getGroups',
85
- 'apiKey' => $fields['api_key'],
86
- 'offset' => 0,
87
- 'count' => 1,
88
  ) );
89
 
90
  if ( ! isset( $result['error'] ) ) {
91
  $response['data'] = array(
92
  'api_host' => $fields['api_host'],
93
- 'api_key' => $fields['api_key'],
94
  );
95
  } else {
96
  $response['error'] = sprintf( __( 'Error: Could not connect to Mailrelay. %s', 'fl-builder' ), $result['error'] );
@@ -110,24 +109,24 @@ final class FLBuilderServiceMailrelay extends FLBuilderService {
110
  ob_start();
111
 
112
  FLBuilder::render_settings_field( 'api_host', array(
113
- 'row_class' => 'fl-builder-service-connect-row',
114
- 'class' => 'fl-builder-service-connect-input',
115
- 'type' => 'text',
116
- 'label' => __( 'Host', 'fl-builder' ),
117
- 'help' => __( 'The host you chose when you signed up for your account. Check your welcome email if you forgot it. Please enter it without the initial http:// (e.g. demo.ip-zone.com).', 'fl-builder' ),
118
- 'preview' => array(
119
- 'type' => 'none',
120
  ),
121
  ));
122
 
123
  FLBuilder::render_settings_field( 'api_key', array(
124
- 'row_class' => 'fl-builder-service-connect-row',
125
- 'class' => 'fl-builder-service-connect-input',
126
- 'type' => 'text',
127
- 'label' => __( 'API Key', 'fl-builder' ),
128
- 'help' => __( 'Your API key can be found in your Mailrelay account under Menu > Settings > API access.', 'fl-builder' ),
129
- 'preview' => array(
130
- 'type' => 'none',
131
  ),
132
  ));
133
 
@@ -146,15 +145,15 @@ final class FLBuilderServiceMailrelay extends FLBuilderService {
146
  * }
147
  */
148
  public function render_fields( $account, $settings ) {
149
- $account_data = $this->get_account_data( $account );
150
- $result = $this->get_api_response( $account_data['api_host'], array(
151
- 'function' => 'getGroups',
152
- 'apiKey' => $account_data['api_key'],
153
  ) );
154
 
155
- $response = array(
156
- 'error' => false,
157
- 'html' => '',
158
  );
159
 
160
  if ( isset( $result['error'] ) ) {
@@ -187,14 +186,14 @@ final class FLBuilderServiceMailrelay extends FLBuilderService {
187
  }
188
 
189
  FLBuilder::render_settings_field( 'list_id', array(
190
- 'row_class' => 'fl-builder-service-field-row',
191
- 'class' => 'fl-builder-service-list-select',
192
- 'type' => 'select',
193
- 'multi-select' => true,
194
- 'label' => _x( 'Group', 'A list of subscribers group from a Mailrelay account.', 'fl-builder' ),
195
- 'options' => $options,
196
- 'preview' => array(
197
- 'type' => 'none',
198
  ),
199
  ), $settings);
200
 
@@ -223,11 +222,11 @@ final class FLBuilderServiceMailrelay extends FLBuilderService {
223
  } else {
224
 
225
  $result = $this->get_api_response( $account_data['api_host'], array(
226
- 'function' => 'addSubscriber',
227
- 'apiKey' => $account_data['api_key'],
228
- 'email' => $email,
229
- 'name' => $name,
230
- 'groups' => $settings->list_id,
231
  ) );
232
 
233
  if ( isset( $result['error'] ) ) {
38
  $base_url = preg_replace( '#^https?://#', '', $base_url );
39
  $response = wp_remote_post( 'https://' . $base_url . $this->api_url, array(
40
  'timeout' => 60,
41
+ 'body' => $params,
42
  ) );
43
 
44
+ if ( is_wp_error( $response ) || ( isset( $response->status ) && 0 == $response->status ) ) {
45
  if ( isset( $response->status ) ) {
46
  $data = json_decode( $response, true );
47
  } else {
68
  */
69
  public function connect( $fields = array() ) {
70
  $response = array(
71
+ 'error' => false,
72
+ 'data' => array(),
73
  );
74
 
75
  // Make sure we have the Host.
77
  $response['error'] = __( 'Error: You must provide a Host.', 'fl-builder' );
78
  } elseif ( ! isset( $fields['api_key'] ) || empty( $fields['api_key'] ) ) {
79
  $response['error'] = __( 'Error: You must provide an API key.', 'fl-builder' );
80
+ } else { // Try to connect and store the connection data.
 
81
 
82
  $result = $this->get_api_response( $fields['api_host'], array(
83
+ 'function' => 'getGroups',
84
+ 'apiKey' => $fields['api_key'],
85
+ 'offset' => 0,
86
+ 'count' => 1,
87
  ) );
88
 
89
  if ( ! isset( $result['error'] ) ) {
90
  $response['data'] = array(
91
  'api_host' => $fields['api_host'],
92
+ 'api_key' => $fields['api_key'],
93
  );
94
  } else {
95
  $response['error'] = sprintf( __( 'Error: Could not connect to Mailrelay. %s', 'fl-builder' ), $result['error'] );
109
  ob_start();
110
 
111
  FLBuilder::render_settings_field( 'api_host', array(
112
+ 'row_class' => 'fl-builder-service-connect-row',
113
+ 'class' => 'fl-builder-service-connect-input',
114
+ 'type' => 'text',
115
+ 'label' => __( 'Host', 'fl-builder' ),
116
+ 'help' => __( 'The host you chose when you signed up for your account. Check your welcome email if you forgot it. Please enter it without the initial http:// (e.g. demo.ip-zone.com).', 'fl-builder' ),
117
+ 'preview' => array(
118
+ 'type' => 'none',
119
  ),
120
  ));
121
 
122
  FLBuilder::render_settings_field( 'api_key', array(
123
+ 'row_class' => 'fl-builder-service-connect-row',
124
+ 'class' => 'fl-builder-service-connect-input',
125
+ 'type' => 'text',
126
+ 'label' => __( 'API Key', 'fl-builder' ),
127
+ 'help' => __( 'Your API key can be found in your Mailrelay account under Menu > Settings > API access.', 'fl-builder' ),
128
+ 'preview' => array(
129
+ 'type' => 'none',
130
  ),
131
  ));
132
 
145
  * }
146
  */
147
  public function render_fields( $account, $settings ) {
148
+ $account_data = $this->get_account_data( $account );
149
+ $result = $this->get_api_response( $account_data['api_host'], array(
150
+ 'function' => 'getGroups',
151
+ 'apiKey' => $account_data['api_key'],
152
  ) );
153
 
154
+ $response = array(
155
+ 'error' => false,
156
+ 'html' => '',
157
  );
158
 
159
  if ( isset( $result['error'] ) ) {
186
  }
187
 
188
  FLBuilder::render_settings_field( 'list_id', array(
189
+ 'row_class' => 'fl-builder-service-field-row',
190
+ 'class' => 'fl-builder-service-list-select',
191
+ 'type' => 'select',
192
+ 'multi-select' => true,
193
+ 'label' => _x( 'Group', 'A list of subscribers group from a Mailrelay account.', 'fl-builder' ),
194
+ 'options' => $options,
195
+ 'preview' => array(
196
+ 'type' => 'none',
197
  ),
198
  ), $settings);
199
 
222
  } else {
223
 
224
  $result = $this->get_api_response( $account_data['api_host'], array(
225
+ 'function' => 'addSubscriber',
226
+ 'apiKey' => $account_data['api_key'],
227
+ 'email' => $email,
228
+ 'name' => $name,
229
+ 'groups' => $settings->list_id,
230
  ) );
231
 
232
  if ( isset( $result['error'] ) ) {
classes/class-fl-builder-service-mautic.php CHANGED
@@ -39,9 +39,9 @@ final class FLBuilderServiceMautic extends FLBuilderService {
39
  }
40
 
41
  $settings = array(
42
- 'userName' => $args['api_username'], // The username - set up a new user for each external site
43
- 'password' => $args['api_password'], // Make this a Long passPhrase e.g. (Try: !wE4.And.*@ws4.Guess! )
44
- 'apiUrl' => $args['api_host'], // NOTE: Required for Unit tests; *must* contain a valid url
45
  );
46
 
47
  $this->api_instance = new MauticApi( $settings );
@@ -64,8 +64,8 @@ final class FLBuilderServiceMautic extends FLBuilderService {
64
  */
65
  public function connect( $fields = array() ) {
66
  $response = array(
67
- 'error' => false,
68
- 'data' => array(),
69
  );
70
 
71
  // Make sure we have the Host.
@@ -79,26 +79,25 @@ final class FLBuilderServiceMautic extends FLBuilderService {
79
  // Make sure we have password
80
  if ( ! isset( $fields['api_password'] ) || empty( $fields['api_password'] ) ) {
81
  $response['error'] = __( 'Error: You must provide your Mautic app user password.', 'fl-builder' );
82
- } // Try to connect and store the connection data.
83
- else {
84
 
85
  $api = $this->get_api( array(
86
- 'api_host' => $fields['api_host'],
87
  'api_username' => $fields['api_username'],
88
  'api_password' => $fields['api_password'],
89
  ) );
90
 
91
  // Try sending request to verify credentials
92
- $get_response = $api->getSegments( array(
93
  'limit' => 1,
94
  ) );
95
  $response_info = $api->getResponseInfo();
96
 
97
  if ( in_array( $response_info['http_code'], array( 200, 201 ) ) ) {
98
- $response['data'] = array(
99
- 'api_host' => $fields['api_host'],
100
- 'api_username' => $fields['api_username'],
101
- 'api_password' => $fields['api_password'],
102
  );
103
  } else {
104
  $error_message = $response_info['http_code'];
@@ -106,7 +105,7 @@ final class FLBuilderServiceMautic extends FLBuilderService {
106
  $error_message = '[' . $get_response['errors'][0]['code'] . '] ' . $get_response['errors'][0]['message'];
107
  }
108
 
109
- $response['error'] = sprintf( __( 'Error: Could not connect to Mautic. %s', 'fl-builder' ), $error_message );
110
  }
111
  }
112
 
@@ -123,37 +122,37 @@ final class FLBuilderServiceMautic extends FLBuilderService {
123
  ob_start();
124
 
125
  FLBuilder::render_settings_field( 'api_host', array(
126
- 'row_class' => 'fl-builder-service-connect-row',
127
- 'class' => 'fl-builder-service-connect-input',
128
- 'type' => 'text',
129
- 'label' => __( 'Installation URL', 'fl-builder' ),
130
- 'help' => __( 'The URL where your Mautic application is installed (e.g. http://mautic.mywebsite.com).', 'fl-builder' ),
131
- 'description' => __( 'API should be enabled in your Mautic application.
132
  Go to Mautic Configuration / API Settings and set `API enabled` to `Yes`, set `Enable HTTP basic auth` to `Yes` . Save changes.', 'fl-builder' ),
133
- 'preview' => array(
134
- 'type' => 'none',
135
  ),
136
  ));
137
 
138
  FLBuilder::render_settings_field( 'api_username', array(
139
- 'row_class' => 'fl-builder-service-connect-row',
140
- 'class' => 'fl-builder-service-connect-input',
141
- 'type' => 'text',
142
- 'label' => __( 'Mautic Username', 'fl-builder' ),
143
- 'help' => __( 'Username from your Mautic application. Make sure it has `Full system access`. Best practice would be to set up a new user for each external site.', 'fl-builder' ),
144
- 'preview' => array(
145
- 'type' => 'none',
146
  ),
147
  ));
148
 
149
  FLBuilder::render_settings_field( 'api_password', array(
150
- 'row_class' => 'fl-builder-service-connect-row',
151
- 'class' => 'fl-builder-service-connect-input',
152
- 'type' => 'text',
153
- 'label' => __( 'Mautic Password', 'fl-builder' ),
154
- 'help' => __( 'Password associated with the username. Make this a Long passPhrase.', 'fl-builder' ),
155
- 'preview' => array(
156
- 'type' => 'none',
157
  ),
158
  ));
159
 
@@ -172,17 +171,17 @@ final class FLBuilderServiceMautic extends FLBuilderService {
172
  * }
173
  */
174
  public function render_fields( $account, $settings ) {
175
- $account_data = $this->get_account_data( $account );
176
- $api = $this->get_api( array(
177
- 'api_host' => $account_data['api_host'],
178
- 'api_username' => $account_data['api_username'],
179
- 'api_password' => $account_data['api_password'],
180
  ) );
181
- $lists = $api->getSegments();
182
 
183
- $response = array(
184
- 'error' => false,
185
- 'html' => '',
186
  );
187
 
188
  if ( ! isset( $lists['lists'] ) ) {
@@ -215,13 +214,13 @@ final class FLBuilderServiceMautic extends FLBuilderService {
215
  }
216
 
217
  FLBuilder::render_settings_field( 'list_id', array(
218
- 'row_class' => 'fl-builder-service-field-row',
219
- 'class' => 'fl-builder-service-list-select',
220
- 'type' => 'select',
221
- 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
222
- 'options' => $options,
223
- 'preview' => array(
224
- 'type' => 'none',
225
  ),
226
  ), $settings);
227
 
@@ -250,13 +249,13 @@ final class FLBuilderServiceMautic extends FLBuilderService {
250
  } else {
251
 
252
  $api = $this->get_api( array(
253
- 'api_host' => $account_data['api_host'],
254
- 'api_username' => $account_data['api_username'],
255
- 'api_password' => $account_data['api_password'],
256
  ) );
257
 
258
  $data = array(
259
- 'email' => $email,
260
  'ipAddress' => $_SERVER['REMOTE_ADDR'],
261
  'segmentId' => $settings->list_id,
262
  );
@@ -274,7 +273,7 @@ final class FLBuilderServiceMautic extends FLBuilderService {
274
 
275
  // Add new contact
276
  $get_api_response = $api->subscribe( $data );
277
- $response_info = $api->getResponseInfo();
278
 
279
  if ( isset( $get_api_response['errors'] ) && count( $get_api_response['errors'] ) > 0 ) {
280
  $response['error'] = sprintf(
39
  }
40
 
41
  $settings = array(
42
+ 'userName' => $args['api_username'], // The username - set up a new user for each external site
43
+ 'password' => $args['api_password'], // Make this a Long passPhrase e.g. (Try: !wE4.And.*@ws4.Guess! )
44
+ 'apiUrl' => $args['api_host'], // NOTE: Required for Unit tests; *must* contain a valid url
45
  );
46
 
47
  $this->api_instance = new MauticApi( $settings );
64
  */
65
  public function connect( $fields = array() ) {
66
  $response = array(
67
+ 'error' => false,
68
+ 'data' => array(),
69
  );
70
 
71
  // Make sure we have the Host.
79
  // Make sure we have password
80
  if ( ! isset( $fields['api_password'] ) || empty( $fields['api_password'] ) ) {
81
  $response['error'] = __( 'Error: You must provide your Mautic app user password.', 'fl-builder' );
82
+ } else { // Try to connect and store the connection data.
 
83
 
84
  $api = $this->get_api( array(
85
+ 'api_host' => $fields['api_host'],
86
  'api_username' => $fields['api_username'],
87
  'api_password' => $fields['api_password'],
88
  ) );
89
 
90
  // Try sending request to verify credentials
91
+ $get_response = $api->getSegments( array(
92
  'limit' => 1,
93
  ) );
94
  $response_info = $api->getResponseInfo();
95
 
96
  if ( in_array( $response_info['http_code'], array( 200, 201 ) ) ) {
97
+ $response['data'] = array(
98
+ 'api_host' => $fields['api_host'],
99
+ 'api_username' => $fields['api_username'],
100
+ 'api_password' => $fields['api_password'],
101
  );
102
  } else {
103
  $error_message = $response_info['http_code'];
105
  $error_message = '[' . $get_response['errors'][0]['code'] . '] ' . $get_response['errors'][0]['message'];
106
  }
107
 
108
+ $response['error'] = sprintf( __( 'Error: Could not connect to Mautic. %s', 'fl-builder' ), $error_message );
109
  }
110
  }
111
 
122
  ob_start();
123
 
124
  FLBuilder::render_settings_field( 'api_host', array(
125
+ 'row_class' => 'fl-builder-service-connect-row',
126
+ 'class' => 'fl-builder-service-connect-input',
127
+ 'type' => 'text',
128
+ 'label' => __( 'Installation URL', 'fl-builder' ),
129
+ 'help' => __( 'The URL where your Mautic application is installed (e.g. http://mautic.mywebsite.com).', 'fl-builder' ),
130
+ 'description' => __( 'API should be enabled in your Mautic application.
131
  Go to Mautic Configuration / API Settings and set `API enabled` to `Yes`, set `Enable HTTP basic auth` to `Yes` . Save changes.', 'fl-builder' ),
132
+ 'preview' => array(
133
+ 'type' => 'none',
134
  ),
135
  ));
136
 
137
  FLBuilder::render_settings_field( 'api_username', array(
138
+ 'row_class' => 'fl-builder-service-connect-row',
139
+ 'class' => 'fl-builder-service-connect-input',
140
+ 'type' => 'text',
141
+ 'label' => __( 'Mautic Username', 'fl-builder' ),
142
+ 'help' => __( 'Username from your Mautic application. Make sure it has `Full system access`. Best practice would be to set up a new user for each external site.', 'fl-builder' ),
143
+ 'preview' => array(
144
+ 'type' => 'none',
145
  ),
146
  ));
147
 
148
  FLBuilder::render_settings_field( 'api_password', array(
149
+ 'row_class' => 'fl-builder-service-connect-row',
150
+ 'class' => 'fl-builder-service-connect-input',
151
+ 'type' => 'text',
152
+ 'label' => __( 'Mautic Password', 'fl-builder' ),
153
+ 'help' => __( 'Password associated with the username. Make this a Long passPhrase.', 'fl-builder' ),
154
+ 'preview' => array(
155
+ 'type' => 'none',
156
  ),
157
  ));
158
 
171
  * }
172
  */
173
  public function render_fields( $account, $settings ) {
174
+ $account_data = $this->get_account_data( $account );
175
+ $api = $this->get_api( array(
176
+ 'api_host' => $account_data['api_host'],
177
+ 'api_username' => $account_data['api_username'],
178
+ 'api_password' => $account_data['api_password'],
179
  ) );
180
+ $lists = $api->getSegments();
181
 
182
+ $response = array(
183
+ 'error' => false,
184
+ 'html' => '',
185
  );
186
 
187
  if ( ! isset( $lists['lists'] ) ) {
214
  }
215
 
216
  FLBuilder::render_settings_field( 'list_id', array(
217
+ 'row_class' => 'fl-builder-service-field-row',
218
+ 'class' => 'fl-builder-service-list-select',
219
+ 'type' => 'select',
220
+ 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
221
+ 'options' => $options,
222
+ 'preview' => array(
223
+ 'type' => 'none',
224
  ),
225
  ), $settings);
226
 
249
  } else {
250
 
251
  $api = $this->get_api( array(
252
+ 'api_host' => $account_data['api_host'],
253
+ 'api_username' => $account_data['api_username'],
254
+ 'api_password' => $account_data['api_password'],
255
  ) );
256
 
257
  $data = array(
258
+ 'email' => $email,
259
  'ipAddress' => $_SERVER['REMOTE_ADDR'],
260
  'segmentId' => $settings->list_id,
261
  );
273
 
274
  // Add new contact
275
  $get_api_response = $api->subscribe( $data );
276
+ $response_info = $api->getResponseInfo();
277
 
278
  if ( isset( $get_api_response['errors'] ) && count( $get_api_response['errors'] ) > 0 ) {
279
  $response['error'] = sprintf(
classes/class-fl-builder-service-ontraport.php CHANGED
@@ -59,20 +59,18 @@ final class FLBuilderServiceOntraport extends FLBuilderService {
59
  */
60
  public function connect( $fields = array() ) {
61
  $response = array(
62
- 'error' => false,
63
- 'data' => array(),
64
  );
65
 
66
  // Make sure we have an API token.
67
  if ( ! isset( $fields['app_id'] ) || empty( $fields['app_id'] ) ) {
68
  $response['error'] = __( 'Error: You must provide an APP ID.', 'fl-builder' );
69
- } // Make sure we have an Account ID.
70
- elseif ( ! isset( $fields['api_key'] ) || empty( $fields['api_key'] ) ) {
71
  $response['error'] = __( 'Error: You must provide an API key.', 'fl-builder' );
72
- } // Try to connect and store the connection data.
73
- else {
74
 
75
- $api = $this->get_api( $fields['app_id'], $fields['api_key'] );
76
 
77
  // Try to request something to authenticate the validity of APP ID and API Key
78
  $search = json_decode( $api->contact()->retrieveMultiple( array(
@@ -84,7 +82,7 @@ final class FLBuilderServiceOntraport extends FLBuilderService {
84
  if ( 200 === $status_code ) {
85
  $response['data'] = array(
86
  'api_key' => $fields['api_key'],
87
- 'app_id' => $fields['app_id'],
88
  );
89
  } else {
90
  $response['error'] = sprintf(
@@ -107,24 +105,24 @@ final class FLBuilderServiceOntraport extends FLBuilderService {
107
  ob_start();
108
 
109
  FLBuilder::render_settings_field( 'app_id', array(
110
- 'row_class' => 'fl-builder-service-connect-row',
111
- 'class' => 'fl-builder-service-connect-input',
112
- 'type' => 'text',
113
- 'label' => __( 'APP ID', 'fl-builder' ),
114
- 'help' => __( 'Your APP ID can be found in your Ontraport account.', 'fl-builder' ),
115
- 'preview' => array(
116
- 'type' => 'none',
117
  ),
118
  ));
119
 
120
  FLBuilder::render_settings_field( 'api_key', array(
121
- 'row_class' => 'fl-builder-service-connect-row',
122
- 'class' => 'fl-builder-service-connect-input',
123
- 'type' => 'text',
124
- 'label' => __( 'API Key', 'fl-builder' ),
125
- 'help' => __( 'Your API key can be found in your Ontraport account.', 'fl-builder' ),
126
- 'preview' => array(
127
- 'type' => 'none',
128
  ),
129
  ));
130
 
@@ -144,8 +142,8 @@ final class FLBuilderServiceOntraport extends FLBuilderService {
144
  */
145
  public function render_fields( $account, $settings ) {
146
  $account_data = $this->get_account_data( $account );
147
- $api = $this->get_api( $account_data['app_id'], $account_data['api_key'] );
148
- $campaigns = json_decode( $api->campaignbuilder()->retrieveMultiplePaginated( array(
149
  'listFields' => 'id, name',
150
  'start' => 0,
151
  'range' => 50,
@@ -160,9 +158,9 @@ final class FLBuilderServiceOntraport extends FLBuilderService {
160
  }
161
  }
162
 
163
- $response = array(
164
- 'error' => false,
165
- 'html' => $this->render_campaigns_field( $campaigns_list, $settings ),
166
  );
167
 
168
  return $response;
@@ -191,14 +189,14 @@ final class FLBuilderServiceOntraport extends FLBuilderService {
191
  }
192
 
193
  FLBuilder::render_settings_field( 'campaign_id', array(
194
- 'row_class' => 'fl-builder-service-field-row',
195
- 'class' => 'fl-builder-service-list-select',
196
- 'type' => 'select',
197
- 'label' => _x( 'Campaign', 'An email campaign from your Ontraport account.', 'fl-builder' ),
198
- 'options' => $options,
199
- 'default' => 0,
200
- 'preview' => array(
201
- 'type' => 'none',
202
  ),
203
  ), $settings);
204
 
@@ -226,9 +224,9 @@ final class FLBuilderServiceOntraport extends FLBuilderService {
226
  $response['error'] = __( 'There was an error subscribing to Ontraport. The account is no longer connected.', 'fl-builder' );
227
  } else {
228
 
229
- $api = $this->get_api( $account_data['app_id'], $account_data['api_key'] );
230
  $args = array(
231
- 'email' => $email,
232
  'updateCampaign' => $settings->campaign_id,
233
  );
234
 
59
  */
60
  public function connect( $fields = array() ) {
61
  $response = array(
62
+ 'error' => false,
63
+ 'data' => array(),
64
  );
65
 
66
  // Make sure we have an API token.
67
  if ( ! isset( $fields['app_id'] ) || empty( $fields['app_id'] ) ) {
68
  $response['error'] = __( 'Error: You must provide an APP ID.', 'fl-builder' );
69
+ } elseif ( ! isset( $fields['api_key'] ) || empty( $fields['api_key'] ) ) { // Make sure we have an Account ID.
 
70
  $response['error'] = __( 'Error: You must provide an API key.', 'fl-builder' );
71
+ } else { // Try to connect and store the connection data.
 
72
 
73
+ $api = $this->get_api( $fields['app_id'], $fields['api_key'] );
74
 
75
  // Try to request something to authenticate the validity of APP ID and API Key
76
  $search = json_decode( $api->contact()->retrieveMultiple( array(
82
  if ( 200 === $status_code ) {
83
  $response['data'] = array(
84
  'api_key' => $fields['api_key'],
85
+ 'app_id' => $fields['app_id'],
86
  );
87
  } else {
88
  $response['error'] = sprintf(
105
  ob_start();
106
 
107
  FLBuilder::render_settings_field( 'app_id', array(
108
+ 'row_class' => 'fl-builder-service-connect-row',
109
+ 'class' => 'fl-builder-service-connect-input',
110
+ 'type' => 'text',
111
+ 'label' => __( 'APP ID', 'fl-builder' ),
112
+ 'help' => __( 'Your APP ID can be found in your Ontraport account.', 'fl-builder' ),
113
+ 'preview' => array(
114
+ 'type' => 'none',
115
  ),
116
  ));
117
 
118
  FLBuilder::render_settings_field( 'api_key', array(
119
+ 'row_class' => 'fl-builder-service-connect-row',
120
+ 'class' => 'fl-builder-service-connect-input',
121
+ 'type' => 'text',
122
+ 'label' => __( 'API Key', 'fl-builder' ),
123
+ 'help' => __( 'Your API key can be found in your Ontraport account.', 'fl-builder' ),
124
+ 'preview' => array(
125
+ 'type' => 'none',
126
  ),
127
  ));
128
 
142
  */
143
  public function render_fields( $account, $settings ) {
144
  $account_data = $this->get_account_data( $account );
145
+ $api = $this->get_api( $account_data['app_id'], $account_data['api_key'] );
146
+ $campaigns = json_decode( $api->campaignbuilder()->retrieveMultiplePaginated( array(
147
  'listFields' => 'id, name',
148
  'start' => 0,
149
  'range' => 50,
158
  }
159
  }
160
 
161
+ $response = array(
162
+ 'error' => false,
163
+ 'html' => $this->render_campaigns_field( $campaigns_list, $settings ),
164
  );
165
 
166
  return $response;
189
  }
190
 
191
  FLBuilder::render_settings_field( 'campaign_id', array(
192
+ 'row_class' => 'fl-builder-service-field-row',
193
+ 'class' => 'fl-builder-service-list-select',
194
+ 'type' => 'select',
195
+ 'label' => _x( 'Campaign', 'An email campaign from your Ontraport account.', 'fl-builder' ),
196
+ 'options' => $options,
197
+ 'default' => 0,
198
+ 'preview' => array(
199
+ 'type' => 'none',
200
  ),
201
  ), $settings);
202
 
224
  $response['error'] = __( 'There was an error subscribing to Ontraport. The account is no longer connected.', 'fl-builder' );
225
  } else {
226
 
227
+ $api = $this->get_api( $account_data['app_id'], $account_data['api_key'] );
228
  $args = array(
229
+ 'email' => $email,
230
  'updateCampaign' => $settings->campaign_id,
231
  );
232
 
classes/class-fl-builder-service-sendinblue.php CHANGED
@@ -56,8 +56,8 @@ final class FLBuilderServiceSendinBlue extends FLBuilderService {
56
  */
57
  public function connect( $fields = array() ) {
58
  $response = array(
59
- 'error' => false,
60
- 'data' => array(),
61
  );
62
 
63
  // Make sure we have an access key.
@@ -92,13 +92,13 @@ final class FLBuilderServiceSendinBlue extends FLBuilderService {
92
  ob_start();
93
 
94
  FLBuilder::render_settings_field( 'access_key', array(
95
- 'row_class' => 'fl-builder-service-connect-row',
96
- 'class' => 'fl-builder-service-connect-input',
97
- 'type' => 'text',
98
- 'label' => __( 'Access Key', 'fl-builder' ),
99
- 'help' => __( 'Your Access Key can be found in your SendinBlue account under API & Integration > Manager Your Keys > Version 2.0 > Access Key.', 'fl-builder' ),
100
- 'preview' => array(
101
- 'type' => 'none',
102
  ),
103
  ));
104
 
@@ -117,11 +117,11 @@ final class FLBuilderServiceSendinBlue extends FLBuilderService {
117
  * }
118
  */
119
  public function render_fields( $account, $settings ) {
120
- $account_data = $this->get_account_data( $account );
121
- $api = $this->get_api( $account_data['access_key'] );
122
- $response = array(
123
- 'error' => false,
124
- 'html' => '',
125
  );
126
 
127
  $result = $api->get_lists( 1, 50 );
@@ -158,13 +158,13 @@ final class FLBuilderServiceSendinBlue extends FLBuilderService {
158
  }
159
 
160
  FLBuilder::render_settings_field( 'list_id', array(
161
- 'row_class' => 'fl-builder-service-field-row',
162
- 'class' => 'fl-builder-service-list-select',
163
- 'type' => 'select',
164
- 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
165
- 'options' => $options,
166
- 'preview' => array(
167
- 'type' => 'none',
168
  ),
169
  ), $settings);
170
 
56
  */
57
  public function connect( $fields = array() ) {
58
  $response = array(
59
+ 'error' => false,
60
+ 'data' => array(),
61
  );
62
 
63
  // Make sure we have an access key.
92
  ob_start();
93
 
94
  FLBuilder::render_settings_field( 'access_key', array(
95
+ 'row_class' => 'fl-builder-service-connect-row',
96
+ 'class' => 'fl-builder-service-connect-input',
97
+ 'type' => 'text',
98
+ 'label' => __( 'Access Key', 'fl-builder' ),
99
+ 'help' => __( 'Your Access Key can be found in your SendinBlue account under API & Integration > Manager Your Keys > Version 2.0 > Access Key.', 'fl-builder' ),
100
+ 'preview' => array(
101
+ 'type' => 'none',
102
  ),
103
  ));
104
 
117
  * }
118
  */
119
  public function render_fields( $account, $settings ) {
120
+ $account_data = $this->get_account_data( $account );
121
+ $api = $this->get_api( $account_data['access_key'] );
122
+ $response = array(
123
+ 'error' => false,
124
+ 'html' => '',
125
  );
126
 
127
  $result = $api->get_lists( 1, 50 );
158
  }
159
 
160
  FLBuilder::render_settings_field( 'list_id', array(
161
+ 'row_class' => 'fl-builder-service-field-row',
162
+ 'class' => 'fl-builder-service-list-select',
163
+ 'type' => 'select',
164
+ 'label' => _x( 'List', 'An email list from a third party provider.', 'fl-builder' ),
165
+ 'options' => $options,
166
+ 'preview' => array(
167
+ 'type' => 'none',
168
  ),
169
  ), $settings);
170
 
classes/class-fl-builder-service-sendy.php CHANGED
@@ -57,8 +57,8 @@ final class FLBuilderServiceSendy extends FLBuilderService {
57
  */
58
  public function connect( $fields = array() ) {
59
  $response = array(
60
- 'error' => false,
61
- 'data' => array(),
62
  );
63
 
64
  // Make sure we have the Host.
@@ -76,8 +76,8 @@ final class FLBuilderServiceSendy extends FLBuilderService {
76
 
77
  $api = $this->get_api( array(
78
  'installation_url' => $fields['api_host'],
79
- 'api_key' => $fields['api_key'],
80
- 'list_id' => $fields['list_id'],
81
  ) );
82
 
83
  // Send request for list ID validation
@@ -86,8 +86,8 @@ final class FLBuilderServiceSendy extends FLBuilderService {
86
  if ( true === $get_api_response['status'] ) {
87
  $response['data'] = array(
88
  'api_host' => $fields['api_host'],
89
- 'api_key' => $fields['api_key'],
90
- 'list_id' => $fields['list_id'],
91
  );
92
  } else {
93
  $response['error'] = sprintf( __( 'Error: Could not connect to Sendy. %s', 'fl-builder' ), $get_api_response['message'] );
@@ -107,35 +107,35 @@ final class FLBuilderServiceSendy extends FLBuilderService {
107
  ob_start();
108
 
109
  FLBuilder::render_settings_field( 'api_host', array(
110
- 'row_class' => 'fl-builder-service-connect-row',
111
- 'class' => 'fl-builder-service-connect-input',
112
- 'type' => 'text',
113
- 'label' => __( 'Installation URL', 'fl-builder' ),
114
- 'help' => __( 'The URL where your Sendy application is installed (e.g. http://mywebsite.com/sendy).', 'fl-builder' ),
115
- 'preview' => array(
116
- 'type' => 'none',
117
  ),
118
  ));
119
 
120
  FLBuilder::render_settings_field( 'api_key', array(
121
- 'row_class' => 'fl-builder-service-connect-row',
122
- 'class' => 'fl-builder-service-connect-input',
123
- 'type' => 'text',
124
- 'label' => __( 'API Key', 'fl-builder' ),
125
- 'help' => __( 'Found in your Sendy application under Settings.', 'fl-builder' ),
126
- 'preview' => array(
127
- 'type' => 'none',
128
  ),
129
  ));
130
 
131
  FLBuilder::render_settings_field( 'list_id', array(
132
- 'row_class' => 'fl-builder-service-connect-row',
133
- 'class' => 'fl-builder-service-connect-input',
134
- 'type' => 'text',
135
- 'label' => __( 'List ID', 'fl-builder' ),
136
- 'help' => __( 'The ID of the list you would like users to subscribe to. The ID of a list can be found under "View all lists" in the section named ID.', 'fl-builder' ),
137
- 'preview' => array(
138
- 'type' => 'none',
139
  ),
140
  ));
141
 
@@ -155,9 +155,9 @@ final class FLBuilderServiceSendy extends FLBuilderService {
155
  */
156
  public function render_fields( $account, $settings ) {
157
 
158
- $response = array(
159
- 'error' => false,
160
- 'html' => '',
161
  );
162
 
163
  return $response;
@@ -186,13 +186,13 @@ final class FLBuilderServiceSendy extends FLBuilderService {
186
 
187
  $api = $this->get_api( array(
188
  'installation_url' => $account_data['api_host'],
189
- 'api_key' => $account_data['api_key'],
190
- 'list_id' => $account_data['list_id'],
191
  ) );
192
 
193
  // Send request for list ID validation
194
  $get_api_response = $api->subscribe( array(
195
- 'name' => $name,
196
  'email' => $email,
197
  ) );
198
 
57
  */
58
  public function connect( $fields = array() ) {
59
  $response = array(
60
+ 'error' => false,
61
+ 'data' => array(),
62
  );
63
 
64
  // Make sure we have the Host.
76
 
77
  $api = $this->get_api( array(
78
  'installation_url' => $fields['api_host'],
79
+ 'api_key' => $fields['api_key'],
80
+ 'list_id' => $fields['list_id'],
81
  ) );
82
 
83
  // Send request for list ID validation
86
  if ( true === $get_api_response['status'] ) {
87
  $response['data'] = array(
88
  'api_host' => $fields['api_host'],
89
+ 'api_key' => $fields['api_key'],
90
+ 'list_id' => $fields['list_id'],
91
  );
92
  } else {
93
  $response['error'] = sprintf( __( 'Error: Could not connect to Sendy. %s', 'fl-builder' ), $get_api_response['message'] );
107
  ob_start();
108
 
109
  FLBuilder::render_settings_field( 'api_host', array(
110
+ 'row_class' => 'fl-builder-service-connect-row',
111
+ 'class' => 'fl-builder-service-connect-input',
112
+ 'type' => 'text',
113
+ 'label' => __( 'Installation URL', 'fl-builder' ),
114
+ 'help' => __( 'The URL where your Sendy application is installed (e.g. http://mywebsite.com/sendy).', 'fl-builder' ),
115
+ 'preview' => array(
116
+ 'type' => 'none',
117
  ),
118
  ));
119
 
120
  FLBuilder::render_settings_field( 'api_key', array(
121
+ 'row_class' => 'fl-builder-service-connect-row',
122
+ 'class' => 'fl-builder-service-connect-input',
123
+ 'type' => 'text',
124
+ 'label' => __( 'API Key', 'fl-builder' ),
125
+ 'help' => __( 'Found in your Sendy application under Settings.', 'fl-builder' ),
126
+ 'preview' => array(
127
+ 'type' => 'none',
128
  ),
129
  ));
130
 
131
  FLBuilder::render_settings_field( 'list_id', array(
132
+ 'row_class' => 'fl-builder-service-connect-row',
133
+ 'class' => 'fl-builder-service-connect-input',
134
+ 'type' => 'text',
135
+ 'label' => __( 'List ID', 'fl-builder' ),
136
+ 'help' => __( 'The ID of the list you would like users to subscribe to. The ID of a list can be found under "View all lists" in the section named ID.', 'fl-builder' ),
137
+ 'preview' => array(
138
+ 'type' => 'none',
139
  ),
140
  ));
141
 
155
  */
156
  public function render_fields( $account, $settings ) {
157
 
158
+ $response = array(
159
+ 'error' => false,
160
+ 'html' => '',
161
  );
162
 
163
  return $response;
186
 
187
  $api = $this->get_api( array(
188
  'installation_url' => $account_data['api_host'],
189
+ 'api_key' => $account_data['api_key'],
190
+ 'list_id' => $account_data['list_id'],
191
  ) );
192
 
193
  // Send request for list ID validation
194
  $get_api_response = $api->subscribe( array(
195
+ 'name' => $name,
196
  'email' => $email,
197
  ) );
198
 
classes/class-fl-builder-services.php CHANGED
@@ -15,127 +15,127 @@ final class FLBuilderServices {
15
  * @var array $services_data
16
  */
17
  static private $services_data = array(
18
- 'activecampaign' => array(
19
- 'type' => 'autoresponder',
20
- 'name' => 'ActiveCampaign',
21
- 'class' => 'FLBuilderServiceActiveCampaign',
22
  ),
23
- 'aweber' => array(
24
- 'type' => 'autoresponder',
25
- 'name' => 'AWeber',
26
- 'class' => 'FLBuilderServiceAWeber',
27
  ),
28
- 'campaign-monitor' => array(
29
- 'type' => 'autoresponder',
30
- 'name' => 'Campaign Monitor',
31
- 'class' => 'FLBuilderServiceCampaignMonitor',
32
  ),
33
- 'campayn' => array(
34
- 'type' => 'autoresponder',
35
- 'name' => 'Campayn',
36
- 'class' => 'FLBuilderServiceCampayn',
37
  ),
38
- 'constant-contact' => array(
39
- 'type' => 'autoresponder',
40
- 'name' => 'Constant Contact',
41
- 'class' => 'FLBuilderServiceConstantContact',
42
  ),
43
- 'convertkit' => array(
44
- 'type' => 'autoresponder',
45
- 'name' => 'ConvertKit',
46
- 'class' => 'FLBuilderServiceConvertKit',
47
  ),
48
- 'drip' => array(
49
- 'type' => 'autoresponder',
50
- 'name' => 'Drip',
51
- 'class' => 'FLBuilderServiceDrip',
52
  ),
53
- 'email-address' => array(
54
- 'type' => 'autoresponder',
55
- 'name' => 'Email Address',
56
- 'class' => 'FLBuilderServiceEmailAddress',
57
  ),
58
- 'enormail' => array(
59
- 'type' => 'autoresponder',
60
- 'name' => 'Enormail',
61
- 'class' => 'FLBuilderServiceEnormail',
62
  ),
63
- 'getresponse' => array(
64
- 'type' => 'autoresponder',
65
- 'name' => 'GetResponse',
66
- 'class' => 'FLBuilderServiceGetResponse',
67
  ),
68
  'godaddy-email-marketing' => array(
69
- 'type' => 'autoresponder',
70
- 'name' => 'GoDaddy Email Marketing',
71
- 'class' => 'FLBuilderServiceGoDaddyEmailMarketing',
72
  ),
73
- 'hatchbuck' => array(
74
- 'type' => 'autoresponder',
75
- 'name' => 'Hatchbuck',
76
- 'class' => 'FLBuilderServiceHatchbuck',
77
  ),
78
- 'icontact' => array(
79
- 'type' => 'autoresponder',
80
- 'name' => 'iContact',
81
- 'class' => 'FLBuilderServiceIContact',
82
  ),
83
- 'icontact-pro' => array(
84
- 'type' => 'autoresponder',
85
- 'name' => 'iContact Pro',
86
- 'class' => 'FLBuilderServiceIContactPro',
87
  ),
88
- 'infusionsoft' => array(
89
- 'type' => 'autoresponder',
90
- 'name' => 'Infusionsoft',
91
- 'class' => 'FLBuilderServiceInfusionsoft',
92
  ),
93
- 'madmimi' => array(
94
- 'type' => 'autoresponder',
95
- 'name' => 'Mad Mimi',
96
- 'class' => 'FLBuilderServiceMadMimi',
97
  ),
98
- 'mailchimp' => array(
99
- 'type' => 'autoresponder',
100
- 'name' => 'MailChimp',
101
- 'class' => 'FLBuilderServiceMailChimp',
102
  ),
103
- 'mailerlite' => array(
104
- 'type' => 'autoresponder',
105
- 'name' => 'MailerLite',
106
- 'class' => 'FLBuilderServiceMailerLite',
107
  ),
108
- 'mailpoet' => array(
109
- 'type' => 'autoresponder',
110
- 'name' => 'MailPoet',
111
- 'class' => 'FLBuilderServiceMailPoet',
112
  ),
113
- 'mailrelay' => array(
114
- 'type' => 'autoresponder',
115
- 'name' => 'Mailrelay',
116
- 'class' => 'FLBuilderServiceMailrelay',
117
  ),
118
- 'mautic' => array(
119
- 'type' => 'autoresponder',
120
- 'name' => 'Mautic',
121
- 'class' => 'FLBuilderServiceMautic',
122
  ),
123
- 'ontraport' => array(
124
- 'type' => 'autoresponder',
125
- 'name' => 'Ontraport',
126
- 'class' => 'FLBuilderServiceOntraport',
127
- 'namespace' => true,
128
  ),
129
- 'sendinblue' => array(
130
- 'type' => 'autoresponder',
131
- 'name' => 'SendinBlue',
132
- 'class' => 'FLBuilderServiceSendinBlue',
133
  ),
134
- 'sendy' => array(
135
- 'type' => 'autoresponder',
136
- 'name' => 'Sendy',
137
- 'class' => 'FLBuilderServiceSendy',
138
- 'namespace' => true,
139
  ),
140
  );
141
 
@@ -216,8 +216,8 @@ final class FLBuilderServices {
216
  $saved_services = FLBuilderModel::get_services();
217
  $post_data = FLBuilderModel::get_post_data();
218
  $response = array(
219
- 'error' => false,
220
- 'html' => '',
221
  );
222
 
223
  // Validate the service data.
@@ -271,21 +271,21 @@ final class FLBuilderServices {
271
  * @return array The response array.
272
  */
273
  static public function render_settings() {
274
- $post_data = FLBuilderModel::get_post_data();
275
- $saved_services = FLBuilderModel::get_services();
276
- $module = FLBuilderModel::get_module( $post_data['node_id'] );
277
- $settings = $module->settings;
278
- $service = $post_data['service'];
279
- $response = array(
280
- 'error' => false,
281
- 'html' => '',
282
  );
283
 
284
  // Render the settings to connect a new account.
285
  if ( isset( $post_data['add_new'] ) || ! isset( $saved_services[ $service ] ) ) {
286
  $response['html'] = self::render_connect_settings( $service );
287
  } else {
288
- $account = isset( $settings->service_account ) ? $settings->service_account : '';
289
  $response['html'] = self::render_account_settings( $service, $account );
290
  }
291
 
@@ -303,13 +303,13 @@ final class FLBuilderServices {
303
  ob_start();
304
 
305
  FLBuilder::render_settings_field( 'service_account', array(
306
- 'row_class' => 'fl-builder-service-connect-row',
307
- 'class' => 'fl-builder-service-connect-input',
308
- 'type' => 'text',
309
- 'label' => __( 'Account Name', 'fl-builder' ),
310
- 'help' => __( 'Used to identify this connection within the accounts list and can be anything you like.', 'fl-builder' ),
311
- 'preview' => array(
312
- 'type' => 'none',
313
  ),
314
  ));
315
 
@@ -317,10 +317,10 @@ final class FLBuilderServices {
317
  echo $instance->render_connect_settings();
318
 
319
  FLBuilder::render_settings_field( 'service_connect_button', array(
320
- 'row_class' => 'fl-builder-service-connect-row',
321
- 'class' => 'fl-builder-service-connect-button',
322
- 'type' => 'button',
323
- 'label' => __( 'Connect', 'fl-builder' ),
324
  ));
325
 
326
  return ob_get_clean();
@@ -337,10 +337,10 @@ final class FLBuilderServices {
337
  static public function render_account_settings( $service, $active = '' ) {
338
  ob_start();
339
 
340
- $saved_services = FLBuilderModel::get_services();
341
- $settings = new stdClass();
342
- $settings->service_account = $active;
343
- $options = array(
344
  '' => __( 'Choose...', 'fl-builder' ),
345
  );
346
 
@@ -353,23 +353,23 @@ final class FLBuilderServices {
353
 
354
  // Render the account select.
355
  FLBuilder::render_settings_field( 'service_account', array(
356
- 'row_class' => 'fl-builder-service-account-row',
357
- 'class' => 'fl-builder-service-account-select',
358
- 'type' => 'select',
359
- 'label' => __( 'Account', 'fl-builder' ),
360
- 'options' => $options,
361
- 'preview' => array(
362
- 'type' => 'none',
363
  ),
364
  ), $settings);
365
 
366
  // Render additional service fields if we have a saved account.
367
  if ( ! empty( $active ) && isset( $saved_services[ $service ][ $active ] ) ) {
368
 
369
- $post_data = FLBuilderModel::get_post_data();
370
- $module = FLBuilderModel::get_module( $post_data['node_id'] );
371
- $instance = self::get_service_instance( $service );
372
- $response = $instance->render_fields( $active, $module->settings );
373
 
374
  if ( ! $response['error'] ) {
375
  echo $response['html'];
@@ -388,10 +388,10 @@ final class FLBuilderServices {
388
  * @return array The response array.
389
  */
390
  static public function render_fields() {
391
- $post_data = FLBuilderModel::get_post_data();
392
- $module = FLBuilderModel::get_module( $post_data['node_id'] );
393
- $instance = self::get_service_instance( $post_data['service'] );
394
- $response = $instance->render_fields( $post_data['account'], $module->settings );
395
 
396
  return $response;
397
  }
15
  * @var array $services_data
16
  */
17
  static private $services_data = array(
18
+ 'activecampaign' => array(
19
+ 'type' => 'autoresponder',
20
+ 'name' => 'ActiveCampaign',
21
+ 'class' => 'FLBuilderServiceActiveCampaign',
22
  ),
23
+ 'aweber' => array(
24
+ 'type' => 'autoresponder',
25
+ 'name' => 'AWeber',
26
+ 'class' => 'FLBuilderServiceAWeber',
27
  ),
28
+ 'campaign-monitor' => array(
29
+ 'type' => 'autoresponder',
30
+ 'name' => 'Campaign Monitor',
31
+ 'class' => 'FLBuilderServiceCampaignMonitor',
32
  ),
33
+ 'campayn' => array(
34
+ 'type' => 'autoresponder',
35
+ 'name' => 'Campayn',
36
+ 'class' => 'FLBuilderServiceCampayn',
37
  ),
38
+ 'constant-contact' => array(
39
+ 'type' => 'autoresponder',
40
+ 'name' => 'Constant Contact',
41
+ 'class' => 'FLBuilderServiceConstantContact',
42
  ),
43
+ 'convertkit' => array(
44
+ 'type' => 'autoresponder',
45
+ 'name' => 'ConvertKit',
46
+ 'class' => 'FLBuilderServiceConvertKit',
47
  ),
48
+ 'drip' => array(
49
+ 'type' => 'autoresponder',
50
+ 'name' => 'Drip',
51
+ 'class' => 'FLBuilderServiceDrip',
52
  ),
53
+ 'email-address' => array(
54
+ 'type' => 'autoresponder',
55
+ 'name' => 'Email Address',
56
+ 'class' => 'FLBuilderServiceEmailAddress',
57
  ),
58
+ 'enormail' => array(
59
+ 'type' => 'autoresponder',
60
+ 'name' => 'Enormail',
61
+ 'class' => 'FLBuilderServiceEnormail',
62
  ),
63
+ 'getresponse' => array(
64
+ 'type' => 'autoresponder',
65
+ 'name' => 'GetResponse',
66
+ 'class' => 'FLBuilderServiceGetResponse',
67
  ),
68
  'godaddy-email-marketing' => array(
69
+ 'type' => 'autoresponder',
70
+ 'name' => 'GoDaddy Email Marketing',
71
+ 'class' => 'FLBuilderServiceGoDaddyEmailMarketing',
72
  ),
73
+ 'hatchbuck' => array(
74
+ 'type' => 'autoresponder',
75
+ 'name' => 'Hatchbuck',
76
+ 'class' => 'FLBuilderServiceHatchbuck',
77
  ),
78
+ 'icontact' => array(
79
+ 'type' => 'autoresponder',
80
+ 'name' => 'iContact',
81
+ 'class' => 'FLBuilderServiceIContact',
82
  ),
83
+ 'icontact-pro' => array(
84
+ 'type' => 'autoresponder',
85
+ 'name' => 'iContact Pro',
86
+ 'class' => 'FLBuilderServiceIContactPro',
87
  ),
88
+ 'infusionsoft' => array(
89
+ 'type' => 'autoresponder',
90
+ 'name' => 'Infusionsoft',
91
+ 'class' => 'FLBuilderServiceInfusionsoft',
92
  ),
93
+ 'madmimi' => array(
94
+ 'type' => 'autoresponder',
95
+ 'name' => 'Mad Mimi',
96
+ 'class' => 'FLBuilderServiceMadMimi',
97
  ),
98
+ 'mailchimp' => array(
99
+ 'type' => 'autoresponder',
100
+ 'name' => 'MailChimp',
101
+ 'class' => 'FLBuilderServiceMailChimp',
102
  ),
103
+ 'mailerlite' => array(
104
+ 'type' => 'autoresponder',
105
+ 'name' => 'MailerLite',
106
+ 'class' => 'FLBuilderServiceMailerLite',
107
  ),
108
+ 'mailpoet' => array(
109
+ 'type' => 'autoresponder',
110
+ 'name' => 'MailPoet',
111
+ 'class' => 'FLBuilderServiceMailPoet',
112
  ),
113
+ 'mailrelay' => array(
114
+ 'type' => 'autoresponder',
115
+ 'name' => 'Mailrelay',
116
+ 'class' => 'FLBuilderServiceMailrelay',
117
  ),
118
+ 'mautic' => array(
119
+ 'type' => 'autoresponder',
120
+ 'name' => 'Mautic',
121
+ 'class' => 'FLBuilderServiceMautic',
122
  ),
123
+ 'ontraport' => array(
124
+ 'type' => 'autoresponder',
125
+ 'name' => 'Ontraport',
126
+ 'class' => 'FLBuilderServiceOntraport',
127
+ 'namespace' => true,
128
  ),
129
+ 'sendinblue' => array(
130
+ 'type' => 'autoresponder',
131
+ 'name' => 'SendinBlue',
132
+ 'class' => 'FLBuilderServiceSendinBlue',
133
  ),
134
+ 'sendy' => array(
135
+ 'type' => 'autoresponder',
136
+ 'name' => 'Sendy',
137
+ 'class' => 'FLBuilderServiceSendy',
138
+ 'namespace' => true,
139
  ),
140
  );
141
 
216
  $saved_services = FLBuilderModel::get_services();
217
  $post_data = FLBuilderModel::get_post_data();
218
  $response = array(
219
+ 'error' => false,
220
+ 'html' => '',
221
  );
222
 
223
  // Validate the service data.
271
  * @return array The response array.
272
  */
273
  static public function render_settings() {
274
+ $post_data = FLBuilderModel::get_post_data();
275
+ $saved_services = FLBuilderModel::get_services();
276
+ $module = FLBuilderModel::get_module( $post_data['node_id'] );
277
+ $settings = $module->settings;
278
+ $service = $post_data['service'];
279
+ $response = array(
280
+ 'error' => false,
281
+ 'html' => '',
282
  );
283
 
284
  // Render the settings to connect a new account.
285
  if ( isset( $post_data['add_new'] ) || ! isset( $saved_services[ $service ] ) ) {
286
  $response['html'] = self::render_connect_settings( $service );
287
  } else {
288
+ $account = isset( $settings->service_account ) ? $settings->service_account : '';
289
  $response['html'] = self::render_account_settings( $service, $account );
290
  }
291
 
303
  ob_start();
304
 
305
  FLBuilder::render_settings_field( 'service_account', array(
306
+ 'row_class' => 'fl-builder-service-connect-row',
307
+ 'class' => 'fl-builder-service-connect-input',
308
+ 'type' => 'text',
309
+ 'label' => __( 'Account Name', 'fl-builder' ),
310
+ 'help' => __( 'Used to identify this connection within the accounts list and can be anything you like.', 'fl-builder' ),
311
+ 'preview' => array(
312
+ 'type' => 'none',
313
  ),
314
  ));
315
 
317
  echo $instance->render_connect_settings();
318
 
319
  FLBuilder::render_settings_field( 'service_connect_button', array(
320
+ 'row_class' => 'fl-builder-service-connect-row',
321
+ 'class' => 'fl-builder-service-connect-button',
322
+ 'type' => 'button',
323
+ 'label' => __( 'Connect', 'fl-builder' ),
324
  ));
325
 
326
  return ob_get_clean();
337
  static public function render_account_settings( $service, $active = '' ) {
338
  ob_start();
339
 
340
+ $saved_services = FLBuilderModel::get_services();
341
+ $settings = new stdClass();
342
+ $settings->service_account = $active;
343
+ $options = array(
344
  '' => __( 'Choose...', 'fl-builder' ),
345
  );
346
 
353
 
354
  // Render the account select.
355
  FLBuilder::render_settings_field( 'service_account', array(
356
+ 'row_class' => 'fl-builder-service-account-row',
357
+ 'class' => 'fl-builder-service-account-select',
358
+ 'type' => 'select',
359
+ 'label' => __( 'Account', 'fl-builder' ),
360
+ 'options' => $options,
361
+ 'preview' => array(
362
+ 'type' => 'none',
363
  ),
364
  ), $settings);
365
 
366
  // Render additional service fields if we have a saved account.
367
  if ( ! empty( $active ) && isset( $saved_services[ $service ][ $active ] ) ) {
368
 
369
+ $post_data = FLBuilderModel::get_post_data();
370
+ $module = FLBuilderModel::get_module( $post_data['node_id'] );
371
+ $instance = self::get_service_instance( $service );
372
+ $response = $instance->render_fields( $active, $module->settings );
373
 
374
  if ( ! $response['error'] ) {
375
  echo $response['html'];
388
  * @return array The response array.
389
  */
390
  static public function render_fields() {
391
+ $post_data = FLBuilderModel::get_post_data();
392
+ $module = FLBuilderModel::get_module( $post_data['node_id'] );
393
+ $instance = self::get_service_instance( $post_data['service'] );
394
+ $response = $instance->render_fields( $post_data['account'], $module->settings );
395
 
396
  return $response;
397
  }
classes/class-fl-builder-settings-compat-helper.php CHANGED
@@ -81,10 +81,10 @@ class FLBuilderSettingsCompatHelper {
81
  }
82
 
83
  $keys = array(
84
- 'slide-left' => 'fade-right',
85
  'slide-right' => 'fade-left',
86
- 'slide-up' => 'fade-up',
87
- 'slide-down' => 'fade-down',
88
  );
89
 
90
  if ( isset( $keys[ $settings->animation ] ) ) {
@@ -145,10 +145,10 @@ class FLBuilderSettingsCompatHelper {
145
  'style' => isset( $settings->{ "border_type$breakpoint" } ) ? $settings->{ "border_type$breakpoint" } : '',
146
  'color' => isset( $settings->{ "border_color$breakpoint" } ) ? $settings->{ "border_color$breakpoint" } : '',
147
  'width' => array(
148
- 'top' => $settings->{ "border_top$breakpoint" },
149
- 'right' => $settings->{ "border_right$breakpoint" },
150
  'bottom' => $settings->{ "border_bottom$breakpoint" },
151
- 'left' => $settings->{ "border_left$breakpoint" },
152
  ),
153
  );
154
 
81
  }
82
 
83
  $keys = array(
84
+ 'slide-left' => 'fade-right',
85
  'slide-right' => 'fade-left',
86
+ 'slide-up' => 'fade-up',
87
+ 'slide-down' => 'fade-down',
88
  );
89
 
90
  if ( isset( $keys[ $settings->animation ] ) ) {
145
  'style' => isset( $settings->{ "border_type$breakpoint" } ) ? $settings->{ "border_type$breakpoint" } : '',
146
  'color' => isset( $settings->{ "border_color$breakpoint" } ) ? $settings->{ "border_color$breakpoint" } : '',
147
  'width' => array(
148
+ 'top' => $settings->{ "border_top$breakpoint" },
149
+ 'right' => $settings->{ "border_right$breakpoint" },
150
  'bottom' => $settings->{ "border_bottom$breakpoint" },
151
+ 'left' => $settings->{ "border_left$breakpoint" },
152
  ),
153
  );
154
 
classes/class-fl-builder-settings-compat.php CHANGED
@@ -90,7 +90,7 @@ final class FLBuilderSettingsCompat {
90
 
91
  // Filter with a module specific helper if one is available.
92
  if ( 'module' === $type && isset( FLBuilderModel::$modules[ $settings->type ] ) ) {
93
- $module = FLBuilderModel::$modules[ $settings->type ];
94
  $settings = $module->filter_settings( $settings, self::$helpers['module'] );
95
  }
96
 
90
 
91
  // Filter with a module specific helper if one is available.
92
  if ( 'module' === $type && isset( FLBuilderModel::$modules[ $settings->type ] ) ) {
93
+ $module = FLBuilderModel::$modules[ $settings->type ];
94
  $settings = $module->filter_settings( $settings, self::$helpers['module'] );
95
  }
96
 
classes/class-fl-builder-settings-presets.php CHANGED
@@ -8,6 +8,10 @@ class FLBuilderSettingsPresets {
8
  add_filter( 'fl_builder_shared_option_sets', 'FLBuilderSettingsPresets::filter_shared_option_sets' );
9
  add_filter( 'fl_builder_register_settings_form', 'FLBuilderSettingsPresets::filter_settings_form' );
10
 
 
 
 
 
11
  do_action( 'fl_register_presets' );
12
  }
13
 
@@ -19,15 +23,15 @@ class FLBuilderSettingsPresets {
19
  * @return void
20
  */
21
  static public function register( $type = '', $args = array() ) {
22
- $defaults = array(
23
- 'name' => '',
24
- 'label' => __( 'Untitled Preset', 'fl-builder' ),
25
- 'type' => $type,
26
  'settings' => array(), /* the settings to set when preset is selected */
27
- 'data' => array(), /* arbitrary data to pass along to the frontend */
28
  );
29
- $args = wp_parse_args( $args, $defaults );
30
- $name = $args['name'];
31
  self::$presets[ $type ][ $name ] = $args;
32
  }
33
 
@@ -53,8 +57,8 @@ class FLBuilderSettingsPresets {
53
  if ( $type ) {
54
  $presets = self::$presets[ $type ];
55
  foreach ( $presets as $preset ) {
56
- $handle = $preset['name'];
57
- $label = $preset['label'];
58
  $options[ $handle ] = $label;
59
  }
60
  }
@@ -85,10 +89,16 @@ class FLBuilderSettingsPresets {
85
 
86
  if ( isset( $form['tabs'] ) ) {
87
  foreach ( $form['tabs'] as $i => $tab ) {
 
 
 
88
 
89
  foreach ( $tab['sections'] as $j => $section ) {
90
- foreach ( $section['fields'] as $k => $field ) {
 
 
91
 
 
92
  if ( 'preset' === $field['type'] ) {
93
  $form['tabs'][ $i ]['sections'][ $j ]['fields'][ $k ]['preview'] = array(
94
  'type' => 'none',
8
  add_filter( 'fl_builder_shared_option_sets', 'FLBuilderSettingsPresets::filter_shared_option_sets' );
9
  add_filter( 'fl_builder_register_settings_form', 'FLBuilderSettingsPresets::filter_settings_form' );
10
 
11
+ /**
12
+ * Register presets action.
13
+ * @see fl_register_presets
14
+ */
15
  do_action( 'fl_register_presets' );
16
  }
17
 
23
  * @return void
24
  */
25
  static public function register( $type = '', $args = array() ) {
26
+ $defaults = array(
27
+ 'name' => '',
28
+ 'label' => __( 'Untitled Preset', 'fl-builder' ),
29
+ 'type' => $type,
30
  'settings' => array(), /* the settings to set when preset is selected */
31
+ 'data' => array(), /* arbitrary data to pass along to the frontend */
32
  );
33
+ $args = wp_parse_args( $args, $defaults );
34
+ $name = $args['name'];
35
  self::$presets[ $type ][ $name ] = $args;
36
  }
37
 
57
  if ( $type ) {
58
  $presets = self::$presets[ $type ];
59
  foreach ( $presets as $preset ) {
60
+ $handle = $preset['name'];
61
+ $label = $preset['label'];
62
  $options[ $handle ] = $label;
63
  }
64
  }
89
 
90
  if ( isset( $form['tabs'] ) ) {
91
  foreach ( $form['tabs'] as $i => $tab ) {
92
+ if ( ! isset( $tab['sections'] ) ) {
93
+ continue;
94
+ }
95
 
96
  foreach ( $tab['sections'] as $j => $section ) {
97
+ if ( ! isset( $section['fields'] ) ) {
98
+ continue;
99
+ }
100
 
101
+ foreach ( $section['fields'] as $k => $field ) {
102
  if ( 'preset' === $field['type'] ) {
103
  $form['tabs'][ $i ]['sections'][ $j ]['fields'][ $k ]['preview'] = array(
104
  'type' => 'none',
classes/class-fl-builder-shortcodes.php CHANGED
@@ -27,17 +27,17 @@ final class FLBuilderShortcodes {
27
  */
28
  static public function insert_layout( $attrs ) {
29
  $builder_active = in_the_loop() && FLBuilderModel::is_builder_active();
30
- $post_type = isset( $attrs['type'] ) ? $attrs['type'] : get_post_types();
31
  $site_id = isset( $attrs['site'] ) ? absint( $attrs['site'] ) : null;
32
- $args = array(
33
- 'post_type' => $post_type,
34
  'posts_per_page' => -1,
35
  );
36
 
37
  // Build the args array.
38
  if ( isset( $attrs['id'] ) ) {
39
 
40
- $args['orderby'] = 'post__in';
41
  $args['ignore_sticky_posts'] = true;
42
 
43
  if ( is_numeric( $attrs['id'] ) ) {
@@ -47,7 +47,7 @@ final class FLBuilderShortcodes {
47
  }
48
  } elseif ( isset( $attrs['slug'] ) ) {
49
  $args['orderby'] = 'name';
50
- $args['name'] = $attrs['slug'];
51
  } else {
52
  return;
53
  }
27
  */
28
  static public function insert_layout( $attrs ) {
29
  $builder_active = in_the_loop() && FLBuilderModel::is_builder_active();
30
+ $post_type = isset( $attrs['type'] ) ? $attrs['type'] : get_post_types();
31
  $site_id = isset( $attrs['site'] ) ? absint( $attrs['site'] ) : null;
32
+ $args = array(
33
+ 'post_type' => $post_type,
34
  'posts_per_page' => -1,
35
  );
36
 
37
  // Build the args array.
38
  if ( isset( $attrs['id'] ) ) {
39
 
40
+ $args['orderby'] = 'post__in';
41
  $args['ignore_sticky_posts'] = true;
42
 
43
  if ( is_numeric( $attrs['id'] ) ) {
47
  }
48
  } elseif ( isset( $attrs['slug'] ) ) {
49
  $args['orderby'] = 'name';
50
+ $args['name'] = $attrs['slug'];
51
  } else {
52
  return;
53
  }
classes/class-fl-builder-ui-content-panel.php CHANGED
@@ -27,10 +27,10 @@ class FLBuilderUIContentPanel {
27
 
28
  $modules_data = self::get_modules_tab_data();
29
  if ( $modules_data['should_display'] ) {
30
- $modules_tab = array(
31
- 'handle' => 'modules',
32
- 'name' => __( 'Modules', 'fl-builder' ),
33
- 'views' => $modules_data['views'],
34
  'isSearchEnabled' => true,
35
  );
36
  $data['tabs']['modules'] = $modules_tab;
@@ -38,20 +38,20 @@ class FLBuilderUIContentPanel {
38
 
39
  $rows_data = self::get_rows_tab_data();
40
  if ( $rows_data['should_display'] ) {
41
- $rows_tab = array(
42
  'handle' => 'rows',
43
- 'name' => __( 'Rows', 'fl-builder' ),
44
- 'views' => $rows_data['views'],
45
  );
46
  $data['tabs']['rows'] = $rows_tab;
47
  }
48
 
49
  $templates_data = self::get_templates_tab_data();
50
  if ( $templates_data['should_display'] ) {
51
- $templates_tab = array(
52
  'handle' => 'templates',
53
- 'name' => __( 'Templates', 'fl-builder' ),
54
- 'views' => $templates_data['views'],
55
  );
56
  $data['tabs']['templates'] = $templates_tab;
57
  }
@@ -77,17 +77,17 @@ class FLBuilderUIContentPanel {
77
 
78
  $data = array(
79
  'should_display' => ! FLBuilderModel::is_post_user_template( 'module' ),
80
- 'views' => array(),
81
  );
82
 
83
  // Standard Modules View
84
  $data['views'][] = array(
85
- 'handle' => 'standard',
86
- 'name' => __( 'Standard Modules', 'fl-builder' ),
87
- 'query' => array(
88
- 'kind' => 'module',
89
  'categorized' => true,
90
- 'group' => 'standard',
91
  ),
92
  'orderedSectionNames' => array_keys( FLBuilderModel::get_module_categories() ),
93
  );
@@ -102,14 +102,14 @@ class FLBuilderUIContentPanel {
102
 
103
  foreach ( $groups as $slug => $name ) {
104
  $data['views'][] = array(
105
- 'handle' => $slug,
106
- 'name' => $name,
107
- 'query' => array(
108
- 'kind' => array( 'module', 'template' ),
109
- 'content' => 'module',
110
- 'type' => 'core',
111
  'categorized' => true,
112
- 'group' => $slug,
113
  ),
114
  'templateName' => 'fl-content-panel-modules-view',
115
  );
@@ -130,22 +130,22 @@ class FLBuilderUIContentPanel {
130
 
131
  $data = array(
132
  'should_display' => true, /* rows tab shows even if row template */
133
- 'views' => array(),
134
  );
135
 
136
  // Columns View
137
  $data['views'][] = array(
138
- 'handle' => 'columns',
139
- 'name' => __( 'Columns', 'fl-builder' ),
140
- 'query' => array(
141
  'kind' => 'colGroup',
142
  ),
143
  'templateName' => 'fl-content-panel-col-groups-view',
144
  );
145
 
146
  // Row Templates View
147
- $templates = FLBuilderModel::get_row_templates_data();
148
- $is_row_template = FLBuilderModel::is_post_user_template( 'row' );
149
  $is_column_template = FLBuilderModel::is_post_user_template( 'column' );
150
 
151
  if ( ! $is_row_template && ! $is_column_template && isset( $templates['groups'] ) && ! empty( $templates['groups'] ) ) {
@@ -157,14 +157,14 @@ class FLBuilderUIContentPanel {
157
  foreach ( $templates['groups'] as $slug => $group ) {
158
 
159
  $data['views'][] = array(
160
- 'handle' => $slug,
161
- 'name' => $group['name'],
162
  'hasChildren' => count( $group['categories'] ) > 1,
163
- 'query' => array(
164
- 'kind' => 'template',
165
- 'type' => 'core',
166
- 'group' => $slug,
167
- 'content' => 'row',
168
  'categorized' => true,
169
  ),
170
  );
@@ -175,16 +175,16 @@ class FLBuilderUIContentPanel {
175
 
176
  foreach ( $group['categories'] as $cat_slug => $category ) {
177
  $data['views'][] = array(
178
- 'handle' => $cat_slug,
179
- 'name' => $category['name'],
180
  'isSubItem' => true,
181
- 'parent' => $slug,
182
- 'query' => array(
183
- 'kind' => 'template',
184
- 'type' => 'core',
185
- 'content' => 'row',
186
- 'group' => $slug,
187
- 'category' => $cat_slug,
188
  'categorized' => true,
189
  ),
190
  );
@@ -203,13 +203,13 @@ class FLBuilderUIContentPanel {
203
  * @return array
204
  */
205
  private static function get_templates_tab_data() {
206
- $enabled = FLBuilderModel::get_enabled_templates();
207
  $is_module_template = FLBuilderModel::is_post_user_template( 'module' );
208
  $is_column_template = FLBuilderModel::is_post_user_template( 'column' );
209
- $is_row_template = FLBuilderModel::is_post_user_template( 'row' );
210
- $data = array(
211
  'should_display' => ( ! $is_module_template && ! $is_column_template && ! $is_row_template && 'disabled' !== $enabled ),
212
- 'views' => array(),
213
  );
214
 
215
  $templates = FLBuilderModel::get_template_selector_data();
@@ -218,8 +218,8 @@ class FLBuilderUIContentPanel {
218
 
219
  if ( true === FL_BUILDER_LITE ) {
220
  $data['views'][] = array(
221
- 'handle' => 'standard',
222
- 'name' => __( 'Upgrade', 'fl-builder' ),
223
  'templateName' => 'fl-content-lite-templates-upgrade-view',
224
  );
225
  }
@@ -230,14 +230,14 @@ class FLBuilderUIContentPanel {
230
  foreach ( $templates['groups'] as $slug => $group ) {
231
 
232
  $data['views'][] = array(
233
- 'handle' => $slug,
234
- 'name' => $group['name'],
235
  'hasChildren' => count( $group['categories'] ) > 1,
236
- 'query' => array(
237
- 'kind' => 'template',
238
- 'type' => 'core',
239
- 'content' => 'layout',
240
- 'group' => $slug,
241
  'categorized' => true,
242
  ),
243
  );
@@ -248,16 +248,16 @@ class FLBuilderUIContentPanel {
248
 
249
  foreach ( $group['categories'] as $cat_slug => $category ) {
250
  $data['views'][] = array(
251
- 'handle' => $cat_slug,
252
- 'name' => $category['name'],
253
  'isSubItem' => true,
254
- 'parent' => $slug,
255
- 'query' => array(
256
- 'kind' => 'template',
257
- 'type' => 'core',
258
- 'content' => 'layout',
259
- 'group' => $slug,
260
- 'category' => $cat_slug,
261
  'categorized' => true,
262
  ),
263
  );
@@ -279,7 +279,7 @@ class FLBuilderUIContentPanel {
279
  $data = array(
280
 
281
  /* Get all modules */
282
- 'module' => FLBuilderModel::get_uncategorized_modules(),
283
 
284
  /* Get all column groups */
285
  'colGroup' => FLBuilderModel::get_column_groups(),
@@ -287,21 +287,21 @@ class FLBuilderUIContentPanel {
287
  'template' => array(),
288
  );
289
 
290
- $static_modules = FLBuilderModel::get_module_templates_data();
291
  $module_templates = $static_modules['templates'];
292
 
293
  foreach ( $module_templates as $template ) {
294
  $data['template'][] = $template;
295
  }
296
 
297
- $static_columns = FLBuilderModel::get_column_templates_data();
298
  $column_templates = $static_columns['templates'];
299
 
300
  foreach ( $column_templates as $template ) {
301
  $data['template'][] = $template;
302
  }
303
 
304
- $static_rows = FLBuilderModel::get_row_templates_data();
305
  $row_templates = $static_rows['templates'];
306
 
307
  foreach ( $row_templates as $template ) {
27
 
28
  $modules_data = self::get_modules_tab_data();
29
  if ( $modules_data['should_display'] ) {
30
+ $modules_tab = array(
31
+ 'handle' => 'modules',
32
+ 'name' => __( 'Modules', 'fl-builder' ),
33
+ 'views' => $modules_data['views'],
34
  'isSearchEnabled' => true,
35
  );
36
  $data['tabs']['modules'] = $modules_tab;
38
 
39
  $rows_data = self::get_rows_tab_data();
40
  if ( $rows_data['should_display'] ) {
41
+ $rows_tab = array(
42
  'handle' => 'rows',
43
+ 'name' => __( 'Rows', 'fl-builder' ),
44
+ 'views' => $rows_data['views'],
45
  );
46
  $data['tabs']['rows'] = $rows_tab;
47
  }
48
 
49
  $templates_data = self::get_templates_tab_data();
50
  if ( $templates_data['should_display'] ) {
51
+ $templates_tab = array(
52
  'handle' => 'templates',
53
+ 'name' => __( 'Templates', 'fl-builder' ),
54
+ 'views' => $templates_data['views'],
55
  );
56
  $data['tabs']['templates'] = $templates_tab;
57
  }
77
 
78
  $data = array(
79
  'should_display' => ! FLBuilderModel::is_post_user_template( 'module' ),
80
+ 'views' => array(),
81
  );
82
 
83
  // Standard Modules View
84
  $data['views'][] = array(
85
+ 'handle' => 'standard',
86
+ 'name' => __( 'Standard Modules', 'fl-builder' ),
87
+ 'query' => array(
88
+ 'kind' => 'module',
89
  'categorized' => true,
90
+ 'group' => 'standard',
91
  ),
92
  'orderedSectionNames' => array_keys( FLBuilderModel::get_module_categories() ),
93
  );
102
 
103
  foreach ( $groups as $slug => $name ) {
104
  $data['views'][] = array(
105
+ 'handle' => $slug,
106
+ 'name' => $name,
107
+ 'query' => array(
108
+ 'kind' => array( 'module', 'template' ),
109
+ 'content' => 'module',
110
+ 'type' => 'core',
111
  'categorized' => true,
112
+ 'group' => $slug,
113
  ),
114
  'templateName' => 'fl-content-panel-modules-view',
115
  );
130
 
131
  $data = array(
132
  'should_display' => true, /* rows tab shows even if row template */
133
+ 'views' => array(),
134
  );
135
 
136
  // Columns View
137
  $data['views'][] = array(
138
+ 'handle' => 'columns',
139
+ 'name' => __( 'Columns', 'fl-builder' ),
140
+ 'query' => array(
141
  'kind' => 'colGroup',
142
  ),
143
  'templateName' => 'fl-content-panel-col-groups-view',
144
  );
145
 
146
  // Row Templates View
147
+ $templates = FLBuilderModel::get_row_templates_data();
148
+ $is_row_template = FLBuilderModel::is_post_user_template( 'row' );
149
  $is_column_template = FLBuilderModel::is_post_user_template( 'column' );
150
 
151
  if ( ! $is_row_template && ! $is_column_template && isset( $templates['groups'] ) && ! empty( $templates['groups'] ) ) {
157
  foreach ( $templates['groups'] as $slug => $group ) {
158
 
159
  $data['views'][] = array(
160
+ 'handle' => $slug,
161
+ 'name' => $group['name'],
162
  'hasChildren' => count( $group['categories'] ) > 1,
163
+ 'query' => array(
164
+ 'kind' => 'template',
165
+ 'type' => 'core',
166
+ 'group' => $slug,
167
+ 'content' => 'row',
168
  'categorized' => true,
169
  ),
170
  );
175
 
176
  foreach ( $group['categories'] as $cat_slug => $category ) {
177
  $data['views'][] = array(
178
+ 'handle' => $cat_slug,
179
+ 'name' => $category['name'],
180
  'isSubItem' => true,
181
+ 'parent' => $slug,
182
+ 'query' => array(
183
+ 'kind' => 'template',
184
+ 'type' => 'core',
185
+ 'content' => 'row',
186
+ 'group' => $slug,
187
+ 'category' => $cat_slug,
188
  'categorized' => true,
189
  ),
190
  );
203
  * @return array
204
  */
205
  private static function get_templates_tab_data() {
206
+ $enabled = FLBuilderModel::get_enabled_templates();
207
  $is_module_template = FLBuilderModel::is_post_user_template( 'module' );
208
  $is_column_template = FLBuilderModel::is_post_user_template( 'column' );
209
+ $is_row_template = FLBuilderModel::is_post_user_template( 'row' );
210
+ $data = array(
211
  'should_display' => ( ! $is_module_template && ! $is_column_template && ! $is_row_template && 'disabled' !== $enabled ),
212
+ 'views' => array(),
213
  );
214
 
215
  $templates = FLBuilderModel::get_template_selector_data();
218
 
219
  if ( true === FL_BUILDER_LITE ) {
220
  $data['views'][] = array(
221
+ 'handle' => 'standard',
222
+ 'name' => __( 'Upgrade', 'fl-builder' ),
223
  'templateName' => 'fl-content-lite-templates-upgrade-view',
224
  );
225
  }
230
  foreach ( $templates['groups'] as $slug => $group ) {
231
 
232
  $data['views'][] = array(
233
+ 'handle' => $slug,
234
+ 'name' => $group['name'],
235
  'hasChildren' => count( $group['categories'] ) > 1,
236
+ 'query' => array(
237
+ 'kind' => 'template',
238
+ 'type' => 'core',
239
+ 'content' => 'layout',
240
+ 'group' => $slug,
241
  'categorized' => true,
242
  ),
243
  );
248
 
249
  foreach ( $group['categories'] as $cat_slug => $category ) {
250
  $data['views'][] = array(
251
+ 'handle' => $cat_slug,
252
+ 'name' => $category['name'],
253
  'isSubItem' => true,
254
+ 'parent' => $slug,
255
+ 'query' => array(
256
+ 'kind' => 'template',
257
+ 'type' => 'core',
258
+ 'content' => 'layout',
259
+ 'group' => $slug,
260
+ 'category' => $cat_slug,
261
  'categorized' => true,
262
  ),
263
  );
279
  $data = array(
280
 
281
  /* Get all modules */
282
+ 'module' => FLBuilderModel::get_uncategorized_modules(),
283
 
284
  /* Get all column groups */
285
  'colGroup' => FLBuilderModel::get_column_groups(),
287
  'template' => array(),
288
  );
289
 
290
+ $static_modules = FLBuilderModel::get_module_templates_data();
291
  $module_templates = $static_modules['templates'];
292
 
293
  foreach ( $module_templates as $template ) {
294
  $data['template'][] = $template;
295
  }
296
 
297
+ $static_columns = FLBuilderModel::get_column_templates_data();
298
  $column_templates = $static_columns['templates'];
299
 
300
  foreach ( $column_templates as $template ) {
301
  $data['template'][] = $template;
302
  }
303
 
304
+ $static_rows = FLBuilderModel::get_row_templates_data();
305
  $row_templates = $static_rows['templates'];
306
 
307
  foreach ( $row_templates as $template ) {
classes/class-fl-builder-ui-settings-forms.php CHANGED
@@ -66,7 +66,7 @@ class FLBuilderUISettingsForms {
66
  wp_raise_memory_limit( 'bb-plugin' );
67
  }
68
 
69
- $type = sanitize_key( $_GET['fl_builder_load_settings_config'] );
70
  $handler = 'FLBuilderUISettingsForms::compress_settings_config';
71
 
72
  if ( 'modules' === $type ) {
@@ -128,19 +128,19 @@ class FLBuilderUISettingsForms {
128
  */
129
  static public function get_js_config() {
130
  return array(
131
- 'forms' => self::prep_forms_for_js_config( FLBuilderModel::$settings_forms ),
132
- 'editables' => self::prep_editables_for_js_config(),
133
- 'nodes' => self::prep_node_settings_for_js_config(),
134
- 'attachments' => self::prep_attachments_for_js_config(),
135
- 'settings' => array(
136
- 'global' => FLBuilderModel::get_global_settings(),
137
- 'layout' => FLBuilderModel::get_layout_settings(),
138
  ),
139
- 'defaults' => array(
140
- 'row' => FLBuilderModel::get_row_defaults(),
141
- 'column' => FLBuilderModel::get_col_defaults(),
142
- 'modules' => FLBuilderModel::get_module_defaults(),
143
- 'forms' => self::prep_form_defaults_for_js_config( FLBuilderModel::$settings_forms ),
144
  ),
145
  );
146
  }
@@ -165,8 +165,8 @@ class FLBuilderUISettingsForms {
165
  */
166
  static public function get_node_js_config() {
167
  return array(
168
- 'nodes' => self::prep_node_settings_for_js_config(),
169
- 'attachments' => self::prep_attachments_for_js_config(),
170
  );
171
  }
172
 
@@ -219,8 +219,8 @@ class FLBuilderUISettingsForms {
219
 
220
  if ( isset( $section['file'] ) && FL_BUILDER_DIR . 'includes/service-settings.php' === $section['file'] ) {
221
  $section['template'] = array(
222
- 'id' => 'fl-builder-service-settings',
223
- 'file' => FL_BUILDER_DIR . 'includes/ui-service-settings.php',
224
  );
225
  unset( $section['file'] );
226
  }
@@ -299,9 +299,9 @@ class FLBuilderUISettingsForms {
299
  $js = '';
300
 
301
  $css_file_path = apply_filters( "fl_builder_module_settings_css_file_path_{$module->slug}", "{$module->dir}css/settings.css", $module );
302
- $css_file_uri = apply_filters( "fl_builder_module_settings_css_file_uri_{$module->slug}", "{$module->url}css/settings.css", $module );
303
- $js_file_path = apply_filters( "fl_builder_module_settings_js_file_path_{$module->slug}", "{$module->dir}js/settings.js", $module );
304
- $js_file_uri = apply_filters( "fl_builder_module_settings_js_file_uri_{$module->slug}", "{$module->url}js/settings.js", $module );
305
 
306
  if ( file_exists( $css_file_path ) ) {
307
  $css .= '<link class="fl-builder-settings-css" rel="stylesheet" href="' . $css_file_uri . '" />';
@@ -314,8 +314,8 @@ class FLBuilderUISettingsForms {
314
  'title' => $module->name,
315
  'tabs' => $module->form,
316
  'assets' => array(
317
- 'css' => $css,
318
- 'js' => $js,
319
  ),
320
  );
321
  }
@@ -363,10 +363,10 @@ class FLBuilderUISettingsForms {
363
 
364
  $editables[ $module->slug ][ $key ] = array(
365
  'selector' => $field['preview']['selector'],
366
- 'field' => array(
367
- 'name' => $key,
368
- 'type' => $field['type'],
369
- 'toolbar' => isset( $field['inline_editor'] ) ? $field['inline_editor'] : null,
370
  ),
371
  );
372
  }
@@ -487,16 +487,16 @@ class FLBuilderUISettingsForms {
487
  return false;
488
  }
489
 
490
- $post = get_post( $id );
491
- $filename = wp_basename( $url );
492
- $base_url = str_replace( $filename, '', $url );
493
- $meta = wp_get_attachment_metadata( $id );
494
- $sizes = array();
495
  $possible_sizes = apply_filters( 'image_size_names_choose', array(
496
- 'thumbnail' => __( 'Thumbnail' ),
497
- 'medium' => __( 'Medium' ),
498
- 'large' => __( 'Large' ),
499
- 'full' => __( 'Full Size' ),
500
  ) );
501
 
502
  if ( isset( $meta['sizes'] ) ) {
@@ -523,11 +523,11 @@ class FLBuilderUISettingsForms {
523
  }
524
 
525
  return array(
526
- 'id' => $id,
527
- 'url' => $url,
528
- 'filename' => $filename,
529
- 'caption' => $post->post_excerpt,
530
- 'sizes' => apply_filters( 'fl_builder_photo_sizes_select', $sizes ),
531
  );
532
  }
533
 
@@ -581,12 +581,12 @@ class FLBuilderUISettingsForms {
581
  * @return array
582
  */
583
  static public function pre_render_legacy_module_settings( $type, $settings ) {
584
- $data = array(
585
- 'tabs' => array(),
586
- 'sections' => array(),
587
- 'fields' => array(),
588
- 'settings' => $settings,
589
- 'node_id' => null,
590
  );
591
  $custom = apply_filters( 'fl_builder_custom_fields', array() );
592
 
@@ -603,7 +603,7 @@ class FLBuilderUISettingsForms {
603
 
604
  if ( isset( $section['file'] ) ) {
605
  $data['sections'][] = array(
606
- 'tab' => $tab_id,
607
  'section' => $section_id,
608
  );
609
  }
@@ -613,7 +613,7 @@ class FLBuilderUISettingsForms {
613
 
614
  foreach ( $section['fields'] as $field_id => $field ) {
615
 
616
- $is_core = file_exists( FL_BUILDER_DIR . 'includes/ui-field-' . $field['type'] . '.php' );
617
  $is_custom = isset( $custom[ $field['type'] ] );
618
 
619
  if ( ! $is_core && ! $is_custom ) {
@@ -638,11 +638,11 @@ class FLBuilderUISettingsForms {
638
  */
639
  static public function render_legacy_settings( $data, $form, $group, $lightbox ) {
640
  $response = array(
641
- 'lightbox' => $lightbox,
642
- 'tabs' => array(),
643
- 'sections' => array(),
644
- 'fields' => array(),
645
- 'extras' => array(),
646
  );
647
 
648
  // Get the form tabs.
@@ -658,7 +658,7 @@ class FLBuilderUISettingsForms {
658
  // Get the settings.
659
  if ( $data['node_id'] ) {
660
  $layout_data = FLBuilderModel::get_layout_data();
661
- $settings = $layout_data[ $data['node_id'] ]->settings;
662
  } else {
663
  $settings = isset( $data['settings'] ) ? (object) $data['settings'] : new stdClass();
664
  }
@@ -682,12 +682,12 @@ class FLBuilderUISettingsForms {
682
  continue;
683
  }
684
 
685
- $value = isset( $settings->$name ) ? $settings->$name : '';
686
  $is_multiple = isset( $field['multiple'] ) ? $field['multiple'] : false;
687
 
688
  if ( $is_multiple && is_array( $value ) ) {
689
  $before = array();
690
- $after = array();
691
  foreach ( $value as $repeater_item_value ) {
692
  ob_start();
693
  do_action( 'fl_builder_before_control', $name, $repeater_item_value, $field, $settings );
@@ -714,8 +714,8 @@ class FLBuilderUISettingsForms {
714
  if ( ! empty( $before ) || ! empty( $after ) ) {
715
  $response['extras'][ $name ] = array(
716
  'multiple' => $is_multiple,
717
- 'before' => $before,
718
- 'after' => $after,
719
  );
720
  }
721
  }
@@ -768,16 +768,19 @@ class FLBuilderUISettingsForms {
768
  */
769
  static public function render_settings( $form = array(), $settings ) {
770
  $defaults = array(
771
- 'class' => '',
772
- 'attrs' => '',
773
- 'title' => '',
774
- 'badges' => array(),
775
- 'tabs' => array(),
776
- 'buttons' => array(),
777
- 'settings' => $settings,
778
  );
779
 
780
- // Legacy filter for the config.
 
 
 
781
  $form = apply_filters( 'fl_builder_settings_form_config', array_merge( $defaults, $form ) );
782
 
783
  // Setup the class var to be safe in JS.
@@ -825,8 +828,8 @@ class FLBuilderUISettingsForms {
825
  }
826
 
827
  return self::render_settings(array(
828
- 'title' => $form['title'],
829
- 'tabs' => $form['tabs'],
830
  ), $settings);
831
  }
832
 
@@ -850,25 +853,25 @@ class FLBuilderUISettingsForms {
850
  * @link https://kb.wpbeaverbuilder.com/article/117-plugin-filter-reference
851
  * @since 2.0
852
  */
853
- $field = apply_filters( 'fl_builder_render_settings_field', $field, $name, $settings ); // Allow field settings filtering first
854
 
855
  if ( ! isset( $field['type'] ) ) {
856
  return;
857
  }
858
 
859
- $i = null;
860
- $is_multiple = isset( $field['multiple'] ) && true === (bool) $field['multiple'];
861
- $supports_multiple = 'editor' != $field['type'] && 'service' != $field['type'];
862
- $settings = ! $settings ? new stdClass() : $settings;
863
- $preview = isset( $field['preview'] ) ? json_encode( $field['preview'] ) : json_encode( array(
864
  'type' => 'refresh',
865
  ) );
866
- $row_class = isset( $field['row_class'] ) ? ' ' . $field['row_class'] : '';
867
- $responsive = false;
868
- $responsive_fields = array( 'unit' );
869
- $root_name = $name;
870
- $global_settings = FLBuilderModel::get_global_settings();
871
- $value = isset( $settings->$name ) ? $settings->$name : '';
872
 
873
  // Use a default value if not set in the settings.
874
  if ( ! isset( $settings->$name ) && isset( $field['default'] ) ) {
@@ -890,9 +893,9 @@ class FLBuilderUISettingsForms {
890
  // Render old calls to *custom* fields with PHP.
891
  if ( $is_multiple && $supports_multiple ) {
892
 
893
- $values = $value;
894
- $arr_name = $name;
895
- $name .= '[]';
896
 
897
  echo '<tbody id="fl-field-' . $root_name . '" class="fl-field fl-builder-field-multiples" data-type="form" data-preview=\'' . $preview . '\'>';
898
 
66
  wp_raise_memory_limit( 'bb-plugin' );
67
  }
68
 
69
+ $type = sanitize_key( $_GET['fl_builder_load_settings_config'] );
70
  $handler = 'FLBuilderUISettingsForms::compress_settings_config';
71
 
72
  if ( 'modules' === $type ) {
128
  */
129
  static public function get_js_config() {
130
  return array(
131
+ 'forms' => self::prep_forms_for_js_config( FLBuilderModel::$settings_forms ),
132
+ 'editables' => self::prep_editables_for_js_config(),
133
+ 'nodes' => self::prep_node_settings_for_js_config(),
134
+ 'attachments' => self::prep_attachments_for_js_config(),
135
+ 'settings' => array(
136
+ 'global' => FLBuilderModel::get_global_settings(),
137
+ 'layout' => FLBuilderModel::get_layout_settings(),
138
  ),
139
+ 'defaults' => array(
140
+ 'row' => FLBuilderModel::get_row_defaults(),
141
+ 'column' => FLBuilderModel::get_col_defaults(),
142
+ 'modules' => FLBuilderModel::get_module_defaults(),
143
+ 'forms' => self::prep_form_defaults_for_js_config( FLBuilderModel::$settings_forms ),
144
  ),
145
  );
146
  }
165
  */
166
  static public function get_node_js_config() {
167
  return array(
168
+ 'nodes' => self::prep_node_settings_for_js_config(),
169
+ 'attachments' => self::prep_attachments_for_js_config(),
170
  );
171
  }
172
 
219
 
220
  if ( isset( $section['file'] ) && FL_BUILDER_DIR . 'includes/service-settings.php' === $section['file'] ) {
221
  $section['template'] = array(
222
+ 'id' => 'fl-builder-service-settings',
223
+ 'file' => FL_BUILDER_DIR . 'includes/ui-service-settings.php',
224
  );
225
  unset( $section['file'] );
226
  }
299
  $js = '';
300
 
301
  $css_file_path = apply_filters( "fl_builder_module_settings_css_file_path_{$module->slug}", "{$module->dir}css/settings.css", $module );
302
+ $css_file_uri = apply_filters( "fl_builder_module_settings_css_file_uri_{$module->slug}", "{$module->url}css/settings.css", $module );
303
+ $js_file_path = apply_filters( "fl_builder_module_settings_js_file_path_{$module->slug}", "{$module->dir}js/settings.js", $module );
304
+ $js_file_uri = apply_filters( "fl_builder_module_settings_js_file_uri_{$module->slug}", "{$module->url}js/settings.js", $module );
305
 
306
  if ( file_exists( $css_file_path ) ) {
307
  $css .= '<link class="fl-builder-settings-css" rel="stylesheet" href="' . $css_file_uri . '" />';
314
  'title' => $module->name,
315
  'tabs' => $module->form,
316
  'assets' => array(
317
+ 'css' => $css,
318
+ 'js' => $js,
319
  ),
320
  );
321
  }
363
 
364
  $editables[ $module->slug ][ $key ] = array(
365
  'selector' => $field['preview']['selector'],
366
+ 'field' => array(
367
+ 'name' => $key,
368
+ 'type' => $field['type'],
369
+ 'toolbar' => isset( $field['inline_editor'] ) ? $field['inline_editor'] : null,
370
  ),
371
  );
372
  }
487
  return false;
488
  }
489
 
490
+ $post = get_post( $id );
491
+ $filename = wp_basename( $url );
492
+ $base_url = str_replace( $filename, '', $url );
493
+ $meta = wp_get_attachment_metadata( $id );
494
+ $sizes = array();
495
  $possible_sizes = apply_filters( 'image_size_names_choose', array(
496
+ 'thumbnail' => __( 'Thumbnail' ),
497
+ 'medium' => __( 'Medium' ),
498
+ 'large' => __( 'Large' ),
499
+ 'full' => __( 'Full Size' ),
500
  ) );
501
 
502
  if ( isset( $meta['sizes'] ) ) {
523
  }
524
 
525
  return array(
526
+ 'id' => $id,
527
+ 'url' => $url,
528
+ 'filename' => $filename,
529
+ 'caption' => $post->post_excerpt,
530
+ 'sizes' => apply_filters( 'fl_builder_photo_sizes_select', $sizes ),
531
  );
532
  }
533
 
581
  * @return array
582
  */
583
  static public function pre_render_legacy_module_settings( $type, $settings ) {
584
+ $data = array(
585
+ 'tabs' => array(),
586
+ 'sections' => array(),
587
+ 'fields' => array(),
588
+ 'settings' => $settings,
589
+ 'node_id' => null,
590
  );
591
  $custom = apply_filters( 'fl_builder_custom_fields', array() );
592
 
603
 
604
  if ( isset( $section['file'] ) ) {
605
  $data['sections'][] = array(
606
+ 'tab' => $tab_id,
607
  'section' => $section_id,
608
  );
609
  }
613
 
614
  foreach ( $section['fields'] as $field_id => $field ) {
615
 
616
+ $is_core = file_exists( FL_BUILDER_DIR . 'includes/ui-field-' . $field['type'] . '.php' );
617
  $is_custom = isset( $custom[ $field['type'] ] );
618
 
619
  if ( ! $is_core && ! $is_custom ) {
638
  */
639
  static public function render_legacy_settings( $data, $form, $group, $lightbox ) {
640
  $response = array(
641
+ 'lightbox' => $lightbox,
642
+ 'tabs' => array(),
643
+ 'sections' => array(),
644
+ 'fields' => array(),
645
+ 'extras' => array(),
646
  );
647
 
648
  // Get the form tabs.
658
  // Get the settings.
659
  if ( $data['node_id'] ) {
660
  $layout_data = FLBuilderModel::get_layout_data();
661
+ $settings = $layout_data[ $data['node_id'] ]->settings;
662
  } else {
663
  $settings = isset( $data['settings'] ) ? (object) $data['settings'] : new stdClass();
664
  }
682
  continue;
683
  }
684
 
685
+ $value = isset( $settings->$name ) ? $settings->$name : '';
686
  $is_multiple = isset( $field['multiple'] ) ? $field['multiple'] : false;
687
 
688
  if ( $is_multiple && is_array( $value ) ) {
689
  $before = array();
690
+ $after = array();
691
  foreach ( $value as $repeater_item_value ) {
692
  ob_start();
693
  do_action( 'fl_builder_before_control', $name, $repeater_item_value, $field, $settings );
714
  if ( ! empty( $before ) || ! empty( $after ) ) {
715
  $response['extras'][ $name ] = array(
716
  'multiple' => $is_multiple,
717
+ 'before' => $before,
718
+ 'after' => $after,
719
  );
720
  }
721
  }
768
  */
769
  static public function render_settings( $form = array(), $settings ) {
770
  $defaults = array(
771
+ 'class' => '',
772
+ 'attrs' => '',
773
+ 'title' => '',
774
+ 'badges' => array(),
775
+ 'tabs' => array(),
776
+ 'buttons' => array(),
777
+ 'settings' => $settings,
778
  );
779
 
780
+ /**
781
+ * Legacy filter for the config.
782
+ * @see fl_builder_settings_form_config
783
+ */
784
  $form = apply_filters( 'fl_builder_settings_form_config', array_merge( $defaults, $form ) );
785
 
786
  // Setup the class var to be safe in JS.
828
  }
829
 
830
  return self::render_settings(array(
831
+ 'title' => $form['title'],
832
+ 'tabs' => $form['tabs'],
833
  ), $settings);
834
  }
835
 
853
  * @link https://kb.wpbeaverbuilder.com/article/117-plugin-filter-reference
854
  * @since 2.0
855
  */
856
+ $field = apply_filters( 'fl_builder_render_settings_field', $field, $name, $settings ); // Allow field settings filtering first
857
 
858
  if ( ! isset( $field['type'] ) ) {
859
  return;
860
  }
861
 
862
+ $i = null;
863
+ $is_multiple = isset( $field['multiple'] ) && true === (bool) $field['multiple'];
864
+ $supports_multiple = 'editor' != $field['type'] && 'service' != $field['type'];
865
+ $settings = ! $settings ? new stdClass() : $settings;
866
+ $preview = isset( $field['preview'] ) ? json_encode( $field['preview'] ) : json_encode( array(
867
  'type' => 'refresh',
868
  ) );
869
+ $row_class = isset( $field['row_class'] ) ? ' ' . $field['row_class'] : '';
870
+ $responsive = false;
871
+ $responsive_fields = array( 'unit' );
872
+ $root_name = $name;
873
+ $global_settings = FLBuilderModel::get_global_settings();
874
+ $value = isset( $settings->$name ) ? $settings->$name : '';
875
 
876
  // Use a default value if not set in the settings.
877
  if ( ! isset( $settings->$name ) && isset( $field['default'] ) ) {
893
  // Render old calls to *custom* fields with PHP.
894
  if ( $is_multiple && $supports_multiple ) {
895
 
896
+ $values = $value;
897
+ $arr_name = $name;
898
+ $name .= '[]';
899
 
900
  echo '<tbody id="fl-field-' . $root_name . '" class="fl-field fl-builder-field-multiples" data-type="form" data-preview=\'' . $preview . '\'>';
901
 
classes/class-fl-builder-update.php CHANGED
@@ -51,6 +51,8 @@ final class FLBuilderUpdate {
51
  self::run( $saved_version );
52
  }
53
 
 
 
54
  update_site_option( '_fl_builder_version', FL_BUILDER_VERSION );
55
 
56
  update_site_option( '_fl_builder_update_info', array(
@@ -185,10 +187,10 @@ final class FLBuilderUpdate {
185
  $meta = $wpdb->get_results( "SELECT * FROM {$wpdb->postmeta} WHERE meta_key = '_fl_builder_layout'" );
186
 
187
  // Build the export object.
188
- $data = new StdClass();
189
- $data->version = FL_BUILDER_VERSION;
190
- $data->nodes = $nodes;
191
- $data->meta = $meta;
192
 
193
  // Save the backup.
194
  fl_builder_filesystem()->file_put_contents( $cache_dir['path'] . 'backup.dat', serialize( $data ) );
@@ -269,12 +271,12 @@ final class FLBuilderUpdate {
269
  foreach ( $metas as $meta ) {
270
 
271
  // Get the old layout nodes from the database.
272
- $published = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM %s WHERE layout = %s AND status = 'published'", $table, $meta->meta_value ) );
273
- $draft = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM %s WHERE layout = %s AND status = 'draft'", $table, $meta->meta_value ) );
274
 
275
  // Convert the old nodes to new ones.
276
- $published = self::v_1_2_8_convert_nodes( $published );
277
- $draft = self::v_1_2_8_convert_nodes( $draft );
278
 
279
  // Add the new layout post meta.
280
  update_post_meta( $meta->post_id, '_fl_builder_data', $published );
@@ -349,7 +351,7 @@ final class FLBuilderUpdate {
349
  $node->parent = null;
350
  }
351
 
352
- $node->settings = self::v_1_2_8_json_decode_settings( $node->settings );
353
  $new_nodes[ $node->node ] = $node;
354
  }
355
 
@@ -410,8 +412,8 @@ final class FLBuilderUpdate {
410
  */
411
  static private function v_1_4_6() {
412
  // Remove the old fl-builder uploads folder.
413
- $upload_dir = wp_upload_dir( null, false );
414
- $path = trailingslashit( $upload_dir['basedir'] ) . 'fl-builder';
415
 
416
  if ( file_exists( $path ) ) {
417
  fl_builder_filesystem()->rmdir( $path, true );
@@ -427,7 +429,7 @@ final class FLBuilderUpdate {
427
  */
428
  static private function v_1_6_3() {
429
  $posts = get_posts( array(
430
- 'post_type' => 'fl-builder-template',
431
  'posts_per_page' => '-1',
432
  ) );
433
 
51
  self::run( $saved_version );
52
  }
53
 
54
+ do_action( 'fl_builder_cache_cleared' );
55
+
56
  update_site_option( '_fl_builder_version', FL_BUILDER_VERSION );
57
 
58
  update_site_option( '_fl_builder_update_info', array(
187
  $meta = $wpdb->get_results( "SELECT * FROM {$wpdb->postmeta} WHERE meta_key = '_fl_builder_layout'" );
188
 
189
  // Build the export object.
190
+ $data = new StdClass();
191
+ $data->version = FL_BUILDER_VERSION;
192
+ $data->nodes = $nodes;
193
+ $data->meta = $meta;
194
 
195
  // Save the backup.
196
  fl_builder_filesystem()->file_put_contents( $cache_dir['path'] . 'backup.dat', serialize( $data ) );
271
  foreach ( $metas as $meta ) {
272
 
273
  // Get the old layout nodes from the database.
274
+ $published = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM %s WHERE layout = %s AND status = 'published'", $table, $meta->meta_value ) );
275
+ $draft = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM %s WHERE layout = %s AND status = 'draft'", $table, $meta->meta_value ) );
276
 
277
  // Convert the old nodes to new ones.
278
+ $published = self::v_1_2_8_convert_nodes( $published );
279
+ $draft = self::v_1_2_8_convert_nodes( $draft );
280
 
281
  // Add the new layout post meta.
282
  update_post_meta( $meta->post_id, '_fl_builder_data', $published );
351
  $node->parent = null;
352
  }
353
 
354
+ $node->settings = self::v_1_2_8_json_decode_settings( $node->settings );
355
  $new_nodes[ $node->node ] = $node;
356
  }
357
 
412
  */
413
  static private function v_1_4_6() {
414
  // Remove the old fl-builder uploads folder.
415
+ $upload_dir = wp_upload_dir( null, false );
416
+ $path = trailingslashit( $upload_dir['basedir'] ) . 'fl-builder';
417
 
418
  if ( file_exists( $path ) ) {
419
  fl_builder_filesystem()->rmdir( $path, true );
429
  */
430
  static private function v_1_6_3() {
431
  $posts = get_posts( array(
432
+ 'post_type' => 'fl-builder-template',
433
  'posts_per_page' => '-1',
434
  ) );
435
 
classes/class-fl-builder-usage.php CHANGED
@@ -16,9 +16,9 @@ final class FLBuilderUsage {
16
  add_action( 'admin_init', array( 'FLBuilderUsage', 'enable_disable' ) );
17
  add_action( 'init', array( 'FLBuilderUsage', 'set_schedule' ) );
18
  add_action( $hook, array( 'FLBuilderUsage', 'render_notification' ) );
19
- add_action( 'admin_enqueue_scripts', array( 'FLBuilderUsage', 'scripts' ) );
20
  add_action( 'fl_builder_usage_event', array( 'FLBuilderUsage', 'send_stats' ) );
21
  add_action( 'wp_ajax_fl_usage_toggle', array( 'FLBuilderUsage', 'callback' ) );
 
22
  }
23
 
24
  public static function callback() {
@@ -39,7 +39,6 @@ final class FLBuilderUsage {
39
  }
40
 
41
  public static function scripts() {
42
-
43
  wp_enqueue_style( 'fl-builder-admin-usage', FL_BUILDER_URL . 'css/fl-builder-admin-usage.css', array(), FL_BUILDER_VERSION );
44
  wp_enqueue_script( 'fl-builder-admin-usage', FL_BUILDER_URL . 'js/fl-builder-admin-usage.js', array( 'jquery' ), FL_BUILDER_VERSION );
45
  }
@@ -93,8 +92,6 @@ final class FLBuilderUsage {
93
  return false;
94
  }
95
 
96
- wp_enqueue_script( 'jquery' );
97
-
98
  $btn = sprintf( '<div class="buttons"><span class="button button-primary enable-stats">%s</span>&nbsp;<span class="button disable-stats">%s</span>%s</div>',
99
  __( "Sure, I'll help", 'fl-builder' ),
100
  __( 'No, Thank You', 'fl-builder' ),
@@ -183,6 +180,8 @@ final class FLBuilderUsage {
183
  */
184
  public static function data_demo() {
185
 
 
 
186
  $data = self::get_data( true );
187
  $output = '';
188
  $txt = '';
@@ -247,26 +246,26 @@ final class FLBuilderUsage {
247
  require_once ABSPATH . 'wp-admin/includes/plugin.php';
248
  }
249
 
250
- $data = array(
251
- 'modules' => array(),
252
- 'license' => array(),
253
- 'themer' => array(
254
- 'header' => 0,
255
- 'footer' => 0,
256
- 'part' => 0,
257
- '404' => 0,
258
- 'singular' => 0,
259
- ),
260
- 'pinned' => array(
261
- 'left' => 0,
262
- 'right' => 0,
263
- 'unpinned' => 0,
264
- ),
265
- );
266
- $users = count_users();
267
- $plugins_data = get_plugins();
268
- $data['plugins'] = count( $plugins_data );
269
- $data['plugins_active'] = 0;
270
 
271
  foreach ( (array) $plugins_data as $plugin_slug => $plugin ) {
272
  if ( is_plugin_active( $plugin_slug ) ) {
@@ -274,135 +273,138 @@ final class FLBuilderUsage {
274
  }
275
  }
276
 
277
- /**
278
- * Setup an array of post types to query
279
- */
280
- $post_types = get_post_types( array(
281
- 'public' => true,
282
- '_builtin' => true,
283
- ) );
284
-
285
- if ( isset( $post_types['attachment'] ) ) {
286
- unset( $post_types['attachment'] );
287
- }
288
- // $post_types['fl-builder-template'] = 'fl-builder-template';
289
-
290
- /**
291
- * Get a count of all posts/pages that are *not* builder enabled.
292
- */
293
- $args = array(
294
- 'post_type' => $post_types,
295
- 'post_status' => 'publish',
296
- 'meta_query' => array(
297
- 'key' => '_fl_builder_enabled',
298
- 'value' => '1',
299
- 'compare' => '!=',
300
- ),
301
- 'posts_per_page' => -1,
302
- );
303
- $query = new WP_Query( $args );
304
- $data['not-enabled'] = count( $query->posts );
305
-
306
- /**
307
- * Get a count of all posts pages that are using the builder.
308
- */
309
- $args = array(
310
- 'post_type' => $post_types,
311
- 'post_status' => 'publish',
312
- 'meta_key' => '_fl_builder_enabled',
313
- 'meta_value' => '1',
314
- 'posts_per_page' => -1,
315
- );
316
-
317
- $query = new WP_Query( $args );
318
- $data['enabled'] = count( $query->posts );
319
-
320
- /**
321
- * Using the array of pages/posts using builder get a list of all used modules
322
- */
323
- if ( is_array( $query->posts ) && ! empty( $query->posts ) ) {
324
- foreach ( $query->posts as $post ) {
325
- $meta = get_post_meta( $post->ID, '_fl_builder_data', true );
326
- foreach ( (array) $meta as $node_id => $node ) {
327
- if ( @isset( $node->type ) && 'module' == $node->type ) { // @codingStandardsIgnoreLine
328
- if ( ! isset( $data['modules'][ $node->settings->type ] ) ) {
329
- $data['modules'][ $node->settings->type ] = 1;
330
- } else {
331
- $data['modules'][ $node->settings->type ] ++;
 
 
332
  }
333
  }
334
  }
335
  }
336
- }
337
 
338
- // themer settings.
339
- $args = array(
340
- 'post_type' => 'fl-theme-layout',
341
- 'post_status' => 'publish',
342
- 'meta_key' => '_fl_builder_enabled',
343
- 'meta_value' => '1',
344
- 'posts_per_page' => -1,
345
- );
346
- $query = new WP_Query( $args );
347
- $data['themer']['total'] = count( $query->posts );
348
- if ( is_array( $query->posts ) && ! empty( $query->posts ) ) {
349
- foreach ( $query->posts as $post ) {
350
- $meta = get_post_meta( $post->ID );
351
- if ( isset( $meta['_fl_theme_layout_type'] ) ) {
352
- if ( ! isset( $data['themer'][ $meta['_fl_theme_layout_type'][0] ] ) ) {
353
- $data['themer'][ $meta['_fl_theme_layout_type'][0] ] = 1;
354
- } else {
355
- $data['themer'][ $meta['_fl_theme_layout_type'][0] ] ++;
 
356
  }
357
  }
358
  }
359
- }
360
 
361
- /**
362
- * Find all users that are using the builder.
363
- */
364
- $args = array(
365
- 'meta_key' => 'fl_builder_user_settings',
366
- 'meta_value' => 'null',
367
- 'meta_compare' => '!=',
368
- );
369
- $query = new WP_User_Query( $args );
370
- $user_settings = array();
371
- foreach ( $query->results as $user ) {
372
- $meta = get_user_meta( $user->ID, 'fl_builder_user_settings', true );
373
- $user_settings[ $user->ID ] = $meta;
374
- }
375
 
376
- $args = array(
377
- 'meta_key' => 'fl_builder_browser_stats',
378
- 'meta_value' => 'null',
379
- 'meta_compare' => '!=',
380
- );
381
- $query = new WP_User_Query( $args );
382
 
383
- $browsers = array();
 
 
 
 
 
384
 
385
- foreach ( $query->results as $user ) {
386
- $meta = get_user_meta( $user->ID, 'fl_builder_browser_stats', true );
387
- $browsers[ $user->ID ] = $meta;
 
 
 
 
388
  }
389
 
390
  /**
391
  * General data
392
  */
393
- $data['server'] = $_SERVER['SERVER_SOFTWARE'];
394
- $data['database'] = ( ! empty( $wpdb->is_mysql ) ? $wpdb->db_version() : 'Unknown' );
395
- $data['multisite'] = is_multisite() ? 'Yes' : 'No';
396
- $data['subsites'] = is_multisite() ? get_blog_count() : '';
397
- $data['locale'] = get_locale();
398
- $data['users'] = $users['total_users'];
399
- $data['php'] = phpversion();
400
- $data['wp'] = $wp_version;
401
- $data['fl-builder'] = FL_BUILDER_VERSION;
402
- $data['fl-theme'] = ( defined( 'FL_THEME_VERSION' ) ) ? FL_THEME_VERSION : false;
403
- $data['fl-themer'] = ( defined( 'FL_THEME_BUILDER_VERSION' ) ) ? FL_THEME_BUILDER_VERSION : false;
404
- $data['browsers'] = $browsers;
405
- $data['user_settings'] = $user_settings;
406
 
407
  $settings_orig = FLBuilderModel::get_global_settings();
408
 
16
  add_action( 'admin_init', array( 'FLBuilderUsage', 'enable_disable' ) );
17
  add_action( 'init', array( 'FLBuilderUsage', 'set_schedule' ) );
18
  add_action( $hook, array( 'FLBuilderUsage', 'render_notification' ) );
 
19
  add_action( 'fl_builder_usage_event', array( 'FLBuilderUsage', 'send_stats' ) );
20
  add_action( 'wp_ajax_fl_usage_toggle', array( 'FLBuilderUsage', 'callback' ) );
21
+
22
  }
23
 
24
  public static function callback() {
39
  }
40
 
41
  public static function scripts() {
 
42
  wp_enqueue_style( 'fl-builder-admin-usage', FL_BUILDER_URL . 'css/fl-builder-admin-usage.css', array(), FL_BUILDER_VERSION );
43
  wp_enqueue_script( 'fl-builder-admin-usage', FL_BUILDER_URL . 'js/fl-builder-admin-usage.js', array( 'jquery' ), FL_BUILDER_VERSION );
44
  }
92
  return false;
93
  }
94
 
 
 
95
  $btn = sprintf( '<div class="buttons"><span class="button button-primary enable-stats">%s</span>&nbsp;<span class="button disable-stats">%s</span>%s</div>',
96
  __( "Sure, I'll help", 'fl-builder' ),
97
  __( 'No, Thank You', 'fl-builder' ),
180
  */
181
  public static function data_demo() {
182
 
183
+ self::scripts();
184
+
185
  $data = self::get_data( true );
186
  $output = '';
187
  $txt = '';
246
  require_once ABSPATH . 'wp-admin/includes/plugin.php';
247
  }
248
 
249
+ $data = array(
250
+ 'modules' => array(),
251
+ 'license' => array(),
252
+ 'themer' => array(
253
+ 'header' => 0,
254
+ 'footer' => 0,
255
+ 'part' => 0,
256
+ '404' => 0,
257
+ 'singular' => 0,
258
+ ),
259
+ 'pinned' => array(
260
+ 'left' => 0,
261
+ 'right' => 0,
262
+ 'unpinned' => 0,
263
+ ),
264
+ );
265
+ $users = count_users();
266
+ $plugins_data = get_plugins();
267
+ $data['plugins'] = count( $plugins_data );
268
+ $data['plugins_active'] = 0;
269
 
270
  foreach ( (array) $plugins_data as $plugin_slug => $plugin ) {
271
  if ( is_plugin_active( $plugin_slug ) ) {
273
  }
274
  }
275
 
276
+ if ( false === $demo ) {
277
+ /**
278
+ * Setup an array of post types to query
279
+ */
280
+ $post_types = get_post_types( array(
281
+ 'public' => true,
282
+ '_builtin' => true,
283
+ ) );
284
+
285
+ if ( isset( $post_types['attachment'] ) ) {
286
+ unset( $post_types['attachment'] );
287
+ }
288
+ // $post_types['fl-builder-template'] = 'fl-builder-template';
289
+
290
+ /**
291
+ * Get a count of all posts/pages that are *not* builder enabled.
292
+ */
293
+ $args = array(
294
+ 'post_type' => $post_types,
295
+ 'post_status' => 'publish',
296
+ 'meta_query' => array(
297
+ 'key' => '_fl_builder_enabled',
298
+ 'value' => '1',
299
+ 'compare' => '!=',
300
+ ),
301
+ 'posts_per_page' => -1,
302
+ );
303
+ $query = new WP_Query( $args );
304
+ $data['not-enabled'] = count( $query->posts );
305
+
306
+ /**
307
+ * Get a count of all posts pages that are using the builder.
308
+ */
309
+ $args = array(
310
+ 'post_type' => $post_types,
311
+ 'post_status' => 'publish',
312
+ 'meta_key' => '_fl_builder_enabled',
313
+ 'meta_value' => '1',
314
+ 'posts_per_page' => -1,
315
+ );
316
+
317
+ $query = new WP_Query( $args );
318
+ $data['enabled'] = count( $query->posts );
319
+
320
+ /**
321
+ * Using the array of pages/posts using builder get a list of all used modules
322
+ */
323
+ if ( is_array( $query->posts ) && ! empty( $query->posts ) ) {
324
+ foreach ( $query->posts as $post ) {
325
+ $meta = get_post_meta( $post->ID, '_fl_builder_data', true );
326
+ foreach ( (array) $meta as $node_id => $node ) {
327
+ if ( @isset( $node->type ) && 'module' == $node->type ) { // @codingStandardsIgnoreLine
328
+ if ( ! isset( $data['modules'][ $node->settings->type ] ) ) {
329
+ $data['modules'][ $node->settings->type ] = 1;
330
+ } else {
331
+ $data['modules'][ $node->settings->type ] ++;
332
+ }
333
  }
334
  }
335
  }
336
  }
 
337
 
338
+ // themer settings.
339
+ $args = array(
340
+ 'post_type' => 'fl-theme-layout',
341
+ 'post_status' => 'publish',
342
+ 'meta_key' => '_fl_builder_enabled',
343
+ 'meta_value' => '1',
344
+ 'posts_per_page' => -1,
345
+ );
346
+ $query = new WP_Query( $args );
347
+ $data['themer']['total'] = count( $query->posts );
348
+ if ( is_array( $query->posts ) && ! empty( $query->posts ) ) {
349
+ foreach ( $query->posts as $post ) {
350
+ $meta = get_post_meta( $post->ID );
351
+ if ( isset( $meta['_fl_theme_layout_type'] ) ) {
352
+ if ( ! isset( $data['themer'][ $meta['_fl_theme_layout_type'][0] ] ) ) {
353
+ $data['themer'][ $meta['_fl_theme_layout_type'][0] ] = 1;
354
+ } else {
355
+ $data['themer'][ $meta['_fl_theme_layout_type'][0] ] ++;
356
+ }
357
  }
358
  }
359
  }
 
360
 
361
+ /**
362
+ * Find all users that are using the builder.
363
+ */
364
+ $args = array(
365
+ 'meta_key' => 'fl_builder_user_settings',
366
+ 'meta_value' => 'null',
367
+ 'meta_compare' => '!=',
368
+ );
369
+ $query = new WP_User_Query( $args );
370
+ $user_settings = array();
371
+ foreach ( $query->results as $user ) {
372
+ $meta = get_user_meta( $user->ID, 'fl_builder_user_settings', true );
373
+ $user_settings[ $user->ID ] = $meta;
374
+ }
375
 
376
+ $data['user_settings'] = $user_settings;
 
 
 
 
 
377
 
378
+ $args = array(
379
+ 'meta_key' => 'fl_builder_browser_stats',
380
+ 'meta_value' => 'null',
381
+ 'meta_compare' => '!=',
382
+ );
383
+ $query = new WP_User_Query( $args );
384
 
385
+ $browsers = array();
386
+
387
+ foreach ( $query->results as $user ) {
388
+ $meta = get_user_meta( $user->ID, 'fl_builder_browser_stats', true );
389
+ $browsers[ $user->ID ] = $meta;
390
+ }
391
+ $data['browsers'] = $browsers;
392
  }
393
 
394
  /**
395
  * General data
396
  */
397
+ $data['server'] = $_SERVER['SERVER_SOFTWARE'];
398
+ $data['database'] = ( ! empty( $wpdb->is_mysql ) ? $wpdb->db_version() : 'Unknown' );
399
+ $data['multisite'] = is_multisite() ? 'Yes' : 'No';
400
+ $data['subsites'] = is_multisite() ? get_blog_count() : '';
401
+ $data['locale'] = get_locale();
402
+ $data['users'] = $users['total_users'];
403
+ $data['php'] = phpversion();
404
+ $data['wp'] = $wp_version;
405
+ $data['fl-builder'] = FL_BUILDER_VERSION;
406
+ $data['fl-theme'] = ( defined( 'FL_THEME_VERSION' ) ) ? FL_THEME_VERSION : false;
407
+ $data['fl-themer'] = ( defined( 'FL_THEME_BUILDER_VERSION' ) ) ? FL_THEME_BUILDER_VERSION : false;
 
 
408
 
409
  $settings_orig = FLBuilderModel::get_global_settings();
410
 
classes/class-fl-builder-user-access.php CHANGED
@@ -52,7 +52,7 @@ final class FLBuilderUserAccess {
52
  $data['order'] = '10';
53
  }
54
  self::$registered_settings[ $key ] = $data;
55
- self::$settings = null; // must bust the settings cache.
56
  }
57
 
58
  /**
@@ -219,8 +219,8 @@ final class FLBuilderUserAccess {
219
  }
220
 
221
  $editable_roles = get_editable_roles();
222
- $roles = array();
223
- $caps = apply_filters( 'fl_builder_user_access_capabilities', array( 'edit_posts' ) );
224
 
225
  foreach ( $editable_roles as $role => $data ) {
226
  foreach ( $caps as $cap ) {
@@ -243,7 +243,7 @@ final class FLBuilderUserAccess {
243
  * @return bool
244
  */
245
  static public function current_user_can( $key ) {
246
- $user = wp_get_current_user();
247
  $settings = self::get_saved_settings();
248
 
249
  // Return false if no settings saved.
52
  $data['order'] = '10';
53
  }
54
  self::$registered_settings[ $key ] = $data;
55
+ self::$settings = null; // must bust the settings cache.
56
  }
57
 
58
  /**
219
  }
220
 
221
  $editable_roles = get_editable_roles();
222
+ $roles = array();
223
+ $caps = apply_filters( 'fl_builder_user_access_capabilities', array( 'edit_posts' ) );
224
 
225
  foreach ( $editable_roles as $role => $data ) {
226
  foreach ( $caps as $cap ) {
243
  * @return bool
244
  */
245
  static public function current_user_can( $key ) {
246
+ $user = wp_get_current_user();
247
  $settings = self::get_saved_settings();
248
 
249
  // Return false if no settings saved.
classes/class-fl-builder-user-settings.php CHANGED
@@ -24,8 +24,8 @@ class FLBuilderUserSettings {
24
  static public function get() {
25
  $meta = get_user_meta( get_current_user_id(), 'fl_builder_user_settings', true );
26
  $defaults = array(
27
- 'skin' => 'light',
28
- 'lightbox' => null,
29
  );
30
 
31
  if ( ! $meta ) {
@@ -52,7 +52,7 @@ class FLBuilderUserSettings {
52
  * @return array
53
  */
54
  static public function save_ui_skin( $name ) {
55
- $settings = self::get();
56
  $settings['skin'] = $name;
57
 
58
  return array(
@@ -69,7 +69,7 @@ class FLBuilderUserSettings {
69
  * @return array
70
  */
71
  static public function save_lightbox_position( $data ) {
72
- $settings = self::get();
73
  $settings['lightbox'] = $data;
74
 
75
  return self::update( $settings );
24
  static public function get() {
25
  $meta = get_user_meta( get_current_user_id(), 'fl_builder_user_settings', true );
26
  $defaults = array(
27
+ 'skin' => 'light',
28
+ 'lightbox' => null,
29
  );
30
 
31
  if ( ! $meta ) {
52
  * @return array
53
  */
54
  static public function save_ui_skin( $name ) {
55
+ $settings = self::get();
56
  $settings['skin'] = $name;
57
 
58
  return array(
69
  * @return array
70
  */
71
  static public function save_lightbox_position( $data ) {
72
+ $settings = self::get();
73
  $settings['lightbox'] = $data;
74
 
75
  return self::update( $settings );
classes/class-fl-builder-utils.php CHANGED
@@ -49,26 +49,26 @@ final class FLBuilderUtils {
49
 
50
  if ( $txtl > $length ) {
51
 
52
- for ( $i = 1;' ' != $text[ $length -$i ];$i++ ) {
53
 
54
  if ( $i == $length ) {
55
 
56
  if ( function_exists( 'mb_substr' ) ) {
57
- return mb_substr( $text,0,$length ) . $tail;
58
  }
59
 
60
- return substr( $text,0,$length ) . $tail;
61
  }
62
  }
63
 
64
- for ( ;',' == $text[ $length -$i ] || '.' == $text[ $length -$i ] || ' ' == $text[ $length -$i ];
65
- $i++ ) {;}
66
 
67
  if ( function_exists( 'mb_substr' ) ) {
68
- return mb_substr( $text,0,$length -$i + 1 ) . $tail;
69
  }
70
 
71
- return substr( $text,0,$length -$i + 1 ) . $tail;
72
  }
73
 
74
  return $text;
@@ -150,8 +150,8 @@ final class FLBuilderUtils {
150
  * Get video type and ID from a given URL
151
  *
152
  * @since 1.9
153
- * @param string $url The URL to check for video type
154
- * @param string $type The type of video to check
155
  * @return array
156
  */
157
  static public function get_video_data( $url, $type = '' ) {
@@ -159,12 +159,12 @@ final class FLBuilderUtils {
159
  return false;
160
  }
161
 
162
- $y_matches = array();
163
  $vm_matches = array();
164
  $yt_pattern = '/^(?:(?:(?:https?:)?\/\/)?(?:www.)?(?:youtu(?:be.com|.be))\/(?:watch\?v\=|v\/|embed\/)?([\w\-]+))/is';
165
  $vm_pattern = '#(?:https?://)?(?:www.)?(?:player.)?vimeo.com/(?:[a-z]*/)*([0-9]{6,11})[?]?.*#';
166
  $video_data = array(
167
- 'type' => 'mp4',
168
  'video_id' => '',
169
  );
170
 
@@ -172,7 +172,7 @@ final class FLBuilderUtils {
172
  preg_match( $vm_pattern, $url, $vm_matches );
173
 
174
  if ( isset( $yt_matches[1] ) ) {
175
- $video_data['type'] = 'youtube';
176
  $video_data['video_id'] = $yt_matches[1];
177
 
178
  parse_str( parse_url( $url, PHP_URL_QUERY ), $yt_params );
@@ -180,8 +180,8 @@ final class FLBuilderUtils {
180
 
181
  // If start time is specified, make sure to convert it into seconds.
182
  if ( isset( $yt_params['t'] ) ) {
183
- $minutes = 0;
184
- $seconds = 0;
185
  $time_in_seconds = 0;
186
 
187
  // Check for minutes.
@@ -214,7 +214,7 @@ final class FLBuilderUtils {
214
  $video_data['params'] = $yt_params;
215
  }
216
  } elseif ( isset( $vm_matches[1] ) ) {
217
- $video_data['type'] = 'vimeo';
218
  $video_data['video_id'] = $vm_matches[1];
219
  }
220
 
@@ -264,7 +264,7 @@ final class FLBuilderUtils {
264
  return $value;
265
  }
266
 
267
- return 0;
268
  }
269
 
270
  }
49
 
50
  if ( $txtl > $length ) {
51
 
52
+ for ( $i = 1;' ' != $text[ $length -$i ];$i++ ) { // @codingStandardsIgnoreLine
53
 
54
  if ( $i == $length ) {
55
 
56
  if ( function_exists( 'mb_substr' ) ) {
57
+ return mb_substr( $text, 0, $length ) . $tail;
58
  }
59
 
60
+ return substr( $text, 0, $length ) . $tail;
61
  }
62
  }
63
 
64
+ for ( ;',' == $text[ $length -$i ] || '.' == $text[ $length -$i ] || ' ' == $text[ $length -$i ]; // @codingStandardsIgnoreLine
65
+ $i++ ) {;} // @codingStandardsIgnoreLine
66
 
67
  if ( function_exists( 'mb_substr' ) ) {
68
+ return mb_substr( $text,0,$length -$i + 1 ) . $tail; // @codingStandardsIgnoreLine
69
  }
70
 
71
+ return substr( $text,0,$length -$i + 1 ) . $tail; // @codingStandardsIgnoreLine
72
  }
73
 
74
  return $text;
150
  * Get video type and ID from a given URL
151
  *
152
  * @since 1.9
153
+ * @param string $url The URL to check for video type
154
+ * @param string $type The type of video to check
155
  * @return array
156
  */
157
  static public function get_video_data( $url, $type = '' ) {
159
  return false;
160
  }
161
 
162
+ $y_matches = array();
163
  $vm_matches = array();
164
  $yt_pattern = '/^(?:(?:(?:https?:)?\/\/)?(?:www.)?(?:youtu(?:be.com|.be))\/(?:watch\?v\=|v\/|embed\/)?([\w\-]+))/is';
165
  $vm_pattern = '#(?:https?://)?(?:www.)?(?:player.)?vimeo.com/(?:[a-z]*/)*([0-9]{6,11})[?]?.*#';
166
  $video_data = array(
167
+ 'type' => 'mp4',
168
  'video_id' => '',
169
  );
170
 
172
  preg_match( $vm_pattern, $url, $vm_matches );
173
 
174
  if ( isset( $yt_matches[1] ) ) {
175
+ $video_data['type'] = 'youtube';
176
  $video_data['video_id'] = $yt_matches[1];
177
 
178
  parse_str( parse_url( $url, PHP_URL_QUERY ), $yt_params );
180
 
181
  // If start time is specified, make sure to convert it into seconds.
182
  if ( isset( $yt_params['t'] ) ) {
183
+ $minutes = 0;
184
+ $seconds = 0;
185
  $time_in_seconds = 0;
186
 
187
  // Check for minutes.
214
  $video_data['params'] = $yt_params;
215
  }
216
  } elseif ( isset( $vm_matches[1] ) ) {
217
+ $video_data['type'] = 'vimeo';
218
  $video_data['video_id'] = $vm_matches[1];
219
  }
220
 
264
  return $value;
265
  }
266
 
267
+ return 0;
268
  }
269
 
270
  }
classes/class-fl-builder-wp-blocks-layout.php CHANGED
@@ -13,13 +13,13 @@ final class FLBuilderWPBlocksLayout {
13
  */
14
  static public function init() {
15
  // Actions
16
- add_action( 'current_screen', __CLASS__ . '::init_template' );
17
- add_action( 'pre_post_update', __CLASS__ . '::disable_builder_on_post_update', 10, 2 );
18
 
19
  // Filters
20
- add_action( 'block_editor_preload_paths', __CLASS__ . '::update_legacy_post', 10, 2 );
21
- add_filter( 'fl_builder_editor_content', __CLASS__ . '::filter_editor_content' );
22
- add_filter( 'fl_builder_migrated_post_content', __CLASS__ . '::filter_migrated_post_content' );
23
  }
24
 
25
  /**
@@ -33,11 +33,11 @@ final class FLBuilderWPBlocksLayout {
33
  global $pagenow;
34
 
35
  if ( in_array( $pagenow, array( 'post.php', 'post-new.php' ) ) ) {
36
- $post_id = isset( $_GET['post'] ) ? absint( $_GET['post'] ) : null;
37
  $render_ui = apply_filters( 'fl_builder_render_admin_edit_ui', true );
38
  $post_types = FLBuilderModel::get_post_types();
39
- $screen = get_current_screen();
40
- $enabled = ! $post_id ? false : FLBuilderModel::is_builder_enabled( $post_id );
41
  $user_access = FLBuilderUserAccess::current_user_can( 'builder_access' );
42
  $unrestricted = FLBuilderUserAccess::current_user_can( 'unrestricted_editing' );
43
 
@@ -76,14 +76,14 @@ final class FLBuilderWPBlocksLayout {
76
  $blocks = preg_match( '/<!-- wp:(.*) \/?-->/', $post->post_content );
77
 
78
  if ( $enabled && ! $blocks ) {
79
- $block = '<!-- wp:fl-builder/layout -->';
80
- $block .= self::remove_broken_p_tags( $post->post_content );
81
- $block .= '<!-- /wp:fl-builder/layout -->';
82
 
83
  $post->post_content = $block;
84
 
85
  wp_update_post( array(
86
- 'ID' => $post->ID,
87
  'post_content' => $block,
88
  ) );
89
  }
@@ -100,9 +100,9 @@ final class FLBuilderWPBlocksLayout {
100
  * @return void
101
  */
102
  static public function disable_builder_on_post_update( $post_id, $new_post ) {
103
- $new_post = (object) $new_post;
104
- $old_post = get_post( $post_id );
105
- $post_types = FLBuilderModel::get_post_types();
106
 
107
  if ( ! $old_post || ! in_array( $old_post->post_type, $post_types ) ) {
108
  return;
@@ -128,11 +128,11 @@ final class FLBuilderWPBlocksLayout {
128
  */
129
  static public function filter_editor_content( $content ) {
130
  $post_id = FLBuilderModel::get_post_id();
131
- $post = get_post( $post_id );
132
 
133
- $block = '<!-- wp:fl-builder/layout -->';
134
- $block .= self::remove_broken_p_tags( $content );
135
- $block .= '<!-- /wp:fl-builder/layout -->';
136
 
137
  return $block;
138
  }
13
  */
14
  static public function init() {
15
  // Actions
16
+ add_action( 'current_screen', __CLASS__ . '::init_template' );
17
+ add_action( 'pre_post_update', __CLASS__ . '::disable_builder_on_post_update', 10, 2 );
18
 
19
  // Filters
20
+ add_action( 'block_editor_preload_paths', __CLASS__ . '::update_legacy_post', 10, 2 );
21
+ add_filter( 'fl_builder_editor_content', __CLASS__ . '::filter_editor_content' );
22
+ add_filter( 'fl_builder_migrated_post_content', __CLASS__ . '::filter_migrated_post_content' );
23
  }
24
 
25
  /**
33
  global $pagenow;
34
 
35
  if ( in_array( $pagenow, array( 'post.php', 'post-new.php' ) ) ) {
36
+ $post_id = isset( $_GET['post'] ) ? absint( $_GET['post'] ) : null;
37
  $render_ui = apply_filters( 'fl_builder_render_admin_edit_ui', true );
38
  $post_types = FLBuilderModel::get_post_types();
39
+ $screen = get_current_screen();
40
+ $enabled = ! $post_id ? false : FLBuilderModel::is_builder_enabled( $post_id );
41
  $user_access = FLBuilderUserAccess::current_user_can( 'builder_access' );
42
  $unrestricted = FLBuilderUserAccess::current_user_can( 'unrestricted_editing' );
43
 
76
  $blocks = preg_match( '/<!-- wp:(.*) \/?-->/', $post->post_content );
77
 
78
  if ( $enabled && ! $blocks ) {
79
+ $block = '<!-- wp:fl-builder/layout -->';
80
+ $block .= self::remove_broken_p_tags( $post->post_content );
81
+ $block .= '<!-- /wp:fl-builder/layout -->';
82
 
83
  $post->post_content = $block;
84
 
85
  wp_update_post( array(
86
+ 'ID' => $post->ID,
87
  'post_content' => $block,
88
  ) );
89
  }
100
  * @return void
101
  */
102
  static public function disable_builder_on_post_update( $post_id, $new_post ) {
103
+ $new_post = (object) $new_post;
104
+ $old_post = get_post( $post_id );
105
+ $post_types = FLBuilderModel::get_post_types();
106
 
107
  if ( ! $old_post || ! in_array( $old_post->post_type, $post_types ) ) {
108
  return;
128
  */
129
  static public function filter_editor_content( $content ) {
130
  $post_id = FLBuilderModel::get_post_id();
131
+ $post = get_post( $post_id );
132
 
133
+ $block = '<!-- wp:fl-builder/layout -->';
134
+ $block .= self::remove_broken_p_tags( $content );
135
+ $block .= '<!-- /wp:fl-builder/layout -->';
136
 
137
  return $block;
138
  }
classes/class-fl-builder-wp-blocks.php CHANGED
@@ -25,7 +25,7 @@ final class FLBuilderWPBlocks {
25
  }
26
 
27
  // Actions
28
- add_action( 'enqueue_block_editor_assets', __CLASS__ . '::enqueue_block_editor_assets' );
29
 
30
  // Filters
31
  add_filter( 'excerpt_allowed_blocks', __CLASS__ . '::excerpt_allowed_blocks' );
@@ -49,10 +49,10 @@ final class FLBuilderWPBlocks {
49
  return;
50
  }
51
 
52
- $branding = FLBuilderModel::get_branding();
53
  $post_type_object = get_post_type_object( $post->post_type );
54
- $post_type_name = $post_type_object->labels->singular_name;
55
- $min = ( ! FLBuilder::is_debug() ) ? '.min' : '';
56
 
57
  wp_enqueue_style(
58
  'fl-builder-wp-editor',
@@ -70,25 +70,25 @@ final class FLBuilderWPBlocks {
70
 
71
  wp_localize_script( 'fl-builder-wp-editor', 'FLBuilderConfig', array(
72
  'builder' => array(
73
- 'access' => FLBuilderUserAccess::current_user_can( 'builder_access' ),
74
- 'enabled' => FLBuilderModel::is_builder_enabled( $post->ID ),
75
- 'nonce' => wp_create_nonce( 'fl_ajax_update' ),
76
  'unrestricted' => FLBuilderUserAccess::current_user_can( 'unrestricted_editing' ),
77
  ),
78
- 'post' => array(
79
  'id' => $post->ID,
80
  ),
81
  'strings' => array(
82
- 'active' => sprintf( _x( '%1$s is currently active for this %2$s.', '%1$s branded builder name. %2$s post type name.', 'fl-builder' ), $branding, strtolower( $post_type_name ) ),
83
- 'convert' => sprintf( _x( 'Convert to %s', '%s branded builder name.', 'fl-builder' ), $branding ),
84
  'description' => sprintf( _x( '%s lets you drag and drop your layout on the frontend.', '%s branded builder name.', 'fl-builder' ), $branding ),
85
- 'editor' => __( 'Use Standard Editor', 'fl-builder' ),
86
- 'launch' => sprintf( _x( 'Launch %s', '%s branded builder name.', 'fl-builder' ), $branding ),
87
- 'title' => $branding,
88
- 'view' => sprintf( _x( 'View %s', '%s post type name.', 'fl-builder' ), $post_type_name ),
89
- 'warning' => __( 'Switching to the native WordPress editor will disable your Beaver Builder layout until it is enabled again. Any edits made in the WordPress editor will not be converted to your Page Builded layout. Do you want to continue?', 'fl-builder' ),
90
  ),
91
- 'urls' => array(
92
  'edit' => FLBuilderModel::get_edit_url( $post->ID ),
93
  'view' => get_permalink( $post->ID ),
94
  ),
25
  }
26
 
27
  // Actions
28
+ add_action( 'enqueue_block_editor_assets', __CLASS__ . '::enqueue_block_editor_assets' );
29
 
30
  // Filters
31
  add_filter( 'excerpt_allowed_blocks', __CLASS__ . '::excerpt_allowed_blocks' );
49
  return;
50
  }
51
 
52
+ $branding = FLBuilderModel::get_branding();
53
  $post_type_object = get_post_type_object( $post->post_type );
54
+ $post_type_name = $post_type_object->labels->singular_name;
55
+ $min = ( ! FLBuilder::is_debug() ) ? '.min' : '';
56
 
57
  wp_enqueue_style(
58
  'fl-builder-wp-editor',
70
 
71
  wp_localize_script( 'fl-builder-wp-editor', 'FLBuilderConfig', array(
72
  'builder' => array(
73
+ 'access' => FLBuilderUserAccess::current_user_can( 'builder_access' ),
74
+ 'enabled' => FLBuilderModel::is_builder_enabled( $post->ID ),
75
+ 'nonce' => wp_create_nonce( 'fl_ajax_update' ),
76
  'unrestricted' => FLBuilderUserAccess::current_user_can( 'unrestricted_editing' ),
77
  ),
78
+ 'post' => array(
79
  'id' => $post->ID,
80
  ),
81
  'strings' => array(
82
+ 'active' => sprintf( _x( '%1$s is currently active for this %2$s.', '%1$s branded builder name. %2$s post type name.', 'fl-builder' ), $branding, strtolower( $post_type_name ) ),
83
+ 'convert' => sprintf( _x( 'Convert to %s', '%s branded builder name.', 'fl-builder' ), $branding ),
84
  'description' => sprintf( _x( '%s lets you drag and drop your layout on the frontend.', '%s branded builder name.', 'fl-builder' ), $branding ),
85
+ 'editor' => __( 'Use Standard Editor', 'fl-builder' ),
86
+ 'launch' => sprintf( _x( 'Launch %s', '%s branded builder name.', 'fl-builder' ), $branding ),
87
+ 'title' => $branding,
88
+ 'view' => sprintf( _x( 'View %s', '%s post type name.', 'fl-builder' ), $post_type_name ),
89
+ 'warning' => __( 'Switching to the native WordPress editor will disable your Beaver Builder layout until it is enabled again. Any edits made in the WordPress editor will not be converted to your Page Builded layout. Do you want to continue?', 'fl-builder' ),
90
  ),
91
+ 'urls' => array(
92
  'edit' => FLBuilderModel::get_edit_url( $post->ID ),
93
  'view' => get_permalink( $post->ID ),
94
  ),
classes/class-fl-builder-wpcli-command.php CHANGED
@@ -19,9 +19,9 @@ class FLbuilder_WPCLI_Command extends WP_CLI_Command {
19
  * ## EXAMPLES
20
  *
21
  * 1. wp beaver clearcache
22
- * - Clears the page builder cache for all the posts on the site.
23
  * 2. wp beaver clearcache --network
24
- * - Clears the page builder cache for all the posts on a network.
25
  */
26
  public function clearcache( $args, $assoc_args ) {
27
 
@@ -77,6 +77,10 @@ class FLbuilder_WPCLI_Command extends WP_CLI_Command {
77
  WP_CLI::success( __( 'Rebuilt the theme cache', 'fl-builder' ) );
78
  }
79
  }
 
 
 
 
80
  do_action( 'fl_builder_cache_cleared' );
81
  }
82
  }
@@ -96,9 +100,9 @@ class FLbuilder_WPCLI_Command extends WP_CLI_Command {
96
  * ## EXAMPLES
97
  *
98
  * 1. wp beaver register --license=01234567890
99
- * - Register this domain using license 01234567890
100
  * 2. wp beaver register --deactivate
101
- * - Removes domain from domain manager and clears saved license info.
102
  * 3. wp beaver register
103
  * - If license is defined in wp-config.php using FL_LICENSE_KEY global.
104
  */
19
  * ## EXAMPLES
20
  *
21
  * 1. wp beaver clearcache
22
+ * - Clears the page builder cache for all the posts on the site.
23
  * 2. wp beaver clearcache --network
24
+ * - Clears the page builder cache for all the posts on a network.
25
  */
26
  public function clearcache( $args, $assoc_args ) {
27
 
77
  WP_CLI::success( __( 'Rebuilt the theme cache', 'fl-builder' ) );
78
  }
79
  }
80
+ /**
81
+ * After cache is cleared.
82
+ * @see fl_builder_cache_cleared
83
+ */
84
  do_action( 'fl_builder_cache_cleared' );
85
  }
86
  }
100
  * ## EXAMPLES
101
  *
102
  * 1. wp beaver register --license=01234567890
103
+ * - Register this domain using license 01234567890
104
  * 2. wp beaver register --deactivate
105
+ * - Removes domain from domain manager and clears saved license info.
106
  * 3. wp beaver register
107
  * - If license is defined in wp-config.php using FL_LICENSE_KEY global.
108
  */
classes/class-fl-builder-wpml.php CHANGED
@@ -16,9 +16,9 @@ final class FLBuilderWPML {
16
  return;
17
  }
18
 
19
- add_filter( 'fl_get_wp_widgets_exclude', __CLASS__ . '::filter_wp_widgets_exclude' );
20
- add_filter( 'fl_builder_node_template_post_id', __CLASS__ . '::filter_node_template_post_id' );
21
- add_filter( 'fl_builder_parent_template_node_id', __CLASS__ . '::filter_parent_template_node_id', 10, 3 );
22
  }
23
 
24
  /**
@@ -45,11 +45,11 @@ final class FLBuilderWPML {
45
  static public function filter_node_template_post_id( $post_id ) {
46
  global $sitepress;
47
 
48
- $post_type = get_post_type( $post_id );
49
- $lang = $sitepress->get_current_language();
50
- $wpml_post = new WPML_Post_Element( $post_id, $sitepress );
51
- $trid = $sitepress->get_element_trid( $post_id, "post_$post_type" );
52
- $translations = $sitepress->get_element_translations( $trid, "post_$post_type" );
53
 
54
  if ( is_array( $translations ) && isset( $translations[ $lang ] ) ) {
55
  $post_id = $translations[ $lang ]->element_id;
@@ -69,6 +69,10 @@ final class FLBuilderWPML {
69
  * @return string
70
  */
71
  static public function filter_parent_template_node_id( $template_node_id, $parent, $layout_data ) {
 
 
 
 
72
  $root = FLBuilderModel::get_node_template_root( $parent->type, $layout_data );
73
 
74
  if ( $root && isset( $root->template_root_node ) && isset( $root->template_node_id ) && ! empty( $root->template_node_id ) ) {
16
  return;
17
  }
18
 
19
+ add_filter( 'fl_get_wp_widgets_exclude', __CLASS__ . '::filter_wp_widgets_exclude' );
20
+ add_filter( 'fl_builder_node_template_post_id', __CLASS__ . '::filter_node_template_post_id' );
21
+ add_filter( 'fl_builder_parent_template_node_id', __CLASS__ . '::filter_parent_template_node_id', 10, 3 );
22
  }
23
 
24
  /**
45
  static public function filter_node_template_post_id( $post_id ) {
46
  global $sitepress;
47
 
48
+ $post_type = get_post_type( $post_id );
49
+ $lang = $sitepress->get_current_language();
50
+ $wpml_post = new WPML_Post_Element( $post_id, $sitepress );
51
+ $trid = $sitepress->get_element_trid( $post_id, "post_$post_type" );
52
+ $translations = $sitepress->get_element_translations( $trid, "post_$post_type" );
53
 
54
  if ( is_array( $translations ) && isset( $translations[ $lang ] ) ) {
55
  $post_id = $translations[ $lang ]->element_id;
69
  * @return string
70
  */
71
  static public function filter_parent_template_node_id( $template_node_id, $parent, $layout_data ) {
72
+ if ( ! isset( $parent->template_root_node ) ) {
73
+ return $template_node_id;
74
+ }
75
+
76
  $root = FLBuilderModel::get_node_template_root( $parent->type, $layout_data );
77
 
78
  if ( $root && isset( $root->template_root_node ) && isset( $root->template_node_id ) && ! empty( $root->template_node_id ) ) {
classes/class-fl-builder.php CHANGED
@@ -67,8 +67,8 @@ final class FLBuilder {
67
  * Font awesome urls.
68
  * @since 2.1
69
  */
70
- static public $fa4_url = 'https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css';
71
- static public $fa5_pro_url = 'https://pro.fontawesome.com/releases/v5.6.3/css/all.css';
72
 
73
  /**
74
  * Initializes hooks.
@@ -78,28 +78,28 @@ final class FLBuilder {
78
  */
79
  static public function init() {
80
  /* Actions */
81
- add_action( 'plugins_loaded', __CLASS__ . '::load_plugin_textdomain' );
82
- add_action( 'send_headers', __CLASS__ . '::no_cache_headers' );
83
- add_action( 'wp', __CLASS__ . '::init_ui', 11 );
84
- add_action( 'wp', __CLASS__ . '::rich_edit' );
85
- add_action( 'wp_enqueue_scripts', __CLASS__ . '::register_layout_styles_scripts' );
86
- add_action( 'wp_enqueue_scripts', __CLASS__ . '::enqueue_ui_styles_scripts', 11 );
87
- add_action( 'wp_enqueue_scripts', __CLASS__ . '::enqueue_all_layouts_styles_scripts' );
88
- add_action( 'wp_head', __CLASS__ . '::render_custom_css_for_editing', 999 );
89
- add_action( 'admin_bar_menu', __CLASS__ . '::admin_bar_menu', 999 );
90
- add_action( 'wp_footer', __CLASS__ . '::render_ui' );
91
 
92
  /* Filters */
93
- add_filter( 'fl_builder_render_css', __CLASS__ . '::rewrite_css_cache_urls', 9999 );
94
- add_filter( 'body_class', __CLASS__ . '::body_class' );
95
- add_filter( 'wp_default_editor', __CLASS__ . '::default_editor' );
96
- add_filter( 'mce_css', __CLASS__ . '::add_editor_css' );
97
- add_filter( 'mce_buttons', __CLASS__ . '::editor_buttons' );
98
- add_filter( 'mce_buttons_2', __CLASS__ . '::editor_buttons_2' );
99
- add_filter( 'mce_external_plugins', __CLASS__ . '::editor_external_plugins', 9999 );
100
- add_filter( 'tiny_mce_before_init', __CLASS__ . '::editor_font_sizes' );
101
- add_filter( 'the_content', __CLASS__ . '::render_content' );
102
- add_filter( 'wp_handle_upload_prefilter', __CLASS__ . '::wp_handle_upload_prefilter_filter' );
103
  }
104
 
105
  /**
@@ -383,30 +383,30 @@ final class FLBuilder {
383
  $min = ( self::is_debug() ) ? '' : '.min';
384
 
385
  // Register additional CSS
386
- wp_register_style( 'fl-slideshow', $css_url . 'fl-slideshow.css', array( 'yui3' ), $ver );
387
- wp_register_style( 'jquery-bxslider', $css_url . 'jquery.bxslider.css', array(), $ver );
388
- wp_register_style( 'jquery-magnificpopup', $css_url . 'jquery.magnificpopup' . $min . '.css', array(), $ver );
389
- wp_register_style( 'yui3', $css_url . 'yui3.css', array(), $ver );
390
 
391
  // Register icon CDN CSS
392
- wp_register_style( 'font-awesome', self::$fa4_url, array(), $ver );
393
- wp_register_style( 'font-awesome-5', self::get_fa5_url(), array(), $ver );
394
- wp_register_style( 'foundation-icons', 'https://cdnjs.cloudflare.com/ajax/libs/foundicons/3.0.0/foundation-icons.css', array(), $ver );
395
 
396
  // Register additional JS
397
- wp_register_script( 'fl-slideshow', $js_url . 'fl-slideshow' . $min . '.js', array( 'yui3' ), $ver, true );
398
- wp_register_script( 'fl-gallery-grid', $js_url . 'fl-gallery-grid.js', array( 'jquery' ), $ver, true );
399
- wp_register_script( 'jquery-bxslider', $js_url . 'jquery.bxslider.js', array( 'jquery-easing', 'jquery-fitvids' ), $ver, true );
400
- wp_register_script( 'jquery-easing', $js_url . 'jquery.easing.min.js', array( 'jquery' ), '1.4', true );
401
- wp_register_script( 'jquery-fitvids', $js_url . 'jquery.fitvids.min.js', array( 'jquery' ), '1.2', true );
402
  wp_register_script( 'jquery-infinitescroll', $js_url . 'jquery.infinitescroll.min.js', array( 'jquery' ), $ver, true );
403
- wp_register_script( 'jquery-magnificpopup', $js_url . 'jquery.magnificpopup.min.js', array( 'jquery' ), $ver, true );
404
- wp_register_script( 'jquery-mosaicflow', $js_url . 'jquery.mosaicflow.min.js', array( 'jquery' ), $ver, true );
405
- wp_register_script( 'jquery-waypoints', $js_url . 'jquery.waypoints.min.js', array( 'jquery' ), $ver, true );
406
- wp_register_script( 'jquery-wookmark', $js_url . 'jquery.wookmark.min.js', array( 'jquery' ), $ver, true );
407
- wp_register_script( 'yui3', $js_url . 'yui3.min.js', array(), $ver, true );
408
- wp_register_script( 'youtube-player', 'https://www.youtube.com/iframe_api', array(), $ver, true );
409
- wp_register_script( 'vimeo-player', 'https://player.vimeo.com/api/player.js', array(), $ver, true );
410
  wp_deregister_script( 'imagesloaded' );
411
  wp_register_script( 'imagesloaded', includes_url( 'js/imagesloaded.min.js' ), array( 'jquery' ) );
412
  }
@@ -423,7 +423,7 @@ final class FLBuilder {
423
  global $post;
424
 
425
  $original_post = $post;
426
- $is_archive = is_archive() || is_home() || is_search();
427
 
428
  // Enqueue assets for posts in the main query.
429
  if ( ! $is_archive && isset( $wp_query->posts ) ) {
@@ -438,9 +438,9 @@ final class FLBuilder {
438
  if ( count( $post_ids ) > 0 ) {
439
 
440
  $posts = get_posts(array(
441
- 'post__in' => $post_ids,
442
- 'post_type' => get_post_types(),
443
- 'posts_per_page' => -1,
444
  ));
445
 
446
  foreach ( $posts as $post ) {
@@ -552,26 +552,26 @@ final class FLBuilder {
552
  $post_id = FLBuilderModel::get_post_id();
553
  $asset_info = FLBuilderModel::get_asset_info();
554
  $asset_ver = FLBuilderModel::get_asset_version();
555
- $active = FLBuilderModel::is_builder_active();
556
- $preview = FLBuilderModel::is_builder_draft_preview();
557
- $handle = 'fl-builder-layout-' . $post_id;
558
  /**
559
  * Use this filter to add dependencies to the dependency array when the main builder layout CSS file is enqueued using wp_enqueue_style.
560
  * @see fl_builder_layout_style_dependencies
561
  * @link https://kb.wpbeaverbuilder.com/article/117-plugin-filter-reference
562
  */
563
- $css_deps = apply_filters( 'fl_builder_layout_style_dependencies', array() );
564
- $css_media = apply_filters( 'fl_builder_layout_style_media', 'all' );
565
 
566
  // Enqueue with the global code included?
567
  if ( in_array( 'global-' . $type, self::$enqueued_global_assets ) ) {
568
- $path = $asset_info[ $type . '_partial' ];
569
- $url = $asset_info[ $type . '_partial_url' ];
570
  $global = false;
571
  } else {
572
- $path = $asset_info[ $type ];
573
- $url = $asset_info[ $type . '_url' ];
574
- $global = true;
575
  self::$enqueued_global_assets[] = 'global-' . $type;
576
  }
577
 
@@ -599,7 +599,7 @@ final class FLBuilder {
599
  } else {
600
 
601
  // Render if the file doesn't exist.
602
- if ( ! in_array( $path, self::$rendered_assets ) && ( ! fl_builder_filesystem()->file_exists( $path ) || $rerender || $preview || self::is_debug() ) ) {
603
  call_user_func_array( array( 'FLBuilder', 'render_' . $type ), array( $global ) );
604
  self::$rendered_assets[] = $path;
605
  }
@@ -667,24 +667,24 @@ final class FLBuilder {
667
  }
668
  wp_enqueue_style( 'font-awesome-5' );
669
  wp_enqueue_style( 'foundation-icons' );
670
- wp_enqueue_style( 'jquery-nanoscroller', $css_url . 'jquery.nanoscroller.css', array(), $ver );
671
- wp_enqueue_style( 'jquery-autosuggest', $css_url . 'jquery.autoSuggest.min.css', array(), $ver );
672
- wp_enqueue_style( 'jquery-tiptip', $css_url . 'jquery.tiptip.css', array(), $ver );
673
- wp_enqueue_style( 'bootstrap-tour', $css_url . 'bootstrap-tour-standalone.min.css', array(), $ver );
674
 
675
  // Enqueue individual builder styles if WP_DEBUG is on.
676
  if ( self::is_debug() ) {
677
- wp_enqueue_style( 'fl-color-picker', $css_url . 'fl-color-picker.css', array(), $ver );
678
- wp_enqueue_style( 'fl-lightbox', $css_url . 'fl-lightbox.css', array(), $ver );
679
- wp_enqueue_style( 'fl-icon-selector', $css_url . 'fl-icon-selector.css', array(), $ver );
680
- wp_enqueue_style( 'fl-builder', $css_url . 'fl-builder.css', array(), $ver );
681
 
682
  // skins need to come after default ui styles
683
  wp_enqueue_style( 'fl-builder-ui-skin-dark', $css_url . 'fl-builder-ui-skin-dark.css', array(), $ver );
684
 
685
  wp_enqueue_style( 'fl-builder-bundle', $css_url . 'build/builder.bundle.css', array(), $ver );
686
  } else {
687
- wp_enqueue_style( 'fl-builder-min', $css_url . 'fl-builder.min.css', array(), $ver );
688
  wp_enqueue_style( 'fl-builder-bundle', $css_url . 'build/builder.bundle.min.css', array(), $ver );
689
  }
690
 
@@ -693,7 +693,7 @@ final class FLBuilder {
693
 
694
  /* RTL Support */
695
  if ( is_rtl() ) {
696
- wp_enqueue_style( 'fl-builder-rtl', $css_url . 'fl-builder-rtl.css', array(), $ver );
697
  }
698
 
699
  /* We have a custom version of sortable that fixes a bug. */
@@ -714,46 +714,50 @@ final class FLBuilder {
714
  wp_enqueue_script( 'jquery-ui-widget' );
715
  wp_enqueue_script( 'jquery-ui-position' );
716
 
 
 
 
 
717
  do_action( 'fl_before_sortable_enqueue' );
718
 
719
- wp_enqueue_script( 'jquery-ui-sortable', $js_url . 'jquery.ui.sortable.js', array( 'jquery-ui-core', 'jquery-ui-widget', 'jquery-ui-mouse' ), $ver );
720
- wp_enqueue_script( 'jquery-nanoscroller', $js_url . 'jquery.nanoscroller.min.js', array(), $ver );
721
- wp_enqueue_script( 'jquery-autosuggest', $js_url . 'jquery.autoSuggest.min.js', array(), $ver );
722
- wp_enqueue_script( 'jquery-tiptip', $js_url . 'jquery.tiptip.min.js', array(), $ver );
723
  wp_enqueue_script( 'jquery-showhideevents', $js_url . 'jquery.showhideevents.js', array(), $ver );
724
- wp_enqueue_script( 'jquery-simulate', $js_url . 'jquery.simulate.js', array(), $ver );
725
- wp_enqueue_script( 'jquery-validate', $js_url . 'jquery.validate.min.js', array(), $ver );
726
- wp_enqueue_script( 'bootstrap-tour', $js_url . 'bootstrap-tour-standalone.min.js', array(), $ver );
727
- wp_enqueue_script( 'ace', $js_url . 'ace/ace.js', array(), $ver );
728
- wp_enqueue_script( 'ace-language-tools', $js_url . 'ace/ext-language_tools.js', array(), $ver );
729
- wp_enqueue_script( 'mousetrap', $js_url . 'mousetrap-custom.js', array(), $ver );
730
 
731
  // Enqueue individual builder scripts if WP_DEBUG is on.
732
  if ( self::is_debug() ) {
733
- wp_enqueue_script( 'fl-color-picker', $js_url . 'fl-color-picker.js', array(), $ver );
734
- wp_enqueue_script( 'fl-lightbox', $js_url . 'fl-lightbox.js', array(), $ver );
735
- wp_enqueue_script( 'fl-icon-selector', $js_url . 'fl-icon-selector.js', array(), $ver );
736
- wp_enqueue_script( 'fl-stylesheet', $js_url . 'fl-stylesheet.js', array(), $ver );
737
- wp_enqueue_script( 'fl-builder', $js_url . 'fl-builder.js', array(), $ver );
738
- wp_enqueue_script( 'fl-builder-ajax-layout', $js_url . 'fl-builder-ajax-layout.js', array(), $ver );
739
- wp_enqueue_script( 'fl-builder-preview', $js_url . 'fl-builder-preview.js', array(), $ver );
740
- wp_enqueue_script( 'fl-builder-simulate-media-query', $js_url . 'fl-builder-simulate-media-query.js', array(), $ver );
741
- wp_enqueue_script( 'fl-builder-responsive-editing', $js_url . 'fl-builder-responsive-editing.js', array(), $ver );
742
- wp_enqueue_script( 'fl-builder-responsive-preview', $js_url . 'fl-builder-responsive-preview.js', array(), $ver );
743
- wp_enqueue_script( 'fl-builder-services', $js_url . 'fl-builder-services.js', array(), $ver );
744
- wp_enqueue_script( 'fl-builder-tour', $js_url . 'fl-builder-tour.js', array(), $ver );
745
- wp_enqueue_script( 'fl-builder-ui', $js_url . 'fl-builder-ui.js', array( 'fl-builder', 'mousetrap' ), $ver );
746
- wp_enqueue_script( 'fl-builder-ui-main-menu', $js_url . 'fl-builder-ui-main-menu.js', array( 'fl-builder-ui' ), $ver );
747
- wp_enqueue_script( 'fl-builder-ui-panel-content', $js_url . 'fl-builder-ui-panel-content-library.js', array( 'fl-builder-ui' ), $ver );
748
- wp_enqueue_script( 'fl-builder-ui-settings-forms', $js_url . 'fl-builder-ui-settings-forms.js', array(), $ver );
749
- wp_enqueue_script( 'fl-builder-ui-pinned', $js_url . 'fl-builder-ui-pinned.js', array(), $ver );
750
- wp_enqueue_script( 'fl-builder-revisions', $js_url . 'fl-builder-revisions.js', array(), $ver );
751
- wp_enqueue_script( 'fl-builder-search', $js_url . 'fl-builder-search.js', array( 'jquery' ), $ver );
752
- wp_enqueue_script( 'fl-builder-save-manager', $js_url . 'fl-builder-save-manager.js', array( 'jquery' ), $ver );
753
- wp_enqueue_script( 'fl-builder-bundle', $js_url . 'build/builder.bundle.js', array(), $ver, true );
754
  } else {
755
- wp_enqueue_script( 'fl-builder-min', $js_url . 'fl-builder.min.js', array( 'jquery', 'mousetrap' ), $ver );
756
- wp_enqueue_script( 'fl-builder-bundle', $js_url . 'build/builder.bundle.min.js', array(), $ver, true );
757
  }
758
 
759
  /* Additional module styles and scripts */
@@ -780,8 +784,8 @@ final class FLBuilder {
780
  * @return array
781
  */
782
  static public function body_class( $classes ) {
783
- $do_render = apply_filters( 'fl_builder_do_render_content', true, FLBuilderModel::get_post_id() );
784
- $simple_ui = ! FLBuilderUserAccess::current_user_can( 'unrestricted_editing' );
785
  $template_type = FLBuilderModel::get_user_template_type();
786
 
787
  if ( $do_render && FLBuilderModel::is_builder_enabled() && ! is_archive() ) {
@@ -807,7 +811,7 @@ final class FLBuilder {
807
 
808
  // Skin
809
  $user_settings = FLBuilderUserSettings::get();
810
- $classes[] = 'fl-builder-ui-skin--' . $user_settings['skin'];
811
 
812
  // Draft changes
813
  if ( FLBuilderModel::layout_has_drafted_changes() ) {
@@ -844,7 +848,7 @@ final class FLBuilder {
844
  if ( FLBuilderModel::is_post_editable() && is_object( $wp_the_query->post ) ) {
845
 
846
  $enabled = get_post_meta( $wp_the_query->post->ID, '_fl_builder_enabled', true );
847
- $dot = ' <span class="fl-builder-admin-bar-status-dot" style="color:' . ( $enabled ? '#6bc373' : '#d9d9d9' ) . '; font-size:18px; line-height:1;">&bull;</span>';
848
 
849
  $wp_admin_bar->add_node( array(
850
  'id' => 'fl-builder-frontend-edit-link',
@@ -856,8 +860,8 @@ final class FLBuilder {
856
 
857
  static public function locate_template_file( $template_base, $slug ) {
858
  $specific_template = $template_base . '-' . $slug . '.php';
859
- $general_template = $template_base . '.php';
860
- $default_dir = trailingslashit( FL_BUILDER_DIR ) . 'includes/';
861
 
862
  // Try to find the specific template, then repeat the same process for general.
863
 
@@ -929,10 +933,10 @@ final class FLBuilder {
929
 
930
  if ( FLBuilderModel::is_builder_active() ) {
931
 
932
- $post_id = is_object( $wp_the_query->post ) ? $wp_the_query->post->ID : null;
933
- $unrestricted = FLBuilderUserAccess::current_user_can( 'unrestricted_editing' );
934
- $simple_ui = ! $unrestricted;
935
- $global_settings = FLBuilderModel::get_global_settings();
936
 
937
  include FL_BUILDER_DIR . 'includes/ui-extras.php';
938
  include FL_BUILDER_DIR . 'includes/ui-js-templates.php';
@@ -949,31 +953,31 @@ final class FLBuilder {
949
  static function get_main_menu_data() {
950
  global $post;
951
 
952
- $views = array();
953
  $is_lite = true === FL_BUILDER_LITE; // @codingStandardsIgnoreLine
954
- $is_user_template = FLBuilderModel::is_post_user_template();
955
  $enabled_templates = FLBuilderModel::get_enabled_templates();
956
- $is_simple_ui = ! FLBuilderUserAccess::current_user_can( 'unrestricted_editing' );
957
- $key_shortcuts = self::get_keyboard_shortcuts();
958
- $help = FLBuilderModel::get_help_button_settings();
959
- $default_view = array(
960
- 'name' => __( 'Unnamed Menu', 'fl-builder' ),
961
- 'isShowing' => false,
962
  'isRootView' => false,
963
- 'items' => array(),
964
  );
965
 
966
  // Tools
967
  $tools_view = array(
968
- 'name' => __( 'Tools', 'fl-builder' ),
969
- 'isShowing' => true,
970
  'isRootView' => true,
971
- 'items' => array(),
972
  );
973
 
974
  $tools_view['items'][04] = array(
975
- 'label' => __( 'Publish Layout', 'fl-builder' ),
976
- 'type' => 'event',
977
  'eventName' => 'publishAndRemain',
978
  'accessory' => $key_shortcuts['publishAndRemain']['keyLabel'],
979
  );
@@ -984,29 +988,29 @@ final class FLBuilder {
984
 
985
  if ( ! $is_lite && ! $is_user_template && ( 'enabled' == $enabled_templates || 'user' == $enabled_templates ) ) {
986
  $tools_view['items'][10] = array(
987
- 'label' => __( 'Save Template', 'fl-builder' ),
988
- 'type' => 'event',
989
  'eventName' => 'saveTemplate',
990
  'accessory' => $key_shortcuts['saveTemplate']['keyLabel'],
991
  );
992
  }
993
 
994
  $tools_view['items'][20] = array(
995
- 'label' => __( 'Duplicate Layout', 'fl-builder' ),
996
- 'type' => 'event',
997
  'eventName' => 'duplicateLayout',
998
  );
999
 
1000
  $tools_view['items'][30] = array(
1001
- 'label' => __( 'Preview Layout', 'fl-builder' ),
1002
- 'type' => 'event',
1003
  'eventName' => 'previewLayout',
1004
  'accessory' => $key_shortcuts['previewLayout']['keyLabel'],
1005
  );
1006
 
1007
  $tools_view['items'][31] = array(
1008
- 'label' => __( 'Responsive Editing', 'fl-builder' ),
1009
- 'type' => 'event',
1010
  'eventName' => 'responsiveEditing',
1011
  'accessory' => $key_shortcuts['responsiveEditing']['keyLabel'],
1012
  );
@@ -1016,15 +1020,15 @@ final class FLBuilder {
1016
  );
1017
 
1018
  $tools_view['items'][50] = array(
1019
- 'label' => __( 'Layout CSS & Javascript', 'fl-builder' ),
1020
- 'type' => 'event',
1021
  'eventName' => 'showLayoutSettings',
1022
  'accessory' => $key_shortcuts['showLayoutSettings']['keyLabel'],
1023
  );
1024
 
1025
  $tools_view['items'][60] = array(
1026
- 'label' => __( 'Global Settings', 'fl-builder' ),
1027
- 'type' => 'event',
1028
  'eventName' => 'showGlobalSettings',
1029
  'accessory' => $key_shortcuts['showGlobalSettings']['keyLabel'],
1030
  );
@@ -1034,29 +1038,29 @@ final class FLBuilder {
1034
  );
1035
 
1036
  $tools_view['items'][80] = array(
1037
- 'label' => __( 'Change UI Brightness', 'fl-builder' ),
1038
- 'type' => 'event',
1039
  'eventName' => 'toggleUISkin',
1040
  'accessory' => $key_shortcuts['toggleUISkin']['keyLabel'],
1041
  );
1042
 
1043
  $tools_view['items'][100] = array(
1044
  'label' => __( 'WordPress Admin', 'fl-builder' ),
1045
- 'type' => 'view',
1046
- 'view' => 'admin',
1047
  );
1048
 
1049
  if ( $help['enabled'] && ! $is_simple_ui ) {
1050
  $tools_view['items'][110] = array(
1051
  'label' => __( 'Help', 'fl-builder' ),
1052
- 'type' => 'view',
1053
- 'view' => 'help',
1054
  );
1055
  }
1056
 
1057
  $tools_view['items'][120] = array(
1058
- 'label' => __( 'Keyboard Shortcuts', 'fl-builder' ),
1059
- 'type' => 'event',
1060
  'eventName' => 'showKeyboardShortcuts',
1061
  );
1062
 
@@ -1064,17 +1068,17 @@ final class FLBuilder {
1064
 
1065
  // Admin
1066
  $admin_view = array(
1067
- 'name' => __( 'WordPress Admin', 'fl-builder' ),
1068
  'items' => array(),
1069
  );
1070
 
1071
  // Edit current post/page/cpt
1072
  if ( is_single( $post->ID ) || is_page( $post->ID ) ) {
1073
- $edit_label = get_post_type_object( $post->post_type )->labels->edit_item;
1074
  $admin_view['items'][10] = array(
1075
  'label' => $edit_label,
1076
- 'type' => 'link',
1077
- 'url' => get_edit_post_link( $post->ID ),
1078
  );
1079
  }
1080
 
@@ -1085,8 +1089,8 @@ final class FLBuilder {
1085
  // Dashboard
1086
  $admin_view['items'][17] = array(
1087
  'label' => _x( 'Dashboard', 'label for the WordPress Dashboard link', 'fl-builder' ),
1088
- 'type' => 'link',
1089
- 'url' => admin_url( 'index.php' ),
1090
  );
1091
 
1092
  $templates_enabled = FLBuilderUserAccess::current_user_can( 'builder_admin' );
@@ -1094,8 +1098,8 @@ final class FLBuilder {
1094
  if ( $templates_enabled ) {
1095
  $admin_view['items'][20] = array(
1096
  'label' => __( 'Manage Templates', 'fl-builder' ),
1097
- 'type' => 'link',
1098
- 'url' => admin_url( 'edit.php?post_type=fl-builder-template' ),
1099
  );
1100
  }
1101
 
@@ -1108,8 +1112,8 @@ final class FLBuilder {
1108
  }
1109
  $admin_view['items'][30] = array(
1110
  'label' => __( 'Customize Theme', 'fl-builder' ),
1111
- 'type' => 'link',
1112
- 'url' => $url,
1113
  );
1114
  }
1115
 
@@ -1118,7 +1122,7 @@ final class FLBuilder {
1118
  // Help
1119
  if ( $help['enabled'] && ! $is_simple_ui ) {
1120
  $help_view = array(
1121
- 'name' => __( 'Help', 'fl-builder' ),
1122
  'items' => array(),
1123
  );
1124
 
@@ -1130,15 +1134,15 @@ final class FLBuilder {
1130
  $help['video_embed'] = str_replace( 'height="315"', 'height="173"', $help['video_embed'] );
1131
 
1132
  $help_view['items'][10] = array(
1133
- 'type' => 'video',
1134
  'embed' => $help['video_embed'],
1135
  );
1136
  }
1137
 
1138
  if ( $help['tour'] ) {
1139
  $help_view['items'][20] = array(
1140
- 'label' => __( 'Take A Tour', 'fl-builder' ),
1141
- 'type' => 'event',
1142
  'eventName' => 'beginTour',
1143
  );
1144
  }
@@ -1146,16 +1150,16 @@ final class FLBuilder {
1146
  if ( $help['knowledge_base'] && isset( $help['knowledge_base_url'] ) ) {
1147
  $help_view['items'][30] = array(
1148
  'label' => __( 'View Knowledge Base', 'fl-builder' ),
1149
- 'type' => 'link',
1150
- 'url' => $help['knowledge_base_url'],
1151
  );
1152
  }
1153
 
1154
  if ( $help['forums'] && isset( $help['forums_url'] ) ) {
1155
  $help_view['items'][40] = array(
1156
  'label' => __( 'Contact Support', 'fl-builder' ),
1157
- 'type' => 'link',
1158
- 'url' => $help['forums_url'],
1159
  );
1160
  }
1161
 
@@ -1174,73 +1178,73 @@ final class FLBuilder {
1174
  */
1175
  static function get_keyboard_shortcuts() {
1176
  $default_action = array(
1177
- 'label' => _x( 'Untitled Shortcut', 'A keyboard shortcut with no label given', 'fl-builder' ),
1178
- 'keyCode' => '',
1179
  'keyLabel' => '',
1180
  'isGlobal' => false,
1181
- 'enabled' => true,
1182
  );
1183
- $data = array(
1184
- 'showModules' => array(
1185
- 'label' => _x( 'Open Modules Tab', 'Keyboard action to show modules tab', 'fl-builder' ),
1186
  'keyCode' => 'j',
1187
  ),
1188
- 'showRows' => array(
1189
- 'label' => _x( 'Open Rows Tab', 'Keyboard action to show rows tab', 'fl-builder' ),
1190
  'keyCode' => 'k',
1191
  ),
1192
- 'showTemplates' => array(
1193
- 'label' => _x( 'Open Templates Tab', 'Keyboard action to show templates tab', 'fl-builder' ),
1194
  'keyCode' => 'l',
1195
  ),
1196
- 'showSaved' => array(
1197
- 'label' => _x( 'Open Saved Tab', 'Keyboard action to show saved tab', 'fl-builder' ),
1198
  'keyCode' => ';',
1199
  'enabled' => true !== FL_BUILDER_LITE,
1200
  ),
1201
- 'saveTemplate' => array(
1202
- 'label' => _x( 'Save New Template', 'Keyboard action to open save template form', 'fl-builder' ),
1203
  'keyCode' => 'mod+j',
1204
  'enabled' => true !== FL_BUILDER_LITE,
1205
  ),
1206
- 'previewLayout' => array(
1207
- 'label' => _x( 'Toggle Preview Mode', 'Keyboard action to toggle preview mode', 'fl-builder' ),
1208
  'keyCode' => 'p',
1209
  ),
1210
- 'responsiveEditing' => array(
1211
- 'label' => _x( 'Toggle Responsive Editing Mode', 'Keyboard action to toggle responsive editing', 'fl-builder' ),
1212
  'keyCode' => 'r',
1213
  ),
1214
  'showGlobalSettings' => array(
1215
- 'label' => _x( 'Open Global Settings', 'Keyboard action to open the global settings panel', 'fl-builder' ),
1216
  'keyCode' => 'mod+u',
1217
  ),
1218
  'showLayoutSettings' => array(
1219
- 'label' => _x( 'Open Layout Settings', 'Keyboard action to open the layout settings panel', 'fl-builder' ),
1220
  'keyCode' => 'mod+y',
1221
  ),
1222
- 'toggleUISkin' => array(
1223
- 'label' => _x( 'Change UI Brightness', 'Keyboard action to switch between light and dark UI brightness', 'fl-builder' ),
1224
  'keyCode' => 'o',
1225
  ),
1226
- 'showSearch' => array(
1227
- 'label' => _x( 'Display Module Search', 'Keyboard action to open the module search panel', 'fl-builder' ),
1228
  'keyCode' => 'mod+i',
1229
  'enabled' => true !== FL_BUILDER_LITE,
1230
  ),
1231
- 'showSavedMessage' => array(
1232
- 'label' => _x( 'Save Layout', 'Keyboard action to save changes', 'fl-builder' ),
1233
- 'keyCode' => 'mod+s',
1234
  'isGlobal' => true,
1235
  ),
1236
- 'publishAndRemain' => array(
1237
- 'label' => _x( 'Publish changes without leaving builder', 'Keyboard action to publish any pending changes', 'fl-builder' ),
1238
- 'keyCode' => 'mod+p',
1239
  'isGlobal' => true,
1240
  ),
1241
- 'cancelTask' => array(
1242
- 'label' => _x( 'Dismiss Active Panel', 'Keyboard action to dismiss the current task or panel', 'fl-builder' ),
1243
- 'keyCode' => 'esc',
1244
  'isGlobal' => true,
1245
  ),
1246
  );
@@ -1252,7 +1256,7 @@ final class FLBuilder {
1252
  // Check for old (alpha) format and normalize
1253
  if ( is_string( $args ) ) {
1254
  $args = array(
1255
- 'label' => ucwords( preg_replace( '/([^A-Z])([A-Z])/', '$1 $2', $hook ) ),
1256
  'keyCode' => $args,
1257
  );
1258
  }
@@ -1295,7 +1299,7 @@ final class FLBuilder {
1295
  $code = str_replace( 'right', '&rarr;', $code );
1296
 
1297
  $args['keyLabel'] = $code;
1298
- $data[ $hook ] = $args;
1299
  }
1300
 
1301
  return $data;
@@ -1312,8 +1316,8 @@ final class FLBuilder {
1312
  global $post;
1313
  $simple_ui = ! FLBuilderUserAccess::current_user_can( 'unrestricted_editing' );
1314
 
1315
- $title = apply_filters( 'fl_builder_ui_bar_title', get_the_title( $post->ID ) );
1316
- $icon_url = FLBuilderModel::get_branding_icon();
1317
  $wrapper_classes = array( 'fl-builder-bar-title' );
1318
 
1319
  if ( '' == $icon_url ) {
@@ -1321,8 +1325,8 @@ final class FLBuilder {
1321
  }
1322
 
1323
  $edited_object_label = get_post_type_object( $post->post_type )->labels->singular_name;
1324
- $pretitle = sprintf( _x( 'Currently Editing %s', 'Currently editing message', 'fl-builder' ), $edited_object_label );
1325
- $pretitle = apply_filters( 'fl_builder_ui_bar_pretitle', $pretitle );
1326
 
1327
  // Render the bar title.
1328
  include FL_BUILDER_DIR . 'includes/ui-bar-title-area.php';
@@ -1335,53 +1339,53 @@ final class FLBuilder {
1335
  * @return void
1336
  */
1337
  static public function render_ui_bar_buttons() {
1338
- $help_button = FLBuilderModel::get_help_button_settings();
1339
- $simple_ui = ! FLBuilderUserAccess::current_user_can( 'unrestricted_editing' );
1340
  $should_display_search = ! FLBuilderModel::is_post_user_template( 'module' ) && ! $simple_ui;
1341
- $add_btn_svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="24" height="24"><rect x="0" fill="none" width="24" height="24" /><g><path d="M17 9v2h-6v6H9v-6H3V9h6V3h2v6h6z"/></g></svg>';
1342
- $notifications = FLBuilderNotifications::get_notifications();
1343
- $feedback_label = __( 'Dev Feedback', 'fl-builder' );
1344
- $show_feedback = '{FL_BUILDER_VERSION}' === FL_BUILDER_VERSION;
1345
 
1346
  if ( strstr( FL_BUILDER_VERSION, '-dev' ) ) {
1347
  $show_feedback = true;
1348
  } elseif ( strstr( FL_BUILDER_VERSION, '-alpha' ) ) {
1349
  $feedback_label = __( 'Alpha Feedback', 'fl-builder' );
1350
- $show_feedback = true;
1351
  } elseif ( strstr( FL_BUILDER_VERSION, '-beta' ) ) {
1352
  $feedback_label = __( 'Beta Feedback', 'fl-builder' );
1353
- $show_feedback = true;
1354
  }
1355
 
1356
  $buttons = apply_filters( 'fl_builder_ui_bar_buttons', array(
1357
- 'feedback' => array(
1358
- 'label' => $feedback_label . ' <i class="fas fa-external-link-alt"></i>',
1359
- 'show' => $show_feedback,
1360
  'onclick' => "window.open('" . FLBuilderModel::get_store_url( 'contact', array(
1361
- 'topic' => 'Pre-Release Feedback',
1362
  'utm_medium' => true === FL_BUILDER_LITE ? 'bb-lite' : 'bb-pro',
1363
  'utm_source' => 'builder-ui',
1364
  'utm_campaign' => 'feedback-cta',
1365
  ) ) . "');",
1366
  ),
1367
- 'upgrade' => array(
1368
  'label' => __( 'Upgrade Today', 'fl-builder' ) . ' <i class="fas fa-external-link-alt"></i>',
1369
- 'show' => true === FL_BUILDER_LITE,
1370
  ),
1371
- 'buy' => array(
1372
  'label' => __( 'Buy Now', 'fl-builder' ) . ' <i class="fas fa-external-link-alt"></i>',
1373
- 'show' => stristr( home_url(), 'demo.wpbeaverbuilder.com' ),
1374
  ),
1375
- 'done' => array(
1376
  'label' => __( 'Done', 'fl-builder' ),
1377
  ),
1378
  'content-panel' => array(
1379
  'label' => $add_btn_svg,
1380
- 'show' => ! $simple_ui,
1381
  ),
1382
- 'add-content' => array( // Only added here for backwards compat.
1383
  'label' => $add_btn_svg,
1384
- 'show' => ! $simple_ui,
1385
  ),
1386
  ) );
1387
 
@@ -1517,15 +1521,26 @@ final class FLBuilder {
1517
  // Prevent the builder's render_content filter from running.
1518
  add_filter( 'fl_builder_do_render_content', '__return_false' );
1519
 
1520
- // Fire the render content start action.
 
 
 
1521
  do_action( 'fl_builder_render_content_start' );
1522
 
1523
  // Render the content.
1524
  ob_start();
 
 
 
 
1525
  do_action( 'fl_builder_before_render_content' );
1526
  echo '<' . $tag . ' class="' . self::render_content_classes() . '" data-post-id="' . $post_id . '"' . $attr_string . '>';
1527
  self::render_nodes();
1528
  echo '</' . $tag . '>';
 
 
 
 
1529
  do_action( 'fl_builder_after_render_content' );
1530
  $content = ob_get_clean();
1531
 
@@ -1547,7 +1562,10 @@ final class FLBuilder {
1547
  $content = wp_make_content_images_responsive( $content );
1548
  }
1549
 
1550
- // Fire the render content complete action.
 
 
 
1551
  do_action( 'fl_builder_render_content_complete' );
1552
 
1553
  // Stop forcing the builder to use this post ID.
@@ -1568,12 +1586,12 @@ final class FLBuilder {
1568
  * @return string
1569
  */
1570
  static public function render_content( $content ) {
1571
- $post_id = FLBuilderModel::get_post_id( true );
1572
- $enabled = FLBuilderModel::is_builder_enabled( $post_id );
1573
- $rendering = $post_id === self::$post_rendering;
1574
- $do_render = apply_filters( 'fl_builder_do_render_content', true, $post_id );
1575
- $in_loop = in_the_loop();
1576
- $is_global = in_array( $post_id, FLBuilderModel::get_global_posts() );
1577
 
1578
  if ( $enabled && ! $rendering && $do_render && ( $in_loop || $is_global ) ) {
1579
 
@@ -1647,12 +1665,20 @@ final class FLBuilder {
1647
  * @return void
1648
  */
1649
  static public function render_nodes() {
 
 
 
 
1650
  do_action( 'fl_builder_before_render_nodes' );
1651
 
1652
  if ( apply_filters( 'fl_builder_render_nodes', true ) ) {
1653
  self::render_rows();
1654
  }
1655
 
 
 
 
 
1656
  do_action( 'fl_builder_after_render_nodes' );
1657
  }
1658
 
@@ -1760,14 +1786,14 @@ final class FLBuilder {
1760
  $content = ob_get_clean();
1761
 
1762
  // Remove unnecessary tags and attributes.
1763
- $content = preg_replace( '/<\/?div[^>]*\>/i', '', $content );
1764
- $content = preg_replace( '/<\/?span[^>]*\>/i', '', $content );
1765
- $content = preg_replace( '#<script(.*?)>(.*?)</script>#is', '', $content );
1766
- $content = preg_replace( '/<\/?noscript[^>]*\>/i', '', $content );
1767
- $content = preg_replace( '#<svg(.*?)>(.*?)</svg>#is', '', $content );
1768
- $content = preg_replace( '/<i [^>]*><\\/i[^>]*>/', '', $content );
1769
- $content = preg_replace( '/ class=".*?"/', '', $content );
1770
- $content = preg_replace( '/ style=".*?"/', '', $content );
1771
 
1772
  // Remove empty lines.
1773
  $content = preg_replace( '/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/', "\n", $content );
@@ -1840,12 +1866,20 @@ final class FLBuilder {
1840
  static public function render_rows() {
1841
  $rows = FLBuilderModel::get_nodes( 'row' );
1842
 
 
 
 
 
1843
  do_action( 'fl_builder_before_render_rows', $rows );
1844
 
1845
  foreach ( $rows as $row ) {
1846
  self::render_row( $row );
1847
  }
1848
 
 
 
 
 
1849
  do_action( 'fl_builder_after_render_rows', $rows );
1850
  }
1851
 
@@ -1859,13 +1893,17 @@ final class FLBuilder {
1859
  static public function render_row( $row ) {
1860
  global $wp_the_query;
1861
 
1862
- $groups = FLBuilderModel::get_nodes( 'column-group', $row );
1863
  $post_id = FLBuilderModel::get_post_id();
1864
- $active = FLBuilderModel::is_builder_active() && $post_id == $wp_the_query->post->ID;
1865
  $visible = FLBuilderModel::is_node_visible( $row );
1866
 
1867
  if ( $active || $visible ) {
1868
 
 
 
 
 
1869
  do_action( 'fl_builder_before_render_row', $row, $groups );
1870
 
1871
  $template_file = self::locate_template_file(
@@ -1877,6 +1915,10 @@ final class FLBuilder {
1877
  include $template_file;
1878
  }
1879
 
 
 
 
 
1880
  do_action( 'fl_builder_after_render_row', $row, $groups );
1881
  }
1882
  }
@@ -1896,18 +1938,18 @@ final class FLBuilder {
1896
  */
1897
  $custom_class = apply_filters( 'fl_builder_row_custom_class', $row->settings->class, $row );
1898
  $overlay_bgs = array( 'photo', 'parallax', 'slideshow', 'video' );
1899
- $active = FLBuilderModel::is_builder_active();
1900
- $visible = FLBuilderModel::is_node_visible( $row );
1901
- $has_rules = FLBuilderModel::node_has_visibility_rules( $row );
1902
  $attrs = array(
1903
- 'id' => $row->settings->id,
1904
- 'class' => array(
1905
  'fl-row',
1906
  'fl-row-' . $row->settings->width . '-width',
1907
  'fl-row-bg-' . $row->settings->bg_type,
1908
  'fl-node-' . $row->node,
1909
  ),
1910
- 'data-node' => $row->node,
1911
  );
1912
 
1913
  // Classes
@@ -1938,7 +1980,7 @@ final class FLBuilder {
1938
  $attrs['class'][] = 'fl-visible-' . $row->settings->responsive_display;
1939
  }
1940
  if ( is_array( $row->settings->animation ) && ! empty( $row->settings->animation['style'] ) ) {
1941
- $attrs['class'][] = 'fl-animation fl-' . $row->settings->animation['style'];
1942
  $attrs['data-animation-delay'][] = $row->settings->animation['delay'];
1943
  if ( isset( $row->settings->animation['duration'] ) ) {
1944
  $attrs['data-animation-duration'][] = $row->settings->animation['duration'];
@@ -1974,6 +2016,10 @@ final class FLBuilder {
1974
  * @return void
1975
  */
1976
  static public function render_row_bg( $row ) {
 
 
 
 
1977
  do_action( 'fl_builder_before_render_row_bg', $row );
1978
 
1979
  if ( 'video' == $row->settings->bg_type ) {
@@ -1994,6 +2040,10 @@ final class FLBuilder {
1994
  echo '<div class="fl-bg-slideshow"></div>';
1995
  }
1996
 
 
 
 
 
1997
  do_action( 'fl_builder_after_render_row_bg', $row );
1998
  }
1999
 
@@ -2020,6 +2070,10 @@ final class FLBuilder {
2020
  static public function render_column_group( $group ) {
2021
  $cols = FLBuilderModel::get_nodes( 'column', $group );
2022
 
 
 
 
 
2023
  do_action( 'fl_builder_before_render_column_group', $group, $cols );
2024
 
2025
  $template_file = self::locate_template_file(
@@ -2030,7 +2084,10 @@ final class FLBuilder {
2030
  if ( $template_file ) {
2031
  include $template_file;
2032
  }
2033
-
 
 
 
2034
  do_action( 'fl_builder_after_render_column_group', $group, $cols );
2035
  }
2036
 
@@ -2045,7 +2102,7 @@ final class FLBuilder {
2045
  $cols = FLBuilderModel::get_nodes( 'column', $group );
2046
  $parent = FLBuilderModel::get_node_parent( $group );
2047
  $attrs = array(
2048
- 'class' => array(
2049
  'fl-col-group',
2050
  'fl-node-' . $group->node,
2051
  ),
@@ -2093,9 +2150,9 @@ final class FLBuilder {
2093
  static public function render_column( $col_id = null ) {
2094
  global $wp_the_query;
2095
 
2096
- $col = is_object( $col_id ) ? $col_id : FLBuilderModel::get_node( $col_id );
2097
  $post_id = FLBuilderModel::get_post_id();
2098
- $active = FLBuilderModel::is_builder_active() && $post_id == $wp_the_query->post->ID;
2099
  $visible = FLBuilderModel::is_node_visible( $col );
2100
 
2101
  if ( $active || $visible ) {
@@ -2119,17 +2176,17 @@ final class FLBuilder {
2119
  $custom_class = apply_filters( 'fl_builder_column_custom_class', $col->settings->class, $col );
2120
  $overlay_bgs = array( 'photo' );
2121
  $nested = FLBuilderModel::get_nodes( 'column-group', $col );
2122
- $active = FLBuilderModel::is_builder_active();
2123
- $visible = FLBuilderModel::is_node_visible( $col );
2124
- $has_rules = FLBuilderModel::node_has_visibility_rules( $col );
2125
  $attrs = array(
2126
- 'id' => $col->settings->id,
2127
- 'class' => array(
2128
  'fl-col',
2129
  'fl-node-' . $col->node,
2130
  ),
2131
- 'data-node' => $col->node,
2132
- 'style' => array(),
2133
  );
2134
 
2135
  // Classes
@@ -2150,7 +2207,7 @@ final class FLBuilder {
2150
  $attrs['class'][] = 'fl-visible-' . $col->settings->responsive_display;
2151
  }
2152
  if ( is_array( $col->settings->animation ) && ! empty( $col->settings->animation['style'] ) ) {
2153
- $attrs['class'][] = 'fl-animation fl-' . $col->settings->animation['style'];
2154
  $attrs['data-animation-delay'][] = $col->settings->animation['delay'];
2155
  if ( isset( $col->settings->animation['duration'] ) ) {
2156
  $attrs['data-animation-duration'][] = $col->settings->animation['duration'];
@@ -2171,7 +2228,10 @@ final class FLBuilder {
2171
  $attrs['style'][] = 'width: ' . $col->settings->size . '%;';
2172
  }
2173
 
2174
- // Render the attrs
 
 
 
2175
  self::render_node_attributes( apply_filters( 'fl_builder_column_attributes', $attrs, $col ) );
2176
  }
2177
 
@@ -2185,6 +2245,10 @@ final class FLBuilder {
2185
  static public function render_modules( $col_id = null ) {
2186
  $nodes = FLBuilderModel::get_nodes( null, $col_id );
2187
 
 
 
 
 
2188
  do_action( 'fl_builder_before_render_modules', $nodes, $col_id );
2189
 
2190
  foreach ( $nodes as $node ) {
@@ -2195,7 +2259,10 @@ final class FLBuilder {
2195
  self::render_column_group( $node );
2196
  }
2197
  }
2198
-
 
 
 
2199
  do_action( 'fl_builder_after_render_modules', $nodes, $col_id );
2200
  }
2201
 
@@ -2209,26 +2276,34 @@ final class FLBuilder {
2209
  static public function render_module( $module_id = null ) {
2210
  global $wp_the_query;
2211
 
2212
- $module = FLBuilderModel::get_module( $module_id );
2213
- $settings = $module->settings;
2214
- $id = $module->node;
2215
- $post_id = FLBuilderModel::get_post_id();
2216
- $active = FLBuilderModel::is_builder_active() && $post_id == $wp_the_query->post->ID;
2217
- $visible = FLBuilderModel::is_node_visible( $module );
2218
 
2219
  if ( $active || $visible ) {
2220
 
 
 
 
 
2221
  do_action( 'fl_builder_before_render_module', $module );
2222
 
2223
  $template_file = self::locate_template_file(
2224
  apply_filters( 'fl_builder_module_template_base', 'module', $module ),
2225
- apply_filters( 'fl_builder_module_template_slug', '', $module )
2226
  );
2227
 
2228
  if ( $template_file ) {
2229
  include $template_file;
2230
  }
2231
 
 
 
 
 
2232
  do_action( 'fl_builder_after_render_module', $module );
2233
  }
2234
  }
@@ -2250,23 +2325,37 @@ final class FLBuilder {
2250
  $settings = (object) array_merge( (array) $defaults, (array) $settings );
2251
 
2252
  // Module
2253
- $class = get_class( FLBuilderModel::$modules[ $type ] );
2254
- $module = new $class();
2255
  $module->settings = FLBuilderSettingsCompat::filter_node_settings( 'module', $settings );
2256
 
2257
  // Shorthand reference to the module's id.
2258
  $id = $module->node;
2259
 
 
 
 
 
 
2260
  do_action( 'fl_builder_render_module_html_before', $type, $settings, $module );
2261
 
2262
  ob_start();
2263
 
2264
- include apply_filters( 'fl_builder_render_module_html', $module->dir . 'includes/frontend.php', $type, $settings, $module );
 
 
 
 
2265
 
2266
  $content = ob_get_clean();
2267
 
2268
  echo apply_filters( 'fl_builder_render_module_html_content', $content, $type, $settings, $module );
2269
 
 
 
 
 
 
2270
  do_action( 'fl_builder_render_module_html_after', $type, $settings, $module );
2271
  }
2272
 
@@ -2284,17 +2373,17 @@ final class FLBuilder {
2284
  * @link https://kb.wpbeaverbuilder.com/article/117-plugin-filter-reference
2285
  */
2286
  $custom_class = apply_filters( 'fl_builder_module_custom_class', $module->settings->class, $module );
2287
- $active = FLBuilderModel::is_builder_active();
2288
- $visible = FLBuilderModel::is_node_visible( $module );
2289
- $has_rules = FLBuilderModel::node_has_visibility_rules( $module );
2290
  $attrs = array(
2291
- 'id' => esc_attr( $module->settings->id ),
2292
- 'class' => array(
2293
  'fl-module',
2294
  'fl-module-' . $module->settings->type,
2295
  'fl-node-' . $module->node,
2296
  ),
2297
- 'data-node' => $module->node,
2298
  );
2299
 
2300
  // Classes
@@ -2302,7 +2391,7 @@ final class FLBuilder {
2302
  $attrs['class'][] = 'fl-visible-' . $module->settings->responsive_display;
2303
  }
2304
  if ( is_array( $module->settings->animation ) && ! empty( $module->settings->animation['style'] ) ) {
2305
- $attrs['class'][] = 'fl-animation fl-' . $module->settings->animation['style'];
2306
  $attrs['data-animation-delay'][] = $module->settings->animation['delay'];
2307
  if ( isset( $module->settings->animation['duration'] ) ) {
2308
  $attrs['data-animation-duration'][] = $module->settings->animation['duration'];
@@ -2321,11 +2410,14 @@ final class FLBuilder {
2321
  // Data
2322
  if ( $active ) {
2323
  $attrs['data-parent'] = $module->parent;
2324
- $attrs['data-type'] = $module->settings->type;
2325
- $attrs['data-name'] = $module->name;
2326
  }
2327
 
2328
- // Render the attrs
 
 
 
2329
  self::render_node_attributes( apply_filters( 'fl_builder_module_attributes', $attrs, $module ) );
2330
  }
2331
 
@@ -2347,13 +2439,13 @@ final class FLBuilder {
2347
  static public function render_module_css( $type, $id, $settings ) {
2348
  // Settings
2349
  $global_settings = FLBuilderModel::get_global_settings();
2350
- $defaults = FLBuilderModel::get_module_defaults( $type );
2351
- $settings = (object) array_merge( (array) $defaults, (array) $settings );
2352
- $settings = apply_filters( 'fl_builder_render_module_css_settings', $settings, $id, $type );
2353
 
2354
  // Module
2355
- $class = get_class( FLBuilderModel::$modules[ $type ] );
2356
- $module = new $class();
2357
  $module->settings = FLBuilderSettingsCompat::filter_node_settings( 'module', $settings );
2358
 
2359
  // CSS
@@ -2405,16 +2497,16 @@ final class FLBuilder {
2405
  */
2406
 
2407
  static public function render_css( $include_global = true ) {
2408
- $active = FLBuilderModel::is_builder_active();
2409
- $nodes = FLBuilderModel::get_categorized_nodes();
2410
- $node_status = FLBuilderModel::get_node_status();
2411
- $global_settings = FLBuilderModel::get_global_settings();
2412
- $asset_info = FLBuilderModel::get_asset_info();
2413
- $enqueuemethod = FLBuilderModel::get_asset_enqueue_method();
2414
- $post_id = FLBuilderModel::get_post_id();
2415
- $post = get_post( $post_id );
2416
- $css = '';
2417
- $path = $include_global ? $asset_info['css'] : $asset_info['css_partial'];
2418
 
2419
  // Render the global css.
2420
  if ( $include_global ) {
@@ -2426,7 +2518,7 @@ final class FLBuilder {
2426
 
2427
  // Instance row css
2428
  $settings = $row->settings;
2429
- $id = $row->node;
2430
  ob_start();
2431
  include FL_BUILDER_DIR . 'includes/row-css.php';
2432
  FLBuilderCSS::render();
@@ -2447,7 +2539,7 @@ final class FLBuilder {
2447
 
2448
  // Instance column css
2449
  $settings = $col->settings;
2450
- $id = $col->node;
2451
  ob_start();
2452
  include FL_BUILDER_DIR . 'includes/column-css.php';
2453
  FLBuilderCSS::render();
@@ -2467,7 +2559,7 @@ final class FLBuilder {
2467
  foreach ( $nodes['modules'] as $module ) {
2468
 
2469
  // Global module css
2470
- $file = $module->dir . 'css/frontend.css';
2471
  $file_responsive = $module->dir . 'css/frontend.responsive.css';
2472
 
2473
  // Only include global module css that hasn't been included yet.
@@ -2490,9 +2582,9 @@ final class FLBuilder {
2490
  }
2491
 
2492
  // Instance module css
2493
- $file = $module->dir . 'includes/frontend.css.php';
2494
- $settings = $module->settings;
2495
- $id = $module->node;
2496
 
2497
  if ( ! in_array( $id, self::$enqueued_module_css_assets ) && fl_builder_filesystem()->file_exists( $file ) ) {
2498
  self::$enqueued_module_css_assets[] = $id;
@@ -2549,6 +2641,10 @@ final class FLBuilder {
2549
  fl_builder_filesystem()->file_put_contents( $path, $css );
2550
  }
2551
 
 
 
 
 
2552
  do_action( 'fl_builder_after_render_css' );
2553
 
2554
  return $css;
@@ -2565,31 +2661,31 @@ final class FLBuilder {
2565
  $global_settings = FLBuilderModel::get_global_settings();
2566
 
2567
  // Core layout css
2568
- $css = fl_builder_filesystem()->file_get_contents( FL_BUILDER_DIR . '/css/fl-builder-layout.css' );
2569
 
2570
  // Core button defaults
2571
  if ( ! defined( 'FL_THEME_VERSION' ) ) {
2572
- $css .= fl_builder_filesystem()->file_get_contents( FL_BUILDER_DIR . '/css/fl-builder-layout-button-defaults.css' );
2573
  }
2574
 
2575
  // Core layout RTL css
2576
  if ( is_rtl() ) {
2577
- $css .= fl_builder_filesystem()->file_get_contents( FL_BUILDER_DIR . '/css/fl-builder-layout-rtl.css' );
2578
  }
2579
 
2580
  // Global node css
2581
  foreach ( array(
2582
- array( 'row_margins', '.fl-row-content-wrap { margin: ' ),
2583
- array( 'row_padding', '.fl-row-content-wrap { padding: ' ),
2584
- array( 'row_width', '.fl-row-fixed-width { max-width: ' ),
2585
- array( 'column_margins', '.fl-col-content { margin: ' ),
2586
- array( 'column_padding', '.fl-col-content { padding: ' ),
2587
  array( 'module_margins', '.fl-module-content { margin: ' ),
2588
  ) as $data ) {
2589
  if ( '' !== $global_settings->{ $data[0] } ) {
2590
  $value = preg_replace( self::regex( 'css_unit' ), '', strtolower( $global_settings->{ $data[0] } ) );
2591
- $css .= $data[1] . esc_attr( $value );
2592
- $css .= ( is_numeric( $value ) ) ? ( $global_settings->{ $data[0] . '_unit' } . '; }' ) : ( '; }' );
2593
  }
2594
  }
2595
 
@@ -2600,20 +2696,20 @@ final class FLBuilder {
2600
  $css .= '@media (max-width: ' . $global_settings->medium_breakpoint . 'px) { ';
2601
 
2602
  // Core medium layout css
2603
- $css .= fl_builder_filesystem()->file_get_contents( FL_BUILDER_DIR . '/css/fl-builder-layout-medium.css' );
2604
 
2605
  // Global node medium css
2606
  foreach ( array(
2607
- array( 'row_margins_medium', '.fl-row[data-node] > .fl-row-content-wrap { margin: ' ),
2608
- array( 'row_padding_medium', '.fl-row[data-node] > .fl-row-content-wrap { padding: ' ),
2609
- array( 'column_margins_medium', '.fl-col[data-node] > .fl-col-content { margin: ' ),
2610
- array( 'column_padding_medium', '.fl-col[data-node] > .fl-col-content { padding: ' ),
2611
- array( 'module_margins_medium', '.fl-module[data-node] > .fl-module-content { margin: ' ),
2612
- ) as $data ) {
2613
  if ( '' !== $global_settings->{ $data[0] } ) {
2614
  $value = preg_replace( self::regex( 'css_unit' ), '', strtolower( $global_settings->{ $data[0] } ) );
2615
- $css .= $data[1] . esc_attr( $value );
2616
- $css .= ( is_numeric( $value ) ) ? ( $global_settings->{ $data[0] . '_unit' } . '; }' ) : ( '; }' );
2617
  }
2618
  }
2619
 
@@ -2623,25 +2719,25 @@ final class FLBuilder {
2623
  $css .= '@media (max-width: ' . $global_settings->responsive_breakpoint . 'px) { ';
2624
 
2625
  // Core responsive layout css
2626
- $css .= fl_builder_filesystem()->file_get_contents( FL_BUILDER_DIR . '/css/fl-builder-layout-responsive.css' );
2627
 
2628
  // Auto spacing
2629
  if ( ! isset( $global_settings->auto_spacing ) || $global_settings->auto_spacing ) {
2630
- $css .= fl_builder_filesystem()->file_get_contents( FL_BUILDER_DIR . '/css/fl-builder-layout-auto-spacing.css' );
2631
  }
2632
 
2633
  // Global node responsive css
2634
  foreach ( array(
2635
- array( 'row_margins_responsive', '.fl-row[data-node] > .fl-row-content-wrap { margin: ' ),
2636
- array( 'row_padding_responsive', '.fl-row[data-node] > .fl-row-content-wrap { padding: ' ),
2637
- array( 'column_margins_responsive', '.fl-col[data-node] > .fl-col-content { margin: ' ),
2638
- array( 'column_padding_responsive', '.fl-col[data-node] > .fl-col-content { padding: ' ),
2639
- array( 'module_margins_responsive', '.fl-module[data-node] > .fl-module-content { margin: ' ),
2640
- ) as $data ) {
2641
  if ( '' !== $global_settings->{ $data[0] } ) {
2642
  $value = preg_replace( self::regex( 'css_unit' ), '', strtolower( $global_settings->{ $data[0] } ) );
2643
- $css .= $data[1] . esc_attr( $value );
2644
- $css .= ( is_numeric( $value ) ) ? ( $global_settings->{ $data[0] . '_unit' } . '; }' ) : ( '; }' );
2645
  }
2646
  }
2647
 
@@ -2746,8 +2842,8 @@ final class FLBuilder {
2746
  // Iterate over each direction
2747
  foreach ( array( 'top', 'right', 'bottom', 'left' ) as $dir ) {
2748
  $setting_key = $prop_type . '_' . $dir . $setting_suffix;
2749
- $unit_key = $prop_type . $setting_suffix . '_unit';
2750
- $unit = isset( $settings->{ $unit_key } ) ? $settings->{ $unit_key } : 'px';
2751
 
2752
  if ( ! isset( $settings->{ $setting_key } ) ) {
2753
  continue;
@@ -2921,7 +3017,7 @@ final class FLBuilder {
2921
  }
2922
 
2923
  self::$enqueued_global_assets[] = 'animation-' . $settings->animation['style'];
2924
- $path = FL_BUILDER_DIR . 'css/animations/' . $settings->animation['style'] . '.css';
2925
 
2926
  if ( file_exists( $path ) ) {
2927
  $css = file_get_contents( $path );
@@ -2937,7 +3033,7 @@ final class FLBuilder {
2937
  * @return string A CSS string.
2938
  */
2939
  static public function render_all_animation_css() {
2940
- $css = '';
2941
  $animations = glob( FL_BUILDER_DIR . 'css/animations/*.css' );
2942
 
2943
  if ( ! is_array( $animations ) ) {
@@ -2952,7 +3048,7 @@ final class FLBuilder {
2952
  }
2953
 
2954
  self::$enqueued_global_assets[] = 'animation-' . $key;
2955
- $css .= file_get_contents( $path );
2956
  }
2957
 
2958
  return $css;
@@ -2967,14 +3063,14 @@ final class FLBuilder {
2967
  */
2968
  static public function render_js( $include_global = true ) {
2969
  // Get info on the new file.
2970
- $nodes = FLBuilderModel::get_categorized_nodes();
2971
- $global_settings = FLBuilderModel::get_global_settings();
2972
- $layout_settings = FLBuilderModel::get_layout_settings();
2973
- $rows = FLBuilderModel::get_nodes( 'row' );
2974
- $asset_info = FLBuilderModel::get_asset_info();
2975
- $enqueuemethod = FLBuilderModel::get_asset_enqueue_method();
2976
- $js = '';
2977
- $path = $include_global ? $asset_info['js'] : $asset_info['js_partial'];
2978
 
2979
  // Render the global js.
2980
  if ( $include_global && ! isset( $_GET['safemode'] ) ) {
@@ -3021,7 +3117,8 @@ final class FLBuilder {
3021
  if ( ! self::is_debug() ) {
3022
  try {
3023
  $min = FLJSMin::minify( $js );
3024
- } catch ( Exception $e ) {}
 
3025
 
3026
  if ( isset( $min ) ) {
3027
  $js = $min;
@@ -3033,6 +3130,10 @@ final class FLBuilder {
3033
  fl_builder_filesystem()->file_put_contents( $path, $js );
3034
  }
3035
 
 
 
 
 
3036
  do_action( 'fl_builder_after_render_js' );
3037
  }
3038
 
@@ -3047,7 +3148,7 @@ final class FLBuilder {
3047
  */
3048
  static public function render_global_js() {
3049
  $global_settings = FLBuilderModel::get_global_settings();
3050
- $js = '';
3051
 
3052
  // Add the path legacy vars (FLBuilderLayoutConfig.paths should be used instead).
3053
  $js .= "var wpAjaxUrl = '" . admin_url( 'admin-ajax.php' ) . "';";
@@ -3075,9 +3176,9 @@ final class FLBuilder {
3075
  * @return string
3076
  */
3077
  static public function render_row_js( $row_id ) {
3078
- $row = is_object( $row_id ) ? $row_id : FLBuilderModel::get_node( $row_id );
3079
- $settings = $row->settings;
3080
- $id = $row->node;
3081
 
3082
  ob_start();
3083
  include FL_BUILDER_DIR . 'includes/row-js.php';
@@ -3092,10 +3193,10 @@ final class FLBuilder {
3092
  * @return string
3093
  */
3094
  static public function render_row_modules_js( $row_id ) {
3095
- $row = is_object( $row_id ) ? $row_id : FLBuilderModel::get_node( $row_id );
3096
- $nodes = FLBuilderModel::get_categorized_nodes();
3097
- $template_post_id = FLBuilderModel::is_node_global( $row );
3098
- $js = '';
3099
 
3100
  // Render the JS.
3101
  foreach ( $nodes['groups'] as $group ) {
@@ -3124,9 +3225,9 @@ final class FLBuilder {
3124
  * @return string
3125
  */
3126
  static public function render_column_group_modules_js( $group_id ) {
3127
- $group = is_object( $group_id ) ? $group_id : FLBuilderModel::get_node( $group_id );
3128
- $nodes = FLBuilderModel::get_categorized_nodes();
3129
- $js = '';
3130
 
3131
  // Render the JS.
3132
  foreach ( $nodes['columns'] as $column ) {
@@ -3151,9 +3252,9 @@ final class FLBuilder {
3151
  * @return string
3152
  */
3153
  static public function render_column_modules_js( $col_id ) {
3154
- $col = is_object( $col_id ) ? $col_id : FLBuilderModel::get_node( $col_id );
3155
- $nodes = FLBuilderModel::get_categorized_nodes();
3156
- $js = '';
3157
 
3158
  // Render the JS.
3159
  foreach ( $nodes['modules'] as $module ) {
@@ -3174,22 +3275,22 @@ final class FLBuilder {
3174
  * @return string
3175
  */
3176
  static public function render_module_js( $module_id ) {
3177
- $module = is_object( $module_id ) ? $module_id : FLBuilderModel::get_module( $module_id );
3178
- $global_settings = FLBuilderModel::get_global_settings();
3179
- $js = '';
3180
 
3181
  // Global module JS
3182
  $file = $module->dir . 'js/frontend.js';
3183
 
3184
  if ( fl_builder_filesystem()->file_exists( $file ) && ! in_array( $module->settings->type . '-module-js', self::$enqueued_global_assets ) ) {
3185
- $js .= "\n" . fl_builder_filesystem()->file_get_contents( $file );
3186
  self::$enqueued_global_assets[] = $module->settings->type . '-module-js';
3187
  }
3188
 
3189
  // Instance module JS
3190
- $file = $module->dir . 'includes/frontend.js.php';
3191
- $settings = $module->settings;
3192
- $id = $module->node;
3193
 
3194
  if ( ! in_array( $id, self::$enqueued_module_js_assets ) && fl_builder_filesystem()->file_exists( $file ) ) {
3195
  self::$enqueued_module_js_assets[] = $id;
@@ -3208,12 +3309,12 @@ final class FLBuilder {
3208
  * @since 1.7
3209
  */
3210
  static public function render_global_nodes_custom_code( $type = 'css' ) {
3211
- $code = '';
3212
- $rendered = array();
3213
 
3214
  if ( ! FLBuilderModel::is_post_node_template() ) {
3215
 
3216
- $nodes = FLBuilderModel::get_layout_data();
3217
  $node_status = FLBuilderModel::get_node_status();
3218
 
3219
  foreach ( $nodes as $node_id => $node ) {
@@ -3223,7 +3324,7 @@ final class FLBuilder {
3223
  if ( $template_post_id && ! in_array( $template_post_id, $rendered ) ) {
3224
 
3225
  $rendered[] = $template_post_id;
3226
- $code .= FLBuilderModel::get_layout_settings( $node_status, $template_post_id )->{ $type };
3227
  }
3228
  }
3229
  }
@@ -3326,7 +3427,20 @@ final class FLBuilder {
3326
  * @return string url
3327
  */
3328
  static public function get_fa5_url() {
3329
- return ( apply_filters( 'fl_enable_fa5_pro', false ) ) ? self::$fa5_pro_url : plugins_url( '/fonts/fontawesome/css/all.min.css', FL_BUILDER_FILE );
 
 
 
 
 
 
 
 
 
 
 
 
 
3330
  }
3331
 
3332
  /**
67
  * Font awesome urls.
68
  * @since 2.1
69
  */
70
+ static public $fa4_url = 'https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css';
71
+ static public $fa5_pro_url = 'https://pro.fontawesome.com/releases/v5.7.1/css/all.css';
72
 
73
  /**
74
  * Initializes hooks.
78
  */
79
  static public function init() {
80
  /* Actions */
81
+ add_action( 'plugins_loaded', __CLASS__ . '::load_plugin_textdomain' );
82
+ add_action( 'send_headers', __CLASS__ . '::no_cache_headers' );
83
+ add_action( 'wp', __CLASS__ . '::init_ui', 11 );
84
+ add_action( 'wp', __CLASS__ . '::rich_edit' );
85
+ add_action( 'wp_enqueue_scripts', __CLASS__ . '::register_layout_styles_scripts' );
86
+ add_action( 'wp_enqueue_scripts', __CLASS__ . '::enqueue_ui_styles_scripts', 11 );
87
+ add_action( 'wp_enqueue_scripts', __CLASS__ . '::enqueue_all_layouts_styles_scripts' );
88
+ add_action( 'wp_head', __CLASS__ . '::render_custom_css_for_editing', 999 );
89
+ add_action( 'admin_bar_menu', __CLASS__ . '::admin_bar_menu', 999 );
90
+ add_action( 'wp_footer', __CLASS__ . '::render_ui' );
91
 
92
  /* Filters */
93
+ add_filter( 'fl_builder_render_css', __CLASS__ . '::rewrite_css_cache_urls', 9999 );
94
+ add_filter( 'body_class', __CLASS__ . '::body_class' );
95
+ add_filter( 'wp_default_editor', __CLASS__ . '::default_editor' );
96
+ add_filter( 'mce_css', __CLASS__ . '::add_editor_css' );
97
+ add_filter( 'mce_buttons', __CLASS__ . '::editor_buttons' );
98
+ add_filter( 'mce_buttons_2', __CLASS__ . '::editor_buttons_2' );
99
+ add_filter( 'mce_external_plugins', __CLASS__ . '::editor_external_plugins', 9999 );
100
+ add_filter( 'tiny_mce_before_init', __CLASS__ . '::editor_font_sizes' );
101
+ add_filter( 'the_content', __CLASS__ . '::render_content' );
102
+ add_filter( 'wp_handle_upload_prefilter', __CLASS__ . '::wp_handle_upload_prefilter_filter' );
103
  }
104
 
105
  /**
383
  $min = ( self::is_debug() ) ? '' : '.min';
384
 
385
  // Register additional CSS
386
+ wp_register_style( 'fl-slideshow', $css_url . 'fl-slideshow.css', array( 'yui3' ), $ver );
387
+ wp_register_style( 'jquery-bxslider', $css_url . 'jquery.bxslider.css', array(), $ver );
388
+ wp_register_style( 'jquery-magnificpopup', $css_url . 'jquery.magnificpopup' . $min . '.css', array(), $ver );
389
+ wp_register_style( 'yui3', $css_url . 'yui3.css', array(), $ver );
390
 
391
  // Register icon CDN CSS
392
+ wp_register_style( 'font-awesome', self::$fa4_url, array(), $ver );
393
+ wp_register_style( 'font-awesome-5', self::get_fa5_url(), array(), $ver );
394
+ wp_register_style( 'foundation-icons', 'https://cdnjs.cloudflare.com/ajax/libs/foundicons/3.0.0/foundation-icons.css', array(), $ver );
395
 
396
  // Register additional JS
397
+ wp_register_script( 'fl-slideshow', $js_url . 'fl-slideshow' . $min . '.js', array( 'yui3' ), $ver, true );
398
+ wp_register_script( 'fl-gallery-grid', $js_url . 'fl-gallery-grid.js', array( 'jquery' ), $ver, true );
399
+ wp_register_script( 'jquery-bxslider', $js_url . 'jquery.bxslider.js', array( 'jquery-easing', 'jquery-fitvids' ), $ver, true );
400
+ wp_register_script( 'jquery-easing', $js_url . 'jquery.easing.min.js', array( 'jquery' ), '1.4', true );
401
+ wp_register_script( 'jquery-fitvids', $js_url . 'jquery.fitvids.min.js', array( 'jquery' ), '1.2', true );
402
  wp_register_script( 'jquery-infinitescroll', $js_url . 'jquery.infinitescroll.min.js', array( 'jquery' ), $ver, true );
403
+ wp_register_script( 'jquery-magnificpopup', $js_url . 'jquery.magnificpopup.min.js', array( 'jquery' ), $ver, true );
404
+ wp_register_script( 'jquery-mosaicflow', $js_url . 'jquery.mosaicflow.min.js', array( 'jquery' ), $ver, true );
405
+ wp_register_script( 'jquery-waypoints', $js_url . 'jquery.waypoints.min.js', array( 'jquery' ), $ver, true );
406
+ wp_register_script( 'jquery-wookmark', $js_url . 'jquery.wookmark.min.js', array( 'jquery' ), $ver, true );
407
+ wp_register_script( 'yui3', $js_url . 'yui3.min.js', array(), $ver, true );
408
+ wp_register_script( 'youtube-player', 'https://www.youtube.com/iframe_api', array(), $ver, true );
409
+ wp_register_script( 'vimeo-player', 'https://player.vimeo.com/api/player.js', array(), $ver, true );
410
  wp_deregister_script( 'imagesloaded' );
411
  wp_register_script( 'imagesloaded', includes_url( 'js/imagesloaded.min.js' ), array( 'jquery' ) );
412
  }
423
  global $post;
424
 
425
  $original_post = $post;
426
+ $is_archive = is_archive() || is_home() || is_search();
427
 
428
  // Enqueue assets for posts in the main query.
429
  if ( ! $is_archive && isset( $wp_query->posts ) ) {
438
  if ( count( $post_ids ) > 0 ) {
439
 
440
  $posts = get_posts(array(
441
+ 'post__in' => $post_ids,
442
+ 'post_type' => get_post_types(),
443
+ 'posts_per_page' => -1,
444
  ));
445
 
446
  foreach ( $posts as $post ) {
552
  $post_id = FLBuilderModel::get_post_id();
553
  $asset_info = FLBuilderModel::get_asset_info();
554
  $asset_ver = FLBuilderModel::get_asset_version();
555
+ $active = FLBuilderModel::is_builder_active();
556
+ $preview = FLBuilderModel::is_builder_draft_preview();
557
+ $handle = 'fl-builder-layout-' . $post_id;
558
  /**
559
  * Use this filter to add dependencies to the dependency array when the main builder layout CSS file is enqueued using wp_enqueue_style.
560
  * @see fl_builder_layout_style_dependencies
561
  * @link https://kb.wpbeaverbuilder.com/article/117-plugin-filter-reference
562
  */
563
+ $css_deps = apply_filters( 'fl_builder_layout_style_dependencies', array() );
564
+ $css_media = apply_filters( 'fl_builder_layout_style_media', 'all' );
565
 
566
  // Enqueue with the global code included?
567
  if ( in_array( 'global-' . $type, self::$enqueued_global_assets ) ) {
568
+ $path = $asset_info[ $type . '_partial' ];
569
+ $url = $asset_info[ $type . '_partial_url' ];
570
  $global = false;
571
  } else {
572
+ $path = $asset_info[ $type ];
573
+ $url = $asset_info[ $type . '_url' ];
574
+ $global = true;
575
  self::$enqueued_global_assets[] = 'global-' . $type;
576
  }
577
 
599
  } else {
600
 
601
  // Render if the file doesn't exist.
602
+ if ( ! in_array( $path, self::$rendered_assets ) && ( ! fl_builder_filesystem()->file_exists( $path ) || $rerender || $preview || self::is_debug() ) ) {
603
  call_user_func_array( array( 'FLBuilder', 'render_' . $type ), array( $global ) );
604
  self::$rendered_assets[] = $path;
605
  }
667
  }
668
  wp_enqueue_style( 'font-awesome-5' );
669
  wp_enqueue_style( 'foundation-icons' );
670
+ wp_enqueue_style( 'jquery-nanoscroller', $css_url . 'jquery.nanoscroller.css', array(), $ver );
671
+ wp_enqueue_style( 'jquery-autosuggest', $css_url . 'jquery.autoSuggest.min.css', array(), $ver );
672
+ wp_enqueue_style( 'jquery-tiptip', $css_url . 'jquery.tiptip.css', array(), $ver );
673
+ wp_enqueue_style( 'bootstrap-tour', $css_url . 'bootstrap-tour-standalone.min.css', array(), $ver );
674
 
675
  // Enqueue individual builder styles if WP_DEBUG is on.
676
  if ( self::is_debug() ) {
677
+ wp_enqueue_style( 'fl-color-picker', $css_url . 'fl-color-picker.css', array(), $ver );
678
+ wp_enqueue_style( 'fl-lightbox', $css_url . 'fl-lightbox.css', array(), $ver );
679
+ wp_enqueue_style( 'fl-icon-selector', $css_url . 'fl-icon-selector.css', array(), $ver );
680
+ wp_enqueue_style( 'fl-builder', $css_url . 'fl-builder.css', array(), $ver );
681
 
682
  // skins need to come after default ui styles
683
  wp_enqueue_style( 'fl-builder-ui-skin-dark', $css_url . 'fl-builder-ui-skin-dark.css', array(), $ver );
684
 
685
  wp_enqueue_style( 'fl-builder-bundle', $css_url . 'build/builder.bundle.css', array(), $ver );
686
  } else {
687
+ wp_enqueue_style( 'fl-builder-min', $css_url . 'fl-builder.min.css', array(), $ver );
688
  wp_enqueue_style( 'fl-builder-bundle', $css_url . 'build/builder.bundle.min.css', array(), $ver );
689
  }
690
 
693
 
694
  /* RTL Support */
695
  if ( is_rtl() ) {
696
+ wp_enqueue_style( 'fl-builder-rtl', $css_url . 'fl-builder-rtl.css', array(), $ver );
697
  }
698
 
699
  /* We have a custom version of sortable that fixes a bug. */
714
  wp_enqueue_script( 'jquery-ui-widget' );
715
  wp_enqueue_script( 'jquery-ui-position' );
716
 
717
+ /**
718
+ * Before jquery.ui.sortable.js is enqueued.
719
+ * @see fl_before_sortable_enqueue
720
+ */
721
  do_action( 'fl_before_sortable_enqueue' );
722
 
723
+ wp_enqueue_script( 'jquery-ui-sortable', $js_url . 'jquery.ui.sortable.js', array( 'jquery-ui-core', 'jquery-ui-widget', 'jquery-ui-mouse' ), $ver );
724
+ wp_enqueue_script( 'jquery-nanoscroller', $js_url . 'jquery.nanoscroller.min.js', array(), $ver );
725
+ wp_enqueue_script( 'jquery-autosuggest', $js_url . 'jquery.autoSuggest.min.js', array(), $ver );
726
+ wp_enqueue_script( 'jquery-tiptip', $js_url . 'jquery.tiptip.min.js', array(), $ver );
727
  wp_enqueue_script( 'jquery-showhideevents', $js_url . 'jquery.showhideevents.js', array(), $ver );
728
+ wp_enqueue_script( 'jquery-simulate', $js_url . 'jquery.simulate.js', array(), $ver );
729
+ wp_enqueue_script( 'jquery-validate', $js_url . 'jquery.validate.min.js', array(), $ver );
730
+ wp_enqueue_script( 'bootstrap-tour', $js_url . 'bootstrap-tour-standalone.min.js', array(), $ver );
731
+ wp_enqueue_script( 'ace', $js_url . 'ace/ace.js', array(), $ver );
732
+ wp_enqueue_script( 'ace-language-tools', $js_url . 'ace/ext-language_tools.js', array(), $ver );
733
+ wp_enqueue_script( 'mousetrap', $js_url . 'mousetrap-custom.js', array(), $ver );
734
 
735
  // Enqueue individual builder scripts if WP_DEBUG is on.
736
  if ( self::is_debug() ) {
737
+ wp_enqueue_script( 'fl-color-picker', $js_url . 'fl-color-picker.js', array(), $ver );
738
+ wp_enqueue_script( 'fl-lightbox', $js_url . 'fl-lightbox.js', array(), $ver );
739
+ wp_enqueue_script( 'fl-icon-selector', $js_url . 'fl-icon-selector.js', array(), $ver );
740
+ wp_enqueue_script( 'fl-stylesheet', $js_url . 'fl-stylesheet.js', array(), $ver );
741
+ wp_enqueue_script( 'fl-builder', $js_url . 'fl-builder.js', array(), $ver );
742
+ wp_enqueue_script( 'fl-builder-ajax-layout', $js_url . 'fl-builder-ajax-layout.js', array(), $ver );
743
+ wp_enqueue_script( 'fl-builder-preview', $js_url . 'fl-builder-preview.js', array(), $ver );
744
+ wp_enqueue_script( 'fl-builder-simulate-media-query', $js_url . 'fl-builder-simulate-media-query.js', array(), $ver );
745
+ wp_enqueue_script( 'fl-builder-responsive-editing', $js_url . 'fl-builder-responsive-editing.js', array(), $ver );
746
+ wp_enqueue_script( 'fl-builder-responsive-preview', $js_url . 'fl-builder-responsive-preview.js', array(), $ver );
747
+ wp_enqueue_script( 'fl-builder-services', $js_url . 'fl-builder-services.js', array(), $ver );
748
+ wp_enqueue_script( 'fl-builder-tour', $js_url . 'fl-builder-tour.js', array(), $ver );
749
+ wp_enqueue_script( 'fl-builder-ui', $js_url . 'fl-builder-ui.js', array( 'fl-builder', 'mousetrap' ), $ver );
750
+ wp_enqueue_script( 'fl-builder-ui-main-menu', $js_url . 'fl-builder-ui-main-menu.js', array( 'fl-builder-ui' ), $ver );
751
+ wp_enqueue_script( 'fl-builder-ui-panel-content', $js_url . 'fl-builder-ui-panel-content-library.js', array( 'fl-builder-ui' ), $ver );
752
+ wp_enqueue_script( 'fl-builder-ui-settings-forms', $js_url . 'fl-builder-ui-settings-forms.js', array(), $ver );
753
+ wp_enqueue_script( 'fl-builder-ui-pinned', $js_url . 'fl-builder-ui-pinned.js', array(), $ver );
754
+ wp_enqueue_script( 'fl-builder-revisions', $js_url . 'fl-builder-revisions.js', array(), $ver );
755
+ wp_enqueue_script( 'fl-builder-search', $js_url . 'fl-builder-search.js', array( 'jquery' ), $ver );
756
+ wp_enqueue_script( 'fl-builder-save-manager', $js_url . 'fl-builder-save-manager.js', array( 'jquery' ), $ver );
757
+ wp_enqueue_script( 'fl-builder-bundle', $js_url . 'build/builder.bundle.js', array(), $ver, true );
758
  } else {
759
+ wp_enqueue_script( 'fl-builder-min', $js_url . 'fl-builder.min.js', array( 'jquery', 'mousetrap' ), $ver );
760
+ wp_enqueue_script( 'fl-builder-bundle', $js_url . 'build/builder.bundle.min.js', array(), $ver, true );
761
  }
762
 
763
  /* Additional module styles and scripts */
784
  * @return array
785
  */
786
  static public function body_class( $classes ) {
787
+ $do_render = apply_filters( 'fl_builder_do_render_content', true, FLBuilderModel::get_post_id() );
788
+ $simple_ui = ! FLBuilderUserAccess::current_user_can( 'unrestricted_editing' );
789
  $template_type = FLBuilderModel::get_user_template_type();
790
 
791
  if ( $do_render && FLBuilderModel::is_builder_enabled() && ! is_archive() ) {
811
 
812
  // Skin
813
  $user_settings = FLBuilderUserSettings::get();
814
+ $classes[] = 'fl-builder-ui-skin--' . $user_settings['skin'];
815
 
816
  // Draft changes
817
  if ( FLBuilderModel::layout_has_drafted_changes() ) {
848
  if ( FLBuilderModel::is_post_editable() && is_object( $wp_the_query->post ) ) {
849
 
850
  $enabled = get_post_meta( $wp_the_query->post->ID, '_fl_builder_enabled', true );
851
+ $dot = ' <span class="fl-builder-admin-bar-status-dot" style="color:' . ( $enabled ? '#6bc373' : '#d9d9d9' ) . '; font-size:18px; line-height:1;">&bull;</span>';
852
 
853
  $wp_admin_bar->add_node( array(
854
  'id' => 'fl-builder-frontend-edit-link',
860
 
861
  static public function locate_template_file( $template_base, $slug ) {
862
  $specific_template = $template_base . '-' . $slug . '.php';
863
+ $general_template = $template_base . '.php';
864
+ $default_dir = trailingslashit( FL_BUILDER_DIR ) . 'includes/';
865
 
866
  // Try to find the specific template, then repeat the same process for general.
867
 
933
 
934
  if ( FLBuilderModel::is_builder_active() ) {
935
 
936
+ $post_id = is_object( $wp_the_query->post ) ? $wp_the_query->post->ID : null;
937
+ $unrestricted = FLBuilderUserAccess::current_user_can( 'unrestricted_editing' );
938
+ $simple_ui = ! $unrestricted;
939
+ $global_settings = FLBuilderModel::get_global_settings();
940
 
941
  include FL_BUILDER_DIR . 'includes/ui-extras.php';
942
  include FL_BUILDER_DIR . 'includes/ui-js-templates.php';
953
  static function get_main_menu_data() {
954
  global $post;
955
 
956
+ $views = array();
957
  $is_lite = true === FL_BUILDER_LITE; // @codingStandardsIgnoreLine
958
+ $is_user_template = FLBuilderModel::is_post_user_template();
959
  $enabled_templates = FLBuilderModel::get_enabled_templates();
960
+ $is_simple_ui = ! FLBuilderUserAccess::current_user_can( 'unrestricted_editing' );
961
+ $key_shortcuts = self::get_keyboard_shortcuts();
962
+ $help = FLBuilderModel::get_help_button_settings();
963
+ $default_view = array(
964
+ 'name' => __( 'Unnamed Menu', 'fl-builder' ),
965
+ 'isShowing' => false,
966
  'isRootView' => false,
967
+ 'items' => array(),
968
  );
969
 
970
  // Tools
971
  $tools_view = array(
972
+ 'name' => __( 'Tools', 'fl-builder' ),
973
+ 'isShowing' => true,
974
  'isRootView' => true,
975
+ 'items' => array(),
976
  );
977
 
978
  $tools_view['items'][04] = array(
979
+ 'label' => __( 'Publish Layout', 'fl-builder' ),
980
+ 'type' => 'event',
981
  'eventName' => 'publishAndRemain',
982
  'accessory' => $key_shortcuts['publishAndRemain']['keyLabel'],
983
  );
988
 
989
  if ( ! $is_lite && ! $is_user_template && ( 'enabled' == $enabled_templates || 'user' == $enabled_templates ) ) {
990
  $tools_view['items'][10] = array(
991
+ 'label' => __( 'Save Template', 'fl-builder' ),
992
+ 'type' => 'event',
993
  'eventName' => 'saveTemplate',
994
  'accessory' => $key_shortcuts['saveTemplate']['keyLabel'],
995
  );
996
  }
997
 
998
  $tools_view['items'][20] = array(
999
+ 'label' => __( 'Duplicate Layout', 'fl-builder' ),
1000
+ 'type' => 'event',
1001
  'eventName' => 'duplicateLayout',
1002
  );
1003
 
1004
  $tools_view['items'][30] = array(
1005
+ 'label' => __( 'Preview Layout', 'fl-builder' ),
1006
+ 'type' => 'event',
1007
  'eventName' => 'previewLayout',
1008
  'accessory' => $key_shortcuts['previewLayout']['keyLabel'],
1009
  );
1010
 
1011
  $tools_view['items'][31] = array(
1012
+ 'label' => __( 'Responsive Editing', 'fl-builder' ),
1013
+ 'type' => 'event',
1014
  'eventName' => 'responsiveEditing',
1015
  'accessory' => $key_shortcuts['responsiveEditing']['keyLabel'],
1016
  );
1020
  );
1021
 
1022
  $tools_view['items'][50] = array(
1023
+ 'label' => __( 'Layout CSS & Javascript', 'fl-builder' ),
1024
+ 'type' => 'event',
1025
  'eventName' => 'showLayoutSettings',
1026
  'accessory' => $key_shortcuts['showLayoutSettings']['keyLabel'],
1027
  );
1028
 
1029
  $tools_view['items'][60] = array(
1030
+ 'label' => __( 'Global Settings', 'fl-builder' ),
1031
+ 'type' => 'event',
1032
  'eventName' => 'showGlobalSettings',
1033
  'accessory' => $key_shortcuts['showGlobalSettings']['keyLabel'],
1034
  );
1038
  );
1039
 
1040
  $tools_view['items'][80] = array(
1041
+ 'label' => __( 'Change UI Brightness', 'fl-builder' ),
1042
+ 'type' => 'event',
1043
  'eventName' => 'toggleUISkin',
1044
  'accessory' => $key_shortcuts['toggleUISkin']['keyLabel'],
1045
  );
1046
 
1047
  $tools_view['items'][100] = array(
1048
  'label' => __( 'WordPress Admin', 'fl-builder' ),
1049
+ 'type' => 'view',
1050
+ 'view' => 'admin',
1051
  );
1052
 
1053
  if ( $help['enabled'] && ! $is_simple_ui ) {
1054
  $tools_view['items'][110] = array(
1055
  'label' => __( 'Help', 'fl-builder' ),
1056
+ 'type' => 'view',
1057
+ 'view' => 'help',
1058
  );
1059
  }
1060
 
1061
  $tools_view['items'][120] = array(
1062
+ 'label' => __( 'Keyboard Shortcuts', 'fl-builder' ),
1063
+ 'type' => 'event',
1064
  'eventName' => 'showKeyboardShortcuts',
1065
  );
1066
 
1068
 
1069
  // Admin
1070
  $admin_view = array(
1071
+ 'name' => __( 'WordPress Admin', 'fl-builder' ),
1072
  'items' => array(),
1073
  );
1074
 
1075
  // Edit current post/page/cpt
1076
  if ( is_single( $post->ID ) || is_page( $post->ID ) ) {
1077
+ $edit_label = get_post_type_object( $post->post_type )->labels->edit_item;
1078
  $admin_view['items'][10] = array(
1079
  'label' => $edit_label,
1080
+ 'type' => 'link',
1081
+ 'url' => get_edit_post_link( $post->ID ),
1082
  );
1083
  }
1084
 
1089
  // Dashboard
1090
  $admin_view['items'][17] = array(
1091
  'label' => _x( 'Dashboard', 'label for the WordPress Dashboard link', 'fl-builder' ),
1092
+ 'type' => 'link',
1093
+ 'url' => admin_url( 'index.php' ),
1094
  );
1095
 
1096
  $templates_enabled = FLBuilderUserAccess::current_user_can( 'builder_admin' );
1098
  if ( $templates_enabled ) {
1099
  $admin_view['items'][20] = array(
1100
  'label' => __( 'Manage Templates', 'fl-builder' ),
1101
+ 'type' => 'link',
1102
+ 'url' => admin_url( 'edit.php?post_type=fl-builder-template' ),
1103
  );
1104
  }
1105
 
1112
  }
1113
  $admin_view['items'][30] = array(
1114
  'label' => __( 'Customize Theme', 'fl-builder' ),
1115
+ 'type' => 'link',
1116
+ 'url' => $url,
1117
  );
1118
  }
1119
 
1122
  // Help
1123
  if ( $help['enabled'] && ! $is_simple_ui ) {
1124
  $help_view = array(
1125
+ 'name' => __( 'Help', 'fl-builder' ),
1126
  'items' => array(),
1127
  );
1128
 
1134
  $help['video_embed'] = str_replace( 'height="315"', 'height="173"', $help['video_embed'] );
1135
 
1136
  $help_view['items'][10] = array(
1137
+ 'type' => 'video',
1138
  'embed' => $help['video_embed'],
1139
  );
1140
  }
1141
 
1142
  if ( $help['tour'] ) {
1143
  $help_view['items'][20] = array(
1144
+ 'label' => __( 'Take A Tour', 'fl-builder' ),
1145
+ 'type' => 'event',
1146
  'eventName' => 'beginTour',
1147
  );
1148
  }
1150
  if ( $help['knowledge_base'] && isset( $help['knowledge_base_url'] ) ) {
1151
  $help_view['items'][30] = array(
1152
  'label' => __( 'View Knowledge Base', 'fl-builder' ),
1153
+ 'type' => 'link',
1154
+ 'url' => $help['knowledge_base_url'],
1155
  );
1156
  }
1157
 
1158
  if ( $help['forums'] && isset( $help['forums_url'] ) ) {
1159
  $help_view['items'][40] = array(
1160
  'label' => __( 'Contact Support', 'fl-builder' ),
1161
+ 'type' => 'link',
1162
+ 'url' => $help['forums_url'],
1163
  );
1164
  }
1165
 
1178
  */
1179
  static function get_keyboard_shortcuts() {
1180
  $default_action = array(
1181
+ 'label' => _x( 'Untitled Shortcut', 'A keyboard shortcut with no label given', 'fl-builder' ),
1182
+ 'keyCode' => '',
1183
  'keyLabel' => '',
1184
  'isGlobal' => false,
1185
+ 'enabled' => true,
1186
  );
1187
+ $data = array(
1188
+ 'showModules' => array(
1189
+ 'label' => _x( 'Open Modules Tab', 'Keyboard action to show modules tab', 'fl-builder' ),
1190
  'keyCode' => 'j',
1191
  ),
1192
+ 'showRows' => array(
1193
+ 'label' => _x( 'Open Rows Tab', 'Keyboard action to show rows tab', 'fl-builder' ),
1194
  'keyCode' => 'k',
1195
  ),
1196
+ 'showTemplates' => array(
1197
+ 'label' => _x( 'Open Templates Tab', 'Keyboard action to show templates tab', 'fl-builder' ),
1198
  'keyCode' => 'l',
1199
  ),
1200
+ 'showSaved' => array(
1201
+ 'label' => _x( 'Open Saved Tab', 'Keyboard action to show saved tab', 'fl-builder' ),
1202
  'keyCode' => ';',
1203
  'enabled' => true !== FL_BUILDER_LITE,
1204
  ),
1205
+ 'saveTemplate' => array(
1206
+ 'label' => _x( 'Save New Template', 'Keyboard action to open save template form', 'fl-builder' ),
1207
  'keyCode' => 'mod+j',
1208
  'enabled' => true !== FL_BUILDER_LITE,
1209
  ),
1210
+ 'previewLayout' => array(
1211
+ 'label' => _x( 'Toggle Preview Mode', 'Keyboard action to toggle preview mode', 'fl-builder' ),
1212
  'keyCode' => 'p',
1213
  ),
1214
+ 'responsiveEditing' => array(
1215
+ 'label' => _x( 'Toggle Responsive Editing Mode', 'Keyboard action to toggle responsive editing', 'fl-builder' ),
1216
  'keyCode' => 'r',
1217
  ),
1218
  'showGlobalSettings' => array(
1219
+ 'label' => _x( 'Open Global Settings', 'Keyboard action to open the global settings panel', 'fl-builder' ),
1220
  'keyCode' => 'mod+u',
1221
  ),
1222
  'showLayoutSettings' => array(
1223
+ 'label' => _x( 'Open Layout Settings', 'Keyboard action to open the layout settings panel', 'fl-builder' ),
1224
  'keyCode' => 'mod+y',
1225
  ),
1226
+ 'toggleUISkin' => array(
1227
+ 'label' => _x( 'Change UI Brightness', 'Keyboard action to switch between light and dark UI brightness', 'fl-builder' ),
1228
  'keyCode' => 'o',
1229
  ),
1230
+ 'showSearch' => array(
1231
+ 'label' => _x( 'Display Module Search', 'Keyboard action to open the module search panel', 'fl-builder' ),
1232
  'keyCode' => 'mod+i',
1233
  'enabled' => true !== FL_BUILDER_LITE,
1234
  ),
1235
+ 'showSavedMessage' => array(
1236
+ 'label' => _x( 'Save Layout', 'Keyboard action to save changes', 'fl-builder' ),
1237
+ 'keyCode' => 'mod+s',
1238
  'isGlobal' => true,
1239
  ),
1240
+ 'publishAndRemain' => array(
1241
+ 'label' => _x( 'Publish changes without leaving builder', 'Keyboard action to publish any pending changes', 'fl-builder' ),
1242
+ 'keyCode' => 'mod+p',
1243
  'isGlobal' => true,
1244
  ),
1245
+ 'cancelTask' => array(
1246
+ 'label' => _x( 'Dismiss Active Panel', 'Keyboard action to dismiss the current task or panel', 'fl-builder' ),
1247
+ 'keyCode' => 'esc',
1248
  'isGlobal' => true,
1249
  ),
1250
  );
1256
  // Check for old (alpha) format and normalize
1257
  if ( is_string( $args ) ) {
1258
  $args = array(
1259
+ 'label' => ucwords( preg_replace( '/([^A-Z])([A-Z])/', '$1 $2', $hook ) ),
1260
  'keyCode' => $args,
1261
  );
1262
  }
1299
  $code = str_replace( 'right', '&rarr;', $code );
1300
 
1301
  $args['keyLabel'] = $code;
1302
+ $data[ $hook ] = $args;
1303
  }
1304
 
1305
  return $data;
1316
  global $post;
1317
  $simple_ui = ! FLBuilderUserAccess::current_user_can( 'unrestricted_editing' );
1318
 
1319
+ $title = apply_filters( 'fl_builder_ui_bar_title', get_the_title( $post->ID ) );
1320
+ $icon_url = FLBuilderModel::get_branding_icon();
1321
  $wrapper_classes = array( 'fl-builder-bar-title' );
1322
 
1323
  if ( '' == $icon_url ) {
1325
  }
1326
 
1327
  $edited_object_label = get_post_type_object( $post->post_type )->labels->singular_name;
1328
+ $pretitle = sprintf( _x( 'Currently Editing %s', 'Currently editing message', 'fl-builder' ), $edited_object_label );
1329
+ $pretitle = apply_filters( 'fl_builder_ui_bar_pretitle', $pretitle );
1330
 
1331
  // Render the bar title.
1332
  include FL_BUILDER_DIR . 'includes/ui-bar-title-area.php';
1339
  * @return void
1340
  */
1341
  static public function render_ui_bar_buttons() {
1342
+ $help_button = FLBuilderModel::get_help_button_settings();
1343
+ $simple_ui = ! FLBuilderUserAccess::current_user_can( 'unrestricted_editing' );
1344
  $should_display_search = ! FLBuilderModel::is_post_user_template( 'module' ) && ! $simple_ui;
1345
+ $add_btn_svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="24" height="24"><rect x="0" fill="none" width="24" height="24" /><g><path d="M17 9v2h-6v6H9v-6H3V9h6V3h2v6h6z"/></g></svg>';
1346
+ $notifications = FLBuilderNotifications::get_notifications();
1347
+ $feedback_label = __( 'Dev Feedback', 'fl-builder' );
1348
+ $show_feedback = '{FL_BUILDER_VERSION}' === FL_BUILDER_VERSION;
1349
 
1350
  if ( strstr( FL_BUILDER_VERSION, '-dev' ) ) {
1351
  $show_feedback = true;
1352
  } elseif ( strstr( FL_BUILDER_VERSION, '-alpha' ) ) {
1353
  $feedback_label = __( 'Alpha Feedback', 'fl-builder' );
1354
+ $show_feedback = true;
1355
  } elseif ( strstr( FL_BUILDER_VERSION, '-beta' ) ) {
1356
  $feedback_label = __( 'Beta Feedback', 'fl-builder' );
1357
+ $show_feedback = true;
1358
  }
1359
 
1360
  $buttons = apply_filters( 'fl_builder_ui_bar_buttons', array(
1361
+ 'feedback' => array(
1362
+ 'label' => $feedback_label . ' <i class="fas fa-external-link-alt"></i>',
1363
+ 'show' => $show_feedback,
1364
  'onclick' => "window.open('" . FLBuilderModel::get_store_url( 'contact', array(
1365
+ 'topic' => 'Pre-Release Feedback',
1366
  'utm_medium' => true === FL_BUILDER_LITE ? 'bb-lite' : 'bb-pro',
1367
  'utm_source' => 'builder-ui',
1368
  'utm_campaign' => 'feedback-cta',
1369
  ) ) . "');",
1370
  ),
1371
+ 'upgrade' => array(
1372
  'label' => __( 'Upgrade Today', 'fl-builder' ) . ' <i class="fas fa-external-link-alt"></i>',
1373
+ 'show' => true === FL_BUILDER_LITE,
1374
  ),
1375
+ 'buy' => array(
1376
  'label' => __( 'Buy Now', 'fl-builder' ) . ' <i class="fas fa-external-link-alt"></i>',
1377
+ 'show' => stristr( home_url(), 'demo.wpbeaverbuilder.com' ),
1378
  ),
1379
+ 'done' => array(
1380
  'label' => __( 'Done', 'fl-builder' ),
1381
  ),
1382
  'content-panel' => array(
1383
  'label' => $add_btn_svg,
1384
+ 'show' => ! $simple_ui,
1385
  ),
1386
+ 'add-content' => array( // Only added here for backwards compat.
1387
  'label' => $add_btn_svg,
1388
+ 'show' => ! $simple_ui,
1389
  ),
1390
  ) );
1391
 
1521
  // Prevent the builder's render_content filter from running.
1522
  add_filter( 'fl_builder_do_render_content', '__return_false' );
1523
 
1524
+ /**
1525
+ * Fire the render content start action.
1526
+ * @see fl_builder_render_content_start
1527
+ */
1528
  do_action( 'fl_builder_render_content_start' );
1529
 
1530
  // Render the content.
1531
  ob_start();
1532
+ /**
1533
+ * Before render content
1534
+ * @see fl_builder_before_render_content
1535
+ */
1536
  do_action( 'fl_builder_before_render_content' );
1537
  echo '<' . $tag . ' class="' . self::render_content_classes() . '" data-post-id="' . $post_id . '"' . $attr_string . '>';
1538
  self::render_nodes();
1539
  echo '</' . $tag . '>';
1540
+ /**
1541
+ * After render content
1542
+ * @see fl_builder_after_render_content
1543
+ */
1544
  do_action( 'fl_builder_after_render_content' );
1545
  $content = ob_get_clean();
1546
 
1562
  $content = wp_make_content_images_responsive( $content );
1563
  }
1564
 
1565
+ /**
1566
+ * Fire the render content complete action.
1567
+ * @see fl_builder_render_content_complete
1568
+ */
1569
  do_action( 'fl_builder_render_content_complete' );
1570
 
1571
  // Stop forcing the builder to use this post ID.
1586
  * @return string
1587
  */
1588
  static public function render_content( $content ) {
1589
+ $post_id = FLBuilderModel::get_post_id( true );
1590
+ $enabled = FLBuilderModel::is_builder_enabled( $post_id );
1591
+ $rendering = $post_id === self::$post_rendering;
1592
+ $do_render = apply_filters( 'fl_builder_do_render_content', true, $post_id );
1593
+ $in_loop = in_the_loop();
1594
+ $is_global = in_array( $post_id, FLBuilderModel::get_global_posts() );
1595
 
1596
  if ( $enabled && ! $rendering && $do_render && ( $in_loop || $is_global ) ) {
1597
 
1665
  * @return void
1666
  */
1667
  static public function render_nodes() {
1668
+ /**
1669
+ * Before render nodes.
1670
+ * @see fl_builder_before_render_nodes
1671
+ */
1672
  do_action( 'fl_builder_before_render_nodes' );
1673
 
1674
  if ( apply_filters( 'fl_builder_render_nodes', true ) ) {
1675
  self::render_rows();
1676
  }
1677
 
1678
+ /**
1679
+ * After render nodes.
1680
+ * @see fl_builder_after_render_nodes
1681
+ */
1682
  do_action( 'fl_builder_after_render_nodes' );
1683
  }
1684
 
1786
  $content = ob_get_clean();
1787
 
1788
  // Remove unnecessary tags and attributes.
1789
+ $content = preg_replace( '/<\/?div[^>]*\>/i', '', $content );
1790
+ $content = preg_replace( '/<\/?span[^>]*\>/i', '', $content );
1791
+ $content = preg_replace( '#<script(.*?)>(.*?)</script>#is', '', $content );
1792
+ $content = preg_replace( '/<\/?noscript[^>]*\>/i', '', $content );
1793
+ $content = preg_replace( '#<svg(.*?)>(.*?)</svg>#is', '', $content );
1794
+ $content = preg_replace( '/<i [^>]*><\\/i[^>]*>/', '', $content );
1795
+ $content = preg_replace( '/ class=".*?"/', '', $content );
1796
+ $content = preg_replace( '/ style=".*?"/', '', $content );
1797
 
1798
  // Remove empty lines.
1799
  $content = preg_replace( '/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/', "\n", $content );
1866
  static public function render_rows() {
1867
  $rows = FLBuilderModel::get_nodes( 'row' );
1868
 
1869
+ /**
1870
+ * Before rendering the markup for all of the rows in a layout.
1871
+ * @see fl_builder_before_render_rows
1872
+ */
1873
  do_action( 'fl_builder_before_render_rows', $rows );
1874
 
1875
  foreach ( $rows as $row ) {
1876
  self::render_row( $row );
1877
  }
1878
 
1879
+ /**
1880
+ * After rendering the markup for all of the rows in a layout.
1881
+ * @see fl_builder_after_render_rows
1882
+ */
1883
  do_action( 'fl_builder_after_render_rows', $rows );
1884
  }
1885
 
1893
  static public function render_row( $row ) {
1894
  global $wp_the_query;
1895
 
1896
+ $groups = FLBuilderModel::get_nodes( 'column-group', $row );
1897
  $post_id = FLBuilderModel::get_post_id();
1898
+ $active = FLBuilderModel::is_builder_active() && $post_id == $wp_the_query->post->ID;
1899
  $visible = FLBuilderModel::is_node_visible( $row );
1900
 
1901
  if ( $active || $visible ) {
1902
 
1903
+ /**
1904
+ * Before rendering a row
1905
+ * @see fl_builder_before_render_row
1906
+ */
1907
  do_action( 'fl_builder_before_render_row', $row, $groups );
1908
 
1909
  $template_file = self::locate_template_file(
1915
  include $template_file;
1916
  }
1917
 
1918
+ /**
1919
+ * After rendering a row.
1920
+ * @see fl_builder_after_render_row
1921
+ */
1922
  do_action( 'fl_builder_after_render_row', $row, $groups );
1923
  }
1924
  }
1938
  */
1939
  $custom_class = apply_filters( 'fl_builder_row_custom_class', $row->settings->class, $row );
1940
  $overlay_bgs = array( 'photo', 'parallax', 'slideshow', 'video' );
1941
+ $active = FLBuilderModel::is_builder_active();
1942
+ $visible = FLBuilderModel::is_node_visible( $row );
1943
+ $has_rules = FLBuilderModel::node_has_visibility_rules( $row );
1944
  $attrs = array(
1945
+ 'id' => $row->settings->id,
1946
+ 'class' => array(
1947
  'fl-row',
1948
  'fl-row-' . $row->settings->width . '-width',
1949
  'fl-row-bg-' . $row->settings->bg_type,
1950
  'fl-node-' . $row->node,
1951
  ),
1952
+ 'data-node' => $row->node,
1953
  );
1954
 
1955
  // Classes
1980
  $attrs['class'][] = 'fl-visible-' . $row->settings->responsive_display;
1981
  }
1982
  if ( is_array( $row->settings->animation ) && ! empty( $row->settings->animation['style'] ) ) {
1983
+ $attrs['class'][] = 'fl-animation fl-' . $row->settings->animation['style'];
1984
  $attrs['data-animation-delay'][] = $row->settings->animation['delay'];
1985
  if ( isset( $row->settings->animation['duration'] ) ) {
1986
  $attrs['data-animation-duration'][] = $row->settings->animation['duration'];
2016
  * @return void
2017
  */
2018
  static public function render_row_bg( $row ) {
2019
+ /**
2020
+ * Before rendering a row background
2021
+ * @see fl_builder_before_render_row_bg
2022
+ */
2023
  do_action( 'fl_builder_before_render_row_bg', $row );
2024
 
2025
  if ( 'video' == $row->settings->bg_type ) {
2040
  echo '<div class="fl-bg-slideshow"></div>';
2041
  }
2042
 
2043
+ /**
2044
+ * After rendering a row background
2045
+ * @see fl_builder_after_render_row_bg
2046
+ */
2047
  do_action( 'fl_builder_after_render_row_bg', $row );
2048
  }
2049
 
2070
  static public function render_column_group( $group ) {
2071
  $cols = FLBuilderModel::get_nodes( 'column', $group );
2072
 
2073
+ /**
2074
+ * Before rendering a column group
2075
+ * @see fl_builder_before_render_column_group
2076
+ */
2077
  do_action( 'fl_builder_before_render_column_group', $group, $cols );
2078
 
2079
  $template_file = self::locate_template_file(
2084
  if ( $template_file ) {
2085
  include $template_file;
2086
  }
2087
+ /**
2088
+ * After rendering a column group.
2089
+ * @see fl_builder_after_render_column_group
2090
+ */
2091
  do_action( 'fl_builder_after_render_column_group', $group, $cols );
2092
  }
2093
 
2102
  $cols = FLBuilderModel::get_nodes( 'column', $group );
2103
  $parent = FLBuilderModel::get_node_parent( $group );
2104
  $attrs = array(
2105
+ 'class' => array(
2106
  'fl-col-group',
2107
  'fl-node-' . $group->node,
2108
  ),
2150
  static public function render_column( $col_id = null ) {
2151
  global $wp_the_query;
2152
 
2153
+ $col = is_object( $col_id ) ? $col_id : FLBuilderModel::get_node( $col_id );
2154
  $post_id = FLBuilderModel::get_post_id();
2155
+ $active = FLBuilderModel::is_builder_active() && $post_id == $wp_the_query->post->ID;
2156
  $visible = FLBuilderModel::is_node_visible( $col );
2157
 
2158
  if ( $active || $visible ) {
2176
  $custom_class = apply_filters( 'fl_builder_column_custom_class', $col->settings->class, $col );
2177
  $overlay_bgs = array( 'photo' );
2178
  $nested = FLBuilderModel::get_nodes( 'column-group', $col );
2179
+ $active = FLBuilderModel::is_builder_active();
2180
+ $visible = FLBuilderModel::is_node_visible( $col );
2181
+ $has_rules = FLBuilderModel::node_has_visibility_rules( $col );
2182
  $attrs = array(
2183
+ 'id' => $col->settings->id,
2184
+ 'class' => array(
2185
  'fl-col',
2186
  'fl-node-' . $col->node,
2187
  ),
2188
+ 'data-node' => $col->node,
2189
+ 'style' => array(),
2190
  );
2191
 
2192
  // Classes
2207
  $attrs['class'][] = 'fl-visible-' . $col->settings->responsive_display;
2208
  }
2209
  if ( is_array( $col->settings->animation ) && ! empty( $col->settings->animation['style'] ) ) {
2210
+ $attrs['class'][] = 'fl-animation fl-' . $col->settings->animation['style'];
2211
  $attrs['data-animation-delay'][] = $col->settings->animation['delay'];
2212
  if ( isset( $col->settings->animation['duration'] ) ) {
2213
  $attrs['data-animation-duration'][] = $col->settings->animation['duration'];
2228
  $attrs['style'][] = 'width: ' . $col->settings->size . '%;';
2229
  }
2230
 
2231
+ /**
2232
+ * Column attributes.
2233
+ * @see fl_builder_column_attributes
2234
+ */
2235
  self::render_node_attributes( apply_filters( 'fl_builder_column_attributes', $attrs, $col ) );
2236
  }
2237
 
2245
  static public function render_modules( $col_id = null ) {
2246
  $nodes = FLBuilderModel::get_nodes( null, $col_id );
2247
 
2248
+ /**
2249
+ * Before rendering modules in a column
2250
+ * @see fl_builder_before_render_modules
2251
+ */
2252
  do_action( 'fl_builder_before_render_modules', $nodes, $col_id );
2253
 
2254
  foreach ( $nodes as $node ) {
2259
  self::render_column_group( $node );
2260
  }
2261
  }
2262
+ /**
2263
+ * After rendering modules in a column
2264
+ * @see fl_builder_after_render_modules
2265
+ */
2266
  do_action( 'fl_builder_after_render_modules', $nodes, $col_id );
2267
  }
2268
 
2276
  static public function render_module( $module_id = null ) {
2277
  global $wp_the_query;
2278
 
2279
+ $module = FLBuilderModel::get_module( $module_id );
2280
+ $settings = $module->settings;
2281
+ $id = $module->node;
2282
+ $post_id = FLBuilderModel::get_post_id();
2283
+ $active = FLBuilderModel::is_builder_active() && $post_id == $wp_the_query->post->ID;
2284
+ $visible = FLBuilderModel::is_node_visible( $module );
2285
 
2286
  if ( $active || $visible ) {
2287
 
2288
+ /**
2289
+ * Before single module is rendered via ajax.
2290
+ * @see fl_builder_before_render_module
2291
+ */
2292
  do_action( 'fl_builder_before_render_module', $module );
2293
 
2294
  $template_file = self::locate_template_file(
2295
  apply_filters( 'fl_builder_module_template_base', 'module', $module ),
2296
+ apply_filters( 'fl_builder_module_template_slug', '', $module )
2297
  );
2298
 
2299
  if ( $template_file ) {
2300
  include $template_file;
2301
  }
2302
 
2303
+ /**
2304
+ * After single module is rendered via ajax.
2305
+ * @see fl_builder_after_render_module
2306
+ */
2307
  do_action( 'fl_builder_after_render_module', $module );
2308
  }
2309
  }
2325
  $settings = (object) array_merge( (array) $defaults, (array) $settings );
2326
 
2327
  // Module
2328
+ $class = get_class( FLBuilderModel::$modules[ $type ] );
2329
+ $module = new $class();
2330
  $module->settings = FLBuilderSettingsCompat::filter_node_settings( 'module', $settings );
2331
 
2332
  // Shorthand reference to the module's id.
2333
  $id = $module->node;
2334
 
2335
+ /**
2336
+ * Before single module html is rendered.
2337
+ * used by render_module_html()
2338
+ * @see fl_builder_render_module_html_before
2339
+ */
2340
  do_action( 'fl_builder_render_module_html_before', $type, $settings, $module );
2341
 
2342
  ob_start();
2343
 
2344
+ if ( has_filter( 'fl_builder_module_frontend_custom_' . $module->slug ) ) {
2345
+ echo apply_filters( 'fl_builder_module_frontend_custom_' . $module->slug, (array) $module->settings, $module );
2346
+ } else {
2347
+ include apply_filters( 'fl_builder_render_module_html', $module->dir . 'includes/frontend.php', $type, $settings, $module );
2348
+ }
2349
 
2350
  $content = ob_get_clean();
2351
 
2352
  echo apply_filters( 'fl_builder_render_module_html_content', $content, $type, $settings, $module );
2353
 
2354
+ /**
2355
+ * Before single module html is rendered.
2356
+ * used by render_module_html()
2357
+ * @see fl_builder_render_module_html_after
2358
+ */
2359
  do_action( 'fl_builder_render_module_html_after', $type, $settings, $module );
2360
  }
2361
 
2373
  * @link https://kb.wpbeaverbuilder.com/article/117-plugin-filter-reference
2374
  */
2375
  $custom_class = apply_filters( 'fl_builder_module_custom_class', $module->settings->class, $module );
2376
+ $active = FLBuilderModel::is_builder_active();
2377
+ $visible = FLBuilderModel::is_node_visible( $module );
2378
+ $has_rules = FLBuilderModel::node_has_visibility_rules( $module );
2379
  $attrs = array(
2380
+ 'id' => esc_attr( $module->settings->id ),
2381
+ 'class' => array(
2382
  'fl-module',
2383
  'fl-module-' . $module->settings->type,
2384
  'fl-node-' . $module->node,
2385
  ),
2386
+ 'data-node' => $module->node,
2387
  );
2388
 
2389
  // Classes
2391
  $attrs['class'][] = 'fl-visible-' . $module->settings->responsive_display;
2392
  }
2393
  if ( is_array( $module->settings->animation ) && ! empty( $module->settings->animation['style'] ) ) {
2394
+ $attrs['class'][] = 'fl-animation fl-' . $module->settings->animation['style'];
2395
  $attrs['data-animation-delay'][] = $module->settings->animation['delay'];
2396
  if ( isset( $module->settings->animation['duration'] ) ) {
2397
  $attrs['data-animation-duration'][] = $module->settings->animation['duration'];
2410
  // Data
2411
  if ( $active ) {
2412
  $attrs['data-parent'] = $module->parent;
2413
+ $attrs['data-type'] = $module->settings->type;
2414
+ $attrs['data-name'] = $module->name;
2415
  }
2416
 
2417
+ /**
2418
+ * Module attributes.
2419
+ * @see fl_builder_module_attributes
2420
+ */
2421
  self::render_node_attributes( apply_filters( 'fl_builder_module_attributes', $attrs, $module ) );
2422
  }
2423
 
2439
  static public function render_module_css( $type, $id, $settings ) {
2440
  // Settings
2441
  $global_settings = FLBuilderModel::get_global_settings();
2442
+ $defaults = FLBuilderModel::get_module_defaults( $type );
2443
+ $settings = (object) array_merge( (array) $defaults, (array) $settings );
2444
+ $settings = apply_filters( 'fl_builder_render_module_css_settings', $settings, $id, $type );
2445
 
2446
  // Module
2447
+ $class = get_class( FLBuilderModel::$modules[ $type ] );
2448
+ $module = new $class();
2449
  $module->settings = FLBuilderSettingsCompat::filter_node_settings( 'module', $settings );
2450
 
2451
  // CSS
2497
  */
2498
 
2499
  static public function render_css( $include_global = true ) {
2500
+ $active = FLBuilderModel::is_builder_active();
2501
+ $nodes = FLBuilderModel::get_categorized_nodes();
2502
+ $node_status = FLBuilderModel::get_node_status();
2503
+ $global_settings = FLBuilderModel::get_global_settings();
2504
+ $asset_info = FLBuilderModel::get_asset_info();
2505
+ $enqueuemethod = FLBuilderModel::get_asset_enqueue_method();
2506
+ $post_id = FLBuilderModel::get_post_id();
2507
+ $post = get_post( $post_id );
2508
+ $css = '';
2509
+ $path = $include_global ? $asset_info['css'] : $asset_info['css_partial'];
2510
 
2511
  // Render the global css.
2512
  if ( $include_global ) {
2518
 
2519
  // Instance row css
2520
  $settings = $row->settings;
2521
+ $id = $row->node;
2522
  ob_start();
2523
  include FL_BUILDER_DIR . 'includes/row-css.php';
2524
  FLBuilderCSS::render();
2539
 
2540
  // Instance column css
2541
  $settings = $col->settings;
2542
+ $id = $col->node;
2543
  ob_start();
2544
  include FL_BUILDER_DIR . 'includes/column-css.php';
2545
  FLBuilderCSS::render();
2559
  foreach ( $nodes['modules'] as $module ) {
2560
 
2561
  // Global module css
2562
+ $file = $module->dir . 'css/frontend.css';
2563
  $file_responsive = $module->dir . 'css/frontend.responsive.css';
2564
 
2565
  // Only include global module css that hasn't been included yet.
2582
  }
2583
 
2584
  // Instance module css
2585
+ $file = $module->dir . 'includes/frontend.css.php';
2586
+ $settings = $module->settings;
2587
+ $id = $module->node;
2588
 
2589
  if ( ! in_array( $id, self::$enqueued_module_css_assets ) && fl_builder_filesystem()->file_exists( $file ) ) {
2590
  self::$enqueued_module_css_assets[] = $id;
2641
  fl_builder_filesystem()->file_put_contents( $path, $css );
2642
  }
2643
 
2644
+ /**
2645
+ * After CSS is compiled.
2646
+ * @see fl_builder_after_render_css
2647
+ */
2648
  do_action( 'fl_builder_after_render_css' );
2649
 
2650
  return $css;
2661
  $global_settings = FLBuilderModel::get_global_settings();
2662
 
2663
  // Core layout css
2664
+ $css = fl_builder_filesystem()->file_get_contents( FL_BUILDER_DIR . 'css/fl-builder-layout.css' );
2665
 
2666
  // Core button defaults
2667
  if ( ! defined( 'FL_THEME_VERSION' ) ) {
2668
+ $css .= fl_builder_filesystem()->file_get_contents( FL_BUILDER_DIR . 'css/fl-builder-layout-button-defaults.css' );
2669
  }
2670
 
2671
  // Core layout RTL css
2672
  if ( is_rtl() ) {
2673
+ $css .= fl_builder_filesystem()->file_get_contents( FL_BUILDER_DIR . 'css/fl-builder-layout-rtl.css' );
2674
  }
2675
 
2676
  // Global node css
2677
  foreach ( array(
2678
+ array( 'row_margins', '.fl-row-content-wrap { margin: ' ),
2679
+ array( 'row_padding', '.fl-row-content-wrap { padding: ' ),
2680
+ array( 'row_width', '.fl-row-fixed-width { max-width: ' ),
2681
+ array( 'column_margins', '.fl-col-content { margin: ' ),
2682
+ array( 'column_padding', '.fl-col-content { padding: ' ),
2683
  array( 'module_margins', '.fl-module-content { margin: ' ),
2684
  ) as $data ) {
2685
  if ( '' !== $global_settings->{ $data[0] } ) {
2686
  $value = preg_replace( self::regex( 'css_unit' ), '', strtolower( $global_settings->{ $data[0] } ) );
2687
+ $css .= $data[1] . esc_attr( $value );
2688
+ $css .= ( is_numeric( $value ) ) ? ( $global_settings->{ $data[0] . '_unit' } . '; }' ) : ( '; }' );
2689
  }
2690
  }
2691
 
2696
  $css .= '@media (max-width: ' . $global_settings->medium_breakpoint . 'px) { ';
2697
 
2698
  // Core medium layout css
2699
+ $css .= fl_builder_filesystem()->file_get_contents( FL_BUILDER_DIR . 'css/fl-builder-layout-medium.css' );
2700
 
2701
  // Global node medium css
2702
  foreach ( array(
2703
+ array( 'row_margins_medium', '.fl-row[data-node] > .fl-row-content-wrap { margin: ' ),
2704
+ array( 'row_padding_medium', '.fl-row[data-node] > .fl-row-content-wrap { padding: ' ),
2705
+ array( 'column_margins_medium', '.fl-col[data-node] > .fl-col-content { margin: ' ),
2706
+ array( 'column_padding_medium', '.fl-col[data-node] > .fl-col-content { padding: ' ),
2707
+ array( 'module_margins_medium', '.fl-module[data-node] > .fl-module-content { margin: ' ),
2708
+ ) as $data ) {
2709
  if ( '' !== $global_settings->{ $data[0] } ) {
2710
  $value = preg_replace( self::regex( 'css_unit' ), '', strtolower( $global_settings->{ $data[0] } ) );
2711
+ $css .= $data[1] . esc_attr( $value );
2712
+ $css .= ( is_numeric( $value ) ) ? ( $global_settings->{ $data[0] . '_unit' } . '; }' ) : ( '; }' );
2713
  }
2714
  }
2715
 
2719
  $css .= '@media (max-width: ' . $global_settings->responsive_breakpoint . 'px) { ';
2720
 
2721
  // Core responsive layout css
2722
+ $css .= fl_builder_filesystem()->file_get_contents( FL_BUILDER_DIR . 'css/fl-builder-layout-responsive.css' );
2723
 
2724
  // Auto spacing
2725
  if ( ! isset( $global_settings->auto_spacing ) || $global_settings->auto_spacing ) {
2726
+ $css .= fl_builder_filesystem()->file_get_contents( FL_BUILDER_DIR . 'css/fl-builder-layout-auto-spacing.css' );
2727
  }
2728
 
2729
  // Global node responsive css
2730
  foreach ( array(
2731
+ array( 'row_margins_responsive', '.fl-row[data-node] > .fl-row-content-wrap { margin: ' ),
2732
+ array( 'row_padding_responsive', '.fl-row[data-node] > .fl-row-content-wrap { padding: ' ),
2733
+ array( 'column_margins_responsive', '.fl-col[data-node] > .fl-col-content { margin: ' ),
2734
+ array( 'column_padding_responsive', '.fl-col[data-node] > .fl-col-content { padding: ' ),
2735
+ array( 'module_margins_responsive', '.fl-module[data-node] > .fl-module-content { margin: ' ),
2736
+ ) as $data ) {
2737
  if ( '' !== $global_settings->{ $data[0] } ) {
2738
  $value = preg_replace( self::regex( 'css_unit' ), '', strtolower( $global_settings->{ $data[0] } ) );
2739
+ $css .= $data[1] . esc_attr( $value );
2740
+ $css .= ( is_numeric( $value ) ) ? ( $global_settings->{ $data[0] . '_unit' } . '; }' ) : ( '; }' );
2741
  }
2742
  }
2743
 
2842
  // Iterate over each direction
2843
  foreach ( array( 'top', 'right', 'bottom', 'left' ) as $dir ) {
2844
  $setting_key = $prop_type . '_' . $dir . $setting_suffix;
2845
+ $unit_key = $prop_type . $setting_suffix . '_unit';
2846
+ $unit = isset( $settings->{ $unit_key } ) ? $settings->{ $unit_key } : 'px';
2847
 
2848
  if ( ! isset( $settings->{ $setting_key } ) ) {
2849
  continue;
3017
  }
3018
 
3019
  self::$enqueued_global_assets[] = 'animation-' . $settings->animation['style'];
3020
+ $path = FL_BUILDER_DIR . 'css/animations/' . $settings->animation['style'] . '.css';
3021
 
3022
  if ( file_exists( $path ) ) {
3023
  $css = file_get_contents( $path );
3033
  * @return string A CSS string.
3034
  */
3035
  static public function render_all_animation_css() {
3036
+ $css = '';
3037
  $animations = glob( FL_BUILDER_DIR . 'css/animations/*.css' );
3038
 
3039
  if ( ! is_array( $animations ) ) {
3048
  }
3049
 
3050
  self::$enqueued_global_assets[] = 'animation-' . $key;
3051
+ $css .= file_get_contents( $path );
3052
  }
3053
 
3054
  return $css;
3063
  */
3064
  static public function render_js( $include_global = true ) {
3065
  // Get info on the new file.
3066
+ $nodes = FLBuilderModel::get_categorized_nodes();
3067
+ $global_settings = FLBuilderModel::get_global_settings();
3068
+ $layout_settings = FLBuilderModel::get_layout_settings();
3069
+ $rows = FLBuilderModel::get_nodes( 'row' );
3070
+ $asset_info = FLBuilderModel::get_asset_info();
3071
+ $enqueuemethod = FLBuilderModel::get_asset_enqueue_method();
3072
+ $js = '';
3073
+ $path = $include_global ? $asset_info['js'] : $asset_info['js_partial'];
3074
 
3075
  // Render the global js.
3076
  if ( $include_global && ! isset( $_GET['safemode'] ) ) {
3117
  if ( ! self::is_debug() ) {
3118
  try {
3119
  $min = FLJSMin::minify( $js );
3120
+ } catch ( Exception $e ) {
3121
+ }
3122
 
3123
  if ( isset( $min ) ) {
3124
  $js = $min;
3130
  fl_builder_filesystem()->file_put_contents( $path, $js );
3131
  }
3132
 
3133
+ /**
3134
+ * After JS is compiled.
3135
+ * @see fl_builder_after_render_js
3136
+ */
3137
  do_action( 'fl_builder_after_render_js' );
3138
  }
3139
 
3148
  */
3149
  static public function render_global_js() {
3150
  $global_settings = FLBuilderModel::get_global_settings();
3151
+ $js = '';
3152
 
3153
  // Add the path legacy vars (FLBuilderLayoutConfig.paths should be used instead).
3154
  $js .= "var wpAjaxUrl = '" . admin_url( 'admin-ajax.php' ) . "';";
3176
  * @return string
3177
  */
3178
  static public function render_row_js( $row_id ) {
3179
+ $row = is_object( $row_id ) ? $row_id : FLBuilderModel::get_node( $row_id );
3180
+ $settings = $row->settings;
3181
+ $id = $row->node;
3182
 
3183
  ob_start();
3184
  include FL_BUILDER_DIR . 'includes/row-js.php';
3193
  * @return string
3194
  */
3195
  static public function render_row_modules_js( $row_id ) {
3196
+ $row = is_object( $row_id ) ? $row_id : FLBuilderModel::get_node( $row_id );
3197
+ $nodes = FLBuilderModel::get_categorized_nodes();
3198
+ $template_post_id = FLBuilderModel::is_node_global( $row );
3199
+ $js = '';
3200
 
3201
  // Render the JS.
3202
  foreach ( $nodes['groups'] as $group ) {
3225
  * @return string
3226
  */
3227
  static public function render_column_group_modules_js( $group_id ) {
3228
+ $group = is_object( $group_id ) ? $group_id : FLBuilderModel::get_node( $group_id );
3229
+ $nodes = FLBuilderModel::get_categorized_nodes();
3230
+ $js = '';
3231
 
3232
  // Render the JS.
3233
  foreach ( $nodes['columns'] as $column ) {
3252
  * @return string
3253
  */
3254
  static public function render_column_modules_js( $col_id ) {
3255
+ $col = is_object( $col_id ) ? $col_id : FLBuilderModel::get_node( $col_id );
3256
+ $nodes = FLBuilderModel::get_categorized_nodes();
3257
+ $js = '';
3258
 
3259
  // Render the JS.
3260
  foreach ( $nodes['modules'] as $module ) {
3275
  * @return string
3276
  */
3277
  static public function render_module_js( $module_id ) {
3278
+ $module = is_object( $module_id ) ? $module_id : FLBuilderModel::get_module( $module_id );
3279
+ $global_settings = FLBuilderModel::get_global_settings();
3280
+ $js = '';
3281
 
3282
  // Global module JS
3283
  $file = $module->dir . 'js/frontend.js';
3284
 
3285
  if ( fl_builder_filesystem()->file_exists( $file ) && ! in_array( $module->settings->type . '-module-js', self::$enqueued_global_assets ) ) {
3286
+ $js .= "\n" . fl_builder_filesystem()->file_get_contents( $file );
3287
  self::$enqueued_global_assets[] = $module->settings->type . '-module-js';
3288
  }
3289
 
3290
  // Instance module JS
3291
+ $file = $module->dir . 'includes/frontend.js.php';
3292
+ $settings = $module->settings;
3293
+ $id = $module->node;
3294
 
3295
  if ( ! in_array( $id, self::$enqueued_module_js_assets ) && fl_builder_filesystem()->file_exists( $file ) ) {
3296
  self::$enqueued_module_js_assets[] = $id;
3309
  * @since 1.7
3310
  */
3311
  static public function render_global_nodes_custom_code( $type = 'css' ) {
3312
+ $code = '';
3313
+ $rendered = array();
3314
 
3315
  if ( ! FLBuilderModel::is_post_node_template() ) {
3316
 
3317
+ $nodes = FLBuilderModel::get_layout_data();
3318
  $node_status = FLBuilderModel::get_node_status();
3319
 
3320
  foreach ( $nodes as $node_id => $node ) {
3324
  if ( $template_post_id && ! in_array( $template_post_id, $rendered ) ) {
3325
 
3326
  $rendered[] = $template_post_id;
3327
+ $code .= FLBuilderModel::get_layout_settings( $node_status, $template_post_id )->{ $type };
3328
  }
3329
  }
3330
  }
3427
  * @return string url
3428
  */
3429
  static public function get_fa5_url() {
3430
+
3431
+ /**
3432
+ * Enable the PRO font-awesome-5 icon set.
3433
+ * This will also enqueue the CSS from the CDN.
3434
+ * @see fl_enable_fa5_pro
3435
+ */
3436
+ $url = ( apply_filters( 'fl_enable_fa5_pro', false ) ) ? self::$fa5_pro_url : plugins_url( '/fonts/fontawesome/css/all.min.css', FL_BUILDER_FILE );
3437
+
3438
+ /**
3439
+ * Filter FA5 URL for enqueue.
3440
+ * @see fl_get_fa5_url
3441
+ * @since 2.2.1
3442
+ */
3443
+ return apply_filters( 'fl_get_fa5_url', $url );
3444
  }
3445
 
3446
  /**
css/fl-builder-layout-auto-spacing.css CHANGED
@@ -16,8 +16,6 @@
16
  ------------------------------------------------------ */
17
 
18
  .fl-col[data-node] .fl-col-content {
19
- border-left: none;
20
- border-right: none;
21
  margin: 0;
22
  padding-left: 0;
23
  padding-right: 0;
16
  ------------------------------------------------------ */
17
 
18
  .fl-col[data-node] .fl-col-content {
 
 
19
  margin: 0;
20
  padding-left: 0;
21
  padding-right: 0;
css/fl-builder-layout.css CHANGED
@@ -227,7 +227,7 @@
227
  .fl-builder-ie-11 .fl-row-full-height.fl-row-align-top .fl-row-content,
228
  .fl-builder-ie-11 .fl-row-full-height.fl-row-align-bottom .fl-row-content,
229
  .fl-builder-ie-11 .fl-row-custom-height.fl-row-align-top .fl-row-content,
230
- .fl-builder-ie-11 .fl-row-custom-height.fl-row-align-bottom .fl-row-content, {
231
  margin: 0 auto;
232
  }
233
 
227
  .fl-builder-ie-11 .fl-row-full-height.fl-row-align-top .fl-row-content,
228
  .fl-builder-ie-11 .fl-row-full-height.fl-row-align-bottom .fl-row-content,
229
  .fl-builder-ie-11 .fl-row-custom-height.fl-row-align-top .fl-row-content,
230
+ .fl-builder-ie-11 .fl-row-custom-height.fl-row-align-bottom .fl-row-content {
231
  margin: 0 auto;
232
  }
233
 
css/fl-builder-rtl.css CHANGED
@@ -472,3 +472,11 @@ body .fl-dimension-field-units > *:last-child > * {
472
  .fl-photo-field .fl-photo-replace, .fl-photo-field .fl-photo-remove {
473
  margin: 0 8px 0 0;
474
  }
 
 
 
 
 
 
 
 
472
  .fl-photo-field .fl-photo-replace, .fl-photo-field .fl-photo-remove {
473
  margin: 0 8px 0 0;
474
  }
475
+
476
+ /* HTML editor
477
+ ------------------------------------------------------ */
478
+
479
+ .fl-lightbox .ace_editor {
480
+ direction: ltr;
481
+ text-align: left;
482
+ }
css/fl-builder.css CHANGED
@@ -3305,6 +3305,11 @@ form.fl-builder-settings {
3305
  .fl-lightbox .mce-top-part::before {
3306
  box-shadow:none !important;
3307
  }
 
 
 
 
 
3308
  .fl-lightbox div.mce-toolbar-grp {
3309
  background: transparent;
3310
  border:none;
@@ -4860,8 +4865,7 @@ span.select2-container.select2-container--open {
4860
  .fl-field-connections-toggle {
4861
  padding: 10px 0px;
4862
  }
4863
- .fl-field[data-type="editor"] .fl-field-connections-toggle,
4864
- .fl-field[data-type="code"] .fl-field-connections-toggle {
4865
  align-items: flex-start;
4866
  }
4867
  .fl-field[data-type="link"] .fl-field-connections-toggle {
@@ -5664,8 +5668,7 @@ body > .fl-builder-tour-dimmed {
5664
  .fl-field-connections-menu {
5665
  z-index: 999999;
5666
  }
5667
- .fl-field[data-type="editor"] .fl-field-connections-toggle,
5668
- .fl-field[data-type="code"] .fl-field-connections-toggle {
5669
  right: 5px !important;
5670
  }
5671
  .fl-field-connections-inline-toggle {
3305
  .fl-lightbox .mce-top-part::before {
3306
  box-shadow:none !important;
3307
  }
3308
+
3309
+ .mce-container .mce-stack-layout span {
3310
+ color: initial;
3311
+ }
3312
+
3313
  .fl-lightbox div.mce-toolbar-grp {
3314
  background: transparent;
3315
  border:none;
4865
  .fl-field-connections-toggle {
4866
  padding: 10px 0px;
4867
  }
4868
+ .fl-field[data-type="editor"] .fl-field-connections-toggle {
 
4869
  align-items: flex-start;
4870
  }
4871
  .fl-field[data-type="link"] .fl-field-connections-toggle {
5668
  .fl-field-connections-menu {
5669
  z-index: 999999;
5670
  }
5671
+ .fl-field[data-type="editor"] .fl-field-connections-toggle {
 
5672
  right: 5px !important;
5673
  }
5674
  .fl-field-connections-inline-toggle {
css/fl-builder.min.css CHANGED
@@ -1 +1 @@
1
- .fl-color-picker-ui{width:300px}.fl-color-picker-ui.fl-color-alpha-enabled{width:334px}.fl-color-picker-ui .iris-picker{float:left;width:100%;height:224px;display:block;position:relative;border-top:1px solid rgba(0,0,0,.1)}.fl-color-picker-ui .iris-picker .iris-square-inner,.fl-color-picker-ui .iris-picker-inner{position:absolute;left:0;top:0;bottom:0;right:0}.fl-color-picker-ui .iris-picker,.iris-picker *{box-sizing:content-box}.fl-color-picker-ui .iris-error{background-color:#ffafaf}.fl-color-picker-ui .iris-picker .iris-square{width:300px;height:200px}.fl-color-picker-ui .iris-picker .iris-palette,.fl-color-picker-ui .iris-picker .iris-slider,.fl-color-picker-ui .iris-picker .iris-square-inner{height:100%;width:12.5%}.fl-color-picker-ui .iris-picker .iris-placeholder,.fl-color-picker-ui .iris-picker .iris-square{position:relative}.fl-color-picker-ui .iris-picker .iris-square-inner{width:auto;margin:0}.fl-color-picker-ui .iris-ie-9 .iris-palette,.fl-color-picker-ui .iris-ie-9 .iris-slider,.fl-color-picker-ui .iris-ie-9 .iris-square,.fl-color-picker-ui .iris-ie-9 .iris-square-inner{box-shadow:none;border-radius:0}.fl-color-picker-ui .iris-ie-9 .iris-palette,.fl-color-picker-ui .iris-ie-9 .iris-slider,.fl-color-picker-ui .iris-ie-9 .iris-square{outline:rgba(0,0,0,.1) solid 1px}.fl-color-picker-ui .iris-ie-lt9 .iris-palette,.fl-color-picker-ui .iris-ie-lt9 .iris-slider,.fl-color-picker-ui .iris-ie-lt9 .iris-square,.fl-color-picker-ui .iris-ie-lt9 .iris-square-inner{outline:#999 solid 1px}.fl-color-picker-ui .iris-ie-lt9 .iris-square .ui-slider-handle{outline:#999 solid 1px;background-color:#fff;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"}.fl-color-picker-ui .iris-ie-lt9 .iris-square .iris-square-handle{background:0 0;border:3px solid #fff;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"}.fl-color-picker-ui .iris-picker .iris-strip{box-sizing:border-box;width:calc(300px - 12px);margin:5px 6px 6px;border-radius:4px;position:relative;height:22px;transform:rotate(180deg)}.fl-color-picker-ui .iris-picker .iris-strip .ui-slider-handle{width:6px;position:absolute;right:0;top:-2px;bottom:-2px;margin:0;border-radius:3px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.5);z-index:5;cursor:ew-resize}.fl-color-picker-ui .iris-picker .iris-strip .ui-slider-handle:focus{outline:#00a0d2 solid 2px}.fl-color-picker-ui .iris-picker .iris-slider-offset{position:absolute;top:0;left:6px;right:0;bottom:0;width:auto;height:auto;background:0 0;border:none;border-radius:0;transform:rotate(180deg)}.fl-color-picker-ui .iris-picker .iris-square-handle{background:0 0;border:5px solid #999;border-radius:50%;border-color:rgba(128,128,128,.5);box-shadow:none;width:12px;height:12px;position:absolute;left:-10px;top:-10px;cursor:move;opacity:1;z-index:10}.fl-color-picker-ui .iris-picker .ui-state-focus .iris-square-handle{opacity:.8}.fl-color-picker-ui .iris-picker .iris-square-handle:hover{border-color:#999}.fl-color-picker-ui .iris-picker .iris-square-value:focus .iris-square-handle{box-shadow:0 0 2px rgba(0,0,0,.75);opacity:.8}.fl-color-picker-ui .iris-picker .iris-square-handle:hover::after{border-color:#fff}.fl-color-picker-ui .iris-picker .iris-square-handle::after{position:absolute;bottom:-4px;right:-4px;left:-4px;top:-4px;border:3px solid #f9f9f9;border-color:rgba(255,255,255,.8);border-radius:50%;content:" "}.fl-color-picker-ui .iris-picker .iris-square-value{width:0;height:0;position:absolute}.iris-ie-lt9 .iris-square-value,.iris-mozilla .iris-square-value{width:1px;height:1px}.fl-color-picker-wrapper{position:relative;width:48px;height:32px}.fl-color-picker{box-shadow:0 2px 4px 0 rgba(0,0,0,.12);background:url(../img/transp_bg.png) #fff;border-radius:4px;width:120px;height:36px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.fl-color-picker-color{-ms-flex:1 1 100%;flex:1 1 100%;box-sizing:border-box!important;position:relative;border-radius:4px;background-color:transparent;cursor:pointer;border:2px solid transparent;padding:0;-ms-flex-pack:center;justify-content:center;display:-ms-flexbox;display:flex}.fl-color-picker-clear:hover,.fl-color-picker-color:hover{background:0 0;border:2px solid transparent}.fl-color-picker-clear:focus,.fl-color-picker-color.fl-color-picker-empty:focus,.fl-color-picker-color:focus{outline:0;top:0;border:2px solid #00a0d2;background:0 0}.fl-color-picker.fl-color-picker-has-reset .fl-color-picker-color:not(.fl-color-picker-empty){border-top-right-radius:0;border-bottom-right-radius:0}.fl-color-picker-icon{display:none;margin:auto}.fl-color-picker-color.fl-color-picker-empty{border-color:transparent}.fl-color-picker-color.fl-color-picker-empty svg.fl-color-picker-icon{display:block}.fl-color-picker-color.fl-color-picker-empty svg.fl-color-picker-icon path{fill:inherit}.fl-color-picker-clear{box-sizing:border-box;position:relative;display:-ms-flexbox;display:flex;-ms-flex:0 0 36px;flex:0 0 36px;-ms-flex-pack:center;justify-content:center;padding:0;border:2px solid transparent;fill:#A2AABE;background-color:#E7EBEF;cursor:pointer;border-radius:0 4px 4px 0}.fl-color-picker-clear:hover{fill:#6B6E75;background-color:#E7EBEF}.fl-color-picker-color.fl-color-picker-empty+.fl-color-picker-clear{display:none}.fl-color-picker-ui{display:inline-block;font-family:Helvetica,Verdana,sans-serif;z-index:1;position:fixed;overflow:hidden;padding-bottom:45px;border:1px solid rgba(0,0,0,.1);color:#999;background-color:#FAFAFA;border-radius:3px;box-shadow:0 9px 20px rgba(0,0,0,.17);transition:opacity .2s,visibility .2s;visibility:hidden;opacity:0;-webkit-transform:translate3d(0,0,0)}.fl-color-picker-ui.fl-color-picker-active{visibility:visible;opacity:1;z-index:999999}.fl-color-picker-ui .fl-color-picker-input,.fl-color-picker-ui .fl-color-picker-input:focus{width:100%;height:30px;border:none!important;font-size:14px!important;padding:0 8px;vertical-align:middle;color:#656c6e;background-color:#fff;border-radius:0;box-shadow:none}.fl-color-picker-ui .iris-square-value{transition:none}.fl-color-picker-preset-add{position:absolute;top:8px;right:8px;width:14px;height:14px;background-color:#656c6e;border-radius:50%;cursor:pointer;transition:all .2s}.fl-color-picker-preset-add:hover{background-color:#333}.fl-color-picker-preset-add:after,.fl-color-picker-preset-add:before{content:'';display:block;position:relative;background-color:#fff}.fl-color-picker-preset-add:before{top:6px;left:3px;width:8px;height:2px}.fl-color-picker-preset-add:after{left:6px;top:1px;width:2px;height:8px}.fl-color-picker-presets{position:absolute;left:0;bottom:0;width:100%;z-index:15;overflow:auto;border-top:1px solid rgba(0,0,0,.1);background-color:#FAFAFA}.fl-color-picker-presets-list .fl-color-picker-preset:hover,.fl-color-picker-presets-toggle:hover{background-color:#EDEDED}.fl-color-picker-presets-toggle{position:relative;overflow:hidden;width:100%;height:35px;text-align:center;line-height:35px;font-size:12px;font-weight:700;cursor:pointer;transition:all .1s}.fl-color-picker-presets-close-label,.fl-color-picker-presets-open-label{position:absolute;top:50%;left:50%;visibility:hidden;color:#999;transition:all .5s;transform:translate(-50%,-50%);opacity:0;width:100%}.fl-color-picker-presets-close-label.fl-color-picker-active,.fl-color-picker-presets-open-label.fl-color-picker-active{color:#656c6e;visibility:visible;opacity:1;z-index:999999}.fl-color-picker-presets-list{width:100%;list-style:none;margin:0;padding:0;overflow:auto}.fl-color-picker-presets-list .fl-color-picker-no-preset,.fl-color-picker-presets-list .fl-color-picker-preset{position:relative;padding:5px;font-size:12px;border-top:1px solid rgba(0,0,0,.1);transition:all .1s}.fl-color-picker-presets-list .fl-color-picker-no-preset{padding:18px 5px;text-align:center}.fl-color-picker-presets-list .fl-color-picker-preset-color{display:inline-block;width:40px;height:20px;margin-right:3px;vertical-align:middle;border:1px solid rgba(0,0,0,.1);border-radius:2px;cursor:pointer}.fl-color-picker-presets-list .fl-color-picker-preset-label{vertical-align:middle;color:#333;cursor:pointer}.fl-color-picker-presets-list .fl-color-picker-preset-remove{position:absolute;top:50%;cursor:pointer;transform:translateY(-50%)}.fl-color-picker-clear .fl-color-picker-icon-remove{right:auto;top:auto;margin:auto}.fl-color-picker-presets-list .fl-color-picker-preset-remove{right:5px}.fl-color-picker-presets-list .fl-color-picker-preset-remove:hover:after,.fl-color-picker-presets-list .fl-color-picker-preset-remove:hover:before{background-color:#333}.fl-color-picker-added{position:absolute;width:100%;top:0;left:0;right:0;bottom:35px;z-index:10;color:#fff;text-align:center;background-color:rgba(0,0,0,.8)}.fl-color-picker-added-text{position:absolute;top:50%;left:50%;width:80%;font-size:14px;color:#fff!important;transform:translate(-50%,-50%)}.fl-color-picker-icon-check{position:relative;width:50px;height:50px;margin:5px auto}.fl-color-picker-icon-check:before{content:'';display:block;position:relative;width:15px;height:30px;margin-left:14px;border:7px solid #fff;border-left:none;border-top:none;transform:rotate(45deg)}.fl-color-picker-icon-arrow-down,.fl-color-picker-icon-arrow-up{display:inline-block;position:relative;width:10px;height:10px;margin-left:5px}.fl-color-picker-icon-arrow-down:before,.fl-color-picker-icon-arrow-up:before{content:'';display:block;position:relative;width:6px;height:6px;border:2px solid #999;border-left:none;border-top:none;transform:rotate(45deg)}.fl-color-picker-icon-arrow-up{top:2px;transform:rotate(180deg)}.fl-color-picker-icon-remove{width:15px;height:15px}.fl-color-picker-icon-remove:after,.fl-color-picker-icon-remove:before{content:'';display:block;position:relative;background-color:#6f7881}.fl-color-picker-icon-remove:before{left:6px;width:2px;height:10px;margin-top:3px;transform:rotate(-45deg)}.fl-color-picker-icon-remove:after{left:6px;width:2px;height:10px;margin-top:-10px;transform:rotate(45deg)}.fl-alpha-wrap{position:absolute;width:32px;height:215px;padding:0 5px;right:4px;border-top:none}.fl-alpha-slider{height:190px;position:absolute;top:12px;width:28px}.fl-alpha-slider .ui-slider-handle{background:rgba(0,0,0,0);border-color:#aaa;border-radius:4px;border-style:solid;border-width:4px;box-shadow:0 1px 2px rgba(0,0,0,.2);-moz-box-shadow:0 1px 2px rgba(0,0,0,.2);-webkit-box-shadow:0 1px 2px rgba(0,0,0,.2);cursor:ns-resize;height:12px;left:0;opacity:.9;position:absolute;right:0;width:30px;z-index:14}.fl-alpha-slider .ui-slider-handle:before{content:" ";position:absolute;left:-2px;right:-2px;top:-3px;bottom:-3px;border:2px solid #fff;border-radius:3px}.fl-theme-builder-preview-select-title i:before,body .fl-theme-builder-preview-select .fa-caret-down i:before,body .fl-theme-builder-preview-select-item-title i:before{content:"\f078"}.fl-alpha-slider-offset{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAASCAYAAAAe/ZHXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NkNEQUQ0ODM4RUE0MTFFNEExOEJFN0E5M0VFOTg0QUQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NkNEQUQ0ODQ4RUE0MTFFNEExOEJFN0E5M0VFOTg0QUQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2Q0RBRDQ4MThFQTQxMUU0QTE4QkU3QTkzRUU5ODRBRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo2Q0RBRDQ4MjhFQTQxMUU0QTE4QkU3QTkzRUU5ODRBRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/r/N8AAAWYSURBVHjarFvvR3VBEN45JZGIPkREHyIiIhJJf3qUSERE9CGiDxERkcg9z9u92uucvTszz5z7xnHPj93Z2d359cxscn5+jpTS+EoiMr3/+51cZ2dn4+e29i2/u7y8RKf/pO3vc+o+n5ycoNK31+f6+jrfZ37yuG2mf3R01H3fa5N/b29vU6dP5qft0G4PDg5MGuPr/v4+jz1t27mfvN/b21P75+fHx8eZfiV/Ozs7rUJnSu/5+RlFv+m6ZJpbW1s1PnrvXl9fZ/qX89zY2LB4mfy+v7/nsdV1XltbK/dr5vnz87OcV5bJabuVlRVLBifjfX9/l/xkGtM+S0tLNXnu0szfU/P3IMn/k0678h6ddqjQFGccVL6hoCsVfsq+NZ5QtCv5rfFS41sq37W+UPhMyhxEWTetvce3NR8oewqD39qalXuGAK/WPltjajIC4x2c9Ye1f43SGcqGwRBeTZjhMNntL4pCWZMQYhE05RVl02EovRgC4RkCbUNSQAGhGB/GsKG4h6FQoigDa2i8fRBy3uLMXYIG3Vr3aZvRaCRdBYlYIMZywhBGCVhgzzOlgRuUSOvC0GMEWxOM/+EtQFh1OIIXtfwg1tRaayGjg5px0jyZKEaTle3e+AsLCygVRAh3FlEgKbReE3oYGj9EgIR00QiEgKw3ZBQbRGjBeAMtDETQmHiKDsezJNLgCTFGItZXlAgCSiQggblP+9c8SDI0lXWlFv5g3K63KZ51FOcZzthQ3LomoNHwJmKIQISI3vqzSpwIQ8liSjGMFQjDpoVgaQ6cWgvLhOC7qiAwiHrWbEg4JMSmeUrBuHoYwioOQNXmhmAcrs096s1gJCGi3hSEVU8DQxYElYHhKwUUGAa+NqOBMsSSAQJuhQhCAH4vxozExsxiihPuaIrjCVYKWlYEsjSM52G8Kxxryngl5j0j+EyGTIiED4s1Itm0ZGWxMFCLJaBAcEI6OBkmFgNBoc8Cait2ZnENE/6wQN8LJSJeSMNAjKVm+LUMAIt3PR5AQgIGp1Z5zxhE8PtXUYReYeXi4mKmOPNXBMzt2tPT07LIUtJqr66uusXEbkFnWiQ6Pj72ikrtzc1NKopuvbbj58PDwxqNHp27u7tuYWumUDV+v7+/Xyu6pc59+/DwUCsC9ujt7u6qRbt8//T01C3elbyN70fb29uZ/1FSincvLy/lPGb42tzc9IqJeHt7q61Pr2C6vr7u7tfHx8fMPhV0sLq6WhZtU0n36+uru8elPE7aLi8v1wqJPXn++fmZKYgX8ozFxcXJb0NaQTHClZT8+gBjsYdaFc+zWcUkGTCWENY66ta92oSVzo3WI6IZKGtukeyfBLFKBNAj6bUOBgaoe9wE4n04IBNkLMoC7+Skj630ZlTJMYdyMsU2T8AwpzALkVFilZgJcT2l9PCWDDSAMBSjVlJgZNk0lE1AIby0qCiCnBQNj6aBGQslZIZJ5hB6D/AzQHto5Z9Nk8tARdN4q2ExBnsyIJ311EymShyjan2rKk0zh1Ay1oQVWAZQRnkUA8RFw7TahjBnmNgMVMQrsCGZJezRtGlU0cUZ1zuaxGZPpbhApM+ZpFQqQ6xadoMtBrEKpBVo4GRXvNSxpaRixKiR+TChCYhsDwZkfFj8IkErjAHejcUI0XQrgwehhNSMHAz21E0wZ23FcCAmj8Sd/PXy2xLYLAuwRw4IMsqjFaWYOpMEhDySAPFCWyFkgAHrEcA+BNeJ4UE8HCzJPpCrerUmQIx1pWJkjqxJD8EikUo2c5aI8ZYgsAkM4WQtnHd0ns0ORgVTBghy5ISy928SGsbTMqYg523RUY8oNYG4FIYiyRyZCnFCJC87IoRAIMVOqQ7BKexxCS2hYVl9JhvlpYjnAe4MhmRPMWhhvLfXINaI9WKM0Zu0+SfAAFLE1EgfVSv7AAAAAElFTkSuQmCC) center;box-shadow:0 0 5px rgba(0,0,0,.4) inset;-moz-box-shadow:0 0 5px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 5px rgba(0,0,0,.4) inset;width:200px;height:22px;transform:rotate(-90deg);bottom:48%;left:-80px;position:absolute}.fl-alpha-text{width:30px;font-size:12px;text-align:center;color:#999;position:absolute;bottom:-5px}.fl-lightbox-mask,.fl-lightbox-wrap{bottom:0;left:0;position:fixed;right:0;z-index:100010}@keyframes fl-lightbox-zoom{from{transform:scale(.4)}to{transform:scale(1)}}.fl-lightbox-wrap{display:none;overflow:auto;padding:0;top:43px;-webkit-backface-visibility:hidden;-webkit-transform:translateZ(0);pointer-events:none}.fl-builder-draggable-is-dragging .fl-lightbox-wrap,.fl-builder-resizable-is-resizing .fl-lightbox-wrap,.fl-lightbox,.fl-lightbox-mask{pointer-events:auto}.fl-lightbox-mask{background:#000;opacity:.7;filter:alpha(opacity=70);top:0}.fl-lightbox{background:#F5F7F9;border-radius:4px;box-shadow:rgba(0,0,0,1) 0 4px 30px;-moz-box-shadow:rgba(0,0,0,1) 0 4px 30px;-webkit-box-shadow:rgba(0,0,0,1) 0 4px 30px;position:relative;display:-ms-flexbox;display:flex;z-index:100011;transform-origin:center;animation-name:fl-lightbox-zoom;animation-duration:.25s}.fl-lightbox.fl-lightbox-prevent-animation{animation-duration:0s;-moz-animation-duration:0s;-webkit-animation-duration:0s;-o-animation-duration:0s}.fl-lightbox :not(i){color:#333;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:12px;line-height:14px;text-decoration:none;text-transform:none}.fl-lightbox *,.fl-lightbox :after,.fl-lightbox :before{box-sizing:content-box}#fl-ui-root .fl-nanoscroller-pane,.fl-builder--content-library-panel .fl-nanoscroller-pane,.fl-lightbox .fl-nanoscroller-pane{bottom:2px;right:2px;width:6px}.fl-nanoscroller>.fl-nanoscroller-pane>.fl-nanoscroller-slider{background-color:#bac0ca;transition-property:height,background-color;transition-duration:.25s}#wpadminbar,html{transition-duration:.35s}.fl-nanoscroller>.fl-nanoscroller-pane>.fl-nanoscroller-slider:hover{background-color:#c8cdd4}.fl-nanoscroller>.fl-nanoscroller-pane.active>.fl-nanoscroller-slider{background-color:#029fd2}.fl-lightbox .fa{font-family:FontAwesome!important}.fl-lightbox .dashicons{font-family:dashicons}.fl-lightbox.ui-draggable{box-shadow:rgba(0,0,0,.2) 0 7px 30px;-moz-box-shadow:rgba(0,0,0,.2) 0 7px 30px;-webkit-box-shadow:rgba(0,0,0,.2) 0 7px 30px}#wpadminbar,.fl-builder-bar.is-hidden{pointer-events:none}.fl-lightbox-resizable{height:500px;width:380px}@media (max-width:500px){.fl-lightbox-resizable{left:0!important;right:0!important;top:0!important;height:100%!important;width:100%!important}.fl-lightbox-resizable .ui-resizable-handle{display:none!important}.fl-lightbox.ui-draggable .fl-lightbox-header{cursor:default!important}.fl-lightbox-controls{display:none}}.fl-lightbox-width-full{left:0!important;right:0!important;top:0!important;height:100%!important;width:100%!important}.fl-lightbox-width-full .fl-lightbox-header{cursor:inherit!important}.fl-lightbox-controls{position:absolute;right:10px;top:10px;z-index:5}.fl-lightbox-controls .fa{color:#bdbdbd;font-size:14px;padding:5px}.fl-lightbox-controls .fa:hover{color:#aaa;cursor:pointer}.fl-lightbox-header-wrap{border-top-left-radius:4px;border-top-right-radius:4px}.fl-lightbox-header{position:relative}.fl-lightbox-header h1{color:#333!important;font-size:16px!important;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important;font-weight:400!important;margin:0!important;padding:14px 34px 15px 28px!important;text-align:left!important;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center;line-height:1}.fl-lightbox.ui-draggable .fl-lightbox-header{cursor:move}.fl-lightbox-header h1 .fl-builder-badge{margin-left:10px;color:#fff;background-color:#F7A408}.fl-lightbox-content,.fl-lightbox-content-wrap{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:1 100%;flex:1 100%;max-width:100%}.fl-lightbox-footer{box-sizing:border-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:end;justify-content:flex-end;-ms-flex:0 0;flex:0 0;-ms-flex-preferred-size:44px;flex-basis:44px;padding:4px;text-align:right}.fl-lightbox-footer .fl-builder-button{height:36px;margin-left:5px!important;-ms-flex:0 0 0%;flex:0 0 0%;-ms-flex-pack:center;justify-content:center}.fl-lightbox-width-slim .fl-lightbox-footer{-ms-flex-pack:stretch;justify-content:stretch;padding:4px 5px}.fl-lightbox-width-slim .fl-lightbox-footer .fl-builder-button{-ms-flex:1 1 100%;flex:1 1 100%;display:block;text-align:center}.fl-lightbox-width-slim .fl-lightbox-footer .fl-builder-button:first-child{margin-left:0!important}.fl-lightbox table,.fl-lightbox td,.fl-lightbox th,.fl-lightbox tr{border:none}.fl-lightbox-wrap.fl-icon-selector{z-index:1000111}.fl-icon-selector .fl-lightbox{height:100%}.fl-icons-filter{height:auto!important;margin:0!important;position:absolute!important;right:0;top:0;padding:10px 16px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.fl-icons-filter select{vertical-align:middle;width:195px;-webkit-appearance:none;-moz-appearance:none;appearance:none;box-sizing:border-box;color:#000;border:2px solid #e4e7ea!important;border-right:none!important;margin:0;padding:2px 10px;background:url(../img/svg/select-arrow-down-alt2.svg) center right 10px no-repeat #fff!important;-ms-flex:1 1 195px;flex:1 1 195px;border-radius:0}.fl-icons-filter input[type=text]{line-height:18px;vertical-align:middle;width:160px;-ms-flex:1 1 160px;flex:1 1 160px;border:2px solid #e4e7ea!important;border-radius:0!important;padding:2px 10px!important}.fl-icons-filter input[type=text]:focus,.fl-icons-filter select:focus{border:2px solid #00A0D2!important}.fl-icons-list{bottom:52px;left:0;overflow:auto;padding:20px;position:absolute;right:0;top:48px}.fl-icons-list::-webkit-scrollbar{background-color:#ccc;-webkit-appearance:none;width:10px}.fl-icons-list::-webkit-scrollbar-thumb{background-color:#666;border:1px solid #ccc}.fl-icons-section{text-align:center}.fl-icons-section h2{border-bottom:1px solid #dfdfdf;color:#333!important;font-family:Helvetica,Verdana,sans-serif!important;font-size:16px!important;font-weight:700!important;margin:0 0 20px!important;padding:0 0 10px!important;text-align:left}.fl-icons-list i,.fl-icons-list i:before{cursor:pointer;display:inline-block;font-size:40px;height:100px;line-height:100px;width:100px;background:0 0}.fl-icons-list i:hover{background:#fff;box-shadow:0 10px 20px rgba(0,0,0,.15);border-radius:4px}.fl-icon-selector-footer{bottom:0;left:0;position:absolute;right:0}html{transition-property:margin}html.fl-builder-is-showing-toolbar{margin-top:calc(44px + 1px)!important}.fl-builder-edit body{position:static!important}.fl-builder-edit:after,.fl-builder-edit:before{z-index:0!important}.fl-builder-edit .fl-builder-content{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none}#wpadminbar{transition-property:transform,opacity;transform-origin:bottom;transform-style:preserve-3d;transform:rotateX(89deg) translateY(46px);opacity:0;will-change:transform}html.fl-builder-show-admin-bar{margin-top:32px}html.fl-builder-show-admin-bar #wpadminbar{transform:rotateX(0) translateY(0);pointer-events:auto;opacity:1}@media screen and (max-width:782px){html.fl-builder-show-admin-bar{margin-top:46px}}.fl-clear{clear:both}.screen-reader-text{position:absolute;left:-1000em;top:-1000em;height:1px;width:1px;overflow:hidden}.fl-builder-loading{background:url(../img/ajax-loader.svg) center center no-repeat rgba(240,240,240,.8);bottom:0;display:none;left:0;position:fixed;right:0;text-align:center;top:0;z-index:12000000}.fl-builder-settings .fl-builder-loading{background:url(../img/ajax-loader.svg) center center no-repeat rgba(255,255,255,.8);display:block;position:absolute}.fl-field-loader{color:#B3B3B3!important;font-style:italic}.fl-builder-node-loading{opacity:.35!important}.fl-builder-node-loading-placeholder{background:url(../img/ajax-loader.svg) center center no-repeat;height:50px}.fl-col-group-has-child-loading{display:-ms-flexbox;display:flex}.fl-col-group-has-child-loading>.fl-builder-node-loading-placeholder{width:50px}.fl-node-hidden{display:none}.fl-builder-edit .fl-node-hidden{display:block}html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-desktop,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-desktop-medium,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-medium,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-medium-mobile,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-mobile{display:block!important}html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-desktop,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-desktop-medium,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-medium,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-medium-mobile,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-mobile{display:-ms-flexbox!important;display:flex!important}.fl-responsive-preview-enabled body{overflow:hidden!important}.fl-responsive-preview-mask{background:#F7F7F7;bottom:0;left:0;position:fixed;right:0;top:0;z-index:99999}.fl-responsive-preview{bottom:0;left:0;position:fixed;right:0;top:0;margin-top:50px;z-index:100000}.fl-builder-preview .fl-responsive-preview{margin:0!important}.fl-responsive-preview-content{background:#F5F7F9;padding:20px 20px 45px;overflow:scroll;position:absolute;top:45px;right:0;bottom:0;left:0}.fl-responsive-preview-content .fl-builder-content-editing{overflow:visible!important}.fl-responsive-preview-message{background:#F5F7F9;color:#b3b3b3;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important;font-size:14px;font-weight:400;padding:15px;text-align:center;position:absolute;top:0;left:0;right:0;z-index:999999}.fl-responsive-preview-message span{display:inline-block;margin-right:8px}.fl-responsive-preview-message .fl-builder-button{display:inline-block;margin-left:2px;padding:0 10px}.fl-responsive-preview-message .fl-builder-button i{font-size:14px;height:14px;width:14px}.fl-responsive-preview .fl-builder-content{box-shadow:0 0 8px rgba(0,0,0,.2);margin-left:auto;margin-right:auto;max-width:100%;overflow:visible;position:relative}#fl-builder-preview-frame,#fl-builder-preview-mask{bottom:0;height:100%;position:fixed;top:0;width:100%;right:0}.fl-responsive-preview .fl-block-col-resize{display:none}.fl-builder-button,body .fl-builder-bar .fl-builder-bar-content{display:-ms-flexbox;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important}#fl-builder-preview-mask{background:url(../img/ajax-loader.svg) center center no-repeat #F7F7F7;left:0;z-index:999999}#fl-builder-preview-frame{left:50%;transform:translateX(-50%);-moz-transform:translateX(-50%);-webkit-transform:translateX(-50%);z-index:1000000}body button[class*=fl-builder],body button[class*=fl-builder]:focus,body button[class*=fl-builder]:hover{box-shadow:none;max-height:none;max-width:none;text-decoration:none;text-indent:0;text-shadow:none;text-transform:none}.fl-builder-button{-webkit-appearance:none;-ms-flex-align:center;align-items:center;background:#e7ebef;border:2px solid transparent;border-radius:3px;-webkit-border-radius:3px;box-sizing:border-box!important;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;color:#676F7A!important;cursor:pointer;display:flex;fill:#676F7A!important;font-size:14px!important;font-style:normal!important;font-weight:500!important;height:33px;letter-spacing:normal!important;line-height:1!important;margin:0;padding:0 12px;text-align:center;transition-property:background-color,width;transition-duration:.2s;white-space:nowrap;width:auto;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fl-builder--search-results-panel,.fl-builder-bar,.fl-builder-panel{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-touch-callout:none}.fl-builder-button:hover{background:#dadfe5;color:#222;border:2px solid transparent!important}.fl-builder-button:active{background:#DCDCDC}button.fl-builder-button:focus{position:static;top:auto;outline:0;background:#E4E7EA;border:2px solid #00A0D0!important}.fl-builder-bar .fl-builder-button{height:auto}.fl-builder-button-primary,body.fl-builder--layout-has-drafted-changes .fl-builder-done-button{background:#00A0D2;color:#fff!important;text-decoration:none;border:2px solid transparent!important}.fl-builder-button.fl-builder-button-primary:focus,body.fl-builder--layout-has-drafted-changes .fl-builder-button.fl-builder-done-button:focus{background:#00A0D2;border:2px solid #ffc217!important}.fl-builder-button-primary:hover,body.fl-builder--layout-has-drafted-changes .fl-builder-done-button:hover{background:#0197C6;color:#fff!important}.fl-builder-button-primary:active,body.fl-builder--layout-has-drafted-changes .fl-builder-done-button:active{background:#0484AC}.fl-builder-button-large{height:30px}.fl-builder-button-small{font-size:11px!important;line-height:1!important}.fl-builder-help-button{color:#b3b3b3;font-size:16px!important}.fl-builder-help-button i{position:relative;top:-1px}.fl-builder-help-button:hover{color:#666}.fl-builder-publish-button{line-height:45px!important}.fl-builder-content-panel-button,.fl-builder-content-panel-button:hover{fill:#00A0D2!important;font-size:30px!important;padding-bottom:4px}.fl-builder-button-silent,.fl-builder-button-silent:hover{padding:0 12px;background:0 0!important;border:2px solid transparent!important;box-shadow:none!important}.fl-builder-done-button,.fl-builder-done-button:hover{font-weight:600}.fl-field .fl-builder-button{display:inline-block;height:auto;padding:11px 12px;vertical-align:middle;box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.fl-builder-badge{background:#333;border-radius:2px;color:#fff!important;display:inline;font-size:11px!important;font-weight:400;letter-spacing:1px;margin-left:2px;padding:2px 4px;vertical-align:middle}.fl-builder-badge-global{background:#ff9600;transform:translateY(0);transition-duration:.25s;transition-property:transform}.fl-builder-blocks-node-template .fl-builder-badge-global{position:absolute;right:0;top:0}.fl-builder-block:hover .fl-builder-badge-global{display:none}.fl-builder-bar{left:0;position:fixed;right:0;top:0;z-index:999999;user-select:none;transition-property:transform opacity;transition-duration:.35s;transform-style:preserve-3d;perspective:1100px}.fl-builder-bar.is-hidden .fl-builder-bar-content{transform:translateY(-100%) rotateX(90deg)}body .fl-builder-bar .fl-builder-bar-content{display:flex;box-sizing:border-box;background:#fff;border-bottom:1px solid #eceef1;color:#999;font-size:14px!important;height:calc(44px + 1px);transition-property:background-color,opacity,transform;transition-duration:.35s;pointer-events:auto}.fl-builder-draggable-is-dragging .fl-builder-content,.fl-builder-draggable-is-dragging .fl-builder-panel .fl-lightbox,.fl-builder-resizable-is-resizing .fl-builder-content,.fl-builder-resizable-is-resizing .fl-builder-panel .fl-lightbox,body .fl-builder-bar .fl-builder-bar-content.is-muted{pointer-events:none}body .fl-builder-bar .fl-builder-bar-content.is-muted>:not(.fl-builder-publish-actions){-webkit-filter:saturate(20%) blur(1px);filter:saturate(20%) blur(1px);opacity:.4}.fl-builder-bar-title{box-sizing:border-box;color:#333;display:-ms-flexbox;display:flex;-ms-flex:0 0 380px;flex:0 0 380px;max-width:380px;border-right:1px solid #eceef1;cursor:pointer}.fl-builder-bar-title:hover{background:#fff}.fl-builder-bar-title.is-showing-menu .fl-builder-bar-title-caret>svg{transform:rotate(180deg)}.fl-builder-simple .fl-builder-bar-title{cursor:auto}.fl-builder-simple .fl-builder-bar-title:hover{cursor:auto;background:0 0}.fl-builder-bar-title span{vertical-align:middle}.fl-builder-bar-title-icon{box-sizing:border-box;background:0 0;-ms-flex:0 0 46px;flex:0 0 46px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:4px}.fl-builder-bar-title-icon img{max-width:100%!important;height:auto!important}.fl-builder-bar-title.fl-builder-bar-title-no-icon{padding-left:12px}.fl-builder-bar-title-area{box-sizing:border-box;-ms-flex:1 1 100%;flex:1 1 100%;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;overflow:hidden;padding:4px}.fl-builder-layout-title,.fl-theme-builder-preview-select .fl-theme-builder-preview-select-title span{font-size:16px;font-weight:400;line-height:1.3;color:#161B20;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.fl-builder-bar-title-caret,.fl-builder-layout-pretitle,.fl-theme-builder-preview-select .fl-theme-builder-preview-select-title{font-size:12px;font-weight:500;line-height:1.3;color:#656d77;text-align:left;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.fl-builder-bar-title-caret i,.fl-theme-builder-preview-select-title i{color:inherit!important;font-size:14px}.fl-builder-bar-title-caret{margin-left:auto!important;-ms-flex:0 0 46px;flex:0 0 46px}.fl-theme-builder-preview-select-title i{padding:12px}.fl-theme-builder-preview-select.fl-builder-button{position:relative;border-radius:0;background:0 0;min-width:0;display:-ms-flexbox;display:flex;-ms-flex:0 0 360px;flex:0 0 360px;max-width:360px;margin:0!important;padding:4px 10px;border:none!important;border-right:2px solid #d5dadd!important;box-shadow:none}.fl-theme-builder-preview-select.fl-builder-button:hover{border:none!important;border-right:2px solid #d5dadd!important}.fl-theme-builder-preview-select .fl-theme-builder-preview-select-title{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-pack:end;justify-content:flex-end;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.fl-theme-builder-preview-select-title div{-ms-flex:1;flex:1}.fl-theme-builder-preview-select .fl-theme-builder-preview-select-title span{display:block}.fl-theme-builder-preview-select-open .fl-theme-builder-preview-select-items{position:absolute;top:calc(48px + 10px);left:10px;width:calc(100% - 20px)!important;background:#fff;border-radius:4px;border:2px solid #D5DADD;border-top:3px solid #00a0d2;box-shadow:0 15px 45px 8px rgba(0,0,0,.04);margin:0!important;padding:0;z-index:-1;font-size:16px;overflow:visible;height:auto!important;max-height:calc(100vh - 66px);min-height:300px;display:-ms-flexbox!important;display:flex!important;-ms-flex-direction:column;flex-direction:column}.fl-theme-builder-preview-select-item{padding:4px 0!important;border-bottom:none!important;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;text-align:initial}.fl-theme-builder-preview-select-item:hover{text-decoration:none;color:#111;background:0 0!important}body .fl-theme-builder-preview-select .fa-caret-down{float:none}body .fl-theme-builder-preview-select-item-title{padding:10px 15px;color:#222;font-size:14px}body .fl-theme-builder-preview-select-item-children{overflow:auto}body .fl-theme-builder-preview-select-item-child{overflow:hidden;text-overflow:ellipsis;line-height:1.1;margin:0 10px;border:2px solid transparent;border-radius:4px;padding:8px 10px 10px;font-size:14px;font-weight:400;color:#222}body .fl-theme-builder-preview-select-item-child:hover{background:#e6eaed!important}.fl-theme-builder-preview-select-item .fa-caret-down{color:#606D77}.fl-builder-bar-actions{display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex:1 1 100%;flex:1 1 100%;padding:4px}.fl-builder-bar .fl-builder-button{margin:0 0 0 4px}.fl-builder-bar-actions .fl-builder-button:last-child{margin:0}.fl-builder-bar-actions:after{clear:both}.fl-builder-bar .fl-builder-content-panel-button{-ms-flex-align:baseline!important;align-items:baseline!important;padding-top:1px;font-weight:400}.fl-builder-content-panel-button svg{transition-property:transform;transition-duration:.25s;transform:rotate(0) scale(1);transform-origin:center}.fl-builder-content-panel-is-showing .fl-builder-content-panel-button svg{transform:rotate(135deg) scale(1.1) translate(.5px,-.5px)}.fl-builder--saving-indicator{cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-item-align:center;align-self:center;padding:0 10px;font-size:12px;font-style:italic;color:#676f7a;-ms-flex-align:center;align-items:center;line-height:1.2;min-width:180px;-ms-flex-pack:end;justify-content:flex-end}.fl-builder--saving-indicator:hover{color:#676f7a}.fl-builder--saving-indicator .fa-question-circle{font-size:13px;margin:3px 0 3px 5px}.fl-builder-buy-button,.fl-builder-feedback-button,.fl-builder-upgrade-button{background:#F7A407;color:#fff!important;text-decoration:none}.fl-builder-buy-button i.fa-external-link-alt,.fl-builder-feedback-button i.fa-external-link-alt,.fl-builder-upgrade-button i.fa-external-link-alt{color:#FFC733;margin:0 0 0 6px}.fl-builder-buy-button:hover,.fl-builder-feedback-button:hover,.fl-builder-upgrade-button:hover{background:#EE8E0D;color:#fff!important}@media (max-width:980px){.fl-builder--main-menu-panel{width:calc(100% - 20px)!important}.fl-builder--main-menu-panel:before{right:auto;left:20px}.fl-builder-bar-title,.fl-theme-builder-preview-select{-ms-flex:1 .5 380px!important;flex:1 .5 380px!important}}@media (max-width:620px){.fl-theme-builder-preview-select.fl-builder-button{display:none}}@media (max-width:500px){#fl-builder-toggle-notifications,.fl-builder--main-menu-panel:before,.fl-builder--panel-arrow,.fl-builder-bar-title-area,.fl-builder-panel-drag-handle,.fl-builder-panel:before{display:none}.fl-builder--main-menu-panel,.fl-builder-panel{width:auto!important;top:44px!important;left:0!important;right:0!important;bottom:0!important;border-radius:0!important;box-shadow:none!important}.fl-builder--main-menu-panel{border-left:transparent!important;border-right:transparent!important;border-bottom:transparent!important;max-height:calc(100% - 44px)!important}.fl-builder-bar-title{-ms-flex:0 0 80px!important;flex:0 0 80px!important}.fl-builder-bar-title-caret{padding-left:0;padding-right:0;max-width:24px}.fl-builder-bar-actions{max-width:calc(100% - 80px);overflow:hidden}.fl-builder--panel-header{border-radius:0!important;cursor:default!important}.fl-builder--panel-header .fl-builder--tabs{cursor:default!important}.fl-builder-publish-actions{width:100%!important;padding-left:4px!important}.fl-builder-bar-actions .fl-builder-button{padding:0 8px!important}}.fl-builder--preview-actions{display:none;position:fixed;top:4px;left:4px;z-index:10000001;padding:4px;-ms-flex-pack:center;justify-content:center;background:#fff;border-radius:4px}.fl-builder-preview .fl-builder--preview-actions{display:-ms-flexbox;display:flex}.fl-builder--preview-actions .device-icons{color:#555;background:#e4e4e4;border:none!important;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;text-decoration:none;font-size:14px!important;line-height:1!important;margin:0 4px 0 0;padding:0 6px;cursor:pointer;-webkit-border-radius:3px;-webkit-appearance:none;border-radius:3px}.fl-builder--preview-actions .device-icons i{margin:0 6px}@keyframes fl-builder-ui-pin-zone-pulse{0%,100%{opacity:1;filter:alpha( opacity=1 )}50%{opacity:.5;filter:alpha( opacity=35 )}}.fl-builder-ui-pin-zone{animation:fl-builder-ui-pin-zone-pulse 2s infinite;transition:width .3s ease;background:rgba(0,160,210,.5);bottom:0;top:0;position:fixed;width:35px;z-index:100001}.fl-builder-ui-show-pin-zone-left .fl-builder-ui-pin-zone-left,.fl-builder-ui-show-pin-zone-right .fl-builder-ui-pin-zone-right{width:75px}.fl-builder-ui-pin-zone-left{left:0}.fl-builder-ui-pin-zone-right{right:0}.fl-builder-content-panel-pin-zone .fl-builder-content-panel-button{display:-ms-flexbox!important;display:flex!important;background:rgba(0,160,210,.5)!important;padding:2px 4px;width:80px;animation:fl-builder-ui-pin-zone-pulse 2s infinite}.fl-builder-content-panel-pin-zone .fl-builder-content-panel-button svg{display:none}.fl-builder-content-panel-pin-zone-hover .fl-builder-content-panel-button{width:120px}.fl-builder-content-panel-pin-zone-hover .fl-builder-content-panel-button svg{display:none!important;width:100%;transform:none!important;fill:#00A0D2!important;border-radius:3px}.fl-builder-ui-is-pinned .fl-builder-content-panel-button,.fl-builder-ui-pinned-container .fl-lightbox-controls{display:none}.fl-builder-content-panel-pin-zone .fl-builder-done-button{-webkit-filter:grayscale(100%);filter:grayscale(100%)}.fl-builder-panel.fl-builder-ui-pinned{top:45px!important;bottom:0!important;height:auto!important;border-radius:0;border:none;box-shadow:none;animation-duration:0s;-moz-animation-duration:0s;-webkit-animation-duration:0s;-o-animation-duration:0s;z-index:11}.fl-builder-panel.fl-builder-ui-pinned-right{left:auto!important;right:0;border-left:1px solid #eceef1}.fl-builder-panel.fl-builder-ui-pinned-left{left:0;right:auto;border-right:1px solid #eceef1}.fl-builder-panel.fl-builder-ui-pinned .fl-builder--panel-header{border-radius:0!important}.fl-builder-ui-pinned-container .fl-lightbox-wrap{position:absolute;z-index:11}.fl-builder-ui-pinned-container .fl-lightbox{position:absolute;top:0;bottom:0;left:0;right:0;width:auto!important;height:auto;border-radius:0;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none;animation-duration:0s;-moz-animation-duration:0s;-webkit-animation-duration:0s;-o-animation-duration:0s}.fl-builder-ui-pinned-container .fl-lightbox-header-wrap{border-radius:0}.fl-builder-ui-pinned-container .fl-lightbox.ui-draggable .fl-lightbox-header{cursor:auto}.fl-builder-ui-pinned-container .fl-lightbox-header h1{padding:12px 20px 10px!important}.fl-builder-ui-pinned-content-transform{transform:scale(1);transform-origin:center top 0}.fl-builder-ui-pinned-collapse{cursor:pointer;display:none;position:absolute!important;bottom:2px;padding:5px;border:2px solid transparent;background:0 0;width:36px;height:36px;border-radius:4px;fill:#778794;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center}.fl-builder-ui-pinned-collapse:focus,.fl-builder-ui-pinned-collapse:hover{top:auto!important;background:0 0;border:2px solid transparent;outline:0;fill:#00A0D2}.fl-builder-ui-pinned-collapse:focus{background:#E4E7EA}.fl-builder-ui-pinned-collapse>*{margin:auto;line-height:1}.fl-builder-ui-pinned-collapse svg g{fill:inherit}.fl-builder-ui-is-pinned-right .fl-builder-ui-pinned-right-collapse{display:-ms-flexbox;display:flex;left:-40px}.fl-builder-ui-is-pinned-left .fl-builder-ui-pinned-left-collapse{display:-ms-flexbox;display:flex;right:-40px}.fl-builder-ui-pinned-collapse i[data-toggle=show],.fl-builder-ui-pinned-is-collapsed i[data-toggle=hide]{display:none}.fl-builder-ui-pinned-is-collapsed i[data-toggle=show]{display:block}.fl-builder--panel-no-settings,.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-builder--panel-content,.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-builder--panel-controls,.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-builder--tab-wrap,.fl-builder-ui-pinned-is-collapsed .fl-builder--panel-header{display:none}.fl-builder-ui-is-pinned-left [data-toggle=hide],.fl-builder-ui-is-pinned-right [data-toggle=show]{transform:rotateY(180deg)}.fl-builder-ui-pinned-is-collapsed .fl-lightbox{box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none}.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-builder--panel-header{background:0 0;border:none;z-index:10}.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-lightbox-wrap{top:0}.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-lightbox-header h1{padding:14px 28px 15px!important}.fl-builder-simple-pinned .fl-builder--panel-no-settings{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;position:absolute;top:0;left:0;right:0;bottom:0}@keyframes fl-builder-show-panel{from{transform:scale(.8)}to{transform:scale(1)}}.fl-builder--search-results-panel,.fl-builder-panel{box-sizing:border-box;position:fixed!important;right:20px;top:calc(43px + 10px);width:380px;bottom:20px;background:#F5F7F9;color:#676F7A;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;border-radius:4px;box-shadow:0 8px 40px 4px rgba(0,0,0,.3);z-index:10000007;will-change:transform;user-select:none}.fl-builder-panel{transform-origin:top right;animation-name:fl-builder-show-panel;animation-duration:.15s;animation-fill-mode:both;-ms-flex:1;flex:1;display:none}.fl-builder--search-results-panel{display:none;position:absolute;right:0;top:93px;left:0;bottom:0;width:auto!important;border:none;border-radius:0;box-shadow:none;min-height:100px;max-height:calc(100vh - 54px);overflow:auto;z-index:1}.fl-builder-content-panel-is-showing .fl-builder-panel,.fl-builder-search-results-panel-is-showing .fl-builder--search-results-panel{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.fl-builder-panel .fl-lightbox .fl-builder-panel-drag-handle,.fl-builder-ui-is-pinned .fl-builder--panel-arrow,.fl-lightbox-width-full .fl-builder-panel-drag-handle,body.fl-builder-draggable-is-dragging .fl-builder--panel-arrow{display:none}.fl-builder--search-results-panel .fl-builder--no-results{text-align:center;padding:50px 20px}.fl-builder--panel-arrow{position:absolute;top:-13px;right:10px}.fl-builder--panel-arrow polygon{fill:#00a0d2}.fl-builder--panel-header{border-top:3px solid #00a0d2;border-top-right-radius:4px;border-top-left-radius:4px}.fl-builder-ui-is-pinned .fl-builder--panel-header{border-top:none}.fl-builder-panel-drag-handle{position:absolute;top:7px;left:10px;fill:#ccd4da;width:6px}.fl-builder-ui-is-pinned-left .fl-builder-panel-drag-handle{left:auto;right:10px}.fl-builder--panel-header .fl-builder--panel-controls{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;position:relative}.fl-builder--panel-header .fl-builder--panel-controls .fl-builder-content-group-select{-ms-flex:1 1;flex:1 1}.fl-builder--panel-header .fl-builder--panel-controls .fl-builder-panel-search{-ms-flex:0 0;flex:0 0;padding:0 10px 6px 0;margin-left:-4px}.fl-builder--panel-controls .fl-builder-panel-search button{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:30px;background:0 0!important;border:2px solid transparent!important;font-size:inherit;height:36px;margin:0;padding:0}.fl-builder--panel-controls .fl-builder-panel-search button:active,.fl-builder--panel-controls .fl-builder-panel-search button:focus{top:0;outline:0}.fl-builder-panel-search button svg{height:auto;width:20px}.fl-builder-panel-search button.fl-builder-dismiss-panel-search svg{width:16px}.fl-builder-panel-search button svg .filled-shape{fill:#000}.fl-builder--panel-controls .fl-builder-panel-search button:active svg .filled-shape,.fl-builder--panel-controls .fl-builder-panel-search button:focus svg .filled-shape{fill:#00A0D2}.fl-builder-panel-search .fl-builder-panel-search-input{display:none;position:absolute;top:0;left:0;right:0;bottom:0;background:#f5f7f9}.fl-builder-panel-search.is-showing-input .fl-builder-panel-search-input{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;padding:0 10px 6px}.fl-builder-panel-search-input input{-ms-flex:1 1 100%;flex:1 1 100%;border:2px solid #e6eaed;background:#fff;border-radius:4px;margin:0 4px 0 0;padding:10px;color:#333}.fl-builder-panel-search-input input:focus{border-color:#0197C6;outline:0}.fl-builder-panel-content-wrap{bottom:0;height:auto;left:0;overflow:hidden;position:absolute;right:0;top:43px}.fl-builder-panel-content{padding-bottom:60px}.fl-builder--panel-view .fl-builder-blocks-section:first-child{border-top:none}.fl-builder-blocks-group:first-child{padding:20px 0 0}.fl-builder-blocks-group .fl-builder-blocks-section-group-name{display:block;padding:0 30px 15px;color:#000;font-size:20px;font-weight:600;line-height:1.4}.fl-builder-blocks-section .fl-builder-block{display:block;line-height:1.1;padding:15px 20px}.fl-builder--template-collection-section-header,.fl-builder-blocks-section .fl-builder-blocks-section-header{line-height:1.2;color:#333;margin:0!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#e7ebef;border-top:4px solid #e7ebef;height:30px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.fl-builder-blocks-section .fl-builder-blocks-section-title{background:#F5F7F9;color:#353535;padding:2px 16px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.fl-builder-blocks-section .fl-builder-blocks-section-title i{color:#bfbfbf;float:right}.fl-builder-blocks-section-content{overflow:auto;padding:10px 10px 20px}.fl-builder-blocks-section-content:before{content:none}.fl-builder-blocks-section-content:after{float:none;clear:both}.fl-builder-blocks-section-content.fl-builder-modules,.fl-builder-blocks-section-content.fl-builder-rows,.fl-builder-blocks-section-content.fl-builder-widgets{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}@supports (display:grid){.fl-builder--template-collection-section-content,.fl-builder-blocks-section-content.fl-builder-modules,.fl-builder-blocks-section-content.fl-builder-rows,.fl-builder-blocks-section-content.fl-builder-widgets{display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr))}.fl-builder--template-collection-section-content>*,.fl-builder-blocks-section-content.fl-builder-modules>*,.fl-builder-blocks-section-content.fl-builder-rows>*,.fl-builder-blocks-section-content.fl-builder-widgets>*{width:auto!important}}.fl-builder-blocks-section-content .fl-builder-block-module,.fl-builder-blocks-section-content .fl-builder-block-row{-ms-flex:1 1 50%;flex:1 1 50%;width:50%;box-sizing:border-box}.fl-builder--search-results-panel .fl-builder-blocks-section-content .fl-builder-block-module{-ms-flex:1 1 100%;flex:1 1 100%;width:100%}.fl-builder-blocks-section.fl-active .fl-builder-blocks-section-content{display:block}.fl-builder-blocks-section-content .fl-builder-block{box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:4px;font-size:13px;line-height:1.1;font-weight:400;color:#38404a}.fl-builder-block{position:relative;height:47px}.fl-builder-block.fl-builder-block-col-group{height:84px}.fl-builder-block.fl-builder-block-has-thumbnail{height:auto!important;padding:10px!important}.fl-builder-block.fl-builder-block-has-thumbnail:hover{padding:0!important}.fl-builder-block.fl-builder-block-has-thumbnail .fl-builder-block-content{position:relative!important}.fl-builder-block.fl-builder-block-has-thumbnail:hover .fl-builder-block-content{padding:10px!important}.fl-builder-block.fl-builder-block-has-thumbnail .fl-builder-block-details{margin:0 10px 4px!important}.fl-builder-block:hover{overflow:visible;z-index:1}.fl-builder-block:hover .fl-builder-block-content{display:block;box-sizing:border-box;position:absolute;top:0;left:0;width:100%;padding:15px 20px;border-radius:4px;background:#fff;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);text-decoration:none;color:#111;cursor:move;overflow:hidden}.fl-builder-blocks-node-template .fl-builder-block,.fl-builder-blocks-section-content .fl-builder-block .fl-builder-block-details{position:relative}.fl-builder-block-module:hover .fl-builder-block-content{width:auto;min-width:100%}.fl-builder-block .fl-builder-block-content .fl-builder-block-visual{display:block;margin-bottom:7px}.fl-builder-block-drag-helper .fl-builder-block-content .fl-builder-block-visual{display:none!important}.fl-builder-block .fl-builder-block-content .fl-builder-block-visual.fl-cols-visual{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;height:30px}.fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col{-ms-flex:1 100%;flex:1 100%;background:#464a4c;height:30px;margin:0 2px;border-radius:2px}.fl-builder-block:hover .fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col{background:#000}.fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col:first-child{margin-left:0!important}.fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col:last-child{margin-right:0!important}.fl-cols-visual.left-right-sidebar .fl-cols-visual-col:first-child,.fl-cols-visual.left-right-sidebar .fl-cols-visual-col:last-child,.fl-cols-visual.left-sidebar .fl-cols-visual-col:first-child,.fl-cols-visual.right-sidebar .fl-cols-visual-col:last-child{-ms-flex-preferred-size:60px;flex-basis:60px}.fl-builder-block-saved-column.fl-builder-block-global .fl-builder-block-title,.fl-builder-block-saved-column:hover .fl-builder-block-title,.fl-builder-block-saved-module.fl-builder-block-global .fl-builder-block-title,.fl-builder-block-saved-module:hover .fl-builder-block-title,.fl-builder-block-saved-row.fl-builder-block-global .fl-builder-block-title,.fl-builder-block-saved-row:hover .fl-builder-block-title{margin-right:70px}.fl-builder-block-module:nth-child(even):hover .fl-builder-block-content{left:auto;right:0}.fl-builder-block-thumbnail{border-radius:4px;background-size:contain;background-repeat:no-repeat;background-position:center;background-color:rgba(0,0,0,.06);margin-bottom:10px;transform-origin:bottom;transition-property:transform,box-shadow;transition-duration:.15s}.fl-builder-block:hover .fl-builder-block-thumbnail{transform:scale(1.05);box-shadow:0 20px 40px rgba(0,0,0,.08)}.fl-builder-block .fl-builder-block-icon{margin-right:7px;fill:#000;display:inline-block;width:20px;height:20px;vertical-align:middle}.fl-builder-block-thumbnail:before{content:"";display:block;padding-top:50%}.fl-builder-block-thumbnail img{max-width:100%;max-height:160px;margin:0;-o-object-fit:cover;object-fit:cover}.fl-builder-blocks-section-content .fl-builder-block{box-shadow:0 0 0 transparent;transition-property:box-shadow;transition-duration:.15s}.fl-builder-blocks-section-content .fl-builder-block i,.fl-user-template-actions i{color:#000;margin-right:10px}.fl-builder-blocks-separator{background:#f1f1f1;height:6px}.fl-builder-block:hover .fl-builder-badge{background:#2ea2cc}.ui-sortable-helper .fl-builder-badge{display:none!important}.fl-builder-modules-cta a{color:#999!important;display:block!important;font-size:12px!important;font-style:italic!important;padding:15px 20px!important;line-height:16px!important}.fl-builder-modules-cta a:hover{background:#e5e5e5!important;color:#666!important;text-decoration:none!important}.fl-builder-modules-cta a:focus{text-decoration:none!important}.fl-builder-modules-cta .fa{float:right!important;font-size:14px!important;margin:3px 0 0 9px!important}.fl-builder--panel-message{text-align:center;padding:40px 20px;font-size:16px}.fl-builder--panel-message .fl-builder-button{display:inline-block;padding:10px}.fl-builder--panel-cta{padding:20px 30px;font-size:16px;text-align:center}.fl-builder--panel-cta a{color:inherit;text-decoration:none}.fl-builder--panel-cta a:hover{text-decoration:none}.fl-builder-block-template-image{margin:5px 0 10px;max-width:100%;border:1px solid #dfdfdf}.fl-builder-block .fl-builder-block-title{overflow:hidden;text-overflow:ellipsis;vertical-align:middle;line-height:1.3}.ui-sortable-helper .fl-builder-block-template-image{display:none!important}@keyframes fl-builder-template-item-enter{from{transform:translateY(100px) scale(.3);opacity:0}to{transform:scale(1);opacity:1}}.fl-builder--template-collection{clear:both;padding:10px 0}.fl-builder--template-collection-section-content{padding:0 10px}.fl-builder--template-collection-item{box-sizing:border-box;width:50%;float:left;padding:10px;cursor:pointer;font-size:13px;transform-origin:center;opacity:1}.fl-builder--template-thumbnail{background-size:cover;background-clip:content-box;background-position:center top;background-color:#fff;border:2px solid transparent;transform-origin:bottom;transition-property:transform,box-shadow;transition-duration:.15s}.fl-builder--template-collection-item[data-id="0"] .fl-builder--template-thumbnail,.fl-user-template .fl-builder--template-thumbnail{border-color:#e4e7ea}.fl-builder--template-thumbnail:before{display:block;content:"";padding-top:120%}.fl-builder--template-thumbnail:hover{transform:scale(1.05);box-shadow:0 20px 40px rgba(0,0,0,.08)}.fl-builder--template-name{text-align:center;padding:4px 0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.fl-builder--template-collection-section{padding-bottom:10px;border-bottom:1px solid #dfdfdf}.fl-builder--template-collection-section:last-child{border-bottom:none}.fl-builder--template-collection-section:after,.fl-builder--template-collection-section:before{content:"";display:block;clear:both}.fl-builder--template-collection-section-name{padding:15px 10px 10px}span.fl-builder-block-no-node-templates{display:block;padding:15px 20px;text-align:center}span.fl-builder-block-no-node-templates:hover{cursor:default}.fl-builder-blocks-section-content .fl-builder-node-template-actions{bottom:0;cursor:default;display:none;position:absolute;right:0;top:0}.fl-builder-blocks-section-content .fl-builder-node-template-delete,.fl-builder-blocks-section-content .fl-builder-node-template-edit{display:inline;cursor:pointer;margin:0;padding:15px 10px;text-align:center;width:30px}.fl-builder-block-details .fl-builder-node-template-delete,.fl-builder-block-details .fl-builder-node-template-edit{padding-top:0!important}.fl-builder-blocks-section-content .fl-builder-node-template-delete i,.fl-builder-blocks-section-content .fl-builder-node-template-edit i{margin:0}.fl-builder-blocks-section-content .fl-builder-node-template-delete:hover i,.fl-builder-blocks-section-content .fl-builder-node-template-edit:hover i{color:#444}.fl-builder-blocks-node-template .fl-builder-block:hover .fl-builder-node-template-actions{display:block}.ui-sortable-helper .fl-builder-node-template-delete,.ui-sortable-helper .fl-builder-node-template-edit{display:none!important}.fl-builder--tabs{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;position:relative;-ms-flex-pack:start;justify-content:flex-start;-ms-flex-align:center;align-items:center}.fl-builder-panel .fl-builder--panel-header{cursor:move}.fl-builder-panel .fl-builder--tabs{-ms-flex-pack:distribute;justify-content:space-around;padding:4px 24px;cursor:pointer}.fl-builder--tab-wrap{-ms-flex:1 1 100%;flex:1 1 100%;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:justify;justify-content:space-between;margin:auto;max-width:400px}.fl-builder--tabs button,.fl-builder--tabs button:active,.fl-builder--tabs button:focus,.fl-builder--tabs button:hover{-ms-flex:1 1 100%;flex:1 1 100%;display:inline-block;text-decoration:none;text-transform:none;color:inherit;text-align:center;letter-spacing:normal!important;margin:0;padding:5px;cursor:pointer;font-size:13px!important;font-weight:500!important;line-height:1.3!important;background:0 0!important;outline:0!important;border:2px solid transparent;border-radius:4px;min-height:36px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important;top:0;transition-property:background,color;transition-duration:.25s}.fl-builder--tabs button:focus{background:#e6eaed!important}.fl-builder--tabs button.is-showing{color:#0086b0}.fl-builder--panel-content{-ms-flex:1;flex:1}.fl-builder--panel-view{display:none;overflow:hidden}.fl-builder--panel-view.is-showing{display:block}.fl-builder--content-library-panel.ui-draggable-dragging{height:500px!important}.fl-builder--content-library-panel .fl-builder-drop-zone{display:none!important}.fl-builder--panel-header .fl-builder--tabs{cursor:move}.fl-builder--category-select{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;position:relative}.fl-builder--selector-display{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;position:relative;-ms-flex-pack:justify;justify-content:space-between;color:#161B20;background:url(../img/svg/select-arrow-down-alt2.svg) center right 10px no-repeat #fff!important;cursor:pointer;font-size:13px;font-weight:700;line-height:16px;border-radius:4px;-ms-flex-align:stretch;align-items:stretch}.fl-builder--selector-display-label{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:stretch;align-items:stretch;font-size:inherit;line-height:inherit;width:100%;margin:0!important;padding:0!important;color:#6D6D6D;background:0 0;border:2px solid transparent;box-shadow:0 1px 2px 0 rgba(0,0,0,.12)!important;border-radius:4px;font-family:inherit;text-transform:none}.fl-builder--selector-display-label:hover{top:0;color:inherit;background:0 0;border:2px solid transparent;border-radius:4px}.fl-builder--selector-display-label:active{top:0;color:inherit;background:0 0;border:2px solid #e4e7ea;border-radius:4px}.fl-builder--selector-display-label:focus{top:0;color:inherit;background:0 0;border:2px solid #00A0D2;outline:0}.fl-builder--group-label{color:inherit;-ms-flex:0 0 0%;flex:0 0 0%;padding:4px 12px 4px 10px;background:#e7ebef;border-radius:3px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center}.fl-builder--current-view-name{-ms-flex:1 1 100%;flex:1 1 100%;color:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;padding:8px 10px;text-align:left}.fl-builder--selector-menu{display:none;color:#293138;position:absolute;top:46px;left:0;width:100%;background:#fff;border-radius:4px;box-shadow:0 0 20px 2px rgba(0,0,0,.2);overflow:visible;z-index:2}.fl-builder--selector-menu:before{bottom:100%;right:8px;content:" ";height:0;width:0;position:absolute;pointer-events:none;border:solid;border-color:rgba(255,255,255,0);border-bottom-color:#fff;border-width:10px;margin-left:-10px}.fl-builder--category-select.is-showing .fl-builder--selector-menu{display:-ms-flexbox;display:flex;max-height:calc(100vh - 150px)}.fl-builder--category-select.is-showing .fl-builder--selector-menu .fl-builder--menu{margin:10px 0;-ms-flex:1 100%;flex:1 100%;overflow:auto}button.fl-builder-button.fl-builder-bar-title-caret{margin:4px}button.fl-builder-button.fl-builder-bar-title-caret:focus{background-color:#e6eaed!important;border-color:transparent!important}.fl-builder--category-select.is-showing .fl-builder-bar-title-caret i{transform:rotate(180deg)}.fl-builder--menu{margin-bottom:2px}.fl-builder--menu>a,.fl-builder--menu>button,.fl-builder--menu>span{display:block;padding:8px 10px 10px;border-radius:4px;color:inherit;text-decoration:none;background:0 0!important;border:2px solid transparent!important;font-weight:400;font-family:inherit}.fl-builder--menu>a:active,.fl-builder--menu>a:focus,.fl-builder--menu>a:hover,.fl-builder--menu>button:active,.fl-builder--menu>button:focus,.fl-builder--menu>button:hover{background:#e6eaed!important;border:2px solid transparent!important;top:0}.fl-builder-block-drag-helper,.fl-builder-block.ui-draggable-dragging,.fl-builder-drop-zone,.fl-builder-empty{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}.fl-builder--menu>a:focus,.fl-builder--menu>button:focus{outline:0;color:inherit;text-decoration:none}.fl-builder--menu .fl-has-children>svg{float:right;margin:0 7px 0 0;height:16px;width:9px;transition-property:transform;transition-duration:.15s;transform:rotate(-90deg)}.fl-builder--menu .fl-has-children.fl-has-children-showing>svg{transform:rotate(0)}.fl-builder--menu .fl-inset{display:none;padding-left:35px;font-size:14px;line-height:1.25}.fl-builder--menu a.fl-template-collection{color:#161B20}.fl-builder--menu>:after{clear:both}.fl-builder--menu * .fl-builder--menu-item-accessory{float:right;color:#000;text-transform:uppercase;text-align:center;min-width:20px;letter-spacing:2px}.fl-builder--menu * .fl-builder--menu-item-accessory i{font-size:1em;margin-top:2px}.fl-builder--menu .fl-builder-video-wrap iframe{display:block;margin:4px 0;width:100%}.fl-builder-publish-actions{display:-ms-flexbox;display:flex;box-sizing:border-box;position:absolute;top:0;right:0;width:380px;max-width:100%;height:44px;padding:4px 4px 4px 0;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:end;justify-content:flex-end;opacity:1;pointer-events:auto;transform:scaleX(1) translateX(0);transform-origin:right;transition-property:transform,opacity;transition-duration:.15s}.fl-builder-publish-actions.is-hidden{transform:scaleX(.23) translateX(68px);opacity:0;pointer-events:none}.fl-builder-bar .fl-builder-button-group{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%}.fl-builder-bar .fl-builder-button-group>.fl-builder-button{border-radius:0;margin-left:0;-ms-flex-preferred-size:100%;flex-basis:100%;text-align:center;-ms-flex-pack:distribute;justify-content:space-around;box-shadow:none}.fl-builder-bar .fl-builder-button-group>.fl-builder-button:first-child{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.fl-builder-bar .fl-builder-button-group>.fl-builder-button:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.fl-builder-publish-actions-click-away-mask{display:none;position:fixed;top:0;left:0;right:0;height:100vh;background:0 0}.fl-builder-dragging .fl-builder-content:not(.fl-builder-empty){padding:16px 0}.fl-builder-empty{display:none;border:2px dashed #969696;border-radius:8px;color:#909090;font-size:20px;font-weight:700;margin:10px;padding:250px 20px;position:relative;text-align:center;text-transform:uppercase}.fl-builder-drop-zone,.fl-builder-has-submenu>ul.fl-builder-submenu li a{font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fl-builder-edit .fl-builder-empty{display:block}.fl-builder-block-drag-helper,.fl-builder-block.ui-draggable-dragging{background:rgba(255,255,255,.95)!important;border:2px solid #000;border-radius:4px;box-shadow:0 0 8px rgba(0,0,0,.2);-moz-box-shadow:0 0 8px rgba(0,0,0,.2);-webkit-box-shadow:0 0 8px rgba(0,0,0,.2);color:#333!important;font-size:13px!important;height:47px!important;line-height:40px!important;overflow:hidden;padding:0 20px;position:fixed!important;text-overflow:ellipsis;white-space:nowrap;width:180px!important;z-index:100010!important;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-line-pack:center;align-content:center;-ms-flex-pack:start;justify-content:flex-start}.fl-builder-block.fl-builder-block-drag-helper:hover{padding:0;box-shadow:none}.fl-builder-block-drag-helper:hover .fl-builder-block-content{position:static;padding:0 20px}.fl-col-has-highlight-guide .fl-col-content,.fl-col-highlight,.fl-row-highlight .fl-col-group{position:relative}.fl-builder-block-saved-column.fl-builder-block-drag-helper:hover .fl-builder-block-content,.fl-builder-block-saved-module.fl-builder-block-drag-helper:hover .fl-builder-block-content,.fl-builder-block-saved-row.fl-builder-block-drag-helper:hover .fl-builder-block-content{padding:14px 20px}.fl-builder-block-drag-helper .fl-builder-block-icon{fill:#000;margin-top:-10px}.fl-builder-drop-zone{animation:fl-builder-drop-zone-pulse 2s infinite;background:#00A2D7;border-radius:4px;color:#fff!important;display:block;font-size:12px;letter-spacing:1px;line-height:14px;margin:10px;padding:6px 8px 5px;position:relative;text-align:left;text-shadow:none;text-transform:none;z-index:10}@keyframes fl-builder-drop-zone-pulse{0%,100%{background-color:#00A2D7}50%{background-color:#79DEFF}}.fl-builder-drop-zone-global{animation:fl-builder-drop-zone-global-pulse 2s infinite;background:#ff9600}@keyframes fl-builder-drop-zone-global-pulse{0%,100%{background-color:#FFBC5C}50%{background-color:#ff9600}}.fl-builder-content>.fl-builder-drop-zone{margin:10px 20px}.fl-row-content>.fl-builder-drop-zone{margin:3px 7px}.fl-col-has-cols>.fl-col-content>.fl-builder-drop-zone{margin:3px 10px}.fl-sortable-disabled>.fl-builder-drop-zone{display:none!important}.fl-col-group-equal-height.fl-col-group-align-center .fl-col-content>.fl-builder-drop-zone{width:100%}.fl-row-highlight{padding:16px 0}.fl-row-highlight .fl-row-content{border:2px dashed rgba(203,205,206,.5);padding:8px;border-radius:6px}.fl-row-highlight.fl-node-global .fl-row-content{border-color:#ff9600}.fl-col-highlight{padding:8px}.fl-col-highlight .fl-col-content{border-style:dashed!important;border-color:#00a0d2!important;border-radius:4px;min-height:100px;overflow-x:hidden;border-width:2px!important}.fl-col-has-cols.fl-col-highlight>.fl-col-content{padding:8px}.fl-col-highlight.fl-node-global .fl-col-content{border-color:#ff9600!important}.fl-builder-simple .fl-col-highlight .fl-col-content{border:none!important}.fl-col-highlight-guide{background:rgba(0,160,210,.05);border:2px solid #00A0D2;border-radius:4px;bottom:4px;left:4px;position:absolute;right:4px;top:4px;z-index:1}.fl-node-global .fl-col-highlight-guide{border-color:#ff9600!important;background-color:rgba(255,150,0,.06)!important}.fl-col-has-highlight-guide .fl-block-overlay{background:0 0;border-color:transparent}.fl-col-has-highlight-guide .fl-block-col-resize{display:none}.fl-col-has-highlight-guide .fl-col-highlight .fl-col-content{border-color:transparent!important}.fl-col-drop-target{bottom:8px;display:none;left:-9px;position:absolute;top:8px;width:18px;z-index:1}.fl-col-highlight .fl-col-drop-target{display:block}.fl-col-drop-target-last{left:auto;right:-9px}.fl-col-drop-target .fl-builder-drop-zone{bottom:0;left:2px;margin:0;padding:0;position:absolute;right:2px;top:0}.fl-col-group-drop-target{display:none;left:8px;height:18px;position:absolute;right:8px;top:-9px;z-index:1}.fl-row-highlight .fl-col-group-drop-target{display:block}.fl-col-group-drop-target-last{top:auto;bottom:-9px}.fl-col-group-drop-target .fl-builder-drop-zone{bottom:2px;left:0;margin:0;padding:0;position:absolute;right:0;top:2px}.fl-row-content>.fl-col-group-drop-target{position:static}.fl-row-content>.fl-col-group-drop-target .fl-builder-drop-zone{height:18px;position:static}.fl-row-drop-target{display:none;left:0;height:24px;margin-top:-28px;position:absolute;right:0;z-index:1}.fl-row-highlight .fl-row-drop-target{display:block}.fl-row-drop-target-last{margin-top:4px}.fl-row .fl-row-drop-target .fl-builder-drop-zone{bottom:0;left:4px;margin:0;position:absolute;right:4px;top:0}.fl-builder-content>.fl-row-drop-target{margin:0;position:static}.fl-builder-dragging .fl-builder-content.fl-builder-empty>.fl-row-drop-target{bottom:10px;display:block;height:auto;left:0;position:absolute;right:0;top:10px}.fl-builder-content .fl-row-drop-target .fl-builder-drop-zone{margin-bottom:0;margin-top:0}.fl-col-group:focus,.fl-col:focus,.fl-module:focus,.fl-row:focus{outline:0}.fl-sortable-proxy{display:none}.fl-block-overlay,.fl-block-overlay *{text-shadow:none;-webkit-touch-callout:none;transition-property:border-color;transition-duration:.3s}.fl-block-overlay-active{position:relative}.fl-block-overlay-actions{background:#00A0D2;float:left;height:30px;margin:-1px -1px 0;padding:0 4px;text-shadow:none;border-bottom-right-radius:5px;border-top-left-radius:3px;transition-property:background-color;transition-duration:.3s}.fl-row-overlay-header-bottom .fl-block-overlay-actions{border-radius:0 5px 0 3px}.fl-builder-col-resizing .fl-block-overlay-actions,.fl-builder-row-resizing .fl-block-overlay-actions{overflow:hidden}.fl-block-overlay-actions>span{display:block;float:left}.fl-block-overlay-actions i{color:#fff!important;cursor:pointer;display:block!important;float:left;font-size:16px!important;height:28px!important;line-height:28px!important;opacity:.8;filter:alpha(opacity=80);text-align:center;width:32px!important}.fl-block-overlay-actions i:hover{opacity:1;filter:alpha(opacity=100)}.fl-block-overlay-actions>i:first-child{padding-left:4px}.fl-block-overlay-actions>i:last-child{padding-right:2px}.fl-block-overlay-actions .fl-block-move{cursor:move}.fl-block-has-rules{color:#00A0D2!important;cursor:pointer;padding:7px;position:absolute;right:0;top:0}.fl-block-overlay-title,.fl-builder-has-submenu>ul.fl-builder-submenu li a{color:#fff!important;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}.fl-block-overlay-title{float:left;font-size:14px;height:30px;line-height:29px;margin-right:2px;padding:0 12px 0 8px}.fl-col-overlay,.fl-module-overlay,.fl-row-overlay{background:rgba(190,239,255,0);color:#fff}.fl-row-overlay{border:2px solid #00A0D2;border-radius:4px;bottom:0;box-sizing:border-box!important;-moz-box-sizing:border-box!important;-webkit-box-sizing:border-box!important;left:0;position:absolute;top:-33px;right:0;z-index:100006}.fl-row-overlay.fl-row-menu-active,.fl-row-overlay.fl-row-menu-active.fl-block-overlay.fl-block-overlay-global{z-index:100007}.fl-row-full-width .fl-row-overlay{left:2px;right:2px;bottom:2px}.fl-row-overlay-header-bottom{bottom:-32px!important;top:0}.fl-row-overlay-header-bottom .fl-block-overlay-header{position:absolute;bottom:0}.fl-block-overlay-active .fl-row-content-wrap{position:relative}.fl-block-overlay-active .fl-row-content{position:relative;z-index:100007!important}.fl-builder-row-resizing .fl-col.fl-block-overlay-active,.fl-builder-row-resizing .fl-module.fl-block-overlay-active{position:static}.fl-col-overlay{border:2px solid #00A0D2;border-radius:4px;bottom:8px;cursor:pointer;left:8px;position:absolute;right:8px;top:8px;z-index:100008}.fl-module-overlay{border:2px solid #00A0D2;border-radius:4px;bottom:4px;cursor:pointer;left:4px;min-height:32px;position:absolute;right:4px;top:4px;z-index:100007}.fl-builder-global-templates-locked .fl-block-overlay-global.fl-module-overlay{cursor:default}.fl-module-adjust-height{padding-bottom:15px;padding-top:15px}.fl-col-bg-overlay .fl-block-overlay-active.fl-module{z-index:100008}.fl-block-overlay-global{background:rgba(255,150,0,0);border:2px solid #F7A407;border-radius:4px}.fl-block-overlay-global .fl-block-overlay-actions{background:#F7A407}.fl-block-overlay-title-global{background:#fff;color:#ff9600!important;font-size:11px;letter-spacing:1px;margin-left:4px;padding:2px 4px;vertical-align:top}.fl-block-overlay-global.fl-row-overlay{background:rgba(255,150,0,0);cursor:pointer;z-index:100007}.fl-builder-global-templates-locked .fl-block-overlay-global.fl-row-overlay{cursor:default}.fl-builder-row-template .fl-block-overlay-global.fl-row-overlay{background:rgba(255,150,0,0);cursor:default;z-index:100006}.fl-block-overlay-global.fl-row-overlay .fl-block-col-resize{display:none}.fl-block-overlay-muted .fl-row-overlay{background:rgba(85,93,102,0);border:2px solid #555D66}.fl-block-overlay-muted .fl-row-overlay .fl-block-overlay-actions{background:#555D66}.fl-block-overlay-muted .fl-row-overlay .fl-block-has-rules{color:#555D66!important}.fl-block-overlay-muted .fl-row-overlay .fl-block-col-resize{display:none}.fl-node-disabled .fl-row-content-wrap,.fl-node-disabled>.fl-col-content{opacity:.3}.fl-block-col-resize{bottom:0!important;position:absolute;top:0!important;width:6px}.fl-block-col-resize-e{cursor:ew-resize;left:auto!important;right:-2px!important}.fl-block-col-resize-w{cursor:ew-resize;left:-7px!important}.fl-block-col-resize-handle-wrap{margin:-4px 0 0 -5px;padding:0 5px;position:absolute;top:50%!important}.fl-block-col-resize-e .fl-block-col-resize-handle-wrap{margin-left:-6px}.fl-block-col-resize-handle{background:#fff;border:2px solid #00A0D2;border-radius:50%;height:12px;width:12px}.fl-node-global .fl-block-col-resize-handle{border-color:#ff9600}.fl-block-col-resize-feedback{color:#333!important;display:none;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:11px!important;position:absolute}.fl-block-col-resize-feedback-left,.fl-block-col-resize-feedback-right{background:#fff;border:1px solid #3ba0ff;padding:2px 4px}.fl-block-col-resize-feedback-left{right:20px;top:-7px}.fl-block-col-resize-feedback-right{left:20px;top:-7px}.fl-builder-has-submenu{position:relative}.fl-builder-has-submenu>ul.fl-builder-submenu{background:#00A0D2;box-shadow:0 0 20px rgba(0,0,0,.2);border-radius:0 4px 4px;display:none;left:0;list-style:none;margin:0;padding:6px 0;position:absolute;text-align:left;top:100%;width:165px;z-index:100008}.fl-builder-has-submenu>ul.fl-builder-submenu li{list-style:none;margin:0;padding:0}.fl-builder-submenu-right ul.fl-builder-submenu{left:auto;right:0}.fl-builder-has-submenu.fl-builder-submenu-open>ul.fl-builder-submenu{display:block}.fl-builder-has-submenu>ul.fl-builder-submenu li a{border-bottom:0 none;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none;display:block;line-height:13px;font-size:13px;opacity:.8;filter:alpha(opacity=80);padding:6px 12px;text-decoration:none}.fl-builder-has-submenu>ul.fl-builder-submenu li a:hover{background:#0197C6;color:#fff;opacity:1;filter:alpha(opacity=100);text-decoration:none}.fl-builder-actions-title,.fl-builder-alert-lightbox .fl-lightbox-message{color:#333!important;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px!important}.fl-builder-has-submenu .fl-builder-submenu .fa,.fl-builder-has-submenu .fl-builder-submenu .far,.fl-builder-has-submenu .fl-builder-submenu .fas{float:right;height:12px!important;line-height:12px!important;position:relative;right:-5px;width:14px!important}.fl-builder-has-submenu .fl-builder-has-submenu .fl-builder-submenu{display:none;left:100%;top:0}.fl-builder-has-submenu .fl-builder-submenu-right.fl-builder-has-submenu .fl-builder-submenu{left:auto;right:100%}.fl-builder-has-submenu .fl-builder-has-submenu:hover .fl-builder-submenu{display:block}.fl-builder-submenu-sep{padding:7px 0!important}.fl-builder-submenu-sep div{border-bottom:1px solid rgba(255,255,255,.4)}.fl-block-col-move,.fl-block-col-move-parent{cursor:move;position:relative}.fl-builder-submenu .fa-arrows-alt{cursor:move;display:none!important}.fl-builder-submenu a:hover .fa-arrows-alt{display:block!important;float:right;line-height:12px!important;height:12px!important}.fl-block-overlay-global ul.fl-builder-submenu{background:#ff9600!important}.fl-block-overlay-global ul.fl-builder-submenu li a:hover{background:#fa3}.fl-builder-actions-lightbox .fl-lightbox{display:block;width:300px;border-radius:4px}.fl-builder-actions-lightbox .fl-lightbox-content-wrap{display:block}.fl-builder-actions-lightbox .fl-builder-actions{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:25px;text-align:center}.fl-builder-actions-title{display:block;margin-bottom:20px}.fl-builder-actions .fl-builder-button{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:7px;min-height:36px}.fl-builder-alert-lightbox{padding:20px;z-index:30000000;top:0;pointer-events:auto}.fl-builder-alert-lightbox .fl-lightbox{max-width:440px;width:auto}.fl-lightbox-width-slim .fl-compound-field,.fl-lightbox-width-slim .fl-dimension-field-units{max-width:none}.fl-builder-alert-lightbox .fl-lightbox-content-wrap{display:block}.fl-builder-alert-lightbox .fl-lightbox-message{line-height:24px;padding:30px}@keyframes fl-builder-content-section-entry{from{transform:translateY(150px) translateX(100px) scale(.3);opacity:0}to{transform:translateY(0) translateX(0) scale(1);opacity:1}}.fl-template-category-select{width:180px!important}.fl-template-selector .fl-builder-settings-section{margin:0 0 10px}.fl-template-selector .fl-builder-settings-fields{height:470px}.fl-template-selector .fl-builder-settings-tab{width:560px}.fl-template-selector .fl-builder-settings-tab-description{font-size:15px!important;margin:0!important;padding:10px 0 25px;text-align:center}.fl-template-preview{float:left;margin:0 25px 30px 0;position:relative;text-align:center;width:170px}.fl-template-preview.fl-last{margin-right:0}.fl-template-image{border:1px solid #d9d9d9;cursor:pointer;margin-bottom:12px;height:164px;overflow:hidden}.fl-template-image:hover{border-color:red}.fl-template-image img{max-height:none;width:100%}.fl-template-preview span{display:block;text-align:center}.fl-user-template-category-name{background:#f2f2f2;border-bottom:3px solid #dfdfdf;border-top:2px solid #dfdfdf;font-weight:700;padding:8px 15px}.fl-user-templates{border-bottom:1px solid #dfdfdf;padding:10px 0 20px}.fl-builder--user-templates-section-content{border-bottom:2px solid #e6eaed;padding:10px}.fl-builder--user-templates-section-content:first-child{padding-top:0}.fl-builder--user-templates-section-content:last-child,.fl-user-templates:last-child{border-bottom:none}.fl-builder--user-templates-section-name{font-weight:700;font-size:16px;color:#333;z-index:9999;padding:15px 10px;margin:0 10px}@keyframes fl-list-item-entry{from{opacity:0;transform:scale(.5) translateY(100px)}to{opacity:1;transform:scale(1) translateY(0)}}.fl-builder--save-new-user-template,.fl-user-template{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:4px;font-size:16px;font-weight:200;line-height:1.1;padding:10px 20px;color:#6d6d6d}.fl-user-template:hover{cursor:pointer;background:#fff;box-shadow:0 6px 20px rgba(0,0,0,.08);text-decoration:none;color:#111;padding-right:68px}.fl-user-template-name{overflow:hidden;text-overflow:ellipsis;-ms-flex:1;flex:1}.fl-user-template-actions{display:none;bottom:0;position:absolute;right:0;top:0}.fl-user-template:hover .fl-user-template-actions{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center}.fl-user-template-actions a{display:inline-block;padding:15px 0;width:30px}.fl-user-template:hover a:hover i{color:#444!important}.fl-user-templates-message{display:none}.fl-user-template-thumbnail{-ms-flex:0;flex:0;margin-right:20px}.fl-user-template-thumbnail .fl-builder--template-thumbnail{background-size:cover;background-position:center top;width:45px}.fl-user-template-thumbnail .fl-builder--template-thumbnail:hover{box-shadow:none;transform:scale(1);transition-property:none}.fl-builder--save-new-user-template .fl-user-template-thumbnail .fl-builder--template-thumbnail{border-style:dashed;border-width:2px;border-color:#ccd4da}.fl-builder--save-new-user-template .fl-save-control{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex:1;flex:1}.fl-builder--save-new-user-template .fl-save-control input{background:0 0;border:none!important;-ms-flex:1;flex:1;font-size:16px;margin-right:10px;margin-left:-12px;color:#000}.fl-builder--save-new-user-template .fl-save-control input::-webkit-input-placeholder{color:#777}.fl-builder--save-new-user-template .fl-save-control input::-moz-placeholder{color:#777}.fl-builder--save-new-user-template .fl-save-control input:-ms-input-placeholder{color:#777}.fl-builder--save-new-user-template .fl-save-control input:-moz-placeholder{color:#777}@keyframes fl-slide-in-right{from{transform:translateX(50px)}to{transform:translateX(0)}}.fl-builder--save-new-user-template .fl-save-control button{display:none;animation-name:fl-slide-in-right;animation-duration:.25s;background-color:#00a0d2;border:none;padding:0 15px}.fl-save-control-mask{display:none;background:0 0;position:absolute;top:-50px;left:0;bottom:0;right:0;z-index:-1;min-height:80vh}.fl-builder-templates-cta{margin-bottom:20px}.fl-builder-templates-cta p{display:inline-block!important;width:75%!important;font-size:14px!important;line-height:1.5!important;margin-bottom:0!important}.fl-builder-templates-cta .fl-builder-upgrade-button{font-size:13px!important;line-height:13px!important;position:relative;top:8px;left:15px;padding:1px 12px}.fl-builder-settings-message,.fl-builder-settings-message *{font-size:15px!important;line-height:23px!important}.single-fl-builder-template .fl-content{width:100%!important}form.fl-builder-settings{height:100%;margin:0;padding:0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.fl-builder-settings-message{padding:20px 25px!important;background:#f2f2f2!important}.fl-builder-preview-loader{position:relative;top:-2px;margin-left:3px}.fl-lightbox-header .fl-builder-preview-loader{margin:0;position:absolute;right:40px;top:15px}@keyframes fl-grab-attention{0%,100%{transform:scale(1)}50%{transform:scale(1.05)}}.fl-lightbox-width-slim .fl-form-table{margin:10px 12px 10px 10px!important;width:calc(100% - 40px)}.fl-lightbox-width-slim .fl-form-table th{display:block;position:relative;padding:10px 0 0 12px!important;width:auto!important}.fl-lightbox-width-slim .fl-form-table td{display:block}.fl-lightbox-width-slim .fl-form-table .fl-field[data-type=editor] td:first-child,.fl-lightbox-width-slim .fl-form-table td:first-child{padding-left:0!important}.fl-field-label .fl-field-responsive-toggle,.fl-lightbox-width-slim .fl-field-control-wrapper .fl-field-responsive-toggle{display:none}.fl-lightbox-width-slim .fl-field-label .fl-field-responsive-toggle{display:inline-block;padding:0 5px!important}.fl-lightbox-width-slim input.text-full+.fl-field-description,.fl-lightbox-width-slim select+.fl-field-description{display:block;padding:8px 10px;margin:0}.fl-lightbox-width-slim .fl-builder-settings-fields select{width:100%}.fl-lightbox-width-slim .fl-color-picker{display:-ms-flexbox;display:flex;width:auto}.fl-lightbox-width-slim .fl-color-picker-clear{-ms-flex:0 0 40px;flex:0 0 40px}.fl-lightbox-width-slim .fl-field[data-type=dimension] .fl-field-responsive-setting{width:100%}.fl-lightbox-width-slim .fl-dimension-field-unit-select select{width:auto!important}.fl-lightbox-width-slim .fl-gradient-picker-color-row{width:50%}.fl-lightbox-width-slim .fl-color-picker.fl-gradient-picker-color,.fl-lightbox-width-slim .fl-typography-field-align .fl-button-group-field-option{width:100%}.fl-lightbox-width-slim .fl-typography-field-align .fl-button-group-field-options{float:none}.fl-lightbox-width-slim .mce-menubtn.mce-fixed-width button{width:72px!important}.fl-lightbox-width-slim .fl-builder-settings-tab-description{margin:20px 10px}.fl-lightbox-width-micro .mce-menubtn.mce-fixed-width button{width:38px!important}.fl-lightbox-width-micro .mce-btn[aria-label=Fullscreen],.fl-lightbox-width-micro .mce-btn[aria-label=Blockquote]{display:none}.fl-lightbox-width-micro .mce-toolbar i.mce-ico{width:18px}.fl-lightbox-width-slim .fl-field[data-type=editor] .fl-field-control-wrapper,.fl-lightbox-width-slim .fl-field[data-type=code] .fl-field-control-wrapper{margin-left:-10px;margin-right:-30px}.fl-lightbox .wp-editor-tools{padding-left:6px;padding-right:28px}.fl-lightbox .mce-top-part::before{box-shadow:none!important}.fl-lightbox div.mce-toolbar-grp{background:0 0;border:none}.fl-lightbox div.mce-toolbar-grp>div{padding:0 3px}.fl-lightbox .fl-builder-settings .wp-switch-editor{background:#e7ebef;border:1px solid transparent}.fl-lightbox .html-active .switch-html,.fl-lightbox .quicktags-toolbar,.fl-lightbox .tmce-active .switch-tmce{background:#fff}.fl-lightbox .quicktags-toolbar,.fl-lightbox .wp-editor-container{border:none}.fl-lightbox .mce-toolbar .mce-container-body{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.fl-lightbox-width-slim .mce-toolbar .mce-container-body{-ms-flex-pack:center;justify-content:center}.fl-lightbox textarea.wp-editor-area{line-height:1.5;padding:20px;width:calc(100% - 10px)}.fl-lightbox .wp-core-ui .button,.fl-lightbox .wp-core-ui .button-secondary{border:none;box-shadow:none;background:#e7ebef}.fl-lightbox-width-slim .fl-shadow-field .fl-dimension-field-units{width:auto}.fl-lightbox-width-slim .fl-shadow-field .fl-dimension-field-units input{max-width:none;width:100%!important}.fl-lightbox-width-slim .fl-builder-field-multiple{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;position:relative}.fl-lightbox-width-slim .fl-builder-field-multiple .fl-field-control,.fl-lightbox-width-slim .fl-builder-field-multiple .fl-field-label{width:100%!important}.fl-lightbox-width-slim .fl-builder-field-multiple .fl-form-field-preview-text{max-width:225px}.fl-lightbox-width-slim .fl-builder-field-multiple .fl-builder-field-actions{position:absolute!important;top:0;right:0;width:70px;z-index:1}.fl-lightbox-width-slim .fl-builder-field-actions-single .fl-builder-field-copy{float:right!important;margin-right:5px}.fl-lightbox-width-slim .fl-field[data-type=time] select{width:auto}.fl-builder-settings-tabs{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:stretch;align-items:stretch;overflow:hidden;height:32px;background:#e7ebef}.fl-builder-content-group-select{padding:0 10px 6px;display:none}.fl-builder-content-group-select select{display:block;width:100%;-webkit-appearance:none;-moz-appearance:none;box-sizing:border-box;padding:8px 10px;background:url(../img/svg/select-arrow-down-alt2.svg) center right 10px no-repeat #fff!important;border:2px solid #e4e7ea;color:#161B20}select:focus{border-width:2px!important;border-style:solid!important;border-color:#00a0d2!important;outline:0!important}.fl-legacy-settings-tab{background:url(../img/ajax-loader.svg) center center no-repeat;height:100px}.fl-builder-settings-tab:first-child .fl-legacy-settings-tab{background:0 0;height:auto}body .fl-builder-settings-tabs>*{box-sizing:border-box;color:#676F7A!important;fill:#676F7A!important;background:0 0;border:2px solid transparent;border-radius:0;margin:0;outline:0;padding:1px 16px;text-decoration:none!important;font-size:13px;font-weight:400!important;-ms-flex:0 0 auto;flex:0 0 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}body .fl-lightbox-width-slim .fl-builder-settings-tabs>*{-ms-flex:1 1 auto;flex:1 1 auto}body .fl-builder-settings-tabs>.fl-builder-settings-tabs-more{-ms-flex:0 0 60px;flex:0 0 60px;display:none;margin-left:auto;-ms-flex-pack:center;justify-content:center}.fl-builder-settings-tabs-more svg{width:16px;height:auto;margin:auto}.fl-builder-settings-tabs-more g,.fl-builder-settings-tabs-more path,.fl-builder-settings-tabs-more svg{fill:inherit}body .fl-lightbox-has-tab-overflow .fl-builder-settings-tabs-more{display:-ms-flexbox;display:flex}.fl-builder-settings-tabs>:active,.fl-builder-settings-tabs>:hover{top:0;color:#333;background:0 0;border:2px solid transparent}.fl-builder-settings-tabs>:focus{top:0;outline:0;border:2px solid transparent;background:0 0;color:#0086b0;fill:#0086b0}.fl-builder-settings-tabs .fl-active,.fl-builder-settings-tabs-more.fl-contains-active,.fl-builder-settings-tabs-overflow-menu .fl-active{color:#0086b0!important;fill:#0086b0!important;position:relative;background:#fff}.fl-builder-settings-tabs .fl-active.fl-overflowed,.fl-builder-settings-tabs .fl-overflowed{display:none!important}.fl-builder-settings-tabs .error{color:#d03436;padding-right:10px}.fl-builder-settings-tabs .error .fl-error-icon,.fl-builder-settings-tabs-overflow-menu .error .fl-error-icon{background:url(../img/sprite.png) -148px -5px no-repeat;display:inline-block;height:16px;margin-left:7px;position:relative;top:3px;width:16px}.fl-builder-settings-tabs-more.fl-contains-errors{fill:#d03436!important}.fl-builder-settings-tab{display:none;width:auto!important}.fl-builder-settings-tab.fl-active{display:block}.fl-builder-settings-tab-description{background:#e4e7ea;padding:10px 15px;border-radius:4px;margin:20px}.fl-builder-settings-tab-description a{text-decoration:underline!important}.fl-builder-settings-tab-description a:hover{color:#333}.fl-builder-settings-tabs-overflow-menu{display:none;position:absolute;left:0;right:0;border:2px solid #e6eaed;border-top:3px solid #00a0d2;border-radius:4px;background:#fff;z-index:9999;margin:0 6px;padding:10px;-ms-flex-direction:column;flex-direction:column;box-shadow:0 0 20px 2px rgba(0,0,0,.2)}.fl-builder-settings-tabs-overflow-menu:before{bottom:100%;right:20px;content:" ";height:0;width:0;position:absolute;pointer-events:none;border:solid;border-color:rgba(255,255,255,0);border-bottom-color:#00a0d2;border-width:10px;margin-left:-10px}.fl-builder-settings-tabs-overflow-menu>a{display:block;padding:10px 15px;font-size:14px;font-weight:600!important;border:2px solid transparent;border-radius:4px;outline:0}.fl-builder-settings-tabs-overflow-menu>a:hover{background:#e6eaed;text-decoration:none}.fl-builder-settings-tabs-overflow-click-mask{display:none;position:fixed;top:0;bottom:0;left:0;right:0;background:0 0;z-index:11}.fl-form-table{background:none;border:none;width:calc(100% - 35px)}.fl-form-table tbody{border:none}.fl-form-table tr,.fl-form-table tr:nth-child(even){background:0 0}.fl-form-table td,.fl-form-table th{background:0 0!important;border:none!important;font-weight:400!important;text-align:left!important}.fl-form-table th{padding:10px 15px 10px 30px!important;vertical-align:top!important;width:200px!important}.fl-form-table td:first-child{padding-left:30px!important}.fl-form-table th label{color:#333;width:auto;max-width:100%}.fl-form-table th label i{color:grey}.fl-form-table th label i:hover{color:#555}.fl-form-table td{padding:8px 10px}.fl-lightbox-width-slim .fl-form-table td{padding:4px 0 5px}.fl-builder-settings-fields{margin:0;overflow:hidden;position:relative;-ms-flex:1 100%;flex:1 100%;visibility:hidden}.fl-lightbox-header .fl-builder-settings-fields{height:auto;margin:0;position:absolute;right:10px;top:10px}.fl-builder-settings-fields .fl-nanoscroller-content{padding:4px 0 0}.fl-builder-settings-fields .fl-field-control-wrapper{position:relative}.fl-field{animation-duration:.25s;animation-delay:.1s}.fl-builder-settings-fields input[type=date],.fl-builder-settings-fields input[type=email],.fl-builder-settings-fields input[type=file],.fl-builder-settings-fields input[type=number],.fl-builder-settings-fields input[type=password],.fl-builder-settings-fields input[type=search],.fl-builder-settings-fields input[type=tel],.fl-builder-settings-fields input[type=text],.fl-builder-settings-fields input[type=url],.fl-builder-settings-fields select,.fl-builder-settings-fields textarea{background:#fff!important;border-color:transparent!important;border-style:solid;border-width:2px;border-radius:4px!important;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);color:#333!important;display:inline;font-size:13px;height:auto;line-height:15px;margin:1px;outline:0;padding:3px 6px;width:auto;box-sizing:border-box}i.fl-dimension-field-link,i.fl-field-responsive-toggle{line-height:18px!important;cursor:pointer;vertical-align:middle}.fl-builder-settings-fields input[type=date],.fl-builder-settings-fields input[type=email],.fl-builder-settings-fields input[type=file],.fl-builder-settings-fields input[type=number],.fl-builder-settings-fields input[type=password],.fl-builder-settings-fields input[type=search],.fl-builder-settings-fields input[type=tel],.fl-builder-settings-fields input[type=text],.fl-builder-settings-fields input[type=url],.fl-builder-settings-fields select:not(multiple){height:36px!important}.fl-builder-settings-fields select,.fl-builder-settings-fields select[multiple]{height:auto!important}.fl-builder-settings-fields input[type=number]{width:70px}.fl-builder-lightbox .fl-builder-settings-fields input[type=date]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=email]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=file]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=number]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=password]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=search]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=tel]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=text]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=url]:focus,.fl-builder-lightbox .fl-builder-settings-fields select:focus,.fl-builder-lightbox .fl-builder-settings-fields textarea:focus{border-width:2px!important;border-style:solid!important;border-color:#00a0d2!important;box-shadow:0 2px 4px 0 rgba(0,0,0,.12)!important}.fl-builder-settings-fields ::-webkit-input-placeholder{color:#999!important;font-size:13px}.fl-builder-settings-fields input:-moz-placeholder{color:#999;font-size:13px}.fl-builder-settings-fields ::-moz-placeholder{color:#999!important;font-size:13px}.fl-builder-settings-fields input:-ms-input-placeholder{color:#999;font-size:13px}.fl-builder-settings-fields label{display:inline-block;font-weight:400;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin-bottom:3px;font-size:12px}.fl-builder-settings-fields select{-webkit-appearance:none;-moz-appearance:none;box-sizing:border-box;color:#000;margin:0 0 2px;padding:2px 10px;padding-right:30px!important;background:url(../img/svg/select-arrow-down-alt2.svg) center right 10px no-repeat #fff!important}.fl-dimension-field-unit input[type=number],.fl-unit-field-inputs input[type=number]{-moz-appearance:textfield}.fl-builder-settings-fields select[multiple]{height:60px;background-image:none!important}.fl-builder-custom-field select,.fl-photo-field select{box-shadow:none;border-color:#e6eaed!important}.fl-builder-settings-section:first-child{border-top:none!important}.fl-builder-settings-section-header{background-color:#e7ebef;border-top:4px solid #e7ebef;cursor:pointer;height:30px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.fl-builder-settings-description{padding:0 10px 10px;margin:0;font-style:italic;opacity:.75}.fl-builder-settings-fields table{margin:20px 0}.fl-builder-settings-fields .fl-builder-settings-title{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;background:#F5F7F9;color:#353535;padding:2px 10px;margin:0;font-size:13px!important;font-weight:400;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:2px solid transparent;border-radius:0}.fl-builder-settings-fields .fl-builder-settings-title:active,.fl-builder-settings-fields .fl-builder-settings-title:hover{top:0}.fl-builder-settings-fields .fl-builder-settings-title:focus{top:0;border-color:#e0e4ea}.fl-builder-settings-fields .fl-builder-settings-title>svg{height:6px;width:9px;margin-right:7px;transition-property:transform;transition-duration:.15s}.fl-builder-settings-section-collapsed{margin-bottom:4px}.fl-builder-settings-section-collapsed .fl-builder-settings-section-content{display:none}.fl-builder-settings-section-collapsed .fl-builder-settings-title{background:0 0;-ms-flex:1 1 100%;flex:1 1 100%}.fl-builder-settings-section-collapsed .fl-builder-settings-title>svg{transform:rotate(-90deg)}.wp-core-ui h1,.wp-core-ui h2,.wp-core-ui h3,.wp-core-ui h4,.wp-core-ui h5,.wp-core-ui h6,.wp-core-ui p{color:#333;font-family:inherit}.wp-core-ui #media-attachment-date-filters{width:275px}.wp-core-ui input[type=search]::-webkit-input-placeholder{color:#333}.wp-core-ui input[type=search]:-ms-input-placeholder{color:#333}.wp-core-ui input[type=search]::-ms-input-placeholder{color:#333}.wp-core-ui input[type=search]::placeholder{color:#333}.wp-core-ui .submitbox .submitdelete{color:#a00}.wp-core-ui button{font-weight:400}.wp-core-ui input[type=date],.wp-core-ui input[type=email],.wp-core-ui input[type=file],.wp-core-ui input[type=number],.wp-core-ui input[type=password],.wp-core-ui input[type=search],.wp-core-ui input[type=tel],.wp-core-ui input[type=text],.wp-core-ui input[type=url],.wp-core-ui select,.wp-core-ui textarea{background-color:#fff;border-color:#dfdfdf;border-style:solid;border-width:1px;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none;color:#333;font-weight:400}.wp-core-ui input[type=date]:focus,.wp-core-ui input[type=email]:focus,.wp-core-ui input[type=file]:focus,.wp-core-ui input[type=number]:focus,.wp-core-ui input[type=password]:focus,.wp-core-ui input[type=search]:focus,.wp-core-ui input[type=tel]:focus,.wp-core-ui input[type=text]:focus,.wp-core-ui input[type=url]:focus,.wp-core-ui select:focus,.wp-core-ui textarea:focus{background:0 0;border-color:#aaa}.wp-core-ui input[type=search]{background-image:none;padding:6px}.fl-field-responsive-setting{display:inline-block;width:100%}.fl-field-responsive-setting-medium,.fl-field-responsive-setting-responsive{display:none}.fl-field-control-wrapper i.fl-field-responsive-toggle{padding:9px 0 0;position:absolute;left:-25px}i.fl-field-responsive-toggle{color:grey;display:inline-block;font-size:15px!important;height:auto;text-align:left;width:20px}.fl-builder-settings-fields input.text-full,.fl-builder-settings-fields textarea{width:100%}i.fl-field-responsive-toggle:hover{color:#000}.fl-builder-settings-fields .fl-text-field-add-value{min-width:50%;margin-top:.62em}.fl-field[data-type=shadow] .fl-field-control-wrapper{display:-ms-flexbox;display:flex}.fl-shadow-field .fl-color-picker{margin-bottom:15px;width:100%}.fl-color-picker{cursor:pointer}.fl-color-picker .fl-color-picker-clear{box-sizing:border-box}.fl-color-picker .fl-color-picker-clear:hover{background-color:#ededed}.colorpicker input{padding:0!important;font-size:11px!important;color:#fff!important;width:29px!important;height:auto!important;background:0 0!important;border:none!important}.colorpicker .colorpicker_hex input{width:45px!important}.fl-gradient-picker-type{display:-ms-flexbox;display:flex;margin-bottom:15px}.fl-gradient-picker-type input{margin:0!important}.fl-gradient-picker-type select{margin-bottom:0!important}.fl-gradient-picker-type-select{margin-right:10px!important}.fl-gradient-picker-colors{display:-ms-flexbox;display:flex}.fl-gradient-picker-color-row{display:-ms-flexbox;display:flex;margin-right:15px}.fl-color-picker.fl-gradient-picker-color,.fl-gradient-picker-color-row:last-child{margin-right:0}.fl-color-picker.fl-gradient-picker-color .fl-color-picker-color{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.fl-gradient-picker .fl-gradient-picker-stop input{border-top-left-radius:0!important;border-bottom-left-radius:0!important;margin:0!important}.fl-field[data-type=dimension] .fl-field-label label{padding-right:35px}.fl-field[data-type=dimension] .fl-field-control-wrapper{display:-ms-flexbox;display:flex}.fl-field[data-type=dimension] .fl-field-description{padding:9px 0 0 5px}.fl-field[data-type=dimension] .fl-field-responsive-setting{width:auto}.fl-dimension-field-units{border-radius:4px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);display:-ms-flexbox;display:flex;height:36px;margin:1px 1px 20px;position:relative;max-width:350px}.fl-dimension-field-units>*{border-right:1px solid #e6eaed;width:100%}body .fl-dimension-field-units>:last-child{border-right:none!important}body .fl-dimension-field-units>:first-child>input[type]{border-top-left-radius:4px!important;border-bottom-left-radius:4px!important}body .fl-dimension-field-units>:last-child>*{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important}.fl-dimension-field-unit input[type],.fl-dimension-field-units .fl-field-unit-select{box-shadow:none!important;margin:0!important;border-radius:0!important}.fl-dimension-field-unit input{width:100%!important}.fl-dimension-field-unit input::-webkit-inner-spin-button,.fl-dimension-field-unit input::-webkit-outer-spin-button{-webkit-appearance:none}.fl-dimension-field-unit label{padding:5px 0 0;font-size:11px;font-weight:700;color:inherit!important;display:block;text-align:center;opacity:.5}.fl-dimension-field-unit .fl-field-popup-slider{margin-top:27px}i.fl-dimension-field-link{color:grey;font-size:15px!important;height:auto;text-align:left;width:20px}i.fl-dimension-field-link:hover{color:#000}i.fl-dimension-field-link.dashicons-editor-unlink,i.fl-dimension-field-link.dashicons-editor-unlink:hover{color:#0086b0}.fl-field-label .fl-dimension-field-link,.fl-lightbox-width-slim .fl-dimension-field-link{display:none}.fl-lightbox-width-slim .fl-field-label .fl-dimension-field-link{display:inline-block}.fl-field-control-wrapper .fl-dimension-field-link{padding:9px 0 0;left:-50px;position:absolute}.fl-dimension-field-unit-select{display:-ms-flexbox;display:flex;width:auto!important}.fl-field[data-type=unit] .fl-field-control-wrapper{display:-ms-flexbox;display:flex}.fl-field[data-type=unit] .fl-field-description{margin-left:7px!important;padding-top:9px}.fl-field[data-type=unit] .fl-field-responsive-setting{width:auto}.fl-unit-field-inputs{background:0 0;border-radius:4px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);display:-ms-flexbox;display:flex}.fl-unit-field-inputs .fl-field-unit-select,.fl-unit-field-inputs input[type]{box-shadow:none!important;margin:0!important;border-top-right-radius:0!important;border-bottom-right-radius:0!important}.fl-unit-field-inputs .fl-field-unit-select{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.fl-unit-field-inputs input::-webkit-inner-spin-button,.fl-unit-field-inputs input::-webkit-outer-spin-button{-webkit-appearance:none}.fl-unit-field-input{border-right:1px solid #e6eaed!important}body .fl-unit-field-input:last-child{border-right:none!important}body .fl-unit-field-input:last-child>*{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important}.fl-unit-field-unit-select{display:-ms-flexbox;display:flex;width:auto!important}select.fl-field-unit-select{background-color:#E7EBEF!important;border-top-left-radius:0!important;border-bottom-left-radius:0!important}div.fl-field-unit-select{background-color:#E7EBEF!important;padding:9px 7px!important;width:100%}.fl-field-popup-slider{background:#fff;border-radius:4px;box-shadow:0 4px 25px 0 rgba(0,0,0,.18);display:none;margin-top:10px;padding:15px;position:absolute;left:0;right:0;z-index:9999}.fl-field-popup-slider-top{margin-top:0!important;top:-100%;transform:translateY(-10px)}.fl-field-popup-slider-input{background:#E7EBEF;cursor:pointer;height:4px;text-align:left;position:relative;border-radius:3px}.fl-field-popup-slider-input .ui-slider-handle{background:#fff;border:2px solid #3AA4CC;border-radius:100%;cursor:pointer;height:12px;width:12px;position:absolute;top:-6px;margin-left:-7px}.fl-field-popup-slider-input .ui-slider-handle:focus{outline:0}.fl-field-popup-slider-arrow{position:absolute;top:-22px}.fl-field-popup-slider-arrow:after{content:' ';border-color:transparent transparent #fff;border-style:solid;border-width:0 8px 8px;width:0;height:0}.fl-field-popup-slider-top .fl-field-popup-slider-arrow{top:auto;bottom:-24px}.fl-field-popup-slider-top .fl-field-popup-slider-arrow:after{border-bottom-width:0;border-top-width:8px;border-top-color:#fff}input[type=number].fl-field-popup-slider-focus{border:2px solid #00a0d2!important}.fl-font-field{display:-ms-flexbox;display:flex}.fl-font-field label{display:block!important;margin:0!important;padding:0 0 6px 12px}.fl-font-field .fl-font-field-font-wrapper{margin-right:8px;width:70%!important}.fl-font-field .fl-font-field-weight-wrapper{width:30%!important}.fl-compound-field{max-width:350px}.fl-compound-field-section-toggle{background:#E7EAEF;border-radius:4px;border-top:2px solid transparent;border-bottom:2px solid transparent;cursor:pointer;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:32px;margin-bottom:8px;padding:0 12px}.fl-compound-field-section-toggle:hover{background:#dadfe5}.fl-compound-field-section-toggle .dashicons{font-size:15px;height:15px;margin-right:5px;width:15px}.fl-compound-field-section:last-child .fl-compound-field-section-toggle{margin-bottom:0}.fl-compound-field-section.fl-compound-field-section-visible{padding-bottom:12px}.fl-compound-field-section.fl-compound-field-section-visible:last-child{padding-bottom:0}.fl-compound-field-section-visible .fl-compound-field-section-toggle{background:0 0;border-top:2px solid #E7EBEF;border-radius:0}.fl-compound-field-section-visible .fl-compound-field-section-toggle:hover{background:0 0}.fl-compound-field-section-visible .fl-compound-field-section-toggle .dashicons:before{content:'\f347'}.fl-compound-field-row{display:none;padding-bottom:12px}.fl-compound-field-section-visible .fl-compound-field-row{display:-ms-flexbox;display:flex}.fl-compound-field-label{display:block!important;margin:0!important;padding:0 0 6px 12px}.fl-compound-field-label-bottom{padding:6px 0 0 12px}.fl-compound-field-label .fl-dimension-field-link{display:inline-block;padding:0 0 0 2px;position:relative;left:auto;top:-1px}.fl-compound-field-setting{padding-right:8px;width:100%}.fl-compound-field-setting:last-child{padding-right:0}.fl-compound-field-setting select{margin:0!important;width:100%}.fl-compound-field-setting .fl-unit-field-input input{width:100%!important;border-top-right-radius:0!important;border-bottom-right-radius:0!important}.fl-compound-field-setting .fl-unit-field-input{width:50%!important}.fl-compound-field-setting .fl-unit-field-input select.fl-field-unit-select{background-position:center right 2px!important;padding:2px 5px!important;width:100%;font-size:11px}.fl-typography-field .fl-font-field-font-wrapper{margin-right:8px!important}.fl-typography-field-spacing{width:calc(33.33% - 8px)}.fl-typography-field-transform{width:66.66%}.fl-typography-field-transform .fl-button-group-field-options{float:none}.fl-typography-field-transform .fl-button-group-field-option{width:100%;padding:0 7px}.fl-typography-field .fl-shadow-field{display:-ms-flexbox;display:flex}.fl-typography-field .fl-shadow-field .fl-color-picker{margin:0 8px 0 0;width:calc(33.33% - 8px)}.fl-typography-field .fl-shadow-field .fl-dimension-field-units{margin-left:0;margin-top:0;margin-right:0;width:66.66%}.fl-button-group-field-options{background:#E7EBEF;border-radius:4px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);display:-ms-flexbox;display:flex;float:left;height:36px;overflow:hidden}.fl-button-group-field-option{cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding:0 5px;border-radius:0;border:2px solid transparent;background:0 0}.fl-button-group-field-option:hover{top:0;background-color:transparent;color:#000;border:2px solid transparent}.fl-button-group-field-option:focus{top:0;background-color:transparent;border:2px solid #00a0d2;color:#333}.fl-button-group-field-option:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.fl-button-group-field-option:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.fl-button-group-field-option[data-selected="1"]{background-color:#fff;color:#000}.fl-button-group-field-option i{color:#6B6E75}.fl-button-group-field-option:hover i{color:#333}.fl-compound-field-cell{width:50%;display:block;float:left;padding-top:13px}.fl-compound-field-cell:first-child{padding-right:4px}.fl-compound-field-cell:last-child{padding-left:4px}.fl-compound-field-cell label{padding:5px 0 0;font-size:11px;font-weight:700;color:inherit!important;display:block;text-align:center;opacity:.5}.fl-shape-transform-field .fl-compound-field-row{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.fl-shape-transform-field .fl-compound-field-row>*{width:auto;-ms-flex:1 1 auto;flex:1 1 auto}.fl-shape-transform-field .fl-compound-field-row>:first-child{-ms-flex:0 0 auto;flex:0 0 auto}.fl-shape-transform-field .fl-shape-orientation-controls{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.fl-shape-transform-field .fl-shape-orientation-controls>*{-ms-flex:0 0 auto;flex:0 0 auto}.fl-shape-transform-field .fl-shape-orientation-controls .fl-button-group-field>*,.fl-shape-transform-field .fl-shape-orientation-controls .fl-button-group-field>* button{border-radius:0}.fl-shape-orientation-controls .fl-button-group-field:first-child>*,.fl-shape-orientation-controls .fl-button-group-field:first-child>* button{border-top-left-radius:4px;border-bottom-left-radius:4px}.fl-shape-orientation-controls .fl-button-group-field:last-child>*,.fl-shape-orientation-controls .fl-button-group-field:last-child>* button{border-top-right-radius:4px;border-bottom-right-radius:4px}.fl-builder-custom-field{background:#fff;border:2px solid transparent;border-radius:4px;padding:7px 10px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);min-height:36px;box-sizing:border-box}.fl-builder-field-multiple .fl-builder-custom-field{cursor:move}.fl-builder-custom-field a{color:#21759b!important;text-decoration:underline!important}.fl-builder-custom-field a:hover{color:#d54e21!important}.fl-builder-custom-field label.error{margin-top:5px}.fl-photo-field .fl-photo-preview{display:-ms-flexbox;display:flex}.fl-photo-field .fl-photo-select,.fl-photo-field.fl-photo-empty .fl-photo-preview{display:none}.fl-photo-field.fl-photo-empty .fl-photo-select{display:block}.fl-photo-field .fl-photo-preview-img{line-height:0;margin:5px 0}.fl-photo-field .fl-photo-preview-img img{max-width:60px}.fl-photo-field .fl-photo-preview select{margin:8px 0 8px 10px;width:calc(100% - 10px)}.fl-photo-field.fl-photo-no-attachment .fl-photo-preview select{display:none}.fl-photo-field .fl-photo-preview-filename{display:none;font-size:13px;font-weight:700;margin:5px 0 9px 11px}.fl-photo-field.fl-photo-no-attachment .fl-photo-preview-filename{display:inline-block;word-break:break-all}.fl-multiple-photos-field .fl-multiple-photos-select,.fl-multiple-photos-field.fl-multiple-photos-empty .fl-multiple-photos-add,.fl-multiple-photos-field.fl-multiple-photos-empty .fl-multiple-photos-count,.fl-multiple-photos-field.fl-multiple-photos-empty .fl-multiple-photos-edit,.fl-multiple-photos-lightbox .gallery-settings,.fl-photo-field.fl-photo-no-attachment .fl-photo-edit{display:none}.fl-photo-field .fl-photo-edit{margin:0 0 0 11px}.fl-photo-field .fl-photo-remove,.fl-photo-field .fl-photo-replace{margin:0 0 0 8px}.fl-builder-edit .media-modal{z-index:9999991}.fl-builder-edit .media-modal-backdrop{z-index:999999}.fl-builder-edit .media-frame{-webkit-backface-visibility:hidden;backface-visibility:hidden}.fl-builder-edit .media-modal-content h1{font-family:inherit}.fl-builder-edit form#wp-link,.popover[class*=tour-],ul.as-list{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}.fl-builder-edit .media-modal-content .thumbnail{padding:0;border:none;border-radius:0}.fl-builder-edit .media-modal-content .attachment-preview .thumbnail{margin-bottom:0}.fl-builder-edit .media-modal-content .attachment-preview .thumbnail img{max-width:none}.fl-builder-edit button.media-modal-close{position:absolute;box-shadow:none;-webkit-box-shadow:none}.fl-builder-edit .media-frame.hide-menu{visibility:visible}span.select2-container.select2-container--open{z-index:9999999}.fl-multiple-photos-field .fl-multiple-photos-add{margin:0 0 0 8px}.fl-multiple-photos-field.fl-multiple-photos-empty .fl-multiple-photos-select{display:inline}.fl-multiple-photos-count{font-weight:700;margin-bottom:3px}.fl-video-field .fl-video-select,.fl-video-field.fl-video-empty .fl-video-preview{display:none}.fl-video-field.fl-video-empty .fl-video-select{display:block}.fl-video-field .fl-video-preview-img{float:left;line-height:0;margin:5px 0}.fl-video-field .fl-video-preview-img img{max-width:60px}.fl-video-field .fl-video-preview-img .dashicons.dashicons-media-video{display:block;font-size:60px;height:60px;line-height:60px;width:60px}.fl-video-field .fl-video-preview-filename{display:inline-block;font-size:14px;font-weight:700;margin:7px 0 5px 11px}.fl-video-field .fl-video-remove,.fl-video-field .fl-video-replace{margin:0 0 0 11px}.fl-multiple-audios-field .fl-multiple-audios-select,.fl-multiple-audios-field.fl-multiple-audios-empty .fl-multiple-audios-add,.fl-multiple-audios-field.fl-multiple-audios-empty .fl-multiple-audios-edit{display:none}.fl-multiple-audios-field.fl-multiple-audios-empty .fl-multiple-audios-select{display:block}.fl-multiple-audios-field .fl-multiple-audios-add{margin:0 0 0 8px}.fl-icon-field .fl-icon-select,.fl-icon-field.fl-icon-empty .fl-icon-preview{display:none}.fl-icon-field.fl-icon-empty .fl-icon-select{display:block}.fl-icon-field .fl-icon-preview i{display:inline-block;font-size:28px;margin:10px 10px 9px;vertical-align:middle}.fl-icon-field .fl-icon-remove{margin:0 0 0 8px}.fl-builder-hidden-editor{display:none}.fl-builder-settings .wp-switch-editor{border-radius:0;color:#333;margin-top:2px}.fl-builder-settings .mce-toolbar .mce-btn-group .mce-btn{margin:2px 0}.fl-builder-settings .mce-menubtn.mce-fixed-width button{width:100px}.fl-builder-settings .mce-menubtn.mce-fixed-width span{width:100%}.mce-close:active,.mce-close:hover,.mce-toolbar .mce-btn button:active,.mce-toolbar .mce-btn button:hover,.mce-window .mce-btn button:active,.mce-window .mce-btn button:hover{background:0 0;border:none}.wp-core-ui .quicktags-toolbar input.button.button-small{margin:1px!important}.wp-editor-container textarea.wp-editor-area{background:0 0;border:none;padding:10px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.fl-builder-edit form#wp-link{color:#000;font-size:13px}.fl-builder-edit form#wp-link #link-options label{display:block;margin-bottom:2px}.fl-builder-edit form#wp-link #link-options label span{padding-right:10px;vertical-align:middle}.fl-builder-edit form#wp-link #link-options input[type=text]{display:inline-block;height:auto;margin:5px 0 0;padding:3px 5px;width:80%}.fl-builder-edit form#wp-link .query-results{top:225px}.fl-code-field{border:1px solid #E6E6E6;border-left:none}.ace_editor,.ace_editor *{font-family:Monaco,Menlo,"Ubuntu Mono","Droid Sans Mono",Consolas,monospace!important;font-size:12px!important;font-weight:400!important;letter-spacing:0!important}.fl-layout-field-option{border:2px solid #d9d9d9;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;box-sizing:border-box!important;-moz-box-sizing:border-box!important;-webkit-box-sizing:border-box!important;cursor:pointer;float:left;line-height:0;max-width:23%;margin:0 1% 2%;padding:5px}.fl-layout-field-option-selected,.fl-layout-field-option:hover{border-color:red}.fl-layout-field-option img{max-width:100%}.fl-link-field .fl-link-field-input-wrap{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.fl-link-field-input{width:auto!important;-ms-flex:1 1 100%;flex:1 1 100%}.fl-link-field .fl-link-field-input-wrap button{-ms-flex:0 0 0%;flex:0 0 0%;height:36px;margin:1px 1px 1px 5px}.fl-link-field-options-wrap{padding:7px 0 0 12px}.fl-link-field-options-wrap label{margin-right:7px}.fl-link-field-options-wrap span{font-size:11px;font-weight:700;color:inherit!important;text-align:center;opacity:.5}.fl-link-field-search{display:none;border:2px solid #e6eaed;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;margin:4px 0 0;padding:10px}.fl-link-field-search-title{display:block;margin:0 0 3px 2px}.fl-link-field-search-cancel{margin-top:6px}.fl-link-field-search input{box-shadow:none!important;width:100%!important;padding:3px 9px!important}.fl-link-field-search #as-original-link-search{width:100%}.fl-field-connections-toggle{padding:10px 0}.fl-field[data-type=editor] .fl-field-connections-toggle,.fl-field[data-type=code] .fl-field-connections-toggle{-ms-flex-align:start;align-items:flex-start}.fl-field[data-type=link] .fl-field-connections-toggle{height:24px;margin-top:1px;-ms-flex-align:start;align-items:flex-start}.fl-field[data-type=link] .fl-field-connection{bottom:25px}.fl-field-connections-menu[data-field=fl-field-text]{margin-top:30px}.fl-help-tooltip{display:inline-block;position:relative}.fl-lightbox-width-slim .fl-help-tooltip{position:static}.fl-help-tooltip-icon{color:#999!important;cursor:pointer;font-size:15px!important;padding:5px;vertical-align:middle}.fl-help-tooltip-text{box-sizing:border-box;background:#fff;border:1px solid #ccc;box-shadow:0 0 5px #ccc;-moz-box-shadow:0 0 5px #ccc;-webkit-box-shadow:0 0 5px #ccc;display:none;font-weight:400;left:23px;padding:10px 13px;position:absolute;top:-6px;width:250px;z-index:1000;border-radius:4px}.fl-lightbox-width-slim .fl-help-tooltip-text{top:30px;left:0;width:100%}.fl-field-control .fl-form-field{margin-bottom:0}.fl-form-field[data-preview-text=icon]{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.fl-form-field-preview-text i{display:inline-block;font-size:18px;line-height:22px;margin-right:10px}.fl-builder-field-actions{padding-left:0!important;padding-right:0!important;text-align:center;width:85px}.fl-builder-field-actions i{color:#999!important;cursor:pointer;font-size:13px!important;line-height:29px!important;width:16px}.fl-builder-field-actions i:hover{color:#000!important}.fl-builder-field-actions i.fl-builder-field-copy,.fl-builder-field-actions i.fl-builder-field-delete{margin-left:5px}.fl-builder-field-actions i.fl-builder-field-move{cursor:move}.fl-builder-field-dd-helper{background:#ccc;height:30px!important;float:left;width:130px!important}.fl-builder-field-dd-zone{border:1px dashed #ccc;height:30px}.fl-builder-field-actions-single .fl-builder-field-delete,.fl-builder-field-actions-single .fl-builder-field-move{display:none!important}.fl-builder-field-multiple .fl-builder-field-actions,.fl-builder-field-multiple .fl-field-control,.fl-builder-field-multiple .fl-field-label{padding-top:2px!important;padding-bottom:2px!important}.fl-builder-field-multiple .fl-builder-field-actions{min-width:70px!important}.fl-builder-field-multiple[data-field=icons] .fl-builder-field-actions{width:70px!important}.fl-builder-field-multiple.ui-sortable-helper .fl-field-control{width:60%}.fl-builder-field-multiple.ui-sortable-helper .fl-builder-field-actions{display:none}.fl-builder-widget-settings input{display:inline-block!important;margin:5px 10px 8px!important}.fl-builder-lightbox-loading{background:url(../img/ajax-loader.svg) center center no-repeat;height:100px}.fl-builder-settings .error,.fl-builder-settings input.error{color:#d03436!important}.fl-builder-settings label.error,.fl-builder-settings p.error{color:#d03436;display:block;margin-top:5px}.fl-builder-settings .fl-form-table .fl-field-description{color:#464646;font-style:normal;margin-left:2px}.fl-lightbox .fl-field-connection{right:-1px}.fl-lightbox .fl-field-connection-content{border:2px solid transparent!important;background:#e7ebef!important}.fl-field-connection-content .fl-field-connection-label{color:#676f7a!important}.fl-field-connections-toggle{pointer-events:none;width:20px;right:-25px}.has-scrollbar .fl-field-connections-toggle{right:-22px}.fl-field-connections-toggle-open{transform:none!important}.fl-field-connections-toggle i{pointer-events:auto;color:#abb1ba;font-size:13px!important;transition-property:transform;transition-duration:.15s}.fl-field-connections-toggle-open i{transform:rotate(-45deg)}ul.as-selections{background-color:#fff;border:none;border-radius:4px;box-shadow:none;color:#333;font-size:12px;height:auto;line-height:15px;margin:1px;outline:0;padding:3px;width:auto}ul.as-selections.loading{background:url(../img/ajax-loader-small.svg) 98% center no-repeat}ul.as-selections li.as-selection-item{background:#d4eaf6;border:none;font-size:11px;line-height:14px;padding:8px 15px;border-radius:4px;margin:2px}ul.as-selections li.as-selection-item.blur{background:#f4f4f4}ul.as-selections li.as-selection-item a.as-close{line-height:12px}ul.as-selections li.as-original{margin:0}ul.as-selections li.as-original input{height:auto;font-size:12px;margin:0;padding:0;box-shadow:none}ul.as-list{margin:0;font-size:13px;color:#000;background-color:#fff;background-color:rgba(255,255,255,.95);z-index:2;box-shadow:0 0 10px rgba(0,0,0,.1);border:none;border:1px solid #dfdfdf;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px}li.as-message,li.as-result-item{border:none}li.as-result-item.active{background:#e5e5e5;border-radius:0;color:#333;text-shadow:none}li.as-result-item em{background:0 0!important;color:#333!important;font-size:12px;padding:0!important;font-weight:700}.fl-custom-query-filter{display:none}.fl-custom-query .fl-field[data-type=suggest] select{margin-bottom:5px;width:100%}.fl-builder-service-settings{position:relative}.fl-builder-service-error{color:red!important;padding:15px 0 0}.fl-builder-service-account-delete{color:red!important;margin-left:10px;position:relative;top:2px}.fl-lightbox-width-slim .fl-builder-service-account-delete{display:block;padding-top:7px}#fl-field-visibility_user_capability .fl-field-description,.fl-builder-service-connect-row .fl-field-description{background:#f0f0f0;color:#333!important;display:block;float:none;margin:10px 0 0;padding:10px}#fl-field-visibility_user_capability .fl-field-description a,.fl-builder-service-connect-row .fl-field-description a{color:#21759b!important;text-decoration:underline!important}.fl-ordering-field-option{background:#fff;border:1px solid #dfdfdf;border-radius:3px;cursor:move;margin-bottom:5px;padding:5px 10px}.fl-ordering-field-option .fa{color:#ccc;float:right;line-height:16px}#tiptip_holder{z-index:1000000}#tiptip_holder.tip_top #tiptip_arrow_inner{border-top-color:#333}#tiptip_holder.tip_bottom #tiptip_arrow_inner{border-bottom-color:#333}#tiptip_holder.tip_right #tiptip_arrow_inner{border-right-color:#333}#tiptip_holder.tip_left #tiptip_arrow_inner{border-left-color:#333}#tiptip_content{background:#333;box-shadow:none}.fl-builder-getting-started-video{line-height:0!important;padding:10px}.fl-builder-getting-started-video iframe{border:none;height:326px;width:100%}.fl-builder-tour-actions .fl-builder-actions-title{font-size:14px!important;line-height:19px}.fl-builder-tour-mask{bottom:0;left:0;position:fixed;right:0;top:0;z-index:100000000}.fl-builder-tour-dimmed{background:rgba(0,0,0,.7);bottom:0;left:0;position:absolute;right:0;top:0}body>.fl-builder-tour-dimmed{position:fixed}.tour-backdrop{z-index:110000}.popover[class*=tour-]{border:1px solid #ccc;border-radius:0;box-shadow:0 0 40px rgba(0,0,0,.3);color:#666;font-size:13px;font-weight:400;line-height:18px;max-width:none;padding:0;width:300px;z-index:100000001}.popover[class*=tour-].bottom>.arrow{border-bottom-color:#ccc}.popover[class*=tour-].bottom>.arrow:after{border-bottom-color:#f7f7f7}.popover[class*=tour-] .popover-title{border-radius:0;color:#333;letter-spacing:normal;text-transform:none}.popover[class*=tour-] .fa-times{color:#b3b3b3;cursor:pointer;font-size:16px;padding:5px;position:absolute;right:3px;top:2px}.popover[class*=tour-] .fa-times:hover{color:#666}.popover[class*=tour-] .popover-content{border-bottom:1px solid #d9d9d9;padding:13px 15px}.popover[class*=tour-] .fl-builder-tour-next{display:block;float:none;width:100%}.popover-navigation button{min-height:36px}.fl-builder-shortcode-mask-wrap{position:relative}.fl-builder-shortcode-mask{bottom:-1px;left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fl-builder--search{border:2px solid transparent;position:relative;padding:0;width:54px;transition-property:width;transition-delay:.1s;transition-duration:.15s}.fl-builder--search.is-expanded{border:2px solid #00A0D0}.fl-builder--search input[type=text],.fl-builder--search input[type=text]:focus{background-color:transparent;border:none!important;box-sizing:border-box;width:100%;font-size:16px;text-align:center}.fl-builder--search:before{display:-ms-flexbox;display:flex;top:0;left:0;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;content:"\f002";font:normal normal normal 14px/1 Font Awesome\ 5 Free;text-align:center;width:100%;height:100%;position:absolute;pointer-events:none;color:rgba(128,128,128,.6);font-size:17px;opacity:1;transition-property:opacity;transition-duration:.15s}.fl-builder--main-menu-panel,.fl-builder-ui-keyboard-shortcuts{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important}.fl-builder--search.has-text:before,.fl-builder--search.is-expanded:before{opacity:0}.fl-builder--search input::-webkit-input-placeholder{color:rgba(128,128,128,0)!important;transition:color .25s}.fl-builder--search input:focus::-webkit-input-placeholder{color:rgba(128,128,128,.4)!important}.fl-builder--search .search-label{cursor:text}.fl-builder--search .search-clear{display:none;padding:10px 10px 10px 30px;color:#a7a7a7;font-size:12px;position:absolute;right:0;top:0;background-color:#eff1f2;background:linear-gradient(to left,#e4e7ea,#e4e7ea 75%,rgba(228,231,234,0))}.fl-builder--search.has-text .search-clear,.fl-builder--search.is-expanded input{display:inline-block}.fl-builder--search:hover .search-clear{color:#888;background-color:#eff1f2;background:linear-gradient(to left,#dadfe5,#dadfe5 75%,rgba(218,223,229,0))}.fl-builder--search.is-expanded{width:246px}@keyframes fl-builder-show-menu-item{from{transform:translateY(10px) scale(.8);opacity:0}to{transform:translateX(0) translateY(0) scale(1);opacity:1}}.fl-builder--main-menu-panel{display:none;box-sizing:border-box;position:fixed;top:calc(45px + 10px);left:10px;width:360px;color:#222;max-height:calc(100% - 66px);border-radius:4px;background:#fff;border:none;border-top:3px solid #00a0d2;box-shadow:0 11px 45px 8px rgba(0,0,0,.1);font-size:14px!important;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:10000009;pointer-events:auto}.fl-builder--main-menu-panel.is-showing{display:-ms-flexbox;display:flex}.fl-builder--main-menu-panel:before,.fl-theme-builder-preview-select-open .fl-theme-builder-preview-select-items:before{bottom:100%;right:6px;content:" ";height:0;width:0;position:absolute;pointer-events:none;border:solid;border-color:rgba(255,255,255,0);border-bottom-color:#00a0d2;border-width:13px;margin-left:-13px}.fl-builder--main-menu-panel-views{-ms-flex:1 1 100%;flex:1 1 100%;overflow:auto}.fl-builder--main-menu-panel-mask{display:none;position:fixed;top:0;left:0;right:0;bottom:0;z-index:1000119}.fl-builder--main-menu-panel .fl-builder--tabs{padding-left:20px;padding-top:15px}.fl-builder--main-menu-panel-view{display:none}.fl-builder--main-menu-panel-view.is-showing{display:block}.fl-builder--main-menu-panel-view-title{font-size:24px;font-weight:600;padding:25px 22px 0;line-height:1;white-space:nowrap}.fl-builder--main-menu-panel-view-title .title-accessory{float:right;color:#b1b1b1}.fl-builder--main-menu-panel-view-title .title-accessory>i{font-size:20px!important;width:25px!important}.fl-builder--main-menu-panel-view-title .title-accessory>i:hover{color:#222}.fl-builder--main-menu-panel-view-title .pop-view{padding:10px;margin-left:-10px;opacity:.5;font-size:25px;font-weight:400;cursor:pointer;background:0 0;outline:0;border:none;color:inherit}.fl-builder--main-menu-panel-view-title .pop-view:focus{outline:0;top:0;background:#E5EAED!important}.fl-builder--menu-item:before{display:block;content:"";float:none;clear:both}.fl-builder--menu-item{color:inherit;text-align:left;box-sizing:border-box;display:block;padding:10px 15px;margin:0 10px;width:calc(100% - 20px);background:0 0;border:none;border-radius:4px;font-size:14px;line-height:1.1;cursor:pointer;opacity:1;text-transform:none}.fl-builder--menu-item:hover{background:#eaf1f8;border:none;text-decoration:none;color:#000}.fl-builder--selector-menu .fl-builder--menu-item:hover{background:#fff}.fl-builder--menu-item-accessory{float:right;text-align:center;display:inline-block;min-width:40px;font-size:14px}.fl-builder--menu-item-accessory.view-arrow{font-size:18px}.fl-builder--menu{padding:0;margin:20px 0}.fl-builder--menu hr{margin:8px 0;background:#e6eaed!important;height:1px;border:none}.fl-builder--menu .fl-builder-video-wrap{padding:0 10px 10px}.fl-revision-list-item{display:-ms-flexbox;display:flex}.fl-revision-list-item-text{padding-left:15px}.fl-revision-list-item-date{padding-bottom:5px}.fl-builder--revision-actions{display:none;position:fixed;top:4px;left:4px;z-index:100008;padding:4px 4px 6px;-ms-flex-pack:center;justify-content:center;background:#fff;border-radius:4px}.fl-builder--revision-actions *{margin-right:5px}.fl-builder--revision-actions :last-child{margin:0}.fl-builder--menu-item[data-event=noRevisionsMessage]:hover{background:0 0;box-shadow:none;cursor:default}.fl-no-revisions-message-title{font-weight:700;margin-bottom:10px}.fl-no-revisions-message-text{line-height:22px}.fl-builder-module-placeholder-message{border:1px dashed #ccc;overflow:hidden;padding:20px;text-align:center;text-overflow:ellipsis;white-space:nowrap}.fl-field-connections-menu{z-index:999999}.fl-field[data-type=editor] .fl-field-connections-toggle,.fl-field[data-type=code] .fl-field-connections-toggle{right:5px!important}.fl-field-connections-inline-toggle{display:inline;color:#9a9b9c;margin-left:6px}.fl-field-connections-inline-toggle i{transition-property:transform;transition-duration:.15s}.fl-field-connections-inline-toggle.fl-field-connections-toggle-open i{transform:rotate(45deg)}.fl-builder-add-ultimate-presets-button,.fl-builder-add-ultimate-rows-button,.fl-builder-pp-add-template-button,.pp-preview-button,.uabb-live-preview-button{display:none!important}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none;background:0 0;transition-property:background;transition-duration:.15s}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-ne,.ui-resizable-nw,.ui-resizable-se,.ui-resizable-sw{width:12px;height:12px}.ui-resizable-se{cursor:se-resize;right:-4px;bottom:-4px}.ui-resizable-sw{cursor:sw-resize;left:-4px;bottom:-4px}.ui-resizable-nw{cursor:nw-resize;left:-4px;top:-4px}.ui-resizable-ne{cursor:ne-resize;right:-4px;top:-4px}.fl-builder-resizable-iframe-fix{position:absolute;top:0;right:0;bottom:0;left:0;z-index:100000000}.fl-builder-panel .ui-resizable-handle:active,.fl-builder-panel .ui-resizable-handle:hover,.fl-lightbox .ui-resizable-handle:active,.fl-lightbox .ui-resizable-handle:hover{background:#00a0d2}.fl-builder-panel .ui-resizable-n,.fl-builder-panel .ui-resizable-s,.fl-lightbox .ui-resizable-n,.fl-lightbox .ui-resizable-s{height:6px}.fl-builder-panel .ui-resizable-n,.fl-lightbox .ui-resizable-n{top:-3px}.fl-builder-panel .ui-resizable-s,.fl-lightbox .ui-resizable-s{bottom:-3px}.fl-builder-panel .ui-resizable-e,.fl-builder-panel .ui-resizable-w,.fl-lightbox .ui-resizable-e,.fl-lightbox .ui-resizable-w{width:6px}.fl-builder-panel .ui-resizable-e,.fl-lightbox .ui-resizable-e{right:-3px}.fl-builder-panel .ui-resizable-w,.fl-lightbox .ui-resizable-w{left:-3px}.fl-lightbox .ui-resizable-ne,.fl-lightbox .ui-resizable-nw,.fl-lightbox .ui-resizable-se,.fl-lightbox .ui-resizable-sw{background:0 0;border:6px solid transparent}.fl-lightbox .ui-resizable-ne:active,.fl-lightbox .ui-resizable-ne:hover,.fl-lightbox .ui-resizable-nw:active,.fl-lightbox .ui-resizable-nw:hover,.fl-lightbox .ui-resizable-se:active,.fl-lightbox .ui-resizable-se:hover,.fl-lightbox .ui-resizable-sw:active,.fl-lightbox .ui-resizable-sw:hover{background:0 0;border-color:#00a0d2}.fl-lightbox .ui-resizable-ne{border-bottom:none;border-left:none;border-top-right-radius:4px}.fl-lightbox .ui-resizable-nw{border-bottom:none;border-right:none;border-top-left-radius:4px}.fl-lightbox .ui-resizable-se{border-top:none;border-left:none;border-bottom-right-radius:4px}.fl-lightbox .ui-resizable-sw{border-top:none;border-right:none;border-bottom-left-radius:4px}.fl-builder-ui-keyboard-shortcuts{display:none;position:fixed;top:0;left:0;bottom:0;right:0;z-index:999999;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;background:rgba(50,50,50,.88);font-size:15px;line-height:1.3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fl-builder-ui-keyboard-shortcuts.is-showing{display:-ms-flexbox;display:flex}.fl-builder-ui-keyboard-shortcuts-content{box-sizing:border-box;width:500px;background:#f5f7f9;border-radius:4px;padding:30px 0 0;box-shadow:0 10px 30px rgba(0,0,0,.15)}.fl-builder-ui-keyboard-shortcut-item{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center;padding:12px 40px}.fl-builder-ui-keyboard-shortcut-item:nth-child(even){background:#eef2f5}.fl-builder-ui-shortcut-keycode{margin-left:auto;text-transform:uppercase;letter-spacing:2px}.fl-builder-ui-keyboard-shortcust-footer{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;padding:10px}.dismiss-shortcut-ui{padding:10px;border-radius:4px;background:#fff;color:#000;font-size:14px;border:2px solid #fff}.dismiss-shortcut-ui:focus,.dismiss-shortcut-ui:hover{top:0;color:#000;background:#eef2f5;border:2px solid #eef2f5}.fl-builder-ui-skin--dark .fl-builder--main-menu-panel,.fl-builder-ui-skin--dark .fl-builder--preview-actions,.fl-builder-ui-skin--dark .fl-builder--search-results-panel,.fl-builder-ui-skin--dark .fl-builder-panel,.fl-builder-ui-skin--dark .fl-lightbox,body.fl-builder-ui-skin--dark .fl-builder-bar .fl-builder-bar-content{background:#23282d;color:#b4b9be;border-color:#1d1d1d}.fl-builder-ui-skin--dark .fl-builder--panel-header{color:#b4b9be;border-bottom-color:#1d1d1d;border-top-color:#1d1d1d}.fl-builder-ui-skin--dark .fl-builder-panel.fl-builder-ui-pinned .fl-builder--panel-header{border-top-color:#1d2227}.fl-builder-ui-skin--dark .fl-builder--main-menu-panel:before{border-bottom-color:#1d1d1d}.fl-builder-ui-skin--dark .fl-builder--panel-arrow polygon{fill:#1d1d1d}.fl-builder-ui-skin--dark .fl-builder-panel-search .fl-builder-panel-search-input{background:#24282e}.fl-builder-ui-skin--dark .fl-responsive-preview-content{background:#131619}.fl-builder-ui-skin--dark .fl-form-table th{background:#23282d!important;color:#7d8690}.fl-builder-ui-skin--dark .fl-builder--preview-actions .device-icons,.fl-builder-ui-skin--dark .fl-builder-button{background:#2c333a}.fl-builder-ui-skin--dark .fl-builder-button:focus{background:#131a22}.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-button-primary{color:#fff!important;fill:#fff!important;background:#00A0D2}.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-buy-button,.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-feedback-button,.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-upgrade-button{background-color:#F7A407;color:#fff!important}.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-button-silent:focus{border:2px solid #00a0d2!important}.fl-builder-ui-skin--dark .fl-builder-content-panel--button:hover,.fl-builder-ui-skin--dark .fl-builder-content-panel-button{color:#00A0D2!important}.fl-builder-ui-skin--dark .fl-builder--menu>a:hover,.fl-builder-ui-skin--dark .fl-builder--menu>button:hover{background:#101215!important}.fl-builder-ui-skin--dark .fl-builder--menu>a:focus,.fl-builder-ui-skin--dark .fl-builder--menu>button:focus{background:#101215!important;color:#fff!important}.fl-builder-ui-skin--dark .fl-builder-bar-title{border-color:#101215}.fl-builder-ui-skin--dark .fl-builder-bar-title:hover{background-color:#181b1f}.fl-builder-simple.fl-builder-ui-skin--dark .fl-builder-bar-title:hover{background-color:transparent}.fl-builder-ui-skin--dark .fl-builder-layout-title{color:#c6cdd6}.fl-builder-ui-skin--dark .fl-builder-bar-title-caret i,.fl-builder-ui-skin--dark .fl-builder-layout-pretitle,.fl-builder-ui-skin--dark .fl-theme-builder-preview-select .fl-theme-builder-preview-select-title{color:#7d8690}.fl-builder-ui-skin--dark button.fl-builder-button.fl-builder-bar-title-caret:focus{background-color:#101215!important}.fl-builder-ui-skin--dark .fl-builder--search:before{color:rgba(162,173,184,.73)}.fl-builder-ui-skin--dark .fl-builder--search input:focus::-webkit-input-placeholder{color:rgba(162,173,184,.73)!important}.fl-builder-ui-skin--dark .fl-builder--search .search-clear{color:rgba(162,173,184,.5);background-color:#e4e4e4;background:linear-gradient(to left,#383f46,#383f46 75%,rgba(56,63,70,0))}.fl-builder-ui-skin--dark .fl-builder--menu hr{background-color:#23282d!important;border:none}.fl-builder-ui-skin--dark .fl-builder--tabs{border-color:#383f46!important}.fl-builder-ui-skin--dark .fl-builder--tabs .is-showing,.fl-builder-ui-skin--dark .fl-builder-settings-tabs a.fl-active,.fl-builder-ui-skin--dark .fl-builder-settings-tabs-more.fl-contains-active{color:#fff!important;fill:#fff!important;background:#181b20!important}.fl-builder-ui-skin--dark .fl-builder--tabs :focus{background-color:#101215!important;color:#fff!important}.fl-builder-ui-skin--dark .fl-builder--tabs .is-showing:focus{color:#00a0d2!important}.fl-builder-ui-skin--dark .fl-builder--menu-item:hover{background:#383f46;color:#a8b3bf}.fl-builder-ui-skin--dark .fl-builder--menu * .fl-builder--menu-item-accessory,.fl-builder-ui-skin--dark .fl-builder-blocks-section-group-name{color:#7d8690}.fl-builder-ui-skin--dark .fl-builder--selector-display{color:#c6cdd6;background:url(../img/svg/select-arrow-down-alt2-light.svg) center right 10px no-repeat #1a1b22!important}.fl-builder-ui-skin--dark .fl-builder--selector-display-label{color:#b5becb}.fl-builder-ui-skin--dark .fl-builder-panel-search-input input{border-color:#5b656f;color:#b8c2ce;background:#171b1f!important}.fl-builder-ui-skin--dark .fl-builder--selector-display-label:focus,.fl-builder-ui-skin--dark .fl-builder-panel-search-input input:focus{border-color:#00a0d2}.fl-builder-ui-skin--dark .fl-builder--group-label{color:#aaafb5!important;background:#24282e}.fl-builder-ui-skin--dark .fl-builder--category-select .fl-builder--selector-menu{border-color:#101215!important;color:#7c858e;background-color:#101215}.fl-builder-ui-skin--dark .fl-builder--category-select .fl-builder--selector-menu:before{border-bottom-color:#101215}.fl-builder-ui-skin--dark .fl-builder--menu>a,.fl-builder-ui-skin--dark .fl-builder--menu>button,.fl-builder-ui-skin--dark .fl-builder--menu>span{color:#a1adb9}.fl-builder-ui-skin--dark .fl-builder--category-select .fl-builder--selector-menu .fl-builder--menu-item:hover{background:#23282d!important;color:#a1adb9}.fl-builder-ui-skin--dark .fl-builder--category-select .fl-builder--selector-menu .fl-builder--menu-item:focus{background:#23282d!important;color:#00a0d2!important}.fl-builder-ui-skin--dark .fl-builder-panel-drag-handle{fill:#5b656f}.fl-builder-ui-skin--dark .fl-builder--template-collection-section-header,.fl-builder-ui-skin--dark .fl-builder-blocks-section .fl-builder-blocks-section-header,.fl-builder-ui-skin--dark .fl-builder-settings-section-header{background-color:#191b21;border-color:#191b21}.fl-builder-ui-skin--dark .fl-builder--template-collection-section-name,.fl-builder-ui-skin--dark .fl-builder--user-templates-section-name,.fl-builder-ui-skin--dark .fl-builder-blocks-section .fl-builder-blocks-section-title,.fl-builder-ui-skin--dark .fl-builder-settings-fields .fl-builder-settings-title{color:#7d8690!important;fill:#7d8690;background:#24282e}.fl-builder-ui-skin--dark .fl-builder-settings-fields .fl-builder-settings-title:focus{border-color:#7d8690}.fl-builder-ui-skin--dark .fl-builder-blocks-section-content .fl-builder-block,.fl-builder-ui-skin--dark .fl-user-template{color:#b8c2ce}.fl-builder-ui-skin--dark .fl-builder-block:hover .fl-builder-block-content,.fl-builder-ui-skin--dark .fl-user-template:hover{background:#171b1f;color:#fff}.fl-builder-ui-skin--dark .fl-builder-block:hover i,.fl-builder-ui-skin--dark .fl-user-template:hover i{color:#6d7782!important}.fl-builder-ui-skin--dark .fl-builder-block:hover a:hover i,.fl-builder-ui-skin--dark .fl-user-template:hover a:hover i{color:#9eacbb!important}.fl-builder-ui-skin--dark .fl-builder-block .fl-builder-block-icon{fill:#b5becb}.fl-builder-ui-skin--dark .fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col,.fl-builder-ui-skin--dark .fl-builder-block:hover .fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col{background:#7d8690}.fl-builder-ui-skin--dark .fl-user-templates{border-color:#101215}.fl-builder-ui-skin--dark .fl-builder--template-thumbnail{border-color:#393f44}.fl-builder-ui-skin--dark .fl-builder--menu a.fl-template-collection{color:#a8b3bf}.fl-builder-ui-skin--dark .fl-lightbox .fl-lightbox-header h1{color:#fff!important}.fl-builder-ui-skin--dark .fl-form-table th label{color:#a8b3bf!important}.fl-builder-ui-skin--dark .fl-builder-settings-tabs{background-color:#2c333a!important}.fl-builder-ui-skin--dark .fl-builder-settings-fields h3.fl-builder-settings-title{background:#24282e}.fl-builder-ui-skin--dark h3.fl-builder-settings-title .fl-builder-settings-title-text-wrap{color:#a8b3bf;background-color:#1b2025}.fl-builder-ui-skin--dark .fl-lightbox :not(i){color:#a7b1bb!important}.fl-builder-ui-skin--dark .fl-builder-button{color:#c6cdd6!important;fill:#c6cdd6!important}.fl-builder-ui-skin--dark .fl-builder-content-panel--button:hover,.fl-builder-ui-skin--dark .fl-builder-content-panel-button{fill:#00A0D2!important}.fl-builder-ui-skin--dark .fl-lightbox .fl-builder-button.fl-builder-button-primary{color:#fff!important}.fl-builder-ui-skin--dark .fl-color-picker-color.fl-color-picker-empty{background:#1a1b22}.fl-color-picker-color.fl-color-picker-empty .fl-color-picker-icon{fill:#6f7881}.fl-builder-ui-skin--dark .fl-color-picker-clear{background-color:#121a23}.fl-builder-ui-skin--dark .fl-color-picker-clear:hover{background-color:#373f46}.fl-builder-ui-skin--dark span.fl-builder-block-no-node-templates:hover{background:#1d2025}.fl-builder-ui-skin--dark .fl-builder-settings-tab-description{background:#1d2227}.fl-builder-ui-skin--dark .fl-builder-panel-search button svg .filled-shape{fill:#b5becb}.fl-builder-ui-skin--dark .fl-builder-custom-field,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=email],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=file],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=number],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=password],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=search],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=tel],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=text],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=url],.fl-builder-ui-skin--dark .fl-builder-settings-fields select,.fl-builder-ui-skin--dark .fl-builder-settings-fields textarea{background-color:#181b20!important}.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=email]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=file]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=number]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=password]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=search]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=tel]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=text]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=url]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields select:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields textarea:focus{border-color:#00a0d2!important;color:#fff!important}.fl-builder-ui-skin--dark .fl-builder-settings-fields select{background-image:url(../img/svg/select-arrow-down-alt2-light.svg)!important}.fl-builder-ui-skin--dark .fl-builder-custom-field select,.fl-builder-ui-skin--dark .fl-photo-field select{border-color:#7d8690!important}.fl-builder-ui-skin--dark .fl-field i.fl-field-responsive-toggle{color:#6b747d}.fl-builder-ui-skin--dark .fl-builder--main-menu-panel-view-title,.fl-builder-ui-skin--dark .fl-field i.fl-field-responsive-toggle:hover{color:#a8b3bf}.fl-builder-ui-skin--dark .fl-builder--saving-indicator{color:#858f99}.fl-builder-ui-skin--dark .fl-icons-list i:hover{background-color:#16191d;color:#fff}.fl-builder-ui-skin--dark .fl-color-picker-clear .fl-color-picker-icon-remove:after,.fl-builder-ui-skin--dark .fl-color-picker-clear .fl-color-picker-icon-remove:before{background:#6f7881}.fl-builder-ui-skin--dark .fl-builder--user-templates-section-content{border-color:#1d1d1d}.fl-builder-ui-skin--dark .fl-theme-builder-preview-select.fl-builder-button{background:0 0;border-right-color:#101215!important}.fl-builder-ui-skin--dark .fl-theme-builder-preview-select.fl-builder-button:hover{background:#181b1f}.fl-builder-ui-skin--dark .fl-theme-builder-preview-select .fl-theme-builder-preview-select-title span{color:#c6cdd6}.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu{background:#131a22;border-color:#353c43 #131a22 #131a22}.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu:before{border-bottom-color:#353c43}.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a:active,.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a:focus,.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a:hover{background:#383f46}.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a.fl-active,.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a:hover.fl-active{color:#fff!important;background:#383f46}.fl-builder-ui-skin--dark ul.as-selections{background-color:#121a23}.fl-builder-ui-skin--dark .fl-custom-query .fl-builder-settings-section{border-top:2px solid #1b2026!important}.fl-builder-ui-skin--dark div.fl-field-unit-select{background-color:#181b20!important}.fl-builder-ui-skin--dark .fl-dimension-field-units>*{border-right:1px solid #383f46}.fl-builder-ui-skin--dark .fl-field-popup-slider,.fl-builder-ui-skin--dark .fl-field-popup-slider-input .ui-slider-handle{background:#383f46}.fl-builder-ui-skin--dark .fl-field-popup-slider-arrow:after{border-bottom-color:#383f46}.fl-builder-ui-skin--dark .fl-field-popup-slider-input{background-color:#121a23}.fl-builder-ui-skin--dark .fl-unit-field-input{border-right:1px solid #383f46!important}.fl-builder-ui-skin--dark .fl-button-group-field-option[data-selected="1"]{background-color:#383f46;color:#fff}.fl-builder-ui-skin--dark .fl-button-group-field-option[data-selected="1"] i{color:#fff!important}.fl-builder-ui-skin--dark .fl-button-group-field-options{background:#181b20}.fl-builder-ui-skin--dark .fl-compound-field-section-toggle{background-color:#181b20}.fl-builder-ui-skin--dark .fl-compound-field-section-toggle:hover{background-color:#383f46}.fl-builder-ui-skin--dark .fl-compound-field-section-visible .fl-compound-field-section-toggle{border-top-color:#121a23!important;background-color:transparent}.fl-builder-ui-skin--dark .fl-field-connections-toggle i{color:#7c8590}.fl-builder-ui-skin--dark .fl-lightbox .fl-field-connection-content{background-color:#191b20!important}.fl-builder-ui-skin--dark .fl-nanoscroller>.fl-nanoscroller-pane>.fl-nanoscroller-slider{background-color:#181b20}.fl-builder-ui-skin--dark .fl-nanoscroller>.fl-nanoscroller-pane:hover>.fl-nanoscroller-slider{background-color:#5a646f}.fl-builder-ui-skin--dark .fl-nanoscroller>.fl-nanoscroller-pane.active>.fl-nanoscroller-slider{background-color:#00A0D2}.fl-builder-ui-skin--dark .fl-lightbox div.mce-panel{background:#383f46}.fl-builder-ui-skin--dark .fl-lightbox .mce-toolbar .mce-ico{color:#a7b1bb}.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button-secondary{background:#383f46;border:none;box-shadow:none}.fl-builder-ui-skin--dark .fl-lightbox .fl-builder-settings .wp-switch-editor{background:#23282d}.fl-builder-ui-skin--dark .fl-lightbox .html-active .switch-html,.fl-builder-ui-skin--dark .fl-lightbox .quicktags-toolbar,.fl-builder-ui-skin--dark .fl-lightbox .tmce-active .switch-tmce{background:#383f46}.fl-builder-ui-skin--dark .fl-lightbox textarea.wp-editor-area{background:0 0!important}.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button-secondary:focus,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button-secondary:hover,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button.focus,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button.hover,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button:focus,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button:hover{background:#191b20}
1
+ .fl-color-picker-ui{width:300px}.fl-color-picker-ui.fl-color-alpha-enabled{width:334px}.fl-color-picker-ui .iris-picker{float:left;width:100%;height:224px;display:block;position:relative;border-top:1px solid rgba(0,0,0,.1)}.fl-color-picker-ui .iris-picker .iris-square-inner,.fl-color-picker-ui .iris-picker-inner{position:absolute;left:0;top:0;bottom:0;right:0}.fl-color-picker-ui .iris-picker,.iris-picker *{box-sizing:content-box}.fl-color-picker-ui .iris-error{background-color:#ffafaf}.fl-color-picker-ui .iris-picker .iris-square{width:300px;height:200px}.fl-color-picker-ui .iris-picker .iris-palette,.fl-color-picker-ui .iris-picker .iris-slider,.fl-color-picker-ui .iris-picker .iris-square-inner{height:100%;width:12.5%}.fl-color-picker-ui .iris-picker .iris-placeholder,.fl-color-picker-ui .iris-picker .iris-square{position:relative}.fl-color-picker-ui .iris-picker .iris-square-inner{width:auto;margin:0}.fl-color-picker-ui .iris-ie-9 .iris-palette,.fl-color-picker-ui .iris-ie-9 .iris-slider,.fl-color-picker-ui .iris-ie-9 .iris-square,.fl-color-picker-ui .iris-ie-9 .iris-square-inner{box-shadow:none;border-radius:0}.fl-color-picker-ui .iris-ie-9 .iris-palette,.fl-color-picker-ui .iris-ie-9 .iris-slider,.fl-color-picker-ui .iris-ie-9 .iris-square{outline:rgba(0,0,0,.1) solid 1px}.fl-color-picker-ui .iris-ie-lt9 .iris-palette,.fl-color-picker-ui .iris-ie-lt9 .iris-slider,.fl-color-picker-ui .iris-ie-lt9 .iris-square,.fl-color-picker-ui .iris-ie-lt9 .iris-square-inner{outline:#999 solid 1px}.fl-color-picker-ui .iris-ie-lt9 .iris-square .ui-slider-handle{outline:#999 solid 1px;background-color:#fff;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"}.fl-color-picker-ui .iris-ie-lt9 .iris-square .iris-square-handle{background:0 0;border:3px solid #fff;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"}.fl-color-picker-ui .iris-picker .iris-strip{box-sizing:border-box;width:calc(300px - 12px);margin:5px 6px 6px;border-radius:4px;position:relative;height:22px;transform:rotate(180deg)}.fl-color-picker-ui .iris-picker .iris-strip .ui-slider-handle{width:6px;position:absolute;right:0;top:-2px;bottom:-2px;margin:0;border-radius:3px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.5);z-index:5;cursor:ew-resize}.fl-color-picker-ui .iris-picker .iris-strip .ui-slider-handle:focus{outline:#00a0d2 solid 2px}.fl-color-picker-ui .iris-picker .iris-slider-offset{position:absolute;top:0;left:6px;right:0;bottom:0;width:auto;height:auto;background:0 0;border:none;border-radius:0;transform:rotate(180deg)}.fl-color-picker-ui .iris-picker .iris-square-handle{background:0 0;border:5px solid #999;border-radius:50%;border-color:rgba(128,128,128,.5);box-shadow:none;width:12px;height:12px;position:absolute;left:-10px;top:-10px;cursor:move;opacity:1;z-index:10}.fl-color-picker-ui .iris-picker .ui-state-focus .iris-square-handle{opacity:.8}.fl-color-picker-ui .iris-picker .iris-square-handle:hover{border-color:#999}.fl-color-picker-ui .iris-picker .iris-square-value:focus .iris-square-handle{box-shadow:0 0 2px rgba(0,0,0,.75);opacity:.8}.fl-color-picker-ui .iris-picker .iris-square-handle:hover::after{border-color:#fff}.fl-color-picker-ui .iris-picker .iris-square-handle::after{position:absolute;bottom:-4px;right:-4px;left:-4px;top:-4px;border:3px solid #f9f9f9;border-color:rgba(255,255,255,.8);border-radius:50%;content:" "}.fl-color-picker-ui .iris-picker .iris-square-value{width:0;height:0;position:absolute}.iris-ie-lt9 .iris-square-value,.iris-mozilla .iris-square-value{width:1px;height:1px}.fl-color-picker-wrapper{position:relative;width:48px;height:32px}.fl-color-picker{box-shadow:0 2px 4px 0 rgba(0,0,0,.12);background:url(../img/transp_bg.png) #fff;border-radius:4px;width:120px;height:36px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.fl-color-picker-color{-ms-flex:1 1 100%;flex:1 1 100%;box-sizing:border-box!important;position:relative;border-radius:4px;background-color:transparent;cursor:pointer;border:2px solid transparent;padding:0;-ms-flex-pack:center;justify-content:center;display:-ms-flexbox;display:flex}.fl-color-picker-clear:hover,.fl-color-picker-color:hover{background:0 0;border:2px solid transparent}.fl-color-picker-clear:focus,.fl-color-picker-color.fl-color-picker-empty:focus,.fl-color-picker-color:focus{outline:0;top:0;border:2px solid #00a0d2;background:0 0}.fl-color-picker.fl-color-picker-has-reset .fl-color-picker-color:not(.fl-color-picker-empty){border-top-right-radius:0;border-bottom-right-radius:0}.fl-color-picker-icon{display:none;margin:auto}.fl-color-picker-color.fl-color-picker-empty{border-color:transparent}.fl-color-picker-color.fl-color-picker-empty svg.fl-color-picker-icon{display:block}.fl-color-picker-color.fl-color-picker-empty svg.fl-color-picker-icon path{fill:inherit}.fl-color-picker-clear{box-sizing:border-box;position:relative;display:-ms-flexbox;display:flex;-ms-flex:0 0 36px;flex:0 0 36px;-ms-flex-pack:center;justify-content:center;padding:0;border:2px solid transparent;fill:#A2AABE;background-color:#E7EBEF;cursor:pointer;border-radius:0 4px 4px 0}.fl-color-picker-clear:hover{fill:#6B6E75;background-color:#E7EBEF}.fl-color-picker-color.fl-color-picker-empty+.fl-color-picker-clear{display:none}.fl-color-picker-ui{display:inline-block;font-family:Helvetica,Verdana,sans-serif;z-index:1;position:fixed;overflow:hidden;padding-bottom:45px;border:1px solid rgba(0,0,0,.1);color:#999;background-color:#FAFAFA;border-radius:3px;box-shadow:0 9px 20px rgba(0,0,0,.17);transition:opacity .2s,visibility .2s;visibility:hidden;opacity:0;-webkit-transform:translate3d(0,0,0)}.fl-color-picker-ui.fl-color-picker-active{visibility:visible;opacity:1;z-index:999999}.fl-color-picker-ui .fl-color-picker-input,.fl-color-picker-ui .fl-color-picker-input:focus{width:100%;height:30px;border:none!important;font-size:14px!important;padding:0 8px;vertical-align:middle;color:#656c6e;background-color:#fff;border-radius:0;box-shadow:none}.fl-color-picker-ui .iris-square-value{transition:none}.fl-color-picker-preset-add{position:absolute;top:8px;right:8px;width:14px;height:14px;background-color:#656c6e;border-radius:50%;cursor:pointer;transition:all .2s}.fl-color-picker-preset-add:hover{background-color:#333}.fl-color-picker-preset-add:after,.fl-color-picker-preset-add:before{content:'';display:block;position:relative;background-color:#fff}.fl-color-picker-preset-add:before{top:6px;left:3px;width:8px;height:2px}.fl-color-picker-preset-add:after{left:6px;top:1px;width:2px;height:8px}.fl-color-picker-presets{position:absolute;left:0;bottom:0;width:100%;z-index:15;overflow:auto;border-top:1px solid rgba(0,0,0,.1);background-color:#FAFAFA}.fl-color-picker-presets-list .fl-color-picker-preset:hover,.fl-color-picker-presets-toggle:hover{background-color:#EDEDED}.fl-color-picker-presets-toggle{position:relative;overflow:hidden;width:100%;height:35px;text-align:center;line-height:35px;font-size:12px;font-weight:700;cursor:pointer;transition:all .1s}.fl-color-picker-presets-close-label,.fl-color-picker-presets-open-label{position:absolute;top:50%;left:50%;visibility:hidden;color:#999;transition:all .5s;transform:translate(-50%,-50%);opacity:0;width:100%}.fl-color-picker-presets-close-label.fl-color-picker-active,.fl-color-picker-presets-open-label.fl-color-picker-active{color:#656c6e;visibility:visible;opacity:1;z-index:999999}.fl-color-picker-presets-list{width:100%;list-style:none;margin:0;padding:0;overflow:auto}.fl-color-picker-presets-list .fl-color-picker-no-preset,.fl-color-picker-presets-list .fl-color-picker-preset{position:relative;padding:5px;font-size:12px;border-top:1px solid rgba(0,0,0,.1);transition:all .1s}.fl-color-picker-presets-list .fl-color-picker-no-preset{padding:18px 5px;text-align:center}.fl-color-picker-presets-list .fl-color-picker-preset-color{display:inline-block;width:40px;height:20px;margin-right:3px;vertical-align:middle;border:1px solid rgba(0,0,0,.1);border-radius:2px;cursor:pointer}.fl-color-picker-presets-list .fl-color-picker-preset-label{vertical-align:middle;color:#333;cursor:pointer}.fl-color-picker-presets-list .fl-color-picker-preset-remove{position:absolute;top:50%;cursor:pointer;transform:translateY(-50%)}.fl-color-picker-clear .fl-color-picker-icon-remove{right:auto;top:auto;margin:auto}.fl-color-picker-presets-list .fl-color-picker-preset-remove{right:5px}.fl-color-picker-presets-list .fl-color-picker-preset-remove:hover:after,.fl-color-picker-presets-list .fl-color-picker-preset-remove:hover:before{background-color:#333}.fl-color-picker-added{position:absolute;width:100%;top:0;left:0;right:0;bottom:35px;z-index:10;color:#fff;text-align:center;background-color:rgba(0,0,0,.8)}.fl-color-picker-added-text{position:absolute;top:50%;left:50%;width:80%;font-size:14px;color:#fff!important;transform:translate(-50%,-50%)}.fl-color-picker-icon-check{position:relative;width:50px;height:50px;margin:5px auto}.fl-color-picker-icon-check:before{content:'';display:block;position:relative;width:15px;height:30px;margin-left:14px;border:7px solid #fff;border-left:none;border-top:none;transform:rotate(45deg)}.fl-color-picker-icon-arrow-down,.fl-color-picker-icon-arrow-up{display:inline-block;position:relative;width:10px;height:10px;margin-left:5px}.fl-color-picker-icon-arrow-down:before,.fl-color-picker-icon-arrow-up:before{content:'';display:block;position:relative;width:6px;height:6px;border:2px solid #999;border-left:none;border-top:none;transform:rotate(45deg)}.fl-color-picker-icon-arrow-up{top:2px;transform:rotate(180deg)}.fl-color-picker-icon-remove{width:15px;height:15px}.fl-color-picker-icon-remove:after,.fl-color-picker-icon-remove:before{content:'';display:block;position:relative;background-color:#6f7881}.fl-color-picker-icon-remove:before{left:6px;width:2px;height:10px;margin-top:3px;transform:rotate(-45deg)}.fl-color-picker-icon-remove:after{left:6px;width:2px;height:10px;margin-top:-10px;transform:rotate(45deg)}.fl-alpha-wrap{position:absolute;width:32px;height:215px;padding:0 5px;right:4px;border-top:none}.fl-alpha-slider{height:190px;position:absolute;top:12px;width:28px}.fl-alpha-slider .ui-slider-handle{background:rgba(0,0,0,0);border-color:#aaa;border-radius:4px;border-style:solid;border-width:4px;box-shadow:0 1px 2px rgba(0,0,0,.2);-moz-box-shadow:0 1px 2px rgba(0,0,0,.2);-webkit-box-shadow:0 1px 2px rgba(0,0,0,.2);cursor:ns-resize;height:12px;left:0;opacity:.9;position:absolute;right:0;width:30px;z-index:14}.fl-alpha-slider .ui-slider-handle:before{content:" ";position:absolute;left:-2px;right:-2px;top:-3px;bottom:-3px;border:2px solid #fff;border-radius:3px}.fl-theme-builder-preview-select-title i:before,body .fl-theme-builder-preview-select .fa-caret-down i:before,body .fl-theme-builder-preview-select-item-title i:before{content:"\f078"}.fl-alpha-slider-offset{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAASCAYAAAAe/ZHXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NkNEQUQ0ODM4RUE0MTFFNEExOEJFN0E5M0VFOTg0QUQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NkNEQUQ0ODQ4RUE0MTFFNEExOEJFN0E5M0VFOTg0QUQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2Q0RBRDQ4MThFQTQxMUU0QTE4QkU3QTkzRUU5ODRBRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo2Q0RBRDQ4MjhFQTQxMUU0QTE4QkU3QTkzRUU5ODRBRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/r/N8AAAWYSURBVHjarFvvR3VBEN45JZGIPkREHyIiIhJJf3qUSERE9CGiDxERkcg9z9u92uucvTszz5z7xnHPj93Z2d359cxscn5+jpTS+EoiMr3/+51cZ2dn4+e29i2/u7y8RKf/pO3vc+o+n5ycoNK31+f6+jrfZ37yuG2mf3R01H3fa5N/b29vU6dP5qft0G4PDg5MGuPr/v4+jz1t27mfvN/b21P75+fHx8eZfiV/Ozs7rUJnSu/5+RlFv+m6ZJpbW1s1PnrvXl9fZ/qX89zY2LB4mfy+v7/nsdV1XltbK/dr5vnz87OcV5bJabuVlRVLBifjfX9/l/xkGtM+S0tLNXnu0szfU/P3IMn/k0678h6ddqjQFGccVL6hoCsVfsq+NZ5QtCv5rfFS41sq37W+UPhMyhxEWTetvce3NR8oewqD39qalXuGAK/WPltjajIC4x2c9Ye1f43SGcqGwRBeTZjhMNntL4pCWZMQYhE05RVl02EovRgC4RkCbUNSQAGhGB/GsKG4h6FQoigDa2i8fRBy3uLMXYIG3Vr3aZvRaCRdBYlYIMZywhBGCVhgzzOlgRuUSOvC0GMEWxOM/+EtQFh1OIIXtfwg1tRaayGjg5px0jyZKEaTle3e+AsLCygVRAh3FlEgKbReE3oYGj9EgIR00QiEgKw3ZBQbRGjBeAMtDETQmHiKDsezJNLgCTFGItZXlAgCSiQggblP+9c8SDI0lXWlFv5g3K63KZ51FOcZzthQ3LomoNHwJmKIQISI3vqzSpwIQ8liSjGMFQjDpoVgaQ6cWgvLhOC7qiAwiHrWbEg4JMSmeUrBuHoYwioOQNXmhmAcrs096s1gJCGi3hSEVU8DQxYElYHhKwUUGAa+NqOBMsSSAQJuhQhCAH4vxozExsxiihPuaIrjCVYKWlYEsjSM52G8Kxxryngl5j0j+EyGTIiED4s1Itm0ZGWxMFCLJaBAcEI6OBkmFgNBoc8Cait2ZnENE/6wQN8LJSJeSMNAjKVm+LUMAIt3PR5AQgIGp1Z5zxhE8PtXUYReYeXi4mKmOPNXBMzt2tPT07LIUtJqr66uusXEbkFnWiQ6Pj72ikrtzc1NKopuvbbj58PDwxqNHp27u7tuYWumUDV+v7+/Xyu6pc59+/DwUCsC9ujt7u6qRbt8//T01C3elbyN70fb29uZ/1FSincvLy/lPGb42tzc9IqJeHt7q61Pr2C6vr7u7tfHx8fMPhV0sLq6WhZtU0n36+uru8elPE7aLi8v1wqJPXn++fmZKYgX8ozFxcXJb0NaQTHClZT8+gBjsYdaFc+zWcUkGTCWENY66ta92oSVzo3WI6IZKGtukeyfBLFKBNAj6bUOBgaoe9wE4n04IBNkLMoC7+Skj630ZlTJMYdyMsU2T8AwpzALkVFilZgJcT2l9PCWDDSAMBSjVlJgZNk0lE1AIby0qCiCnBQNj6aBGQslZIZJ5hB6D/AzQHto5Z9Nk8tARdN4q2ExBnsyIJ311EymShyjan2rKk0zh1Ay1oQVWAZQRnkUA8RFw7TahjBnmNgMVMQrsCGZJezRtGlU0cUZ1zuaxGZPpbhApM+ZpFQqQ6xadoMtBrEKpBVo4GRXvNSxpaRixKiR+TChCYhsDwZkfFj8IkErjAHejcUI0XQrgwehhNSMHAz21E0wZ23FcCAmj8Sd/PXy2xLYLAuwRw4IMsqjFaWYOpMEhDySAPFCWyFkgAHrEcA+BNeJ4UE8HCzJPpCrerUmQIx1pWJkjqxJD8EikUo2c5aI8ZYgsAkM4WQtnHd0ns0ORgVTBghy5ISy928SGsbTMqYg523RUY8oNYG4FIYiyRyZCnFCJC87IoRAIMVOqQ7BKexxCS2hYVl9JhvlpYjnAe4MhmRPMWhhvLfXINaI9WKM0Zu0+SfAAFLE1EgfVSv7AAAAAElFTkSuQmCC) center;box-shadow:0 0 5px rgba(0,0,0,.4) inset;-moz-box-shadow:0 0 5px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 5px rgba(0,0,0,.4) inset;width:200px;height:22px;transform:rotate(-90deg);bottom:48%;left:-80px;position:absolute}.fl-alpha-text{width:30px;font-size:12px;text-align:center;color:#999;position:absolute;bottom:-5px}.fl-lightbox-mask,.fl-lightbox-wrap{bottom:0;left:0;position:fixed;right:0;z-index:100010}@keyframes fl-lightbox-zoom{from{transform:scale(.4)}to{transform:scale(1)}}.fl-lightbox-wrap{display:none;overflow:auto;padding:0;top:43px;-webkit-backface-visibility:hidden;-webkit-transform:translateZ(0);pointer-events:none}.fl-builder-draggable-is-dragging .fl-lightbox-wrap,.fl-builder-resizable-is-resizing .fl-lightbox-wrap,.fl-lightbox,.fl-lightbox-mask{pointer-events:auto}.fl-lightbox-mask{background:#000;opacity:.7;filter:alpha(opacity=70);top:0}.fl-lightbox{background:#F5F7F9;border-radius:4px;box-shadow:rgba(0,0,0,1) 0 4px 30px;-moz-box-shadow:rgba(0,0,0,1) 0 4px 30px;-webkit-box-shadow:rgba(0,0,0,1) 0 4px 30px;position:relative;display:-ms-flexbox;display:flex;z-index:100011;transform-origin:center;animation-name:fl-lightbox-zoom;animation-duration:.25s}.fl-lightbox.fl-lightbox-prevent-animation{animation-duration:0s;-moz-animation-duration:0s;-webkit-animation-duration:0s;-o-animation-duration:0s}.fl-lightbox :not(i){color:#333;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:12px;line-height:14px;text-decoration:none;text-transform:none}.fl-lightbox *,.fl-lightbox :after,.fl-lightbox :before{box-sizing:content-box}#fl-ui-root .fl-nanoscroller-pane,.fl-builder--content-library-panel .fl-nanoscroller-pane,.fl-lightbox .fl-nanoscroller-pane{bottom:2px;right:2px;width:6px}.fl-nanoscroller>.fl-nanoscroller-pane>.fl-nanoscroller-slider{background-color:#bac0ca;transition-property:height,background-color;transition-duration:.25s}#wpadminbar,html{transition-duration:.35s}.fl-nanoscroller>.fl-nanoscroller-pane>.fl-nanoscroller-slider:hover{background-color:#c8cdd4}.fl-nanoscroller>.fl-nanoscroller-pane.active>.fl-nanoscroller-slider{background-color:#029fd2}.fl-lightbox .fa{font-family:FontAwesome!important}.fl-lightbox .dashicons{font-family:dashicons}.fl-lightbox.ui-draggable{box-shadow:rgba(0,0,0,.2) 0 7px 30px;-moz-box-shadow:rgba(0,0,0,.2) 0 7px 30px;-webkit-box-shadow:rgba(0,0,0,.2) 0 7px 30px}#wpadminbar,.fl-builder-bar.is-hidden{pointer-events:none}.fl-lightbox-resizable{height:500px;width:380px}@media (max-width:500px){.fl-lightbox-resizable{left:0!important;right:0!important;top:0!important;height:100%!important;width:100%!important}.fl-lightbox-resizable .ui-resizable-handle{display:none!important}.fl-lightbox.ui-draggable .fl-lightbox-header{cursor:default!important}.fl-lightbox-controls{display:none}}.fl-lightbox-width-full{left:0!important;right:0!important;top:0!important;height:100%!important;width:100%!important}.fl-lightbox-width-full .fl-lightbox-header{cursor:inherit!important}.fl-lightbox-controls{position:absolute;right:10px;top:10px;z-index:5}.fl-lightbox-controls .fa{color:#bdbdbd;font-size:14px;padding:5px}.fl-lightbox-controls .fa:hover{color:#aaa;cursor:pointer}.fl-lightbox-header-wrap{border-top-left-radius:4px;border-top-right-radius:4px}.fl-lightbox-header{position:relative}.fl-lightbox-header h1{color:#333!important;font-size:16px!important;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important;font-weight:400!important;margin:0!important;padding:14px 34px 15px 28px!important;text-align:left!important;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center;line-height:1}.fl-lightbox.ui-draggable .fl-lightbox-header{cursor:move}.fl-lightbox-header h1 .fl-builder-badge{margin-left:10px;color:#fff;background-color:#F7A408}.fl-lightbox-content,.fl-lightbox-content-wrap{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:1 100%;flex:1 100%;max-width:100%}.fl-lightbox-footer{box-sizing:border-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:end;justify-content:flex-end;-ms-flex:0 0;flex:0 0;-ms-flex-preferred-size:44px;flex-basis:44px;padding:4px;text-align:right}.fl-lightbox-footer .fl-builder-button{height:36px;margin-left:5px!important;-ms-flex:0 0 0%;flex:0 0 0%;-ms-flex-pack:center;justify-content:center}.fl-lightbox-width-slim .fl-lightbox-footer{-ms-flex-pack:stretch;justify-content:stretch;padding:4px 5px}.fl-lightbox-width-slim .fl-lightbox-footer .fl-builder-button{-ms-flex:1 1 100%;flex:1 1 100%;display:block;text-align:center}.fl-lightbox-width-slim .fl-lightbox-footer .fl-builder-button:first-child{margin-left:0!important}.fl-lightbox table,.fl-lightbox td,.fl-lightbox th,.fl-lightbox tr{border:none}.fl-lightbox-wrap.fl-icon-selector{z-index:1000111}.fl-icon-selector .fl-lightbox{height:100%}.fl-icons-filter{height:auto!important;margin:0!important;position:absolute!important;right:0;top:0;padding:10px 16px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.fl-icons-filter select{vertical-align:middle;width:195px;-webkit-appearance:none;-moz-appearance:none;appearance:none;box-sizing:border-box;color:#000;border:2px solid #e4e7ea!important;border-right:none!important;margin:0;padding:2px 10px;background:url(../img/svg/select-arrow-down-alt2.svg) center right 10px no-repeat #fff!important;-ms-flex:1 1 195px;flex:1 1 195px;border-radius:0}.fl-icons-filter input[type=text]{line-height:18px;vertical-align:middle;width:160px;-ms-flex:1 1 160px;flex:1 1 160px;border:2px solid #e4e7ea!important;border-radius:0!important;padding:2px 10px!important}.fl-icons-filter input[type=text]:focus,.fl-icons-filter select:focus{border:2px solid #00A0D2!important}.fl-icons-list{bottom:52px;left:0;overflow:auto;padding:20px;position:absolute;right:0;top:48px}.fl-icons-list::-webkit-scrollbar{background-color:#ccc;-webkit-appearance:none;width:10px}.fl-icons-list::-webkit-scrollbar-thumb{background-color:#666;border:1px solid #ccc}.fl-icons-section{text-align:center}.fl-icons-section h2{border-bottom:1px solid #dfdfdf;color:#333!important;font-family:Helvetica,Verdana,sans-serif!important;font-size:16px!important;font-weight:700!important;margin:0 0 20px!important;padding:0 0 10px!important;text-align:left}.fl-icons-list i,.fl-icons-list i:before{cursor:pointer;display:inline-block;font-size:40px;height:100px;line-height:100px;width:100px;background:0 0}.fl-icons-list i:hover{background:#fff;box-shadow:0 10px 20px rgba(0,0,0,.15);border-radius:4px}.fl-icon-selector-footer{bottom:0;left:0;position:absolute;right:0}html{transition-property:margin}html.fl-builder-is-showing-toolbar{margin-top:calc(44px + 1px)!important}.fl-builder-edit body{position:static!important}.fl-builder-edit:after,.fl-builder-edit:before{z-index:0!important}.fl-builder-edit .fl-builder-content{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none}#wpadminbar{transition-property:transform,opacity;transform-origin:bottom;transform-style:preserve-3d;transform:rotateX(89deg) translateY(46px);opacity:0;will-change:transform}html.fl-builder-show-admin-bar{margin-top:32px}html.fl-builder-show-admin-bar #wpadminbar{transform:rotateX(0) translateY(0);pointer-events:auto;opacity:1}@media screen and (max-width:782px){html.fl-builder-show-admin-bar{margin-top:46px}}.fl-clear{clear:both}.screen-reader-text{position:absolute;left:-1000em;top:-1000em;height:1px;width:1px;overflow:hidden}.fl-builder-loading{background:url(../img/ajax-loader.svg) center center no-repeat rgba(240,240,240,.8);bottom:0;display:none;left:0;position:fixed;right:0;text-align:center;top:0;z-index:12000000}.fl-builder-settings .fl-builder-loading{background:url(../img/ajax-loader.svg) center center no-repeat rgba(255,255,255,.8);display:block;position:absolute}.fl-field-loader{color:#B3B3B3!important;font-style:italic}.fl-builder-node-loading{opacity:.35!important}.fl-builder-node-loading-placeholder{background:url(../img/ajax-loader.svg) center center no-repeat;height:50px}.fl-col-group-has-child-loading{display:-ms-flexbox;display:flex}.fl-col-group-has-child-loading>.fl-builder-node-loading-placeholder{width:50px}.fl-node-hidden{display:none}.fl-builder-edit .fl-node-hidden{display:block}html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-desktop,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-desktop-medium,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-medium,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-medium-mobile,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-visible-mobile{display:block!important}html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-desktop,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-desktop-medium,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-medium,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-medium-mobile,html:not(.fl-responsive-preview-enabled) .fl-builder-content-editing .fl-col-group-equal-height .fl-col.fl-visible-mobile{display:-ms-flexbox!important;display:flex!important}.fl-responsive-preview-enabled body{overflow:hidden!important}.fl-responsive-preview-mask{background:#F7F7F7;bottom:0;left:0;position:fixed;right:0;top:0;z-index:99999}.fl-responsive-preview{bottom:0;left:0;position:fixed;right:0;top:0;margin-top:50px;z-index:100000}.fl-builder-preview .fl-responsive-preview{margin:0!important}.fl-responsive-preview-content{background:#F5F7F9;padding:20px 20px 45px;overflow:scroll;position:absolute;top:45px;right:0;bottom:0;left:0}.fl-responsive-preview-content .fl-builder-content-editing{overflow:visible!important}.fl-responsive-preview-message{background:#F5F7F9;color:#b3b3b3;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important;font-size:14px;font-weight:400;padding:15px;text-align:center;position:absolute;top:0;left:0;right:0;z-index:999999}.fl-responsive-preview-message span{display:inline-block;margin-right:8px}.fl-responsive-preview-message .fl-builder-button{display:inline-block;margin-left:2px;padding:0 10px}.fl-responsive-preview-message .fl-builder-button i{font-size:14px;height:14px;width:14px}.fl-responsive-preview .fl-builder-content{box-shadow:0 0 8px rgba(0,0,0,.2);margin-left:auto;margin-right:auto;max-width:100%;overflow:visible;position:relative}#fl-builder-preview-frame,#fl-builder-preview-mask{bottom:0;height:100%;position:fixed;top:0;width:100%;right:0}.fl-responsive-preview .fl-block-col-resize{display:none}.fl-builder-button,body .fl-builder-bar .fl-builder-bar-content{display:-ms-flexbox;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important}#fl-builder-preview-mask{background:url(../img/ajax-loader.svg) center center no-repeat #F7F7F7;left:0;z-index:999999}#fl-builder-preview-frame{left:50%;transform:translateX(-50%);-moz-transform:translateX(-50%);-webkit-transform:translateX(-50%);z-index:1000000}body button[class*=fl-builder],body button[class*=fl-builder]:focus,body button[class*=fl-builder]:hover{box-shadow:none;max-height:none;max-width:none;text-decoration:none;text-indent:0;text-shadow:none;text-transform:none}.fl-builder-button{-webkit-appearance:none;-ms-flex-align:center;align-items:center;background:#e7ebef;border:2px solid transparent;border-radius:3px;-webkit-border-radius:3px;box-sizing:border-box!important;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;color:#676F7A!important;cursor:pointer;display:flex;fill:#676F7A!important;font-size:14px!important;font-style:normal!important;font-weight:500!important;height:33px;letter-spacing:normal!important;line-height:1!important;margin:0;padding:0 12px;text-align:center;transition-property:background-color,width;transition-duration:.2s;white-space:nowrap;width:auto;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fl-builder--search-results-panel,.fl-builder-bar,.fl-builder-panel{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-touch-callout:none}.fl-builder-button:hover{background:#dadfe5;color:#222;border:2px solid transparent!important}.fl-builder-button:active{background:#DCDCDC}button.fl-builder-button:focus{position:static;top:auto;outline:0;background:#E4E7EA;border:2px solid #00A0D0!important}.fl-builder-bar .fl-builder-button{height:auto}.fl-builder-button-primary,body.fl-builder--layout-has-drafted-changes .fl-builder-done-button{background:#00A0D2;color:#fff!important;text-decoration:none;border:2px solid transparent!important}.fl-builder-button.fl-builder-button-primary:focus,body.fl-builder--layout-has-drafted-changes .fl-builder-button.fl-builder-done-button:focus{background:#00A0D2;border:2px solid #ffc217!important}.fl-builder-button-primary:hover,body.fl-builder--layout-has-drafted-changes .fl-builder-done-button:hover{background:#0197C6;color:#fff!important}.fl-builder-button-primary:active,body.fl-builder--layout-has-drafted-changes .fl-builder-done-button:active{background:#0484AC}.fl-builder-button-large{height:30px}.fl-builder-button-small{font-size:11px!important;line-height:1!important}.fl-builder-help-button{color:#b3b3b3;font-size:16px!important}.fl-builder-help-button i{position:relative;top:-1px}.fl-builder-help-button:hover{color:#666}.fl-builder-publish-button{line-height:45px!important}.fl-builder-content-panel-button,.fl-builder-content-panel-button:hover{fill:#00A0D2!important;font-size:30px!important;padding-bottom:4px}.fl-builder-button-silent,.fl-builder-button-silent:hover{padding:0 12px;background:0 0!important;border:2px solid transparent!important;box-shadow:none!important}.fl-builder-done-button,.fl-builder-done-button:hover{font-weight:600}.fl-field .fl-builder-button{display:inline-block;height:auto;padding:11px 12px;vertical-align:middle;box-shadow:0 2px 4px 0 rgba(0,0,0,.12)}.fl-builder-badge{background:#333;border-radius:2px;color:#fff!important;display:inline;font-size:11px!important;font-weight:400;letter-spacing:1px;margin-left:2px;padding:2px 4px;vertical-align:middle}.fl-builder-badge-global{background:#ff9600;transform:translateY(0);transition-duration:.25s;transition-property:transform}.fl-builder-blocks-node-template .fl-builder-badge-global{position:absolute;right:0;top:0}.fl-builder-block:hover .fl-builder-badge-global{display:none}.fl-builder-bar{left:0;position:fixed;right:0;top:0;z-index:999999;user-select:none;transition-property:transform opacity;transition-duration:.35s;transform-style:preserve-3d;perspective:1100px}.fl-builder-bar.is-hidden .fl-builder-bar-content{transform:translateY(-100%) rotateX(90deg)}body .fl-builder-bar .fl-builder-bar-content{display:flex;box-sizing:border-box;background:#fff;border-bottom:1px solid #eceef1;color:#999;font-size:14px!important;height:calc(44px + 1px);transition-property:background-color,opacity,transform;transition-duration:.35s;pointer-events:auto}.fl-builder-draggable-is-dragging .fl-builder-content,.fl-builder-draggable-is-dragging .fl-builder-panel .fl-lightbox,.fl-builder-resizable-is-resizing .fl-builder-content,.fl-builder-resizable-is-resizing .fl-builder-panel .fl-lightbox,body .fl-builder-bar .fl-builder-bar-content.is-muted{pointer-events:none}body .fl-builder-bar .fl-builder-bar-content.is-muted>:not(.fl-builder-publish-actions){-webkit-filter:saturate(20%) blur(1px);filter:saturate(20%) blur(1px);opacity:.4}.fl-builder-bar-title{box-sizing:border-box;color:#333;display:-ms-flexbox;display:flex;-ms-flex:0 0 380px;flex:0 0 380px;max-width:380px;border-right:1px solid #eceef1;cursor:pointer}.fl-builder-bar-title:hover{background:#fff}.fl-builder-bar-title.is-showing-menu .fl-builder-bar-title-caret>svg{transform:rotate(180deg)}.fl-builder-simple .fl-builder-bar-title{cursor:auto}.fl-builder-simple .fl-builder-bar-title:hover{cursor:auto;background:0 0}.fl-builder-bar-title span{vertical-align:middle}.fl-builder-bar-title-icon{box-sizing:border-box;background:0 0;-ms-flex:0 0 46px;flex:0 0 46px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:4px}.fl-builder-bar-title-icon img{max-width:100%!important;height:auto!important}.fl-builder-bar-title.fl-builder-bar-title-no-icon{padding-left:12px}.fl-builder-bar-title-area{box-sizing:border-box;-ms-flex:1 1 100%;flex:1 1 100%;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;overflow:hidden;padding:4px}.fl-builder-layout-title,.fl-theme-builder-preview-select .fl-theme-builder-preview-select-title span{font-size:16px;font-weight:400;line-height:1.3;color:#161B20;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.fl-builder-bar-title-caret,.fl-builder-layout-pretitle,.fl-theme-builder-preview-select .fl-theme-builder-preview-select-title{font-size:12px;font-weight:500;line-height:1.3;color:#656d77;text-align:left;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.fl-builder-bar-title-caret i,.fl-theme-builder-preview-select-title i{color:inherit!important;font-size:14px}.fl-builder-bar-title-caret{margin-left:auto!important;-ms-flex:0 0 46px;flex:0 0 46px}.fl-theme-builder-preview-select-title i{padding:12px}.fl-theme-builder-preview-select.fl-builder-button{position:relative;border-radius:0;background:0 0;min-width:0;display:-ms-flexbox;display:flex;-ms-flex:0 0 360px;flex:0 0 360px;max-width:360px;margin:0!important;padding:4px 10px;border:none!important;border-right:2px solid #d5dadd!important;box-shadow:none}.fl-theme-builder-preview-select.fl-builder-button:hover{border:none!important;border-right:2px solid #d5dadd!important}.fl-theme-builder-preview-select .fl-theme-builder-preview-select-title{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-pack:end;justify-content:flex-end;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.fl-theme-builder-preview-select-title div{-ms-flex:1;flex:1}.fl-theme-builder-preview-select .fl-theme-builder-preview-select-title span{display:block}.fl-theme-builder-preview-select-open .fl-theme-builder-preview-select-items{position:absolute;top:calc(48px + 10px);left:10px;width:calc(100% - 20px)!important;background:#fff;border-radius:4px;border:2px solid #D5DADD;border-top:3px solid #00a0d2;box-shadow:0 15px 45px 8px rgba(0,0,0,.04);margin:0!important;padding:0;z-index:-1;font-size:16px;overflow:visible;height:auto!important;max-height:calc(100vh - 66px);min-height:300px;display:-ms-flexbox!important;display:flex!important;-ms-flex-direction:column;flex-direction:column}.fl-theme-builder-preview-select-item{padding:4px 0!important;border-bottom:none!important;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;text-align:initial}.fl-theme-builder-preview-select-item:hover{text-decoration:none;color:#111;background:0 0!important}body .fl-theme-builder-preview-select .fa-caret-down{float:none}body .fl-theme-builder-preview-select-item-title{padding:10px 15px;color:#222;font-size:14px}body .fl-theme-builder-preview-select-item-children{overflow:auto}body .fl-theme-builder-preview-select-item-child{overflow:hidden;text-overflow:ellipsis;line-height:1.1;margin:0 10px;border:2px solid transparent;border-radius:4px;padding:8px 10px 10px;font-size:14px;font-weight:400;color:#222}body .fl-theme-builder-preview-select-item-child:hover{background:#e6eaed!important}.fl-theme-builder-preview-select-item .fa-caret-down{color:#606D77}.fl-builder-bar-actions{display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-ms-flex:1 1 100%;flex:1 1 100%;padding:4px}.fl-builder-bar .fl-builder-button{margin:0 0 0 4px}.fl-builder-bar-actions .fl-builder-button:last-child{margin:0}.fl-builder-bar-actions:after{clear:both}.fl-builder-bar .fl-builder-content-panel-button{-ms-flex-align:baseline!important;align-items:baseline!important;padding-top:1px;font-weight:400}.fl-builder-content-panel-button svg{transition-property:transform;transition-duration:.25s;transform:rotate(0) scale(1);transform-origin:center}.fl-builder-content-panel-is-showing .fl-builder-content-panel-button svg{transform:rotate(135deg) scale(1.1) translate(.5px,-.5px)}.fl-builder--saving-indicator{cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-item-align:center;align-self:center;padding:0 10px;font-size:12px;font-style:italic;color:#676f7a;-ms-flex-align:center;align-items:center;line-height:1.2;min-width:180px;-ms-flex-pack:end;justify-content:flex-end}.fl-builder--saving-indicator:hover{color:#676f7a}.fl-builder--saving-indicator .fa-question-circle{font-size:13px;margin:3px 0 3px 5px}.fl-builder-buy-button,.fl-builder-feedback-button,.fl-builder-upgrade-button{background:#F7A407;color:#fff!important;text-decoration:none}.fl-builder-buy-button i.fa-external-link-alt,.fl-builder-feedback-button i.fa-external-link-alt,.fl-builder-upgrade-button i.fa-external-link-alt{color:#FFC733;margin:0 0 0 6px}.fl-builder-buy-button:hover,.fl-builder-feedback-button:hover,.fl-builder-upgrade-button:hover{background:#EE8E0D;color:#fff!important}@media (max-width:980px){.fl-builder--main-menu-panel{width:calc(100% - 20px)!important}.fl-builder--main-menu-panel:before{right:auto;left:20px}.fl-builder-bar-title,.fl-theme-builder-preview-select{-ms-flex:1 .5 380px!important;flex:1 .5 380px!important}}@media (max-width:620px){.fl-theme-builder-preview-select.fl-builder-button{display:none}}@media (max-width:500px){#fl-builder-toggle-notifications,.fl-builder--main-menu-panel:before,.fl-builder--panel-arrow,.fl-builder-bar-title-area,.fl-builder-panel-drag-handle,.fl-builder-panel:before{display:none}.fl-builder--main-menu-panel,.fl-builder-panel{width:auto!important;top:44px!important;left:0!important;right:0!important;bottom:0!important;border-radius:0!important;box-shadow:none!important}.fl-builder--main-menu-panel{border-left:transparent!important;border-right:transparent!important;border-bottom:transparent!important;max-height:calc(100% - 44px)!important}.fl-builder-bar-title{-ms-flex:0 0 80px!important;flex:0 0 80px!important}.fl-builder-bar-title-caret{padding-left:0;padding-right:0;max-width:24px}.fl-builder-bar-actions{max-width:calc(100% - 80px);overflow:hidden}.fl-builder--panel-header{border-radius:0!important;cursor:default!important}.fl-builder--panel-header .fl-builder--tabs{cursor:default!important}.fl-builder-publish-actions{width:100%!important;padding-left:4px!important}.fl-builder-bar-actions .fl-builder-button{padding:0 8px!important}}.fl-builder--preview-actions{display:none;position:fixed;top:4px;left:4px;z-index:10000001;padding:4px;-ms-flex-pack:center;justify-content:center;background:#fff;border-radius:4px}.fl-builder-preview .fl-builder--preview-actions{display:-ms-flexbox;display:flex}.fl-builder--preview-actions .device-icons{color:#555;background:#e4e4e4;border:none!important;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;text-decoration:none;font-size:14px!important;line-height:1!important;margin:0 4px 0 0;padding:0 6px;cursor:pointer;-webkit-border-radius:3px;-webkit-appearance:none;border-radius:3px}.fl-builder--preview-actions .device-icons i{margin:0 6px}@keyframes fl-builder-ui-pin-zone-pulse{0%,100%{opacity:1;filter:alpha( opacity=1 )}50%{opacity:.5;filter:alpha( opacity=35 )}}.fl-builder-ui-pin-zone{animation:fl-builder-ui-pin-zone-pulse 2s infinite;transition:width .3s ease;background:rgba(0,160,210,.5);bottom:0;top:0;position:fixed;width:35px;z-index:100001}.fl-builder-ui-show-pin-zone-left .fl-builder-ui-pin-zone-left,.fl-builder-ui-show-pin-zone-right .fl-builder-ui-pin-zone-right{width:75px}.fl-builder-ui-pin-zone-left{left:0}.fl-builder-ui-pin-zone-right{right:0}.fl-builder-content-panel-pin-zone .fl-builder-content-panel-button{display:-ms-flexbox!important;display:flex!important;background:rgba(0,160,210,.5)!important;padding:2px 4px;width:80px;animation:fl-builder-ui-pin-zone-pulse 2s infinite}.fl-builder-content-panel-pin-zone .fl-builder-content-panel-button svg{display:none}.fl-builder-content-panel-pin-zone-hover .fl-builder-content-panel-button{width:120px}.fl-builder-content-panel-pin-zone-hover .fl-builder-content-panel-button svg{display:none!important;width:100%;transform:none!important;fill:#00A0D2!important;border-radius:3px}.fl-builder-ui-is-pinned .fl-builder-content-panel-button,.fl-builder-ui-pinned-container .fl-lightbox-controls{display:none}.fl-builder-content-panel-pin-zone .fl-builder-done-button{-webkit-filter:grayscale(100%);filter:grayscale(100%)}.fl-builder-panel.fl-builder-ui-pinned{top:45px!important;bottom:0!important;height:auto!important;border-radius:0;border:none;box-shadow:none;animation-duration:0s;-moz-animation-duration:0s;-webkit-animation-duration:0s;-o-animation-duration:0s;z-index:11}.fl-builder-panel.fl-builder-ui-pinned-right{left:auto!important;right:0;border-left:1px solid #eceef1}.fl-builder-panel.fl-builder-ui-pinned-left{left:0;right:auto;border-right:1px solid #eceef1}.fl-builder-panel.fl-builder-ui-pinned .fl-builder--panel-header{border-radius:0!important}.fl-builder-ui-pinned-container .fl-lightbox-wrap{position:absolute;z-index:11}.fl-builder-ui-pinned-container .fl-lightbox{position:absolute;top:0;bottom:0;left:0;right:0;width:auto!important;height:auto;border-radius:0;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none;animation-duration:0s;-moz-animation-duration:0s;-webkit-animation-duration:0s;-o-animation-duration:0s}.fl-builder-ui-pinned-container .fl-lightbox-header-wrap{border-radius:0}.fl-builder-ui-pinned-container .fl-lightbox.ui-draggable .fl-lightbox-header{cursor:auto}.fl-builder-ui-pinned-container .fl-lightbox-header h1{padding:12px 20px 10px!important}.fl-builder-ui-pinned-content-transform{transform:scale(1);transform-origin:center top 0}.fl-builder-ui-pinned-collapse{cursor:pointer;display:none;position:absolute!important;bottom:2px;padding:5px;border:2px solid transparent;background:0 0;width:36px;height:36px;border-radius:4px;fill:#778794;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center}.fl-builder-ui-pinned-collapse:focus,.fl-builder-ui-pinned-collapse:hover{top:auto!important;background:0 0;border:2px solid transparent;outline:0;fill:#00A0D2}.fl-builder-ui-pinned-collapse:focus{background:#E4E7EA}.fl-builder-ui-pinned-collapse>*{margin:auto;line-height:1}.fl-builder-ui-pinned-collapse svg g{fill:inherit}.fl-builder-ui-is-pinned-right .fl-builder-ui-pinned-right-collapse{display:-ms-flexbox;display:flex;left:-40px}.fl-builder-ui-is-pinned-left .fl-builder-ui-pinned-left-collapse{display:-ms-flexbox;display:flex;right:-40px}.fl-builder-ui-pinned-collapse i[data-toggle=show],.fl-builder-ui-pinned-is-collapsed i[data-toggle=hide]{display:none}.fl-builder-ui-pinned-is-collapsed i[data-toggle=show]{display:block}.fl-builder--panel-no-settings,.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-builder--panel-content,.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-builder--panel-controls,.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-builder--tab-wrap,.fl-builder-ui-pinned-is-collapsed .fl-builder--panel-header{display:none}.fl-builder-ui-is-pinned-left [data-toggle=hide],.fl-builder-ui-is-pinned-right [data-toggle=show]{transform:rotateY(180deg)}.fl-builder-ui-pinned-is-collapsed .fl-lightbox{box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none}.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-builder--panel-header{background:0 0;border:none;z-index:10}.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-lightbox-wrap{top:0}.fl-builder-simple-pinned .fl-builder--content-library-panel .fl-lightbox-header h1{padding:14px 28px 15px!important}.fl-builder-simple-pinned .fl-builder--panel-no-settings{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;position:absolute;top:0;left:0;right:0;bottom:0}@keyframes fl-builder-show-panel{from{transform:scale(.8)}to{transform:scale(1)}}.fl-builder--search-results-panel,.fl-builder-panel{box-sizing:border-box;position:fixed!important;right:20px;top:calc(43px + 10px);width:380px;bottom:20px;background:#F5F7F9;color:#676F7A;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;border-radius:4px;box-shadow:0 8px 40px 4px rgba(0,0,0,.3);z-index:10000007;will-change:transform;user-select:none}.fl-builder-panel{transform-origin:top right;animation-name:fl-builder-show-panel;animation-duration:.15s;animation-fill-mode:both;-ms-flex:1;flex:1;display:none}.fl-builder--search-results-panel{display:none;position:absolute;right:0;top:93px;left:0;bottom:0;width:auto!important;border:none;border-radius:0;box-shadow:none;min-height:100px;max-height:calc(100vh - 54px);overflow:auto;z-index:1}.fl-builder-content-panel-is-showing .fl-builder-panel,.fl-builder-search-results-panel-is-showing .fl-builder--search-results-panel{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.fl-builder-panel .fl-lightbox .fl-builder-panel-drag-handle,.fl-builder-ui-is-pinned .fl-builder--panel-arrow,.fl-lightbox-width-full .fl-builder-panel-drag-handle,body.fl-builder-draggable-is-dragging .fl-builder--panel-arrow{display:none}.fl-builder--search-results-panel .fl-builder--no-results{text-align:center;padding:50px 20px}.fl-builder--panel-arrow{position:absolute;top:-13px;right:10px}.fl-builder--panel-arrow polygon{fill:#00a0d2}.fl-builder--panel-header{border-top:3px solid #00a0d2;border-top-right-radius:4px;border-top-left-radius:4px}.fl-builder-ui-is-pinned .fl-builder--panel-header{border-top:none}.fl-builder-panel-drag-handle{position:absolute;top:7px;left:10px;fill:#ccd4da;width:6px}.fl-builder-ui-is-pinned-left .fl-builder-panel-drag-handle{left:auto;right:10px}.fl-builder--panel-header .fl-builder--panel-controls{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;position:relative}.fl-builder--panel-header .fl-builder--panel-controls .fl-builder-content-group-select{-ms-flex:1 1;flex:1 1}.fl-builder--panel-header .fl-builder--panel-controls .fl-builder-panel-search{-ms-flex:0 0;flex:0 0;padding:0 10px 6px 0;margin-left:-4px}.fl-builder--panel-controls .fl-builder-panel-search button{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:30px;background:0 0!important;border:2px solid transparent!important;font-size:inherit;height:36px;margin:0;padding:0}.fl-builder--panel-controls .fl-builder-panel-search button:active,.fl-builder--panel-controls .fl-builder-panel-search button:focus{top:0;outline:0}.fl-builder-panel-search button svg{height:auto;width:20px}.fl-builder-panel-search button.fl-builder-dismiss-panel-search svg{width:16px}.fl-builder-panel-search button svg .filled-shape{fill:#000}.fl-builder--panel-controls .fl-builder-panel-search button:active svg .filled-shape,.fl-builder--panel-controls .fl-builder-panel-search button:focus svg .filled-shape{fill:#00A0D2}.fl-builder-panel-search .fl-builder-panel-search-input{display:none;position:absolute;top:0;left:0;right:0;bottom:0;background:#f5f7f9}.fl-builder-panel-search.is-showing-input .fl-builder-panel-search-input{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;padding:0 10px 6px}.fl-builder-panel-search-input input{-ms-flex:1 1 100%;flex:1 1 100%;border:2px solid #e6eaed;background:#fff;border-radius:4px;margin:0 4px 0 0;padding:10px;color:#333}.fl-builder-panel-search-input input:focus{border-color:#0197C6;outline:0}.fl-builder-panel-content-wrap{bottom:0;height:auto;left:0;overflow:hidden;position:absolute;right:0;top:43px}.fl-builder-panel-content{padding-bottom:60px}.fl-builder--panel-view .fl-builder-blocks-section:first-child{border-top:none}.fl-builder-blocks-group:first-child{padding:20px 0 0}.fl-builder-blocks-group .fl-builder-blocks-section-group-name{display:block;padding:0 30px 15px;color:#000;font-size:20px;font-weight:600;line-height:1.4}.fl-builder-blocks-section .fl-builder-block{display:block;line-height:1.1;padding:15px 20px}.fl-builder--template-collection-section-header,.fl-builder-blocks-section .fl-builder-blocks-section-header{line-height:1.2;color:#333;margin:0!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#e7ebef;border-top:4px solid #e7ebef;height:30px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.fl-builder-blocks-section .fl-builder-blocks-section-title{background:#F5F7F9;color:#353535;padding:2px 16px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.fl-builder-blocks-section .fl-builder-blocks-section-title i{color:#bfbfbf;float:right}.fl-builder-blocks-section-content{overflow:auto;padding:10px 10px 20px}.fl-builder-blocks-section-content:before{content:none}.fl-builder-blocks-section-content:after{float:none;clear:both}.fl-builder-blocks-section-content.fl-builder-modules,.fl-builder-blocks-section-content.fl-builder-rows,.fl-builder-blocks-section-content.fl-builder-widgets{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}@supports (display:grid){.fl-builder--template-collection-section-content,.fl-builder-blocks-section-content.fl-builder-modules,.fl-builder-blocks-section-content.fl-builder-rows,.fl-builder-blocks-section-content.fl-builder-widgets{display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr))}.fl-builder--template-collection-section-content>*,.fl-builder-blocks-section-content.fl-builder-modules>*,.fl-builder-blocks-section-content.fl-builder-rows>*,.fl-builder-blocks-section-content.fl-builder-widgets>*{width:auto!important}}.fl-builder-blocks-section-content .fl-builder-block-module,.fl-builder-blocks-section-content .fl-builder-block-row{-ms-flex:1 1 50%;flex:1 1 50%;width:50%;box-sizing:border-box}.fl-builder--search-results-panel .fl-builder-blocks-section-content .fl-builder-block-module{-ms-flex:1 1 100%;flex:1 1 100%;width:100%}.fl-builder-blocks-section.fl-active .fl-builder-blocks-section-content{display:block}.fl-builder-blocks-section-content .fl-builder-block{box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:4px;font-size:13px;line-height:1.1;font-weight:400;color:#38404a}.fl-builder-block{position:relative;height:47px}.fl-builder-block.fl-builder-block-col-group{height:84px}.fl-builder-block.fl-builder-block-has-thumbnail{height:auto!important;padding:10px!important}.fl-builder-block.fl-builder-block-has-thumbnail:hover{padding:0!important}.fl-builder-block.fl-builder-block-has-thumbnail .fl-builder-block-content{position:relative!important}.fl-builder-block.fl-builder-block-has-thumbnail:hover .fl-builder-block-content{padding:10px!important}.fl-builder-block.fl-builder-block-has-thumbnail .fl-builder-block-details{margin:0 10px 4px!important}.fl-builder-block:hover{overflow:visible;z-index:1}.fl-builder-block:hover .fl-builder-block-content{display:block;box-sizing:border-box;position:absolute;top:0;left:0;width:100%;padding:15px 20px;border-radius:4px;background:#fff;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);text-decoration:none;color:#111;cursor:move;overflow:hidden}.fl-builder-blocks-node-template .fl-builder-block,.fl-builder-blocks-section-content .fl-builder-block .fl-builder-block-details{position:relative}.fl-builder-block-module:hover .fl-builder-block-content{width:auto;min-width:100%}.fl-builder-block .fl-builder-block-content .fl-builder-block-visual{display:block;margin-bottom:7px}.fl-builder-block-drag-helper .fl-builder-block-content .fl-builder-block-visual{display:none!important}.fl-builder-block .fl-builder-block-content .fl-builder-block-visual.fl-cols-visual{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;height:30px}.fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col{-ms-flex:1 100%;flex:1 100%;background:#464a4c;height:30px;margin:0 2px;border-radius:2px}.fl-builder-block:hover .fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col{background:#000}.fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col:first-child{margin-left:0!important}.fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col:last-child{margin-right:0!important}.fl-cols-visual.left-right-sidebar .fl-cols-visual-col:first-child,.fl-cols-visual.left-right-sidebar .fl-cols-visual-col:last-child,.fl-cols-visual.left-sidebar .fl-cols-visual-col:first-child,.fl-cols-visual.right-sidebar .fl-cols-visual-col:last-child{-ms-flex-preferred-size:60px;flex-basis:60px}.fl-builder-block-saved-column.fl-builder-block-global .fl-builder-block-title,.fl-builder-block-saved-column:hover .fl-builder-block-title,.fl-builder-block-saved-module.fl-builder-block-global .fl-builder-block-title,.fl-builder-block-saved-module:hover .fl-builder-block-title,.fl-builder-block-saved-row.fl-builder-block-global .fl-builder-block-title,.fl-builder-block-saved-row:hover .fl-builder-block-title{margin-right:70px}.fl-builder-block-module:nth-child(even):hover .fl-builder-block-content{left:auto;right:0}.fl-builder-block-thumbnail{border-radius:4px;background-size:contain;background-repeat:no-repeat;background-position:center;background-color:rgba(0,0,0,.06);margin-bottom:10px;transform-origin:bottom;transition-property:transform,box-shadow;transition-duration:.15s}.fl-builder-block:hover .fl-builder-block-thumbnail{transform:scale(1.05);box-shadow:0 20px 40px rgba(0,0,0,.08)}.fl-builder-block .fl-builder-block-icon{margin-right:7px;fill:#000;display:inline-block;width:20px;height:20px;vertical-align:middle}.fl-builder-block-thumbnail:before{content:"";display:block;padding-top:50%}.fl-builder-block-thumbnail img{max-width:100%;max-height:160px;margin:0;-o-object-fit:cover;object-fit:cover}.fl-builder-blocks-section-content .fl-builder-block{box-shadow:0 0 0 transparent;transition-property:box-shadow;transition-duration:.15s}.fl-builder-blocks-section-content .fl-builder-block i,.fl-user-template-actions i{color:#000;margin-right:10px}.fl-builder-blocks-separator{background:#f1f1f1;height:6px}.fl-builder-block:hover .fl-builder-badge{background:#2ea2cc}.ui-sortable-helper .fl-builder-badge{display:none!important}.fl-builder-modules-cta a{color:#999!important;display:block!important;font-size:12px!important;font-style:italic!important;padding:15px 20px!important;line-height:16px!important}.fl-builder-modules-cta a:hover{background:#e5e5e5!important;color:#666!important;text-decoration:none!important}.fl-builder-modules-cta a:focus{text-decoration:none!important}.fl-builder-modules-cta .fa{float:right!important;font-size:14px!important;margin:3px 0 0 9px!important}.fl-builder--panel-message{text-align:center;padding:40px 20px;font-size:16px}.fl-builder--panel-message .fl-builder-button{display:inline-block;padding:10px}.fl-builder--panel-cta{padding:20px 30px;font-size:16px;text-align:center}.fl-builder--panel-cta a{color:inherit;text-decoration:none}.fl-builder--panel-cta a:hover{text-decoration:none}.fl-builder-block-template-image{margin:5px 0 10px;max-width:100%;border:1px solid #dfdfdf}.fl-builder-block .fl-builder-block-title{overflow:hidden;text-overflow:ellipsis;vertical-align:middle;line-height:1.3}.ui-sortable-helper .fl-builder-block-template-image{display:none!important}@keyframes fl-builder-template-item-enter{from{transform:translateY(100px) scale(.3);opacity:0}to{transform:scale(1);opacity:1}}.fl-builder--template-collection{clear:both;padding:10px 0}.fl-builder--template-collection-section-content{padding:0 10px}.fl-builder--template-collection-item{box-sizing:border-box;width:50%;float:left;padding:10px;cursor:pointer;font-size:13px;transform-origin:center;opacity:1}.fl-builder--template-thumbnail{background-size:cover;background-clip:content-box;background-position:center top;background-color:#fff;border:2px solid transparent;transform-origin:bottom;transition-property:transform,box-shadow;transition-duration:.15s}.fl-builder--template-collection-item[data-id="0"] .fl-builder--template-thumbnail,.fl-user-template .fl-builder--template-thumbnail{border-color:#e4e7ea}.fl-builder--template-thumbnail:before{display:block;content:"";padding-top:120%}.fl-builder--template-thumbnail:hover{transform:scale(1.05);box-shadow:0 20px 40px rgba(0,0,0,.08)}.fl-builder--template-name{text-align:center;padding:4px 0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.fl-builder--template-collection-section{padding-bottom:10px;border-bottom:1px solid #dfdfdf}.fl-builder--template-collection-section:last-child{border-bottom:none}.fl-builder--template-collection-section:after,.fl-builder--template-collection-section:before{content:"";display:block;clear:both}.fl-builder--template-collection-section-name{padding:15px 10px 10px}span.fl-builder-block-no-node-templates{display:block;padding:15px 20px;text-align:center}span.fl-builder-block-no-node-templates:hover{cursor:default}.fl-builder-blocks-section-content .fl-builder-node-template-actions{bottom:0;cursor:default;display:none;position:absolute;right:0;top:0}.fl-builder-blocks-section-content .fl-builder-node-template-delete,.fl-builder-blocks-section-content .fl-builder-node-template-edit{display:inline;cursor:pointer;margin:0;padding:15px 10px;text-align:center;width:30px}.fl-builder-block-details .fl-builder-node-template-delete,.fl-builder-block-details .fl-builder-node-template-edit{padding-top:0!important}.fl-builder-blocks-section-content .fl-builder-node-template-delete i,.fl-builder-blocks-section-content .fl-builder-node-template-edit i{margin:0}.fl-builder-blocks-section-content .fl-builder-node-template-delete:hover i,.fl-builder-blocks-section-content .fl-builder-node-template-edit:hover i{color:#444}.fl-builder-blocks-node-template .fl-builder-block:hover .fl-builder-node-template-actions{display:block}.ui-sortable-helper .fl-builder-node-template-delete,.ui-sortable-helper .fl-builder-node-template-edit{display:none!important}.fl-builder--tabs{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;position:relative;-ms-flex-pack:start;justify-content:flex-start;-ms-flex-align:center;align-items:center}.fl-builder-panel .fl-builder--panel-header{cursor:move}.fl-builder-panel .fl-builder--tabs{-ms-flex-pack:distribute;justify-content:space-around;padding:4px 24px;cursor:pointer}.fl-builder--tab-wrap{-ms-flex:1 1 100%;flex:1 1 100%;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:justify;justify-content:space-between;margin:auto;max-width:400px}.fl-builder--tabs button,.fl-builder--tabs button:active,.fl-builder--tabs button:focus,.fl-builder--tabs button:hover{-ms-flex:1 1 100%;flex:1 1 100%;display:inline-block;text-decoration:none;text-transform:none;color:inherit;text-align:center;letter-spacing:normal!important;margin:0;padding:5px;cursor:pointer;font-size:13px!important;font-weight:500!important;line-height:1.3!important;background:0 0!important;outline:0!important;border:2px solid transparent;border-radius:4px;min-height:36px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important;top:0;transition-property:background,color;transition-duration:.25s}.fl-builder--tabs button:focus{background:#e6eaed!important}.fl-builder--tabs button.is-showing{color:#0086b0}.fl-builder--panel-content{-ms-flex:1;flex:1}.fl-builder--panel-view{display:none;overflow:hidden}.fl-builder--panel-view.is-showing{display:block}.fl-builder--content-library-panel.ui-draggable-dragging{height:500px!important}.fl-builder--content-library-panel .fl-builder-drop-zone{display:none!important}.fl-builder--panel-header .fl-builder--tabs{cursor:move}.fl-builder--category-select{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;position:relative}.fl-builder--selector-display{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;position:relative;-ms-flex-pack:justify;justify-content:space-between;color:#161B20;background:url(../img/svg/select-arrow-down-alt2.svg) center right 10px no-repeat #fff!important;cursor:pointer;font-size:13px;font-weight:700;line-height:16px;border-radius:4px;-ms-flex-align:stretch;align-items:stretch}.fl-builder--selector-display-label{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:stretch;align-items:stretch;font-size:inherit;line-height:inherit;width:100%;margin:0!important;padding:0!important;color:#6D6D6D;background:0 0;border:2px solid transparent;box-shadow:0 1px 2px 0 rgba(0,0,0,.12)!important;border-radius:4px;font-family:inherit;text-transform:none}.fl-builder--selector-display-label:hover{top:0;color:inherit;background:0 0;border:2px solid transparent;border-radius:4px}.fl-builder--selector-display-label:active{top:0;color:inherit;background:0 0;border:2px solid #e4e7ea;border-radius:4px}.fl-builder--selector-display-label:focus{top:0;color:inherit;background:0 0;border:2px solid #00A0D2;outline:0}.fl-builder--group-label{color:inherit;-ms-flex:0 0 0%;flex:0 0 0%;padding:4px 12px 4px 10px;background:#e7ebef;border-radius:3px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center}.fl-builder--current-view-name{-ms-flex:1 1 100%;flex:1 1 100%;color:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;padding:8px 10px;text-align:left}.fl-builder--selector-menu{display:none;color:#293138;position:absolute;top:46px;left:0;width:100%;background:#fff;border-radius:4px;box-shadow:0 0 20px 2px rgba(0,0,0,.2);overflow:visible;z-index:2}.fl-builder--selector-menu:before{bottom:100%;right:8px;content:" ";height:0;width:0;position:absolute;pointer-events:none;border:solid;border-color:rgba(255,255,255,0);border-bottom-color:#fff;border-width:10px;margin-left:-10px}.fl-builder--category-select.is-showing .fl-builder--selector-menu{display:-ms-flexbox;display:flex;max-height:calc(100vh - 150px)}.fl-builder--category-select.is-showing .fl-builder--selector-menu .fl-builder--menu{margin:10px 0;-ms-flex:1 100%;flex:1 100%;overflow:auto}button.fl-builder-button.fl-builder-bar-title-caret{margin:4px}button.fl-builder-button.fl-builder-bar-title-caret:focus{background-color:#e6eaed!important;border-color:transparent!important}.fl-builder--category-select.is-showing .fl-builder-bar-title-caret i{transform:rotate(180deg)}.fl-builder--menu{margin-bottom:2px}.fl-builder--menu>a,.fl-builder--menu>button,.fl-builder--menu>span{display:block;padding:8px 10px 10px;border-radius:4px;color:inherit;text-decoration:none;background:0 0!important;border:2px solid transparent!important;font-weight:400;font-family:inherit}.fl-builder--menu>a:active,.fl-builder--menu>a:focus,.fl-builder--menu>a:hover,.fl-builder--menu>button:active,.fl-builder--menu>button:focus,.fl-builder--menu>button:hover{background:#e6eaed!important;border:2px solid transparent!important;top:0}.fl-builder-block-drag-helper,.fl-builder-block.ui-draggable-dragging,.fl-builder-drop-zone,.fl-builder-empty{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}.fl-builder--menu>a:focus,.fl-builder--menu>button:focus{outline:0;color:inherit;text-decoration:none}.fl-builder--menu .fl-has-children>svg{float:right;margin:0 7px 0 0;height:16px;width:9px;transition-property:transform;transition-duration:.15s;transform:rotate(-90deg)}.fl-builder--menu .fl-has-children.fl-has-children-showing>svg{transform:rotate(0)}.fl-builder--menu .fl-inset{display:none;padding-left:35px;font-size:14px;line-height:1.25}.fl-builder--menu a.fl-template-collection{color:#161B20}.fl-builder--menu>:after{clear:both}.fl-builder--menu * .fl-builder--menu-item-accessory{float:right;color:#000;text-transform:uppercase;text-align:center;min-width:20px;letter-spacing:2px}.fl-builder--menu * .fl-builder--menu-item-accessory i{font-size:1em;margin-top:2px}.fl-builder--menu .fl-builder-video-wrap iframe{display:block;margin:4px 0;width:100%}.fl-builder-publish-actions{display:-ms-flexbox;display:flex;box-sizing:border-box;position:absolute;top:0;right:0;width:380px;max-width:100%;height:44px;padding:4px 4px 4px 0;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:end;justify-content:flex-end;opacity:1;pointer-events:auto;transform:scaleX(1) translateX(0);transform-origin:right;transition-property:transform,opacity;transition-duration:.15s}.fl-builder-publish-actions.is-hidden{transform:scaleX(.23) translateX(68px);opacity:0;pointer-events:none}.fl-builder-bar .fl-builder-button-group{display:-ms-flexbox;display:flex;-ms-flex-preferred-size:100%;flex-basis:100%}.fl-builder-bar .fl-builder-button-group>.fl-builder-button{border-radius:0;margin-left:0;-ms-flex-preferred-size:100%;flex-basis:100%;text-align:center;-ms-flex-pack:distribute;justify-content:space-around;box-shadow:none}.fl-builder-bar .fl-builder-button-group>.fl-builder-button:first-child{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.fl-builder-bar .fl-builder-button-group>.fl-builder-button:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.fl-builder-publish-actions-click-away-mask{display:none;position:fixed;top:0;left:0;right:0;height:100vh;background:0 0}.fl-builder-dragging .fl-builder-content:not(.fl-builder-empty){padding:16px 0}.fl-builder-empty{display:none;border:2px dashed #969696;border-radius:8px;color:#909090;font-size:20px;font-weight:700;margin:10px;padding:250px 20px;position:relative;text-align:center;text-transform:uppercase}.fl-builder-drop-zone,.fl-builder-has-submenu>ul.fl-builder-submenu li a{font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fl-builder-edit .fl-builder-empty{display:block}.fl-builder-block-drag-helper,.fl-builder-block.ui-draggable-dragging{background:rgba(255,255,255,.95)!important;border:2px solid #000;border-radius:4px;box-shadow:0 0 8px rgba(0,0,0,.2);-moz-box-shadow:0 0 8px rgba(0,0,0,.2);-webkit-box-shadow:0 0 8px rgba(0,0,0,.2);color:#333!important;font-size:13px!important;height:47px!important;line-height:40px!important;overflow:hidden;padding:0 20px;position:fixed!important;text-overflow:ellipsis;white-space:nowrap;width:180px!important;z-index:100010!important;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-line-pack:center;align-content:center;-ms-flex-pack:start;justify-content:flex-start}.fl-builder-block.fl-builder-block-drag-helper:hover{padding:0;box-shadow:none}.fl-builder-block-drag-helper:hover .fl-builder-block-content{position:static;padding:0 20px}.fl-col-has-highlight-guide .fl-col-content,.fl-col-highlight,.fl-row-highlight .fl-col-group{position:relative}.fl-builder-block-saved-column.fl-builder-block-drag-helper:hover .fl-builder-block-content,.fl-builder-block-saved-module.fl-builder-block-drag-helper:hover .fl-builder-block-content,.fl-builder-block-saved-row.fl-builder-block-drag-helper:hover .fl-builder-block-content{padding:14px 20px}.fl-builder-block-drag-helper .fl-builder-block-icon{fill:#000;margin-top:-10px}.fl-builder-drop-zone{animation:fl-builder-drop-zone-pulse 2s infinite;background:#00A2D7;border-radius:4px;color:#fff!important;display:block;font-size:12px;letter-spacing:1px;line-height:14px;margin:10px;padding:6px 8px 5px;position:relative;text-align:left;text-shadow:none;text-transform:none;z-index:10}@keyframes fl-builder-drop-zone-pulse{0%,100%{background-color:#00A2D7}50%{background-color:#79DEFF}}.fl-builder-drop-zone-global{animation:fl-builder-drop-zone-global-pulse 2s infinite;background:#ff9600}@keyframes fl-builder-drop-zone-global-pulse{0%,100%{background-color:#FFBC5C}50%{background-color:#ff9600}}.fl-builder-content>.fl-builder-drop-zone{margin:10px 20px}.fl-row-content>.fl-builder-drop-zone{margin:3px 7px}.fl-col-has-cols>.fl-col-content>.fl-builder-drop-zone{margin:3px 10px}.fl-sortable-disabled>.fl-builder-drop-zone{display:none!important}.fl-col-group-equal-height.fl-col-group-align-center .fl-col-content>.fl-builder-drop-zone{width:100%}.fl-row-highlight{padding:16px 0}.fl-row-highlight .fl-row-content{border:2px dashed rgba(203,205,206,.5);padding:8px;border-radius:6px}.fl-row-highlight.fl-node-global .fl-row-content{border-color:#ff9600}.fl-col-highlight{padding:8px}.fl-col-highlight .fl-col-content{border-style:dashed!important;border-color:#00a0d2!important;border-radius:4px;min-height:100px;overflow-x:hidden;border-width:2px!important}.fl-col-has-cols.fl-col-highlight>.fl-col-content{padding:8px}.fl-col-highlight.fl-node-global .fl-col-content{border-color:#ff9600!important}.fl-builder-simple .fl-col-highlight .fl-col-content{border:none!important}.fl-col-highlight-guide{background:rgba(0,160,210,.05);border:2px solid #00A0D2;border-radius:4px;bottom:4px;left:4px;position:absolute;right:4px;top:4px;z-index:1}.fl-node-global .fl-col-highlight-guide{border-color:#ff9600!important;background-color:rgba(255,150,0,.06)!important}.fl-col-has-highlight-guide .fl-block-overlay{background:0 0;border-color:transparent}.fl-col-has-highlight-guide .fl-block-col-resize{display:none}.fl-col-has-highlight-guide .fl-col-highlight .fl-col-content{border-color:transparent!important}.fl-col-drop-target{bottom:8px;display:none;left:-9px;position:absolute;top:8px;width:18px;z-index:1}.fl-col-highlight .fl-col-drop-target{display:block}.fl-col-drop-target-last{left:auto;right:-9px}.fl-col-drop-target .fl-builder-drop-zone{bottom:0;left:2px;margin:0;padding:0;position:absolute;right:2px;top:0}.fl-col-group-drop-target{display:none;left:8px;height:18px;position:absolute;right:8px;top:-9px;z-index:1}.fl-row-highlight .fl-col-group-drop-target{display:block}.fl-col-group-drop-target-last{top:auto;bottom:-9px}.fl-col-group-drop-target .fl-builder-drop-zone{bottom:2px;left:0;margin:0;padding:0;position:absolute;right:0;top:2px}.fl-row-content>.fl-col-group-drop-target{position:static}.fl-row-content>.fl-col-group-drop-target .fl-builder-drop-zone{height:18px;position:static}.fl-row-drop-target{display:none;left:0;height:24px;margin-top:-28px;position:absolute;right:0;z-index:1}.fl-row-highlight .fl-row-drop-target{display:block}.fl-row-drop-target-last{margin-top:4px}.fl-row .fl-row-drop-target .fl-builder-drop-zone{bottom:0;left:4px;margin:0;position:absolute;right:4px;top:0}.fl-builder-content>.fl-row-drop-target{margin:0;position:static}.fl-builder-dragging .fl-builder-content.fl-builder-empty>.fl-row-drop-target{bottom:10px;display:block;height:auto;left:0;position:absolute;right:0;top:10px}.fl-builder-content .fl-row-drop-target .fl-builder-drop-zone{margin-bottom:0;margin-top:0}.fl-col-group:focus,.fl-col:focus,.fl-module:focus,.fl-row:focus{outline:0}.fl-sortable-proxy{display:none}.fl-block-overlay,.fl-block-overlay *{text-shadow:none;-webkit-touch-callout:none;transition-property:border-color;transition-duration:.3s}.fl-block-overlay-active{position:relative}.fl-block-overlay-actions{background:#00A0D2;float:left;height:30px;margin:-1px -1px 0;padding:0 4px;text-shadow:none;border-bottom-right-radius:5px;border-top-left-radius:3px;transition-property:background-color;transition-duration:.3s}.fl-row-overlay-header-bottom .fl-block-overlay-actions{border-radius:0 5px 0 3px}.fl-builder-col-resizing .fl-block-overlay-actions,.fl-builder-row-resizing .fl-block-overlay-actions{overflow:hidden}.fl-block-overlay-actions>span{display:block;float:left}.fl-block-overlay-actions i{color:#fff!important;cursor:pointer;display:block!important;float:left;font-size:16px!important;height:28px!important;line-height:28px!important;opacity:.8;filter:alpha(opacity=80);text-align:center;width:32px!important}.fl-block-overlay-actions i:hover{opacity:1;filter:alpha(opacity=100)}.fl-block-overlay-actions>i:first-child{padding-left:4px}.fl-block-overlay-actions>i:last-child{padding-right:2px}.fl-block-overlay-actions .fl-block-move{cursor:move}.fl-block-has-rules{color:#00A0D2!important;cursor:pointer;padding:7px;position:absolute;right:0;top:0}.fl-block-overlay-title,.fl-builder-has-submenu>ul.fl-builder-submenu li a{color:#fff!important;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}.fl-block-overlay-title{float:left;font-size:14px;height:30px;line-height:29px;margin-right:2px;padding:0 12px 0 8px}.fl-col-overlay,.fl-module-overlay,.fl-row-overlay{background:rgba(190,239,255,0);color:#fff}.fl-row-overlay{border:2px solid #00A0D2;border-radius:4px;bottom:0;box-sizing:border-box!important;-moz-box-sizing:border-box!important;-webkit-box-sizing:border-box!important;left:0;position:absolute;top:-33px;right:0;z-index:100006}.fl-row-overlay.fl-row-menu-active,.fl-row-overlay.fl-row-menu-active.fl-block-overlay.fl-block-overlay-global{z-index:100007}.fl-row-full-width .fl-row-overlay{left:2px;right:2px;bottom:2px}.fl-row-overlay-header-bottom{bottom:-32px!important;top:0}.fl-row-overlay-header-bottom .fl-block-overlay-header{position:absolute;bottom:0}.fl-block-overlay-active .fl-row-content-wrap{position:relative}.fl-block-overlay-active .fl-row-content{position:relative;z-index:100007!important}.fl-builder-row-resizing .fl-col.fl-block-overlay-active,.fl-builder-row-resizing .fl-module.fl-block-overlay-active{position:static}.fl-col-overlay{border:2px solid #00A0D2;border-radius:4px;bottom:8px;cursor:pointer;left:8px;position:absolute;right:8px;top:8px;z-index:100008}.fl-module-overlay{border:2px solid #00A0D2;border-radius:4px;bottom:4px;cursor:pointer;left:4px;min-height:32px;position:absolute;right:4px;top:4px;z-index:100007}.fl-builder-global-templates-locked .fl-block-overlay-global.fl-module-overlay{cursor:default}.fl-module-adjust-height{padding-bottom:15px;padding-top:15px}.fl-col-bg-overlay .fl-block-overlay-active.fl-module{z-index:100008}.fl-block-overlay-global{background:rgba(255,150,0,0);border:2px solid #F7A407;border-radius:4px}.fl-block-overlay-global .fl-block-overlay-actions{background:#F7A407}.fl-block-overlay-title-global{background:#fff;color:#ff9600!important;font-size:11px;letter-spacing:1px;margin-left:4px;padding:2px 4px;vertical-align:top}.fl-block-overlay-global.fl-row-overlay{background:rgba(255,150,0,0);cursor:pointer;z-index:100007}.fl-builder-global-templates-locked .fl-block-overlay-global.fl-row-overlay{cursor:default}.fl-builder-row-template .fl-block-overlay-global.fl-row-overlay{background:rgba(255,150,0,0);cursor:default;z-index:100006}.fl-block-overlay-global.fl-row-overlay .fl-block-col-resize{display:none}.fl-block-overlay-muted .fl-row-overlay{background:rgba(85,93,102,0);border:2px solid #555D66}.fl-block-overlay-muted .fl-row-overlay .fl-block-overlay-actions{background:#555D66}.fl-block-overlay-muted .fl-row-overlay .fl-block-has-rules{color:#555D66!important}.fl-block-overlay-muted .fl-row-overlay .fl-block-col-resize{display:none}.fl-node-disabled .fl-row-content-wrap,.fl-node-disabled>.fl-col-content{opacity:.3}.fl-block-col-resize{bottom:0!important;position:absolute;top:0!important;width:6px}.fl-block-col-resize-e{cursor:ew-resize;left:auto!important;right:-2px!important}.fl-block-col-resize-w{cursor:ew-resize;left:-7px!important}.fl-block-col-resize-handle-wrap{margin:-4px 0 0 -5px;padding:0 5px;position:absolute;top:50%!important}.fl-block-col-resize-e .fl-block-col-resize-handle-wrap{margin-left:-6px}.fl-block-col-resize-handle{background:#fff;border:2px solid #00A0D2;border-radius:50%;height:12px;width:12px}.fl-node-global .fl-block-col-resize-handle{border-color:#ff9600}.fl-block-col-resize-feedback{color:#333!important;display:none;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:11px!important;position:absolute}.fl-block-col-resize-feedback-left,.fl-block-col-resize-feedback-right{background:#fff;border:1px solid #3ba0ff;padding:2px 4px}.fl-block-col-resize-feedback-left{right:20px;top:-7px}.fl-block-col-resize-feedback-right{left:20px;top:-7px}.fl-builder-has-submenu{position:relative}.fl-builder-has-submenu>ul.fl-builder-submenu{background:#00A0D2;box-shadow:0 0 20px rgba(0,0,0,.2);border-radius:0 4px 4px;display:none;left:0;list-style:none;margin:0;padding:6px 0;position:absolute;text-align:left;top:100%;width:165px;z-index:100008}.fl-builder-has-submenu>ul.fl-builder-submenu li{list-style:none;margin:0;padding:0}.fl-builder-submenu-right ul.fl-builder-submenu{left:auto;right:0}.fl-builder-has-submenu.fl-builder-submenu-open>ul.fl-builder-submenu{display:block}.fl-builder-has-submenu>ul.fl-builder-submenu li a{border-bottom:0 none;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none;display:block;line-height:13px;font-size:13px;opacity:.8;filter:alpha(opacity=80);padding:6px 12px;text-decoration:none}.fl-builder-has-submenu>ul.fl-builder-submenu li a:hover{background:#0197C6;color:#fff;opacity:1;filter:alpha(opacity=100);text-decoration:none}.fl-builder-actions-title,.fl-builder-alert-lightbox .fl-lightbox-message{color:#333!important;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px!important}.fl-builder-has-submenu .fl-builder-submenu .fa,.fl-builder-has-submenu .fl-builder-submenu .far,.fl-builder-has-submenu .fl-builder-submenu .fas{float:right;height:12px!important;line-height:12px!important;position:relative;right:-5px;width:14px!important}.fl-builder-has-submenu .fl-builder-has-submenu .fl-builder-submenu{display:none;left:100%;top:0}.fl-builder-has-submenu .fl-builder-submenu-right.fl-builder-has-submenu .fl-builder-submenu{left:auto;right:100%}.fl-builder-has-submenu .fl-builder-has-submenu:hover .fl-builder-submenu{display:block}.fl-builder-submenu-sep{padding:7px 0!important}.fl-builder-submenu-sep div{border-bottom:1px solid rgba(255,255,255,.4)}.fl-block-col-move,.fl-block-col-move-parent{cursor:move;position:relative}.fl-builder-submenu .fa-arrows-alt{cursor:move;display:none!important}.fl-builder-submenu a:hover .fa-arrows-alt{display:block!important;float:right;line-height:12px!important;height:12px!important}.fl-block-overlay-global ul.fl-builder-submenu{background:#ff9600!important}.fl-block-overlay-global ul.fl-builder-submenu li a:hover{background:#fa3}.fl-builder-actions-lightbox .fl-lightbox{display:block;width:300px;border-radius:4px}.fl-builder-actions-lightbox .fl-lightbox-content-wrap{display:block}.fl-builder-actions-lightbox .fl-builder-actions{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:25px;text-align:center}.fl-builder-actions-title{display:block;margin-bottom:20px}.fl-builder-actions .fl-builder-button{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;margin-bottom:7px;min-height:36px}.fl-builder-alert-lightbox{padding:20px;z-index:30000000;top:0;pointer-events:auto}.fl-builder-alert-lightbox .fl-lightbox{max-width:440px;width:auto}.fl-lightbox-width-slim .fl-compound-field,.fl-lightbox-width-slim .fl-dimension-field-units{max-width:none}.fl-builder-alert-lightbox .fl-lightbox-content-wrap{display:block}.fl-builder-alert-lightbox .fl-lightbox-message{line-height:24px;padding:30px}@keyframes fl-builder-content-section-entry{from{transform:translateY(150px) translateX(100px) scale(.3);opacity:0}to{transform:translateY(0) translateX(0) scale(1);opacity:1}}.fl-template-category-select{width:180px!important}.fl-template-selector .fl-builder-settings-section{margin:0 0 10px}.fl-template-selector .fl-builder-settings-fields{height:470px}.fl-template-selector .fl-builder-settings-tab{width:560px}.fl-template-selector .fl-builder-settings-tab-description{font-size:15px!important;margin:0!important;padding:10px 0 25px;text-align:center}.fl-template-preview{float:left;margin:0 25px 30px 0;position:relative;text-align:center;width:170px}.fl-template-preview.fl-last{margin-right:0}.fl-template-image{border:1px solid #d9d9d9;cursor:pointer;margin-bottom:12px;height:164px;overflow:hidden}.fl-template-image:hover{border-color:red}.fl-template-image img{max-height:none;width:100%}.fl-template-preview span{display:block;text-align:center}.fl-user-template-category-name{background:#f2f2f2;border-bottom:3px solid #dfdfdf;border-top:2px solid #dfdfdf;font-weight:700;padding:8px 15px}.fl-user-templates{border-bottom:1px solid #dfdfdf;padding:10px 0 20px}.fl-builder--user-templates-section-content{border-bottom:2px solid #e6eaed;padding:10px}.fl-builder--user-templates-section-content:first-child{padding-top:0}.fl-builder--user-templates-section-content:last-child,.fl-user-templates:last-child{border-bottom:none}.fl-builder--user-templates-section-name{font-weight:700;font-size:16px;color:#333;z-index:9999;padding:15px 10px;margin:0 10px}@keyframes fl-list-item-entry{from{opacity:0;transform:scale(.5) translateY(100px)}to{opacity:1;transform:scale(1) translateY(0)}}.fl-builder--save-new-user-template,.fl-user-template{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:4px;font-size:16px;font-weight:200;line-height:1.1;padding:10px 20px;color:#6d6d6d}.fl-user-template:hover{cursor:pointer;background:#fff;box-shadow:0 6px 20px rgba(0,0,0,.08);text-decoration:none;color:#111;padding-right:68px}.fl-user-template-name{overflow:hidden;text-overflow:ellipsis;-ms-flex:1;flex:1}.fl-user-template-actions{display:none;bottom:0;position:absolute;right:0;top:0}.fl-user-template:hover .fl-user-template-actions{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center}.fl-user-template-actions a{display:inline-block;padding:15px 0;width:30px}.fl-user-template:hover a:hover i{color:#444!important}.fl-user-templates-message{display:none}.fl-user-template-thumbnail{-ms-flex:0;flex:0;margin-right:20px}.fl-user-template-thumbnail .fl-builder--template-thumbnail{background-size:cover;background-position:center top;width:45px}.fl-user-template-thumbnail .fl-builder--template-thumbnail:hover{box-shadow:none;transform:scale(1);transition-property:none}.fl-builder--save-new-user-template .fl-user-template-thumbnail .fl-builder--template-thumbnail{border-style:dashed;border-width:2px;border-color:#ccd4da}.fl-builder--save-new-user-template .fl-save-control{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex:1;flex:1}.fl-builder--save-new-user-template .fl-save-control input{background:0 0;border:none!important;-ms-flex:1;flex:1;font-size:16px;margin-right:10px;margin-left:-12px;color:#000}.fl-builder--save-new-user-template .fl-save-control input::-webkit-input-placeholder{color:#777}.fl-builder--save-new-user-template .fl-save-control input::-moz-placeholder{color:#777}.fl-builder--save-new-user-template .fl-save-control input:-ms-input-placeholder{color:#777}.fl-builder--save-new-user-template .fl-save-control input:-moz-placeholder{color:#777}@keyframes fl-slide-in-right{from{transform:translateX(50px)}to{transform:translateX(0)}}.fl-builder--save-new-user-template .fl-save-control button{display:none;animation-name:fl-slide-in-right;animation-duration:.25s;background-color:#00a0d2;border:none;padding:0 15px}.fl-save-control-mask{display:none;background:0 0;position:absolute;top:-50px;left:0;bottom:0;right:0;z-index:-1;min-height:80vh}.fl-builder-templates-cta{margin-bottom:20px}.fl-builder-templates-cta p{display:inline-block!important;width:75%!important;font-size:14px!important;line-height:1.5!important;margin-bottom:0!important}.fl-builder-templates-cta .fl-builder-upgrade-button{font-size:13px!important;line-height:13px!important;position:relative;top:8px;left:15px;padding:1px 12px}.fl-builder-settings-message,.fl-builder-settings-message *{font-size:15px!important;line-height:23px!important}.single-fl-builder-template .fl-content{width:100%!important}form.fl-builder-settings{height:100%;margin:0;padding:0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.fl-builder-settings-message{padding:20px 25px!important;background:#f2f2f2!important}.fl-builder-preview-loader{position:relative;top:-2px;margin-left:3px}.fl-lightbox-header .fl-builder-preview-loader{margin:0;position:absolute;right:40px;top:15px}@keyframes fl-grab-attention{0%,100%{transform:scale(1)}50%{transform:scale(1.05)}}.fl-lightbox-width-slim .fl-form-table{margin:10px 12px 10px 10px!important;width:calc(100% - 40px)}.fl-lightbox-width-slim .fl-form-table th{display:block;position:relative;padding:10px 0 0 12px!important;width:auto!important}.fl-lightbox-width-slim .fl-form-table td{display:block}.fl-lightbox-width-slim .fl-form-table .fl-field[data-type=editor] td:first-child,.fl-lightbox-width-slim .fl-form-table td:first-child{padding-left:0!important}.fl-field-label .fl-field-responsive-toggle,.fl-lightbox-width-slim .fl-field-control-wrapper .fl-field-responsive-toggle{display:none}.fl-lightbox-width-slim .fl-field-label .fl-field-responsive-toggle{display:inline-block;padding:0 5px!important}.fl-lightbox-width-slim input.text-full+.fl-field-description,.fl-lightbox-width-slim select+.fl-field-description{display:block;padding:8px 10px;margin:0}.fl-lightbox-width-slim .fl-builder-settings-fields select{width:100%}.fl-lightbox-width-slim .fl-color-picker{display:-ms-flexbox;display:flex;width:auto}.fl-lightbox-width-slim .fl-color-picker-clear{-ms-flex:0 0 40px;flex:0 0 40px}.fl-lightbox-width-slim .fl-field[data-type=dimension] .fl-field-responsive-setting{width:100%}.fl-lightbox-width-slim .fl-dimension-field-unit-select select{width:auto!important}.fl-lightbox-width-slim .fl-gradient-picker-color-row{width:50%}.fl-lightbox-width-slim .fl-color-picker.fl-gradient-picker-color,.fl-lightbox-width-slim .fl-typography-field-align .fl-button-group-field-option{width:100%}.fl-lightbox-width-slim .fl-typography-field-align .fl-button-group-field-options{float:none}.fl-lightbox-width-slim .mce-menubtn.mce-fixed-width button{width:72px!important}.fl-lightbox-width-slim .fl-builder-settings-tab-description{margin:20px 10px}.fl-lightbox-width-micro .mce-menubtn.mce-fixed-width button{width:38px!important}.fl-lightbox-width-micro .mce-btn[aria-label=Fullscreen],.fl-lightbox-width-micro .mce-btn[aria-label=Blockquote]{display:none}.fl-lightbox-width-micro .mce-toolbar i.mce-ico{width:18px}.fl-lightbox-width-slim .fl-field[data-type=editor] .fl-field-control-wrapper,.fl-lightbox-width-slim .fl-field[data-type=code] .fl-field-control-wrapper{margin-left:-10px;margin-right:-30px}.fl-lightbox .wp-editor-tools{padding-left:6px;padding-right:28px}.fl-lightbox .mce-top-part::before{box-shadow:none!important}.mce-container .mce-stack-layout span{color:initial}.fl-lightbox div.mce-toolbar-grp{background:0 0;border:none}.fl-lightbox div.mce-toolbar-grp>div{padding:0 3px}.fl-lightbox .fl-builder-settings .wp-switch-editor{background:#e7ebef;border:1px solid transparent}.fl-lightbox .html-active .switch-html,.fl-lightbox .quicktags-toolbar,.fl-lightbox .tmce-active .switch-tmce{background:#fff}.fl-lightbox .quicktags-toolbar,.fl-lightbox .wp-editor-container{border:none}.fl-lightbox .mce-toolbar .mce-container-body{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.fl-lightbox-width-slim .mce-toolbar .mce-container-body{-ms-flex-pack:center;justify-content:center}.fl-lightbox textarea.wp-editor-area{line-height:1.5;padding:20px;width:calc(100% - 10px)}.fl-lightbox .wp-core-ui .button,.fl-lightbox .wp-core-ui .button-secondary{border:none;box-shadow:none;background:#e7ebef}.fl-lightbox-width-slim .fl-shadow-field .fl-dimension-field-units{width:auto}.fl-lightbox-width-slim .fl-shadow-field .fl-dimension-field-units input{max-width:none;width:100%!important}.fl-lightbox-width-slim .fl-builder-field-multiple{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;position:relative}.fl-lightbox-width-slim .fl-builder-field-multiple .fl-field-control,.fl-lightbox-width-slim .fl-builder-field-multiple .fl-field-label{width:100%!important}.fl-lightbox-width-slim .fl-builder-field-multiple .fl-form-field-preview-text{max-width:225px}.fl-lightbox-width-slim .fl-builder-field-multiple .fl-builder-field-actions{position:absolute!important;top:0;right:0;width:70px;z-index:1}.fl-lightbox-width-slim .fl-builder-field-actions-single .fl-builder-field-copy{float:right!important;margin-right:5px}.fl-lightbox-width-slim .fl-field[data-type=time] select{width:auto}.fl-builder-settings-tabs{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:stretch;align-items:stretch;overflow:hidden;height:32px;background:#e7ebef}.fl-builder-content-group-select{padding:0 10px 6px;display:none}.fl-builder-content-group-select select{display:block;width:100%;-webkit-appearance:none;-moz-appearance:none;box-sizing:border-box;padding:8px 10px;background:url(../img/svg/select-arrow-down-alt2.svg) center right 10px no-repeat #fff!important;border:2px solid #e4e7ea;color:#161B20}select:focus{border-width:2px!important;border-style:solid!important;border-color:#00a0d2!important;outline:0!important}.fl-legacy-settings-tab{background:url(../img/ajax-loader.svg) center center no-repeat;height:100px}.fl-builder-settings-tab:first-child .fl-legacy-settings-tab{background:0 0;height:auto}body .fl-builder-settings-tabs>*{box-sizing:border-box;color:#676F7A!important;fill:#676F7A!important;background:0 0;border:2px solid transparent;border-radius:0;margin:0;outline:0;padding:1px 16px;text-decoration:none!important;font-size:13px;font-weight:400!important;-ms-flex:0 0 auto;flex:0 0 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}body .fl-lightbox-width-slim .fl-builder-settings-tabs>*{-ms-flex:1 1 auto;flex:1 1 auto}body .fl-builder-settings-tabs>.fl-builder-settings-tabs-more{-ms-flex:0 0 60px;flex:0 0 60px;display:none;margin-left:auto;-ms-flex-pack:center;justify-content:center}.fl-builder-settings-tabs-more svg{width:16px;height:auto;margin:auto}.fl-builder-settings-tabs-more g,.fl-builder-settings-tabs-more path,.fl-builder-settings-tabs-more svg{fill:inherit}body .fl-lightbox-has-tab-overflow .fl-builder-settings-tabs-more{display:-ms-flexbox;display:flex}.fl-builder-settings-tabs>:active,.fl-builder-settings-tabs>:hover{top:0;color:#333;background:0 0;border:2px solid transparent}.fl-builder-settings-tabs>:focus{top:0;outline:0;border:2px solid transparent;background:0 0;color:#0086b0;fill:#0086b0}.fl-builder-settings-tabs .fl-active,.fl-builder-settings-tabs-more.fl-contains-active,.fl-builder-settings-tabs-overflow-menu .fl-active{color:#0086b0!important;fill:#0086b0!important;position:relative;background:#fff}.fl-builder-settings-tabs .fl-active.fl-overflowed,.fl-builder-settings-tabs .fl-overflowed{display:none!important}.fl-builder-settings-tabs .error{color:#d03436;padding-right:10px}.fl-builder-settings-tabs .error .fl-error-icon,.fl-builder-settings-tabs-overflow-menu .error .fl-error-icon{background:url(../img/sprite.png) -148px -5px no-repeat;display:inline-block;height:16px;margin-left:7px;position:relative;top:3px;width:16px}.fl-builder-settings-tabs-more.fl-contains-errors{fill:#d03436!important}.fl-builder-settings-tab{display:none;width:auto!important}.fl-builder-settings-tab.fl-active{display:block}.fl-builder-settings-tab-description{background:#e4e7ea;padding:10px 15px;border-radius:4px;margin:20px}.fl-builder-settings-tab-description a{text-decoration:underline!important}.fl-builder-settings-tab-description a:hover{color:#333}.fl-builder-settings-tabs-overflow-menu{display:none;position:absolute;left:0;right:0;border:2px solid #e6eaed;border-top:3px solid #00a0d2;border-radius:4px;background:#fff;z-index:9999;margin:0 6px;padding:10px;-ms-flex-direction:column;flex-direction:column;box-shadow:0 0 20px 2px rgba(0,0,0,.2)}.fl-builder-settings-tabs-overflow-menu:before{bottom:100%;right:20px;content:" ";height:0;width:0;position:absolute;pointer-events:none;border:solid;border-color:rgba(255,255,255,0);border-bottom-color:#00a0d2;border-width:10px;margin-left:-10px}.fl-builder-settings-tabs-overflow-menu>a{display:block;padding:10px 15px;font-size:14px;font-weight:600!important;border:2px solid transparent;border-radius:4px;outline:0}.fl-builder-settings-tabs-overflow-menu>a:hover{background:#e6eaed;text-decoration:none}.fl-builder-settings-tabs-overflow-click-mask{display:none;position:fixed;top:0;bottom:0;left:0;right:0;background:0 0;z-index:11}.fl-form-table{background:none;border:none;width:calc(100% - 35px)}.fl-form-table tbody{border:none}.fl-form-table tr,.fl-form-table tr:nth-child(even){background:0 0}.fl-form-table td,.fl-form-table th{background:0 0!important;border:none!important;font-weight:400!important;text-align:left!important}.fl-form-table th{padding:10px 15px 10px 30px!important;vertical-align:top!important;width:200px!important}.fl-form-table td:first-child{padding-left:30px!important}.fl-form-table th label{color:#333;width:auto;max-width:100%}.fl-form-table th label i{color:grey}.fl-form-table th label i:hover{color:#555}.fl-form-table td{padding:8px 10px}.fl-lightbox-width-slim .fl-form-table td{padding:4px 0 5px}.fl-builder-settings-fields{margin:0;overflow:hidden;position:relative;-ms-flex:1 100%;flex:1 100%;visibility:hidden}.fl-lightbox-header .fl-builder-settings-fields{height:auto;margin:0;position:absolute;right:10px;top:10px}.fl-builder-settings-fields .fl-nanoscroller-content{padding:4px 0 0}.fl-builder-settings-fields .fl-field-control-wrapper{position:relative}.fl-field{animation-duration:.25s;animation-delay:.1s}.fl-builder-settings-fields input[type=date],.fl-builder-settings-fields input[type=email],.fl-builder-settings-fields input[type=file],.fl-builder-settings-fields input[type=number],.fl-builder-settings-fields input[type=password],.fl-builder-settings-fields input[type=search],.fl-builder-settings-fields input[type=tel],.fl-builder-settings-fields input[type=text],.fl-builder-settings-fields input[type=url],.fl-builder-settings-fields select,.fl-builder-settings-fields textarea{background:#fff!important;border-color:transparent!important;border-style:solid;border-width:2px;border-radius:4px!important;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);color:#333!important;display:inline;font-size:13px;height:auto;line-height:15px;margin:1px;outline:0;padding:3px 6px;width:auto;box-sizing:border-box}i.fl-dimension-field-link,i.fl-field-responsive-toggle{line-height:18px!important;cursor:pointer;vertical-align:middle}.fl-builder-settings-fields input[type=date],.fl-builder-settings-fields input[type=email],.fl-builder-settings-fields input[type=file],.fl-builder-settings-fields input[type=number],.fl-builder-settings-fields input[type=password],.fl-builder-settings-fields input[type=search],.fl-builder-settings-fields input[type=tel],.fl-builder-settings-fields input[type=text],.fl-builder-settings-fields input[type=url],.fl-builder-settings-fields select:not(multiple){height:36px!important}.fl-builder-settings-fields select,.fl-builder-settings-fields select[multiple]{height:auto!important}.fl-builder-settings-fields input[type=number]{width:70px}.fl-builder-lightbox .fl-builder-settings-fields input[type=date]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=email]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=file]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=number]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=password]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=search]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=tel]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=text]:focus,.fl-builder-lightbox .fl-builder-settings-fields input[type=url]:focus,.fl-builder-lightbox .fl-builder-settings-fields select:focus,.fl-builder-lightbox .fl-builder-settings-fields textarea:focus{border-width:2px!important;border-style:solid!important;border-color:#00a0d2!important;box-shadow:0 2px 4px 0 rgba(0,0,0,.12)!important}.fl-builder-settings-fields ::-webkit-input-placeholder{color:#999!important;font-size:13px}.fl-builder-settings-fields input:-moz-placeholder{color:#999;font-size:13px}.fl-builder-settings-fields ::-moz-placeholder{color:#999!important;font-size:13px}.fl-builder-settings-fields input:-ms-input-placeholder{color:#999;font-size:13px}.fl-builder-settings-fields label{display:inline-block;font-weight:400;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin-bottom:3px;font-size:12px}.fl-builder-settings-fields select{-webkit-appearance:none;-moz-appearance:none;box-sizing:border-box;color:#000;margin:0 0 2px;padding:2px 10px;padding-right:30px!important;background:url(../img/svg/select-arrow-down-alt2.svg) center right 10px no-repeat #fff!important}.fl-dimension-field-unit input[type=number],.fl-unit-field-inputs input[type=number]{-moz-appearance:textfield}.fl-builder-settings-fields select[multiple]{height:60px;background-image:none!important}.fl-builder-custom-field select,.fl-photo-field select{box-shadow:none;border-color:#e6eaed!important}.fl-builder-settings-section:first-child{border-top:none!important}.fl-builder-settings-section-header{background-color:#e7ebef;border-top:4px solid #e7ebef;cursor:pointer;height:30px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.fl-builder-settings-description{padding:0 10px 10px;margin:0;font-style:italic;opacity:.75}.fl-builder-settings-fields table{margin:20px 0}.fl-builder-settings-fields .fl-builder-settings-title{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;background:#F5F7F9;color:#353535;padding:2px 10px;margin:0;font-size:13px!important;font-weight:400;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:2px solid transparent;border-radius:0}.fl-builder-settings-fields .fl-builder-settings-title:active,.fl-builder-settings-fields .fl-builder-settings-title:hover{top:0}.fl-builder-settings-fields .fl-builder-settings-title:focus{top:0;border-color:#e0e4ea}.fl-builder-settings-fields .fl-builder-settings-title>svg{height:6px;width:9px;margin-right:7px;transition-property:transform;transition-duration:.15s}.fl-builder-settings-section-collapsed{margin-bottom:4px}.fl-builder-settings-section-collapsed .fl-builder-settings-section-content{display:none}.fl-builder-settings-section-collapsed .fl-builder-settings-title{background:0 0;-ms-flex:1 1 100%;flex:1 1 100%}.fl-builder-settings-section-collapsed .fl-builder-settings-title>svg{transform:rotate(-90deg)}.wp-core-ui h1,.wp-core-ui h2,.wp-core-ui h3,.wp-core-ui h4,.wp-core-ui h5,.wp-core-ui h6,.wp-core-ui p{color:#333;font-family:inherit}.wp-core-ui #media-attachment-date-filters{width:275px}.wp-core-ui input[type=search]::-webkit-input-placeholder{color:#333}.wp-core-ui input[type=search]:-ms-input-placeholder{color:#333}.wp-core-ui input[type=search]::-ms-input-placeholder{color:#333}.wp-core-ui input[type=search]::placeholder{color:#333}.wp-core-ui .submitbox .submitdelete{color:#a00}.wp-core-ui button{font-weight:400}.wp-core-ui input[type=date],.wp-core-ui input[type=email],.wp-core-ui input[type=file],.wp-core-ui input[type=number],.wp-core-ui input[type=password],.wp-core-ui input[type=search],.wp-core-ui input[type=tel],.wp-core-ui input[type=text],.wp-core-ui input[type=url],.wp-core-ui select,.wp-core-ui textarea{background-color:#fff;border-color:#dfdfdf;border-style:solid;border-width:1px;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none;color:#333;font-weight:400}.wp-core-ui input[type=date]:focus,.wp-core-ui input[type=email]:focus,.wp-core-ui input[type=file]:focus,.wp-core-ui input[type=number]:focus,.wp-core-ui input[type=password]:focus,.wp-core-ui input[type=search]:focus,.wp-core-ui input[type=tel]:focus,.wp-core-ui input[type=text]:focus,.wp-core-ui input[type=url]:focus,.wp-core-ui select:focus,.wp-core-ui textarea:focus{background:0 0;border-color:#aaa}.wp-core-ui input[type=search]{background-image:none;padding:6px}.fl-field-responsive-setting{display:inline-block;width:100%}.fl-field-responsive-setting-medium,.fl-field-responsive-setting-responsive{display:none}.fl-field-control-wrapper i.fl-field-responsive-toggle{padding:9px 0 0;position:absolute;left:-25px}i.fl-field-responsive-toggle{color:grey;display:inline-block;font-size:15px!important;height:auto;text-align:left;width:20px}.fl-builder-settings-fields input.text-full,.fl-builder-settings-fields textarea{width:100%}i.fl-field-responsive-toggle:hover{color:#000}.fl-builder-settings-fields .fl-text-field-add-value{min-width:50%;margin-top:.62em}.fl-field[data-type=shadow] .fl-field-control-wrapper{display:-ms-flexbox;display:flex}.fl-shadow-field .fl-color-picker{margin-bottom:15px;width:100%}.fl-color-picker{cursor:pointer}.fl-color-picker .fl-color-picker-clear{box-sizing:border-box}.fl-color-picker .fl-color-picker-clear:hover{background-color:#ededed}.colorpicker input{padding:0!important;font-size:11px!important;color:#fff!important;width:29px!important;height:auto!important;background:0 0!important;border:none!important}.colorpicker .colorpicker_hex input{width:45px!important}.fl-gradient-picker-type{display:-ms-flexbox;display:flex;margin-bottom:15px}.fl-gradient-picker-type input{margin:0!important}.fl-gradient-picker-type select{margin-bottom:0!important}.fl-gradient-picker-type-select{margin-right:10px!important}.fl-gradient-picker-colors{display:-ms-flexbox;display:flex}.fl-gradient-picker-color-row{display:-ms-flexbox;display:flex;margin-right:15px}.fl-color-picker.fl-gradient-picker-color,.fl-gradient-picker-color-row:last-child{margin-right:0}.fl-color-picker.fl-gradient-picker-color .fl-color-picker-color{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.fl-gradient-picker .fl-gradient-picker-stop input{border-top-left-radius:0!important;border-bottom-left-radius:0!important;margin:0!important}.fl-field[data-type=dimension] .fl-field-label label{padding-right:35px}.fl-field[data-type=dimension] .fl-field-control-wrapper{display:-ms-flexbox;display:flex}.fl-field[data-type=dimension] .fl-field-description{padding:9px 0 0 5px}.fl-field[data-type=dimension] .fl-field-responsive-setting{width:auto}.fl-dimension-field-units{border-radius:4px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);display:-ms-flexbox;display:flex;height:36px;margin:1px 1px 20px;position:relative;max-width:350px}.fl-dimension-field-units>*{border-right:1px solid #e6eaed;width:100%}body .fl-dimension-field-units>:last-child{border-right:none!important}body .fl-dimension-field-units>:first-child>input[type]{border-top-left-radius:4px!important;border-bottom-left-radius:4px!important}body .fl-dimension-field-units>:last-child>*{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important}.fl-dimension-field-unit input[type],.fl-dimension-field-units .fl-field-unit-select{box-shadow:none!important;margin:0!important;border-radius:0!important}.fl-dimension-field-unit input{width:100%!important}.fl-dimension-field-unit input::-webkit-inner-spin-button,.fl-dimension-field-unit input::-webkit-outer-spin-button{-webkit-appearance:none}.fl-dimension-field-unit label{padding:5px 0 0;font-size:11px;font-weight:700;color:inherit!important;display:block;text-align:center;opacity:.5}.fl-dimension-field-unit .fl-field-popup-slider{margin-top:27px}i.fl-dimension-field-link{color:grey;font-size:15px!important;height:auto;text-align:left;width:20px}i.fl-dimension-field-link:hover{color:#000}i.fl-dimension-field-link.dashicons-editor-unlink,i.fl-dimension-field-link.dashicons-editor-unlink:hover{color:#0086b0}.fl-field-label .fl-dimension-field-link,.fl-lightbox-width-slim .fl-dimension-field-link{display:none}.fl-lightbox-width-slim .fl-field-label .fl-dimension-field-link{display:inline-block}.fl-field-control-wrapper .fl-dimension-field-link{padding:9px 0 0;left:-50px;position:absolute}.fl-dimension-field-unit-select{display:-ms-flexbox;display:flex;width:auto!important}.fl-field[data-type=unit] .fl-field-control-wrapper{display:-ms-flexbox;display:flex}.fl-field[data-type=unit] .fl-field-description{margin-left:7px!important;padding-top:9px}.fl-field[data-type=unit] .fl-field-responsive-setting{width:auto}.fl-unit-field-inputs{background:0 0;border-radius:4px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);display:-ms-flexbox;display:flex}.fl-unit-field-inputs .fl-field-unit-select,.fl-unit-field-inputs input[type]{box-shadow:none!important;margin:0!important;border-top-right-radius:0!important;border-bottom-right-radius:0!important}.fl-unit-field-inputs .fl-field-unit-select{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.fl-unit-field-inputs input::-webkit-inner-spin-button,.fl-unit-field-inputs input::-webkit-outer-spin-button{-webkit-appearance:none}.fl-unit-field-input{border-right:1px solid #e6eaed!important}body .fl-unit-field-input:last-child{border-right:none!important}body .fl-unit-field-input:last-child>*{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important}.fl-unit-field-unit-select{display:-ms-flexbox;display:flex;width:auto!important}select.fl-field-unit-select{background-color:#E7EBEF!important;border-top-left-radius:0!important;border-bottom-left-radius:0!important}div.fl-field-unit-select{background-color:#E7EBEF!important;padding:9px 7px!important;width:100%}.fl-field-popup-slider{background:#fff;border-radius:4px;box-shadow:0 4px 25px 0 rgba(0,0,0,.18);display:none;margin-top:10px;padding:15px;position:absolute;left:0;right:0;z-index:9999}.fl-field-popup-slider-top{margin-top:0!important;top:-100%;transform:translateY(-10px)}.fl-field-popup-slider-input{background:#E7EBEF;cursor:pointer;height:4px;text-align:left;position:relative;border-radius:3px}.fl-field-popup-slider-input .ui-slider-handle{background:#fff;border:2px solid #3AA4CC;border-radius:100%;cursor:pointer;height:12px;width:12px;position:absolute;top:-6px;margin-left:-7px}.fl-field-popup-slider-input .ui-slider-handle:focus{outline:0}.fl-field-popup-slider-arrow{position:absolute;top:-22px}.fl-field-popup-slider-arrow:after{content:' ';border-color:transparent transparent #fff;border-style:solid;border-width:0 8px 8px;width:0;height:0}.fl-field-popup-slider-top .fl-field-popup-slider-arrow{top:auto;bottom:-24px}.fl-field-popup-slider-top .fl-field-popup-slider-arrow:after{border-bottom-width:0;border-top-width:8px;border-top-color:#fff}input[type=number].fl-field-popup-slider-focus{border:2px solid #00a0d2!important}.fl-font-field{display:-ms-flexbox;display:flex}.fl-font-field label{display:block!important;margin:0!important;padding:0 0 6px 12px}.fl-font-field .fl-font-field-font-wrapper{margin-right:8px;width:70%!important}.fl-font-field .fl-font-field-weight-wrapper{width:30%!important}.fl-compound-field{max-width:350px}.fl-compound-field-section-toggle{background:#E7EAEF;border-radius:4px;border-top:2px solid transparent;border-bottom:2px solid transparent;cursor:pointer;-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;height:32px;margin-bottom:8px;padding:0 12px}.fl-compound-field-section-toggle:hover{background:#dadfe5}.fl-compound-field-section-toggle .dashicons{font-size:15px;height:15px;margin-right:5px;width:15px}.fl-compound-field-section:last-child .fl-compound-field-section-toggle{margin-bottom:0}.fl-compound-field-section.fl-compound-field-section-visible{padding-bottom:12px}.fl-compound-field-section.fl-compound-field-section-visible:last-child{padding-bottom:0}.fl-compound-field-section-visible .fl-compound-field-section-toggle{background:0 0;border-top:2px solid #E7EBEF;border-radius:0}.fl-compound-field-section-visible .fl-compound-field-section-toggle:hover{background:0 0}.fl-compound-field-section-visible .fl-compound-field-section-toggle .dashicons:before{content:'\f347'}.fl-compound-field-row{display:none;padding-bottom:12px}.fl-compound-field-section-visible .fl-compound-field-row{display:-ms-flexbox;display:flex}.fl-compound-field-label{display:block!important;margin:0!important;padding:0 0 6px 12px}.fl-compound-field-label-bottom{padding:6px 0 0 12px}.fl-compound-field-label .fl-dimension-field-link{display:inline-block;padding:0 0 0 2px;position:relative;left:auto;top:-1px}.fl-compound-field-setting{padding-right:8px;width:100%}.fl-compound-field-setting:last-child{padding-right:0}.fl-compound-field-setting select{margin:0!important;width:100%}.fl-compound-field-setting .fl-unit-field-input input{width:100%!important;border-top-right-radius:0!important;border-bottom-right-radius:0!important}.fl-compound-field-setting .fl-unit-field-input{width:50%!important}.fl-compound-field-setting .fl-unit-field-input select.fl-field-unit-select{background-position:center right 2px!important;padding:2px 5px!important;width:100%;font-size:11px}.fl-typography-field .fl-font-field-font-wrapper{margin-right:8px!important}.fl-typography-field-spacing{width:calc(33.33% - 8px)}.fl-typography-field-transform{width:66.66%}.fl-typography-field-transform .fl-button-group-field-options{float:none}.fl-typography-field-transform .fl-button-group-field-option{width:100%;padding:0 7px}.fl-typography-field .fl-shadow-field{display:-ms-flexbox;display:flex}.fl-typography-field .fl-shadow-field .fl-color-picker{margin:0 8px 0 0;width:calc(33.33% - 8px)}.fl-typography-field .fl-shadow-field .fl-dimension-field-units{margin-left:0;margin-top:0;margin-right:0;width:66.66%}.fl-button-group-field-options{background:#E7EBEF;border-radius:4px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);display:-ms-flexbox;display:flex;float:left;height:36px;overflow:hidden}.fl-button-group-field-option{cursor:pointer;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding:0 5px;border-radius:0;border:2px solid transparent;background:0 0}.fl-button-group-field-option:hover{top:0;background-color:transparent;color:#000;border:2px solid transparent}.fl-button-group-field-option:focus{top:0;background-color:transparent;border:2px solid #00a0d2;color:#333}.fl-button-group-field-option:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.fl-button-group-field-option:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.fl-button-group-field-option[data-selected="1"]{background-color:#fff;color:#000}.fl-button-group-field-option i{color:#6B6E75}.fl-button-group-field-option:hover i{color:#333}.fl-compound-field-cell{width:50%;display:block;float:left;padding-top:13px}.fl-compound-field-cell:first-child{padding-right:4px}.fl-compound-field-cell:last-child{padding-left:4px}.fl-compound-field-cell label{padding:5px 0 0;font-size:11px;font-weight:700;color:inherit!important;display:block;text-align:center;opacity:.5}.fl-shape-transform-field .fl-compound-field-row{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.fl-shape-transform-field .fl-compound-field-row>*{width:auto;-ms-flex:1 1 auto;flex:1 1 auto}.fl-shape-transform-field .fl-compound-field-row>:first-child{-ms-flex:0 0 auto;flex:0 0 auto}.fl-shape-transform-field .fl-shape-orientation-controls{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.fl-shape-transform-field .fl-shape-orientation-controls>*{-ms-flex:0 0 auto;flex:0 0 auto}.fl-shape-transform-field .fl-shape-orientation-controls .fl-button-group-field>*,.fl-shape-transform-field .fl-shape-orientation-controls .fl-button-group-field>* button{border-radius:0}.fl-shape-orientation-controls .fl-button-group-field:first-child>*,.fl-shape-orientation-controls .fl-button-group-field:first-child>* button{border-top-left-radius:4px;border-bottom-left-radius:4px}.fl-shape-orientation-controls .fl-button-group-field:last-child>*,.fl-shape-orientation-controls .fl-button-group-field:last-child>* button{border-top-right-radius:4px;border-bottom-right-radius:4px}.fl-builder-custom-field{background:#fff;border:2px solid transparent;border-radius:4px;padding:7px 10px;box-shadow:0 2px 4px 0 rgba(0,0,0,.12);min-height:36px;box-sizing:border-box}.fl-builder-field-multiple .fl-builder-custom-field{cursor:move}.fl-builder-custom-field a{color:#21759b!important;text-decoration:underline!important}.fl-builder-custom-field a:hover{color:#d54e21!important}.fl-builder-custom-field label.error{margin-top:5px}.fl-photo-field .fl-photo-preview{display:-ms-flexbox;display:flex}.fl-photo-field .fl-photo-select,.fl-photo-field.fl-photo-empty .fl-photo-preview{display:none}.fl-photo-field.fl-photo-empty .fl-photo-select{display:block}.fl-photo-field .fl-photo-preview-img{line-height:0;margin:5px 0}.fl-photo-field .fl-photo-preview-img img{max-width:60px}.fl-photo-field .fl-photo-preview select{margin:8px 0 8px 10px;width:calc(100% - 10px)}.fl-photo-field.fl-photo-no-attachment .fl-photo-preview select{display:none}.fl-photo-field .fl-photo-preview-filename{display:none;font-size:13px;font-weight:700;margin:5px 0 9px 11px}.fl-photo-field.fl-photo-no-attachment .fl-photo-preview-filename{display:inline-block;word-break:break-all}.fl-multiple-photos-field .fl-multiple-photos-select,.fl-multiple-photos-field.fl-multiple-photos-empty .fl-multiple-photos-add,.fl-multiple-photos-field.fl-multiple-photos-empty .fl-multiple-photos-count,.fl-multiple-photos-field.fl-multiple-photos-empty .fl-multiple-photos-edit,.fl-multiple-photos-lightbox .gallery-settings,.fl-photo-field.fl-photo-no-attachment .fl-photo-edit{display:none}.fl-photo-field .fl-photo-edit{margin:0 0 0 11px}.fl-photo-field .fl-photo-remove,.fl-photo-field .fl-photo-replace{margin:0 0 0 8px}.fl-builder-edit .media-modal{z-index:9999991}.fl-builder-edit .media-modal-backdrop{z-index:999999}.fl-builder-edit .media-frame{-webkit-backface-visibility:hidden;backface-visibility:hidden}.fl-builder-edit .media-modal-content h1{font-family:inherit}.fl-builder-edit form#wp-link,.popover[class*=tour-],ul.as-list{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}.fl-builder-edit .media-modal-content .thumbnail{padding:0;border:none;border-radius:0}.fl-builder-edit .media-modal-content .attachment-preview .thumbnail{margin-bottom:0}.fl-builder-edit .media-modal-content .attachment-preview .thumbnail img{max-width:none}.fl-builder-edit button.media-modal-close{position:absolute;box-shadow:none;-webkit-box-shadow:none}.fl-builder-edit .media-frame.hide-menu{visibility:visible}span.select2-container.select2-container--open{z-index:9999999}.fl-multiple-photos-field .fl-multiple-photos-add{margin:0 0 0 8px}.fl-multiple-photos-field.fl-multiple-photos-empty .fl-multiple-photos-select{display:inline}.fl-multiple-photos-count{font-weight:700;margin-bottom:3px}.fl-video-field .fl-video-select,.fl-video-field.fl-video-empty .fl-video-preview{display:none}.fl-video-field.fl-video-empty .fl-video-select{display:block}.fl-video-field .fl-video-preview-img{float:left;line-height:0;margin:5px 0}.fl-video-field .fl-video-preview-img img{max-width:60px}.fl-video-field .fl-video-preview-img .dashicons.dashicons-media-video{display:block;font-size:60px;height:60px;line-height:60px;width:60px}.fl-video-field .fl-video-preview-filename{display:inline-block;font-size:14px;font-weight:700;margin:7px 0 5px 11px}.fl-video-field .fl-video-remove,.fl-video-field .fl-video-replace{margin:0 0 0 11px}.fl-multiple-audios-field .fl-multiple-audios-select,.fl-multiple-audios-field.fl-multiple-audios-empty .fl-multiple-audios-add,.fl-multiple-audios-field.fl-multiple-audios-empty .fl-multiple-audios-edit{display:none}.fl-multiple-audios-field.fl-multiple-audios-empty .fl-multiple-audios-select{display:block}.fl-multiple-audios-field .fl-multiple-audios-add{margin:0 0 0 8px}.fl-icon-field .fl-icon-select,.fl-icon-field.fl-icon-empty .fl-icon-preview{display:none}.fl-icon-field.fl-icon-empty .fl-icon-select{display:block}.fl-icon-field .fl-icon-preview i{display:inline-block;font-size:28px;margin:10px 10px 9px;vertical-align:middle}.fl-icon-field .fl-icon-remove{margin:0 0 0 8px}.fl-builder-hidden-editor{display:none}.fl-builder-settings .wp-switch-editor{border-radius:0;color:#333;margin-top:2px}.fl-builder-settings .mce-toolbar .mce-btn-group .mce-btn{margin:2px 0}.fl-builder-settings .mce-menubtn.mce-fixed-width button{width:100px}.fl-builder-settings .mce-menubtn.mce-fixed-width span{width:100%}.mce-close:active,.mce-close:hover,.mce-toolbar .mce-btn button:active,.mce-toolbar .mce-btn button:hover,.mce-window .mce-btn button:active,.mce-window .mce-btn button:hover{background:0 0;border:none}.wp-core-ui .quicktags-toolbar input.button.button-small{margin:1px!important}.wp-editor-container textarea.wp-editor-area{background:0 0;border:none;padding:10px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.fl-builder-edit form#wp-link{color:#000;font-size:13px}.fl-builder-edit form#wp-link #link-options label{display:block;margin-bottom:2px}.fl-builder-edit form#wp-link #link-options label span{padding-right:10px;vertical-align:middle}.fl-builder-edit form#wp-link #link-options input[type=text]{display:inline-block;height:auto;margin:5px 0 0;padding:3px 5px;width:80%}.fl-builder-edit form#wp-link .query-results{top:225px}.fl-code-field{border:1px solid #E6E6E6;border-left:none}.ace_editor,.ace_editor *{font-family:Monaco,Menlo,"Ubuntu Mono","Droid Sans Mono",Consolas,monospace!important;font-size:12px!important;font-weight:400!important;letter-spacing:0!important}.fl-layout-field-option{border:2px solid #d9d9d9;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;box-sizing:border-box!important;-moz-box-sizing:border-box!important;-webkit-box-sizing:border-box!important;cursor:pointer;float:left;line-height:0;max-width:23%;margin:0 1% 2%;padding:5px}.fl-layout-field-option-selected,.fl-layout-field-option:hover{border-color:red}.fl-layout-field-option img{max-width:100%}.fl-link-field .fl-link-field-input-wrap{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.fl-link-field-input{width:auto!important;-ms-flex:1 1 100%;flex:1 1 100%}.fl-link-field .fl-link-field-input-wrap button{-ms-flex:0 0 0%;flex:0 0 0%;height:36px;margin:1px 1px 1px 5px}.fl-link-field-options-wrap{padding:7px 0 0 12px}.fl-link-field-options-wrap label{margin-right:7px}.fl-link-field-options-wrap span{font-size:11px;font-weight:700;color:inherit!important;text-align:center;opacity:.5}.fl-link-field-search{display:none;border:2px solid #e6eaed;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;margin:4px 0 0;padding:10px}.fl-link-field-search-title{display:block;margin:0 0 3px 2px}.fl-link-field-search-cancel{margin-top:6px}.fl-link-field-search input{box-shadow:none!important;width:100%!important;padding:3px 9px!important}.fl-link-field-search #as-original-link-search{width:100%}.fl-field-connections-toggle{padding:10px 0}.fl-field[data-type=editor] .fl-field-connections-toggle{-ms-flex-align:start;align-items:flex-start}.fl-field[data-type=link] .fl-field-connections-toggle{height:24px;margin-top:1px;-ms-flex-align:start;align-items:flex-start}.fl-field[data-type=link] .fl-field-connection{bottom:25px}.fl-field-connections-menu[data-field=fl-field-text]{margin-top:30px}.fl-help-tooltip{display:inline-block;position:relative}.fl-lightbox-width-slim .fl-help-tooltip{position:static}.fl-help-tooltip-icon{color:#999!important;cursor:pointer;font-size:15px!important;padding:5px;vertical-align:middle}.fl-help-tooltip-text{box-sizing:border-box;background:#fff;border:1px solid #ccc;box-shadow:0 0 5px #ccc;-moz-box-shadow:0 0 5px #ccc;-webkit-box-shadow:0 0 5px #ccc;display:none;font-weight:400;left:23px;padding:10px 13px;position:absolute;top:-6px;width:250px;z-index:1000;border-radius:4px}.fl-lightbox-width-slim .fl-help-tooltip-text{top:30px;left:0;width:100%}.fl-field-control .fl-form-field{margin-bottom:0}.fl-form-field[data-preview-text=icon]{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.fl-form-field-preview-text i{display:inline-block;font-size:18px;line-height:22px;margin-right:10px}.fl-builder-field-actions{padding-left:0!important;padding-right:0!important;text-align:center;width:85px}.fl-builder-field-actions i{color:#999!important;cursor:pointer;font-size:13px!important;line-height:29px!important;width:16px}.fl-builder-field-actions i:hover{color:#000!important}.fl-builder-field-actions i.fl-builder-field-copy,.fl-builder-field-actions i.fl-builder-field-delete{margin-left:5px}.fl-builder-field-actions i.fl-builder-field-move{cursor:move}.fl-builder-field-dd-helper{background:#ccc;height:30px!important;float:left;width:130px!important}.fl-builder-field-dd-zone{border:1px dashed #ccc;height:30px}.fl-builder-field-actions-single .fl-builder-field-delete,.fl-builder-field-actions-single .fl-builder-field-move{display:none!important}.fl-builder-field-multiple .fl-builder-field-actions,.fl-builder-field-multiple .fl-field-control,.fl-builder-field-multiple .fl-field-label{padding-top:2px!important;padding-bottom:2px!important}.fl-builder-field-multiple .fl-builder-field-actions{min-width:70px!important}.fl-builder-field-multiple[data-field=icons] .fl-builder-field-actions{width:70px!important}.fl-builder-field-multiple.ui-sortable-helper .fl-field-control{width:60%}.fl-builder-field-multiple.ui-sortable-helper .fl-builder-field-actions{display:none}.fl-builder-widget-settings input{display:inline-block!important;margin:5px 10px 8px!important}.fl-builder-lightbox-loading{background:url(../img/ajax-loader.svg) center center no-repeat;height:100px}.fl-builder-settings .error,.fl-builder-settings input.error{color:#d03436!important}.fl-builder-settings label.error,.fl-builder-settings p.error{color:#d03436;display:block;margin-top:5px}.fl-builder-settings .fl-form-table .fl-field-description{color:#464646;font-style:normal;margin-left:2px}.fl-lightbox .fl-field-connection{right:-1px}.fl-lightbox .fl-field-connection-content{border:2px solid transparent!important;background:#e7ebef!important}.fl-field-connection-content .fl-field-connection-label{color:#676f7a!important}.fl-field-connections-toggle{pointer-events:none;width:20px;right:-25px}.has-scrollbar .fl-field-connections-toggle{right:-22px}.fl-field-connections-toggle-open{transform:none!important}.fl-field-connections-toggle i{pointer-events:auto;color:#abb1ba;font-size:13px!important;transition-property:transform;transition-duration:.15s}.fl-field-connections-toggle-open i{transform:rotate(-45deg)}ul.as-selections{background-color:#fff;border:none;border-radius:4px;box-shadow:none;color:#333;font-size:12px;height:auto;line-height:15px;margin:1px;outline:0;padding:3px;width:auto}ul.as-selections.loading{background:url(../img/ajax-loader-small.svg) 98% center no-repeat}ul.as-selections li.as-selection-item{background:#d4eaf6;border:none;font-size:11px;line-height:14px;padding:8px 15px;border-radius:4px;margin:2px}ul.as-selections li.as-selection-item.blur{background:#f4f4f4}ul.as-selections li.as-selection-item a.as-close{line-height:12px}ul.as-selections li.as-original{margin:0}ul.as-selections li.as-original input{height:auto;font-size:12px;margin:0;padding:0;box-shadow:none}ul.as-list{margin:0;font-size:13px;color:#000;background-color:#fff;background-color:rgba(255,255,255,.95);z-index:2;box-shadow:0 0 10px rgba(0,0,0,.1);border:none;border:1px solid #dfdfdf;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px}li.as-message,li.as-result-item{border:none}li.as-result-item.active{background:#e5e5e5;border-radius:0;color:#333;text-shadow:none}li.as-result-item em{background:0 0!important;color:#333!important;font-size:12px;padding:0!important;font-weight:700}.fl-custom-query-filter{display:none}.fl-custom-query .fl-field[data-type=suggest] select{margin-bottom:5px;width:100%}.fl-builder-service-settings{position:relative}.fl-builder-service-error{color:red!important;padding:15px 0 0}.fl-builder-service-account-delete{color:red!important;margin-left:10px;position:relative;top:2px}.fl-lightbox-width-slim .fl-builder-service-account-delete{display:block;padding-top:7px}#fl-field-visibility_user_capability .fl-field-description,.fl-builder-service-connect-row .fl-field-description{background:#f0f0f0;color:#333!important;display:block;float:none;margin:10px 0 0;padding:10px}#fl-field-visibility_user_capability .fl-field-description a,.fl-builder-service-connect-row .fl-field-description a{color:#21759b!important;text-decoration:underline!important}.fl-ordering-field-option{background:#fff;border:1px solid #dfdfdf;border-radius:3px;cursor:move;margin-bottom:5px;padding:5px 10px}.fl-ordering-field-option .fa{color:#ccc;float:right;line-height:16px}#tiptip_holder{z-index:1000000}#tiptip_holder.tip_top #tiptip_arrow_inner{border-top-color:#333}#tiptip_holder.tip_bottom #tiptip_arrow_inner{border-bottom-color:#333}#tiptip_holder.tip_right #tiptip_arrow_inner{border-right-color:#333}#tiptip_holder.tip_left #tiptip_arrow_inner{border-left-color:#333}#tiptip_content{background:#333;box-shadow:none}.fl-builder-getting-started-video{line-height:0!important;padding:10px}.fl-builder-getting-started-video iframe{border:none;height:326px;width:100%}.fl-builder-tour-actions .fl-builder-actions-title{font-size:14px!important;line-height:19px}.fl-builder-tour-mask{bottom:0;left:0;position:fixed;right:0;top:0;z-index:100000000}.fl-builder-tour-dimmed{background:rgba(0,0,0,.7);bottom:0;left:0;position:absolute;right:0;top:0}body>.fl-builder-tour-dimmed{position:fixed}.tour-backdrop{z-index:110000}.popover[class*=tour-]{border:1px solid #ccc;border-radius:0;box-shadow:0 0 40px rgba(0,0,0,.3);color:#666;font-size:13px;font-weight:400;line-height:18px;max-width:none;padding:0;width:300px;z-index:100000001}.popover[class*=tour-].bottom>.arrow{border-bottom-color:#ccc}.popover[class*=tour-].bottom>.arrow:after{border-bottom-color:#f7f7f7}.popover[class*=tour-] .popover-title{border-radius:0;color:#333;letter-spacing:normal;text-transform:none}.popover[class*=tour-] .fa-times{color:#b3b3b3;cursor:pointer;font-size:16px;padding:5px;position:absolute;right:3px;top:2px}.popover[class*=tour-] .fa-times:hover{color:#666}.popover[class*=tour-] .popover-content{border-bottom:1px solid #d9d9d9;padding:13px 15px}.popover[class*=tour-] .fl-builder-tour-next{display:block;float:none;width:100%}.popover-navigation button{min-height:36px}.fl-builder-shortcode-mask-wrap{position:relative}.fl-builder-shortcode-mask{bottom:-1px;left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fl-builder--search{border:2px solid transparent;position:relative;padding:0;width:54px;transition-property:width;transition-delay:.1s;transition-duration:.15s}.fl-builder--search.is-expanded{border:2px solid #00A0D0}.fl-builder--search input[type=text],.fl-builder--search input[type=text]:focus{background-color:transparent;border:none!important;box-sizing:border-box;width:100%;font-size:16px;text-align:center}.fl-builder--search:before{display:-ms-flexbox;display:flex;top:0;left:0;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;content:"\f002";font:normal normal normal 14px/1 Font Awesome\ 5 Free;text-align:center;width:100%;height:100%;position:absolute;pointer-events:none;color:rgba(128,128,128,.6);font-size:17px;opacity:1;transition-property:opacity;transition-duration:.15s}.fl-builder--main-menu-panel,.fl-builder-ui-keyboard-shortcuts{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif!important}.fl-builder--search.has-text:before,.fl-builder--search.is-expanded:before{opacity:0}.fl-builder--search input::-webkit-input-placeholder{color:rgba(128,128,128,0)!important;transition:color .25s}.fl-builder--search input:focus::-webkit-input-placeholder{color:rgba(128,128,128,.4)!important}.fl-builder--search .search-label{cursor:text}.fl-builder--search .search-clear{display:none;padding:10px 10px 10px 30px;color:#a7a7a7;font-size:12px;position:absolute;right:0;top:0;background-color:#eff1f2;background:linear-gradient(to left,#e4e7ea,#e4e7ea 75%,rgba(228,231,234,0))}.fl-builder--search.has-text .search-clear,.fl-builder--search.is-expanded input{display:inline-block}.fl-builder--search:hover .search-clear{color:#888;background-color:#eff1f2;background:linear-gradient(to left,#dadfe5,#dadfe5 75%,rgba(218,223,229,0))}.fl-builder--search.is-expanded{width:246px}@keyframes fl-builder-show-menu-item{from{transform:translateY(10px) scale(.8);opacity:0}to{transform:translateX(0) translateY(0) scale(1);opacity:1}}.fl-builder--main-menu-panel{display:none;box-sizing:border-box;position:fixed;top:calc(45px + 10px);left:10px;width:360px;color:#222;max-height:calc(100% - 66px);border-radius:4px;background:#fff;border:none;border-top:3px solid #00a0d2;box-shadow:0 11px 45px 8px rgba(0,0,0,.1);font-size:14px!important;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:10000009;pointer-events:auto}.fl-builder--main-menu-panel.is-showing{display:-ms-flexbox;display:flex}.fl-builder--main-menu-panel:before,.fl-theme-builder-preview-select-open .fl-theme-builder-preview-select-items:before{bottom:100%;right:6px;content:" ";height:0;width:0;position:absolute;pointer-events:none;border:solid;border-color:rgba(255,255,255,0);border-bottom-color:#00a0d2;border-width:13px;margin-left:-13px}.fl-builder--main-menu-panel-views{-ms-flex:1 1 100%;flex:1 1 100%;overflow:auto}.fl-builder--main-menu-panel-mask{display:none;position:fixed;top:0;left:0;right:0;bottom:0;z-index:1000119}.fl-builder--main-menu-panel .fl-builder--tabs{padding-left:20px;padding-top:15px}.fl-builder--main-menu-panel-view{display:none}.fl-builder--main-menu-panel-view.is-showing{display:block}.fl-builder--main-menu-panel-view-title{font-size:24px;font-weight:600;padding:25px 22px 0;line-height:1;white-space:nowrap}.fl-builder--main-menu-panel-view-title .title-accessory{float:right;color:#b1b1b1}.fl-builder--main-menu-panel-view-title .title-accessory>i{font-size:20px!important;width:25px!important}.fl-builder--main-menu-panel-view-title .title-accessory>i:hover{color:#222}.fl-builder--main-menu-panel-view-title .pop-view{padding:10px;margin-left:-10px;opacity:.5;font-size:25px;font-weight:400;cursor:pointer;background:0 0;outline:0;border:none;color:inherit}.fl-builder--main-menu-panel-view-title .pop-view:focus{outline:0;top:0;background:#E5EAED!important}.fl-builder--menu-item:before{display:block;content:"";float:none;clear:both}.fl-builder--menu-item{color:inherit;text-align:left;box-sizing:border-box;display:block;padding:10px 15px;margin:0 10px;width:calc(100% - 20px);background:0 0;border:none;border-radius:4px;font-size:14px;line-height:1.1;cursor:pointer;opacity:1;text-transform:none}.fl-builder--menu-item:hover{background:#eaf1f8;border:none;text-decoration:none;color:#000}.fl-builder--selector-menu .fl-builder--menu-item:hover{background:#fff}.fl-builder--menu-item-accessory{float:right;text-align:center;display:inline-block;min-width:40px;font-size:14px}.fl-builder--menu-item-accessory.view-arrow{font-size:18px}.fl-builder--menu{padding:0;margin:20px 0}.fl-builder--menu hr{margin:8px 0;background:#e6eaed!important;height:1px;border:none}.fl-builder--menu .fl-builder-video-wrap{padding:0 10px 10px}.fl-revision-list-item{display:-ms-flexbox;display:flex}.fl-revision-list-item-text{padding-left:15px}.fl-revision-list-item-date{padding-bottom:5px}.fl-builder--revision-actions{display:none;position:fixed;top:4px;left:4px;z-index:100008;padding:4px 4px 6px;-ms-flex-pack:center;justify-content:center;background:#fff;border-radius:4px}.fl-builder--revision-actions *{margin-right:5px}.fl-builder--revision-actions :last-child{margin:0}.fl-builder--menu-item[data-event=noRevisionsMessage]:hover{background:0 0;box-shadow:none;cursor:default}.fl-no-revisions-message-title{font-weight:700;margin-bottom:10px}.fl-no-revisions-message-text{line-height:22px}.fl-builder-module-placeholder-message{border:1px dashed #ccc;overflow:hidden;padding:20px;text-align:center;text-overflow:ellipsis;white-space:nowrap}.fl-field-connections-menu{z-index:999999}.fl-field[data-type=editor] .fl-field-connections-toggle{right:5px!important}.fl-field-connections-inline-toggle{display:inline;color:#9a9b9c;margin-left:6px}.fl-field-connections-inline-toggle i{transition-property:transform;transition-duration:.15s}.fl-field-connections-inline-toggle.fl-field-connections-toggle-open i{transform:rotate(45deg)}.fl-builder-add-ultimate-presets-button,.fl-builder-add-ultimate-rows-button,.fl-builder-pp-add-template-button,.pp-preview-button,.uabb-live-preview-button{display:none!important}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none;background:0 0;transition-property:background;transition-duration:.15s}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-ne,.ui-resizable-nw,.ui-resizable-se,.ui-resizable-sw{width:12px;height:12px}.ui-resizable-se{cursor:se-resize;right:-4px;bottom:-4px}.ui-resizable-sw{cursor:sw-resize;left:-4px;bottom:-4px}.ui-resizable-nw{cursor:nw-resize;left:-4px;top:-4px}.ui-resizable-ne{cursor:ne-resize;right:-4px;top:-4px}.fl-builder-resizable-iframe-fix{position:absolute;top:0;right:0;bottom:0;left:0;z-index:100000000}.fl-builder-panel .ui-resizable-handle:active,.fl-builder-panel .ui-resizable-handle:hover,.fl-lightbox .ui-resizable-handle:active,.fl-lightbox .ui-resizable-handle:hover{background:#00a0d2}.fl-builder-panel .ui-resizable-n,.fl-builder-panel .ui-resizable-s,.fl-lightbox .ui-resizable-n,.fl-lightbox .ui-resizable-s{height:6px}.fl-builder-panel .ui-resizable-n,.fl-lightbox .ui-resizable-n{top:-3px}.fl-builder-panel .ui-resizable-s,.fl-lightbox .ui-resizable-s{bottom:-3px}.fl-builder-panel .ui-resizable-e,.fl-builder-panel .ui-resizable-w,.fl-lightbox .ui-resizable-e,.fl-lightbox .ui-resizable-w{width:6px}.fl-builder-panel .ui-resizable-e,.fl-lightbox .ui-resizable-e{right:-3px}.fl-builder-panel .ui-resizable-w,.fl-lightbox .ui-resizable-w{left:-3px}.fl-lightbox .ui-resizable-ne,.fl-lightbox .ui-resizable-nw,.fl-lightbox .ui-resizable-se,.fl-lightbox .ui-resizable-sw{background:0 0;border:6px solid transparent}.fl-lightbox .ui-resizable-ne:active,.fl-lightbox .ui-resizable-ne:hover,.fl-lightbox .ui-resizable-nw:active,.fl-lightbox .ui-resizable-nw:hover,.fl-lightbox .ui-resizable-se:active,.fl-lightbox .ui-resizable-se:hover,.fl-lightbox .ui-resizable-sw:active,.fl-lightbox .ui-resizable-sw:hover{background:0 0;border-color:#00a0d2}.fl-lightbox .ui-resizable-ne{border-bottom:none;border-left:none;border-top-right-radius:4px}.fl-lightbox .ui-resizable-nw{border-bottom:none;border-right:none;border-top-left-radius:4px}.fl-lightbox .ui-resizable-se{border-top:none;border-left:none;border-bottom-right-radius:4px}.fl-lightbox .ui-resizable-sw{border-top:none;border-right:none;border-bottom-left-radius:4px}.fl-builder-ui-keyboard-shortcuts{display:none;position:fixed;top:0;left:0;bottom:0;right:0;z-index:999999;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;background:rgba(50,50,50,.88);font-size:15px;line-height:1.3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fl-builder-ui-keyboard-shortcuts.is-showing{display:-ms-flexbox;display:flex}.fl-builder-ui-keyboard-shortcuts-content{box-sizing:border-box;width:500px;background:#f5f7f9;border-radius:4px;padding:30px 0 0;box-shadow:0 10px 30px rgba(0,0,0,.15)}.fl-builder-ui-keyboard-shortcut-item{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center;padding:12px 40px}.fl-builder-ui-keyboard-shortcut-item:nth-child(even){background:#eef2f5}.fl-builder-ui-shortcut-keycode{margin-left:auto;text-transform:uppercase;letter-spacing:2px}.fl-builder-ui-keyboard-shortcust-footer{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;padding:10px}.dismiss-shortcut-ui{padding:10px;border-radius:4px;background:#fff;color:#000;font-size:14px;border:2px solid #fff}.dismiss-shortcut-ui:focus,.dismiss-shortcut-ui:hover{top:0;color:#000;background:#eef2f5;border:2px solid #eef2f5}.fl-builder-ui-skin--dark .fl-builder--main-menu-panel,.fl-builder-ui-skin--dark .fl-builder--preview-actions,.fl-builder-ui-skin--dark .fl-builder--search-results-panel,.fl-builder-ui-skin--dark .fl-builder-panel,.fl-builder-ui-skin--dark .fl-lightbox,body.fl-builder-ui-skin--dark .fl-builder-bar .fl-builder-bar-content{background:#23282d;color:#b4b9be;border-color:#1d1d1d}.fl-builder-ui-skin--dark .fl-builder--panel-header{color:#b4b9be;border-bottom-color:#1d1d1d;border-top-color:#1d1d1d}.fl-builder-ui-skin--dark .fl-builder-panel.fl-builder-ui-pinned .fl-builder--panel-header{border-top-color:#1d2227}.fl-builder-ui-skin--dark .fl-builder--main-menu-panel:before{border-bottom-color:#1d1d1d}.fl-builder-ui-skin--dark .fl-builder--panel-arrow polygon{fill:#1d1d1d}.fl-builder-ui-skin--dark .fl-builder-panel-search .fl-builder-panel-search-input{background:#24282e}.fl-builder-ui-skin--dark .fl-responsive-preview-content{background:#131619}.fl-builder-ui-skin--dark .fl-form-table th{background:#23282d!important;color:#7d8690}.fl-builder-ui-skin--dark .fl-builder--preview-actions .device-icons,.fl-builder-ui-skin--dark .fl-builder-button{background:#2c333a}.fl-builder-ui-skin--dark .fl-builder-button:focus{background:#131a22}.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-button-primary{color:#fff!important;fill:#fff!important;background:#00A0D2}.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-buy-button,.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-feedback-button,.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-upgrade-button{background-color:#F7A407;color:#fff!important}.fl-builder-ui-skin--dark .fl-builder-button.fl-builder-button-silent:focus{border:2px solid #00a0d2!important}.fl-builder-ui-skin--dark .fl-builder-content-panel--button:hover,.fl-builder-ui-skin--dark .fl-builder-content-panel-button{color:#00A0D2!important}.fl-builder-ui-skin--dark .fl-builder--menu>a:hover,.fl-builder-ui-skin--dark .fl-builder--menu>button:hover{background:#101215!important}.fl-builder-ui-skin--dark .fl-builder--menu>a:focus,.fl-builder-ui-skin--dark .fl-builder--menu>button:focus{background:#101215!important;color:#fff!important}.fl-builder-ui-skin--dark .fl-builder-bar-title{border-color:#101215}.fl-builder-ui-skin--dark .fl-builder-bar-title:hover{background-color:#181b1f}.fl-builder-simple.fl-builder-ui-skin--dark .fl-builder-bar-title:hover{background-color:transparent}.fl-builder-ui-skin--dark .fl-builder-layout-title{color:#c6cdd6}.fl-builder-ui-skin--dark .fl-builder-bar-title-caret i,.fl-builder-ui-skin--dark .fl-builder-layout-pretitle,.fl-builder-ui-skin--dark .fl-theme-builder-preview-select .fl-theme-builder-preview-select-title{color:#7d8690}.fl-builder-ui-skin--dark button.fl-builder-button.fl-builder-bar-title-caret:focus{background-color:#101215!important}.fl-builder-ui-skin--dark .fl-builder--search:before{color:rgba(162,173,184,.73)}.fl-builder-ui-skin--dark .fl-builder--search input:focus::-webkit-input-placeholder{color:rgba(162,173,184,.73)!important}.fl-builder-ui-skin--dark .fl-builder--search .search-clear{color:rgba(162,173,184,.5);background-color:#e4e4e4;background:linear-gradient(to left,#383f46,#383f46 75%,rgba(56,63,70,0))}.fl-builder-ui-skin--dark .fl-builder--menu hr{background-color:#23282d!important;border:none}.fl-builder-ui-skin--dark .fl-builder--tabs{border-color:#383f46!important}.fl-builder-ui-skin--dark .fl-builder--tabs .is-showing,.fl-builder-ui-skin--dark .fl-builder-settings-tabs a.fl-active,.fl-builder-ui-skin--dark .fl-builder-settings-tabs-more.fl-contains-active{color:#fff!important;fill:#fff!important;background:#181b20!important}.fl-builder-ui-skin--dark .fl-builder--tabs :focus{background-color:#101215!important;color:#fff!important}.fl-builder-ui-skin--dark .fl-builder--tabs .is-showing:focus{color:#00a0d2!important}.fl-builder-ui-skin--dark .fl-builder--menu-item:hover{background:#383f46;color:#a8b3bf}.fl-builder-ui-skin--dark .fl-builder--menu * .fl-builder--menu-item-accessory,.fl-builder-ui-skin--dark .fl-builder-blocks-section-group-name{color:#7d8690}.fl-builder-ui-skin--dark .fl-builder--selector-display{color:#c6cdd6;background:url(../img/svg/select-arrow-down-alt2-light.svg) center right 10px no-repeat #1a1b22!important}.fl-builder-ui-skin--dark .fl-builder--selector-display-label{color:#b5becb}.fl-builder-ui-skin--dark .fl-builder-panel-search-input input{border-color:#5b656f;color:#b8c2ce;background:#171b1f!important}.fl-builder-ui-skin--dark .fl-builder--selector-display-label:focus,.fl-builder-ui-skin--dark .fl-builder-panel-search-input input:focus{border-color:#00a0d2}.fl-builder-ui-skin--dark .fl-builder--group-label{color:#aaafb5!important;background:#24282e}.fl-builder-ui-skin--dark .fl-builder--category-select .fl-builder--selector-menu{border-color:#101215!important;color:#7c858e;background-color:#101215}.fl-builder-ui-skin--dark .fl-builder--category-select .fl-builder--selector-menu:before{border-bottom-color:#101215}.fl-builder-ui-skin--dark .fl-builder--menu>a,.fl-builder-ui-skin--dark .fl-builder--menu>button,.fl-builder-ui-skin--dark .fl-builder--menu>span{color:#a1adb9}.fl-builder-ui-skin--dark .fl-builder--category-select .fl-builder--selector-menu .fl-builder--menu-item:hover{background:#23282d!important;color:#a1adb9}.fl-builder-ui-skin--dark .fl-builder--category-select .fl-builder--selector-menu .fl-builder--menu-item:focus{background:#23282d!important;color:#00a0d2!important}.fl-builder-ui-skin--dark .fl-builder-panel-drag-handle{fill:#5b656f}.fl-builder-ui-skin--dark .fl-builder--template-collection-section-header,.fl-builder-ui-skin--dark .fl-builder-blocks-section .fl-builder-blocks-section-header,.fl-builder-ui-skin--dark .fl-builder-settings-section-header{background-color:#191b21;border-color:#191b21}.fl-builder-ui-skin--dark .fl-builder--template-collection-section-name,.fl-builder-ui-skin--dark .fl-builder--user-templates-section-name,.fl-builder-ui-skin--dark .fl-builder-blocks-section .fl-builder-blocks-section-title,.fl-builder-ui-skin--dark .fl-builder-settings-fields .fl-builder-settings-title{color:#7d8690!important;fill:#7d8690;background:#24282e}.fl-builder-ui-skin--dark .fl-builder-settings-fields .fl-builder-settings-title:focus{border-color:#7d8690}.fl-builder-ui-skin--dark .fl-builder-blocks-section-content .fl-builder-block,.fl-builder-ui-skin--dark .fl-user-template{color:#b8c2ce}.fl-builder-ui-skin--dark .fl-builder-block:hover .fl-builder-block-content,.fl-builder-ui-skin--dark .fl-user-template:hover{background:#171b1f;color:#fff}.fl-builder-ui-skin--dark .fl-builder-block:hover i,.fl-builder-ui-skin--dark .fl-user-template:hover i{color:#6d7782!important}.fl-builder-ui-skin--dark .fl-builder-block:hover a:hover i,.fl-builder-ui-skin--dark .fl-user-template:hover a:hover i{color:#9eacbb!important}.fl-builder-ui-skin--dark .fl-builder-block .fl-builder-block-icon{fill:#b5becb}.fl-builder-ui-skin--dark .fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col,.fl-builder-ui-skin--dark .fl-builder-block:hover .fl-builder-block-visual.fl-cols-visual .fl-cols-visual-col{background:#7d8690}.fl-builder-ui-skin--dark .fl-user-templates{border-color:#101215}.fl-builder-ui-skin--dark .fl-builder--template-thumbnail{border-color:#393f44}.fl-builder-ui-skin--dark .fl-builder--menu a.fl-template-collection{color:#a8b3bf}.fl-builder-ui-skin--dark .fl-lightbox .fl-lightbox-header h1{color:#fff!important}.fl-builder-ui-skin--dark .fl-form-table th label{color:#a8b3bf!important}.fl-builder-ui-skin--dark .fl-builder-settings-tabs{background-color:#2c333a!important}.fl-builder-ui-skin--dark .fl-builder-settings-fields h3.fl-builder-settings-title{background:#24282e}.fl-builder-ui-skin--dark h3.fl-builder-settings-title .fl-builder-settings-title-text-wrap{color:#a8b3bf;background-color:#1b2025}.fl-builder-ui-skin--dark .fl-lightbox :not(i){color:#a7b1bb!important}.fl-builder-ui-skin--dark .fl-builder-button{color:#c6cdd6!important;fill:#c6cdd6!important}.fl-builder-ui-skin--dark .fl-builder-content-panel--button:hover,.fl-builder-ui-skin--dark .fl-builder-content-panel-button{fill:#00A0D2!important}.fl-builder-ui-skin--dark .fl-lightbox .fl-builder-button.fl-builder-button-primary{color:#fff!important}.fl-builder-ui-skin--dark .fl-color-picker-color.fl-color-picker-empty{background:#1a1b22}.fl-color-picker-color.fl-color-picker-empty .fl-color-picker-icon{fill:#6f7881}.fl-builder-ui-skin--dark .fl-color-picker-clear{background-color:#121a23}.fl-builder-ui-skin--dark .fl-color-picker-clear:hover{background-color:#373f46}.fl-builder-ui-skin--dark span.fl-builder-block-no-node-templates:hover{background:#1d2025}.fl-builder-ui-skin--dark .fl-builder-settings-tab-description{background:#1d2227}.fl-builder-ui-skin--dark .fl-builder-panel-search button svg .filled-shape{fill:#b5becb}.fl-builder-ui-skin--dark .fl-builder-custom-field,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=email],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=file],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=number],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=password],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=search],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=tel],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=text],.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=url],.fl-builder-ui-skin--dark .fl-builder-settings-fields select,.fl-builder-ui-skin--dark .fl-builder-settings-fields textarea{background-color:#181b20!important}.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=email]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=file]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=number]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=password]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=search]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=tel]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=text]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields input[type=url]:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields select:focus,.fl-builder-ui-skin--dark .fl-builder-settings-fields textarea:focus{border-color:#00a0d2!important;color:#fff!important}.fl-builder-ui-skin--dark .fl-builder-settings-fields select{background-image:url(../img/svg/select-arrow-down-alt2-light.svg)!important}.fl-builder-ui-skin--dark .fl-builder-custom-field select,.fl-builder-ui-skin--dark .fl-photo-field select{border-color:#7d8690!important}.fl-builder-ui-skin--dark .fl-field i.fl-field-responsive-toggle{color:#6b747d}.fl-builder-ui-skin--dark .fl-builder--main-menu-panel-view-title,.fl-builder-ui-skin--dark .fl-field i.fl-field-responsive-toggle:hover{color:#a8b3bf}.fl-builder-ui-skin--dark .fl-builder--saving-indicator{color:#858f99}.fl-builder-ui-skin--dark .fl-icons-list i:hover{background-color:#16191d;color:#fff}.fl-builder-ui-skin--dark .fl-color-picker-clear .fl-color-picker-icon-remove:after,.fl-builder-ui-skin--dark .fl-color-picker-clear .fl-color-picker-icon-remove:before{background:#6f7881}.fl-builder-ui-skin--dark .fl-builder--user-templates-section-content{border-color:#1d1d1d}.fl-builder-ui-skin--dark .fl-theme-builder-preview-select.fl-builder-button{background:0 0;border-right-color:#101215!important}.fl-builder-ui-skin--dark .fl-theme-builder-preview-select.fl-builder-button:hover{background:#181b1f}.fl-builder-ui-skin--dark .fl-theme-builder-preview-select .fl-theme-builder-preview-select-title span{color:#c6cdd6}.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu{background:#131a22;border-color:#353c43 #131a22 #131a22}.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu:before{border-bottom-color:#353c43}.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a:active,.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a:focus,.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a:hover{background:#383f46}.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a.fl-active,.fl-builder-ui-skin--dark .fl-builder-settings-tabs-overflow-menu>a:hover.fl-active{color:#fff!important;background:#383f46}.fl-builder-ui-skin--dark ul.as-selections{background-color:#121a23}.fl-builder-ui-skin--dark .fl-custom-query .fl-builder-settings-section{border-top:2px solid #1b2026!important}.fl-builder-ui-skin--dark div.fl-field-unit-select{background-color:#181b20!important}.fl-builder-ui-skin--dark .fl-dimension-field-units>*{border-right:1px solid #383f46}.fl-builder-ui-skin--dark .fl-field-popup-slider,.fl-builder-ui-skin--dark .fl-field-popup-slider-input .ui-slider-handle{background:#383f46}.fl-builder-ui-skin--dark .fl-field-popup-slider-arrow:after{border-bottom-color:#383f46}.fl-builder-ui-skin--dark .fl-field-popup-slider-input{background-color:#121a23}.fl-builder-ui-skin--dark .fl-unit-field-input{border-right:1px solid #383f46!important}.fl-builder-ui-skin--dark .fl-button-group-field-option[data-selected="1"]{background-color:#383f46;color:#fff}.fl-builder-ui-skin--dark .fl-button-group-field-option[data-selected="1"] i{color:#fff!important}.fl-builder-ui-skin--dark .fl-button-group-field-options{background:#181b20}.fl-builder-ui-skin--dark .fl-compound-field-section-toggle{background-color:#181b20}.fl-builder-ui-skin--dark .fl-compound-field-section-toggle:hover{background-color:#383f46}.fl-builder-ui-skin--dark .fl-compound-field-section-visible .fl-compound-field-section-toggle{border-top-color:#121a23!important;background-color:transparent}.fl-builder-ui-skin--dark .fl-field-connections-toggle i{color:#7c8590}.fl-builder-ui-skin--dark .fl-lightbox .fl-field-connection-content{background-color:#191b20!important}.fl-builder-ui-skin--dark .fl-nanoscroller>.fl-nanoscroller-pane>.fl-nanoscroller-slider{background-color:#181b20}.fl-builder-ui-skin--dark .fl-nanoscroller>.fl-nanoscroller-pane:hover>.fl-nanoscroller-slider{background-color:#5a646f}.fl-builder-ui-skin--dark .fl-nanoscroller>.fl-nanoscroller-pane.active>.fl-nanoscroller-slider{background-color:#00A0D2}.fl-builder-ui-skin--dark .fl-lightbox div.mce-panel{background:#383f46}.fl-builder-ui-skin--dark .fl-lightbox .mce-toolbar .mce-ico{color:#a7b1bb}.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button-secondary{background:#383f46;border:none;box-shadow:none}.fl-builder-ui-skin--dark .fl-lightbox .fl-builder-settings .wp-switch-editor{background:#23282d}.fl-builder-ui-skin--dark .fl-lightbox .html-active .switch-html,.fl-builder-ui-skin--dark .fl-lightbox .quicktags-toolbar,.fl-builder-ui-skin--dark .fl-lightbox .tmce-active .switch-tmce{background:#383f46}.fl-builder-ui-skin--dark .fl-lightbox textarea.wp-editor-area{background:0 0!important}.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button-secondary:focus,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button-secondary:hover,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button.focus,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button.hover,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button:focus,.fl-builder-ui-skin--dark .fl-lightbox .wp-core-ui .button:hover{background:#191b20}
extensions/fl-builder-cache-helper/classes/class-fl-builder-cache-helper.php CHANGED
@@ -9,16 +9,16 @@ class Plugin {
9
  private static $plugins = array();
10
 
11
  private $actions = array(
12
- 'fl_builder_cache_cleared',
13
- 'fl_builder_after_save_layout',
14
- 'fl_builder_after_save_user_template',
15
- 'upgrader_process_complete',
16
  );
17
 
18
  function __construct() {
19
 
20
- add_action( 'plugins_loaded', array( $this, 'unload_helper_plugin' ) );
21
- add_action( 'plugins_loaded', array( $this, 'load_files' ) );
22
  add_action( 'fl_builder_admin_settings_save', array( $this, 'save_settings' ) );
23
  }
24
 
@@ -65,11 +65,11 @@ class Plugin {
65
  if ( class_exists( 'FL_Cache_Buster' ) ) {
66
  $settings = self::get_settings();
67
  if ( $settings['enabled'] ) {
68
- remove_action( 'upgrader_process_complete', array( 'FL_Cache_Buster', 'clear_caches' ) );
69
- remove_action( 'fl_builder_after_save_layout', array( 'FL_Cache_Buster', 'clear_caches' ) );
70
  remove_action( 'fl_builder_after_save_user_template', array( 'FL_Cache_Buster', 'clear_caches' ) );
71
- remove_action( 'fl_builder_cache_cleared', array( 'FL_Cache_Buster', 'clear_caches' ) );
72
- remove_action( 'template_redirect', array( 'FL_Cache_Buster', 'donotcache' ) );
73
  }
74
  }
75
  }
9
  private static $plugins = array();
10
 
11
  private $actions = array(
12
+ 'fl_builder_cache_cleared',
13
+ 'fl_builder_after_save_layout',
14
+ 'fl_builder_after_save_user_template',
15
+ 'upgrader_process_complete',
16
  );
17
 
18
  function __construct() {
19
 
20
+ add_action( 'plugins_loaded', array( $this, 'unload_helper_plugin' ) );
21
+ add_action( 'plugins_loaded', array( $this, 'load_files' ) );
22
  add_action( 'fl_builder_admin_settings_save', array( $this, 'save_settings' ) );
23
  }
24
 
65
  if ( class_exists( 'FL_Cache_Buster' ) ) {
66
  $settings = self::get_settings();
67
  if ( $settings['enabled'] ) {
68
+ remove_action( 'upgrader_process_complete', array( 'FL_Cache_Buster', 'clear_caches' ) );
69
+ remove_action( 'fl_builder_after_save_layout', array( 'FL_Cache_Buster', 'clear_caches' ) );
70
  remove_action( 'fl_builder_after_save_user_template', array( 'FL_Cache_Buster', 'clear_caches' ) );
71
+ remove_action( 'fl_builder_cache_cleared', array( 'FL_Cache_Buster', 'clear_caches' ) );
72
+ remove_action( 'template_redirect', array( 'FL_Cache_Buster', 'donotcache' ) );
73
  }
74
  }
75
  }
extensions/fl-builder-cache-helper/plugins/defines.php CHANGED
@@ -3,7 +3,7 @@ namespace FLCacheClear;
3
  class Defines {
4
 
5
  var $actions = array(
6
- 'fl_builder_init_ui'
7
  );
8
 
9
  static function run() {
3
  class Defines {
4
 
5
  var $actions = array(
6
+ 'fl_builder_init_ui',
7
  );
8
 
9
  static function run() {
extensions/fl-builder-cache-helper/plugins/hummingbird.php CHANGED
@@ -8,8 +8,8 @@ class Hummingbird {
8
  static function run() {
9
  if ( class_exists( '\WP_Hummingbird_Utils' ) ) {
10
  if ( \WP_Hummingbird_Utils::get_module( 'page_cache' )->is_active() ) {
11
- \WP_Hummingbird_Utils::get_module( 'page_cache' )->clear_cache();
12
- \WP_Hummingbird_Module_Page_Cache::log_msg( 'Cache cleared by Beaver Builder.' );
13
  }
14
  }
15
  }
8
  static function run() {
9
  if ( class_exists( '\WP_Hummingbird_Utils' ) ) {
10
  if ( \WP_Hummingbird_Utils::get_module( 'page_cache' )->is_active() ) {
11
+ \WP_Hummingbird_Utils::get_module( 'page_cache' )->clear_cache();
12
+ \WP_Hummingbird_Module_Page_Cache::log_msg( 'Cache cleared by Beaver Builder.' );
13
  }
14
  }
15
  }
extensions/fl-builder-multisite/classes/class-fl-builder-multisite.php CHANGED
@@ -14,10 +14,10 @@ final class FLBuilderMultisite {
14
  * @return void
15
  */
16
  static public function init() {
17
- add_action( 'wpmu_new_blog', __CLASS__ . '::install_for_new_blog', 10, 6 );
18
- add_filter( 'wpmu_drop_tables', __CLASS__ . '::uninstall_on_delete_blog' );
19
- add_filter( 'fl_builder_activate', __CLASS__ . '::activate' );
20
- add_filter( 'fl_builder_uninstall', __CLASS__ . '::uninstall' );
21
  }
22
 
23
  /**
@@ -48,8 +48,8 @@ final class FLBuilderMultisite {
48
  global $blog_id;
49
  global $wpdb;
50
 
51
- $original_blog_id = $blog_id;
52
- $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
53
 
54
  foreach ( $blog_ids as $id ) {
55
  switch_to_blog( $id );
@@ -92,8 +92,8 @@ final class FLBuilderMultisite {
92
  global $blog_id;
93
  global $wpdb;
94
 
95
- $original_blog_id = $blog_id;
96
- $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
97
 
98
  foreach ( $blog_ids as $id ) {
99
  switch_to_blog( $id );
@@ -131,7 +131,7 @@ final class FLBuilderMultisite {
131
  $like = like_escape( esc_sql( $blog_id ) );
132
  }
133
 
134
- return $wpdb->get_row( $wpdb->prepare( "SELECT blog_id FROM $wpdb->blogs WHERE blog_id = '%s'", $like ) );
135
  }
136
  }
137
 
14
  * @return void
15
  */
16
  static public function init() {
17
+ add_action( 'wpmu_new_blog', __CLASS__ . '::install_for_new_blog', 10, 6 );
18
+ add_filter( 'wpmu_drop_tables', __CLASS__ . '::uninstall_on_delete_blog' );
19
+ add_filter( 'fl_builder_activate', __CLASS__ . '::activate' );
20
+ add_filter( 'fl_builder_uninstall', __CLASS__ . '::uninstall' );
21
  }
22
 
23
  /**
48
  global $blog_id;
49
  global $wpdb;
50
 
51
+ $original_blog_id = $blog_id;
52
+ $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
53
 
54
  foreach ( $blog_ids as $id ) {
55
  switch_to_blog( $id );
92
  global $blog_id;
93
  global $wpdb;
94
 
95
+ $original_blog_id = $blog_id;
96
+ $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
97
 
98
  foreach ( $blog_ids as $id ) {
99
  switch_to_blog( $id );
131
  $like = like_escape( esc_sql( $blog_id ) );
132
  }
133
 
134
+ return $wpdb->get_row( $wpdb->prepare( "SELECT blog_id FROM $wpdb->blogs WHERE blog_id = '%s'", $like ) ); // @codingStandardsIgnoreLine
135
  }
136
  }
137
 
fl-builder.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Beaver Builder Plugin (Lite Version)
4
  * Plugin URI: https://www.wpbeaverbuilder.com/?utm_medium=bb&utm_source=plugins-admin-page&utm_campaign=plugins-admin-uri
5
  * Description: A drag and drop frontend WordPress page builder plugin that works with almost any theme!
6
- * Version: 2.2.0.6
7
  * Author: The Beaver Builder Team
8
  * Author URI: https://www.wpbeaverbuilder.com/?utm_medium=bb&utm_source=plugins-admin-page&utm_campaign=plugins-admin-author
9
  * Copyright: (c) 2014 Beaver Builder
3
  * Plugin Name: Beaver Builder Plugin (Lite Version)
4
  * Plugin URI: https://www.wpbeaverbuilder.com/?utm_medium=bb&utm_source=plugins-admin-page&utm_campaign=plugins-admin-uri
5
  * Description: A drag and drop frontend WordPress page builder plugin that works with almost any theme!
6
+ * Version: 2.2.1.4
7
  * Author: The Beaver Builder Team
8
  * Author URI: https://www.wpbeaverbuilder.com/?utm_medium=bb&utm_source=plugins-admin-page&utm_campaign=plugins-admin-author
9
  * Copyright: (c) 2014 Beaver Builder
fonts/fontawesome/css/all.min.css CHANGED
@@ -1,5 +1 @@
1
- /*!
2
- * Font Awesome Free 5.6.3 by @fontawesome - https://fontawesome.com
3
- * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4
- */
5
- .fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-icicles:before{content:"\f7ad"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}
1
+ .fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}
 
 
 
 
fonts/fontawesome/webfonts/fa-brands-400.eot CHANGED
Binary file
fonts/fontawesome/webfonts/fa-brands-400.svg CHANGED
@@ -1,1260 +1,3300 @@
1
- <?xml version="1.0" standalone="no"?>
2
  <!--
3
- Font Awesome Free 5.6.3 by @fontawesome - https://fontawesome.com
4
  License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
5
  -->
6
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
7
- <svg xmlns="http://www.w3.org/2000/svg">
 
 
 
 
 
8
  <defs>
9
- <font id="fontawesome-free" horiz-adv-x="640.4">
10
- <font-face font-family="Font Awesome 5 Brands"
11
- units-per-em="512" ascent="448"
12
- descent="64"
13
- font-weight="400"
14
- font-style="Regular" />
15
- <missing-glyph horiz-adv-x="0" />
16
- <glyph glyph-name="500px"
17
- unicode="&#xF26E;"
18
- horiz-adv-x="448" d=" M103.3 103.7C96.8 117.9 96.4 122 110.7 126.8C136.3 134.8 118.7 117.6 153.9 77.6H154.2V171.5C155.4 221.7 198.2 263.7 251.9000000000001 263.7C305.8 263.7 349.6 220.2 349.6 166.9C349.6 103.5 288.8 53.7 221.1 73.6C210.6 77.8 219 105.3 229.6 102.2C282.6 102.2 319 112.3 319 166.6C319 227.6 241.9 256.2000000000001 202.1 211.2C178.6 184.8 184.5 169.1 184.5 53.6C235.2 22.6 302.8 31.6 344.9 73.7000000000001C369.7 98.5000000000001 383.4 131.7000000000001 383.4 166.7000000000001C383.4 201.9 369.6 234.9000000000001 344.6 260.0000000000001C319.8 284.8000000000001 286.8 298.5000000000001 251.3 298.5000000000001S182.5 284.7000000000001 157.8 260.0000000000001C157.5 259.7000000000001 141.8 243.5000000000001 136.6 236.1000000000001L136.1 235.5000000000001C132.8 230.8000000000001 129.8 226.4000000000001 116 229.4000000000001C109.1 231.1000000000001 101.7 235.2000000000001 101.7 241.2000000000001V428C101.7 433 105.6 438.5 112.2 438.5H353.5C361.8 438.5 361.8 426.9 361.8 423.4C361.8 419.5 361.8 408.3 353.5 408.3H130.3V275.4H130.6C234.8 385.2 413.4000000000001 311.4 413.4000000000001 166.5C413.4000000000001 -11.6 168.6 -53.8 103.3 103.7zM166.6 364.5C166.1 360.3 171.2 340 181.2 343.9C306 391.4 384 303.5 390.6 303.5C395.4000000000001 303.5 413.4000000000001 318.8 404.9000000000001 326.3C311.7000000000001 415.3 170.4 383.3 166.6 364.5zM393 33.3C283 -76.6 94 -27.5 61 137.5C61 149.7 30.6 144.9 32.1 134.2C56.1 -39.2 278.1 -122.7 413.7000000000001 12.9C420.6 20.7 401.1 41.3 393.0000000000001 33.3zM213.6 141.4C213.6 137.4 217.9 134.1 219.1 132.9C222.1 129.9 225.2 128.5 227.6 128.5C231.4 128.5 230.2 128.3 249.9 148C269.5 128.7 269 128.5 272.2 128.5C277.6 128.5 290.7 138.9 282.9 146.7L265.6 164L283.8 182.2C290.1 189 273.7 204 267.6 197.9L249.7 180C231.1 198.8 231.3 199.5 228.2 199.5C223.2 199.5 210.2 187.8 215.8 182.2L234 164C215.9 146.1 213.6 144.8 213.6 141.4z" />
19
- <glyph glyph-name="accessible-icon"
20
- unicode="&#xF368;"
21
- horiz-adv-x="448" d=" M423.9 192.2L411 34.9C407.7 -5.8 347.1 -0.2 350.4 39.8L360.4 162.3L319.3 160C329.4 139.3 335.1 116.1 335.1 91.4999999999999C335.1 50.3 319 12.8 292.8 -15.0000000000001L253.5 24.3C311.3999999999999 87.9999999999999 266.6 191.5 179.5 191.5C153.5999999999999 191.5 130 181.6 112.2999999999999 165.5L73 204.8C95 225.5 123.1 239.9 154.4 245L229.7 330.7L187.1 355.5L135.5 309.5C105.5 282.7 64.9 328 95 354.9L163 415.6C172.8 424.4000000000001 187.1 425.8 198.5 419.2C198.5 419.2 337.8 338.3 338 338.1C354.2 328 358.7 302.1 344.1 285.5L285.7 219L391.8 224.9C410.3 226 425.4 210.5 423.9 192.2zM359 346.2C387.1 346.2 409.9 369 409.9 397.1C409.9 425.2 387.1 448 359 448C330.9 448 308.1 425.2 308.1 397.1C308.1 369 330.9000000000001 346.2 359 346.2zM179.6 -8.5C99 -8.5 52.2 82.1 96.9 147.6L57.2 187.3C36.4 161 24 127.7 24 91.6C24 -39.1 174.7 -109.7999999999999 275.4 -30.9L235.7 8.8C219.7 -2.1 200.4 -8.5 179.6 -8.5z" />
22
- <glyph glyph-name="accusoft"
23
- unicode="&#xF369;"
24
- horiz-adv-x="640" d=" M482.2 75.9C476.5 82.8 250 373 242.3 382.5C228.6 399.7 242.3 399.3 261.5 399.4C271.2 399.5 367.8 400 378 400C402.1 400.1 406.7 399.4 416.4 387.2C418.5 384.5 621.5 141.4 623.5999999999999 138.9C629.0999999999999 132.2 638.8 119.8 630.8 115.5C628.4 114.2 516.1999999999999 67.8 513 66.6C502.9 62.6 495.5 59.8 482.2 75.9M596.9 81.5000000000001S481.9 31.1000000000001 479.4 29.9C463.4 22.6 452.5 33.1 442.7 44.5000000000001L385.6 118.5000000000001C380.2 119.4 325.2 128.1000000000001 320.3 127.8000000000001C317.2 127.6000000000001 310.7 127.0000000000001 305.9 124.9000000000001C301 122.8000000000001 160.7 72.1000000000001 155.7 70.2000000000001C150.6 68.2000000000001 144.3 66.6000000000001 144.6 62.6000000000001C144.8 60.1000000000001 146.6 60.0000000000001 149.2 59.1000000000001C151.9 58.3000000000001 450.1 -8.4999999999999 457.2 -9.9999999999999C472.8 -13.2999999999999 495.7 -20.4999999999999 510.8 -11.6999999999999C512.9 -10.4999999999999 634.6 64.7000000000002 636.6 66.1000000000001C642 70.1000000000001 640.9 72.9000000000002 634.9 74.3000000000001C632.6 74.6000000000001 610.3 79.0000000000001 596.9 81.5000000000001M270.9 262.8000000000002S258.9 261.2000000000002 245.9 247.7000000000002C236.9 238.4000000000001 3.8 8.6000000000001 2.5 6.8000000000001C-4.5 -3.1999999999999 4.1 1e-13 18.2 5.1000000000001C19 5.1000000000001 132.7 41.7000000000002 132.7 41.7000000000002C133.2 42.3000000000002 132.6 41.8000000000002 133.3 42.3000000000002C132.9 47.4000000000002 132.5 68.5000000000002 132.3 70.0000000000002C131.7 75.2000000000002 134.5 76.9000000000002 139.3 78.9000000000002L231.9 112.7000000000002C232.5 113.5000000000002 320.4 194.4000000000002 322.1 196.0000000000002V197.0000000000002L270.9 262.8000000000002" />
25
- <glyph glyph-name="acquisitions-incorporated"
26
- unicode="&#xF6AF;"
27
- horiz-adv-x="344.76" d=" M344 448C343.19 442.53 342.37 437.21 341.61 431.88C340.2200000000001 422.14 338.7100000000001 412.4 337.56 402.63C337.21 399.67 336.35 398.31 333.26 398.3C312.65 398.19 292.05 398.16 271.44 397.77C252.68 397.42 233.86 397.49 215.21 395.77C201.79 394.53 191.93 383.1 196.33 369.13C204.88 342.02 223.98 300.03 232.7 279.68C298.42 125.54 294.13 122.69 316.7000000000001 121.12C323.3700000000001 120.66 330.1 121.05 337.1300000000001 121.05C338.5200000000001 111.65 339.7900000000001 103.01 341.1800000000001 93.54H225.17V120.54C235.5 120.54 245.53 120.66 255.55 120.48C259.07 120.42 260.6 121.11 258.99 124.85C254.55 135.1400000000001 250.22 145.48 245.74 155.75C244.12 159.47 241.68 160.53 237.34 159.27C225.02 155.68 212.55 152.58 200.08 149.58C195.83 148.56 194.15 146.81 194.22 142.12C195.07 84.65 195.17 14.59 195.22 13C195.62 0.46 203.97 -8.41 216.25 -10.07C217.14 -10.19 229.14 -12.79 328.93 -12.63C337.18 -12.62 337.3400000000001 -12.46 338.5 -20.19C340.65 -34.53 342.64 -48.89 344.76 -63.72C-22.99 -63.72 190.83 -64.33 7.67 -63.72C3.72 -63.71 1.59 -63.03 2.39 -57.98C4.43 -45.12 5.89 -32.16 7.36 -19.22C7.91 -14.41 9.65 -12.41 14.99 -12.45C133.08 -13.4400000000001 129.92 -12.8000000000001 136.42 -10.0600000000001C145.84 -6.08 151.4 2.79 151.37 13.0099999999999C151.25 55.9399999999999 151.04 98.87 151.12 141.8C151.13 145.67 149.96 147.79 146.56 148.6399999999999C130.92 152.56 115.25 156.3499999999999 98.98 160.3399999999999C93.75 148.0699999999999 88.59 135.9699999999999 83.32 123.6399999999999C85.15 120.2899999999999 111.7 120.7099999999999 118.6 120.7099999999999V93.0699999999999H4.34C5.37 101.68 6.11 109.8799999999999 7.57 117.9499999999999C7.82 119.36 11.1 121.0899999999999 13.04 121.17C21.5 121.52 29.99 121.46 38.47 121.2599999999999C42.46 121.17 44.39 122.3 46.08 126.42C62.71 167.12 59.59 157.59 113.39 287.39C144.92 363.48 146.45 363.41 146.03 374.82C145.34 393.38 120.66 397.08 108.38 396.93C78.34 396.55 69.93 397.4 6.54 397.4C-0.62 441.89 2.37 429.46 0.16 442.68C-0.55 446.92 1.19 447.9700000000001 4.8 447.98M117.88 200.79C120.18 199.64 121.85 198.5 123.7 197.92C136.99 193.71 150.34 189.68 163.63 185.46C169.77 183.51 175.61 183.34 181.93 185.41C194.95 189.69 208.22 193.22 221.36 197.14C222.82 197.58 224.1 198.58 225.29 199.23C218.58 216.6 212.17 233.38 205.62 250.11C196.74 272.78 187.99 310.43 178.64 332.92C177.11 333.7 176.73 330.56 169.21 332.92C152.1 288.87 135.07 245.04 117.88 200.79z" />
28
- <glyph glyph-name="adn"
29
- unicode="&#xF170;"
30
- horiz-adv-x="496" d=" M248 280.5L312.9 181.7H183.1L248 280.5zM496 192C496 55.1 384.9 -56 248 -56S0 55.1 0 192S111.1 440 248 440S496 328.9 496 192zM396.2 109.3L248 332.5L99.8 109.3H130.2L163.8 161H332.4L366 109.3H396.2z" />
31
- <glyph glyph-name="adobe"
32
- unicode="&#xF778;"
33
- horiz-adv-x="460.8" d=" M289.9 383.7H460.8V-0.3L289.9 383.7zM170.9 383.7H0V-0.3L170.9 383.7zM230.4 241.6L337.9 -0.3H264.9L234.2 76.5000000000001H155.5L230.4 241.6000000000001z" />
34
- <glyph glyph-name="adversal"
35
- unicode="&#xF36A;"
36
- horiz-adv-x="512" d=" M482.1 416H28.7C5.8 416 0 410.1 0 387.1V-3.1C0 -26.4 5.8 -32 28.7 -32H482.1C506.4999999999999 -32 511.9999999999999 -26.8 511.9999999999999 -2.3V385.8C511.9999999999999 410.4 506.6 416 482.1 416zM178.4 227.7C150.9 247.9 106.3 236.4 94.2 204.3C89.9 193.2 84.9 194.8 76.7 196C67 197.5 59.5 199.2 54.2 201.5C25.4 212.9 62.8 256.8 79.1 265.8C120.2 287.2 162.5 288 204.4 270.6C245.3 253.8 238.9 211.4 238.9 142.1C241.6 116.3 234.6 83.8 248.2 53.3C250.1 48.9 248.6 45.4 245.5 42.6C237.1 35.9 206.2 40.4 198.9 49.9999999999999C197 52.1999999999999 197.1 53.6 195 56.1999999999999C191.4 60.0999999999999 187.7 58.3999999999999 183.1 55.1999999999999C125.7 18.8 42.8 33.8 36.1 98.4999999999999C33 127.8 48.5 155.6 75.7 169.5C113.9 189 187.9 181.3 189.7 200.4C190.8 210.5999999999999 187.8 220.5 178.4 227.7zM465.1 5.7C465.1 -9.4 454 -4.2 447.3 -4.2H52.4C45 -4.2 34.2 -9 34.6 6.5C35 20.4 45.1 15.6 51.7 15.6C184 16 316.2 16 448.5 15.6C455.3 15.6 465.1 20 465.1 5.7zM468.9 346.2V55.2C468.9 49.5 468.2 41.3 460.8 41.3C448.4000000000001 41.7 433.3 34.2 424.7 46.9C418.9 55.6 416.9 50.9 412.3 48.1C358.9000000000001 18.4 284.2000000000001 41 267.9 133.3C261.8 166.7 267.2 200.4 283.6 233.3C295.4 257.2000000000001 340.5 309.4 419.7 263.8V334.8C419.7 361 419.5999999999999 361 445.7 361C448.8 361 452.3 360.6 455.3999999999999 361C465.4999999999999 361.8 468.9999999999999 356.6 468.9999999999999 346.7000000000001C468.8999999999999 346.5 468.8999999999999 346.4000000000001 468.8999999999999 346.2000000000001zM417.4000000000001 113.9C397.9000000000001 66.3 344.5 70.6 327.4000000000001 108.7C312.3 142 311.9000000000001 176.9 327.8 210.2C344.1 244.3 387.5 245.9 409.3 215C429.9000000000001 186.2 424.2 130.4 417.4000000000001 113.9zM122.6 78.6C115.1 79.9 89.6 81.9 88.9 106.4C88.5 120.3 96.7 129.4 108.7 132.2C133.1 138.1 158 142.1 182.4 146.9C191.3000000000001 148.9 189.8000000000001 142.5 190.2000000000001 137.4C191.6000000000001 104.4 164.1000000000001 78.2 122.6000000000001 78.6z" />
37
- <glyph glyph-name="affiliatetheme"
38
- unicode="&#xF36B;"
39
- horiz-adv-x="512" d=" M159.7 210.6C108.4 139.7 43.1 99.8 14 121.4C-15.2 143.1 2.8 218 54.2 288.9C105.5 359.8 170.8 399.7 199.9 378.1C229 356.5 211 281.5 159.7 210.6zM510.9 267.9C437.1 144.5 319 80.2 246.4 124.3C221.4 139.5 205.1 165.5 197.4 198.1C163.8 133.3 104.6 84.3 33.3 64.9C83.1 5.6 157.4 -32 240.3 -32C390.3 -32 511.9 91.1 511.9 242.9C512 251.4 511.6 259.7 510.9 267.9z" />
40
- <glyph glyph-name="algolia"
41
- unicode="&#xF36C;"
42
- horiz-adv-x="448" d=" M229.3 265.4C180 265.4 140.1 225.5 140.1 176.2C140.1 126.9 180 87 229.3 87S318.5 126.9 318.5 176.2C318.5 225.5 278.5 265.4 229.3 265.4zM292 208.8L233.1 178.2C231.3 177.3 229.3 178.6 229.3 180.5V247C229.3 248.5 230.6 249.7 232 249.6C258.2 248.6 280.9 233.9 293.1 212.5C293.8 211.2 293.3 209.5 292 208.8zM389.1 416H58.9C26.4 416 0 389.6 0 357.1V27C0 -5.6 26.4 -32 58.9 -32H389C421.6 -32 447.9 -5.6 447.9 26.9V357.1C448 389.6 421.6 416 389.1 416zM186.5 331.3C186.5 342.1 195.2 350.8 206 350.8H251.3C262.1 350.8 270.8 342.1 270.8 331.3V315.9C270.8 314.1 269.1 312.9 267.5 313.4C255.2 316.8 242.4 318.5 229.4 318.5C215.9 318.5 202.7 316.7 190 313C188.3 312.5 186.6 313.8 186.6 315.5V331.3zM102.1 294.3L111.3 303.5C118.9 311.1 131.2 311.1 138.8 303.5L146.5 295.8C147.6 294.7000000000001 147.5 292.8 146.2 291.8C140 287.3 134.1 282.4 128.6 276.9C123.2 271.5 118.2 265.6 113.8 259.5C112.8 258.2 110.9 258 109.8 259.2L102.1 266.9C94.5 274.4 94.5 286.7 102.1 294.3zM229.3 49.5C159.3 49.5 102.7 106.2 102.7 176.1S159.4 302.7000000000001 229.3 302.7000000000001C299.3 302.7000000000001 355.9 246.1 355.9 176.1C355.9 106.3 299.2 49.5 229.3 49.5z" />
43
- <glyph glyph-name="alipay"
44
- unicode="&#xF642;"
45
- horiz-adv-x="448" d=" M377.74 416H70.26C31.41 416 0 384.5900000000001 0 345.74V38.26C0 -0.59 31.41 -32 70.26 -32H377.74C416.26 -32 447.5 -0.92 448 37.6C402.04 63.22 337.41 97.9400000000001 276.4 126.04C244.33 82.0700000000001 192.26 45.04 127.78 45.04C57.19 45.04 34.05 90.34 30.74 121.41C26.77 160.42 45.62 202.91 130.26 202.91C165.64 202.91 209.61 192.66 257.39 177.9500000000001C273.92 208.0400000000001 283.84 238.2900000000001 283.84 238.2900000000001H105.64V254.9900000000001H197.72V286.23H88.28V305.24H197.72V355.66H248.64V305.24H358.08V286.23H248.63V254.99H337.4S322.19 208.37 299.05 164.07C347.98 147.37 399.06 128.03 447.67 111.33V345.74C447.83 384.43 416.43 416 377.74 416zM47.28 125.05C48.27 104.88 57.53 71.32 117.21 71.32C169.28 71.32 209.79 111 235.08 144.22C190.45 162.9 150.6 175.6300000000001 125.64 175.6300000000001C58.19 175.6300000000001 46.29 142.5700000000001 47.28 125.0500000000001z" />
46
- <glyph glyph-name="amazon-pay"
47
- unicode="&#xF42C;"
48
- horiz-adv-x="611.2" d=" M0 122.8C2.3 127 5.2 127.7 9.7 125.3C20.1 119.7 30.3 113.9 40.9 108.6C81.6 88.2000000000001 124.1 73 168.3 62.3C189.2 57.3 210.2 53.3 231.5 50.5C263 46.3 294.7 44.5 326.5 45.3C343.9 45.7 361.3 47.1 378.6 49.1C435 55.8 489.5 69.9 541.9000000000001 91.9C544.8000000000001 93.1 547.8000000000001 93.9 551.0000000000001 93.1C557.7000000000002 91.3 560.0000000000001 84.1 555.1000000000001 79.2000000000001C552.3000000000002 76.4 548.8000000000002 74.1 545.5000000000001 71.8000000000001C514.8000000000001 50.7 481.3000000000001 35.4000000000001 445.9000000000001 23.9000000000001C421.3000000000001 16.0000000000001 396.3000000000001 10.1000000000001 370.8000000000001 6.3000000000001C353.2000000000001 3.7 335.4000000000001 1.9000000000001 317.6000000000001 1.5000000000001C316.8000000000001 1.5000000000001 315.9000000000001 1.3000000000001 315.1000000000001 1.2H294C293.2 1.3000000000001 292.3 1.5000000000001 291.5 1.5000000000001C287.9 1.7 284.3 1.8000000000001 280.8 1.9C263.9000000000001 2.6 247.1 4.5000000000001 230.4 7.2C203 11.7 176.2 18.6 150 28.1C95.9 47.7 47.4 76.7000000000001 4.4 115.1C2.6 116.7000000000001 1.4 118.9 0 120.8V122.8zM158 383C156.6 382.8 155.1 382.6 153.7 382.4C139.7 380.7 127.1 375.5 115.7 367.3C113.3 365.6 111.1 363.8 108.6 361.9C108.4 362.4 108.2 362.9 108.2 363.3C107.8 366 107.4 368.8 106.9 371.5C106.2 376.1 103.9 378.1 99.3 378.1H87.8C80.9 378.1 79.6 376.8 79.6 369.9V160.6C79.6 159.6 79.6 158.6 79.7 157.6C79.9 154.6 81.7 152.7000000000001 84.6 152.6C91.6 152.5 98.7 152.5 105.7 152.6C108.6 152.6 110.4 154.6 110.7 157.6C110.8 158.6 110.8 159.6 110.8 160.6V233C111.9 232.1 112.5 231.6 113 231.1C130.9 216.2 151.5 211.3 174 215.7C194.4 219.7 208.6 232.2 217.8 250.6C224.8 264.5 227.7 279.3 228.1 294.7C228.6 311.8 226.9000000000001 328.6 220 344.5C211.5 364.1 197.4 377 176.1 381.4C172.9 382.1 169.6 382.4 166.3 382.9C163.5 383 160.8 383 158 383zM110.6 341.1C110.6 342.6 111 343.5 112.3 344.4C126 353.9 141.1 358.9 157.9 357.6C172.8 356.5 185 349.2 191.4 331.7C195.3 321 196.3 309.9 196.3 298.7C196.3 288.3 195.5 278.1 192.3 268.1C185.5 246.8 169.9 238.7 149.7 239.6C135.7 240.2 123.5 245.6 112.3 253.5C111.1 254.4 110.6 255.2 110.6 256.8C110.7 270.9 110.6 284.9 110.6 299C110.6 313 110.7 327 110.6 341.1zM316.3 383C315.3 382.9 314.3 382.7 313.4000000000001 382.6C303.6 382.1 294.0000000000001 380.9 284.5000000000001 378.5C278.4000000000001 376.9 272.5000000000001 374.7 266.6000000000001 372.7C263.0000000000001 371.5 261.2000000000001 368.9 261.3000000000001 365C261.4000000000001 361.7 261.2000000000001 358.4 261.3000000000001 355.1C261.4000000000001 350.3 263.4000000000001 349 268.1000000000001 350.2C275.9000000000001 352.2 283.7000000000001 354.4 291.6000000000001 355.9C303.9000000000001 358.2 316.3000000000001 359.2 328.8000000000001 357.3C335.3000000000001 356.3 341.4000000000001 354.4 345.6000000000001 348.9C349.3000000000001 344.1 350.7000000000001 338.4 350.9000000000001 332.5C351.2000000000001 324.2 351.1000000000001 315.9 351.2000000000001 307.6C351.2000000000001 307.2 351.1000000000001 306.7 351.0000000000001 306.2C350.5000000000001 306.3 350.1000000000002 306.2 349.7000000000001 306.3C339.2000000000001 308.8 328.6000000000001 310.6 317.7000000000001 311.2C306.4000000000001 311.8 295.2000000000001 311.1 284.4000000000001 307.3C271.5000000000001 302.8 261.1000000000001 295 255.0000000000001 282.4C250.3000000000001 272.6 249.6000000000001 262.2 251.1000000000001 251.7C253.1000000000001 237.7 260.1000000000001 226.9 272.5000000000001 220C284.4000000000001 213.4 297.3000000000001 212.6 310.4000000000001 214.6C325.5000000000001 216.9 338.9000000000001 223.3 350.7000000000001 233C351.1 233.4 351.6 233.7 352.3000000000001 234.1C352.9000000000001 230.3 353.4000000000001 226.7 354.1000000000001 223.1C354.7000000000001 220 356.6000000000001 218 359.5000000000001 217.9C364.9000000000001 217.8 370.4000000000001 217.8 375.8000000000001 217.9C378.5000000000001 218 380.3000000000001 219.8 380.6000000000001 222.6C380.7000000000001 223.5 380.7000000000001 224.5 380.7000000000001 225.4V331.4C380.7000000000001 335.7 380.5000000000001 340 379.8000000000002 344.3C377.9000000000002 357.2000000000001 372.4000000000002 367.8 360.8000000000002 374.7000000000001C354.1000000000002 378.7000000000001 346.7000000000001 380.7000000000001 339.0000000000001 381.8C335.4000000000001 382.3 331.8000000000002 382.6 328.2000000000001 383.1C324.3000000000002 383 320.3000000000002 383 316.3000000000002 383zM351.3 255.3C351.3 254 350.9000000000001 253.1 349.8 252.3C338.6 244.2 326.3 238.8 312.4000000000001 237.4C306.7000000000001 236.8 301.0000000000001 237 295.6 239.2C289.3 241.7 285.2000000000001 246.1 283.2000000000001 252.5000000000001S281.2000000000001 265.5 283.1 271.9000000000001C285.6 280.2000000000001 291.5 284.9000000000001 299.5 287.5C307.6 290.1 316 290.5 324.3 289.7000000000001C332.7 289 340.9000000000001 287.4 349.3 286.3C350.9000000000001 286.1 351.4000000000001 285.3 351.4000000000001 283.7000000000001C351.3 278.9 351.4000000000001 274.2000000000001 351.4000000000001 269.4C351.3 264.7000000000001 351.2000000000001 260 351.3 255.3zM611.2 125.9C610.2 130.9 606.4000000000001 132.8 602.1 134.2C595.3000000000001 136.5 588.2 137.5 581.1 138.1C568 139.2 554.9 138.6 541.9 136.2C527.6 133.5 514 128.9 501.9 120.6C500.5 119.6 499.1 118.5 498.2 117.1C497.5 116 497.3 114.3 497.7 113.1C498.1 111.6 499.8 111.2 501.3 111.3C502 111.3 502.8 111.3 503.5 111.4C511.3 112.2 519 113.1 526.8 113.9C538.1999999999999 115 549.6999999999999 115.7 561.0999999999999 114.8C565.8999999999999 114.5 570.8 113.4 575.4999999999999 112.1C580.5999999999999 110.7 582.8999999999999 106.9 583.0999999999999 101.7C583.4999999999999 93.7 581.6999999999999 86 579.5999999999999 78.4C575.4999999999999 63 569.5999999999999 48.1 563.8 33.3C563.4 32.3 563 31.3 562.8 30.3C562.3 27.4 564 25.4999999999999 566.9 26.1999999999999C568.6 26.5999999999999 570.5 27.4999999999999 571.6999999999999 28.6999999999999C576.0999999999999 32.9999999999999 580.5999999999999 37.3 584.4 42.0999999999999C597.1999999999999 58.4999999999999 604.6999999999999 77.3999999999999 609.1 97.6999999999999C609.9 101.3 610.5 104.9999999999999 611.2 108.5999999999999V125.8999999999999zM479.1 249.1C466.2 284.8 453.3 320.6 440.4000000000001 356.3C438.4000000000001 362 436.2000000000001 367.6 434.1 373.2C433 376.1 430.9000000000001 378 427.7000000000001 378C420.1 378.1 412.5000000000001 378.2 404.8000000000001 378.1C402.3000000000001 378.1 401.1000000000001 376.1 401.6000000000001 373.6C402.1000000000001 371.5 402.7000000000001 369.5 403.5000000000001 367.5C423.1000000000001 319 442.8000000000001 270.4 462.6000000000001 222C464.3000000000001 217.9 464.7000000000001 214.4 462.8000000000001 210.2C459.5000000000001 202.9 456.9000000000001 195.2 453.5000000000001 187.9C450.5000000000001 181.4 445.5000000000001 176.5 438.3000000000001 174.6C433.2000000000001 173.2 428.1000000000001 173 422.9000000000001 173.5C420.4000000000001 173.6999999999999 417.9000000000001 174.3 415.4000000000001 174.5C412.0000000000001 174.6999999999999 410.3000000000001 173.1999999999999 410.2000000000001 169.6999999999999C410.1000000000001 166.3999999999999 410.1000000000001 163.0999999999999 410.2000000000001 159.8C410.3000000000002 154.3 412.2000000000001 151.8 417.6000000000001 150.9C423.2000000000001 149.9 428.9000000000001 149 434.5000000000001 148.9C451.6000000000001 148.5 465.2 155.4 474.0000000000001 170.3C477.5000000000001 176.1999999999999 480.7 182.4 483.2 188.6999999999999C506.9 248.5 530.3000000000001 308.3999999999999 553.8000000000001 368.3C554.5000000000001 370.0999999999999 555.1 371.8999999999999 555.4000000000001 373.8C555.8000000000001 376.5999999999999 554.5000000000001 378.2 551.7 378.2C545.1 378.3 538.4000000000001 378.2 531.8000000000001 378.2C528.1 378.2 525.5000000000001 376.5999999999999 524.1 373C523.6 371.5999999999999 523 370.3 522.5 368.8999999999999C510.9 335.5999999999999 499.3 302.3 487.7 268.8999999999999C485.2 261.7 482.6 254.3999999999999 480 246.7C479.6 247.8 479.4 248.3999999999999 479.1 249.1z" />
49
- <glyph glyph-name="amazon"
50
- unicode="&#xF270;"
51
- horiz-adv-x="448" d=" M257.2 285.3C208.5 283.5 87.7 269.8 87.7 167.8C87.7 58.3 226 53.8 271.2 124.6C277.7 114.4 306.6 87.1 316.5 77.8L373.3 133.8S341 159.1 341 186.6V333.7C341 359 316.5 416 228.7 416C140.7 416 94 361 94 311.7L167.5 304.9C183.8 354.4 221.7 354.4 221.7 354.4C262.4 354.5 257.2 324.6 257.2 285.3zM257.2 198.5C257.2 118.5 173 130.5 173 181.3C173 228.5 223.5 238 257.2 239.1V198.5zM393.2 35C385.5 25 323.2 -32 218.7 -32S34.2 39.5 9.7 69C2.9 76.7 10.7 80.3 15.2 77.3C88.5 32.8 203 -40.5 387.7 47C395.2 50.7 401 45 393.2 35zM433 32.8C426.5 17 417 6 411.8 1.8C406.3 -2.7 402.3 -0.9 405.3 5.6S424.6 52.1 418 60.6C411.5 68.9 381 64.9 370 63.8C359.2 62.8 357 61.8 356 64.1C353.7 69.8 377.7 79.6 393.5 81.6C409.2 83.4 434.5 82.4 439.5 75.9C443.2 70.8 439.5 48.8 433 32.8z" />
52
- <glyph glyph-name="amilia"
53
- unicode="&#xF36D;"
54
- horiz-adv-x="448" d=" M240.1 416C178.2 416 108.6 399.1 55.9 360.6C50.8 357.5 46.8 351.4 48.7 341.2C49.8 336.1 53.8 313.8 58.9 301.6C63 291.4 73.1 291.4 79.2 295.5C111.7 317.8 175.7 343.2 231.5 343.2C289.4 343.2 290.4 314.8 290.4 270.1V231.6C203 220.3 78.2 197 46.7 183.8C11.2 167.5 16.3 90.3 16.3 72S31.5 -32 141.2 -32C189 -32 254.9000000000001 -11.3 294.5 10.1V-15.3C294.5 -18.3 296.6 -23.4999999999999 300.6 -24.4C303.7000000000001 -25.4 351.3 -26.4 360.5 -26.4S423 -26.7 427 -25.7C431.1 -24.7 432.1 -19.6 432.1 -16.6V280C432 360.3 374.2000000000001 416 240.1 416zM152.2 88.3C152.2 100.5 149.2 131 170.5 141.2C194.8 154.4 245.6 170.6 290.3 174.7V68C268.9000000000001 54.8 241.6 43.6 211.2 43.6C158.4 43.6 152.3 77.1 152.2 88.3" />
55
- <glyph glyph-name="android"
56
- unicode="&#xF17B;"
57
- horiz-adv-x="448" d=" M89.6 243.5V127.7C89.6 112.3 77.5 100 62.1 100C46.8 100 32 112.4 32 127.7V243.5C32 258.6 46.8 271 62.1 271C77.2 271 89.6 258.6 89.6 243.5zM100.4 86.5C100.4 70.1 113.6 56.9 130 56.9H149.9L150.2 -4.2C150.2 -41.1 205.4 -40.8000000000001 205.4 -4.2V56.9H242.6V-4.2C242.6 -40.9 298.1 -41.0000000000001 298.1 -4.2V56.9H318.3C334.5 56.9 347.7 70.1 347.7 86.5V265.9H100.4V86.5zM348.4 275.6H99.3C99.3 318.4 124.9 355.6 162.9 375L143.8 410.3C141 415.2 148.1 418.3 150.5 414.1L169.9 378.5C204.8 394 244.9 393.2 278.2 378.5L297.5 414C300 418.3 307 415.1 304.2 410.2L285.1 375C322.8 355.6 348.4000000000001 318.4 348.4000000000001 275.6zM177.7 331.1C177.7 336.8 173.1 341.6 167.2 341.6C161.5 341.6 157 336.8 157 331.1S161.6 320.6 167.2 320.6C173.1 320.6 177.7 325.4 177.7 331.1zM291.1 331.1C291.1 336.8 286.5 341.6 280.9000000000001 341.6C275.0000000000001 341.6 270.4000000000001 336.8 270.4000000000001 331.1S275.0000000000001 320.6 280.9000000000001 320.6C286.5000000000001 320.6 291.1 325.4 291.1 331.1zM385.9000000000001 271C370.8 271 358.4000000000001 258.9 358.4000000000001 243.5V127.7C358.4000000000001 112.3 370.8 100 385.9000000000001 100C401.3 100 416.0000000000001 112.4 416.0000000000001 127.7V243.5C416.0000000000001 258.9 401.2000000000001 271 385.9000000000001 271z" />
58
- <glyph glyph-name="angellist"
59
- unicode="&#xF209;"
60
- horiz-adv-x="448" d=" M347.1 232.6C358.8 265.2 392.5 359.5 392.5 389.7C392.5 416.3 376.8 438.6 348.8 438.6C304.2 438.6 264.2000000000001 306.9 251.7 275.5C242 304 196.6 448 156.6 448C125.5 448 110.9 425.1 110.9 396.3C110.9 361 145.1 269.5 157.5 234.3C151.2 236.6 144.4 238.6 137.5 238.6C114.1 238.6 89.2 209.5 89.2 186C89.2 177.1 94.1 164.6 97.2 156.3C60.3 146.3 46.1 121.7 46.1 84.6C46 12.4 114.4 -64 210.6 -64C328.6 -64 402 24.6 402 138.9C402 182 395.1 220.9 347.1 232.6zM311.7 340C315.7 352.3 332.8 404.3 348.8 404.3C357.4000000000001 404.3 359.7 395.4 359.7 388.3C359.7 369.2 321.1 263.7 312.6 240.3L278.6 246.3L311.7 340zM142.3 399.7C142.3 411.6 156.8 445.4 188.6 352.6L223.2 252.3C207.6 253.6 195.5 255.3 187.8 250.9C176.9 279.7000000000001 142.3 370.6 142.3 399.7000000000001zM140 204C169.3 204 207.1 109.4 207.1 96.6C207.1 91.5 202.2 85.2000000000001 196.5 85.2000000000001C175.6 85.2000000000001 119.6 162.1 119.6 182.9C119.7 190.6 132.3 204 140 204zM324.3 17.7C295.2 -14.3 258 -30.9 214.6 -30.9C155.2 -30.9 108.3 1.7 85.7 57.4C68.6 100.8 89.5 125.7 106.3 125.7C117.7 125.7 160.6 65.4 160.6 52.6C160.6 47.7 152.9 44.3 148.9 44.3C132.8000000000001 44.3 126.5 59.8 97.8 95.7C68.1 66 118.3000000000001 8.8 156.1 8.8C182.2 8.8 199.2 32.9999999999999 194.1 50.8C197.8 50.8 202.4 50.4999999999999 205.8 51.4C206.9 24.3 214.9 -8 247.5 -10.3C247.5 -9.4 249.5 -3.2 249.5 -2.9C249.5 14.4999999999999 238.9 29.7 238.9 47.4C238.9 75.7 260.6 103.1 282.6 119.1C290.6 125.1 300.3 128.8 309.7000000000001 132.2C319.4000000000001 135.9 329.7000000000001 140.2 337.1 147.6C336 158.8 331.4000000000001 168.7 320.2000000000001 168.7C292.5000000000001 168.7 199.6000000000001 164.7 199.6000000000001 208.4C199.6000000000001 215.1 199.7000000000001 221.5 217.0000000000001 221.5C249.3000000000001 221.5 331.3000000000001 213.5 355.3000000000001 192.4C373.4000000000001 176.3 379.6000000000001 79.2 324.3000000000001 17.7zM225.7 143.7C235.4 140.6 245.4 139.7 255.4 137.7C248 132.3 241.4 125.7 235.1 118.6C232.3 127.1 228.9 135.4 225.7 143.7z" />
61
- <glyph glyph-name="angrycreative"
62
- unicode="&#xF36E;"
63
- horiz-adv-x="640" d=" M640 209.8L636.8 181.6L602.3 179.3L600.3 161.2L634.8 163.5L631.5999999999999 135.3L597.1999999999999 133.1L594.9 113L629.3 115.2L626.3 89.1L561.5999999999999 84.9999999999999L574.3 198.1999999999999L527 82.8L495.1 80.8L471.3 198.6L501.6 200.6L515.2 121.2000000000001L546.9000000000001 203.6000000000001L640.0000000000001 209.8000000000001zM426.8 76.5L455.1 78.3L468 198.4L439.6 196.5L426.8 76.5zM162 59.9L142.6 95.9L139.1 58.5L110.9 56.8L113.6 85.9C102.6 67.9 81.6 51.6 56.7 50.1C23.9 48.1 -3 71 0.3 108.3C2.9 137.6 27 171.1 67.8 173.7000000000001C105.5 176.1 115.4 150.5000000000001 119.1 144.9L121.9 175.7000000000001L160.8 178.2000000000001C180.9 179.5000000000001 199.5 174.5000000000001 203.3 154.5000000000001L205.9 181.1000000000001L270.7 185.3000000000001L268 157.4000000000001L231.6 155.0000000000001L229.9 137.1000000000001L266.3 139.4000000000002L263.6 111.5000000000002L227.2 109.2000000000002L225.3 89.3000000000002L261.6 91.6000000000002L259.5 70.8000000000002L314.5 188.0000000000002L338.3 189.6000000000002L370.4 79L379.3 164.6L357 163.2000000000001L359.8999999999999 191.1L434.8999999999999 196L431.8999999999999 168L407.5999999999999 166.4L397.8999999999999 74.5L339.8999999999999 70.8L335.5999999999999 86.4L296.2 83.9L288.2 67.6L162 59.9zM117.7 130.1L91.3 128.4C84.6 140.8 76.9 145 65 144.2C46 143 31.7 126.7 30.4 110.9C29 94.9 37.7 78.4 59.1 79.7C71.9 80.5 80.4 88.3 88 98.6L115 100.3L117.7 130.1zM173.8 137.8C175 150.6999999999999 166.2 151.4 147.7 150.1999999999999L145 121.6999999999999C159.2 122.5999999999999 172.5 123.8 173.8000000000001 137.8zM194.9 66.9999999999999L200.7 127C195.7 113.5 186 105.8999999999999 172.8 100.3999999999999L194.9 66.9999999999999zM330.3 111.9999999999999L322.4000000000001 149.8L306.6 110.4999999999999L330.3 111.9999999999999zM160.2 186.5999999999999L155.9 204.0999999999999L116.3 201.4999999999999L108.2 183.2999999999999L76.3 181.1999999999999L133.3 303.0999999999999L157.2 304.6999999999999L187.9 202.6999999999999L197.8 307.3999999999999L224.8 309.1999999999999L262.6 245.5999999999999L269.1 312.1999999999999L297.6 314.0999999999999L293.6 272.8999999999999C301 286.3999999999999 316.5 317.5999999999999 357.2000000000001 320.3999999999999C397.7000000000001 323.1999999999999 409.6 291.0999999999999 410.6 290.0999999999999L413.9000000000001 322.0999999999999L453.2 324.7999999999999C465.9 325.6999999999999 481.0000000000001 324.4999999999999 489.5000000000001 315.0999999999999L485.1000000000001 326.9999999999999L517.3000000000001 329.1999999999999L530.2 285.9999999999999L553.2 331.6999999999999L584.2 333.8999999999999L540.6 255.4999999999999L535.8000000000001 211.1999999999999L507.4000000000001 209.2999999999999L512.2 253.5999999999999L496.4 296.5999999999999C497.4 274.2999999999999 487.2 256.4999999999999 464.4 246.9999999999999L489.6 208.1999999999999L453.2 205.7999999999999L434.0000000000001 242.5999999999999L430.0000000000001 204.2999999999999L401.6000000000001 202.3999999999998L404.9000000000001 233.8999999999999C398.2000000000001 224.5999999999998 385.2000000000001 198.4999999999998 345.3000000000001 195.8999999999998C319.1000000000001 194.1999999999999 299.7000000000001 206.1999999999999 289.9000000000001 235.0999999999999L285.9000000000001 194.7999999999999L260.9000000000001 193.1999999999999L223.3000000000001 256.4999999999999L217.0000000000001 190.2999999999999L160.2000000000001 186.5999999999999zM436.8000000000001 268.7C447.0000000000001 269.3999999999999 454.3000000000001 270.7999999999999 458.4000000000001 272.9999999999999C462.9000000000001 275.3999999999999 465.4000000000001 279.3999999999999 466.0000000000001 285.0999999999999C466.6000000000001 290.3999999999999 465.4000000000001 293.8999999999999 462.6000000000001 295.4999999999999C459.0000000000001 297.5999999999999 452.0000000000001 298.3 439.7000000000002 297.4999999999999L436.8000000000002 268.7zM327.7 234C333.3 228.1 340.4 225.5 349 226.1C353.7 226.4 358.1 227.9 362.3 230.2C367.8 233.2 372.9000000000001 238.2 377.4000000000001 244.5L343.2000000000001 242.2L345.6 266.1L408.7000000000001 270.4L409.9000000000001 282.4L378.7000000000001 280.3C374.6 284 370.9000000000001 286.9 367.6 288.4C363.6 290.1 359.5 291.2000000000001 355.4000000000001 290.9C347.4000000000001 290.4 340.1 287.3 333.4000000000001 281.7000000000001C325.7000000000001 275.3 321.4000000000001 267.2000000000001 320.5000000000001 257.3C319.4000000000001 247.7 321.9000000000001 240 327.7000000000001 234zM126.4 225.8L150.2 227.4L141.9 265L126.4 225.8z" />
64
- <glyph glyph-name="angular"
65
- unicode="&#xF420;"
66
- horiz-adv-x="415.6" d=" M169.7 179.9H245.9L207.8 271.5L169.7 179.9zM207.8 416L0 341.6L31.8 65.9L207.8 -32L383.8 65.9L415.6 341.6L207.8 416zM338 74.2H289.4L263.2 139.6H152.6L126.4 74.2000000000001H77.7L207.8 366.5L338 74.2z" />
67
- <glyph glyph-name="app-store-ios"
68
- unicode="&#xF370;"
69
- horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM127 63.5C121.5 53.9 109.2 50.7 99.7 56.2C90.1 61.7 86.9 74 92.4 83.5L106.7 108.2C122.8 113.1 136 109.3 146.3 96.8L127 63.5zM265.9 117.4H84C73 117.4 64 126.4 64 137.4S73 157.4 84 157.4H135L200.4 270.6L179.9 306C174.4 315.6 177.7 327.8 187.2 333.3C196.8 338.8 209 335.5 214.5 326L223.4 310.6L232.3000000000001 326C237.8000000000001 335.6 250.1000000000001 338.8 259.6 333.3C269.2000000000001 327.8 272.4000000000001 315.5 266.9000000000001 306L181.1 157.4H243.2C263.4000000000001 157.4 274.7000000000001 133.7 265.9000000000001 117.4zM364 117.4H335L354.6 83.5C360.1 73.9 356.8 61.7 347.3 56.2C337.7 50.7 325.5 54 320 63.5C287.1 120.4 262.5 163.2 246 191.6C229.3 220.6 241.2 249.6 253.1 259.4000000000001C266.2 236.7000000000001 285.8 202.7000000000001 312 157.4H364C375 157.4 384 148.4 384 137.4C384 126.3 375 117.4 364 117.4z" />
70
- <glyph glyph-name="app-store"
71
- unicode="&#xF36F;"
72
- horiz-adv-x="512" d=" M255.9 327.1L265 342.8C270.6 352.6 283.1 355.9 292.9 350.3C302.7 344.7 306 332.2 300.4 322.4L212.9 170.9H276.2C296.7 170.9 308.2 146.8 299.3 130.1H113.8C102.5 130.1 93.4 139.2 93.4 150.5C93.4 161.8 102.5 170.8999999999999 113.8 170.8999999999999H165.8L232.4 286.3L211.6 322.3999999999999C206 332.2 209.3 344.5999999999999 219.1 350.3C228.9 355.8999999999999 241.3 352.5999999999999 247 342.8L255.9 327.0999999999999zM177.2 109.1L157.6 75.1C152 65.3 139.5 62 129.7 67.6C119.9 73.2000000000001 116.6 85.7000000000001 122.2 95.5L136.8 120.7C153.2 125.8 166.6 121.9 177.2 109.1zM346.1 170.8H399.2000000000001C410.5000000000001 170.8 419.6 161.7 419.6 150.4C419.6 139.1 410.5 130.0000000000001 399.2000000000001 130.0000000000001H369.7000000000001L389.6 95.5000000000001C395.2000000000001 85.7000000000001 391.9000000000001 73.3000000000001 382.1 67.6000000000001C372.3 62.0000000000001 359.9000000000001 65.3000000000001 354.2000000000001 75.1000000000001C320.7000000000001 133.2000000000001 295.5000000000001 176.7000000000001 278.8000000000001 205.7000000000001C261.7000000000001 235.2000000000001 273.9000000000001 264.8000000000001 286.0000000000001 274.8000000000001C299.4000000000001 251.8000000000001 319.4000000000001 217.1000000000001 346.1000000000001 170.8000000000001zM256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM472 192C472 73.3 375.9 -24 256 -24C137.3 -24 40 72.1 40 192C40 310.7 136.1 408 256 408C374.7 408 472 311.9 472 192z" />
73
- <glyph glyph-name="apper"
74
- unicode="&#xF371;"
75
- horiz-adv-x="640" d=" M42.1 208.9C64.3 208.9 71.1 206.1 75.6 194.3H76.4V217.2C76.4 228.5000000000001 71.6 232.6 58.5 232.6C47.2 232.6 44.1 230.1 43.4 219.8H4.8C5.1 233.7 6.3 238.9 10.6 244.2C17.9 253 29.5 256 56.7 256C89.7 256 103.8 251 110.6 237.1C112.6 232.8 114.6 221.5 114.6 213.4V137.1H76.3L77.6 156.2000000000001H76.6C71.3 140.6 63 135.8000000000001 41.1 135.8000000000001C10.8 135.8000000000001 0 145.9000000000001 0 173.1000000000001C0 198.3000000000001 12.3 208.9000000000001 42.1 208.9000000000001zM59.2 160.8C72.3 160.8 76.1 163.8 76.1 174.2C76.1 183.3 71.8 185.8 56.5 185.8C43.4 185.8 38.6 182.8 38.6 173.7C38.5 163.3 42.3 160.8 59.2 160.8zM137 255.7H175.3L173.8 235.1H174.6C183.7 252.2 190.5 256 212.1 256C226.5000000000001 256 236.8 253.0000000000001 243.6 246.9000000000001C253.4000000000001 238.3000000000001 256.4000000000001 226.5000000000001 256.4000000000001 198.8000000000001C256.4000000000001 168.8000000000001 253.4000000000001 155.7000000000001 244.3000000000001 145.9C237.5000000000001 138.6 227.9000000000001 135.8 211.1 135.8C190.7 135.8 181.9 141.3 177.3 157H176.5V86.7H137V255.7zM217.9 195C217.9 222.5 214.6 227.5 197.2 227.5C180.3 227.5 176.5 222.5 176.5 198.8C176.5 170.8 180 165.3 197.7 165.3C214.1 165.3 217.9 170.9 217.9 195zM275.8 255.7H314.1L312.6 235.1H313.4000000000001C322.5000000000001 252.2 329.3 256 350.9000000000001 256C365.3 256 375.6 253 382.4000000000001 246.9C392.2000000000001 238.3 395.2000000000001 226.5 395.2000000000001 198.8C395.2000000000001 168.8 392.2000000000001 155.7 383.1 145.9C376.3 138.6 366.7000000000001 135.8 349.8 135.8C329.4000000000001 135.8 320.6 141.3 316 157H315.2V86.7H275.7V255.7zM356.7000000000001 195C356.7000000000001 222.5 353.4000000000001 227.5 336.0000000000001 227.5C319.1000000000001 227.5 315.3000000000001 222.5 315.3000000000001 198.8C315.3000000000001 170.8 318.8000000000001 165.3 336.5000000000001 165.3C352.9000000000001 165.3 356.7000000000001 170.9 356.7000000000001 195zM410.5000000000001 198.8C410.5000000000001 224.2 413.8000000000001 236.6 422.8000000000001 244.6C431.6000000000001 252.7 445.0000000000001 255.9000000000001 467.9000000000001 255.9000000000001C510.7000000000001 255.9000000000001 523.6000000000001 243.1 523.6000000000001 200.2000000000001V189.1H448.3000000000002C448.0000000000001 187.1 448.0000000000001 185.1 448.0000000000001 184.3C448.0000000000001 167.4 452.5000000000001 162.4 468.1000000000001 162.4C482.0000000000001 162.4 486.0000000000001 165.4 486.0000000000001 176.3H523.5000000000001V174C523.5000000000001 164.2 521.0000000000001 155.1 516.7000000000002 149.3C509.4000000000001 139.5 497.1000000000001 135.7 472.4000000000001 135.7C444.9000000000002 135.7 430.8000000000002 139 421.8000000000002 148C413.3000000000002 156.5 410.5000000000001 169.3 410.5000000000001 198.8zM486.9000000000001 210.4C486.6000000000001 212.2 486.6000000000001 213.7 486.6000000000001 214.2C486.6000000000001 226.5000000000001 483.3000000000001 228.8 467.0000000000001 228.8C452.6000000000001 228.8 449.9000000000001 225.8 448.9000000000001 213.7L448.6 210.4H486.9zM542.5000000000001 255.7H580.8000000000001L579.0000000000001 235.8H579.7000000000002C586.5000000000001 250.7 594.1000000000001 256 609.4000000000002 256C620.2000000000002 256 628.5000000000002 252.7 632.8000000000002 246.7C638.1000000000001 239.4 639.6000000000001 232.3 639.6000000000001 212.7C639.6000000000001 211.2 639.6000000000001 207.7 639.8000000000002 203.4H604.8000000000002C605.1000000000001 205.2 605.1000000000001 206.7 605.1000000000001 207.4C605.1000000000001 222.8 603.1000000000001 226.8 594.8000000000002 226.8C588.5000000000002 226.8 584.0000000000002 223.5 581.7000000000002 217.5C580.7000000000002 214.5 580.7000000000002 213.1999999999999 580.7000000000002 205.1999999999999V137.1999999999999H542.4000000000002V255.7z" />
76
- <glyph glyph-name="apple-pay"
77
- unicode="&#xF415;"
78
- horiz-adv-x="640" d=" M116.9 289.5C109.4 280.6 97.4 273.6 85.4 274.6C83.9 286.6 89.8 299.4 96.7 307.2C104.2 316.3 117.3 322.8 128 323.3C129.2 310.9 124.3 298.6 116.9 289.5M127.8 272.3C110.4 273.3 95.5 262.4 87.3 262.4C78.9 262.4 66.3 271.8 52.5 271.5C34.6 271.2 18 261.1 8.9 245C-9.9 212.7 4 165 22.2 138.7C31.1 125.7 41.7 111.4 55.7 111.9C69 112.4 74.2 120.5 90.2 120.5C106.3 120.5 111 111.9 125 112.1C139.5 112.4 148.6 125.1 157.5 138.1C167.6 152.9 171.8 167.2000000000001 172 168C171.7 168.3 144 178.9 143.7 210.9C143.4 237.7 165.6 250.4 166.6 251.2C154.1 269.8 134.6 271.8 127.8 272.3M228.2 308.5V113.6H258.5V180.2000000000001H300.4C338.7 180.2000000000001 365.5 206.5000000000001 365.5 244.5000000000001S339.1 308.5000000000001 301.4 308.5000000000001H228.2zM258.5 283H293.4C319.7 283 334.7 269 334.7 244.4S319.7 205.6 293.3 205.6H258.5V283zM420.7 112.1C439.7 112.1 457.3 121.7000000000001 465.3 137H465.9V113.6H493.9V210.6C493.9 238.7 471.4 256.9000000000001 436.8 256.9000000000001C404.7 256.9000000000001 380.9000000000001 238.5000000000001 380 213.3000000000001H407.3C409.6 225.3000000000001 420.7 233.2000000000001 435.9000000000001 233.2000000000001C454.4 233.2000000000001 464.8 224.6000000000001 464.8 208.7000000000001V197.9L427 195.6C391.9 193.5 372.9 179.1 372.9 154.1C373 128.9 392.6 112.1 420.7 112.1zM428.9 135.2000000000001C412.8 135.2000000000001 402.5 143.0000000000001 402.5 154.8000000000001C402.5 167.1000000000001 412.4 174.2000000000001 431.3 175.3000000000001L464.9 177.4000000000001V166.4000000000001C464.9 148.2000000000001 449.4000000000001 135.2000000000001 428.9000000000001 135.2000000000001zM531.4 60.6C560.9 60.6 574.8 71.9 586.9 106L640 255H609.2L573.6 139.9H573L537.4 255H505.8L557 113.1L554.2 104.5C549.6 89.9 542.1 84.2 528.7 84.2C526.3000000000001 84.2 521.7 84.5 519.8000000000001 84.7V61.3C521.6 60.9 529.1 60.6 531.4000000000001 60.6z" />
79
- <glyph glyph-name="apple"
80
- unicode="&#xF179;"
81
- horiz-adv-x="376.5" d=" M314.7 179.3C314.5 216 331.1 243.7 364.7 264.1C345.9 291 317.5 305.8 280 308.7000000000001C244.5 311.5 205.7 288 191.5 288C176.5 288 142.1 307.7000000000001 115.1 307.7000000000001C59.3 306.8 0 263.2 0 174.5C0 148.3 4.8 121.2 14.4 93.3C27.2 56.6 73.4 -33.4 121.6 -31.9C146.8 -31.3 164.6 -14 197.4 -14C229.2 -14 245.7 -31.9 273.8 -31.9C322.4000000000001 -31.2 364.2000000000001 50.6 376.4 87.4C311.2 118.1 314.7 177.4 314.7 179.3000000000001zM258.1 343.5C285.4 375.9 282.9 405.4 282.1 416C258 414.6 230.1 399.6 214.2 381.1C196.7 361.3 186.4 336.8 188.6 309.2C214.7 307.2 238.5 320.6 258.1 343.5z" />
82
- <glyph glyph-name="artstation"
83
- unicode="&#xF77A;"
84
- horiz-adv-x="508.1" d=" M0 70.6L43 -3.7C51.5 -20.5 68.8 -32 88.9 -32H374.3L315.1 70.6H0zM499.8 98L333.6 388.7C325 404.9 307.9 416 288.2 416H199.8L457.1 -31.6L497.8 38.9C499.7 42.1 518.8 68.6 499.8 98zM273 143.5L157.5 343.5L42 143.5H273z" />
85
- <glyph glyph-name="asymmetrik"
86
- unicode="&#xF372;"
87
- horiz-adv-x="576" d=" M517.5 138.8C556.3 178.8 575.6 218.8 576 254.9C576.8 320.4 516.6 373.1 406.6 389.9C277.9 409.6 118.1 374.4 0 307.5C52 334 110.6 355.7 170.7 365.7C245.2 386.2 323.7 391.1 392 380.5C544.5 356.7 588.8 253 490.8 148.8C480.6 138 468.8 127.7 455.8 118.2L304.9 344.6L114.7 59.1C49.1 88.5 38.2 149.3 95.6 210.3C116.4 232.5 143.9 252.2 175.1 268.4C195.1 280.6 214.8 291 237.1 299.1C172 278.8 114.4 246.2 75.5 206.2C47.8 177.6 34.1 149.1 33.8 123.3C33.3 88.1999999999999 57.2 58.1999999999999 102.2 40.3L67.7 -11.4H169.3L191.3 22.9999999999999C213.5 21.9999999999999 236.6 22.9999999999999 259.9 25.6999999999999L237.1 -11.4000000000001H372.6L340 41.7C358.6 47 376.9 53.2 394.5 60.4L440.4 -11.4H542L468.6 99C487.1 111.1 503.6 124.5 517.5 138.8zM329.9 58.3L304.9 98.9L272.2 45.6C248.8 42.1 225.5 40.5 203 41.2L304.9 200.5000000000001L383.6 77.5000000000001C366.4 70.1000000000001 348.3 63.6000000000001 329.9 58.3000000000001z" />
88
- <glyph glyph-name="atlassian"
89
- unicode="&#xF77B;"
90
- horiz-adv-x="512" d=" M152.2 211.6C144.5 219.8 132.5 219.3 127.4 208.8L1.6 -42.2C-3.4 -52.2 4 -63.9 15 -63.9H190C195.8 -64 201 -60.7 203.4 -55.5C241.3 22.3 218.5 140.8 152.2 211.6zM244.4 439.9C122.1 246.5 235.9 91.3 309.4 -55.6C311.9 -60.7 317.1 -64 322.8 -64H497C508.2 -64 515.4 -52.2 510.4 -42.3C510.4 -42.3 275.9 428.3 270 440C264.7 450.6 251.2 450.8 244.4 439.9z" />
91
- <glyph glyph-name="audible"
92
- unicode="&#xF373;"
93
- horiz-adv-x="640" d=" M640 248.1V194.1L320 -5.9L0 194V248L320 48L640 248.1zM445.5 176.1L492.6 205.5C455.4 261.3 391.9000000000001 298.1 319.9000000000001 298.1C247.9000000000001 298.1 184.4 261.4000000000001 147.3000000000001 205.7H147.6000000000001C150.1000000000001 208 152.7000000000001 210.2 155.3000000000001 212.4C245.0000000000001 286.8 374.7000000000001 270.5 445.5 176.1zM225.4 157.3C242.3 169.2 261.9 176 282.8 176C317.2 176 348 157.6 369.2000000000001 128.4L414.6 156.8C393.7000000000001 186.6999999999999 359 206.3 319.8 206.3C280.9000000000001 206.3 246.4 186.9 225.4 157.3zM103.6 286.9C235.4 391.2 421.8 363.3 521.1 224.8L521.8000000000001 223.8L570.6 254.2C517.1 335.9 424.8 389.9 319.9 389.9C216.4 389.9 123.3 336.4 69.4 254.3C79.3 264.8 92.1 277.8 103.6 286.9zM570.6 254.2z" />
94
- <glyph glyph-name="autoprefixer"
95
- unicode="&#xF41C;"
96
- horiz-adv-x="640" d=" M318.4 432L157.4 -48H234.9L260.3 33.4H379.8L405 -48H482.5L318.4 432zM278.1 90.1L319.3 220.5H320.8L361.7 90.1H278.0999999999999zM640 43L630 74.4L462.1 90L481.5 33.5L640 43zM177.9 90L10 74.3L0 43L158.5 33.6L177.9 90z" />
97
- <glyph glyph-name="avianex"
98
- unicode="&#xF374;"
99
- horiz-adv-x="512" d=" M453.1 416H141.1C102.2 416 64.9 384.8 57.8 346.3L1.2 37.7C-5.9 -0.8 19.9 -32 58.9 -32H370.9C409.8 -32 447.1 -0.8 454.2 37.7L510.9 346.2C517.9 384.8 492.1 416 453.1 416zM394.9000000000001 68.7L362.9000000000001 55.2L247.5000000000001 165.2C232.8000000000001 155.2 218.3000000000001 145.7 205.8 138.1L227.9 73.9L210 61.2L169.4 122.2L117 170.3L132.7 185.7L190.7 154.6C200 165.1 211.5 177.2 223.5 189.5L203 219.1L134.2 318.9L153 347.8L161.9 352.6L265 240.2L269.9 235.7C289.3 254.5 303.7 268.1 303.7 268.1C311.4 274.6 325.2 271 334.4 260.2C343.4 249.7 345 235.5 337.1 228.9C335.3 227.6 321.6 217.5 301.8 203.3L306.3 196L401.2 76.6L394.8999999999999 68.7z" />
100
- <glyph glyph-name="aviato"
101
- unicode="&#xF421;"
102
- horiz-adv-x="640" d=" M107.2 164.5L88.2 206.3H36.1L17.1 164.5H0L62.2 295.9L124.4 164.5H107.2zM62.2 262.6L42.6 220.1H81.8L62.2 262.6zM174.9 160.2L112.7 291.6H129.8L174.9 195.6L220 291.6H237L174.9 160.2zM255.5 164.5V291.6H271V164.5H255.5zM464.6 280.1V164.5H447.3V280.1H406.1V291.6H505.7V280.1H464.6zM640 229.2C640 220 638.3 211.4 634.9 203.4C631.5 195.4 626.6999999999999 188.3 620.6999999999999 182.3C614.6999999999999 176.3 607.5999999999999 171.5 599.5999999999999 168.1C591.5999999999999 164.7 582.9999999999999 163 573.8 163S556 164.6999999999999 548 168.1C540 171.5 532.9 176.3 526.9 182.3C520.9 188.3 516.1 195.3 512.6999999999999 203.4C509.3 211.4 507.5999999999999 220 507.5999999999999 229.2S509.2999999999999 247 512.6999999999999 255C516.0999999999999 263 520.9 270.1 526.9 276.1C532.9 282.1 539.9 284.5 548 288C556 291.4 564.6 293.1 573.8 293.1S591.5999999999999 291.4 599.5999999999999 288C607.5999999999999 284.6 614.6999999999999 282.2 620.6999999999999 276.1C626.6999999999999 270.1 631.4 263 634.9 255C638.3 247 640 238.4 640 229.2zM624.5 229.2C624.5 236.5 623.2 243.2 620.6 249.5C618 255.8 614.4 261.2 609.8000000000001 265.8C605.2 270.4 599.8000000000001 274 593.6 276.7000000000001C587.4 279.4 580.8000000000001 280.7000000000001 573.8000000000001 280.7000000000001S560.2 279.4 554.0000000000001 276.7000000000001C547.8000000000001 274 542.4000000000001 270.4 537.8000000000001 265.8C533.2 261.2000000000001 529.6 255.8 527.0000000000001 249.5C524.4000000000001 243.2 523.1000000000001 236.4 523.1000000000001 229.2C523.1000000000001 221.9 524.4000000000001 215.2 527.0000000000001 208.9C529.6000000000001 202.6 533.2000000000002 197.2 537.8000000000001 192.6C542.4000000000001 188 547.8000000000001 184.4 554.0000000000001 181.7C560.2000000000002 179 566.8000000000001 177.7 573.8000000000001 177.7S587.4000000000001 179 593.6 181.7C599.8000000000001 184.4 605.2 188 609.8000000000001 192.6C614.4000000000001 197.2 618.0000000000001 202.6 620.6 208.9C623.2 215.2 624.5 222 624.5 229.2zM529.7 132.5V138.8L618.6 148.8L375.7000000000001 135.4C376.3000000000001 137.6 376.8000000000001 140.0000000000001 377.1 142.6C377.4000000000001 144.6 377.6 146.8 377.7000000000001 149.1L442.5000000000001 157.2000000000001L377.6 155.3000000000001C377.6 155.7000000000001 377.5 156.0000000000001 377.5 156.4000000000001C374.7 173.6000000000001 352 180.1000000000001 352 180.1000000000001L350.9 206.4000000000001H374.7L393.7 164.6000000000001H410.8L348.6 296L286.4000000000001 164.6H303.5000000000001L322.5000000000001 206.4H346.1000000000001L345 180S322.3 173.5 319.5 156.3C319.4 156 319.4 155.6 319.4 155.2L254.5 157.1L319.3 149C319.4 146.6999999999999 319.6 144.6 319.9 142.5C320.2 139.8999999999999 320.7 137.5 321.3 135.3L78.4 148.8L167.3 138.8V132.5C161.4 131.6 156.8 126.5 156.8 120.3C156.8 113.5 162.4 107.9 169.2 107.9C176 107.9 181.6 113.5000000000001 181.6 120.3C181.6 126.5 177 131.6 171.1 132.5V138.3L251.4000000000001 129.3V123.9C245.7000000000001 122.8 241.5000000000001 117.7000000000001 241.5000000000001 111.8C241.5000000000001 105 247.1 101.6 253.9000000000001 101.6C260.7000000000001 101.6 266.3 105 266.3 111.8C266.3 117.8 262 122.8 256.4000000000001 123.9V128.8L284.8 125.6V101.9H278.9000000000001V88H284.8V94.6H289.8V88H295.7V101.8H289.8V125L328.1 120.7C336.2000000000001 109.3 347.1 107.1 347.1 107.1L347 100.4L341.9 100.2L341.8 88.1H345.9L346 93.1H351.2L351.3 88.1H355.4000000000001L355.3 100.2L350.2 100.4L350.1 107.1S361 109.2 369.1 120.7L407.4 125V101.8H401.5V88H407.4V94.6H412.4V88H418.3V101.8H412.4V125.5L440.8 128.7V123.8C435.1 122.7 430.9 117.6 430.9 111.7C430.9 104.9 436.5 101.5 443.3 101.5C450.1 101.5 455.6999999999999 104.9 455.6999999999999 111.7C455.6999999999999 117.7 451.3999999999999 122.7 445.8 123.8V129.2L526.0999999999999 138.2V132.4C520.1999999999999 131.5 515.5999999999999 126.4 515.5999999999999 120.2C515.5999999999999 113.4 521.1999999999999 107.8 527.9999999999999 107.8C534.7999999999998 107.8 540.3999999999999 113.4 540.3999999999999 120.2C540.1999999999998 126.5 535.6999999999998 131.6 529.6999999999998 132.5zM328.9000000000001 220.1L348.5000000000001 262.6L368.1000000000001 220.1H350.2000000000001L348.5000000000001 260.4L346.8000000000002 220.1H328.9000000000002z" />
103
- <glyph glyph-name="aws"
104
- unicode="&#xF375;"
105
- horiz-adv-x="640" d=" M180.41 244.99C179.69 222.34 191.01 212.31 191.29 205.94A8.164 8.164 0 0 0 187.19 199.67L174.39 190.71A10.659999999999998 10.659999999999998 0 0 0 168.76 188.79C168.33 188.81 160.57 186.96 148.28 214.4A78.608 78.608 0 0 0 85.67 184.95C69.39 184.06 25.27 194.19 27.54 241.16C25.95 279.44 61.6 303.2200000000001 98.47 301.21C105.57 301.19 120.07 300.84 145.46 294.94V310.56C148.15 337.02 130.76 357.55 100.65 354.47C98.25 354.46 81.25 354.97 54.81 344.36C47.45 340.98 46.51 341.54 44.06 341.54C36.65 341.54 39.7 363.02 41.12 365.74C46.33 372.14 76.98 384.09 107.06 383.92A76.857 76.857 0 0 0 162.75 366.64A70.285 70.285 0 0 0 180.42 314.28L180.41 244.99zM93.99 212.6C126.42 213.07 140.15 232.57 143.28 243.07C145.74 253.12 145.33 259.48 145.33 270.4700000000001C135.66 272.79 121.74 275.32 105.77 275.3400000000001C90.62 276.48 62.95 269.7100000000001 64.03 243.08C62.79 226.29 75.15 211.68 93.99 212.6zM264.91 189.55C257.05 188.83 253.39 194.41 252.23 199.92L202.43 364.5700000000001C201.46 367.35 200.8199999999999 370.2200000000001 200.51 373.1500000000001A4.61 4.61 0 0 0 204.37 378.4000000000001C204.61 378.4400000000001 202.24 378.4000000000001 226.62 378.4000000000001C235.4 379.2800000000001 238.26 372.37 239.17 368.0300000000001L274.89 227.2L308.05 368.03C308.58 371.25 310.99 379.1 320.85 378.27H338.01C340.18 378.45 349.12 378.77 350.69 367.9L384.11 225.27L420.98 367.9C421.4600000000001 370.0800000000001 423.7000000000001 379.27 433.6600000000001 378.27H453.38C454.23 378.4 459.53 379.0800000000001 458.63 369.69C458.2 367.8400000000001 462.04 380.35 405.88 199.79C404.73 194.28 401.06 188.7000000000001 393.2 189.42H374.51C363.57 188.2700000000001 362 199.08 361.83 200.17L328.67 337.3L295.89 200.31C295.73 199.22 294.16 188.41 283.21 189.56H264.91zM538.39 183.92C532.51 183.91 504.47 184.22 481.03 196.21A12.802 12.802 0 0 0 473.22 208.12V218.87C473.22 227.32 479.42 225.77 482.05 224.76C492.09 220.7 498.53 217.62 510.86 215.16C547.51 207.63 563.63 217.46 567.5799999999999 219.64C580.7299999999999 227.45 581.77 245.32 572.8299999999999 254.59C562.3499999999999 263.38 557.3499999999999 263.71 519.6999999999999 275.59C515.06 276.88 475.9999999999999 289.2 475.9099999999999 327.95C475.2999999999999 356.19 500.9599999999999 384.13 545.43 383.9C558.0999999999999 383.91 591.8599999999999 379.77 601 368.28C602.35 366.19 603.02 363.73 602.92 361.24V351.13C602.92 346.69 601.3 344.47 598.05 344.47C590.3399999999999 345.33 576.66 355.64 548.89 355.22C542 355.58 509 354.31 510.48 330.25C510.05 311.29 537.09 304.18 540.1800000000001 303.36C576.6400000000001 292.39 588.83 290.57 603.3000000000001 273.78C620.44 251.53 611.2 225.48 607.6500000000001 218.34C588.57 180.85 539.2300000000001 183.9 538.3900000000001 183.92zM578.59 79.06C508.5600000000001 27.34 406.9000000000001 -0.19 320.1 -0.19A469.127 469.127 0 0 0 2.83 120.54C-3.7 126.43 2.06 134.5 10 130.0100000000001A637.37 637.37 0 0 1 326.88 45.89A630.22 630.22 0 0 1 568.47 95.4400000000001C580.25 100.4400000000001 590.24 87.64 578.59 79.0600000000001zM607.7800000000001 112.35C598.82 123.87 548.5000000000001 117.73 525.97 115.04C519.1800000000001 114.2700000000001 518.03 120.16 524.1800000000001 124.5100000000001C564.2500000000001 152.6800000000001 630.0600000000001 144.6100000000001 637.6200000000001 135.1400000000001C645.1700000000001 125.67 635.5700000000002 59.73 598.0600000000002 28.23C592.3000000000002 23.36 586.7900000000002 25.93 589.3500000000001 32.33C597.7900000000002 53.58 616.7400000000001 100.8200000000001 607.7800000000001 112.35z" />
106
- <glyph glyph-name="bandcamp"
107
- unicode="&#xF2D5;"
108
- horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM296.2 113.9H115.2L199.9 270H380.9L296.2 113.9z" />
109
- <glyph glyph-name="behance-square"
110
- unicode="&#xF1B5;"
111
- horiz-adv-x="448" d=" M186.5 155C186.5 135.7 172.5 129.6 155.3 129.6H110.2V182.5H156.2C174.8 182.4 186.5 174.7 186.5 155zM178.8 237.3C178.8 255 165.1 259.2000000000001 149.9 259.2000000000001H110.3V214.4H153C168.1 214.4 178.8 221 178.8 237.3000000000001zM311.1 214.1C292.8 214.1 280.6 202.7 279.4000000000001 184.4H341.6C339.9000000000001 202.9 330.3 214.1 311.1 214.1zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM271.7 263H349.5V281.9H271.7V263zM228.7 152.7C228.7 176.8 217.3 197.6 193.7 204.3C210.9 212.5 219.9 222 219.9 241.3C219.9 279.5 191.4 288.8 158.5 288.8H68V96.8H161.1C196 96.9999999999999 228.7 113.6999999999999 228.7 152.6999999999999zM380 167.5C380 208.6 355.9 242.9 312.4 242.9C270 242.9 241.3 211.1 241.3 169.3C241.3 126 268.6 96.3 312.4 96.3C345.6 96.3 367.1 111.2 377.5 143.1H343.8C340.1 131.2000000000001 325.2 125 313.6 125C291.2000000000001 125 279.5 138.1 279.5 160.3H379.7C379.8 162.6 380 165.1 380 167.5z" />
112
- <glyph glyph-name="behance"
113
- unicode="&#xF1B4;"
114
- horiz-adv-x="576" d=" M232 210.8C263.8 226 280.4 249 280.4 284.8C280.4 355.4 227.8 372.6 167.1 372.6H0V18.2H171.8C236.2 18.2 296.7000000000001 49.1 296.7000000000001 121.1C296.7000000000001 165.6 275.6 198.5 232.0000000000001 210.8zM77.9 312.1H151C179.1 312.1 204.4 304.2 204.4 271.6C204.4 241.5 184.7 229.4 156.9 229.4H77.9V312.1zM161.2 78.4H77.9V176H162.8C197.1 176 218.8 161.7 218.8 125.4C218.8 89.6 192.9 78.4 161.2 78.4zM519.7 319.1H376V354H519.7V319.1zM576 142.8C576 218.7 531.6 282 451.1 282C372.9000000000001 282 319.8 223.2 319.8 146.2C319.8 66.3 370.1 11.5 451.1 11.5C512.4 11.5 552.1 39.1 571.2 97.8H509C502.3 75.9 474.7 64.3 453.3 64.3C412 64.3 390.3 88.5 390.3 129.6H575.4C575.6999999999999 133.8 576 138.3 576 142.8zM390.4 174C392.7 207.7 415.1 228.8 448.9 228.8C484.3 228.8 502.1 208 505.1 174H390.4z" />
115
- <glyph glyph-name="bimobject"
116
- unicode="&#xF378;"
117
- horiz-adv-x="448" d=" M416 416H32C14.4 416 0 401.6 0 384V0C0 -17.6 14.4 -32 32 -32H416C433.6 -32 448 -17.6 448 0V384C448 401.6 433.6 416 416 416zM352 158.6C352 109.2000000000001 340.6 76 248.2 76H231.3C187.2 76 168.9 90.9 160.9 114.8H160V80H96V312H160V237.3H161.1C165.7 267.8 200.8 276.1 230.8 276.1H248.1C340.5 276.1 351.9000000000001 243.0000000000001 351.9000000000001 193.6V158.6zM288 187.5V164.6C288 142.9 284.6 130.8 249.6 130.8H204.3C175.4 130.8 160.2 137.3 160.2 166.5V185.5C160.2 214.8 175.4 221.2 204.3 221.2H249.6C284.6 221.4 288 209.2 288 187.5z" />
118
- <glyph glyph-name="bitbucket"
119
- unicode="&#xF171;"
120
- horiz-adv-x="499.2" d=" M16.2 416.4C7.4 416.5 0.1 409.5 0 400.6C0 399.7 0.1 398.7 0.2 397.8L68.1 -14.3C69.8 -24.7 78.8 -32.4 89.4 -32.5H415.1C423 -32.6 429.8 -26.9 431.1 -19.1L499 397.7C500.4 406.4 494.5 414.6 485.8 416C484.9 416.1 484 416.2 483 416.2L16.2 416.4zM302.1 118.6H198.1L170 265.6H327.3L302.1 118.6z" />
121
- <glyph glyph-name="bitcoin"
122
- unicode="&#xF379;"
123
- horiz-adv-x="512" d=" M504 192C504 55.033 392.967 -56 256 -56S8 55.033 8 192S119.033 440 256 440S504 328.967 504 192zM362.349 227.33C367.286 260.329 342.158 278.069 307.799 289.903L318.945 334.605L291.732 341.386L280.881 297.862C273.727 299.645 266.379 301.326 259.078 302.992L270.007 346.802L242.809 353.583L231.656 308.897C225.734 310.246 219.9209999999999 311.579 214.279 312.981L214.31 313.121L176.78 322.491L169.541 293.429S189.732 288.802 189.3059999999999 288.516C200.3279999999999 285.765 202.3199999999999 278.472 201.9859999999999 272.691L189.2899999999999 221.766C190.0499999999999 221.572 191.0339999999999 221.293 192.119 220.859C191.2119999999999 221.084 190.243 221.332 189.243 221.572L171.447 150.2339999999999C170.098 146.8859999999999 166.68 141.8639999999999 158.976 143.7699999999999C159.2469999999999 143.375 139.196 148.7069999999999 139.196 148.7069999999999L125.6859999999999 117.56L161.0999999999999 108.733C167.6879999999999 107.0819999999999 174.1449999999999 105.3539999999999 180.5 103.727L169.238 58.514L196.4199999999999 51.733L207.5729999999999 96.466A1038.209 1038.209 0 0 1 229.26 90.8389999999999L218.1449999999999 46.3159999999999L245.3579999999999 39.5349999999999L256.6199999999999 84.6629999999999C303.0239999999999 75.8819999999999 337.9189999999999 79.4239999999999 352.6059999999999 121.3899999999999C364.4419999999999 155.1799999999999 352.0169999999999 174.6709999999999 327.6019999999999 187.3809999999999C345.3819999999999 191.4789999999999 358.7759999999999 203.1729999999999 362.3489999999999 227.3299999999999zM300.172 140.151C291.762 106.3609999999999 234.864 124.6279999999999 216.417 129.208L231.361 189.107C249.807 184.504 308.961 175.39 300.172 140.151zM308.589 227.818C300.916 197.082 253.558 212.698 238.196 216.526L251.744 270.853C267.107 267.025 316.58 259.88 308.589 227.818z" />
124
- <glyph glyph-name="bity"
125
- unicode="&#xF37A;"
126
- horiz-adv-x="496" d=" M78.4 380.8C173.8 470 324.5 472 421.5 377C435.8 362.9 415.1 339.9 399.1 355.5C314.3 437.9 183.3 435.8 100.2000000000001 358.7C83.9000000000001 343.6 63.7000000000001 367 78.4000000000001 380.8zM177.3 -37.8C196.6 -43.5 206.6 -14.2 185.2 -7.8C73 26.1 9.4 141.9 37.7 253.2C42.7 272.8 12.8 281.3 7.5 260.3C-24.6 132.9 48.6 0.5 177.3 -37.8000000000001zM325.4 -35.8C447.3 4.4 518.3 131.1 489.8 255.2C485.3 274.9 454.9 269 459.8 247.3C483.9999999999999 139.6 422.7 29.4 316.6 -6.1C295.4 -13.1 306.2 -42.1 325.4 -35.8zM262.5 43.2L262.7 115C262.7 123.2 256.1 129.8 247.9 129.8C239.7 129.8 233.1 123.1 233.1 115L232.9 43.2C232.9 35 239.5 28.4 247.7 28.4S262.5 35 262.5 43.2zM333.5 312.2C335.6 221.3 338.2 180.3 248 179.7C155.5 180.4 161.1 224 162.5 312.2C162.5 334 130 331.8 130 312.2V240.6C130 171.3 190.7 149.7 248 150.5C305.3 149.7 366 171.3 366 240.6V312.2C366 331.8 333.5 334 333.5 312.2z" />
127
- <glyph glyph-name="black-tie"
128
- unicode="&#xF27E;"
129
- horiz-adv-x="448" d=" M0 416V-32H448V416H0zM316.5 90.8L224 2.1L131.5 90.8L196 274.8L131.5 361.4H316.4L252 274.8L316.5 90.8z" />
130
- <glyph glyph-name="blackberry"
131
- unicode="&#xF37B;"
132
- horiz-adv-x="512" d=" M166 331.1C166 307.7 149.6 282 93.5 282H23.4L44.4 370.8H112.2C154.3 370.8 166 347.5 166 331.1zM292.2 370.8H224.4L205.7 282H275.8C329.6 282 345.9 307.7 345.9 331.1C346 347.5 334.3 370.8 292.2 370.8zM88.8 239.9H21L0 151.1H70.1C126.2 151.1 142.6 174.5 142.6 200.2C142.6 216.5 130.9 239.9000000000001 88.8 239.9000000000001zM268.9 239.9H201.1L182.4 151.1H252.5C306.3 151.1 322.6 174.5 322.6 200.2C322.6 216.5 310.9 239.9000000000001 268.9 239.9000000000001zM458.2 293.7H390.4L371.7 204.9H441.8C495.6 204.9 511.9 228.3 511.9 254C512 270.3 500.3 293.7 458.2 293.7zM430.2 155.8H362.4L343.7 67H413.8C469.9 67 483.9 90.4 483.9 116.1C483.9 132.4 472.3 155.8 430.2 155.8zM240.8 102H173L154.3 13.2H224.4C280.5 13.2 294.5 38.9 294.5 62.3C294.6 78.6 282.9 102 240.8 102z" />
133
- <glyph glyph-name="blogger-b"
134
- unicode="&#xF37D;"
135
- horiz-adv-x="448" d=" M446.6 225.3C444.8 233.3 439.8 240.7 434.1 243.8C432.3 244.8 421.1 246 409.1 246.5C389 247.4 386.8 247.8 380.4000000000001 251.5C370.3 257.4 367.6 263.8 367.5000000000001 281C367.4000000000001 314 353.7000000000001 344.7 326.6000000000001 372.3C307.3000000000001 392 285.7000000000001 405.3 261.1000000000001 412.8C255.2000000000001 414.6 242.0000000000001 415.2 197.8000000000001 415.7C128.4000000000001 416.5 113.0000000000001 415.1 89.4000000000001 405.7C45.9 388.5 14.7 351.9 3.3 305.1C1.2 296.3 0.7 282.2 0.2 201.2C-0.4 99.7 0.3 84.8 6.6 64.7C22.2 15.1 66.5 -21.6 111 -29.6C125.8 -32.3 308.3 -32.9 327 -30.4C359.5 -26.0000000000001 385 -12.9 408.9 11.4999999999999C426.2 29.1999999999999 437 48.3 444.1 73.6C449 91.2 448.6 216.4 446.6 225.3zM124.5 288.9C132.3 296.8 134.5 297.1 183.3 297.1C227.2 297.1 228.7 297 235.1 293.7C244.4000000000001 289 248.5000000000001 282.4 248.5000000000001 271.8C248.5000000000001 262.3 244.7 255.6 236.2 250.2C231.6 247.3 228.9 247.1 185.9 246.9C159.4 246.7 138.2000000000001 247.3 135.1 248.1C118.5 252.8 112.3 276.6 124.5 288.9zM316.3 89.1L301.4000000000001 86.7000000000001L223.9 85.8000000000001C155.8000000000001 85.0000000000001 136.6 86.2000000000001 133 87.8000000000001C125.9 90.9000000000001 119.2 99.5000000000001 118.1 107.2000000000001C117 114.5000000000001 120.7 124.5000000000001 126.3 129.6C133.4 136 136.5 136.2000000000001 223.6 136.3C313.2000000000001 136.4 312.7000000000001 136.4 321.2000000000001 128.5C333.3000000000001 117.2 330.7000000000001 97.3 316.3000000000001 89.1z" />
136
- <glyph glyph-name="blogger"
137
- unicode="&#xF37C;"
138
- horiz-adv-x="448" d=" M162.4 252C167.2 256.9 168.6 257.1 198.8 257.1C226 257.1 226.9 257 230.9 255C236.7 252.1 239.2 248 239.2 241.4C239.2 235.5 236.8 231.4 231.6 228C228.8 226.2 227.1 226.1 200.5 225.9C184.1 225.8 171 226.1 169 226.7C158.7 229.6 154.9 244.4 162.4 252.0000000000001zM223.8 157.5C169.9 157.5 168 157.3 163.6 153.4C160.1 150.3 157.9 144 158.5 139.5C159.2 134.8 163.3000000000001 129.4 167.7 127.5C169.9 126.5 181.8 125.8 224 126.3L271.9 126.9L281.1 128.4C290.1 133.5000000000001 291.6 145.8 284.2 152.8C278.9 157.5 279.2 157.5 223.8 157.5zM447.2000000000001 27.4C443.7000000000001 -1 424.2000000000001 -23 396.1 -30.1C388.9000000000001 -31.9 386.4000000000001 -32 223.2 -31.9C65.4 -31.9 57.3 -31.8 51.2 -30.1C42.8 -27.9 35.6 -24.6 28.9 -20.1C23.3 -16.3 15 -8.3 11.9 -3.7C8.1 1.9 3.7 11.6 1.9 18.3C0.1 25 0 27.7 0 191.7C0 354.8 0 358.3 1.8 365.4C8.1 390.1 27.7 409 53 414.6C60.3 416.2 385.1 416.5 393 414.9C414.2 410.6 430.9 397.8 440.6 378.5C448.3 363.2 447.6 380 447.9000000000001 197.9C448.1 82.1 447.9000000000001 33.4 447.2000000000001 27.4zM361.8000000000001 212.6C360.7000000000001 217.6 357.6000000000001 222.2 354.1000000000001 224.1C353.0000000000001 224.7 346.1000000000001 225.4 338.6000000000001 225.8C326.2000000000001 226.4 324.8000000000001 226.6 320.8000000000001 228.9C314.6000000000001 232.5 312.9000000000001 236.5 312.8000000000001 247.2C312.8000000000001 267.6 304.3000000000001 286.6 287.5000000000001 303.7C275.5000000000001 315.9 262.2000000000001 324.2 246.9000000000001 328.8C243.3000000000001 329.9 235.1000000000001 330.3 207.7000000000001 330.6C164.8000000000001 331.1 155.2000000000001 330.2 140.6000000000001 324.4C113.6000000000001 313.7 94.3000000000001 291 87.2000000000001 262C85.9000000000001 256.5999999999999 85.6000000000001 247.8 85.3 197.6999999999999C84.9 134.8999999999999 85.3 125.5999999999999 89.3 113.1999999999999C99 82.4999999999999 126.4 59.8 153.9 54.8C163.1 53.1 276.1 52.6999999999999 287.6 54.3C307.7000000000001 56.9999999999999 323.5 65.1 338.3 80.1999999999999C349 91.0999999999999 355.7 102.9999999999999 360.1 118.6999999999999C363.3 129.5999999999999 363 207.0999999999999 361.8 212.5999999999999z" />
139
- <glyph glyph-name="bluetooth-b"
140
- unicode="&#xF294;"
141
- horiz-adv-x="320" d=" M196.48 187.977L289.106 291.31L143.125 448V241.67L57.014 327.781L25.608 296.376L133.669 187.977L25.608 79.578L57.014 48.173L143.125 134.284L145.84 -64L294.392 84.644L196.48 187.977zM237.34 290.973L187.363 240.995L187.025 341.29L237.34 290.973zM187.363 134.96L237.34 84.982L187.025 34.6659999999999L187.363 134.9599999999999z" />
142
- <glyph glyph-name="bluetooth"
143
- unicode="&#xF293;"
144
- horiz-adv-x="448" d=" M292.6 276.9L249.7 234L249.4 320L292.6 276.9M249.4 57.1L292.5 100.2000000000001L249.6 143.1L249.4 57.1zM416 188.6C416 -17 344.1 -64 230.9 -64S32 -17 32 188.6S115.4 448 228.6 448S416 394.1 416 188.6zM257.5 188.6L336.9 277.2000000000001L211.8 411.5V234.6L138 308.4L111 281.5L203.7 188.5L111 95.5L137.9 68.6L211.7 142.4L214 -27.6L341.4 99.9L257.5 188.6z" />
145
- <glyph glyph-name="btc"
146
- unicode="&#xF15A;"
147
- horiz-adv-x="384" d=" M310.204 205.362C337.9340000000001 219.542 355.581 244.752 351.4840000000001 286.662C346.1260000000001 344.013 299.0260000000001 363.235 236.6340000000001 368.591V448H188.1060000000001V370.7970000000001C175.5010000000001 370.7970000000001 162.5810000000001 370.482 149.662 370.1670000000001V448H101.134V368.591C83.2920000000001 368.052 62.512 368.315 3.764 368.591V316.913C42.078 317.591 62.181 320.053 66.787 295.486V78.057C63.862 58.565 48.263 61.372 13.532 61.986L3.765 4.32C92.246 4.32 101.135 4.005 101.135 4.005V-64H149.663V3.06C162.897 2.745 175.817 2.745 188.107 2.745V-64H236.635V4.005C317.9340000000001 8.417 372.2820000000001 28.899 379.5300000000001 105.472C385.201 166.918 356.2100000000001 194.334 310.2040000000001 205.362zM150.608 313.447C178.023 313.447 263.7340000000001 321.954 263.7340000000001 264.919C263.7340000000001 210.404 178.0240000000001 216.707 150.608 216.707V313.447zM150.608 61.671V168.179C183.38 168.179 283.735 177.317 283.735 114.924C283.7340000000001 54.738 183.38 61.671 150.608 61.671z" />
148
- <glyph glyph-name="buromobelexperte"
149
- unicode="&#xF37F;"
150
- horiz-adv-x="448" d=" M0 416V288H128V416H0zM120 296H8V408H120V296zM160 416V288H288V416H160zM280 296H168V408H280V296zM320 416V288H448V416H320zM440 296H328V408H440V296zM0 256V128H128V256H0zM120 136H8V248H120V136zM160 256V128H288V256H160zM280 136H168V248H280V136zM320 256V128H448V256H320zM440 136H328V248H440V136zM0 96V-32H128V96H0zM120 -24H8V88H120V-24zM160 96V-32H288V96H160zM280 -24H168V88H280V-24zM320 96V-32H448V96H320z" />
151
- <glyph glyph-name="buysellads"
152
- unicode="&#xF20D;"
153
- horiz-adv-x="448" d=" M224 297.3L266.9 136.6H181.1L224 297.3zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM382.7 42.7L288.2 341.4H159.8L65.3 42.7H156L267.7 134.3L291.9 42.6999999999999H382.7z" />
154
- <glyph glyph-name="canadian-maple-leaf"
155
- unicode="&#xF785;"
156
- horiz-adv-x="465.9" d=" M232.9 448S195.4 375.7 190.4 368.2C185.4 358.2 180.4 358.2 172.8 363.2C162.8 368.2 132.7 385.6 132.7 385.6S160.3 266 160.3 256C162.8 246 152.8 238.5 142.7 246C140.2 248.5 87.6 308.3 87.6 308.3S75.1 281 72.6 276C70.1 271 67.6 266.1 60.1 268.5C50 271 2.4 281 2.4 281S20 221.3 22.5 213.7C24.9 207.7 27.5 201.2 17.5 196.3L0 188.7S102.6 98.8 105.2 96.3C110.3 91.3 115.2 88.8 110.3 73.8C105.2 58.8 100.2 38.6999999999999 100.2 38.6999999999999S195.4 58.8 205.5 61.3C214.2 62.1999999999999 223.8 58.8 223.8 48.8C223.8 38.6999999999999 218 -64 218 -64H248S242.2 38.7 242.2 48.8C242.2 58.8 251.7 62.2 260.6 61.3C270.6 58.8 365.8 38.7 365.8 38.7S360.8 58.8 355.8 73.8S355.8 91.3 360.8 96.3C363.3 98.8 465.9999999999999 188.7000000000001 465.9999999999999 188.7000000000001L448.5 196.2000000000001C438.5 201.1000000000001 441.1 207.7000000000001 443.5 213.6000000000001C445.8999999999999 221.2000000000001 463.6 280.9000000000001 463.6 280.9000000000001S415.9 270.9000000000001 405.9 268.4000000000001C398.4 266 395.9 270.9000000000001 393.4 275.9000000000001S378.4 308.3000000000001 378.4 308.3000000000001S325.8 248.4000000000001 323.3 246.0000000000001C313.3 238.5000000000001 303.2 246.0000000000001 305.7 256.0000000000001C305.7 266.0000000000001 333.3 385.6 333.3 385.6S303.2 368.2000000000001 293.2 363.2000000000001C285.7 358.2000000000001 280.5999999999999 358.2000000000001 275.5999999999999 368.2000000000001C270.5 375.7 232.9 448 232.9 448" />
157
- <glyph glyph-name="cc-amazon-pay"
158
- unicode="&#xF42D;"
159
- horiz-adv-x="576" d=" M124.7 246.2C124.8 258 124.7 269.7 124.7 281.5V316.8C124.7 318.1 125.1 318.8 126.1 319.5C137.6 327.5 150.2 331.6 164.3 330.6C176.8 329.7 187 323.6 192.4 308.9C195.7 300 196.5 290.7000000000001 196.5 281.2000000000001C196.5 272.5 195.8 263.9 193.1 255.6C187.4 237.8 174.4 230.9000000000001 157.4 231.7C145.7 232.2 135.5 236.7 126 243.4C125.1 244.2 124.6 245 124.7 246.2zM279.6 231.6C284.2000000000001 229.8 288.9000000000001 229.6 293.7000000000001 230.1C305.3000000000001 231.3 315.6 235.8 325.0000000000001 242.6C325.9000000000001 243.2 326.3000000000001 243.9 326.3000000000001 245.1C326.2000000000001 249 326.3000000000001 253 326.3000000000001 256.9C326.3000000000001 260.9 326.2000000000001 264.9 326.3000000000001 268.9C326.3000000000001 270.3 325.9000000000001 270.9 324.5000000000001 271.1C317.5000000000001 272 310.6000000000001 273.3 303.6000000000001 274C296.6000000000001 274.6 289.6000000000001 274.3 282.8000000000001 272.1C276.1000000000001 269.9 271.1000000000001 265.9 269.1000000000001 259C267.5000000000001 253.6 267.5000000000001 248.2 269.2000000000001 242.8C270.8000000000002 237.3 274.4000000000001 233.6 279.6000000000001 231.6zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM368.5 344.1C368.9 342.4 369.4 340.7 370.1 339C386.6 298.4 403 257.7 419.6 217.1C421 213.6 421.3 210.7 419.8 207.2C417 201 414.9000000000001 194.6 412 188.5C409.4 183 405.3 179 399.3 177.3C395.1 176.2 390.8 176 386.4000000000001 176.4C384.3 176.6 382.2000000000001 177.1 380.1 177.2000000000001C377.3 177.4 375.9000000000001 176.1 375.8 173.2000000000001C375.7 170.4 375.7 167.6 375.8 164.9C375.9000000000001 160.3 377.4000000000001 158.2000000000001 382 157.4C386.7 156.6 391.4 155.8 396.2 155.7000000000001C410.5 155.4 421.9 161.1 429.3 173.6C432.2 178.5 434.9000000000001 183.7000000000001 437 189C456.8 239.1 476.5 289.3 496.2 339.5C496.8 341 497.3 342.5 497.5 344.1C497.9 346.5 496.8 347.7 494.4 347.8C488.8 347.9 483.3 347.8 477.7 347.8C474.6 347.8 472.4 346.4 471.3 343.5C470.9 342.4 470.4 341.2 470 340.1L440.9 256.4C438.8 250.3 436.7 244.3 434.4 237.8C434 238.7 433.8 239.2 433.6 239.7C422.8 269.6 412 299.6 401.2 329.5C399.5 334.2 397.7 339 395.9 343.7C395 346.2 393.2 347.7 390.5 347.7C384.1 347.8 377.7 347.9 371.3 347.8C369.1 347.8 368 346.2 368.5 344.1zM242.4 242C244.1 230.3 250 221.2 260.4 215.4C270.3 209.9 281.1 209.2 292.1 210.8C304.8 212.7 316 218.1 325.9 226.3C326.3 226.6 326.7 226.9 327.3 227.3C327.8 224.1 328.2 221.1 328.8 218.1C329.3 215.5 330.9 213.8 333.3 213.7C337.9 213.6 342.4 213.6 347 213.7C349.3 213.8 350.8 215.3 351 217.6C351.1 218.4 351.1 219.2 351.1 219.9V308.7000000000001C351.1 312.3000000000001 350.9 315.9000000000001 350.4 319.5000000000001C348.8 330.3000000000001 344.2 339.2000000000001 334.5 344.9000000000001C328.9 348.2000000000001 322.7 349.9000000000001 316.3 350.8000000000001C313.3 351.2000000000001 310.3 351.5000000000001 307.2 351.9000000000001H297.2C296.4 351.8000000000001 295.6 351.6000000000001 294.7 351.6000000000001C286.5 351.2000000000001 278.4 350.2000000000001 270.5 348.1000000000001C265.4 346.8000000000001 260.5 344.9000000000001 255.5 343.2000000000001C252.5 342.2000000000001 251 340.0000000000001 251.1 336.7000000000001C251.2 333.9000000000001 251 331.1000000000001 251.1 328.4000000000001C251.2 324.3000000000001 252.9 323.2000000000001 256.8 324.3000000000001C263.3 326.0000000000001 269.9000000000001 327.8000000000001 276.5 329.1000000000001C286.8 331.0000000000001 297.2 331.8000000000001 307.6 330.3000000000001C313 329.5000000000001 318.1 327.9000000000001 321.7000000000001 323.3000000000001C324.8000000000001 319.3000000000001 325.9000000000001 314.5000000000001 326.1 309.6000000000001C326.4000000000001 302.7000000000001 326.3 295.7000000000001 326.4000000000001 288.8000000000001C326.4000000000001 288.4000000000001 326.3 288.1000000000001 326.2000000000001 287.6000000000001C325.8000000000001 287.6000000000001 325.4000000000001 287.6000000000001 325.1 287.7000000000001C316.3 289.8000000000001 307.4000000000001 291.3000000000001 298.3 291.8000000000001C288.8 292.3000000000001 279.4000000000001 291.7000000000001 270.4000000000001 288.6000000000001C259.6 284.8000000000001 250.9000000000001 278.3000000000001 245.8000000000001 267.8000000000001C241.7000000000001 259.5000000000001 241.2000000000001 250.8000000000001 242.4000000000001 242.0000000000001zM98.7 341.1V165.8C98.7 165 98.7 164.1 98.8 163.3C99 160.8 100.5 159.1999999999999 102.9 159.1C108.8 159 114.7 159 120.6 159.1C123.1 159.1 124.6 160.8 124.7 163.2C124.8 164 124.8 164.9 124.8 165.7V226.4C125.7 225.7 126.2 225.2 126.7 224.8C141.7 212.3 158.9 208.2 177.8 211.9C194.9 215.3 206.7 225.8 214.5 241.1C220.3 252.7 222.8 265.2 223.2 278.1C223.7 292.4 222.2 306.5 216.4 319.8C209.3 336.2 197.5 347.1 179.7 350.7C177 351.3 174.2 351.5 171.5 351.9H164.5C163.3 351.7 162.1 351.6 160.9 351.4C149.2 350 138.6 345.6 129.1 338.7C127.1 337.3 125.2 335.7 123.2 334.2C123.1 334.7 122.9 335 122.8 335.4C122.4 337.7 122.1 340 121.7 342.3C121.1 346.2 119.2 347.8 115.3 347.9H105.6C99.7 348 98.7 346.9 98.7 341.1zM493.6 109C490.9 109.7 488.5 109 486 108C442.1 89.6 396.5 77.8 349.2 72.2C334.7 70.5 320.1 69.4 305.5 69C278.9 68.3 252.3 69.8 225.9 73.3C208.1 75.7 190.4 79 172.9 83.2C135.9 92.1 100.2 104.9 66.2 122C57.4 126.4 48.8 131.3 40.1 136C36.3 138.1 33.9 137.5 31.9 133.9V132.2C33.1 130.6 34.1 128.8 35.6 127.4C71.6 95.2 112.2 70.9 157.6 54.5C179.5 46.6 202 40.8 224.9 37C238.9 34.7 252.9 33.2 267.1 32.5C270.1 32.4 273.1 32.3 276.1 32.1C276.8 32.1 277.5 31.9 278.2 31.8H295.9C296.6 31.9 297.3 32.1 298 32.1C312.9 32.5 327.8 33.9 342.6 36.1C364 39.3 385 44.2 405.5 50.8C435.1 60.4 463.2 73.2 488.9 90.9C491.7 92.8 494.6 94.7000000000001 496.9 97.1C501.2 101.5 499.2 107.5 493.6 109zM544 136.7C543.2 140.9 540 142.5 536.4 143.7C530.6999999999999 145.6 524.8 146.5 518.8 147C507.8 147.9 496.8 147.4 485.9999999999999 145.4C473.9999999999999 143.2 462.6 139.3 452.4999999999999 132.3C451.3 131.5 450.1 130.5 449.3999999999999 129.3C448.7999999999999 128.4 448.7 127 448.8999999999999 125.9C449.2 124.6 450.5999999999999 124.3 451.8999999999999 124.4C452.4999999999999 124.4 453.0999999999999 124.4 453.6999999999999 124.5L473.1999999999999 126.6C482.8 127.5 492.3999999999999 128.1 501.9999999999999 127.4C506.1 127.1 510.1 126.2000000000001 514 125.2000000000001C518.3 124.1 520.2 120.8000000000001 520.4 116.5000000000001C520.6999999999999 109.8000000000001 519.1999999999999 103.4 517.5 97.0000000000001C514 84.1000000000001 509.2 71.6000000000001 504.2 59.2000000000001C503.9 58.4 503.5 57.5000000000001 503.4 56.7000000000001C503 54.2 504.4 52.7 506.8 53.2C508.1999999999999 53.5000000000001 509.8 54.3000000000001 510.8 55.3000000000001C514.5 58.9000000000001 518.3 62.5000000000001 521.4 66.5000000000001C532.1 80.3000000000001 538.4 96.1000000000001 542.1 113.1000000000001C542.8000000000001 116.1000000000001 543.3000000000001 119.2000000000001 543.8000000000001 122.2000000000001C544.0000000000001 126.9000000000001 544.0000000000001 131.8000000000001 544.0000000000001 136.7000000000001z" />
160
- <glyph glyph-name="cc-amex"
161
- unicode="&#xF1F3;"
162
- horiz-adv-x="576" d=" M576 192.6C538.1 192.8 531.8 193.5 521.5 187.6V192.6C476.2 192.6 468 194.3 456.6 187.4V192.6H378.4000000000001V187.5C367.0000000000001 194 357.0000000000001 192.6 302.7000000000001 192.6V187C296.4000000000001 190.7 288.2000000000001 192.6 278.4000000000001 192.6H220.4C216.9 188.8 207.9 178.9 204.7000000000001 175.4C192.0000000000001 189.5 194.2000000000001 187 189.2000000000001 192.6H106.1000000000001V100.3H188.1000000000001C191.4000000000001 103.8 201.0000000000001 114.1999999999999 204.2000000000001 117.6999999999999C216.9 103.3999999999999 214.5000000000001 105.9999999999999 219.6000000000001 100.3H268.5000000000001C268.5000000000001 115 268.6000000000001 108.6 268.6000000000001 123.3C280.1000000000001 123.1 292.9000000000001 123.5 302.9000000000001 129.5C302.9000000000001 115.6 302.8000000000001 112.3999999999999 302.8000000000001 100.3H342.4000000000001C342.4000000000001 118.8 342.5000000000001 107.6999999999999 342.5000000000001 125.6C348.7000000000001 125.6 350.2000000000001 125.6 351.9000000000001 125.5C352.0000000000001 124.1999999999999 351.9000000000001 125.5 351.9000000000001 100.3C504.7000000000001 100.3 497.8000000000001 99.1999999999999 508.6000000000001 104.8V100.3C543.4000000000001 100.3 563.4000000000001 98.1 576.1000000000001 106.4V16C576.1000000000001 -10.5 554.6000000000001 -32 528.1000000000001 -32H48C21.5 -32 0 -10.5 0 16V219.7H26.6C30.8 229.8 28.8 225 33 235H52.2C56.4 225 54.4 229.8 58.6 219.7H111.5V231.1C113.7 226.1 112.6 228.6 116.6 219.7H146.1C148.5 225.2 148.7 225.5 151.2 231.1V219.7H286.7V244.8C293.1 244.8 294.7 244.9 296.5 244.6C296.5 244.6 296.3 233.7 296.6 219.8H363.1V228.7C370.5 222.8 380.5 219.8 392.8 219.8H419.6C423.8 229.9 421.8 225.1 426 235.1H445C451.5 220.1 445.2 234.6 451.6 219.8H504.4V241.7C516.2 222 512.2 228.8 517.6 219.8H559.2V311.8H519.3000000000001V293.4C507.1000000000001 313.6 513.0000000000001 303.8 508.1000000000001 311.8H464.8000000000001V291.2C458.6000000000001 305.8 460.2 302 456.0000000000001 311.8H423.6000000000001C423.2000000000001 311.8 421.3000000000001 311.6 421.3000000000001 312.1H393.7000000000001C380.9000000000001 312.1 370.6 308.9 363.0000000000001 302.8V312.1H323.1000000000001V306.8C312.3000000000001 312.9 302.4000000000001 311.9 258.7000000000001 312.1C258.6 312.1 247.1000000000001 312.2 247.1000000000001 312.1H144.1000000000001C141.6000000000001 306 137.3000000000001 295.7 131.5000000000001 282.1C128.7000000000001 288.1 120.5000000000001 305.9 117.6000000000001 312.1H71.6000000000001V291C64.2000000000001 308.4 66.9000000000001 302 62.6000000000001 312.1H22.9C19.5 304.2 9.2 280.1 -0.2 258.2V368C-0.2 394.5 21.3 416 47.8 416H527.8C554.3 416 575.8 394.5 575.8 368V192.6zM389.4 273.2C389.1 273 388 271 388 265.6C388 259.6 388.9 257.9 389.1 257.7C389.3 257.6 390.2000000000001 257.2 392.5 257.2L399.8 274.1C398.7 274.1 397.7 274.2 396.7 274.2C391.1 274.2 389.7 273.5 389.4 273.2zM369.5 142.3C378.7 139 380.5 132.8 380.5 123.9L380.4 110.1H363.8L363.9 121.6C363.9 133.4 360.1 135.4 349.1 135.4H331.5L331.3999999999999 110.1H314.7999999999999L314.8999999999999 179.4H354.2999999999999C367.2999999999999 179.4 381.3999999999999 177.1 381.3999999999999 160.7C381.2999999999999 153.1 377.2 145.4 369.5 142.3zM363.2 157.6999999999999C363.2 164.0999999999999 357.6 165.0999999999999 352.5 165.0999999999999H331.5V149.4999999999999H352.2C357.8 149.4999999999999 363.2 150.7999999999999 363.2 157.6999999999999zM544.9 164.8H575V179.4H542.1C529.3000000000001 179.4 518.3000000000001 172.8 518.3000000000001 158.7C518.3000000000001 125.7 561.0000000000001 145.9 561.0000000000001 131.3C561.0000000000001 126.2 556.7000000000002 124.9 552.6000000000001 124.9H520.6000000000001L520.5000000000001 110.1H552.5000000000001C560.9000000000001 110.1 570.1000000000001 111.9 575.0000000000001 119V144.8C564.5000000000001 158.6 535.7000000000002 146.1 535.7000000000002 158.3C535.7000000000002 164.1 540.3000000000002 164.8 544.9000000000002 164.8zM445.7 165.1V179.4H390.5L390.4 110.1H445.6L445.7 124.4L407.1 124.7V138.5H445V152.6H407.2V165.1H445.7zM487.9 125H455.7L455.6 110.1999999999999H487.8C502.6 110.1999999999999 514 115.8 514 132.1999999999999C514 165.3999999999999 471.1 143.3999999999999 471.1 158.5C471.1 164.1 476 164.8999999999999 480.3 164.8999999999999H510.7V179.5H477.5C464.7 179.5 454 172.8999999999999 454 158.8C454 125.8 496.7 146.3 496.7 131.4C496.6 126 492 125 487.9 125zM409.8 283.7C392.4 284 376.6 287.8 376.6 264C376.6 252.2 379.4 244.1 392.7 244.1H400.1L423.6 298.5999999999999H448.4L476.3 233.2V298.5999999999999H501.6L530.6999999999999 250.5V298.5999999999999H547.5999999999999V229.6H524L492.8 281.5V229.6H459.1L452.5 244.9H418.2L411.8 229.6H392.6C369.8 229.6 359.6 241.4 359.6 263.5999999999999C359.6 286.9 370.1 298.8999999999999 393.6 298.8999999999999H409.7000000000001V283.7zM424.1 259.2H446.9L435.7 286.8L424.1 259.2zM351.5 298.8H334.6V229.5H351.5V298.8zM313.4 261.5C322.9 258.2 324.4 252.3 324.4 243.1V229.6H307.8C307.5 244.4 311.4 254.7 293 254.7H275V229.6H258.6V298.8999999999999L297.7 298.5999999999999C311 298.5999999999999 325.1 296.5999999999999 325.1 280.2C325.2 272.2 320.8 264.4999999999999 313.4 261.4999999999999zM306.7 276.8C306.7 283.2 301.1 284.2 296 284.2H275V268.9H295.7C301.4 268.9 306.7 270.2 306.7 276.8zM247.2 284.2V298.8H191.7V229.5H247.2V243.8H208.3V257.6H246.1V271.7H208.3V284.2H247.2zM162.6 229.5V283.7L138.6 229.5H124L100 283.7V229.5H66.2L59.8 244.8H25.3L18.9 229.5H1L30.7 298.8H55.2L83.3 233.1V298.8H110.4L132.1 251.8L151.8 298.8H179.4V229.5H162.6zM53.9 259.2L42.4 286.8L31.2 259.2H53.9zM306.9 156.7C306.9 128.8 276.5 133.4 257.6 133.4L257.5 110.1H225.3L204.9 133.1L183.5999999999999 110.1H118.1999999999999L118.2999999999999 179.4H184.7999999999999L205.2999999999999 156.6L226.3 179.4H279C294.6 179.4 306.9 174 306.9 156.7zM194.2 144.9L176.3 165.1H134.6V152.6H170.9V138.5H134.6V124.6999999999999H175.2L194.2 144.8999999999999zM241 172L215.7 144.6L241 116.5V172zM289.3 156.7C289.3 162.8 284.7 165.1 279.1 165.1H257.6V147.5H278.8C284.7 147.5 289.3 150.3 289.3 156.6999999999999z" />
163
- <glyph glyph-name="cc-apple-pay"
164
- unicode="&#xF416;"
165
- horiz-adv-x="576" d=" M302.2 229.6C302.2 212.4 291.7 202.5 273.2 202.5H248.9V256.7H273.3C291.7 256.7 302.2 246.9 302.2 229.6zM349.7 167C349.7 158.7 356.9 153.3 368.2 153.3C382.6 153.3 393.4 162.4 393.4 175.2V182.9L369.9 181.4C356.6 180.5 349.7 175.6 349.7 167zM576 369V17C576 -9.5 554.5 -31 528 -31H48C21.5 -31 0 -9.5 0 17V369C0 395.5 21.5 417 48 417H528C554.5 417 576 395.5 576 369zM127.8 250.8C136.2 250.1 144.6 255 149.9 261.2000000000001C155.1 267.6 158.5 276.2000000000001 157.6 284.9C150.2 284.6 141 280 135.7 273.6C130.9 268.1 126.8 259.2 127.8 250.8zM188.4 176.3C188.2 176.5 168.8 183.9 168.6 206.3C168.4 225 183.9 234 184.6 234.5C175.8 247.5 162.2 248.9 157.5 249.2C145.3 249.9 134.9 242.3 129.1 242.3C123.2 242.3 114.4 248.9 104.8 248.7C92.3 248.5 80.6 241.4 74.3 230.1C61.2 207.5 70.9 174.1 83.6 155.7C89.8 146.6 97.3 136.6 107.1 137C116.4 137.4 120.1 143 131.3 143C142.6 143 145.8 137 155.6 137.1C165.8 137.3 172.1 146.2000000000001 178.4 155.3C185.3 165.7 188.2 175.7 188.4 176.3zM323.8 229.7C323.8 256.3 305.3 274.5 278.9000000000001 274.5H227.7000000000001V138.1H248.9000000000001V184.7000000000001H278.2000000000001C305.0000000000001 184.7000000000001 323.8000000000001 203.1000000000001 323.8000000000001 229.7000000000001zM413.8 206C413.8 225.7 398 238.4000000000001 373.8 238.4000000000001C351.3 238.4000000000001 334.7 225.5000000000001 334.1 207.9H353.2000000000001C354.8000000000001 216.3000000000001 362.6 221.8000000000001 373.2000000000001 221.8000000000001C386.2000000000001 221.8000000000001 393.4000000000001 215.8000000000001 393.4000000000001 204.6000000000001V197.1000000000001L367.0000000000001 195.5000000000001C342.4000000000001 194.0000000000001 329.1000000000001 183.9 329.1000000000001 166.4C329.1000000000001 148.7000000000001 342.8000000000001 137.0000000000001 362.5000000000001 137.0000000000001C375.8000000000001 137.0000000000001 388.1000000000001 143.7000000000001 393.7000000000001 154.4H394.1V138H413.7000000000001V206zM516 237.1H494.5L469.6 156.5H469.2L444.3000000000001 237.1H422L457.9 137.8L456 131.8C452.8 121.6 447.5 117.6 438.1 117.6C436.4000000000001 117.6 433.2000000000001 117.8 431.9000000000001 117.9V101.5000000000001C433.1 101.1000000000001 438.4000000000001 101.0000000000001 440.0000000000001 101.0000000000001C460.7 101.0000000000001 470.4 108.9 478.9 132.8000000000001L516 237.1z" />
166
- <glyph glyph-name="cc-diners-club"
167
- unicode="&#xF24C;"
168
- horiz-adv-x="576" d=" M239.7 368.1C142.8 368.1 63.9 289.5 63.9 192.3C63.9 95.4 142.8 16.5 239.7 16.5C336.9 16.5 415.5 95.4 415.5 192.3C415.5 289.5 336.9 368.1 239.7 368.1zM199.8 88.5C158.1 104.4 128.4 144.9 128.4 192.3S158.1 280.2000000000001 199.8 296.4V88.5zM279.6 88.2V296.4C321.3 280.2000000000001 351 239.7 351 192.3S321.3 104.4 279.6 88.2000000000001zM528 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H528C554.5 -32 576 -10.5 576 16V368C576 394.5 554.5 416 528 416zM329.7 0H239.4C133.2 0 45.6 85.5 45.6 190.2C45.6 304.8 133.2 384 239.4 384H329.7C434.7 384 530.4 304.8 530.4 190.2C530.4 85.5 434.7 0 329.7 0z" />
169
- <glyph glyph-name="cc-discover"
170
- unicode="&#xF1F2;"
171
- horiz-adv-x="576" d=" M83 235.9C83 228 79.8 220.4 74.1 215.2C69.2 210.8 62.5 208.8 52.2 208.8H48V263H52.2C62.5 263 68.9 261.3 74.1 256.4C79.8 251.4 83 243.8 83 235.9zM504.8 264H499.9V239.1H504.6C514.9 239.1 520.4 243.5 520.4 251.9C520.4 259.8 514.9 264 504.8 264zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM428 195H473.3V208.8H444V231H472.3V244.8H444V263H473.3V277H428V195zM341.8 277L376.8 192.8H385.4000000000001L420.9000000000001 277H403.4000000000001L381.2000000000001 221.8L359.3000000000001 277H341.8000000000001zM258.8 235.4C258.8 210.8 278.7 190.8 303.4000000000001 190.8C328.0000000000001 190.8 348.0000000000001 210.7 348.0000000000001 235.4C348.0000000000001 260 328.1000000000001 280 303.4000000000001 280C278.8 280 258.8 260.1 258.8 235.4zM190.8 235.9C190.8 203.4 224.4 183.4 254.1 197.7V216.7C234.8 197.4 207.3 210.9 207.3 235.9C207.3 259.6 234 275 254.1 254.9V273.9C223.9 288.9 190.8 267.1 190.8 235.9zM156.9 207.6C149.3 207.6 143.1 211.3 139.4 218.4L129.1 208.5C146.9 182.4 185.7 190.3 185.7 219.8C185.7 232.9 180.3 238.8 162.1 245.4C152.5 248.8 149.8 251.3 149.8 255.7C149.8 264.4 164.3 269.8 174.7 258.2000000000001L183.1 269C164 286.1 133.4 277.9000000000001 133.4 254.7C133.4 243.4 138.6 237.5000000000001 153.6 232.0000000000001C179.3 222.9 168.3 207.6 156.9 207.6zM99.5 235.9C99.5 260 81.5 277 55.4 277H32V195H55.4C86.3 195 99.5 217.4 99.5 235.9zM122.9 277H106.9V195H122.9V277zM544 160C510.7 139.2 317.6 35.6 128 0H529C537.2 0 544 6.8 544 15V160zM544 195L518.1 229.5C530.2 232 536.8000000000001 240.1 536.8000000000001 252.7C536.8000000000001 281.2 506.5000000000001 277.1 483.9000000000001 277.1V195.1H499.9000000000001V227.9H502.1000000000001L524.3000000000001 195.1H544z" />
172
- <glyph glyph-name="cc-jcb"
173
- unicode="&#xF24B;"
174
- horiz-adv-x="576" d=" M431.5 203.7V236C472.7 236 470 235.8 470 235.8C477.3 234.5 483.3 228.5 483.3 219.8C483.3 211 477.3 205.3 470 204C468.8 203.6 466.7 203.7 431.5 203.7zM474.3 183.5C471.5 184.2 471 184 431.5 184V149C471.1 149 471.5 148.8 474.3 149.5C481.8 151 487.8 157.5 487.8 166.5C487.8 175.2 481.8 182 474.3 183.5zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM182 255.7H125C125 188.6 135.7 146 89.2 146C69.7 146 50.4 151.7 32 160.8V132.8C62 124.5 100 124.5 100 124.5C197.9 124.5 182 172.2 182 255.7zM360.5 251.2C297.1 267.2 195.5 266.1 195.5 191.9C195.5 114.8 303.7 118.3 360.5 132.7V161C312.9 136.3 253 139 253 192S312.8 247.6 360.5 223.2V251.2zM544 161.5C544 180 527.5 192 506 193.5V194.3C525.5 197 536.3 209.8 536.3 224.5C536.3 243.5 520.5999999999999 254.5 499.3 255.5C499.3 255.5 505.6 255.8 379 255.8V128.3H501.6999999999999C525.9999999999999 128.2 543.9999999999999 141.2 543.9999999999999 161.5z" />
175
- <glyph glyph-name="cc-mastercard"
176
- unicode="&#xF1F1;"
177
- horiz-adv-x="576" d=" M482.9 37.7C482.9 30.9 478.3 26 471.7 26C464.9 26 460.5 31.2 460.5 37.7C460.5 44.2 464.9 49.4 471.7 49.4C478.3 49.4 482.9 44.2 482.9 37.7zM172.1 49.4C165 49.4 160.9 44.2 160.9 37.7C160.9 31.2 165 26 172.1 26C178.6 26 183 30.9 183 37.7C182.9 44.2 178.6 49.4 172.1 49.4zM289.6 49.7C284.2 49.7 280.9 46.2 280.1 41H299.2C298.3 46.7 294.8 49.7 289.6 49.7zM397.4 49.4C390.6 49.4 386.5 44.2 386.5 37.7C386.5 31.2 390.6 26 397.4 26C404.2 26 408.6 30.9 408.6 37.7C408.6 44.2 404.2 49.4 397.4 49.4zM503.3 23.3C503.3 22.9999999999999 503.6 22.8 503.6 22.1999999999999C503.6 21.8999999999999 503.3 21.6999999999999 503.3 21.0999999999999C502.9999999999999 20.7999999999999 502.9999999999999 20.5999999999999 502.8 20.2999999999999C502.4999999999999 19.9999999999999 502.3 19.7999999999999 501.6999999999999 19.7999999999999C501.3999999999999 19.4999999999999 501.1999999999999 19.4999999999999 500.5999999999999 19.4999999999999C500.2999999999999 19.4999999999999 500.0999999999999 19.4999999999999 499.4999999999999 19.7999999999999C499.1999999999999 19.7999999999999 498.9999999999999 20.0999999999999 498.6999999999999 20.2999999999999C498.3999999999999 20.5999999999999 498.1999999999999 20.7999999999999 498.1999999999999 21.0999999999999C497.8999999999999 21.5999999999999 497.8999999999999 21.8999999999999 497.8999999999999 22.1999999999999C497.8999999999999 22.6999999999999 497.8999999999999 22.9999999999999 498.1999999999999 23.3C498.1999999999999 23.8 498.4999999999999 24.1 498.6999999999999 24.4C498.9999999999999 24.7 499.1999999999999 24.7 499.4999999999999 24.9C499.9999999999999 25.2 500.2999999999999 25.2 500.5999999999999 25.2C501.0999999999999 25.2 501.3999999999999 25.2 501.6999999999999 24.9C502.1999999999999 24.6 502.4999999999999 24.6 502.8 24.4S502.9999999999999 23.8 503.3 23.3zM501.1 21.9C501.6 21.9 501.6 22.2 501.9 22.2C502.2 22.5 502.2 22.7 502.2 23C502.2 23.3 502.2 23.5 501.9 23.8C501.6 23.8 501.4 24.1 500.8 24.1H499.1999999999999V20.6H499.9999999999999V22H500.3L501.4 20.6H502.2L501.1 21.9zM576 367V15C576 -11.5 554.5 -33 528 -33H48C21.5 -33 0 -11.5 0 15V367C0 393.5 21.5 415 48 415H528C554.5 415 576 393.5 576 367zM64 227.4C64 150.9 126.1 88.9 202.5 88.9C229.7 88.9 256.4 97.1 279 112C206.1 171.3 206.6 283.2 279 342.5C256.4 357.5 229.7 365.6 202.5 365.6C126.1 365.7 64 303.6 64 227.4zM288 118.6C358.5 173.6 358.2 280.8 288 336.1C217.8 280.8 217.5 173.5 288 118.6zM145.7 42.3C145.7 51 140 56.7 131 57C126.4 57 121.5 55.6 118.2 50.5C115.8 54.6 111.7 57 106 57C102.2 57 98.4 55.6 95.4 51.6V56H87.2V19.3H95.4C95.4 38.2 92.9 49.5 104.4 49.5C114.6 49.5 112.6 39.3 112.6 19.3H120.5C120.5 37.6 118 49.5 129.5 49.5C139.7 49.5 137.7 39.5 137.7 19.3H145.9V42.3zM190.6 56H182.7V51.6C180 54.9 176.2 57 171 57C160.7 57 152.8 48.8 152.8 37.7C152.8 26.5 160.7 18.4 171 18.4C176.2 18.4 180 20.3 182.7 23.8V19.1999999999999H190.6V56zM231.1 30.4C231.1 45.4 208.2 38.6 208.2 45.6C208.2 51.3 220.1 50.4 226.7 46.7L230 53.2C220.6 59.3 199.8 59.2 199.8 45C199.8 30.7 222.7 36.7 222.7 30C222.7 23.7 209.2 24.2 202 29.2L198.5 22.9C209.7 15.3 231.1 16.9 231.1 30.4zM266.5 21.1L264.3 27.9C260.5 25.8 252.1 23.5 252.1 32V48.6H265.2000000000001V56H252.1000000000001V67.2H243.9000000000001V56H236.3000000000001V48.7H243.9000000000001V32C243.9000000000001 14.4 261.2000000000001 17.6 266.5000000000001 21.1zM279.8 34.4999999999999H307.3C307.3 50.6999999999999 299.9000000000001 57.1 289.9000000000001 57.1C279.3 57.1 271.7000000000001 49.2 271.7000000000001 37.8C271.7000000000001 17.3 294.3000000000001 13.9 305.5000000000001 23.6L301.7000000000001 29.6C293.9000000000001 23.2 282.1 23.8 279.8000000000001 34.4999999999999zM338.9000000000001 55.9999999999999C334.3 57.9999999999999 327.3 57.8 323.7000000000001 51.6V56H315.5000000000001V19.3H323.7000000000001V40C323.7000000000001 51.6 333.2000000000001 50.1 336.5000000000001 48.4L338.9000000000001 56zM349.5000000000001 37.6999999999999C349.5000000000001 49.0999999999999 361.1000000000001 52.8 370.2000000000001 46.0999999999999L374.0000000000001 52.5999999999999C362.4000000000001 61.6999999999999 341.3000000000001 56.6999999999999 341.3000000000001 37.5999999999999C341.3000000000001 17.7999999999999 363.7000000000001 13.7999999999999 374.0000000000001 22.5999999999999L370.2000000000001 29.0999999999999C361.0000000000001 22.5999999999999 349.5000000000001 26.4999999999999 349.5000000000001 37.6999999999999zM416.2000000000001 55.9999999999999H408V51.6C399.7 62.6 378.1 56.4 378.1 37.7C378.1 18.5 400.5 13 408 23.8V19.2H416.2V56zM449.9000000000001 55.9999999999999C447.5000000000001 57.1999999999999 438.9000000000001 58.8999999999999 434.7000000000001 51.6V56H426.8000000000001V19.3H434.7000000000001V40C434.7000000000001 51 443.7000000000001 50.3 447.5000000000001 48.4L449.9000000000001 56zM490.2 70.8999999999999H482.3000000000001V51.5999999999999C474.1000000000001 62.4999999999999 452.4000000000001 56.6999999999999 452.4000000000001 37.6999999999999C452.4000000000001 18.3 474.9000000000001 13.0999999999999 482.3000000000001 23.8V19.1999999999999H490.2V70.8999999999999zM497.8000000000001 145.9999999999999V141.3999999999999H498.6000000000001V146H500.5000000000001V146.8H495.9V146H497.8zM504.4000000000001 22.1999999999999C504.4000000000001 22.6999999999999 504.4000000000001 23.2999999999999 504.1000000000001 23.7999999999999C503.8000000000001 24.0999999999999 503.6000000000001 24.5999999999999 503.3000000000001 24.8999999999999C503.0000000000001 25.1999999999999 502.5000000000001 25.3999999999999 502.2 25.6999999999999C501.7 25.6999999999999 501.1 25.9999999999999 500.6 25.9999999999999C500.3 25.9999999999999 499.8 25.6999999999999 499.2 25.6999999999999C498.7 25.3999999999999 498.4 25.1999999999999 498.1 24.8999999999999C497.6 24.5999999999999 497.3 24.0999999999999 497.3 23.7999999999999C497 23.2999999999999 497 22.6999999999999 497 22.1999999999999C497 21.8999999999999 497 21.3999999999999 497.3 20.7999999999999C497.3 20.4999999999999 497.6 19.9999999999999 498.1 19.6999999999999C498.4 19.3999999999999 498.6 19.1999999999999 499.2 18.8999999999999C499.7 18.5999999999999 500.3000000000001 18.5999999999999 500.6 18.5999999999999C501.1 18.5999999999999 501.7 18.5999999999999 502.2 18.8999999999999C502.5000000000001 19.1999999999999 503.0000000000001 19.3999999999999 503.3000000000001 19.6999999999999C503.6000000000001 19.9999999999999 503.8000000000001 20.4999999999999 504.1000000000001 20.7999999999999C504.4000000000001 21.3999999999999 504.4000000000001 21.8999999999999 504.4000000000001 22.1999999999999zM507.6000000000001 146.8999999999999H506.2000000000001L504.6000000000001 143.3999999999999L503.0000000000001 146.8999999999999H501.6000000000001V141.4999999999999H502.4000000000001V145.5999999999999L504.0000000000001 142.0999999999999H505.1000000000001L506.5000000000001 145.5999999999999V141.4999999999999H507.6000000000001V146.8999999999999zM512.0000000000001 227.3999999999999C512.0000000000001 303.5999999999999 449.9000000000001 365.6999999999999 373.5000000000001 365.6999999999999C346.3000000000002 365.6999999999999 319.6000000000002 357.4999999999999 297.0000000000001 342.5999999999999C369.1000000000002 283.2999999999999 370.2000000000001 171.0999999999999 297.0000000000001 112.0999999999999C319.6000000000002 97.0999999999999 346.5000000000001 88.9999999999999 373.5000000000001 88.9999999999999C449.9000000000001 88.8999999999999 512.0000000000001 150.8999999999999 512.0000000000001 227.3999999999999z" />
178
- <glyph glyph-name="cc-paypal"
179
- unicode="&#xF1F4;"
180
- horiz-adv-x="576" d=" M186.3 189.8C186.3 177.6 176.6 168.3 164.3 168.3C155.1 168.3 148.3 173.5 148.3 183.3C148.3 195.5 157.8 205.3 170 205.3C179.3 205.3 186.3 199.6 186.3 189.8zM80.5 238.3H75.8C74.3 238.3 72.8 237.3 72.6 235.6L68.3 208.9L76.5 209.2000000000001C87.5 209.2000000000001 96 210.7000000000001 98 223.4C100.3 236.8000000000001 91.8 238.3000000000001 80.5 238.3000000000001zM364.5 238.3H360C358.2 238.3 357 237.3 356.8 235.6L352.6 208.9L360.6 209.2000000000001C373.6 209.2000000000001 382.6 212.2000000000001 382.6 227.2000000000001C382.5 237.8000000000001 373 238.3000000000001 364.5 238.3000000000001zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM128.3 232.6C128.3 253.6 112.1 260.6 93.6 260.6H53.6C51.1 260.6 48.6 258.6 48.4 255.9L32 153.8C31.7 151.8 33.2 149.8 35.2 149.8H54.2C56.9 149.8 59.4 152.7 59.7 155.5L64.2 182.1C65.2 189.3 77.4 186.8 82.2 186.8C110.8 186.8 128.3 203.8 128.3 232.6zM212.5 223.8H193.5C189.7 223.8 189.5 218.3 189.3 215.6C183.5 224.1 175.1 225.6 165.6 225.6C141.1 225.6 122.4 204.1 122.4 180.4C122.4 160.9 134.6 148.2 154.1 148.2C163.1 148.2 174.3 153.1 180.6 160.1C180.1 158.6 179.6 155.4 179.6 153.9C179.6 151.6 180.6 149.9 182.8 149.9H200C202.7 149.9 205 152.8 205.5 155.6L215.7 219.9C216 221.8 214.5 223.8 212.5 223.8zM253 125.9L316.7 218.5C317.2 219 317.2 219.5 317.2 220.2C317.2 221.9 315.7 223.7 314 223.7H294.8C293.1 223.7 291.3 222.7 290.3 221.2L263.8 182.1999999999999L252.8 219.6999999999999C252 221.8999999999999 249.8 223.6999999999999 247.3 223.6999999999999H228.6C226.9000000000001 223.6999999999999 225.4000000000001 221.8999999999999 225.4000000000001 220.1999999999999C225.4000000000001 219 244.9000000000001 163.3999999999999 246.6 158.0999999999999C243.9000000000001 154.2999999999999 226.1 129.4999999999999 226.1 126.4999999999999C226.1 124.6999999999999 227.6 123.2999999999999 229.3 123.2999999999999H248.5C250.3 123.3999999999999 252 124.3999999999999 253 125.8999999999999zM412.3 232.6C412.3 253.6 396.1 260.6 377.6 260.6H337.9000000000001C335.2000000000001 260.6 332.7000000000001 258.6 332.4000000000001 255.9L316.2000000000001 153.9C316.0000000000001 151.9 317.5000000000001 149.9 319.4000000000001 149.9H339.9000000000001C341.9000000000001 149.9 343.4000000000001 151.4 343.9000000000001 153.1L348.4000000000001 182.1C349.4000000000001 189.3 361.6 186.8 366.4000000000001 186.8C394.8 186.8 412.3 203.8 412.3 232.6zM496.5 223.8H477.5C473.7 223.8 473.5 218.3 473.2 215.6C467.7 224.1 459.2 225.6 449.5 225.6C425 225.6 406.3 204.1 406.3 180.4C406.3 160.9 418.5 148.2 438 148.2C447.3 148.2 458.5 153.1 464.5 160.1C464.2 158.6 463.5 155.4 463.5 153.9C463.5 151.6 464.5 149.9 466.7 149.9H484C486.7 149.9 489 152.8 489.5 155.6L499.7 219.9C500 221.8 498.5 223.8 496.5 223.8zM544 257.1C544 259.1 542.5 260.6 540.8 260.6H522.3C520.8 260.6 519.3 259.4 519.0999999999999 257.9L502.8999999999999 153.9L502.5999999999999 153.4C502.5999999999999 151.6 504.0999999999999 149.9 506.0999999999999 149.9H522.5999999999999C525.0999999999999 149.9 527.5999999999999 152.8 527.8 155.6L544 256.8V257.1zM454 205.3C441.8 205.3 432.3 195.6 432.3 183.3C432.3 173.6 439.3 168.3 448.5 168.3C460.5 168.3 470.2 177.5 470.2 189.8C470.3 199.6 463.3 205.3 454 205.3z" />
181
- <glyph glyph-name="cc-stripe"
182
- unicode="&#xF1F5;"
183
- horiz-adv-x="576" d=" M396.9 191.5C396.9 172.4 388.1 158.1 375 158.1C366.7 158.1 361.7 161.1 358.2 164.8L358 217.6C361.7 221.7 366.8 224.6 375 224.6C387.9 224.7 396.9 210.1 396.9 191.5zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM122.2 166.9C122.2 209.2 67.9 201.6 67.9 217.6C67.9 223.1 72.5 225.3 80 225.3C90.8 225.3 104.5 222 115.3 216.2V249.6C103.5 254.3 91.8 256.1 80 256.1C51.2 256.1 32 241.1 32 215.9C32 176.6 86 183 86 166C86 159.4 80.3 157.3 72.4 157.3C60.6 157.3 45.5 162.2 33.5 168.6V134.7000000000001C46.7 129.0000000000001 60.1 126.6 72.3 126.6C101.9 126.8 122.2 141.3 122.2 166.9zM191.1 253.8H164.1V284.6L129.4 277.2L129.2000000000001 163.3C129.2000000000001 142.3 145.0000000000001 126.8 166.1000000000001 126.8C177.7000000000001 126.8 186.3000000000001 128.9 191.0000000000001 131.5V160.3999999999999C186.5000000000001 158.5999999999999 164.0000000000001 152.0999999999999 164.0000000000001 173V223.5H191.0000000000001V253.8zM264.9000000000001 253.8C260.2000000000001 255.5 243.6 258.6 235.3000000000001 243.3L233.1000000000001 253.8H202.4000000000001V129.3H237.9000000000001V213.7C246.3000000000001 224.7 260.5000000000001 222.6 265.0000000000001 221.1V253.8zM309.1 253.8H273.4000000000001V129.3H309.1V253.8zM309.1 301.1L273.4000000000001 293.5V264.6L309.1 272.2V301.1zM431.8 192.3C431.8 233.6 408.3 256.1 383.4000000000001 256.1C369.5000000000001 256.1 360.5000000000001 249.5 355.6 245L353.8 253.8H322.5V88L358 95.5L358.1 135.7C363.2000000000001 132 370.8 126.7 383.2000000000001 126.7C408.6 126.8 431.8000000000001 147.2 431.8000000000001 192.3zM544 191.1C544 227.5 526.4 256.2 492.7 256.2C458.9 256.2 438.4 227.5 438.4 191.3C438.4 148.5 462.6 126.8 497.2 126.8C514.2 126.8 526.9 130.6999999999999 536.6 136V164.6C526.9 159.7 515.8000000000001 156.7 501.7 156.7C487.9 156.7 475.7 161.6 474.1 178.2H543.6C543.7 180.2 544 187.6 544 191.1zM492.4 227.2C483.5 227.2 473.7 220.5 473.7 204.5H510.4C510.4 220.5 501.1 227.2 492.4 227.2z" />
184
- <glyph glyph-name="cc-visa"
185
- unicode="&#xF1F0;"
186
- horiz-adv-x="576" d=" M470.1 216.7S477.7 179.5 479.4 171.7H446C449.3 180.6 462 215.2 462 215.2C461.8 214.9 465.3 224.3 467.3 230.1L470.1 216.7zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM152.5 116.8L215.7 272H173.2L133.9 166L129.6 187.5L115.6 258.9C113.3 268.8 106.2 271.6 97.4 272H32.7L32 268.9C47.8 264.9 61.9 259.1 74.2 251.8L110 116.8H152.5zM246.9 116.6L272.1 272H231.9000000000001L206.8000000000001 116.6H246.9000000000001zM386.8 167.4C387 185.1 376.2 198.6 353.1 209.7000000000001C339 216.8000000000001 330.4000000000001 221.6000000000001 330.4000000000001 228.9000000000001C330.6 235.5000000000001 337.7000000000001 242.3000000000001 353.5000000000001 242.3000000000001C366.6000000000001 242.6000000000001 376.2000000000001 239.5000000000001 383.4000000000001 236.4000000000001L387.0000000000001 234.7000000000001L392.5000000000001 268.3000000000001C384.6000000000001 271.4000000000001 372.0000000000001 274.9000000000001 356.5000000000001 274.9000000000001C316.8000000000001 274.9000000000001 288.9000000000001 253.7000000000001 288.7000000000001 223.5C288.4000000000001 201.2 308.7000000000001 188.8 323.9000000000001 181.3C339.4000000000001 173.7 344.7000000000001 168.7 344.7000000000001 162C344.5000000000001 151.6 332.1 146.8 320.6 146.8C304.6 146.8 296 149.3 282.9000000000001 155.1L277.6 157.6L272 122.7000000000001C281.4 118.4 298.8 114.6 316.8 114.4C359 114.3 386.5 135.2000000000001 386.8 167.4zM528 116.6L495.6 272H464.5C454.9 272 447.6 269.2 443.5 259.1L383.8 116.6H426S432.9 135.8 434.4 139.9H486C487.2 134.4 490.8 116.6 490.8 116.6H528z" />
187
- <glyph glyph-name="centercode"
188
- unicode="&#xF380;"
189
- horiz-adv-x="512" d=" M329.2 179.4C325.4 144.2 293.8 118.8 258.6 122.6C223.4 126.4 198 158 201.8 193.2C205.6 228.4 237.2 253.8 272.4 250C307.5 246.2 333 214.5999999999999 329.2 179.4zM243.4 -55.7C96.7 -48 -8.2 82.5 10.1 223.7C21.3 310.3 75.9 380.6 149.2 415.7C310.2 492.8 498.9 378.3 503.9 199.1C508 52.1 385.5 -63.1 243.4 -55.7zM423.3 124.3C451.1999999999999 242.3 262.8 330.2 186.1 358.5C128.6 302.2 117 169.9 152.3 14.1C221.1 -1.7 321.4 40.4999999999999 423.3 124.3z" />
190
- <glyph glyph-name="centos"
191
- unicode="&#xF789;"
192
- horiz-adv-x="447.5" d=" M289.6 350.2L321.2000000000001 318.5L244.9000000000001 242V350.2H289.6zM127.2 318.5L203.5 242V350.2H158.8L127.2 318.5zM168.7 360.1H213.4V232.2L224.2000000000001 221.4L235.0000000000001 232.2V360.1H279.7000000000001L224.2000000000001 415.7L168.7000000000001 360.1zM194.9 192L184.1 202.8H55.5V247.6L0 192L55.5 136.4V181.2H184.1L194.9 192zM274.2 212.7H382.1V257.5L350.5 289.2L274.2 212.7zM447.5 192L392 247.6V202.8H264.3L253.5 192L264.3 181.2H392V136.4L447.5 192zM65.4 271.5L97.9 303.2L188.2 212.7H203.5V228L113.2 318.5L144.8 350.2H65.4V271.5zM382.1 350.2H303.6L335.2000000000001 318.5L244.9000000000001 228V212.7H260.2000000000001L350.5000000000001 303.2L382.1000000000001 271.5V350.2zM203.5 33.8V141.9L127.2 65.4L158.8 33.7H203.5zM65.4 212.7H174.2L97.9 289.2L65.4 257.5V212.7zM382.1 112.5L350.5 80.8L260.2 171.3H244.9V156L335.2 65.5L303.6 33.8H382.1V112.5zM382.1 171.3H274.2L350.5 94.8L382.1 126.5V171.3zM321.2000000000001 65.5L244.9 142V33.9H289.6L321.2000000000001 65.5zM97.9 94.8L174.2 171.3H65.4V126.5L97.9 94.8zM279.7000000000001 23.9H235V151.8L224.2 162.6L213.4 151.8V23.9H168.7L224.2 -31.7L279.7 23.9zM113.2000000000001 65.5L203.5000000000001 156V171.3H188.2000000000001L97.9000000000001 80.8L65.4000000000001 112.5V33.8H144.8000000000001L113.2000000000001 65.5z" />
193
- <glyph glyph-name="chrome"
194
- unicode="&#xF268;"
195
- horiz-adv-x="496" d=" M131.5 230.5L55.1 347.9C102.7 407.1 174.1 439.7 247.1 440C289.4 440.3 332.6 429.5 371.9 406.8C415.3 381.6 448.3 345.4 469.3 303.8L264 314.6C205.9 318 150.6 285.3 131.5 230.5zM164.4 192C164.4 145.8 201.8 108.4 248 108.4S331.6 145.8 331.6 192S294.2000000000001 275.6 248.0000000000001 275.6S164.4 238.3 164.4 192zM479.3 281.2L339.6 274C377.5 229.7 378.1 165.8 346.2000000000001 116.8L234.1 -55.6C280.6 -58.1 328.5 -47.9 371.9 -22.7C479.3 39.3 522.8 169.3 479.3 281.2zM133.7 144.4L40.4 327.9C14.9 288.9 0 242.1 0 192C0 68 90.8 -34.7 209.5 -52.9L273.2 71.9C215.6 61.1 160 92.7000000000001 133.7 144.4z" />
196
- <glyph glyph-name="cloudscale"
197
- unicode="&#xF383;"
198
- horiz-adv-x="448" d=" M318.1 294L308.7000000000001 286.4C286.2000000000001 305.7000000000001 257.2000000000001 320 225.4000000000001 320C153.8 320 96 259.2 96 187.7C96 181.1 96.4 174.6 97.4 168.3C95.4 224.3 139.2 265.7000000000001 190 265.7000000000001C214.2 265.7000000000001 236.2 256.3 252.6 241.0000000000001L227.4 220.6C219.1 221.5 210.6 218.8 204.3 212.5C193.2 201.5 193.2 183.6 204.3 172.5C215.4 161.5 233.2 161.5 244.3 172.5C250.6 178.8 253.3 187.4 252.4 195.6L327.6 284.4C333.9000000000001 290.9 324.3 300.3 318.1 294zM234.3 182.5C228.7 177 219.7 177 214.1 182.5C208.5 188.1 208.5 197.1 214.1 202.7S228.7 208.3 234.3 202.7S239.9 188 234.3 182.5zM224 416C100.5 416 0 315.5 0 192S100.5 -32 224 -32S448 68.5 448 192S347.5 416 224 416zM224 32C135.8 32 64 103.8 64 192S135.8 352 224 352S384 280.2 384 192S312.2 32 224 32z" />
199
- <glyph glyph-name="cloudsmith"
200
- unicode="&#xF384;"
201
- horiz-adv-x="332" d=" M332.5 28.1C332.5 -18.3 294.9 -56 248.5 -56S164.5 -18.3 164.5 28.1S202.1 112.1 248.5 112.1S332.5 74.5 332.5 28.1zM248.5 272C294.9 272 328.5 309.6 328.5 356S294.9 440 248.5 440S160.5 402.4000000000001 160.5 356S130.9 280 84.5 280S0.5 238.4000000000001 0.5 192S38.1 112 84.5 112S168.5 145.6 168.5 192S202.1 272 248.5 272z" />
202
- <glyph glyph-name="cloudversify"
203
- unicode="&#xF385;"
204
- horiz-adv-x="616" d=" M148.6 144C156.8 75.5 216 28.5 294.6 32.7C345.8 -10.6 431.4000000000001 -13.1 481 38.3C550.2 37.2 599.5 82.9 612.5 137.8C627.3 200.3 594.3 270.3 520.4 292.9C487.4 381 389 394.4 333.9 377.9C276.6 360.6 249.6 324.7 234.6 268.2C226.8 265.5 208.1 259.3 189.6 244.1C201.3 244.1 204.8 235.2 204.8 224.6V204.2C204.8 193.5 196.1 184.7 185.3 184.7H165.1C154.4 184.7 145.6 190.7 145.6 201.4V208H98.8C95 208 88 203.7 88 196.1V155.7C88 149.3 93.3 143.9 99.7 143.9H148.6zM376 136C365.3 89.7 397.7 63.6 431.3 49.2C324.1 15.4 259.7 100 296 160C262.8 138.4 262.3 88.8 266.8 67.1C248.9 79.5 213 99.5 209.4 146.9C206.4 186.8 230.9 222.6 266.4 240.8000000000001C297 256.6 369.9 249.3 400 200C385.9 248 346.2 270.1 298.2 274.8C329.1 305.5 362.6 325.1 412.4 318.5C482.2 309.2 545.5999999999999 235.7 480.1 168C515.0999999999999 184.3 528.8 222.4 527.5999999999999 244.9L538.0999999999999 225.3C549.8999999999999 203.3 553.3 177.7 547.4999999999999 153.3C538.2999999999998 114.3 506.8999999999999 84.5 467.7999999999999 76.8C435.6999999999999 70.5 384.7 81.9 375.9999999999999 136zM128 240H88.2C79.3 240 72 247.3 72 256.2V295.8C72 304.7 79.3 312 88.2 312H128C136.9 312 144.2 304.7 144.2 295.8V256.2C144.2 247.3 136.9 240 128 240zM10.1 280C4.5 280 0 284.5 0 290.1V317.9C0 323.5 4.5 328 10.1 328H37.8C43.3 328 47.9 323.5 47.9 317.9V290.1C47.9 284.5 43.4 280 37.8 280H10.1zM168 305.3V326.7000000000001C168 331.8 172.2 336 177.3 336H198.7C203.8 336 208 331.8 208 326.7000000000001V305.3C208 300.2000000000001 203.8000000000001 296 198.7 296H177.3C172.2 296 168 300.2 168 305.3zM56 212.5V187.5C56 181.2 50.9 176 44.6 176H19.4C13.1 176 8 181.2 8 187.5V212.5C8 218.8 13.1 224 19.4 224H44.5C50.9 224 56 218.8 56 212.5z" />
205
- <glyph glyph-name="codepen"
206
- unicode="&#xF1CB;"
207
- horiz-adv-x="512" d=" M502.285 288.296L268.2850000000001 444.296C260.298 449.211 251.7740000000001 449.256 243.7140000000001 444.296L9.714 288.296C3.714 284.2970000000001 0 277.153 0 270.011V114.012C0 106.869 3.714 99.726 9.715 95.726L243.715 -60.296C251.702 -65.211 260.226 -65.256 268.286 -60.296L502.286 95.726C508.286 99.725 512.001 106.869 512.001 114.012V270.011C512 277.153 508.286 284.2970000000001 502.285 288.296zM278 384.8690000000001L450.286 270.011L373.429 218.582L278 282.2970000000001V384.8690000000001zM234 384.8690000000001V282.2970000000001L138.571 218.582L61.714 270.011L234 384.8690000000001zM44 228.868L99.143 192.011L44 155.154V228.868zM234 -0.847L61.714 114.011L138.571 165.4400000000001L234 101.725V-0.847zM256 140.011L178.285 192.011L256 244.011L333.7150000000001 192.011L256 140.011zM278 -0.847V101.725L373.429 165.4400000000001L450.286 114.0110000000001L278 -0.847zM468 155.154L412.857 192.011L468 228.868V155.154z" />
208
- <glyph glyph-name="codiepie"
209
- unicode="&#xF284;"
210
- horiz-adv-x="472" d=" M422.5 245.1C453.2 245.1 456 192 422.2 192H411.4V147.7H384.8V245.1H422.5zM472 95.4C429.9 3.5 350.4 -56 248 -56C111 -56 0 55 0 192S111 440 248 440C345.4 440 420.8 386.3 466.2 301.6L280.2 192.8L472 95.4zM433.5 82.9L373.2 113.6C346.1 69.3 302.8 42.1999999999999 250.8 42.1999999999999C168.3 42.1999999999999 101.6 108.8999999999999 101.6 191.0999999999999C101.6 273.5999999999999 168.3 340.2999999999999 250.8 340.2999999999999C299.2 340.2999999999999 339.7 316.7999999999999 367.7 276.8999999999999L427.2 311.4999999999999C386.5 374.0999999999999 322.5 411.4999999999999 248 411.4999999999999C126.8 411.4999999999999 28.5 313.1999999999999 28.5 191.9999999999999S126.8 -27.5 248 -27.5C326.6 -27.5 394.5 14.6 433.5 82.9z" />
211
- <glyph glyph-name="confluence"
212
- unicode="&#xF78D;"
213
- horiz-adv-x="512" d=" M2.3 35.8C-2.2 28.2 0.2 18.3 7.8 13.6L113.7 -51.6C121.4 -56.2999999999999 131.4 -53.9999999999999 136.1 -46.3C136.1 -46.1999999999999 136.2 -46.1 136.2 -46.1C203.3 66.1 216.7 49.8000000000001 417.1 -45.4C425.2 -49.3 434.9 -45.8 438.8 -37.7C438.9 -37.6 438.9 -37.4 439 -37.3L489.3999999999999 76.8C492.9999999999999 84.9 489.2999999999999 94.4 481.2999999999999 98.1C459.0999999999999 108.4999999999999 415.0999999999999 129.3 375.3999999999999 148.4C127.5 269 44.6 102.7 2.3 35.8zM509.7 347.9000000000001C514.2 355.5 511.8 365.4000000000001 504.2 370.1L398.4 435.2C390.9 440.2 380.8 438.3 375.8 430.8C375.6 430.5 375.4 430.2 375.2 429.8C307.8999999999999 317.2 294.0999999999999 334.2 94.5999999999999 428.9C86.4999999999999 432.8 76.7999999999999 429.3 72.8999999999999 421.2C72.7999999999999 421.1 72.7999999999999 420.9 72.6999999999999 420.8L22.2 306.7C18.6 298.6 22.3 289.1 30.3 285.4C52.5 275 96.6 254.2 136.3 235C384.3 115 467.1 280.4 509.7 347.9z" />
214
- <glyph glyph-name="connectdevelop"
215
- unicode="&#xF20E;"
216
- horiz-adv-x="576" d=" M550.5 207L500.411 293.786C501.482 295.928 502.286 298.339 502.286 301.0180000000001C502.286 309.054 495.59 315.751 487.554 316.019L432.107 411.9120000000001C432.643 413.519 433.178 415.126 433.178 416.733C433.178 425.304 426.214 432.001 417.91 432.001C413.089 432.001 409.071 429.858 406.124 426.376H299.518C296.839 429.857 292.8210000000001 432 288 432S279.161 429.857 276.482 426.375H170.411C167.464 429.857 163.447 432 158.625 432C150.322 432 143.357 425.304 143.357 416.732C143.357 415.125 143.893 413.25 144.429 411.911L88.446 314.678C83.09 312.2680000000001 79.339 307.178 79.339 301.017C79.339 300.482 79.607 299.9460000000001 79.607 299.41L26.303 207.267C19.071 205.928 13.713 199.767 13.713 192.267C13.713 185.035 18.802 178.874 25.767 177.267L80.946 81.909C80.41 80.302 80.142 78.963 80.142 77.088C80.142 69.8559999999999 85.231 63.6949999999999 92.196 62.356L143.893 -27.376C143.357 -28.983 142.822 -30.858 142.822 -32.733C142.822 -41.304 149.786 -48.001 158.09 -48.001C162.911 -48.001 166.929 -45.858 169.608 -42.6439999999999H276.483C279.161 -45.857 283.447 -48 288 -48S296.839 -45.857 299.5180000000001 -42.643H406.6610000000001C409.3390000000001 -45.589 413.3570000000001 -47.464 417.6430000000001 -47.464C426.2140000000001 -47.464 432.9110000000001 -40.5 432.9110000000001 -32.196C432.9110000000001 -30.589 432.6440000000001 -29.25 432.1080000000001 -27.911L483.8050000000001 62.357C490.7690000000001 63.696 495.859 69.857 495.859 77.0889999999999C495.859 78.696 495.5910000000001 80.3029999999999 495.0550000000001 81.91L549.9660000000001 177.268C556.9300000000002 178.607 562.2880000000001 184.768 562.2880000000001 192.268C562.2860000000002 199.5 557.1960000000001 205.661 550.5000000000001 207zM153.535 -2.732L109.875 73.071H153.535V-2.732zM153.535 81.107H109.875C109.607 82.178 109.071 83.249 108.536 84.321L153.535 131.731V81.107zM153.535 143.518L103.178 90.2139999999999C101.839 90.7499999999999 100.499 91.5539999999999 99.16 91.821L43.447 188.25C43.982 189.589 43.982 190.929 43.982 192.268S43.982 194.678 43.714 195.75L95.679 285.75C98.358 286.0180000000001 101.036 286.822 103.447 288.429L153.536 236.464V143.518zM153.535 245.84L107.732 293.25C109.071 295.393 109.875 298.071 109.875 301.017C109.875 301.285 109.607 301.821 109.607 302.089L153.535 317.893V245.84zM153.535 326.465L109.875 310.661L153.535 386.197V326.465zM480.054 287.357L480.8579999999999 286.018L445.5 118.875L381.75 186.107L479.786 287.625L480.054 287.357zM291.75 92.893L303.2680000000001 81.107H280.5L291.75 92.893zM291.4820000000001 104.143L208.179 189.589L287.7320000000001 273.964L370.7680000000001 186.375L291.4820000000001 104.1429999999999zM296.8390000000001 98.25L376.1250000000001 180.482L443.6250000000001 109.232L437.7330000000001 81.107H313.714L296.839 98.25zM410.411 403.607C411.4820000000001 403.0710000000001 412.553 402.535 413.8930000000001 402.267L471.75 301.553V301.017C471.75 298.0710000000001 472.553 295.3930000000001 473.893 293.25L376.393 192L293.358 279.589L410.411 403.607zM401.304 405.75L287.7320000000001 285.482L230.6780000000001 345.75L397.0170000000001 405.75H401.3040000000001zM277.821 405.75C280.499 403.072 283.981 401.4650000000001 288 401.4650000000001S295.5 403.072 298.1789999999999 405.75H373.1789999999999L224.786 352.179L173.893 405.75H277.8210000000001zM161.572 400.125L162.643 402.267A33.834 33.834 0 0 1 165.322 403.0710000000001L216.483 349.231L161.572 329.41V400.125zM161.572 320.839L222.375 342.803L282.107 279.589L202.554 195.482L161.572 237.535V320.839zM161.572 228.161L198 190.393L161.572 152.089V228.161zM161.572 140.303L203.625 184.767L286.393 98.785L269.25 81.107H161.572V140.303zM168.536 -21.75C166.929 -20.143 165.054 -19.072 162.643 -18.268L161.572 -16.6609999999999V73.071H261.482L169.875 -21.75H168.536zM298.447 -21.75C295.7680000000001 -19.34 292.019 -17.465 288 -17.465S280.233 -19.34 277.553 -21.75H181.124L272.731 73.071H311.035L402.642 -21.75H298.447zM418.447 -9.964L414.161 -17.464C412.822 -17.732 411.751 -18.267 410.679 -18.803L321.483 73.072H435.8589999999999L418.447 -9.964zM431.303 12.268L444.161 73.071H466.125L431.303 12.268zM466.125 81.107H445.7680000000001L450.3210000000001 102.2670000000001L467.4640000000001 84.0530000000001C466.929 83.2500000000001 466.393 82.179 466.1250000000001 81.107zM532.2860000000001 188.518L476.8390000000001 91.821C475.5000000000001 91.286 474.1600000000001 90.75 472.8210000000001 89.947L452.1960000000001 111.911L486.7500000000001 275.839L532.5530000000001 196.553C532.2860000000001 195.214 531.7500000000001 193.875 531.7500000000001 192.268C531.7500000000001 190.929 532.0180000000001 189.857 532.2860000000001 188.518z" />
217
- <glyph glyph-name="contao"
218
- unicode="&#xF26D;"
219
- horiz-adv-x="512" d=" M45.4 143C59.8 75.9 71.8 14 113.6 -32H34C15.3 -32 0 -16.8 0 2V382C0 400.7 15.2 416 34 416H91.7C77.9 403.4 65.6 388.8 54.8 372.4C9.4 302.4 27.8 225.6 45.4 143zM478 416H387.8C409.2 394.6 427 366.5 440.5 331.9L303.4 302.6C288.5 331.6 265.6 355.9 220.8 346.5C196.2 341.2 179.8 327.2 172.5 311.9C163.7 293.2000000000001 159.3 272.1 180.7 171.6C201.8 71.4 214.4 53.9 230.2 40.4C243.1 29.3 263.6 23.4 288.5 28.7C333 38.1 344.2 69.4 345.9 101.9L483.3 131.5000000000001C486.4999999999999 60.0000000000001 464.6 6.3000000000001 425.9 -32.0999999999999H478C496.7 -32.0999999999999 512 -16.8999999999999 512 1.9000000000001V382C512 400.8 496.8 416 478 416z" />
220
- <glyph glyph-name="cpanel"
221
- unicode="&#xF388;"
222
- horiz-adv-x="640" d=" M52.9 234.3H92.9L86.7 210.7C84.8 204.2 79.3 199.8 72.4 199.8H53.8C28.9 199.8 29.1 162.4 53.8 162.4H65.1C69.3 162.4 72.7 158.5000000000001 71.5 154.1L64.4 128H52C18.5 128 -7 159.4 1.7 193.2C9 220.2 30 234.3 52.9 234.3M73.1 128L108 258.1C109.8 264.5 115.2 269 122.3 269H159.3C183.4 269 204.7 252.6 210.3 227.8C216.9 198.7 195.8 162.5 158.6 162.5H126.6L133 186.3C134.8000000000001 192.5 140.3000000000001 197.1 147.3000000000001 197.1H157.6000000000001C170.0000000000001 197.1 178.4000000000001 208.8 175.9000000000001 219.7C173.8000000000001 228.9 166.0000000000001 234.5000000000001 157.6000000000001 234.5000000000001H137.8000000000001L112 138.8C110.1 132.6 104.6 128.1 97.8 128.1L73.1 128M293.7 197.4C294 198.4 295.6 202.7 291.6 202.7H234.1C224.4 202.7 217.5 211.6 219.9 221.2L223.4 234.6H301.3C320.1 234.6 334.6 217 329.8 197.8L315.8 146C313 135.4 303.6 128.2 292.4 128.2L234.9 128.4C192 128.4 196.4 192.2 235.6 192.2H284L280.5 179C278.6 172.8 273.1 168.2 266.3 168.2H244.7C239.4 168.2 239.4 160.3 244.7 160.3H279.6C284.2000000000001 160.3 284.7000000000001 164.2 285.1 165.6L293.7000000000001 197.4M396.8000000000001 234.3000000000001C431.2000000000001 234.3000000000001 456.1000000000001 202.0000000000001 447.1000000000001 168.9L438.3000000000001 135.8C437.1000000000001 130.9 432.6000000000001 128 428.0000000000001 128H408.9000000000001C404.4000000000001 128 401.3 132 402.5000000000001 136.3L413.1000000000001 176.3C416.4000000000001 187.9 407.5000000000001 199.7 395.0000000000001 199.7H375.2000000000001L358.0000000000001 135.7000000000001C356.8000000000001 130.9 352.4000000000001 127.9 347.6000000000001 127.9H328.7000000000001C324.5000000000001 127.9 321.1000000000001 131.8 322.3000000000002 136.2000000000001L348.5000000000001 234.2000000000001H396.8000000000002M498 196.4L490 166.4C489.1 163.1 491.5 159.7 495.1 159.7H568.4L562.6999999999999 138.7C560.8 132.5 555.3 128 548.4999999999999 128H481.7999999999999C461.7999999999999 128 448.4999999999999 147 453.4999999999999 164.7L464.2999999999999 204.7C469.0999999999999 222.3 484.9999999999999 234.3 502.8999999999999 234.3H550.1999999999999C569.1999999999999 234.3 583.4 216.6 578.4999999999999 197.5L575.2999999999998 185.5C572.3999999999999 174.5 562.5999999999998 167.9 552.0999999999998 167.9H498.6999999999998L502.1999999999998 180.9C503.7999999999998 187.1 509.3999999999998 191.7 516.3999999999999 191.7H538C540 191.7 541.3 192.7 541.9 194.7L542.6 197.3C543.3000000000001 200 541.3000000000001 202.4 538.7 202.4H505.8000000000001C501.7 202.4 498.9000000000001 200.3 498.0000000000001 196.4zM568.2 128L603.8000000000001 261.1C605.0000000000001 265.8 609.3000000000001 269 614.2 269H633.1C637.6 269 640.8000000000001 265 639.6 260.7L613.1 162.5C608 141.8 588.9 128 568.2 128" />
223
- <glyph glyph-name="creative-commons-by"
224
- unicode="&#xF4E7;"
225
- horiz-adv-x="496" d=" M314.9 253.6V152.2H286.6V31.7H209.5V152.1H181.2V253.6C181.2 258 182.8 261.8 185.8 264.9C188.9 268 192.7 269.6 197.1 269.6H299C303.1 269.6 306.8 268 310.1 264.9C313.2000000000001 261.7000000000001 314.9000000000001 258 314.9000000000001 253.6zM213.4 317.3C213.4 340.6 224.9 352.3 247.9 352.3S282.4 340.6 282.4 317.3C282.4 294.3 270.9 282.8 247.9 282.8S213.4 294.3 213.4 317.3zM247.6 440C389.4 440 496 329.9 496 192C496 44.9 377.5 -56 247.6 -56C113.6 -56 0 53.5 0 192C0 324.9 104.7 440 247.6 440zM248.4 395.3C130.2 395.3 44.7 297.4 44.7 192C44.7 82.2 135.9 -10.8 248.4 -10.8C351.6 -10.8 451.2 70.3 451.2 192C451.3 305.8 361 395.3 248.4 395.3z" />
226
- <glyph glyph-name="creative-commons-nc-eu"
227
- unicode="&#xF4E9;"
228
- horiz-adv-x="496" d=" M247.7 440C103.6 440 0 323.2 0 192C0 55.7 111.7 -56 247.7 -56C377.9 -56 496 44.9 496 192C496 331 388.4 440 247.7 440zM248.3 -10.7C136.3 -10.7 44.7 81.8 44.7 192C44.7 215.2 48.4 237.2 55.6 258L121.3 228.9H116.6V199.4H139.9C139.9 193.2 139.5 196.2 139.5 179.9H116.7V150.4H143.7C155.1 83.4 210.9 49.1 268.3 49.1C294.9 49.1 318.9 56.9999999999999 333.1 64.9L323.1 111C314.4 106.4 294.9 100.2 275.8 100.2C247.6 100.2 217.7 111.1 208.5 150.4H298.8L427.1 93.6C425.6 91.4999999999999 370.9 -10.7 248.3 -10.7zM231.6 179.9L231.1 180.3L232 179.9H231.6zM308.8 199.4H312.5V228.9H242.2L213.6 241.5C216.1 247 219 252 222.4 255.8C235.3 271.6 253.5 278.2 273.5 278.2C291.8 278.2 308.8 272.8 319.6 268.2L331.2000000000001 315.5C316.2000000000001 322.1 294.2000000000001 327.9 268.9000000000001 327.9C229.9000000000001 327.9 196.7000000000001 312.1 173 285.6C167.7 279.5 163.2 272.7000000000001 159.1 265.5L77.5 301.6C142.1 398.4000000000001 235.2 395.2000000000001 248.2 395.2000000000001C361.2000000000001 395.2000000000001 451.2 305 451.2 191.8C451.2 173.1 449.1 155.5 444.9000000000001 138.9L308.8000000000001 199.4z" />
229
- <glyph glyph-name="creative-commons-nc-jp"
230
- unicode="&#xF4EA;"
231
- horiz-adv-x="496" d=" M247.7 440C103.6 440 0 323.2 0 192C0 55.6 111.8 -56 247.7 -56C377.9 -56 496 44.8 496 192C496 330.8 388.5 440 247.7 440zM248.3 -10.7C136.3 -10.7 44.7 81.8 44.7 192C44.7 213.1 47.7 233.2 53.7 252.3L180.7 195.8H152.8V157.2H210.9L216.6 145.4V126.7H152.8V88H216.6V32H278.3V88H342.5V123.7L423.5 87.6C422 85.4 366.3999999999999 -10.7 248.3 -10.7zM335.9 126.6H278.3V145.3L281.2 150.9L335.8999999999999 126.6zM342.4 178V195.8H303.8L366.8 311.8H301L257.6 215.8L234.6 226L195 311.7H129.2000000000001L156.5000000000001 260.7L74.6000000000001 297.2C102.4000000000001 341.3 157.2000000000001 395.3 248.3000000000001 395.3C361.1 395.3 451.3000000000001 305.3 451.3000000000001 191.9C451.3000000000001 170.9 448.6000000000001 151.3 443.4000000000001 132.9L342.4000000000001 178z" />
232
- <glyph glyph-name="creative-commons-nc"
233
- unicode="&#xF4E8;"
234
- horiz-adv-x="496" d=" M247.6 440C387.4 440 496 332.1 496 192C496 44.8 377.5 -56 247.6 -56C113.1 -56 0 54.8 0 192C0 324.9 104.7 440 247.6 440zM55.8 258.9C48.4 238.5 44.7 216.2 44.7 192C44.7 81.1 136.8 -10.4 248.4 -10.4C370.8 -10.4 425.6 91.4 426.9 93.7000000000001L333.5 135.3000000000001C325.8 98.2000000000001 292.3 82.3000000000001 265.3 79.9000000000001V41.8000000000001H236.5V80C209 80.3 183.9 90.2 161.2 109.7L195.3 144.2C227 114.8 281.7 112.4 281.7 146.4C281.7 152.6 279.5 157.6 275.1 161.5C260.9 167.5 273.3 161.6 55.8 258.9zM248.4 395.7C210 395.7 136 387 77.9 302.7L172.7 260.2C182.7 291.5 213.1 303.1 236.5 304.5V342.6H265.3V304.5C288 303.3 308.7 295.6 327.3 281.5L295 248.3C252.3 278.2000000000001 211.5 256.3 225 237.2C278.4 213.1 268.8 217.4 318 195.6L445.1 138.9C449.2000000000001 156.3 451.3 174.0000000000001 451.3 192C451.3 249.0000000000001 431.5 297 392 335.9000000000001C352.7 375.8000000000001 304.8 395.7000000000001 248.4 395.7000000000001z" />
235
- <glyph glyph-name="creative-commons-nd"
236
- unicode="&#xF4EB;"
237
- horiz-adv-x="496" d=" M247.6 440C389.4 440 496 329.9 496 192C496 44.9 377.5 -56 247.6 -56C113.6 -56 0 53.5 0 192C0 324.9 104.7 440 247.6 440zM248.4 395.3C130.2 395.3 44.7 297.4 44.7 192C44.7 82.2 135.9 -10.8 248.4 -10.8C351.6 -10.8 451.2 70.3 451.2 192C451.3 305.8 361 395.3 248.4 395.3zM342.4 251V208.5H162.1V251H342.4zM342.4 171.2V128.7H162.1V171.2H342.4z" />
238
- <glyph glyph-name="creative-commons-pd-alt"
239
- unicode="&#xF4ED;"
240
- horiz-adv-x="496" d=" M247.6 440C389.4 440 496 329.9 496 192C496 44.9 377.5 -56 247.6 -56C113.6 -56 0 53.5 0 192C0 324.9 104.7 440 247.6 440zM248.4 395.3C130.2 395.3 44.7 297.4 44.7 192C44.7 82.2 135.9 -10.8 248.4 -10.8C351.6 -10.8 451.2 70.3 451.2 192C451.3 305.8 361 395.3 248.4 395.3zM135.5 124.7V262H203.7C237.4 262 254.2 246.5 254.2 215.5C254.2 206.5 251.2 169 197.1 169H170.1V124.7H135.5zM169.6 236.3V194.7H198.8C226.7 194.7 228.8 236.3 197.9 236.3H169.6zM263.5 124.7V262H316.7C338.1 262 386.7 256.8 386.7 193.4C386.7 129.9 338.1 124.8 316.7 124.8H263.5zM297.6 233.2V153.5H317.5C341.5 153.5 352 168.8 352 193.4C352 235.4 320.8 233.3 317 233.3L297.6 233.2z" />
241
- <glyph glyph-name="creative-commons-pd"
242
- unicode="&#xF4EC;"
243
- horiz-adv-x="496" d=" M248 440C111 440 0 328.9 0 192C0 55 111 -56 248 -56S496 55 496 192C496 328.9 385 440 248 440zM248 -9.5C108.8 -9.5 12.2 128.5 57.8 258.4L136.6 223.3C134.5 212.8 133.3 201.8 133.3 190.4C133.3 91.4 207.2 63.5 253.7 63.5C276.6 63.5 307.2000000000001 70.2 333.1 93L297 136.9C291.5 130.6 279.4 120.2 260.7 120.2C222.9 120.2 207 160.1 206.8 192.1C437.2 89.5 423.3 95.6 424.7 95.3C390.4 32.9 324.1 -9.5 248 -9.5zM442.2 140.5L218.2 240.5C237 274.5 273.1 271.2 292.9 251.5L333.3 293.1C306.2 316.4 275.3 320.6 255.2 320.6C207.8 320.6 174.3 300.1 154.5 269L79.5999999999999 302.4C115.6999999999999 357.3 177.6999999999999 393.6 248.1 393.6C359.2 393.6 449.5999999999999 303.2 449.5999999999999 192.1C449.5999999999999 174.1 447.2 156.7000000000001 442.7999999999999 140.1C442.4999999999999 140.2000000000001 442.3999999999999 140.3 442.1999999999999 140.5z" />
244
- <glyph glyph-name="creative-commons-remix"
245
- unicode="&#xF4EE;"
246
- horiz-adv-x="496" d=" M247.6 440C389.4 440 496 329.9 496 192C496 44.9 377.5 -56 247.6 -56C113.6 -56 0 53.5 0 192C0 324.9 104.7 440 247.6 440zM248.4 395.3C130.2 395.3 44.7 297.4 44.7 192C44.7 82.2 135.9 -10.8 248.4 -10.8C351.6 -10.8 451.2 70.3 451.2 192C451.3 305.8 361 395.3 248.4 395.3zM410.1 187.6L415 185.4V115.4C407.8 111.8 351.6 87.9 347.7 86.6C341.2 88.4 234 133.4 210.4 142.8L146.2 116.2L82.9 143.7V207.5L142.2 232.3C141.5 233 141.8 227.3 141.8 302.7000000000001L209.1 332.4000000000001L361 269.5V207.9L410.1 187.6zM339.7000000000001 106.1V149.9H339.3000000000001V151.7000000000001L225.5000000000001 198.2000000000001V153L339.3000000000001 106.1V106.5L339.7000000000001 106.1zM347.2000000000001 163.7000000000001L387.1 180.1L350.3 195.6L311.3 179.2000000000001L347.2 163.7000000000001zM399.5000000000001 125.6V168.6L355.2 150V106.6L399.5 125.6z" />
247
- <glyph glyph-name="creative-commons-sa"
248
- unicode="&#xF4EF;"
249
- horiz-adv-x="496" d=" M247.6 440C389.4 440 496 329.9 496 192C496 44.9 377.5 -56 247.6 -56C113.6 -56 0 53.5 0 192C0 324.9 104.7 440 247.6 440zM248.4 395.3C130.2 395.3 44.7 297.4 44.7 192C44.7 82.2 135.9 -10.8 248.4 -10.8C351.6 -10.8 451.2 70.3 451.2 192C451.3 305.8 361 395.3 248.4 395.3zM137.7 227C150.7 310.9 218.2 322.7 246.6 322.7C346.4 322.7 374.1 240.2 374.1 188.5C374.1 124.9 333.1 55.6 245.2 55.6C206.3 55.6 146.1 75.6 135.8 152.6H198.3C199.8 122.5 217.9 107.4 252.8 107.4C276.1 107.4 310.8 125.6 310.8 190.2000000000001C310.8 272.7000000000001 261.7 270.8000000000001 254.1 270.8000000000001C221 270.8000000000001 202.4 256.2000000000001 198.3 227.0000000000001H216.5L167.3 177.8000000000001L118.3 227.0000000000001H137.7z" />
250
- <glyph glyph-name="creative-commons-sampling-plus"
251
- unicode="&#xF4F1;"
252
- horiz-adv-x="496" d=" M247.6 440C389.4 440 496 329.9 496 192C496 44.9 377.5 -56 247.6 -56C113.6 -56 0 53.5 0 192C0 324.9 104.7 440 247.6 440zM248.4 395.3C130.2 395.3 44.7 297.4 44.7 192C44.7 82.2 135.9 -10.8 248.4 -10.8C351.6 -10.8 451.2 70.3 451.2 192C451.3 305.8 361 395.3 248.4 395.3zM355.4 189.7C350.7 189.7 346.4 186.9 344.7 182.5L340.7 173L329.7 265.8C328 279.7000000000001 307.7 279.2000000000001 306.6 265.4L302.3 214L297.1 282.8C296 297.1 275 297 273.9 282.8L270.4 237.9L264.5 332.2C263.6 346.7 242.2 346.6 241.3 332.2L236.2 248.5L231.9 314.8C231 329.2000000000001 209.7 329.2000000000001 208.7 314.8L203.4 234.6L199.3 291.6C198.2 305.9000000000001 177.3 305.9000000000001 176.1 291.8L168.4 202L166.6 214.2C164.9 225.6 149.5 227.8 144.6 217.5L131.4 189.8H87.5V166.6H138.8C143.2 166.6 147.2 169.1 149.2 173L159.9 99.9C161.9 86.4 181.8 86.9 183 100.6L186.8 144.2L192.5 65.9C193.6 51.5 214.8 51.7 215.7 66L220.3 136.4L225.1 63.1C226 48.7 247.4 48.7 248.3 63.2L253.2 143.7L257.7 71.9C258.6 57.6 279.8 57.4 280.9 71.7L285.5 130.3L290.4 65.9C291.5 51.6 312.4 51.7 313.5 65.8L320.3 148.8L323 126.5C324.4 114.6999999999999 340.7 112.3999999999999 345.3 123.3999999999999L363.3 166.7999999999999H413.8V190L355.4000000000001 189.7zM277.4 184.5H255.5V162.6C255.5 158.5 252.2 155.1 248 155.1C243.9 155.1 240.5 158.4 240.5 162.6V184.5H218.6C214.5 184.5 211.1 187.8 211.1 192C211.1 196.1 214.5 199.5 218.6 199.5H240.5V221.4C240.5 225.5 243.9 228.9 248 228.9S255.5 225.6 255.5 221.4V199.5H277.4C281.5 199.5 284.9 196.2 284.9 192C284.9 187.9 281.5 184.5 277.4 184.5z" />
253
- <glyph glyph-name="creative-commons-sampling"
254
- unicode="&#xF4F0;"
255
- horiz-adv-x="496" d=" M247.6 440C389.4 440 496 329.9 496 192C496 44.9 377.5 -56 247.6 -56C113.6 -56 0 53.5 0 192C0 324.9 104.7 440 247.6 440zM248.4 395.3C130.2 395.3 44.7 297.4 44.7 192C44.7 82.2 135.9 -10.8 248.4 -10.8C351.6 -10.8 451.2 70.3 451.2 192C451.3 305.8 361 395.3 248.4 395.3zM252 342.1C254.8 342.4 263.5 341.1 263.5 330.6L270.1 223.4L275 282.7C275 288.7 279.7 293.3 285.6 293.3C291.5 293.3 296.2000000000001 288.6 296.2000000000001 282.7C296.2000000000001 280.2 295.7000000000001 288.4 301.9000000000001 201.2L307.7000000000001 265.4C308.0000000000001 268.3 310.6 274.7 317.9000000000001 274.7C321.7000000000001 274.7 327.8 272.4 328.5000000000001 265.8L340.0000000000001 169.3L345.3000000000001 182.1C347.1000000000001 186.5 350.5000000000001 188.7 355.5000000000001 188.7H413.5000000000001V167.4H362.6000000000001L344.4000000000001 123.1C340.5000000000001 113.2 324.9000000000001 114 323.6000000000001 126.2L319.6000000000001 158.1L312.1000000000001 65.5C311.8000000000001 62.5 309.1000000000001 56.2 301.9000000000001 56.2C298.9000000000001 56.2 292.1000000000001 58.3 291.3000000000001 65.5C291.3000000000001 67.4 291.9000000000001 59.7 285.1000000000001 143.4L279.8000000000001 71.2C278.7000000000001 66.4 275.0000000000001 61.9 269.2000000000001 61.9C266.3000000000001 61.9 259.4000000000001 63.9 258.6 71.2C258.6 73.1 259.1 64.5 252.8 158.9L247 64.1C247 57.8 243.4 51.7 236.4 51.7C231.2 51.7 225.8 55.8 225.8 63.7L220 151.4C214.2 58.9 214.7 67.4 214.7 65.5C213.6 60.7 209.9 56.2 204.1 56.2C201.1 56.2 194.3 58.3 193.5 65.5C193.5 66.2 193.1 66.6 193.1 68.1L186.9 156.7000000000001L182 100C181.3 93.5 175.3 90.7 171.4 90.7C165.6 90.7 161.8 94.8 160.8 99.6L149.7 176C147.7 172 146.2 167.6 138.6 167.6H87.2V188.9H132L145.7 216.8000000000001C150.1 226.7000000000001 163.9 224 165.6 214.1000000000001L168.7 193.7000000000001L177.1 291.6C177.1 297.6 181.9 302.2000000000001 187.7 302.2000000000001C188.2 302.2000000000001 198.3 302.4000000000001 198.3 289.8000000000001L203.2 220.7000000000001L209.8 313.3000000000001C209.8 323.4000000000001 219.3 323.9000000000001 220 323.9000000000001C220.6 323.9000000000001 230.6 323.2000000000001 230.6 313.3000000000001L235.9 232.7000000000001L242.1 330.6C242.2 331.7000000000001 241.5 340.9000000000001 252 342.1z" />
256
- <glyph glyph-name="creative-commons-share"
257
- unicode="&#xF4F2;"
258
- horiz-adv-x="496" d=" M247.6 440C389.4 440 496 329.9 496 192C496 44.9 377.5 -56 247.6 -56C113.6 -56 0 53.5 0 192C0 324.9 104.7 440 247.6 440zM248.4 395.3C130.2 395.3 44.7 297.4 44.7 192C44.7 82.2 135.9 -10.8 248.4 -10.8C351.6 -10.8 451.2 70.3 451.2 192C451.3 305.8 361 395.3 248.4 395.3zM349.4 262.9C357.2 262.9 363.1 256.8 363.1 249.2V66.7C363.1 59 357 53 349.4 53H214.3C206.6 53 200.6 59 200.6 66.7V120.7H146.6C138.8 120.7 132.9 126.7 132.9 134.4V316.9C132.9 325.1 139.5 329.6 145.3000000000001 330.6H281.7000000000001C289.4000000000001 330.6 295.4000000000001 324.6 295.4000000000001 316.9V262.9H349.4000000000001zM159.9 147.7H200.6V249.1C200.6 256.5 206.4 261.7 212.6 262.8H268.4000000000001V303.1H159.9V147.6999999999999zM336.1 235.8H227.6V80.4H336.1V235.8z" />
259
- <glyph glyph-name="creative-commons-zero"
260
- unicode="&#xF4F3;"
261
- horiz-adv-x="496" d=" M247.6 440C389.4 440 496 329.9 496 192C496 44.9 377.5 -56 247.6 -56C113.6 -56 0 53.5 0 192C0 324.9 104.7 440 247.6 440zM248.4 395.3C130.2 395.3 44.7 297.4 44.7 192C44.7 82.2 135.9 -10.8 248.4 -10.8C351.6 -10.8 451.2 70.3 451.2 192C451.3 305.8 361 395.3 248.4 395.3zM248 334.8C166.1 334.8 145.5 257.5 145.5 192C145.5 126.5 166.1 49.2 248 49.2S350.5 126.5 350.5 192C350.5 257.5 329.9 334.8 248 334.8zM248 280.9C251.3 280.9 254.4 280.4 257.2 279.7000000000001C263.1 274.6 266 267.6 260.3 257.8L205.8 157.6C204.1 170.3 203.9 182.7000000000001 203.9 192C203.9 220.8000000000001 205.9 280.9000000000001 248 280.9000000000001zM288.8 234.7C291.7 219.3 292.1 203.3 292.1 192C292.1 163.1 290.1 103.1 248.0000000000001 103.1C234.5000000000001 103.1 215.4 110.8 227.9000000000001 129.5L288.8 234.7z" />
262
- <glyph glyph-name="creative-commons"
263
- unicode="&#xF25E;"
264
- horiz-adv-x="496" d=" M245.83 233.13L212.61 215.85C203.18 235.43 187.37 235.78 185.15 235.78C163.02 235.78 151.93 221.17 151.93 191.94C151.93 168.37 161.14 148.1 185.15 148.1C199.62 148.1 209.8 155.19 215.72 169.36L246.27 153.86C240.1 142.35 220.58 114.88 181.17 114.88C158.57 114.88 107.21 125.2 107.21 191.93C107.21 250.62 150.21 268.99 179.84 268.99C210.56 269 232.54 257.04 245.8300000000001 233.13zM388.88 233.13L356.1 215.85C346.6 235.62 330.38 235.78 328.2000000000001 235.78C306.0600000000001 235.78 294.98 221.17 294.98 191.94C294.98 168.39 304.2100000000001 148.1 328.2000000000001 148.1C342.6500000000001 148.1 352.85 155.19 358.7400000000001 169.36L389.7400000000001 153.86C387.6400000000001 150.11 368.3500000000001 114.88 324.6500000000001 114.88C301.9600000000001 114.88 250.6900000000001 124.75 250.6900000000001 191.93C250.6900000000001 250.6 293.6600000000001 268.99 323.3200000000001 268.99C354.0300000000001 26
1
+ <?xml version="1.0" standalone="no"?>
2
  <!--
3
+ Font Awesome Free 5.7.1 by @fontawesome - https://fontawesome.com
4
  License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
5
  -->
6
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
7
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
8
+ <metadata>
9
+ Created by FontForge 20190112 at Fri Feb 1 12:28:28 2019
10
+ By Robert Madole
11
+ Copyright (c) Font Awesome
12
+ </metadata>
13
  <defs>