Browse Source

migrate :full_moon:

windhamdavid 4 years ago
parent
commit
0978d6a26c

+ 49 - 0
archive.php

@@ -0,0 +1,49 @@
+<?php
+/**
+ * This file adds the Custom Archives to the Captivating Theme.
+ *
+ * @package      Captivating
+ * @link         http://restored316designs.com/themes
+ * @author       Lauren Gaige // Restored 316 LLC
+ * @copyright    Copyright (c) 2015, Restored 316 LLC, Released 08/09/2017
+ * @license      GPL-2.0+
+ */
+
+//* Adds a CSS class to the body element
+add_filter( 'body_class', 'captivating_archives_body_class' );
+function captivating_archives_body_class( $classes ) {
+
+	$classes[] = 'captivating-archives';
+	return $classes;
+
+}
+
+//* Display as Columns
+add_filter( 'post_class', 'captivating_grid_post_class' );
+function captivating_grid_post_class( $classes ) {
+
+	if ( is_main_query() ) { // conditional to ensure that column classes do not apply to Featured widgets
+		$columns = 3; // Set the number of columns here
+
+		$column_classes = array( '', '', 'one-half', 'one-third', 'one-fourth', 'one-fifth', 'one-sixth' );
+		$classes[] = $column_classes[$columns];
+		global $wp_query;
+		if( 0 == $wp_query->current_post || 0 == $wp_query->current_post % $columns )
+			$classes[] = 'first';
+	}
+
+	return $classes;
+
+}
+
+//* Remove the breadcrumb navigation
+remove_action( 'genesis_before_loop', 'genesis_do_breadcrumbs' );
+
+//* Remove the post info/meta function
+remove_action( 'genesis_entry_header', 'genesis_post_info', 9 );
+remove_action( 'genesis_entry_header', 'genesis_post_meta', 12 );
+
+//* Remove the post content
+remove_action( 'genesis_entry_content', 'genesis_do_post_content' );
+
+genesis();

+ 104 - 0
css/slick.css

@@ -0,0 +1,104 @@
+/* Slider */
+
+.slick-slider {
+    position: relative;
+    display: block;
+    box-sizing: border-box;
+    -webkit-user-select: none;
+       -moz-user-select: none;
+        -ms-user-select: none;
+            user-select: none;
+    -webkit-touch-callout: none;
+    -khtml-user-select: none;
+    -ms-touch-action: pan-y;
+        touch-action: pan-y;
+    -webkit-tap-highlight-color: transparent;
+}
+
+.slick-list {
+    position: relative;
+    display: block;
+    overflow: hidden;
+    margin: 0;
+    padding: 0;
+}
+
+.slick-list:focus {
+    outline: none;
+}
+
+.slick-list.dragging {
+    cursor: pointer;
+    cursor: hand;
+}
+
+.slick-slider .slick-track,
+.slick-slider .slick-list {
+    -webkit-transform: translate3d(0, 0, 0);
+       -moz-transform: translate3d(0, 0, 0);
+        -ms-transform: translate3d(0, 0, 0);
+         -o-transform: translate3d(0, 0, 0);
+            transform: translate3d(0, 0, 0);
+}
+
+.slick-track {
+    position: relative;
+    top: 0;
+    left: 0;
+    display: block;
+}
+
+.slick-track:before,
+.slick-track:after {
+    display: table;
+    content: '';
+}
+
+.slick-track:after {
+    clear: both;
+}
+
+.slick-loading .slick-track {
+    visibility: hidden;
+}
+
+.slick-slide {
+    display: none;
+    float: left;
+    height: 100%;
+    min-height: 1px;
+}
+
+[dir='rtl'] .slick-slide {
+    float: right;
+}
+
+.slick-slide img {
+    display: block;
+}
+
+.slick-slide.slick-loading img {
+    display: none;
+}
+
+.slick-slide.dragging img {
+    pointer-events: none;
+}
+
+.slick-initialized .slick-slide {
+    display: block;
+}
+
+.slick-loading .slick-slide {
+    visibility: hidden;
+}
+
+.slick-vertical .slick-slide {
+    display: block;
+    height: auto;
+    border: 1px solid transparent;
+}
+
+.slick-arrow.slick-hidden {
+    display: none;
+}

+ 49 - 0
flexible-posts-widget/post-carousel.php

@@ -0,0 +1,49 @@
+<?php
+/**
+ * Flexible Posts Widget: Custom widget template
+ *
+ * @since 3.4.0
+ *
+ * This is a custom template used by the plugin.
+ * Listing price and excerpt below the image.
+ */
+
+// Block direct requests.
+if ( ! defined( 'ABSPATH' ) ) {
+	die( '-1' );
+}
+
+echo $before_widget;
+
+if ( ! empty( $title ) ) {
+	echo $before_title . $title . $after_title;
+}
+
+if ( $flexible_posts->have_posts() ) :
+?>
+	<ul class="home-carousel">
+	<?php while ( $flexible_posts->have_posts() ) : $flexible_posts->the_post(); global $post; ?>
+		<li id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
+			<a href="<?php echo the_permalink(); ?>" class="listing-link">
+				<?php
+				if ( true == $thumbnail ) {
+					// if the post has a feature image, show it.
+					if ( has_post_thumbnail() ) {
+						the_post_thumbnail( $thumbsize );
+					// else if the post has a mime type that starts with "image/" then show the image directly.
+					} elseif ( 'image/' == substr( $post->post_mime_type, 0, 6 ) ) {
+						echo wp_get_attachment_image( $post->ID, $thumbsize );
+					}
+				}
+				?>
+				<div class="title">
+					<?php the_title(); ?>
+				</div>
+			</a>
+		</li>
+	<?php endwhile; ?>
+	</ul><!-- .dpe-flexible-posts -->
+<?php
+endif; // End have_posts().
+
+echo $after_widget;

+ 224 - 0
front-page.php

@@ -0,0 +1,224 @@
+<?php
+/**
+ * This file adds all the settings for the home page of the Captivating theme.
+ *
+ * @package      Captivating
+ * @link         http://restored316designs.com/themes
+ * @author       Lauren Gaige // Restored 316 LLC
+ * @copyright    Copyright (c) 2015, Restored 316 LLC, Released 08/09/2017
+ * @license      GPL-2.0+
+ */
+
+//* Add widget support for homepage. If no widgets active, display the default loop.
+add_action( 'genesis_meta', 'captivating_front_page_genesis_meta' );
+function captivating_front_page_genesis_meta() {
+
+	if ( is_active_sidebar( 'home-featured' ) || is_active_sidebar( 'home-above-content' )|| is_active_sidebar( 'home-below-content' ) ) {
+	
+		//* Enqueue scripts
+		add_action( 'wp_enqueue_scripts', 'captivating_enqueue_captivating_script' );
+		function captivating_enqueue_captivating_script() {
+
+			wp_enqueue_style( 'captivating-front-styles', get_stylesheet_directory_uri() . '/style-front.css', array(), CHILD_THEME_VERSION );
+
+		}
+
+
+		//* Add body class
+		add_filter( 'body_class', 'captivating_front_page_body_class' );
+		
+		//* Force full width content layout
+		add_filter( 'genesis_pre_get_option_site_layout', '__genesis_return_content_sidebar' );
+		
+		//* Add widgets on top of the front page in the featured space
+		add_action( 'genesis_after_header', 'captivating_front_page_featured_widgets' );
+		
+		//* Add widgets on top of the front page
+		add_action( 'genesis_before_loop', 'captivating_front_page_top_widgets' );
+		
+		$blog = get_option( 'captivating_blog_setting', 'true' );
+
+		if ( $blog === 'true' ) {
+
+			//* Add opening markup for blog section
+			add_action( 'genesis_before_loop', 'captivating_front_page_blog_open' );
+
+			//* Add closing markup for blog section
+			add_action( 'genesis_after_loop', 'captivating_front_page_blog_close' );
+			
+		} else {
+
+			//* Remove the default Genesis loop
+			remove_action( 'genesis_loop', 'genesis_do_loop' );
+
+		}
+		
+		//* Add widgets on bottom of the front page
+		add_action( 'genesis_after_loop', 'captivating_front_page_bottom_widgets' );
+
+	}
+}
+
+//* Add slick carosel
+	wp_enqueue_style( 'slick-styles', get_stylesheet_directory_uri() . '/css/slick.css' );
+	wp_enqueue_script( 'slick-js', get_stylesheet_directory_uri() . '/js/slick.min.js', array( 'jquery' ), '1.6.0', true );
+	wp_enqueue_script( 'slick-init', get_stylesheet_directory_uri() . '/js/slick-init.js', array( 'slick-js' ), '1.0.0', true );
+	wp_enqueue_style( 'font-awesome', '//maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css' );
+
+
+//* Add body class to the head
+function captivating_front_page_body_class( $classes ) {
+
+	$classes[] = 'front-page';
+	return $classes;
+
+}
+
+//* Add widgets on front page
+function captivating_front_page_featured_widgets() {
+
+if ( get_query_var( 'paged' ) >= 2 )
+		return;
+
+	genesis_widget_area( 'Home Featured', array(
+		'before' => '<div id="home-featured" class="home-featured"><div class="wrap">',
+		'after'  => '</div></div>',
+	) );
+	
+	genesis_widget_area( 'site-wide-cta', array(
+		'before' => '<div class="site-wide-cta widget-area"><div class="wrap">',
+		'after'  => '</div></div>',
+    ) );
+
+}
+
+//* Add widgets on front page
+function captivating_front_page_top_widgets() {
+
+	if ( get_query_var( 'paged' ) >= 2 )
+		return;
+
+	genesis_widget_area( 'Home Above Content', array(
+		'before' => '<div id="home-above-content" class="home-above-content"><div class="wrap">',
+		'after'  => '</div></div>',
+	) );
+
+}
+
+//* Add widgets on front page
+function captivating_front_page_bottom_widgets() {
+
+	if ( get_query_var( 'paged' ) >= 2 )
+		return;
+    
+    genesis_widget_area( 'Home Below Content', array(
+		'before' => '<div id="home-below-content" class="home-below-content"><div class="wrap">',
+		'after'  => '</div></div>',
+	) );
+
+}
+
+//* Add opening markup for blog section
+function captivating_front_page_blog_open() {
+
+	$blog_text = get_option( 'captivating_blog_text', __( 'Latest from the Blog', 'captivating' ) );
+	
+	if ( 'posts' == get_option( 'show_on_front' ) ) {
+
+		echo '<div class="home-blog widget"><div class="wrap">';
+
+		if ( ! empty( $blog_text ) ) {
+
+			echo '<h4 class="widget-title">' . $blog_text . '</h4>';
+
+		}
+
+	}
+
+}
+
+//* Add closing markup for blog section
+function captivating_front_page_blog_close() {
+
+	if ( 'posts' == get_option( 'show_on_front' ) ) {
+
+		echo '</div></div>';
+
+	}
+
+}
+
+//* Add archive body class to the head
+add_filter( 'body_class', 'captivating_add_archive_body_class' );
+function captivating_add_archive_body_class( $classes ) {
+   	$classes[] = 'captivating-blog';
+   	return $classes;
+}
+			
+//* Remove Featured image (if set in Theme Settings)
+add_filter( 'genesis_pre_get_option_content_archive_thumbnail', 'captivating_no_post_image' );
+function captivating_no_post_image() {
+	return '0';
+}
+
+//* Show Excerpts regardless of Theme Settings
+add_filter( 'genesis_pre_get_option_content_archive', 'captivating_show_excerpts' );
+function captivating_show_excerpts() {
+	return 'excerpts';
+}
+
+//* Modify the length of post excerpts
+add_filter( 'excerpt_length', 'captivating_excerpt_length' );
+function captivating_excerpt_length( $length ) {
+	return 60; // pull first 50 words
+}
+
+//* Modify the Excerpt read more link
+add_filter('excerpt_more', 'captivating_new_excerpt_more');
+function captivating_new_excerpt_more($more) {
+	return '... <br><a class="more-link" href="' . get_permalink() . '">Read More</a>';
+}
+
+//* Make sure content limit (if set in Theme Settings) doesn't apply
+add_filter( 'genesis_pre_get_option_content_archive_limit', 'captivating_no_content_limit' );
+function captivating_no_content_limit() {
+	return '0';
+}
+
+//* Display centered wide featured image for First Post and left aligned thumbnail for the next five
+add_action( 'genesis_entry_header', 'captivating_show_featured_image', 8 );
+function captivating_show_featured_image() {
+	if ( ! has_post_thumbnail() ) {
+		return;
+	}
+
+	global $wp_query;
+
+	if( ( $wp_query->current_post <= 0 ) ) {
+		$image_args = array(
+			'size' => 'horizontal-entry-image',
+			'attr' => array(
+				'class' => 'aligncenter',
+			),
+		);
+	
+	} else {
+		$image_args = array(
+			'size' => 'square-entry-image',
+			'attr' => array(
+				'class' => 'alignleft',
+			),
+		);
+	}
+
+	$image = genesis_get_image( $image_args );
+
+	echo '<div class="home-featured-image"><a href="' . get_permalink() . '">' . $image .'</a></div>';
+	
+	}
+
+//* Remove entry meta
+remove_action( 'genesis_entry_header', 'genesis_post_info', 9 );
+
+//* Run the default Genesis loop
+genesis();

+ 358 - 0
functions.php

@@ -0,0 +1,358 @@
+<?php
+/**
+ * This file adds all the functions to the Captivating theme.
+ *
+ * @package      Captivating
+ * @link         http://restored316designs.com/themes
+ * @author       Lauren Gaige // Restored 316 LLC
+ * @copyright    Copyright (c) 2015, Restored 316 LLC, Released 08/09/2017
+ * @license      GPL-2.0+
+ */
+
+//* Start the engine
+include_once( get_template_directory() . '/lib/init.php' );
+
+//* Setup Theme
+include_once( get_stylesheet_directory() . '/lib/theme-defaults.php' );
+
+//* Add Color selections to WordPress Theme Customizer
+require_once( get_stylesheet_directory() . '/lib/customize.php' );
+
+//* Include Customizer CSS
+include_once( get_stylesheet_directory() . '/lib/output.php' );
+
+//* Add Widget Spaces
+require_once( get_stylesheet_directory() . '/lib/widgets.php' );
+
+//* Install Plugins
+require_once( get_stylesheet_directory() . '/lib/plugins/tgm-plugin-activation/register-plugins.php' );
+
+//* Child theme (do not remove)
+define( 'CHILD_THEME_NAME', 'captivating' );
+define( 'CHILD_THEME_URL', 'http://restored316designs.com' );
+define( 'CHILD_THEME_VERSION', '1.0.0' );
+
+//* Loads Responsive Menu, Google Fonts, Icons, and other scripts
+add_action( 'wp_enqueue_scripts', 'captivating_enqueue_scripts' );
+function captivating_enqueue_scripts() {
+
+	wp_enqueue_style( 'google-font', '//fonts.googleapis.com/css?family=Montserrat:300,300i,400,700,700i|Open+Sans:400,400i,700,700i|Playfair+Display:400,400i,700,700i|Poppins|Satisfy', array() );
+	wp_enqueue_style( 'ionicons', '//code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css', array(), CHILD_THEME_VERSION );
+	wp_enqueue_style( 'dashicons' );
+
+	wp_enqueue_script( 'captivating-global-script', get_bloginfo( 'stylesheet_directory' ) . '/js/global.js', array( 'jquery' ), '1.0.0' );
+	wp_enqueue_script( 'match-height', get_stylesheet_directory_uri() . '/js/jquery.matchHeight-min.js', array( 'jquery' ), '1.0.0', true );
+	wp_enqueue_script( 'match-height-init', get_stylesheet_directory_uri() . '/js/matchheight-init.js', array( 'match-height' ), '1.0.0', true );
+	
+	$suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
+	wp_enqueue_script( 'captivating-responsive-menu', get_stylesheet_directory_uri() . "/js/responsive-menus{$suffix}.js", array( 'jquery' ), CHILD_THEME_VERSION, true );
+	wp_localize_script(
+		'captivating-responsive-menu',
+		'genesis_responsive_menu',
+		captivating_responsive_menu_settings()
+	);
+
+
+}
+
+
+// Define our responsive menu settings.
+function captivating_responsive_menu_settings() {
+
+	$settings = array(
+		'mainMenu'          => __( 'Menu', 'captivating' ),
+		'menuIconClass'     => 'dashicons-before dashicons-menu',
+		'subMenu'           => __( 'Submenu', 'captivating' ),
+		'subMenuIconsClass' => 'dashicons-before dashicons-arrow-down-alt2',
+		'menuClasses'       => array(
+			'combine' => array(
+				'.nav-header',
+				'.nav-header-left',
+				'.nav-header-right',
+				'.nav-secondary',
+				'.nav-primary',
+			),
+			'others'  => array(
+				'.nav-footer',
+			),
+		),
+	);
+
+	return $settings;
+
+}
+
+//* Add support for footer menu & rename menus
+add_theme_support ( 'genesis-menus' , array ( 
+	'primary'      => 'Above Header Menu', 
+	'secondary'    => 'Below Header Menu', 
+	'header-left'  => 'Header Left', 
+	'header-right' => 'Header Right',
+	'footer'       => 'Footer Menu' 
+) );
+
+//* Add HTML5 markup structure
+add_theme_support( 'html5' );
+
+//* Add new featured image sizes
+add_image_size( 'square-entry-image', 400, 400, TRUE );
+add_image_size( 'vertical-entry-image', 400, 600, TRUE );
+add_image_size( 'horizontal-entry-image', 820, 550, TRUE );
+
+//* Add support for 3-column footer widgets
+add_theme_support( 'genesis-footer-widgets', 3 );
+
+//* Add viewport meta tag for mobile browsers
+add_theme_support( 'genesis-responsive-viewport' );
+
+//* Add support for custom background
+add_theme_support( 'custom-background', array(
+	'default-color' => 'FFFFFF',
+));
+
+    
+//* Add support for after entry widget
+add_theme_support( 'genesis-after-entry-widget-area' );
+
+//* Add support for custom header
+add_theme_support( 'custom-header', array(
+	'width'           => 2000,
+	'height'          => 1562,
+	'header-selector' => '.site-title a',
+	'header-text'     => false,
+) );
+
+//* Remove the site description
+remove_action( 'genesis_site_description', 'genesis_seo_site_description' );
+
+//* Unregister layout settings
+genesis_unregister_layout( 'content-sidebar-sidebar' );
+genesis_unregister_layout( 'sidebar-content-sidebar' );
+genesis_unregister_layout( 'sidebar-sidebar-content' );
+
+//* Unregister secondary sidebar
+unregister_sidebar( 'sidebar-alt' );
+
+//* Reposition the primary navigation menu
+remove_action( 'genesis_after_header', 'genesis_do_nav' );
+add_action( 'genesis_before_header', 'genesis_do_nav', 7 );
+
+//* Add search form to navigation
+add_filter( 'wp_nav_menu_items', 'captivating_primary_nav_extras', 10, 2 );
+function captivating_primary_nav_extras( $menu, $args ) {
+	if ( 'primary' !== $args->theme_location ) {
+		return $menu;
+	}
+
+	ob_start();
+	get_search_form();
+	$search = ob_get_clean();
+	$menu .= '<li class="right search">' . $search . '</li>';
+
+	return $menu;
+}
+
+//* Add widget to primary navigation
+add_filter( 'genesis_nav_items', 'captivating_social_icons', 10, 2 );
+add_filter( 'wp_nav_menu_items', 'captivating_social_icons', 10, 2 );
+
+function captivating_social_icons($menu, $args) {
+	$args = (array)$args;
+	if ( 'primary' !== $args['theme_location'] )
+		return $menu;
+	ob_start();
+	genesis_widget_area('nav-social-menu');
+	$social = ob_get_clean();
+	return $menu . $social;
+}
+
+//* Hook menu to left of Logo
+add_action( 'genesis_header', 'captivating_header_left_menu', 6 );
+function captivating_header_left_menu() {
+    genesis_nav_menu( array(
+        'theme_location' => 'header-left',
+        'depth'          => 2,
+    ) );
+}
+
+//* Hook menu to right of Logo
+add_action( 'genesis_header', 'captivating_header_right_menu', 9 );
+function captivating_header_right_menu() {
+    genesis_nav_menu( array(
+        'theme_location' => 'header-right',
+        'depth'          => 2,
+    ) );
+}
+
+//* Hook menu in footer
+add_action( 'genesis_before_footer', 'captivating_footer_menu', 7 );
+function captivating_footer_menu() {
+    genesis_nav_menu( array(
+        'theme_location' => 'footer',
+        'depth'          => 1,
+    ) );
+}
+    
+//* Reposition Featured Images
+remove_action( 'genesis_entry_content', 'genesis_do_post_image', 8 );
+add_action( 'genesis_entry_header', 'genesis_do_post_image', 5 );
+
+//* Reposition Post Info Above Post Title
+remove_action( 'genesis_entry_header', 'genesis_post_info', 12);
+add_action( 'genesis_entry_header', 'genesis_post_info', 9 ); 
+
+//* Reposition Post Meta Below Post Title
+remove_action( 'genesis_entry_footer', 'genesis_post_meta');
+add_action( 'genesis_entry_header', 'genesis_post_meta', 12 ); 
+
+//* Customize the Post Info Function
+add_filter( 'genesis_post_info', 'captivating_post_info_filter' );
+function captivating_post_info_filter( $post_info ) {
+
+	$post_info = '[post_date] &middot; [post_comments before="<i class="icon ion-paintbucket"></i>" zero="Leave a Comment" one="1 Comment" more="% Comments"]';
+    return $post_info;
+
+}
+
+//* Customize the Post Meta function
+add_filter( 'genesis_post_meta', 'captivating_post_meta_filter' );
+function captivating_post_meta_filter( $post_meta ) {
+
+    $post_meta = '[post_categories before="" sep="&middot;"]';
+    return $post_meta;
+
+}
+
+//* Modify the size of the Gravatar in the entry comments
+add_filter( 'genesis_comment_list_args', 'captivating_comments_gravatar' );
+function captivating_comments_gravatar( $args ) {
+
+	$args['avatar_size'] = 96;
+
+	return $args;
+
+}
+
+//* Modify the size of the Gravatar in the author box
+add_filter( 'genesis_author_box_gravatar_size', 'captivating_author_box_gravatar' );
+function captivating_author_box_gravatar( $size ) {
+
+	return 200;
+
+}
+
+//* Customize search form input box text
+add_filter( 'genesis_search_text', 'captivating_search_text' );
+function captivating_search_text( $text ) {
+	return esc_attr( 'Search . . .' );
+}
+
+//* Remove comment form allowed tags
+add_filter( 'comment_form_defaults', 'captivating_remove_comment_form_allowed_tags' );
+function captivating_remove_comment_form_allowed_tags( $defaults ) {
+
+	$defaults['comment_notes_after'] = '';
+	return $defaults;
+
+}
+
+// Customize 'Read More' text with accessibility.
+add_filter( 'excerpt_more', 'captivating_read_more_link' );
+add_filter( 'get_the_content_more_link', 'captivating_read_more_link' );
+add_filter( 'the_content_more_link', 'captivating_read_more_link' );
+function captivating_read_more_link($more) {
+	
+	$new_a11y_read_more_title = sprintf( '<span class="screen-reader-text">%s %s</span>', __( 'about ', 'captivating' ), get_the_title() );
+	return sprintf( ' ... <a href="%s" class="more-link">%s %s</a>', get_permalink(), __( 'Read More', 'captivating' ), $new_a11y_read_more_title );
+
+}
+
+//* Hooks Announcement Widget
+add_action( 'genesis_before', 'captivating_announcement_widget', 8 ); 
+function captivating_announcement_widget() {
+
+    genesis_widget_area( 'announcement-widget', array(
+		'before' => '<div class="announcement-widget widget-area"><div class="wrap">',
+		'after'  => '</div></div>',
+    ) );
+
+}
+
+//* Hooks Widget Area Above Content
+add_action( 'genesis_before_footer', 'captivating_site_wide_cta', 6 ); 
+function captivating_site_wide_cta() {
+
+	if ( !is_home() ){
+
+    genesis_widget_area( 'site-wide-cta', array(
+		'before' => '<div class="site-wide-cta widget-area"><div class="wrap">',
+		'after'  => '</div></div>',
+    ) );
+
+}}
+
+//* Hooks Widget Area Below Footer
+add_action( 'genesis_before_footer', 'captivating_widget_below_footer', 12 ); 
+function captivating_widget_below_footer() {
+
+    genesis_widget_area( 'widget-below-footer', array(
+		'before' => '<div class="widget-below-footer widget-area">',
+		'after'  => '</div>',
+    ) );
+
+}
+
+//* Force 12 posts to appear on all archive pages
+add_action('pre_get_posts', 'captivating_change_posts_per_page', 1);
+function captivating_change_posts_per_page( $query ) {
+    if( ! $query->is_main_query() )
+        return;
+
+    if ( is_archive() ){
+        $query->set( 'posts_per_page', 12); //* This changes the # of posts displayed on the category pages
+    }
+}
+
+//* Load Entry Navigation
+add_action( 'genesis_after_entry', 'genesis_prev_next_post_nav', 9 );
+
+//* Customize the credits
+add_filter('genesis_footer_creds_text', 'captivating_footer_creds_text');
+function captivating_footer_creds_text( $creds ) {
+    $creds = '<div class="creds">Copyright [footer_copyright] &middot; <a target="_blank" href="http://restored316designs.com/themes">captivating theme</a> by <a target="_blank" href="http://www.restored316designs.com">Restored 316</a></div>';
+    return $creds;
+}
+
+//* Add Theme Support for WooCommerce
+add_theme_support( 'genesis-connect-woocommerce' );
+
+//* Remove Related Products
+remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20 );
+
+//* Change number or products per row to 3
+add_filter('loop_shop_columns', 'loop_columns');
+if (!function_exists('loop_columns')) {
+	function loop_columns() {
+		return 3; // 3 products per row
+	}
+}
+
+//* Add WooCommerce Gallery Options
+add_action( 'after_setup_theme', 'captivating_woo_gallery' );
+function captivating_woo_gallery() {
+	//add_theme_support( 'wc-product-gallery-zoom' );
+	add_theme_support( 'wc-product-gallery-lightbox' );
+	add_theme_support( 'wc-product-gallery-slider' );
+}
+
+//* Add WP Recipe Maker Jump to Recipe
+add_action('genesis_entry_content', 'captivating_wprm_buttons', 1);
+function captivating_wprm_buttons() {
+	if ( is_single() && ( shortcode_exists( 'wprm-recipe-jump' ) || shortcode_exists( 'wprm-recipe-print' ) ) ) {
+		echo '<div class="wprm-buttons">';
+		if ( shortcode_exists( 'wprm-recipe-jump' ) ) {
+			echo do_shortcode( '[wprm-recipe-jump]' );
+		}
+		echo '</div>';
+	}
+}

+ 22 - 0
js/global.js

@@ -0,0 +1,22 @@
+jQuery(function( $ ){
+
+	// Sticky Announcement Bar
+	var headerHeight = $('.site-header').innerHeight();
+	var beforeheaderHeight = $('.before-header').outerHeight();
+	var abovenavHeight = headerHeight + beforeheaderHeight - 1;
+
+	$(window).scroll(function(){
+
+		if ($(document).scrollTop() > abovenavHeight){
+
+			$('.announcement-widget').addClass('fixed');
+
+		} else {
+
+			$('.announcement-widget').removeClass('fixed');
+			
+		}
+		
+	});
+
+});

+ 11 - 0
js/jquery.matchHeight-min.js

@@ -0,0 +1,11 @@
+/**
+* jquery.matchHeight-min.js master
+* http://brm.io/jquery-match-height/
+* License: MIT
+*/
+(function(c){var n=-1,f=-1,g=function(a){return parseFloat(a)||0},r=function(a){var b=null,d=[];c(a).each(function(){var a=c(this),k=a.offset().top-g(a.css("margin-top")),l=0<d.length?d[d.length-1]:null;null===l?d.push(a):1>=Math.floor(Math.abs(b-k))?d[d.length-1]=l.add(a):d.push(a);b=k});return d},p=function(a){var b={byRow:!0,property:"height",target:null,remove:!1};if("object"===typeof a)return c.extend(b,a);"boolean"===typeof a?b.byRow=a:"remove"===a&&(b.remove=!0);return b},b=c.fn.matchHeight=
+function(a){a=p(a);if(a.remove){var e=this;this.css(a.property,"");c.each(b._groups,function(a,b){b.elements=b.elements.not(e)});return this}if(1>=this.length&&!a.target)return this;b._groups.push({elements:this,options:a});b._apply(this,a);return this};b._groups=[];b._throttle=80;b._maintainScroll=!1;b._beforeUpdate=null;b._afterUpdate=null;b._apply=function(a,e){var d=p(e),h=c(a),k=[h],l=c(window).scrollTop(),f=c("html").outerHeight(!0),m=h.parents().filter(":hidden");m.each(function(){var a=c(this);
+a.data("style-cache",a.attr("style"))});m.css("display","block");d.byRow&&!d.target&&(h.each(function(){var a=c(this),b=a.css("display");"inline-block"!==b&&"inline-flex"!==b&&(b="block");a.data("style-cache",a.attr("style"));a.css({display:b,"padding-top":"0","padding-bottom":"0","margin-top":"0","margin-bottom":"0","border-top-width":"0","border-bottom-width":"0",height:"100px"})}),k=r(h),h.each(function(){var a=c(this);a.attr("style",a.data("style-cache")||"")}));c.each(k,function(a,b){var e=c(b),
+f=0;if(d.target)f=d.target.outerHeight(!1);else{if(d.byRow&&1>=e.length){e.css(d.property,"");return}e.each(function(){var a=c(this),b=a.css("display");"inline-block"!==b&&"inline-flex"!==b&&(b="block");b={display:b};b[d.property]="";a.css(b);a.outerHeight(!1)>f&&(f=a.outerHeight(!1));a.css("display","")})}e.each(function(){var a=c(this),b=0;d.target&&a.is(d.target)||("border-box"!==a.css("box-sizing")&&(b+=g(a.css("border-top-width"))+g(a.css("border-bottom-width")),b+=g(a.css("padding-top"))+g(a.css("padding-bottom"))),
+a.css(d.property,f-b+"px"))})});m.each(function(){var a=c(this);a.attr("style",a.data("style-cache")||null)});b._maintainScroll&&c(window).scrollTop(l/f*c("html").outerHeight(!0));return this};b._applyDataApi=function(){var a={};c("[data-match-height], [data-mh]").each(function(){var b=c(this),d=b.attr("data-mh")||b.attr("data-match-height");a[d]=d in a?a[d].add(b):b});c.each(a,function(){this.matchHeight(!0)})};var q=function(a){b._beforeUpdate&&b._beforeUpdate(a,b._groups);c.each(b._groups,function(){b._apply(this.elements,
+this.options)});b._afterUpdate&&b._afterUpdate(a,b._groups)};b._update=function(a,e){if(e&&"resize"===e.type){var d=c(window).width();if(d===n)return;n=d}a?-1===f&&(f=setTimeout(function(){q(e);f=-1},b._throttle)):q(e)};c(b._applyDataApi);c(window).bind("load",function(a){b._update(!1,a)});c(window).bind("resize orientationchange",function(a){b._update(!0,a)})})(jQuery);

+ 5 - 0
js/matchheight-init.js

@@ -0,0 +1,5 @@
+jQuery(function( $ ){
+
+	$('.captivating-archives .content .entry, .category-index .featured-content .entry, .home-blog .entry, .above-blog-content .featured-content .entry, .front-page .featured-content .entry').matchHeight();
+
+});

+ 415 - 0
js/responsive-menus.js

@@ -0,0 +1,415 @@
+/**
+ * This script adds the accessibility-ready responsive menus Genesis Framework child themes.
+ *
+ * @author StudioPress
+ * @link https://github.com/copyblogger/responsive-menus
+ * @version 1.1.2
+ * @license GPL-2.0+
+ */
+
+var genesisMenuParams      = typeof genesis_responsive_menu === 'undefined' ? '' : genesis_responsive_menu,
+	genesisMenusUnchecked  = genesisMenuParams.menuClasses,
+	genesisMenus           = {},
+	menusToCombine         = [];
+
+( function ( document, $, undefined ) {
+
+	'use strict';
+
+	// Make our menus unique if there's more than one instance on the page.
+	/**
+	 * Validate the menus passed by the theme with what's being loaded on the page,
+	 * and pass the new and accurate information to our new data.
+	 * @param {genesisMenusUnchecked} Raw data from the localized script in the theme.
+	 * @return {array} genesisMenus array gets populated with updated data.
+	 * @return {array} menusToCombine array gets populated with relevant data.
+	 */
+	$.each( genesisMenusUnchecked, function( group ) {
+
+		// Mirror our group object to populate.
+		genesisMenus[group] = [];
+
+		// Loop through each instance of the specified menu on the page.
+		$.each( this, function( key, value ) {
+
+			var menuString = value,
+				$menu      = $(value);
+
+			// If there is more than one instance, append the index and update array.
+			if ( $menu.length > 1 ) {
+
+				$.each( $menu, function( key, value ) {
+
+					var newString = menuString + '-' + key;
+
+					$(this).addClass( newString.replace('.','') );
+
+					genesisMenus[group].push( newString );
+
+					if ( 'combine' === group ) {
+						menusToCombine.push( newString );
+					}
+
+				});
+
+			} else if ( $menu.length == 1 ) {
+
+				genesisMenus[group].push( menuString );
+
+				if ( 'combine' === group ) {
+					menusToCombine.push( menuString );
+				}
+
+			}
+
+		});
+
+	});
+
+	// Make sure there is something to use for the 'others' array.
+	if ( typeof genesisMenus.others == 'undefined' ) {
+		genesisMenus.others = [];
+	}
+
+	// If there's only one menu on the page for combining, push it to the 'others' array and nullify our 'combine' variable.
+	if ( menusToCombine.length == 1 ) {
+		genesisMenus.others.push( menusToCombine[0] );
+		genesisMenus.combine = null;
+		menusToCombine = null;
+	}
+
+	var genesisMenu         = {},
+		mainMenuButtonClass = 'menu-toggle',
+		subMenuButtonClass  = 'sub-menu-toggle',
+		responsiveMenuClass = 'genesis-responsive-menu';
+
+	// Initialize.
+	genesisMenu.init = function() {
+
+		// Exit early if there are no menus to do anything.
+		if ( $( _getAllMenusArray() ).length == 0 ) {
+			return;
+		}
+
+		var menuIconClass     = typeof genesisMenuParams.menuIconClass !== 'undefined' ? genesisMenuParams.menuIconClass : 'dashicons-before dashicons-menu',
+			subMenuIconClass  = typeof genesisMenuParams.subMenuIconClass !== 'undefined' ? genesisMenuParams.subMenuIconClass : 'dashicons-before dashicons-arrow-down-alt2',
+			toggleButtons     = {
+				menu : $( '<button />', {
+					'class' : mainMenuButtonClass,
+					'aria-expanded' : false,
+					'aria-pressed' : false,
+					'role' : 'button'
+					} )
+					.append( genesisMenuParams.mainMenu ),
+				submenu : $( '<button />', {
+					'class' : subMenuButtonClass,
+					'aria-expanded' : false,
+					'aria-pressed' : false,
+					'role' : 'button'
+					} )
+					.append( $( '<span />', {
+						'class' : 'screen-reader-text',
+						'text' : genesisMenuParams.subMenu
+					} ) )
+			};
+
+		// Add the responsive menu class to the active menus.
+		_addResponsiveMenuClass();
+
+		// Add the main nav button to the primary menu, or exit the plugin.
+		_addMenuButtons( toggleButtons );
+		
+		// Setup additional classes.
+		$( '.' + mainMenuButtonClass ).addClass( menuIconClass );
+		$( '.' + subMenuButtonClass ).addClass( subMenuIconClass );
+		$( '.' + mainMenuButtonClass ).on( 'click.genesisMenu-mainbutton', _mainmenuToggle ).each( _addClassID );
+		$( '.' + subMenuButtonClass ).on( 'click.genesisMenu-subbutton', _submenuToggle );
+		$( window ).on( 'resize.genesisMenu', _doResize ).triggerHandler( 'resize.genesisMenu' );
+	};
+
+	/**
+	 * Add menu toggle button to appropriate menus.
+	 * @param {toggleButtons} Object of menu buttons to use for toggles.
+	 */
+	function _addMenuButtons( toggleButtons ) {
+
+		// Apply sub menu toggle to each sub-menu found in the menuList.
+		$( _getMenuSelectorString( genesisMenus ) ).find( '.sub-menu' ).before( toggleButtons.submenu );
+
+		
+		if ( menusToCombine !== null ) {
+
+			var menusToToggle = genesisMenus.others.concat( menusToCombine[0] );
+		 	
+		 	// Only add menu button the primary menu and navs NOT in the combine variable.
+		 	$( _getMenuSelectorString( menusToToggle ) ).before( toggleButtons.menu );
+
+		} else {
+
+			// Apply the main menu toggle to all menus in the list.
+			$( _getMenuSelectorString( genesisMenus.others ) ).before( toggleButtons.menu );
+
+		}
+
+	}
+
+	/**
+	 * Add the responsive menu class.
+	 */
+	function _addResponsiveMenuClass() {
+		$( _getMenuSelectorString( genesisMenus ) ).addClass( responsiveMenuClass );
+	}
+
+	/**
+	 * Execute our responsive menu functions on window resizing.
+	 */
+	function _doResize() {
+		var buttons   = $( 'button[id^="genesis-mobile-"]' ).attr( 'id' );
+		if ( typeof buttons === 'undefined' ) {
+			return;
+		}
+		_maybeClose( buttons );
+		_superfishToggle( buttons );
+		_changeSkipLink( buttons );
+		_combineMenus( buttons );
+	}
+
+	/**
+	 * Add the nav- class of the related navigation menu as
+	 * an ID to associated button (helps target specific buttons outside of context).
+	 */
+	function _addClassID() {
+		var $this = $( this ),
+			nav   = $this.next( 'nav' ),
+			id    = 'class';
+
+		$this.attr( 'id', 'genesis-mobile-' + $( nav ).attr( id ).match( /nav-\w*\b/ ) );
+	}
+	
+	/**
+	 * Combine our menus if the mobile menu is visible.
+	 * @params buttons
+	 */
+	function _combineMenus( buttons ){
+		
+		// Exit early if there are no menus to combine.
+		if ( menusToCombine == null ) {
+			return;
+		}
+
+		// Split up the menus to combine based on order of appearance in the array.
+		var primaryMenu   = menusToCombine[0],
+			combinedMenus = $( menusToCombine ).filter( function(index) { if ( index > 0 ) { return index; } });
+		
+		// If the responsive menu is active, append items in 'combinedMenus' object to the 'primaryMenu' object.
+		if ( 'none' !== _getDisplayValue( buttons ) ) {
+
+			$.each( combinedMenus, function( key, value ) {
+				$(value).find( '.menu > li' ).addClass( 'moved-item-' + value.replace( '.','' ) ).appendTo( primaryMenu + ' ul.genesis-nav-menu' );
+			});
+			$( _getMenuSelectorString( combinedMenus ) ).hide();
+
+		} else {
+
+			$( _getMenuSelectorString( combinedMenus ) ).show();
+			$.each( combinedMenus, function( key, value ) {
+				$( '.moved-item-' + value.replace( '.','' ) ).appendTo( value + ' ul.genesis-nav-menu' ).removeClass( 'moved-item-' + value.replace( '.','' ) );
+			});
+			
+		}
+
+	}
+
+	/**
+	 * Action to happen when the main menu button is clicked.
+	 */
+	function _mainmenuToggle() {
+		var $this = $( this );
+		_toggleAria( $this, 'aria-pressed' );
+		_toggleAria( $this, 'aria-expanded' );
+		$this.toggleClass( 'activated' );
+		$this.next( 'nav' ).slideToggle( 'fast' );
+	}
+
+	/**
+	 * Action for submenu toggles.
+	 */
+	function _submenuToggle() {
+
+		var $this  = $( this ),
+			others = $this.closest( '.menu-item' ).siblings();
+		_toggleAria( $this, 'aria-pressed' );
+		_toggleAria( $this, 'aria-expanded' );
+		$this.toggleClass( 'activated' );
+		$this.next( '.sub-menu' ).slideToggle( 'fast' );
+
+		others.find( '.' + subMenuButtonClass ).removeClass( 'activated' ).attr( 'aria-pressed', 'false' );
+		others.find( '.sub-menu' ).slideUp( 'fast' );
+
+	}
+
+	/**
+	 * Activate/deactivate superfish.
+	 * @params buttons
+	 */
+	function _superfishToggle( buttons ) {
+		var _superfish = $( '.' + responsiveMenuClass + ' .js-superfish' ),
+			$args      = 'destroy';
+		if ( typeof _superfish.superfish !== 'function' ) {
+			return;
+		}
+		if ( 'none' === _getDisplayValue( buttons ) ) {
+			$args = {
+				'delay': 100,
+				'animation': {'opacity': 'show', 'height': 'show'},
+				'dropShadows': false,
+				'speed': 'fast'
+			};
+		}
+		_superfish.superfish( $args );
+	}
+
+	/**
+	 * Modify skip link to match mobile buttons.
+	 * @param buttons
+	 */
+	function _changeSkipLink( buttons ) {
+
+		// Start with an empty array.
+		var menuToggleList = _getAllMenusArray();
+
+		// Exit out if there are no menu items to update.
+		if ( ! $( menuToggleList ).length > 0 ) {
+			return;
+		}
+
+		$.each( menuToggleList, function ( key, value ) {
+			
+			var newValue  = value.replace( '.', '' ),
+				startLink = 'genesis-' + newValue,
+				endLink   = 'genesis-mobile-' + newValue;
+
+			if ( 'none' == _getDisplayValue( buttons ) ) {
+				startLink = 'genesis-mobile-' + newValue;
+				endLink   = 'genesis-' + newValue;
+			}
+
+			var $item = $( '.genesis-skip-link a[href="#' + startLink + '"]' );
+
+			if ( menusToCombine !== null && value !== menusToCombine[0] ) {
+				$item.toggleClass( 'skip-link-hidden' );
+			}
+
+			if ( $item.length > 0 ) {
+				var link  = $item.attr( 'href' );
+					link  = link.replace( startLink, endLink );
+
+				$item.attr( 'href', link );
+			} else {
+				return;
+			}
+
+		});
+
+	}
+
+	/**
+	 * Close all the menu toggles if buttons are hidden.
+	 * @param buttons
+	 */
+	function _maybeClose( buttons ) {
+		if ( 'none' !== _getDisplayValue( buttons ) ) {
+			return true;
+		}
+
+		$( '.' + mainMenuButtonClass + ', .' + responsiveMenuClass + ' .sub-menu-toggle' )
+			.removeClass( 'activated' )
+			.attr( 'aria-expanded', false )
+			.attr( 'aria-pressed', false );
+		
+		$( '.' + responsiveMenuClass + ', ' + responsiveMenuClass + ' .sub-menu' )
+			.attr( 'style', '' );
+	}
+
+	/**
+	 * Generic function to get the display value of an element.
+	 * @param  {id} $id ID to check
+	 * @return {string}     CSS value of display property
+	 */
+	function _getDisplayValue( $id ) {
+		var element = document.getElementById( $id ),
+			style   = window.getComputedStyle( element );
+		return style.getPropertyValue( 'display' );
+	}
+
+	/**
+	 * Toggle aria attributes.
+	 * @param  {button} $this     passed through
+	 * @param  {aria-xx} attribute aria attribute to toggle
+	 * @return {bool}           from _ariaReturn
+	 */
+	function _toggleAria( $this, attribute ) {
+		$this.attr( attribute, function( index, value ) {
+			return 'false' === value;
+		});
+	}
+
+	/**
+	 * Helper function to return a comma separated string of menu selectors.
+	 * @param {itemArray} Array of menu items to loop through.
+	 * @param {ignoreSecondary} boolean of whether to ignore the 'secondary' menu item.
+	 * @return {string} Comma-separated string.
+	 */
+	function _getMenuSelectorString( itemArray ) {
+
+		var itemString = $.map( itemArray, function( value, key ) {
+			return value;
+		});
+
+		return itemString.join( ',' );
+
+	}
+
+	/**
+	 * Helper function to return a group array of all the menus in
+	 * both the 'others' and 'combine' arrays.
+	 * @return {array} Array of all menu items as class selectors.
+	 */
+	function _getAllMenusArray() {
+
+		// Start with an empty array.
+		var menuList = [];
+
+		// If there are menus in the 'menusToCombine' array, add them to 'menuList'.
+		if ( menusToCombine !== null ) {
+
+			$.each( menusToCombine, function( key, value ) {
+				menuList.push( value.valueOf() );
+			});
+
+		}
+
+		// Add menus in the 'others' array to 'menuList'.
+		$.each( genesisMenus.others, function( key, value ) {
+			menuList.push( value.valueOf() );
+		});
+
+		if ( menuList.length > 0 ) {
+			return menuList;
+		} else {
+			return null;
+		}
+
+	}
+
+	$(document).ready(function () {
+
+		if ( _getAllMenusArray() !== null ) {
+
+			genesisMenu.init();
+		
+		}
+
+	});
+
+})( document, jQuery );

+ 17 - 0
js/responsive-menus.min.js

@@ -0,0 +1,17 @@
+/**
+ * This script adds the accessibility-ready responsive menus Genesis Framework child themes.
+ *
+ * @author StudioPress
+ * @link https://github.com/copyblogger/responsive-menus
+ * @version 1.1.2
+ * @license GPL-2.0+
+ */
+var genesisMenuParams="undefined"===typeof genesis_responsive_menu?"":genesis_responsive_menu,genesisMenusUnchecked=genesisMenuParams.menuClasses,genesisMenus={},menusToCombine=[];
+(function(m,b,w){function n(){var a=b('button[id^="genesis-mobile-"]').attr("id");if("undefined"!==typeof a){"none"===k(a)&&(b(".menu-toggle, .genesis-responsive-menu .sub-menu-toggle").removeClass("activated").attr("aria-expanded",!1).attr("aria-pressed",!1),b(".genesis-responsive-menu, genesis-responsive-menu .sub-menu").attr("style",""));var d=b(".genesis-responsive-menu .js-superfish"),c="destroy";"function"===typeof d.superfish&&("none"===k(a)&&(c={delay:100,animation:{opacity:"show",height:"show"},
+dropShadows:!1,speed:"fast"}),d.superfish(c));p(a);q(a)}}function r(){var a=b(this),d=a.next("nav");a.attr("id","genesis-mobile-"+b(d).attr("class").match(/nav-\w*\b/))}function q(a){if(null!=menusToCombine){var d=menusToCombine[0],c=b(menusToCombine).filter(function(a){if(0<a)return a});"none"!==k(a)?(b.each(c,function(a,c){b(c).find(".menu > li").addClass("moved-item-"+c.replace(".","")).appendTo(d+" ul.genesis-nav-menu")}),b(g(c)).hide()):(b(g(c)).show(),b.each(c,function(a,c){b(".moved-item-"+
+c.replace(".","")).appendTo(c+" ul.genesis-nav-menu").removeClass("moved-item-"+c.replace(".",""))}))}}function t(){var a=b(this);h(a,"aria-pressed");h(a,"aria-expanded");a.toggleClass("activated");a.next("nav").slideToggle("fast")}function u(){var a=b(this),d=a.closest(".menu-item").siblings();h(a,"aria-pressed");h(a,"aria-expanded");a.toggleClass("activated");a.next(".sub-menu").slideToggle("fast");d.find(".sub-menu-toggle").removeClass("activated").attr("aria-pressed","false");d.find(".sub-menu").slideUp("fast")}
+function p(a){var d=l();0< !b(d).length||b.each(d,function(c,d){var e=d.replace(".",""),f="genesis-"+e,g="genesis-mobile-"+e;"none"==k(a)&&(f="genesis-mobile-"+e,g="genesis-"+e);e=b('.genesis-skip-link a[href="#'+f+'"]');null!==menusToCombine&&d!==menusToCombine[0]&&e.toggleClass("skip-link-hidden");if(0<e.length){var h=e.attr("href"),h=h.replace(f,g);e.attr("href",h)}})}function k(a){a=m.getElementById(a);return window.getComputedStyle(a).getPropertyValue("display")}function h(a,b){a.attr(b,function(a,
+b){return"false"===b})}function g(a){return b.map(a,function(a,b){return a}).join(",")}function l(){var a=[];null!==menusToCombine&&b.each(menusToCombine,function(b,c){a.push(c.valueOf())});b.each(genesisMenus.others,function(b,c){a.push(c.valueOf())});return 0<a.length?a:null}b.each(genesisMenusUnchecked,function(a){genesisMenus[a]=[];b.each(this,function(d,c){var f=b(c);1<f.length?b.each(f,function(d,f){var e=c+"-"+d;b(this).addClass(e.replace(".",""));genesisMenus[a].push(e);"combine"===a&&menusToCombine.push(e)}):
+1==f.length&&(genesisMenus[a].push(c),"combine"===a&&menusToCombine.push(c))})});"undefined"==typeof genesisMenus.others&&(genesisMenus.others=[]);1==menusToCombine.length&&(genesisMenus.others.push(menusToCombine[0]),menusToCombine=genesisMenus.combine=null);var v={init:function(){if(0!=b(l()).length){var a="undefined"!==typeof genesisMenuParams.menuIconClass?genesisMenuParams.menuIconClass:"dashicons-before dashicons-menu",d="undefined"!==typeof genesisMenuParams.subMenuIconClass?genesisMenuParams.subMenuIconClass:
+"dashicons-before dashicons-arrow-down-alt2",c=b("<button />",{"class":"menu-toggle","aria-expanded":!1,"aria-pressed":!1,role:"button"}).append(genesisMenuParams.mainMenu),f=b("<button />",{"class":"sub-menu-toggle","aria-expanded":!1,"aria-pressed":!1,role:"button"}).append(b("<span />",{"class":"screen-reader-text",text:genesisMenuParams.subMenu}));b(g(genesisMenus)).addClass("genesis-responsive-menu");b(g(genesisMenus)).find(".sub-menu").before(f);null!==menusToCombine?(f=genesisMenus.others.concat(menusToCombine[0]),
+b(g(f)).before(c)):b(g(genesisMenus.others)).before(c);b(".menu-toggle").addClass(a);b(".sub-menu-toggle").addClass(d);b(".menu-toggle").on("click.genesisMenu-mainbutton",t).each(r);b(".sub-menu-toggle").on("click.genesisMenu-subbutton",u);b(window).on("resize.genesisMenu",n).triggerHandler("resize.genesisMenu")}}};b(m).ready(function(){null!==l()&&v.init()})})(document,jQuery);

+ 39 - 0
js/slick-init.js

@@ -0,0 +1,39 @@
+jQuery(function( $ ){
+
+	$('.home-carousel').slick({
+		arrows: true,
+		autoplay: true,
+		autoplaySpeed: 5000, // time for which each set of images remains in view. Default: 3000.
+		speed: 1000, // speed at which next set of images comes into view. Default: 300.
+		slidesToShow: 3,
+		slidesToScroll: 1,
+		nextArrow: '<i class="fa fa-chevron-right slick-arrow-next" aria-hidden="true"></i>',
+		prevArrow: '<i class="fa fa-chevron-left slick-arrow-prev" aria-hidden="true"></i>',
+		responsive: [
+			{
+				breakpoint: 1025,
+				settings: {
+					slidesToShow: 2,
+					slidesToScroll: 2
+				}
+			},
+			{
+				breakpoint: 769,
+				settings: {
+					slidesToShow: 1,
+					slidesToScroll: 1,
+				}
+			},
+			{
+				breakpoint: 471,
+				settings: {
+					arrows: false,
+					slidesToShow: 1,
+					slidesToScroll: 1,
+					autoplay: true
+				}
+			}
+		  ]
+	});
+
+});

File diff suppressed because it is too large
+ 16 - 0
js/slick.min.js


+ 771 - 0
lib/customize.php

@@ -0,0 +1,771 @@
+<?php
+
+/**
+ * This file adds the Customizer to the Captivating Theme.
+ *
+ * @package      Captivating
+ * @subpackage   Customizations
+ * @link         http://restored316designs.com/themes
+ * @author       Lauren Gaige // Restored 316 LLC
+ * @copyright    Copyright (c) 2015, Restored 316 LLC, Released 08/09/2017
+ * @license      GPL-2.0+
+ */
+ 
+//* Get default primary colors for Customizer.
+function captivating_customizer_get_default_text_color() {
+	return '#333333';
+}
+
+function captivating_customizer_get_default_links_color() {
+	return '#55c7cf';
+}
+
+function captivating_customizer_get_default_linkshover_color() {
+	return '#333333';
+}
+
+function captivating_customizer_get_default_button_color() {
+	return '#ffffff';
+}
+
+function captivating_customizer_get_default_buttonborder_color() {
+	return '#333333';
+}
+
+function captivating_customizer_get_default_buttontext_color() {
+	return '#333333';
+}
+
+function captivating_customizer_get_default_buttonhover_color() {
+	return '#55c7cf';
+}
+
+function captivating_customizer_get_default_buttonhoverborder_color() {
+	return '#55c7cf';
+}
+
+function captivating_customizer_get_default_buttonhovertext_color() {
+	return '#ffffff';
+}
+
+function captivating_customizer_get_default_announcement_color() {
+	return '#f7f9fc';
+}
+
+function captivating_customizer_get_default_announcementtext_color() {
+	return '#333333';
+}
+
+function captivating_customizer_get_default_featured_color() {
+	return '#f7f9fc';
+}
+
+function captivating_customizer_get_default_newsletter_color() {
+	return '#f7f9fc';
+}
+
+function captivating_customizer_get_default_newslettertext_color() {
+	return '#333333';
+}
+
+function captivating_customizer_get_default_cta_color() {
+	return '#f7f9fc';
+}
+
+function captivating_customizer_get_default_ctatext_color() {
+	return '#333333';
+}
+
+function captivating_customizer_get_default_footer_color() {
+	return '#f7f9fc';
+}
+
+function captivating_customizer_get_default_footertext_color() {
+	return '#333333';
+}
+
+function captivating_customizer_get_default_readmorelink_color() {
+	return '#55c7cf';
+}
+
+function captivating_customizer_get_default_widgettitle1_color() {
+	return '#fff7e1';
+}
+
+function captivating_customizer_get_default_widgettitle2_color() {
+	return '#fff4f0';
+}
+
+function captivating_customizer_get_default_widgettitle3_color() {
+	return '#f7f9fc';
+}
+
+function captivating_customizer_get_default_sidebarwidgettitle1_color() {
+	return '#fff7e1';
+}
+
+function captivating_customizer_get_default_sidebarwidgettitle2_color() {
+	return '#fff4f0';
+}
+
+function captivating_customizer_get_default_sidebarwidgettitle3_color() {
+	return '#f7f9fc';
+}
+
+function captivating_customizer_get_default_morecategory1_color() {
+	return '#ffc933';
+}
+
+function captivating_customizer_get_default_morecategory2_color() {
+	return '#f6748e';
+}
+
+function captivating_customizer_get_default_morecategory3_color() {
+	return '#55c7cf';
+}
+
+//* Register settings and controls with the Customizer.
+add_action( 'customize_register', 'captivating_customizer_register' );
+function captivating_customizer_register() {
+
+	global $wp_customize;
+
+	
+	$wp_customize->add_setting(
+		'captivating_text_color',
+		array(
+			'default'           => captivating_customizer_get_default_text_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+
+	$wp_customize->add_setting(
+		'captivating_links_color',
+		array(
+			'default'           => captivating_customizer_get_default_links_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_linkshover_color',
+		array(
+			'default'           => captivating_customizer_get_default_linkshover_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_button_color',
+		array(
+			'default'           => captivating_customizer_get_default_button_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_buttonborder_color',
+		array(
+			'default'           => captivating_customizer_get_default_buttonborder_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_buttontext_color',
+		array(
+			'default'           => captivating_customizer_get_default_buttontext_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_buttonhover_color',
+		array(
+			'default'           => captivating_customizer_get_default_buttonhover_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_buttonhoverborder_color',
+		array(
+			'default'           => captivating_customizer_get_default_buttonhoverborder_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_buttonhovertext_color',
+		array(
+			'default'           => captivating_customizer_get_default_buttonhovertext_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_announcement_color',
+		array(
+			'default'           => captivating_customizer_get_default_announcement_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_announcementtext_color',
+		array(
+			'default'           => captivating_customizer_get_default_announcementtext_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_featured_color',
+		array(
+			'default'           => captivating_customizer_get_default_featured_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_newsletter_color',
+		array(
+			'default'           => captivating_customizer_get_default_newsletter_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_newslettertext_color',
+		array(
+			'default'           => captivating_customizer_get_default_newslettertext_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_cta_color',
+		array(
+			'default'           => captivating_customizer_get_default_cta_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_ctatext_color',
+		array(
+			'default'           => captivating_customizer_get_default_ctatext_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_footer_color',
+		array(
+			'default'           => captivating_customizer_get_default_footer_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_footertext_color',
+		array(
+			'default'           => captivating_customizer_get_default_footertext_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_readmorelink_color',
+		array(
+			'default'           => captivating_customizer_get_default_readmorelink_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_widgettitle1_color',
+		array(
+			'default'           => captivating_customizer_get_default_widgettitle1_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_widgettitle2_color',
+		array(
+			'default'           => captivating_customizer_get_default_widgettitle2_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_widgettitle3_color',
+		array(
+			'default'           => captivating_customizer_get_default_widgettitle3_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_sidebarwidgettitle1_color',
+		array(
+			'default'           => captivating_customizer_get_default_sidebarwidgettitle1_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_sidebarwidgettitle2_color',
+		array(
+			'default'           => captivating_customizer_get_default_sidebarwidgettitle2_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_sidebarwidgettitle3_color',
+		array(
+			'default'           => captivating_customizer_get_default_sidebarwidgettitle3_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_morecategory1_color',
+		array(
+			'default'           => captivating_customizer_get_default_morecategory1_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_morecategory2_color',
+		array(
+			'default'           => captivating_customizer_get_default_morecategory2_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+	$wp_customize->add_setting(
+		'captivating_morecategory3_color',
+		array(
+			'default'           => captivating_customizer_get_default_morecategory3_color(),
+			'sanitize_callback' => 'sanitize_hex_color',
+		)
+	);
+	
+//* Add Labels to add headings.
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_text_color',
+			array(
+				'description' => __( 'Change the default color for all the body text across the site.', 'captivating' ),
+			    'label'       => __( 'Main Text Color', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_text_color',
+			)
+		)
+	);
+
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_links_color',
+			array(
+				'description' => __( 'Change the default color for all your links across the site', 'captivating' ),
+			    'label'       => __( 'Link Color', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_links_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_linkshover_color',
+			array(
+				'description' => __( 'Change the default color for all your links when hovered on across the site', 'captivating' ),
+			    'label'       => __( 'Link Color ON HOVER', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_linkshover_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_button_color',
+			array(
+				'description' => __( 'Change the default background color for all the buttons.', 'captivating' ),
+			    'label'       => __( 'Button Background Color', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_button_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_buttonborder_color',
+			array(
+				'description' => __( 'Change the default color for the border on all the buttons.', 'captivating' ),
+			    'label'       => __( 'Button Border Color', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_buttonborder_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_buttontext_color',
+			array(
+				'description' => __( 'Change the default color for the text on the buttons.', 'captivating' ),
+			    'label'       => __( 'Button Text Color', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_buttontext_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_buttonhover_color',
+			array(
+				'description' => __( 'Change the default background color for all the buttons when hovered.', 'captivating' ),
+			    'label'       => __( 'Button Background Color ON HOVER', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_buttonhover_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_buttonhoverborder_color',
+			array(
+				'description' => __( 'Change the default color for the border on all the buttons when hovered.', 'captivating' ),
+			    'label'       => __( 'Button Hover Border Color ON HOVER', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_buttonhoverborder_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_buttonhovertext_color',
+			array(
+				'description' => __( 'Change the default color for the text on the buttons when hovered.', 'captivating' ),
+			    'label'       => __( 'Button Hover Text Color ON HOVER', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_buttonhovertext_color',
+			)
+		)
+	);
+	
+		$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_announcement_color',
+			array(
+				'description' => __( 'Change the default background color on the top announcement bar.', 'captivating' ),
+			    'label'       => __( 'Announcement Background Color', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_announcement_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_announcementtext_color',
+			array(
+				'description' => __( 'Change the default text color on the top announcement bar.', 'captivating' ),
+			    'label'       => __( 'Announcement Text Color', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_announcementtext_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_featured_color',
+			array(
+				'description' => __( 'Change the default background color on the featured content section at the top of the home page and top of the custom blog template.', 'captivating' ),
+			    'label'       => __( 'Featured Content Background', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_featured_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_newsletter_color',
+			array(
+				'description' => __( 'Change the default background color of the subscription box on the sidebar, the convert kit newsletter, as well as the background on the categories in the category index.', 'captivating' ),
+			    'label'       => __( 'Newsletter Background', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_newsletter_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_newslettertext_color',
+			array(
+				'description' => __( 'Change the default text color of the subscription box on the sidebar, the convert kit newsletter, as well as the background on the categories in the category index.', 'captivating' ),
+			    'label'       => __( 'Newsletter Text', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_newslettertext_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_cta_color',
+			array(
+				'description' => __( 'Change the default background color of the Site Wide CTA.', 'captivating' ),
+			    'label'       => __( 'CTA Background', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_cta_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_ctatext_color',
+			array(
+				'description' => __( 'Change the default text color of the Site Wide CTA.', 'captivating' ),
+			    'label'       => __( 'CTA Text', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_ctatext_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_footer_color',
+			array(
+				'description' => __( 'Change the default background color of the footer credits. This also controls the color of your drop down menus.', 'captivating' ),
+			    'label'       => __( 'Footer Background Color', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_footer_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_footertext_color',
+			array(
+				'description' => __( 'Change the default text color of the footer credits.', 'captivating' ),
+			    'label'       => __( 'Footer Text Color', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_footertext_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_readmorelink_color',
+			array(
+				'description' => __( 'Change the default color of the read more links.', 'captivating' ),
+			    'label'       => __( 'Read More Link', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_readmorelink_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_widgettitle1_color',
+			array(
+				'description' => __( 'Change the default border color for the widget titles.', 'captivating' ),
+			    'label'       => __( 'Widget Title Border 1', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_widgettitle1_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_widgettitle2_color',
+			array(
+				'description' => __( 'Change the default border color for the widget titles.', 'captivating' ),
+			    'label'       => __( 'Widget Title Border 2', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_widgettitle2_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_widgettitle3_color',
+			array(
+				'description' => __( 'Change the default border color for the widget titles.', 'captivating' ),
+			    'label'       => __( 'Widget Title Border 3', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_widgettitle3_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_sidebarwidgettitle1_color',
+			array(
+				'description' => __( 'Change the default border color for the widget titles on the primary sidebar.', 'captivating' ),
+			    'label'       => __( 'Sidebar Widget Title Border 1', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_sidebarwidgettitle1_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_sidebarwidgettitle2_color',
+			array(
+				'description' => __( 'Change the default border color for the widget titles on the primary sidebar.', 'captivating' ),
+			    'label'       => __( 'Sidebar Widget Title Border 2', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_sidebarwidgettitle2_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_sidebarwidgettitle3_color',
+			array(
+				'description' => __( 'Change the default border color for the widget titles on the primary sidebar.', 'captivating' ),
+			    'label'       => __( 'Sidebar Widget Title Border 3', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_sidebarwidgettitle3_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_morecategory1_color',
+			array(
+				'description' => __( 'Change the default link color of the more from category link.', 'captivating' ),
+			    'label'       => __( 'More from Category Link 1', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_morecategory1_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_morecategory2_color',
+			array(
+				'description' => __( 'Change the default link color of the more from category link.', 'captivating' ),
+			    'label'       => __( 'More from Category Link 2', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_morecategory2_color',
+			)
+		)
+	);
+	
+	$wp_customize->add_control(
+		new WP_Customize_Color_Control(
+			$wp_customize,
+			'captivating_morecategory3_color',
+			array(
+				'description' => __( 'Change the default link color of the more from category link.', 'captivating' ),
+			    'label'       => __( 'More from Category Link 3', 'captivating' ),
+			    'section'     => 'colors',
+			    'settings'    => 'captivating_morecategory3_color',
+			)
+		)
+	);
+	
+	
+
+    //* Add front page setting to the Customizer
+    $wp_customize->add_section( 'captivating_blog_section', array(
+        'title'    => __( 'Front Page Content Settings', 'captivating' ),
+        'description' => __( 'Choose if you would like to display the content section below widget sections on the front page.', 'captivating' ),
+        'priority' => 75.01,
+    ));
+
+    //* Add front page setting to the Customizer
+    $wp_customize->add_setting( 'captivating_blog_setting', array(
+        'default'           => 'true',
+        'capability'        => 'edit_theme_options',
+        'type'              => 'option',
+    ));
+
+    $wp_customize->add_control( new WP_Customize_Control( 
+        $wp_customize, 'captivating_blog_control', array(
+			'label'       => __( 'Front Page Content Section Display', 'captivating' ),
+			'description' => __( 'Show or Hide the content section. The section will display on the front page by default.', 'captivating' ),
+			'section'     => 'captivating_blog_section',
+			'settings'    => 'captivating_blog_setting',
+			'type'        => 'select',
+			'choices'     => array(                    
+				'false'   => __( 'Hide content section', 'captivating' ),
+				'true'    => __( 'Show content section', 'captivating' ),
+			),
+        ))
+	);
+	
+    $wp_customize->add_setting( 'captivating_blog_text', array(
+		'default'           => __( 'Latest from the Blog', 'captivating' ),
+		'capability'        => 'edit_theme_options',
+		'sanitize_callback' => 'wp_kses_post',
+		'type'              => 'option',
+    ));
+
+    $wp_customize->add_control( new WP_Customize_Control( 
+        $wp_customize, 'captivating_blog_text_control', array(
+			'label'      => __( 'Blog Section Heading Text', 'captivating' ),
+			'description' => __( 'Choose the heading text you would like to display above posts on the front page.<br /><br />This text will show when displaying posts and using widgets on the front page.', 'captivating' ),
+			'section'    => 'captivating_blog_section',
+			'settings'   => 'captivating_blog_text',
+			'type'       => 'text',
+		))
+	);
+
+}

+ 451 - 0
lib/output.php

@@ -0,0 +1,451 @@
+<?php
+
+/**
+ * This file adds the required CSS for the Customizer to the Captivating Theme.
+ *
+ * @package      Captivating
+ * @subpackage   Customizations
+ * @link         http://restored316designs.com/themes
+ * @author       Lauren Gaige // Restored 316 LLC
+ * @copyright    Copyright (c) 2015, Restored 316 LLC, Released 08/09/2017
+ * @license      GPL-2.0+
+ */
+
+add_action( 'wp_enqueue_scripts', 'captivating_css' );
+/**
+* Checks the settings for the link color color, primary color, and header
+* If any of these value are set the appropriate CSS is output
+*
+* @since 1.0.0
+*/
+function captivating_css() {
+
+	$handle  = defined( 'CHILD_THEME_NAME' ) && CHILD_THEME_NAME ? sanitize_title_with_dashes( CHILD_THEME_NAME ) : 'child-theme';
+
+	$color_text = get_theme_mod( 'captivating_text_color', captivating_customizer_get_default_text_color() );
+	$color_links = get_theme_mod( 'captivating_links_color', captivating_customizer_get_default_links_color() );
+	$color_linkshover = get_theme_mod( 'captivating_linkshover_color', captivating_customizer_get_default_linkshover_color() );
+	$color_button = get_theme_mod( 'captivating_button_color', captivating_customizer_get_default_button_color() );
+	$color_buttonborder = get_theme_mod( 'captivating_buttonborder_color', captivating_customizer_get_default_buttonborder_color() );
+	$color_buttontext = get_theme_mod( 'captivating_buttontext_color', captivating_customizer_get_default_buttontext_color() );
+	$color_buttonhover = get_theme_mod( 'captivating_buttonhover_color', captivating_customizer_get_default_buttonhover_color() );
+	$color_buttonhoverborder = get_theme_mod( 'captivating_buttonhoverborder_color', captivating_customizer_get_default_buttonhoverborder_color() );
+	$color_buttonhovertext = get_theme_mod( 'captivating_buttonhovertext_color', captivating_customizer_get_default_buttonhovertext_color() );
+	$color_announcement = get_theme_mod( 'captivating_announcement_color', captivating_customizer_get_default_announcement_color() );
+	$color_announcementtext = get_theme_mod( 'captivating_announcementtext_color', captivating_customizer_get_default_announcementtext_color() );
+	$color_featured = get_theme_mod( 'captivating_featured_color', captivating_customizer_get_default_featured_color() );
+	$color_newsletter = get_theme_mod( 'captivating_newsletter_color', captivating_customizer_get_default_newsletter_color() );
+	$color_newslettertext = get_theme_mod( 'captivating_newslettertext_color', captivating_customizer_get_default_newslettertext_color() );
+	$color_cta = get_theme_mod( 'captivating_cta_color', captivating_customizer_get_default_cta_color() );
+	$color_ctatext = get_theme_mod( 'captivating_ctatext_color', captivating_customizer_get_default_ctatext_color() );
+	$color_footer = get_theme_mod( 'captivating_footer_color', captivating_customizer_get_default_footer_color() );
+	$color_footertext = get_theme_mod( 'captivating_footertext_color', captivating_customizer_get_default_footertext_color() );
+	$color_readmorelink = get_theme_mod( 'captivating_readmorelink_color', captivating_customizer_get_default_readmorelink_color() );
+	$color_widgettitle1 = get_theme_mod( 'captivating_widgettitle1_color', captivating_customizer_get_default_widgettitle1_color() );
+	$color_widgettitle2 = get_theme_mod( 'captivating_widgettitle2_color', captivating_customizer_get_default_widgettitle2_color() );
+	$color_widgettitle3 = get_theme_mod( 'captivating_widgettitle3_color', captivating_customizer_get_default_widgettitle3_color() );
+	$color_sidebarwidgettitle1 = get_theme_mod( 'captivating_sidebarwidgettitle1_color', captivating_customizer_get_default_sidebarwidgettitle1_color() );
+	$color_sidebarwidgettitle2 = get_theme_mod( 'captivating_sidebarwidgettitle2_color', captivating_customizer_get_default_sidebarwidgettitle2_color() );
+	$color_sidebarwidgettitle3 = get_theme_mod( 'captivating_sidebarwidgettitle3_color', captivating_customizer_get_default_sidebarwidgettitle3_color() );
+	$color_morecategory1 = get_theme_mod( 'captivating_morecategory1_color', captivating_customizer_get_default_morecategory1_color() );
+	$color_morecategory2 = get_theme_mod( 'captivating_morecategory2_color', captivating_customizer_get_default_morecategory2_color() );
+	$color_morecategory3 = get_theme_mod( 'captivating_morecategory3_color', captivating_customizer_get_default_morecategory3_color() );
+
+	$css = '';
+
+	$css .= ( captivating_customizer_get_default_text_color() !== $color_text ) ? sprintf( '
+
+		body,
+		.entry-title a,
+		.sidebar .widget-title a,
+		.widget-title,
+		h1, h2, h3, h4, h5, h6,
+		.site-title a,
+		.site-title a:hover,
+		.genesis-nav-menu a {
+			color: %1$s;
+		}
+		
+		.slick-arrow {
+			color: %1$s !important;
+		}
+		
+		*::-moz-placeholder {
+			color: %1$s;
+		}
+			
+		', $color_text ) : '';
+		
+	$css .= ( captivating_customizer_get_default_links_color() !== $color_links ) ? sprintf( '
+
+		a,
+		.entry-title a:hover,
+		.genesis-nav-menu a:hover, 
+		.genesis-nav-menu .current-menu-item > a,
+		.single-post .entry-content h1, .page .entry-content h1,
+		.single-post article h3, .page article h3,
+		.single-post article h4, .page article h4,
+		.archive-pagination li a,
+		.woocommerce .product-title:hover {
+			color: %1$s;
+		}
+		
+		.archive-pagination .active a,
+		.archive-pagination li a:hover,
+		a.wprm-jump-to-recipe-shortcode {
+			border-color: %1$s;
+		}
+		
+		.woocommerce .woocommerce-message,
+		.woocommerce .woocommerce-info {
+			border-top-color: %1$s !important;
+		}
+		
+		.woocommerce .woocommerce-message::before,
+		.woocommerce .woocommerce-info::before,
+		.woocommerce div.product p.price,
+		.woocommerce div.product span.price,
+		.woocommerce ul.products li.product .price,
+		.woocommerce form .form-row .required,
+		.ninja-forms-req-symbol,
+		.nf-error-msg,
+		.slick-arrow:hover {
+			color: %1$s !important;
+		}
+		
+		.woocommerce .site-inner #respond input#submit,
+		.woocommerce .site-inner a.button,
+		.woocommerce .site-inner button.button,
+		.woocommerce .site-inner input.button {
+			color: %1$s !important;
+		}
+		
+		.woocommerce .site-inner #respond input#submit,
+		.woocommerce .site-inner a.button,
+		.woocommerce .site-inner button.button,
+		.woocommerce .site-inner input.button {
+			border-color: %1$s !important;
+		}
+		
+		', $color_links ) : '';
+		
+	$css .= ( captivating_customizer_get_default_linkshover_color() !== $color_linkshover ) ? sprintf( '
+
+		a:hover {
+			color: %1$s;
+		}
+		
+		.woocommerce #respond input#submit:hover,
+		.woocommerce a.button:hover,
+		.woocommerce button.button:hover,
+		.woocommerce input.button:hover {
+			color: %1$s !important;
+		}
+		
+		.woocommerce #respond input#submit:hover,
+		.woocommerce a.button:hover,
+		.woocommerce button.button:hover,
+		.woocommerce input.button:hover {
+			border-color: %1$s !important;
+		}
+		
+		a.wprm-jump-to-recipe-shortcode:hover {
+			border-color: %1$s;
+		}
+		
+		
+		', $color_linkshover ) : '';
+		
+	$css .= ( captivating_customizer_get_default_button_color() !== $color_button ) ? sprintf( '
+
+		button, input[type="button"],
+		input[type="reset"],
+		input[type="submit"], .button,
+		.site-wide-cta .enews-widget input[type="submit"],
+		.announcement-widget .enews-widget input[type="submit"],
+		div.ck_form .ck_subscribe_button,
+		.woocommerce .announcement-widget .button {
+			background-color: %1$s;
+		}
+		
+		', $color_button ) : '';
+	
+	$css .= ( captivating_customizer_get_default_buttonborder_color() !== $color_buttonborder ) ? sprintf( '
+
+		button, input[type="button"],
+		input[type="reset"],
+		input[type="submit"], .button,
+		.site-wide-cta .enews-widget input[type="submit"],
+		.announcement-widget .enews-widget input[type="submit"],
+		div.ck_form .ck_subscribe_button,
+		.woocommerce .announcement-widget .button {
+			border-color: %1$s;
+		}
+		
+		', $color_buttonborder ) : '';
+		
+	$css .= ( captivating_customizer_get_default_buttontext_color() !== $color_buttontext ) ? sprintf( '
+
+		button, input[type="button"],
+		input[type="reset"],
+		input[type="submit"], .button,
+		.site-wide-cta .enews-widget input[type="submit"],
+		.announcement-widget .enews-widget input[type="submit"],
+		div.ck_form .ck_subscribe_button,
+		.woocommerce .announcement-widget .button {
+			color: %1$s;
+		}
+		
+		', $color_buttontext ) : '';
+		
+	$css .= ( captivating_customizer_get_default_buttonhover_color() !== $color_buttonhover ) ? sprintf( '
+
+		button, input[type="button"]:hover,
+		input[type="reset"]:hover,
+		input[type="submit"]:hover,
+		.button:hover,
+		.site-wide-cta .enews-widget input[type="submit"]:hover,
+		.announcement-widget .enews-widget input[type="submit"]:hover,
+		.woocommerce .announcement-widget .button:hover {
+			background-color: %1$s;
+		}
+		
+		.woocommerce span.onsale {
+			background-color: %1$s !important;
+		}
+
+		.nc_socialPanel.swp_d_fullColor .googlePlus,
+		body .nc_socialPanel.swp_o_fullColor:hover .googlePlus,
+		html body .nc_socialPanel.swp_i_fullColor .googlePlus:hover,
+		.nc_socialPanel.swp_d_fullColor .twitter, body .nc_socialPanel.swp_o_fullColor:hover .twitter, html body .nc_socialPanel.swp_i_fullColor .twitter:hover,
+		.nc_socialPanel.swp_d_fullColor .swp_fb, body .nc_socialPanel.swp_o_fullColor:hover .swp_fb, html body .nc_socialPanel.swp_i_fullColor .swp_fb:hover,
+		.nc_socialPanel.swp_d_fullColor .linkedIn, body .nc_socialPanel.swp_o_fullColor:hover .linkedIn, html body .nc_socialPanel.swp_i_fullColor .linkedIn:hover,
+		.nc_socialPanel.swp_d_fullColor .nc_pinterest, body .nc_socialPanel.swp_o_fullColor:hover .nc_pinterest, html body .nc_socialPanel.swp_i_fullColor .nc_pinterest:hover,
+		.nc_socialPanel.swp_d_fullColor .swp_stumbleupon, body .nc_socialPanel.swp_o_fullColor:hover .swp_stumbleupon, html body .nc_socialPanel.swp_i_fullColor .swp_stumbleupon:hover{
+			background-color: %1$s !important;
+		}
+		
+		', $color_buttonhover ) : '';
+		
+		
+	$css .= ( captivating_customizer_get_default_buttonhoverborder_color() !== $color_buttonhoverborder ) ? sprintf( '
+
+		button, input[type="button"]:hover,
+		input[type="reset"]:hover,
+		input[type="submit"]:hover,
+		.button:hover,
+		.site-wide-cta .enews-widget input[type="submit"]:hover,
+		.announcement-widget .enews-widget input[type="submit"]:hover,
+		.woocommerce .announcement-widget .button:hover {
+			border-color: %1$s;
+		}
+		
+		', $color_buttonhoverborder ) : '';
+		
+	$css .= ( captivating_customizer_get_default_buttonhovertext_color() !== $color_buttonhovertext ) ? sprintf( '
+
+		button, input[type="button"]:hover,
+		input[type="reset"]:hover,
+		input[type="submit"]:hover,
+		.button:hover,
+		.site-wide-cta .enews-widget input[type="submit"]:hover,
+		.announcement-widget .enews-widget input[type="submit"]:hover,
+		.woocommerce .announcement-widget .button:hover {
+			color: %1$s;
+		}
+		
+		', $color_buttonhovertext ) : '';
+		
+	$css .= ( captivating_customizer_get_default_announcement_color() !== $color_announcement ) ? sprintf( '
+
+		.announcement-widget {
+			background-color: %1$s;
+		}
+		', $color_announcement ) : '';
+		
+	$css .= ( captivating_customizer_get_default_announcementtext_color() !== $color_announcementtext ) ? sprintf( '
+
+		.announcement-widget {
+			color: %1$s;
+		}
+		', $color_announcementtext ) : '';
+		
+	$css .= ( captivating_customizer_get_default_featured_color() !== $color_featured ) ? sprintf( '
+
+		.home-featured,
+		.above-blog-content {
+			background-color: %1$s !important;
+		}
+		', $color_featured ) : '';
+		
+	$css .= ( captivating_customizer_get_default_newsletter_color() !== $color_newsletter ) ? sprintf( '
+
+		.sidebar .enews-widget,
+		.category-index .widget_categories,
+		div.ck_form,
+		.author-box {
+			background-color: %1$s;
+		}
+		
+		', $color_newsletter ) : '';
+		
+	$css .= ( captivating_customizer_get_default_newslettertext_color() !== $color_newslettertext ) ? sprintf( '
+
+		.sidebar .enews-widget,
+		.category-index .widget_categories,
+		div.ck_form,
+		.category-index .widget_categories .widget-title,
+		.category-index ul li a,
+		.sidebar-primary .enews-widget .widgettitle,
+		div.ck_form_content h3, div.ck_label,
+		.author-box {
+			color: %1$s;
+		}
+		
+		', $color_newslettertext ) : '';
+		
+	$css .= ( captivating_customizer_get_default_cta_color() !== $color_cta ) ? sprintf( '
+
+		.site-wide-cta {
+			background-color: %1$s;
+		}
+		
+		', $color_cta ) : '';
+		
+	$css .= ( captivating_customizer_get_default_ctatext_color() !== $color_ctatext ) ? sprintf( '
+
+		.site-wide-cta p {
+			color: %1$s;
+		}
+		
+		', $color_ctatext ) : '';
+		
+	$css .= ( captivating_customizer_get_default_footer_color() !== $color_footer ) ? sprintf( '
+
+
+		.site-footer,
+		.genesis-nav-menu .sub-menu {
+			background-color: %1$s;
+		}
+		
+		.genesis-nav-menu .sub-menu::after {
+			border-bottom-color: %1$s;
+		}
+		
+		', $color_footer ) : '';
+		
+	$css .= ( captivating_customizer_get_default_footertext_color() !== $color_footertext ) ? sprintf( '
+
+		.site-footer,
+		.site-footer a,
+		.genesis-nav-menu .sub-menu a {
+			color: %1$s;
+		}
+		', $color_footertext ) : '';
+		
+	$css .= ( captivating_customizer_get_default_readmorelink_color() !== $color_readmorelink ) ? sprintf( '
+
+		a.more-link {
+			color: %1$s;
+			border-color: %1$s;
+		}
+		
+		', $color_readmorelink ) : '';
+		
+	$css .= ( captivating_customizer_get_default_widgettitle1_color() !== $color_widgettitle1 ) ? sprintf( '
+		
+		.front-page .content .widget-title {
+			border-color: %1$s !important;
+		}
+		
+		.category-index .widget-title {
+			border-color: %1$s;
+		}
+		
+		', $color_widgettitle1 ) : '';
+		
+	$css .= ( captivating_customizer_get_default_widgettitle2_color() !== $color_widgettitle2 ) ? sprintf( '
+		
+		.front-page .content .widget:nth-of-type(3n+2) .widget-title {
+			border-color: %1$s !important;
+		}
+		
+		.category-index .widget:nth-of-type(3n+2) .widget-title {
+			border-color: %1$s;
+		}
+		
+		', $color_widgettitle2 ) : '';
+		
+	$css .= ( captivating_customizer_get_default_widgettitle3_color() !== $color_widgettitle3 ) ? sprintf( '
+		
+		.front-page .content .widget:nth-of-type(3n+3) .widget-title {
+			border-color: %1$s !important;
+		}
+		
+		.category-index .widget:nth-of-type(3n+3) .widget-title {
+			border-color: %1$s;
+		}
+		
+		', $color_widgettitle3 ) : '';
+		
+	$css .= ( captivating_customizer_get_default_sidebarwidgettitle1_color() !== $color_sidebarwidgettitle1 ) ? sprintf( '
+
+		.sidebar-primary .widgettitle::after {
+			background: %1$s;
+		}
+		
+		', $color_sidebarwidgettitle1 ) : '';
+		
+	$css .= ( captivating_customizer_get_default_sidebarwidgettitle2_color() !== $color_sidebarwidgettitle2 ) ? sprintf( '
+
+		.sidebar-primary .widget:nth-of-type(3n+2) .widgettitle::after,
+		.wprm-recipe-print {
+			background: %1$s;
+		}
+		
+		', $color_sidebarwidgettitle2 ) : '';
+		
+	$css .= ( captivating_customizer_get_default_sidebarwidgettitle3_color() !== $color_sidebarwidgettitle3 ) ? sprintf( '
+
+		.sidebar-primary .widget:nth-of-type(3n+3) .widgettitle::after,
+		.wprm-recipe-print:hover {
+			background: %1$s;
+		}
+		
+		', $color_sidebarwidgettitle3 ) : '';
+		
+	$css .= ( captivating_customizer_get_default_morecategory1_color() !== $color_morecategory1 ) ? sprintf( '
+
+		.more-from-category a,
+		.posts-link a {
+			color: %1$s;
+			border-color: %1$s;
+		}
+
+		', $color_morecategory1 ) : '';
+		
+	$css .= ( captivating_customizer_get_default_morecategory2_color() !== $color_morecategory2 ) ? sprintf( '
+
+		.content .widget:nth-of-type(3n+2) .more-from-category a,
+		.content .widget:nth-of-type(3n+2) .posts-link a {
+			color: %1$s;
+			border-color: %1$s;
+		}
+		
+		', $color_morecategory2 ) : '';
+		
+	$css .= ( captivating_customizer_get_default_morecategory3_color() !== $color_morecategory3 ) ? sprintf( '
+
+		.content .widget:nth-of-type(3n+3) .more-from-category a,
+		.content .widget:nth-of-type(3n+3) .posts-link a {
+			color: %1$s;
+			border-color: %1$s;
+		}
+		
+		', $color_morecategory3 ) : '';
+
+	if( $css ){
+		wp_add_inline_style( $handle, $css );
+	}
+
+}

+ 3853 - 0
lib/plugins/tgm-plugin-activation/class-tgm-plugin-activation.php

@@ -0,0 +1,3853 @@
+<?php
+/**
+ * Plugin installation and activation for WordPress themes.
+ *
+ * Please note that this is a drop-in library for a theme or plugin.
+ * The authors of this library (Thomas, Gary and Juliette) are NOT responsible
+ * for the support of your plugin or theme. Please contact the plugin
+ * or theme author for support.
+ *
+ * @package   TGM-Plugin-Activation
+ * @version   2.6.1
+ * @link      http://tgmpluginactivation.com/
+ * @author    Thomas Griffin, Gary Jones, Juliette Reinders Folmer
+ * @copyright Copyright (c) 2011, Thomas Griffin
+ * @license   GPL-2.0+
+ */
+
+/*
+	Copyright 2011 Thomas Griffin (thomasgriffinmedia.com)
+
+	This program is free software; you can redistribute it and/or modify
+	it under the terms of the GNU General Public License, version 2, as
+	published by the Free Software Foundation.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+if ( ! class_exists( 'TGM_Plugin_Activation' ) ) {
+
+	/**
+	 * Automatic plugin installation and activation library.
+	 *
+	 * Creates a way to automatically install and activate plugins from within themes.
+	 * The plugins can be either bundled, downloaded from the WordPress
+	 * Plugin Repository or downloaded from another external source.
+	 *
+	 * @since 1.0.0
+	 *
+	 * @package TGM-Plugin-Activation
+	 * @author  Thomas Griffin
+	 * @author  Gary Jones
+	 */
+	class TGM_Plugin_Activation {
+		/**
+		 * TGMPA version number.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @const string Version number.
+		 */
+		const TGMPA_VERSION = '2.6.1';
+
+		/**
+		 * Regular expression to test if a URL is a WP plugin repo URL.
+		 *
+		 * @const string Regex.
+		 *
+		 * @since 2.5.0
+		 */
+		const WP_REPO_REGEX = '|^http[s]?://wordpress\.org/(?:extend/)?plugins/|';
+
+		/**
+		 * Arbitrary regular expression to test if a string starts with a URL.
+		 *
+		 * @const string Regex.
+		 *
+		 * @since 2.5.0
+		 */
+		const IS_URL_REGEX = '|^http[s]?://|';
+
+		/**
+		 * Holds a copy of itself, so it can be referenced by the class name.
+		 *
+		 * @since 1.0.0
+		 *
+		 * @var TGM_Plugin_Activation
+		 */
+		public static $instance;
+
+		/**
+		 * Holds arrays of plugin details.
+		 *
+		 * @since 1.0.0
+		 * @since 2.5.0 the array has the plugin slug as an associative key.
+		 *
+		 * @var array
+		 */
+		public $plugins = array();
+
+		/**
+		 * Holds arrays of plugin names to use to sort the plugins array.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @var array
+		 */
+		protected $sort_order = array();
+
+		/**
+		 * Whether any plugins have the 'force_activation' setting set to true.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @var bool
+		 */
+		protected $has_forced_activation = false;
+
+		/**
+		 * Whether any plugins have the 'force_deactivation' setting set to true.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @var bool
+		 */
+		protected $has_forced_deactivation = false;
+
+		/**
+		 * Name of the unique ID to hash notices.
+		 *
+		 * @since 2.4.0
+		 *
+		 * @var string
+		 */
+		public $id = 'tgmpa';
+
+		/**
+		 * Name of the query-string argument for the admin page.
+		 *
+		 * @since 1.0.0
+		 *
+		 * @var string
+		 */
+		protected $menu = 'tgmpa-install-plugins';
+
+		/**
+		 * Parent menu file slug.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @var string
+		 */
+		public $parent_slug = 'themes.php';
+
+		/**
+		 * Capability needed to view the plugin installation menu item.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @var string
+		 */
+		public $capability = 'edit_theme_options';
+
+		/**
+		 * Default absolute path to folder containing bundled plugin zip files.
+		 *
+		 * @since 2.0.0
+		 *
+		 * @var string Absolute path prefix to zip file location for bundled plugins. Default is empty string.
+		 */
+		public $default_path = '';
+
+		/**
+		 * Flag to show admin notices or not.
+		 *
+		 * @since 2.1.0
+		 *
+		 * @var boolean
+		 */
+		public $has_notices = true;
+
+		/**
+		 * Flag to determine if the user can dismiss the notice nag.
+		 *
+		 * @since 2.4.0
+		 *
+		 * @var boolean
+		 */
+		public $dismissable = true;
+
+		/**
+		 * Message to be output above nag notice if dismissable is false.
+		 *
+		 * @since 2.4.0
+		 *
+		 * @var string
+		 */
+		public $dismiss_msg = '';
+
+		/**
+		 * Flag to set automatic activation of plugins. Off by default.
+		 *
+		 * @since 2.2.0
+		 *
+		 * @var boolean
+		 */
+		public $is_automatic = false;
+
+		/**
+		 * Optional message to display before the plugins table.
+		 *
+		 * @since 2.2.0
+		 *
+		 * @var string Message filtered by wp_kses_post(). Default is empty string.
+		 */
+		public $message = '';
+
+		/**
+		 * Holds configurable array of strings.
+		 *
+		 * Default values are added in the constructor.
+		 *
+		 * @since 2.0.0
+		 *
+		 * @var array
+		 */
+		public $strings = array();
+
+		/**
+		 * Holds the version of WordPress.
+		 *
+		 * @since 2.4.0
+		 *
+		 * @var int
+		 */
+		public $wp_version;
+
+		/**
+		 * Holds the hook name for the admin page.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @var string
+		 */
+		public $page_hook;
+
+		/**
+		 * Adds a reference of this object to $instance, populates default strings,
+		 * does the tgmpa_init action hook, and hooks in the interactions to init.
+		 *
+		 * {@internal This method should be `protected`, but as too many TGMPA implementations
+		 * haven't upgraded beyond v2.3.6 yet, this gives backward compatibility issues.
+		 * Reverted back to public for the time being.}}
+		 *
+		 * @since 1.0.0
+		 *
+		 * @see TGM_Plugin_Activation::init()
+		 */
+		public function __construct() {
+			// Set the current WordPress version.
+			$this->wp_version = $GLOBALS['wp_version'];
+
+			// Announce that the class is ready, and pass the object (for advanced use).
+			do_action_ref_array( 'tgmpa_init', array( $this ) );
+
+			/*
+			 * Load our text domain and allow for overloading the fall-back file.
+			 *
+			 * {@internal IMPORTANT! If this code changes, review the regex in the custom TGMPA
+			 * generator on the website.}}
+			 */
+			add_action( 'init', array( $this, 'load_textdomain' ), 5 );
+			add_filter( 'load_textdomain_mofile', array( $this, 'overload_textdomain_mofile' ), 10, 2 );
+
+			// When the rest of WP has loaded, kick-start the rest of the class.
+			add_action( 'init', array( $this, 'init' ) );
+		}
+
+		/**
+		 * Magic method to (not) set protected properties from outside of this class.
+		 *
+		 * {@internal hackedihack... There is a serious bug in v2.3.2 - 2.3.6  where the `menu` property
+		 * is being assigned rather than tested in a conditional, effectively rendering it useless.
+		 * This 'hack' prevents this from happening.}}
+		 *
+		 * @see https://github.com/TGMPA/TGM-Plugin-Activation/blob/2.3.6/tgm-plugin-activation/class-tgm-plugin-activation.php#L1593
+		 *
+		 * @since 2.5.2
+		 *
+		 * @param string $name  Name of an inaccessible property.
+		 * @param mixed  $value Value to assign to the property.
+		 * @return void  Silently fail to set the property when this is tried from outside of this class context.
+		 *               (Inside this class context, the __set() method if not used as there is direct access.)
+		 */
+		public function __set( $name, $value ) {
+			return;
+		}
+
+		/**
+		 * Magic method to get the value of a protected property outside of this class context.
+		 *
+		 * @since 2.5.2
+		 *
+		 * @param string $name Name of an inaccessible property.
+		 * @return mixed The property value.
+		 */
+		public function __get( $name ) {
+			return $this->{$name};
+		}
+
+		/**
+		 * Initialise the interactions between this class and WordPress.
+		 *
+		 * Hooks in three new methods for the class: admin_menu, notices and styles.
+		 *
+		 * @since 2.0.0
+		 *
+		 * @see TGM_Plugin_Activation::admin_menu()
+		 * @see TGM_Plugin_Activation::notices()
+		 * @see TGM_Plugin_Activation::styles()
+		 */
+		public function init() {
+			/**
+			 * By default TGMPA only loads on the WP back-end and not in an Ajax call. Using this filter
+			 * you can overrule that behaviour.
+			 *
+			 * @since 2.5.0
+			 *
+			 * @param bool $load Whether or not TGMPA should load.
+			 *                   Defaults to the return of `is_admin() && ! defined( 'DOING_AJAX' )`.
+			 */
+			if ( true !== apply_filters( 'tgmpa_load', ( is_admin() && ! defined( 'DOING_AJAX' ) ) ) ) {
+				return;
+			}
+
+			// Load class strings.
+			$this->strings = array(
+				'page_title'                      => __( 'Install Required Plugins', 'tgmpa' ),
+				'menu_title'                      => __( 'Install Plugins', 'tgmpa' ),
+				/* translators: %s: plugin name. */
+				'installing'                      => __( 'Installing Plugin: %s', 'tgmpa' ),
+				/* translators: %s: plugin name. */
+				'updating'                        => __( 'Updating Plugin: %s', 'tgmpa' ),
+				'oops'                            => __( 'Something went wrong with the plugin API.', 'tgmpa' ),
+				'notice_can_install_required'     => _n_noop(
+					/* translators: 1: plugin name(s). */
+					'This theme requires the following plugin: %1$s.',
+					'This theme requires the following plugins: %1$s.',
+					'tgmpa'
+				),
+				'notice_can_install_recommended'  => _n_noop(
+					/* translators: 1: plugin name(s). */
+					'This theme recommends the following plugin: %1$s.',
+					'This theme recommends the following plugins: %1$s.',
+					'tgmpa'
+				),
+				'notice_ask_to_update'            => _n_noop(
+					/* translators: 1: plugin name(s). */
+					'The following plugin needs to be updated to its latest version to ensure maximum compatibility with this theme: %1$s.',
+					'The following plugins need to be updated to their latest version to ensure maximum compatibility with this theme: %1$s.',
+					'tgmpa'
+				),
+				'notice_ask_to_update_maybe'      => _n_noop(
+					/* translators: 1: plugin name(s). */
+					'There is an update available for: %1$s.',
+					'There are updates available for the following plugins: %1$s.',
+					'tgmpa'
+				),
+				'notice_can_activate_required'    => _n_noop(
+					/* translators: 1: plugin name(s). */
+					'The following required plugin is currently inactive: %1$s.',
+					'The following required plugins are currently inactive: %1$s.',
+					'tgmpa'
+				),
+				'notice_can_activate_recommended' => _n_noop(
+					/* translators: 1: plugin name(s). */
+					'The following recommended plugin is currently inactive: %1$s.',
+					'The following recommended plugins are currently inactive: %1$s.',
+					'tgmpa'
+				),
+				'install_link'                    => _n_noop(
+					'Begin installing plugin',
+					'Begin installing plugins',
+					'tgmpa'
+				),
+				'update_link'                     => _n_noop(
+					'Begin updating plugin',
+					'Begin updating plugins',
+					'tgmpa'
+				),
+				'activate_link'                   => _n_noop(
+					'Begin activating plugin',
+					'Begin activating plugins',
+					'tgmpa'
+				),
+				'return'                          => __( 'Return to Required Plugins Installer', 'tgmpa' ),
+				'dashboard'                       => __( 'Return to the Dashboard', 'tgmpa' ),
+				'plugin_activated'                => __( 'Plugin activated successfully.', 'tgmpa' ),
+				'activated_successfully'          => __( 'The following plugin was activated successfully:', 'tgmpa' ),
+				/* translators: 1: plugin name. */
+				'plugin_already_active'           => __( 'No action taken. Plugin %1$s was already active.', 'tgmpa' ),
+				/* translators: 1: plugin name. */
+				'plugin_needs_higher_version'     => __( 'Plugin not activated. A higher version of %s is needed for this theme. Please update the plugin.', 'tgmpa' ),
+				/* translators: 1: dashboard link. */
+				'complete'                        => __( 'All plugins installed and activated successfully. %1$s', 'tgmpa' ),
+				'dismiss'                         => __( 'Dismiss this notice', 'tgmpa' ),
+				'notice_cannot_install_activate'  => __( 'There are one or more required or recommended plugins to install, update or activate.', 'tgmpa' ),
+				'contact_admin'                   => __( 'Please contact the administrator of this site for help.', 'tgmpa' ),
+			);
+
+			do_action( 'tgmpa_register' );
+
+			/* After this point, the plugins should be registered and the configuration set. */
+
+			// Proceed only if we have plugins to handle.
+			if ( empty( $this->plugins ) || ! is_array( $this->plugins ) ) {
+				return;
+			}
+
+			// Set up the menu and notices if we still have outstanding actions.
+			if ( true !== $this->is_tgmpa_complete() ) {
+				// Sort the plugins.
+				array_multisort( $this->sort_order, SORT_ASC, $this->plugins );
+
+				add_action( 'admin_menu', array( $this, 'admin_menu' ) );
+				add_action( 'admin_head', array( $this, 'dismiss' ) );
+
+				// Prevent the normal links from showing underneath a single install/update page.
+				add_filter( 'install_plugin_complete_actions', array( $this, 'actions' ) );
+				add_filter( 'update_plugin_complete_actions', array( $this, 'actions' ) );
+
+				if ( $this->has_notices ) {
+					add_action( 'admin_notices', array( $this, 'notices' ) );
+					add_action( 'admin_init', array( $this, 'admin_init' ), 1 );
+					add_action( 'admin_enqueue_scripts', array( $this, 'thickbox' ) );
+				}
+			}
+
+			// If needed, filter plugin action links.
+			add_action( 'load-plugins.php', array( $this, 'add_plugin_action_link_filters' ), 1 );
+
+			// Make sure things get reset on switch theme.
+			add_action( 'switch_theme', array( $this, 'flush_plugins_cache' ) );
+
+			if ( $this->has_notices ) {
+				add_action( 'switch_theme', array( $this, 'update_dismiss' ) );
+			}
+
+			// Setup the force activation hook.
+			if ( true === $this->has_forced_activation ) {
+				add_action( 'admin_init', array( $this, 'force_activation' ) );
+			}
+
+			// Setup the force deactivation hook.
+			if ( true === $this->has_forced_deactivation ) {
+				add_action( 'switch_theme', array( $this, 'force_deactivation' ) );
+			}
+		}
+
+		/**
+		 * Load translations.
+		 *
+		 * @since 2.6.0
+		 *
+		 * (@internal Uses `load_theme_textdomain()` rather than `load_plugin_textdomain()` to
+		 * get round the different ways of handling the path and deprecated notices being thrown
+		 * and such. For plugins, the actual file name will be corrected by a filter.}}
+		 *
+		 * {@internal IMPORTANT! If this function changes, review the regex in the custom TGMPA
+		 * generator on the website.}}
+		 */
+		public function load_textdomain() {
+			if ( is_textdomain_loaded( 'tgmpa' ) ) {
+				return;
+			}
+
+			if ( false !== strpos( __FILE__, WP_PLUGIN_DIR ) || false !== strpos( __FILE__, WPMU_PLUGIN_DIR ) ) {
+				// Plugin, we'll need to adjust the file name.
+				add_action( 'load_textdomain_mofile', array( $this, 'correct_plugin_mofile' ), 10, 2 );
+				load_theme_textdomain( 'tgmpa', dirname( __FILE__ ) . '/languages' );
+				remove_action( 'load_textdomain_mofile', array( $this, 'correct_plugin_mofile' ), 10 );
+			} else {
+				load_theme_textdomain( 'tgmpa', dirname( __FILE__ ) . '/languages' );
+			}
+		}
+
+		/**
+		 * Correct the .mo file name for (must-use) plugins.
+		 *
+		 * Themese use `/path/{locale}.mo` while plugins use `/path/{text-domain}-{locale}.mo`.
+		 *
+		 * {@internal IMPORTANT! If this function changes, review the regex in the custom TGMPA
+		 * generator on the website.}}
+		 *
+		 * @since 2.6.0
+		 *
+		 * @param string $mofile Full path to the target mofile.
+		 * @param string $domain The domain for which a language file is being loaded.
+		 * @return string $mofile
+		 */
+		public function correct_plugin_mofile( $mofile, $domain ) {
+			// Exit early if not our domain (just in case).
+			if ( 'tgmpa' !== $domain ) {
+				return $mofile;
+			}
+			return preg_replace( '`/([a-z]{2}_[A-Z]{2}.mo)$`', '/tgmpa-$1', $mofile );
+		}
+
+		/**
+		 * Potentially overload the fall-back translation file for the current language.
+		 *
+		 * WP, by default since WP 3.7, will load a local translation first and if none
+		 * can be found, will try and find a translation in the /wp-content/languages/ directory.
+		 * As this library is theme/plugin agnostic, translation files for TGMPA can exist both
+		 * in the WP_LANG_DIR /plugins/ subdirectory as well as in the /themes/ subdirectory.
+		 *
+		 * This method makes sure both directories are checked.
+		 *
+		 * {@internal IMPORTANT! If this function changes, review the regex in the custom TGMPA
+		 * generator on the website.}}
+		 *
+		 * @since 2.6.0
+		 *
+		 * @param string $mofile Full path to the target mofile.
+		 * @param string $domain The domain for which a language file is being loaded.
+		 * @return string $mofile
+		 */
+		public function overload_textdomain_mofile( $mofile, $domain ) {
+			// Exit early if not our domain, not a WP_LANG_DIR load or if the file exists and is readable.
+			if ( 'tgmpa' !== $domain || false === strpos( $mofile, WP_LANG_DIR ) || @is_readable( $mofile ) ) {
+				return $mofile;
+			}
+
+			// Current fallback file is not valid, let's try the alternative option.
+			if ( false !== strpos( $mofile, '/themes/' ) ) {
+				return str_replace( '/themes/', '/plugins/', $mofile );
+			} elseif ( false !== strpos( $mofile, '/plugins/' ) ) {
+				return str_replace( '/plugins/', '/themes/', $mofile );
+			} else {
+				return $mofile;
+			}
+		}
+
+		/**
+		 * Hook in plugin action link filters for the WP native plugins page.
+		 *
+		 * - Prevent activation of plugins which don't meet the minimum version requirements.
+		 * - Prevent deactivation of force-activated plugins.
+		 * - Add update notice if update available.
+		 *
+		 * @since 2.5.0
+		 */
+		public function add_plugin_action_link_filters() {
+			foreach ( $this->plugins as $slug => $plugin ) {
+				if ( false === $this->can_plugin_activate( $slug ) ) {
+					add_filter( 'plugin_action_links_' . $plugin['file_path'], array( $this, 'filter_plugin_action_links_activate' ), 20 );
+				}
+
+				if ( true === $plugin['force_activation'] ) {
+					add_filter( 'plugin_action_links_' . $plugin['file_path'], array( $this, 'filter_plugin_action_links_deactivate' ), 20 );
+				}
+
+				if ( false !== $this->does_plugin_require_update( $slug ) ) {
+					add_filter( 'plugin_action_links_' . $plugin['file_path'], array( $this, 'filter_plugin_action_links_update' ), 20 );
+				}
+			}
+		}
+
+		/**
+		 * Remove the 'Activate' link on the WP native plugins page if the plugin does not meet the
+		 * minimum version requirements.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param array $actions Action links.
+		 * @return array
+		 */
+		public function filter_plugin_action_links_activate( $actions ) {
+			unset( $actions['activate'] );
+
+			return $actions;
+		}
+
+		/**
+		 * Remove the 'Deactivate' link on the WP native plugins page if the plugin has been set to force activate.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param array $actions Action links.
+		 * @return array
+		 */
+		public function filter_plugin_action_links_deactivate( $actions ) {
+			unset( $actions['deactivate'] );
+
+			return $actions;
+		}
+
+		/**
+		 * Add a 'Requires update' link on the WP native plugins page if the plugin does not meet the
+		 * minimum version requirements.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param array $actions Action links.
+		 * @return array
+		 */
+		public function filter_plugin_action_links_update( $actions ) {
+			$actions['update'] = sprintf(
+				'<a href="%1$s" title="%2$s" class="edit">%3$s</a>',
+				esc_url( $this->get_tgmpa_status_url( 'update' ) ),
+				esc_attr__( 'This plugin needs to be updated to be compatible with your theme.', 'tgmpa' ),
+				esc_html__( 'Update Required', 'tgmpa' )
+			);
+
+			return $actions;
+		}
+
+		/**
+		 * Handles calls to show plugin information via links in the notices.
+		 *
+		 * We get the links in the admin notices to point to the TGMPA page, rather
+		 * than the typical plugin-install.php file, so we can prepare everything
+		 * beforehand.
+		 *
+		 * WP does not make it easy to show the plugin information in the thickbox -
+		 * here we have to require a file that includes a function that does the
+		 * main work of displaying it, enqueue some styles, set up some globals and
+		 * finally call that function before exiting.
+		 *
+		 * Down right easy once you know how...
+		 *
+		 * Returns early if not the TGMPA page.
+		 *
+		 * @since 2.1.0
+		 *
+		 * @global string $tab Used as iframe div class names, helps with styling
+		 * @global string $body_id Used as the iframe body ID, helps with styling
+		 *
+		 * @return null Returns early if not the TGMPA page.
+		 */
+		public function admin_init() {
+			if ( ! $this->is_tgmpa_page() ) {
+				return;
+			}
+
+			if ( isset( $_REQUEST['tab'] ) && 'plugin-information' === $_REQUEST['tab'] ) {
+				// Needed for install_plugin_information().
+				require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
+
+				wp_enqueue_style( 'plugin-install' );
+
+				global $tab, $body_id;
+				$body_id = 'plugin-information';
+				// @codingStandardsIgnoreStart
+				$tab     = 'plugin-information';
+				// @codingStandardsIgnoreEnd
+
+				install_plugin_information();
+
+				exit;
+			}
+		}
+
+		/**
+		 * Enqueue thickbox scripts/styles for plugin info.
+		 *
+		 * Thickbox is not automatically included on all admin pages, so we must
+		 * manually enqueue it for those pages.
+		 *
+		 * Thickbox is only loaded if the user has not dismissed the admin
+		 * notice or if there are any plugins left to install and activate.
+		 *
+		 * @since 2.1.0
+		 */
+		public function thickbox() {
+			if ( ! get_user_meta( get_current_user_id(), 'tgmpa_dismissed_notice_' . $this->id, true ) ) {
+				add_thickbox();
+			}
+		}
+
+		/**
+		 * Adds submenu page if there are plugin actions to take.
+		 *
+		 * This method adds the submenu page letting users know that a required
+		 * plugin needs to be installed.
+		 *
+		 * This page disappears once the plugin has been installed and activated.
+		 *
+		 * @since 1.0.0
+		 *
+		 * @see TGM_Plugin_Activation::init()
+		 * @see TGM_Plugin_Activation::install_plugins_page()
+		 *
+		 * @return null Return early if user lacks capability to install a plugin.
+		 */
+		public function admin_menu() {
+			// Make sure privileges are correct to see the page.
+			if ( ! current_user_can( 'install_plugins' ) ) {
+				return;
+			}
+
+			$args = apply_filters(
+				'tgmpa_admin_menu_args',
+				array(
+					'parent_slug' => $this->parent_slug,                     // Parent Menu slug.
+					'page_title'  => $this->strings['page_title'],           // Page title.
+					'menu_title'  => $this->strings['menu_title'],           // Menu title.
+					'capability'  => $this->capability,                      // Capability.
+					'menu_slug'   => $this->menu,                            // Menu slug.
+					'function'    => array( $this, 'install_plugins_page' ), // Callback.
+				)
+			);
+
+			$this->add_admin_menu( $args );
+		}
+
+		/**
+		 * Add the menu item.
+		 *
+		 * {@internal IMPORTANT! If this function changes, review the regex in the custom TGMPA
+		 * generator on the website.}}
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param array $args Menu item configuration.
+		 */
+		protected function add_admin_menu( array $args ) {
+			if ( has_filter( 'tgmpa_admin_menu_use_add_theme_page' ) ) {
+				_deprecated_function( 'The "tgmpa_admin_menu_use_add_theme_page" filter', '2.5.0', esc_html__( 'Set the parent_slug config variable instead.', 'tgmpa' ) );
+			}
+
+			if ( 'themes.php' === $this->parent_slug ) {
+				$this->page_hook = call_user_func( 'add_theme_page', $args['page_title'], $args['menu_title'], $args['capability'], $args['menu_slug'], $args['function'] );
+			} else {
+				$this->page_hook = call_user_func( 'add_submenu_page', $args['parent_slug'], $args['page_title'], $args['menu_title'], $args['capability'], $args['menu_slug'], $args['function'] );
+			}
+		}
+
+		/**
+		 * Echoes plugin installation form.
+		 *
+		 * This method is the callback for the admin_menu method function.
+		 * This displays the admin page and form area where the user can select to install and activate the plugin.
+		 * Aborts early if we're processing a plugin installation action.
+		 *
+		 * @since 1.0.0
+		 *
+		 * @return null Aborts early if we're processing a plugin installation action.
+		 */
+		public function install_plugins_page() {
+			// Store new instance of plugin table in object.
+			$plugin_table = new TGMPA_List_Table;
+
+			// Return early if processing a plugin installation action.
+			if ( ( ( 'tgmpa-bulk-install' === $plugin_table->current_action() || 'tgmpa-bulk-update' === $plugin_table->current_action() ) && $plugin_table->process_bulk_actions() ) || $this->do_plugin_install() ) {
+				return;
+			}
+
+			// Force refresh of available plugin information so we'll know about manual updates/deletes.
+			wp_clean_plugins_cache( false );
+
+			?>
+			<div class="tgmpa wrap">
+				<h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
+				<?php $plugin_table->prepare_items(); ?>
+
+				<?php
+				if ( ! empty( $this->message ) && is_string( $this->message ) ) {
+					echo wp_kses_post( $this->message );
+				}
+				?>
+				<?php $plugin_table->views(); ?>
+
+				<form id="tgmpa-plugins" action="" method="post">
+					<input type="hidden" name="tgmpa-page" value="<?php echo esc_attr( $this->menu ); ?>" />
+					<input type="hidden" name="plugin_status" value="<?php echo esc_attr( $plugin_table->view_context ); ?>" />
+					<?php $plugin_table->display(); ?>
+				</form>
+			</div>
+			<?php
+		}
+
+		/**
+		 * Installs, updates or activates a plugin depending on the action link clicked by the user.
+		 *
+		 * Checks the $_GET variable to see which actions have been
+		 * passed and responds with the appropriate method.
+		 *
+		 * Uses WP_Filesystem to process and handle the plugin installation
+		 * method.
+		 *
+		 * @since 1.0.0
+		 *
+		 * @uses WP_Filesystem
+		 * @uses WP_Error
+		 * @uses WP_Upgrader
+		 * @uses Plugin_Upgrader
+		 * @uses Plugin_Installer_Skin
+		 * @uses Plugin_Upgrader_Skin
+		 *
+		 * @return boolean True on success, false on failure.
+		 */
+		protected function do_plugin_install() {
+			if ( empty( $_GET['plugin'] ) ) {
+				return false;
+			}
+
+			// All plugin information will be stored in an array for processing.
+			$slug = $this->sanitize_key( urldecode( $_GET['plugin'] ) );
+
+			if ( ! isset( $this->plugins[ $slug ] ) ) {
+				return false;
+			}
+
+			// Was an install or upgrade action link clicked?
+			if ( ( isset( $_GET['tgmpa-install'] ) && 'install-plugin' === $_GET['tgmpa-install'] ) || ( isset( $_GET['tgmpa-update'] ) && 'update-plugin' === $_GET['tgmpa-update'] ) ) {
+
+				$install_type = 'install';
+				if ( isset( $_GET['tgmpa-update'] ) && 'update-plugin' === $_GET['tgmpa-update'] ) {
+					$install_type = 'update';
+				}
+
+				check_admin_referer( 'tgmpa-' . $install_type, 'tgmpa-nonce' );
+
+				// Pass necessary information via URL if WP_Filesystem is needed.
+				$url = wp_nonce_url(
+					add_query_arg(
+						array(
+							'plugin'                 => urlencode( $slug ),
+							'tgmpa-' . $install_type => $install_type . '-plugin',
+						),
+						$this->get_tgmpa_url()
+					),
+					'tgmpa-' . $install_type,
+					'tgmpa-nonce'
+				);
+
+				$method = ''; // Leave blank so WP_Filesystem can populate it as necessary.
+
+				if ( false === ( $creds = request_filesystem_credentials( esc_url_raw( $url ), $method, false, false, array() ) ) ) {
+					return true;
+				}
+
+				if ( ! WP_Filesystem( $creds ) ) {
+					request_filesystem_credentials( esc_url_raw( $url ), $method, true, false, array() ); // Setup WP_Filesystem.
+					return true;
+				}
+
+				/* If we arrive here, we have the filesystem. */
+
+				// Prep variables for Plugin_Installer_Skin class.
+				$extra         = array();
+				$extra['slug'] = $slug; // Needed for potentially renaming of directory name.
+				$source        = $this->get_download_url( $slug );
+				$api           = ( 'repo' === $this->plugins[ $slug ]['source_type'] ) ? $this->get_plugins_api( $slug ) : null;
+				$api           = ( false !== $api ) ? $api : null;
+
+				$url = add_query_arg(
+					array(
+						'action' => $install_type . '-plugin',
+						'plugin' => urlencode( $slug ),
+					),
+					'update.php'
+				);
+
+				if ( ! class_exists( 'Plugin_Upgrader', false ) ) {
+					require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
+				}
+
+				$title     = ( 'update' === $install_type ) ? $this->strings['updating'] : $this->strings['installing'];
+				$skin_args = array(
+					'type'   => ( 'bundled' !== $this->plugins[ $slug ]['source_type'] ) ? 'web' : 'upload',
+					'title'  => sprintf( $title, $this->plugins[ $slug ]['name'] ),
+					'url'    => esc_url_raw( $url ),
+					'nonce'  => $install_type . '-plugin_' . $slug,
+					'plugin' => '',
+					'api'    => $api,
+					'extra'  => $extra,
+				);
+				unset( $title );
+
+				if ( 'update' === $install_type ) {
+					$skin_args['plugin'] = $this->plugins[ $slug ]['file_path'];
+					$skin                = new Plugin_Upgrader_Skin( $skin_args );
+				} else {
+					$skin = new Plugin_Installer_Skin( $skin_args );
+				}
+
+				// Create a new instance of Plugin_Upgrader.
+				$upgrader = new Plugin_Upgrader( $skin );
+
+				// Perform the action and install the plugin from the $source urldecode().
+				add_filter( 'upgrader_source_selection', array( $this, 'maybe_adjust_source_dir' ), 1, 3 );
+
+				if ( 'update' === $install_type ) {
+					// Inject our info into the update transient.
+					$to_inject                    = array( $slug => $this->plugins[ $slug ] );
+					$to_inject[ $slug ]['source'] = $source;
+					$this->inject_update_info( $to_inject );
+
+					$upgrader->upgrade( $this->plugins[ $slug ]['file_path'] );
+				} else {
+					$upgrader->install( $source );
+				}
+
+				remove_filter( 'upgrader_source_selection', array( $this, 'maybe_adjust_source_dir' ), 1 );
+
+				// Make sure we have the correct file path now the plugin is installed/updated.
+				$this->populate_file_path( $slug );
+
+				// Only activate plugins if the config option is set to true and the plugin isn't
+				// already active (upgrade).
+				if ( $this->is_automatic && ! $this->is_plugin_active( $slug ) ) {
+					$plugin_activate = $upgrader->plugin_info(); // Grab the plugin info from the Plugin_Upgrader method.
+					if ( false === $this->activate_single_plugin( $plugin_activate, $slug, true ) ) {
+						return true; // Finish execution of the function early as we encountered an error.
+					}
+				}
+
+				$this->show_tgmpa_version();
+
+				// Display message based on if all plugins are now active or not.
+				if ( $this->is_tgmpa_complete() ) {
+					echo '<p>', sprintf( esc_html( $this->strings['complete'] ), '<a href="' . esc_url( self_admin_url() ) . '">' . esc_html__( 'Return to the Dashboard', 'tgmpa' ) . '</a>' ), '</p>';
+					echo '<style type="text/css">#adminmenu .wp-submenu li.current { display: none !important; }</style>';
+				} else {
+					echo '<p><a href="', esc_url( $this->get_tgmpa_url() ), '" target="_parent">', esc_html( $this->strings['return'] ), '</a></p>';
+				}
+
+				return true;
+			} elseif ( isset( $this->plugins[ $slug ]['file_path'], $_GET['tgmpa-activate'] ) && 'activate-plugin' === $_GET['tgmpa-activate'] ) {
+				// Activate action link was clicked.
+				check_admin_referer( 'tgmpa-activate', 'tgmpa-nonce' );
+
+				if ( false === $this->activate_single_plugin( $this->plugins[ $slug ]['file_path'], $slug ) ) {
+					return true; // Finish execution of the function early as we encountered an error.
+				}
+			}
+
+			return false;
+		}
+
+		/**
+		 * Inject information into the 'update_plugins' site transient as WP checks that before running an update.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param array $plugins The plugin information for the plugins which are to be updated.
+		 */
+		public function inject_update_info( $plugins ) {
+			$repo_updates = get_site_transient( 'update_plugins' );
+
+			if ( ! is_object( $repo_updates ) ) {
+				$repo_updates = new stdClass;
+			}
+
+			foreach ( $plugins as $slug => $plugin ) {
+				$file_path = $plugin['file_path'];
+
+				if ( empty( $repo_updates->response[ $file_path ] ) ) {
+					$repo_updates->response[ $file_path ] = new stdClass;
+				}
+
+				// We only really need to set package, but let's do all we can in case WP changes something.
+				$repo_updates->response[ $file_path ]->slug        = $slug;
+				$repo_updates->response[ $file_path ]->plugin      = $file_path;
+				$repo_updates->response[ $file_path ]->new_version = $plugin['version'];
+				$repo_updates->response[ $file_path ]->package     = $plugin['source'];
+				if ( empty( $repo_updates->response[ $file_path ]->url ) && ! empty( $plugin['external_url'] ) ) {
+					$repo_updates->response[ $file_path ]->url = $plugin['external_url'];
+				}
+			}
+
+			set_site_transient( 'update_plugins', $repo_updates );
+		}
+
+		/**
+		 * Adjust the plugin directory name if necessary.
+		 *
+		 * The final destination directory of a plugin is based on the subdirectory name found in the
+		 * (un)zipped source. In some cases - most notably GitHub repository plugin downloads -, this
+		 * subdirectory name is not the same as the expected slug and the plugin will not be recognized
+		 * as installed. This is fixed by adjusting the temporary unzipped source subdirectory name to
+		 * the expected plugin slug.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string       $source        Path to upgrade/zip-file-name.tmp/subdirectory/.
+		 * @param string       $remote_source Path to upgrade/zip-file-name.tmp.
+		 * @param \WP_Upgrader $upgrader      Instance of the upgrader which installs the plugin.
+		 * @return string $source
+		 */
+		public function maybe_adjust_source_dir( $source, $remote_source, $upgrader ) {
+			if ( ! $this->is_tgmpa_page() || ! is_object( $GLOBALS['wp_filesystem'] ) ) {
+				return $source;
+			}
+
+			// Check for single file plugins.
+			$source_files = array_keys( $GLOBALS['wp_filesystem']->dirlist( $remote_source ) );
+			if ( 1 === count( $source_files ) && false === $GLOBALS['wp_filesystem']->is_dir( $source ) ) {
+				return $source;
+			}
+
+			// Multi-file plugin, let's see if the directory is correctly named.
+			$desired_slug = '';
+
+			// Figure out what the slug is supposed to be.
+			if ( false === $upgrader->bulk && ! empty( $upgrader->skin->options['extra']['slug'] ) ) {
+				$desired_slug = $upgrader->skin->options['extra']['slug'];
+			} else {
+				// Bulk installer contains less info, so fall back on the info registered here.
+				foreach ( $this->plugins as $slug => $plugin ) {
+					if ( ! empty( $upgrader->skin->plugin_names[ $upgrader->skin->i ] ) && $plugin['name'] === $upgrader->skin->plugin_names[ $upgrader->skin->i ] ) {
+						$desired_slug = $slug;
+						break;
+					}
+				}
+				unset( $slug, $plugin );
+			}
+
+			if ( ! empty( $desired_slug ) ) {
+				$subdir_name = untrailingslashit( str_replace( trailingslashit( $remote_source ), '', $source ) );
+
+				if ( ! empty( $subdir_name ) && $subdir_name !== $desired_slug ) {
+					$from_path = untrailingslashit( $source );
+					$to_path   = trailingslashit( $remote_source ) . $desired_slug;
+
+					if ( true === $GLOBALS['wp_filesystem']->move( $from_path, $to_path ) ) {
+						return trailingslashit( $to_path );
+					} else {
+						return new WP_Error( 'rename_failed', esc_html__( 'The remote plugin package does not contain a folder with the desired slug and renaming did not work.', 'tgmpa' ) . ' ' . esc_html__( 'Please contact the plugin provider and ask them to package their plugin according to the WordPress guidelines.', 'tgmpa' ), array( 'found' => $subdir_name, 'expected' => $desired_slug ) );
+					}
+				} elseif ( empty( $subdir_name ) ) {
+					return new WP_Error( 'packaged_wrong', esc_html__( 'The remote plugin package consists of more than one file, but the files are not packaged in a folder.', 'tgmpa' ) . ' ' . esc_html__( 'Please contact the plugin provider and ask them to package their plugin according to the WordPress guidelines.', 'tgmpa' ), array( 'found' => $subdir_name, 'expected' => $desired_slug ) );
+				}
+			}
+
+			return $source;
+		}
+
+		/**
+		 * Activate a single plugin and send feedback about the result to the screen.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $file_path Path within wp-plugins/ to main plugin file.
+		 * @param string $slug      Plugin slug.
+		 * @param bool   $automatic Whether this is an automatic activation after an install. Defaults to false.
+		 *                          This determines the styling of the output messages.
+		 * @return bool False if an error was encountered, true otherwise.
+		 */
+		protected function activate_single_plugin( $file_path, $slug, $automatic = false ) {
+			if ( $this->can_plugin_activate( $slug ) ) {
+				$activate = activate_plugin( $file_path );
+
+				if ( is_wp_error( $activate ) ) {
+					echo '<div id="message" class="error"><p>', wp_kses_post( $activate->get_error_message() ), '</p></div>',
+						'<p><a href="', esc_url( $this->get_tgmpa_url() ), '" target="_parent">', esc_html( $this->strings['return'] ), '</a></p>';
+
+					return false; // End it here if there is an error with activation.
+				} else {
+					if ( ! $automatic ) {
+						// Make sure message doesn't display again if bulk activation is performed
+						// immediately after a single activation.
+						if ( ! isset( $_POST['action'] ) ) { // WPCS: CSRF OK.
+							echo '<div id="message" class="updated"><p>', esc_html( $this->strings['activated_successfully'] ), ' <strong>', esc_html( $this->plugins[ $slug ]['name'] ), '.</strong></p></div>';
+						}
+					} else {
+						// Simpler message layout for use on the plugin install page.
+						echo '<p>', esc_html( $this->strings['plugin_activated'] ), '</p>';
+					}
+				}
+			} elseif ( $this->is_plugin_active( $slug ) ) {
+				// No simpler message format provided as this message should never be encountered
+				// on the plugin install page.
+				echo '<div id="message" class="error"><p>',
+					sprintf(
+						esc_html( $this->strings['plugin_already_active'] ),
+						'<strong>' . esc_html( $this->plugins[ $slug ]['name'] ) . '</strong>'
+					),
+					'</p></div>';
+			} elseif ( $this->does_plugin_require_update( $slug ) ) {
+				if ( ! $automatic ) {
+					// Make sure message doesn't display again if bulk activation is performed
+					// immediately after a single activation.
+					if ( ! isset( $_POST['action'] ) ) { // WPCS: CSRF OK.
+						echo '<div id="message" class="error"><p>',
+							sprintf(
+								esc_html( $this->strings['plugin_needs_higher_version'] ),
+								'<strong>' . esc_html( $this->plugins[ $slug ]['name'] ) . '</strong>'
+							),
+							'</p></div>';
+					}
+				} else {
+					// Simpler message layout for use on the plugin install page.
+					echo '<p>', sprintf( esc_html( $this->strings['plugin_needs_higher_version'] ), esc_html( $this->plugins[ $slug ]['name'] ) ), '</p>';
+				}
+			}
+
+			return true;
+		}
+
+		/**
+		 * Echoes required plugin notice.
+		 *
+		 * Outputs a message telling users that a specific plugin is required for
+		 * their theme. If appropriate, it includes a link to the form page where
+		 * users can install and activate the plugin.
+		 *
+		 * Returns early if we're on the Install page.
+		 *
+		 * @since 1.0.0
+		 *
+		 * @global object $current_screen
+		 *
+		 * @return null Returns early if we're on the Install page.
+		 */
+		public function notices() {
+			// Remove nag on the install page / Return early if the nag message has been dismissed or user < author.
+			if ( ( $this->is_tgmpa_page() || $this->is_core_update_page() ) || get_user_meta( get_current_user_id(), 'tgmpa_dismissed_notice_' . $this->id, true ) || ! current_user_can( apply_filters( 'tgmpa_show_admin_notice_capability', 'publish_posts' ) ) ) {
+				return;
+			}
+
+			// Store for the plugin slugs by message type.
+			$message = array();
+
+			// Initialize counters used to determine plurality of action link texts.
+			$install_link_count          = 0;
+			$update_link_count           = 0;
+			$activate_link_count         = 0;
+			$total_required_action_count = 0;
+
+			foreach ( $this->plugins as $slug => $plugin ) {
+				if ( $this->is_plugin_active( $slug ) && false === $this->does_plugin_have_update( $slug ) ) {
+					continue;
+				}
+
+				if ( ! $this->is_plugin_installed( $slug ) ) {
+					if ( current_user_can( 'install_plugins' ) ) {
+						$install_link_count++;
+
+						if ( true === $plugin['required'] ) {
+							$message['notice_can_install_required'][] = $slug;
+						} else {
+							$message['notice_can_install_recommended'][] = $slug;
+						}
+					}
+					if ( true === $plugin['required'] ) {
+						$total_required_action_count++;
+					}
+				} else {
+					if ( ! $this->is_plugin_active( $slug ) && $this->can_plugin_activate( $slug ) ) {
+						if ( current_user_can( 'activate_plugins' ) ) {
+							$activate_link_count++;
+
+							if ( true === $plugin['required'] ) {
+								$message['notice_can_activate_required'][] = $slug;
+							} else {
+								$message['notice_can_activate_recommended'][] = $slug;
+							}
+						}
+						if ( true === $plugin['required'] ) {
+							$total_required_action_count++;
+						}
+					}
+
+					if ( $this->does_plugin_require_update( $slug ) || false !== $this->does_plugin_have_update( $slug ) ) {
+
+						if ( current_user_can( 'update_plugins' ) ) {
+							$update_link_count++;
+
+							if ( $this->does_plugin_require_update( $slug ) ) {
+								$message['notice_ask_to_update'][] = $slug;
+							} elseif ( false !== $this->does_plugin_have_update( $slug ) ) {
+								$message['notice_ask_to_update_maybe'][] = $slug;
+							}
+						}
+						if ( true === $plugin['required'] ) {
+							$total_required_action_count++;
+						}
+					}
+				}
+			}
+			unset( $slug, $plugin );
+
+			// If we have notices to display, we move forward.
+			if ( ! empty( $message ) || $total_required_action_count > 0 ) {
+				krsort( $message ); // Sort messages.
+				$rendered = '';
+
+				// As add_settings_error() wraps the final message in a <p> and as the final message can't be
+				// filtered, using <p>'s in our html would render invalid html output.
+				$line_template = '<span style="display: block; margin: 0.5em 0.5em 0 0; clear: both;">%s</span>' . "\n";
+
+				if ( ! current_user_can( 'activate_plugins' ) && ! current_user_can( 'install_plugins' ) && ! current_user_can( 'update_plugins' ) ) {
+					$rendered  = esc_html( $this->strings['notice_cannot_install_activate'] ) . ' ' . esc_html( $this->strings['contact_admin'] );
+					$rendered .= $this->create_user_action_links_for_notice( 0, 0, 0, $line_template );
+				} else {
+
+					// If dismissable is false and a message is set, output it now.
+					if ( ! $this->dismissable && ! empty( $this->dismiss_msg ) ) {
+						$rendered .= sprintf( $line_template, wp_kses_post( $this->dismiss_msg ) );
+					}
+
+					// Render the individual message lines for the notice.
+					foreach ( $message as $type => $plugin_group ) {
+						$linked_plugins = array();
+
+						// Get the external info link for a plugin if one is available.
+						foreach ( $plugin_group as $plugin_slug ) {
+							$linked_plugins[] = $this->get_info_link( $plugin_slug );
+						}
+						unset( $plugin_slug );
+
+						$count          = count( $plugin_group );
+						$linked_plugins = array_map( array( 'TGMPA_Utils', 'wrap_in_em' ), $linked_plugins );
+						$last_plugin    = array_pop( $linked_plugins ); // Pop off last name to prep for readability.
+						$imploded       = empty( $linked_plugins ) ? $last_plugin : ( implode( ', ', $linked_plugins ) . ' ' . esc_html_x( 'and', 'plugin A *and* plugin B', 'tgmpa' ) . ' ' . $last_plugin );
+
+						$rendered .= sprintf(
+							$line_template,
+							sprintf(
+								translate_nooped_plural( $this->strings[ $type ], $count, 'tgmpa' ),
+								$imploded,
+								$count
+							)
+						);
+
+					}
+					unset( $type, $plugin_group, $linked_plugins, $count, $last_plugin, $imploded );
+
+					$rendered .= $this->create_user_action_links_for_notice( $install_link_count, $update_link_count, $activate_link_count, $line_template );
+				}
+
+				// Register the nag messages and prepare them to be processed.
+				add_settings_error( 'tgmpa', 'tgmpa', $rendered, $this->get_admin_notice_class() );
+			}
+
+			// Admin options pages already output settings_errors, so this is to avoid duplication.
+			if ( 'options-general' !== $GLOBALS['current_screen']->parent_base ) {
+				$this->display_settings_errors();
+			}
+		}
+
+		/**
+		 * Generate the user action links for the admin notice.
+		 *
+		 * @since 2.6.0
+		 *
+		 * @param int $install_count  Number of plugins to install.
+		 * @param int $update_count   Number of plugins to update.
+		 * @param int $activate_count Number of plugins to activate.
+		 * @param int $line_template  Template for the HTML tag to output a line.
+		 * @return string Action links.
+		 */
+		protected function create_user_action_links_for_notice( $install_count, $update_count, $activate_count, $line_template ) {
+			// Setup action links.
+			$action_links = array(
+				'install'  => '',
+				'update'   => '',
+				'activate' => '',
+				'dismiss'  => $this->dismissable ? '<a href="' . esc_url( wp_nonce_url( add_query_arg( 'tgmpa-dismiss', 'dismiss_admin_notices' ), 'tgmpa-dismiss-' . get_current_user_id() ) ) . '" class="dismiss-notice" target="_parent">' . esc_html( $this->strings['dismiss'] ) . '</a>' : '',
+			);
+
+			$link_template = '<a href="%2$s">%1$s</a>';
+
+			if ( current_user_can( 'install_plugins' ) ) {
+				if ( $install_count > 0 ) {
+					$action_links['install'] = sprintf(
+						$link_template,
+						translate_nooped_plural( $this->strings['install_link'], $install_count, 'tgmpa' ),
+						esc_url( $this->get_tgmpa_status_url( 'install' ) )
+					);
+				}
+				if ( $update_count > 0 ) {
+					$action_links['update'] = sprintf(
+						$link_template,
+						translate_nooped_plural( $this->strings['update_link'], $update_count, 'tgmpa' ),
+						esc_url( $this->get_tgmpa_status_url( 'update' ) )
+					);
+				}
+			}
+
+			if ( current_user_can( 'activate_plugins' ) && $activate_count > 0 ) {
+				$action_links['activate'] = sprintf(
+					$link_template,
+					translate_nooped_plural( $this->strings['activate_link'], $activate_count, 'tgmpa' ),
+					esc_url( $this->get_tgmpa_status_url( 'activate' ) )
+				);
+			}
+
+			$action_links = apply_filters( 'tgmpa_notice_action_links', $action_links );
+
+			$action_links = array_filter( (array) $action_links ); // Remove any empty array items.
+
+			if ( ! empty( $action_links ) ) {
+				$action_links = sprintf( $line_template, implode( ' | ', $action_links ) );
+				return apply_filters( 'tgmpa_notice_rendered_action_links', $action_links );
+			} else {
+				return '';
+			}
+		}
+
+		/**
+		 * Get admin notice class.
+		 *
+		 * Work around all the changes to the various admin notice classes between WP 4.4 and 3.7
+		 * (lowest supported version by TGMPA).
+		 *
+		 * @since 2.6.0
+		 *
+		 * @return string
+		 */
+		protected function get_admin_notice_class() {
+			if ( ! empty( $this->strings['nag_type'] ) ) {
+				return sanitize_html_class( strtolower( $this->strings['nag_type'] ) );
+			} else {
+				if ( version_compare( $this->wp_version, '4.2', '>=' ) ) {
+					return 'notice-warning';
+				} elseif ( version_compare( $this->wp_version, '4.1', '>=' ) ) {
+					return 'notice';
+				} else {
+					return 'updated';
+				}
+			}
+		}
+
+		/**
+		 * Display settings errors and remove those which have been displayed to avoid duplicate messages showing
+		 *
+		 * @since 2.5.0
+		 */
+		protected function display_settings_errors() {
+			global $wp_settings_errors;
+
+			settings_errors( 'tgmpa' );
+
+			foreach ( (array) $wp_settings_errors as $key => $details ) {
+				if ( 'tgmpa' === $details['setting'] ) {
+					unset( $wp_settings_errors[ $key ] );
+					break;
+				}
+			}
+		}
+
+		/**
+		 * Register dismissal of admin notices.
+		 *
+		 * Acts on the dismiss link in the admin nag messages.
+		 * If clicked, the admin notice disappears and will no longer be visible to this user.
+		 *
+		 * @since 2.1.0
+		 */
+		public function dismiss() {
+			if ( isset( $_GET['tgmpa-dismiss'] ) && check_admin_referer( 'tgmpa-dismiss-' . get_current_user_id() ) ) {
+				update_user_meta( get_current_user_id(), 'tgmpa_dismissed_notice_' . $this->id, 1 );
+			}
+		}
+
+		/**
+		 * Add individual plugin to our collection of plugins.
+		 *
+		 * If the required keys are not set or the plugin has already
+		 * been registered, the plugin is not added.
+		 *
+		 * @since 2.0.0
+		 *
+		 * @param array|null $plugin Array of plugin arguments or null if invalid argument.
+		 * @return null Return early if incorrect argument.
+		 */
+		public function register( $plugin ) {
+			if ( empty( $plugin['slug'] ) || empty( $plugin['name'] ) ) {
+				return;
+			}
+
+			if ( empty( $plugin['slug'] ) || ! is_string( $plugin['slug'] ) || isset( $this->plugins[ $plugin['slug'] ] ) ) {
+				return;
+			}
+
+			$defaults = array(
+				'name'               => '',      // String
+				'slug'               => '',      // String
+				'source'             => 'repo',  // String
+				'required'           => false,   // Boolean
+				'version'            => '',      // String
+				'force_activation'   => false,   // Boolean
+				'force_deactivation' => false,   // Boolean
+				'external_url'       => '',      // String
+				'is_callable'        => '',      // String|Array.
+			);
+
+			// Prepare the received data.
+			$plugin = wp_parse_args( $plugin, $defaults );
+
+			// Standardize the received slug.
+			$plugin['slug'] = $this->sanitize_key( $plugin['slug'] );
+
+			// Forgive users for using string versions of booleans or floats for version number.
+			$plugin['version']            = (string) $plugin['version'];
+			$plugin['source']             = empty( $plugin['source'] ) ? 'repo' : $plugin['source'];
+			$plugin['required']           = TGMPA_Utils::validate_bool( $plugin['required'] );
+			$plugin['force_activation']   = TGMPA_Utils::validate_bool( $plugin['force_activation'] );
+			$plugin['force_deactivation'] = TGMPA_Utils::validate_bool( $plugin['force_deactivation'] );
+
+			// Enrich the received data.
+			$plugin['file_path']   = $this->_get_plugin_basename_from_slug( $plugin['slug'] );
+			$plugin['source_type'] = $this->get_plugin_source_type( $plugin['source'] );
+
+			// Set the class properties.
+			$this->plugins[ $plugin['slug'] ]    = $plugin;
+			$this->sort_order[ $plugin['slug'] ] = $plugin['name'];
+
+			// Should we add the force activation hook ?
+			if ( true === $plugin['force_activation'] ) {
+				$this->has_forced_activation = true;
+			}
+
+			// Should we add the force deactivation hook ?
+			if ( true === $plugin['force_deactivation'] ) {
+				$this->has_forced_deactivation = true;
+			}
+		}
+
+		/**
+		 * Determine what type of source the plugin comes from.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $source The source of the plugin as provided, either empty (= WP repo), a file path
+		 *                       (= bundled) or an external URL.
+		 * @return string 'repo', 'external', or 'bundled'
+		 */
+		protected function get_plugin_source_type( $source ) {
+			if ( 'repo' === $source || preg_match( self::WP_REPO_REGEX, $source ) ) {
+				return 'repo';
+			} elseif ( preg_match( self::IS_URL_REGEX, $source ) ) {
+				return 'external';
+			} else {
+				return 'bundled';
+			}
+		}
+
+		/**
+		 * Sanitizes a string key.
+		 *
+		 * Near duplicate of WP Core `sanitize_key()`. The difference is that uppercase characters *are*
+		 * allowed, so as not to break upgrade paths from non-standard bundled plugins using uppercase
+		 * characters in the plugin directory path/slug. Silly them.
+		 *
+		 * @see https://developer.wordpress.org/reference/hooks/sanitize_key/
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $key String key.
+		 * @return string Sanitized key
+		 */
+		public function sanitize_key( $key ) {
+			$raw_key = $key;
+			$key     = preg_replace( '`[^A-Za-z0-9_-]`', '', $key );
+
+			/**
+			 * Filter a sanitized key string.
+			 *
+			 * @since 2.5.0
+			 *
+			 * @param string $key     Sanitized key.
+			 * @param string $raw_key The key prior to sanitization.
+			 */
+			return apply_filters( 'tgmpa_sanitize_key', $key, $raw_key );
+		}
+
+		/**
+		 * Amend default configuration settings.
+		 *
+		 * @since 2.0.0
+		 *
+		 * @param array $config Array of config options to pass as class properties.
+		 */
+		public function config( $config ) {
+			$keys = array(
+				'id',
+				'default_path',
+				'has_notices',
+				'dismissable',
+				'dismiss_msg',
+				'menu',
+				'parent_slug',
+				'capability',
+				'is_automatic',
+				'message',
+				'strings',
+			);
+
+			foreach ( $keys as $key ) {
+				if ( isset( $config[ $key ] ) ) {
+					if ( is_array( $config[ $key ] ) ) {
+						$this->$key = array_merge( $this->$key, $config[ $key ] );
+					} else {
+						$this->$key = $config[ $key ];
+					}
+				}
+			}
+		}
+
+		/**
+		 * Amend action link after plugin installation.
+		 *
+		 * @since 2.0.0
+		 *
+		 * @param array $install_actions Existing array of actions.
+		 * @return false|array Amended array of actions.
+		 */
+		public function actions( $install_actions ) {
+			// Remove action links on the TGMPA install page.
+			if ( $this->is_tgmpa_page() ) {
+				return false;
+			}
+
+			return $install_actions;
+		}
+
+		/**
+		 * Flushes the plugins cache on theme switch to prevent stale entries
+		 * from remaining in the plugin table.
+		 *
+		 * @since 2.4.0
+		 *
+		 * @param bool $clear_update_cache Optional. Whether to clear the Plugin updates cache.
+		 *                                 Parameter added in v2.5.0.
+		 */
+		public function flush_plugins_cache( $clear_update_cache = true ) {
+			wp_clean_plugins_cache( $clear_update_cache );
+		}
+
+		/**
+		 * Set file_path key for each installed plugin.
+		 *
+		 * @since 2.1.0
+		 *
+		 * @param string $plugin_slug Optional. If set, only (re-)populates the file path for that specific plugin.
+		 *                            Parameter added in v2.5.0.
+		 */
+		public function populate_file_path( $plugin_slug = '' ) {
+			if ( ! empty( $plugin_slug ) && is_string( $plugin_slug ) && isset( $this->plugins[ $plugin_slug ] ) ) {
+				$this->plugins[ $plugin_slug ]['file_path'] = $this->_get_plugin_basename_from_slug( $plugin_slug );
+			} else {
+				// Add file_path key for all plugins.
+				foreach ( $this->plugins as $slug => $values ) {
+					$this->plugins[ $slug ]['file_path'] = $this->_get_plugin_basename_from_slug( $slug );
+				}
+			}
+		}
+
+		/**
+		 * Helper function to extract the file path of the plugin file from the
+		 * plugin slug, if the plugin is installed.
+		 *
+		 * @since 2.0.0
+		 *
+		 * @param string $slug Plugin slug (typically folder name) as provided by the developer.
+		 * @return string Either file path for plugin if installed, or just the plugin slug.
+		 */
+		protected function _get_plugin_basename_from_slug( $slug ) {
+			$keys = array_keys( $this->get_plugins() );
+
+			foreach ( $keys as $key ) {
+				if ( preg_match( '|^' . $slug . '/|', $key ) ) {
+					return $key;
+				}
+			}
+
+			return $slug;
+		}
+
+		/**
+		 * Retrieve plugin data, given the plugin name.
+		 *
+		 * Loops through the registered plugins looking for $name. If it finds it,
+		 * it returns the $data from that plugin. Otherwise, returns false.
+		 *
+		 * @since 2.1.0
+		 *
+		 * @param string $name Name of the plugin, as it was registered.
+		 * @param string $data Optional. Array key of plugin data to return. Default is slug.
+		 * @return string|boolean Plugin slug if found, false otherwise.
+		 */
+		public function _get_plugin_data_from_name( $name, $data = 'slug' ) {
+			foreach ( $this->plugins as $values ) {
+				if ( $name === $values['name'] && isset( $values[ $data ] ) ) {
+					return $values[ $data ];
+				}
+			}
+
+			return false;
+		}
+
+		/**
+		 * Retrieve the download URL for a package.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $slug Plugin slug.
+		 * @return string Plugin download URL or path to local file or empty string if undetermined.
+		 */
+		public function get_download_url( $slug ) {
+			$dl_source = '';
+
+			switch ( $this->plugins[ $slug ]['source_type'] ) {
+				case 'repo':
+					return $this->get_wp_repo_download_url( $slug );
+				case 'external':
+					return $this->plugins[ $slug ]['source'];
+				case 'bundled':
+					return $this->default_path . $this->plugins[ $slug ]['source'];
+			}
+
+			return $dl_source; // Should never happen.
+		}
+
+		/**
+		 * Retrieve the download URL for a WP repo package.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $slug Plugin slug.
+		 * @return string Plugin download URL.
+		 */
+		protected function get_wp_repo_download_url( $slug ) {
+			$source = '';
+			$api    = $this->get_plugins_api( $slug );
+
+			if ( false !== $api && isset( $api->download_link ) ) {
+				$source = $api->download_link;
+			}
+
+			return $source;
+		}
+
+		/**
+		 * Try to grab information from WordPress API.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $slug Plugin slug.
+		 * @return object Plugins_api response object on success, WP_Error on failure.
+		 */
+		protected function get_plugins_api( $slug ) {
+			static $api = array(); // Cache received responses.
+
+			if ( ! isset( $api[ $slug ] ) ) {
+				if ( ! function_exists( 'plugins_api' ) ) {
+					require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
+				}
+
+				$response = plugins_api( 'plugin_information', array( 'slug' => $slug, 'fields' => array( 'sections' => false ) ) );
+
+				$api[ $slug ] = false;
+
+				if ( is_wp_error( $response ) ) {
+					wp_die( esc_html( $this->strings['oops'] ) );
+				} else {
+					$api[ $slug ] = $response;
+				}
+			}
+
+			return $api[ $slug ];
+		}
+
+		/**
+		 * Retrieve a link to a plugin information page.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $slug Plugin slug.
+		 * @return string Fully formed html link to a plugin information page if available
+		 *                or the plugin name if not.
+		 */
+		public function get_info_link( $slug ) {
+			if ( ! empty( $this->plugins[ $slug ]['external_url'] ) && preg_match( self::IS_URL_REGEX, $this->plugins[ $slug ]['external_url'] ) ) {
+				$link = sprintf(
+					'<a href="%1$s" target="_blank">%2$s</a>',
+					esc_url( $this->plugins[ $slug ]['external_url'] ),
+					esc_html( $this->plugins[ $slug ]['name'] )
+				);
+			} elseif ( 'repo' === $this->plugins[ $slug ]['source_type'] ) {
+				$url = add_query_arg(
+					array(
+						'tab'       => 'plugin-information',
+						'plugin'    => urlencode( $slug ),
+						'TB_iframe' => 'true',
+						'width'     => '640',
+						'height'    => '500',
+					),
+					self_admin_url( 'plugin-install.php' )
+				);
+
+				$link = sprintf(
+					'<a href="%1$s" class="thickbox">%2$s</a>',
+					esc_url( $url ),
+					esc_html( $this->plugins[ $slug ]['name'] )
+				);
+			} else {
+				$link = esc_html( $this->plugins[ $slug ]['name'] ); // No hyperlink.
+			}
+
+			return $link;
+		}
+
+		/**
+		 * Determine if we're on the TGMPA Install page.
+		 *
+		 * @since 2.1.0
+		 *
+		 * @return boolean True when on the TGMPA page, false otherwise.
+		 */
+		protected function is_tgmpa_page() {
+			return isset( $_GET['page'] ) && $this->menu === $_GET['page'];
+		}
+
+		/**
+		 * Determine if we're on a WP Core installation/upgrade page.
+		 *
+		 * @since 2.6.0
+		 *
+		 * @return boolean True when on a WP Core installation/upgrade page, false otherwise.
+		 */
+		protected function is_core_update_page() {
+			// Current screen is not always available, most notably on the customizer screen.
+			if ( ! function_exists( 'get_current_screen' ) ) {
+				return false;
+			}
+
+			$screen = get_current_screen();
+
+			if ( 'update-core' === $screen->base ) {
+				// Core update screen.
+				return true;
+			} elseif ( 'plugins' === $screen->base && ! empty( $_POST['action'] ) ) { // WPCS: CSRF ok.
+				// Plugins bulk update screen.
+				return true;
+			} elseif ( 'update' === $screen->base && ! empty( $_POST['action'] ) ) { // WPCS: CSRF ok.
+				// Individual updates (ajax call).
+				return true;
+			}
+
+			return false;
+		}
+
+		/**
+		 * Retrieve the URL to the TGMPA Install page.
+		 *
+		 * I.e. depending on the config settings passed something along the lines of:
+		 * http://example.com/wp-admin/themes.php?page=tgmpa-install-plugins
+		 *
+		 * @since 2.5.0
+		 *
+		 * @return string Properly encoded URL (not escaped).
+		 */
+		public function get_tgmpa_url() {
+			static $url;
+
+			if ( ! isset( $url ) ) {
+				$parent = $this->parent_slug;
+				if ( false === strpos( $parent, '.php' ) ) {
+					$parent = 'admin.php';
+				}
+				$url = add_query_arg(
+					array(
+						'page' => urlencode( $this->menu ),
+					),
+					self_admin_url( $parent )
+				);
+			}
+
+			return $url;
+		}
+
+		/**
+		 * Retrieve the URL to the TGMPA Install page for a specific plugin status (view).
+		 *
+		 * I.e. depending on the config settings passed something along the lines of:
+		 * http://example.com/wp-admin/themes.php?page=tgmpa-install-plugins&plugin_status=install
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $status Plugin status - either 'install', 'update' or 'activate'.
+		 * @return string Properly encoded URL (not escaped).
+		 */
+		public function get_tgmpa_status_url( $status ) {
+			return add_query_arg(
+				array(
+					'plugin_status' => urlencode( $status ),
+				),
+				$this->get_tgmpa_url()
+			);
+		}
+
+		/**
+		 * Determine whether there are open actions for plugins registered with TGMPA.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @return bool True if complete, i.e. no outstanding actions. False otherwise.
+		 */
+		public function is_tgmpa_complete() {
+			$complete = true;
+			foreach ( $this->plugins as $slug => $plugin ) {
+				if ( ! $this->is_plugin_active( $slug ) || false !== $this->does_plugin_have_update( $slug ) ) {
+					$complete = false;
+					break;
+				}
+			}
+
+			return $complete;
+		}
+
+		/**
+		 * Check if a plugin is installed. Does not take must-use plugins into account.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $slug Plugin slug.
+		 * @return bool True if installed, false otherwise.
+		 */
+		public function is_plugin_installed( $slug ) {
+			$installed_plugins = $this->get_plugins(); // Retrieve a list of all installed plugins (WP cached).
+
+			return ( ! empty( $installed_plugins[ $this->plugins[ $slug ]['file_path'] ] ) );
+		}
+
+		/**
+		 * Check if a plugin is active.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $slug Plugin slug.
+		 * @return bool True if active, false otherwise.
+		 */
+		public function is_plugin_active( $slug ) {
+			return ( ( ! empty( $this->plugins[ $slug ]['is_callable'] ) && is_callable( $this->plugins[ $slug ]['is_callable'] ) ) || is_plugin_active( $this->plugins[ $slug ]['file_path'] ) );
+		}
+
+		/**
+		 * Check if a plugin can be updated, i.e. if we have information on the minimum WP version required
+		 * available, check whether the current install meets them.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $slug Plugin slug.
+		 * @return bool True if OK to update, false otherwise.
+		 */
+		public function can_plugin_update( $slug ) {
+			// We currently can't get reliable info on non-WP-repo plugins - issue #380.
+			if ( 'repo' !== $this->plugins[ $slug ]['source_type'] ) {
+				return true;
+			}
+
+			$api = $this->get_plugins_api( $slug );
+
+			if ( false !== $api && isset( $api->requires ) ) {
+				return version_compare( $this->wp_version, $api->requires, '>=' );
+			}
+
+			// No usable info received from the plugins API, presume we can update.
+			return true;
+		}
+
+		/**
+		 * Check to see if the plugin is 'updatetable', i.e. installed, with an update available
+		 * and no WP version requirements blocking it.
+		 *
+		 * @since 2.6.0
+		 *
+		 * @param string $slug Plugin slug.
+		 * @return bool True if OK to proceed with update, false otherwise.
+		 */
+		public function is_plugin_updatetable( $slug ) {
+			if ( ! $this->is_plugin_installed( $slug ) ) {
+				return false;
+			} else {
+				return ( false !== $this->does_plugin_have_update( $slug ) && $this->can_plugin_update( $slug ) );
+			}
+		}
+
+		/**
+		 * Check if a plugin can be activated, i.e. is not currently active and meets the minimum
+		 * plugin version requirements set in TGMPA (if any).
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $slug Plugin slug.
+		 * @return bool True if OK to activate, false otherwise.
+		 */
+		public function can_plugin_activate( $slug ) {
+			return ( ! $this->is_plugin_active( $slug ) && ! $this->does_plugin_require_update( $slug ) );
+		}
+
+		/**
+		 * Retrieve the version number of an installed plugin.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $slug Plugin slug.
+		 * @return string Version number as string or an empty string if the plugin is not installed
+		 *                or version unknown (plugins which don't comply with the plugin header standard).
+		 */
+		public function get_installed_version( $slug ) {
+			$installed_plugins = $this->get_plugins(); // Retrieve a list of all installed plugins (WP cached).
+
+			if ( ! empty( $installed_plugins[ $this->plugins[ $slug ]['file_path'] ]['Version'] ) ) {
+				return $installed_plugins[ $this->plugins[ $slug ]['file_path'] ]['Version'];
+			}
+
+			return '';
+		}
+
+		/**
+		 * Check whether a plugin complies with the minimum version requirements.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $slug Plugin slug.
+		 * @return bool True when a plugin needs to be updated, otherwise false.
+		 */
+		public function does_plugin_require_update( $slug ) {
+			$installed_version = $this->get_installed_version( $slug );
+			$minimum_version   = $this->plugins[ $slug ]['version'];
+
+			return version_compare( $minimum_version, $installed_version, '>' );
+		}
+
+		/**
+		 * Check whether there is an update available for a plugin.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $slug Plugin slug.
+		 * @return false|string Version number string of the available update or false if no update available.
+		 */
+		public function does_plugin_have_update( $slug ) {
+			// Presume bundled and external plugins will point to a package which meets the minimum required version.
+			if ( 'repo' !== $this->plugins[ $slug ]['source_type'] ) {
+				if ( $this->does_plugin_require_update( $slug ) ) {
+					return $this->plugins[ $slug ]['version'];
+				}
+
+				return false;
+			}
+
+			$repo_updates = get_site_transient( 'update_plugins' );
+
+			if ( isset( $repo_updates->response[ $this->plugins[ $slug ]['file_path'] ]->new_version ) ) {
+				return $repo_updates->response[ $this->plugins[ $slug ]['file_path'] ]->new_version;
+			}
+
+			return false;
+		}
+
+		/**
+		 * Retrieve potential upgrade notice for a plugin.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $slug Plugin slug.
+		 * @return string The upgrade notice or an empty string if no message was available or provided.
+		 */
+		public function get_upgrade_notice( $slug ) {
+			// We currently can't get reliable info on non-WP-repo plugins - issue #380.
+			if ( 'repo' !== $this->plugins[ $slug ]['source_type'] ) {
+				return '';
+			}
+
+			$repo_updates = get_site_transient( 'update_plugins' );
+
+			if ( ! empty( $repo_updates->response[ $this->plugins[ $slug ]['file_path'] ]->upgrade_notice ) ) {
+				return $repo_updates->response[ $this->plugins[ $slug ]['file_path'] ]->upgrade_notice;
+			}
+
+			return '';
+		}
+
+		/**
+		 * Wrapper around the core WP get_plugins function, making sure it's actually available.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $plugin_folder Optional. Relative path to single plugin folder.
+		 * @return array Array of installed plugins with plugin information.
+		 */
+		public function get_plugins( $plugin_folder = '' ) {
+			if ( ! function_exists( 'get_plugins' ) ) {
+				require_once ABSPATH . 'wp-admin/includes/plugin.php';
+			}
+
+			return get_plugins( $plugin_folder );
+		}
+
+		/**
+		 * Delete dismissable nag option when theme is switched.
+		 *
+		 * This ensures that the user(s) is/are again reminded via nag of required
+		 * and/or recommended plugins if they re-activate the theme.
+		 *
+		 * @since 2.1.1
+		 */
+		public function update_dismiss() {
+			delete_metadata( 'user', null, 'tgmpa_dismissed_notice_' . $this->id, null, true );
+		}
+
+		/**
+		 * Forces plugin activation if the parameter 'force_activation' is
+		 * set to true.
+		 *
+		 * This allows theme authors to specify certain plugins that must be
+		 * active at all times while using the current theme.
+		 *
+		 * Please take special care when using this parameter as it has the
+		 * potential to be harmful if not used correctly. Setting this parameter
+		 * to true will not allow the specified plugin to be deactivated unless
+		 * the user switches themes.
+		 *
+		 * @since 2.2.0
+		 */
+		public function force_activation() {
+			foreach ( $this->plugins as $slug => $plugin ) {
+				if ( true === $plugin['force_activation'] ) {
+					if ( ! $this->is_plugin_installed( $slug ) ) {
+						// Oops, plugin isn't there so iterate to next condition.
+						continue;
+					} elseif ( $this->can_plugin_activate( $slug ) ) {
+						// There we go, activate the plugin.
+						activate_plugin( $plugin['file_path'] );
+					}
+				}
+			}
+		}
+
+		/**
+		 * Forces plugin deactivation if the parameter 'force_deactivation'
+		 * is set to true and adds the plugin to the 'recently active' plugins list.
+		 *
+		 * This allows theme authors to specify certain plugins that must be
+		 * deactivated upon switching from the current theme to another.
+		 *
+		 * Please take special care when using this parameter as it has the
+		 * potential to be harmful if not used correctly.
+		 *
+		 * @since 2.2.0
+		 */
+		public function force_deactivation() {
+			$deactivated = array();
+
+			foreach ( $this->plugins as $slug => $plugin ) {
+				/*
+				 * Only proceed forward if the parameter is set to true and plugin is active
+				 * as a 'normal' (not must-use) plugin.
+				 */
+				if ( true === $plugin['force_deactivation'] && is_plugin_active( $plugin['file_path'] ) ) {
+					deactivate_plugins( $plugin['file_path'] );
+					$deactivated[ $plugin['file_path'] ] = time();
+				}
+			}
+
+			if ( ! empty( $deactivated ) ) {
+				update_option( 'recently_activated', $deactivated + (array) get_option( 'recently_activated' ) );
+			}
+		}
+
+		/**
+		 * Echo the current TGMPA version number to the page.
+		 *
+		 * @since 2.5.0
+		 */
+		public function show_tgmpa_version() {
+			echo '<p style="float: right; padding: 0em 1.5em 0.5em 0;"><strong><small>',
+				esc_html(
+					sprintf(
+						/* translators: %s: version number */
+						__( 'TGMPA v%s', 'tgmpa' ),
+						self::TGMPA_VERSION
+					)
+				),
+				'</small></strong></p>';
+		}
+
+		/**
+		 * Returns the singleton instance of the class.
+		 *
+		 * @since 2.4.0
+		 *
+		 * @return \TGM_Plugin_Activation The TGM_Plugin_Activation object.
+		 */
+		public static function get_instance() {
+			if ( ! isset( self::$instance ) && ! ( self::$instance instanceof self ) ) {
+				self::$instance = new self();
+			}
+
+			return self::$instance;
+		}
+	}
+
+	if ( ! function_exists( 'load_tgm_plugin_activation' ) ) {
+		/**
+		 * Ensure only one instance of the class is ever invoked.
+		 *
+		 * @since 2.5.0
+		 */
+		function load_tgm_plugin_activation() {
+			$GLOBALS['tgmpa'] = TGM_Plugin_Activation::get_instance();
+		}
+	}
+
+	if ( did_action( 'plugins_loaded' ) ) {
+		load_tgm_plugin_activation();
+	} else {
+		add_action( 'plugins_loaded', 'load_tgm_plugin_activation' );
+	}
+}
+
+if ( ! function_exists( 'tgmpa' ) ) {
+	/**
+	 * Helper function to register a collection of required plugins.
+	 *
+	 * @since 2.0.0
+	 * @api
+	 *
+	 * @param array $plugins An array of plugin arrays.
+	 * @param array $config  Optional. An array of configuration values.
+	 */
+	function tgmpa( $plugins, $config = array() ) {
+		$instance = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) );
+
+		foreach ( $plugins as $plugin ) {
+			call_user_func( array( $instance, 'register' ), $plugin );
+		}
+
+		if ( ! empty( $config ) && is_array( $config ) ) {
+			// Send out notices for deprecated arguments passed.
+			if ( isset( $config['notices'] ) ) {
+				_deprecated_argument( __FUNCTION__, '2.2.0', 'The `notices` config parameter was renamed to `has_notices` in TGMPA 2.2.0. Please adjust your configuration.' );
+				if ( ! isset( $config['has_notices'] ) ) {
+					$config['has_notices'] = $config['notices'];
+				}
+			}
+
+			if ( isset( $config['parent_menu_slug'] ) ) {
+				_deprecated_argument( __FUNCTION__, '2.4.0', 'The `parent_menu_slug` config parameter was removed in TGMPA 2.4.0. In TGMPA 2.5.0 an alternative was (re-)introduced. Please adjust your configuration. For more information visit the website: http://tgmpluginactivation.com/configuration/#h-configuration-options.' );
+			}
+			if ( isset( $config['parent_url_slug'] ) ) {
+				_deprecated_argument( __FUNCTION__, '2.4.0', 'The `parent_url_slug` config parameter was removed in TGMPA 2.4.0. In TGMPA 2.5.0 an alternative was (re-)introduced. Please adjust your configuration. For more information visit the website: http://tgmpluginactivation.com/configuration/#h-configuration-options.' );
+			}
+
+			call_user_func( array( $instance, 'config' ), $config );
+		}
+	}
+}
+
+/**
+ * WP_List_Table isn't always available. If it isn't available,
+ * we load it here.
+ *
+ * @since 2.2.0
+ */
+if ( ! class_exists( 'WP_List_Table' ) ) {
+	require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
+}
+
+if ( ! class_exists( 'TGMPA_List_Table' ) ) {
+
+	/**
+	 * List table class for handling plugins.
+	 *
+	 * Extends the WP_List_Table class to provide a future-compatible
+	 * way of listing out all required/recommended plugins.
+	 *
+	 * Gives users an interface similar to the Plugin Administration
+	 * area with similar (albeit stripped down) capabilities.
+	 *
+	 * This class also allows for the bulk install of plugins.
+	 *
+	 * @since 2.2.0
+	 *
+	 * @package TGM-Plugin-Activation
+	 * @author  Thomas Griffin
+	 * @author  Gary Jones
+	 */
+	class TGMPA_List_Table extends WP_List_Table {
+		/**
+		 * TGMPA instance.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @var object
+		 */
+		protected $tgmpa;
+
+		/**
+		 * The currently chosen view.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @var string One of: 'all', 'install', 'update', 'activate'
+		 */
+		public $view_context = 'all';
+
+		/**
+		 * The plugin counts for the various views.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @var array
+		 */
+		protected $view_totals = array(
+			'all'      => 0,
+			'install'  => 0,
+			'update'   => 0,
+			'activate' => 0,
+		);
+
+		/**
+		 * References parent constructor and sets defaults for class.
+		 *
+		 * @since 2.2.0
+		 */
+		public function __construct() {
+			$this->tgmpa = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) );
+
+			parent::__construct(
+				array(
+					'singular' => 'plugin',
+					'plural'   => 'plugins',
+					'ajax'     => false,
+				)
+			);
+
+			if ( isset( $_REQUEST['plugin_status'] ) && in_array( $_REQUEST['plugin_status'], array( 'install', 'update', 'activate' ), true ) ) {
+				$this->view_context = sanitize_key( $_REQUEST['plugin_status'] );
+			}
+
+			add_filter( 'tgmpa_table_data_items', array( $this, 'sort_table_items' ) );
+		}
+
+		/**
+		 * Get a list of CSS classes for the <table> tag.
+		 *
+		 * Overruled to prevent the 'plural' argument from being added.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @return array CSS classnames.
+		 */
+		public function get_table_classes() {
+			return array( 'widefat', 'fixed' );
+		}
+
+		/**
+		 * Gathers and renames all of our plugin information to be used by WP_List_Table to create our table.
+		 *
+		 * @since 2.2.0
+		 *
+		 * @return array $table_data Information for use in table.
+		 */
+		protected function _gather_plugin_data() {
+			// Load thickbox for plugin links.
+			$this->tgmpa->admin_init();
+			$this->tgmpa->thickbox();
+
+			// Categorize the plugins which have open actions.
+			$plugins = $this->categorize_plugins_to_views();
+
+			// Set the counts for the view links.
+			$this->set_view_totals( $plugins );
+
+			// Prep variables for use and grab list of all installed plugins.
+			$table_data = array();
+			$i          = 0;
+
+			// Redirect to the 'all' view if no plugins were found for the selected view context.
+			if ( empty( $plugins[ $this->view_context ] ) ) {
+				$this->view_context = 'all';
+			}
+
+			foreach ( $plugins[ $this->view_context ] as $slug => $plugin ) {
+				$table_data[ $i ]['sanitized_plugin']  = $plugin['name'];
+				$table_data[ $i ]['slug']              = $slug;
+				$table_data[ $i ]['plugin']            = '<strong>' . $this->tgmpa->get_info_link( $slug ) . '</strong>';
+				$table_data[ $i ]['source']            = $this->get_plugin_source_type_text( $plugin['source_type'] );
+				$table_data[ $i ]['type']              = $this->get_plugin_advise_type_text( $plugin['required'] );
+				$table_data[ $i ]['status']            = $this->get_plugin_status_text( $slug );
+				$table_data[ $i ]['installed_version'] = $this->tgmpa->get_installed_version( $slug );
+				$table_data[ $i ]['minimum_version']   = $plugin['version'];
+				$table_data[ $i ]['available_version'] = $this->tgmpa->does_plugin_have_update( $slug );
+
+				// Prep the upgrade notice info.
+				$upgrade_notice = $this->tgmpa->get_upgrade_notice( $slug );
+				if ( ! empty( $upgrade_notice ) ) {
+					$table_data[ $i ]['upgrade_notice'] = $upgrade_notice;
+
+					add_action( "tgmpa_after_plugin_row_{$slug}", array( $this, 'wp_plugin_update_row' ), 10, 2 );
+				}
+
+				$table_data[ $i ] = apply_filters( 'tgmpa_table_data_item', $table_data[ $i ], $plugin );
+
+				$i++;
+			}
+
+			return $table_data;
+		}
+
+		/**
+		 * Categorize the plugins which have open actions into views for the TGMPA page.
+		 *
+		 * @since 2.5.0
+		 */
+		protected function categorize_plugins_to_views() {
+			$plugins = array(
+				'all'      => array(), // Meaning: all plugins which still have open actions.
+				'install'  => array(),
+				'update'   => array(),
+				'activate' => array(),
+			);
+
+			foreach ( $this->tgmpa->plugins as $slug => $plugin ) {
+				if ( $this->tgmpa->is_plugin_active( $slug ) && false === $this->tgmpa->does_plugin_have_update( $slug ) ) {
+					// No need to display plugins if they are installed, up-to-date and active.
+					continue;
+				} else {
+					$plugins['all'][ $slug ] = $plugin;
+
+					if ( ! $this->tgmpa->is_plugin_installed( $slug ) ) {
+						$plugins['install'][ $slug ] = $plugin;
+					} else {
+						if ( false !== $this->tgmpa->does_plugin_have_update( $slug ) ) {
+							$plugins['update'][ $slug ] = $plugin;
+						}
+
+						if ( $this->tgmpa->can_plugin_activate( $slug ) ) {
+							$plugins['activate'][ $slug ] = $plugin;
+						}
+					}
+				}
+			}
+
+			return $plugins;
+		}
+
+		/**
+		 * Set the counts for the view links.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param array $plugins Plugins order by view.
+		 */
+		protected function set_view_totals( $plugins ) {
+			foreach ( $plugins as $type => $list ) {
+				$this->view_totals[ $type ] = count( $list );
+			}
+		}
+
+		/**
+		 * Get the plugin required/recommended text string.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $required Plugin required setting.
+		 * @return string
+		 */
+		protected function get_plugin_advise_type_text( $required ) {
+			if ( true === $required ) {
+				return __( 'Required', 'tgmpa' );
+			}
+
+			return __( 'Recommended', 'tgmpa' );
+		}
+
+		/**
+		 * Get the plugin source type text string.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $type Plugin type.
+		 * @return string
+		 */
+		protected function get_plugin_source_type_text( $type ) {
+			$string = '';
+
+			switch ( $type ) {
+				case 'repo':
+					$string = __( 'WordPress Repository', 'tgmpa' );
+					break;
+				case 'external':
+					$string = __( 'External Source', 'tgmpa' );
+					break;
+				case 'bundled':
+					$string = __( 'Pre-Packaged', 'tgmpa' );
+					break;
+			}
+
+			return $string;
+		}
+
+		/**
+		 * Determine the plugin status message.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $slug Plugin slug.
+		 * @return string
+		 */
+		protected function get_plugin_status_text( $slug ) {
+			if ( ! $this->tgmpa->is_plugin_installed( $slug ) ) {
+				return __( 'Not Installed', 'tgmpa' );
+			}
+
+			if ( ! $this->tgmpa->is_plugin_active( $slug ) ) {
+				$install_status = __( 'Installed But Not Activated', 'tgmpa' );
+			} else {
+				$install_status = __( 'Active', 'tgmpa' );
+			}
+
+			$update_status = '';
+
+			if ( $this->tgmpa->does_plugin_require_update( $slug ) && false === $this->tgmpa->does_plugin_have_update( $slug ) ) {
+				$update_status = __( 'Required Update not Available', 'tgmpa' );
+
+			} elseif ( $this->tgmpa->does_plugin_require_update( $slug ) ) {
+				$update_status = __( 'Requires Update', 'tgmpa' );
+
+			} elseif ( false !== $this->tgmpa->does_plugin_have_update( $slug ) ) {
+				$update_status = __( 'Update recommended', 'tgmpa' );
+			}
+
+			if ( '' === $update_status ) {
+				return $install_status;
+			}
+
+			return sprintf(
+				/* translators: 1: install status, 2: update status */
+				_x( '%1$s, %2$s', 'Install/Update Status', 'tgmpa' ),
+				$install_status,
+				$update_status
+			);
+		}
+
+		/**
+		 * Sort plugins by Required/Recommended type and by alphabetical plugin name within each type.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param array $items Prepared table items.
+		 * @return array Sorted table items.
+		 */
+		public function sort_table_items( $items ) {
+			$type = array();
+			$name = array();
+
+			foreach ( $items as $i => $plugin ) {
+				$type[ $i ] = $plugin['type']; // Required / recommended.
+				$name[ $i ] = $plugin['sanitized_plugin'];
+			}
+
+			array_multisort( $type, SORT_DESC, $name, SORT_ASC, $items );
+
+			return $items;
+		}
+
+		/**
+		 * Get an associative array ( id => link ) of the views available on this table.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @return array
+		 */
+		public function get_views() {
+			$status_links = array();
+
+			foreach ( $this->view_totals as $type => $count ) {
+				if ( $count < 1 ) {
+					continue;
+				}
+
+				switch ( $type ) {
+					case 'all':
+						/* translators: 1: number of plugins. */
+						$text = _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $count, 'plugins', 'tgmpa' );
+						break;
+					case 'install':
+						/* translators: 1: number of plugins. */
+						$text = _n( 'To Install <span class="count">(%s)</span>', 'To Install <span class="count">(%s)</span>', $count, 'tgmpa' );
+						break;
+					case 'update':
+						/* translators: 1: number of plugins. */
+						$text = _n( 'Update Available <span class="count">(%s)</span>', 'Update Available <span class="count">(%s)</span>', $count, 'tgmpa' );
+						break;
+					case 'activate':
+						/* translators: 1: number of plugins. */
+						$text = _n( 'To Activate <span class="count">(%s)</span>', 'To Activate <span class="count">(%s)</span>', $count, 'tgmpa' );
+						break;
+					default:
+						$text = '';
+						break;
+				}
+
+				if ( ! empty( $text ) ) {
+
+					$status_links[ $type ] = sprintf(
+						'<a href="%s"%s>%s</a>',
+						esc_url( $this->tgmpa->get_tgmpa_status_url( $type ) ),
+						( $type === $this->view_context ) ? ' class="current"' : '',
+						sprintf( $text, number_format_i18n( $count ) )
+					);
+				}
+			}
+
+			return $status_links;
+		}
+
+		/**
+		 * Create default columns to display important plugin information
+		 * like type, action and status.
+		 *
+		 * @since 2.2.0
+		 *
+		 * @param array  $item        Array of item data.
+		 * @param string $column_name The name of the column.
+		 * @return string
+		 */
+		public function column_default( $item, $column_name ) {
+			return $item[ $column_name ];
+		}
+
+		/**
+		 * Required for bulk installing.
+		 *
+		 * Adds a checkbox for each plugin.
+		 *
+		 * @since 2.2.0
+		 *
+		 * @param array $item Array of item data.
+		 * @return string The input checkbox with all necessary info.
+		 */
+		public function column_cb( $item ) {
+			return sprintf(
+				'<input type="checkbox" name="%1$s[]" value="%2$s" id="%3$s" />',
+				esc_attr( $this->_args['singular'] ),
+				esc_attr( $item['slug'] ),
+				esc_attr( $item['sanitized_plugin'] )
+			);
+		}
+
+		/**
+		 * Create default title column along with the action links.
+		 *
+		 * @since 2.2.0
+		 *
+		 * @param array $item Array of item data.
+		 * @return string The plugin name and action links.
+		 */
+		public function column_plugin( $item ) {
+			return sprintf(
+				'%1$s %2$s',
+				$item['plugin'],
+				$this->row_actions( $this->get_row_actions( $item ), true )
+			);
+		}
+
+		/**
+		 * Create version information column.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param array $item Array of item data.
+		 * @return string HTML-formatted version information.
+		 */
+		public function column_version( $item ) {
+			$output = array();
+
+			if ( $this->tgmpa->is_plugin_installed( $item['slug'] ) ) {
+				$installed = ! empty( $item['installed_version'] ) ? $item['installed_version'] : _x( 'unknown', 'as in: "version nr unknown"', 'tgmpa' );
+
+				$color = '';
+				if ( ! empty( $item['minimum_version'] ) && $this->tgmpa->does_plugin_require_update( $item['slug'] ) ) {
+					$color = ' color: #ff0000; font-weight: bold;';
+				}
+
+				$output[] = sprintf(
+					'<p><span style="min-width: 32px; text-align: right; float: right;%1$s">%2$s</span>' . __( 'Installed version:', 'tgmpa' ) . '</p>',
+					$color,
+					$installed
+				);
+			}
+
+			if ( ! empty( $item['minimum_version'] ) ) {
+				$output[] = sprintf(
+					'<p><span style="min-width: 32px; text-align: right; float: right;">%1$s</span>' . __( 'Minimum required version:', 'tgmpa' ) . '</p>',
+					$item['minimum_version']
+				);
+			}
+
+			if ( ! empty( $item['available_version'] ) ) {
+				$color = '';
+				if ( ! empty( $item['minimum_version'] ) && version_compare( $item['available_version'], $item['minimum_version'], '>=' ) ) {
+					$color = ' color: #71C671; font-weight: bold;';
+				}
+
+				$output[] = sprintf(
+					'<p><span style="min-width: 32px; text-align: right; float: right;%1$s">%2$s</span>' . __( 'Available version:', 'tgmpa' ) . '</p>',
+					$color,
+					$item['available_version']
+				);
+			}
+
+			if ( empty( $output ) ) {
+				return '&nbsp;'; // Let's not break the table layout.
+			} else {
+				return implode( "\n", $output );
+			}
+		}
+
+		/**
+		 * Sets default message within the plugins table if no plugins
+		 * are left for interaction.
+		 *
+		 * Hides the menu item to prevent the user from clicking and
+		 * getting a permissions error.
+		 *
+		 * @since 2.2.0
+		 */
+		public function no_items() {
+			echo esc_html__( 'No plugins to install, update or activate.', 'tgmpa' ) . ' <a href="' . esc_url( self_admin_url() ) . '"> ' . esc_html__( 'Return to the Dashboard', 'tgmpa' ) . '</a>';
+			echo '<style type="text/css">#adminmenu .wp-submenu li.current { display: none !important; }</style>';
+		}
+
+		/**
+		 * Output all the column information within the table.
+		 *
+		 * @since 2.2.0
+		 *
+		 * @return array $columns The column names.
+		 */
+		public function get_columns() {
+			$columns = array(
+				'cb'     => '<input type="checkbox" />',
+				'plugin' => __( 'Plugin', 'tgmpa' ),
+				'source' => __( 'Source', 'tgmpa' ),
+				'type'   => __( 'Type', 'tgmpa' ),
+			);
+
+			if ( 'all' === $this->view_context || 'update' === $this->view_context ) {
+				$columns['version'] = __( 'Version', 'tgmpa' );
+				$columns['status']  = __( 'Status', 'tgmpa' );
+			}
+
+			return apply_filters( 'tgmpa_table_columns', $columns );
+		}
+
+		/**
+		 * Get name of default primary column
+		 *
+		 * @since 2.5.0 / WP 4.3+ compatibility
+		 * @access protected
+		 *
+		 * @return string
+		 */
+		protected function get_default_primary_column_name() {
+			return 'plugin';
+		}
+
+		/**
+		 * Get the name of the primary column.
+		 *
+		 * @since 2.5.0 / WP 4.3+ compatibility
+		 * @access protected
+		 *
+		 * @return string The name of the primary column.
+		 */
+		protected function get_primary_column_name() {
+			if ( method_exists( 'WP_List_Table', 'get_primary_column_name' ) ) {
+				return parent::get_primary_column_name();
+			} else {
+				return $this->get_default_primary_column_name();
+			}
+		}
+
+		/**
+		 * Get the actions which are relevant for a specific plugin row.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param array $item Array of item data.
+		 * @return array Array with relevant action links.
+		 */
+		protected function get_row_actions( $item ) {
+			$actions      = array();
+			$action_links = array();
+
+			// Display the 'Install' action link if the plugin is not yet available.
+			if ( ! $this->tgmpa->is_plugin_installed( $item['slug'] ) ) {
+				/* translators: %2$s: plugin name in screen reader markup */
+				$actions['install'] = __( 'Install %2$s', 'tgmpa' );
+			} else {
+				// Display the 'Update' action link if an update is available and WP complies with plugin minimum.
+				if ( false !== $this->tgmpa->does_plugin_have_update( $item['slug'] ) && $this->tgmpa->can_plugin_update( $item['slug'] ) ) {
+					/* translators: %2$s: plugin name in screen reader markup */
+					$actions['update'] = __( 'Update %2$s', 'tgmpa' );
+				}
+
+				// Display the 'Activate' action link, but only if the plugin meets the minimum version.
+				if ( $this->tgmpa->can_plugin_activate( $item['slug'] ) ) {
+					/* translators: %2$s: plugin name in screen reader markup */
+					$actions['activate'] = __( 'Activate %2$s', 'tgmpa' );
+				}
+			}
+
+			// Create the actual links.
+			foreach ( $actions as $action => $text ) {
+				$nonce_url = wp_nonce_url(
+					add_query_arg(
+						array(
+							'plugin'           => urlencode( $item['slug'] ),
+							'tgmpa-' . $action => $action . '-plugin',
+						),
+						$this->tgmpa->get_tgmpa_url()
+					),
+					'tgmpa-' . $action,
+					'tgmpa-nonce'
+				);
+
+				$action_links[ $action ] = sprintf(
+					'<a href="%1$s">' . esc_html( $text ) . '</a>', // $text contains the second placeholder.
+					esc_url( $nonce_url ),
+					'<span class="screen-reader-text">' . esc_html( $item['sanitized_plugin'] ) . '</span>'
+				);
+			}
+
+			$prefix = ( defined( 'WP_NETWORK_ADMIN' ) && WP_NETWORK_ADMIN ) ? 'network_admin_' : '';
+			return apply_filters( "tgmpa_{$prefix}plugin_action_links", array_filter( $action_links ), $item['slug'], $item, $this->view_context );
+		}
+
+		/**
+		 * Generates content for a single row of the table.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param object $item The current item.
+		 */
+		public function single_row( $item ) {
+			parent::single_row( $item );
+
+			/**
+			 * Fires after each specific row in the TGMPA Plugins list table.
+			 *
+			 * The dynamic portion of the hook name, `$item['slug']`, refers to the slug
+			 * for the plugin.
+			 *
+			 * @since 2.5.0
+			 */
+			do_action( "tgmpa_after_plugin_row_{$item['slug']}", $item['slug'], $item, $this->view_context );
+		}
+
+		/**
+		 * Show the upgrade notice below a plugin row if there is one.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @see /wp-admin/includes/update.php
+		 *
+		 * @param string $slug Plugin slug.
+		 * @param array  $item The information available in this table row.
+		 * @return null Return early if upgrade notice is empty.
+		 */
+		public function wp_plugin_update_row( $slug, $item ) {
+			if ( empty( $item['upgrade_notice'] ) ) {
+				return;
+			}
+
+			echo '
+				<tr class="plugin-update-tr">
+					<td colspan="', absint( $this->get_column_count() ), '" class="plugin-update colspanchange">
+						<div class="update-message">',
+							esc_html__( 'Upgrade message from the plugin author:', 'tgmpa' ),
+							' <strong>', wp_kses_data( $item['upgrade_notice'] ), '</strong>
+						</div>
+					</td>
+				</tr>';
+		}
+
+		/**
+		 * Extra controls to be displayed between bulk actions and pagination.
+		 *
+		 * @since 2.5.0
+		 *
+		 * @param string $which 'top' or 'bottom' table navigation.
+		 */
+		public function extra_tablenav( $which ) {
+			if ( 'bottom' === $which ) {
+				$this->tgmpa->show_tgmpa_version();
+			}
+		}
+
+		/**
+		 * Defines the bulk actions for handling registered plugins.
+		 *
+		 * @since 2.2.0
+		 *
+		 * @return array $actions The bulk actions for the plugin install table.
+		 */
+		public function get_bulk_actions() {
+
+			$actions = array();
+
+			if ( 'update' !== $this->view_context && 'activate' !== $this->view_context ) {
+				if ( current_user_can( 'install_plugins' ) ) {
+					$actions['tgmpa-bulk-install'] = __( 'Install', 'tgmpa' );
+				}
+			}
+
+			if ( 'install' !== $this->view_context ) {
+				if ( current_user_can( 'update_plugins' ) ) {
+					$actions['tgmpa-bulk-update'] = __( 'Update', 'tgmpa' );
+				}
+				if ( current_user_can( 'activate_plugins' ) ) {
+					$actions['tgmpa-bulk-activate'] = __( 'Activate', 'tgmpa' );
+				}
+			}
+
+			return $actions;
+		}
+
+		/**
+		 * Processes bulk installation and activation actions.
+		 *
+		 * The bulk installation process looks for the $_POST information and passes that
+		 * through if a user has to use WP_Filesystem to enter their credentials.
+		 *
+		 * @since 2.2.0
+		 */
+		public function process_bulk_actions() {
+			// Bulk installation process.
+			if ( 'tgmpa-bulk-install' === $this->current_action() || 'tgmpa-bulk-update' === $this->current_action() ) {
+
+				check_admin_referer( 'bulk-' . $this->_args['plural'] );
+
+				$install_type = 'install';
+				if ( 'tgmpa-bulk-update' === $this->current_action() ) {
+					$install_type = 'update';
+				}
+
+				$plugins_to_install = array();
+
+				// Did user actually select any plugins to install/update ?
+				if ( empty( $_POST['plugin'] ) ) {
+					if ( 'install' === $install_type ) {
+						$message = __( 'No plugins were selected to be installed. No action taken.', 'tgmpa' );
+					} else {
+						$message = __( 'No plugins were selected to be updated. No action taken.', 'tgmpa' );
+					}
+
+					echo '<div id="message" class="error"><p>', esc_html( $message ), '</p></div>';
+
+					return false;
+				}
+
+				if ( is_array( $_POST['plugin'] ) ) {
+					$plugins_to_install = (array) $_POST['plugin'];
+				} elseif ( is_string( $_POST['plugin'] ) ) {
+					// Received via Filesystem page - un-flatten array (WP bug #19643).
+					$plugins_to_install = explode( ',', $_POST['plugin'] );
+				}
+
+				// Sanitize the received input.
+				$plugins_to_install = array_map( 'urldecode', $plugins_to_install );
+				$plugins_to_install = array_map( array( $this->tgmpa, 'sanitize_key' ), $plugins_to_install );
+
+				// Validate the received input.
+				foreach ( $plugins_to_install as $key => $slug ) {
+					// Check if the plugin was registered with TGMPA and remove if not.
+					if ( ! isset( $this->tgmpa->plugins[ $slug ] ) ) {
+						unset( $plugins_to_install[ $key ] );
+						continue;
+					}
+
+					// For install: make sure this is a plugin we *can* install and not one already installed.
+					if ( 'install' === $install_type && true === $this->tgmpa->is_plugin_installed( $slug ) ) {
+						unset( $plugins_to_install[ $key ] );
+					}
+
+					// For updates: make sure this is a plugin we *can* update (update available and WP version ok).
+					if ( 'update' === $install_type && false === $this->tgmpa->is_plugin_updatetable( $slug ) ) {
+						unset( $plugins_to_install[ $key ] );
+					}
+				}
+
+				// No need to proceed further if we have no plugins to handle.
+				if ( empty( $plugins_to_install ) ) {
+					if ( 'install' === $install_type ) {
+						$message = __( 'No plugins are available to be installed at this time.', 'tgmpa' );
+					} else {
+						$message = __( 'No plugins are available to be updated at this time.', 'tgmpa' );
+					}
+
+					echo '<div id="message" class="error"><p>', esc_html( $message ), '</p></div>';
+
+					return false;
+				}
+
+				// Pass all necessary information if WP_Filesystem is needed.
+				$url = wp_nonce_url(
+					$this->tgmpa->get_tgmpa_url(),
+					'bulk-' . $this->_args['plural']
+				);
+
+				// Give validated data back to $_POST which is the only place the filesystem looks for extra fields.
+				$_POST['plugin'] = implode( ',', $plugins_to_install ); // Work around for WP bug #19643.
+
+				$method = ''; // Leave blank so WP_Filesystem can populate it as necessary.
+				$fields = array_keys( $_POST ); // Extra fields to pass to WP_Filesystem.
+
+				if ( false === ( $creds = request_filesystem_credentials( esc_url_raw( $url ), $method, false, false, $fields ) ) ) {
+					return true; // Stop the normal page form from displaying, credential request form will be shown.
+				}
+
+				// Now we have some credentials, setup WP_Filesystem.
+				if ( ! WP_Filesystem( $creds ) ) {
+					// Our credentials were no good, ask the user for them again.
+					request_filesystem_credentials( esc_url_raw( $url ), $method, true, false, $fields );
+
+					return true;
+				}
+
+				/* If we arrive here, we have the filesystem */
+
+				// Store all information in arrays since we are processing a bulk installation.
+				$names      = array();
+				$sources    = array(); // Needed for installs.
+				$file_paths = array(); // Needed for upgrades.
+				$to_inject  = array(); // Information to inject into the update_plugins transient.
+
+				// Prepare the data for validated plugins for the install/upgrade.
+				foreach ( $plugins_to_install as $slug ) {
+					$name   = $this->tgmpa->plugins[ $slug ]['name'];
+					$source = $this->tgmpa->get_download_url( $slug );
+
+					if ( ! empty( $name ) && ! empty( $source ) ) {
+						$names[] = $name;
+
+						switch ( $install_type ) {
+
+							case 'install':
+								$sources[] = $source;
+								break;
+
+							case 'update':
+								$file_paths[]                 = $this->tgmpa->plugins[ $slug ]['file_path'];
+								$to_inject[ $slug ]           = $this->tgmpa->plugins[ $slug ];
+								$to_inject[ $slug ]['source'] = $source;
+								break;
+						}
+					}
+				}
+				unset( $slug, $name, $source );
+
+				// Create a new instance of TGMPA_Bulk_Installer.
+				$installer = new TGMPA_Bulk_Installer(
+					new TGMPA_Bulk_Installer_Skin(
+						array(
+							'url'          => esc_url_raw( $this->tgmpa->get_tgmpa_url() ),
+							'nonce'        => 'bulk-' . $this->_args['plural'],
+							'names'        => $names,
+							'install_type' => $install_type,
+						)
+					)
+				);
+
+				// Wrap the install process with the appropriate HTML.
+				echo '<div class="tgmpa">',
+					'<h2 style="font-size: 23px; font-weight: 400; line-height: 29px; margin: 0; padding: 9px 15px 4px 0;">', esc_html( get_admin_page_title() ), '</h2>
+					<div class="update-php" style="width: 100%; height: 98%; min-height: 850px; padding-top: 1px;">';
+
+				// Process the bulk installation submissions.
+				add_filter( 'upgrader_source_selection', array( $this->tgmpa, 'maybe_adjust_source_dir' ), 1, 3 );
+
+				if ( 'tgmpa-bulk-update' === $this->current_action() ) {
+					// Inject our info into the update transient.
+					$this->tgmpa->inject_update_info( $to_inject );
+
+					$installer->bulk_upgrade( $file_paths );
+				} else {
+					$installer->bulk_install( $sources );
+				}
+
+				remove_filter( 'upgrader_source_selection', array( $this->tgmpa, 'maybe_adjust_source_dir' ), 1 );
+
+				echo '</div></div>';
+
+				return true;
+			}
+
+			// Bulk activation process.
+			if ( 'tgmpa-bulk-activate' === $this->current_action() ) {
+				check_admin_referer( 'bulk-' . $this->_args['plural'] );
+
+				// Did user actually select any plugins to activate ?
+				if ( empty( $_POST['plugin'] ) ) {
+					echo '<div id="message" class="error"><p>', esc_html__( 'No plugins were selected to be activated. No action taken.', 'tgmpa' ), '</p></div>';
+
+					return false;
+				}
+
+				// Grab plugin data from $_POST.
+				$plugins = array();
+				if ( isset( $_POST['plugin'] ) ) {
+					$plugins = array_map( 'urldecode', (array) $_POST['plugin'] );
+					$plugins = array_map( array( $this->tgmpa, 'sanitize_key' ), $plugins );
+				}
+
+				$plugins_to_activate = array();
+				$plugin_names        = array();
+
+				// Grab the file paths for the selected & inactive plugins from the registration array.
+				foreach ( $plugins as $slug ) {
+					if ( $this->tgmpa->can_plugin_activate( $slug ) ) {
+						$plugins_to_activate[] = $this->tgmpa->plugins[ $slug ]['file_path'];
+						$plugin_names[]        = $this->tgmpa->plugins[ $slug ]['name'];
+					}
+				}
+				unset( $slug );
+
+				// Return early if there are no plugins to activate.
+				if ( empty( $plugins_to_activate ) ) {
+					echo '<div id="message" class="error"><p>', esc_html__( 'No plugins are available to be activated at this time.', 'tgmpa' ), '</p></div>';
+
+					return false;
+				}
+
+				// Now we are good to go - let's start activating plugins.
+				$activate = activate_plugins( $plugins_to_activate );
+
+				if ( is_wp_error( $activate ) ) {
+					echo '<div id="message" class="error"><p>', wp_kses_post( $activate->get_error_message() ), '</p></div>';
+				} else {
+					$count        = count( $plugin_names ); // Count so we can use _n function.
+					$plugin_names = array_map( array( 'TGMPA_Utils', 'wrap_in_strong' ), $plugin_names );
+					$last_plugin  = array_pop( $plugin_names ); // Pop off last name to prep for readability.
+					$imploded     = empty( $plugin_names ) ? $last_plugin : ( implode( ', ', $plugin_names ) . ' ' . esc_html_x( 'and', 'plugin A *and* plugin B', 'tgmpa' ) . ' ' . $last_plugin );
+
+					printf( // WPCS: xss ok.
+						'<div id="message" class="updated"><p>%1$s %2$s.</p></div>',
+						esc_html( _n( 'The following plugin was activated successfully:', 'The following plugins were activated successfully:', $count, 'tgmpa' ) ),
+						$imploded
+					);
+
+					// Update recently activated plugins option.
+					$recent = (array) get_option( 'recently_activated' );
+					foreach ( $plugins_to_activate as $plugin => $time ) {
+						if ( isset( $recent[ $plugin ] ) ) {
+							unset( $recent[ $plugin ] );
+						}
+					}
+					update_option( 'recently_activated', $recent );
+				}
+
+				unset( $_POST ); // Reset the $_POST variable in case user wants to perform one action after another.
+
+				return true;
+			}
+
+			return false;
+		}
+
+		/**
+		 * Prepares all of our information to be outputted into a usable table.
+		 *
+		 * @since 2.2.0
+		 */
+		public function prepare_items() {
+			$columns               = $this->get_columns(); // Get all necessary column information.
+			$hidden                = array(); // No columns to hide, but we must set as an array.
+			$sortable              = array(); // No reason to make sortable columns.
+			$primary               = $this->get_primary_column_name(); // Column which has the row actions.
+			$this->_column_headers = array( $columns, $hidden, $sortable, $primary ); // Get all necessary column headers.
+
+			// Process our bulk activations here.
+			if ( 'tgmpa-bulk-activate' === $this->current_action() ) {
+				$this->process_bulk_actions();
+			}
+
+			// Store all of our plugin data into $items array so WP_List_Table can use it.
+			$this->items = apply_filters( 'tgmpa_table_data_items', $this->_gather_plugin_data() );
+		}
+
+		/* *********** DEPRECATED METHODS *********** */
+
+		/**
+		 * Retrieve plugin data, given the plugin name.
+		 *
+		 * @since      2.2.0
+		 * @deprecated 2.5.0 use {@see TGM_Plugin_Activation::_get_plugin_data_from_name()} instead.
+		 * @see        TGM_Plugin_Activation::_get_plugin_data_from_name()
+		 *
+		 * @param string $name Name of the plugin, as it was registered.
+		 * @param string $data Optional. Array key of plugin data to return. Default is slug.
+		 * @return string|boolean Plugin slug if found, false otherwise.
+		 */
+		protected function _get_plugin_data_from_name( $name, $data = 'slug' ) {
+			_deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'TGM_Plugin_Activation::_get_plugin_data_from_name()' );
+
+			return $this->tgmpa->_get_plugin_data_from_name( $name, $data );
+		}
+	}
+}
+
+
+if ( ! class_exists( 'TGM_Bulk_Installer' ) ) {
+
+	/**
+	 * Hack: Prevent TGMPA v2.4.1- bulk installer class from being loaded if 2.4.1- is loaded after 2.5+.
+	 *
+	 * @since 2.5.2
+	 *
+	 * {@internal The TGMPA_Bulk_Installer class was originally called TGM_Bulk_Installer.
+	 *            For more information, see that class.}}
+	 */
+	class TGM_Bulk_Installer {
+	}
+}
+if ( ! class_exists( 'TGM_Bulk_Installer_Skin' ) ) {
+
+	/**
+	 * Hack: Prevent TGMPA v2.4.1- bulk installer skin class from being loaded if 2.4.1- is loaded after 2.5+.
+	 *
+	 * @since 2.5.2
+	 *
+	 * {@internal The TGMPA_Bulk_Installer_Skin class was originally called TGM_Bulk_Installer_Skin.
+	 *            For more information, see that class.}}
+	 */
+	class TGM_Bulk_Installer_Skin {
+	}
+}
+
+/**
+ * The WP_Upgrader file isn't always available. If it isn't available,
+ * we load it here.
+ *
+ * We check to make sure no action or activation keys are set so that WordPress
+ * does not try to re-include the class when processing upgrades or installs outside
+ * of the class.
+ *
+ * @since 2.2.0
+ */
+add_action( 'admin_init', 'tgmpa_load_bulk_installer' );
+if ( ! function_exists( 'tgmpa_load_bulk_installer' ) ) {
+	/**
+	 * Load bulk installer
+	 */
+	function tgmpa_load_bulk_installer() {
+		// Silently fail if 2.5+ is loaded *after* an older version.
+		if ( ! isset( $GLOBALS['tgmpa'] ) ) {
+			return;
+		}
+
+		// Get TGMPA class instance.
+		$tgmpa_instance = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) );
+
+		if ( isset( $_GET['page'] ) && $tgmpa_instance->menu === $_GET['page'] ) {
+			if ( ! class_exists( 'Plugin_Upgrader', false ) ) {
+				require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
+			}
+
+			if ( ! class_exists( 'TGMPA_Bulk_Installer' ) ) {
+
+				/**
+				 * Installer class to handle bulk plugin installations.
+				 *
+				 * Extends WP_Upgrader and customizes to suit the installation of multiple
+				 * plugins.
+				 *
+				 * @since 2.2.0
+				 *
+				 * {@internal Since 2.5.0 the class is an extension of Plugin_Upgrader rather than WP_Upgrader.}}
+				 * {@internal Since 2.5.2 the class has been renamed from TGM_Bulk_Installer to TGMPA_Bulk_Installer.
+				 *            This was done to prevent backward compatibility issues with v2.3.6.}}
+				 *
+				 * @package TGM-Plugin-Activation
+				 * @author  Thomas Griffin
+				 * @author  Gary Jones
+				 */
+				class TGMPA_Bulk_Installer extends Plugin_Upgrader {
+					/**
+					 * Holds result of bulk plugin installation.
+					 *
+					 * @since 2.2.0
+					 *
+					 * @var string
+					 */
+					public $result;
+
+					/**
+					 * Flag to check if bulk installation is occurring or not.
+					 *
+					 * @since 2.2.0
+					 *
+					 * @var boolean
+					 */
+					public $bulk = false;
+
+					/**
+					 * TGMPA instance
+					 *
+					 * @since 2.5.0
+					 *
+					 * @var object
+					 */
+					protected $tgmpa;
+
+					/**
+					 * Whether or not the destination directory needs to be cleared ( = on update).
+					 *
+					 * @since 2.5.0
+					 *
+					 * @var bool
+					 */
+					protected $clear_destination = false;
+
+					/**
+					 * References parent constructor and sets defaults for class.
+					 *
+					 * @since 2.2.0
+					 *
+					 * @param \Bulk_Upgrader_Skin|null $skin Installer skin.
+					 */
+					public function __construct( $skin = null ) {
+						// Get TGMPA class instance.
+						$this->tgmpa = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) );
+
+						parent::__construct( $skin );
+
+						if ( isset( $this->skin->options['install_type'] ) && 'update' === $this->skin->options['install_type'] ) {
+							$this->clear_destination = true;
+						}
+
+						if ( $this->tgmpa->is_automatic ) {
+							$this->activate_strings();
+						}
+
+						add_action( 'upgrader_process_complete', array( $this->tgmpa, 'populate_file_path' ) );
+					}
+
+					/**
+					 * Sets the correct activation strings for the installer skin to use.
+					 *
+					 * @since 2.2.0
+					 */
+					public function activate_strings() {
+						$this->strings['activation_failed']  = __( 'Plugin activation failed.', 'tgmpa' );
+						$this->strings['activation_success'] = __( 'Plugin activated successfully.', 'tgmpa' );
+					}
+
+					/**
+					 * Performs the actual installation of each plugin.
+					 *
+					 * @since 2.2.0
+					 *
+					 * @see WP_Upgrader::run()
+					 *
+					 * @param array $options The installation config options.
+					 * @return null|array Return early if error, array of installation data on success.
+					 */
+					public function run( $options ) {
+						$result = parent::run( $options );
+
+						// Reset the strings in case we changed one during automatic activation.
+						if ( $this->tgmpa->is_automatic ) {
+							if ( 'update' === $this->skin->options['install_type'] ) {
+								$this->upgrade_strings();
+							} else {
+								$this->install_strings();
+							}
+						}
+
+						return $result;
+					}
+
+					/**
+					 * Processes the bulk installation of plugins.
+					 *
+					 * @since 2.2.0
+					 *
+					 * {@internal This is basically a near identical copy of the WP Core
+					 * Plugin_Upgrader::bulk_upgrade() method, with minor adjustments to deal with
+					 * new installs instead of upgrades.
+					 * For ease of future synchronizations, the adjustments are clearly commented, but no other
+					 * comments are added. Code style has been made to comply.}}
+					 *
+					 * @see Plugin_Upgrader::bulk_upgrade()
+					 * @see https://core.trac.wordpress.org/browser/tags/4.2.1/src/wp-admin/includes/class-wp-upgrader.php#L838
+					 * (@internal Last synced: Dec 31st 2015 against https://core.trac.wordpress.org/browser/trunk?rev=36134}}
+					 *
+					 * @param array $plugins The plugin sources needed for installation.
+					 * @param array $args    Arbitrary passed extra arguments.
+					 * @return array|false   Install confirmation messages on success, false on failure.
+					 */
+					public function bulk_install( $plugins, $args = array() ) {
+						// [TGMPA + ] Hook auto-activation in.
+						add_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 );
+
+						$defaults    = array(
+							'clear_update_cache' => true,
+						);
+						$parsed_args = wp_parse_args( $args, $defaults );
+
+						$this->init();
+						$this->bulk = true;
+
+						$this->install_strings(); // [TGMPA + ] adjusted.
+
+						/* [TGMPA - ] $current = get_site_transient( 'update_plugins' ); */
+
+						/* [TGMPA - ] add_filter('upgrader_clear_destination', array($this, 'delete_old_plugin'), 10, 4); */
+
+						$this->skin->header();
+
+						// Connect to the Filesystem first.
+						$res = $this->fs_connect( array( WP_CONTENT_DIR, WP_PLUGIN_DIR ) );
+						if ( ! $res ) {
+							$this->skin->footer();
+							return false;
+						}
+
+						$this->skin->bulk_header();
+
+						/*
+						 * Only start maintenance mode if:
+						 * - running Multisite and there are one or more plugins specified, OR
+						 * - a plugin with an update available is currently active.
+						 * @TODO: For multisite, maintenance mode should only kick in for individual sites if at all possible.
+						 */
+						$maintenance = ( is_multisite() && ! empty( $plugins ) );
+
+						/*
+						[TGMPA - ]
+						foreach ( $plugins as $plugin )
+							$maintenance = $maintenance || ( is_plugin_active( $plugin ) && isset( $current->response[ $plugin] ) );
+						*/
+						if ( $maintenance ) {
+							$this->maintenance_mode( true );
+						}
+
+						$results = array();
+
+						$this->update_count   = count( $plugins );
+						$this->update_current = 0;
+						foreach ( $plugins as $plugin ) {
+							$this->update_current++;
+
+							/*
+							[TGMPA - ]
+							$this->skin->plugin_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin, false, true);
+
+							if ( !isset( $current->response[ $plugin ] ) ) {
+								$this->skin->set_result('up_to_date');
+								$this->skin->before();
+								$this->skin->feedback('up_to_date');
+								$this->skin->after();
+								$results[$plugin] = true;
+								continue;
+							}
+
+							// Get the URL to the zip file.
+							$r = $current->response[ $plugin ];
+
+							$this->skin->plugin_active = is_plugin_active($plugin);
+							*/
+
+							$result = $this->run(
+								array(
+									'package'           => $plugin, // [TGMPA + ] adjusted.
+									'destination'       => WP_PLUGIN_DIR,
+									'clear_destination' => false, // [TGMPA + ] adjusted.
+									'clear_working'     => true,
+									'is_multi'          => true,
+									'hook_extra'        => array(
+										'plugin' => $plugin,
+									),
+								)
+							);
+
+							$results[ $plugin ] = $this->result;
+
+							// Prevent credentials auth screen from displaying multiple times.
+							if ( false === $result ) {
+								break;
+							}
+						} //end foreach $plugins
+
+						$this->maintenance_mode( false );
+
+						/**
+						 * Fires when the bulk upgrader process is complete.
+						 *
+						 * @since WP 3.6.0 / TGMPA 2.5.0
+						 *
+						 * @param Plugin_Upgrader $this Plugin_Upgrader instance. In other contexts, $this, might
+						 *                              be a Theme_Upgrader or Core_Upgrade instance.
+						 * @param array           $data {
+						 *     Array of bulk item update data.
+						 *
+						 *     @type string $action   Type of action. Default 'update'.
+						 *     @type string $type     Type of update process. Accepts 'plugin', 'theme', or 'core'.
+						 *     @type bool   $bulk     Whether the update process is a bulk update. Default true.
+						 *     @type array  $packages Array of plugin, theme, or core packages to update.
+						 * }
+						 */
+						do_action( 'upgrader_process_complete', $this, array(
+							'action'  => 'install', // [TGMPA + ] adjusted.
+							'type'    => 'plugin',
+							'bulk'    => true,
+							'plugins' => $plugins,
+						) );
+
+						$this->skin->bulk_footer();
+
+						$this->skin->footer();
+
+						// Cleanup our hooks, in case something else does a upgrade on this connection.
+						/* [TGMPA - ] remove_filter('upgrader_clear_destination', array($this, 'delete_old_plugin')); */
+
+						// [TGMPA + ] Remove our auto-activation hook.
+						remove_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 );
+
+						// Force refresh of plugin update information.
+						wp_clean_plugins_cache( $parsed_args['clear_update_cache'] );
+
+						return $results;
+					}
+
+					/**
+					 * Handle a bulk upgrade request.
+					 *
+					 * @since 2.5.0
+					 *
+					 * @see Plugin_Upgrader::bulk_upgrade()
+					 *
+					 * @param array $plugins The local WP file_path's of the plugins which should be upgraded.
+					 * @param array $args    Arbitrary passed extra arguments.
+					 * @return string|bool Install confirmation messages on success, false on failure.
+					 */
+					public function bulk_upgrade( $plugins, $args = array() ) {
+
+						add_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 );
+
+						$result = parent::bulk_upgrade( $plugins, $args );
+
+						remove_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 );
+
+						return $result;
+					}
+
+					/**
+					 * Abuse a filter to auto-activate plugins after installation.
+					 *
+					 * Hooked into the 'upgrader_post_install' filter hook.
+					 *
+					 * @since 2.5.0
+					 *
+					 * @param bool $bool The value we need to give back (true).
+					 * @return bool
+					 */
+					public function auto_activate( $bool ) {
+						// Only process the activation of installed plugins if the automatic flag is set to true.
+						if ( $this->tgmpa->is_automatic ) {
+							// Flush plugins cache so the headers of the newly installed plugins will be read correctly.
+							wp_clean_plugins_cache();
+
+							// Get the installed plugin file.
+							$plugin_info = $this->plugin_info();
+
+							// Don't try to activate on upgrade of active plugin as WP will do this already.
+							if ( ! is_plugin_active( $plugin_info ) ) {
+								$activate = activate_plugin( $plugin_info );
+
+								// Adjust the success string based on the activation result.
+								$this->strings['process_success'] = $this->strings['process_success'] . "<br />\n";
+
+								if ( is_wp_error( $activate ) ) {
+									$this->skin->error( $activate );
+									$this->strings['process_success'] .= $this->strings['activation_failed'];
+								} else {
+									$this->strings['process_success'] .= $this->strings['activation_success'];
+								}
+							}
+						}
+
+						return $bool;
+					}
+				}
+			}
+
+			if ( ! class_exists( 'TGMPA_Bulk_Installer_Skin' ) ) {
+
+				/**
+				 * Installer skin to set strings for the bulk plugin installations..
+				 *
+				 * Extends Bulk_Upgrader_Skin and customizes to suit the installation of multiple
+				 * plugins.
+				 *
+				 * @since 2.2.0
+				 *
+				 * {@internal Since 2.5.2 the class has been renamed from TGM_Bulk_Installer_Skin to
+				 *            TGMPA_Bulk_Installer_Skin.
+				 *            This was done to prevent backward compatibility issues with v2.3.6.}}
+				 *
+				 * @see https://core.trac.wordpress.org/browser/trunk/src/wp-admin/includes/class-wp-upgrader-skins.php
+				 *
+				 * @package TGM-Plugin-Activation
+				 * @author  Thomas Griffin
+				 * @author  Gary Jones
+				 */
+				class TGMPA_Bulk_Installer_Skin extends Bulk_Upgrader_Skin {
+					/**
+					 * Holds plugin info for each individual plugin installation.
+					 *
+					 * @since 2.2.0
+					 *
+					 * @var array
+					 */
+					public $plugin_info = array();
+
+					/**
+					 * Holds names of plugins that are undergoing bulk installations.
+					 *
+					 * @since 2.2.0
+					 *
+					 * @var array
+					 */
+					public $plugin_names = array();
+
+					/**
+					 * Integer to use for iteration through each plugin installation.
+					 *
+					 * @since 2.2.0
+					 *
+					 * @var integer
+					 */
+					public $i = 0;
+
+					/**
+					 * TGMPA instance
+					 *
+					 * @since 2.5.0
+					 *
+					 * @var object
+					 */
+					protected $tgmpa;
+
+					/**
+					 * Constructor. Parses default args with new ones and extracts them for use.
+					 *
+					 * @since 2.2.0
+					 *
+					 * @param array $args Arguments to pass for use within the class.
+					 */
+					public function __construct( $args = array() ) {
+						// Get TGMPA class instance.
+						$this->tgmpa = call_user_func( array( get_class( $GLOBALS['tgmpa'] ), 'get_instance' ) );
+
+						// Parse default and new args.
+						$defaults = array(
+							'url'          => '',
+							'nonce'        => '',
+							'names'        => array(),
+							'install_type' => 'install',
+						);
+						$args     = wp_parse_args( $args, $defaults );
+
+						// Set plugin names to $this->plugin_names property.
+						$this->plugin_names = $args['names'];
+
+						// Extract the new args.
+						parent::__construct( $args );
+					}
+
+					/**
+					 * Sets install skin strings for each individual plugin.
+					 *
+					 * Checks to see if the automatic activation flag is set and uses the
+					 * the proper strings accordingly.
+					 *
+					 * @since 2.2.0
+					 */
+					public function add_strings() {
+						if ( 'update' === $this->options['install_type'] ) {
+							parent::add_strings();
+							/* translators: 1: plugin name, 2: action number 3: total number of actions. */
+							$this->upgrader->strings['skin_before_update_header'] = __( 'Updating Plugin %1$s (%2$d/%3$d)', 'tgmpa' );
+						} else {
+							/* translators: 1: plugin name, 2: error message. */
+							$this->upgrader->strings['skin_update_failed_error'] = __( 'An error occurred while installing %1$s: <strong>%2$s</strong>.', 'tgmpa' );
+							/* translators: 1: plugin name. */
+							$this->upgrader->strings['skin_update_failed'] = __( 'The installation of %1$s failed.', 'tgmpa' );
+
+							if ( $this->tgmpa->is_automatic ) {
+								// Automatic activation strings.
+								$this->upgrader->strings['skin_upgrade_start'] = __( 'The installation and activation process is starting. This process may take a while on some hosts, so please be patient.', 'tgmpa' );
+								/* translators: 1: plugin name. */
+								$this->upgrader->strings['skin_update_successful'] = __( '%1$s installed and activated successfully.', 'tgmpa' ) . ' <a href="#" class="hide-if-no-js" onclick="%2$s"><span>' . esc_html__( 'Show Details', 'tgmpa' ) . '</span><span class="hidden">' . esc_html__( 'Hide Details', 'tgmpa' ) . '</span>.</a>';
+								$this->upgrader->strings['skin_upgrade_end']       = __( 'All installations and activations have been completed.', 'tgmpa' );
+								/* translators: 1: plugin name, 2: action number 3: total number of actions. */
+								$this->upgrader->strings['skin_before_update_header'] = __( 'Installing and Activating Plugin %1$s (%2$d/%3$d)', 'tgmpa' );
+							} else {
+								// Default installation strings.
+								$this->upgrader->strings['skin_upgrade_start'] = __( 'The installation process is starting. This process may take a while on some hosts, so please be patient.', 'tgmpa' );
+								/* translators: 1: plugin name. */
+								$this->upgrader->strings['skin_update_successful'] = esc_html__( '%1$s installed successfully.', 'tgmpa' ) . ' <a href="#" class="hide-if-no-js" onclick="%2$s"><span>' . esc_html__( 'Show Details', 'tgmpa' ) . '</span><span class="hidden">' . esc_html__( 'Hide Details', 'tgmpa' ) . '</span>.</a>';
+								$this->upgrader->strings['skin_upgrade_end']       = __( 'All installations have been completed.', 'tgmpa' );
+								/* translators: 1: plugin name, 2: action number 3: total number of actions. */
+								$this->upgrader->strings['skin_before_update_header'] = __( 'Installing Plugin %1$s (%2$d/%3$d)', 'tgmpa' );
+							}
+						}
+					}
+
+					/**
+					 * Outputs the header strings and necessary JS before each plugin installation.
+					 *
+					 * @since 2.2.0
+					 *
+					 * @param string $title Unused in this implementation.
+					 */
+					public function before( $title = '' ) {
+						if ( empty( $title ) ) {
+							$title = esc_html( $this->plugin_names[ $this->i ] );
+						}
+						parent::before( $title );
+					}
+
+					/**
+					 * Outputs the footer strings and necessary JS after each plugin installation.
+					 *
+					 * Checks for any errors and outputs them if they exist, else output
+					 * success strings.
+					 *
+					 * @since 2.2.0
+					 *
+					 * @param string $title Unused in this implementation.
+					 */
+					public function after( $title = '' ) {
+						if ( empty( $title ) ) {
+							$title = esc_html( $this->plugin_names[ $this->i ] );
+						}
+						parent::after( $title );
+
+						$this->i++;
+					}
+
+					/**
+					 * Outputs links after bulk plugin installation is complete.
+					 *
+					 * @since 2.2.0
+					 */
+					public function bulk_footer() {
+						// Serve up the string to say installations (and possibly activations) are complete.
+						parent::bulk_footer();
+
+						// Flush plugins cache so we can make sure that the installed plugins list is always up to date.
+						wp_clean_plugins_cache();
+
+						$this->tgmpa->show_tgmpa_version();
+
+						// Display message based on if all plugins are now active or not.
+						$update_actions = array();
+
+						if ( $this->tgmpa->is_tgmpa_complete() ) {
+							// All plugins are active, so we display the complete string and hide the menu to protect users.
+							echo '<style type="text/css">#adminmenu .wp-submenu li.current { display: none !important; }</style>';
+							$update_actions['dashboard'] = sprintf(
+								esc_html( $this->tgmpa->strings['complete'] ),
+								'<a href="' . esc_url( self_admin_url() ) . '">' . esc_html__( 'Return to the Dashboard', 'tgmpa' ) . '</a>'
+							);
+						} else {
+							$update_actions['tgmpa_page'] = '<a href="' . esc_url( $this->tgmpa->get_tgmpa_url() ) . '" target="_parent">' . esc_html( $this->tgmpa->strings['return'] ) . '</a>';
+						}
+
+						/**
+						 * Filter the list of action links available following bulk plugin installs/updates.
+						 *
+						 * @since 2.5.0
+						 *
+						 * @param array $update_actions Array of plugin action links.
+						 * @param array $plugin_info    Array of information for the last-handled plugin.
+						 */
+						$update_actions = apply_filters( 'tgmpa_update_bulk_plugins_complete_actions', $update_actions, $this->plugin_info );
+
+						if ( ! empty( $update_actions ) ) {
+							$this->feedback( implode( ' | ', (array) $update_actions ) );
+						}
+					}
+
+					/* *********** DEPRECATED METHODS *********** */
+
+					/**
+					 * Flush header output buffer.
+					 *
+					 * @since      2.2.0
+					 * @deprecated 2.5.0 use {@see Bulk_Upgrader_Skin::flush_output()} instead
+					 * @see        Bulk_Upgrader_Skin::flush_output()
+					 */
+					public function before_flush_output() {
+						_deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'Bulk_Upgrader_Skin::flush_output()' );
+						$this->flush_output();
+					}
+
+					/**
+					 * Flush footer output buffer and iterate $this->i to make sure the
+					 * installation strings reference the correct plugin.
+					 *
+					 * @since      2.2.0
+					 * @deprecated 2.5.0 use {@see Bulk_Upgrader_Skin::flush_output()} instead
+					 * @see        Bulk_Upgrader_Skin::flush_output()
+					 */
+					public function after_flush_output() {
+						_deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'Bulk_Upgrader_Skin::flush_output()' );
+						$this->flush_output();
+						$this->i++;
+					}
+				}
+			}
+		}
+	}
+}
+
+if ( ! class_exists( 'TGMPA_Utils' ) ) {
+
+	/**
+	 * Generic utilities for TGMPA.
+	 *
+	 * All methods are static, poor-dev name-spacing class wrapper.
+	 *
+	 * Class was called TGM_Utils in 2.5.0 but renamed TGMPA_Utils in 2.5.1 as this was conflicting with Soliloquy.
+	 *
+	 * @since 2.5.0
+	 *
+	 * @package TGM-Plugin-Activation
+	 * @author  Juliette Reinders Folmer
+	 */
+	class TGMPA_Utils {
+		/**
+		 * Whether the PHP filter extension is enabled.
+		 *
+		 * @see http://php.net/book.filter
+		 *
+		 * @since 2.5.0
+		 *
+		 * @static
+		 *
+		 * @var bool $has_filters True is the extension is enabled.
+		 */
+		public static $has_filters;
+
+		/**
+		 * Wrap an arbitrary string in <em> tags. Meant to be used in combination with array_map().
+		 *
+		 * @since 2.5.0
+		 *
+		 * @static
+		 *
+		 * @param string $string Text to be wrapped.
+		 * @return string
+		 */
+		public static function wrap_in_em( $string ) {
+			return '<em>' . wp_kses_post( $string ) . '</em>';
+		}
+
+		/**
+		 * Wrap an arbitrary string in <strong> tags. Meant to be used in combination with array_map().
+		 *
+		 * @since 2.5.0
+		 *
+		 * @static
+		 *
+		 * @param string $string Text to be wrapped.
+		 * @return string
+		 */
+		public static function wrap_in_strong( $string ) {
+			return '<strong>' . wp_kses_post( $string ) . '</strong>';
+		}
+
+		/**
+		 * Helper function: Validate a value as boolean
+		 *
+		 * @since 2.5.0
+		 *
+		 * @static
+		 *
+		 * @param mixed $value Arbitrary value.
+		 * @return bool
+		 */
+		public static function validate_bool( $value ) {
+			if ( ! isset( self::$has_filters ) ) {
+				self::$has_filters = extension_loaded( 'filter' );
+			}
+
+			if ( self::$has_filters ) {
+				return filter_var( $value, FILTER_VALIDATE_BOOLEAN );
+			} else {
+				return self::emulate_filter_bool( $value );
+			}
+		}
+
+		/**
+		 * Helper function: Cast a value to bool
+		 *
+		 * @since 2.5.0
+		 *
+		 * @static
+		 *
+		 * @param mixed $value Value to cast.
+		 * @return bool
+		 */
+		protected static function emulate_filter_bool( $value ) {
+			// @codingStandardsIgnoreStart
+			static $true  = array(
+				'1',
+				'true', 'True', 'TRUE',
+				'y', 'Y',
+				'yes', 'Yes', 'YES',
+				'on', 'On', 'ON',
+			);
+			static $false = array(
+				'0',
+				'false', 'False', 'FALSE',
+				'n', 'N',
+				'no', 'No', 'NO',
+				'off', 'Off', 'OFF',
+			);
+			// @codingStandardsIgnoreEnd
+
+			if ( is_bool( $value ) ) {
+				return $value;
+			} elseif ( is_int( $value ) && ( 0 === $value || 1 === $value ) ) {
+				return (bool) $value;
+			} elseif ( ( is_float( $value ) && ! is_nan( $value ) ) && ( (float) 0 === $value || (float) 1 === $value ) ) {
+				return (bool) $value;
+			} elseif ( is_string( $value ) ) {
+				$value = trim( $value );
+				if ( in_array( $value, $true, true ) ) {
+					return true;
+				} elseif ( in_array( $value, $false, true ) ) {
+					return false;
+				} else {
+					return false;
+				}
+			}
+
+			return false;
+		}
+	} // End of class TGMPA_Utils
+} // End of class_exists wrapper

+ 216 - 0
lib/plugins/tgm-plugin-activation/register-plugins.php

@@ -0,0 +1,216 @@
+<?php
+/**
+ * This file represents an example of the code that themes would use to register
+ * the required plugins.
+ *
+ * It is expected that theme authors would copy and paste this code into their
+ * functions.php file, and amend to suit.
+ *
+ * @see http://tgmpluginactivation.com/configuration/ for detailed documentation.
+ *
+ * @package    TGM-Plugin-Activation
+ * @subpackage Example
+ * @version    2.6.1 for child theme captivating
+ * @author     Thomas Griffin, Gary Jones, Juliette Reinders Folmer
+ * @copyright  Copyright (c) 2011, Thomas Griffin
+ * @license    http://opensource.org/licenses/gpl-2.0.php GPL v2 or later
+ * @link       https://github.com/TGMPA/TGM-Plugin-Activation
+ */
+require_once get_stylesheet_directory() . '/lib/plugins/tgm-plugin-activation/class-tgm-plugin-activation.php';
+
+add_action( 'tgmpa_register', 'captivating_register_required_plugins' );
+
+/**
+ * Register the required plugins for this theme.
+ *
+ * In this example, we register five plugins:
+ * - one included with the TGMPA library
+ * - two from an external source, one from an arbitrary source, one from a GitHub repository
+ * - two from the .org repo, where one demonstrates the use of the `is_callable` argument
+ *
+ * The variables passed to the `tgmpa()` function should be:
+ * - an array of plugin arrays;
+ * - optionally a configuration array.
+ * If you are not changing anything in the configuration array, you can remove the array and remove the
+ * variable from the function call: `tgmpa( $plugins );`.
+ * In that case, the TGMPA default settings will be used.
+ *
+ * This function is hooked into `tgmpa_register`, which is fired on the WP `init` action on priority 10.
+ */
+function captivating_register_required_plugins() {
+	/*
+	 * Array of plugin arrays. Required keys are name and slug.
+	 * If the source is NOT from the .org repo, then source is also required.
+	 */
+	$plugins = array(
+
+		// This is an example of how to include a plugin from the WordPress Plugin Repository.
+		array(
+			'name'      => 'Genesis eNews Extended',
+			'slug'      => 'genesis-enews-extended',
+			'required'  => false,
+		),
+		
+		array(
+			'name'      => 'Flexible Posts Widget',
+			'slug'      => 'flexible-posts-widget',
+			'required'  => false,
+		),
+
+		array(
+			'name'      => 'Simple Social Icons',
+			'slug'      => 'simple-social-icons',
+			'required'  => false,
+		),
+
+		array(
+			'name'      => 'Instagram Feed',
+			'slug'      => 'instagram-feed',
+			'required'  => false,
+		),
+		
+		array(
+			'name'      => 'Ninja Forms',
+			'slug'      => 'ninja-forms',
+			'required'  => false,
+		),
+		
+		array(
+			'name'      => 'Social Warfare',
+			'slug'      => 'social-warfare',
+			'required'  => false,
+		),
+
+		array(
+			'name'      => 'Regenerate Thumbnails',
+			'slug'      => 'regenerate-thumbnails',
+			'required'  => false,
+		),
+
+		array(
+			'name'      => 'Widget Importer & Exporter',
+			'slug'      => 'widget-importer-exporter',
+			'required'  => false,
+		),
+		
+		array(
+			'name'      => 'Soliloquy Lite',
+			'slug'      => 'soliloquy-lite',
+			'required'  => false,
+		),
+		
+		array(
+			'name'      => 'Genesis Responsive Slider',
+			'slug'      => 'genesis-responsive-slider',
+			'required'  => false,
+		),
+		
+		array(
+			'name'      => 'WP Recipe Maker',
+			'slug'      => 'wp-recipe-maker',
+			'required'  => false,
+		),
+
+	);
+
+	/*
+	 * Array of configuration settings. Amend each line as needed.
+	 *
+	 * TGMPA will start providing localized text strings soon. If you already have translations of our standard
+	 * strings available, please help us make TGMPA even better by giving us access to these translations or by
+	 * sending in a pull-request with .po file(s) with the translations.
+	 *
+	 * Only uncomment the strings in the config array if you want to customize the strings.
+	 */
+	$config = array(
+		'id'           => 'captivating',                 // Unique ID for hashing notices for multiple instances of TGMPA.
+		'default_path' => '',                      // Default absolute path to bundled plugins.
+		'menu'         => 'tgmpa-install-plugins', // Menu slug.
+		'parent_slug'  => 'themes.php',            // Parent menu slug.
+		'capability'   => 'edit_theme_options',    // Capability needed to view plugin install page, should be a capability associated with the parent menu used.
+		'has_notices'  => true,                    // Show admin notices or not.
+		'dismissable'  => true,                    // If false, a user cannot dismiss the nag message.
+		'dismiss_msg'  => '',                      // If 'dismissable' is false, this message will be output at top of nag.
+		'is_automatic' => false,                   // Automatically activate plugins after installation or not.
+		'message'      => '',                      // Message to output right before the plugins table.
+
+		/*
+		'strings'      => array(
+			'page_title'                      => __( 'Install Required Plugins', 'captivating' ),
+			'menu_title'                      => __( 'Install Plugins', 'captivating' ),
+			/* translators: %s: plugin name. * /
+			'installing'                      => __( 'Installing Plugin: %s', 'captivating' ),
+			/* translators: %s: plugin name. * /
+			'updating'                        => __( 'Updating Plugin: %s', 'captivating' ),
+			'oops'                            => __( 'Something went wrong with the plugin API.', 'captivating' ),
+			'notice_can_install_required'     => _n_noop(
+				/* translators: 1: plugin name(s). * /
+				'This theme requires the following plugin: %1$s.',
+				'This theme requires the following plugins: %1$s.',
+				'captivating'
+			),
+			'notice_can_install_recommended'  => _n_noop(
+				/* translators: 1: plugin name(s). * /
+				'This theme recommends the following plugin: %1$s.',
+				'This theme recommends the following plugins: %1$s.',
+				'captivating'
+			),
+			'notice_ask_to_update'            => _n_noop(
+				/* translators: 1: plugin name(s). * /
+				'The following plugin needs to be updated to its latest version to ensure maximum compatibility with this theme: %1$s.',
+				'The following plugins need to be updated to their latest version to ensure maximum compatibility with this theme: %1$s.',
+				'captivating'
+			),
+			'notice_ask_to_update_maybe'      => _n_noop(
+				/* translators: 1: plugin name(s). * /
+				'There is an update available for: %1$s.',
+				'There are updates available for the following plugins: %1$s.',
+				'captivating'
+			),
+			'notice_can_activate_required'    => _n_noop(
+				/* translators: 1: plugin name(s). * /
+				'The following required plugin is currently inactive: %1$s.',
+				'The following required plugins are currently inactive: %1$s.',
+				'captivating'
+			),
+			'notice_can_activate_recommended' => _n_noop(
+				/* translators: 1: plugin name(s). * /
+				'The following recommended plugin is currently inactive: %1$s.',
+				'The following recommended plugins are currently inactive: %1$s.',
+				'captivating'
+			),
+			'install_link'                    => _n_noop(
+				'Begin installing plugin',
+				'Begin installing plugins',
+				'captivating'
+			),
+			'update_link' 					  => _n_noop(
+				'Begin updating plugin',
+				'Begin updating plugins',
+				'captivating'
+			),
+			'activate_link'                   => _n_noop(
+				'Begin activating plugin',
+				'Begin activating plugins',
+				'captivating'
+			),
+			'return'                          => __( 'Return to Required Plugins Installer', 'captivating' ),
+			'plugin_activated'                => __( 'Plugin activated successfully.', 'captivating' ),
+			'activated_successfully'          => __( 'The following plugin was activated successfully:', 'captivating' ),
+			/* translators: 1: plugin name. * /
+			'plugin_already_active'           => __( 'No action taken. Plugin %1$s was already active.', 'captivating' ),
+			/* translators: 1: plugin name. * /
+			'plugin_needs_higher_version'     => __( 'Plugin not activated. A higher version of %s is needed for this theme. Please update the plugin.', 'captivating' ),
+			/* translators: 1: dashboard link. * /
+			'complete'                        => __( 'All plugins installed and activated successfully. %1$s', 'captivating' ),
+			'dismiss'                         => __( 'Dismiss this notice', 'captivating' ),
+			'notice_cannot_install_activate'  => __( 'There are one or more required or recommended plugins to install, update or activate.', 'captivating' ),
+			'contact_admin'                   => __( 'Please contact the administrator of this site for help.', 'captivating' ),
+
+			'nag_type'                        => '', // Determines admin notice type - can only be one of the typical WP notice classes, such as 'updated', 'update-nag', 'notice-warning', 'notice-info' or 'error'. Some of which may not work as expected in older WP versions.
+		),
+		*/
+	);
+
+	tgmpa( $plugins, $config );
+}

+ 109 - 0
lib/theme-defaults.php

@@ -0,0 +1,109 @@
+<?php
+
+/**
+ * This file adds the Theme Defaults to the Captivating Theme.
+ *
+ * @package      Captivating
+ * @subpackage   Customizations
+ * @link         http://restored316designs.com/themes
+ * @author       Lauren Gaige // Restored 316 LLC
+ * @copyright    Copyright (c) 2015, Restored 316 LLC, Released 08/09/2017
+ * @license      GPL-2.0+
+ */
+
+//* Captivating Theme Setting Defaults
+add_filter( 'genesis_theme_settings_defaults', 'captivating_theme_defaults' );
+function captivating_theme_defaults( $defaults ) {
+
+	$defaults['blog_cat_num']              = 5;
+	$defaults['content_archive']           = 'full';
+	$defaults['content_archive_limit']     = 500;
+	$defaults['content_archive_thumbnail'] = 1;
+	$defaults['image_size']                = 'vertical-entry-image';
+	$defaults['image_alignment']           = 'alignleft';
+	$defaults['posts_nav']                 = 'numeric';
+	$defaults['site_layout']               = 'content-sidebar';
+
+	return $defaults;
+
+}
+
+//* Captivating Theme Setup
+add_action( 'after_switch_theme', 'captivating_theme_setting_defaults' );
+function captivating_theme_setting_defaults() {
+
+	if( function_exists( 'genesis_update_settings' ) ) {
+
+		genesis_update_settings( array(
+			'blog_cat_num'              => 5,	
+			'content_archive'           => 'full',
+			'content_archive_limit'     => 500,
+			'content_archive_thumbnail' => 1,
+			'image_size'                => 'vertical-entry-image',
+			'image_alignment'           => 'alignleft',
+			'posts_nav'                 => 'numeric',
+			'site_layout'               => 'content-sidebar',
+		) );
+	
+	} 
+
+	update_option( 'posts_per_page', 5 );
+
+}
+
+//* Captivating Simple Social Icon Defaults
+add_filter( 'simple_social_default_styles', 'captivating_social_default_styles' );
+function captivating_social_default_styles( $defaults ) {
+
+	$args = array(
+		'alignment'              => 'aligncenter',
+		'background_color'       => '#FFFFFF',
+		'background_color_hover' => '#FFFFFF',
+		'border_radius'          => 0,
+		'border_color'           => '#FFFFFF',
+		'border_color_hover'     => '#FFFFFF',
+		'border_width'           => 0,
+		'icon_color'             => '#3a4974',
+		'icon_color_hover'       => '#333333',
+		'size'                   => 26,
+		'new_window'             => 1,
+		);
+		
+	$args = wp_parse_args( $args, $defaults );
+	
+	return $args;
+	
+}
+
+//* Set Genesis Responsive Slider defaults
+add_filter( 'genesis_responsive_slider_settings_defaults', 'captivating_responsive_slider_defaults' );
+function captivating_responsive_slider_defaults( $defaults ) {
+
+	$args = array(
+		'location_horizontal'             => 'Left',
+		'location_vertical'               => 'Top',
+		'posts_num'                       => '5',
+		'slideshow_excerpt_content_limit' => '0',
+		'slideshow_excerpt_content'       => 'full',
+		'slideshow_excerpt_width'         => '30',
+		'slideshow_excerpt_show' 		  => 0,
+		'slideshow_height'                => '600',
+		'slideshow_more_text'             => __( 'Read More', 'captivating' ),
+		'slideshow_title_show'            => 1,
+		'slideshow_width'                 => '1220',
+	);
+
+	$args = wp_parse_args( $args, $defaults );
+	
+	return $args;
+}
+
+//* Set option to show posts on front page after switching themes
+add_action( 'after_switch_theme', 'captivating_theme_reading_defaults' );
+function captivating_theme_reading_defaults() {
+	if ( 'posts' != get_option( 'show_on_front' ) ) {
+	
+		update_option( 'show_on_front', 'posts' );
+	
+	}
+}

+ 66 - 0
lib/widgets.php

@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * This file adds all the widget spaces to the Captivating theme.
+ *
+ * @package      Captivating
+ * @link         http://restored316designs.com/themes
+ * @author       Lauren Gaige // Restored 316 LLC
+ * @copyright    Copyright (c) 2015, Restored 316 LLC, Released 08/09/2017
+ * @license      GPL-2.0+
+ */
+
+//* Register widget areas
+
+//* Home Page Widgets
+genesis_register_sidebar( array(
+	'id'          => 'home-featured',
+	'name'        => __( 'Home Featured', 'captivating' ),
+	'description' => __( 'This is the featured section on the home page that extends across the page.', 'captivating' ),
+) );
+genesis_register_sidebar( array(
+	'id'          => 'home-above-content',
+	'name'        => __( 'Home Above Content', 'captivating' ),
+	'description' => __( 'This is the space that appears immediately above the blog content on the home page.', 'captivating' ),
+) );
+genesis_register_sidebar( array(
+	'id'          => 'home-below-content',
+	'name'        => __( 'Home Below Content', 'captivating' ),
+	'description' => __( 'This is the space that appears immediately below the blog content on the home page.', 'captivating' ),
+) );
+
+//* Navigation Widgets
+genesis_register_sidebar( array(
+	'id'          	=> 'announcement-widget',
+	'name'        	=> __( 'Announcements', 'captivating' ),
+	'description' 	=> __( 'This is the section at the very top of your site for special announcements.', 'captivating' ),
+) );
+genesis_register_sidebar( array(
+	'id'          	=> 'nav-social-menu',
+	'name'        	=> __( 'Nav Social Menu', 'captivating' ),
+	'description' 	=> __( 'This is the social media section that appears in the menu above the header.', 'captivating' ),
+) );
+
+//* Other Widgets
+genesis_register_sidebar( array(
+	'id'            => 'site-wide-cta',
+	'name'          => __( 'Site Wide CTA', 'captivating' ),
+	'description'   => __( 'This widget space appears on the home page under the Home Featured section as well as above the footer on all other pages.', 'captivating' ),
+) );
+genesis_register_sidebar( array(
+	'id'            => 'category-index',
+	'name'          => __( 'Category Index', 'captivating' ),
+	'description'   => __( 'This widget area that appears on the Category Index page when using the Category Index page template.', 'captivating' ),
+) );
+genesis_register_sidebar( array(
+	'id'          	=> 'above-blog-content',
+	'name'        	=> __( 'Above Blog Content', 'captivating' ),
+	'description' 	=> __( 'This is the above blog content section of the custom blog page template.', 'captivating' ),
+) );
+
+//* Footer Widgets
+genesis_register_sidebar( array(
+	'id'            => 'widget-below-footer',
+	'name'          => __( 'Footer Instagram Widget', 'captivating' ),
+	'description'   => __( 'This widget area appears below the footer.', 'captivating' ),
+) );

+ 116 - 0
page-templates/custom_blog.php

@@ -0,0 +1,116 @@
+<?php
+/**
+ * This file adds the blog page template to the Captivating theme.
+ *
+ * @package      Captivating
+ * @link         http://restored316designs.com/themes
+ * @author       Lauren Gaige // Restored 316 LLC
+ * @copyright    Copyright (c) 2015, Restored 316 LLC, Released 08/09/2017
+ * @license      GPL-2.0+
+ */
+
+/*
+Template Name: Custom Blog
+*/
+
+/** Replace the standard loop with our custom loop */
+remove_action( 'genesis_loop', 'genesis_do_loop' );
+add_action( 'genesis_loop', 'captivating_do_custom_loop' );
+ 
+function captivating_do_custom_loop() {
+ 
+    global $paged; // current paginated page
+    global $query_args; // grab the current wp_query() args
+    $args = array(
+        'paged'            => $paged, // respect pagination
+    );
+ 
+    genesis_custom_loop( wp_parse_args($query_args, $args) );
+ 
+}
+
+//* Add archive body class to the head
+add_filter( 'body_class', 'captivating_add_archive_body_class' );
+function captivating_add_archive_body_class( $classes ) {
+   	$classes[] = 'captivating-custom-blog';
+   	return $classes;
+}
+
+//* Adds Flexible Featured Content Above Content on Blog Page Template
+add_action( 'genesis_after_header', 'captivating_above_blog_content'  ); 
+function captivating_above_blog_content() {
+    
+    genesis_widget_area( 'above-blog-content', array(
+		'before' => '<div id="above-blog-content" class="above-blog-content"><div class="wrap">',
+		'after'  => '</div></div>',
+	) );
+
+}
+
+//* Remove Featured image (if set in Theme Settings)
+add_filter( 'genesis_pre_get_option_content_archive_thumbnail', 'captivating_no_post_image' );
+function captivating_no_post_image() {
+	return '0';
+}
+
+//* Show Excerpts regardless of Theme Settings
+add_filter( 'genesis_pre_get_option_content_archive', 'captivating_show_excerpts' );
+function captivating_show_excerpts() {
+	return 'excerpts';
+}
+
+//* Modify the length of post excerpts
+add_filter( 'excerpt_length', 'captivating_excerpt_length' );
+function captivating_excerpt_length( $length ) {
+	return 60; // pull first 50 words
+}
+
+//* Modify the Excerpt read more link
+add_filter('excerpt_more', 'captivating_new_excerpt_more');
+function captivating_new_excerpt_more($more) {
+	return '... <br><a class="more-link" href="' . get_permalink() . '">Read More</a>';
+}
+
+//* Make sure content limit (if set in Theme Settings) doesn't apply
+add_filter( 'genesis_pre_get_option_content_archive_limit', 'captivating_no_content_limit' );
+function captivating_no_content_limit() {
+	return '0';
+}
+
+//* Display centered wide featured image for First Post and left aligned thumbnail for the next five
+add_action( 'genesis_entry_header', 'captivating_show_featured_image', 8 );
+function captivating_show_featured_image() {
+	if ( ! has_post_thumbnail() ) {
+		return;
+	}
+
+	global $wp_query;
+
+	if( ( $wp_query->current_post <= 0 ) ) {
+		$image_args = array(
+			'size' => 'horizontal-entry-image',
+			'attr' => array(
+				'class' => 'aligncenter',
+			),
+		);
+	
+	} else {
+		$image_args = array(
+			'size' => 'vertical-entry-image',
+			'attr' => array(
+				'class' => 'alignleft',
+			),
+		);
+	}
+
+	$image = genesis_get_image( $image_args );
+
+	echo '<div class="home-featured-image"><a href="' . get_permalink() . '">' . $image .'</a></div>';
+	
+	}
+
+//* Remove entry meta
+remove_action( 'genesis_entry_header', 'genesis_post_info', 9 );
+
+//* Run the default Genesis loop
+genesis();

+ 42 - 0
page-templates/page_index.php

@@ -0,0 +1,42 @@
+<?php
+/**
+ * This file adds the Category Index to the Captivating Theme.
+ *
+ * @package      Captivating
+ * @link         http://restored316designs.com/themes
+ * @author       Lauren Gaige // Restored 316 LLC
+ * @copyright    Copyright (c) 2015, Restored 316 LLC, Released 08/09/2017
+ * @license      GPL-2.0+
+ */
+ 
+/*
+Template Name: Category Index
+*/
+
+add_action( 'genesis_meta', 'captivating_category_genesis_meta' );
+/**
+ * Add widget support for category index. If no widgets active, display the default loop.
+ *
+ */
+function captivating_category_genesis_meta() {
+
+	if ( is_active_sidebar( 'category-index' )) {
+
+		remove_action( 'genesis_loop', 'genesis_do_loop' );
+		add_action( 'genesis_loop', 'captivating_category_sections' );
+		add_filter( 'genesis_pre_get_option_site_layout', '__genesis_return_content_sidebar' );
+
+	}
+	
+}
+
+function captivating_category_sections() {
+
+	genesis_widget_area( 'category-index', array(
+		'before' => '<div class="category-index widget-area">',
+		'after'  => '</div>',
+	) );
+	
+}
+
+genesis();

+ 58 - 0
page-templates/page_landing.php

@@ -0,0 +1,58 @@
+<?php
+/**
+ * This file adds the Landing Page Template to the Captivating Theme.
+ *
+ * @package      Captivating
+ * @link         http://restored316designs.com/themes
+ * @author       Lauren Gaige // Restored 316 LLC
+ * @copyright    Copyright (c) 2015, Restored 316 LLC, Released 08/09/2017
+ * @license      GPL-2.0+
+ */
+ 
+/*
+Template Name: Landing
+*/
+
+//* Add custom body class to the head
+add_filter( 'body_class', 'captivating_add_body_class' );
+function captivating_add_body_class( $classes ) {
+
+   $classes[] = 'captivating-landing';
+   return $classes;
+   
+}
+
+//* Force full width content layout
+add_filter( 'genesis_site_layout', '__genesis_return_full_width_content' );
+
+//* Remove navigation
+remove_action( 'genesis_before_header', 'genesis_do_nav', 7 );
+remove_action( 'genesis_after_header', 'genesis_do_subnav' );
+remove_action( 'genesis_before_footer', 'captivating_footer_menu', 7 );
+remove_action( 'genesis_header', 'captivating_header_right_menu', 9 );
+remove_action( 'genesis_header', 'captivating_header_left_menu', 6 );
+
+//* Remove site header elements
+remove_action( 'genesis_header', 'genesis_header_markup_open', 5 );
+remove_action( 'genesis_header', 'genesis_do_header' );
+remove_action( 'genesis_header', 'genesis_header_markup_close', 15 );
+
+//* Remove Announcement bar
+remove_action( 'genesis_before', 'captivating_announcement_widget', 8 ); 
+
+//* Remove Widget Area Above Content
+remove_action( 'genesis_before_footer', 'captivating_site_wide_cta', 6 );
+
+//* Remove site footer widgets
+remove_action( 'genesis_before_footer', 'genesis_footer_widget_areas' );
+
+//* Remove widget below footer
+remove_action( 'genesis_before_footer', 'captivating_widget_below_footer', 12 ); 
+
+//* Remove site footer elements
+remove_action( 'genesis_footer', 'genesis_footer_markup_open', 5 );
+remove_action( 'genesis_footer', 'genesis_do_footer' );
+remove_action( 'genesis_footer', 'genesis_footer_markup_close', 15 );
+
+//* Run the Genesis loop
+genesis();

+ 15 - 0
page_archive.php

@@ -0,0 +1,15 @@
+<?php
+/**
+ * Template Name: Archive
+ */
+
+remove_action( 'genesis_entry_content', 'genesis_do_post_content' );
+add_action( 'genesis_entry_content', 'genesis_page_archive_content' );
+
+function genesis_page_archive_content() {
+    $heading = ( genesis_a11y( 'headings' ) ? 'h2' : 'h4' );
+
+    genesis_sitemap( $heading );
+}
+
+genesis();

+ 19 - 0
page_blog.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * This file adds the blog page template to the Captivating theme.
+ *
+ * @package      Captivating
+ * @link         http://restored316designs.com/themes
+ * @author       Lauren Gaige // Restored 316 LLC
+ * @copyright    Copyright (c) 2015, Restored 316 LLC, Released 08/09/2017
+ * @license      GPL-2.0+
+ */
+
+/*
+Template Name: Blog Page
+*/
+
+//* Remove entry meta
+remove_action( 'genesis_entry_header', 'genesis_post_info', 9 );
+
+genesis();

+ 261 - 0
style-front.css

@@ -0,0 +1,261 @@
+/*
+	Theme Name: Captivating Theme
+	Theme URI: http://restored316designs.com/themes
+	Description: A mobile responsive and HTML5 feminine WordPress theme built for the Genesis Framework by Lauren Gaige of Restored 316.
+	Author: Restored 316 Designs // Lauren Gaige
+	Author URI: http://www.restored316designs.com/
+	Copyright: Copyright (c) 2015, Restored 316 LLC, Released 08/09/2017
+
+	Template: genesis
+	Template Version: 2.0.1
+
+	License: GPL-2.0+
+	License URI: http://www.opensource.org/licenses/gpl-license.php
+*/
+
+
+/* Front Page
+---------------------------------------------------------------------------------------------------- */
+
+.front-page .blog {
+	margin-top: 30px;
+}
+
+.front-page .wrap {
+	margin: 0 auto;
+	max-width: 1280px;
+}
+
+.front-page .entry-header {
+	margin-bottom: 0;
+}
+
+.front-page .home-slider-overlay.widget-area h3 {
+	margin-bottom: 30px;
+}
+
+.home-slider-overlay .widget-title {
+	font-family: 'Cormorant Garamond', serif;
+	font-style: italic;
+	font-size: 22px;
+	letter-spacing: 5px;
+	color: #ae9d78;
+	margin: 0;
+}
+
+.front-page .featured-content .entry {
+	position: relative;
+}
+
+.front-page .content .widget-title {
+	border-left: 15px solid #fff7e1;
+	padding-left: 30px;
+	font-size: 28px;
+	font-family:'Satisfy', cursive;
+	text-transform:none;
+	letter-spacing:normal;
+}
+
+.front-page .content .widget:nth-of-type(3n+2) .widget-title {
+	border-color: #fff4f0;
+}
+
+.front-page .content .widget:nth-of-type(3n+3) .widget-title {
+	border-color: #f7f9fc;
+}
+
+.home-above-content .widget-wrap, 
+.home-below-content .widget-wrap {
+    position: relative;
+    overflow: hidden;
+}
+
+.home-above-content .widget-wrap .more-from-category,
+.home-below-content .widget-wrap .more-from-category {
+	position: absolute;
+	top: 0;
+	right: 0px;
+}
+
+/* Front Page Areas
+--------------------------------------------- */
+
+.home-featured {
+	background: url(https://cottageatthecrossroads.com/wp-content/uploads/2018/06/400.png)repeat;
+	background-size:100px;
+	margin-bottom: 10px;
+}
+
+.home-featured .wrap {
+	padding: 30px;
+}
+
+.home-featured .entry {
+	float: left;
+	margin-right: 2%;
+	width: 32%;
+}
+
+.home-featured .featured-content .entry {
+	margin-bottom: 0;
+	padding: 0;
+}
+
+.home-above-content .entry,
+.home-below-content .entry {
+	float: left;
+	margin-right: 2%;
+	width: 32%;
+}
+
+.home-above-content .widget,
+.home-below-content .widget {
+	margin-bottom: 30px;
+}
+
+.home-featured .entry:nth-of-type(3n+3),
+.home-featured .widget:nth-of-type(3n+3) .entry,
+.home-above-content .entry:nth-of-type(3n+3),
+.home-below-content .entry:nth-of-type(3n+3) {
+	margin-right: 0;
+}
+
+.home-featured .entry-title {
+	font-size: 20px;
+	text-align: center;
+}
+
+.home-above-content .entry-title,
+.home-below-content .entry-title {
+	font-size: 20px;
+}
+
+.front-page .site-wide-cta {
+	background: none;
+	border-bottom: 1px solid #eee;
+	border-top: 1px solid #eee;
+}
+
+/* Blog
+--------------------------------------------- */
+
+.home-blog {
+	margin-bottom: 50px;
+}
+
+.home-blog .entry {
+	float: left;
+	width: 48.7179%;
+}
+
+.home-blog .entry:nth-of-type(2n+3) {
+	margin-left: 2.5641%;
+}
+
+.home-blog .entry:nth-of-type(1) {
+	width: 100%;
+}
+
+/* Carousel
+--------------------------------------------- */
+
+.home-carousel .title {
+	background: transparent;
+	color: #000;
+	font-family: 'Playfair Display', serif;
+	line-height: 24px;
+	padding: 10px 0;
+	font-size: 20px;
+	text-align: left;
+}
+
+.home-featured .slick-list .entry,
+.home-above-content .slick-list .entry,
+.home-below-content .slick-list .entry {
+	background: transparent;
+	margin: 0;
+}
+
+.slick-slide {
+	margin: 0 10px;
+}
+
+.slick-list {
+	margin: 0;
+}
+
+.slick-arrow {
+	position: absolute;
+	top: 40%;
+	z-index: 1;
+	font-size: 20px;
+	cursor: pointer;
+	color: #333333;
+	width: 40px;
+	height: 40px;
+	vertical-align: middle;
+}
+
+.slick-arrow:before {
+	position: absolute;
+	left: 16px;
+	top: 10px;
+}
+
+.slick-arrow-prev {
+	left: 0;
+}
+
+.slick-arrow-next {
+	right: 0;
+}
+
+.slick-arrow-next:before {
+	left: 0px;
+}
+
+.slick-arrow:hover {
+	color: #55c7cf;
+}
+
+/* Media Queries
+---------------------------------------------------------------------------------------------------- */
+
+@media only screen and (max-width: 1280px) {
+	
+.front-page .wrap {
+	width: 100%;
+}
+
+.site-inner {
+	padding: 0;
+}
+	
+}
+
+@media only screen and (max-width: 600px) {
+
+	.home-featured .wrap {
+		padding: 20px;
+	}
+	
+	.home-blog .entry,
+	.home-above-content .entry,
+	.home-below-content .entry {
+		float: none;
+		width: 100%;
+	}
+	
+	.home-blog .entry:nth-of-type(2n+3) {
+		margin-left: 0;
+	}
+	
+	.home-above-content .widget-wrap .more-from-category,
+	.home-below-content .widget-wrap .more-from-category {
+		clear: both;
+		position: relative;
+		text-align: right;
+	}
+
+
+}

+ 3062 - 0
style.css

@@ -0,0 +1,3062 @@
+/*
+	Theme Name: Cottage at the Crossroads
+	Theme URI: http://howsweetdesigns.com
+	Description: Captivating Theme by Restored 316, Customized by How Sweet Designs.
+	Author: Restored 316 Designs // How Sweet Designs
+	Author URI: http://www.howsweetdesigns.com/
+	Copyright: Copyright (c) 2015, Restored 316 LLC, Released 08/09/2017
+	Version: 1.0.0
+
+	Template: genesis
+	Template Version: 2.0.1
+
+	License: GPL-2.0+
+	License URI: http://www.opensource.org/licenses/gpl-license.php
+*/
+
+
+/* # Table of Contents
+- HTML5 Reset
+	- Baseline Normalize
+	- Box Sizing
+	- Float Clearing
+- Defaults
+	- Typographical Elements
+	- Headings
+	- Objects
+	- Gallery
+	- Forms
+	- Tables
+- Structure and Layout
+	- Site Containers
+	- Column Widths and Positions
+	- Column Classes
+- Common Classes
+	- Avatar
+	- Genesis
+	- Search Form
+	- Titles
+	- WordPress
+- Widgets
+	- Featured Content
+- Plugins
+	- Convert Kit
+	- Genesis eNews Extended
+	- Genesis Responsive Slider
+	- Gravity Forms
+	- Instagram Feed
+	- RewardStyle
+	- Social Warfare
+	- Soliloquy
+	- Simply Instagram
+	- WooCommerce
+- Site Header
+	- Title Area
+	- Widget Area
+- Site Navigation
+	- Header Navigation
+	- Primary Navigation
+	- Secondary Navigation
+- Content Area
+	- Entries
+	- Entry Meta
+	- Pagination
+	- After Entry Widget Area
+	- Comments
+- Sidebars
+- Footer Widgets
+- Site Footer
+- Media Queries
+	- Retina Display
+	- Max-width: 1200px
+	- Max-width: 960px
+	- Max-width: 800px
+*/
+
+
+/* # HTML5 Reset
+---------------------------------------------------------------------------------------------------- */
+
+/* ## Baseline Normalize
+--------------------------------------------- */
+/* normalize.css v3.0.1 | MIT License | git.io/normalize */
+
+html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#666}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}
+
+/* ## Box Sizing
+--------------------------------------------- */
+
+*,
+input[type="search"] {
+	-webkit-box-sizing: border-box;
+	-moz-box-sizing:    border-box;
+	box-sizing:         border-box;
+}
+
+/* ## Float Clearing
+--------------------------------------------- */
+
+.author-box:before,
+.clearfix:before,
+.entry:before,
+.entry-content:before,
+.footer-widgets:before,
+.nav-primary:before,
+.nav-secondary:before,
+.pagination:before,
+.site-container:before,
+.site-footer:before,
+.site-header:before,
+.site-inner:before,
+.wrap:before {
+	content: " ";
+	display: table;
+}
+
+.author-box:after,
+.clearfix:after,
+.entry:after,
+.entry-content:after,
+.footer-widgets:after,
+.nav-primary:after,
+.nav-secondary:after,
+.pagination:after,
+.site-container:after,
+.site-footer:after,
+.site-header:after,
+.site-inner:after,
+.wrap:after {
+	clear: both;
+	content: " ";
+	display: table;
+}
+
+
+/* # Defaults
+---------------------------------------------------------------------------------------------------- */
+
+/* ## Typographical Elements
+--------------------------------------------- */
+
+body {
+	color: #333;
+	font-family: 'Montserrat', sans-serif;
+	font-size: 15px;
+	font-weight: 300;
+	letter-spacing: .5px;
+	line-height: 2;
+	margin: 0;
+}
+
+a,
+button,
+input:focus,
+input[type="button"],
+input[type="reset"],
+input[type="submit"],
+textarea:focus,
+.button,
+.gallery img {
+	-webkit-transition: all 0.1s ease-in-out;
+	-moz-transition:    all 0.1s ease-in-out;
+	-ms-transition:     all 0.1s ease-in-out;
+	-o-transition:      all 0.1s ease-in-out;
+	transition:         all 0.1s ease-in-out;
+}
+
+::-moz-selection {
+	background-color: #333;
+	color: #fff;
+}
+
+::selection {
+	background-color: #333;
+	color: #fff;
+}
+
+a {
+	color: #a4c4c1;
+	text-decoration: none;
+}
+
+a:hover {
+	color: #333;
+}
+
+p {
+	margin: 0 0 28px;
+	padding: 0;
+}
+
+ol,
+ul {
+	margin: 0;
+	padding: 0;
+}
+
+li {
+	list-style-type: none;
+}
+
+b,
+strong {
+	font-weight: 700;
+}
+
+blockquote,
+cite,
+em,
+i {
+	font-style: italic;
+}
+
+blockquote {
+	border-bottom: 1px solid #eee;
+	border-top: 1px solid #eee;
+	margin: 40px;
+}
+
+blockquote::before {
+	background: #fff;
+	color: #eee;
+	content: "\201C";
+	display: table;
+	font-size: 60px;
+	margin: -55px auto;
+	padding: 10px;
+}
+
+.screen-reader-text {
+	display: none;
+}
+
+/* ## Headings
+--------------------------------------------- */
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+	color: #333;
+	font-family: 'Playfair Display', serif;
+	font-style: normal;
+	font-weight: 400;
+	letter-spacing: .5px;
+	line-height: 1.2;
+	margin: 0 0 25px;
+}
+
+h1 {
+	font-size: 30px;
+}
+
+h2 {
+	font-size: 24px;
+}
+
+h3 {
+	font-size: 20px;
+}
+
+h4 {
+	font-size: 18px;
+}
+
+h5 {
+	font-size: 16px;
+}
+
+h6 {
+	font-size: 16px;
+}
+
+.single-post .entry-content h1,
+.page .entry-content h1 {
+	font-family: 'Montserrat', sans-serif;
+	font-size: 28px;
+	font-weight: 300;
+	color: #a4c4c1;
+}
+
+.single-post article .entry-content h2:first-of-type,
+.page article .entry-content h2:first-of-type {
+	border-left: 2px solid #eee;
+    font-size: 16px;
+    font-style: italic;
+    font-weight: normal;
+    letter-spacing: .5px;
+    line-height: 1.6;
+    padding-left: 30px;
+    text-transform: none;
+}
+
+.single-post article .entry-content h2,
+.page article .entry-content h2 {
+	font-family: 'Montserrat', sans-serif;
+	font-size: 22px;
+	text-transform: uppercase;
+}
+
+.single-post article h3,
+.page article h3 {
+	color: #a4c4c1;
+	font-family: 'Montserrat', sans-serif;
+	font-size: 20px;
+	text-transform: uppercase;
+}
+
+.single-post article h4,
+.page article h4 {
+	color: #a4c4c1;
+	font-size: 22px;
+	font-style: italic;
+}
+
+.single-post article h5,
+.page article h5 {
+	font-size: 16px;
+	text-transform: uppercase;
+	letter-spacing: 2px;
+}
+
+/* ## Objects
+--------------------------------------------- */
+
+embed,
+iframe,
+img,
+object,
+video,
+.featured-content img.entry-image,
+.wp-caption {
+	max-width: 100%;
+}
+
+img {
+	height: auto;
+}
+
+/* ## Gallery
+--------------------------------------------- */
+
+.gallery {
+	overflow: hidden;
+}
+
+.gallery-item {
+	float: left;
+	margin: 0 0 28px;
+	text-align: center;
+}
+
+.gallery-columns-2 .gallery-item {
+	width: 50%;
+}
+
+.gallery-columns-3 .gallery-item {
+	width: 33%;
+}
+
+.gallery-columns-4 .gallery-item {
+	width: 25%;
+}
+
+.gallery-columns-5 .gallery-item {
+	width: 20%;
+}
+
+.gallery-columns-6 .gallery-item {
+	width: 16.6666%;
+}
+
+.gallery-columns-7 .gallery-item {
+	width: 14.2857%;
+}
+
+.gallery-columns-8 .gallery-item {
+	width: 12.5%;
+}
+
+.gallery-columns-9 .gallery-item {
+	width: 11.1111%;
+}
+
+.gallery img {
+	border: 1px solid #ddd;
+	height: auto;
+	padding: 4px;
+}
+
+.gallery img:hover {
+	border: 1px solid #999;
+}
+
+/* ## Forms
+--------------------------------------------- */
+
+input,
+select,
+textarea {
+	background-color: #fff;
+	border: 1px solid #EEE;
+	color: #333;
+	font-size: 15px;
+	font-weight: 300;
+	letter-spacing: .5px;
+	padding: 15px;
+	width: 100%;
+}
+
+input:focus,
+textarea:focus {
+	border: 1px solid #999;
+	outline: none;
+}
+
+input[type="checkbox"],
+input[type="image"],
+input[type="radio"] {
+	width: auto;
+}
+
+::-moz-placeholder {
+	color: #333;
+	font-weight: 300;
+	opacity: 1;
+}
+
+::-webkit-input-placeholder {
+	color: #333;
+	font-weight: 300;
+}
+
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"],
+.button {
+	background: #a4c4c1;
+	border: none;
+	color: #fff;
+	cursor: pointer;
+	font-family: 'Montserrat', sans-serif;
+	font-size: 10px;
+	font-weight: 400;
+	letter-spacing: 2px;
+	padding: 14px 44px;
+	text-transform: uppercase;
+	width: auto;
+}
+
+button:hover,
+input:hover[type="button"],
+input:hover[type="reset"],
+input:hover[type="submit"],
+.button:hover {
+	background-color: #a4c4c1;
+	border-color: #a4c4c1;
+	color: #FFF;
+}
+
+.button {
+	display: inline-block;
+}
+
+a.more-link {
+    border-bottom: 1px solid #a4c4c1;
+    color: #a4c4c1;
+    display: inline-block;
+    font-size: 11px;
+    font-weight: 400;
+    margin: 20px auto;
+    padding-right: 30px;
+    text-align: left;
+    text-transform: uppercase;
+}
+
+a.more-link:hover {
+	border-color: #333;
+	color: #333;
+}
+
+.more-from-category a,
+.posts-link a {
+	border-bottom: 1px solid #ffc933;
+	color: #a4c4c1;
+	font-size: 11px;
+	font-weight: 500;
+	padding: 5px 0 5px 30px;
+	text-align: right;
+	text-transform: uppercase;
+}
+
+.more-from-category a:hover,
+.posts-link a:hover,
+.more-from-category:hover,
+.posts-link:hover  {
+	border-color: #333;
+	color: #333;
+}
+
+.more-from-category a,
+.posts-link a {
+	color: #ffc933;
+}
+
+.more-from-category a:after,
+.posts-link a:after,
+a.more-link:after {
+	content: "\f139";
+	font-family: 'dashicons';
+	vertical-align: middle;
+}
+
+.content .widget:nth-of-type(3n+2) .more-from-category a,
+.content .widget:nth-of-type(3n+2) .posts-link a {
+	color: #f6748e;
+	border-color: #f6748e;
+}
+
+.content .widget:nth-of-type(3n+3) .more-from-category a,
+.content .widget:nth-of-type(3n+3) .posts-link a {
+	color: #a4c4c1;
+	border-color: #a4c4c1;
+}
+
+.content .widget:nth-of-type(3n+2) .more-from-category a:hover,
+.content .widget:nth-of-type(3n+2) .posts-link a:hover,
+.content .widget:nth-of-type(3n+3) .more-from-category a:hover,
+.content .widget:nth-of-type(3n+3) .posts-link a:hover {
+	color: #333;
+	border-color: #333;
+}
+
+a.wprm-jump-to-recipe-shortcode {
+	background: #fff;
+	border-radius: 100px;
+	border: 1px solid #a4c4c1;
+    display: inline-block;
+    float: right;
+    font-size: 10px;
+    font-weight: bold;
+    height: 70px;
+    line-height: 1.2;
+    margin: 10px 0 10px 10px;
+    padding-top: 19px;
+    text-align: center;
+    text-decoration: none;
+    text-transform: uppercase;
+    width: 70px;
+}
+
+a.wprm-jump-to-recipe-shortcode:hover {
+	border-color: #333;
+}
+
+a.wprm-jump-to-recipe-shortcode:after {
+	content: "\f347";
+	display: block;
+	font-family: 'dashicons';
+	font-size: 18px;
+}
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-results-button {
+	display: none;
+}
+
+/* ## Tables
+--------------------------------------------- */
+
+table {
+	border-collapse: collapse;
+	border-spacing: 0;
+	line-height: 2;
+	margin-bottom: 40px;
+	width: 100%;
+}
+
+tbody {
+	border-bottom: 1px solid #FAF9F7;
+}
+
+td,
+th {
+	text-align: left;
+}
+
+td {
+	border-top: 1px solid #FAF9F7;
+	padding: 10px 0;
+}
+
+th {
+	font-weight: 400;
+}
+
+
+/* # Structure and Layout
+---------------------------------------------------------------------------------------------------- */
+
+/* ## Site Containers
+--------------------------------------------- */
+
+.site-inner,
+.wrap {
+	margin: 0 auto;
+	max-width: 1280px;
+}
+
+.site-inner {
+	clear: both;
+	margin: 30px auto 30px;
+}
+
+.captivating-landing .site-inner {
+	width: 800px;
+}
+
+/* ## Column Widths and Positions
+--------------------------------------------- */
+
+/* ### Wrapping div for .content and .sidebar-primary */
+
+.content-sidebar-sidebar .content-sidebar-wrap,
+.sidebar-content-sidebar .content-sidebar-wrap,
+.sidebar-sidebar-content .content-sidebar-wrap {
+	width: 980px;
+}
+
+.content-sidebar-sidebar .content-sidebar-wrap {
+	float: left;
+}
+
+.sidebar-content-sidebar .content-sidebar-wrap,
+.sidebar-sidebar-content .content-sidebar-wrap {
+	float: right;
+}
+
+/* ### Content */
+
+.content {
+	background: #fff;
+	float: right;
+	padding: 30px;
+	width: 860px;
+}
+
+.content-sidebar .content,
+.content-sidebar-sidebar .content,
+.sidebar-content-sidebar .content {
+	float: left;
+}
+
+.content-sidebar-sidebar .content,
+.sidebar-content-sidebar .content,
+.sidebar-sidebar-content .content {
+	width: 580px;
+}
+
+.full-width-content .content {
+	width: 100%;
+}
+
+/* ### Primary Sidebar */
+
+.sidebar-primary {
+	float: right;
+	width: 392px;
+}
+
+.sidebar-content .sidebar-primary,
+.sidebar-sidebar-content .sidebar-primary {
+	float: left;
+}
+
+/* ### Secondary Sidebar */
+
+.sidebar-secondary {
+	float: left;
+	width: 180px;
+}
+
+.content-sidebar-sidebar .sidebar-secondary {
+	float: right;
+}
+
+/* ## Column Classes
+--------------------------------------------- */
+/* Link: http://twitter.github.io/bootstrap/assets/css/bootstrap-responsive.css */
+
+.five-sixths,
+.four-sixths,
+.one-fourth,
+.one-half,
+.one-sixth,
+.one-third,
+.three-fourths,
+.three-sixths,
+.two-fourths,
+.two-sixths,
+.two-thirds {
+	float: left;
+	margin-left: 2.564102564102564%;
+}
+
+.one-half,
+.three-sixths,
+.two-fourths {
+	width: 48.717948717948715%;
+}
+
+.one-third,
+.two-sixths {
+	width: 31.623931623931625%;
+}
+
+.four-sixths,
+.two-thirds {
+	width: 65.81196581196582%;
+}
+
+.one-fourth {
+	width: 23.076923076923077%;
+}
+
+.three-fourths {
+	width: 74.35897435897436%;
+}
+
+.one-sixth {
+	width: 14.52991452991453%;
+}
+
+.five-sixths {
+	width: 82.90598290598291%;
+}
+
+.first {
+	clear: both;
+	margin-left: 0;
+}
+
+
+/* # Common Classes
+---------------------------------------------------------------------------------------------------- */
+
+/* ## Avatar
+--------------------------------------------- */
+
+.avatar {
+	float: left;
+}
+
+.alignleft .avatar,
+.author-box .avatar {
+	margin-right: 24px;
+}
+
+.alignright .avatar {
+	margin-left: 24px;
+}
+
+.comment .avatar {
+	margin: 0 16px 24px 0;
+}
+
+/* ## Genesis
+--------------------------------------------- */
+
+.breadcrumb {
+	background: #F9F9F9;
+	margin-bottom: 20px;
+	padding: 5px 10px;
+	text-align: center;
+}
+
+.author-box {
+	background: #f7f9fc;
+	margin-bottom: 30px;
+	padding: 30px;
+}
+
+.archive-description {
+	margin-bottom: 30px;
+}
+
+.archive-description h1 {
+	margin-bottom: 20px;
+}
+
+.author-box-title {
+	font-size: 20px;
+	margin-bottom: 15px;
+}
+
+.archive-description p:last-child,
+.author-box p:last-child {
+	margin-bottom: 0;
+}
+
+/* ## Search Form
+--------------------------------------------- */
+
+.search-form {
+	overflow: hidden;
+}
+
+.site-header .search-form {
+	float: right;
+	margin-top: 12px;
+}
+
+.entry-content .search-form,
+.site-header .search-form {
+	width: 50%;
+}
+
+.genesis-nav-menu .search input[type="submit"],
+.widget_search input[type="submit"] {
+	border: 0;
+	clip: rect(0, 0, 0, 0);
+	height: 1px;
+	margin: -1px;
+	padding: 0;
+	position: absolute;
+	width: 1px;
+}
+
+/* ## Titles
+--------------------------------------------- */
+
+.archive-title {
+	font-size: 20px;
+}
+
+.entry-title,
+.page-title {
+	font-size: 30px;
+	font-weight: 300;
+	margin: 0 0 15px;
+}
+
+.archive .entry-title {
+	font-size: 20px;
+}
+
+.entry-title a,
+.sidebar .widget-title a {
+	color: #333;
+}
+
+.entry-title a:hover {
+	color: #a4c4c1;
+}
+
+.widget-title {
+	font-family: 'Montserrat', sans-serif;
+	font-weight: 500;
+	font-size: 16px;
+	letter-spacing: 1px;
+	margin-bottom: 20px;
+	padding: 10px 0;
+	text-align: left;
+	text-transform: uppercase;
+}
+
+.sidebar-primary .widgettitle {
+    padding: 0 10px;
+    position: relative;
+    text-transform: uppercase;
+    z-index: 1;
+}
+
+.sidebar-primary .widgettitle::after {
+    background: #fff7e1;
+    content: "";
+    height: 12px;
+    left: 0;
+    position: absolute;
+    right: 0;
+    top: 60%;
+    z-index: -1;
+}
+
+.sidebar-primary .widget:nth-of-type(3n+2) .widgettitle::after {
+	background: #fff4f0;
+}
+
+.sidebar-primary .widget:nth-of-type(3n+3) .widgettitle::after {
+	background: #f7f9fc;
+}
+
+/* ## WordPress
+--------------------------------------------- */
+
+a.aligncenter img {
+	display: block;
+	margin: 0 auto;
+}
+
+a.alignnone {
+	display: inline-block;
+}
+
+.alignleft {
+	float: left;
+	text-align: left;
+}
+
+.alignright {
+	float: right;
+	text-align: right;
+}
+
+a.alignleft,
+a.alignnone,
+a.alignright {
+	max-width: 100%;
+}
+
+img.centered,
+.aligncenter {
+	display: block;
+	margin: 0 auto 24px;
+}
+
+img.alignnone,
+.alignnone {
+	margin-bottom: 12px;
+}
+
+a.alignleft,
+img.alignleft,
+.wp-caption.alignleft {
+	margin: 0 24px 24px 0;
+}
+
+a.alignright,
+img.alignright,
+.wp-caption.alignright {
+	margin: 0 0 24px 24px;
+}
+
+.wp-caption-text {
+	font-size: 11px;
+	font-weight: 500;
+	text-align: center;
+}
+
+.entry-content p.wp-caption-text {
+	margin-bottom: 0;
+}
+
+.sticky {
+}
+
+
+/* # Widgets
+---------------------------------------------------------------------------------------------------- */
+
+.widget {
+	word-wrap: break-word;
+}
+
+.widget ol > li {
+	list-style-position: inside;
+	list-style-type: decimal;
+}
+
+.widget li li {
+	border: none;
+	margin: 0 0 0 30px;
+	padding: 0;
+}
+
+.widget_calendar table {
+	width: 100%;
+}
+
+.widget_calendar td,
+.widget_calendar th {
+	text-align: center;
+}
+
+/* Announcement Widget
+------------------------------------------------------ */
+
+.announcement-widget {
+	background: #F7F9FC;
+	font-family: 'Poppins', sans-serif;
+	font-weight: 300;
+	font-size: 10px;
+	letter-spacing: 2px;
+	padding: 10px 20px;
+	text-align: center;
+	text-transform: uppercase;
+}
+
+.announcement-widget p {
+	margin: 0;
+}
+
+.announcement-widget .button {
+	padding: 5px 20px;
+}
+
+.woocommerce .announcement-widget .button {
+	background: transparent none repeat scroll 0 0;
+    border: 1px solid #333;
+    border-radius: 0;
+    color: #333;
+    cursor: pointer;
+    font-family: "Montserrat",sans-serif;
+    font-size: 10px;
+    font-weight: 400;
+    letter-spacing: 2px;
+    padding: 10px 20px;
+    text-transform: uppercase;
+    width: auto;
+}
+
+.admin-bar .announcement-widget.fixed {
+	top: 32px;
+}
+
+.announcement-widget.fixed {
+	position: fixed;
+	top: 0;
+	width: 100%;
+	z-index: 999;
+}
+
+.announcement-widget.fixed .wrap {
+	margin: 0 auto;
+}
+
+.announcement-widget.fixed + div {
+	border-top: 74px solid transparent;	
+}
+
+.announcement-widget .widget-title {
+	display: none;
+}
+
+.announcement-widget .enews-widget p {
+	background: transparent;
+	float: left;
+	font-size: 10px;
+	font-weight: 300;
+	letter-spacing: 2px;
+	width: 50%;
+	margin: 0;
+	padding: 10px 20px;
+	text-align: right;
+	text-transform: uppercase;
+}
+
+.announcement-widget form {
+	float: right;
+	margin: 0 auto;
+	padding: 0 30px 0 10px;
+	width: 50%;
+}
+
+.announcement-widget .enews-widget input {
+	float: left;
+	width: 27%;
+	margin-right: 10px;
+	margin-bottom: 0;
+	padding: 12px;
+}
+
+.announcement-widget .enews-widget input[type="submit"] {
+	background: #a4c4c1;
+	border-color: #a4c4c1;
+	color: #fff;
+	width: auto;
+	padding: 12px 34px;
+	margin-right: 0;
+}
+
+.announcement-widget .enews-widget input[type="submit"]:hover {
+	background: transparent;
+	border-color: #333;
+	color: #333;
+}
+
+
+/* Widget Above Custom Blog
+------------------------------------------------------ */
+
+.above-blog-content {
+	background: #f7f9fc;
+	margin-bottom: 30px;
+}
+
+.above-blog-content .wrap {
+	padding: 30px;
+}
+
+.above-blog-content .entry {
+	background: transparent;
+	float: left;
+	margin-right: 2%;
+	width: 32%;
+}
+
+.above-blog-content .entry:nth-of-type(3n+3),
+.above-blog-content .widget:nth-of-type(3n+3) .entry {
+	margin-right: 0;
+}
+
+.above-blog-content .featured-content .entry {
+	margin-bottom: 0;
+	padding: 0;
+}
+
+.above-blog-content .entry-title {
+	font-size: 20px;
+	text-align: center;
+}
+
+.captivating-custom-blog .content .entry {
+	float: left;
+	width: 48.7179%;
+}
+
+.captivating-custom-blog .content .entry:nth-of-type(2n+3) {
+	margin-left: 2.5641%;
+}
+
+.captivating-custom-blog .content .entry:nth-of-type(1) {
+	width: 100%;
+}
+
+/* Site Wide CTA
+------------------------------------------------------ */
+
+.site-wide-cta {
+	background: #f7f9fc;
+	border: none;
+	font-family: 'Poppins', sans-serif;
+	padding: 30px;
+}
+
+.site-wide-cta .enews-widget {
+	color: #333;
+}
+
+.site-wide-cta .enews-widget p {
+	font-family:'playfair display';
+	background: transparent;
+	float: left;
+	font-size: 22px;
+	font-weight: 300;
+	letter-spacing: 2px;
+	margin-top: 8px;
+	margin-bottom: 0;
+	padding: 20px;
+	text-align: center;
+	text-transform: uppercase;
+	color:#b84d57;
+}
+
+.site-wide-cta .enews {
+	display: -webkit-box;
+	display: -webkit-flex;
+	display: -ms-flexbox;
+	display: flex;
+	-webkit-box-pack: center;
+	-webkit-justify-content: center;
+	    -ms-flex-pack: center;
+	        justify-content: center;
+	-webkit-box-align: center;
+	-webkit-align-items: center;
+	    -ms-flex-align: center;
+	        align-items: center;
+	margin: 0 auto;
+}
+
+.site-wide-cta .widget-title {
+	margin-bottom: 0;
+	font-size: 20px;
+	margin-right: 20px;
+}
+
+.site-wide-cta form {
+	display: -webkit-box;
+	display: -webkit-flex;
+	display: -ms-flexbox;
+	display: flex;
+	-webkit-box-flex: 1;
+	-webkit-flex: 1;
+	    -ms-flex: 1;
+	        flex: 1; /* grow this item to fill the available space */
+	padding: 0 20px;
+}
+
+.site-wide-cta .enews-widget input {
+	margin-bottom: 0;
+	width: auto;
+	margin-right: 10px;
+	padding: 15px;
+	line-height: 1;
+	font-size: 10px;
+	-webkit-box-flex: 3;
+	-webkit-flex: 3;
+	    -ms-flex: 3;
+	        flex: 3;
+}
+
+.site-wide-cta .enews-widget input[type="submit"] {
+	margin-right: 0;
+	padding: 10px 50px;
+	-webkit-box-flex: 1;
+	-webkit-flex: 1;
+	    -ms-flex: 1;
+	        flex: 1;
+}
+
+/* Widget below footer
+------------------------------------------------------ */
+
+.widget-below-footer {
+	background: #fff;
+	padding:20px;
+}
+
+/* ## Featured Content
+--------------------------------------------- */
+
+.featured-content .entry {
+	margin-bottom: 20px;
+	padding: 0 0 24px;
+}
+
+/* # Plugins
+---------------------------------------------------------------------------------------------------- */
+
+
+/* ## Convert Kit
+--------------------------------------------- */
+
+div.ck_form {
+	background: #f7f9fc;
+	border: none;
+	box-shadow: none;
+	color: #333;
+	font-family: "Montserrat",sans-serif;
+}
+
+div.ck_form_content h3,
+div.ck_label {
+	color: #a4c4c1;
+	font-family: "Montserrat",sans-serif;
+	font-size: 20px;
+	font-weight: 400;
+	text-transform: uppercase;
+}
+
+div.ck_form_content p {
+	font-family: "Montserrat",sans-serif;
+	font-size: 14px;
+}
+
+div.ck_label {
+	font-family: "Montserrat",sans-serif;
+}
+
+div.ck_form .ck_subscribe_button {
+	background: transparent none repeat scroll 0 0;
+    border: 1px solid #333;
+    border-radius: 0;
+    color: #333;
+    cursor: pointer;
+    font-family: "Montserrat",sans-serif;
+    font-size: 10px;
+    font-weight: 400;
+    letter-spacing: 2px;
+    padding: 14px 44px;
+    text-transform: uppercase;
+}
+
+div.ck_form .ck_subscribe_button:hover {
+    background-color: #a4c4c1;
+    border-color: #a4c4c1;
+    color: #fff;
+}
+
+div.ck_form input[type="text"], 
+div.ck_form input[type="email"] {
+	background: #fff;
+	border: none;
+	border-radius: 0;
+	padding: 15px 10px;
+}
+
+/* ## Genesis eNews Extended
+--------------------------------------------- */
+
+.enews-widget input {
+	font-size: 10px;
+	letter-spacing: 2px;
+	margin-bottom: 16px;
+	text-transform: uppercase;
+}
+
+.enews-widget input[type="submit"] {
+	margin: 0;
+	width: 100%;
+}
+
+.enews form + p {
+	margin-top: 24px;
+}
+
+/* Genesis Responsive Slider
+--------------------------------------------- */
+
+.front-page #genesis-responsive-slider {
+	border: 0;
+	margin: 0 auto 50px;
+	padding: 0;
+	position: relative;
+}
+
+.front-page .slide-excerpt {
+	background: transparent;
+	margin: 0 0 20%;
+	opacity: 1;
+	width: 100%;
+}
+
+.front-page .slide-excerpt-border {
+	border: 0;
+	display: inline;
+	float: left;
+	margin: 0;
+	padding: 0;
+	width: 100%;
+}
+
+.front-page .slide-excerpt-border h2 {
+	margin: 29% 0;
+	text-align: center;
+	width: 100%;
+}
+
+.front-page #genesis-responsive-slider h2 a {
+	background: rgba(255,255,255,.8);
+	color: #333;
+	font-size: 20px;
+	margin: 0;
+	overflow: visible;
+	padding: 15px;
+	text-align: center;
+	width: 100%;
+}
+
+.front-page .genesis_responsive_slider .flex-direction-nav li a {
+	background: url(images/icon-direction-nav.png) no-repeat -44px 0;
+	background-size: 88px 96px;
+	height: 48px;
+	right: 10px;
+	-webkit-transition: none;
+	   -moz-transition: none;
+	    -ms-transition: none;
+	     -o-transition: none;
+	        transition: none;
+	width: 44px;
+}
+
+.front-page .genesis_responsive_slider .flex-direction-nav li a:hover {
+	background-position: -44px -48px;
+}
+
+.front-page .genesis_responsive_slider .flex-direction-nav li a.prev {
+	background-position: 0 0;
+	left: 10px;
+}
+
+.front-page .genesis_responsive_slider .flex-direction-nav li a:hover.prev {
+	background-position: 0 -48px;
+}
+
+.front-page .genesis_responsive_slider .flexslider .slides > li {
+	overflow: hidden;
+}
+
+.front-page .genesis_responsive_slider .flex-control-nav {
+	margin: 15px 0 0;
+	text-align: center;
+	width: 100%;
+	height: 5px;
+}
+
+.front-page .genesis_responsive_slider .flex-control-nav li a {
+	background: url(images/icon-control-nav.png) no-repeat 0 0;
+	background-size: 13px 39px;
+}
+
+.front-page .genesis_responsive_slider .flex-control-nav li a:hover {
+	background-position: 0 -13px;
+}
+
+.front-page .genesis_responsive_slider .flex-control-nav li a.active {
+	background-position: 0 -26px;
+}
+
+/* Gravity Forms
+--------------------------------------------- */
+
+div.gform_wrapper input[type="email"],
+div.gform_wrapper input[type="text"],
+div.gform_wrapper textarea {
+	font-size: 16px;
+	padding: 16px;
+}
+
+div.gform_wrapper .ginput_complex label {
+	font-size: 12px;
+	font-style: italic;
+	padding: 0;
+}
+
+div.gform_wrapper .top_label .gfield_label {
+	font-weight: 300;
+	text-transform: uppercase;
+}
+
+div.gform_wrapper li,
+div.gform_wrapper form li {
+	margin: 16px 0 0;
+}
+
+div.gform_wrapper .gform_footer input[type="submit"] {
+	font-size: 10px;
+}
+
+.ninja-forms-req-symbol,
+.nf-error-msg {
+	color: #55c7cf !important;
+}
+
+/* Instagram Feed
+--------------------------------------------- */
+
+#sb_instagram #sbi_load .sbi_load_btn, #sb_instagram .sbi_follow_btn a {
+	border-radius: 0 !important;
+    font-family: 'Montserrat', sans-serif;
+    font-size: 9px !important;
+    font-weight: 400;
+    letter-spacing: 2px;
+    padding: 10px 25px;
+    text-transform: uppercase;
+    width: auto;
+}
+
+/* RewardStyle
+--------------------------------------------- */
+
+.shopthepost-widget {
+	border: 1px solid #eee;
+	margin-bottom: 30px;
+	padding: 30px;
+}
+
+div.amzn-native-product {
+	border: none !important;
+}
+
+/* Social Warfare
+--------------------------------------------- */
+
+.nc_socialPanel.swp_flatFresh.swp_d_fullColor .googlePlus, body .nc_socialPanel.swp_flatFresh.swp_o_fullColor:hover .googlePlus:not(:hover), html body .nc_socialPanel.swp_flatFresh.swp_i_fullColor .googlePlus:hover,
+.nc_socialPanel.swp_flatFresh.swp_d_fullColor .twitter, body .nc_socialPanel.swp_flatFresh.swp_o_fullColor:hover .twitter:not(:hover), html body .nc_socialPanel.swp_flatFresh.swp_i_fullColor .twitter:hover,
+.nc_socialPanel.swp_flatFresh.swp_d_fullColor .swp_fb, body .nc_socialPanel.swp_flatFresh.swp_o_fullColor:hover .swp_fb:not(:hover), html body .nc_socialPanel.swp_flatFresh.swp_i_fullColor .swp_fb:hover,
+.nc_socialPanel.swp_flatFresh.swp_d_fullColor .linkedIn, body .nc_socialPanel.swp_flatFresh.swp_o_fullColor:hover .linkedIn:not(:hover), html body .nc_socialPanel.swp_flatFresh.swp_i_fullColor .linkedIn:hover,
+.nc_socialPanel.swp_flatFresh.swp_d_fullColor .nc_pinterest, body .nc_socialPanel.swp_flatFresh.swp_o_fullColor:hover .nc_pinterest:not(:hover), html body .nc_socialPanel.swp_flatFresh.swp_i_fullColor .nc_pinterest:hover,
+.nc_socialPanel.swp_flatFresh.swp_d_fullColor .swp_stumbleupon, body .nc_socialPanel.swp_flatFresh.swp_o_fullColor:hover .swp_stumbleupon:not(:hover), html body .nc_socialPanel.swp_flatFresh.swp_i_fullColor .swp_stumbleupon:hover {
+	border: none !important;
+}
+
+.nc_socialPanel.swp_d_fullColor .googlePlus,
+body .nc_socialPanel.swp_o_fullColor:hover .googlePlus,
+html body .nc_socialPanel.swp_i_fullColor .googlePlus:hover,
+.nc_socialPanel.swp_d_fullColor .twitter, body .nc_socialPanel.swp_o_fullColor:hover .twitter, html body .nc_socialPanel.swp_i_fullColor .twitter:hover,
+.nc_socialPanel.swp_d_fullColor .swp_fb, body .nc_socialPanel.swp_o_fullColor:hover .swp_fb, html body .nc_socialPanel.swp_i_fullColor .swp_fb:hover,
+.nc_socialPanel.swp_d_fullColor .linkedIn, body .nc_socialPanel.swp_o_fullColor:hover .linkedIn, html body .nc_socialPanel.swp_i_fullColor .linkedIn:hover,
+.nc_socialPanel.swp_d_fullColor .nc_pinterest, body .nc_socialPanel.swp_o_fullColor:hover .nc_pinterest, html body .nc_socialPanel.swp_i_fullColor .nc_pinterest:hover,
+.nc_socialPanel.swp_d_fullColor .swp_stumbleupon, body .nc_socialPanel.swp_o_fullColor:hover .swp_stumbleupon, html body .nc_socialPanel.swp_i_fullColor .swp_stumbleupon:hover {
+	background-color: #55c7cf !important;
+}
+
+div.nc_socialPanel {
+	margin-bottom: 40px !important;
+}
+
+/* Simple Social Icons
+--------------------------------------------- */
+
+.genesis-nav-menu .simple-social-icons ul li a,
+.genesis-nav-menu .simple-social-icons ul li a:hover,
+.announcement-widget .simple-social-icons ul li a,
+.announcement-widget .simple-social-icons ul li a:hover {
+	background: transparent !important;
+}
+
+.genesis-nav-menu .simple-social-icons ul li {
+	margin: 0 6px 0px !important;
+}
+
+/* Soliloquy
+--------------------------------------------- */
+
+div.soliloquy-container {
+	margin-bottom: -24px;
+}
+
+div.soliloquy-container .soliloquy-next,
+div.soliloquy-container .soliloquy-prev {
+	background-color: transparent;
+}
+
+/* WP Recipe Maker
+--------------------------------------------- */
+
+.wprm-recipe-print {
+	background: #FFF4F0;
+	padding: 10px 50px;
+}
+
+.wprm-recipe-print:hover {
+	background: #F7F9FC;
+}
+
+.wprm-recipe-simple {
+	border: 2px solid #eee !important;
+	padding: 30px !important;
+}
+
+.single-post article .entry-content .wprm-recipe-simple h2:first-of-type {
+	border: medium none;
+    font-size: 20px;
+    font-style: normal;
+    margin-bottom: 30px;
+    padding: 0;
+    text-transform: uppercase;
+}
+
+.wprm-recipe-simple h3.wprm-recipe-header {
+	margin: 20px 0 !important;
+}
+
+/* WooCommerce
+--------------------------------------------- */
+
+/* WooCommerce Content
+-------------------------- */
+
+.woocommerce .content {
+    background: #fff;
+    padding: 30px;
+}
+
+/* WooCommerce Buttons
+-------------------------- */
+
+.woocommerce .site-inner #respond input#submit, 
+.woocommerce .site-inner a.button, 
+.woocommerce .site-inner button.button, 
+.woocommerce .site-inner input.button {
+	background-color: transparent !important;
+    border-bottom: 1px solid #55c7cf !important;
+    border-radius: 0px !important;
+    color: #55c7cf !important;
+    cursor: pointer;
+    font-size: 10px !important;
+    font-weight: 400 !important;
+    padding: 15px 20px 5px 0 !important;
+    text-align: left;
+    text-transform: uppercase !important;
+    width: auto !important;
+}
+
+.woocommerce .site-inner #respond input#submit:hover, 
+.woocommerce .site-inner a.button:hover, 
+.woocommerce .site-inner button.button:hover, 
+.woocommerce .site-inner input.button:hover {
+	background-color: transparent !important;
+	border-color: #333 !important;
+	color: #333 !important;
+}
+
+.woocommerce .site-inner #respond input#submit:after, 
+.woocommerce .site-inner a.button:after, 
+.woocommerce .site-inner button.button:after, 
+.woocommerce .site-inner input.button:after {
+	content: "\f139";
+	font-family: 'dashicons';
+	vertical-align: middle;
+}
+
+/* WooCommerce Tabs
+-------------------------- */
+
+.woocommerce div.product .woocommerce-tabs ul.tabs::before,
+.woocommerce div.product .woocommerce-tabs ul.tabs li {
+	border-color: #EEE !important;
+}
+
+.woocommerce div.product .woocommerce-tabs ul.tabs li::after,
+.woocommerce div.product .woocommerce-tabs ul.tabs li::before {
+	display: none  !important;
+}
+
+.woocommerce div.product .woocommerce-tabs ul.tabs li {
+	background-color: #EEE  !important;
+	border-radius: 0  !important;
+	padding: 0  !important;
+}
+
+.woocommerce div.product .woocommerce-tabs ul.tabs li.active {
+	background-color: #fff  !important;
+	border-radius: 0  !important;
+	padding: 0  !important;
+}
+
+.woocommerce div.product .woocommerce-tabs ul.tabs li a {
+	color: #333  !important;
+	padding: .5em 1em  !important;
+	font-weight: 300 !important;
+	font-family: "Montserrat",sans-serif;
+	text-transform: uppercase;
+	font-size: 10px;
+	letter-spacing: 2px;
+}
+
+.woocommerce div.product .woocommerce-tabs ul.tabs li a:focus,
+.woocommerce div.product .woocommerce-tabs ul.tabs li a:hover {
+	color: #55c7cf  !important;
+}
+
+/* WooCommerce Titles
+-------------------------- */
+
+.woocommerce ul.products li.product h3 {
+	font-size: 20px !important;
+}
+
+.woocommerce .product-title {
+	color: #333;
+	font-family: 'Playfair Display', serif;
+	font-weight: 400;
+	font-size: 20px;
+}
+
+.woocommerce .product-title:hover {
+	color: #55c7cf;
+}
+
+.woocommerce ul.products li.product .woocommerce-loop-category__title,
+.woocommerce ul.products li.product .woocommerce-loop-product__title,
+.woocommerce ul.products li.product h3 {
+	font-size: 20px !important;
+}
+
+/* WooCommerce Widget
+-------------------------- */
+
+.woocommerce ul.cart_list li, 
+.woocommerce ul.product_list_widget li, 
+.woocommerce-page ul.cart_list li, 
+.woocommerce-page ul.product_list_widget li {
+	float: left;
+	margin-right: 2% !important;
+	width: 32%;
+}
+
+.woocommerce ul.cart_list li:nth-of-type(3n+3), 
+.woocommerce ul.product_list_widget li:nth-of-type(3n+3), 
+.woocommerce-page ul.cart_list li:nth-of-type(3n+3), 
+.woocommerce-page ul.product_list_widget li:nth-of-type(3n+3) {
+	margin-right: 0 !important;
+}
+
+.sidebar .woocommerce ul.cart_list li, 
+.sidebar .woocommerce ul.product_list_widget li, 
+.sidebar .woocommerce-page ul.cart_list li, 
+.sidebar .woocommerce-page ul.product_list_widget li {
+	float: left;
+	padding: 1% !important;
+	width: 50%;
+}
+
+.woocommerce ul.products li.product, 
+.woocommerce-page ul.products li.product {
+	width: 30.6% !important;
+}
+
+.woocommerce ul.cart_list li img, .woocommerce ul.product_list_widget li img {
+	width: 100% !important;
+}
+
+/* WooCommerce Cart
+-------------------------- */
+
+.woocommerce-cart table.cart img {
+	width: 100px !important;
+}
+
+.woocommerce-checkout #payment ul.payment_methods li {
+	list-style: none;
+}
+
+.woocommerce-page input[type="checkbox"], 
+.woocommerce-page input[type="radio"] {
+	width: auto;
+}
+
+.woocommerce ul.products li.product .price del,
+.woocommerce div.product p.price del,
+.woocommerce div.product span.price del {
+	display: inline !important;
+}
+
+.woocommerce-cart table.cart td.actions .coupon .input-text {
+	padding: 17px 5px !important;
+}
+
+.woocommerce-checkout #payment {
+	background-color: #F7F9FC !important;
+}
+
+.woocommerce form .form-row textarea {
+	height: 50px !important;
+}
+
+/* WooCommerce Other
+-------------------------- */
+
+.woocommerce .woocommerce-message::before,
+.woocommerce .woocommerce-info::before,
+.woocommerce div.product p.price,
+.woocommerce div.product span.price,
+.woocommerce ul.products li.product .price,
+.woocommerce form .form-row .required {
+	color: #55c7cf !important;
+}
+
+.woocommerce .woocommerce-message,
+.woocommerce .woocommerce-info {
+	border-top-color: #55c7cf !important;
+}
+
+.woocommerce div.product p.price, 
+.woocommerce div.product span.price {
+	text-align: left;
+}
+
+.woocommerce span.onsale {
+	background-color: #55c7cf !important;
+	border-radius: 0 !important;
+	font-size: 10px !important;
+	left: 0 !important;
+	letter-spacing: 2px;
+	margin: 0 !important;
+	padding: 5px 10px !important;
+	text-transform: uppercase !important;
+	top: 0 !important;
+}
+
+.woocommerce .up-sells {
+	clear: both;
+}
+
+.woocommerce .quantity .qty {
+	padding: 13px 0px !important;
+}
+
+figure.woocommerce-product-gallery__wrapper {
+	margin: 0px;
+}
+
+/* # Site Header
+---------------------------------------------------------------------------------------------------- */
+
+.site-header {
+	background: #fff;
+	min-height: 300px;
+}
+
+.site-header .wrap {
+	padding: 0;
+}
+
+/* ## Title Area
+--------------------------------------------- */
+
+.title-area {
+	float: left;
+	margin: 0 auto;
+	padding: 20px 0;
+	text-align: center;
+	width: 100%;
+}
+
+.header-full-width .title-area {
+	float: none;
+	margin: 0 auto;
+	padding: 20px 0;
+	text-align: center;
+	width: 100%;
+}
+
+.header-image .title-area {
+	background: none;
+	padding: 0;
+}
+
+.site-title {
+	font-family: 'Playfair Display', serif;
+	font-size: 45px;
+	font-weight: 300;
+	letter-spacing: 8px;
+	line-height: 1.2;
+	text-transform: uppercase;
+}
+
+.site-title a,
+.site-title a:hover {
+	color: #333;
+}
+
+.header-image .site-title > a {
+	background-position: center center !important;
+    background-size: contain !important;
+    display: block;
+    height: 300px;
+    margin: 0 auto;
+}
+
+.site-description {
+	display: block;
+	font-family: 'Montserrat', sans-serif;
+	font-size: 10px;
+	letter-spacing: 3px;
+	margin-bottom: 0;
+}
+
+.site-description,
+.site-title {
+	margin-bottom: 0;
+}
+
+.header-image .site-description,
+.header-image .site-title {
+	display: block;
+	text-indent: -9999px;
+}
+
+/* ## Widget Area
+--------------------------------------------- */
+
+.site-header .widget-area {
+	float: right;
+	padding: 25px 0 0;
+	text-align: right;
+	width: 800px;
+}
+
+.header-image .site-header .widget-area {
+	padding: 25px 0 0;
+}
+
+
+/* # Site Navigation
+---------------------------------------------------------------------------------------------------- */
+
+.genesis-nav-menu {
+	clear: both;
+	font-family: 'Poppins', sans-serif;
+	font-size: 11px;
+	font-weight: 400;
+	letter-spacing: 2px;
+	line-height: 1;
+	text-transform: uppercase;
+	width: 100%;
+}
+
+.genesis-nav-menu li {
+	float: none;
+	list-style-type: none;
+}
+
+.genesis-nav-menu li li {
+	margin-left: 0;
+}
+
+.genesis-nav-menu .menu-item {
+	display: inline-block;
+	text-align: center;
+}
+
+.genesis-nav-menu .menu-item:hover {
+	position: relative;
+}
+
+.genesis-nav-menu a {
+	color: #333;
+	display: block;
+	padding: 20px;
+	text-transform: uppercase;
+}
+
+.genesis-nav-menu a:hover,
+.genesis-nav-menu .current-menu-item > a {
+	color: #55c7cf;
+}
+
+.genesis-nav-menu .sub-menu {
+	background: #F8FAFC;
+	left: -9999px;
+	opacity: 0;
+	position: absolute;
+	-webkit-transition: opacity .4s ease-in-out;
+	-moz-transition:    opacity .4s ease-in-out;
+	-ms-transition:     opacity .4s ease-in-out;
+	-o-transition:      opacity .4s ease-in-out;
+	transition:         opacity .4s ease-in-out;
+	width: 200px;
+	z-index: 99;
+}
+
+.genesis-nav-menu .sub-menu::after, 
+.genesis-nav-menu .sub-menu::before {
+    border: medium solid transparent;
+    bottom: 100%;
+    content: " ";
+    height: 0;
+    left: 50%;
+    pointer-events: none;
+    position: absolute;
+    width: 0;
+}
+
+.genesis-nav-menu .sub-menu::after {
+    border-bottom-color: #F8FAFC;
+}
+
+.genesis-nav-menu .sub-menu::after {
+    border-width: 8px;
+    margin-left: -10px;
+}
+
+.genesis-nav-menu .sub-menu a {
+	font-size: 9px;
+	position: relative;
+	width: 200px;
+}
+
+.genesis-nav-menu .sub-menu .sub-menu {
+	margin: -50px 0 0 199px;
+}
+
+.genesis-nav-menu .menu-item:hover > .sub-menu {
+	left: 50%;
+	margin-left: -100px;
+	opacity: 1;
+}
+
+.genesis-nav-menu .menu-item:hover > .sub-menu > .menu-item:hover > .sub-menu {
+	left: 199px;
+	margin-left: 0px;
+	opacity: 1;
+}
+
+.genesis-nav-menu > .first > a {
+	padding-left: 0;
+}
+
+.genesis-nav-menu > .last > a {
+	padding-right: 0;
+}
+
+.genesis-nav-menu > .right {
+	color: #fff;
+	float: right;
+	list-style-type: none;
+	padding: 20px 0;
+}
+
+.genesis-nav-menu > .right > a {
+	display: inline;
+	padding: 0;
+}
+
+.genesis-nav-menu > .rss > a {
+	margin-left: 48px;
+}
+
+.genesis-nav-menu > .search {
+	float: right;
+	padding: 0;
+	width: 13%;
+}
+
+.genesis-nav-menu > .search input {
+	background: transparent;
+	border: none;
+	font-size: 9px;
+	letter-spacing: 2px;
+	padding: 15px 15px 11px;
+	text-transform: uppercase;
+}
+
+.genesis-nav-menu .widget-area {
+    float: right;
+    padding: 8px 0;
+    width: auto;
+}
+
+/* ## Site Header Navigation
+--------------------------------------------- */
+
+.nav-header {
+	background-color: transparent;
+}
+
+.site-header .sub-menu .sub-menu {
+	margin-top: -51px;
+}
+
+.site-header .genesis-nav-menu li li {
+	margin-left: 0;
+}
+
+/* ## Primary Navigation
+--------------------------------------------- */
+
+.nav-primary {
+	background: #FFF;
+	border-bottom: 1px solid #eee;
+}
+
+.nav-primary .wrap {
+	padding: 0 30px;
+}
+
+.nav-primary a {
+	font-size: 10px;
+	padding: 15px 10px;
+}
+
+.admin-bar .nav-primary.fixed {
+	top: 32px;
+}
+
+.nav-primary.fixed {
+	position: fixed;
+	top: 0;
+	width: 100%;
+	z-index: 9;
+}
+
+.nav-primary.fixed .wrap {
+	margin: 0 auto;
+}
+
+.nav-primary.fixed + div {
+	border-top: 74px solid transparent;	
+}
+
+/* ## Secondary & Footer Navigation
+--------------------------------------------- */
+
+.nav-secondary,
+.nav-footer  {
+	background: #fff;
+	text-align: center;
+}
+
+.nav-footer {
+	border-bottom: 1px solid #eee;
+}
+
+.nav-secondary {
+	padding-bottom: 5px;
+}
+
+.nav-secondary .wrap {
+	border-bottom: 1px solid #eee;
+	padding: 0 30px;
+}
+
+.nav-secondary .wrap {
+	margin: 0 auto;
+	width: 1280px;
+}
+
+/* ## Header Left & Right Navigation
+--------------------------------------------- */
+
+.nav-header-left,
+.nav-header-right {
+	margin-top: 25px;
+}
+
+.nav-header-left a,
+.nav-header-right a {
+	padding: 20px 18px;
+}
+
+.nav-header-left {
+	float: left;
+	text-align: center;
+	width: 35%;
+}
+
+.nav-header-right {
+	float: right;
+	text-align: center;
+	width: 35%;
+}
+
+/* ## Accessible Menu
+--------------------------------------------- */
+
+.menu .menu-item:focus {
+	position: static;
+}
+
+.menu .menu-item > a:focus + ul.sub-menu,
+.menu .menu-item.sfHover > ul.sub-menu {
+	left: auto;
+	opacity: 1;
+}
+
+.menu-toggle,
+.sub-menu-toggle {
+	display: none;
+	visibility: hidden;
+}
+
+/* # Content Area
+---------------------------------------------------------------------------------------------------- */
+
+/* Category Index
+--------------------------------------------- */
+
+.category-index .featured-content .entry {
+	border: none;
+	float: left;
+	min-height: 310px;
+	padding: 0px 5px;
+	width: 33%;
+}
+
+.category-index .widget {
+	margin-bottom: 30px;
+	padding: 20px 0px;
+}
+
+.category-index ul li {	
+	float: left;
+	font-size: 13px;
+	padding: 1%;
+	width: 32%;
+}
+
+.category-index ul li:before {
+	content: "\f139";
+	font-family: 'dashicons';
+	vertical-align: middle;
+}
+
+.category-index ul li ul li {
+	width: 100%;
+}
+
+.category-index ul li a {
+	color: #333;
+}
+
+.category-index ul li a:hover {
+	color: #55c7cf;
+}
+
+.category-index .widget_categories {
+	background: #f7f9fc;
+	overflow: hidden;
+	padding: 30px;
+}
+
+.category-index .widget_categories .widget-title {
+	border: none;
+	padding: 0;
+	text-align: center;
+}
+
+.category-index .entry-title {
+	font-size: 20px;
+}
+
+.category-index .widget-title {
+    border-left: 12px solid #fff7e1;
+    font-size: 16px;
+    padding-left: 30px;
+}
+
+.category-index .widget:nth-of-type(3n+2) .widget-title {
+	border-color: #fff4f0;
+}
+
+.category-index .widget:nth-of-type(3n+3) .widget-title {
+	border-color: #f7f9fc;
+}
+
+.category-index .widget-wrap {
+    overflow: hidden;
+    position: relative;
+}
+
+.category-index .widget-wrap .more-from-category {
+    position: absolute;
+    right: 0;
+    top: 0;
+}
+
+/* ## Entries
+--------------------------------------------- */
+
+.entry {
+	background: transparent;
+	margin-bottom: 30px;
+}
+
+.entry-content ol,
+.entry-content ul {
+	margin-bottom: 28px;
+	margin-left: 40px;
+}
+
+.entry-content ol > li {
+	list-style-type: decimal;
+}
+
+.entry-content ul > li {
+	list-style-type: disc;
+}
+
+.entry-content ol ol,
+.entry-content ul ul {
+	margin-bottom: 0;
+}
+
+.entry-content code {
+	background-color: #333;
+	color: #ddd;
+}
+
+/* ## Entry Meta
+--------------------------------------------- */
+
+p.entry-meta {
+	margin-bottom: 0;
+}
+
+.entry-header {
+	margin-bottom: 40px;
+}
+
+.entry-header .entry-meta {
+	color: #CCC;
+	font-family: 'Poppins', sans-serif;
+	font-size: 11px;
+	font-weight: 300;
+	letter-spacing: 2px;
+	margin-bottom: 10px;
+	text-transform: uppercase;
+}
+
+.entry-time:before {
+	content: "\f469";
+	font-family: 'dashicons';
+	vertical-align: middle;
+}
+
+.entry-comments-link a {
+	color: #CCC;
+}
+
+.entry-comments-link:before {
+	content: "\f101";
+	font-family: 'dashicons';
+	vertical-align: middle;
+}
+
+.entry-footer {
+	font-size: 10px;
+	font-family: 'Montserrat', sans-serif;
+	font-style: normal;
+	font-weight: 300;
+	text-transform: uppercase;
+	text-align: center;
+	text-transform: uppercase;
+}
+
+/* Pagination
+--------------------------------------------- */
+
+.pagination {	
+	clear: both;
+	text-align: center;
+	margin-bottom: 15px;
+}
+
+.adjacent-entry-pagination {
+	border-bottom: 1px solid #eee;
+	border-top: 1px solid #eee;
+	margin-bottom: 30px;
+	padding: 10px 20px;
+}
+
+.single-post .pagination-previous {
+	float: left;
+	width: 45%;
+}
+
+.single-post .pagination-next {
+	float: right;
+	width: 45%;
+}
+
+.adjacent-entry-pagination a {
+	font-size: 13px;
+	font-style: italic;
+}
+
+.archive-pagination li {
+	display: inline;
+}
+
+.archive-pagination li a {
+	color: #55c7cf;
+	cursor: pointer;
+	display: inline-block;
+	font-size: 10px;
+	font-weight: 400;
+	padding: 8px 15px;
+	text-transform: uppercase;
+}
+
+.archive-pagination li a:hover {
+	border-bottom: 1px solid #55c7cf;
+}
+
+.archive-pagination .active a {
+	border-bottom: 1px solid #55c7cf;
+}
+
+/* After Entry Widget Area
+------------------------------------------------------------- */
+
+.after-entry {
+	background: url(https://cottageatthecrossroads.com/wp-content/uploads/2018/06/400.png);
+	background-size:100px;	
+	margin: 30px 0;
+	text-align: center;
+	padding:20px;
+}
+
+.after-entry .widget {
+	margin-bottom: 32px;
+}
+
+.after-entry .widget:last-child,
+.after-entry p:last-child {
+	margin: 0;
+}
+
+.after-entry li {
+	list-style-type: none;
+}
+
+/* ## Comments
+--------------------------------------------- */
+
+.comment-respond,
+.entry-comments,
+.entry-pings {
+	background: #fff;
+	margin-bottom: 40px;
+}
+
+.entry-comments h3,
+.entry-pings h3,
+.comment-respond h3 {
+	font-size: 20px;
+	font-weight: 300;
+	text-align: center;
+}
+
+.comment-header,
+.comment-meta {
+    font-size: 11px;
+    font-style: italic;
+    font-weight: 400;
+    letter-spacing: 2px;
+}
+
+.comment-header a,
+.comment-meta a {
+	font-style: normal;
+	text-transform: uppercase;
+}
+
+.comment-content {
+	clear: both;
+}
+
+.comment-list li {
+	margin-top: 24px;
+}
+
+.comment-list li li {
+	margin-left: 50px;
+}
+
+.comment-respond input[type="email"],
+.comment-respond input[type="text"],
+.comment-respond input[type="url"] {
+	width: 50%;
+}
+
+.comment-respond label {
+	display: block;
+	margin-right: 12px;
+}
+
+.entry-comments .comment-author {
+	margin-bottom: 0;
+}
+
+.entry-pings .reply {
+	display: none;
+}
+
+.bypostauthor {
+}
+
+.form-allowed-tags {
+	background-color: #f5f5f5;
+	font-size: 16px;
+	padding: 24px;
+}
+
+
+/* # Sidebars
+---------------------------------------------------------------------------------------------------- */
+
+.sidebar li {
+	margin-bottom: 5px;
+	padding: 5px;
+}
+
+.sidebar li a {
+	color: #333;
+}
+
+.sidebar p:last-child,
+.sidebar ul > li:last-child {
+	margin-bottom: 0;
+}
+
+.sidebar .widget {
+	background: #fff;
+	margin-bottom: 20px;
+	overflow: hidden;
+	padding: 30px;
+}
+
+.sidebar .enews-widget {
+	background: url(https://cottageatthecrossroads.com/wp-content/uploads/2018/06/400.png);
+	background-size:100px;
+	border: 30px solid #fff;
+	text-align: center;
+	padding: 50px;
+}
+
+.sidebar-primary .enews-widget .widgettitle {
+	text-align: center;
+}
+
+.sidebar-primary .enews-widget .widgettitle::after {
+	background: none !important;
+}
+
+/* # Footer Widgets
+---------------------------------------------------------------------------------------------------- */
+
+.footer-widgets {
+    background-color: #fff;
+    border-bottom: 1px solid #eee;
+    font-size: 14px;
+}
+.footer-widgets-1,
+.footer-widgets-2,
+.footer-widgets-3 {
+    padding: 40px;
+}
+.footer-widgets-1 {
+    width: 25%;
+}
+.footer-widgets-2 {
+    width: 20%;
+}
+.footer-widgets-1,
+.footer-widgets-2 {
+    float: left;
+}
+.footer-widgets-3 {
+    border-left: 1px solid #eee;
+    float: right;
+    width: 55%;
+}
+.footer-widgets .widget-title {
+    font-size: 1.4rem;
+    text-align: center;
+}
+
+/* # Site Footer
+---------------------------------------------------------------------------------------------------- */
+
+.site-footer {
+	background: #f7f9fc;
+	font-family: "Poppins",sans-serif;
+	font-weight: 300;
+	font-size: 9px;
+	letter-spacing: 2px;
+	line-height: 1;
+	padding: 25px 0;
+	text-align: center;
+	text-transform: uppercase;
+}
+
+.site-footer a {
+	color: #333;
+}
+
+.site-footer p {
+	margin-bottom: 0;
+}
+
+/* Fadeup Effect
+---------------------------------------------------------------------------------------------------- */
+
+.js .fadeup-effect {
+	opacity: 0;
+	overflow: hidden;
+	-webkit-animation-duration: 1s;
+    animation-duration: 1s;
+    -webkit-animation-fill-mode: both;
+    animation-fill-mode: both;
+    -webkit-animation-timing-function: ease-in-out;
+    animation-timing-function: ease-in-out;
+}
+
+@-webkit-keyframes fadeInUp {
+    from { opacity: 0; -webkit-transform: translateY(20px); }
+    to { opacity: 1; -webkit-transform: translateY(0); }
+} 
+
+@keyframes fadeInUp {
+    from { opacity: 0; transform: translateY(20px); }
+    to { opacity: 1; transform: translateY(0); }
+} 
+
+.fadeInUp {
+    -webkit-animation-name: fadeInUp;
+    animation-name: fadeInUp;
+}
+
+
+/* # Media Queries
+---------------------------------------------------------------------------------------------------- */
+
+@media only screen and (max-width: 1280px) {
+
+	.site-header .widget-area {
+		width: 60%;
+	}
+	
+	.content {
+		padding: 20px;
+		width: 795px;
+	}
+	
+	.sidebar .widget {
+		padding: 30px;
+	}
+
+}
+
+@media only screen and (max-width: 1200px) {
+
+	.site-inner,
+	.wrap {
+		max-width: 960px;
+	}
+
+	.content {
+		width: 675px;
+	}
+
+	.sidebar-primary {
+		width: 250px;
+	}
+	
+	.title-area,
+	.site-header .widget-area {
+		width: 100%;
+	}
+	
+	.site-header .widget-area {
+		text-align: center;
+	}
+	
+	.nav-secondary .wrap {
+		width: 100%;
+	}
+	
+	.site-wide-cta .enews-widget input,
+	.announcement-widget .enews-widget input {
+		width: 27%;
+	}
+	
+	.site-wide-cta form,
+	.announcement-widget form {
+		float: none;
+		width: 100%;
+	}
+	
+	.nav-header-left a, .nav-header-right a {
+		padding: 20px 8px;
+	}
+
+}
+
+@media only screen and (max-width: 1024px) {
+	
+	.nav-header-left,
+	.nav-header-right {
+		float: none;
+		margin: 0;
+		width: 100%;
+	}
+	
+	.genesis-nav-menu,
+	.site-description,
+	.site-header .title-area,
+	.site-header .search-form,
+	.site-title {
+		text-align: center;
+	}
+	
+	.genesis-nav-menu > .search,
+	.genesis-nav-menu .widget-area {
+		float: none;
+		width: 100%;
+	}
+	
+	/* ### Genesis Responsive Menus */
+
+	.genesis-responsive-menu .wrap {
+		padding: 0;
+	}
+
+	.genesis-responsive-menu {
+		display: none;
+		position: relative;
+	}
+
+	.genesis-skip-link .skip-link-hidden {
+		display: none;
+		visibility: hidden;
+	}
+
+	.menu-toggle,
+	.sub-menu-toggle {
+		background-color: #fff;
+		border-width: 0;
+		color: #333;
+		display: block;
+		margin: 0 auto;
+		overflow: hidden;
+		text-align: center;
+		visibility: visible;
+	}
+
+	.menu-toggle:focus,
+	.menu-toggle:hover,
+	.sub-menu-toggle:focus,
+	.sub-menu-toggle:hover {
+		background-color: #fff;
+		border-width: 0;
+		color: #55c7cf;
+	}
+
+	.menu-toggle {
+		line-height: 22px;
+		position: relative;
+		width: 100%;
+		z-index: 1000;
+	}
+
+	.menu-toggle::before {
+		font-size: 1.5em;
+		margin-right: 10px;
+		text-rendering: auto;
+	}
+
+	.sub-menu-toggle {
+		float: right;
+		padding: 10px;
+		position: absolute;
+		right: 0;
+		top: 0;
+		z-index: 100;
+	}
+
+	.sub-menu .sub-menu-toggle {
+		padding: 12px 10px;
+	}
+
+	.sub-menu-toggle::before {
+		display: inline-block;
+		text-rendering: auto;
+		-webkit-transform: rotate( 0 );
+		-ms-transform:     rotate( 0 );
+		transform:         rotate( 0 );
+		-webkit-transition: transform .25s ease-in-out;
+		-ms-transition:     transform .25s ease-in-out;
+		transition:         transform .25s ease-in-out;
+	}
+
+	.sub-menu-toggle.activated::before {
+		-webkit-transform: rotate( 180deg );
+		-ms-transform:     rotate( 180deg );
+		transform:         rotate( 180deg );
+	}
+
+	.genesis-responsive-menu .genesis-nav-menu .menu-item {
+		display: block;
+		float: none;
+		position: relative;
+		text-align: left;
+	}
+
+	.genesis-responsive-menu .genesis-nav-menu .menu-item:focus,
+	.genesis-responsive-menu .genesis-nav-menu .menu-item:hover {
+		position: relative;
+	}
+
+	.genesis-responsive-menu .genesis-nav-menu .menu-item a {
+		border: none;
+		font-family: 'Montserrat', sans-serif;
+		font-size: 10px;
+		font-weight: 300;
+		letter-spacing: 2px;
+		line-height: 1;
+		margin-bottom: 1px;
+		padding: 15px 20px;
+		text-transform: uppercase;
+		width: 100%;
+	}
+
+	.genesis-responsive-menu .genesis-nav-menu .sub-menu {
+		border: none;
+	}
+	
+	.genesis-responsive-menu .genesis-nav-menu .menu-item:hover > .sub-menu {
+		margin-left: 0px;
+	}
+
+	.genesis-responsive-menu .genesis-nav-menu .menu-item > a:focus ul.sub-menu,
+	.genesis-responsive-menu .genesis-nav-menu .menu-item > a:focus ul.sub-menu .sub-menu {
+		left: 0;
+		margin-left: 0;
+	}
+
+	.genesis-responsive-menu .genesis-nav-menu > .menu-item-has-children > a::after {
+		content: none;
+	}
+
+	.genesis-responsive-menu .genesis-nav-menu .sub-menu {
+		clear: both;
+		display: none;
+		margin: 0;
+		opacity: 1;
+		padding-left: 15px;
+		position: static;
+		width: 100%;
+	}
+
+	.genesis-responsive-menu .genesis-nav-menu .sub-menu .sub-menu {
+		margin: 0;
+	}
+
+
+}
+
+@media only screen and (max-width: 960px) {
+
+	.site-inner,
+	.wrap {
+		max-width: 800px;
+	}
+	
+	.site-inner,
+	.footer-widgets {
+		padding: 20px;
+	}
+
+	.content,
+	.content-sidebar-sidebar .content,
+	.content-sidebar-sidebar .content-sidebar-wrap,
+	.footer-widgets-1,
+	.footer-widgets-2,
+	.footer-widgets-3,
+	.footer-widgets-4,
+	.sidebar-content-sidebar .content,
+	.sidebar-content-sidebar .content-sidebar-wrap,
+	.sidebar-primary,
+	.sidebar-secondary,
+	.sidebar-sidebar-content .content,
+	.sidebar-sidebar-content .content-sidebar-wrap,
+	.site-header .widget-area,
+	.title-area,
+	.captivating-landing .site-inner {
+		width: 100%;
+	}
+
+	.site-header .wrap {
+		padding: 20px 5%;
+	}
+
+	.header-image .title-area {
+		background-position: center top;
+	}
+
+	.genesis-nav-menu li,
+	.site-header ul.genesis-nav-menu,
+	.site-header .search-form {
+		float: none;
+	}
+
+	.genesis-nav-menu a,
+	.genesis-nav-menu > .first > a,
+	.genesis-nav-menu > .last > a {
+		padding: 20px 16px;
+	}
+
+	.site-header .search-form {
+		margin: 16px auto;
+	}
+
+	.footer-widgets-1 {
+		margin-right: 0;
+	}
+	
+	.site-wide-cta {
+		width: 100%;
+	}
+	
+	.header-full-width .title-area {
+		width: 100%;
+	}
+	
+}
+
+@media only screen and (max-width: 800px) {
+
+	.archive-pagination li a {
+		margin-bottom: 4px;
+	}
+	
+	.entry-footer .entry-meta {
+		padding: 20px;
+	}
+	
+	.site-wide-cta .enews-widget input,
+	.site-wide-cta .enews-widget input[type="submit"],
+	.announcement-widget .enews-widget input,
+	.announcement-widget .enews-widget input[type="submit"] {
+		float: left;
+		margin: 5px 0;
+		padding: 8px;
+		width: 100%;
+	}
+	
+	.announcement-widget {
+		padding: 5px 0;
+	}
+	
+	.simple-social-icons ul li a, 
+	.simple-social-icons ul li a:hover {
+		padding: 7px !important;
+	}
+	
+	.woocommerce ul.products li.product, .woocommerce-page ul.products li.product {
+		width: 47% !important;
+	}
+	
+	.site-wide-cta .enews {
+		-webkit-box-orient: vertical;
+		-webkit-box-direction: normal;
+		-webkit-flex-direction: column;
+		    -ms-flex-direction: column;
+		        flex-direction: column;
+	}
+
+	.site-wide-cta form {
+		width: 100%;
+	}
+	
+	.home-above-content .widget-wrap .more-from-category,
+	.home-below-content .widget-wrap .more-from-category {
+		clear: both;
+		position: relative;
+		text-align: right;
+	}
+
+}
+
+@media only screen and (max-width: 500px) {
+
+	.five-sixths,
+	.four-sixths,
+	.one-fourth,
+	.one-half,
+	.one-sixth,
+	.one-third,
+	.three-fourths,
+	.three-sixths,
+	.two-fourths,
+	.two-sixths,
+	.two-thirds {
+		margin: 0;
+		width: 100%;
+	}
+	
+	.site-title {
+		font-size: 10vw;
+	}
+	
+	.category-index .featured-content .entry,
+	.captivating-custom-blog .content .entry {
+		float: none;
+		width: 100%;
+	}
+	
+	.captivating-blog .entry:nth-of-type(2n+3) {
+		margin-left: 0;
+	}
+	
+	.site-header .wrap {
+		padding: 0 5%;
+	}
+	
+	.woocommerce ul.cart_list li,
+	.woocommerce ul.product_list_widget li,
+	.woocommerce-page ul.cart_list li,
+	.woocommerce-page ul.product_list_widget li {
+		width: 100%;
+	}
+	
+	.site-wide-cta form {
+		-webkit-box-orient: vertical;
+		-webkit-box-direction: normal;
+		-webkit-flex-direction: column;
+		    -ms-flex-direction: column;
+		        flex-direction: column;
+		width: 100%;
+	}
+
+	.site-wide-cta .enews-widget input {
+		margin-right: 0;
+		margin-bottom: 20px;
+	}
+
+	.site-wide-cta .enews-widget input:last-child {
+		margin-bottom: 10px;
+	}
+	
+	.site-inner,
+	.footer-widgets {
+		padding: 0px;
+	}
+	
+	.sidebar .widget.enews-widget {
+		margin: 0;
+		padding: 30px;
+	}
+	
+	.category-index ul li,
+	.above-blog-content .featured-content .entry {
+		float: none;
+		width: 100%;
+	}
+	
+	.category-index .widget-wrap .more-from-category {
+		clear: both;
+		position: relative;
+		text-align: right;
+	}
+	
+	.woocommerce ul.products li.product, 
+	.woocommerce-page ul.products li.product, 
+	.woocommerce-page[class*="columns-"] ul.products li.product, 
+	.woocommerce[class*="columns-"] ul.products li.product {
+		width: 100% !important;
+	}
+	
+	.wprm-recipe-simple {
+		border: none !important;
+		padding: 0 !important;
+	}
+
+}
+
+@media only screen and (max-width: 350px) { 
+
+	.content,
+	.sidebar .widget,
+	.above-blog-content,
+	.sidebar .widget {
+		padding: 10px;
+	}
+
+}
+
+#about {
+	text-align:justify;
+}
+#about-photo {
+	text-align:center;
+}
+#about-photo img {
+	width:250px;
+}
+
+.sidebar-primary.widget-area .entry-title a {
+    font-size: 20px;
+}
+
+ul.dpe-flexible-posts h4 {
+    font-size: 24px;
+    text-align: center;
+}

Some files were not shown because too many files changed in this diff