Completed
Push — master ( 7388a0...c197b7 )
by
unknown
45s
created
redux-core/inc/classes/class-redux-enqueue.php 2 patches
Indentation   +730 added lines, -730 removed lines patch added patch discarded remove patch
@@ -12,737 +12,737 @@
 block discarded – undo
12 12
 
13 13
 if ( ! class_exists( 'Redux_Enqueue', false ) ) {
14 14
 
15
-	/**
16
-	 * Class Redux_Enqueue
17
-	 */
18
-	class Redux_Enqueue extends Redux_Class {
19
-
20
-		/**
21
-		 * Data to localize.
22
-		 *
23
-		 * @var array
24
-		 */
25
-		public array $localize_data = array();
26
-
27
-		/**
28
-		 * Min string for .min files.
29
-		 *
30
-		 * @var string
31
-		 */
32
-		private string $min = '';
33
-
34
-		/**
35
-		 * Timestamp for file versions.
36
-		 *
37
-		 * @var string
38
-		 */
39
-		private string $timestamp = '';
40
-
41
-		/**
42
-		 * Localize data required for the repeater extension.
43
-		 *
44
-		 * @var array
45
-		 */
46
-		private array $repeater_data = array();
47
-
48
-		/**
49
-		 * Redux_Enqueue constructor.
50
-		 *
51
-		 * @param     object $redux ReduxFramework pointer.
52
-		 */
53
-		public function __construct( $redux ) {
54
-			parent::__construct( $redux );
55
-
56
-			// Enqueue the admin page CSS and JS.
57
-			if ( isset( $_GET['page'] ) && $_GET['page'] === $redux->args['page_slug'] ) { // phpcs:ignore WordPress.Security.NonceVerification
58
-				add_action( 'admin_enqueue_scripts', array( $this, 'init' ), 1 );
59
-			}
60
-
61
-			add_action( 'wp_enqueue_scripts', array( $this, 'frontend_init' ), 10 );
62
-
63
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
64
-			do_action( "redux/{$redux->args['opt_name']}/enqueue/construct", $this );
65
-
66
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
67
-			do_action( 'redux/enqueue/construct', $this );
68
-
69
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
70
-			do_action( 'redux/search/' . $redux->args['opt_name'] . '/construct' );
71
-
72
-			//if ( isset( $_GET['page'] ) && sanitize_text_field( wp_unslash( $_GET['page'] === $this->parent->args['page_slug'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
73
-			//	add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ), 0 );
74
-			//}
75
-
76
-			//add_action( "redux/metaboxes/{$this->parent->args[ 'opt_name' ]}/enqueue", array( $this, 'enqueue' ), 10 );
77
-		}
78
-
79
-		/**
80
-		 * Scripts to enqueue on the frontend
81
-		 */
82
-		public function frontend_init() {
83
-			$core = $this->core();
84
-
85
-			if ( $core->args['elusive_frontend'] ) {
86
-				Redux_Functions_Ex::enqueue_elusive_font();
87
-			}
88
-
89
-			if ( $core->args['fontawesome_frontend'] ) {
90
-				Redux_Functions_Ex::enqueue_font_awesome();
91
-			}
92
-		}
93
-
94
-		/**
95
-		 * Class init functions.
96
-		 */
97
-		public function init() {
98
-			$core = $this->core();
99
-
100
-			Redux_Functions::$parent = $core;
101
-
102
-			$this->min = Redux_Functions::is_min();
103
-
104
-			$this->timestamp = Redux_Core::$version;
105
-			if ( $core->args['dev_mode'] ) {
106
-				$this->timestamp .= '.' . time();
107
-			}
108
-
109
-			$this->register_styles( $core );
110
-			$this->register_scripts();
111
-
112
-			add_thickbox();
113
-
114
-			$this->enqueue_fields( $core );
115
-
116
-			add_filter( "redux/{$core->args['opt_name']}/localize", array( 'Redux_Helpers', 'localize' ) );
117
-
118
-			$this->set_localized_data( $core );
119
-
120
-			/**
121
-			 * Action 'redux/page/{opt_name}/enqueue'
122
-			 */
123
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
124
-			do_action( "redux/page/{$core->args['opt_name']}/enqueue" );
125
-		}
126
-
127
-		/**
128
-		 * Register all core framework styles.
129
-		 *
130
-		 * @param ReduxFramework $core ReduxFramework object.
131
-		 */
132
-		private function register_styles( ReduxFramework $core ) {
133
-
134
-			/**
135
-			 * Redux Admin CSS
136
-			 */
137
-			if ( 'wordpress' === $core->args['admin_theme'] || 'wp' === $core->args['admin_theme'] ) { // phpcs:ignore WordPress.WP.CapitalPDangit
138
-				$color_scheme = get_user_option( 'admin_color' );
139
-			} elseif ( 'classic' === $core->args['admin_theme'] || '' === $core->args['admin_theme'] ) {
140
-				$color_scheme = 'classic';
141
-			} else {
142
-				$color_scheme = $core->args['admin_theme'];
143
-			}
144
-
145
-			if ( ! file_exists( Redux_Core::$dir . "assets/css/colors/$color_scheme/colors$this->min.css" ) ) {
146
-				$color_scheme = 'fresh';
147
-			}
148
-
149
-			$css = Redux_Core::$url . "assets/css/colors/$color_scheme/colors$this->min.css";
150
-
151
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
152
-			$css = apply_filters( 'redux/enqueue/' . $core->args['opt_name'] . '/args/admin_theme/css_url', $css );
153
-
154
-			wp_register_style(
155
-				'redux-admin-theme',
156
-				$css,
157
-				array(),
158
-				$this->timestamp
159
-			);
160
-
161
-			wp_enqueue_style(
162
-				'redux-admin-css',
163
-				Redux_Core::$url . "assets/css/redux-admin$this->min.css",
164
-				array( 'redux-admin-theme' ),
165
-				$this->timestamp
166
-			);
167
-
168
-			/**
169
-			 * Redux Fields CSS
170
-			 */
171
-			if ( ! $core->args['dev_mode'] ) {
172
-				wp_enqueue_style(
173
-					'redux-fields',
174
-					Redux_Core::$url . 'assets/css/redux-fields.min.css',
175
-					array(),
176
-					$this->timestamp
177
-				);
178
-			}
179
-
180
-			/**
181
-			 * Select2 CSS
182
-			 */
183
-			wp_enqueue_style(
184
-				'select2-css',
185
-				Redux_Core::$url . 'assets/css/vendor/select2.min.css',
186
-				array(),
187
-				'4.1.0'
188
-			);
189
-
190
-			/**
191
-			 * Spectrum CSS
192
-			 */
193
-			wp_register_style(
194
-				'redux-spectrum-css',
195
-				Redux_Core::$url . "assets/css/vendor/spectrum$this->min.css",
196
-				array(),
197
-				'1.3.3'
198
-			);
199
-
200
-			/**
201
-			 * Elusive Icon CSS
202
-			 */
203
-			Redux_Functions_Ex::enqueue_elusive_font();
204
-
205
-			/**
206
-			 * Font Awesome for Social Profiles and Icon Select
207
-			 */
208
-			Redux_Functions_Ex::enqueue_font_awesome();
209
-
210
-			/**
211
-			 * QTip CSS
212
-			 */
213
-			wp_enqueue_style(
214
-				'qtip',
215
-				Redux_Core::$url . "assets/css/vendor/qtip$this->min.css",
216
-				array(),
217
-				'3.0.3'
218
-			);
219
-
220
-			/**
221
-			 * JQuery UI CSS
222
-			 */
223
-			wp_enqueue_style(
224
-				'jquery-ui',
225
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
226
-				apply_filters(
227
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
228
-					"redux/page/{$core->args['opt_name']}/enqueue/jquery-ui-css",
229
-					Redux_Core::$url . 'assets/css/vendor/jquery-ui-1.10.0.custom.css'
230
-				),
231
-				array(),
232
-				$this->timestamp
233
-			);
234
-
235
-			/**
236
-			 * Iris CSS
237
-			 */
238
-			wp_enqueue_style( 'wp-color-picker' );
239
-
240
-			if ( $core->args['dev_mode'] ) {
241
-
242
-				/**
243
-				 * Media CSS
244
-				 */
245
-				wp_enqueue_style(
246
-					'redux-field-media',
247
-					Redux_Core::$url . 'assets/css/media.css',
248
-					array(),
249
-					$this->timestamp
250
-				);
251
-			}
252
-
253
-			/**
254
-			 * RTL CSS
255
-			 */
256
-			if ( is_rtl() ) {
257
-				wp_enqueue_style(
258
-					'redux-rtl',
259
-					Redux_Core::$url . 'assets/css/rtl.css',
260
-					array(),
261
-					$this->timestamp
262
-				);
263
-			}
264
-		}
265
-
266
-		/**
267
-		 * Register all core framework scripts.
268
-		 */
269
-		private function register_scripts() {
270
-			// *****************************************************************
271
-			// JQuery / JQuery UI JS
272
-			// *****************************************************************
273
-			wp_enqueue_script( 'jquery' );
274
-			wp_enqueue_script( 'jquery-ui-core' );
275
-			wp_enqueue_script( 'jquery-ui-dialog' );
276
-
277
-			/**
278
-			 * Select2 Sortable JS
279
-			 */
280
-			wp_register_script(
281
-				'redux-select2-sortable',
282
-				Redux_Core::$url . 'assets/js/vendor/select2-sortable/redux.select2.sortable' . $this->min . '.js',
283
-				array( 'jquery', 'jquery-ui-sortable' ),
284
-				$this->timestamp,
285
-				true
286
-			);
287
-
288
-			/**
289
-			 * Select2
290
-			 */
291
-			wp_enqueue_script(
292
-				'select2-js',
293
-				Redux_Core::$url . 'assets/js/vendor/select2/select2' . $this->min . '.js`',
294
-				array( 'jquery', 'redux-select2-sortable' ),
295
-				'4.1.0',
296
-				true
297
-			);
298
-
299
-			/**
300
-			 * QTip JS
301
-			 */
302
-			wp_enqueue_script(
303
-				'qtip',
304
-				Redux_Core::$url . 'assets/js/vendor/qtip/qtip' . $this->min . '.js',
305
-				array( 'jquery' ),
306
-				'3.0.3',
307
-				true
308
-			);
309
-
310
-			/**
311
-			 * Iris alpha color picker
312
-			 */
313
-			if ( ! wp_script_is( 'redux-wp-color-picker-alpha' ) ) {
314
-				wp_enqueue_style( 'wp-color-picker' );
315
-
316
-				wp_register_script(
317
-					'redux-wp-color-picker-alpha',
318
-					Redux_Core::$url . 'assets/js/vendor/wp-color-picker-alpha/wp-color-picker-alpha' . $this->min . '.js',
319
-					array( 'jquery', 'wp-color-picker' ),
320
-					'3.0.0',
321
-					true
322
-				);
323
-			}
324
-
325
-			/**
326
-			 * Block UI (used by Custom Fonts and Color Schemes).
327
-			 */
328
-			wp_register_script(
329
-				'redux-block-ui',
330
-				Redux_Core::$url . 'assets/js/vendor/block-ui/jquery.blockUI' . $this->min . '.js',
331
-				array( 'jquery' ),
332
-				'2.70.0',
333
-				true
334
-			);
335
-
336
-			/**
337
-			 * Spectrum JS
338
-			 */
339
-			wp_register_script(
340
-				'redux-spectrum-js',
341
-				Redux_Core::$url . 'assets/js/vendor/spectrum/redux-spectrum' . $this->min . '.js',
342
-				array( 'jquery' ),
343
-				'1.3.3',
344
-				true
345
-			);
346
-
347
-			/**
348
-			 * Vendor JS
349
-			 */
350
-			wp_register_script(
351
-				'redux-vendor',
352
-				Redux_Core::$url . 'assets/js/redux-vendors' . $this->min . '.js',
353
-				array( 'jquery' ),
354
-				$this->timestamp,
355
-				true
356
-			);
357
-
358
-			/**
359
-			 * Redux JS
360
-			 */
361
-			wp_register_script(
362
-				'redux-js',
363
-				Redux_Core::$url . 'assets/js/redux' . $this->min . '.js',
364
-				array( 'jquery', 'redux-vendor' ),
365
-				$this->timestamp,
366
-				true
367
-			);
368
-		}
369
-
370
-		/**
371
-		 * Enqueue fields that are in use.
372
-		 *
373
-		 * @param ReduxFramework $core  ReduxFramework object.
374
-		 * @param array          $field Field array.
375
-		 */
376
-		public function enqueue_field( ReduxFramework $core, array $field ) {
377
-			if ( isset( $field['type'] ) && 'callback' !== $field['type'] ) {
378
-				$field_type = str_replace( '_', '-', $field['type'] );
379
-				$core_path  = Redux_Core::$dir . "inc/fields/{$field['type']}/class-redux-$field_type.php";
380
-
381
-				// Shim for v3 extension class names.
382
-				if ( ! file_exists( $core_path ) ) {
383
-					$core_path = Redux_Core::$dir . "inc/fields/{$field['type']}/field_{$field['type']}.php";
384
-				}
385
-
386
-				$filter_path = $core_path;
387
-
388
-				/**
389
-				 * Field class file
390
-				 * filter 'redux/{opt_name}/field/class/{field.type}'
391
-				 *
392
-				 * @param     string    $filter_path Field class file path
393
-				 * @param     array     $field       Field config data
394
-				 */
395
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
396
-				$class_file = apply_filters(
397
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
398
-					"redux/{$core->args['opt_name']}/field/class/{$field['type']}",
399
-					$filter_path,
400
-					$field
401
-				);
402
-
403
-				$field_classes = array( 'Redux_' . $field['type'], 'ReduxFramework_' . $field['type'] );
404
-
405
-				if ( $class_file ) {
406
-					$field_class = Redux_Functions::class_exists_ex( $field_classes );
407
-					if ( false === $field_class ) {
408
-						if ( file_exists( $class_file ) ) {
409
-							require_once $class_file;
410
-
411
-							$field_class = Redux_Functions::class_exists_ex( $field_classes );
412
-						} else {
413
-							return;
414
-						}
415
-					}
416
-
417
-					if ( false !== $field_class && ( ( method_exists( $field_class, 'enqueue' ) ) || method_exists( $field_class, 'localize' ) ) ) {
418
-						if ( ! isset( $core->options[ $field['id'] ] ) ) {
419
-							$core->options[ $field['id'] ] = '';
420
-						}
421
-
422
-						$the_field = new $field_class( $field, $core->options[ $field['id'] ], $core );
423
-
424
-						// Move dev_mode check to a new if/then block.
425
-						if ( ! wp_script_is( 'redux-field-' . $field_type ) && ( class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) ) {
426
-							$the_field->enqueue();
427
-						}
428
-
429
-						if ( class_exists( $field_class ) && method_exists( $field_class, 'always_enqueue' ) ) {
430
-							$the_field->always_enqueue();
431
-						}
432
-
433
-						if ( method_exists( $field_class, 'localize' ) ) {
434
-							$the_field->localize( $field );
435
-
436
-							if ( ! isset( $this->localize_data[ $field['type'] ] ) ) {
437
-								$this->localize_data[ $field['type'] ] = array();
438
-							}
439
-
440
-							$localize_data = $the_field->localize( $field );
441
-
442
-							$shims = array( 'repeater' );
443
-
444
-							// phpcs:ignore WordPress.NamingConventions.ValidHookName
445
-							$shims = apply_filters( 'redux/' . $core->args['opt_name'] . '/localize/shims', $shims );
446
-
447
-							if ( is_array( $shims ) && in_array( $field['type'], $shims, true ) ) {
448
-								$this->repeater_data[ $field['type'] ][ $field['id'] ] = $localize_data;
449
-							}
450
-
451
-							$this->localize_data[ $field['type'] ][ $field['id'] ] = $localize_data;
452
-						}
453
-
454
-						unset( $the_field );
455
-					}
456
-				}
457
-			}
458
-		}
459
-
460
-		/**
461
-		 * Enqueue field files.
462
-		 *
463
-		 * @param ReduxFramework $core ReduxFramework object.
464
-		 */
465
-		private function enqueue_fields( ReduxFramework $core ) {
466
-			foreach ( $core->sections as $section ) {
467
-				if ( isset( $section['fields'] ) ) {
468
-					foreach ( $section['fields'] as $field ) {
469
-						$this->enqueue_field( $core, $field );
470
-					}
471
-				}
472
-			}
473
-		}
474
-
475
-		/**
476
-		 * Build a localized array from field functions, if any.
477
-		 *
478
-		 * @param ReduxFramework $core ReduxFramework object.
479
-		 * @param string         $type Field type.
480
-		 */
481
-		private function build_local_array( ReduxFramework $core, string $type ) {
482
-			if ( isset( $core->transients['last_save_mode'] ) && ! empty( $core->transients['notices'][ $type ] ) ) {
483
-				$the_total = 0;
484
-				$messages  = array();
485
-
486
-				foreach ( $core->transients['notices'][ $type ] as $msg ) {
487
-					if ( is_array( $msg ) && ! empty( $msg ) ) {
488
-						$messages[ $msg['section_id'] ][ $type ][] = $msg;
489
-
490
-						if ( ! isset( $messages[ $msg['section_id'] ]['total'] ) ) {
491
-							$messages[ $msg['section_id'] ]['total'] = 0;
492
-						}
493
-
494
-						++$messages[ $msg['section_id'] ]['total'];
495
-						++$the_total;
496
-					}
497
-				}
498
-
499
-				$this->localize_data[ $type ] = array(
500
-					'total' => $the_total,
501
-					"$type" => $messages,
502
-				);
503
-
504
-				unset( $core->transients['notices'][ $type ] );
505
-			}
506
-		}
507
-
508
-		/**
509
-		 * Compile panel errors and wearings for a localized array.
510
-		 */
511
-		public function get_warnings_and_errors_array() {
512
-			$core = $this->core();
513
-
514
-			$this->build_local_array( $core, 'errors' );
515
-			$this->build_local_array( $core, 'warnings' );
516
-			$this->build_local_array( $core, 'sanitize' );
517
-
518
-			if ( empty( $core->transients['notices'] ) ) {
519
-				if ( isset( $core->transients['notices'] ) ) {
520
-					unset( $core->transients['notices'] );
521
-				}
522
-			}
523
-		}
524
-
525
-		/**
526
-		 * Commit localized data to global array.
527
-		 *
528
-		 * @param ReduxFramework $core ReduxFramework object.
529
-		 */
530
-		private function set_localized_data( ReduxFramework $core ) {
531
-			if ( ! empty( $core->args['last_tab'] ) ) {
532
-				$this->localize_data['last_tab'] = $core->args['last_tab'];
533
-			}
534
-
535
-			$this->localize_data['search'] = esc_html__( 'Search for field(s)', 'redux-framework' );
536
-
537
-			$this->localize_data['font_weights'] = $this->args['font_weights'];
538
-
539
-			$this->localize_data['required'] = Redux_Core::$required;
540
-			$this->repeater_data['fonts']    = Redux_Core::$fonts;
541
-
542
-			if ( ! isset( $this->repeater_data['opt_names'] ) ) {
543
-				$this->repeater_data['opt_names'] = array();
544
-			}
545
-
546
-			$this->repeater_data['opt_names'][]    = $core->args['opt_name'];
547
-			$this->repeater_data['folds']          = array();
548
-			$this->localize_data['required_child'] = Redux_Core::$required_child;
549
-			$this->localize_data['fields']         = $core->fields;
550
-
551
-			if ( isset( Redux_Core::$font_groups['google'] ) ) {
552
-				$this->repeater_data['googlefonts'] = Redux_Core::$font_groups['google'];
553
-			}
554
-
555
-			if ( isset( Redux_Core::$font_groups['std'] ) ) {
556
-				$this->repeater_data['stdfonts'] = Redux_Core::$font_groups['std'];
557
-			}
558
-
559
-			if ( isset( Redux_Core::$font_groups['customfonts'] ) ) {
560
-				$this->repeater_data['customfonts'] = Redux_Core::$font_groups['customfonts'];
561
-			}
562
-
563
-			if ( isset( Redux_Core::$font_groups['typekitfonts'] ) ) {
564
-				$this->repeater_data['typekitfonts'] = Redux_Core::$font_groups['typekitfonts'];
565
-			}
566
-
567
-			$this->localize_data['folds'] = Redux_Core::$folds;
568
-
569
-			// Make sure the children are all hidden properly.
570
-			foreach ( $core->fields as $key => $value ) {
571
-				if ( in_array( $key, Redux_Core::$fields_hidden, true ) ) {
572
-					foreach ( $value as $k => $v ) {
573
-						if ( ! in_array( $k, Redux_Core::$fields_hidden, true ) ) {
574
-							Redux_Core::$fields_hidden[] = $k;
575
-							Redux_Core::$folds[ $k ]     = 'hide';
576
-						}
577
-					}
578
-				}
579
-			}
580
-
581
-			$this->localize_data['fields_hidden'] = Redux_Core::$fields_hidden;
582
-			$this->localize_data['options']       = $core->options;
583
-			$this->localize_data['defaults']      = $core->options_defaults;
584
-
585
-			/**
586
-			 * Save pending string
587
-			 * filter 'redux/{opt_name}/localize/save_pending'
588
-			 *
589
-			 * @param string $msg Save_pending string
590
-			 */
591
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
592
-			$save_pending = apply_filters(
593
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
594
-				"redux/{$core->args['opt_name']}/localize/save_pending",
595
-				esc_html__(
596
-					'You have changes that are not saved. Would you like to save them now?',
597
-					'redux-framework'
598
-				)
599
-			);
600
-
601
-			/**
602
-			 * Reset all string
603
-			 * filter 'redux/{opt_name}/localize/reset'
604
-			 *
605
-			 * @param string $msg Reset all string.
606
-			 */
607
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
608
-			$reset_all = apply_filters(
609
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
610
-				"redux/{$core->args['opt_name']}/localize/reset",
611
-				esc_html__(
612
-					'Are you sure? Resetting will lose all custom values.',
613
-					'redux-framework'
614
-				)
615
-			);
616
-
617
-			/**
618
-			 * Reset section string
619
-			 * filter 'redux/{opt_name}/localize/reset_section'
620
-			 *
621
-			 * @param string $msg Reset section string.
622
-			 */
623
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
624
-			$reset_section = apply_filters(
625
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
626
-				"redux/{$core->args['opt_name']}/localize/reset_section",
627
-				esc_html__(
628
-					'Are you sure? Resetting will lose all custom values in this section.',
629
-					'redux-framework'
630
-				)
631
-			);
632
-
633
-			/**
634
-			 * Preset confirm string
635
-			 * filter 'redux/{opt_name}/localize/preset'
636
-			 *
637
-			 * @param string $msg Preset confirm string.
638
-			 */
639
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
640
-			$preset_confirm = apply_filters(
641
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
642
-				"redux/{$core->args['opt_name']}/localize/preset",
643
-				esc_html__(
644
-					'Your current options will be replaced with the values of this preset. Would you like to proceed?',
645
-					'redux-framework'
646
-				)
647
-			);
648
-
649
-			/**
650
-			 * Import confirm string
651
-			 * filter 'redux/{opt_name}/localize/import
652
-			 *
653
-			 * @param string $msg Import confirm string.
654
-			 */
655
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
656
-			$import_confirm = apply_filters(
657
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
658
-				"redux/{$core->args['opt_name']}/localize/import",
659
-				esc_html__(
660
-					'Your current options will be replaced with the values of this import. Would you like to proceed?',
661
-					'redux-framework'
662
-				)
663
-			);
664
-
665
-			global $pagenow;
666
-
667
-			$this->localize_data['args'] = array(
668
-				'dev_mode'               => $core->args['dev_mode'],
669
-				'save_pending'           => $save_pending,
670
-				'reset_confirm'          => $reset_all,
671
-				'reset_section_confirm'  => $reset_section,
672
-				'preset_confirm'         => $preset_confirm,
673
-				'import_section_confirm' => $import_confirm,
674
-				'please_wait'            => esc_html__( 'Please Wait', 'redux-framework' ),
675
-				'opt_name'               => $core->args['opt_name'],
676
-				'flyout_submenus'        => $core->args['flyout_submenus'] ?? false,
677
-				'search'                 => $core->args['search'] ?? true,
678
-				'slug'                   => $core->args['page_slug'],
679
-				'hints'                  => $core->args['hints'],
680
-				'disable_save_warn'      => $core->args['disable_save_warn'],
681
-				'class'                  => $core->args['class'],
682
-				'ajax_save'              => $core->args['ajax_save'],
683
-				'menu_search'            => $pagenow . '?page=' . $core->args['page_slug'] . '&tab=',
684
-			);
685
-
686
-			$this->localize_data['ajax'] = array(
687
-				'console' => esc_html__(
688
-					'There was an error saving. Here is the result of your action:',
689
-					'redux-framework'
690
-				),
691
-				'alert'   => esc_html__(
692
-					'There was a problem with your action. Please try again or reload the page.',
693
-					'redux-framework'
694
-				),
695
-			);
696
-
697
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
698
-			$this->localize_data = apply_filters( "redux/{$core->args['opt_name']}/localize", $this->localize_data );
699
-
700
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
701
-			$this->repeater_data = apply_filters( "redux/{$core->args['opt_name']}/repeater", $this->repeater_data );
702
-
703
-			$this->get_warnings_and_errors_array();
704
-
705
-			if ( ! isset( $core->repeater_data ) ) {
706
-				$core->repeater_data = array();
707
-			}
708
-			$core->repeater_data = Redux_Functions_Ex::nested_wp_parse_args(
709
-				$this->repeater_data,
710
-				$core->repeater_data
711
-			);
712
-
713
-			if ( ! isset( $core->localize_data ) ) {
714
-				$core->localize_data = array();
715
-			}
716
-			$core->localize_data = Redux_Functions_Ex::nested_wp_parse_args(
717
-				$this->localize_data,
718
-				$core->localize_data
719
-			);
720
-
721
-			// Shim for extension compatibility.
722
-			if ( Redux::$extension_compatibility ) {
723
-				$this->repeater_data = Redux_Functions_Ex::nested_wp_parse_args(
724
-					$this->repeater_data,
725
-					$core->localize_data
726
-				);
727
-			}
728
-
729
-			wp_localize_script(
730
-				'redux-js',
731
-				'redux',
732
-				$this->repeater_data
733
-			);
734
-
735
-			wp_localize_script(
736
-				'redux-js',
737
-				'redux_' . str_replace( '-', '_', $core->args['opt_name'] ),
738
-				$this->localize_data
739
-			);
740
-
741
-			wp_enqueue_script( 'redux-js' ); // Enqueue the JS now.
742
-		}
743
-	}
15
+    /**
16
+     * Class Redux_Enqueue
17
+     */
18
+    class Redux_Enqueue extends Redux_Class {
19
+
20
+        /**
21
+         * Data to localize.
22
+         *
23
+         * @var array
24
+         */
25
+        public array $localize_data = array();
26
+
27
+        /**
28
+         * Min string for .min files.
29
+         *
30
+         * @var string
31
+         */
32
+        private string $min = '';
33
+
34
+        /**
35
+         * Timestamp for file versions.
36
+         *
37
+         * @var string
38
+         */
39
+        private string $timestamp = '';
40
+
41
+        /**
42
+         * Localize data required for the repeater extension.
43
+         *
44
+         * @var array
45
+         */
46
+        private array $repeater_data = array();
47
+
48
+        /**
49
+         * Redux_Enqueue constructor.
50
+         *
51
+         * @param     object $redux ReduxFramework pointer.
52
+         */
53
+        public function __construct( $redux ) {
54
+            parent::__construct( $redux );
55
+
56
+            // Enqueue the admin page CSS and JS.
57
+            if ( isset( $_GET['page'] ) && $_GET['page'] === $redux->args['page_slug'] ) { // phpcs:ignore WordPress.Security.NonceVerification
58
+                add_action( 'admin_enqueue_scripts', array( $this, 'init' ), 1 );
59
+            }
60
+
61
+            add_action( 'wp_enqueue_scripts', array( $this, 'frontend_init' ), 10 );
62
+
63
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
64
+            do_action( "redux/{$redux->args['opt_name']}/enqueue/construct", $this );
65
+
66
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
67
+            do_action( 'redux/enqueue/construct', $this );
68
+
69
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
70
+            do_action( 'redux/search/' . $redux->args['opt_name'] . '/construct' );
71
+
72
+            //if ( isset( $_GET['page'] ) && sanitize_text_field( wp_unslash( $_GET['page'] === $this->parent->args['page_slug'] ) ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
73
+            //	add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ), 0 );
74
+            //}
75
+
76
+            //add_action( "redux/metaboxes/{$this->parent->args[ 'opt_name' ]}/enqueue", array( $this, 'enqueue' ), 10 );
77
+        }
78
+
79
+        /**
80
+         * Scripts to enqueue on the frontend
81
+         */
82
+        public function frontend_init() {
83
+            $core = $this->core();
84
+
85
+            if ( $core->args['elusive_frontend'] ) {
86
+                Redux_Functions_Ex::enqueue_elusive_font();
87
+            }
88
+
89
+            if ( $core->args['fontawesome_frontend'] ) {
90
+                Redux_Functions_Ex::enqueue_font_awesome();
91
+            }
92
+        }
93
+
94
+        /**
95
+         * Class init functions.
96
+         */
97
+        public function init() {
98
+            $core = $this->core();
99
+
100
+            Redux_Functions::$parent = $core;
101
+
102
+            $this->min = Redux_Functions::is_min();
103
+
104
+            $this->timestamp = Redux_Core::$version;
105
+            if ( $core->args['dev_mode'] ) {
106
+                $this->timestamp .= '.' . time();
107
+            }
108
+
109
+            $this->register_styles( $core );
110
+            $this->register_scripts();
111
+
112
+            add_thickbox();
113
+
114
+            $this->enqueue_fields( $core );
115
+
116
+            add_filter( "redux/{$core->args['opt_name']}/localize", array( 'Redux_Helpers', 'localize' ) );
117
+
118
+            $this->set_localized_data( $core );
119
+
120
+            /**
121
+             * Action 'redux/page/{opt_name}/enqueue'
122
+             */
123
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
124
+            do_action( "redux/page/{$core->args['opt_name']}/enqueue" );
125
+        }
126
+
127
+        /**
128
+         * Register all core framework styles.
129
+         *
130
+         * @param ReduxFramework $core ReduxFramework object.
131
+         */
132
+        private function register_styles( ReduxFramework $core ) {
133
+
134
+            /**
135
+             * Redux Admin CSS
136
+             */
137
+            if ( 'wordpress' === $core->args['admin_theme'] || 'wp' === $core->args['admin_theme'] ) { // phpcs:ignore WordPress.WP.CapitalPDangit
138
+                $color_scheme = get_user_option( 'admin_color' );
139
+            } elseif ( 'classic' === $core->args['admin_theme'] || '' === $core->args['admin_theme'] ) {
140
+                $color_scheme = 'classic';
141
+            } else {
142
+                $color_scheme = $core->args['admin_theme'];
143
+            }
144
+
145
+            if ( ! file_exists( Redux_Core::$dir . "assets/css/colors/$color_scheme/colors$this->min.css" ) ) {
146
+                $color_scheme = 'fresh';
147
+            }
148
+
149
+            $css = Redux_Core::$url . "assets/css/colors/$color_scheme/colors$this->min.css";
150
+
151
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
152
+            $css = apply_filters( 'redux/enqueue/' . $core->args['opt_name'] . '/args/admin_theme/css_url', $css );
153
+
154
+            wp_register_style(
155
+                'redux-admin-theme',
156
+                $css,
157
+                array(),
158
+                $this->timestamp
159
+            );
160
+
161
+            wp_enqueue_style(
162
+                'redux-admin-css',
163
+                Redux_Core::$url . "assets/css/redux-admin$this->min.css",
164
+                array( 'redux-admin-theme' ),
165
+                $this->timestamp
166
+            );
167
+
168
+            /**
169
+             * Redux Fields CSS
170
+             */
171
+            if ( ! $core->args['dev_mode'] ) {
172
+                wp_enqueue_style(
173
+                    'redux-fields',
174
+                    Redux_Core::$url . 'assets/css/redux-fields.min.css',
175
+                    array(),
176
+                    $this->timestamp
177
+                );
178
+            }
179
+
180
+            /**
181
+             * Select2 CSS
182
+             */
183
+            wp_enqueue_style(
184
+                'select2-css',
185
+                Redux_Core::$url . 'assets/css/vendor/select2.min.css',
186
+                array(),
187
+                '4.1.0'
188
+            );
189
+
190
+            /**
191
+             * Spectrum CSS
192
+             */
193
+            wp_register_style(
194
+                'redux-spectrum-css',
195
+                Redux_Core::$url . "assets/css/vendor/spectrum$this->min.css",
196
+                array(),
197
+                '1.3.3'
198
+            );
199
+
200
+            /**
201
+             * Elusive Icon CSS
202
+             */
203
+            Redux_Functions_Ex::enqueue_elusive_font();
204
+
205
+            /**
206
+             * Font Awesome for Social Profiles and Icon Select
207
+             */
208
+            Redux_Functions_Ex::enqueue_font_awesome();
209
+
210
+            /**
211
+             * QTip CSS
212
+             */
213
+            wp_enqueue_style(
214
+                'qtip',
215
+                Redux_Core::$url . "assets/css/vendor/qtip$this->min.css",
216
+                array(),
217
+                '3.0.3'
218
+            );
219
+
220
+            /**
221
+             * JQuery UI CSS
222
+             */
223
+            wp_enqueue_style(
224
+                'jquery-ui',
225
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
226
+                apply_filters(
227
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
228
+                    "redux/page/{$core->args['opt_name']}/enqueue/jquery-ui-css",
229
+                    Redux_Core::$url . 'assets/css/vendor/jquery-ui-1.10.0.custom.css'
230
+                ),
231
+                array(),
232
+                $this->timestamp
233
+            );
234
+
235
+            /**
236
+             * Iris CSS
237
+             */
238
+            wp_enqueue_style( 'wp-color-picker' );
239
+
240
+            if ( $core->args['dev_mode'] ) {
241
+
242
+                /**
243
+                 * Media CSS
244
+                 */
245
+                wp_enqueue_style(
246
+                    'redux-field-media',
247
+                    Redux_Core::$url . 'assets/css/media.css',
248
+                    array(),
249
+                    $this->timestamp
250
+                );
251
+            }
252
+
253
+            /**
254
+             * RTL CSS
255
+             */
256
+            if ( is_rtl() ) {
257
+                wp_enqueue_style(
258
+                    'redux-rtl',
259
+                    Redux_Core::$url . 'assets/css/rtl.css',
260
+                    array(),
261
+                    $this->timestamp
262
+                );
263
+            }
264
+        }
265
+
266
+        /**
267
+         * Register all core framework scripts.
268
+         */
269
+        private function register_scripts() {
270
+            // *****************************************************************
271
+            // JQuery / JQuery UI JS
272
+            // *****************************************************************
273
+            wp_enqueue_script( 'jquery' );
274
+            wp_enqueue_script( 'jquery-ui-core' );
275
+            wp_enqueue_script( 'jquery-ui-dialog' );
276
+
277
+            /**
278
+             * Select2 Sortable JS
279
+             */
280
+            wp_register_script(
281
+                'redux-select2-sortable',
282
+                Redux_Core::$url . 'assets/js/vendor/select2-sortable/redux.select2.sortable' . $this->min . '.js',
283
+                array( 'jquery', 'jquery-ui-sortable' ),
284
+                $this->timestamp,
285
+                true
286
+            );
287
+
288
+            /**
289
+             * Select2
290
+             */
291
+            wp_enqueue_script(
292
+                'select2-js',
293
+                Redux_Core::$url . 'assets/js/vendor/select2/select2' . $this->min . '.js`',
294
+                array( 'jquery', 'redux-select2-sortable' ),
295
+                '4.1.0',
296
+                true
297
+            );
298
+
299
+            /**
300
+             * QTip JS
301
+             */
302
+            wp_enqueue_script(
303
+                'qtip',
304
+                Redux_Core::$url . 'assets/js/vendor/qtip/qtip' . $this->min . '.js',
305
+                array( 'jquery' ),
306
+                '3.0.3',
307
+                true
308
+            );
309
+
310
+            /**
311
+             * Iris alpha color picker
312
+             */
313
+            if ( ! wp_script_is( 'redux-wp-color-picker-alpha' ) ) {
314
+                wp_enqueue_style( 'wp-color-picker' );
315
+
316
+                wp_register_script(
317
+                    'redux-wp-color-picker-alpha',
318
+                    Redux_Core::$url . 'assets/js/vendor/wp-color-picker-alpha/wp-color-picker-alpha' . $this->min . '.js',
319
+                    array( 'jquery', 'wp-color-picker' ),
320
+                    '3.0.0',
321
+                    true
322
+                );
323
+            }
324
+
325
+            /**
326
+             * Block UI (used by Custom Fonts and Color Schemes).
327
+             */
328
+            wp_register_script(
329
+                'redux-block-ui',
330
+                Redux_Core::$url . 'assets/js/vendor/block-ui/jquery.blockUI' . $this->min . '.js',
331
+                array( 'jquery' ),
332
+                '2.70.0',
333
+                true
334
+            );
335
+
336
+            /**
337
+             * Spectrum JS
338
+             */
339
+            wp_register_script(
340
+                'redux-spectrum-js',
341
+                Redux_Core::$url . 'assets/js/vendor/spectrum/redux-spectrum' . $this->min . '.js',
342
+                array( 'jquery' ),
343
+                '1.3.3',
344
+                true
345
+            );
346
+
347
+            /**
348
+             * Vendor JS
349
+             */
350
+            wp_register_script(
351
+                'redux-vendor',
352
+                Redux_Core::$url . 'assets/js/redux-vendors' . $this->min . '.js',
353
+                array( 'jquery' ),
354
+                $this->timestamp,
355
+                true
356
+            );
357
+
358
+            /**
359
+             * Redux JS
360
+             */
361
+            wp_register_script(
362
+                'redux-js',
363
+                Redux_Core::$url . 'assets/js/redux' . $this->min . '.js',
364
+                array( 'jquery', 'redux-vendor' ),
365
+                $this->timestamp,
366
+                true
367
+            );
368
+        }
369
+
370
+        /**
371
+         * Enqueue fields that are in use.
372
+         *
373
+         * @param ReduxFramework $core  ReduxFramework object.
374
+         * @param array          $field Field array.
375
+         */
376
+        public function enqueue_field( ReduxFramework $core, array $field ) {
377
+            if ( isset( $field['type'] ) && 'callback' !== $field['type'] ) {
378
+                $field_type = str_replace( '_', '-', $field['type'] );
379
+                $core_path  = Redux_Core::$dir . "inc/fields/{$field['type']}/class-redux-$field_type.php";
380
+
381
+                // Shim for v3 extension class names.
382
+                if ( ! file_exists( $core_path ) ) {
383
+                    $core_path = Redux_Core::$dir . "inc/fields/{$field['type']}/field_{$field['type']}.php";
384
+                }
385
+
386
+                $filter_path = $core_path;
387
+
388
+                /**
389
+                 * Field class file
390
+                 * filter 'redux/{opt_name}/field/class/{field.type}'
391
+                 *
392
+                 * @param     string    $filter_path Field class file path
393
+                 * @param     array     $field       Field config data
394
+                 */
395
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
396
+                $class_file = apply_filters(
397
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
398
+                    "redux/{$core->args['opt_name']}/field/class/{$field['type']}",
399
+                    $filter_path,
400
+                    $field
401
+                );
402
+
403
+                $field_classes = array( 'Redux_' . $field['type'], 'ReduxFramework_' . $field['type'] );
404
+
405
+                if ( $class_file ) {
406
+                    $field_class = Redux_Functions::class_exists_ex( $field_classes );
407
+                    if ( false === $field_class ) {
408
+                        if ( file_exists( $class_file ) ) {
409
+                            require_once $class_file;
410
+
411
+                            $field_class = Redux_Functions::class_exists_ex( $field_classes );
412
+                        } else {
413
+                            return;
414
+                        }
415
+                    }
416
+
417
+                    if ( false !== $field_class && ( ( method_exists( $field_class, 'enqueue' ) ) || method_exists( $field_class, 'localize' ) ) ) {
418
+                        if ( ! isset( $core->options[ $field['id'] ] ) ) {
419
+                            $core->options[ $field['id'] ] = '';
420
+                        }
421
+
422
+                        $the_field = new $field_class( $field, $core->options[ $field['id'] ], $core );
423
+
424
+                        // Move dev_mode check to a new if/then block.
425
+                        if ( ! wp_script_is( 'redux-field-' . $field_type ) && ( class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) ) {
426
+                            $the_field->enqueue();
427
+                        }
428
+
429
+                        if ( class_exists( $field_class ) && method_exists( $field_class, 'always_enqueue' ) ) {
430
+                            $the_field->always_enqueue();
431
+                        }
432
+
433
+                        if ( method_exists( $field_class, 'localize' ) ) {
434
+                            $the_field->localize( $field );
435
+
436
+                            if ( ! isset( $this->localize_data[ $field['type'] ] ) ) {
437
+                                $this->localize_data[ $field['type'] ] = array();
438
+                            }
439
+
440
+                            $localize_data = $the_field->localize( $field );
441
+
442
+                            $shims = array( 'repeater' );
443
+
444
+                            // phpcs:ignore WordPress.NamingConventions.ValidHookName
445
+                            $shims = apply_filters( 'redux/' . $core->args['opt_name'] . '/localize/shims', $shims );
446
+
447
+                            if ( is_array( $shims ) && in_array( $field['type'], $shims, true ) ) {
448
+                                $this->repeater_data[ $field['type'] ][ $field['id'] ] = $localize_data;
449
+                            }
450
+
451
+                            $this->localize_data[ $field['type'] ][ $field['id'] ] = $localize_data;
452
+                        }
453
+
454
+                        unset( $the_field );
455
+                    }
456
+                }
457
+            }
458
+        }
459
+
460
+        /**
461
+         * Enqueue field files.
462
+         *
463
+         * @param ReduxFramework $core ReduxFramework object.
464
+         */
465
+        private function enqueue_fields( ReduxFramework $core ) {
466
+            foreach ( $core->sections as $section ) {
467
+                if ( isset( $section['fields'] ) ) {
468
+                    foreach ( $section['fields'] as $field ) {
469
+                        $this->enqueue_field( $core, $field );
470
+                    }
471
+                }
472
+            }
473
+        }
474
+
475
+        /**
476
+         * Build a localized array from field functions, if any.
477
+         *
478
+         * @param ReduxFramework $core ReduxFramework object.
479
+         * @param string         $type Field type.
480
+         */
481
+        private function build_local_array( ReduxFramework $core, string $type ) {
482
+            if ( isset( $core->transients['last_save_mode'] ) && ! empty( $core->transients['notices'][ $type ] ) ) {
483
+                $the_total = 0;
484
+                $messages  = array();
485
+
486
+                foreach ( $core->transients['notices'][ $type ] as $msg ) {
487
+                    if ( is_array( $msg ) && ! empty( $msg ) ) {
488
+                        $messages[ $msg['section_id'] ][ $type ][] = $msg;
489
+
490
+                        if ( ! isset( $messages[ $msg['section_id'] ]['total'] ) ) {
491
+                            $messages[ $msg['section_id'] ]['total'] = 0;
492
+                        }
493
+
494
+                        ++$messages[ $msg['section_id'] ]['total'];
495
+                        ++$the_total;
496
+                    }
497
+                }
498
+
499
+                $this->localize_data[ $type ] = array(
500
+                    'total' => $the_total,
501
+                    "$type" => $messages,
502
+                );
503
+
504
+                unset( $core->transients['notices'][ $type ] );
505
+            }
506
+        }
507
+
508
+        /**
509
+         * Compile panel errors and wearings for a localized array.
510
+         */
511
+        public function get_warnings_and_errors_array() {
512
+            $core = $this->core();
513
+
514
+            $this->build_local_array( $core, 'errors' );
515
+            $this->build_local_array( $core, 'warnings' );
516
+            $this->build_local_array( $core, 'sanitize' );
517
+
518
+            if ( empty( $core->transients['notices'] ) ) {
519
+                if ( isset( $core->transients['notices'] ) ) {
520
+                    unset( $core->transients['notices'] );
521
+                }
522
+            }
523
+        }
524
+
525
+        /**
526
+         * Commit localized data to global array.
527
+         *
528
+         * @param ReduxFramework $core ReduxFramework object.
529
+         */
530
+        private function set_localized_data( ReduxFramework $core ) {
531
+            if ( ! empty( $core->args['last_tab'] ) ) {
532
+                $this->localize_data['last_tab'] = $core->args['last_tab'];
533
+            }
534
+
535
+            $this->localize_data['search'] = esc_html__( 'Search for field(s)', 'redux-framework' );
536
+
537
+            $this->localize_data['font_weights'] = $this->args['font_weights'];
538
+
539
+            $this->localize_data['required'] = Redux_Core::$required;
540
+            $this->repeater_data['fonts']    = Redux_Core::$fonts;
541
+
542
+            if ( ! isset( $this->repeater_data['opt_names'] ) ) {
543
+                $this->repeater_data['opt_names'] = array();
544
+            }
545
+
546
+            $this->repeater_data['opt_names'][]    = $core->args['opt_name'];
547
+            $this->repeater_data['folds']          = array();
548
+            $this->localize_data['required_child'] = Redux_Core::$required_child;
549
+            $this->localize_data['fields']         = $core->fields;
550
+
551
+            if ( isset( Redux_Core::$font_groups['google'] ) ) {
552
+                $this->repeater_data['googlefonts'] = Redux_Core::$font_groups['google'];
553
+            }
554
+
555
+            if ( isset( Redux_Core::$font_groups['std'] ) ) {
556
+                $this->repeater_data['stdfonts'] = Redux_Core::$font_groups['std'];
557
+            }
558
+
559
+            if ( isset( Redux_Core::$font_groups['customfonts'] ) ) {
560
+                $this->repeater_data['customfonts'] = Redux_Core::$font_groups['customfonts'];
561
+            }
562
+
563
+            if ( isset( Redux_Core::$font_groups['typekitfonts'] ) ) {
564
+                $this->repeater_data['typekitfonts'] = Redux_Core::$font_groups['typekitfonts'];
565
+            }
566
+
567
+            $this->localize_data['folds'] = Redux_Core::$folds;
568
+
569
+            // Make sure the children are all hidden properly.
570
+            foreach ( $core->fields as $key => $value ) {
571
+                if ( in_array( $key, Redux_Core::$fields_hidden, true ) ) {
572
+                    foreach ( $value as $k => $v ) {
573
+                        if ( ! in_array( $k, Redux_Core::$fields_hidden, true ) ) {
574
+                            Redux_Core::$fields_hidden[] = $k;
575
+                            Redux_Core::$folds[ $k ]     = 'hide';
576
+                        }
577
+                    }
578
+                }
579
+            }
580
+
581
+            $this->localize_data['fields_hidden'] = Redux_Core::$fields_hidden;
582
+            $this->localize_data['options']       = $core->options;
583
+            $this->localize_data['defaults']      = $core->options_defaults;
584
+
585
+            /**
586
+             * Save pending string
587
+             * filter 'redux/{opt_name}/localize/save_pending'
588
+             *
589
+             * @param string $msg Save_pending string
590
+             */
591
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
592
+            $save_pending = apply_filters(
593
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
594
+                "redux/{$core->args['opt_name']}/localize/save_pending",
595
+                esc_html__(
596
+                    'You have changes that are not saved. Would you like to save them now?',
597
+                    'redux-framework'
598
+                )
599
+            );
600
+
601
+            /**
602
+             * Reset all string
603
+             * filter 'redux/{opt_name}/localize/reset'
604
+             *
605
+             * @param string $msg Reset all string.
606
+             */
607
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
608
+            $reset_all = apply_filters(
609
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
610
+                "redux/{$core->args['opt_name']}/localize/reset",
611
+                esc_html__(
612
+                    'Are you sure? Resetting will lose all custom values.',
613
+                    'redux-framework'
614
+                )
615
+            );
616
+
617
+            /**
618
+             * Reset section string
619
+             * filter 'redux/{opt_name}/localize/reset_section'
620
+             *
621
+             * @param string $msg Reset section string.
622
+             */
623
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
624
+            $reset_section = apply_filters(
625
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
626
+                "redux/{$core->args['opt_name']}/localize/reset_section",
627
+                esc_html__(
628
+                    'Are you sure? Resetting will lose all custom values in this section.',
629
+                    'redux-framework'
630
+                )
631
+            );
632
+
633
+            /**
634
+             * Preset confirm string
635
+             * filter 'redux/{opt_name}/localize/preset'
636
+             *
637
+             * @param string $msg Preset confirm string.
638
+             */
639
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
640
+            $preset_confirm = apply_filters(
641
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
642
+                "redux/{$core->args['opt_name']}/localize/preset",
643
+                esc_html__(
644
+                    'Your current options will be replaced with the values of this preset. Would you like to proceed?',
645
+                    'redux-framework'
646
+                )
647
+            );
648
+
649
+            /**
650
+             * Import confirm string
651
+             * filter 'redux/{opt_name}/localize/import
652
+             *
653
+             * @param string $msg Import confirm string.
654
+             */
655
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
656
+            $import_confirm = apply_filters(
657
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
658
+                "redux/{$core->args['opt_name']}/localize/import",
659
+                esc_html__(
660
+                    'Your current options will be replaced with the values of this import. Would you like to proceed?',
661
+                    'redux-framework'
662
+                )
663
+            );
664
+
665
+            global $pagenow;
666
+
667
+            $this->localize_data['args'] = array(
668
+                'dev_mode'               => $core->args['dev_mode'],
669
+                'save_pending'           => $save_pending,
670
+                'reset_confirm'          => $reset_all,
671
+                'reset_section_confirm'  => $reset_section,
672
+                'preset_confirm'         => $preset_confirm,
673
+                'import_section_confirm' => $import_confirm,
674
+                'please_wait'            => esc_html__( 'Please Wait', 'redux-framework' ),
675
+                'opt_name'               => $core->args['opt_name'],
676
+                'flyout_submenus'        => $core->args['flyout_submenus'] ?? false,
677
+                'search'                 => $core->args['search'] ?? true,
678
+                'slug'                   => $core->args['page_slug'],
679
+                'hints'                  => $core->args['hints'],
680
+                'disable_save_warn'      => $core->args['disable_save_warn'],
681
+                'class'                  => $core->args['class'],
682
+                'ajax_save'              => $core->args['ajax_save'],
683
+                'menu_search'            => $pagenow . '?page=' . $core->args['page_slug'] . '&tab=',
684
+            );
685
+
686
+            $this->localize_data['ajax'] = array(
687
+                'console' => esc_html__(
688
+                    'There was an error saving. Here is the result of your action:',
689
+                    'redux-framework'
690
+                ),
691
+                'alert'   => esc_html__(
692
+                    'There was a problem with your action. Please try again or reload the page.',
693
+                    'redux-framework'
694
+                ),
695
+            );
696
+
697
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
698
+            $this->localize_data = apply_filters( "redux/{$core->args['opt_name']}/localize", $this->localize_data );
699
+
700
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
701
+            $this->repeater_data = apply_filters( "redux/{$core->args['opt_name']}/repeater", $this->repeater_data );
702
+
703
+            $this->get_warnings_and_errors_array();
704
+
705
+            if ( ! isset( $core->repeater_data ) ) {
706
+                $core->repeater_data = array();
707
+            }
708
+            $core->repeater_data = Redux_Functions_Ex::nested_wp_parse_args(
709
+                $this->repeater_data,
710
+                $core->repeater_data
711
+            );
712
+
713
+            if ( ! isset( $core->localize_data ) ) {
714
+                $core->localize_data = array();
715
+            }
716
+            $core->localize_data = Redux_Functions_Ex::nested_wp_parse_args(
717
+                $this->localize_data,
718
+                $core->localize_data
719
+            );
720
+
721
+            // Shim for extension compatibility.
722
+            if ( Redux::$extension_compatibility ) {
723
+                $this->repeater_data = Redux_Functions_Ex::nested_wp_parse_args(
724
+                    $this->repeater_data,
725
+                    $core->localize_data
726
+                );
727
+            }
728
+
729
+            wp_localize_script(
730
+                'redux-js',
731
+                'redux',
732
+                $this->repeater_data
733
+            );
734
+
735
+            wp_localize_script(
736
+                'redux-js',
737
+                'redux_' . str_replace( '-', '_', $core->args['opt_name'] ),
738
+                $this->localize_data
739
+            );
740
+
741
+            wp_enqueue_script( 'redux-js' ); // Enqueue the JS now.
742
+        }
743
+    }
744 744
 }
745 745
 
746 746
 if ( ! class_exists( 'reduxCoreEnqueue' ) ) {
747
-	class_alias( 'Redux_Enqueue', 'reduxCoreEnqueue' );
747
+    class_alias( 'Redux_Enqueue', 'reduxCoreEnqueue' );
748 748
 }
Please login to merge, or discard this patch.
Spacing   +16 added lines, -16 removed lines patch added patch discarded remove patch
@@ -415,11 +415,11 @@  discard block
 block discarded – undo
415 415
 					}
416 416
 
417 417
 					if ( false !== $field_class && ( ( method_exists( $field_class, 'enqueue' ) ) || method_exists( $field_class, 'localize' ) ) ) {
418
-						if ( ! isset( $core->options[ $field['id'] ] ) ) {
419
-							$core->options[ $field['id'] ] = '';
418
+						if ( ! isset( $core->options[$field['id']] ) ) {
419
+							$core->options[$field['id']] = '';
420 420
 						}
421 421
 
422
-						$the_field = new $field_class( $field, $core->options[ $field['id'] ], $core );
422
+						$the_field = new $field_class( $field, $core->options[$field['id']], $core );
423 423
 
424 424
 						// Move dev_mode check to a new if/then block.
425 425
 						if ( ! wp_script_is( 'redux-field-' . $field_type ) && ( class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) ) {
@@ -433,8 +433,8 @@  discard block
 block discarded – undo
433 433
 						if ( method_exists( $field_class, 'localize' ) ) {
434 434
 							$the_field->localize( $field );
435 435
 
436
-							if ( ! isset( $this->localize_data[ $field['type'] ] ) ) {
437
-								$this->localize_data[ $field['type'] ] = array();
436
+							if ( ! isset( $this->localize_data[$field['type']] ) ) {
437
+								$this->localize_data[$field['type']] = array();
438 438
 							}
439 439
 
440 440
 							$localize_data = $the_field->localize( $field );
@@ -445,10 +445,10 @@  discard block
 block discarded – undo
445 445
 							$shims = apply_filters( 'redux/' . $core->args['opt_name'] . '/localize/shims', $shims );
446 446
 
447 447
 							if ( is_array( $shims ) && in_array( $field['type'], $shims, true ) ) {
448
-								$this->repeater_data[ $field['type'] ][ $field['id'] ] = $localize_data;
448
+								$this->repeater_data[$field['type']][$field['id']] = $localize_data;
449 449
 							}
450 450
 
451
-							$this->localize_data[ $field['type'] ][ $field['id'] ] = $localize_data;
451
+							$this->localize_data[$field['type']][$field['id']] = $localize_data;
452 452
 						}
453 453
 
454 454
 						unset( $the_field );
@@ -479,29 +479,29 @@  discard block
 block discarded – undo
479 479
 		 * @param string         $type Field type.
480 480
 		 */
481 481
 		private function build_local_array( ReduxFramework $core, string $type ) {
482
-			if ( isset( $core->transients['last_save_mode'] ) && ! empty( $core->transients['notices'][ $type ] ) ) {
482
+			if ( isset( $core->transients['last_save_mode'] ) && ! empty( $core->transients['notices'][$type] ) ) {
483 483
 				$the_total = 0;
484 484
 				$messages  = array();
485 485
 
486
-				foreach ( $core->transients['notices'][ $type ] as $msg ) {
486
+				foreach ( $core->transients['notices'][$type] as $msg ) {
487 487
 					if ( is_array( $msg ) && ! empty( $msg ) ) {
488
-						$messages[ $msg['section_id'] ][ $type ][] = $msg;
488
+						$messages[$msg['section_id']][$type][] = $msg;
489 489
 
490
-						if ( ! isset( $messages[ $msg['section_id'] ]['total'] ) ) {
491
-							$messages[ $msg['section_id'] ]['total'] = 0;
490
+						if ( ! isset( $messages[$msg['section_id']]['total'] ) ) {
491
+							$messages[$msg['section_id']]['total'] = 0;
492 492
 						}
493 493
 
494
-						++$messages[ $msg['section_id'] ]['total'];
494
+						++$messages[$msg['section_id']]['total'];
495 495
 						++$the_total;
496 496
 					}
497 497
 				}
498 498
 
499
-				$this->localize_data[ $type ] = array(
499
+				$this->localize_data[$type] = array(
500 500
 					'total' => $the_total,
501 501
 					"$type" => $messages,
502 502
 				);
503 503
 
504
-				unset( $core->transients['notices'][ $type ] );
504
+				unset( $core->transients['notices'][$type] );
505 505
 			}
506 506
 		}
507 507
 
@@ -572,7 +572,7 @@  discard block
 block discarded – undo
572 572
 					foreach ( $value as $k => $v ) {
573 573
 						if ( ! in_array( $k, Redux_Core::$fields_hidden, true ) ) {
574 574
 							Redux_Core::$fields_hidden[] = $k;
575
-							Redux_Core::$folds[ $k ]     = 'hide';
575
+							Redux_Core::$folds[$k]     = 'hide';
576 576
 						}
577 577
 					}
578 578
 				}
Please login to merge, or discard this patch.
redux-core/inc/classes/class-redux-functions-ex.php 2 patches
Indentation   +471 added lines, -471 removed lines patch added patch discarded remove patch
@@ -13,475 +13,475 @@
 block discarded – undo
13 13
 // Don't duplicate me!
14 14
 if ( ! class_exists( 'Redux_Functions_Ex', false ) ) {
15 15
 
16
-	/**
17
-	 * Redux Functions Class
18
-	 * A Class of useful functions that can/should be shared among all Redux files.
19
-	 *
20
-	 * @since       3.0.0
21
-	 */
22
-	class Redux_Functions_Ex {
23
-
24
-		/**
25
-		 * What is this for?
26
-		 *
27
-		 * @var array
28
-		 */
29
-		public static $args;
30
-
31
-		/**
32
-		 * Enqueue Font Awesome.
33
-		 *
34
-		 * @return void
35
-		 */
36
-		public static function enqueue_font_awesome() {
37
-			wp_enqueue_style(
38
-				'font-awesome',
39
-				Redux_Core::$url . 'assets/font-awesome/css/all' . Redux_Functions::is_min() . '.css',
40
-				array(),
41
-				'6.5.2'
42
-			);
43
-
44
-			wp_enqueue_style(
45
-				'font-awesome-4-shims',
46
-				Redux_Core::$url . 'assets/font-awesome/css/v4-shims' . Redux_Functions::is_min() . '.css',
47
-				array(),
48
-				'6.5.2'
49
-			);
50
-		}
51
-
52
-		/**
53
-		 * Enqueue Elusive Font.
54
-		 *
55
-		 * @return void
56
-		 */
57
-		public static function enqueue_elusive_font() {
58
-			wp_enqueue_style(
59
-				'redux-elusive-icon',
60
-				Redux_Core::$url . 'assets/css/vendor/elusive-icons' . Redux_Functions::is_min() . '.css',
61
-				array(),
62
-				'2.0.0'
63
-			);
64
-		}
65
-
66
-		/**
67
-		 * Output alpha data tag for Iris alpha color picker, if enabled.
68
-		 *
69
-		 * @param array $data Data array.
70
-		 *
71
-		 * @return string
72
-		 */
73
-		public static function output_alpha_data( array $data ): string {
74
-			$index = null;
75
-
76
-			extract( $data ); // phpcs:ignore WordPress.PHP.DontExtract
77
-
78
-			$value = false;
79
-
80
-			if ( isset( $field['color_alpha'] ) && $field['color_alpha'] ) {
81
-				if ( is_array( $field['color_alpha'] ) ) {
82
-					$value = $field['color_alpha'][ $index ] ?? false;
83
-				} else {
84
-					$value = $field['color_alpha'];
85
-				}
86
-			}
87
-
88
-			return 'data-alpha-enabled="' . (bool) esc_attr( $value ) . '"';
89
-		}
90
-
91
-		/**
92
-		 * Parses the string into variables without the max_input_vars limitation.
93
-		 *
94
-		 * @param string $str String of data.
95
-		 *
96
-		 * @return  array|false $result
97
-		 * @since   3.5.7.11
98
-		 * @author  harunbasic
99
-		 * @access  private
100
-		 */
101
-		public static function parse_str( string $str ) {
102
-			if ( '' === $str ) {
103
-				return false;
104
-			}
105
-
106
-			$result = array();
107
-			$pairs  = explode( '&', $str );
108
-
109
-			foreach ( $pairs as $pair ) {
110
-				// use the original parse_str() on each element.
111
-				parse_str( $pair, $params );
112
-
113
-				$k = key( $params );
114
-
115
-				if ( ! isset( $result[ $k ] ) ) {
116
-					$result += $params;
117
-				} elseif ( is_array( $result[ $k ] ) && is_array( $params[ $k ] ) ) {
118
-					$result[ $k ] = self::array_merge_recursive_distinct( $result[ $k ], $params[ $k ] );
119
-				}
120
-			}
121
-
122
-			return $result;
123
-		}
124
-
125
-		/**
126
-		 * Merge arrays without converting values with duplicate keys to arrays as array_merge_recursive does.
127
-		 * As seen here http://php.net/manual/en/function.array-merge-recursive.php#92195
128
-		 *
129
-		 * @param array $array1 array one.
130
-		 * @param array $array2 array two.
131
-		 *
132
-		 * @return  array $merged
133
-		 * @since   3.5.7.11
134
-		 * @author  harunbasic
135
-		 * @access  private
136
-		 */
137
-		public static function array_merge_recursive_distinct( array $array1, array $array2 ): array {
138
-			$merged = $array1;
139
-
140
-			foreach ( $array2 as $key => $value ) {
141
-
142
-				if ( is_array( $value ) && isset( $merged[ $key ] ) && is_array( $merged[ $key ] ) ) {
143
-					$merged[ $key ] = self::array_merge_recursive_distinct( $merged[ $key ], $value );
144
-				} elseif ( is_numeric( $key ) && isset( $merged[ $key ] ) ) {
145
-					$merged[] = $value;
146
-				} else {
147
-					$merged[ $key ] = $value;
148
-				}
149
-			}
150
-
151
-			return $merged;
152
-		}
153
-
154
-		/**
155
-		 * Records calling function.
156
-		 *
157
-		 * @param string $opt_name Panel opt_name.
158
-		 */
159
-		public static function record_caller( string $opt_name = '' ) {
160
-			global $pagenow;
161
-
162
-			// phpcs:ignore WordPress.Security.NonceVerification
163
-			if ( ! ( 'options-general.php' === $pagenow && isset( $_GET['page'] ) && ( 'redux-framework' === $_GET['page'] || 'health-check' === $_GET['page'] ) ) ) {
164
-				return;
165
-			}
166
-
167
-			// phpcs:ignore WordPress.PHP.DevelopmentFunctions
168
-			$caller = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2 )[1]['file'];
169
-
170
-			if ( ! empty( $caller ) && ! empty( $opt_name ) && class_exists( 'Redux_Core' ) ) {
171
-				if ( ! isset( Redux_Core::$callers[ $opt_name ] ) ) {
172
-					Redux_Core::$callers[ $opt_name ] = array();
173
-				}
174
-
175
-				if ( strpos( $caller, 'class-redux-' ) !== false || strpos( $caller, 'redux-core/framework.php' ) ) {
176
-					return;
177
-				}
178
-
179
-				if ( ! in_array( $caller, Redux_Core::$callers[ $opt_name ], true ) ) {
180
-					Redux_Core::$callers[ $opt_name ][] = $caller;
181
-				}
182
-
183
-				if ( ! empty( self::$args[ $opt_name ]['callers'] ) && ! in_array( $caller, self::$args[ $opt_name ]['callers'], true ) ) {
184
-					self::$args[ $opt_name ]['callers'][] = $caller;
185
-				}
186
-			}
187
-		}
188
-
189
-		/**
190
-		 * Normalize path.
191
-		 *
192
-		 * @param string $path Path to normalize.
193
-		 *
194
-		 * @return string|string[]|null
195
-		 */
196
-		public static function wp_normalize_path( string $path = '' ) {
197
-			if ( function_exists( 'wp_normalize_path' ) ) {
198
-				$path = wp_normalize_path( $path );
199
-			} else {
200
-				// Shim for pre WP 3.9.
201
-				$path = str_replace( '\\', '/', $path );
202
-				$path = preg_replace( '|(?<=.)/+|', '/', $path );
203
-
204
-				if ( ':' === substr( $path, 1, 1 ) ) {
205
-					$path = ucfirst( $path );
206
-				}
207
-			}
208
-
209
-			return $path;
210
-		}
211
-
212
-		/**
213
-		 * Action to add generator tag to page HEAD.
214
-		 */
215
-		public static function generator() {
216
-			add_action( 'wp_head', array( 'Redux_Functions_Ex', 'meta_tag' ) );
217
-		}
218
-
219
-
220
-		/**
221
-		 * Callback for wp_head hook to add meta tag.
222
-		 */
223
-		public static function meta_tag() {
224
-			echo '<meta name="generator" content="Redux ' . esc_html( Redux_Core::$version ) . '" />';
225
-		}
226
-
227
-		/**
228
-		 * Run URL through a ssl check.
229
-		 *
230
-		 * @param string $url URL to check.
231
-		 *
232
-		 * @return string
233
-		 */
234
-		public static function verify_url_protocol( string $url ): string {
235
-			// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated
236
-			$protocol = ! empty( $_SERVER['HTTPS'] ) && 'off' !== $_SERVER['HTTPS'] || ( ! empty( $_SERVER['SERVER_PORT'] ) && 443 === $_SERVER['SERVER_PORT'] ) ? 'https://' : 'http://';
237
-
238
-			if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated
239
-				$new_protocol = sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) . '://'; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated
240
-				if ( 'http://' === $protocol && $new_protocol !== $protocol && false === strpos( $url, $new_protocol ) ) {
241
-					$url = str_replace( $protocol, $new_protocol, $url );
242
-				}
243
-			}
244
-
245
-			return $url;
246
-		}
247
-
248
-		/**
249
-		 * Check s.
250
-		 *
251
-		 * @access public
252
-		 * @return bool
253
-		 * @since  4.0.0
254
-		 */
255
-		public static function s(): bool {
256
-			if ( ! get_option( 'redux_p' . 'ro_lic' . 'ense_key', false ) ) { // phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found
257
-				$s = get_option( 'redux_p' . 'ro_l' . 'icense_status', false ); // phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found
258
-
259
-				if ( in_array( $s, array( 'valid', 'site_inactive' ), true ) ) {
260
-					return true;
261
-				}
262
-			}
263
-
264
-			return false;
265
-		}
266
-
267
-		/**
268
-		 * Is file in theme.
269
-		 *
270
-		 * @param string $file File to check.
271
-		 *
272
-		 * @return bool
273
-		 */
274
-		public static function file_in_theme( string $file ): bool {
275
-			$file_path = self::wp_normalize_path( dirname( $file ) );
276
-
277
-			if ( strpos( $file_path, self::wp_normalize_path( get_template_directory() ) ) !== false ) {
278
-				return true;
279
-			} elseif ( strpos( $file_path, self::wp_normalize_path( get_stylesheet_directory() ) ) !== false ) {
280
-				return true;
281
-			}
282
-
283
-			return false;
284
-		}
285
-
286
-		/**
287
-		 * Is Redux embedded inside a plugin?
288
-		 *
289
-		 * @param string $file File to check.
290
-		 *
291
-		 * @return array|bool
292
-		 */
293
-		public static function is_inside_plugin( string $file ) {
294
-			$file            = self::wp_normalize_path( $file );
295
-			$plugin_basename = self::wp_normalize_path( plugin_basename( $file ) );
296
-
297
-			if ( self::file_in_theme( $file ) ) {
298
-				return false;
299
-			}
300
-
301
-			if ( $plugin_basename !== $file ) {
302
-				$slug = explode( '/', $plugin_basename );
303
-				$slug = $slug[0];
304
-
305
-				return array(
306
-					'slug'      => $slug,
307
-					'basename'  => $plugin_basename,
308
-					'path'      => $file,
309
-					'url'       => self::verify_url_protocol( plugins_url( $plugin_basename ) ),
310
-					'real_path' => self::wp_normalize_path( dirname( realpath( $file ) ) ),
311
-				);
312
-			}
313
-
314
-			return false;
315
-		}
316
-
317
-		/**
318
-		 * Is Redux embedded in a theme?
319
-		 *
320
-		 * @param string $file File to check.
321
-		 *
322
-		 * @return array|bool
323
-		 */
324
-		public static function is_inside_theme( string $file = '' ) {
325
-
326
-			if ( ! self::file_in_theme( $file ) ) {
327
-				return false;
328
-			}
329
-
330
-			$theme_paths = array(
331
-				self::wp_normalize_path( get_template_directory() )   => get_template_directory_uri(),
332
-				// parent.
333
-				self::wp_normalize_path( get_stylesheet_directory() ) => get_stylesheet_directory_uri(),
334
-				// child.
335
-			);
336
-
337
-			$theme_paths = array_unique( $theme_paths );
338
-			$file_path   = self::wp_normalize_path( $file );
339
-
340
-			$filename = explode( DIRECTORY_SEPARATOR, $file );
341
-
342
-			end( $filename );
343
-
344
-			$filename = prev( $filename );
345
-
346
-			foreach ( $theme_paths as $theme_path => $url ) {
347
-				$real_path = self::wp_normalize_path( realpath( $theme_path ) );
348
-
349
-				if ( empty( $real_path ) ) {
350
-					continue;
351
-				}
352
-
353
-				if ( strpos( $file_path, $real_path ) !== false ) {
354
-					$slug             = explode( '/', $theme_path );
355
-					$slug             = end( $slug );
356
-					$relative_path    = explode( $slug . '/', dirname( $file_path ) );
357
-					$relative_path    = $relative_path[1];
358
-					$data             = array(
359
-						'slug'      => $slug,
360
-						'path'      => trailingslashit( trailingslashit( $theme_path ) . $relative_path ) . $filename,
361
-						'real_path' => trailingslashit( trailingslashit( $real_path ) . $relative_path ) . $filename,
362
-						'url'       => self::verify_url_protocol( trailingslashit( trailingslashit( $url ) . $relative_path ) . $filename ),
363
-						'basename'  => trailingslashit( $slug ) . trailingslashit( $relative_path ) . $filename,
364
-					);
365
-					$data['realpath'] = $data['real_path'];  // Shim for old extensions.
366
-
367
-					if ( count( $theme_paths ) > 1 ) {
368
-						$key = array_search( $theme_path, $theme_paths, true );
369
-
370
-						if ( false !== $key ) {
371
-							unset( $theme_paths[ $key ] );
372
-						}
373
-
374
-						$theme_paths_end = end( $theme_paths );
375
-						$parent_slug_end = explode( '/', $theme_paths_end );
376
-						$parent_slug_end = end( $parent_slug_end );
377
-
378
-						$data['parent_slug'] = $parent_slug_end;
379
-					}
380
-
381
-					return $data;
382
-				}
383
-			}
384
-
385
-			return false;
386
-		}
387
-
388
-		/**
389
-		 * Used to merge two deep arrays.
390
-		 *
391
-		 * @param array $a First array to deeply merge.
392
-		 * @param array $b Second array to deeply merge.
393
-		 *
394
-		 * @return    array - Deep merge of the two arrays.
395
-		 */
396
-		public static function nested_wp_parse_args( array &$a, array $b ): array {
397
-			$result = $b;
398
-
399
-			foreach ( $a as $k => &$v ) {
400
-				if ( is_array( $v ) && isset( $result[ $k ] ) ) {
401
-					$result[ $k ] = self::nested_wp_parse_args( $v, $result[ $k ] );
402
-				} else {
403
-					$result[ $k ] = $v;
404
-				}
405
-			}
406
-
407
-			return $result;
408
-		}
409
-
410
-		/**
411
-		 * AJAX callback key
412
-		 */
413
-		public static function hash_key(): string {
414
-			$key  = defined( 'AUTH_KEY' ) ? AUTH_KEY : get_site_url();
415
-			$key .= defined( 'SECURE_AUTH_KEY' ) ? SECURE_AUTH_KEY : '';
416
-
417
-			return $key;
418
-		}
419
-
420
-		/**
421
-		 * Register a class path to be autoloaded.
422
-		 * Registers a namespace to be autoloaded from a given path, using the
423
-		 * WordPress/HM-style filenames (`class-{name}.php`).
424
-		 *
425
-		 * @link https://engineering.hmn.md/standards/style/php/#file-naming
426
-		 *
427
-		 * @param string $prefix Prefix to autoload from.
428
-		 * @param string $path   Path to validate.
429
-		 */
430
-		public static function register_class_path( string $prefix = '', string $path = '' ) {
431
-			if ( ! class_exists( 'Redux_Autoloader' ) ) {
432
-				require_once Redux_Path::get_path( '/inc/classes/class-redux-autoloader.php' );
433
-			}
434
-
435
-			$loader = new Redux_Autoloader( $prefix, $path );
436
-
437
-			spl_autoload_register( array( $loader, 'load' ) );
438
-		}
439
-
440
-		/**
441
-		 * Check if a string starts with a string.
442
-		 *
443
-		 * @param string $haystack Full string.
444
-		 * @param string $needle   String to check if it starts with.
445
-		 *
446
-		 * @return bool
447
-		 */
448
-		public static function string_starts_with( string $haystack, string $needle ): bool {
449
-			$length = strlen( $needle );
450
-
451
-			return substr( $haystack, 0, $length ) === $needle;
452
-		}
453
-
454
-		/**
455
-		 * Check if a string ends with a string.
456
-		 *
457
-		 * @param string $haystack Full string.
458
-		 * @param string $needle   String to check if it starts with.
459
-		 *
460
-		 * @return bool
461
-		 */
462
-		public static function string_ends_with( string $haystack, string $needle ): bool {
463
-			$length = strlen( $needle );
464
-
465
-			if ( ! $length ) {
466
-				return true;
467
-			}
468
-
469
-			return substr( $haystack, - $length ) === $needle;
470
-		}
471
-
472
-		/**
473
-		 * Is plugin active.
474
-		 *
475
-		 * @param string $name Plugin name.
476
-		 *
477
-		 * @return bool
478
-		 */
479
-		public static function is_plugin_active( string $name ): bool {
480
-			if ( in_array( $name . '/' . $name . '.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ), true ) ) {
481
-				return true;
482
-			}
483
-
484
-			return false;
485
-		}
486
-	}
16
+    /**
17
+     * Redux Functions Class
18
+     * A Class of useful functions that can/should be shared among all Redux files.
19
+     *
20
+     * @since       3.0.0
21
+     */
22
+    class Redux_Functions_Ex {
23
+
24
+        /**
25
+         * What is this for?
26
+         *
27
+         * @var array
28
+         */
29
+        public static $args;
30
+
31
+        /**
32
+         * Enqueue Font Awesome.
33
+         *
34
+         * @return void
35
+         */
36
+        public static function enqueue_font_awesome() {
37
+            wp_enqueue_style(
38
+                'font-awesome',
39
+                Redux_Core::$url . 'assets/font-awesome/css/all' . Redux_Functions::is_min() . '.css',
40
+                array(),
41
+                '6.5.2'
42
+            );
43
+
44
+            wp_enqueue_style(
45
+                'font-awesome-4-shims',
46
+                Redux_Core::$url . 'assets/font-awesome/css/v4-shims' . Redux_Functions::is_min() . '.css',
47
+                array(),
48
+                '6.5.2'
49
+            );
50
+        }
51
+
52
+        /**
53
+         * Enqueue Elusive Font.
54
+         *
55
+         * @return void
56
+         */
57
+        public static function enqueue_elusive_font() {
58
+            wp_enqueue_style(
59
+                'redux-elusive-icon',
60
+                Redux_Core::$url . 'assets/css/vendor/elusive-icons' . Redux_Functions::is_min() . '.css',
61
+                array(),
62
+                '2.0.0'
63
+            );
64
+        }
65
+
66
+        /**
67
+         * Output alpha data tag for Iris alpha color picker, if enabled.
68
+         *
69
+         * @param array $data Data array.
70
+         *
71
+         * @return string
72
+         */
73
+        public static function output_alpha_data( array $data ): string {
74
+            $index = null;
75
+
76
+            extract( $data ); // phpcs:ignore WordPress.PHP.DontExtract
77
+
78
+            $value = false;
79
+
80
+            if ( isset( $field['color_alpha'] ) && $field['color_alpha'] ) {
81
+                if ( is_array( $field['color_alpha'] ) ) {
82
+                    $value = $field['color_alpha'][ $index ] ?? false;
83
+                } else {
84
+                    $value = $field['color_alpha'];
85
+                }
86
+            }
87
+
88
+            return 'data-alpha-enabled="' . (bool) esc_attr( $value ) . '"';
89
+        }
90
+
91
+        /**
92
+         * Parses the string into variables without the max_input_vars limitation.
93
+         *
94
+         * @param string $str String of data.
95
+         *
96
+         * @return  array|false $result
97
+         * @since   3.5.7.11
98
+         * @author  harunbasic
99
+         * @access  private
100
+         */
101
+        public static function parse_str( string $str ) {
102
+            if ( '' === $str ) {
103
+                return false;
104
+            }
105
+
106
+            $result = array();
107
+            $pairs  = explode( '&', $str );
108
+
109
+            foreach ( $pairs as $pair ) {
110
+                // use the original parse_str() on each element.
111
+                parse_str( $pair, $params );
112
+
113
+                $k = key( $params );
114
+
115
+                if ( ! isset( $result[ $k ] ) ) {
116
+                    $result += $params;
117
+                } elseif ( is_array( $result[ $k ] ) && is_array( $params[ $k ] ) ) {
118
+                    $result[ $k ] = self::array_merge_recursive_distinct( $result[ $k ], $params[ $k ] );
119
+                }
120
+            }
121
+
122
+            return $result;
123
+        }
124
+
125
+        /**
126
+         * Merge arrays without converting values with duplicate keys to arrays as array_merge_recursive does.
127
+         * As seen here http://php.net/manual/en/function.array-merge-recursive.php#92195
128
+         *
129
+         * @param array $array1 array one.
130
+         * @param array $array2 array two.
131
+         *
132
+         * @return  array $merged
133
+         * @since   3.5.7.11
134
+         * @author  harunbasic
135
+         * @access  private
136
+         */
137
+        public static function array_merge_recursive_distinct( array $array1, array $array2 ): array {
138
+            $merged = $array1;
139
+
140
+            foreach ( $array2 as $key => $value ) {
141
+
142
+                if ( is_array( $value ) && isset( $merged[ $key ] ) && is_array( $merged[ $key ] ) ) {
143
+                    $merged[ $key ] = self::array_merge_recursive_distinct( $merged[ $key ], $value );
144
+                } elseif ( is_numeric( $key ) && isset( $merged[ $key ] ) ) {
145
+                    $merged[] = $value;
146
+                } else {
147
+                    $merged[ $key ] = $value;
148
+                }
149
+            }
150
+
151
+            return $merged;
152
+        }
153
+
154
+        /**
155
+         * Records calling function.
156
+         *
157
+         * @param string $opt_name Panel opt_name.
158
+         */
159
+        public static function record_caller( string $opt_name = '' ) {
160
+            global $pagenow;
161
+
162
+            // phpcs:ignore WordPress.Security.NonceVerification
163
+            if ( ! ( 'options-general.php' === $pagenow && isset( $_GET['page'] ) && ( 'redux-framework' === $_GET['page'] || 'health-check' === $_GET['page'] ) ) ) {
164
+                return;
165
+            }
166
+
167
+            // phpcs:ignore WordPress.PHP.DevelopmentFunctions
168
+            $caller = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2 )[1]['file'];
169
+
170
+            if ( ! empty( $caller ) && ! empty( $opt_name ) && class_exists( 'Redux_Core' ) ) {
171
+                if ( ! isset( Redux_Core::$callers[ $opt_name ] ) ) {
172
+                    Redux_Core::$callers[ $opt_name ] = array();
173
+                }
174
+
175
+                if ( strpos( $caller, 'class-redux-' ) !== false || strpos( $caller, 'redux-core/framework.php' ) ) {
176
+                    return;
177
+                }
178
+
179
+                if ( ! in_array( $caller, Redux_Core::$callers[ $opt_name ], true ) ) {
180
+                    Redux_Core::$callers[ $opt_name ][] = $caller;
181
+                }
182
+
183
+                if ( ! empty( self::$args[ $opt_name ]['callers'] ) && ! in_array( $caller, self::$args[ $opt_name ]['callers'], true ) ) {
184
+                    self::$args[ $opt_name ]['callers'][] = $caller;
185
+                }
186
+            }
187
+        }
188
+
189
+        /**
190
+         * Normalize path.
191
+         *
192
+         * @param string $path Path to normalize.
193
+         *
194
+         * @return string|string[]|null
195
+         */
196
+        public static function wp_normalize_path( string $path = '' ) {
197
+            if ( function_exists( 'wp_normalize_path' ) ) {
198
+                $path = wp_normalize_path( $path );
199
+            } else {
200
+                // Shim for pre WP 3.9.
201
+                $path = str_replace( '\\', '/', $path );
202
+                $path = preg_replace( '|(?<=.)/+|', '/', $path );
203
+
204
+                if ( ':' === substr( $path, 1, 1 ) ) {
205
+                    $path = ucfirst( $path );
206
+                }
207
+            }
208
+
209
+            return $path;
210
+        }
211
+
212
+        /**
213
+         * Action to add generator tag to page HEAD.
214
+         */
215
+        public static function generator() {
216
+            add_action( 'wp_head', array( 'Redux_Functions_Ex', 'meta_tag' ) );
217
+        }
218
+
219
+
220
+        /**
221
+         * Callback for wp_head hook to add meta tag.
222
+         */
223
+        public static function meta_tag() {
224
+            echo '<meta name="generator" content="Redux ' . esc_html( Redux_Core::$version ) . '" />';
225
+        }
226
+
227
+        /**
228
+         * Run URL through a ssl check.
229
+         *
230
+         * @param string $url URL to check.
231
+         *
232
+         * @return string
233
+         */
234
+        public static function verify_url_protocol( string $url ): string {
235
+            // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated
236
+            $protocol = ! empty( $_SERVER['HTTPS'] ) && 'off' !== $_SERVER['HTTPS'] || ( ! empty( $_SERVER['SERVER_PORT'] ) && 443 === $_SERVER['SERVER_PORT'] ) ? 'https://' : 'http://';
237
+
238
+            if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated
239
+                $new_protocol = sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) . '://'; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated
240
+                if ( 'http://' === $protocol && $new_protocol !== $protocol && false === strpos( $url, $new_protocol ) ) {
241
+                    $url = str_replace( $protocol, $new_protocol, $url );
242
+                }
243
+            }
244
+
245
+            return $url;
246
+        }
247
+
248
+        /**
249
+         * Check s.
250
+         *
251
+         * @access public
252
+         * @return bool
253
+         * @since  4.0.0
254
+         */
255
+        public static function s(): bool {
256
+            if ( ! get_option( 'redux_p' . 'ro_lic' . 'ense_key', false ) ) { // phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found
257
+                $s = get_option( 'redux_p' . 'ro_l' . 'icense_status', false ); // phpcs:ignore Generic.Strings.UnnecessaryStringConcat.Found
258
+
259
+                if ( in_array( $s, array( 'valid', 'site_inactive' ), true ) ) {
260
+                    return true;
261
+                }
262
+            }
263
+
264
+            return false;
265
+        }
266
+
267
+        /**
268
+         * Is file in theme.
269
+         *
270
+         * @param string $file File to check.
271
+         *
272
+         * @return bool
273
+         */
274
+        public static function file_in_theme( string $file ): bool {
275
+            $file_path = self::wp_normalize_path( dirname( $file ) );
276
+
277
+            if ( strpos( $file_path, self::wp_normalize_path( get_template_directory() ) ) !== false ) {
278
+                return true;
279
+            } elseif ( strpos( $file_path, self::wp_normalize_path( get_stylesheet_directory() ) ) !== false ) {
280
+                return true;
281
+            }
282
+
283
+            return false;
284
+        }
285
+
286
+        /**
287
+         * Is Redux embedded inside a plugin?
288
+         *
289
+         * @param string $file File to check.
290
+         *
291
+         * @return array|bool
292
+         */
293
+        public static function is_inside_plugin( string $file ) {
294
+            $file            = self::wp_normalize_path( $file );
295
+            $plugin_basename = self::wp_normalize_path( plugin_basename( $file ) );
296
+
297
+            if ( self::file_in_theme( $file ) ) {
298
+                return false;
299
+            }
300
+
301
+            if ( $plugin_basename !== $file ) {
302
+                $slug = explode( '/', $plugin_basename );
303
+                $slug = $slug[0];
304
+
305
+                return array(
306
+                    'slug'      => $slug,
307
+                    'basename'  => $plugin_basename,
308
+                    'path'      => $file,
309
+                    'url'       => self::verify_url_protocol( plugins_url( $plugin_basename ) ),
310
+                    'real_path' => self::wp_normalize_path( dirname( realpath( $file ) ) ),
311
+                );
312
+            }
313
+
314
+            return false;
315
+        }
316
+
317
+        /**
318
+         * Is Redux embedded in a theme?
319
+         *
320
+         * @param string $file File to check.
321
+         *
322
+         * @return array|bool
323
+         */
324
+        public static function is_inside_theme( string $file = '' ) {
325
+
326
+            if ( ! self::file_in_theme( $file ) ) {
327
+                return false;
328
+            }
329
+
330
+            $theme_paths = array(
331
+                self::wp_normalize_path( get_template_directory() )   => get_template_directory_uri(),
332
+                // parent.
333
+                self::wp_normalize_path( get_stylesheet_directory() ) => get_stylesheet_directory_uri(),
334
+                // child.
335
+            );
336
+
337
+            $theme_paths = array_unique( $theme_paths );
338
+            $file_path   = self::wp_normalize_path( $file );
339
+
340
+            $filename = explode( DIRECTORY_SEPARATOR, $file );
341
+
342
+            end( $filename );
343
+
344
+            $filename = prev( $filename );
345
+
346
+            foreach ( $theme_paths as $theme_path => $url ) {
347
+                $real_path = self::wp_normalize_path( realpath( $theme_path ) );
348
+
349
+                if ( empty( $real_path ) ) {
350
+                    continue;
351
+                }
352
+
353
+                if ( strpos( $file_path, $real_path ) !== false ) {
354
+                    $slug             = explode( '/', $theme_path );
355
+                    $slug             = end( $slug );
356
+                    $relative_path    = explode( $slug . '/', dirname( $file_path ) );
357
+                    $relative_path    = $relative_path[1];
358
+                    $data             = array(
359
+                        'slug'      => $slug,
360
+                        'path'      => trailingslashit( trailingslashit( $theme_path ) . $relative_path ) . $filename,
361
+                        'real_path' => trailingslashit( trailingslashit( $real_path ) . $relative_path ) . $filename,
362
+                        'url'       => self::verify_url_protocol( trailingslashit( trailingslashit( $url ) . $relative_path ) . $filename ),
363
+                        'basename'  => trailingslashit( $slug ) . trailingslashit( $relative_path ) . $filename,
364
+                    );
365
+                    $data['realpath'] = $data['real_path'];  // Shim for old extensions.
366
+
367
+                    if ( count( $theme_paths ) > 1 ) {
368
+                        $key = array_search( $theme_path, $theme_paths, true );
369
+
370
+                        if ( false !== $key ) {
371
+                            unset( $theme_paths[ $key ] );
372
+                        }
373
+
374
+                        $theme_paths_end = end( $theme_paths );
375
+                        $parent_slug_end = explode( '/', $theme_paths_end );
376
+                        $parent_slug_end = end( $parent_slug_end );
377
+
378
+                        $data['parent_slug'] = $parent_slug_end;
379
+                    }
380
+
381
+                    return $data;
382
+                }
383
+            }
384
+
385
+            return false;
386
+        }
387
+
388
+        /**
389
+         * Used to merge two deep arrays.
390
+         *
391
+         * @param array $a First array to deeply merge.
392
+         * @param array $b Second array to deeply merge.
393
+         *
394
+         * @return    array - Deep merge of the two arrays.
395
+         */
396
+        public static function nested_wp_parse_args( array &$a, array $b ): array {
397
+            $result = $b;
398
+
399
+            foreach ( $a as $k => &$v ) {
400
+                if ( is_array( $v ) && isset( $result[ $k ] ) ) {
401
+                    $result[ $k ] = self::nested_wp_parse_args( $v, $result[ $k ] );
402
+                } else {
403
+                    $result[ $k ] = $v;
404
+                }
405
+            }
406
+
407
+            return $result;
408
+        }
409
+
410
+        /**
411
+         * AJAX callback key
412
+         */
413
+        public static function hash_key(): string {
414
+            $key  = defined( 'AUTH_KEY' ) ? AUTH_KEY : get_site_url();
415
+            $key .= defined( 'SECURE_AUTH_KEY' ) ? SECURE_AUTH_KEY : '';
416
+
417
+            return $key;
418
+        }
419
+
420
+        /**
421
+         * Register a class path to be autoloaded.
422
+         * Registers a namespace to be autoloaded from a given path, using the
423
+         * WordPress/HM-style filenames (`class-{name}.php`).
424
+         *
425
+         * @link https://engineering.hmn.md/standards/style/php/#file-naming
426
+         *
427
+         * @param string $prefix Prefix to autoload from.
428
+         * @param string $path   Path to validate.
429
+         */
430
+        public static function register_class_path( string $prefix = '', string $path = '' ) {
431
+            if ( ! class_exists( 'Redux_Autoloader' ) ) {
432
+                require_once Redux_Path::get_path( '/inc/classes/class-redux-autoloader.php' );
433
+            }
434
+
435
+            $loader = new Redux_Autoloader( $prefix, $path );
436
+
437
+            spl_autoload_register( array( $loader, 'load' ) );
438
+        }
439
+
440
+        /**
441
+         * Check if a string starts with a string.
442
+         *
443
+         * @param string $haystack Full string.
444
+         * @param string $needle   String to check if it starts with.
445
+         *
446
+         * @return bool
447
+         */
448
+        public static function string_starts_with( string $haystack, string $needle ): bool {
449
+            $length = strlen( $needle );
450
+
451
+            return substr( $haystack, 0, $length ) === $needle;
452
+        }
453
+
454
+        /**
455
+         * Check if a string ends with a string.
456
+         *
457
+         * @param string $haystack Full string.
458
+         * @param string $needle   String to check if it starts with.
459
+         *
460
+         * @return bool
461
+         */
462
+        public static function string_ends_with( string $haystack, string $needle ): bool {
463
+            $length = strlen( $needle );
464
+
465
+            if ( ! $length ) {
466
+                return true;
467
+            }
468
+
469
+            return substr( $haystack, - $length ) === $needle;
470
+        }
471
+
472
+        /**
473
+         * Is plugin active.
474
+         *
475
+         * @param string $name Plugin name.
476
+         *
477
+         * @return bool
478
+         */
479
+        public static function is_plugin_active( string $name ): bool {
480
+            if ( in_array( $name . '/' . $name . '.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ), true ) ) {
481
+                return true;
482
+            }
483
+
484
+            return false;
485
+        }
486
+    }
487 487
 }
Please login to merge, or discard this patch.
Spacing   +20 added lines, -20 removed lines patch added patch discarded remove patch
@@ -79,13 +79,13 @@  discard block
 block discarded – undo
79 79
 
80 80
 			if ( isset( $field['color_alpha'] ) && $field['color_alpha'] ) {
81 81
 				if ( is_array( $field['color_alpha'] ) ) {
82
-					$value = $field['color_alpha'][ $index ] ?? false;
82
+					$value = $field['color_alpha'][$index] ?? false;
83 83
 				} else {
84 84
 					$value = $field['color_alpha'];
85 85
 				}
86 86
 			}
87 87
 
88
-			return 'data-alpha-enabled="' . (bool) esc_attr( $value ) . '"';
88
+			return 'data-alpha-enabled="' . ( bool ) esc_attr( $value ) . '"';
89 89
 		}
90 90
 
91 91
 		/**
@@ -112,10 +112,10 @@  discard block
 block discarded – undo
112 112
 
113 113
 				$k = key( $params );
114 114
 
115
-				if ( ! isset( $result[ $k ] ) ) {
115
+				if ( ! isset( $result[$k] ) ) {
116 116
 					$result += $params;
117
-				} elseif ( is_array( $result[ $k ] ) && is_array( $params[ $k ] ) ) {
118
-					$result[ $k ] = self::array_merge_recursive_distinct( $result[ $k ], $params[ $k ] );
117
+				} elseif ( is_array( $result[$k] ) && is_array( $params[$k] ) ) {
118
+					$result[$k] = self::array_merge_recursive_distinct( $result[$k], $params[$k] );
119 119
 				}
120 120
 			}
121 121
 
@@ -139,12 +139,12 @@  discard block
 block discarded – undo
139 139
 
140 140
 			foreach ( $array2 as $key => $value ) {
141 141
 
142
-				if ( is_array( $value ) && isset( $merged[ $key ] ) && is_array( $merged[ $key ] ) ) {
143
-					$merged[ $key ] = self::array_merge_recursive_distinct( $merged[ $key ], $value );
144
-				} elseif ( is_numeric( $key ) && isset( $merged[ $key ] ) ) {
142
+				if ( is_array( $value ) && isset( $merged[$key] ) && is_array( $merged[$key] ) ) {
143
+					$merged[$key] = self::array_merge_recursive_distinct( $merged[$key], $value );
144
+				} elseif ( is_numeric( $key ) && isset( $merged[$key] ) ) {
145 145
 					$merged[] = $value;
146 146
 				} else {
147
-					$merged[ $key ] = $value;
147
+					$merged[$key] = $value;
148 148
 				}
149 149
 			}
150 150
 
@@ -168,20 +168,20 @@  discard block
 block discarded – undo
168 168
 			$caller = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2 )[1]['file'];
169 169
 
170 170
 			if ( ! empty( $caller ) && ! empty( $opt_name ) && class_exists( 'Redux_Core' ) ) {
171
-				if ( ! isset( Redux_Core::$callers[ $opt_name ] ) ) {
172
-					Redux_Core::$callers[ $opt_name ] = array();
171
+				if ( ! isset( Redux_Core::$callers[$opt_name] ) ) {
172
+					Redux_Core::$callers[$opt_name] = array();
173 173
 				}
174 174
 
175 175
 				if ( strpos( $caller, 'class-redux-' ) !== false || strpos( $caller, 'redux-core/framework.php' ) ) {
176 176
 					return;
177 177
 				}
178 178
 
179
-				if ( ! in_array( $caller, Redux_Core::$callers[ $opt_name ], true ) ) {
180
-					Redux_Core::$callers[ $opt_name ][] = $caller;
179
+				if ( ! in_array( $caller, Redux_Core::$callers[$opt_name], true ) ) {
180
+					Redux_Core::$callers[$opt_name][] = $caller;
181 181
 				}
182 182
 
183
-				if ( ! empty( self::$args[ $opt_name ]['callers'] ) && ! in_array( $caller, self::$args[ $opt_name ]['callers'], true ) ) {
184
-					self::$args[ $opt_name ]['callers'][] = $caller;
183
+				if ( ! empty( self::$args[$opt_name]['callers'] ) && ! in_array( $caller, self::$args[$opt_name]['callers'], true ) ) {
184
+					self::$args[$opt_name]['callers'][] = $caller;
185 185
 				}
186 186
 			}
187 187
 		}
@@ -362,13 +362,13 @@  discard block
 block discarded – undo
362 362
 						'url'       => self::verify_url_protocol( trailingslashit( trailingslashit( $url ) . $relative_path ) . $filename ),
363 363
 						'basename'  => trailingslashit( $slug ) . trailingslashit( $relative_path ) . $filename,
364 364
 					);
365
-					$data['realpath'] = $data['real_path'];  // Shim for old extensions.
365
+					$data['realpath'] = $data['real_path']; // Shim for old extensions.
366 366
 
367 367
 					if ( count( $theme_paths ) > 1 ) {
368 368
 						$key = array_search( $theme_path, $theme_paths, true );
369 369
 
370 370
 						if ( false !== $key ) {
371
-							unset( $theme_paths[ $key ] );
371
+							unset( $theme_paths[$key] );
372 372
 						}
373 373
 
374 374
 						$theme_paths_end = end( $theme_paths );
@@ -397,10 +397,10 @@  discard block
 block discarded – undo
397 397
 			$result = $b;
398 398
 
399 399
 			foreach ( $a as $k => &$v ) {
400
-				if ( is_array( $v ) && isset( $result[ $k ] ) ) {
401
-					$result[ $k ] = self::nested_wp_parse_args( $v, $result[ $k ] );
400
+				if ( is_array( $v ) && isset( $result[$k] ) ) {
401
+					$result[$k] = self::nested_wp_parse_args( $v, $result[$k] );
402 402
 				} else {
403
-					$result[ $k ] = $v;
403
+					$result[$k] = $v;
404 404
 				}
405 405
 			}
406 406
 
Please login to merge, or discard this patch.
redux-core/inc/classes/class-redux-options-constructor.php 2 patches
Spacing   +78 added lines, -78 removed lines patch added patch discarded remove patch
@@ -76,8 +76,8 @@  discard block
 block discarded – undo
76 76
 			foreach ( $sections as $key => $section ) {
77 77
 				if ( 'fields' === $key ) {
78 78
 					foreach ( $section as $field ) {
79
-						if ( ! empty( $field['id'] ) && ! empty( $field['data'] ) && ! empty( $options_values[ $field['id'] ] ) && Redux_Helpers::is_integer( $options_values[ $field['id'] ] ) ) {
80
-							$options_values[ $field['id'] ] = apply_filters( 'wpml_object_id', $options_values[ $field['id'] ], $field['data'], true );
79
+						if ( ! empty( $field['id'] ) && ! empty( $field['data'] ) && ! empty( $options_values[$field['id']] ) && Redux_Helpers::is_integer( $options_values[$field['id']] ) ) {
80
+							$options_values[$field['id']] = apply_filters( 'wpml_object_id', $options_values[$field['id']], $field['data'], true );
81 81
 						}
82 82
 					}
83 83
 				} elseif ( is_array( $section ) && ! empty( $section ) ) {
@@ -188,10 +188,10 @@  discard block
 block discarded – undo
188 188
 				// Store the changed values in the transient.
189 189
 				if ( $value !== $core->options ) {
190 190
 					foreach ( $value as $k => $v ) {
191
-						if ( ! isset( $core->options[ $k ] ) ) {
192
-							$core->options[ $k ] = '';
193
-						} elseif ( $v === $core->options[ $k ] ) {
194
-							unset( $core->options[ $k ] );
191
+						if ( ! isset( $core->options[$k] ) ) {
192
+							$core->options[$k] = '';
193
+						} elseif ( $v === $core->options[$k] ) {
194
+							unset( $core->options[$k] );
195 195
 						}
196 196
 					}
197 197
 
@@ -227,7 +227,7 @@  discard block
 block discarded – undo
227 227
 				 */
228 228
 
229 229
 				// phpcs:ignore WordPress.NamingConventions.ValidHookName
230
-				$GLOBALS[ $options_global ] = apply_filters( "redux/options/{$core->args['opt_name']}/global_variable", $core->options );
230
+				$GLOBALS[$options_global] = apply_filters( "redux/options/{$core->args['opt_name']}/global_variable", $core->options );
231 231
 			}
232 232
 		}
233 233
 
@@ -291,7 +291,7 @@  discard block
 block discarded – undo
291 291
 				}
292 292
 
293 293
 				if ( empty( $section ) ) {
294
-					unset( $core->sections[ $k ] );
294
+					unset( $core->sections[$k] );
295 295
 					continue;
296 296
 				}
297 297
 
@@ -301,7 +301,7 @@  discard block
 block discarded – undo
301 301
 
302 302
 				if ( isset( $section['customizer_only'] ) && true === $section['customizer_only'] ) {
303 303
 					$section['panel']     = false;
304
-					$core->sections[ $k ] = $section;
304
+					$core->sections[$k] = $section;
305 305
 				}
306 306
 
307 307
 				$heading = $section['heading'] ?? $section['title'];
@@ -315,10 +315,10 @@  discard block
 block discarded – undo
315 315
 
316 316
 							if ( ! in_array( $field_type, array( 'section', 'divide', 'info', 'raw' ), true ) ) {
317 317
 								$field_id = $field_data['id'];
318
-								$default  = $core->options_defaults[ $field_id ] ?? '';
319
-								$data     = $core->options[ $field_id ] ?? $default;
318
+								$default  = $core->options_defaults[$field_id] ?? '';
319
+								$data     = $core->options[$field_id] ?? $default;
320 320
 
321
-								$this->hidden_perm_fields[ $field_id ] = $data;
321
+								$this->hidden_perm_fields[$field_id] = $data;
322 322
 							}
323 323
 						}
324 324
 
@@ -327,7 +327,7 @@  discard block
 block discarded – undo
327 327
 				}
328 328
 
329 329
 				if ( ! $display || ! function_exists( 'add_settings_section' ) ) {
330
-					$this->no_panel_section[ $k ] = $section;
330
+					$this->no_panel_section[$k] = $section;
331 331
 				} else {
332 332
 					add_settings_section(
333 333
 						$core->args['opt_name'] . $k . '_section',
@@ -351,11 +351,11 @@  discard block
 block discarded – undo
351 351
 							$field['type']                             = 'raw';
352 352
 							$field['content']                          = $field['desc'];
353 353
 							$field['desc']                             = '';
354
-							$core->sections[ $k ]['fields'][ $fieldk ] = $field;
354
+							$core->sections[$k]['fields'][$fieldk] = $field;
355 355
 						} elseif ( 'info' === $field['type'] ) {
356 356
 							if ( ! isset( $field['full_width'] ) ) {
357 357
 								$field['full_width']                       = true;
358
-								$core->sections[ $k ]['fields'][ $fieldk ] = $field;
358
+								$core->sections[$k]['fields'][$fieldk] = $field;
359 359
 							}
360 360
 						}
361 361
 
@@ -366,7 +366,7 @@  discard block
 block discarded – undo
366 366
 							} elseif ( ! isset( $field['full_width'] ) ) {
367 367
 								$field['full_width'] = true;
368 368
 							}
369
-							$core->sections[ $k ]['fields'][ $fieldk ] = $field;
369
+							$core->sections[$k]['fields'][$fieldk] = $field;
370 370
 						}
371 371
 
372 372
 						/**
@@ -378,9 +378,9 @@  discard block
 block discarded – undo
378 378
 						// phpcs:ignore WordPress.NamingConventions.ValidHookName
379 379
 						$field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}/register", $field );
380 380
 
381
-						$core->field_types[ $field['type'] ] = $core->field_types[ $field['type'] ] ?? array();
381
+						$core->field_types[$field['type']] = $core->field_types[$field['type']] ?? array();
382 382
 
383
-						$core->field_sections[ $field['type'] ][ $field['id'] ] = $k;
383
+						$core->field_sections[$field['type']][$field['id']] = $k;
384 384
 
385 385
 						$display = true;
386 386
 
@@ -395,14 +395,14 @@  discard block
 block discarded – undo
395 395
 
396 396
 						if ( isset( $section['customizer'] ) ) {
397 397
 							$field['customizer']                       = $section['customizer'];
398
-							$core->sections[ $k ]['fields'][ $fieldk ] = $field;
398
+							$core->sections[$k]['fields'][$fieldk] = $field;
399 399
 						}
400 400
 
401 401
 						if ( isset( $field['permissions'] ) && false !== $field['permissions'] ) {
402 402
 							if ( ! Redux_Helpers::current_user_can( $field['permissions'] ) ) {
403
-								$data = $core->options[ $field['id'] ] ?? $core->options_defaults[ $field['id'] ];
403
+								$data = $core->options[$field['id']] ?? $core->options_defaults[$field['id']];
404 404
 
405
-								$this->hidden_perm_fields[ $field['id'] ] = $data;
405
+								$this->hidden_perm_fields[$field['id']] = $data;
406 406
 
407 407
 								continue;
408 408
 							}
@@ -436,79 +436,79 @@  discard block
 block discarded – undo
436 436
 						$field['name'] = $core->args['opt_name'] . '[' . $field['id'] . ']';
437 437
 
438 438
 						// Set the default value if present.
439
-						$core->options_defaults[ $field['id'] ] = $core->options_defaults[ $field['id'] ] ?? '';
439
+						$core->options_defaults[$field['id']] = $core->options_defaults[$field['id']] ?? '';
440 440
 
441 441
 						// Set the defaults to the value if not present.
442 442
 						$do_update = false;
443 443
 
444 444
 						// Check fields for values in the default parameter.
445
-						if ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['default'] ) ) {
446
-							$core->options_defaults[ $field['id'] ] = $field['default'];
447
-							$core->options[ $field['id'] ]          = $field['default'];
445
+						if ( ! isset( $core->options[$field['id']] ) && isset( $field['default'] ) ) {
446
+							$core->options_defaults[$field['id']] = $field['default'];
447
+							$core->options[$field['id']]          = $field['default'];
448 448
 							$do_update                              = true;
449 449
 
450 450
 							// Check fields that hae no default value, but an option value with settings to
451 451
 							// be saved by default.
452
-						} elseif ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['options'] ) ) {
452
+						} elseif ( ! isset( $core->options[$field['id']] ) && isset( $field['options'] ) ) {
453 453
 
454 454
 							// If a sorter field, check for options and save them as defaults.
455 455
 							if ( 'sorter' === $field['type'] || 'sortable' === $field['type'] ) {
456
-								$core->options_defaults[ $field['id'] ] = $field['options'];
457
-								$core->options[ $field['id'] ]          = $field['options'];
456
+								$core->options_defaults[$field['id']] = $field['options'];
457
+								$core->options[$field['id']]          = $field['options'];
458 458
 								$do_update                              = true;
459 459
 							}
460 460
 						}
461 461
 
462 462
 						// CORRECT URLS if media URLs are wrong, but attachment IDs are present.
463 463
 						if ( 'media' === $field['type'] ) {
464
-							if ( isset( $core->options[ $field['id'] ]['id'] ) && isset( $core->options[ $field['id'] ]['url'] ) && ! empty( $core->options[ $field['id'] ]['url'] ) && strpos( $core->options[ $field['id'] ]['url'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) {
465
-								$data = wp_get_attachment_url( $core->options[ $field['id'] ]['id'] );
464
+							if ( isset( $core->options[$field['id']]['id'] ) && isset( $core->options[$field['id']]['url'] ) && ! empty( $core->options[$field['id']]['url'] ) && strpos( $core->options[$field['id']]['url'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) {
465
+								$data = wp_get_attachment_url( $core->options[$field['id']]['id'] );
466 466
 
467 467
 								if ( isset( $data ) && ! empty( $data ) ) {
468
-									$core->options[ $field['id'] ]['url'] = $data;
468
+									$core->options[$field['id']]['url'] = $data;
469 469
 
470 470
 									$data = wp_get_attachment_image_src(
471
-										$core->options[ $field['id'] ]['id'],
471
+										$core->options[$field['id']]['id'],
472 472
 										array(
473 473
 											150,
474 474
 											150,
475 475
 										)
476 476
 									);
477 477
 
478
-									$core->options[ $field['id'] ]['thumbnail'] = $data[0];
478
+									$core->options[$field['id']]['thumbnail'] = $data[0];
479 479
 									$do_update                                  = true;
480 480
 								}
481 481
 							}
482 482
 						}
483 483
 
484 484
 						if ( 'background' === $field['type'] ) {
485
-							if ( isset( $core->options[ $field['id'] ]['media']['id'] ) && isset( $core->options[ $field['id'] ]['background-image'] ) && ! empty( $core->options[ $field['id'] ]['background-image'] ) && strpos( $core->options[ $field['id'] ]['background-image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) {
486
-								$data = wp_get_attachment_url( $core->options[ $field['id'] ]['media']['id'] );
485
+							if ( isset( $core->options[$field['id']]['media']['id'] ) && isset( $core->options[$field['id']]['background-image'] ) && ! empty( $core->options[$field['id']]['background-image'] ) && strpos( $core->options[$field['id']]['background-image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) {
486
+								$data = wp_get_attachment_url( $core->options[$field['id']]['media']['id'] );
487 487
 
488 488
 								if ( isset( $data ) && ! empty( $data ) ) {
489
-									$core->options[ $field['id'] ]['background-image'] = $data;
489
+									$core->options[$field['id']]['background-image'] = $data;
490 490
 
491 491
 									$data = wp_get_attachment_image_src(
492
-										$core->options[ $field['id'] ]['media']['id'],
492
+										$core->options[$field['id']]['media']['id'],
493 493
 										array(
494 494
 											150,
495 495
 											150,
496 496
 										)
497 497
 									);
498 498
 
499
-									$core->options[ $field['id'] ]['media']['thumbnail'] = $data[0];
499
+									$core->options[$field['id']]['media']['thumbnail'] = $data[0];
500 500
 									$do_update = true;
501 501
 								}
502 502
 							}
503 503
 						}
504 504
 
505 505
 						if ( 'slides' === $field['type'] ) {
506
-							if ( isset( $core->options[ $field['id'] ] ) && is_array( $core->options[ $field['id'] ] ) && isset( $core->options[ $field['id'] ][0]['attachment_id'] ) && isset( $core->options[ $field['id'] ][0]['image'] ) && ! empty( $core->options[ $field['id'] ][0]['image'] ) && strpos( $core->options[ $field['id'] ][0]['image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) {
507
-								foreach ( $core->options[ $field['id'] ] as $key => $val ) {
506
+							if ( isset( $core->options[$field['id']] ) && is_array( $core->options[$field['id']] ) && isset( $core->options[$field['id']][0]['attachment_id'] ) && isset( $core->options[$field['id']][0]['image'] ) && ! empty( $core->options[$field['id']][0]['image'] ) && strpos( $core->options[$field['id']][0]['image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) {
507
+								foreach ( $core->options[$field['id']] as $key => $val ) {
508 508
 									$data = wp_get_attachment_url( $val['attachment_id'] );
509 509
 
510 510
 									if ( isset( $data ) && ! empty( $data ) ) {
511
-										$core->options[ $field['id'] ][ $key ]['image'] = $data;
511
+										$core->options[$field['id']][$key]['image'] = $data;
512 512
 
513 513
 										$data = wp_get_attachment_image_src(
514 514
 											$val['attachment_id'],
@@ -518,7 +518,7 @@  discard block
 block discarded – undo
518 518
 											)
519 519
 										);
520 520
 
521
-										$core->options[ $field['id'] ][ $key ]['thumb'] = $data[0];
521
+										$core->options[$field['id']][$key]['thumb'] = $data[0];
522 522
 										$do_update                                      = true;
523 523
 									}
524 524
 								}
@@ -545,21 +545,21 @@  discard block
 block discarded – undo
545 545
 						$field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}", $field );
546 546
 
547 547
 						if ( empty( $field ) ) {
548
-							unset( $core->sections[ $k ]['fields'][ $fieldk ] );
548
+							unset( $core->sections[$k]['fields'][$fieldk] );
549 549
 							continue;
550 550
 						}
551 551
 
552
-						if ( ! empty( Redux_Core::$folds[ $field['id'] ]['parent'] ) ) { // This has some fold items, hide it by default.
552
+						if ( ! empty( Redux_Core::$folds[$field['id']]['parent'] ) ) { // This has some fold items, hide it by default.
553 553
 							$field['class'] .= ' fold';
554 554
 						}
555 555
 
556
-						if ( ! empty( Redux_Core::$folds[ $field['id'] ]['children'] ) ) { // Sets the values you shoe fold children on.
556
+						if ( ! empty( Redux_Core::$folds[$field['id']]['children'] ) ) { // Sets the values you shoe fold children on.
557 557
 							$field['class'] .= ' fold-parent';
558 558
 						}
559 559
 
560 560
 						if ( ! empty( $field['compiler'] ) ) {
561 561
 							$field['class']                       .= ' compiler';
562
-							$core->compiler_fields[ $field['id'] ] = 1;
562
+							$core->compiler_fields[$field['id']] = 1;
563 563
 						}
564 564
 
565 565
 						if ( isset( $field['unit'] ) && ! isset( $field['units'] ) ) {
@@ -567,11 +567,11 @@  discard block
 block discarded – undo
567 567
 							unset( $field['unit'] );
568 568
 						}
569 569
 
570
-						$core->sections[ $k ]['fields'][ $fieldk ] = $field;
570
+						$core->sections[$k]['fields'][$fieldk] = $field;
571 571
 
572 572
 						if ( isset( $core->args['display_source'] ) ) {
573 573
 							// phpcs:ignore WordPress.PHP.DevelopmentFunctions
574
-							$th .= '<div id="' . $field['id'] . '-settings" style="display:none;"><pre>' . var_export( $core->sections[ $k ]['fields'][ $fieldk ], true ) . '</pre></div>';
574
+							$th .= '<div id="' . $field['id'] . '-settings" style="display:none;"><pre>' . var_export( $core->sections[$k]['fields'][$fieldk], true ) . '</pre></div>';
575 575
 							$th .= '<br /><a href="#TB_inline?width=600&height=800&inlineId=' . $field['id'] . '-settings" class="thickbox"><small>View Source</small></a>';
576 576
 						}
577 577
 
@@ -583,9 +583,9 @@  discard block
 block discarded – undo
583 583
 						do_action( "redux/options/{$core->args['opt_name']}/field/{$field['type']}/register", $field );
584 584
 
585 585
 						$core->required_class->check_dependencies( $field );
586
-						$core->field_head[ $field['id'] ] = $th;
586
+						$core->field_head[$field['id']] = $th;
587 587
 
588
-						if ( ! $display || isset( $this->no_panel_section[ $k ] ) ) {
588
+						if ( ! $display || isset( $this->no_panel_section[$k] ) ) {
589 589
 							$this->no_panel[] = $field['id'];
590 590
 						} else {
591 591
 							if ( isset( $field['disabled'] ) && $field['disabled'] ) {
@@ -718,7 +718,7 @@  discard block
 block discarded – undo
718 718
 			if ( isset( $plugin_options['redux-no_panel'] ) ) {
719 719
 				$keys = explode( '|', $plugin_options['redux-no_panel'] );
720 720
 				foreach ( $keys as $key ) {
721
-					$plugin_options[ $key ] = $core->options[ $key ];
721
+					$plugin_options[$key] = $core->options[$key];
722 722
 				}
723 723
 				if ( isset( $plugin_options['redux-no_panel'] ) ) {
724 724
 					unset( $plugin_options['redux-no_panel'] );
@@ -727,7 +727,7 @@  discard block
 block discarded – undo
727 727
 
728 728
 			if ( is_array( $this->hidden_perm_fields ) && ! empty( $this->hidden_perm_fields ) ) {
729 729
 				foreach ( $this->hidden_perm_fields as $id => $data ) {
730
-					$plugin_options[ $id ] = $data;
730
+					$plugin_options[$id] = $data;
731 731
 				}
732 732
 			}
733 733
 
@@ -755,9 +755,9 @@  discard block
 block discarded – undo
755 755
 			if ( is_array( $imported_options ) && ! empty( $imported_options ) && isset( $imported_options['redux-backup'] ) && ( 1 === $imported_options['redux-backup'] || '1' === $imported_options['redux-backup'] ) ) {
756 756
 				$core->transients['changed_values'] = array();
757 757
 				foreach ( $plugin_options as $key => $value ) {
758
-					if ( isset( $imported_options[ $key ] ) && $value !== $imported_options[ $key ] ) {
759
-						$plugin_options[ $key ]                     = $value;
760
-						$core->transients['changed_values'][ $key ] = $value;
758
+					if ( isset( $imported_options[$key] ) && $value !== $imported_options[$key] ) {
759
+						$plugin_options[$key]                     = $value;
760
+						$core->transients['changed_values'][$key] = $value;
761 761
 					}
762 762
 				}
763 763
 
@@ -778,7 +778,7 @@  discard block
 block discarded – undo
778 778
 				);
779 779
 
780 780
 				setcookie( 'redux_current_tab_' . $core->args['opt_name'], '', 1, '/', $time + 1000, '/' );
781
-				$_COOKIE[ 'redux_current_tab_' . $core->args['opt_name'] ] = 1;
781
+				$_COOKIE['redux_current_tab_' . $core->args['opt_name']] = 1;
782 782
 
783 783
 				unset( $plugin_options['defaults'], $plugin_options['compiler'], $plugin_options['import'], $plugin_options['import_code'] );
784 784
 				if ( in_array( $core->args['database'], array( 'transient', 'theme_mods', 'theme_mods_expanded', 'network' ), true ) ) {
@@ -816,8 +816,8 @@  discard block
 block discarded – undo
816 816
 				}
817 817
 
818 818
 				foreach ( $core->options as $key => $value ) {
819
-					if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
820
-						$core->transients['changed_values'][ $key ] = $value;
819
+					if ( isset( $plugin_options[$key] ) && $plugin_options[$key] !== $value ) {
820
+						$core->transients['changed_values'][$key] = $value;
821 821
 					}
822 822
 				}
823 823
 
@@ -831,21 +831,21 @@  discard block
 block discarded – undo
831 831
 
832 832
 			// Section reset to default.
833 833
 			if ( ! empty( $plugin_options['defaults-section'] ) ) {
834
-				if ( isset( $plugin_options['redux-section'] ) && isset( $core->sections[ $plugin_options['redux-section'] ]['fields'] ) ) {
834
+				if ( isset( $plugin_options['redux-section'] ) && isset( $core->sections[$plugin_options['redux-section']]['fields'] ) ) {
835 835
 					if ( empty( $core->options_defaults ) ) {
836 836
 						$core->options_defaults = $core->_default_values();
837 837
 					}
838 838
 
839
-					foreach ( $core->sections[ $plugin_options['redux-section'] ]['fields'] as $field ) {
839
+					foreach ( $core->sections[$plugin_options['redux-section']]['fields'] as $field ) {
840 840
 						if ( 'tabbed' === $field['type'] ) {
841 841
 							if ( ! empty( $field['tabs'] ) ) {
842 842
 								foreach ( $field['tabs'] as $val ) {
843 843
 									if ( ! empty( $val['fields'] ) ) {
844 844
 										foreach ( $val['fields'] as $f ) {
845
-											if ( isset( $core->options_defaults[ $f['id'] ] ) ) {
846
-												$plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ];
845
+											if ( isset( $core->options_defaults[$f['id']] ) ) {
846
+												$plugin_options[$f['id']] = $core->options_defaults[$f['id']];
847 847
 											} else {
848
-												$plugin_options[ $f['id'] ] = '';
848
+												$plugin_options[$f['id']] = '';
849 849
 											}
850 850
 										}
851 851
 									}
@@ -854,18 +854,18 @@  discard block
 block discarded – undo
854 854
 						} elseif ( 'repeater' === $field['type'] ) {
855 855
 							if ( ! empty( $field['fields'] ) ) {
856 856
 								foreach ( $field['fields'] as $f ) {
857
-									if ( isset( $core->options_defaults[ $f['id'] ] ) ) {
858
-										$plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ];
857
+									if ( isset( $core->options_defaults[$f['id']] ) ) {
858
+										$plugin_options[$f['id']] = $core->options_defaults[$f['id']];
859 859
 									} else {
860
-										$plugin_options[ $f['id'] ] = '';
860
+										$plugin_options[$f['id']] = '';
861 861
 									}
862 862
 								}
863 863
 							}
864 864
 						} else {
865
-							if ( isset( $core->options_defaults[ $field['id'] ] ) ) {
866
-								$plugin_options[ $field['id'] ] = $core->options_defaults[ $field['id'] ];
865
+							if ( isset( $core->options_defaults[$field['id']] ) ) {
866
+								$plugin_options[$field['id']] = $core->options_defaults[$field['id']];
867 867
 							} else {
868
-								$plugin_options[ $field['id'] ] = '';
868
+								$plugin_options[$field['id']] = '';
869 869
 							}
870 870
 						}
871 871
 
@@ -887,8 +887,8 @@  discard block
 block discarded – undo
887 887
 				$core->transients['changed_values'] = array();
888 888
 
889 889
 				foreach ( $core->options as $key => $value ) {
890
-					if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
891
-						$core->transients['changed_values'][ $key ] = $value;
890
+					if ( isset( $plugin_options[$key] ) && $plugin_options[$key] !== $value ) {
891
+						$core->transients['changed_values'][$key] = $value;
892 892
 					}
893 893
 				}
894 894
 
@@ -962,8 +962,8 @@  discard block
 block discarded – undo
962 962
 
963 963
 			if ( ! empty( $core->options ) ) {
964 964
 				foreach ( $core->options as $key => $value ) {
965
-					if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
966
-						$core->transients['changed_values'][ $key ] = $value;
965
+					if ( isset( $plugin_options[$key] ) && $plugin_options[$key] !== $value ) {
966
+						$core->transients['changed_values'][$key] = $value;
967 967
 					}
968 968
 				}
969 969
 			}
@@ -1003,7 +1003,7 @@  discard block
 block discarded – undo
1003 1003
 					$this->default_values(); // fill cache.
1004 1004
 				}
1005 1005
 
1006
-				return array_key_exists( $opt_name, $this->options_defaults ) ? $this->options_defaults[ $opt_name ] : $defaults;
1006
+				return array_key_exists( $opt_name, $this->options_defaults ) ? $this->options_defaults[$opt_name] : $defaults;
1007 1007
 			}
1008 1008
 
1009 1009
 			return '';
@@ -1027,11 +1027,11 @@  discard block
 block discarded – undo
1027 1027
 			$defaults = $this->options_defaults;
1028 1028
 			$value    = '';
1029 1029
 
1030
-			if ( isset( $defaults[ $key ] ) ) {
1031
-				if ( false !== $array_key && isset( $defaults[ $key ][ $array_key ] ) ) {
1032
-					$value = $defaults[ $key ][ $array_key ];
1030
+			if ( isset( $defaults[$key] ) ) {
1031
+				if ( false !== $array_key && isset( $defaults[$key][$array_key] ) ) {
1032
+					$value = $defaults[$key][$array_key];
1033 1033
 				} else {
1034
-					$value = $defaults[ $key ];
1034
+					$value = $defaults[$key];
1035 1035
 				}
1036 1036
 			}
1037 1037
 
Please login to merge, or discard this patch.
Indentation   +1030 added lines, -1030 removed lines patch added patch discarded remove patch
@@ -12,1034 +12,1034 @@
 block discarded – undo
12 12
 
13 13
 if ( ! class_exists( 'Redux_Options_Constructor', false ) ) {
14 14
 
15
-	/**
16
-	 * Class Redux_Options
17
-	 */
18
-	class Redux_Options_Constructor extends Redux_Class {
19
-
20
-		/**
21
-		 * Array to hold single panel data.
22
-		 *
23
-		 * @var array
24
-		 */
25
-		public array $no_panel = array();
26
-
27
-		/**
28
-		 * Array to hold single panel sections.
29
-		 *
30
-		 * @var array
31
-		 */
32
-		private array $no_panel_section = array();
33
-
34
-		/**
35
-		 * Array to hold hidden fields.
36
-		 *
37
-		 * @var array
38
-		 */
39
-		private array $hidden_perm_fields = array();
40
-
41
-		/**
42
-		 * Array to hold hidden sections.
43
-		 *
44
-		 * @var array
45
-		 */
46
-		public array $hidden_perm_sections = array();
47
-
48
-		/**
49
-		 * Array to hold default options.
50
-		 *
51
-		 * @var array
52
-		 */
53
-		private array $options_defaults = array();
54
-
55
-		/**
56
-		 * Redux_Options constructor.
57
-		 *
58
-		 * @param object $redux ReduxFramework pointer.
59
-		 */
60
-		public function __construct( $redux ) {
61
-			parent::__construct( $redux );
62
-
63
-			add_action( 'admin_init', array( $this, 'register' ) );
64
-		}
65
-
66
-		/**
67
-		 * If we switch language in wpml the id of the post/page selected will be in the wrong language
68
-		 * So it won't appear as selected in the list of options and will be lost on next save, this fixes this by translating this id
69
-		 * Bonus it also gives the user the id of the post in the right language when they retrieve it.
70
-		 * The recursion allows for it to work in a repeatable field.
71
-		 *
72
-		 * @param array $sections       Sections array.
73
-		 * @param array $options_values Values array.
74
-		 */
75
-		private function translate_data_field_recursive( array $sections, array &$options_values ) {
76
-			foreach ( $sections as $key => $section ) {
77
-				if ( 'fields' === $key ) {
78
-					foreach ( $section as $field ) {
79
-						if ( ! empty( $field['id'] ) && ! empty( $field['data'] ) && ! empty( $options_values[ $field['id'] ] ) && Redux_Helpers::is_integer( $options_values[ $field['id'] ] ) ) {
80
-							$options_values[ $field['id'] ] = apply_filters( 'wpml_object_id', $options_values[ $field['id'] ], $field['data'], true );
81
-						}
82
-					}
83
-				} elseif ( is_array( $section ) && ! empty( $section ) ) {
84
-					$this->translate_data_field_recursive( $section, $options_values );
85
-				}
86
-			}
87
-		}
88
-
89
-		/**
90
-		 * Retrieves the options.
91
-		 */
92
-		public function get() {
93
-			$core = $this->core();
94
-
95
-			$defaults = false;
96
-
97
-			if ( ! empty( $core->defaults ) ) {
98
-				$defaults = $core->defaults;
99
-			}
100
-
101
-			if ( empty( $core->args ) ) {
102
-				return;
103
-			}
104
-
105
-			switch ( $core->args['database'] ) {
106
-				case 'transient':
107
-					$result = get_transient( $core->args['opt_name'] . '-transient' );
108
-					break;
109
-				case 'theme_mods':
110
-					$result = get_theme_mod( $core->args['opt_name'] . '-mods' );
111
-					break;
112
-				case 'theme_mods_expanded':
113
-					$result = get_theme_mods();
114
-					break;
115
-				case 'network':
116
-					$result = get_site_option( $core->args['opt_name'], array() );
117
-					break;
118
-				default:
119
-					$result = get_option( $core->args['opt_name'], array() );
120
-
121
-			}
122
-
123
-			if ( ! is_array( $result ) ) {
124
-				return;
125
-			}
126
-
127
-			if ( empty( $result ) && empty( $defaults ) ) {
128
-				return;
129
-			}
130
-
131
-			if ( empty( $result ) && ! empty( $defaults ) ) {
132
-				$results = $defaults;
133
-				$this->set( $results );
134
-			} else {
135
-				$core->options = $result;
136
-			}
137
-
138
-			// Don't iterate unnecessarily.
139
-			if ( has_filter( 'wpml_object_id' ) ) {
140
-				$this->translate_data_field_recursive( $core->sections, $core->options );
141
-			}
142
-
143
-			/**
144
-			 * Action 'redux/options/{opt_name}/options'
145
-			 *
146
-			 * @param mixed $value option values
147
-			 */
148
-
149
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
150
-			$core->options = apply_filters( "redux/options/{$core->args['opt_name']}/options", $core->options, $core->sections );
151
-
152
-			// Get transient values.
153
-			$core->transient_class->get();
154
-
155
-			// Set a global variable by the global_variable argument.
156
-			$this->set_global_variable( $core );
157
-		}
158
-
159
-		/**
160
-		 * ->set_options(); This is used to set an arbitrary option in the option array
161
-		 *
162
-		 * @since ReduxFramework 3.0.0
163
-		 *
164
-		 * @param string|array $value the value of the option being added.
165
-		 */
166
-		public function set( $value = '' ) {
167
-			$core = $this->core();
168
-
169
-			$core->transients['last_save'] = time();
170
-
171
-			if ( ! empty( $value ) ) {
172
-				switch ( $core->args['database'] ) {
173
-					case 'transient':
174
-						set_transient( $core->args['opt_name'] . '-transient', $value, $core->args['transient_time'] );
175
-						break;
176
-					case 'theme_mods':
177
-						set_theme_mod( $core->args['opt_name'] . '-mods', $value );
178
-						break;
179
-					case 'theme_mods_expanded':
180
-						foreach ( $value as $k => $v ) {
181
-							set_theme_mod( $k, $v );
182
-						}
183
-						break;
184
-					case 'network':
185
-						update_site_option( $core->args['opt_name'], $value );
186
-						break;
187
-					default:
188
-						update_option( $core->args['opt_name'], $value );
189
-
190
-				}
191
-
192
-				// Store the changed values in the transient.
193
-				if ( $value !== $core->options ) {
194
-					foreach ( $value as $k => $v ) {
195
-						if ( ! isset( $core->options[ $k ] ) ) {
196
-							$core->options[ $k ] = '';
197
-						} elseif ( $v === $core->options[ $k ] ) {
198
-							unset( $core->options[ $k ] );
199
-						}
200
-					}
201
-
202
-					$core->transients['changed_values'] = $core->options;
203
-				}
204
-
205
-				$core->options = $value;
206
-
207
-				// Set a global variable by the global_variable argument.
208
-				$this->set_global_variable( $core );
209
-
210
-				// Saving the transient values.
211
-				$core->transient_class->set();
212
-			}
213
-		}
214
-
215
-		/**
216
-		 * Set a global variable by the global_variable argument
217
-		 *
218
-		 * @param null|ReduxFramework $core ReduxFramework core object.
219
-		 *
220
-		 * @return  void          (global was set)
221
-		 * @since   3.1.5
222
-		 */
223
-		private function set_global_variable( ?ReduxFramework $core ): void {
224
-			if ( ! empty( $core->args['global_variable'] ) ) {
225
-				$options_global = $core->args['global_variable'];
226
-
227
-				/**
228
-				 * Filter 'redux/options/{opt_name}/global_variable'
229
-				 *
230
-				 * @param array $value option value to set global_variable with
231
-				 */
232
-
233
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
234
-				$GLOBALS[ $options_global ] = apply_filters( "redux/options/{$core->args['opt_name']}/global_variable", $core->options );
235
-			}
236
-		}
237
-
238
-		/**
239
-		 * Register Option for use
240
-		 *
241
-		 * @return void
242
-		 * @throws ReflectionException Exception.
243
-		 * @since  1.0.0
244
-		 * @access public
245
-		 */
246
-		public function register() {
247
-			$core = $this->core();
248
-
249
-			if ( ! is_object( $core ) ) {
250
-				return;
251
-			}
252
-
253
-			if ( true === $core->args['options_api'] ) {
254
-				register_setting(
255
-					$core->args['opt_name'] . '_group',
256
-					$core->args['opt_name'],
257
-					array(
258
-						$this,
259
-						'validate_options',
260
-					)
261
-				);
262
-			}
263
-
264
-			if ( is_null( $core->sections ) ) {
265
-				return;
266
-			}
267
-
268
-			if ( empty( $core->options_defaults ) ) {
269
-				$core->options_defaults = $core->default_values();
270
-			}
271
-
272
-			$run_update = false;
273
-
274
-			foreach ( $core->sections as $k => $section ) {
275
-				if ( isset( $section['type'] ) && 'divide' === $section['type'] ) {
276
-					continue;
277
-				}
278
-
279
-				$display = true;
280
-
281
-				if ( isset( $_GET['page'] ) && $_GET['page'] === $core->args['page_slug'] ) { // phpcs:ignore WordPress.Security.NonceVerification
282
-					if ( isset( $section['panel'] ) && false === $section['panel'] ) {
283
-						$display = false;
284
-					}
285
-				}
286
-
287
-				/**
288
-				 * Filter 'redux/options/{opt_name}/section/{section.id}'
289
-				 *
290
-				 * @param array $section section configuration
291
-				 */
292
-				if ( isset( $section['id'] ) ) {
293
-					// phpcs:ignore WordPress.NamingConventions.ValidHookName
294
-					$section = apply_filters( "redux/options/{$core->args['opt_name']}/section/{$section['id']}", $section );
295
-				}
296
-
297
-				if ( empty( $section ) ) {
298
-					unset( $core->sections[ $k ] );
299
-					continue;
300
-				}
301
-
302
-				if ( ! isset( $section['title'] ) ) {
303
-					$section['title'] = '';
304
-				}
305
-
306
-				if ( isset( $section['customizer_only'] ) && true === $section['customizer_only'] ) {
307
-					$section['panel']     = false;
308
-					$core->sections[ $k ] = $section;
309
-				}
310
-
311
-				$heading = $section['heading'] ?? $section['title'];
312
-
313
-				if ( isset( $section['permissions'] ) && false !== $section['permissions'] ) {
314
-					if ( ! Redux_Helpers::current_user_can( $section['permissions'] ) ) {
315
-						$core->hidden_perm_sections[] = $section['title'];
316
-
317
-						foreach ( $section['fields'] as $field_data ) {
318
-							$field_type = $field_data['type'];
319
-
320
-							if ( ! in_array( $field_type, array( 'section', 'divide', 'info', 'raw' ), true ) ) {
321
-								$field_id = $field_data['id'];
322
-								$default  = $core->options_defaults[ $field_id ] ?? '';
323
-								$data     = $core->options[ $field_id ] ?? $default;
324
-
325
-								$this->hidden_perm_fields[ $field_id ] = $data;
326
-							}
327
-						}
328
-
329
-						continue;
330
-					}
331
-				}
332
-
333
-				if ( ! $display || ! function_exists( 'add_settings_section' ) ) {
334
-					$this->no_panel_section[ $k ] = $section;
335
-				} else {
336
-					add_settings_section(
337
-						$core->args['opt_name'] . $k . '_section',
338
-						$heading,
339
-						array(
340
-							$core->render_class,
341
-							'section_desc',
342
-						),
343
-						$core->args['opt_name'] . $k . '_section_group'
344
-					);
345
-				}
346
-
347
-				$section_ident = false;
348
-				if ( isset( $section['fields'] ) ) {
349
-					foreach ( $section['fields'] as $fieldk => $field ) {
350
-						if ( ! isset( $field['type'] ) ) {
351
-							continue; // You need a type!
352
-						}
353
-
354
-						if ( 'info' === $field['type'] && isset( $field['raw_html'] ) && true === $field['raw_html'] ) {
355
-							$field['type']                             = 'raw';
356
-							$field['content']                          = $field['desc'];
357
-							$field['desc']                             = '';
358
-							$core->sections[ $k ]['fields'][ $fieldk ] = $field;
359
-						} elseif ( 'info' === $field['type'] ) {
360
-							if ( ! isset( $field['full_width'] ) ) {
361
-								$field['full_width']                       = true;
362
-								$core->sections[ $k ]['fields'][ $fieldk ] = $field;
363
-							}
364
-						}
365
-
366
-						if ( 'raw' === $field['type'] ) {
367
-							if ( isset( $field['align'] ) ) {
368
-								$field['full_width'] = ! $field['align'];
369
-								unset( $field['align'] );
370
-							} elseif ( ! isset( $field['full_width'] ) ) {
371
-								$field['full_width'] = true;
372
-							}
373
-							$core->sections[ $k ]['fields'][ $fieldk ] = $field;
374
-						}
375
-
376
-						/**
377
-						 * Filter 'redux/options/{opt_name}/field/{field.id}'
378
-						 *
379
-						 * @param array $field field config
380
-						 */
381
-
382
-						// phpcs:ignore WordPress.NamingConventions.ValidHookName
383
-						$field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}/register", $field );
384
-
385
-						$core->field_types[ $field['type'] ] = $core->field_types[ $field['type'] ] ?? array();
386
-
387
-						$core->field_sections[ $field['type'] ][ $field['id'] ] = $k;
388
-
389
-						$display = true;
390
-
391
-						if ( isset( $_GET['page'] ) && $core->args['page_slug'] === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification
392
-							if ( isset( $field['panel'] ) && false === $field['panel'] ) {
393
-								$display = false;
394
-							}
395
-						}
396
-						if ( isset( $field['customizer_only'] ) && true === $field['customizer_only'] ) {
397
-							$display = false;
398
-						}
399
-
400
-						if ( isset( $section['customizer'] ) ) {
401
-							$field['customizer']                       = $section['customizer'];
402
-							$core->sections[ $k ]['fields'][ $fieldk ] = $field;
403
-						}
404
-
405
-						if ( isset( $field['permissions'] ) && false !== $field['permissions'] ) {
406
-							if ( ! Redux_Helpers::current_user_can( $field['permissions'] ) ) {
407
-								$data = $core->options[ $field['id'] ] ?? $core->options_defaults[ $field['id'] ];
408
-
409
-								$this->hidden_perm_fields[ $field['id'] ] = $data;
410
-
411
-								continue;
412
-							}
413
-						}
414
-
415
-						if ( ! isset( $field['id'] ) ) {
416
-							echo '<br /><h3>No field ID is set.</h3><pre>';
417
-
418
-							// phpcs:ignore WordPress.PHP.DevelopmentFunctions
419
-							print_r( $field );
420
-
421
-							echo '</pre><br />';
422
-
423
-							continue;
424
-						}
425
-
426
-						if ( isset( $field['type'] ) && 'section' === $field['type'] ) {
427
-							if ( isset( $field['indent'] ) && true === $field['indent'] ) {
428
-								$section_ident = true;
429
-							} else {
430
-								$section_ident = false;
431
-							}
432
-						}
433
-
434
-						if ( isset( $field['type'] ) && 'info' === $field['type'] && $section_ident ) {
435
-							$field['indent'] = true;
436
-						}
437
-
438
-						$th = $core->render_class->get_header_html( $field );
439
-
440
-						$field['name'] = $core->args['opt_name'] . '[' . $field['id'] . ']';
441
-
442
-						// Set the default value if present.
443
-						$core->options_defaults[ $field['id'] ] = $core->options_defaults[ $field['id'] ] ?? '';
444
-
445
-						// Set the defaults to the value if not present.
446
-						$do_update = false;
447
-
448
-						// Check fields for values in the default parameter.
449
-						if ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['default'] ) ) {
450
-							$core->options_defaults[ $field['id'] ] = $field['default'];
451
-							$core->options[ $field['id'] ]          = $field['default'];
452
-							$do_update                              = true;
453
-
454
-							// Check fields that hae no default value, but an option value with settings to
455
-							// be saved by default.
456
-						} elseif ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['options'] ) ) {
457
-
458
-							// If a sorter field, check for options and save them as defaults.
459
-							if ( 'sorter' === $field['type'] || 'sortable' === $field['type'] ) {
460
-								$core->options_defaults[ $field['id'] ] = $field['options'];
461
-								$core->options[ $field['id'] ]          = $field['options'];
462
-								$do_update                              = true;
463
-							}
464
-						}
465
-
466
-						// CORRECT URLS if media URLs are wrong, but attachment IDs are present.
467
-						if ( 'media' === $field['type'] ) {
468
-							if ( isset( $core->options[ $field['id'] ]['id'] ) && isset( $core->options[ $field['id'] ]['url'] ) && ! empty( $core->options[ $field['id'] ]['url'] ) && strpos( $core->options[ $field['id'] ]['url'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) {
469
-								$data = wp_get_attachment_url( $core->options[ $field['id'] ]['id'] );
470
-
471
-								if ( isset( $data ) && ! empty( $data ) ) {
472
-									$core->options[ $field['id'] ]['url'] = $data;
473
-
474
-									$data = wp_get_attachment_image_src(
475
-										$core->options[ $field['id'] ]['id'],
476
-										array(
477
-											150,
478
-											150,
479
-										)
480
-									);
481
-
482
-									$core->options[ $field['id'] ]['thumbnail'] = $data[0];
483
-									$do_update                                  = true;
484
-								}
485
-							}
486
-						}
487
-
488
-						if ( 'background' === $field['type'] ) {
489
-							if ( isset( $core->options[ $field['id'] ]['media']['id'] ) && isset( $core->options[ $field['id'] ]['background-image'] ) && ! empty( $core->options[ $field['id'] ]['background-image'] ) && strpos( $core->options[ $field['id'] ]['background-image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) {
490
-								$data = wp_get_attachment_url( $core->options[ $field['id'] ]['media']['id'] );
491
-
492
-								if ( isset( $data ) && ! empty( $data ) ) {
493
-									$core->options[ $field['id'] ]['background-image'] = $data;
494
-
495
-									$data = wp_get_attachment_image_src(
496
-										$core->options[ $field['id'] ]['media']['id'],
497
-										array(
498
-											150,
499
-											150,
500
-										)
501
-									);
502
-
503
-									$core->options[ $field['id'] ]['media']['thumbnail'] = $data[0];
504
-									$do_update = true;
505
-								}
506
-							}
507
-						}
508
-
509
-						if ( 'slides' === $field['type'] ) {
510
-							if ( isset( $core->options[ $field['id'] ] ) && is_array( $core->options[ $field['id'] ] ) && isset( $core->options[ $field['id'] ][0]['attachment_id'] ) && isset( $core->options[ $field['id'] ][0]['image'] ) && ! empty( $core->options[ $field['id'] ][0]['image'] ) && strpos( $core->options[ $field['id'] ][0]['image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) {
511
-								foreach ( $core->options[ $field['id'] ] as $key => $val ) {
512
-									$data = wp_get_attachment_url( $val['attachment_id'] );
513
-
514
-									if ( isset( $data ) && ! empty( $data ) ) {
515
-										$core->options[ $field['id'] ][ $key ]['image'] = $data;
516
-
517
-										$data = wp_get_attachment_image_src(
518
-											$val['attachment_id'],
519
-											array(
520
-												150,
521
-												150,
522
-											)
523
-										);
524
-
525
-										$core->options[ $field['id'] ][ $key ]['thumb'] = $data[0];
526
-										$do_update                                      = true;
527
-									}
528
-								}
529
-							}
530
-						}
531
-						// END -> CORRECT URLS if media URLs are wrong, but attachment IDs are present.
532
-						if ( true === $do_update && ! isset( $core->never_save_to_db ) ) {
533
-							if ( $core->args['save_defaults'] ) { // Only save that to the DB if allowed to.
534
-								$run_update = true;
535
-							}
536
-						}
537
-
538
-						if ( ! isset( $field['class'] ) ) { // No errors, please.
539
-							$field['class'] = '';
540
-						}
541
-
542
-						/**
543
-						 * Filter 'redux/options/{opt_name}/field/{field.id}'.
544
-						 *
545
-						 * @param array $field field config
546
-						 */
547
-
548
-						// phpcs:ignore WordPress.NamingConventions.ValidHookName
549
-						$field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}", $field );
550
-
551
-						if ( empty( $field ) ) {
552
-							unset( $core->sections[ $k ]['fields'][ $fieldk ] );
553
-							continue;
554
-						}
555
-
556
-						if ( ! empty( Redux_Core::$folds[ $field['id'] ]['parent'] ) ) { // This has some fold items, hide it by default.
557
-							$field['class'] .= ' fold';
558
-						}
559
-
560
-						if ( ! empty( Redux_Core::$folds[ $field['id'] ]['children'] ) ) { // Sets the values you shoe fold children on.
561
-							$field['class'] .= ' fold-parent';
562
-						}
563
-
564
-						if ( ! empty( $field['compiler'] ) ) {
565
-							$field['class']                       .= ' compiler';
566
-							$core->compiler_fields[ $field['id'] ] = 1;
567
-						}
568
-
569
-						if ( isset( $field['unit'] ) && ! isset( $field['units'] ) ) {
570
-							$field['units'] = $field['unit'];
571
-							unset( $field['unit'] );
572
-						}
573
-
574
-						$core->sections[ $k ]['fields'][ $fieldk ] = $field;
575
-
576
-						if ( isset( $core->args['display_source'] ) ) {
577
-							// phpcs:ignore WordPress.PHP.DevelopmentFunctions
578
-							$th .= '<div id="' . $field['id'] . '-settings" style="display:none;"><pre>' . var_export( $core->sections[ $k ]['fields'][ $fieldk ], true ) . '</pre></div>';
579
-							$th .= '<br /><a href="#TB_inline?width=600&height=800&inlineId=' . $field['id'] . '-settings" class="thickbox"><small>View Source</small></a>';
580
-						}
581
-
582
-						/**
583
-						 * Action 'redux/options/{opt_name}/field/{field.type}/register'
584
-						 */
585
-
586
-						// phpcs:ignore WordPress.NamingConventions.ValidHookName
587
-						do_action( "redux/options/{$core->args['opt_name']}/field/{$field['type']}/register", $field );
588
-
589
-						$core->required_class->check_dependencies( $field );
590
-						$core->field_head[ $field['id'] ] = $th;
591
-
592
-						if ( ! $display || isset( $this->no_panel_section[ $k ] ) ) {
593
-							$this->no_panel[] = $field['id'];
594
-						} else {
595
-							if ( isset( $field['disabled'] ) && $field['disabled'] ) {
596
-								$field['class'] .= ' redux_disable_field';
597
-							}
598
-
599
-							if ( isset( $field['hidden'] ) && $field['hidden'] ) {
600
-								$field['class'] .= ' redux_hide_field';
601
-							}
602
-
603
-							if ( true === $core->args['options_api'] ) {
604
-								add_settings_field(
605
-									"{$fieldk}_field",
606
-									$th,
607
-									array(
608
-										$core->render_class,
609
-										'field_input',
610
-									),
611
-									"{$core->args['opt_name']}{$k}_section_group",
612
-									"{$core->args['opt_name']}{$k}_section",
613
-									$field
614
-								);
615
-							}
616
-						}
617
-					}
618
-				}
619
-			}
620
-
621
-			/**
622
-			 * Action 'redux/options/{opt_name}/register'
623
-			 *
624
-			 * @param array $section Option sections
625
-			 */
626
-
627
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
628
-			do_action( "redux/options/{$core->args['opt_name']}/register", $core->sections );
629
-
630
-			if ( $run_update && ! isset( $core->never_save_to_db ) ) { // Always update the DB with new fields.
631
-				$this->set( $core->options );
632
-			}
633
-
634
-			if ( isset( $core->transients['run_compiler'] ) && $core->transients['run_compiler'] ) {
635
-
636
-				Redux_Core::$no_output = true;
637
-				$temp                  = $core->args['output_variables_prefix'];
638
-
639
-				// Allow the override of variable's prefix for use by SCSS or LESS.
640
-				if ( isset( $core->args['compiler_output_variables_prefix'] ) ) {
641
-					$core->args['output_variables_prefix'] = $core->args['compiler_output_variables_prefix'];
642
-				}
643
-				$core->output_class->enqueue();
644
-				$core->args['output_variables_prefix'] = $temp;
645
-
646
-				// phpcs:ignore WordPress.NamingConventions.ValidVariableName
647
-				$compiler_css = $core->compilerCSS;
648
-
649
-				/**
650
-				 * Action 'redux/options/{opt_name}/compiler'
651
-				 *
652
-				 * @param array  $options Options.
653
-				 * @param string $css CSS that get sent to the compiler hook.
654
-				 * @param array  $changed_values Changed values.
655
-				 * @param array  $output_variables Output variables.
656
-				 */
657
-
658
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
659
-				do_action( "redux/options/{$core->args['opt_name']}/compiler", $core->options, $compiler_css, $core->transients['changed_values'], $core->output_variables );
660
-
661
-				/**
662
-				 * Action 'redux/options/{opt_name}/compiler/advanced'
663
-				 *
664
-				 * @param object $redux ReduxFramework object.
665
-				 */
666
-
667
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
668
-				do_action( "redux/options/{$core->args['opt_name']}/compiler/advanced", $core );
669
-
670
-				unset( $core->transients['run_compiler'] );
671
-				$core->transient_class->set();
672
-			}
673
-		}
674
-
675
-		/**
676
-		 * Get default options into an array suitable for the settings API
677
-		 *
678
-		 * @since       1.0.0
679
-		 * @access      public
680
-		 * @return      array $this->options_defaults
681
-		 */
682
-		public function default_values(): array {
683
-			$core = $this->core();
684
-
685
-			if ( ! is_null( $core->sections ) && is_null( $core->options_defaults ) ) {
686
-				$core->options_defaults = $core->options_defaults_class->default_values( $core->args['opt_name'], $core->sections, $core->wordpress_data );
687
-			}
688
-
689
-			/**
690
-			 * Filter 'redux/options/{opt_name}/defaults'
691
-			 *
692
-			 * @param array $defaults option default values
693
-			 */
694
-
695
-			$core->transients['changed_values'] = $core->transients['changed_values'] ?? array();
696
-
697
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
698
-			$core->options_defaults = apply_filters( "redux/options/{$core->args['opt_name']}/defaults", $core->options_defaults, $core->transients['changed_values'] );
699
-
700
-			return $core->options_defaults;
701
-		}
702
-
703
-		/**
704
-		 * Validate the Options before insertion
705
-		 *
706
-		 * @param  array $plugin_options The option array.
707
-		 *
708
-		 * @return array|mixed|string
709
-		 * @since  3.0.0
710
-		 * @access public
711
-		 */
712
-		public function validate_options( array $plugin_options ) {
713
-			$core = $this->core();
714
-
715
-			if ( true === Redux_Core::$validation_ran ) {
716
-				return $plugin_options;
717
-			}
718
-
719
-			Redux_Core::$validation_ran = true;
720
-
721
-			// Save the values not in the panel.
722
-			if ( isset( $plugin_options['redux-no_panel'] ) ) {
723
-				$keys = explode( '|', $plugin_options['redux-no_panel'] );
724
-				foreach ( $keys as $key ) {
725
-					$plugin_options[ $key ] = $core->options[ $key ];
726
-				}
727
-				if ( isset( $plugin_options['redux-no_panel'] ) ) {
728
-					unset( $plugin_options['redux-no_panel'] );
729
-				}
730
-			}
731
-
732
-			if ( is_array( $this->hidden_perm_fields ) && ! empty( $this->hidden_perm_fields ) ) {
733
-				foreach ( $this->hidden_perm_fields as $id => $data ) {
734
-					$plugin_options[ $id ] = $data;
735
-				}
736
-			}
737
-
738
-			if ( $plugin_options === $core->options ) {
739
-				return $plugin_options;
740
-			}
741
-
742
-			$time = time();
743
-
744
-			// Sets last saved time.
745
-			$core->transients['last_save'] = $time;
746
-
747
-			$imported_options = array();
748
-
749
-			if ( isset( $plugin_options['import_code'] ) && '' !== $plugin_options['import_code'] ) {
750
-				$imported_options = json_decode( $plugin_options['import_code'], true );
751
-			}
752
-
753
-			// Import.
754
-			$core->transients['last_save_mode'] = 'import'; // Last save mode.
755
-			$core->transients['last_compiler']  = $time;
756
-			$core->transients['last_import']    = $time;
757
-			$core->transients['run_compiler']   = 1;
758
-
759
-			if ( is_array( $imported_options ) && ! empty( $imported_options ) && isset( $imported_options['redux-backup'] ) && ( 1 === $imported_options['redux-backup'] || '1' === $imported_options['redux-backup'] ) ) {
760
-				$core->transients['changed_values'] = array();
761
-				foreach ( $plugin_options as $key => $value ) {
762
-					if ( isset( $imported_options[ $key ] ) && $value !== $imported_options[ $key ] ) {
763
-						$plugin_options[ $key ]                     = $value;
764
-						$core->transients['changed_values'][ $key ] = $value;
765
-					}
766
-				}
767
-
768
-				/**
769
-				 * Action 'redux/options/{opt_name}/import'.
770
-				 *
771
-				 * @param  &array [&$plugin_options, redux_options]
772
-				 */
773
-
774
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
775
-				do_action_ref_array(
776
-					"redux/options/{$core->args['opt_name']}/import", // phpcs:ignore WordPress.NamingConventions.ValidHookName
777
-					array(
778
-						&$plugin_options,
779
-						$imported_options,
780
-						$core->transients['changed_values'],
781
-					)
782
-				);
783
-
784
-				setcookie( 'redux_current_tab_' . $core->args['opt_name'], '', 1, '/', $time + 1000, '/' );
785
-				$_COOKIE[ 'redux_current_tab_' . $core->args['opt_name'] ] = 1;
786
-
787
-				unset( $plugin_options['defaults'], $plugin_options['compiler'], $plugin_options['import'], $plugin_options['import_code'] );
788
-				if ( in_array( $core->args['database'], array( 'transient', 'theme_mods', 'theme_mods_expanded', 'network' ), true ) ) {
789
-					$this->set( $plugin_options );
790
-
791
-					return null;
792
-				}
793
-
794
-				$plugin_options = wp_parse_args( $imported_options, $plugin_options );
795
-
796
-				$core->transient_class->set();
797
-
798
-				return $plugin_options;
799
-			}
800
-
801
-			// Reset all to defaults.
802
-			if ( ! empty( $plugin_options['defaults'] ) ) {
803
-				if ( empty( $core->options_defaults ) ) {
804
-					$core->options_defaults = $core->_default_values();
805
-				}
806
-
807
-				/**
808
-				 * Filter: 'redux/validate/{opt_name}/defaults'.
809
-				 *
810
-				 * @param  &array [ $this->options_defaults, $plugin_options]
811
-				 */
812
-
813
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
814
-				$plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/defaults", $core->options_defaults );
815
-
816
-				$core->transients['changed_values'] = array();
817
-
818
-				if ( empty( $core->options ) ) {
819
-					$core->options = $core->options_defaults;
820
-				}
821
-
822
-				foreach ( $core->options as $key => $value ) {
823
-					if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
824
-						$core->transients['changed_values'][ $key ] = $value;
825
-					}
826
-				}
827
-
828
-				$core->transients['run_compiler']   = 1;
829
-				$core->transients['last_save_mode'] = 'defaults'; // Last save mode.
830
-
831
-				$core->transient_class->set();
832
-
833
-				return $plugin_options;
834
-			}
835
-
836
-			// Section reset to default.
837
-			if ( ! empty( $plugin_options['defaults-section'] ) ) {
838
-				if ( isset( $plugin_options['redux-section'] ) && isset( $core->sections[ $plugin_options['redux-section'] ]['fields'] ) ) {
839
-					if ( empty( $core->options_defaults ) ) {
840
-						$core->options_defaults = $core->_default_values();
841
-					}
842
-
843
-					foreach ( $core->sections[ $plugin_options['redux-section'] ]['fields'] as $field ) {
844
-						if ( 'tabbed' === $field['type'] ) {
845
-							if ( ! empty( $field['tabs'] ) ) {
846
-								foreach ( $field['tabs'] as $val ) {
847
-									if ( ! empty( $val['fields'] ) ) {
848
-										foreach ( $val['fields'] as $f ) {
849
-											if ( isset( $core->options_defaults[ $f['id'] ] ) ) {
850
-												$plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ];
851
-											} else {
852
-												$plugin_options[ $f['id'] ] = '';
853
-											}
854
-										}
855
-									}
856
-								}
857
-							}
858
-						} elseif ( 'repeater' === $field['type'] ) {
859
-							if ( ! empty( $field['fields'] ) ) {
860
-								foreach ( $field['fields'] as $f ) {
861
-									if ( isset( $core->options_defaults[ $f['id'] ] ) ) {
862
-										$plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ];
863
-									} else {
864
-										$plugin_options[ $f['id'] ] = '';
865
-									}
866
-								}
867
-							}
868
-						} else {
869
-							if ( isset( $core->options_defaults[ $field['id'] ] ) ) {
870
-								$plugin_options[ $field['id'] ] = $core->options_defaults[ $field['id'] ];
871
-							} else {
872
-								$plugin_options[ $field['id'] ] = '';
873
-							}
874
-						}
875
-
876
-						if ( isset( $field['compiler'] ) ) {
877
-							$compiler = true;
878
-						}
879
-					}
880
-
881
-					/**
882
-					 * Filter: 'redux/validate/{opt_name}/defaults_section'.
883
-					 *
884
-					 * @param  &array [ $this->options_defaults, $plugin_options]
885
-					 */
886
-
887
-					// phpcs:ignore WordPress.NamingConventions.ValidHookName
888
-					$plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/defaults_section", $plugin_options );
889
-				}
890
-
891
-				$core->transients['changed_values'] = array();
892
-
893
-				foreach ( $core->options as $key => $value ) {
894
-					if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
895
-						$core->transients['changed_values'][ $key ] = $value;
896
-					}
897
-				}
898
-
899
-				if ( isset( $compiler ) ) {
900
-					$core->transients['last_compiler'] = $time;
901
-					$core->transients['run_compiler']  = 1;
902
-				}
903
-
904
-				$core->transients['last_save_mode'] = 'defaults_section'; // Last save mode.
905
-
906
-				unset( $plugin_options['defaults'], $plugin_options['defaults_section'], $plugin_options['import'], $plugin_options['import_code'], $plugin_options['import_link'], $plugin_options['compiler'], $plugin_options['redux-section'] );
907
-
908
-				$core->transient_class->set();
909
-
910
-				return $plugin_options;
911
-			}
912
-
913
-			$core->transients['last_save_mode'] = 'normal'; // Last save mode.
914
-
915
-			/**
916
-			 * Filter: 'redux/validate/{opt_name}/before_validation'
917
-			 *
918
-			 * @param  &array [&$plugin_options, redux_options]
919
-			 */
920
-
921
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
922
-			$plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/before_validation", $plugin_options, $core->options );
923
-
924
-			// Validate fields (if needed).
925
-			$plugin_options = $core->validate_class->validate( $plugin_options, $core->options, $core->sections );
926
-
927
-			// Sanitize options, if needed.
928
-			$plugin_options = $core->sanitize_class->sanitize( $plugin_options, $core->options, $core->sections );
929
-
930
-			if ( ! empty( $core->errors ) || ! empty( $core->warnings ) || ! empty( $core->sanitize ) ) {
931
-				$core->transients['notices'] = array(
932
-					'errors'   => $core->errors,
933
-					'warnings' => $core->warnings,
934
-					'sanitize' => $core->sanitize,
935
-				);
936
-			}
937
-
938
-			if ( ! isset( $core->transients['changed_values'] ) ) {
939
-				$core->transients['changed_values'] = array();
940
-			}
941
-
942
-			/**
943
-			 * Action 'redux/options/{opt_name}/validate'
944
-			 *
945
-			 * @param  &array [&$plugin_options, redux_options]
946
-			 */
947
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
948
-			do_action_ref_array(
949
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
950
-				"redux/options/{$core->args['opt_name']}/validate",
951
-				array(
952
-					&$plugin_options,
953
-					$core->options,
954
-					$core->transients['changed_values'],
955
-				)
956
-			);
957
-
958
-			if ( ! empty( $plugin_options['compiler'] ) ) {
959
-				unset( $plugin_options['compiler'] );
960
-
961
-				$core->transients['last_compiler'] = $time;
962
-				$core->transients['run_compiler']  = 1;
963
-			}
964
-
965
-			$core->transients['changed_values'] = array(); // Changed values since last save.
966
-
967
-			if ( ! empty( $core->options ) ) {
968
-				foreach ( $core->options as $key => $value ) {
969
-					if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
970
-						$core->transients['changed_values'][ $key ] = $value;
971
-					}
972
-				}
973
-			}
974
-
975
-			unset( $plugin_options['defaults'], $plugin_options['defaults_section'], $plugin_options['import'], $plugin_options['import_code'], $plugin_options['import_link'], $plugin_options['compiler'], $plugin_options['redux-section'] );
976
-			if ( in_array( $core->args['database'], array( 'transient', 'theme_mods', 'theme_mods_expanded' ), true ) ) {
977
-				$core->set( $core->args['opt_name'], $plugin_options );
978
-				return null;
979
-			}
980
-
981
-			if ( defined( 'WP_CACHE' ) && WP_CACHE && class_exists( 'W3_ObjectCache' ) && function_exists( 'w3_instance' ) ) {
982
-				$w3_inst = w3_instance( 'W3_ObjectCache' );
983
-				$w3      = $w3_inst->instance();
984
-				$key     = $w3->_get_cache_key( $core->args['opt_name'] . '-transients', 'transient' );
985
-				$w3->delete( $key, 'transient', true );
986
-			}
987
-
988
-			$core->transient_class->set();
989
-
990
-			return $plugin_options;
991
-		}
992
-
993
-		/**
994
-		 * ->get_default(); This is used to return the default value if default_show is set.
995
-		 *
996
-		 * @param string $opt_name The option name to return.
997
-		 * @param mixed  $defaults (null) The value to return if default not set.
998
-		 *
999
-		 * @return      mixed $default
1000
-		 * @since       1.0.1
1001
-		 * @access      public
1002
-		 */
1003
-		public function get_default( string $opt_name, $defaults = null ) {
1004
-			if ( true === $this->args['default_show'] ) {
1005
-
1006
-				if ( empty( $this->options_defaults ) ) {
1007
-					$this->default_values(); // fill cache.
1008
-				}
1009
-
1010
-				return array_key_exists( $opt_name, $this->options_defaults ) ? $this->options_defaults[ $opt_name ] : $defaults;
1011
-			}
1012
-
1013
-			return '';
1014
-		}
1015
-
1016
-		/**
1017
-		 * Get the default value for an option
1018
-		 *
1019
-		 * @param string $key       The option's ID.
1020
-		 * @param string $array_key The key of the default's array.
1021
-		 *
1022
-		 * @return mixed
1023
-		 * @since  3.3.6
1024
-		 * @access public
1025
-		 */
1026
-		public function get_default_value( string $key, $array_key = false ) {
1027
-			if ( empty( $this->options_defaults ) ) {
1028
-				$this->options_defaults = $this->default_values();
1029
-			}
1030
-
1031
-			$defaults = $this->options_defaults;
1032
-			$value    = '';
1033
-
1034
-			if ( isset( $defaults[ $key ] ) ) {
1035
-				if ( false !== $array_key && isset( $defaults[ $key ][ $array_key ] ) ) {
1036
-					$value = $defaults[ $key ][ $array_key ];
1037
-				} else {
1038
-					$value = $defaults[ $key ];
1039
-				}
1040
-			}
1041
-
1042
-			return $value;
1043
-		}
1044
-	}
15
+    /**
16
+     * Class Redux_Options
17
+     */
18
+    class Redux_Options_Constructor extends Redux_Class {
19
+
20
+        /**
21
+         * Array to hold single panel data.
22
+         *
23
+         * @var array
24
+         */
25
+        public array $no_panel = array();
26
+
27
+        /**
28
+         * Array to hold single panel sections.
29
+         *
30
+         * @var array
31
+         */
32
+        private array $no_panel_section = array();
33
+
34
+        /**
35
+         * Array to hold hidden fields.
36
+         *
37
+         * @var array
38
+         */
39
+        private array $hidden_perm_fields = array();
40
+
41
+        /**
42
+         * Array to hold hidden sections.
43
+         *
44
+         * @var array
45
+         */
46
+        public array $hidden_perm_sections = array();
47
+
48
+        /**
49
+         * Array to hold default options.
50
+         *
51
+         * @var array
52
+         */
53
+        private array $options_defaults = array();
54
+
55
+        /**
56
+         * Redux_Options constructor.
57
+         *
58
+         * @param object $redux ReduxFramework pointer.
59
+         */
60
+        public function __construct( $redux ) {
61
+            parent::__construct( $redux );
62
+
63
+            add_action( 'admin_init', array( $this, 'register' ) );
64
+        }
65
+
66
+        /**
67
+         * If we switch language in wpml the id of the post/page selected will be in the wrong language
68
+         * So it won't appear as selected in the list of options and will be lost on next save, this fixes this by translating this id
69
+         * Bonus it also gives the user the id of the post in the right language when they retrieve it.
70
+         * The recursion allows for it to work in a repeatable field.
71
+         *
72
+         * @param array $sections       Sections array.
73
+         * @param array $options_values Values array.
74
+         */
75
+        private function translate_data_field_recursive( array $sections, array &$options_values ) {
76
+            foreach ( $sections as $key => $section ) {
77
+                if ( 'fields' === $key ) {
78
+                    foreach ( $section as $field ) {
79
+                        if ( ! empty( $field['id'] ) && ! empty( $field['data'] ) && ! empty( $options_values[ $field['id'] ] ) && Redux_Helpers::is_integer( $options_values[ $field['id'] ] ) ) {
80
+                            $options_values[ $field['id'] ] = apply_filters( 'wpml_object_id', $options_values[ $field['id'] ], $field['data'], true );
81
+                        }
82
+                    }
83
+                } elseif ( is_array( $section ) && ! empty( $section ) ) {
84
+                    $this->translate_data_field_recursive( $section, $options_values );
85
+                }
86
+            }
87
+        }
88
+
89
+        /**
90
+         * Retrieves the options.
91
+         */
92
+        public function get() {
93
+            $core = $this->core();
94
+
95
+            $defaults = false;
96
+
97
+            if ( ! empty( $core->defaults ) ) {
98
+                $defaults = $core->defaults;
99
+            }
100
+
101
+            if ( empty( $core->args ) ) {
102
+                return;
103
+            }
104
+
105
+            switch ( $core->args['database'] ) {
106
+                case 'transient':
107
+                    $result = get_transient( $core->args['opt_name'] . '-transient' );
108
+                    break;
109
+                case 'theme_mods':
110
+                    $result = get_theme_mod( $core->args['opt_name'] . '-mods' );
111
+                    break;
112
+                case 'theme_mods_expanded':
113
+                    $result = get_theme_mods();
114
+                    break;
115
+                case 'network':
116
+                    $result = get_site_option( $core->args['opt_name'], array() );
117
+                    break;
118
+                default:
119
+                    $result = get_option( $core->args['opt_name'], array() );
120
+
121
+            }
122
+
123
+            if ( ! is_array( $result ) ) {
124
+                return;
125
+            }
126
+
127
+            if ( empty( $result ) && empty( $defaults ) ) {
128
+                return;
129
+            }
130
+
131
+            if ( empty( $result ) && ! empty( $defaults ) ) {
132
+                $results = $defaults;
133
+                $this->set( $results );
134
+            } else {
135
+                $core->options = $result;
136
+            }
137
+
138
+            // Don't iterate unnecessarily.
139
+            if ( has_filter( 'wpml_object_id' ) ) {
140
+                $this->translate_data_field_recursive( $core->sections, $core->options );
141
+            }
142
+
143
+            /**
144
+             * Action 'redux/options/{opt_name}/options'
145
+             *
146
+             * @param mixed $value option values
147
+             */
148
+
149
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
150
+            $core->options = apply_filters( "redux/options/{$core->args['opt_name']}/options", $core->options, $core->sections );
151
+
152
+            // Get transient values.
153
+            $core->transient_class->get();
154
+
155
+            // Set a global variable by the global_variable argument.
156
+            $this->set_global_variable( $core );
157
+        }
158
+
159
+        /**
160
+         * ->set_options(); This is used to set an arbitrary option in the option array
161
+         *
162
+         * @since ReduxFramework 3.0.0
163
+         *
164
+         * @param string|array $value the value of the option being added.
165
+         */
166
+        public function set( $value = '' ) {
167
+            $core = $this->core();
168
+
169
+            $core->transients['last_save'] = time();
170
+
171
+            if ( ! empty( $value ) ) {
172
+                switch ( $core->args['database'] ) {
173
+                    case 'transient':
174
+                        set_transient( $core->args['opt_name'] . '-transient', $value, $core->args['transient_time'] );
175
+                        break;
176
+                    case 'theme_mods':
177
+                        set_theme_mod( $core->args['opt_name'] . '-mods', $value );
178
+                        break;
179
+                    case 'theme_mods_expanded':
180
+                        foreach ( $value as $k => $v ) {
181
+                            set_theme_mod( $k, $v );
182
+                        }
183
+                        break;
184
+                    case 'network':
185
+                        update_site_option( $core->args['opt_name'], $value );
186
+                        break;
187
+                    default:
188
+                        update_option( $core->args['opt_name'], $value );
189
+
190
+                }
191
+
192
+                // Store the changed values in the transient.
193
+                if ( $value !== $core->options ) {
194
+                    foreach ( $value as $k => $v ) {
195
+                        if ( ! isset( $core->options[ $k ] ) ) {
196
+                            $core->options[ $k ] = '';
197
+                        } elseif ( $v === $core->options[ $k ] ) {
198
+                            unset( $core->options[ $k ] );
199
+                        }
200
+                    }
201
+
202
+                    $core->transients['changed_values'] = $core->options;
203
+                }
204
+
205
+                $core->options = $value;
206
+
207
+                // Set a global variable by the global_variable argument.
208
+                $this->set_global_variable( $core );
209
+
210
+                // Saving the transient values.
211
+                $core->transient_class->set();
212
+            }
213
+        }
214
+
215
+        /**
216
+         * Set a global variable by the global_variable argument
217
+         *
218
+         * @param null|ReduxFramework $core ReduxFramework core object.
219
+         *
220
+         * @return  void          (global was set)
221
+         * @since   3.1.5
222
+         */
223
+        private function set_global_variable( ?ReduxFramework $core ): void {
224
+            if ( ! empty( $core->args['global_variable'] ) ) {
225
+                $options_global = $core->args['global_variable'];
226
+
227
+                /**
228
+                 * Filter 'redux/options/{opt_name}/global_variable'
229
+                 *
230
+                 * @param array $value option value to set global_variable with
231
+                 */
232
+
233
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
234
+                $GLOBALS[ $options_global ] = apply_filters( "redux/options/{$core->args['opt_name']}/global_variable", $core->options );
235
+            }
236
+        }
237
+
238
+        /**
239
+         * Register Option for use
240
+         *
241
+         * @return void
242
+         * @throws ReflectionException Exception.
243
+         * @since  1.0.0
244
+         * @access public
245
+         */
246
+        public function register() {
247
+            $core = $this->core();
248
+
249
+            if ( ! is_object( $core ) ) {
250
+                return;
251
+            }
252
+
253
+            if ( true === $core->args['options_api'] ) {
254
+                register_setting(
255
+                    $core->args['opt_name'] . '_group',
256
+                    $core->args['opt_name'],
257
+                    array(
258
+                        $this,
259
+                        'validate_options',
260
+                    )
261
+                );
262
+            }
263
+
264
+            if ( is_null( $core->sections ) ) {
265
+                return;
266
+            }
267
+
268
+            if ( empty( $core->options_defaults ) ) {
269
+                $core->options_defaults = $core->default_values();
270
+            }
271
+
272
+            $run_update = false;
273
+
274
+            foreach ( $core->sections as $k => $section ) {
275
+                if ( isset( $section['type'] ) && 'divide' === $section['type'] ) {
276
+                    continue;
277
+                }
278
+
279
+                $display = true;
280
+
281
+                if ( isset( $_GET['page'] ) && $_GET['page'] === $core->args['page_slug'] ) { // phpcs:ignore WordPress.Security.NonceVerification
282
+                    if ( isset( $section['panel'] ) && false === $section['panel'] ) {
283
+                        $display = false;
284
+                    }
285
+                }
286
+
287
+                /**
288
+                 * Filter 'redux/options/{opt_name}/section/{section.id}'
289
+                 *
290
+                 * @param array $section section configuration
291
+                 */
292
+                if ( isset( $section['id'] ) ) {
293
+                    // phpcs:ignore WordPress.NamingConventions.ValidHookName
294
+                    $section = apply_filters( "redux/options/{$core->args['opt_name']}/section/{$section['id']}", $section );
295
+                }
296
+
297
+                if ( empty( $section ) ) {
298
+                    unset( $core->sections[ $k ] );
299
+                    continue;
300
+                }
301
+
302
+                if ( ! isset( $section['title'] ) ) {
303
+                    $section['title'] = '';
304
+                }
305
+
306
+                if ( isset( $section['customizer_only'] ) && true === $section['customizer_only'] ) {
307
+                    $section['panel']     = false;
308
+                    $core->sections[ $k ] = $section;
309
+                }
310
+
311
+                $heading = $section['heading'] ?? $section['title'];
312
+
313
+                if ( isset( $section['permissions'] ) && false !== $section['permissions'] ) {
314
+                    if ( ! Redux_Helpers::current_user_can( $section['permissions'] ) ) {
315
+                        $core->hidden_perm_sections[] = $section['title'];
316
+
317
+                        foreach ( $section['fields'] as $field_data ) {
318
+                            $field_type = $field_data['type'];
319
+
320
+                            if ( ! in_array( $field_type, array( 'section', 'divide', 'info', 'raw' ), true ) ) {
321
+                                $field_id = $field_data['id'];
322
+                                $default  = $core->options_defaults[ $field_id ] ?? '';
323
+                                $data     = $core->options[ $field_id ] ?? $default;
324
+
325
+                                $this->hidden_perm_fields[ $field_id ] = $data;
326
+                            }
327
+                        }
328
+
329
+                        continue;
330
+                    }
331
+                }
332
+
333
+                if ( ! $display || ! function_exists( 'add_settings_section' ) ) {
334
+                    $this->no_panel_section[ $k ] = $section;
335
+                } else {
336
+                    add_settings_section(
337
+                        $core->args['opt_name'] . $k . '_section',
338
+                        $heading,
339
+                        array(
340
+                            $core->render_class,
341
+                            'section_desc',
342
+                        ),
343
+                        $core->args['opt_name'] . $k . '_section_group'
344
+                    );
345
+                }
346
+
347
+                $section_ident = false;
348
+                if ( isset( $section['fields'] ) ) {
349
+                    foreach ( $section['fields'] as $fieldk => $field ) {
350
+                        if ( ! isset( $field['type'] ) ) {
351
+                            continue; // You need a type!
352
+                        }
353
+
354
+                        if ( 'info' === $field['type'] && isset( $field['raw_html'] ) && true === $field['raw_html'] ) {
355
+                            $field['type']                             = 'raw';
356
+                            $field['content']                          = $field['desc'];
357
+                            $field['desc']                             = '';
358
+                            $core->sections[ $k ]['fields'][ $fieldk ] = $field;
359
+                        } elseif ( 'info' === $field['type'] ) {
360
+                            if ( ! isset( $field['full_width'] ) ) {
361
+                                $field['full_width']                       = true;
362
+                                $core->sections[ $k ]['fields'][ $fieldk ] = $field;
363
+                            }
364
+                        }
365
+
366
+                        if ( 'raw' === $field['type'] ) {
367
+                            if ( isset( $field['align'] ) ) {
368
+                                $field['full_width'] = ! $field['align'];
369
+                                unset( $field['align'] );
370
+                            } elseif ( ! isset( $field['full_width'] ) ) {
371
+                                $field['full_width'] = true;
372
+                            }
373
+                            $core->sections[ $k ]['fields'][ $fieldk ] = $field;
374
+                        }
375
+
376
+                        /**
377
+                         * Filter 'redux/options/{opt_name}/field/{field.id}'
378
+                         *
379
+                         * @param array $field field config
380
+                         */
381
+
382
+                        // phpcs:ignore WordPress.NamingConventions.ValidHookName
383
+                        $field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}/register", $field );
384
+
385
+                        $core->field_types[ $field['type'] ] = $core->field_types[ $field['type'] ] ?? array();
386
+
387
+                        $core->field_sections[ $field['type'] ][ $field['id'] ] = $k;
388
+
389
+                        $display = true;
390
+
391
+                        if ( isset( $_GET['page'] ) && $core->args['page_slug'] === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification
392
+                            if ( isset( $field['panel'] ) && false === $field['panel'] ) {
393
+                                $display = false;
394
+                            }
395
+                        }
396
+                        if ( isset( $field['customizer_only'] ) && true === $field['customizer_only'] ) {
397
+                            $display = false;
398
+                        }
399
+
400
+                        if ( isset( $section['customizer'] ) ) {
401
+                            $field['customizer']                       = $section['customizer'];
402
+                            $core->sections[ $k ]['fields'][ $fieldk ] = $field;
403
+                        }
404
+
405
+                        if ( isset( $field['permissions'] ) && false !== $field['permissions'] ) {
406
+                            if ( ! Redux_Helpers::current_user_can( $field['permissions'] ) ) {
407
+                                $data = $core->options[ $field['id'] ] ?? $core->options_defaults[ $field['id'] ];
408
+
409
+                                $this->hidden_perm_fields[ $field['id'] ] = $data;
410
+
411
+                                continue;
412
+                            }
413
+                        }
414
+
415
+                        if ( ! isset( $field['id'] ) ) {
416
+                            echo '<br /><h3>No field ID is set.</h3><pre>';
417
+
418
+                            // phpcs:ignore WordPress.PHP.DevelopmentFunctions
419
+                            print_r( $field );
420
+
421
+                            echo '</pre><br />';
422
+
423
+                            continue;
424
+                        }
425
+
426
+                        if ( isset( $field['type'] ) && 'section' === $field['type'] ) {
427
+                            if ( isset( $field['indent'] ) && true === $field['indent'] ) {
428
+                                $section_ident = true;
429
+                            } else {
430
+                                $section_ident = false;
431
+                            }
432
+                        }
433
+
434
+                        if ( isset( $field['type'] ) && 'info' === $field['type'] && $section_ident ) {
435
+                            $field['indent'] = true;
436
+                        }
437
+
438
+                        $th = $core->render_class->get_header_html( $field );
439
+
440
+                        $field['name'] = $core->args['opt_name'] . '[' . $field['id'] . ']';
441
+
442
+                        // Set the default value if present.
443
+                        $core->options_defaults[ $field['id'] ] = $core->options_defaults[ $field['id'] ] ?? '';
444
+
445
+                        // Set the defaults to the value if not present.
446
+                        $do_update = false;
447
+
448
+                        // Check fields for values in the default parameter.
449
+                        if ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['default'] ) ) {
450
+                            $core->options_defaults[ $field['id'] ] = $field['default'];
451
+                            $core->options[ $field['id'] ]          = $field['default'];
452
+                            $do_update                              = true;
453
+
454
+                            // Check fields that hae no default value, but an option value with settings to
455
+                            // be saved by default.
456
+                        } elseif ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['options'] ) ) {
457
+
458
+                            // If a sorter field, check for options and save them as defaults.
459
+                            if ( 'sorter' === $field['type'] || 'sortable' === $field['type'] ) {
460
+                                $core->options_defaults[ $field['id'] ] = $field['options'];
461
+                                $core->options[ $field['id'] ]          = $field['options'];
462
+                                $do_update                              = true;
463
+                            }
464
+                        }
465
+
466
+                        // CORRECT URLS if media URLs are wrong, but attachment IDs are present.
467
+                        if ( 'media' === $field['type'] ) {
468
+                            if ( isset( $core->options[ $field['id'] ]['id'] ) && isset( $core->options[ $field['id'] ]['url'] ) && ! empty( $core->options[ $field['id'] ]['url'] ) && strpos( $core->options[ $field['id'] ]['url'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) {
469
+                                $data = wp_get_attachment_url( $core->options[ $field['id'] ]['id'] );
470
+
471
+                                if ( isset( $data ) && ! empty( $data ) ) {
472
+                                    $core->options[ $field['id'] ]['url'] = $data;
473
+
474
+                                    $data = wp_get_attachment_image_src(
475
+                                        $core->options[ $field['id'] ]['id'],
476
+                                        array(
477
+                                            150,
478
+                                            150,
479
+                                        )
480
+                                    );
481
+
482
+                                    $core->options[ $field['id'] ]['thumbnail'] = $data[0];
483
+                                    $do_update                                  = true;
484
+                                }
485
+                            }
486
+                        }
487
+
488
+                        if ( 'background' === $field['type'] ) {
489
+                            if ( isset( $core->options[ $field['id'] ]['media']['id'] ) && isset( $core->options[ $field['id'] ]['background-image'] ) && ! empty( $core->options[ $field['id'] ]['background-image'] ) && strpos( $core->options[ $field['id'] ]['background-image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) {
490
+                                $data = wp_get_attachment_url( $core->options[ $field['id'] ]['media']['id'] );
491
+
492
+                                if ( isset( $data ) && ! empty( $data ) ) {
493
+                                    $core->options[ $field['id'] ]['background-image'] = $data;
494
+
495
+                                    $data = wp_get_attachment_image_src(
496
+                                        $core->options[ $field['id'] ]['media']['id'],
497
+                                        array(
498
+                                            150,
499
+                                            150,
500
+                                        )
501
+                                    );
502
+
503
+                                    $core->options[ $field['id'] ]['media']['thumbnail'] = $data[0];
504
+                                    $do_update = true;
505
+                                }
506
+                            }
507
+                        }
508
+
509
+                        if ( 'slides' === $field['type'] ) {
510
+                            if ( isset( $core->options[ $field['id'] ] ) && is_array( $core->options[ $field['id'] ] ) && isset( $core->options[ $field['id'] ][0]['attachment_id'] ) && isset( $core->options[ $field['id'] ][0]['image'] ) && ! empty( $core->options[ $field['id'] ][0]['image'] ) && strpos( $core->options[ $field['id'] ][0]['image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) {
511
+                                foreach ( $core->options[ $field['id'] ] as $key => $val ) {
512
+                                    $data = wp_get_attachment_url( $val['attachment_id'] );
513
+
514
+                                    if ( isset( $data ) && ! empty( $data ) ) {
515
+                                        $core->options[ $field['id'] ][ $key ]['image'] = $data;
516
+
517
+                                        $data = wp_get_attachment_image_src(
518
+                                            $val['attachment_id'],
519
+                                            array(
520
+                                                150,
521
+                                                150,
522
+                                            )
523
+                                        );
524
+
525
+                                        $core->options[ $field['id'] ][ $key ]['thumb'] = $data[0];
526
+                                        $do_update                                      = true;
527
+                                    }
528
+                                }
529
+                            }
530
+                        }
531
+                        // END -> CORRECT URLS if media URLs are wrong, but attachment IDs are present.
532
+                        if ( true === $do_update && ! isset( $core->never_save_to_db ) ) {
533
+                            if ( $core->args['save_defaults'] ) { // Only save that to the DB if allowed to.
534
+                                $run_update = true;
535
+                            }
536
+                        }
537
+
538
+                        if ( ! isset( $field['class'] ) ) { // No errors, please.
539
+                            $field['class'] = '';
540
+                        }
541
+
542
+                        /**
543
+                         * Filter 'redux/options/{opt_name}/field/{field.id}'.
544
+                         *
545
+                         * @param array $field field config
546
+                         */
547
+
548
+                        // phpcs:ignore WordPress.NamingConventions.ValidHookName
549
+                        $field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}", $field );
550
+
551
+                        if ( empty( $field ) ) {
552
+                            unset( $core->sections[ $k ]['fields'][ $fieldk ] );
553
+                            continue;
554
+                        }
555
+
556
+                        if ( ! empty( Redux_Core::$folds[ $field['id'] ]['parent'] ) ) { // This has some fold items, hide it by default.
557
+                            $field['class'] .= ' fold';
558
+                        }
559
+
560
+                        if ( ! empty( Redux_Core::$folds[ $field['id'] ]['children'] ) ) { // Sets the values you shoe fold children on.
561
+                            $field['class'] .= ' fold-parent';
562
+                        }
563
+
564
+                        if ( ! empty( $field['compiler'] ) ) {
565
+                            $field['class']                       .= ' compiler';
566
+                            $core->compiler_fields[ $field['id'] ] = 1;
567
+                        }
568
+
569
+                        if ( isset( $field['unit'] ) && ! isset( $field['units'] ) ) {
570
+                            $field['units'] = $field['unit'];
571
+                            unset( $field['unit'] );
572
+                        }
573
+
574
+                        $core->sections[ $k ]['fields'][ $fieldk ] = $field;
575
+
576
+                        if ( isset( $core->args['display_source'] ) ) {
577
+                            // phpcs:ignore WordPress.PHP.DevelopmentFunctions
578
+                            $th .= '<div id="' . $field['id'] . '-settings" style="display:none;"><pre>' . var_export( $core->sections[ $k ]['fields'][ $fieldk ], true ) . '</pre></div>';
579
+                            $th .= '<br /><a href="#TB_inline?width=600&height=800&inlineId=' . $field['id'] . '-settings" class="thickbox"><small>View Source</small></a>';
580
+                        }
581
+
582
+                        /**
583
+                         * Action 'redux/options/{opt_name}/field/{field.type}/register'
584
+                         */
585
+
586
+                        // phpcs:ignore WordPress.NamingConventions.ValidHookName
587
+                        do_action( "redux/options/{$core->args['opt_name']}/field/{$field['type']}/register", $field );
588
+
589
+                        $core->required_class->check_dependencies( $field );
590
+                        $core->field_head[ $field['id'] ] = $th;
591
+
592
+                        if ( ! $display || isset( $this->no_panel_section[ $k ] ) ) {
593
+                            $this->no_panel[] = $field['id'];
594
+                        } else {
595
+                            if ( isset( $field['disabled'] ) && $field['disabled'] ) {
596
+                                $field['class'] .= ' redux_disable_field';
597
+                            }
598
+
599
+                            if ( isset( $field['hidden'] ) && $field['hidden'] ) {
600
+                                $field['class'] .= ' redux_hide_field';
601
+                            }
602
+
603
+                            if ( true === $core->args['options_api'] ) {
604
+                                add_settings_field(
605
+                                    "{$fieldk}_field",
606
+                                    $th,
607
+                                    array(
608
+                                        $core->render_class,
609
+                                        'field_input',
610
+                                    ),
611
+                                    "{$core->args['opt_name']}{$k}_section_group",
612
+                                    "{$core->args['opt_name']}{$k}_section",
613
+                                    $field
614
+                                );
615
+                            }
616
+                        }
617
+                    }
618
+                }
619
+            }
620
+
621
+            /**
622
+             * Action 'redux/options/{opt_name}/register'
623
+             *
624
+             * @param array $section Option sections
625
+             */
626
+
627
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
628
+            do_action( "redux/options/{$core->args['opt_name']}/register", $core->sections );
629
+
630
+            if ( $run_update && ! isset( $core->never_save_to_db ) ) { // Always update the DB with new fields.
631
+                $this->set( $core->options );
632
+            }
633
+
634
+            if ( isset( $core->transients['run_compiler'] ) && $core->transients['run_compiler'] ) {
635
+
636
+                Redux_Core::$no_output = true;
637
+                $temp                  = $core->args['output_variables_prefix'];
638
+
639
+                // Allow the override of variable's prefix for use by SCSS or LESS.
640
+                if ( isset( $core->args['compiler_output_variables_prefix'] ) ) {
641
+                    $core->args['output_variables_prefix'] = $core->args['compiler_output_variables_prefix'];
642
+                }
643
+                $core->output_class->enqueue();
644
+                $core->args['output_variables_prefix'] = $temp;
645
+
646
+                // phpcs:ignore WordPress.NamingConventions.ValidVariableName
647
+                $compiler_css = $core->compilerCSS;
648
+
649
+                /**
650
+                 * Action 'redux/options/{opt_name}/compiler'
651
+                 *
652
+                 * @param array  $options Options.
653
+                 * @param string $css CSS that get sent to the compiler hook.
654
+                 * @param array  $changed_values Changed values.
655
+                 * @param array  $output_variables Output variables.
656
+                 */
657
+
658
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
659
+                do_action( "redux/options/{$core->args['opt_name']}/compiler", $core->options, $compiler_css, $core->transients['changed_values'], $core->output_variables );
660
+
661
+                /**
662
+                 * Action 'redux/options/{opt_name}/compiler/advanced'
663
+                 *
664
+                 * @param object $redux ReduxFramework object.
665
+                 */
666
+
667
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
668
+                do_action( "redux/options/{$core->args['opt_name']}/compiler/advanced", $core );
669
+
670
+                unset( $core->transients['run_compiler'] );
671
+                $core->transient_class->set();
672
+            }
673
+        }
674
+
675
+        /**
676
+         * Get default options into an array suitable for the settings API
677
+         *
678
+         * @since       1.0.0
679
+         * @access      public
680
+         * @return      array $this->options_defaults
681
+         */
682
+        public function default_values(): array {
683
+            $core = $this->core();
684
+
685
+            if ( ! is_null( $core->sections ) && is_null( $core->options_defaults ) ) {
686
+                $core->options_defaults = $core->options_defaults_class->default_values( $core->args['opt_name'], $core->sections, $core->wordpress_data );
687
+            }
688
+
689
+            /**
690
+             * Filter 'redux/options/{opt_name}/defaults'
691
+             *
692
+             * @param array $defaults option default values
693
+             */
694
+
695
+            $core->transients['changed_values'] = $core->transients['changed_values'] ?? array();
696
+
697
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
698
+            $core->options_defaults = apply_filters( "redux/options/{$core->args['opt_name']}/defaults", $core->options_defaults, $core->transients['changed_values'] );
699
+
700
+            return $core->options_defaults;
701
+        }
702
+
703
+        /**
704
+         * Validate the Options before insertion
705
+         *
706
+         * @param  array $plugin_options The option array.
707
+         *
708
+         * @return array|mixed|string
709
+         * @since  3.0.0
710
+         * @access public
711
+         */
712
+        public function validate_options( array $plugin_options ) {
713
+            $core = $this->core();
714
+
715
+            if ( true === Redux_Core::$validation_ran ) {
716
+                return $plugin_options;
717
+            }
718
+
719
+            Redux_Core::$validation_ran = true;
720
+
721
+            // Save the values not in the panel.
722
+            if ( isset( $plugin_options['redux-no_panel'] ) ) {
723
+                $keys = explode( '|', $plugin_options['redux-no_panel'] );
724
+                foreach ( $keys as $key ) {
725
+                    $plugin_options[ $key ] = $core->options[ $key ];
726
+                }
727
+                if ( isset( $plugin_options['redux-no_panel'] ) ) {
728
+                    unset( $plugin_options['redux-no_panel'] );
729
+                }
730
+            }
731
+
732
+            if ( is_array( $this->hidden_perm_fields ) && ! empty( $this->hidden_perm_fields ) ) {
733
+                foreach ( $this->hidden_perm_fields as $id => $data ) {
734
+                    $plugin_options[ $id ] = $data;
735
+                }
736
+            }
737
+
738
+            if ( $plugin_options === $core->options ) {
739
+                return $plugin_options;
740
+            }
741
+
742
+            $time = time();
743
+
744
+            // Sets last saved time.
745
+            $core->transients['last_save'] = $time;
746
+
747
+            $imported_options = array();
748
+
749
+            if ( isset( $plugin_options['import_code'] ) && '' !== $plugin_options['import_code'] ) {
750
+                $imported_options = json_decode( $plugin_options['import_code'], true );
751
+            }
752
+
753
+            // Import.
754
+            $core->transients['last_save_mode'] = 'import'; // Last save mode.
755
+            $core->transients['last_compiler']  = $time;
756
+            $core->transients['last_import']    = $time;
757
+            $core->transients['run_compiler']   = 1;
758
+
759
+            if ( is_array( $imported_options ) && ! empty( $imported_options ) && isset( $imported_options['redux-backup'] ) && ( 1 === $imported_options['redux-backup'] || '1' === $imported_options['redux-backup'] ) ) {
760
+                $core->transients['changed_values'] = array();
761
+                foreach ( $plugin_options as $key => $value ) {
762
+                    if ( isset( $imported_options[ $key ] ) && $value !== $imported_options[ $key ] ) {
763
+                        $plugin_options[ $key ]                     = $value;
764
+                        $core->transients['changed_values'][ $key ] = $value;
765
+                    }
766
+                }
767
+
768
+                /**
769
+                 * Action 'redux/options/{opt_name}/import'.
770
+                 *
771
+                 * @param  &array [&$plugin_options, redux_options]
772
+                 */
773
+
774
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
775
+                do_action_ref_array(
776
+                    "redux/options/{$core->args['opt_name']}/import", // phpcs:ignore WordPress.NamingConventions.ValidHookName
777
+                    array(
778
+                        &$plugin_options,
779
+                        $imported_options,
780
+                        $core->transients['changed_values'],
781
+                    )
782
+                );
783
+
784
+                setcookie( 'redux_current_tab_' . $core->args['opt_name'], '', 1, '/', $time + 1000, '/' );
785
+                $_COOKIE[ 'redux_current_tab_' . $core->args['opt_name'] ] = 1;
786
+
787
+                unset( $plugin_options['defaults'], $plugin_options['compiler'], $plugin_options['import'], $plugin_options['import_code'] );
788
+                if ( in_array( $core->args['database'], array( 'transient', 'theme_mods', 'theme_mods_expanded', 'network' ), true ) ) {
789
+                    $this->set( $plugin_options );
790
+
791
+                    return null;
792
+                }
793
+
794
+                $plugin_options = wp_parse_args( $imported_options, $plugin_options );
795
+
796
+                $core->transient_class->set();
797
+
798
+                return $plugin_options;
799
+            }
800
+
801
+            // Reset all to defaults.
802
+            if ( ! empty( $plugin_options['defaults'] ) ) {
803
+                if ( empty( $core->options_defaults ) ) {
804
+                    $core->options_defaults = $core->_default_values();
805
+                }
806
+
807
+                /**
808
+                 * Filter: 'redux/validate/{opt_name}/defaults'.
809
+                 *
810
+                 * @param  &array [ $this->options_defaults, $plugin_options]
811
+                 */
812
+
813
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
814
+                $plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/defaults", $core->options_defaults );
815
+
816
+                $core->transients['changed_values'] = array();
817
+
818
+                if ( empty( $core->options ) ) {
819
+                    $core->options = $core->options_defaults;
820
+                }
821
+
822
+                foreach ( $core->options as $key => $value ) {
823
+                    if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
824
+                        $core->transients['changed_values'][ $key ] = $value;
825
+                    }
826
+                }
827
+
828
+                $core->transients['run_compiler']   = 1;
829
+                $core->transients['last_save_mode'] = 'defaults'; // Last save mode.
830
+
831
+                $core->transient_class->set();
832
+
833
+                return $plugin_options;
834
+            }
835
+
836
+            // Section reset to default.
837
+            if ( ! empty( $plugin_options['defaults-section'] ) ) {
838
+                if ( isset( $plugin_options['redux-section'] ) && isset( $core->sections[ $plugin_options['redux-section'] ]['fields'] ) ) {
839
+                    if ( empty( $core->options_defaults ) ) {
840
+                        $core->options_defaults = $core->_default_values();
841
+                    }
842
+
843
+                    foreach ( $core->sections[ $plugin_options['redux-section'] ]['fields'] as $field ) {
844
+                        if ( 'tabbed' === $field['type'] ) {
845
+                            if ( ! empty( $field['tabs'] ) ) {
846
+                                foreach ( $field['tabs'] as $val ) {
847
+                                    if ( ! empty( $val['fields'] ) ) {
848
+                                        foreach ( $val['fields'] as $f ) {
849
+                                            if ( isset( $core->options_defaults[ $f['id'] ] ) ) {
850
+                                                $plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ];
851
+                                            } else {
852
+                                                $plugin_options[ $f['id'] ] = '';
853
+                                            }
854
+                                        }
855
+                                    }
856
+                                }
857
+                            }
858
+                        } elseif ( 'repeater' === $field['type'] ) {
859
+                            if ( ! empty( $field['fields'] ) ) {
860
+                                foreach ( $field['fields'] as $f ) {
861
+                                    if ( isset( $core->options_defaults[ $f['id'] ] ) ) {
862
+                                        $plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ];
863
+                                    } else {
864
+                                        $plugin_options[ $f['id'] ] = '';
865
+                                    }
866
+                                }
867
+                            }
868
+                        } else {
869
+                            if ( isset( $core->options_defaults[ $field['id'] ] ) ) {
870
+                                $plugin_options[ $field['id'] ] = $core->options_defaults[ $field['id'] ];
871
+                            } else {
872
+                                $plugin_options[ $field['id'] ] = '';
873
+                            }
874
+                        }
875
+
876
+                        if ( isset( $field['compiler'] ) ) {
877
+                            $compiler = true;
878
+                        }
879
+                    }
880
+
881
+                    /**
882
+                     * Filter: 'redux/validate/{opt_name}/defaults_section'.
883
+                     *
884
+                     * @param  &array [ $this->options_defaults, $plugin_options]
885
+                     */
886
+
887
+                    // phpcs:ignore WordPress.NamingConventions.ValidHookName
888
+                    $plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/defaults_section", $plugin_options );
889
+                }
890
+
891
+                $core->transients['changed_values'] = array();
892
+
893
+                foreach ( $core->options as $key => $value ) {
894
+                    if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
895
+                        $core->transients['changed_values'][ $key ] = $value;
896
+                    }
897
+                }
898
+
899
+                if ( isset( $compiler ) ) {
900
+                    $core->transients['last_compiler'] = $time;
901
+                    $core->transients['run_compiler']  = 1;
902
+                }
903
+
904
+                $core->transients['last_save_mode'] = 'defaults_section'; // Last save mode.
905
+
906
+                unset( $plugin_options['defaults'], $plugin_options['defaults_section'], $plugin_options['import'], $plugin_options['import_code'], $plugin_options['import_link'], $plugin_options['compiler'], $plugin_options['redux-section'] );
907
+
908
+                $core->transient_class->set();
909
+
910
+                return $plugin_options;
911
+            }
912
+
913
+            $core->transients['last_save_mode'] = 'normal'; // Last save mode.
914
+
915
+            /**
916
+             * Filter: 'redux/validate/{opt_name}/before_validation'
917
+             *
918
+             * @param  &array [&$plugin_options, redux_options]
919
+             */
920
+
921
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
922
+            $plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/before_validation", $plugin_options, $core->options );
923
+
924
+            // Validate fields (if needed).
925
+            $plugin_options = $core->validate_class->validate( $plugin_options, $core->options, $core->sections );
926
+
927
+            // Sanitize options, if needed.
928
+            $plugin_options = $core->sanitize_class->sanitize( $plugin_options, $core->options, $core->sections );
929
+
930
+            if ( ! empty( $core->errors ) || ! empty( $core->warnings ) || ! empty( $core->sanitize ) ) {
931
+                $core->transients['notices'] = array(
932
+                    'errors'   => $core->errors,
933
+                    'warnings' => $core->warnings,
934
+                    'sanitize' => $core->sanitize,
935
+                );
936
+            }
937
+
938
+            if ( ! isset( $core->transients['changed_values'] ) ) {
939
+                $core->transients['changed_values'] = array();
940
+            }
941
+
942
+            /**
943
+             * Action 'redux/options/{opt_name}/validate'
944
+             *
945
+             * @param  &array [&$plugin_options, redux_options]
946
+             */
947
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
948
+            do_action_ref_array(
949
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
950
+                "redux/options/{$core->args['opt_name']}/validate",
951
+                array(
952
+                    &$plugin_options,
953
+                    $core->options,
954
+                    $core->transients['changed_values'],
955
+                )
956
+            );
957
+
958
+            if ( ! empty( $plugin_options['compiler'] ) ) {
959
+                unset( $plugin_options['compiler'] );
960
+
961
+                $core->transients['last_compiler'] = $time;
962
+                $core->transients['run_compiler']  = 1;
963
+            }
964
+
965
+            $core->transients['changed_values'] = array(); // Changed values since last save.
966
+
967
+            if ( ! empty( $core->options ) ) {
968
+                foreach ( $core->options as $key => $value ) {
969
+                    if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
970
+                        $core->transients['changed_values'][ $key ] = $value;
971
+                    }
972
+                }
973
+            }
974
+
975
+            unset( $plugin_options['defaults'], $plugin_options['defaults_section'], $plugin_options['import'], $plugin_options['import_code'], $plugin_options['import_link'], $plugin_options['compiler'], $plugin_options['redux-section'] );
976
+            if ( in_array( $core->args['database'], array( 'transient', 'theme_mods', 'theme_mods_expanded' ), true ) ) {
977
+                $core->set( $core->args['opt_name'], $plugin_options );
978
+                return null;
979
+            }
980
+
981
+            if ( defined( 'WP_CACHE' ) && WP_CACHE && class_exists( 'W3_ObjectCache' ) && function_exists( 'w3_instance' ) ) {
982
+                $w3_inst = w3_instance( 'W3_ObjectCache' );
983
+                $w3      = $w3_inst->instance();
984
+                $key     = $w3->_get_cache_key( $core->args['opt_name'] . '-transients', 'transient' );
985
+                $w3->delete( $key, 'transient', true );
986
+            }
987
+
988
+            $core->transient_class->set();
989
+
990
+            return $plugin_options;
991
+        }
992
+
993
+        /**
994
+         * ->get_default(); This is used to return the default value if default_show is set.
995
+         *
996
+         * @param string $opt_name The option name to return.
997
+         * @param mixed  $defaults (null) The value to return if default not set.
998
+         *
999
+         * @return      mixed $default
1000
+         * @since       1.0.1
1001
+         * @access      public
1002
+         */
1003
+        public function get_default( string $opt_name, $defaults = null ) {
1004
+            if ( true === $this->args['default_show'] ) {
1005
+
1006
+                if ( empty( $this->options_defaults ) ) {
1007
+                    $this->default_values(); // fill cache.
1008
+                }
1009
+
1010
+                return array_key_exists( $opt_name, $this->options_defaults ) ? $this->options_defaults[ $opt_name ] : $defaults;
1011
+            }
1012
+
1013
+            return '';
1014
+        }
1015
+
1016
+        /**
1017
+         * Get the default value for an option
1018
+         *
1019
+         * @param string $key       The option's ID.
1020
+         * @param string $array_key The key of the default's array.
1021
+         *
1022
+         * @return mixed
1023
+         * @since  3.3.6
1024
+         * @access public
1025
+         */
1026
+        public function get_default_value( string $key, $array_key = false ) {
1027
+            if ( empty( $this->options_defaults ) ) {
1028
+                $this->options_defaults = $this->default_values();
1029
+            }
1030
+
1031
+            $defaults = $this->options_defaults;
1032
+            $value    = '';
1033
+
1034
+            if ( isset( $defaults[ $key ] ) ) {
1035
+                if ( false !== $array_key && isset( $defaults[ $key ][ $array_key ] ) ) {
1036
+                    $value = $defaults[ $key ][ $array_key ];
1037
+                } else {
1038
+                    $value = $defaults[ $key ];
1039
+                }
1040
+            }
1041
+
1042
+            return $value;
1043
+        }
1044
+    }
1045 1045
 }
Please login to merge, or discard this patch.
redux-core/class-redux-core.php 2 patches
Indentation   +614 added lines, -614 removed lines patch added patch discarded remove patch
@@ -11,620 +11,620 @@
 block discarded – undo
11 11
 
12 12
 if ( ! class_exists( 'Redux_Core', false ) ) {
13 13
 
14
-	/**
15
-	 * Class Redux_Core
16
-	 */
17
-	class Redux_Core {
18
-
19
-		/**
20
-		 * Class instance.
21
-		 *
22
-		 * @var null|Redux_Core
23
-		 */
24
-		public static ?Redux_Core $instance = null;
25
-
26
-		/**
27
-		 * Project version
28
-		 *
29
-		 * @var string
30
-		 */
31
-		public static string $version;
32
-
33
-		/**
34
-		 * Project directory.
35
-		 *
36
-		 * @var string.
37
-		 */
38
-		public static string $dir;
39
-
40
-		/**
41
-		 * Project URL.
42
-		 *
43
-		 * @var string.
44
-		 */
45
-		public static string $url;
46
-
47
-		/**
48
-		 * Base directory path.
49
-		 *
50
-		 * @var string
51
-		 */
52
-		public static string $redux_path;
53
-
54
-		/**
55
-		 * Absolute direction path to WordPress upload directory.
56
-		 *
57
-		 * @var string
58
-		 */
59
-		public static string $upload_dir = '';
60
-
61
-		/**
62
-		 * Full URL to WordPress upload directory.
63
-		 *
64
-		 * @var null|string
65
-		 */
66
-		public static ?string $upload_url = '';
67
-
68
-		/**
69
-		 * Set when Redux is run as a plugin.
70
-		 *
71
-		 * @var bool
72
-		 */
73
-		public static bool $is_plugin = true;
74
-
75
-		/**
76
-		 * Indicated in_theme or in_plugin.
77
-		 *
78
-		 * @var string
79
-		 */
80
-		public static string $installed = '';
81
-
82
-		/**
83
-		 * Set when Redux is run as a plugin.
84
-		 *
85
-		 * @var bool
86
-		 */
87
-		public static bool $as_plugin = false;
88
-
89
-		/**
90
-		 * Set when Redux is embedded within a theme.
91
-		 *
92
-		 * @var bool
93
-		 */
94
-		public static bool $in_theme = false;
95
-
96
-		/**
97
-		 * Pointer to an updated Google fonts array.
98
-		 *
99
-		 * @var array|null
100
-		 */
101
-		public static ?array $updated_google_fonts = array();
102
-
103
-		/**
104
-		 * List of files calling Redux.
105
-		 *
106
-		 * @var array|null
107
-		 */
108
-		public static ?array $callers = array();
109
-
110
-		/**
111
-		 * Pointer to _SERVER global.
112
-		 *
113
-		 * @var array|null
114
-		 */
115
-		public static ?array $server = array();
116
-
117
-		/**
118
-		 * Field folding information for localization.
119
-		 *
120
-		 * @var null|array
121
-		 */
122
-		public static ?array $required = array();
123
-
124
-		/**
125
-		 * Field child-folding information for localization.
126
-		 *
127
-		 * @var null|array
128
-		 */
129
-		public static ?array $required_child = array();
130
-
131
-		/**
132
-		 * Array of fields to be folded.
133
-		 *
134
-		 * @var array|null
135
-		 */
136
-		public static ?array $folds = array();
137
-
138
-		/**
139
-		 * Array of fields that didn't pass the fold dependency test and are hidden.
140
-		 *
141
-		 * @var null|array
142
-		 */
143
-		public static ?array $fields_hidden = array();
144
-
145
-		/**
146
-		 * Values to generate google font CSS.
147
-		 *
148
-		 * @var null|array
149
-		 */
150
-		public static ?array $typography = array();
151
-
152
-		/**
153
-		 * Validation ran flag.
154
-		 *
155
-		 * @var bool
156
-		 */
157
-		public static bool $validation_ran = false;
158
-
159
-		/**
160
-		 * No output flag.
161
-		 *
162
-		 * @var bool
163
-		 */
164
-		public static bool $no_output = false;
165
-
166
-		/**
167
-		 * Array of fonts used by the panel for localization.
168
-		 *
169
-		 * @var null|array
170
-		 */
171
-		public static ?array $fonts = array();
172
-
173
-		/**
174
-		 * Array of Google fonts used by the panel for localization.
175
-		 *
176
-		 * @var null|array
177
-		 */
178
-		public static ?array $google_array = array();
179
-
180
-		/**
181
-		 * Array of various font groups used within the typography field.
182
-		 *
183
-		 * @var null|array
184
-		 */
185
-		public static ?array $font_groups = array();
186
-
187
-		/**
188
-		 * File system object used for I/O file operations.  Done the WordPress way.
189
-		 *
190
-		 * @var null|object
191
-		 */
192
-		public static ?object $filesystem;
193
-
194
-		/**
195
-		 * Pointer to the third party fixes class.
196
-		 *
197
-		 * @var Redux_ThirdParty_Fixes
198
-		 */
199
-		public static Redux_ThirdParty_Fixes $third_party_fixes;
200
-
201
-		/**
202
-		 * Redux Welcome screen object.
203
-		 *
204
-		 * @var Redux_Welcome
205
-		 */
206
-		public static Redux_Welcome $welcome;
207
-
208
-		/**
209
-		 * Creates instance of class.
210
-		 *
211
-		 * @return Redux_Core
212
-		 * @throws Exception Comment.
213
-		 */
214
-		public static function instance(): ?Redux_Core {
215
-			if ( ! self::$instance ) {
216
-				self::$instance = new self();
217
-
218
-				self::$instance->includes();
219
-				self::$instance->init();
220
-				self::$instance->hooks();
221
-
222
-				add_action( 'plugins_loaded', array( 'Redux_Core', 'plugins_loaded' ) );
223
-			}
224
-
225
-			return self::$instance;
226
-		}
227
-
228
-		/**
229
-		 * Things to run after pluggable.php had loaded.
230
-		 */
231
-		public static function plugins_loaded() {}
232
-
233
-		/**
234
-		 * Class init.
235
-		 */
236
-		private function init() {
237
-			self::$server = array(
238
-				'SERVER_SOFTWARE' => '',
239
-				'REMOTE_ADDR'     => Redux_Helpers::is_local_host() ? '127.0.0.1' : '',
240
-				'HTTP_USER_AGENT' => '',
241
-				'HTTP_HOST'       => '',
242
-				'REQUEST_URI'     => '',
243
-			);
244
-
245
-			// phpcs:disable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
246
-			if ( ! empty( $_SERVER['SERVER_SOFTWARE'] ) ) {
247
-				self::$server['SERVER_SOFTWARE'] = sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) );
248
-			}
249
-			if ( ! empty( $_SERVER['REMOTE_ADDR'] ) ) {
250
-				self::$server['REMOTE_ADDR'] = sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) );
251
-			}
252
-			if ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) {
253
-				self::$server['HTTP_USER_AGENT'] = sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) );
254
-			}
255
-			if ( ! empty( $_SERVER['HTTP_HOST'] ) ) {
256
-				self::$server['HTTP_HOST'] = sanitize_text_field( wp_unslash( $_SERVER['HTTP_HOST'] ) );
257
-			}
258
-			if ( ! empty( $_SERVER['REQUEST_URI'] ) ) {
259
-				self::$server['REQUEST_URI'] = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) );
260
-			}
261
-
262
-			// phpcs:enable
263
-
264
-			self::$dir = trailingslashit( wp_normalize_path( dirname( realpath( __FILE__ ) ) ) );
265
-
266
-			Redux_Functions_Ex::generator();
267
-
268
-			if ( defined( 'REDUX_PLUGIN_FILE' ) ) {
269
-				$plugin_info = Redux_Functions_Ex::is_inside_plugin( REDUX_PLUGIN_FILE );
270
-			}
271
-
272
-			$plugin_info = Redux_Functions_Ex::is_inside_plugin( __FILE__ );
273
-
274
-			if ( false !== $plugin_info ) {
275
-				self::$installed = class_exists( 'Redux_Framework_Plugin' ) ? 'plugin' : 'in_plugin';
276
-				self::$is_plugin = class_exists( 'Redux_Framework_Plugin' );
277
-				self::$as_plugin = true;
278
-				self::$url       = trailingslashit( dirname( $plugin_info['url'] ) );
279
-			} else {
280
-				$theme_info = Redux_Functions_Ex::is_inside_theme( __FILE__ );
281
-				if ( false !== $theme_info ) {
282
-					self::$url       = trailingslashit( dirname( $theme_info['url'] ) );
283
-					self::$in_theme  = true;
284
-					self::$installed = 'in_theme';
285
-				}
286
-			}
287
-
288
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
289
-			self::$url = apply_filters( 'redux/url', self::$url );
290
-
291
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
292
-			self::$dir = apply_filters( 'redux/dir', self::$dir );
293
-
294
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
295
-			self::$is_plugin = apply_filters( 'redux/is_plugin', self::$is_plugin );
296
-
297
-			if ( ! function_exists( 'current_time' ) ) {
298
-				require_once ABSPATH . '/wp-includes/functions.php';
299
-			}
300
-
301
-			$upload_dir       = wp_upload_dir();
302
-			self::$upload_dir = $upload_dir['basedir'] . '/redux/';
303
-			self::$upload_url = str_replace( array( 'https://', 'http://' ), '//', $upload_dir['baseurl'] . '/redux/' );
304
-
305
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
306
-			self::$upload_dir = apply_filters( 'redux/upload_dir', self::$upload_dir );
307
-
308
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
309
-			self::$upload_url = apply_filters( 'redux/upload_url', self::$upload_url );
310
-		}
311
-
312
-		/**
313
-		 * Code to execute on a framework __construct.
314
-		 *
315
-		 * @param ReduxFramework $redux Pointer to ReduxFramework object.
316
-		 */
317
-		public static function core_construct( ReduxFramework $redux ) {
318
-			self::$third_party_fixes = new Redux_ThirdParty_Fixes( $redux );
319
-
320
-			Redux_ThemeCheck::get_instance();
321
-		}
322
-
323
-		/**
324
-		 * Autoregister run.
325
-		 *
326
-		 * @throws Exception Comment.
327
-		 */
328
-		private function includes() {
329
-			if ( is_admin() ) {
330
-				if ( class_exists( 'Redux_Pro' ) && isset( Redux_Pro::$dir ) ) {
331
-					echo '<div class="error"><p>' . sprintf( esc_html__( 'Redux has detected the Redux Pro plugin is enabled. All featured of Redux Pro are now part of the entire Redux plugin and is no longer required. Please disable the Redux Pro plugin to avoid potential conflicts.', 'redux-framework' ), '<code></code>' ) . '</p></div>';
332
-				}
333
-			}
334
-
335
-			require_once __DIR__ . '/inc/classes/class-redux-path.php';
336
-			require_once __DIR__ . '/inc/classes/class-redux-functions-ex.php';
337
-			require_once __DIR__ . '/inc/classes/class-redux-helpers.php';
338
-			require_once __DIR__ . '/inc/classes/class-redux-instances.php';
339
-
340
-			Redux_Functions_Ex::register_class_path( 'Redux', __DIR__ . '/inc/classes' );
341
-			Redux_Functions_Ex::register_class_path( 'Redux', __DIR__ . '/inc/welcome' );
342
-
343
-			spl_autoload_register( array( $this, 'register_classes' ) );
344
-
345
-			self::$welcome = new Redux_Welcome();
346
-
347
-			add_filter( 'debug_information', array( $this, 'add_debug_info' ) );
348
-		}
349
-
350
-		/**
351
-		 * Add debug info for the WP Site Health screen.
352
-		 *
353
-		 * @param array $debug_info Debug data.
354
-		 *
355
-		 * @return array
356
-		 * @throws ReflectionException Exception.
357
-		 */
358
-		public function add_debug_info( array $debug_info ): array {
359
-
360
-			// Get browser data.
361
-			if ( ! class_exists( 'ReduxBrowser' ) ) {
362
-				require_once self::$dir . 'inc/lib/browser.php';
363
-			}
364
-
365
-			$browser = new ReduxBrowser();
366
-
367
-			$browser_data = array(
368
-				'Agent'    => $browser->getUserAgent(),
369
-				'Browser'  => $browser->getBrowser(),
370
-				'Version'  => $browser->getVersion(),
371
-				'Platform' => $browser->getPlatform(),
372
-			);
373
-
374
-			// Set Redux dir permission results to Site Health screen.
375
-			$debug_info['wp-filesystem']['fields'][] = array(
376
-				'label' => esc_html__( 'The Redux upload directory', 'redux-framework' ),
377
-				'value' => wp_is_writable( self::$upload_dir ) ? 'Writable' : 'Not writable',
378
-			);
379
-
380
-			// Set Redux plugin results to Site Health screen.
381
-			$debug_info['redux-framework'] = array(
382
-				'label'       => esc_html__( 'Redux Framework', 'redux-framework' ),
383
-				'description' => esc_html__( 'Debug information specific to Redux Framework.', 'redux-framework' ),
384
-				'fields'      => array(
385
-					'version'        => array(
386
-						'label' => esc_html__( 'Version', 'redux-framework' ),
387
-						'value' => self::$version,
388
-					),
389
-					'installation'   => array(
390
-						'label' => esc_html__( 'Installation', 'redux-framework' ),
391
-						'value' => self::$installed,
392
-					),
393
-					'data directory' => array(
394
-						'label' => esc_html__( 'Data directory', 'redux-framework' ),
395
-						'value' => self::$dir,
396
-					),
397
-					'browser'        => array(
398
-						'label' => esc_html__( 'Browser', 'redux-framework' ),
399
-						'value' => $browser_data,
400
-					),
401
-				),
402
-			);
403
-
404
-			$redux = Redux::all_instances();
405
-
406
-			$extensions = array();
407
-
408
-			if ( ! empty( $redux ) && is_array( $redux ) ) {
409
-				foreach ( $redux as $inst => $data ) {
410
-					Redux::init( $inst );
411
-
412
-					$inst_name = ucwords( str_replace( array( '_', '-' ), ' ', $inst ) );
413
-					$args      = $data->args;
414
-
415
-					$ext = Redux::get_extensions( $inst );
416
-					if ( ! empty( $ext ) && is_array( $ext ) ) {
417
-						ksort( $ext );
418
-
419
-						foreach ( $ext as $name => $arr ) {
420
-							$ver = $arr['version'];
421
-
422
-							$ex = esc_html( ucwords( str_replace( array( '_', '-' ), ' ', $name ) ) );
423
-
424
-							$extensions[ $ex ] = esc_html( $ver );
425
-						}
426
-					}
427
-
428
-					// Output Redux instances.
429
-					$debug_info[ 'redux-instance-' . $inst ] = array(
430
-						// translators: %s = Instance name.
431
-						'label'       => sprintf( esc_html__( 'Redux Instance: %s', 'redux-framework' ), $inst_name ),
432
-						// translators: %s = Instance name w/ HTML.
433
-						'description' => sprintf( esc_html__( 'Debug information for the %s Redux instance.', 'redux-framework' ), '<code>' . $inst . '</code>' ),
434
-						'fields'      => array(
435
-							'opt_name'         => array(
436
-								'label' => esc_html( 'opt_name' ),
437
-								'value' => $args['opt_name'],
438
-							),
439
-							'global_variable'  => array(
440
-								'label' => esc_html( 'global_variable' ),
441
-								'value' => $args['global_variable'],
442
-							),
443
-							'dev_mode'         => array(
444
-								'label' => esc_html( 'dev_mode' ),
445
-								'value' => $args['dev_mode'] ? 'true' : 'false',
446
-							),
447
-							'ajax_save'        => array(
448
-								'label' => esc_html( 'ajax_save' ),
449
-								'value' => $args['ajax_save'] ? 'true' : 'false',
450
-							),
451
-							'page_slug'        => array(
452
-								'label' => esc_html( 'page_slug' ),
453
-								'value' => $args['page_slug'],
454
-							),
455
-							'page_permissions' => array(
456
-								'label' => esc_html( 'page_permissions' ),
457
-								'value' => $args['page_permissions'],
458
-							),
459
-							'menu_type'        => array(
460
-								'label' => esc_html( 'menu_type' ),
461
-								'value' => $args['menu_type'],
462
-							),
463
-							'page_parent'      => array(
464
-								'label' => esc_html( 'page_parent' ),
465
-								'value' => $args['page_parent'],
466
-							),
467
-							'compiler'         => array(
468
-								'label' => esc_html( 'compiler' ),
469
-								'value' => $args['compiler'] ? 'true' : 'false',
470
-							),
471
-							'output'           => array(
472
-								'label' => esc_html( 'output' ),
473
-								'value' => $args['output'] ? 'true' : 'false',
474
-							),
475
-							'output_tag'       => array(
476
-								'label' => esc_html( 'output_tag' ),
477
-								'value' => $args['output_tag'] ? 'true' : 'false',
478
-							),
479
-							'templates_path'   => array(
480
-								'label' => esc_html( 'templates_path' ),
481
-								'value' => $args['templates_path'],
482
-							),
483
-							'extensions'       => array(
484
-								'label' => esc_html( 'extensions' ),
485
-								'value' => $extensions,
486
-							),
487
-						),
488
-					);
489
-				}
490
-			}
491
-
492
-			return $debug_info;
493
-		}
494
-
495
-		/**
496
-		 * Register callback for autoload.
497
-		 *
498
-		 * @param string $class_name name of class.
499
-		 */
500
-		public function register_classes( string $class_name ) {
501
-			$class_name_test = self::strtolower( $class_name );
502
-
503
-			if ( strpos( $class_name_test, 'redux' ) === false ) {
504
-				return;
505
-			}
506
-
507
-			if ( ! class_exists( 'Redux_Functions_Ex' ) ) {
508
-				require_once Redux_Path::get_path( '/inc/classes/class-redux-functions-ex.php' );
509
-			}
510
-
511
-			if ( ! class_exists( $class_name ) ) {
512
-				// Backward compatibility for extensions sucks!
513
-				if ( 'Redux_Instances' === $class_name ) {
514
-					require_once Redux_Path::get_path( '/inc/classes/class-redux-instances.php' );
515
-					require_once Redux_Path::get_path( '/inc/lib/redux-instances.php' );
516
-
517
-					return;
518
-				}
519
-
520
-				// Load Redux APIs.
521
-				if ( 'Redux' === $class_name ) {
522
-					require_once Redux_Path::get_path( '/inc/classes/class-redux-api.php' );
523
-
524
-					return;
525
-				}
526
-
527
-				// Redux extra theme checks.
528
-				if ( 'Redux_ThemeCheck' === $class_name ) {
529
-					require_once Redux_Path::get_path( '/inc/themecheck/class-redux-themecheck.php' );
530
-
531
-					return;
532
-				}
533
-
534
-				if ( 'Redux_Welcome' === $class_name ) {
535
-					require_once Redux_Path::get_path( '/inc/welcome/class-redux-welcome.php' );
536
-
537
-					return;
538
-				}
539
-
540
-				$mappings = array(
541
-					'ReduxFrameworkInstances'  => 'Redux_Instances',
542
-					'reduxCorePanel'           => 'Redux_Panel',
543
-					'reduxCoreEnqueue'         => 'Redux_Enqueue',
544
-					'Redux_Abstract_Extension' => 'Redux_Extension_Abstract',
545
-				);
546
-				$alias    = false;
547
-				if ( isset( $mappings[ $class_name ] ) ) {
548
-					$alias      = $class_name;
549
-					$class_name = $mappings[ $class_name ];
550
-				}
551
-
552
-				// Everything else.
553
-				$file = 'class.' . $class_name_test . '.php';
554
-
555
-				$class_path = Redux_Path::get_path( '/inc/classes/' . $file );
556
-
557
-				if ( ! file_exists( $class_path ) ) {
558
-					$class_file_name = str_replace( '_', '-', $class_name );
559
-					$file            = 'class-' . $class_name_test . '.php';
560
-					$class_path      = Redux_Path::get_path( '/inc/classes/' . $file );
561
-				}
562
-
563
-				if ( file_exists( $class_path ) && ! class_exists( $class_name ) ) {
564
-					require_once $class_path;
565
-				}
566
-				if ( class_exists( $class_name ) && ! empty( $alias ) && ! class_exists( $alias ) ) {
567
-					class_alias( $class_name, $alias );
568
-				}
569
-			}
570
-
571
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
572
-			do_action( 'redux/core/includes', $this );
573
-		}
574
-
575
-		/**
576
-		 * Hooks to run on instance creation.
577
-		 */
578
-		private function hooks() {
579
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
580
-			do_action( 'redux/core/hooks', $this );
581
-		}
582
-
583
-		/**
584
-		 * Action to run on WordPress heartbeat.
585
-		 *
586
-		 * @return bool
587
-		 */
588
-		public static function is_heartbeat(): bool {
589
-			// Disregard WP AJAX 'heartbeat' call.  Why waste resources?
590
-			if ( isset( $_POST ) && isset( $_POST['_nonce'] ) && wp_verify_nonce( sanitize_key( wp_unslash( $_POST['_nonce'] ) ), 'heartbeat-nonce' ) ) {
591
-
592
-				if ( isset( $_POST['action'] ) && 'heartbeat' === sanitize_text_field( wp_unslash( $_POST['action'] ) ) ) {
593
-
594
-					// Hook, for purists.
595
-					if ( has_action( 'redux/ajax/heartbeat' ) ) {
596
-						// phpcs:ignore WordPress.NamingConventions.ValidHookName
597
-						do_action( 'redux/ajax/heartbeat' );
598
-					}
599
-
600
-					return true;
601
-				}
602
-
603
-				return false;
604
-			}
605
-
606
-			// Buh bye!
607
-			return false;
608
-		}
609
-
610
-		/**
611
-		 * Helper method to check for mb_strtolower or to use the standard strtolower.
612
-		 *
613
-		 * @param string|null $str String to make lowercase.
614
-		 *
615
-		 * @return string|null
616
-		 */
617
-		public static function strtolower( ?string $str ): string {
618
-			if ( function_exists( 'mb_strtolower' ) && function_exists( 'mb_detect_encoding' ) ) {
619
-				return mb_strtolower( $str, mb_detect_encoding( $str ) );
620
-			} else {
621
-				return strtolower( $str );
622
-			}
623
-		}
624
-	}
625
-
626
-	/*
14
+    /**
15
+     * Class Redux_Core
16
+     */
17
+    class Redux_Core {
18
+
19
+        /**
20
+         * Class instance.
21
+         *
22
+         * @var null|Redux_Core
23
+         */
24
+        public static ?Redux_Core $instance = null;
25
+
26
+        /**
27
+         * Project version
28
+         *
29
+         * @var string
30
+         */
31
+        public static string $version;
32
+
33
+        /**
34
+         * Project directory.
35
+         *
36
+         * @var string.
37
+         */
38
+        public static string $dir;
39
+
40
+        /**
41
+         * Project URL.
42
+         *
43
+         * @var string.
44
+         */
45
+        public static string $url;
46
+
47
+        /**
48
+         * Base directory path.
49
+         *
50
+         * @var string
51
+         */
52
+        public static string $redux_path;
53
+
54
+        /**
55
+         * Absolute direction path to WordPress upload directory.
56
+         *
57
+         * @var string
58
+         */
59
+        public static string $upload_dir = '';
60
+
61
+        /**
62
+         * Full URL to WordPress upload directory.
63
+         *
64
+         * @var null|string
65
+         */
66
+        public static ?string $upload_url = '';
67
+
68
+        /**
69
+         * Set when Redux is run as a plugin.
70
+         *
71
+         * @var bool
72
+         */
73
+        public static bool $is_plugin = true;
74
+
75
+        /**
76
+         * Indicated in_theme or in_plugin.
77
+         *
78
+         * @var string
79
+         */
80
+        public static string $installed = '';
81
+
82
+        /**
83
+         * Set when Redux is run as a plugin.
84
+         *
85
+         * @var bool
86
+         */
87
+        public static bool $as_plugin = false;
88
+
89
+        /**
90
+         * Set when Redux is embedded within a theme.
91
+         *
92
+         * @var bool
93
+         */
94
+        public static bool $in_theme = false;
95
+
96
+        /**
97
+         * Pointer to an updated Google fonts array.
98
+         *
99
+         * @var array|null
100
+         */
101
+        public static ?array $updated_google_fonts = array();
102
+
103
+        /**
104
+         * List of files calling Redux.
105
+         *
106
+         * @var array|null
107
+         */
108
+        public static ?array $callers = array();
109
+
110
+        /**
111
+         * Pointer to _SERVER global.
112
+         *
113
+         * @var array|null
114
+         */
115
+        public static ?array $server = array();
116
+
117
+        /**
118
+         * Field folding information for localization.
119
+         *
120
+         * @var null|array
121
+         */
122
+        public static ?array $required = array();
123
+
124
+        /**
125
+         * Field child-folding information for localization.
126
+         *
127
+         * @var null|array
128
+         */
129
+        public static ?array $required_child = array();
130
+
131
+        /**
132
+         * Array of fields to be folded.
133
+         *
134
+         * @var array|null
135
+         */
136
+        public static ?array $folds = array();
137
+
138
+        /**
139
+         * Array of fields that didn't pass the fold dependency test and are hidden.
140
+         *
141
+         * @var null|array
142
+         */
143
+        public static ?array $fields_hidden = array();
144
+
145
+        /**
146
+         * Values to generate google font CSS.
147
+         *
148
+         * @var null|array
149
+         */
150
+        public static ?array $typography = array();
151
+
152
+        /**
153
+         * Validation ran flag.
154
+         *
155
+         * @var bool
156
+         */
157
+        public static bool $validation_ran = false;
158
+
159
+        /**
160
+         * No output flag.
161
+         *
162
+         * @var bool
163
+         */
164
+        public static bool $no_output = false;
165
+
166
+        /**
167
+         * Array of fonts used by the panel for localization.
168
+         *
169
+         * @var null|array
170
+         */
171
+        public static ?array $fonts = array();
172
+
173
+        /**
174
+         * Array of Google fonts used by the panel for localization.
175
+         *
176
+         * @var null|array
177
+         */
178
+        public static ?array $google_array = array();
179
+
180
+        /**
181
+         * Array of various font groups used within the typography field.
182
+         *
183
+         * @var null|array
184
+         */
185
+        public static ?array $font_groups = array();
186
+
187
+        /**
188
+         * File system object used for I/O file operations.  Done the WordPress way.
189
+         *
190
+         * @var null|object
191
+         */
192
+        public static ?object $filesystem;
193
+
194
+        /**
195
+         * Pointer to the third party fixes class.
196
+         *
197
+         * @var Redux_ThirdParty_Fixes
198
+         */
199
+        public static Redux_ThirdParty_Fixes $third_party_fixes;
200
+
201
+        /**
202
+         * Redux Welcome screen object.
203
+         *
204
+         * @var Redux_Welcome
205
+         */
206
+        public static Redux_Welcome $welcome;
207
+
208
+        /**
209
+         * Creates instance of class.
210
+         *
211
+         * @return Redux_Core
212
+         * @throws Exception Comment.
213
+         */
214
+        public static function instance(): ?Redux_Core {
215
+            if ( ! self::$instance ) {
216
+                self::$instance = new self();
217
+
218
+                self::$instance->includes();
219
+                self::$instance->init();
220
+                self::$instance->hooks();
221
+
222
+                add_action( 'plugins_loaded', array( 'Redux_Core', 'plugins_loaded' ) );
223
+            }
224
+
225
+            return self::$instance;
226
+        }
227
+
228
+        /**
229
+         * Things to run after pluggable.php had loaded.
230
+         */
231
+        public static function plugins_loaded() {}
232
+
233
+        /**
234
+         * Class init.
235
+         */
236
+        private function init() {
237
+            self::$server = array(
238
+                'SERVER_SOFTWARE' => '',
239
+                'REMOTE_ADDR'     => Redux_Helpers::is_local_host() ? '127.0.0.1' : '',
240
+                'HTTP_USER_AGENT' => '',
241
+                'HTTP_HOST'       => '',
242
+                'REQUEST_URI'     => '',
243
+            );
244
+
245
+            // phpcs:disable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
246
+            if ( ! empty( $_SERVER['SERVER_SOFTWARE'] ) ) {
247
+                self::$server['SERVER_SOFTWARE'] = sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) );
248
+            }
249
+            if ( ! empty( $_SERVER['REMOTE_ADDR'] ) ) {
250
+                self::$server['REMOTE_ADDR'] = sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) );
251
+            }
252
+            if ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) {
253
+                self::$server['HTTP_USER_AGENT'] = sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) );
254
+            }
255
+            if ( ! empty( $_SERVER['HTTP_HOST'] ) ) {
256
+                self::$server['HTTP_HOST'] = sanitize_text_field( wp_unslash( $_SERVER['HTTP_HOST'] ) );
257
+            }
258
+            if ( ! empty( $_SERVER['REQUEST_URI'] ) ) {
259
+                self::$server['REQUEST_URI'] = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) );
260
+            }
261
+
262
+            // phpcs:enable
263
+
264
+            self::$dir = trailingslashit( wp_normalize_path( dirname( realpath( __FILE__ ) ) ) );
265
+
266
+            Redux_Functions_Ex::generator();
267
+
268
+            if ( defined( 'REDUX_PLUGIN_FILE' ) ) {
269
+                $plugin_info = Redux_Functions_Ex::is_inside_plugin( REDUX_PLUGIN_FILE );
270
+            }
271
+
272
+            $plugin_info = Redux_Functions_Ex::is_inside_plugin( __FILE__ );
273
+
274
+            if ( false !== $plugin_info ) {
275
+                self::$installed = class_exists( 'Redux_Framework_Plugin' ) ? 'plugin' : 'in_plugin';
276
+                self::$is_plugin = class_exists( 'Redux_Framework_Plugin' );
277
+                self::$as_plugin = true;
278
+                self::$url       = trailingslashit( dirname( $plugin_info['url'] ) );
279
+            } else {
280
+                $theme_info = Redux_Functions_Ex::is_inside_theme( __FILE__ );
281
+                if ( false !== $theme_info ) {
282
+                    self::$url       = trailingslashit( dirname( $theme_info['url'] ) );
283
+                    self::$in_theme  = true;
284
+                    self::$installed = 'in_theme';
285
+                }
286
+            }
287
+
288
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
289
+            self::$url = apply_filters( 'redux/url', self::$url );
290
+
291
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
292
+            self::$dir = apply_filters( 'redux/dir', self::$dir );
293
+
294
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
295
+            self::$is_plugin = apply_filters( 'redux/is_plugin', self::$is_plugin );
296
+
297
+            if ( ! function_exists( 'current_time' ) ) {
298
+                require_once ABSPATH . '/wp-includes/functions.php';
299
+            }
300
+
301
+            $upload_dir       = wp_upload_dir();
302
+            self::$upload_dir = $upload_dir['basedir'] . '/redux/';
303
+            self::$upload_url = str_replace( array( 'https://', 'http://' ), '//', $upload_dir['baseurl'] . '/redux/' );
304
+
305
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
306
+            self::$upload_dir = apply_filters( 'redux/upload_dir', self::$upload_dir );
307
+
308
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
309
+            self::$upload_url = apply_filters( 'redux/upload_url', self::$upload_url );
310
+        }
311
+
312
+        /**
313
+         * Code to execute on a framework __construct.
314
+         *
315
+         * @param ReduxFramework $redux Pointer to ReduxFramework object.
316
+         */
317
+        public static function core_construct( ReduxFramework $redux ) {
318
+            self::$third_party_fixes = new Redux_ThirdParty_Fixes( $redux );
319
+
320
+            Redux_ThemeCheck::get_instance();
321
+        }
322
+
323
+        /**
324
+         * Autoregister run.
325
+         *
326
+         * @throws Exception Comment.
327
+         */
328
+        private function includes() {
329
+            if ( is_admin() ) {
330
+                if ( class_exists( 'Redux_Pro' ) && isset( Redux_Pro::$dir ) ) {
331
+                    echo '<div class="error"><p>' . sprintf( esc_html__( 'Redux has detected the Redux Pro plugin is enabled. All featured of Redux Pro are now part of the entire Redux plugin and is no longer required. Please disable the Redux Pro plugin to avoid potential conflicts.', 'redux-framework' ), '<code></code>' ) . '</p></div>';
332
+                }
333
+            }
334
+
335
+            require_once __DIR__ . '/inc/classes/class-redux-path.php';
336
+            require_once __DIR__ . '/inc/classes/class-redux-functions-ex.php';
337
+            require_once __DIR__ . '/inc/classes/class-redux-helpers.php';
338
+            require_once __DIR__ . '/inc/classes/class-redux-instances.php';
339
+
340
+            Redux_Functions_Ex::register_class_path( 'Redux', __DIR__ . '/inc/classes' );
341
+            Redux_Functions_Ex::register_class_path( 'Redux', __DIR__ . '/inc/welcome' );
342
+
343
+            spl_autoload_register( array( $this, 'register_classes' ) );
344
+
345
+            self::$welcome = new Redux_Welcome();
346
+
347
+            add_filter( 'debug_information', array( $this, 'add_debug_info' ) );
348
+        }
349
+
350
+        /**
351
+         * Add debug info for the WP Site Health screen.
352
+         *
353
+         * @param array $debug_info Debug data.
354
+         *
355
+         * @return array
356
+         * @throws ReflectionException Exception.
357
+         */
358
+        public function add_debug_info( array $debug_info ): array {
359
+
360
+            // Get browser data.
361
+            if ( ! class_exists( 'ReduxBrowser' ) ) {
362
+                require_once self::$dir . 'inc/lib/browser.php';
363
+            }
364
+
365
+            $browser = new ReduxBrowser();
366
+
367
+            $browser_data = array(
368
+                'Agent'    => $browser->getUserAgent(),
369
+                'Browser'  => $browser->getBrowser(),
370
+                'Version'  => $browser->getVersion(),
371
+                'Platform' => $browser->getPlatform(),
372
+            );
373
+
374
+            // Set Redux dir permission results to Site Health screen.
375
+            $debug_info['wp-filesystem']['fields'][] = array(
376
+                'label' => esc_html__( 'The Redux upload directory', 'redux-framework' ),
377
+                'value' => wp_is_writable( self::$upload_dir ) ? 'Writable' : 'Not writable',
378
+            );
379
+
380
+            // Set Redux plugin results to Site Health screen.
381
+            $debug_info['redux-framework'] = array(
382
+                'label'       => esc_html__( 'Redux Framework', 'redux-framework' ),
383
+                'description' => esc_html__( 'Debug information specific to Redux Framework.', 'redux-framework' ),
384
+                'fields'      => array(
385
+                    'version'        => array(
386
+                        'label' => esc_html__( 'Version', 'redux-framework' ),
387
+                        'value' => self::$version,
388
+                    ),
389
+                    'installation'   => array(
390
+                        'label' => esc_html__( 'Installation', 'redux-framework' ),
391
+                        'value' => self::$installed,
392
+                    ),
393
+                    'data directory' => array(
394
+                        'label' => esc_html__( 'Data directory', 'redux-framework' ),
395
+                        'value' => self::$dir,
396
+                    ),
397
+                    'browser'        => array(
398
+                        'label' => esc_html__( 'Browser', 'redux-framework' ),
399
+                        'value' => $browser_data,
400
+                    ),
401
+                ),
402
+            );
403
+
404
+            $redux = Redux::all_instances();
405
+
406
+            $extensions = array();
407
+
408
+            if ( ! empty( $redux ) && is_array( $redux ) ) {
409
+                foreach ( $redux as $inst => $data ) {
410
+                    Redux::init( $inst );
411
+
412
+                    $inst_name = ucwords( str_replace( array( '_', '-' ), ' ', $inst ) );
413
+                    $args      = $data->args;
414
+
415
+                    $ext = Redux::get_extensions( $inst );
416
+                    if ( ! empty( $ext ) && is_array( $ext ) ) {
417
+                        ksort( $ext );
418
+
419
+                        foreach ( $ext as $name => $arr ) {
420
+                            $ver = $arr['version'];
421
+
422
+                            $ex = esc_html( ucwords( str_replace( array( '_', '-' ), ' ', $name ) ) );
423
+
424
+                            $extensions[ $ex ] = esc_html( $ver );
425
+                        }
426
+                    }
427
+
428
+                    // Output Redux instances.
429
+                    $debug_info[ 'redux-instance-' . $inst ] = array(
430
+                        // translators: %s = Instance name.
431
+                        'label'       => sprintf( esc_html__( 'Redux Instance: %s', 'redux-framework' ), $inst_name ),
432
+                        // translators: %s = Instance name w/ HTML.
433
+                        'description' => sprintf( esc_html__( 'Debug information for the %s Redux instance.', 'redux-framework' ), '<code>' . $inst . '</code>' ),
434
+                        'fields'      => array(
435
+                            'opt_name'         => array(
436
+                                'label' => esc_html( 'opt_name' ),
437
+                                'value' => $args['opt_name'],
438
+                            ),
439
+                            'global_variable'  => array(
440
+                                'label' => esc_html( 'global_variable' ),
441
+                                'value' => $args['global_variable'],
442
+                            ),
443
+                            'dev_mode'         => array(
444
+                                'label' => esc_html( 'dev_mode' ),
445
+                                'value' => $args['dev_mode'] ? 'true' : 'false',
446
+                            ),
447
+                            'ajax_save'        => array(
448
+                                'label' => esc_html( 'ajax_save' ),
449
+                                'value' => $args['ajax_save'] ? 'true' : 'false',
450
+                            ),
451
+                            'page_slug'        => array(
452
+                                'label' => esc_html( 'page_slug' ),
453
+                                'value' => $args['page_slug'],
454
+                            ),
455
+                            'page_permissions' => array(
456
+                                'label' => esc_html( 'page_permissions' ),
457
+                                'value' => $args['page_permissions'],
458
+                            ),
459
+                            'menu_type'        => array(
460
+                                'label' => esc_html( 'menu_type' ),
461
+                                'value' => $args['menu_type'],
462
+                            ),
463
+                            'page_parent'      => array(
464
+                                'label' => esc_html( 'page_parent' ),
465
+                                'value' => $args['page_parent'],
466
+                            ),
467
+                            'compiler'         => array(
468
+                                'label' => esc_html( 'compiler' ),
469
+                                'value' => $args['compiler'] ? 'true' : 'false',
470
+                            ),
471
+                            'output'           => array(
472
+                                'label' => esc_html( 'output' ),
473
+                                'value' => $args['output'] ? 'true' : 'false',
474
+                            ),
475
+                            'output_tag'       => array(
476
+                                'label' => esc_html( 'output_tag' ),
477
+                                'value' => $args['output_tag'] ? 'true' : 'false',
478
+                            ),
479
+                            'templates_path'   => array(
480
+                                'label' => esc_html( 'templates_path' ),
481
+                                'value' => $args['templates_path'],
482
+                            ),
483
+                            'extensions'       => array(
484
+                                'label' => esc_html( 'extensions' ),
485
+                                'value' => $extensions,
486
+                            ),
487
+                        ),
488
+                    );
489
+                }
490
+            }
491
+
492
+            return $debug_info;
493
+        }
494
+
495
+        /**
496
+         * Register callback for autoload.
497
+         *
498
+         * @param string $class_name name of class.
499
+         */
500
+        public function register_classes( string $class_name ) {
501
+            $class_name_test = self::strtolower( $class_name );
502
+
503
+            if ( strpos( $class_name_test, 'redux' ) === false ) {
504
+                return;
505
+            }
506
+
507
+            if ( ! class_exists( 'Redux_Functions_Ex' ) ) {
508
+                require_once Redux_Path::get_path( '/inc/classes/class-redux-functions-ex.php' );
509
+            }
510
+
511
+            if ( ! class_exists( $class_name ) ) {
512
+                // Backward compatibility for extensions sucks!
513
+                if ( 'Redux_Instances' === $class_name ) {
514
+                    require_once Redux_Path::get_path( '/inc/classes/class-redux-instances.php' );
515
+                    require_once Redux_Path::get_path( '/inc/lib/redux-instances.php' );
516
+
517
+                    return;
518
+                }
519
+
520
+                // Load Redux APIs.
521
+                if ( 'Redux' === $class_name ) {
522
+                    require_once Redux_Path::get_path( '/inc/classes/class-redux-api.php' );
523
+
524
+                    return;
525
+                }
526
+
527
+                // Redux extra theme checks.
528
+                if ( 'Redux_ThemeCheck' === $class_name ) {
529
+                    require_once Redux_Path::get_path( '/inc/themecheck/class-redux-themecheck.php' );
530
+
531
+                    return;
532
+                }
533
+
534
+                if ( 'Redux_Welcome' === $class_name ) {
535
+                    require_once Redux_Path::get_path( '/inc/welcome/class-redux-welcome.php' );
536
+
537
+                    return;
538
+                }
539
+
540
+                $mappings = array(
541
+                    'ReduxFrameworkInstances'  => 'Redux_Instances',
542
+                    'reduxCorePanel'           => 'Redux_Panel',
543
+                    'reduxCoreEnqueue'         => 'Redux_Enqueue',
544
+                    'Redux_Abstract_Extension' => 'Redux_Extension_Abstract',
545
+                );
546
+                $alias    = false;
547
+                if ( isset( $mappings[ $class_name ] ) ) {
548
+                    $alias      = $class_name;
549
+                    $class_name = $mappings[ $class_name ];
550
+                }
551
+
552
+                // Everything else.
553
+                $file = 'class.' . $class_name_test . '.php';
554
+
555
+                $class_path = Redux_Path::get_path( '/inc/classes/' . $file );
556
+
557
+                if ( ! file_exists( $class_path ) ) {
558
+                    $class_file_name = str_replace( '_', '-', $class_name );
559
+                    $file            = 'class-' . $class_name_test . '.php';
560
+                    $class_path      = Redux_Path::get_path( '/inc/classes/' . $file );
561
+                }
562
+
563
+                if ( file_exists( $class_path ) && ! class_exists( $class_name ) ) {
564
+                    require_once $class_path;
565
+                }
566
+                if ( class_exists( $class_name ) && ! empty( $alias ) && ! class_exists( $alias ) ) {
567
+                    class_alias( $class_name, $alias );
568
+                }
569
+            }
570
+
571
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
572
+            do_action( 'redux/core/includes', $this );
573
+        }
574
+
575
+        /**
576
+         * Hooks to run on instance creation.
577
+         */
578
+        private function hooks() {
579
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
580
+            do_action( 'redux/core/hooks', $this );
581
+        }
582
+
583
+        /**
584
+         * Action to run on WordPress heartbeat.
585
+         *
586
+         * @return bool
587
+         */
588
+        public static function is_heartbeat(): bool {
589
+            // Disregard WP AJAX 'heartbeat' call.  Why waste resources?
590
+            if ( isset( $_POST ) && isset( $_POST['_nonce'] ) && wp_verify_nonce( sanitize_key( wp_unslash( $_POST['_nonce'] ) ), 'heartbeat-nonce' ) ) {
591
+
592
+                if ( isset( $_POST['action'] ) && 'heartbeat' === sanitize_text_field( wp_unslash( $_POST['action'] ) ) ) {
593
+
594
+                    // Hook, for purists.
595
+                    if ( has_action( 'redux/ajax/heartbeat' ) ) {
596
+                        // phpcs:ignore WordPress.NamingConventions.ValidHookName
597
+                        do_action( 'redux/ajax/heartbeat' );
598
+                    }
599
+
600
+                    return true;
601
+                }
602
+
603
+                return false;
604
+            }
605
+
606
+            // Buh bye!
607
+            return false;
608
+        }
609
+
610
+        /**
611
+         * Helper method to check for mb_strtolower or to use the standard strtolower.
612
+         *
613
+         * @param string|null $str String to make lowercase.
614
+         *
615
+         * @return string|null
616
+         */
617
+        public static function strtolower( ?string $str ): string {
618
+            if ( function_exists( 'mb_strtolower' ) && function_exists( 'mb_detect_encoding' ) ) {
619
+                return mb_strtolower( $str, mb_detect_encoding( $str ) );
620
+            } else {
621
+                return strtolower( $str );
622
+            }
623
+        }
624
+    }
625
+
626
+    /*
627 627
 	 * Backwards comparability alias
628 628
 	 */
629
-	class_alias( 'Redux_Core', 'redux-core' );
629
+    class_alias( 'Redux_Core', 'redux-core' );
630 630
 }
Please login to merge, or discard this patch.
Spacing   +16 added lines, -16 removed lines patch added patch discarded remove patch
@@ -98,56 +98,56 @@  discard block
 block discarded – undo
98 98
 		 *
99 99
 		 * @var array|null
100 100
 		 */
101
-		public static ?array $updated_google_fonts = array();
101
+		public static ? array $updated_google_fonts = array();
102 102
 
103 103
 		/**
104 104
 		 * List of files calling Redux.
105 105
 		 *
106 106
 		 * @var array|null
107 107
 		 */
108
-		public static ?array $callers = array();
108
+		public static ? array $callers = array();
109 109
 
110 110
 		/**
111 111
 		 * Pointer to _SERVER global.
112 112
 		 *
113 113
 		 * @var array|null
114 114
 		 */
115
-		public static ?array $server = array();
115
+		public static ? array $server = array();
116 116
 
117 117
 		/**
118 118
 		 * Field folding information for localization.
119 119
 		 *
120 120
 		 * @var null|array
121 121
 		 */
122
-		public static ?array $required = array();
122
+		public static ? array $required = array();
123 123
 
124 124
 		/**
125 125
 		 * Field child-folding information for localization.
126 126
 		 *
127 127
 		 * @var null|array
128 128
 		 */
129
-		public static ?array $required_child = array();
129
+		public static ? array $required_child = array();
130 130
 
131 131
 		/**
132 132
 		 * Array of fields to be folded.
133 133
 		 *
134 134
 		 * @var array|null
135 135
 		 */
136
-		public static ?array $folds = array();
136
+		public static ? array $folds = array();
137 137
 
138 138
 		/**
139 139
 		 * Array of fields that didn't pass the fold dependency test and are hidden.
140 140
 		 *
141 141
 		 * @var null|array
142 142
 		 */
143
-		public static ?array $fields_hidden = array();
143
+		public static ? array $fields_hidden = array();
144 144
 
145 145
 		/**
146 146
 		 * Values to generate google font CSS.
147 147
 		 *
148 148
 		 * @var null|array
149 149
 		 */
150
-		public static ?array $typography = array();
150
+		public static ? array $typography = array();
151 151
 
152 152
 		/**
153 153
 		 * Validation ran flag.
@@ -168,21 +168,21 @@  discard block
 block discarded – undo
168 168
 		 *
169 169
 		 * @var null|array
170 170
 		 */
171
-		public static ?array $fonts = array();
171
+		public static ? array $fonts = array();
172 172
 
173 173
 		/**
174 174
 		 * Array of Google fonts used by the panel for localization.
175 175
 		 *
176 176
 		 * @var null|array
177 177
 		 */
178
-		public static ?array $google_array = array();
178
+		public static ? array $google_array = array();
179 179
 
180 180
 		/**
181 181
 		 * Array of various font groups used within the typography field.
182 182
 		 *
183 183
 		 * @var null|array
184 184
 		 */
185
-		public static ?array $font_groups = array();
185
+		public static ? array $font_groups = array();
186 186
 
187 187
 		/**
188 188
 		 * File system object used for I/O file operations.  Done the WordPress way.
@@ -421,12 +421,12 @@  discard block
 block discarded – undo
421 421
 
422 422
 							$ex = esc_html( ucwords( str_replace( array( '_', '-' ), ' ', $name ) ) );
423 423
 
424
-							$extensions[ $ex ] = esc_html( $ver );
424
+							$extensions[$ex] = esc_html( $ver );
425 425
 						}
426 426
 					}
427 427
 
428 428
 					// Output Redux instances.
429
-					$debug_info[ 'redux-instance-' . $inst ] = array(
429
+					$debug_info['redux-instance-' . $inst] = array(
430 430
 						// translators: %s = Instance name.
431 431
 						'label'       => sprintf( esc_html__( 'Redux Instance: %s', 'redux-framework' ), $inst_name ),
432 432
 						// translators: %s = Instance name w/ HTML.
@@ -543,10 +543,10 @@  discard block
 block discarded – undo
543 543
 					'reduxCoreEnqueue'         => 'Redux_Enqueue',
544 544
 					'Redux_Abstract_Extension' => 'Redux_Extension_Abstract',
545 545
 				);
546
-				$alias    = false;
547
-				if ( isset( $mappings[ $class_name ] ) ) {
546
+				$alias = false;
547
+				if ( isset( $mappings[$class_name] ) ) {
548 548
 					$alias      = $class_name;
549
-					$class_name = $mappings[ $class_name ];
549
+					$class_name = $mappings[$class_name];
550 550
 				}
551 551
 
552 552
 				// Everything else.
Please login to merge, or discard this patch.
social_profiles/inc/class-redux-social-profiles-functions.php 2 patches
Indentation   +324 added lines, -324 removed lines patch added patch discarded remove patch
@@ -11,328 +11,328 @@
 block discarded – undo
11 11
 
12 12
 if ( ! class_exists( 'Redux_Social_Profiles_Functions' ) ) {
13 13
 
14
-	/**
15
-	 * Class Redux_Social_Profiles_Functions
16
-	 */
17
-	class Redux_Social_Profiles_Functions {
18
-		/**
19
-		 * ReduxFramework object pointer.
20
-		 *
21
-		 * @var ReduxFramework
22
-		 */
23
-		public static ReduxFramework $parent;
24
-
25
-		/**
26
-		 * Field ID.
27
-		 *
28
-		 * @var null|string
29
-		 */
30
-		public static ?string $field_id;
31
-
32
-		/**
33
-		 * Field array.
34
-		 *
35
-		 * @var array|null
36
-		 */
37
-		public static ?array $field;
38
-
39
-		/**
40
-		 * WordPress upload directory.
41
-		 *
42
-		 * @var string
43
-		 */
44
-		public static string $upload_dir;
45
-
46
-		/**
47
-		 * WordPress upload URI.
48
-		 *
49
-		 * @var string
50
-		 */
51
-		public static string $upload_url;
52
-
53
-		/**
54
-		 * Init helper library.
55
-		 *
56
-		 * @param ReduxFramework $redux ReduxFramework object.
57
-		 */
58
-		public static function init( ReduxFramework $redux ) {
59
-			self::$parent = $redux;
60
-
61
-			if ( empty( self::$field_id ) ) {
62
-				self::$field = self::get_field( $redux );
63
-
64
-				if ( ! is_array( self::$field ) ) {
65
-					return;
66
-				}
67
-
68
-				self::$field_id = self::$field['id'];
69
-			}
70
-
71
-			// Make sanitized upload dir DIR.
72
-			self::$upload_dir = Redux_Functions_Ex::wp_normalize_path( Redux_Core::$upload_dir . 'social-profiles/' );
73
-
74
-			// Make sanitized upload dir URL.
75
-			self::$upload_url = Redux_Functions_Ex::wp_normalize_path( Redux_Core::$upload_url . 'social-profiles/' );
76
-
77
-			Redux_Functions::init_wp_filesystem();
78
-		}
79
-
80
-		/**
81
-		 * Read data file.
82
-		 *
83
-		 * @return array|bool|mixed|object
84
-		 */
85
-		public static function read_data_file() {
86
-			$file = self::get_data_path();
87
-
88
-			if ( file_exists( $file ) ) {
89
-
90
-				// Get the contents of the file and stuff it in a variable.
91
-				$data = Redux_Core::$filesystem->execute( 'get_contents', $file );
92
-
93
-				// Error or null, set the result to false.
94
-				if ( false === $data || null === $data ) {
95
-					$arr_data = false;
96
-
97
-					// Otherwise, decode the json object and return it.
98
-				} else {
99
-					$arr      = json_decode( $data, true );
100
-					$arr_data = $arr;
101
-				}
102
-			} else {
103
-				$arr_data = false;
104
-			}
105
-
106
-			return $arr_data;
107
-		}
108
-
109
-		/**
110
-		 * Write data file.
111
-		 *
112
-		 * @param array  $arr_data Data.
113
-		 * @param string $file     Filename.
114
-		 *
115
-		 * @return bool
116
-		 */
117
-		public static function write_data_file( array $arr_data, string $file = '' ): bool {
118
-			if ( ! is_dir( self::$upload_dir ) ) {
119
-				return false;
120
-			}
121
-
122
-			$file = ( '' === $file ) ? self::get_data_path() : self::$upload_dir . $file;
123
-
124
-			// Encode the array data.
125
-			$data = wp_json_encode( $arr_data );
126
-
127
-			// Write to its file on the server, return the return value
128
-			// True on success, false on error.
129
-			return Redux_Core::$filesystem->execute( 'put_contents', $file, array( 'content' => $data ) );
130
-		}
131
-
132
-		/**
133
-		 * Get the data path.
134
-		 *
135
-		 * @return mixed|Redux_Functions_Ex|string
136
-		 */
137
-		public static function get_data_path() {
138
-			return Redux_Functions_Ex::wp_normalize_path( self::$upload_dir . '/' . self::$parent->args['opt_name'] . '-' . self::$field_id . '.json' );
139
-		}
140
-
141
-		/**
142
-		 * Get field.
143
-		 *
144
-		 * @param array|ReduxFramework $redux ReduxFramework object.
145
-		 *
146
-		 * @return mixed
147
-		 */
148
-		public static function get_field( $redux = array() ) {
149
-			global $pagenow;
150
-
151
-			if ( is_admin() && ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) ) {
152
-				$inst = Redux_Instances::get_instance( self::$parent->args['opt_name'] );
153
-
154
-				$ext = $inst->extensions;
155
-
156
-				if ( isset( $ext['metaboxes'] ) ) {
157
-					$obj   = $ext['metaboxes'];
158
-					$boxes = ( $obj->boxes );
159
-
160
-					foreach ( $boxes as $sections ) {
161
-						foreach ( $sections['sections'] as $fields ) {
162
-							if ( isset( $fields['fields'] ) ) {
163
-								foreach ( $fields['fields'] as $f ) {
164
-									if ( 'social_profiles' === $f['type'] ) {
165
-										return $f;
166
-									}
167
-
168
-									if ( 'repeater' === $f['type'] ) {
169
-										foreach ( $f['fields'] as $r ) {
170
-											if ( 'social_profiles' === $r['type'] ) {
171
-												return $r;
172
-											}
173
-										}
174
-									}
175
-								}
176
-							}
177
-						}
178
-					}
179
-				}
180
-			} else {
181
-				if ( ! empty( $redux ) ) {
182
-					self::$parent = $redux;
183
-				}
184
-
185
-				if ( isset( self::$parent->field_sections['social_profiles'] ) ) {
186
-					return reset( self::$parent->field_sections['social_profiles'] );
187
-				}
188
-
189
-				$arr = self::$parent;
190
-
191
-				foreach ( $arr as $part => $bla ) {
192
-					if ( 'sections' === $part ) {
193
-						foreach ( $bla as $field ) {
194
-
195
-							foreach ( $field as $arg => $val ) {
196
-								if ( 'fields' === $arg ) {
197
-									foreach ( $val as $v ) {
198
-										if ( ! empty( $v ) ) {
199
-											foreach ( $v as $id => $x ) {
200
-												if ( 'type' === $id ) {
201
-													if ( 'social_profiles' === $x ) {
202
-														return $v;
203
-													}
204
-												}
205
-											}
206
-										}
207
-									}
208
-								}
209
-							}
210
-						}
211
-					}
212
-				}
213
-			}
214
-
215
-			return null;
216
-		}
217
-
218
-		/**
219
-		 * Add extra icons.
220
-		 *
221
-		 * @param array $defaults Default values.
222
-		 *
223
-		 * @return array
224
-		 */
225
-		public static function add_extra_icons( array $defaults ): array {
226
-			if ( empty( self::$field ) ) {
227
-				self::$field = self::get_field();
228
-			}
229
-
230
-			if ( isset( self::$field['icons'] ) && ! empty( self::$field['icons'] ) ) {
231
-				$cur_count = count( $defaults );
232
-
233
-				foreach ( self::$field['icons'] as $arr ) {
234
-
235
-					$skip_add = false;
236
-					foreach ( $defaults as $i => $v ) {
237
-						if ( $arr['id'] === $v['id'] ) {
238
-
239
-							$defaults[ $i ] = array_replace( $v, $arr );
240
-							$skip_add       = true;
241
-							break;
242
-						}
243
-					}
244
-
245
-					if ( ! $skip_add ) {
246
-						$arr['order']           = $cur_count;
247
-						$defaults[ $cur_count ] = $arr;
248
-						++$cur_count;
249
-					}
250
-				}
251
-			}
252
-
253
-			return $defaults;
254
-		}
255
-
256
-		/**
257
-		 * Get Included files.
258
-		 *
259
-		 * @param array $val Value.
260
-		 *
261
-		 * @return array
262
-		 */
263
-		private static function get_includes( array $val ): array {
264
-			if ( empty( self::$field ) ) {
265
-				self::$field = self::get_field();
266
-			}
267
-
268
-			if ( isset( self::$field['include'] ) && is_array( self::$field['include'] ) && ! empty( self::$field['include'] ) ) {
269
-				$icons = self::$field['include'];
270
-
271
-				$new_arr = array();
272
-
273
-				$idx = 0;
274
-				foreach ( $val as $arr ) {
275
-					foreach ( $icons as $icon ) {
276
-						if ( $icon === $arr['id'] ) {
277
-							$arr['order']    = $idx;
278
-							$new_arr[ $idx ] = $arr;
279
-							++$idx;
280
-							break;
281
-						}
282
-					}
283
-				}
284
-			} else {
285
-				$new_arr = $val;
286
-			}
287
-
288
-			return $new_arr;
289
-		}
290
-
291
-		/**
292
-		 * Returns default data from config.
293
-		 *
294
-		 * @return array
295
-		 */
296
-		public static function get_default_data(): array {
297
-			$data = Redux_Social_Profiles_Defaults::get_social_media_defaults();
298
-			$data = self::get_includes( $data );
299
-
300
-			return self::add_extra_icons( $data );
301
-		}
302
-
303
-		/**
304
-		 * Static function to render the social icon.
305
-		 *
306
-		 * @param string $icon       Icon css.
307
-		 * @param string $color      Hex color.
308
-		 * @param string $background Background color.
309
-		 * @param string $title      Icon title.
310
-		 * @param bool   $output     Print or echo.
311
-		 *
312
-		 * @return string|void
313
-		 */
314
-		public static function render_icon( string $icon, string $color, string $background, string $title, bool $output = true ) {
315
-			if ( $color || $background ) {
316
-				if ( '' === $color ) {
317
-					$color = 'transparent';
318
-				}
319
-
320
-				if ( '' === $background ) {
321
-					$background = 'transparent';
322
-				}
323
-
324
-				$inline = 'style="color:' . esc_attr( $color ) . ';background-color:' . esc_attr( $background ) . ';"';
325
-			} else {
326
-				$inline = '';
327
-			}
328
-
329
-			$str = '<i class="fa ' . $icon . '" ' . $inline . ' title="' . $title . '"></i>';
330
-
331
-			if ( $output ) {
332
-				echo $str; // phpcs:ignore WordPress.Security.EscapeOutput
333
-			} else {
334
-				return $str;
335
-			}
336
-		}
337
-	}
14
+    /**
15
+     * Class Redux_Social_Profiles_Functions
16
+     */
17
+    class Redux_Social_Profiles_Functions {
18
+        /**
19
+         * ReduxFramework object pointer.
20
+         *
21
+         * @var ReduxFramework
22
+         */
23
+        public static ReduxFramework $parent;
24
+
25
+        /**
26
+         * Field ID.
27
+         *
28
+         * @var null|string
29
+         */
30
+        public static ?string $field_id;
31
+
32
+        /**
33
+         * Field array.
34
+         *
35
+         * @var array|null
36
+         */
37
+        public static ?array $field;
38
+
39
+        /**
40
+         * WordPress upload directory.
41
+         *
42
+         * @var string
43
+         */
44
+        public static string $upload_dir;
45
+
46
+        /**
47
+         * WordPress upload URI.
48
+         *
49
+         * @var string
50
+         */
51
+        public static string $upload_url;
52
+
53
+        /**
54
+         * Init helper library.
55
+         *
56
+         * @param ReduxFramework $redux ReduxFramework object.
57
+         */
58
+        public static function init( ReduxFramework $redux ) {
59
+            self::$parent = $redux;
60
+
61
+            if ( empty( self::$field_id ) ) {
62
+                self::$field = self::get_field( $redux );
63
+
64
+                if ( ! is_array( self::$field ) ) {
65
+                    return;
66
+                }
67
+
68
+                self::$field_id = self::$field['id'];
69
+            }
70
+
71
+            // Make sanitized upload dir DIR.
72
+            self::$upload_dir = Redux_Functions_Ex::wp_normalize_path( Redux_Core::$upload_dir . 'social-profiles/' );
73
+
74
+            // Make sanitized upload dir URL.
75
+            self::$upload_url = Redux_Functions_Ex::wp_normalize_path( Redux_Core::$upload_url . 'social-profiles/' );
76
+
77
+            Redux_Functions::init_wp_filesystem();
78
+        }
79
+
80
+        /**
81
+         * Read data file.
82
+         *
83
+         * @return array|bool|mixed|object
84
+         */
85
+        public static function read_data_file() {
86
+            $file = self::get_data_path();
87
+
88
+            if ( file_exists( $file ) ) {
89
+
90
+                // Get the contents of the file and stuff it in a variable.
91
+                $data = Redux_Core::$filesystem->execute( 'get_contents', $file );
92
+
93
+                // Error or null, set the result to false.
94
+                if ( false === $data || null === $data ) {
95
+                    $arr_data = false;
96
+
97
+                    // Otherwise, decode the json object and return it.
98
+                } else {
99
+                    $arr      = json_decode( $data, true );
100
+                    $arr_data = $arr;
101
+                }
102
+            } else {
103
+                $arr_data = false;
104
+            }
105
+
106
+            return $arr_data;
107
+        }
108
+
109
+        /**
110
+         * Write data file.
111
+         *
112
+         * @param array  $arr_data Data.
113
+         * @param string $file     Filename.
114
+         *
115
+         * @return bool
116
+         */
117
+        public static function write_data_file( array $arr_data, string $file = '' ): bool {
118
+            if ( ! is_dir( self::$upload_dir ) ) {
119
+                return false;
120
+            }
121
+
122
+            $file = ( '' === $file ) ? self::get_data_path() : self::$upload_dir . $file;
123
+
124
+            // Encode the array data.
125
+            $data = wp_json_encode( $arr_data );
126
+
127
+            // Write to its file on the server, return the return value
128
+            // True on success, false on error.
129
+            return Redux_Core::$filesystem->execute( 'put_contents', $file, array( 'content' => $data ) );
130
+        }
131
+
132
+        /**
133
+         * Get the data path.
134
+         *
135
+         * @return mixed|Redux_Functions_Ex|string
136
+         */
137
+        public static function get_data_path() {
138
+            return Redux_Functions_Ex::wp_normalize_path( self::$upload_dir . '/' . self::$parent->args['opt_name'] . '-' . self::$field_id . '.json' );
139
+        }
140
+
141
+        /**
142
+         * Get field.
143
+         *
144
+         * @param array|ReduxFramework $redux ReduxFramework object.
145
+         *
146
+         * @return mixed
147
+         */
148
+        public static function get_field( $redux = array() ) {
149
+            global $pagenow;
150
+
151
+            if ( is_admin() && ( 'post-new.php' === $pagenow || 'post.php' === $pagenow ) ) {
152
+                $inst = Redux_Instances::get_instance( self::$parent->args['opt_name'] );
153
+
154
+                $ext = $inst->extensions;
155
+
156
+                if ( isset( $ext['metaboxes'] ) ) {
157
+                    $obj   = $ext['metaboxes'];
158
+                    $boxes = ( $obj->boxes );
159
+
160
+                    foreach ( $boxes as $sections ) {
161
+                        foreach ( $sections['sections'] as $fields ) {
162
+                            if ( isset( $fields['fields'] ) ) {
163
+                                foreach ( $fields['fields'] as $f ) {
164
+                                    if ( 'social_profiles' === $f['type'] ) {
165
+                                        return $f;
166
+                                    }
167
+
168
+                                    if ( 'repeater' === $f['type'] ) {
169
+                                        foreach ( $f['fields'] as $r ) {
170
+                                            if ( 'social_profiles' === $r['type'] ) {
171
+                                                return $r;
172
+                                            }
173
+                                        }
174
+                                    }
175
+                                }
176
+                            }
177
+                        }
178
+                    }
179
+                }
180
+            } else {
181
+                if ( ! empty( $redux ) ) {
182
+                    self::$parent = $redux;
183
+                }
184
+
185
+                if ( isset( self::$parent->field_sections['social_profiles'] ) ) {
186
+                    return reset( self::$parent->field_sections['social_profiles'] );
187
+                }
188
+
189
+                $arr = self::$parent;
190
+
191
+                foreach ( $arr as $part => $bla ) {
192
+                    if ( 'sections' === $part ) {
193
+                        foreach ( $bla as $field ) {
194
+
195
+                            foreach ( $field as $arg => $val ) {
196
+                                if ( 'fields' === $arg ) {
197
+                                    foreach ( $val as $v ) {
198
+                                        if ( ! empty( $v ) ) {
199
+                                            foreach ( $v as $id => $x ) {
200
+                                                if ( 'type' === $id ) {
201
+                                                    if ( 'social_profiles' === $x ) {
202
+                                                        return $v;
203
+                                                    }
204
+                                                }
205
+                                            }
206
+                                        }
207
+                                    }
208
+                                }
209
+                            }
210
+                        }
211
+                    }
212
+                }
213
+            }
214
+
215
+            return null;
216
+        }
217
+
218
+        /**
219
+         * Add extra icons.
220
+         *
221
+         * @param array $defaults Default values.
222
+         *
223
+         * @return array
224
+         */
225
+        public static function add_extra_icons( array $defaults ): array {
226
+            if ( empty( self::$field ) ) {
227
+                self::$field = self::get_field();
228
+            }
229
+
230
+            if ( isset( self::$field['icons'] ) && ! empty( self::$field['icons'] ) ) {
231
+                $cur_count = count( $defaults );
232
+
233
+                foreach ( self::$field['icons'] as $arr ) {
234
+
235
+                    $skip_add = false;
236
+                    foreach ( $defaults as $i => $v ) {
237
+                        if ( $arr['id'] === $v['id'] ) {
238
+
239
+                            $defaults[ $i ] = array_replace( $v, $arr );
240
+                            $skip_add       = true;
241
+                            break;
242
+                        }
243
+                    }
244
+
245
+                    if ( ! $skip_add ) {
246
+                        $arr['order']           = $cur_count;
247
+                        $defaults[ $cur_count ] = $arr;
248
+                        ++$cur_count;
249
+                    }
250
+                }
251
+            }
252
+
253
+            return $defaults;
254
+        }
255
+
256
+        /**
257
+         * Get Included files.
258
+         *
259
+         * @param array $val Value.
260
+         *
261
+         * @return array
262
+         */
263
+        private static function get_includes( array $val ): array {
264
+            if ( empty( self::$field ) ) {
265
+                self::$field = self::get_field();
266
+            }
267
+
268
+            if ( isset( self::$field['include'] ) && is_array( self::$field['include'] ) && ! empty( self::$field['include'] ) ) {
269
+                $icons = self::$field['include'];
270
+
271
+                $new_arr = array();
272
+
273
+                $idx = 0;
274
+                foreach ( $val as $arr ) {
275
+                    foreach ( $icons as $icon ) {
276
+                        if ( $icon === $arr['id'] ) {
277
+                            $arr['order']    = $idx;
278
+                            $new_arr[ $idx ] = $arr;
279
+                            ++$idx;
280
+                            break;
281
+                        }
282
+                    }
283
+                }
284
+            } else {
285
+                $new_arr = $val;
286
+            }
287
+
288
+            return $new_arr;
289
+        }
290
+
291
+        /**
292
+         * Returns default data from config.
293
+         *
294
+         * @return array
295
+         */
296
+        public static function get_default_data(): array {
297
+            $data = Redux_Social_Profiles_Defaults::get_social_media_defaults();
298
+            $data = self::get_includes( $data );
299
+
300
+            return self::add_extra_icons( $data );
301
+        }
302
+
303
+        /**
304
+         * Static function to render the social icon.
305
+         *
306
+         * @param string $icon       Icon css.
307
+         * @param string $color      Hex color.
308
+         * @param string $background Background color.
309
+         * @param string $title      Icon title.
310
+         * @param bool   $output     Print or echo.
311
+         *
312
+         * @return string|void
313
+         */
314
+        public static function render_icon( string $icon, string $color, string $background, string $title, bool $output = true ) {
315
+            if ( $color || $background ) {
316
+                if ( '' === $color ) {
317
+                    $color = 'transparent';
318
+                }
319
+
320
+                if ( '' === $background ) {
321
+                    $background = 'transparent';
322
+                }
323
+
324
+                $inline = 'style="color:' . esc_attr( $color ) . ';background-color:' . esc_attr( $background ) . ';"';
325
+            } else {
326
+                $inline = '';
327
+            }
328
+
329
+            $str = '<i class="fa ' . $icon . '" ' . $inline . ' title="' . $title . '"></i>';
330
+
331
+            if ( $output ) {
332
+                echo $str; // phpcs:ignore WordPress.Security.EscapeOutput
333
+            } else {
334
+                return $str;
335
+            }
336
+        }
337
+    }
338 338
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -34,7 +34,7 @@  discard block
 block discarded – undo
34 34
 		 *
35 35
 		 * @var array|null
36 36
 		 */
37
-		public static ?array $field;
37
+		public static ? array $field;
38 38
 
39 39
 		/**
40 40
 		 * WordPress upload directory.
@@ -236,7 +236,7 @@  discard block
 block discarded – undo
236 236
 					foreach ( $defaults as $i => $v ) {
237 237
 						if ( $arr['id'] === $v['id'] ) {
238 238
 
239
-							$defaults[ $i ] = array_replace( $v, $arr );
239
+							$defaults[$i] = array_replace( $v, $arr );
240 240
 							$skip_add       = true;
241 241
 							break;
242 242
 						}
@@ -244,7 +244,7 @@  discard block
 block discarded – undo
244 244
 
245 245
 					if ( ! $skip_add ) {
246 246
 						$arr['order']           = $cur_count;
247
-						$defaults[ $cur_count ] = $arr;
247
+						$defaults[$cur_count] = $arr;
248 248
 						++$cur_count;
249 249
 					}
250 250
 				}
@@ -275,7 +275,7 @@  discard block
 block discarded – undo
275 275
 					foreach ( $icons as $icon ) {
276 276
 						if ( $icon === $arr['id'] ) {
277 277
 							$arr['order']    = $idx;
278
-							$new_arr[ $idx ] = $arr;
278
+							$new_arr[$idx] = $arr;
279 279
 							++$idx;
280 280
 							break;
281 281
 						}
Please login to merge, or discard this patch.
redux-core/inc/extensions/customizer/inc/class-redux-customizer-section.php 1 patch
Indentation   +155 added lines, -155 removed lines patch added patch discarded remove patch
@@ -15,108 +15,108 @@  discard block
 block discarded – undo
15 15
  */
16 16
 class Redux_Customizer_Section extends WP_Customize_Section {
17 17
 
18
-	/**
19
-	 * Type of this section.
20
-	 *
21
-	 * @since  4.1.0
22
-	 * @access public
23
-	 * @var string
24
-	 */
25
-	public $type = 'redux';
26
-
27
-	/**
28
-	 * Panel opt_name.
29
-	 *
30
-	 * @since  4.0.0
31
-	 * @access public
32
-	 * @var string
33
-	 */
34
-	public $opt_name = '';
35
-
36
-	/**
37
-	 * Section array.
38
-	 *
39
-	 * @var array|mixed
40
-	 */
41
-	public $section = array();
42
-
43
-	/**
44
-	 * Section array.
45
-	 *
46
-	 * @var string
47
-	 */
48
-	public string $wp_ver;
49
-
50
-	/**
51
-	 * Constructor.
52
-	 * Any supplied $args override class property defaults.
53
-	 *
54
-	 * @since 3.4.0
55
-	 *
56
-	 * @param WP_Customize_Manager $manager Customizer bootstrap instance.
57
-	 * @param string               $id      A specific ID of the section.
58
-	 * @param array                $args    Section arguments.
59
-	 */
60
-	public function __construct( $manager, $id, $args = array() ) {
61
-		global $wp_version;
62
-
63
-		parent::__construct( $manager, $id, $args );
64
-
65
-		// Redux addition.
66
-		if ( isset( $args['section'] ) ) {
67
-			$this->section     = $args['section'];
68
-			$this->description = $this->section['desc'] ?? '';
69
-			$this->opt_name    = $args['opt_name'] ?? '';
70
-		}
71
-
72
-		$version      = explode( '-', $wp_version );
73
-		$this->wp_ver = $version[0];
74
-	}
75
-
76
-	/**
77
-	 * WP < 4.3 Render
78
-	 */
79
-	protected function render() {
80
-		global $wp_version;
81
-		$version = explode( '-', $wp_version );
82
-		if ( version_compare( $version[0], '4.3', '<' ) ) {
83
-			$this->render_fallback();
84
-		}
85
-	}
86
-
87
-	/**
88
-	 * Render the section, and the controls that have been added to it.
89
-	 *
90
-	 * @since 3.4.0
91
-	 */
92
-	protected function render_fallback() {
93
-		$classes = 'accordion-section redux-section control-section control-section-' . $this->type;
94
-		?>
18
+    /**
19
+     * Type of this section.
20
+     *
21
+     * @since  4.1.0
22
+     * @access public
23
+     * @var string
24
+     */
25
+    public $type = 'redux';
26
+
27
+    /**
28
+     * Panel opt_name.
29
+     *
30
+     * @since  4.0.0
31
+     * @access public
32
+     * @var string
33
+     */
34
+    public $opt_name = '';
35
+
36
+    /**
37
+     * Section array.
38
+     *
39
+     * @var array|mixed
40
+     */
41
+    public $section = array();
42
+
43
+    /**
44
+     * Section array.
45
+     *
46
+     * @var string
47
+     */
48
+    public string $wp_ver;
49
+
50
+    /**
51
+     * Constructor.
52
+     * Any supplied $args override class property defaults.
53
+     *
54
+     * @since 3.4.0
55
+     *
56
+     * @param WP_Customize_Manager $manager Customizer bootstrap instance.
57
+     * @param string               $id      A specific ID of the section.
58
+     * @param array                $args    Section arguments.
59
+     */
60
+    public function __construct( $manager, $id, $args = array() ) {
61
+        global $wp_version;
62
+
63
+        parent::__construct( $manager, $id, $args );
64
+
65
+        // Redux addition.
66
+        if ( isset( $args['section'] ) ) {
67
+            $this->section     = $args['section'];
68
+            $this->description = $this->section['desc'] ?? '';
69
+            $this->opt_name    = $args['opt_name'] ?? '';
70
+        }
71
+
72
+        $version      = explode( '-', $wp_version );
73
+        $this->wp_ver = $version[0];
74
+    }
75
+
76
+    /**
77
+     * WP < 4.3 Render
78
+     */
79
+    protected function render() {
80
+        global $wp_version;
81
+        $version = explode( '-', $wp_version );
82
+        if ( version_compare( $version[0], '4.3', '<' ) ) {
83
+            $this->render_fallback();
84
+        }
85
+    }
86
+
87
+    /**
88
+     * Render the section, and the controls that have been added to it.
89
+     *
90
+     * @since 3.4.0
91
+     */
92
+    protected function render_fallback() {
93
+        $classes = 'accordion-section redux-section control-section control-section-' . $this->type;
94
+        ?>
95 95
 		<li id="accordion-section-<?php echo esc_attr( $this->id ); ?>" class="<?php echo esc_attr( $classes ); ?>">
96 96
 			<h3 class="accordion-section-title" tabindex="0">
97 97
 				<?php
98
-				echo wp_kses(
99
-					$this->title,
100
-					array(
101
-						'em'     => array(),
102
-						'i'      => array(),
103
-						'strong' => array(),
104
-						'span'   => array(
105
-							'class' => array(),
106
-							'style' => array(),
107
-						),
108
-					)
109
-				);
110
-				?>
98
+                echo wp_kses(
99
+                    $this->title,
100
+                    array(
101
+                        'em'     => array(),
102
+                        'i'      => array(),
103
+                        'strong' => array(),
104
+                        'span'   => array(
105
+                            'class' => array(),
106
+                            'style' => array(),
107
+                        ),
108
+                    )
109
+                );
110
+                ?>
111 111
 				<span class="screen-reader-text"><?php esc_attr_e( 'Press return or enter to expand', 'redux-framework' ); ?></span>
112 112
 			</h3>
113 113
 			<ul class="accordion-section-content redux-main">
114 114
 				<?php
115
-				if ( isset( $this->opt_name ) && isset( $this->section ) ) {
116
-					// phpcs:ignore WordPress.NamingConventions.ValidHookName
117
-					do_action( "redux/page/$this->opt_name/section/before", $this->section );
118
-				}
119
-				?>
115
+                if ( isset( $this->opt_name ) && isset( $this->section ) ) {
116
+                    // phpcs:ignore WordPress.NamingConventions.ValidHookName
117
+                    do_action( "redux/page/$this->opt_name/section/before", $this->section );
118
+                }
119
+                ?>
120 120
 				<?php if ( ! empty( $this->description ) ) { ?>
121 121
 					<li class="customize-section-description-container">
122 122
 						<p class="description customize-section-description legacy"><?php echo wp_kses_post( $this->description ); ?></p>
@@ -125,60 +125,60 @@  discard block
 block discarded – undo
125 125
 			</ul>
126 126
 		</li>
127 127
 		<?php
128
-	}
129
-
130
-
131
-	/**
132
-	 * Gather the parameters passed to client JavaScript via JSON.
133
-	 *
134
-	 * @since 4.1.0
135
-	 *
136
-	 * @return array The array to be exported to the client as JSON.
137
-	 */
138
-	public function json(): array {
139
-		$array = wp_array_slice_assoc(
140
-			parent::json(),
141
-			array(
142
-				'id',
143
-				'title',
144
-				'description',
145
-				'priority',
146
-				'panel',
147
-				'type',
148
-			)
149
-		);
150
-
151
-		$array['content']        = $this->get_content();
152
-		$array['active']         = $this->active();
153
-		$array['instanceNumber'] = $this->instance_number;
154
-
155
-		if ( $this->panel ) {
156
-			/* translators: &#9656; is the unicode right-pointing triangle, and %s is the section title in the Customizer */
157
-			$array['customizeAction'] = sprintf( __( 'Customizing &#9656; %s', 'redux-framework' ), esc_html( $this->manager->get_panel( $this->panel )->title ) );
158
-		} else {
159
-			$array['customizeAction'] = __( 'Customizing', 'redux-framework' );
160
-		}
161
-
162
-		// BEGIN Redux Additions.
163
-		$array['width'] = $this->section['customizer_width'] ?? '';
164
-		$array['icon']  = ( isset( $this->section['icon'] ) && ! empty( $this->section['icon'] ) ) ? $this->section['icon'] : 'hide';
165
-
166
-		$array['opt_name'] = $this->opt_name;
167
-
168
-		return $array;
169
-	}
170
-
171
-	/**
172
-	 * An Underscore (JS) template for rendering this section.
173
-	 * Class variables for this section class are available in the `data` JS object;
174
-	 * export custom variables by overriding {@see WP_Customize_Section::json()}.
175
-	 *
176
-	 * @see   WP_Customize_Section::print_template()
177
-	 * @since 4.3.0
178
-	 */
179
-	protected function render_template() {
180
-
181
-		?>
128
+    }
129
+
130
+
131
+    /**
132
+     * Gather the parameters passed to client JavaScript via JSON.
133
+     *
134
+     * @since 4.1.0
135
+     *
136
+     * @return array The array to be exported to the client as JSON.
137
+     */
138
+    public function json(): array {
139
+        $array = wp_array_slice_assoc(
140
+            parent::json(),
141
+            array(
142
+                'id',
143
+                'title',
144
+                'description',
145
+                'priority',
146
+                'panel',
147
+                'type',
148
+            )
149
+        );
150
+
151
+        $array['content']        = $this->get_content();
152
+        $array['active']         = $this->active();
153
+        $array['instanceNumber'] = $this->instance_number;
154
+
155
+        if ( $this->panel ) {
156
+            /* translators: &#9656; is the unicode right-pointing triangle, and %s is the section title in the Customizer */
157
+            $array['customizeAction'] = sprintf( __( 'Customizing &#9656; %s', 'redux-framework' ), esc_html( $this->manager->get_panel( $this->panel )->title ) );
158
+        } else {
159
+            $array['customizeAction'] = __( 'Customizing', 'redux-framework' );
160
+        }
161
+
162
+        // BEGIN Redux Additions.
163
+        $array['width'] = $this->section['customizer_width'] ?? '';
164
+        $array['icon']  = ( isset( $this->section['icon'] ) && ! empty( $this->section['icon'] ) ) ? $this->section['icon'] : 'hide';
165
+
166
+        $array['opt_name'] = $this->opt_name;
167
+
168
+        return $array;
169
+    }
170
+
171
+    /**
172
+     * An Underscore (JS) template for rendering this section.
173
+     * Class variables for this section class are available in the `data` JS object;
174
+     * export custom variables by overriding {@see WP_Customize_Section::json()}.
175
+     *
176
+     * @see   WP_Customize_Section::print_template()
177
+     * @since 4.3.0
178
+     */
179
+    protected function render_template() {
180
+
181
+        ?>
182 182
 		<li id="accordion-section-{{ data.id }}"
183 183
 			class="redux-standalone-section redux-customizer-opt-name redux-section accordion-section control-section control-section-{{ data.type }}"
184 184
 			data-opt-name="{{ data.opt_name }}"
@@ -210,14 +210,14 @@  discard block
 block discarded – undo
210 210
 					<p class="description customize-section-description">{{{ data.description }}}</p>
211 211
 					<# } #>
212 212
 					<?php
213
-					if ( isset( $this->opt_name ) && isset( $this->section ) ) {
214
-						// phpcs:ignore WordPress.NamingConventions.ValidHookName
215
-						do_action( "redux/page/$this->opt_name/section/before", $this->section );
216
-					}
217
-					?>
213
+                    if ( isset( $this->opt_name ) && isset( $this->section ) ) {
214
+                        // phpcs:ignore WordPress.NamingConventions.ValidHookName
215
+                        do_action( "redux/page/$this->opt_name/section/before", $this->section );
216
+                    }
217
+                    ?>
218 218
 				</li>
219 219
 			</ul>
220 220
 		</li>
221 221
 		<?php
222
-	}
222
+    }
223 223
 }
Please login to merge, or discard this patch.
redux-core/inc/extensions/customizer/inc/class-redux-customizer-panel.php 1 patch
Indentation   +141 added lines, -141 removed lines patch added patch discarded remove patch
@@ -19,83 +19,83 @@  discard block
 block discarded – undo
19 19
  */
20 20
 class Redux_Customizer_Panel extends WP_Customize_Panel {
21 21
 
22
-	/**
23
-	 * Type of this panel.
24
-	 *
25
-	 * @since  4.0.0
26
-	 * @access public
27
-	 * @var string
28
-	 */
29
-	public $type = 'redux';
22
+    /**
23
+     * Type of this panel.
24
+     *
25
+     * @since  4.0.0
26
+     * @access public
27
+     * @var string
28
+     */
29
+    public $type = 'redux';
30 30
 
31
-	/**
32
-	 * Panel opt_name.
33
-	 *
34
-	 * @since  4.0.0
35
-	 * @access public
36
-	 * @var string
37
-	 */
38
-	public $opt_name = '';
31
+    /**
32
+     * Panel opt_name.
33
+     *
34
+     * @since  4.0.0
35
+     * @access public
36
+     * @var string
37
+     */
38
+    public $opt_name = '';
39 39
 
40
-	/**
41
-	 * Section array.
42
-	 *
43
-	 * @var array|mixed
44
-	 */
45
-	public $section = array();
40
+    /**
41
+     * Section array.
42
+     *
43
+     * @var array|mixed
44
+     */
45
+    public $section = array();
46 46
 
47
-	/**
48
-	 * Section array.
49
-	 *
50
-	 * @var string
51
-	 */
52
-	public string $wp_ver;
47
+    /**
48
+     * Section array.
49
+     *
50
+     * @var string
51
+     */
52
+    public string $wp_ver;
53 53
 
54
-	/**
55
-	 * Constructor.
56
-	 * Any supplied $args override class property defaults.
57
-	 *
58
-	 * @since 4.0.0
59
-	 *
60
-	 * @param WP_Customize_Manager $manager Customizer bootstrap instance.
61
-	 * @param string               $id      A specific ID for the panel.
62
-	 * @param array                $args    Panel arguments.
63
-	 */
64
-	public function __construct( $manager, $id, $args = array() ) {
65
-		global $wp_version;
54
+    /**
55
+     * Constructor.
56
+     * Any supplied $args override class property defaults.
57
+     *
58
+     * @since 4.0.0
59
+     *
60
+     * @param WP_Customize_Manager $manager Customizer bootstrap instance.
61
+     * @param string               $id      A specific ID for the panel.
62
+     * @param array                $args    Panel arguments.
63
+     */
64
+    public function __construct( $manager, $id, $args = array() ) {
65
+        global $wp_version;
66 66
 
67
-		parent::__construct( $manager, $id, $args );
67
+        parent::__construct( $manager, $id, $args );
68 68
 
69
-		$version      = explode( '-', $wp_version );
70
-		$this->wp_ver = $version[0];
69
+        $version      = explode( '-', $wp_version );
70
+        $this->wp_ver = $version[0];
71 71
 
72
-		// Redux addition.
73
-		if ( isset( $args['section'] ) ) {
74
-			$this->section     = $args['section'];
75
-			$this->description = $this->section['desc'] ?? '';
76
-			$this->opt_name    = $args['opt_name'] ?? '';
77
-		}
78
-	}
72
+        // Redux addition.
73
+        if ( isset( $args['section'] ) ) {
74
+            $this->section     = $args['section'];
75
+            $this->description = $this->section['desc'] ?? '';
76
+            $this->opt_name    = $args['opt_name'] ?? '';
77
+        }
78
+    }
79 79
 
80
-	/**
81
-	 * WP < 4.3 Render
82
-	 *
83
-	 * @since
84
-	 * @access protected
85
-	 */
86
-	protected function render() {
87
-		if ( version_compare( $this->wp_ver, '4.3', '<' ) ) {
88
-			$this->render_fallback();
89
-		}
90
-	}
80
+    /**
81
+     * WP < 4.3 Render
82
+     *
83
+     * @since
84
+     * @access protected
85
+     */
86
+    protected function render() {
87
+        if ( version_compare( $this->wp_ver, '4.3', '<' ) ) {
88
+            $this->render_fallback();
89
+        }
90
+    }
91 91
 
92
-	/**
93
-	 * Render.
94
-	 */
95
-	protected function render_fallback() {
96
-		$classes = 'accordion-section redux-main redux-panel control-section control-panel control-panel-' . esc_attr( $this->type );
92
+    /**
93
+     * Render.
94
+     */
95
+    protected function render_fallback() {
96
+        $classes = 'accordion-section redux-main redux-panel control-section control-panel control-panel-' . esc_attr( $this->type );
97 97
 
98
-		?>
98
+        ?>
99 99
 		<li id="accordion-panel-<?php echo esc_attr( $this->id ); ?>" class="<?php echo esc_attr( $classes ); ?>"
100 100
 			data-width="<?php echo isset( $this->section['customizer_width'] ) ? esc_attr( $this->section['customizer_width'] ) : ''; ?>">
101 101
 			<h3 class="accordion-section-title" tabindex="0">
@@ -103,19 +103,19 @@  discard block
 block discarded – undo
103 103
 					<i class="<?php echo esc_attr( $this->section['icon'] ); ?>"></i>
104 104
 				<?php endif; ?>
105 105
 				<?php
106
-				echo wp_kses(
107
-					$this->title,
108
-					array(
109
-						'em'     => array(),
110
-						'i'      => array(),
111
-						'strong' => array(),
112
-						'span'   => array(
113
-							'class' => array(),
114
-							'style' => array(),
115
-						),
116
-					)
117
-				);
118
-				?>
106
+                echo wp_kses(
107
+                    $this->title,
108
+                    array(
109
+                        'em'     => array(),
110
+                        'i'      => array(),
111
+                        'strong' => array(),
112
+                        'span'   => array(
113
+                            'class' => array(),
114
+                            'style' => array(),
115
+                        ),
116
+                    )
117
+                );
118
+                ?>
119 119
 				<span class="screen-reader-text"><?php esc_html_e( 'Press return or enter to open this panel', 'redux-framework' ); ?></span>
120 120
 			</h3>
121 121
 			<ul class="accordion-sub-container control-panel-content">
@@ -125,22 +125,22 @@  discard block
 block discarded – undo
125 125
 			</ul>
126 126
 		</li>
127 127
 		<?php
128
-	}
128
+    }
129 129
 
130
-	/**
131
-	 * Render the sections that have been added to the panel.
132
-	 *
133
-	 * @since  4.1.0
134
-	 * @access protected
135
-	 */
136
-	protected function render_content() {
137
-		?>
130
+    /**
131
+     * Render the sections that have been added to the panel.
132
+     *
133
+     * @since  4.1.0
134
+     * @access protected
135
+     */
136
+    protected function render_content() {
137
+        ?>
138 138
 		<li class="panel-meta accordion-section redux-panel redux-panel-meta control-section
139 139
 		<?php
140
-		if ( empty( $this->description ) ) {
141
-			echo ' cannot-expand';
142
-		}
143
-		?>
140
+        if ( empty( $this->description ) ) {
141
+            echo ' cannot-expand';
142
+        }
143
+        ?>
144 144
 		">
145 145
 			<div class="accordion-section-title" tabindex="0">
146 146
 				<span class="preview-notice">
@@ -155,47 +155,47 @@  discard block
 block discarded – undo
155 155
 			<?php } ?>
156 156
 		</li>
157 157
 		<?php
158
-	}
158
+    }
159 159
 
160
-	/**
161
-	 * JSON.
162
-	 *
163
-	 * @return array
164
-	 */
165
-	public function json(): array {
166
-		$array = wp_array_slice_assoc(
167
-			parent::json(),
168
-			array(
169
-				'id',
170
-				'title',
171
-				'description',
172
-				'priority',
173
-				'type',
174
-			)
175
-		);
160
+    /**
161
+     * JSON.
162
+     *
163
+     * @return array
164
+     */
165
+    public function json(): array {
166
+        $array = wp_array_slice_assoc(
167
+            parent::json(),
168
+            array(
169
+                'id',
170
+                'title',
171
+                'description',
172
+                'priority',
173
+                'type',
174
+            )
175
+        );
176 176
 
177
-		$array['content']        = $this->get_content();
178
-		$array['active']         = $this->active();
179
-		$array['instanceNumber'] = $this->instance_number;
177
+        $array['content']        = $this->get_content();
178
+        $array['active']         = $this->active();
179
+        $array['instanceNumber'] = $this->instance_number;
180 180
 
181
-		// BEGIN Redux Additions.
182
-		$array['width'] = $this->section['customizer_width'] ?? '';
183
-		$array['icon']  = ( isset( $this->section['icon'] ) && ! empty( $this->section['icon'] ) ) ? $this->section['icon'] : 'hide';
181
+        // BEGIN Redux Additions.
182
+        $array['width'] = $this->section['customizer_width'] ?? '';
183
+        $array['icon']  = ( isset( $this->section['icon'] ) && ! empty( $this->section['icon'] ) ) ? $this->section['icon'] : 'hide';
184 184
 
185
-		$array['opt_name'] = $this->opt_name;
186
-		return $array;
187
-	}
185
+        $array['opt_name'] = $this->opt_name;
186
+        return $array;
187
+    }
188 188
 
189
-	/**
190
-	 * An Underscore (JS) template for this panel's content (but not its container).
191
-	 * Class variables for this panel class are available in the `data` JS object;
192
-	 * export custom variables by overriding {@see WP_Customize_Panel::json()}.
193
-	 *
194
-	 * @see   WP_Customize_Panel::print_template()
195
-	 * @since 4.3.0
196
-	 */
197
-	protected function content_template() {
198
-		?>
189
+    /**
190
+     * An Underscore (JS) template for this panel's content (but not its container).
191
+     * Class variables for this panel class are available in the `data` JS object;
192
+     * export custom variables by overriding {@see WP_Customize_Panel::json()}.
193
+     *
194
+     * @see   WP_Customize_Panel::print_template()
195
+     * @since 4.3.0
196
+     */
197
+    protected function content_template() {
198
+        ?>
199 199
 		<li
200 200
 			class="panel-meta customize-info redux-customizer-opt-name redux-panel accordion-section <# if ( ! data.description ) { #> cannot-expand<# } #>"
201 201
 			data-opt-name="{{{ data.opt_name }}}">
@@ -223,18 +223,18 @@  discard block
 block discarded – undo
223 223
 			<# } #>
224 224
 		</li>
225 225
 		<?php
226
-	}
226
+    }
227 227
 
228
-	/**
229
-	 * An Underscore (JS) template for rendering this panel's container.
230
-	 * Class variables for this panel class are available in the `data` JS object;
231
-	 * export custom variables by overriding {@see WP_Customize_Panel::json()}.
232
-	 *
233
-	 * @see   WP_Customize_Panel::print_template()
234
-	 * @since 4.3.0
235
-	 */
236
-	protected function render_template() {
237
-		?>
228
+    /**
229
+     * An Underscore (JS) template for rendering this panel's container.
230
+     * Class variables for this panel class are available in the `data` JS object;
231
+     * export custom variables by overriding {@see WP_Customize_Panel::json()}.
232
+     *
233
+     * @see   WP_Customize_Panel::print_template()
234
+     * @since 4.3.0
235
+     */
236
+    protected function render_template() {
237
+        ?>
238 238
 		<li id="accordion-panel-{{ data.id }}"
239 239
 			class="accordion-section redux-panel control-section control-panel control-panel-{{ data.type }}"
240 240
 			data-width="{{ data.width }}">
@@ -252,5 +252,5 @@  discard block
 block discarded – undo
252 252
 			<ul class="accordion-sub-container control-panel-content"></ul>
253 253
 		</li>
254 254
 		<?php
255
-	}
255
+    }
256 256
 }
Please login to merge, or discard this patch.
redux-core/inc/lib/font-awesome-6-free.php 3 patches
Indentation   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,1 +1,1 @@
 block discarded – undo
1
-<?php
/**
 * Redux Icon Select Font Awesome 6 Free icon array.
 *
 * @package Redux
 * @author  Kevin Provance <[email protected]>
 */

defined( 'ABSPATH' ) || exit;

if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) {

	/**
	 * Array of free Font Awesome 6 icons.
	 *
	 * @return array
	 */
	function redux_icon_select_fa_6_free(): array {
		return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' );
	}
}
2 1
\ No newline at end of file
2
+<?php
/**
 * Redux Icon Select Font Awesome 6 Free icon array.
 *
 * @package Redux
 * @author  Kevin Provance <[email protected]>
 */

   defined( 'ABSPATH' ) || exit;

if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) {

	/**
	 * Array of free Font Awesome 6 icons.
	 *
	 * @return array
	 */
    function redux_icon_select_fa_6_free(): array {
		return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' );
	}
}
3 3
\ No newline at end of file
Please login to merge, or discard this patch.
Switch Indentation   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,1 +1,1 @@
 block discarded – undo
1
-<?php
/**
 * Redux Icon Select Font Awesome 6 Free icon array.
 *
 * @package Redux
 * @author  Kevin Provance <[email protected]>
 */

defined( 'ABSPATH' ) || exit;

if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) {

	/**
	 * Array of free Font Awesome 6 icons.
	 *
	 * @return array
	 */
	function redux_icon_select_fa_6_free(): array {
		return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' );
	}
}
2 1
\ No newline at end of file
2
+<?php
/**
 * Redux Icon Select Font Awesome 6 Free icon array.
 *
 * @package Redux
 * @author  Kevin Provance <[email protected]>
 */

defined( 'ABSPATH' ) || exit;

if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) {

	/**
	 * Array of free Font Awesome 6 icons.
	 *
	 * @return array
	 */
	function redux_icon_select_fa_6_free(): array {
		return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' );
	}

}
3 3
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,1 +1,1 @@
 block discarded – undo
1
-<?php
/**
 * Redux Icon Select Font Awesome 6 Free icon array.
 *
 * @package Redux
 * @author  Kevin Provance <[email protected]>
 */

defined( 'ABSPATH' ) || exit;

if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) {

	/**
	 * Array of free Font Awesome 6 icons.
	 *
	 * @return array
	 */
	function redux_icon_select_fa_6_free(): array {
		return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' );
	}
}
2 1
\ No newline at end of file
2
+<?php
/**
 * Redux Icon Select Font Awesome 6 Free icon array.
 *
 * @package Redux
 * @author  Kevin Provance <[email protected]>
 */

defined( 'ABSPATH' ) || exit;

if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) {

	/**
	 * Array of free Font Awesome 6 icons.
	 *
	 * @return array
	 */
	function redux_icon_select_fa_6_free(): array {
		return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' ); }
}
3 3
\ No newline at end of file
Please login to merge, or discard this patch.
redux-core/inc/extensions/taxonomy/class-redux-taxonomy-api.php 2 patches
Indentation   +627 added lines, -627 removed lines patch added patch discarded remove patch
@@ -13,631 +13,631 @@
 block discarded – undo
13 13
 // Don't duplicate me!
14 14
 if ( ! class_exists( 'Redux_Taxonomy' ) ) {
15 15
 
16
-	/**
17
-	 * Redux Taxonomy API Class
18
-	 * Simple API for Redux Framework
19
-	 *
20
-	 * @since       1.0.0
21
-	 */
22
-	class Redux_Taxonomy {
23
-
24
-		/**
25
-		 * Terms array.
26
-		 *
27
-		 * @var array
28
-		 */
29
-		public static array $terms = array();
30
-
31
-		/**
32
-		 * Sections array.
33
-		 *
34
-		 * @var array
35
-		 */
36
-		public static array $sections = array();
37
-
38
-		/**
39
-		 * Fields array.
40
-		 *
41
-		 * @var array
42
-		 */
43
-		public static array $fields = array();
44
-
45
-		/**
46
-		 * Priority array.
47
-		 *
48
-		 * @var array
49
-		 */
50
-		public static array $priority = array();
51
-
52
-		/**
53
-		 * Errors array.
54
-		 *
55
-		 * @var array
56
-		 */
57
-		public static array $errors = array();
58
-
59
-		/**
60
-		 * Init array.
61
-		 *
62
-		 * @var array
63
-		 */
64
-		public static array $init = array();
65
-
66
-		/**
67
-		 * Args array.
68
-		 *
69
-		 * @var array
70
-		 */
71
-		public static array $args = array();
72
-
73
-		/**
74
-		 * Load.
75
-		 */
76
-		public static function load() {
77
-			add_action( 'init', array( 'Redux_Taxonomy', 'enqueue' ), 99 );
78
-		}
79
-
80
-		/**
81
-		 * Enqueue support files and fields.
82
-		 *
83
-		 * @throws ReflectionException Exception.
84
-		 */
85
-		public static function enqueue() {
86
-			global $pagenow;
87
-
88
-			// Check and run instances of Redux where the opt_name hasn't been run.
89
-			$pagenows = array( 'edit-tags.php', 'term.php' );
90
-
91
-			if ( ! empty( self::$sections ) && in_array( $pagenow, $pagenows, true ) ) {
92
-				$instances = Redux::all_instances();
93
-
94
-				foreach ( self::$fields as $opt_name => $fields ) {
95
-					if ( ! isset( $instances[ $opt_name ] ) ) {
96
-						Redux::set_args( $opt_name, array( 'menu_type' => 'hidden' ) );
97
-
98
-						Redux::set_sections(
99
-							$opt_name,
100
-							array(
101
-								array(
102
-									'id'     => 'EXTENSION_TAXONOMY_FAKE_ID' . $opt_name,
103
-									'fields' => $fields,
104
-									'title'  => 'N/A',
105
-								),
106
-							)
107
-						);
108
-
109
-						Redux::init( $opt_name );
110
-
111
-						$instances = ReduxFrameworkInstances::get_all_instances();
112
-					}
113
-
114
-					self::check_opt_name( $opt_name );
115
-
116
-					Redux::set_args( $opt_name, self::$args[ $opt_name ] );
117
-				}
118
-			}
119
-		}
120
-
121
-		/**
122
-		 * Construct Args.
123
-		 *
124
-		 * @param string $opt_name Panel opt_name.
125
-		 *
126
-		 * @return mixed
127
-		 */
128
-		public static function construct_args( string $opt_name ) {
129
-			$args             = self::$args[ $opt_name ];
130
-			$args['opt_name'] = $opt_name;
131
-
132
-			if ( ! isset( $args['menu_title'] ) ) {
133
-				$args['menu_title'] = ucfirst( $opt_name ) . ' Options';
134
-			}
135
-
136
-			if ( ! isset( $args['page_title'] ) ) {
137
-				$args['page_title'] = ucfirst( $opt_name ) . ' Options';
138
-			}
139
-
140
-			if ( ! isset( $args['page_slug'] ) ) {
141
-				$args['page_slug'] = $opt_name . '_options';
142
-			}
143
-
144
-			return $args;
145
-		}
146
-
147
-		/**
148
-		 * Construct Terms
149
-		 *
150
-		 * @param string $opt_name Panel opt_name.
151
-		 *
152
-		 * @return array
153
-		 */
154
-		public static function construct_terms( string $opt_name ): array {
155
-			$terms = array();
156
-
157
-			if ( ! isset( self::$terms[ $opt_name ] ) ) {
158
-				return $terms;
159
-			}
160
-
161
-			foreach ( self::$terms[ $opt_name ] as $term ) {
162
-				$term['sections'] = self::construct_sections( $opt_name, $term['id'] );
163
-				$terms[]          = $term;
164
-			}
165
-
166
-			ksort( $terms );
167
-
168
-			return $terms;
169
-		}
170
-
171
-		/**
172
-		 * Construct Sections.
173
-		 *
174
-		 * @param string $opt_name       Panel opt_name.
175
-		 * @param string $term_id        Term ID.
176
-		 *
177
-		 * @return array
178
-		 */
179
-		public static function construct_sections( string $opt_name, string $term_id ): array {
180
-			$sections = array();
181
-
182
-			if ( ! isset( self::$sections[ $opt_name ] ) ) {
183
-				return $sections;
184
-			}
185
-
186
-			foreach ( self::$sections[ $opt_name ] as $section_id => $section ) {
187
-				if ( $section['term_id'] === $term_id ) {
188
-					self::$sections[ $opt_name ][ $section_id ]['add_visibility'] = $section;
189
-
190
-					$p = $section['priority'];
191
-
192
-					while ( isset( $sections[ $p ] ) ) {
193
-						echo esc_html( $p++ );
194
-					}
195
-
196
-					$section['fields'] = self::construct_fields( $opt_name, $section_id );
197
-					$sections[ $p ]    = $section;
198
-				}
199
-			}
200
-
201
-			ksort( $sections );
202
-
203
-			return $sections;
204
-		}
205
-
206
-		/**
207
-		 * Construct Fields.
208
-		 *
209
-		 * @param string $opt_name       Panel opt_name.
210
-		 * @param string $section_id     Section ID.
211
-		 * @param bool   $permissions    Permissions.
212
-		 * @param bool   $add_visibility Add visibility.
213
-		 *
214
-		 * @return array
215
-		 */
216
-		public static function construct_fields( string $opt_name = '', string $section_id = '', bool $permissions = false, bool $add_visibility = false ): array {
217
-			$fields = array();
218
-
219
-			if ( ! isset( self::$fields[ $opt_name ] ) ) {
220
-				return $fields;
221
-			}
222
-
223
-			foreach ( self::$fields[ $opt_name ] as $key => $field ) {
224
-				// Nested permissions.
225
-				$field['permissions'] = $field['permissions'] ?? $permissions;
226
-
227
-				self::$fields[ $opt_name ][ $key ]['permissions'] = $field['permissions'];
228
-
229
-				// Nested add_visibility permissions.
230
-				$field['add_visibility'] = $field['add_visibility'] ?? $add_visibility;
231
-
232
-				self::$fields[ $opt_name ][ $key ]['add_visibility'] = $field['add_visibility'];
233
-
234
-				if ( $field['section_id'] === $section_id ) {
235
-					$p = $field['priority'];
236
-
237
-					while ( isset( $fields[ $p ] ) ) {
238
-						echo esc_html( $p++ );
239
-					}
240
-
241
-					$fields[ $p ] = $field;
242
-				}
243
-			}
244
-
245
-			ksort( $fields );
246
-
247
-			return $fields;
248
-		}
249
-
250
-		/**
251
-		 * Get Section.
252
-		 *
253
-		 * @param string $opt_name Panel opt_name.
254
-		 * @param string $id       ID.
255
-		 *
256
-		 * @return bool
257
-		 */
258
-		public static function get_section( string $opt_name = '', string $id = '' ): bool {
259
-			self::check_opt_name( $opt_name );
260
-
261
-			if ( ! empty( $opt_name ) && ! empty( $id ) ) {
262
-				if ( ! isset( self::$sections[ $opt_name ][ $id ] ) ) {
263
-					$id = strtolower( sanitize_html_class( $id ) );
264
-				}
265
-
266
-				return self::$sections[ $opt_name ][ $id ] ?? false;
267
-			}
268
-
269
-			return false;
270
-		}
271
-
272
-		/**
273
-		 * Set_section.
274
-		 *
275
-		 * @param string $opt_name Panel opt_name.
276
-		 * @param array  $section  Section array.
277
-		 */
278
-		public static function set_section( string $opt_name = '', array $section = array() ) {
279
-			self::check_opt_name( $opt_name );
280
-
281
-			if ( ! empty( $opt_name ) && is_array( $section ) && ! empty( $section ) ) {
282
-				if ( ! isset( $section['id'] ) ) {
283
-					if ( isset( $section['title'] ) ) {
284
-						$section['id'] = strtolower( sanitize_html_class( $section['title'] ) );
285
-					} else {
286
-						$section['id'] = 'section';
287
-					}
288
-
289
-					if ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
290
-						$orig = $section['id'];
291
-						$i    = 0;
292
-
293
-						while ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
294
-							$section['id'] = $orig . '_' . $i;
295
-						}
296
-					}
297
-				}
298
-
299
-				if ( ! isset( $section['priority'] ) ) {
300
-					$section['priority'] = self::get_priority( $opt_name, 'sections' );
301
-				}
302
-
303
-				if ( isset( $section['fields'] ) ) {
304
-					if ( ! empty( $section['fields'] ) && is_array( $section['fields'] ) ) {
305
-						if ( isset( $section['permissions'] ) || isset( $section['add_visibility'] ) ) {
306
-							foreach ( $section['fields'] as $key => $field ) {
307
-								if ( ! isset( $field['permissions'] ) && isset( $section['permissions'] ) ) {
308
-									$section['fields'][ $key ]['permissions'] = $section['permissions'];
309
-								}
310
-
311
-								if ( ! isset( $field['add_visibility'] ) && isset( $section['add_visibility'] ) ) {
312
-									$section['fields'][ $key ]['add_visibility'] = $section['add_visibility'];
313
-								}
314
-							}
315
-						}
316
-
317
-						self::process_fields_array( $opt_name, $section['id'], $section['fields'] );
318
-					}
319
-
320
-					unset( $section['fields'] );
321
-				}
322
-
323
-				self::$sections[ $opt_name ][ $section['id'] ] = $section;
324
-			} else {
325
-				self::$errors[ $opt_name ]['section']['empty'] = esc_html__( 'Unable to create a section due an empty section array or the section variable passed was not an array.', 'redux-framework' );
326
-			}
327
-		}
328
-
329
-		/**
330
-		 * Process Sections Array.
331
-		 *
332
-		 * @param string $opt_name Panel opt_name.
333
-		 * @param string $term_id  Term ID.
334
-		 * @param array  $sections Sections array.
335
-		 */
336
-		public static function process_sections_array( string $opt_name = '', string $term_id = '', array $sections = array() ) {
337
-			if ( ! empty( $opt_name ) && ! empty( $term_id ) && is_array( $sections ) && ! empty( $sections ) ) {
338
-				foreach ( $sections as $section ) {
339
-					if ( ! is_array( $section ) ) {
340
-						continue;
341
-					}
342
-
343
-					$section['term_id'] = $term_id;
344
-
345
-					if ( ! isset( $section['fields'] ) || ! is_array( $section['fields'] ) ) {
346
-						$section['fields'] = array();
347
-					}
348
-
349
-					self::set_section( $opt_name, $section );
350
-				}
351
-			}
352
-		}
353
-
354
-		/**
355
-		 * Process field array.
356
-		 *
357
-		 * @param string $opt_name   Panel opt_name.
358
-		 * @param string $section_id Section ID.
359
-		 * @param array  $fields     Fields array.
360
-		 */
361
-		public static function process_fields_array( string $opt_name = '', string $section_id = '', array $fields = array() ) {
362
-			if ( ! empty( $opt_name ) && ! empty( $section_id ) && is_array( $fields ) && ! empty( $fields ) ) {
363
-				foreach ( $fields as $field ) {
364
-					if ( ! is_array( $field ) ) {
365
-						continue;
366
-					}
367
-
368
-					$field['section_id'] = $section_id;
369
-
370
-					self::set_field( $opt_name, $field );
371
-				}
372
-			}
373
-		}
374
-
375
-		/**
376
-		 * Get field.
377
-		 *
378
-		 * @param string $opt_name Panel opt_name.
379
-		 * @param string $id       ID.
380
-		 *
381
-		 * @return bool
382
-		 */
383
-		public static function get_field( string $opt_name = '', string $id = '' ): bool {
384
-			self::check_opt_name( $opt_name );
385
-
386
-			if ( ! empty( $opt_name ) && ! empty( $id ) ) {
387
-				return self::$fields[ $opt_name ][ $id ] ?? false;
388
-			}
389
-
390
-			return false;
391
-		}
392
-
393
-		/**
394
-		 * Set field.
395
-		 *
396
-		 * @param string $opt_name Panel opt_name.
397
-		 * @param array  $field    Field array.
398
-		 */
399
-		public static function set_field( string $opt_name = '', array $field = array() ) {
400
-			self::check_opt_name( $opt_name );
401
-
402
-			if ( ! empty( $opt_name ) && is_array( $field ) && ! empty( $field ) ) {
403
-				if ( ! isset( $field['priority'] ) ) {
404
-					$field['priority'] = self::get_priority( $opt_name, 'fields' );
405
-				}
406
-
407
-				self::$fields[ $opt_name ][ $field['id'] ] = $field;
408
-			}
409
-		}
410
-
411
-		/**
412
-		 * Set args.
413
-		 *
414
-		 * @param string $opt_name Panel opt_name.
415
-		 * @param array  $args     Args array.
416
-		 */
417
-		public static function set_args( string $opt_name = '', array $args = array() ) {
418
-			self::check_opt_name( $opt_name );
419
-
420
-			if ( ! empty( $opt_name ) && is_array( $args ) && ! empty( $args ) ) {
421
-				self::$args[ $opt_name ] = self::$args[ $opt_name ] ?? array();
422
-				self::$args[ $opt_name ] = wp_parse_args( $args, self::$args[ $opt_name ] );
423
-			}
424
-		}
425
-
426
-		/**
427
-		 * Set term.
428
-		 *
429
-		 * @param string $opt_name Panel opt_name.
430
-		 * @param array  $term     Term array.
431
-		 */
432
-		public static function set_term( string $opt_name = '', array $term = array() ) {
433
-			self::check_opt_name( $opt_name );
434
-
435
-			if ( ! empty( $opt_name ) && is_array( $term ) && ! empty( $term ) ) {
436
-				if ( ! isset( $term['id'] ) ) {
437
-					if ( isset( $term['title'] ) ) {
438
-						$term['id'] = strtolower( sanitize_html_class( $term['title'] ) );
439
-					} else {
440
-						$term['id'] = 'term';
441
-					}
442
-
443
-					if ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) {
444
-						$orig = $term['id'];
445
-						$i    = 0;
446
-
447
-						while ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) {
448
-							$term['id'] = $orig . '_' . $i;
449
-						}
450
-					}
451
-				}
452
-
453
-				if ( isset( $term['sections'] ) ) {
454
-					if ( ! empty( $term['sections'] ) && is_array( $term['sections'] ) ) {
455
-						if ( isset( $term['permissions'] ) || isset( $term['add_visibility'] ) ) {
456
-							foreach ( $term['sections'] as $key => $section ) {
457
-								if ( ! isset( $section['permissions'] ) && isset( $term['permissions'] ) ) {
458
-									$term['sections'][ $key ]['permissions'] = $term['permissions'];
459
-								}
460
-
461
-								if ( ! isset( $section['add_visibility'] ) && isset( $term['add_visibility'] ) ) {
462
-									$term['sections'][ $key ]['add_visibility'] = $term['add_visibility'];
463
-								}
464
-							}
465
-						}
466
-
467
-						self::process_sections_array( $opt_name, $term['id'], $term['sections'] );
468
-					}
469
-
470
-					unset( $term['sections'] );
471
-				}
472
-
473
-				self::$terms[ $opt_name ][ $term['id'] ] = $term;
474
-			} else {
475
-				self::$errors[ $opt_name ]['term']['empty'] = esc_html__( 'Unable to create a term due an empty term array or the term variable passed was not an array.', 'redux-framework' );
476
-			}
477
-		}
478
-
479
-		/**
480
-		 * Get terms.
481
-		 *
482
-		 * @param string $opt_name Panel opt_name.
483
-		 *
484
-		 * @return mixed
485
-		 */
486
-		public static function get_terms( string $opt_name = '' ) {
487
-			self::check_opt_name( $opt_name );
488
-
489
-			if ( ! empty( $opt_name ) && ! empty( self::$terms[ $opt_name ] ) ) {
490
-				return self::$terms[ $opt_name ];
491
-			}
492
-
493
-			return false;
494
-		}
495
-
496
-		/**
497
-		 * Get priority.
498
-		 *
499
-		 * @param string $opt_name Panel opt_name.
500
-		 * @param string $type     Field type.
501
-		 *
502
-		 * @return mixed
503
-		 */
504
-		public static function get_priority( string $opt_name, string $type ) {
505
-			$priority                              = self::$priority[ $opt_name ][ $type ];
506
-			self::$priority[ $opt_name ][ $type ] += 1;
507
-
508
-			return $priority;
509
-		}
510
-
511
-		/**
512
-		 * Check opt_name.
513
-		 *
514
-		 * @param string $opt_name Panel opt_name.
515
-		 */
516
-		public static function check_opt_name( string $opt_name = '' ) {
517
-			if ( empty( $opt_name ) || is_array( $opt_name ) ) {
518
-				return;
519
-			}
520
-
521
-			if ( ! isset( self::$terms[ $opt_name ] ) ) {
522
-				self::$terms[ $opt_name ] = array();
523
-			}
524
-
525
-			if ( ! isset( self::$priority[ $opt_name ] ) ) {
526
-				self::$priority[ $opt_name ]['args'] = 1;
527
-			}
528
-
529
-			if ( ! isset( self::$sections[ $opt_name ] ) ) {
530
-				self::$sections[ $opt_name ]             = array();
531
-				self::$priority[ $opt_name ]['sections'] = 1;
532
-			}
533
-
534
-			if ( ! isset( self::$fields[ $opt_name ] ) ) {
535
-				self::$fields[ $opt_name ]             = array();
536
-				self::$priority[ $opt_name ]['fields'] = 1;
537
-			}
538
-
539
-			if ( ! isset( self::$errors[ $opt_name ] ) ) {
540
-				self::$errors[ $opt_name ] = array();
541
-			}
542
-
543
-			if ( ! isset( self::$init[ $opt_name ] ) ) {
544
-				self::$init[ $opt_name ] = false;
545
-			}
546
-
547
-			if ( ! isset( self::$args[ $opt_name ] ) ) {
548
-				self::$args[ $opt_name ] = false;
549
-			}
550
-		}
551
-
552
-		/**
553
-		 * Get field defaults.
554
-		 *
555
-		 * @param string $opt_name Panel opt_name.
556
-		 *
557
-		 * @return array|void
558
-		 */
559
-		public static function get_field_defaults( string $opt_name ) {
560
-			if ( empty( $opt_name ) ) {
561
-				return;
562
-			}
563
-
564
-			if ( ! isset( self::$fields[ $opt_name ] ) ) {
565
-				return array();
566
-			}
567
-
568
-			return array_map(
569
-				function ( $field ) {
570
-					return $field['default'] ?? '';
571
-				},
572
-				self::$fields[ $opt_name ]
573
-			);
574
-		}
575
-
576
-		/**
577
-		 * Get term meta.
578
-		 *
579
-		 * @param array $args Args array.
580
-		 *
581
-		 * @return array|mixed|string
582
-		 */
583
-		public static function get_term_meta( array $args = array() ) {
584
-			$default = array(
585
-				'key'      => '',
586
-				'opt_name' => '',
587
-				'taxonomy' => '',
588
-			);
589
-
590
-			$args = wp_parse_args( $args, $default );
591
-
592
-			// phpcs:ignore WordPress.PHP.DontExtract
593
-			extract( $args );
594
-
595
-			if ( empty( $taxonomy ) ) {
596
-				return array();
597
-			}
598
-
599
-			$single = ! empty( $key );
600
-
601
-			$meta = get_term_meta( $taxonomy, $key, $single );
602
-
603
-			// phpcs:ignore Generic.CodeAnalysis.EmptyStatement
604
-			if ( $single ) {
605
-				// Do nothing.
606
-			} elseif ( ! empty( $meta ) ) {
607
-				foreach ( $meta as $key => $value ) {
608
-					if ( is_array( $value ) ) {
609
-						$value = $value[0];
610
-					}
611
-
612
-					$meta[ $key ] = maybe_unserialize( $value );
613
-				}
614
-			}
615
-
616
-			if ( ! empty( $opt_name ) ) {
617
-				$defaults = self::get_field_defaults( $opt_name );
618
-
619
-				if ( $single ) {
620
-					$default_value = '';
621
-
622
-					if ( isset( $defaults[ $key ] ) ) {
623
-						$default_value = $defaults[ $key ];
624
-					}
625
-
626
-					if ( is_array( $meta ) ) {
627
-						if ( is_array( $default_value ) ) {
628
-							$meta = wp_parse_args( $meta, $default_value );
629
-						}
630
-					} elseif ( '' === $meta && '' !== $default_value ) {
631
-							$meta = $default_value;
632
-					}
633
-				} else {
634
-					$meta = wp_parse_args( $meta, $defaults );
635
-				}
636
-			}
637
-
638
-			return $meta;
639
-		}
640
-	}
641
-
642
-	Redux_Taxonomy::load();
16
+    /**
17
+     * Redux Taxonomy API Class
18
+     * Simple API for Redux Framework
19
+     *
20
+     * @since       1.0.0
21
+     */
22
+    class Redux_Taxonomy {
23
+
24
+        /**
25
+         * Terms array.
26
+         *
27
+         * @var array
28
+         */
29
+        public static array $terms = array();
30
+
31
+        /**
32
+         * Sections array.
33
+         *
34
+         * @var array
35
+         */
36
+        public static array $sections = array();
37
+
38
+        /**
39
+         * Fields array.
40
+         *
41
+         * @var array
42
+         */
43
+        public static array $fields = array();
44
+
45
+        /**
46
+         * Priority array.
47
+         *
48
+         * @var array
49
+         */
50
+        public static array $priority = array();
51
+
52
+        /**
53
+         * Errors array.
54
+         *
55
+         * @var array
56
+         */
57
+        public static array $errors = array();
58
+
59
+        /**
60
+         * Init array.
61
+         *
62
+         * @var array
63
+         */
64
+        public static array $init = array();
65
+
66
+        /**
67
+         * Args array.
68
+         *
69
+         * @var array
70
+         */
71
+        public static array $args = array();
72
+
73
+        /**
74
+         * Load.
75
+         */
76
+        public static function load() {
77
+            add_action( 'init', array( 'Redux_Taxonomy', 'enqueue' ), 99 );
78
+        }
79
+
80
+        /**
81
+         * Enqueue support files and fields.
82
+         *
83
+         * @throws ReflectionException Exception.
84
+         */
85
+        public static function enqueue() {
86
+            global $pagenow;
87
+
88
+            // Check and run instances of Redux where the opt_name hasn't been run.
89
+            $pagenows = array( 'edit-tags.php', 'term.php' );
90
+
91
+            if ( ! empty( self::$sections ) && in_array( $pagenow, $pagenows, true ) ) {
92
+                $instances = Redux::all_instances();
93
+
94
+                foreach ( self::$fields as $opt_name => $fields ) {
95
+                    if ( ! isset( $instances[ $opt_name ] ) ) {
96
+                        Redux::set_args( $opt_name, array( 'menu_type' => 'hidden' ) );
97
+
98
+                        Redux::set_sections(
99
+                            $opt_name,
100
+                            array(
101
+                                array(
102
+                                    'id'     => 'EXTENSION_TAXONOMY_FAKE_ID' . $opt_name,
103
+                                    'fields' => $fields,
104
+                                    'title'  => 'N/A',
105
+                                ),
106
+                            )
107
+                        );
108
+
109
+                        Redux::init( $opt_name );
110
+
111
+                        $instances = ReduxFrameworkInstances::get_all_instances();
112
+                    }
113
+
114
+                    self::check_opt_name( $opt_name );
115
+
116
+                    Redux::set_args( $opt_name, self::$args[ $opt_name ] );
117
+                }
118
+            }
119
+        }
120
+
121
+        /**
122
+         * Construct Args.
123
+         *
124
+         * @param string $opt_name Panel opt_name.
125
+         *
126
+         * @return mixed
127
+         */
128
+        public static function construct_args( string $opt_name ) {
129
+            $args             = self::$args[ $opt_name ];
130
+            $args['opt_name'] = $opt_name;
131
+
132
+            if ( ! isset( $args['menu_title'] ) ) {
133
+                $args['menu_title'] = ucfirst( $opt_name ) . ' Options';
134
+            }
135
+
136
+            if ( ! isset( $args['page_title'] ) ) {
137
+                $args['page_title'] = ucfirst( $opt_name ) . ' Options';
138
+            }
139
+
140
+            if ( ! isset( $args['page_slug'] ) ) {
141
+                $args['page_slug'] = $opt_name . '_options';
142
+            }
143
+
144
+            return $args;
145
+        }
146
+
147
+        /**
148
+         * Construct Terms
149
+         *
150
+         * @param string $opt_name Panel opt_name.
151
+         *
152
+         * @return array
153
+         */
154
+        public static function construct_terms( string $opt_name ): array {
155
+            $terms = array();
156
+
157
+            if ( ! isset( self::$terms[ $opt_name ] ) ) {
158
+                return $terms;
159
+            }
160
+
161
+            foreach ( self::$terms[ $opt_name ] as $term ) {
162
+                $term['sections'] = self::construct_sections( $opt_name, $term['id'] );
163
+                $terms[]          = $term;
164
+            }
165
+
166
+            ksort( $terms );
167
+
168
+            return $terms;
169
+        }
170
+
171
+        /**
172
+         * Construct Sections.
173
+         *
174
+         * @param string $opt_name       Panel opt_name.
175
+         * @param string $term_id        Term ID.
176
+         *
177
+         * @return array
178
+         */
179
+        public static function construct_sections( string $opt_name, string $term_id ): array {
180
+            $sections = array();
181
+
182
+            if ( ! isset( self::$sections[ $opt_name ] ) ) {
183
+                return $sections;
184
+            }
185
+
186
+            foreach ( self::$sections[ $opt_name ] as $section_id => $section ) {
187
+                if ( $section['term_id'] === $term_id ) {
188
+                    self::$sections[ $opt_name ][ $section_id ]['add_visibility'] = $section;
189
+
190
+                    $p = $section['priority'];
191
+
192
+                    while ( isset( $sections[ $p ] ) ) {
193
+                        echo esc_html( $p++ );
194
+                    }
195
+
196
+                    $section['fields'] = self::construct_fields( $opt_name, $section_id );
197
+                    $sections[ $p ]    = $section;
198
+                }
199
+            }
200
+
201
+            ksort( $sections );
202
+
203
+            return $sections;
204
+        }
205
+
206
+        /**
207
+         * Construct Fields.
208
+         *
209
+         * @param string $opt_name       Panel opt_name.
210
+         * @param string $section_id     Section ID.
211
+         * @param bool   $permissions    Permissions.
212
+         * @param bool   $add_visibility Add visibility.
213
+         *
214
+         * @return array
215
+         */
216
+        public static function construct_fields( string $opt_name = '', string $section_id = '', bool $permissions = false, bool $add_visibility = false ): array {
217
+            $fields = array();
218
+
219
+            if ( ! isset( self::$fields[ $opt_name ] ) ) {
220
+                return $fields;
221
+            }
222
+
223
+            foreach ( self::$fields[ $opt_name ] as $key => $field ) {
224
+                // Nested permissions.
225
+                $field['permissions'] = $field['permissions'] ?? $permissions;
226
+
227
+                self::$fields[ $opt_name ][ $key ]['permissions'] = $field['permissions'];
228
+
229
+                // Nested add_visibility permissions.
230
+                $field['add_visibility'] = $field['add_visibility'] ?? $add_visibility;
231
+
232
+                self::$fields[ $opt_name ][ $key ]['add_visibility'] = $field['add_visibility'];
233
+
234
+                if ( $field['section_id'] === $section_id ) {
235
+                    $p = $field['priority'];
236
+
237
+                    while ( isset( $fields[ $p ] ) ) {
238
+                        echo esc_html( $p++ );
239
+                    }
240
+
241
+                    $fields[ $p ] = $field;
242
+                }
243
+            }
244
+
245
+            ksort( $fields );
246
+
247
+            return $fields;
248
+        }
249
+
250
+        /**
251
+         * Get Section.
252
+         *
253
+         * @param string $opt_name Panel opt_name.
254
+         * @param string $id       ID.
255
+         *
256
+         * @return bool
257
+         */
258
+        public static function get_section( string $opt_name = '', string $id = '' ): bool {
259
+            self::check_opt_name( $opt_name );
260
+
261
+            if ( ! empty( $opt_name ) && ! empty( $id ) ) {
262
+                if ( ! isset( self::$sections[ $opt_name ][ $id ] ) ) {
263
+                    $id = strtolower( sanitize_html_class( $id ) );
264
+                }
265
+
266
+                return self::$sections[ $opt_name ][ $id ] ?? false;
267
+            }
268
+
269
+            return false;
270
+        }
271
+
272
+        /**
273
+         * Set_section.
274
+         *
275
+         * @param string $opt_name Panel opt_name.
276
+         * @param array  $section  Section array.
277
+         */
278
+        public static function set_section( string $opt_name = '', array $section = array() ) {
279
+            self::check_opt_name( $opt_name );
280
+
281
+            if ( ! empty( $opt_name ) && is_array( $section ) && ! empty( $section ) ) {
282
+                if ( ! isset( $section['id'] ) ) {
283
+                    if ( isset( $section['title'] ) ) {
284
+                        $section['id'] = strtolower( sanitize_html_class( $section['title'] ) );
285
+                    } else {
286
+                        $section['id'] = 'section';
287
+                    }
288
+
289
+                    if ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
290
+                        $orig = $section['id'];
291
+                        $i    = 0;
292
+
293
+                        while ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
294
+                            $section['id'] = $orig . '_' . $i;
295
+                        }
296
+                    }
297
+                }
298
+
299
+                if ( ! isset( $section['priority'] ) ) {
300
+                    $section['priority'] = self::get_priority( $opt_name, 'sections' );
301
+                }
302
+
303
+                if ( isset( $section['fields'] ) ) {
304
+                    if ( ! empty( $section['fields'] ) && is_array( $section['fields'] ) ) {
305
+                        if ( isset( $section['permissions'] ) || isset( $section['add_visibility'] ) ) {
306
+                            foreach ( $section['fields'] as $key => $field ) {
307
+                                if ( ! isset( $field['permissions'] ) && isset( $section['permissions'] ) ) {
308
+                                    $section['fields'][ $key ]['permissions'] = $section['permissions'];
309
+                                }
310
+
311
+                                if ( ! isset( $field['add_visibility'] ) && isset( $section['add_visibility'] ) ) {
312
+                                    $section['fields'][ $key ]['add_visibility'] = $section['add_visibility'];
313
+                                }
314
+                            }
315
+                        }
316
+
317
+                        self::process_fields_array( $opt_name, $section['id'], $section['fields'] );
318
+                    }
319
+
320
+                    unset( $section['fields'] );
321
+                }
322
+
323
+                self::$sections[ $opt_name ][ $section['id'] ] = $section;
324
+            } else {
325
+                self::$errors[ $opt_name ]['section']['empty'] = esc_html__( 'Unable to create a section due an empty section array or the section variable passed was not an array.', 'redux-framework' );
326
+            }
327
+        }
328
+
329
+        /**
330
+         * Process Sections Array.
331
+         *
332
+         * @param string $opt_name Panel opt_name.
333
+         * @param string $term_id  Term ID.
334
+         * @param array  $sections Sections array.
335
+         */
336
+        public static function process_sections_array( string $opt_name = '', string $term_id = '', array $sections = array() ) {
337
+            if ( ! empty( $opt_name ) && ! empty( $term_id ) && is_array( $sections ) && ! empty( $sections ) ) {
338
+                foreach ( $sections as $section ) {
339
+                    if ( ! is_array( $section ) ) {
340
+                        continue;
341
+                    }
342
+
343
+                    $section['term_id'] = $term_id;
344
+
345
+                    if ( ! isset( $section['fields'] ) || ! is_array( $section['fields'] ) ) {
346
+                        $section['fields'] = array();
347
+                    }
348
+
349
+                    self::set_section( $opt_name, $section );
350
+                }
351
+            }
352
+        }
353
+
354
+        /**
355
+         * Process field array.
356
+         *
357
+         * @param string $opt_name   Panel opt_name.
358
+         * @param string $section_id Section ID.
359
+         * @param array  $fields     Fields array.
360
+         */
361
+        public static function process_fields_array( string $opt_name = '', string $section_id = '', array $fields = array() ) {
362
+            if ( ! empty( $opt_name ) && ! empty( $section_id ) && is_array( $fields ) && ! empty( $fields ) ) {
363
+                foreach ( $fields as $field ) {
364
+                    if ( ! is_array( $field ) ) {
365
+                        continue;
366
+                    }
367
+
368
+                    $field['section_id'] = $section_id;
369
+
370
+                    self::set_field( $opt_name, $field );
371
+                }
372
+            }
373
+        }
374
+
375
+        /**
376
+         * Get field.
377
+         *
378
+         * @param string $opt_name Panel opt_name.
379
+         * @param string $id       ID.
380
+         *
381
+         * @return bool
382
+         */
383
+        public static function get_field( string $opt_name = '', string $id = '' ): bool {
384
+            self::check_opt_name( $opt_name );
385
+
386
+            if ( ! empty( $opt_name ) && ! empty( $id ) ) {
387
+                return self::$fields[ $opt_name ][ $id ] ?? false;
388
+            }
389
+
390
+            return false;
391
+        }
392
+
393
+        /**
394
+         * Set field.
395
+         *
396
+         * @param string $opt_name Panel opt_name.
397
+         * @param array  $field    Field array.
398
+         */
399
+        public static function set_field( string $opt_name = '', array $field = array() ) {
400
+            self::check_opt_name( $opt_name );
401
+
402
+            if ( ! empty( $opt_name ) && is_array( $field ) && ! empty( $field ) ) {
403
+                if ( ! isset( $field['priority'] ) ) {
404
+                    $field['priority'] = self::get_priority( $opt_name, 'fields' );
405
+                }
406
+
407
+                self::$fields[ $opt_name ][ $field['id'] ] = $field;
408
+            }
409
+        }
410
+
411
+        /**
412
+         * Set args.
413
+         *
414
+         * @param string $opt_name Panel opt_name.
415
+         * @param array  $args     Args array.
416
+         */
417
+        public static function set_args( string $opt_name = '', array $args = array() ) {
418
+            self::check_opt_name( $opt_name );
419
+
420
+            if ( ! empty( $opt_name ) && is_array( $args ) && ! empty( $args ) ) {
421
+                self::$args[ $opt_name ] = self::$args[ $opt_name ] ?? array();
422
+                self::$args[ $opt_name ] = wp_parse_args( $args, self::$args[ $opt_name ] );
423
+            }
424
+        }
425
+
426
+        /**
427
+         * Set term.
428
+         *
429
+         * @param string $opt_name Panel opt_name.
430
+         * @param array  $term     Term array.
431
+         */
432
+        public static function set_term( string $opt_name = '', array $term = array() ) {
433
+            self::check_opt_name( $opt_name );
434
+
435
+            if ( ! empty( $opt_name ) && is_array( $term ) && ! empty( $term ) ) {
436
+                if ( ! isset( $term['id'] ) ) {
437
+                    if ( isset( $term['title'] ) ) {
438
+                        $term['id'] = strtolower( sanitize_html_class( $term['title'] ) );
439
+                    } else {
440
+                        $term['id'] = 'term';
441
+                    }
442
+
443
+                    if ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) {
444
+                        $orig = $term['id'];
445
+                        $i    = 0;
446
+
447
+                        while ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) {
448
+                            $term['id'] = $orig . '_' . $i;
449
+                        }
450
+                    }
451
+                }
452
+
453
+                if ( isset( $term['sections'] ) ) {
454
+                    if ( ! empty( $term['sections'] ) && is_array( $term['sections'] ) ) {
455
+                        if ( isset( $term['permissions'] ) || isset( $term['add_visibility'] ) ) {
456
+                            foreach ( $term['sections'] as $key => $section ) {
457
+                                if ( ! isset( $section['permissions'] ) && isset( $term['permissions'] ) ) {
458
+                                    $term['sections'][ $key ]['permissions'] = $term['permissions'];
459
+                                }
460
+
461
+                                if ( ! isset( $section['add_visibility'] ) && isset( $term['add_visibility'] ) ) {
462
+                                    $term['sections'][ $key ]['add_visibility'] = $term['add_visibility'];
463
+                                }
464
+                            }
465
+                        }
466
+
467
+                        self::process_sections_array( $opt_name, $term['id'], $term['sections'] );
468
+                    }
469
+
470
+                    unset( $term['sections'] );
471
+                }
472
+
473
+                self::$terms[ $opt_name ][ $term['id'] ] = $term;
474
+            } else {
475
+                self::$errors[ $opt_name ]['term']['empty'] = esc_html__( 'Unable to create a term due an empty term array or the term variable passed was not an array.', 'redux-framework' );
476
+            }
477
+        }
478
+
479
+        /**
480
+         * Get terms.
481
+         *
482
+         * @param string $opt_name Panel opt_name.
483
+         *
484
+         * @return mixed
485
+         */
486
+        public static function get_terms( string $opt_name = '' ) {
487
+            self::check_opt_name( $opt_name );
488
+
489
+            if ( ! empty( $opt_name ) && ! empty( self::$terms[ $opt_name ] ) ) {
490
+                return self::$terms[ $opt_name ];
491
+            }
492
+
493
+            return false;
494
+        }
495
+
496
+        /**
497
+         * Get priority.
498
+         *
499
+         * @param string $opt_name Panel opt_name.
500
+         * @param string $type     Field type.
501
+         *
502
+         * @return mixed
503
+         */
504
+        public static function get_priority( string $opt_name, string $type ) {
505
+            $priority                              = self::$priority[ $opt_name ][ $type ];
506
+            self::$priority[ $opt_name ][ $type ] += 1;
507
+
508
+            return $priority;
509
+        }
510
+
511
+        /**
512
+         * Check opt_name.
513
+         *
514
+         * @param string $opt_name Panel opt_name.
515
+         */
516
+        public static function check_opt_name( string $opt_name = '' ) {
517
+            if ( empty( $opt_name ) || is_array( $opt_name ) ) {
518
+                return;
519
+            }
520
+
521
+            if ( ! isset( self::$terms[ $opt_name ] ) ) {
522
+                self::$terms[ $opt_name ] = array();
523
+            }
524
+
525
+            if ( ! isset( self::$priority[ $opt_name ] ) ) {
526
+                self::$priority[ $opt_name ]['args'] = 1;
527
+            }
528
+
529
+            if ( ! isset( self::$sections[ $opt_name ] ) ) {
530
+                self::$sections[ $opt_name ]             = array();
531
+                self::$priority[ $opt_name ]['sections'] = 1;
532
+            }
533
+
534
+            if ( ! isset( self::$fields[ $opt_name ] ) ) {
535
+                self::$fields[ $opt_name ]             = array();
536
+                self::$priority[ $opt_name ]['fields'] = 1;
537
+            }
538
+
539
+            if ( ! isset( self::$errors[ $opt_name ] ) ) {
540
+                self::$errors[ $opt_name ] = array();
541
+            }
542
+
543
+            if ( ! isset( self::$init[ $opt_name ] ) ) {
544
+                self::$init[ $opt_name ] = false;
545
+            }
546
+
547
+            if ( ! isset( self::$args[ $opt_name ] ) ) {
548
+                self::$args[ $opt_name ] = false;
549
+            }
550
+        }
551
+
552
+        /**
553
+         * Get field defaults.
554
+         *
555
+         * @param string $opt_name Panel opt_name.
556
+         *
557
+         * @return array|void
558
+         */
559
+        public static function get_field_defaults( string $opt_name ) {
560
+            if ( empty( $opt_name ) ) {
561
+                return;
562
+            }
563
+
564
+            if ( ! isset( self::$fields[ $opt_name ] ) ) {
565
+                return array();
566
+            }
567
+
568
+            return array_map(
569
+                function ( $field ) {
570
+                    return $field['default'] ?? '';
571
+                },
572
+                self::$fields[ $opt_name ]
573
+            );
574
+        }
575
+
576
+        /**
577
+         * Get term meta.
578
+         *
579
+         * @param array $args Args array.
580
+         *
581
+         * @return array|mixed|string
582
+         */
583
+        public static function get_term_meta( array $args = array() ) {
584
+            $default = array(
585
+                'key'      => '',
586
+                'opt_name' => '',
587
+                'taxonomy' => '',
588
+            );
589
+
590
+            $args = wp_parse_args( $args, $default );
591
+
592
+            // phpcs:ignore WordPress.PHP.DontExtract
593
+            extract( $args );
594
+
595
+            if ( empty( $taxonomy ) ) {
596
+                return array();
597
+            }
598
+
599
+            $single = ! empty( $key );
600
+
601
+            $meta = get_term_meta( $taxonomy, $key, $single );
602
+
603
+            // phpcs:ignore Generic.CodeAnalysis.EmptyStatement
604
+            if ( $single ) {
605
+                // Do nothing.
606
+            } elseif ( ! empty( $meta ) ) {
607
+                foreach ( $meta as $key => $value ) {
608
+                    if ( is_array( $value ) ) {
609
+                        $value = $value[0];
610
+                    }
611
+
612
+                    $meta[ $key ] = maybe_unserialize( $value );
613
+                }
614
+            }
615
+
616
+            if ( ! empty( $opt_name ) ) {
617
+                $defaults = self::get_field_defaults( $opt_name );
618
+
619
+                if ( $single ) {
620
+                    $default_value = '';
621
+
622
+                    if ( isset( $defaults[ $key ] ) ) {
623
+                        $default_value = $defaults[ $key ];
624
+                    }
625
+
626
+                    if ( is_array( $meta ) ) {
627
+                        if ( is_array( $default_value ) ) {
628
+                            $meta = wp_parse_args( $meta, $default_value );
629
+                        }
630
+                    } elseif ( '' === $meta && '' !== $default_value ) {
631
+                            $meta = $default_value;
632
+                    }
633
+                } else {
634
+                    $meta = wp_parse_args( $meta, $defaults );
635
+                }
636
+            }
637
+
638
+            return $meta;
639
+        }
640
+    }
641
+
642
+    Redux_Taxonomy::load();
643 643
 }
Please login to merge, or discard this patch.
Spacing   +60 added lines, -60 removed lines patch added patch discarded remove patch
@@ -92,7 +92,7 @@  discard block
 block discarded – undo
92 92
 				$instances = Redux::all_instances();
93 93
 
94 94
 				foreach ( self::$fields as $opt_name => $fields ) {
95
-					if ( ! isset( $instances[ $opt_name ] ) ) {
95
+					if ( ! isset( $instances[$opt_name] ) ) {
96 96
 						Redux::set_args( $opt_name, array( 'menu_type' => 'hidden' ) );
97 97
 
98 98
 						Redux::set_sections(
@@ -113,7 +113,7 @@  discard block
 block discarded – undo
113 113
 
114 114
 					self::check_opt_name( $opt_name );
115 115
 
116
-					Redux::set_args( $opt_name, self::$args[ $opt_name ] );
116
+					Redux::set_args( $opt_name, self::$args[$opt_name] );
117 117
 				}
118 118
 			}
119 119
 		}
@@ -126,7 +126,7 @@  discard block
 block discarded – undo
126 126
 		 * @return mixed
127 127
 		 */
128 128
 		public static function construct_args( string $opt_name ) {
129
-			$args             = self::$args[ $opt_name ];
129
+			$args             = self::$args[$opt_name];
130 130
 			$args['opt_name'] = $opt_name;
131 131
 
132 132
 			if ( ! isset( $args['menu_title'] ) ) {
@@ -154,11 +154,11 @@  discard block
 block discarded – undo
154 154
 		public static function construct_terms( string $opt_name ): array {
155 155
 			$terms = array();
156 156
 
157
-			if ( ! isset( self::$terms[ $opt_name ] ) ) {
157
+			if ( ! isset( self::$terms[$opt_name] ) ) {
158 158
 				return $terms;
159 159
 			}
160 160
 
161
-			foreach ( self::$terms[ $opt_name ] as $term ) {
161
+			foreach ( self::$terms[$opt_name] as $term ) {
162 162
 				$term['sections'] = self::construct_sections( $opt_name, $term['id'] );
163 163
 				$terms[]          = $term;
164 164
 			}
@@ -179,22 +179,22 @@  discard block
 block discarded – undo
179 179
 		public static function construct_sections( string $opt_name, string $term_id ): array {
180 180
 			$sections = array();
181 181
 
182
-			if ( ! isset( self::$sections[ $opt_name ] ) ) {
182
+			if ( ! isset( self::$sections[$opt_name] ) ) {
183 183
 				return $sections;
184 184
 			}
185 185
 
186
-			foreach ( self::$sections[ $opt_name ] as $section_id => $section ) {
186
+			foreach ( self::$sections[$opt_name] as $section_id => $section ) {
187 187
 				if ( $section['term_id'] === $term_id ) {
188
-					self::$sections[ $opt_name ][ $section_id ]['add_visibility'] = $section;
188
+					self::$sections[$opt_name][$section_id]['add_visibility'] = $section;
189 189
 
190 190
 					$p = $section['priority'];
191 191
 
192
-					while ( isset( $sections[ $p ] ) ) {
192
+					while ( isset( $sections[$p] ) ) {
193 193
 						echo esc_html( $p++ );
194 194
 					}
195 195
 
196 196
 					$section['fields'] = self::construct_fields( $opt_name, $section_id );
197
-					$sections[ $p ]    = $section;
197
+					$sections[$p]    = $section;
198 198
 				}
199 199
 			}
200 200
 
@@ -216,29 +216,29 @@  discard block
 block discarded – undo
216 216
 		public static function construct_fields( string $opt_name = '', string $section_id = '', bool $permissions = false, bool $add_visibility = false ): array {
217 217
 			$fields = array();
218 218
 
219
-			if ( ! isset( self::$fields[ $opt_name ] ) ) {
219
+			if ( ! isset( self::$fields[$opt_name] ) ) {
220 220
 				return $fields;
221 221
 			}
222 222
 
223
-			foreach ( self::$fields[ $opt_name ] as $key => $field ) {
223
+			foreach ( self::$fields[$opt_name] as $key => $field ) {
224 224
 				// Nested permissions.
225 225
 				$field['permissions'] = $field['permissions'] ?? $permissions;
226 226
 
227
-				self::$fields[ $opt_name ][ $key ]['permissions'] = $field['permissions'];
227
+				self::$fields[$opt_name][$key]['permissions'] = $field['permissions'];
228 228
 
229 229
 				// Nested add_visibility permissions.
230 230
 				$field['add_visibility'] = $field['add_visibility'] ?? $add_visibility;
231 231
 
232
-				self::$fields[ $opt_name ][ $key ]['add_visibility'] = $field['add_visibility'];
232
+				self::$fields[$opt_name][$key]['add_visibility'] = $field['add_visibility'];
233 233
 
234 234
 				if ( $field['section_id'] === $section_id ) {
235 235
 					$p = $field['priority'];
236 236
 
237
-					while ( isset( $fields[ $p ] ) ) {
237
+					while ( isset( $fields[$p] ) ) {
238 238
 						echo esc_html( $p++ );
239 239
 					}
240 240
 
241
-					$fields[ $p ] = $field;
241
+					$fields[$p] = $field;
242 242
 				}
243 243
 			}
244 244
 
@@ -259,11 +259,11 @@  discard block
 block discarded – undo
259 259
 			self::check_opt_name( $opt_name );
260 260
 
261 261
 			if ( ! empty( $opt_name ) && ! empty( $id ) ) {
262
-				if ( ! isset( self::$sections[ $opt_name ][ $id ] ) ) {
262
+				if ( ! isset( self::$sections[$opt_name][$id] ) ) {
263 263
 					$id = strtolower( sanitize_html_class( $id ) );
264 264
 				}
265 265
 
266
-				return self::$sections[ $opt_name ][ $id ] ?? false;
266
+				return self::$sections[$opt_name][$id] ?? false;
267 267
 			}
268 268
 
269 269
 			return false;
@@ -286,11 +286,11 @@  discard block
 block discarded – undo
286 286
 						$section['id'] = 'section';
287 287
 					}
288 288
 
289
-					if ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
289
+					if ( isset( self::$sections[$opt_name][$section['id']] ) ) {
290 290
 						$orig = $section['id'];
291 291
 						$i    = 0;
292 292
 
293
-						while ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
293
+						while ( isset( self::$sections[$opt_name][$section['id']] ) ) {
294 294
 							$section['id'] = $orig . '_' . $i;
295 295
 						}
296 296
 					}
@@ -305,11 +305,11 @@  discard block
 block discarded – undo
305 305
 						if ( isset( $section['permissions'] ) || isset( $section['add_visibility'] ) ) {
306 306
 							foreach ( $section['fields'] as $key => $field ) {
307 307
 								if ( ! isset( $field['permissions'] ) && isset( $section['permissions'] ) ) {
308
-									$section['fields'][ $key ]['permissions'] = $section['permissions'];
308
+									$section['fields'][$key]['permissions'] = $section['permissions'];
309 309
 								}
310 310
 
311 311
 								if ( ! isset( $field['add_visibility'] ) && isset( $section['add_visibility'] ) ) {
312
-									$section['fields'][ $key ]['add_visibility'] = $section['add_visibility'];
312
+									$section['fields'][$key]['add_visibility'] = $section['add_visibility'];
313 313
 								}
314 314
 							}
315 315
 						}
@@ -320,9 +320,9 @@  discard block
 block discarded – undo
320 320
 					unset( $section['fields'] );
321 321
 				}
322 322
 
323
-				self::$sections[ $opt_name ][ $section['id'] ] = $section;
323
+				self::$sections[$opt_name][$section['id']] = $section;
324 324
 			} else {
325
-				self::$errors[ $opt_name ]['section']['empty'] = esc_html__( 'Unable to create a section due an empty section array or the section variable passed was not an array.', 'redux-framework' );
325
+				self::$errors[$opt_name]['section']['empty'] = esc_html__( 'Unable to create a section due an empty section array or the section variable passed was not an array.', 'redux-framework' );
326 326
 			}
327 327
 		}
328 328
 
@@ -384,7 +384,7 @@  discard block
 block discarded – undo
384 384
 			self::check_opt_name( $opt_name );
385 385
 
386 386
 			if ( ! empty( $opt_name ) && ! empty( $id ) ) {
387
-				return self::$fields[ $opt_name ][ $id ] ?? false;
387
+				return self::$fields[$opt_name][$id] ?? false;
388 388
 			}
389 389
 
390 390
 			return false;
@@ -404,7 +404,7 @@  discard block
 block discarded – undo
404 404
 					$field['priority'] = self::get_priority( $opt_name, 'fields' );
405 405
 				}
406 406
 
407
-				self::$fields[ $opt_name ][ $field['id'] ] = $field;
407
+				self::$fields[$opt_name][$field['id']] = $field;
408 408
 			}
409 409
 		}
410 410
 
@@ -418,8 +418,8 @@  discard block
 block discarded – undo
418 418
 			self::check_opt_name( $opt_name );
419 419
 
420 420
 			if ( ! empty( $opt_name ) && is_array( $args ) && ! empty( $args ) ) {
421
-				self::$args[ $opt_name ] = self::$args[ $opt_name ] ?? array();
422
-				self::$args[ $opt_name ] = wp_parse_args( $args, self::$args[ $opt_name ] );
421
+				self::$args[$opt_name] = self::$args[$opt_name] ?? array();
422
+				self::$args[$opt_name] = wp_parse_args( $args, self::$args[$opt_name] );
423 423
 			}
424 424
 		}
425 425
 
@@ -440,11 +440,11 @@  discard block
 block discarded – undo
440 440
 						$term['id'] = 'term';
441 441
 					}
442 442
 
443
-					if ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) {
443
+					if ( isset( self::$terms[$opt_name][$term['id']] ) ) {
444 444
 						$orig = $term['id'];
445 445
 						$i    = 0;
446 446
 
447
-						while ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) {
447
+						while ( isset( self::$terms[$opt_name][$term['id']] ) ) {
448 448
 							$term['id'] = $orig . '_' . $i;
449 449
 						}
450 450
 					}
@@ -455,11 +455,11 @@  discard block
 block discarded – undo
455 455
 						if ( isset( $term['permissions'] ) || isset( $term['add_visibility'] ) ) {
456 456
 							foreach ( $term['sections'] as $key => $section ) {
457 457
 								if ( ! isset( $section['permissions'] ) && isset( $term['permissions'] ) ) {
458
-									$term['sections'][ $key ]['permissions'] = $term['permissions'];
458
+									$term['sections'][$key]['permissions'] = $term['permissions'];
459 459
 								}
460 460
 
461 461
 								if ( ! isset( $section['add_visibility'] ) && isset( $term['add_visibility'] ) ) {
462
-									$term['sections'][ $key ]['add_visibility'] = $term['add_visibility'];
462
+									$term['sections'][$key]['add_visibility'] = $term['add_visibility'];
463 463
 								}
464 464
 							}
465 465
 						}
@@ -470,9 +470,9 @@  discard block
 block discarded – undo
470 470
 					unset( $term['sections'] );
471 471
 				}
472 472
 
473
-				self::$terms[ $opt_name ][ $term['id'] ] = $term;
473
+				self::$terms[$opt_name][$term['id']] = $term;
474 474
 			} else {
475
-				self::$errors[ $opt_name ]['term']['empty'] = esc_html__( 'Unable to create a term due an empty term array or the term variable passed was not an array.', 'redux-framework' );
475
+				self::$errors[$opt_name]['term']['empty'] = esc_html__( 'Unable to create a term due an empty term array or the term variable passed was not an array.', 'redux-framework' );
476 476
 			}
477 477
 		}
478 478
 
@@ -486,8 +486,8 @@  discard block
 block discarded – undo
486 486
 		public static function get_terms( string $opt_name = '' ) {
487 487
 			self::check_opt_name( $opt_name );
488 488
 
489
-			if ( ! empty( $opt_name ) && ! empty( self::$terms[ $opt_name ] ) ) {
490
-				return self::$terms[ $opt_name ];
489
+			if ( ! empty( $opt_name ) && ! empty( self::$terms[$opt_name] ) ) {
490
+				return self::$terms[$opt_name];
491 491
 			}
492 492
 
493 493
 			return false;
@@ -502,8 +502,8 @@  discard block
 block discarded – undo
502 502
 		 * @return mixed
503 503
 		 */
504 504
 		public static function get_priority( string $opt_name, string $type ) {
505
-			$priority                              = self::$priority[ $opt_name ][ $type ];
506
-			self::$priority[ $opt_name ][ $type ] += 1;
505
+			$priority                              = self::$priority[$opt_name][$type];
506
+			self::$priority[$opt_name][$type] += 1;
507 507
 
508 508
 			return $priority;
509 509
 		}
@@ -518,34 +518,34 @@  discard block
 block discarded – undo
518 518
 				return;
519 519
 			}
520 520
 
521
-			if ( ! isset( self::$terms[ $opt_name ] ) ) {
522
-				self::$terms[ $opt_name ] = array();
521
+			if ( ! isset( self::$terms[$opt_name] ) ) {
522
+				self::$terms[$opt_name] = array();
523 523
 			}
524 524
 
525
-			if ( ! isset( self::$priority[ $opt_name ] ) ) {
526
-				self::$priority[ $opt_name ]['args'] = 1;
525
+			if ( ! isset( self::$priority[$opt_name] ) ) {
526
+				self::$priority[$opt_name]['args'] = 1;
527 527
 			}
528 528
 
529
-			if ( ! isset( self::$sections[ $opt_name ] ) ) {
530
-				self::$sections[ $opt_name ]             = array();
531
-				self::$priority[ $opt_name ]['sections'] = 1;
529
+			if ( ! isset( self::$sections[$opt_name] ) ) {
530
+				self::$sections[$opt_name]             = array();
531
+				self::$priority[$opt_name]['sections'] = 1;
532 532
 			}
533 533
 
534
-			if ( ! isset( self::$fields[ $opt_name ] ) ) {
535
-				self::$fields[ $opt_name ]             = array();
536
-				self::$priority[ $opt_name ]['fields'] = 1;
534
+			if ( ! isset( self::$fields[$opt_name] ) ) {
535
+				self::$fields[$opt_name]             = array();
536
+				self::$priority[$opt_name]['fields'] = 1;
537 537
 			}
538 538
 
539
-			if ( ! isset( self::$errors[ $opt_name ] ) ) {
540
-				self::$errors[ $opt_name ] = array();
539
+			if ( ! isset( self::$errors[$opt_name] ) ) {
540
+				self::$errors[$opt_name] = array();
541 541
 			}
542 542
 
543
-			if ( ! isset( self::$init[ $opt_name ] ) ) {
544
-				self::$init[ $opt_name ] = false;
543
+			if ( ! isset( self::$init[$opt_name] ) ) {
544
+				self::$init[$opt_name] = false;
545 545
 			}
546 546
 
547
-			if ( ! isset( self::$args[ $opt_name ] ) ) {
548
-				self::$args[ $opt_name ] = false;
547
+			if ( ! isset( self::$args[$opt_name] ) ) {
548
+				self::$args[$opt_name] = false;
549 549
 			}
550 550
 		}
551 551
 
@@ -561,15 +561,15 @@  discard block
 block discarded – undo
561 561
 				return;
562 562
 			}
563 563
 
564
-			if ( ! isset( self::$fields[ $opt_name ] ) ) {
564
+			if ( ! isset( self::$fields[$opt_name] ) ) {
565 565
 				return array();
566 566
 			}
567 567
 
568 568
 			return array_map(
569
-				function ( $field ) {
569
+				function( $field ) {
570 570
 					return $field['default'] ?? '';
571 571
 				},
572
-				self::$fields[ $opt_name ]
572
+				self::$fields[$opt_name]
573 573
 			);
574 574
 		}
575 575
 
@@ -609,7 +609,7 @@  discard block
 block discarded – undo
609 609
 						$value = $value[0];
610 610
 					}
611 611
 
612
-					$meta[ $key ] = maybe_unserialize( $value );
612
+					$meta[$key] = maybe_unserialize( $value );
613 613
 				}
614 614
 			}
615 615
 
@@ -619,8 +619,8 @@  discard block
 block discarded – undo
619 619
 				if ( $single ) {
620 620
 					$default_value = '';
621 621
 
622
-					if ( isset( $defaults[ $key ] ) ) {
623
-						$default_value = $defaults[ $key ];
622
+					if ( isset( $defaults[$key] ) ) {
623
+						$default_value = $defaults[$key];
624 624
 					}
625 625
 
626 626
 					if ( is_array( $meta ) ) {
Please login to merge, or discard this patch.