readme.txt000064400000006544150212240530006545 0ustar00=== Business Club === Contributors: axlethemes Requires at least: 4.7 Requires PHP: 5.2 Tested up to: 5.2.1 Stable tag: 2.0.2 License: GPLv3 License URI: http://www.gnu.org/licenses/gpl-3.0.html Copyright: (c) 2019 Axle Themes Business WordPress Theme == Description == Business Club is a multipurpose elegant and clean WordPress theme with premium look, feel and features that can be used for not only business websites but also for other WordPress sites like educational institutes, personal portfolio, blogging, etc. Business Club is simplistic but very elegant and mesmerizing theme which has all the features that you need handcrafted into it. Even with all the dazzling features the theme is optimized with a standard coding, frequent maintenance and expert quality assurance so that you will never have to compromise quality and speed. Demo - https://axlethemes.com/theme-demo/?demo=business-club == Copyright == Business Club WordPress Theme, Copyright 2019 Axle Themes Business Club is distributed under the terms of the GNU GPL == Installation == 1. In your admin panel, go to Appearance > Themes and click the Add New button. 2. Click Upload and Choose File, then select the theme's .zip file. Click Install Now. 3. Click Activate to use your new theme right away. == Note == * Background Color applies to all pages except static front page. == Changelog == = 2.0.2 - Jun 10 2019 = * Demo content updated * Readme info updated = 2.0.1 - May 10 2019 = * Frontpage template added * Compatible with Elementor page builder = 1.1.1 - May 10 2018 = * Fix comment form * Bug fixes = 1.1.0 - Dec 10 2017 = * Integrate demo importer * Bug fixes = 1.0.9 - Nov 26 2017 = * WP 4.9 compatibility check * Bug fixes = 1.0.8 - Jul 24 2017 = * WP 4.8 compatibility check * Bug fixes = 1.0.7 - Feb 28 2017 = * Implement admin editor style * Bug fixes = 1.0.6 - Feb 16 2017 = * Bug fixes = 1.0.5 - Jan 30 2017 = * Add top header * Add WooCommerce support * Few CSS bugs = 1.0.4 - Jan 28 2017 = * Fix prefixing in JS * Add Theme URL * Few CSS bugs * Bugs fixes = 1.0.3 - Jan 24 2017 = * Few CSS bugs * Bugs fixes = 1.0.2 - Jan 22 2017 = * Fix background color issue * Bugs fixes = 1.0.1 - Jan 14 2017 = * Add widgets * Bugs fixes = 1.0.0 - Sep 7 2016 = * Initial release == Credits == * Based on Underscores http://underscores.me/, (C) 2012-2017 Automattic, Inc., [GPLv2 or later](https://www.gnu.org/licenses/gpl-2.0.html) * normalize.css http://necolas.github.io/normalize.css/, (C) 2012-2015 Nicolas Gallagher and Jonathan Neal, [MIT](http://opensource.org/licenses/MIT) * Cycle2 released by Mike Alsup (http://jquery.malsup.com/cycle2/) under MIT and GPL license * Font Awesome: http://fontawesome.io/, (c) Dave Gandy, CSS - [MIT](http://opensource.org/licenses/MIT) ; Fonts - [SIL OFL 1.1](http://scripts.sil.org/OFL) * Breadcrumb Trail (http://themehybrid.com/plugins/breadcrumb-trail) under GPLv2 license * Sidr - https://www.berriart.com/sidr/ [MIT](http://opensource.org/licenses/MIT) * TRT Customizer Pro https://github.com/justintadlock/trt-customizer-pro, (c) 2016 Justin Tadlock, [GPLv2 or later](https://www.gnu.org/licenses/gpl-2.0.html) * TGM - http://tgmpluginactivation.com/ [GPLv2 or later](https://www.gnu.org/licenses/gpl-2.0.html) == Images == License: [CC0](https://creativecommons.org/publicdomain/zero/1.0/deed.en) * https://pixabay.com/en/groom-wedding-marry-marriage-man-1578190/ search.php000064400000002717150212240530006523 0ustar00
home.php000064400000002111150212240530006172 0ustar00

archive.php000064400000002273150212240530006674 0ustar00
functions.php000064400000016467150212240530007275 0ustar00 esc_html__( 'Primary Menu', 'business-club' ), 'footer' => esc_html__( 'Footer Menu', 'business-club' ), 'social' => esc_html__( 'Social Menu', 'business-club' ), ) ); // Add support for HTML5 markup. add_theme_support( 'html5', array( 'comment-form', 'comment-list', 'gallery', 'caption', ) ); // Set up the WordPress core custom background feature. add_theme_support( 'custom-background', apply_filters( 'business_club_custom_background_args', array( 'default-color' => 'F1F0F0', 'default-image' => '', ) ) ); // Enable support for selective refresh of widgets in Customizer. add_theme_support( 'customize-selective-refresh-widgets' ); $min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; // Enable admin editor style. add_editor_style( array( business_club_fonts_url(), 'css/editor-style' . $min . '.css' ) ); // Enable support for custom logo. add_theme_support( 'custom-logo', array( 'width' => 95, 'height' => 95, ) ); } endif; add_action( 'after_setup_theme', 'business_club_setup' ); /** * Set the content width in pixels, based on the theme's design and stylesheet. * * Priority 0 to make it available to lower priority callbacks. * * @global int $content_width */ function business_club_content_width() { $GLOBALS['content_width'] = apply_filters( 'business_club_content_width', 640 ); } add_action( 'after_setup_theme', 'business_club_content_width', 0 ); /** * Register widget area. * * @link https://developer.wordpress.org/themes/functionality/sidebars/#registering-a-sidebar */ function business_club_widgets_init() { register_sidebar( array( 'name' => esc_html__( 'Primary Sidebar', 'business-club' ), 'id' => 'sidebar-1', 'description' => esc_html__( 'Add widgets here to appear in your Primary Sidebar.', 'business-club' ), 'before_widget' => '', 'before_title' => '

', 'after_title' => '

', ) ); register_sidebar( array( 'name' => esc_html__( 'Secondary Sidebar', 'business-club' ), 'id' => 'sidebar-2', 'description' => esc_html__( 'Add widgets here to appear in your Secondary Sidebar.', 'business-club' ), 'before_widget' => '', 'before_title' => '

', 'after_title' => '

', ) ); register_sidebar( array( 'name' => esc_html__( 'Front Page Widget Area', 'business-club' ), 'id' => 'sidebar-front-page-widget-area', 'description' => esc_html__( 'Add widgets here to appear in your Front Page.', 'business-club' ), 'before_widget' => '', 'before_title' => '

', 'after_title' => '

', ) ); register_sidebar( array( 'name' => sprintf( esc_html__( 'Footer %d', 'business-club' ), 1 ), 'id' => 'footer-1', 'before_widget' => '', 'before_title' => '

', 'after_title' => '

', ) ); register_sidebar( array( 'name' => sprintf( esc_html__( 'Footer %d', 'business-club' ), 2 ), 'id' => 'footer-2', 'before_widget' => '', 'before_title' => '

', 'after_title' => '

', ) ); register_sidebar( array( 'name' => sprintf( esc_html__( 'Footer %d', 'business-club' ), 3 ), 'id' => 'footer-3', 'before_widget' => '', 'before_title' => '

', 'after_title' => '

', ) ); register_sidebar( array( 'name' => sprintf( esc_html__( 'Footer %d', 'business-club' ), 4 ), 'id' => 'footer-4', 'before_widget' => '', 'before_title' => '

', 'after_title' => '

', ) ); } add_action( 'widgets_init', 'business_club_widgets_init' ); /** * Enqueue scripts and styles. */ function business_club_scripts() { $min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; wp_enqueue_style( 'font-awesome', get_template_directory_uri() . '/vendors/font-awesome/css/font-awesome' . $min . '.css', '', '4.7.0' ); $fonts_url = business_club_fonts_url(); if ( ! empty( $fonts_url ) ) { wp_enqueue_style( 'business-club-google-fonts', $fonts_url, array(), null ); } wp_enqueue_style( 'jquery-sidr', get_template_directory_uri() . '/vendors/sidr/css/jquery.sidr.dark' . $min . '.css', '', '2.2.1' ); wp_enqueue_style( 'business-club-style', get_stylesheet_uri(), array(), '2.0.2' ); wp_enqueue_script( 'business-club-skip-link-focus-fix', get_template_directory_uri() . '/js/skip-link-focus-fix' . $min . '.js', array(), '20130115', true ); wp_enqueue_script( 'jquery-cycle2', get_template_directory_uri() . '/vendors/cycle2/js/jquery.cycle2' . $min . '.js', array( 'jquery' ), '2.1.6', true ); wp_enqueue_script( 'jquery-sidr', get_template_directory_uri() . '/vendors/sidr/js/jquery.sidr' . $min . '.js', array( 'jquery' ), '2.2.1', true ); wp_enqueue_script( 'business-club-custom', get_template_directory_uri() . '/js/custom' . $min . '.js', array( 'jquery' ), '2.0.2', true ); if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) { wp_enqueue_script( 'comment-reply' ); } } add_action( 'wp_enqueue_scripts', 'business_club_scripts' ); /** * Enqueue admin scripts and styles. * * @since 1.0.0 * * @param string $hook Hook name. */ function business_club_admin_scripts( $hook ) { $min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; if ( 'widgets.php' === $hook ) { wp_enqueue_media(); wp_enqueue_style( 'business-club-widgets', get_template_directory_uri() . '/css/widgets' . $min . '.css', array(), '2.0.2' ); wp_enqueue_script( 'business-club-widgets', get_template_directory_uri() . '/js/widgets' . $min . '.js', array( 'jquery' ), '2.0.2', true ); } } add_action( 'admin_enqueue_scripts', 'business_club_admin_scripts' ); // Load starting file. require_once trailingslashit( get_template_directory() ) . 'includes/start.php'; css/customize-controls.min.css000064400000001030150212240530012477 0ustar00#customize-controls .control-section-upsell .accordion-section-title:focus,#customize-controls .control-section-upsell .accordion-section-title:hover{background-color:#fff}.control-section-upsell .accordion-section-title .button{color:#fff;margin-top:-4px;font-weight:400;margin-left:8px;border-color:#355c9e;background-color:#355c9e}.control-section-upsell .accordion-section-title .button:hover{border-color:#2c4d85;background-color:#2c4d85}.rtl .control-section-upsell .accordion-section-title .button{margin-left:0;margin-right:8px}css/editor-style.min.css000064400000003164150212240530011252 0ustar00body,p{color:#666}pre,textarea{overflow:auto}img,pre{max-width:100%}a,a:visited{color:#323232}body{font-size:13px;line-height:1.7;font-family:'Open Sans',sans-serif}h1,h2,h3,h4,h5,h6,p{margin:0 0 15px}h1,h2,h3,h4,h5,h6{color:#4e5052;font-weight:500;font-family:Poppins,sans-serif}h1{font-size:30px}h2{font-size:22px}h3,h4{font-size:18px}h5{font-size:16px}h6{font-size:14px}cite,dfn,em,i{font-style:italic}blockquote{margin:0 1.5em}address{margin:0 0 1.5em}pre{background:#eee;font-family:"Courier 10 Pitch",Courier,monospace;font-size:15px;font-size:.9375rem;line-height:1.6;margin-bottom:1.6em;padding:1.6em}code,kbd,tt,var{font-family:Monaco,Consolas,"Andale Mono","DejaVu Sans Mono",monospace;font-size:15px;font-size:.9375rem}abbr,acronym{border-bottom:1px dotted #666;cursor:help}ins,mark{background:#fff9c0;text-decoration:none}big{font-size:125%}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}dt,optgroup{font-weight:700}blockquote::after,blockquote::before,q::after,q::before{content:""}hr{background-color:#ccc;border:0;height:1px;margin-bottom:1.5em}ul{list-style:disc}ol{list-style:decimal}li>ol,li>ul{margin-bottom:0;margin-left:1.5em}ol,ul{margin:0 0 .5em 1em;padding:0}dd{margin:0 1.5em 1.5em}img{height:auto}table{border-collapse:collapse;border-spacing:0;margin:0 0 1.5em;width:100%}.mce-item-table td,.mce-item-table th,td,th{border:1px solid #ddd;padding:5px}blockquote,q{quotes:"" "";padding-left:15px;border-left:5px solid #179bd7;display:block;margin-bottom:15px}a{text-decoration:inherit}a:active,a:focus,a:hover{color:#179bd7}a:focus{outline:inherit}a:active,a:hover{outline:0}css/customize-controls.css000064400000001120150212240530011715 0ustar00#customize-controls .control-section-upsell .accordion-section-title:hover, #customize-controls .control-section-upsell .accordion-section-title:focus { background-color: #fff; } .control-section-upsell .accordion-section-title .button { color: #fff; margin-top: -4px; font-weight: 400; margin-left: 8px; border-color: #355c9e; background-color: #355c9e; } .control-section-upsell .accordion-section-title .button:hover { border-color: #2c4d85; background-color: #2c4d85; } .rtl .control-section-upsell .accordion-section-title .button { margin-left: 0; margin-right: 8px; } css/widgets.css000064400000000202150212240530007500 0ustar00.image-preview-wrap { margin-top: 5px; margin-bottom: 10px; } .image-preview-wrap img { max-width: 100%; max-height: 200px; } css/widgets.min.css000064400000000156150212240530010272 0ustar00.image-preview-wrap{margin-top:5px;margin-bottom:10px}.image-preview-wrap img{max-width:100%;max-height:200px}css/editor-style.css000064400000005510150212240530010465 0ustar00 /*=========================================================== # Typography ===========================================================*/ body { font-size: 13px; line-height: 1.7; color: #666666; font-family: 'Open Sans', sans-serif; } h1, h2, h3, h4, h5, h6, p { margin: 0 0 15px 0; } h1, h2, h3, h4, h5, h6 { color: #4e5052; font-weight: 500; font-family: 'Poppins', sans-serif; } h1 { font-size: 30px; } h2 { font-size: 22px; } h3{ font-size: 18px; } h4 { font-size: 18px; } h5 { font-size: 16px; } h6 { font-size: 14px; } p { color:#666; } dfn, cite, em, i { font-style: italic; } blockquote { margin: 0 1.5em; } address { margin: 0 0 1.5em; } pre { background: #eee; font-family: "Courier 10 Pitch", Courier, monospace; font-size: 15px; font-size: 0.9375rem; line-height: 1.6; margin-bottom: 1.6em; max-width: 100%; overflow: auto; padding: 1.6em; } code, kbd, tt, var { font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; font-size: 15px; font-size: 0.9375rem; } abbr, acronym { border-bottom: 1px dotted #666; cursor: help; } mark, ins { background: #fff9c0; text-decoration: none; } big { font-size: 125%; } fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } legend { border: 0; padding: 0; } textarea { overflow: auto; } optgroup { font-weight: bold; } blockquote::before, blockquote::after, q::before, q::after { content: ""; } blockquote, q { quotes: "" ""; } hr { background-color: #ccc; border: 0; height: 1px; margin-bottom: 1.5em; } ul, ol { margin: 0 0 1.5em 3em; } ul { list-style: disc; } ol { list-style: decimal; } li > ul, li > ol { margin-bottom: 0; margin-left: 1.5em; } ul, ol { margin: 0 0 0.5em 1em; padding: 0; } dt { font-weight: bold; } dd { margin: 0 1.5em 1.5em; } img { height: auto; /* Make sure images are scaled correctly. */ max-width: 100%; /* Adhere to container width. */ } table { border-collapse: collapse; border-spacing: 0; margin: 0 0 1.5em; width: 100%; } td, th, .mce-item-table td, .mce-item-table th { border: 1px solid #ddd; padding: 5px; } blockquote, q { quotes: "" ""; padding-left: 15px; border-left: 5px solid #179bd7; display: block; margin-bottom: 15px; } /*=========================================================== **************************** Links ************************* ===========================================================*/ a { color: #323232; text-decoration: inherit; } a:visited { color: #323232; } a:hover, a:focus, a:active { color: #179bd7; } a:focus { outline:inherit; } a:hover, a:active { outline: 0; } header.php000064400000003401150212240530006475 0ustar00 section and everything up until
* * @link https://developer.wordpress.org/themes/basics/template-files/#template-partials * * @package Business_Club */ ?> > screenshot.png000064400000654506150212240530007441 0ustar00PNG  IHDR8[PLTEtvs~}z{x||z}zxzwxxudZpJ>rPDzmcnhowLA?JYKS^FNYd_\_Wia ܐlHs  ( ,\ <%K&0B_$-9߭͵)?T !ҷ-5Aa|ɐUI~kئx &$#;4/ jpV3wA֌m1)2:HHKQ8'h[O?٘2+* ¼{а2 •/ @?BL$V oUumHSd\foCN`H3QZe @GHlsySSX}dI&^WT~qkjbbbhOFAE;6QG~xkhcUY8gbtU7 y?5rVKC>`  _p MX4+UE ]\D>+[-ts-WbR@iq-݄&b`9^ Hg"HMsMD`߄xgq|@ C[&@RM`-,#痴n{:~9@QCH}:痀Q2S1po9D/D"WDHa@DF 4*2 {(>%6Kmס9_ K& ŀZG"|u90_, !SXưHLAƘ@l ka,{X:yIAJv1[X5pek^e Fվ5DH+fY%S1=2K&k}g::(9sqv%+ϔ|gZi" z@ua1(dG=vaڹmL5+@ Ԇ#kkXདྷqZKߏOVDɟd9*C(Az ?/K[,LK 5УEVZ"4V}nmG'+uKBV޿\|j=; No}zTN{[i=k9WrryWjO1#bInLl^ gJºdPaR#r%qGmba]aӧVMw%]dO.l<,6*z{-wf$bGʪ)fԕj1L`XV}PXX<|Q'_܊ӌln|*ד EՆZ.QY$+w<{?N/xk7GK9S[^QC))tx_M;K. (]?F./ػJQXu$*,REX:ڄmyw 9{\{`gm$2i^Ť5PcdnGLH=0ڋ;#b{xߊ VrK%3R]YZ ʀQqN\/>_K*,TG\lσ]K(j~#&,- 9Pw?$uQ$TFǡݝ5~۷$.y9Wc{K",J9LQZXòV)ĖpP֍Y8  n<=n$Q;0:K9:7V\!E= 'oTOXO.lA~\Յ%4[E} ^JIШ?(iJ&+cFv;tPh:X5aeK, 3fHK˻a:(TX'~Xؼ$V$BtQ(4a ӝ+؃F% Uzby1)P(4aiU8bRPh {Cb(lB=B BB _p‚(QB!P*`8I;גԥ !Qhl NՍ4j8nCQo"3 V Ԩ…`i")X R:`-$!f X _m>ʗ2 BX @X  , ,@@HX@HX):5 :\1n @kD*p/D& CωXsb_R:gp,YdLJj|k a+̫=$BD"[Jz㗯[I:&?8kjUJ%`U 4V @XaS/𰚰lzQG 0c44xE{ ҡB*V~kT| M(){F+/~5aQYcJHT`]rOwVN9iSֆD;iGeLD3oʗS7=転߼g+Wl{_ 9ĺfR⹰ևMʔGrh6m/N ’",iu8 @X:O qBXB>]hHGܮ^&\Plg)35Q<}EXĶן'HXBPVHUk*a=r^1>p),LWք4I6C/ikJTgW~اnr;5{\CN pUs.B*鉷wI2?5$$NHX²BW(nJXfΗҡj8o\S’U@#IDg E )۫M|!uVByfJ,5 g{X,7.,$,aqtڝE%\>EX}NXUv¢X㟾-1՝ִ\̈́՗š\XHX"o(J͘+azKM 5gKa]aM&,JMvNkp!,zmWw} @X[јK9JXsmT+1h[I&!{NӍ"Y`a884i¾*7.7˩tJX4 %x ,%9/6%6ql=,]"1HXi'؊ñv$,R:auuU$,c[{@XLN SBRNeO\aQN Mj*iLAS %aCqTŵwt $,KX`MMSv܅7FRcQ;uM_±z!ʈuHCogaY' oVyKe >C͏SXwƿmYiad=$ (zȊ©% EV!Q lCA&%n7thRM.٦F%2p87$;3P keаѷ0|QL(!< y3]N |Sn Ha4v%l `%c&R&?}N$a)]g3S^5kRBܻF{&m_7۽շ<؉ ')J |A;U!5ˁ)-Kbm5V 2" s.#~[ɡoYQ`D;z:U?4_GNxၕMI~zU= o۔>Q`Àw 6\/"VT4FOG/Th?X|XԨf 7qG]6ӦyAG{S].]:)c ۈQ-i`Ul׵gVcE芧;l2a-ѦV.1P ]ѾW^Q !)_cFMqhGvJ %G[E Ekxu'h9e),#fS4MӔSXS[F(F!LjDt=}&mJxk +,^ye!QD.7Y~Av}<3^с[]Ef}n\6X뛳wxڕ;u7T',n];{)&)g7ٱV||o[d߁F'|eٺ Do+Y57Dg>rY|+u$TwdKW6nQVo²Kz!E KRT20c~ 1ƕX1 {[X M&D~4W&[bE|ࠡPy3B֥;"rKkQmdl:1v}iɦOW˕ej5X"`IH*o%>ӿʰK*dd,zo?4^:1]n* M8Ld3oO eW&7X.oۛx.1PVC{@y81,FsH`$CHai k͉ms=^m(}s&5 `y&uQJXgw ۥ2Ȝ䣀UizrM“_X@R=|/lYgQ*Uצ ;gO-dSʭ˟"mlGbXײEG~ [ϯ?L({b $-c %w?ф&d Càh/G9|mݏE1,#airLZ9dH]]=])Rx>X@/7aR<ȷ&*F[#kƜ2B:t M7}[ Eq5gfL9bMg{3S^Yw yc<5͜4 .a wo sX'Jh s1'4+{X0j=:Jpo'{͐WbX!`5uZw+X aE Ragy C6{ٸh}y1!: '`I[x+. 1Sb,Rz?˳>0V51gP jU~ߦ! ,ibttn6[BO )`BY:\$4`n'%++CB;Fx59?r6b &l%9rϩCBe *^e7x7\HBnR\L’guzuEAȴ%[W@ف.?K6z櫢/}z-PX q$dA^"^P{CAF]Vbmć MT菢g~"u=İ loy_)Heeo&RSxzX X@CzG{%Mo t* I=yعx?}}d;+,w,W FOŵO"b<vRD. 5[zM`}'wRqx=hKs6bM]\kd!k:`y7GZ{*rӈFrW0aKW\SѼ) 7Aeӷ"*, etMKq:lv$*VTZ$r &fMpLC<7@a_1`q{ `@gXL#ColZ m‡ ]{J lf? {noϝgc8䳵#LW#<ޞBk&͎ 3:)rJSQjEQ"Z\.lw%a7!31&Gzg#[ 4\ 5{3 ue/E_k,&]p¸u]}<dMj8ܚvN[S>zOͯzjH.&SR -2]yeziycڣx黆C[lLT Liim=[OcnŠ,m7 }JϫFݗV a~QabS۲iYQ[ENi͛)jMW~6  NJpq-1f6i3ft0P:*,mCL']}XLW. ǔXŠ,VrԗD#}v4ʌ맒ޘ "*>2+[tMW/ Rظ_?DY OJu_U¢C`,`1H0$cV *}1Q{D`"Y,K{oQ["Ef7w # Yg]A3m8P]IRbjf~^ bU=/OTRR \ :hv^Y CyAQ&J^=ym"Xuò%s 9$tVԅe}Іt}gBgQ} ћZԇ+ $f?^M@XG|G85[@\9(u9M4Cu,R &g@Kw HV?ʩXbae85#X-] W!H;A4w0V>1\-7&ʁ]4!"͢a yTqN{0Jblam~jdaN}z+5G]f괊Uv,KUmfbi uX)[6h=5oW]7F-܁tJb(4qT8m?ŨK{̝BhF]ޑ`[pPwmO wJE &ͫ7aAIoMUx^+-gƃ"}_O$8Q8;ͬ{jsK$Ҍ Y WA) (h}TЦD<"jmU"+ْ!)TːKd%g Ww[c<\BRPV,(ֻ \͆yc~ۭu֤Neb]ՒjXGB~G@hͲP7P.`-1s g,Xf axOz=AX ?:JܩX7d?rWk,L a ٹ ]~FA![ߊ^?݊S۠-p A&IGړ@k;Jc2`D c i%1 y#I$wwVy<_|qVG#lņK^ 2{$V+(F90;Zk‘teVh-hE\1P4|,`1,4 s YxQ,G<`}XSR_>V qW8o"_S & +P\`0.! ) u@2# O7"/؂RHr#(dW+/ `?zȷs` $-ov5.IX(xE`yhD DLU=?_B^crUVjڱ@X~WHiZZCTGVkշ7cz hI<[7 Z83jo`^5&E8 *ʵ3$)iTF8ʤ1!O!^% @eK^\DQtXJEd%U/C•tm2M qB JnWP#,'K}~}&cpSd٤4ZwXsZ+"ΡAV''=lx+ BB`ёOHӐ+ȃ#򛥬:.Űb,@ y밠|ՒrWﳍ.!_YԘ?=iuQ"uM{(?rtu3D~~z.1,ˠ{[tʐL}A*xELhEN?8G.QK> X<%tâç}(}V?v'q^o%c YPrB PH~ikZrSԏxIeK8XQw'yOŢ'1B1,  Qu#bNfgE#-lZZLhSx"Y -!m<ߦ %+% D1 ०1,)5I;-nfMųp Awnhy];,Ɉֳk'4YCS!40.VXbM9Y U(BTtbCU|}U\WZ\-Y]ACƖ'AkCiNj;YBNv#( Ӄ\"&"*d' To8itZs%dnH`2H|v{÷,* TW@V=9- l[6/a- "KmijfSF öv@xwxU(D|ECʂW:!R  Ђ +9X(#ˊbqSbS p(E;#p,Kt@Q , 0b<,!o+WoaV7^Tbi'evDD@aR(ʔ*,^LQ,cXɰ8Ks8ai1ei T;F E˙T̸ zSzEoHUJ8uHyb~f\Ttl2q034[7S.a2`xedXȐtDʋ46׹Ag3e(16\FuX?mB5c^U7YYČ ZZFy=`D&d1Ef%>2X7* Fg赤wFg '~ΠoP3úx1#q(Ay#v73X+/%tU/V%F# ::*1++(c4rClD@C ImY ?@7|qTiяs[&JPZ 4BM czx.לT!%co(X 5 "X͝M1kSf9RzR4Y y v[JB ` O SY=Ouu/[CbCЌ*^ah<,%.aX4},52.PJ2)3D@n=WruT0!eJN\Z +Q* Y\ 1 `2 PzrP"Z2 >8ftu{Ep4a=a8f6EDJҧ|rOd2tmGft@A[`)w:V&pZXK/G^O81u,`$ @IUY"3@)RA̳*" KS"x+Ed7jJ1M3HQńı Sg̊f9 SXSW؂w`d`]rm d.%'h9ưFP3?! *2<#W8B0ϦJ85: S,1%8ˎA;X ڦ&:+v6c-OEH=d~Ly'@\" EbPTf* <`YXX\~QoH8D*imv`#Rk8~5f*bYԽi_GX$ ^5U#U)j(nH80 (ġx|)ɤfz_1?Up-Rkj5iEO'#8x 6A=A+1*'€X<=L۲QmŘXdȫ S*-c9ĠN"p`atBov?ml -cBIeZ<° apnhRwE-F5yT$K 1v10y1,cXQN5V)`!y L <դrvwU{ valWe"XP,.ǴByvB:-kZy*::x"@}:)K(DSa !7ԟ/^?7|RrqUE4RՊZ^'ӆpmxX<>9 !ƴF[ aS6ۼԫ #r26OQ<ȆAEB..jBz5fnbkČLd64!J0Q8XUEPR,<:d@ KBXPrkC0_ S.5L_yX d]\h%~L`R7Dg due(l ˆ |&qpE\~'XkY[T1 ϼP870Bw =VHj6v5v*a!,?C#YdH*GCz*uÑ^y4R[Z(:|OTfbl:%aO)oq2W%v UV R+WYK3 vYj@,QDN.!x@0ę=3Ò(ݎA[$ςNSRYgTkB'X+SUte|]ұoDvlxK%-`[GF*^\ZgT|C ai|Q Tu%\SsUXAf: մvۧ߅d%J Xm|vkܮ,aX\9O&;evZèY,!~50M[zcZa0A\pA`"#c<,E$W;{-{|! t (Y2#yo(f#pDM6 RȷK@fCز!=)AOX^N4L_5eb$F,_Y@]JE2dYBM8L M1i5}Ʊ.!>TbXzr (gN3OhT2闲P(XXyjĊŔ'oNDԡBc u^j@8E}*݊?m*5 h.1+^?6VHN SHe]D鑩 ɲ/֐Qwfb#\*ú]0ӄ n$)jkf$\8{ Ԗ1fw ê+W@4޸ŕ$*ԡ`j3sg©"K`;z`bPe !NR [,,6~/CX@ `QM6Fj*d'|VFe@9g:g:ԟ:t7?eXf:(5beBk?hysZ͐,ZBF_HLK.k,jyyQi1zpsk0PEr, 7/i SpO͇o=Z/NO=22|UdY;l3.7\j A$P5v,֣X 2"29<wɤ%0M+zsWYm)!D=-ۄ5%t%D/@i& T C ^_Q.TNtuKY ,na`3φ+"TS'"ZsBǝ = ;,!ːK뻐Wa aYq!(r\]Fȕe@7 ˚&={wʰc²Vư`OY̊Ԋ  QS i|:4xiSGCZD Ρ;EW,xUV-teeXj [0qwB3C(kHX 'X_ib}Bln_n.SpNJ&{2c Th)NElsr$STCy^g]@"HT?Ӵ Hqn ɁV< (^؊Ŋ0(k,-ɻ*`%.t!gNڀL:HW U fE.h뉿+zNl+9KtX 4Ka-+Eh Td=J.4Ed #`Q3& e}b.a,tQp/@+87҃pр"vbvef6^.w앭V % !]E `_HfPHD:<|( `=W2"H¼u8O"V k˯ `4uEuU b LEed3Xܾ<>U/ xn5`2Cq ~>u}`j"=Ԋ7d΢:8 T%M˚ صaiXuׯy|Bn6ưt FF V{6(R$X/ ԟ[ Y9Alv( m%0{C*.ůNyie)=α|%4XU@vvayϻ|J5KX,p 塛=S0K,ԡ~g֭<`1!EEҢ)בsiv2,K:% uv`IE$`0 Q; iX YXaOu;ĢVu_2O#\U]AfX [`B£n T-/yS!:e#Ӓ:1 &OBB%Ҽ p*|ux'FiJh(4+݊-*Kzkؘ3d9CjlbA˥C]]croq#,N3w4:%$KVD8/$VpMZ֞sfJK|/nUnVsC%X~|p]Q win} egN1,nb})Tz}xd,0fQt~+r'K"bAuS8:.xzڡZ|/ ̘`rQ0FQJɢl H& ^di `9 Yy9K~[+pӮNXư,fs"o` "v jY6nAZRBj z.d`orsBDqm. b$QPWit -6kߒbMBDSH#BPr&M[̂)c3 UlET!Mk Bɲmf r8:q%?!Ӵɰ=ncph`kqP%RsaWq-vP0]'n;B҈; zJs~:2ba3p\BY)60 ߵnh _fXO0W섐@!9vNuVW_R*ƺq6hi6W?_\WEϳW@  K(.5CaÊ`XQa]=ᩞ k|8:Ʊ-lɯmIvĆF#Ȱ_Oۣ4lj ?KnFq=,m ;ZphQzb`iHY@'\[s]VoV)pz*b n`[9)LWcIR-< #Pq^9a>Ht[QLx ˢJ{v8ҲѦHQIʠĦ+d/ J A35-*W6觡XTqdRYdA"QT8+tY;a+s٢e֤-jhmvw! JAfRAg Vɖ6HVJZvWbCz@ y@ۘ Zj@&Ήʮr0sS{o,{:ĉ cp awGooذq4\@!-쫢ʟT`$5i a>־xY=,-Xd3Ug0&`NUd KpZn}v"( MiM/xfr[vªveWfpzR*4܋|1zd>tp5r1|,tJqz4~M0nw~4!VbGi[Д^7`\DUᙘ8P`^r;)gW0=_2Bq77}U(ʑiS+X_BNlG!}?M8 U+N#&W-2edB6bAfq:bgBKx 94`8Q"ɰQJSK -0JOOvbcQ^57 uaV{p uG%GC^$|y0@-y?\|;`ͼ/%˕X_a!{sp$>/azHxUyI"T 5Vh(}80fR2S)i 4$O ,KGw ia'F3L$Sߐ9*~ZpIȴklj jM6E 84~IiW$qGELh%}-W]TCi khn%&\!VHam?#v%wPF?-[򞠧IbW?sRX8; JzDIyJ#G zLd FrDt?#+sl0/׻)3YaBgSr5Dl_մ* XLt;(f,HHHkRLnJKYV *]: lu갱̀^S۸/,,G( "&SۼJڔ_dϧU~~L$9bVcx9o|Zؘ_C+U7Abs,@5M/ZPn5/~wk_&#{ĴHt8}8SRT&w-^߈ V^j6pp8ZfP{a W۫H 健;$`,@+d&7`AS` 9Ǝ0:tR̪2wLҽ5C[L)J|ȔE5)"`oCƩ(UGRĤeXqbC wͺ2ԣaSW>h%2  +G*vQb",m(@xU;r{\MV]I n^a5 Me%J43pzj9R˸:lOv@֍?x7aab-U[-W:=I X1I 0הoдt%q H7:;6t tmeIɚ%ۧV>mԩ: VB.l%Lw UGvı)93v{}'v@%8{XA~SFUYCk,O:CO [D1Z:gl!%ݨ$E8RRӶrfDyĘ 8ЏG@s<9!v@o kkLPcW9C) #ͳ);ZU֕W>=H#4 ϱy/6'9IBsOPaaֆ` Һp mY\{|hQ/֖LpsZ< \ I m*UVHy"48N 5BE$4oGͲ(JN) @xֲtha^t\2RRfewad).o_ e>#:x1*7@9/X cO"aR&`"&yvwScXG: &@uy TG - E=T0Ĝ}\+񓢢{"+Fq 2+3UL挌Q0E=A -QQBN]ZD:l$P(YLoJn"< PIf(KIyv0+`7B4KJ!D/Z v650io{HJ/;gPNL!H`/Oˏ̸t@-XKӀ0/5.CQpG1vB%O//nR9V8F;_4j9&IE yaHaLR|" Wl"RS<48µi" [L.{ܜVj ӦlDUOu,0k/%< v} J f_|,ضKs߁o4>Xum@ߔ:Z}B%?ϫj {WҟH94.Ce auw ?fb@svۜ%SA&[BQ|wQkܟTeXӥ¨kY VC,y*N9wgt @i{F,l;L],L}QG#,JhNeqil46RBj&̡,̒9SigB k^IJmQ N!9X"9BLdZƚ"'N$.t䫬JVv75(0F m}[rb3^09CU="`CʏVLT ݽ:XI]f:o*pʥIţF%#/-ErZ8΄ŗe_2"Zm(>W =fG Kgx3R=&3HMcXߕ ՖeZQVx<}J0A5 ]55p`k=Qth7E'|F㏚Sx=kJҚҁd LN^^!B weju4dKDhw(=+jF~}ewS*39;ex mRHOpvBI yVv+ƌb\)Ɛ` G|80WI YX^#A!1.0҈ؚu 'q"k:+KmY Kѓ6ڷD*Sݡ<:7<++ KТ[[軝x_ͫq5j0HfB]9 89{!:g*+eu9Ԫ><_xC}.X\Vi/D xam.λ/-yg~ ܲAfx>L71*!֕n!$r8@E EC<%ס! Y*?#r3Z* @z3Pb{"VOf-Noz~4C- h@T_`+`IvCfЉryxik_I}бa:גһr}Ϸsypf% P*Xt)gh\/S~]&ȹ"Nk8yP]f\MHMGE=V&f#کMm亻WXuk+l49lHz>ohϿl?R% [-<(ph bhz9Tc;f“FG ÈӶ ݾy>!. xT *M-{b a^u (l( r9f!];2|V@.CcB0Tugz24OIR 2'l<9B$7h0?J\ =5Oe`BKQ(>Juqj)b⧳R%]h7k@.Ё쇁H^% Al.iaK ^`&T6 apǙ6[uhkbaV}ՙm[8i+<[8WZqԸAŗ'TPjآy Ob_QY8y4ƇpY`j".!Ӫ*2뽧1* R` u/:thW(A(C)'^Wݧ 4weE+*Q }X W@DXe.%u/LSL9x2Dx:JhhC xEmg- 14|Gu/0XV+A"Ϊ Q1Ոj->;V3FX;5ۭȄVHkOL"$6ibF*U3K ]:o:9+!5àQ9Re6[1%5`b0 )FYP]=z51Wh ش%7HlzZ=j/R vJRff\eadPUa;[" 6V 4YGe5?Mb}HZwdĆ(5T$`I5jH1_P?["2H?F߹D-=iZ SjhYeU]xF}E%8LH9nT.ဠJ͂ʐeTa jPpG`Rddj 3aK N Cs@*N< ˋȢM !svERHqzH]\FQpV\&5s1tl_822WŘ֣oma߽â"I " Z˶|+ll~mӯ4w@uA{[T:5.!*>=l䣞$f2V򆥾FWI5l6*Wy2Y9a}gŦSC'%HWb*(9sf 6.1JlT q1$@)U#DV*\Y:2烁nce*xXg ): |bjdwu)kRUHDR Dj'e a8CM,tS 3HL# BF7tRCJO+ѯ⿫@b(|h(A"SJ|C/%Dưތ*Xw,2{}Ȁ97,LwϒL>/{0=hʅ؀ԝ=XҡDnQUKu)Bh ĆK XќQ .aLjKWZ0A'"[XI~tW' 8ldDL\|mgZw ʨiRgt"_ai7{ _*=ڮiϚܛ2tFmpqd"L{*^4 Odtp-zd<椶&g}p0~FKYW4[h9u~nyDrSEsЯ˜xοJ>p]u"VTV3!f`@^["5ǀeuf X[KSxR:Gv1?f1 {~*ru~ Y::`Fhw9'`ΑS $ޭ &c 2e؝爃uZ;SR.9U#HC=$$'ZQ.rx0D0'7IKr#u~k>F̊v L-6 2ـ \2,6ZXrN(4+o$4 K0ǫ] H*9X7͈UQvj1±61/_D,)~5K !ks!8}_Cq4dƏ!h|zXmۖDr;W< G`W?,ľ`}U9>}o|~#W+VxKD#9ai* Q,a(Py~%K&x[MT,L!:w]>Lpoѷ ԢY\WJg~{fإV hf@+xx]3i&  1ܔC|*bX>.jXF)u\} "dQK+c)t C94EM3sr+J 32X+z/\`=5I !~DF@WkJ6@dwD¦Vjg ڔ Cb{i>Qo!BZ|5WВJsdl5r]mXBQ條KhXca_!(ʟbXCe Csƥ9RXʑ\Š!i.`Xm+6t>%T'cIocAx,TKEXD eb#ތOui!w0L)2@>KX{%:Lgc- Ĕ7sցU˩\B+n7 K+{Fhu_!H; K2*C8pj/4)":2 !̆A;&@,erZS#+봆R%^0y,l0Dl!Jk@^Puo\jtn!u T Mo Z5`GƢ8Eцr?C>Ϲ`Gٓp8:=;9~tsZÁ%ώt2p'*Qk8'vp"ʹw)!A yeWQjXTfnRq5ҥer(,Rt\QeTN۫,2|ZtlfwU[PEey*=ܪ8B#ltm@ցEQZ=qcXtd7w Fx+,iX)SjK=+6zjBMD(jPEy8d (C2O:B)U4xAecW7ؽuS,, iMG/ "n|l}{oeXMZ,$d!%6X77K ' н80HR*l o?{!UUJ#ÔeO[rx ŨQ?vm=XtSHbG~(9rS=YLjֻ^gE{Ū~WkOwE/e{[t҇iT҉x -x3Dm-i@hh4*qMwU6L{TƜLj4|1,Tgp gX2?!5߫8SS<܍)p(,#7Vqj}k7lNkF V31&EsƯrM žBieTUQ1}j*IZX+XX!\&\6R_TY(ywd_HĪ(RkWPZu2Bsk 4˛ 57 LXqXe1qMRE/ާn[;5-rwY)Ach$4餌Za0݁PL^>%pHi s^х*g &YWIF9Ac=DfX|5Z[ eGJ;'sS:'^\g8AA V]W4 s+ü ahZMgm]BC,`Ճ0N,n4x% Z#Zg?Yt~aܸmGuy|12.g|+WRhm|i}Bt.Yu Yo0'q(TlxczlBv-B9H|r5VGE` 2 Q{e&H4,,vr$3mR@84==z[2JAГr޲0i F"U'ֆdHS]3J4HC!w9lQU=U T\e7dJ 柤<,= hdIh x KUe(LjUu{0,,㹏?Ƕm0JkѬLC9vܜ}D,ldܨ/r#L{;5)c\d U|GN5rۊ=/CQU?M& ] ܤ )}uLA;/>B*^;LX1 /-8 @N $X ,ư6 K,º\Vn:갤D: $FSZˡag:L$N*sta%+ERW.:V`" $F7$VBN4qD4#bS'2c،3^NJȇvJ|©1(1З`FP-bKIf *Y,BafS#WT0 &V UlQn8$䠦 Z]4P{0${Њ6rRG׸X%lS,Cx[c]%!^\}eǀ^lM_|&[qȥSIr:.9rjђrUV.02ʻN;\(%ETvStھ^I@G]8pUO56qd>zvwu}mk,]`K,sg V}YEU&P~l4z0DSdCu"9^|3X~BkU &ou"V\C qiV (@<:C 䁶A 5jS=34nƋCR2*Ԃ zX`ػeC{ 3PL9-[ <)3k6ULϘAJ8k=Q7qr LX*0e|,GJO f*ќrqnF\5z\a{"WHFTj "J 6/&s`7j|iw:|=A?&R&V>Av!eb'؜BIs}_}7N;-k4aeΦ;\`piѯ}<yݣRhX֭TGN2RmVz,!|↟XЊ }:8o `:FXM@:'rq~ų֒Tz&кMȌ0S^EYqh tR0=͕@GZ!Wj NL /%X\&{$)/U;e)ݎ4EaKL܄GmuhVlX>l}ɡCa!iM;h{*ƖHѹ⠲3͒a8LG4=-P=f &{TP 's9j=(J#-)Nh'wIV(~&ԕdK lL,X8l  (cԡ D g5',_Isrkrks뗭_/\6./ζfwpP5/.7[/=>ybAd{D({]I:'! ")P v|=:cDJv1|` ?vOMQj20ÎyݮzO{ɺ2y+4jg]h@j0U)?(&U04!Toz#yXv__IY LJp!yeZq6NJRhJ]~*Zcf8TT e19.Ko9enrL6i8GWAUNi[:F]KN2Joh]x@ F\Ji獨/4mR+?|SOY vڛ>x<4c5@W@Ule0.ہ~(k#iƒpX?8H`Du:Ԫ Nekr#'4 !E J n-Yp0X !DKɿ4۰ZIcF `؝'KL 0e q|3x܈>,Oh*3gNTCߏЉ\f/)#6(4A7 k* & EGJ{Բܩx2 jbe6*ZmF03JHM^qIo0˱b4YX/Fv^+ešXpdJjc$Ћ͉'9,BXaa1ӻczٸ^\Q~ }^O/VದӍ)OpoJ5oкX~q ETT  {e"Zauͫ. qT@ h(QV+qo;e>\ c_6]Dm&cF|=ec*6jq#C0va8-ea>\xW,%0MXJK[]ѣ+iU w.:9"6h9)C~-,U`$x=43;e{We&!0)W84G"zY+ B\ᬬ瞄Hم:>:#ƛ›Nj;Mc p ,м^NY7MY=dqQ r ]0 cdδ۠4ժa҉w7x@NB HMo>\ _ ^ Z}AܧL;,Hm]]c+NDXQ =:ȬWbunI &0Gե6Zsrk8/ħOd!@Rk1 0j%~zT'g)YDNG̷sQH*e=J\%?Ԥ+vz2 z2 x ;^&*X'c!%b΅e2濧 Yg-Xh @5v\p*/Wl Kz]h%] 07إ& u~ǶG?b-\^ž)|-T"nqeS4>W-;V96:)JO92UD`OR% j 'RUgrx"+ly NK #-ԼWy{JD:,TܞvECs>-BHk1ujLt_R7]Y] e p:C\wejKVwUWULcd)qNT4V}+tD;aaIrM_ZS=SycXH%zD!EvX  L WLwvP|7_Њ?bc;$&տ0ܘS_Bz$ú\֌Zk~!z(<@'<:ꞑuxTXYRՙZ͙'U΄?Xku~⼍uish.~Xun.@HlUAp;"wotq!`2)T A>_4d5y>UuJȈ%%!$Ϯ5M]w}p8К\;u W]EAEI =lMj|QzV|U #H;K<{R\ͼPVwukکWK)-X ND9mx2z.Jrr?bd9-εTd< >-TmbHYR}WZz=&h pIw"|tXW7HK5jv(0'IJEs^Jf͎yom+Ў<ш G\PQؽw AgXu0_k5r[ -<ρ_5FӃO8:oUtm6Җ_){li. VXz-5 fBtX5I2F2}J}ɹ2 H.qв"GB}VHJ6)A6kv8pݑ ņn2ޫm! ؅9!a!4ArgT(.vL@%k ě9 ~[aeBԝddy?S &rS[1?=񪾼DBd+JA3;Z hmt~yv:(5D1_pXq(:1&FXgz^\;⣰N 6LJ1e?T:2_\RˡRQ@u {V3a15Uң>hcY; x?;!I8tVIȶqAX֖J)~lx^X%=5e/މZi8b$DPg˶NmV 5#m#,-l)lnY0GDB#b,hbp(Z!kbzςJzX+#T}B v3R(; [JAtU+ĕ٭T hdb<@%FE._J[+ n9Rh`kЪoO" ?$d3ƓI."A-;ҡ!ʍ8\fJU] jchDN`/UNd{{VGN Lb'05fJ xL(Za(8M(-V6z$j@J)*1 _I*3\`pN]84-,,sRO2L9+:PBm=zY/ ͳd[(sXVg}8Z4M2yj~QVkg^ cA3u#?92K^IxLC_IA!>Z0KIYupՁ:=bthϱUEj2Z];%U*w}Y; s!#a$xl )`E^ނh?%r\&ő&=]^b6X&.c2Q̨k] Ltk]sYhl'EĐ!E'S9h,\bA9+㭂}@)Gi9U4]Vnxiyij1%O`Y`T|˦J+$.c~m.ւl!*B`3tA{d>a֥Ү`$p|\LgK)T=h3I@ QOXtXq}Bw(CfjcA9a؋Opi\a-\uJ ıFcB'a[|<=p ~>+hF#P?I rDm4 D_I* cqpÜWq8C?.BMy,XLǕ]hq|ED51a!F~eQFlBXۣ%dwvI4zyw3F{yXG5dMf#P`/`4z  1/E(r1WqFf|3V%.dM,q'i;=''^9ų'KZE", Mtu+ |> '̕xmMM^@ 9A3 \&ݭmZX^a{r7̹Á7Pz%*ɩ ҆7E B{g!DEr:TS닯P(EvCpW B^96ЖTpV-"1;q|1ScP*3&ky~ DwQxMN cq6::EOk5 `nnF b<4pU:,[z;9gJ٫x ɜR^%$̕Y |U64r^SY_zAT\I W5ds}nibACv:`f[K6;ULq U|wl=e+ֻ} ֭ٗU۶˶81]ˇ qM.?1eގ젌.+?dZYp#XsVAhVJB+U5d.lS8]} .1|׼u*DU+șiWTbdLS#$8a9F\ը&CL,YYL.XHד_qmzgSM_e}(s0ZMa)n$S!\R@NaF-|_r)v6eDYy)/e۳ih@'/jfm3݊l_a[eFK*Gz񆣿v|_qXN'{yGEvi;^qR]q^IgFHxrǏt\Df1،ދps;)εã|W% . Z'Q~Đ0}}r~?{wpNf%H=Sr5[Q"UQwKe1۟<>xMP ,EP-S@ŸZƸC*u9,U;GaN)?A}t}{~J_`aRD韬04eT"\Lu2R]gZ"LL_O9R4Up1l,^9d\v]q E1RϙDWBRXʐ0ݼU٭]-v&ބḎdFsԔk*6t5aM<@z=T[`7+1q3rp&KQ|0:SvmͶx(6V%ROÍdp*j2 iS04{a+ieҴAcդ߰7<˗HdU y")0+ V9+ 'q` ^8e;p7Ԑ 4&v@_TIW|N(gPW %&(\bXF śxjA(~J byaPƦRPRxˑjl:ɚH"9X?` qR/_1%D a\3X 9NԂI r)lnױ􎥨}ur0wUǴl֛ȃŮPЫֶK㏿?HŲj_G;%jm7!x[NS\C m&'u5'OasۋVt(Na-H͟BCH,iwKPhr`iA<z R [ Wgt3D,=Ş݅%gjN'[5RZ?C+g3УB㐻]Z:aTSgH҂.Xhsx#;`+W,_K~;K',}CX!JׄͣM@ni-C'=Q)|pB"+&Y*ô&9DCL4p>X U΂ՓVY⮳ ]]Kb/#4.k?K~ç.?ܧz϶5Ym`ݻwJ݃a?4I2abPZ{k'jl \b( :LFQT_Tfc,%NBОlO..>=jD c#ohцTv% ̢˚*DN5 h_ K39XmF UQDS$!Suռ* "p g*Y dnpUtG:2Vj)zRϨ!#\/MJ!pf=w Kk&ۥdhdb2av`Qq6aa4i?5ka@wlT %F6 !(30u~niL3SQag3Q4=,%R" q 5)ZXUYgB'4lmo^ 5ۖZX͒E:D3TQNvUv"zX. qobqZW6It|2MFI!i/8jlGs&%V K{X콽teG(:PdII+xWIϵ0$g̫`M+zU[*'AKϓ!ş?_B n},c b=3(7N 6BUS!Ao?:hy e>N㪢C>hq YV,ڼnaU00sc\,l45ߘo- EvE}c@CDž|v 3Cڊ_1!!}OzX̺3doDsPqXJ=,YFIοu6Z6#:-{즺|s;0D@inƗ E+y!tEz( xx]Cw@]^&ؒ\+vFYnalY5oE2CNٰ.=!Fs[TzR)\t[%.''!:}WTjsox7gg^g~6s O Ja8{:JŒCQ?gq+ika0u5`rW%DfP WGSîyMfW42V~1Ov' j49V.N\Ajb'bE$QTR08 GUi5 @p;h QQ-MG+` '9(=(9N5P{T>+w2w{HNhca waT[qs8ʁɫʢ~j]`3\_QT<,F\ÿ+˄E!Űq& u=zb;dG<6X^s KaUn6BAK8|@RHv5MEA6 )_ׅ00.jYADQy)idóZ5v#ץTrȗM[X~@H$O3 1bs9hP]2ܫfDv{dQ{u]lю[khY$JiBKIk ȪUNJykأ&M+.aJĘF00Mλ 34M o(n=JRc_5]KQk`TqíZNҟJJ8:S1xsoocB {HW9Q}=F\QI;_?w49ѐdk"RXhUtǏXzrgtA+#c8 s:X$-;_ naJ(טoD=wVtȂs熿c>κ/mK= Д0 xQWZ&Lg_ Q,_|誜'Vx9!L^˝ySCWf:^47 Kftf>*3x%򁭄h<-0t cK֝2[3u\AB?.B5X6εʏ!k>D6*QԐ}ƦUjg<UU^8Ò=uyT>Z`#5)z\lg Rôw uY j:%:JӲV~S'z ^~">* ~2QԡzrZC~C0wg` ElԄei%<;ÚƩ)!<\w0AN3lbw]ѐx@PݣUq.t/IW:DT]U,Uiy9W+\31"N@%LmobѾ M]Jeem JYќ .p]-Fg;1Ԡ[>TFWH&dZQ >*2z**8T'C<4i>M*z`Rd]EH6&iV7q6B.ڣ-@Cvy8` ivG. 04|a%GӃ}8S J;BbW++{ BZ`WYzGA$ʇ"RN,"CB."Š߼xXuo׽cIe!/nL9x@AыAWxgEj~de&`MXjkYDR#(V+jMj06@lR :/Q8?P 0&BFE8^_< iՁ9+Jރ!b]66mEux* 㫐 Y-qcp[Pe^^հ~ F$v_[)ޖמp^IZogMjWdKJW{4RA3snу 7B2Y%jbVܚݼPK5`êu&©yn4w,D#Gj, ;=PEU RBFeX _,_8jP),"@] Y*XHH,!AbfExio`O_~巾*2a<~)x\'XV"zy{8ʼi'@YVrVS`}E3~^[Y,n\(bc/vLȖҿl;{NhȎTLVIJ nM m}pR!+GcEzxW+| BͶH^ZB,oM :^+Aݚ( pz c}fX[gpgGS*+yqVmL吔mrtP6I&FJqBH!s!yC\@pZ>}?CBF Shx_//:zHkp!CsEzS!5i  %|mLwvy%?G&ޟt+rXJ(r_ ֢r`K~G<ł| S.8#! ^!Ĥ5qtvH Vܙ]5<t J*Mu*I5[]"B0$JF4Q4$*g]- -RKwOn販\(kFHl^MCBbVY!'vڎPMlسgSj6[k^>Oƃt}M9z~5" h_ćOUIwkE{M7,G]oQGHFJSKA)8 85<k@CIw"XbG/jް7cV;;9lLdNY-uńk-`S(EJQ(Ka_y+vKr!+7 Ó7xk|Hp_%TEU.RHAW+NT+H"`[WlJMAV*4 =rXl7Y=rr(Ax./b,BTT@[Iho`fbT"`=;Dy%ivҡ鱠ce"/l %etS$bc6t{As1< /;;޵{ûsl2 sX;û|Q@Bk5(i ȶ5_Õx)up T+DH4u]g|e/ߤ5엒ֿ^?N&cB]`m< aMn - 9pvcRRo N|wL>XV-6϶҈-"¿;L.)c'=|(w`yNY4IW>?LN;= -4[ rDj[Ґ@,5yp%Hp N9@׊)PBn%C6Òڙ:UTv9Oꜳ *C+K!5KMlXKIaDT.6T&bOqZ NaaLBc?Do$FJ{9ͅ"UXXlXuK dbwj[Vթ*YTP2hRuaDc ҿ_ʮ5kҟv 4ꞷ+ )@= C "  B443D&/"Qp’֬j}Z&}vOƠbUU>a@H|C Xݖ,*QA+R'Jk0 . z,:,dtaA?VD@Hjin䍊HJz ZκɌ[d@YÜQC%9}!*~z zsBEUQ&z``+aBB J3k`782Sɳ_ӊfS 2f)4h}~cथłISԉ!|#=!%BwYG+*' `>GZHn/' W菖\ҘaS޽`(f`Ws);Qh.ra@$pf֙2"2S+#.q$eF(֋ a8GpBi1$ zqk\0ECOw-KRH 8J9-!,8ENKQ#1xK2zM7:T=F=Ny!1B+,;;g/Ԝ~?HT!C:'lR ^B \OD<~J\ŁtXqF#ˠC2"=<ؘ7 m 5x)gJcT<Ow#{NϒV#d&4N%LdO#xU97=2Z1 a][h*KSN< pU¸-IWskKjU+ Xȼ@*WU-rQ:R=J{@A2V`ʤDV,tϤeT5Kg`ta qo:}]}FoG?9y|uݙڤ rRE @\+r=,iz)6vS3)!JR>f}:vg۳z355E4rϊGp_7/=C;X ڪ>EJz0+`qԧ`_U]nj.U7|[!--ΖqҥpKI豷 R)~+= hwǝ+Ōǖ"+YྍT+cSFzf+Jɬ: DEKЊ< 5di+YehE~Z X{aZdX}l /,JOV1@Hi x)B;oi*7-{{I=d|/U[V&CFr.)|wl9,^BTͺl8%t]a)./saݻ<Y F_t&~ue\kLˆ} rBYsX~W8zF=G^ ax0c",vZswXJ}sy!9,TJ.71:F~7-pOVS%IW?|0gB pepX D N1)H϶xěX͠AjGpi"˝)8D=6%%0KIqT[j*v6A^.}ɥx]44+śʭ 7&9З)n¬ׄ8ݷk9LR(Kw; TY oE0Qa[P,aSnpY 7XFn:.kYU_!;^fYi(}rH1eZ'+zv.xvn6vɩli4;5v6אKa).u)`Goyy$o')E'tO6uRkxEk8u~b,HQă<#DHb};v-zġSAoHx 'FJ5)eaḱƆ|6W`Y?Y7k kk?aBQ~wLRTgq4ڵPe4<לC&! t-`IaT,24OJJL^ <3Si9SV46/f m *ޑYdbaXT,tWpwvZ'KџeÎr-GqȺv8^iKn gGT1b{y+CqƟ,h *:r_FP/T,~δNmn8%;ḡjVV&CNk85:RX;-ZS & "3>GN(ۗ/_"猭艰ځ+H$ ڃO7w~HlGXWwaa|?+Col2N՝igOgb>ϯ ?ΌqJ-Ϥ0J.hV uP svf m8W=۔E23λ2*>%e&r%O1|\"=x-Q@ynڧHQ:ƄgT,:!,\NcLU18+_U8{\zSAG0/Zَ)Z.<,/YVOXMK3vU]d2 ]BP>r1#.H#^"&MDOaĨ8pc &=i X-\Mdt!wO$h6=}}ƃVˆ QT)lTsp)/8xiaY\֧ 60($AI,@kU#>1rX7-71w9\;~cعPS!g^ ^&b.$7CH0c~ ͇%Mw-J GD :R3E]R.a 5 qjV[krX:VSUMq!Fijt-ihe#Dza~|j*U ~g&2b$8% >9,bh!X9dHWgz4hB/2ζ#SS`I$.V9fv_> E?5m(e (zљBs2J'*~> k2Y ?٬~ YjO26I~0R:;%2tkC-oI/ǺENkP.sR.9,]*5w:FU9|QWFp, <[;+-Oҡe_{$4Tę.۪h# &WJ|hQ4*e_˚1FU]5ԠU2IwQiFިW\7_ahi^h4M4XS5Zf |M5aM-_։[p`H& gɈ/Z1;"`A4Ma,`rC|PA{[5\_9- ,݁T߄{u7(n5<|{LtfnšVR xNŬgD.[] pX!P 3RaP H39d0?> 9,b6Q__r6<_~̐F6LBkkliؗd_E:}PB _ʐ0G4t, sumD@gN_0ޭSқH0ˋ_B̑Њa.&V%DJʻ$bT*GvXE*S*B_>7>^& *ExUb2Z!՝nu(thWF  FM&AA3=:,wa苕ևakyM.ا/~hI N2!,^aJKgĄ:(qk[3҅a t7b>,թ{:}/ d7OoBZL` IwfLk- q!>1˳ <Z- %!UFlJE3^܃jW&V%L5rV#sU&+VُaT%YQ.9ۇ вy2[8̅5O#\F!~HcEҁ68NX>Jg~z!KVb9q2~p0V8ԺM`I ߌut8uN;K \Dkh¨$; %9 i RxF*sX f(h $StXG%,%dKjMOkl?u},v2'|6YMBwԿz?RBOWV~1ݷ6'Yt1~p5N>a31VLo`uݹ*.h0.9Kl,D^55aV_DfĹN2ZLk z3-t?1sf6W)}GlY/ɸ Y}wW %dgB$4Hqy$ǗܕOdrJ$ШL{i MfqPU9;/x -j\Q|!{@~[J *"(\5pP^L iH?*+ CFb}{aٔ VnDUaSKF 12B?]\"b*qwb1 eٍP#$/0m/1!VagqGl'哀FI*COuA3ԫϦN`g~{˖oQ}H +RPW5JS8J'V-& aEWԕ(QDKQq0 BRC72آ!nA+P2sAX]eXy !݃cc']$2l, rh1Tdaa$^ b{^j&ŅJŅxˆ`2 u @xQ(*L_m/gP$Bh6M;f\ X%D>?⺣!*j C5V6'!*N905¢z M`Zjr0™?RTBXouD ŊLBXһw옜pOWg":R9!4] ?ࡩǽaWS75\$pGJv%0هAʯ? s) \adڄ;VPڕ?Jn,2ֈgXKIf{0ApT8F\K٫U+XWE8X0!nrXB[3 * 3YX({/?e7%U$0jIsr16} ec#x)V&p9a<- 4Dh2PS¨@ΏjjUt* MV .n,UnTECvA~ .k1'qwR'e`?*ޝ!VvQ nQsVxiBOU]& H2| +_]vBK b`l£-4?p[s'̺ )| Rr|9^3Nw;C]Tk">pX5nt3 / شGOgkI.c25=mү^y=>z^}5ѼB)rjtBBuSg;"qtOXu3JpNڢ-BCA1jEEc PHuP%a|6* J8"*V"I[@VD|WQn]tw]8̽VoOʢ>*fz%VhfjŒCci40}48l1$&z"pjjհIb!=O}BdVTö^̇!/u7JuyN2SB^-2W2ΎhT,EqW>%SCB-XurXJ}Gꩮ ƨ\OU=cÖQM{{a@@U4C_*qbj 5tQ,OѸDF,}w8JS6rVNِ4խꔠ7h|bhKL[,l"gRa )ɨYm.BF-b%#B hA4+ʑ4.EԂdE%UЩaa H?S) C#BVS'Vw\\2Ej+NOx Ă,4µ7U*aaѠUULֻpX8}Af0U8Ʌɓ:T%yX7EZL!yEdpurs[fmNWX^__Np`Lh=b&Fo >VDקHPcHwtnٺL+ #NWZFi_-b؝H(,z[y` 쵃qKOAaDc5AVÎJt{t%3٪tHrP>2rgDh|ݑ'YBP\Ce R)ڝn%gn oaD{3'_mWq\ˤO_!'՛ T >3cC]g`BDL0XbwFsaΦhK.z^bFk(gs?(º~!,/Fv0[GX*1M}%C%;#B- 3SK٦ *&z{ }r},K9^$Ռy|d 3> XNmY_ܳ!|U6ESl~,%đ3nQ2+<_E \_t/L e2*v˲ɻMxLڳ{ fINB>kմUcUV bM'krP?*G1qIh2]S`ķmœVƭpDU|6H [F0ڧ M"} 85BT! վ65`+ت #Qqz)wz9#r6Bb(aɝ'-(1Q /%duaxtt7NaYDl3;s" JB;g IF\/& lZaہ[8Yk?Y rQaΘDCL:5#,PtYq8%Ky+4wL101yyA-rX__n)[AT5YFa^찉T@j~aɜG%Sah6ݻ*Ӏ VorXK+ڃ(j+C$g_i`n;r>؃4 kd SbrU ?<V{~=@h7%Ypc9)N ZpRČRW%e%74g>VGj)*ʨNl-#{aZΤ9Bm.IZ$Wt߷aK 63|y\*OESqh/0D ajEgH ;c)8,GX.!;y#/r{Se |d5s"}qyx*56)j9Hgs\VJe7rN |ձ̏MK"SU Y4ONd O ࡦ :UNj1+1Zx1 ie/6c!֕UBz#)ׯeKLrY=yD^CSJAEJF,'|\`N'=:^wDa!4(JT']` 4VEHWaHL>dSDQ_U'爤Jo JS>rOStK)8.^/V& u>tC (PRl>obԗdw&к<_G3hK^GjįU*~?g!XŐʙ+Vh\g(zy&;F3ͺ<ǧ\5*X8,dT5sI+})u\+AY8Ǟ?.~>VxU撄ЄڒѩNEoa07bh |P3Z#㫘i" 3:a8sXK:)kxz? %XǼ•VaT뗗8,ɞ bļ8א&{eD !ui {נ0+M.eGUqdޥh=$5<`oi8dGwlk(x%.+=\*HNu`@(ea"Xp: 5s(K:'DzgF xBk*[IJ;6{&TWׄ⛃PYc*Wק4f]<Rۙ-$!|e`,/:a M@_鹰؃5j($2q)صB]ip *>~$M!ayLl,GHNU:oW,j)A']%+!gLJ=9 Zo*!9:5CKKOg07)$!Xʼe7Z\LOD4U0zR"i !,FG,w AE8Q+"XK'4ڃ8|d2sTX_1P WVzoz () TVC u,1݀J 鲨ƈ\`vDyFȨI>I4`6b% .ݞOR^#k]KpT{01[6O^dn?cC3 *~k7rqaWY Áʯ,)UM̡V345f,J<*)z$H ( 7- tu-3RZj?C%lS@kQXӿϤ6 gȁ=7G嫂^.D|Xa*iLO@J16|W8,Ԑ- P<סmd[Wob(M]V4WM !p~(qEmw̼ԛeRkչe9/|/sla7b9Af%j^mV2EU+za9X|! aq&Ei̔[)!xn0@K d21 Q51l(K[}ۉLև?DXVa5e룼,s C",C\%JRnw|+ 䳣> uHHT l2$f#r(5 վPa5d-QK3Bny4I]wjt#ȑ 3Iv03;7*/Yd}8[\*䵝-Y`Vh*+j_Y _U!+Jg#sX7l/uoZ*iq`YC+ܯdڊhJv=abuknQeTI72(-l ra_3`UR5wr2wҤsS [h&SsTP.y暁J(e@P3x,(C޿/v ɨǝ&}WRjrXy3"UTUa8{0[%1J" X  ƚU8"z7ᙖ.!> `JHf#Nl i:Ћռzӝ9"z*z# ҵy y-_Vvr4fxz%0NH㹿`vC խO~O3օ , a QpX\jx{\Uښܓ6J#z˜iv~ǀMl91gR*ҍGXOʗܩclL.pX`y\.ԠH ʝjN`>+C $&:>(=SSq#CX'oh:S6n5%w8,EX*agUeJ8KU oZ#Ot184Ed |U**e[?*| kRLC,3c.xhMw:# G&d֩*'cVq\ `% _xREN@Pgn/gZo.,k,ov7 )m\yŁ%^`?lQ`ХX1]C_̷gAh'bqCXtK2: ,fe`>TP25(TG'_R+f) JZ3|,de9Iv:Ky/âbp+Bb0ϕt+h1\1\.>\a=;OqZH/߾|Z`hT awaaK__%KހVX!åC$dԸAMI@:seJΝIZ3׷z{{O`'.m8χ5pKܗS,{?, Å.ANb<ȉ}SChpy`<_2^8,ǜpIM*)˹ߣ\UE+ +ygP)Xʰ$bw>+ ~HʋyarW G*ʙ8 }WY'dz|Ξ]pF竖4:cx v5H݅]qm2c)EaXfɟW64[y9,4"ɪ޳WR:ȯ헿a9pXG1o%' {8,H0]ϸ+%V*ƫc\?cZG8oNY/,bYQ~YTL;Cf2G@K*QtI6Qx2訃QҮ)vM* fxS49UU_^apq#^-)v'(%C~2tޫm'\8t6qUĂzJSIęAŰƜIRG?gߒ0 ۢbgʌIt`i9iKrξ"_((^C|e5O0G8('Z@KI3Rl5P̰BYInt4H*H)X1*̰TՈSZC6{Ge~~ ;m4>uau씰|5g>1BU°0&j՜'BdaҫɚP!B;usK1-2fZGA0(]0ʠZH'0`jw^~~V!}l[UMxt܆J K9 q EvG*,T+mRXuA:jH5:cUzr+a ,֞ɷ|r5[7\JƙPv–Yc~_4 b;X:'A"X nZhuU zlLJ&w&cCvrmV76 sy_D c,Eg0)\ЇI]W읁eâ~a;Xq,iqi)Z:ɯh q9{8|浨>a&*(TSAJ|!^i~^ThC4օ4:3-HHX l 6FB^ؿo[zD#ǃloZ<.r`(g_:b,/} q/PLt /?kN5b8!^:pw n?z5)ЌLI7QI|+ {ʣ IkLCC@=1(F7BXU*/1)J]  Jww\z~T 랯 ,en}xuҠJ2,`]$OD] +cX6{tyHJey>Pe\H:]Acvtb!U8oO+P3w1BP=mo| kt?T: ;{B/?H 1V0,B9d*z#(G}3 k1A`$j.8-#ޮ\F]A]xlbu < }_sn- *WK=w@jHMSB ? iPH+A] RT4qU&&@ys $YS"IȮX@(Ҽl pcQIX#]]8D+=h9X#뛽c%IŔ9G+Lˆc^m45aAVE/ WFXZ!p,XpǣRlݝX(#U>u2Y$B)hև}XljMRR9*=Snޕm -ao  .X;XgP -!15k+@~ťUQ l  *d:c!cU1m=[z]rV$ë|k-)/ll.…߇0J' jQ`zY(c 4,x $r9F"koS9Q(l'y.Rjm;loAXݕ\%6Y.d9?g޻HԗN+]ʯ χd .k)V%Ta)Bs;sA- (Ť*┯[B4ip#voS%ΰ$Xw t84ǩTqP3°VTu^l}ڲ;ƖB񽢥H-vsYwq0be]q0D0 -aQbaAXw{}ק(TկvȲn{sӏbȜTA}x- &QLײm,Xl^ =7H= 4B췡՜^Hf,d" RǒϸBrɶ|G];xpS UW՚zN|%UT]%Y]8Cr<|{j+Q9,q!@+L>eU*r^> r" /ˑ`_ayRW1Qx28D[tb̮䬠o_H8ZHfz  Ay)6z|'b{>-1!k@ A+@꥚HdAvvc81EAx9E I\HYlŷ˦poݾEW:I<& PAF"998'/DZm0,wdITq8a}4w!b?/vhG X+ͷ8\/:ɺ@uX1`+dܹ1/&堻8Z`BӺyZ.cpJ2!KK&'Xo,MwHrJVZop֫8" =b!zJE~pvXJЉ~뺦@\f,W 0,Py+'Bמayw M0NC܌cI:. t |JnWL?>%ÒJG.?I/ ,k!bAE d@LE5YM;c<.d=aX0j(mK 24D,8֫kJ) .J:j=[*p*}[Lp<,Ĥ NeVbv)@VU37=G=.ʂ$X~R7yug%_W4G-vKM íL3Ӷ.L1,U(BVi\ GT2I>8TI(q[K, qg=W\(f,n2rpJE}C^p(K,J8 =>..[䂿D"ZD<&A讠y櫱0f]t烍A"Vΰ~|D8BFu_<(`pĉJǯߎ߂e1ui*$Aj'BQ8(M%2]x)aOXHUVA \J˛0P ( VtU8}Yx'́ d\W]>&7E Jkc+ cr2ٳKFv@; outdXIAw2? MGʰ<(^Iu 7ǝPAg,2Q Vwٸ+IːY ss8ϲ q!tX zS0S3p5"V2}3.6b:;%"VFV)/S5Oٸ>w,ݒ. IMpa Y[[J,E+8cX=8(+ǰr<6\<;hf4H&l`2`X%(լL0֭#IU5B/:V5nrXQW[ iwX*NrP H*4\v~xx{&?U M2OvH?\ua) tvR42ecRUH೔ -Dh>[R%p7-Mk$+Udfg^)&w^g³Z]xn \Q=,2OEpc(/\9E",,+aQ F7iPR20"B"/gT3ۊa c)~&G٨Y\n:7 +raDNQ 헟Mi Ty[{[$Zc ]Zؑa15W0,ɐ8%b9ΰb z-V 4>@bI~]ryЄ3"ƎKdXm؛XFQQ< +OyksM>zBX(DD2~D* m̾0 hXk> l/])*n'>y`rʩ(;D(|@/Urjc`ǃ[♖!2}Y/UUdqrcVRN\=`p %(J> 83C(UR~`Az) k ߬A~P~WWzV~mE1*L/٪P vvV[vjck#dS]Tb}KKF]B:%A0,oԒ5ʬz ͦ-|#wR zvt\6QE,l; '}戯4 Tow[=혙fx>a6FZk~F)} ` 8Pb0P]{8iҡٸw:}eA,'לpƨmKN v!eWsrFw4V(pQuh_(‹HGtR屬4`NV%¢TU4Or ʔ_1 {W[ -dx1?@miG6TX,ǩB 8`Zz{BV~7AazH,e VE":,r1ڍk7n`-#`}` [Bǥ,6[GI0f1%Gld,9V;EÐŔƪ3Q*v.eˆ=TY! &:PwT5mAu#ߕtd4+GY KhXZ:UUE+ݽe:qcv0,b)/6b)ZʠƱrl,'P$s]u%+; VGzťR@2NGt_Օ\CF[nBCTQ QM"$2&B5mhNYWCԺC C%5!Ϛ{sq>n*o5(t8 m]w|Ԣ*WR—,YBu#N(1 zVcdsGIW4(/`cs>NZ` -5<oӠ;l'9 N JwB.!O`}'g6j^?q6n=7gF1u uLjEߧ9m2,,=8= ޠbhbX,A]YtΰfIS.y(BCk=yK<Sbxay(eg1,M"IHE8Ym" IU*OF<[k|>lpKHBSk"nv ͸̴ >C9dHN2Z̸[!ZIJvՔJ%&+iV=^x_6 Nb"p!:Ht=z44/(4NQRUFTVOH/F9U4~.JL )sa>`=HбJ6)(}Aq Ӓb.PBFo|* VA:R՚ АVRqiXLp# Fl`'IEfXAD CAU:^9PST8P8pkB}} N^uH3x&YI77ӕ{/nhWПCڅ:EN.y_.avnWuxֱc׮@@s6mbk//ܽi?9WFv|d%α3Ӕ9LG>ߞ1_Hc_]ZڜCxI܁xA|L7ֱ :dWNā_iB{W,d`!VW5aL&7/keTԬh RzSr^3ȅAL[ז[9VT@P>5X ?cRHIva17rt\rgᱏc:0O8ԝPQ!#$u ( h K/1 ?i7\ .V"frW;?9aݟ9s`I1I,WLT o;|Hp 翲c@3kݵabXw[O.H_<3pOYPG zz7e6.]YW N CxPo)-B*Rn !>',&SNre R(yLS]-v^fJ,тO/·d`R} GN,>]wh#O#S*,4hynkt k sGQqGDpL ms5EP` vd°H@KD kiEPE 䏁5-{?Nʍ # \s17X`麑>`gE!ZWKǫìXh Ë(SV 7o}f m OjG7*HS{wsJw}#˰ Ǹ[~35a XԗYRreT5*Q2.LyoM`(ܣfIrq~۔2*1BVЎU .|H-/PQ)4&aԝQ>!BDJUlP/mjͽ$j溔YHPWn2Z^ŀaA 4ŰT=Gm~yfX]1,JId(.}2sWe*61{`GKud14ǰ ;KR"uÚVN `t+wQm"+5'/z%+뇏xx+Eo= `y)A/"d u XMzGkRUz)*0\,0(i|V@z° HkeXcZo'u;WK[KjsOh %V!R8hi MQjCBQXؔ(Kn_EJ$0e𖱽C8- hoQP1 |2.ʡ]h,I'임iep0K(ڵ]h (tai~yBeu1k9,+CJd-|bXנ>1-@*C@N :R# "{\VZ5Y"z_yrapҼ2`jC7GXieX}.V2,E$SI 7?EE,k;)bA Xdİ20` NP9)!PpK(V-c*rXU2 ,MڤfVrMʈzXd`4=CTaA Pqo ˍ8bYj0]e,T\`LUV)h16a0{l*mv_J,S 1ƒ1f湐 GcI\ W7=c!B}.Ρ,3Ox< _I/S(cDY85LL̎[eiD^ߵK 3,(;-5zY`~tZ\ڃޱJʰ|(a4Aj0+]N]$ G]žc_kܰ @~.< T:i}Ԟ:,}2,Y ʎ{GGcB}PR>F+Y!R+7!re$R_^R 0JBs¨M9c.pDԥBË́!4E䠾_.!JjyTz@Lb!hSF۴ORSkW `=@dɇ%TytITL% <|2XkD_ MK ]BbXI5:__ XP-L`eL kx38M<:zxߋ `a͎Tq.,0d zeH eKذ;f?O7ugT?kVUr[~nZp(^ tgdð `mleM@d8?! ̫)'#vprg]n}oG?M4rKʰNa1ݱQ`ޟrTp !Wl^.4bXzTҮdK!͇%#c$m#Ů/fW3iRAWuCBE%TM2,=1}'0°h3>R3.( ޗ !`&P#})X/0Z]BpޭjWB;p cb dl tp\)ƠQxdo4\t}ϟNF*񷥅y=yKE4E5ˀŷ~v@V@7u=\C2{˰f!ӌW2nVYsaeeyAb8=?"eXXF`Daa7@L?QOl:\Ud:{:&\h;3DީVP E .`ٿDY7ޒ I/)dlbhLj}6urq{FW#EV=GVJGTs X _*xwjb˫嘓WFu%Px^բxE/?l]BD c4Mڤt}w"Awh/9>Vs,P ; 5*USJbM_tVE\?5I½bXd!`qǒRll7x*Mz-46 o Z^bsvqmTƧb~f'"Wa}%#%/ ,m 6Xl,޾|Ww|˰bPGXYCYU¸#I\UX_R=0O-&g_\>a<XS\BZRB7 Vso="NOU+İ.ah64XZ ^e&Y4VSUJJ=ChQ 9rQ[TCF.!f2+XMr_ RhvFbe}^"!NvRbQ܏&QwQ]9N"P`牪ɣL#q\hpAu)Vg°XHjS\HeM)֔aXH(/ga}`X Z5+E~Uyō0yU/p>`/:/[LYXυLs'gEp= /z8 _xbN5?1:_Rhe t燕Wχ6bXM(k/@M㹄tOpy9M :|}m{>ae$>Rq,HR㋆aM>}Y!X˺qY!|V,\%p*az*5 `W2v4_HB%ó*k+j0[\VIWfg)GwQ4 wKЄ(Di1+ zwڼ\ ABYQ5ҵqҮ]\ӻ Iڥ\?Lare1(֚b]9"$ JOP Kd ÂKbz('*R2lhưd_RFEяJG \+.*ʞVs* @3k45kbXu6.z6Q&:>j+`jðnUd iLv'%ðKe'LʰJM|D<)²Wǔa}񖡏]8^Z~(êYBeX XjrhW7JQݱvD++ǒgwM0oZ[Aeiy1$ck Jh X2{Δ6!KQ.Cj%2.%g*$ E^(CXt26lbEnbhhbhY3bŐaA=뀜ptf4?ؼưB= Âu7B-Ob9A! CyǑvy䝗)J~V<NeVA|.Uò2Ora~ +y0UD+:w5V+g{( L {n';/X_n/]=W OC{Mx!2Gc3Ae\/)=_[mglVeҽYMĊ;rBWB+j7SsY. G`:]YႃȬc h V2 MQ!6H Ku\$QPqK ~)Ny1mXV,p(Wj9Xd>y©y"RibiH1JS݄2T=]},dXX3,$E"u9E &aeF NG j9p#dN[hI֖m2_XY3eXYeXFeX Xx>zar1mQRYBsS& `mݮKmh N`Q]%4#%HҷK()а &ʰj âl.Rr'Phޔv3b(#3vԊAʊڝEQJ <vwFZYn"# C9+VW3|r4r9^͇6hon'Ci6?.glJM6UmĂ@VQу5g%&|Jqe|8P\B9Q0ɔL)n"8ÒX( CCN~ou0'%D(e_Y?g4[,(O_g q֯H8ɌIO|tazMyFPQochʰa%I/mؐ!N #1TʥQ}J`>nYQ#$P%s 9[2}CZU 6UFiE0~}qFi+kdr", #߄]OTWЖY:5MUݶmˌ$NUb lDנOِیL +Ԯ$;?kϏMϝyf ~;ʛ[upݫ&GJvpF:ڹq,Ĩ8:, d#lYjjRXlE T_ }ũ\LTր +'[?6Yd◼|Xa`reVޕx Xv.?3blLC>ܪisFabEmxd*K`IJ⦆;tXƎ%!JH;&*%gU G^=/Y/k%ryMA='b@X$Ğ1X};5-g_ާV Nmus`\ XbU,0OeJ`x;ngJlƂI#XWavL0*YP//'hYSaz*1,M%{1+dI`7pXʰ k4je;U_ p)ctד5޹/c%4 +Vb7ØT©V8TtRdzgҝN+q1C?;`eQeVVeXNn˒]Iy9~Cg3ɖcbn{Ӈ"|Xst?:Z}yr?z&v૑)ݙH("B`dqؕ#b Z*)p.Cc̝A (69)Xd~*, C00G#n}3yTK/ydrX:MjcKa"İ*씰oJ!W ##!Fa^Ϛixz=ֆNޚ3{cXGBޱ[s<R#&S]?z딻A8:ΏH8cqQ7]lJtEMz[a 骠 u@1t~b?5(C젪9.RhUǨJCWp,2T(OF;6{Ǹ`NeJ 1J /ʏyyaY /MM*N)pKɃZ*(s-V*b-@C(HAi!k0,JizFYZH Z*!,iJ(M&Z{/AcGV61P"ObFT߿l uVi>2ڻa1*V4=eGI5\7^4Nv[io=icXk" +lnϤR#F$A_|55/4]wRm@ %ȁ3x %So5I$M$eyO6j>sz;%|MZbGx]*mF%83W;h>mlx(6-bƼu`6@bQtE fƁ酦2Npe]w Vyt%*y~0|cg4]vm7YUAj1tkewNHJp7fr̲؆3y|َ'pel_{%O8jW [[ /Q֊e6@{EӇe=Ò^F >\8aQmMϬ^e>:/IX)"S(2Q T ^ ˂&\IשG+0,\K4  c.*b@MzvsOOeyIk-M--%Н(ՙDl n*'B[ M"Tϑ[ᨴLx}S%;8T')!=@F7m+?y;Ò]E $X2"DJLXϖb# bX`X QVqkXz=eX|b.An8w| 1)xi@GLf20yg Td/=iGII}5WNQ2ʌuhG A^Aac==GaMd YfKL f@XݙcU1ZtVf jsk"ᵗz$PV?;>nb~E l X=oI~A|K2SMX~-쉐S(@6hHJX vjC{[DN~3s*thq!'SJ/ޫ\@gY sܨ6ۂi!2Cf0}"2ո+%vnNv7TJ#Vs^ [-cq-俚[֯8abв_XooW~FJ4;ڜJfaH^AKArC2S6?p'O\ǙQr>09Ewv.~wa`75w]-%w՟Hf߹_澚+{};1}fZq&ݏ/f2:bʏXeRho! *ϳp? Epy}{wyn^w}w\f0UvH$D^?JM싃N ɫbšRcX]\*Ч]5TƁ.N:=n_b{d}lp!1>Si1*2,j@)52x@6K D "h%RY1.A:DUʺZ)ЫV}0*ej2 w69-b4Ь@%Ks>ԅD U W"S@=ߛ{u0b'bWxVD8x.qEUD# C]AWwqdy +eV`Կt+ :B܂eH7-޽G`i(gzA d|EwcWoa4ڃQPM`Z9r@.7ou Ikj]. yͿo!z wǣ-B|$GJeyP $/.1ŌD207;0[D=6e!%}O5.nob8CvR’uWE`3:[} ИUyApGQ>QxeD9as3W$Z>noz!Q u񡜚𒉃/BϦq+e*r\^Ei.ƉgYr̩"y03UPI"DhG|uGE3*dLt+xp3;0Ն D2 Va'~%~6ʪS]úF8# b :r! EѹB֟B"hIH ɰ;yMlCA.•?X{KHVMfDaf9PJ3o) KPJ* `iq{*ZB+_ull_҅ǰбo8,aT{D;("`99/oЫ !64Z_$hFԅq kFR&lph鬿-[~ov_o`ģ|.vj G#âC./@$rk%aomj9%5W1Kqqh/,`©_'U!&Ҧ2C#8j3IvuS8 H+PK}O_R2*Wx~İ#FJEF]2<'T.hlC$ ]XC:uf0Ma|l8L"M b~"*l6IÐuS= `;S"y;~HW(+YK J\gE:cj);@IYKCIgTc3E*yӐQKz"D 8i2f%E26\G(֜oѠ!B$ԕuJ%8{qBSF7 ;w 28g's !(g[ī_n]^9rG*0(MMADJU.sYQ!($S~m?`+r‚b庘J i f ;%Z: ģIy3.) 1ӈUq Bz0Et) "]*dieqK#jq+*`ߔa)ò byfebtS AN1rKà狈uALyT4aJZ"8W xFhDXYf=d`4&fXt( ķGkxᄉ %Y0drI #  ?a 7L3,ݚxP9NÂ_fiIdP,D5H#͗ PtWMɘ4G·<=)u<_\=!T>;TEA7ɿ.:TJ Rư8Xr0 5ů_꼘kG՞;Iڤ2.sC)eXC MQ ?x C=ٲĢh-N0TȓPjNFO80ZVdb $N䮢0upDt\MeWDLIM^TiQE9,BN "ICȸi65;H2m6Nb7߿\_YZ4Ɵ/bbaeaɲ Yh谘`Rvc~= r,òN~)_ንE\d"0_+А/Wk_I: J6$@P %(F= X2JN@;nJ9Ċ*~} /@9|14Wu˵˫мhXɸ2UÂڳ'[,`s%q{ S^V%4l3jv+G,P) jy,*4U]zZcfB[<*Q]f_Y hi^e1,mB<2r+W1XK٠kd*bUx-! *zm5|aU+zLw?eIGci;1 ሗ,}Qa ${ 5;1XZk%sB= Zϛ_F9ϰ9/:NlA_p8kv^'^|B)x?=YPiw5%"zd9SoCYrI}ttVރ1l'uxcV}+X@хʸ@FߝEEę25;~S`t+e?Iş[̆!DQNY\W~sWgI#g<ZEMei6r eH-T,:1lZLC￧ D-{=dqй"`Ap8#PRgXUϱ,QR, E+FQt qX;q7e%к/^U"OXh9 Y*m:18_O@$Z#uIGU,?$a ~Ûg]egg`Xa)r `,~Nu&!p 2DYn24O;-B@>A駈xF("wgu'\<%"`{|pwbJ@hB­_':F6Y=UBTTeJg;A ]|?̬]BmxCs(TU餿_PYvY)ѨKc󯊌g"~ڨ߫4 8)uE2ր~w+` XQ#R*;1 4H, FUFB!h~=ÙY(1! :hҙj8Iw @2 1Q9F7 փ+`6-IJSIi4TmCiEsfy'>ٛC>, LmThDh_ﵚnQ[ 0pa@2jF0Dc% MgĈpnpMNf Ci=3ub_'/=* hj#~!3?*',Ч;$)~QL+pQDp`&!?/5i, ٫yjʰ$7W&W1"C𦳽3^5۾7ˌaR Ak6WzwEp,sND8!wv2e:JW6%u d-F)Vj0]դ/,[Tn9N+yǠ470.X$}RYt>o7`a \%Qy*0&r)T¬nɝ8A!b"NudXdM4觌*lT^A|~;WKc\X\aԕ;*M&tR1^׋" VӨ֠`(<"w$cjC癿e.5 gv5S De23k.'Zf3+j_'j>vW2\G&WU\Ry$ ~ylNy-䣣sVL=ëRX1*!6qP &rśWsI4vE#DU}"A:EvPS0p~s5(Yp&(MN)`YzhUv-.#Vͥd DeɚXv~MZpx=XOb S[UxT8mRټ^d_́|Db:=h++GI` `R70qR0g ^5f'v=1ڎ H =YiȖo"Gy,c4 [HI[C3lv 5e ˎ&U9UQ-9sGMpM4x W=iL&<Ʋi5)5(q*40 w9W"Tqh]_&R3\AjIr2q@AK2d1} g^1s"xS]Bzh0 X9_XBZ)?f+WN>YSYq8g(bJht/&%sjlkYj?)TyW1%-n\ͮ:A q0$'W'+llk xuX_ǯbAYNv QÒX{ XK\i=x Yenl* 2Fк]trdmh~1J_"ѠN=ӣ +.@ J31e_h$w$ KcIlk9`^eJszEȨtS)=įp/zNϐI,+]ֱGXV+-5rKJrI|XVL-ʨI}iA7 ZKuퟯY3wtc +OLRuyg7 X p4oJwFWap4ĨpJHFWơz2y%]Cwh&j^Aھ'a'l!]_QNkjbbˆ `zh fcyerkJ0jPP·Jwa5Paw%mP;li~;Ayb%3hXrB̊Lťy8#p+4'I"N "s2>%,uq&$jhaHN ,3?qZ4R7K-,^F\}[X,zjڽ8.!ѯXDÐy ,)_?[^bI׶"D}y_ZK\ >$Bތgg8:!z6(9hUtPwQ*OuTjB.}q86'Fv905PjdaVvV0T|3o=dz? FE_Gkޕ*Tfex}ܗ`5<-?bQr򠔚3‘:? Πq e flJ52wc?,X'oj_bXliBpj~% bW [Dp4Gpk&bc!afRU'⅖=15^R2AfW t`PV`bZk<έ)s}p͖/ k_x5˲#*ۍ]%'S4&KP+6wz5lٯw8=+=Wwq{j,k5xKrY#Wt٪$V ,u;;IMz52[>u‘+$24JNe”b3=UI.?Eԃ*SF2_H~\{*Y,e)1uzw>`yW90#dE1zt`;2Zn%QB;Q_bR|ҥ ȱP23 +;b_)/w(gh:$WGDY芉xLp0Bޙ'*YR;bucX}|X$ʲ dۏfj8,5YüQ)ۂ&[qq6}*j-3ڑ"j,V^^Myl4z_.ǀPIO6ހ`X'?^i0U+cXlPPwл)7$ z^4">LkL4 ĢMtXчyR#flUN0XNY^"ȸ4yG#&Gɲ]iex/)/6O,gSBnpH;\ 2L\ll[ɱ@:Rɸ[DyUU])|S!w7T)`*=<&ւ,="9d}y+Ejzri8 ;h0f ^lWw*TH ٥^.7ߠ8ۣJȇ%b'n@4䙱4n r"OTt}1-64x:ohsGfr W^YP̙qDZbhq5Yɴ&#/*|h;PPT ĥm‹JԣjlSa] j]^AG}-RhYy0C2+9JSR˫]B9֭ f êd4#2 @ŋv*WD+?=$XbXL۰cmk}OE5j@p8B,EQ*=^`1Ek F5 sgC]]ٹ"KKD)ҩ曬`c1*O{廂W::ɦBd( pAȰZPvL&Pn0]H=ژ{v EiTʆ^J,cGu7Pga`:'ܳN)|pHB|Kr677JgM j}bTNh4HK~hR|7{Ws7W~x @{ap$R]vaP=e> N@`X'oMTOɮดDNG~*G>I Mr$VtcR_οIYj@_!`YUɞ(VQObFpU z%cU|JAXϴ""Hk$VqON Ģ/qn,WB?/Ԑ)ҋxT1=Xe 'g !m߼SSY>,6 xaSyf\~4d9l%+>T[U%{Xj 9Zy;Pĸ4sERGTsW#CᒼzyTUh3mCپ—ϿZ[=5Pfy$S$$eOPۇmnmX @+4hW a x67^Aa9 hm܅o 8!KN,kT a5_MMuh "$C_ޫ]P3Y(xV ՃK2`,EWHbj;WkH_Hʑ +q*_ʗ 0/$XS;Z%atZzю9؀Ժyu&R~6wr  ;/ !{_ )Ԫ/D' jBM0 7P4J4jQڴ@[8Пͮ Q(Z`=_q[_4I=Vy?fJ[/YȌ-϶T+66^cﶖ ʳ9fBI9I!h0{žUl hrGRUiTSvN_ɠ"Mh*emh4G$ڌJg mhE]6qq#L/q%l @gwιXaV̹l|+2T2PaZ)TWQ?bS<JA17se2 ]w<K . Q2&;$#\O+0tӢr°(>â)-]*8'2PyKhghnn/`bqdn%*pU*&_ WzP v2aDJЃ-yh 5PW QL&ֱ{n@$}8Dxhť7TTͷL_bmu޽bÔ`:ЦasZۅ>X]̈́3P瀪`ARlPFw1DHu/Pj"]/楞2$4dTL\ƪZD& ǃ@-@йwŠn-7 3Eq`mQ,J,.-aZ( cE qN44p0<эBKI5 UK=w0eSd@^r9]] VV<"dP7W^x3x7}'gf:z_bo(u>gzEgYƨ^bJ'M*bp]Vp+# hn h!3(zdYL5s~8@&[ Y*Eb̴<2êt~Ez?:VX UQQ]3BC(_#K+aj)sQL's F_-x̺dE7Taߺ(t! b:Bo @5GVfo4[YulP?ocX]Ը:CSXۨHX#[[;f[Ij½ٱ,bR`?JD˖gw ]&E83aK}FdAY嚱уM}w},/ӳCh)ЎUN-AQlsöUnhul7FjU.1Wkp=kU`=#ñd.L#/_4Z>]:6 é8$Bf,I%9/vVzyTF>`u7T ;& fS;x>"XC*Z=x]cg,גBY"{j%,ͱ+L>h:?Gݫ]sD,5F;α|r|0eD:UR>#i~% Kpi4´;VhbZqT𑛣jn be)Z- 5oh&[9$,T;~zx%X/|v%E+WʱV`*ץ7lj4p*-|ǯg] BspH+ǰH8,D.(F0Rβ&G6K ?eH?nuepW%<7ҍiR7~Ad D(Z#W)*" i}=;:<7B_'̰XxBVkh)t]r2@.Cbqat$oy͹ Z3)ج/h6,YǢӀq %ťaLƒj13e4,TJH$ޡc^KFx ?h*I̴-2 5nz"wڤ9q19YU}ОpKD:.5SXޞ"ܩZv7ZH uUJC{ϖ eBo.?%) gV$Y }]GIx GxI4C,@Xh9.//4riyfl&YLb`ԗo͋%^ܾN{ŝ֩AC9Ec|Yƥ /=/_~ʷHq77~4y$ H|FM,B XB, 4hp"$ nMf& mp:Hg MƢ$l:MrqXVmtxa5 u.Lk92lrk=X 7`*­+ו~^zPN'ipyTXnsBtĴlN5ks3˒~shw{B%0azaYd,|a2ԆQ/،+7`TY(ر{-S?hS@ZHM;0;5+KEFv2E"r7 ˴g_lŊt(nl^YT(`9L~R櫌@+KXW{U+bqBG` ,Ic E4 8LWENa"LC@l0թs'xGH9o$ͺ㋇Ἕu2v&cdH$ kWUWf+w:8jd\ :Qޖ0^*AKRw`O [8Ƣj]zC0F2*ll1)Ly܅X\aգos E"T^rXspymEaLYY1n!&1&1XEBR )B*/Fy(+2k}OU VPj7Q-D-HmcѦSh\ SZ*qkIIn@`2`UV 4Kƀ(C+Ѳ hƆc M.} ʪ$2d"7m+{:6 u*Q^R}4WbI2^L"޽GuX?)WVnҺ n%ltO;fQWuPsvX|vf&)*#@xgx 6[l : #I0NDilԢnz}e UK&|⻅.^RM'=37j^ +ʦG,#nlw⧒&_+zrR6lZ,ij*&Wc Jaje3qT XW~%r!2lIFN5ࣺ \E `}Jevc)$S7Z y}!8ŖvS} ߟwc oGe\rxT:ʴ{e$uj.$E˹ѣĮ.'x5Qxti:p) 0AнDU (Z MXt.=Mw U%"=ᗌu$DAs9<#< \YQzŚ. Q](Rshk>WHDrdVس18._1@[Þ9EB"h8I +2ha =8[HH<3ĥǢ{8fmhLW8G}ѱ~*./ [t@wovSrDJ˥ʂ:>HrcI*7Drbe!PP*>¦]?gzUnjO4~W@[M΁h>,'۩ͷw?6 >ܟ: vE`"P6qC]K&{4b=~>:KEu Y,Ф3"TTUkN+i> Xtv>4KXL"u#= 'Nݍria4JUD{V $|X!z#e[h!(5Ǩ~OZdj >8υSzgz5fXe Fc*;wO|rQKwOWwa!H/rAFP &c=n 5nv{&AcX|VfƲ=6$op3XfMbT/-{cٕHW#`lkkaFz"VP$|uX&ry\mQJly\_@.\ϪpȘ%SϞV Ú(+*̷ ۴V乂 ա(.>c*.Th&-2f$ѩϾH NK?4 {nQhh֩k2㲻ydayRr_D>&U85,Aިhu}||89Bp0E)\nND׭'+敭fuߺp-gR0YMUF,-iNL=Biҩh. 2R(XYxe*f°cMݢ86SaQXh+pNܽ3Q_z7ϞMX`9@#X_p *ь¥iNg;us/!M33eiIY[I -]iIZv,VTu i;H9Y@Cu],jUji!f,#|Blymp:M3/>_JGmKdS %E^2FvZ&,k ~ELY’vw'A2L^M,G+pGo,6qY ,jC[Hlh䕐QlVġEY.l6k[6Jus80CJn.\+RtF`^UbG6fЂ;*0!ɺ{LJe;v}dn9(&lf™)??87rFl&)!J2gјr  RRR{卋_l{c[PbۆF5j{:?0`ypo歓k=?[L {o~(<[ڷk>.o.Q(#I-?w&g*[:6Co, w=x' b\Z1ە>XbF`$J$*lv-"D#ҪsFFdVl{&tex4?5~E^6 ]M*\+ZF=hl_f:Z صVj3xr4'D(2SxRm`Ri%  =)%FE_isdhZ#=~:4i1s$<`Mհh##) kr(EK[i#ݾ-P w,t Ξ7)ޫC^1ȳѴhJjaN=q7Sfd3!v93 ѪUA,<9is%piـe \8ȧh3$͊\I9A9ME;;cёƎX>+t4|sr-(Ҵ;-cᅴie?LS3?2ֹtGڷE7q,JE4,Ff1=2̥4wູy~?srbe5A-O#Yt(F,[NWXIXYS)]~uf-y3HKT~2|T? v)(ZDIy_5',@1XT#.ca'uq5´ZMB] %x @yMt YzCRwꊻB TxeE eyixBuʆzL{ ǒq"6LAł)c*S)(z RivRiOuGr|߄T8 +띚<.?Ig^)p^>>=;OOPOtOOطx'(S끬(Ml''A{`D ,e;;ttF}*0|TSM.+˂U]dH{B @d UpYF/b %zDKW2WB| }&"KpF#{yB(;%=V2񆃏L6rV%& \M.Z>Y\X݌Q [QCyQQNpX0d/zͰ15UEgY [׆'SC6~Xq(?_ w,c^g'.OtBΖA?%\S&g&@mݹ"Β-Bt^$?aYd2}`eU> )kX:\I궙FDx5x}뚕lQiʟ.T^/nTijYG Zjw6Aǭk3 4uيDCg6<<>rݝ8q۳H^@X9šmֶ) k gpB᎐q8#ۂJBEB:=y>ïoNPr]ߤ݂랷ZeWȬ}'.jgyZ{wKT{L?=83?o7,u^&3}T@!Su `1$<[S&7XcDzKaELD3>A{9'prI0E_*U}S kUMb{ }‚ѵhRm\jgBLյ=CEW;#c+5/9. W>>eýΖ3Fe9-[lߥIf,E/QhUR7u}iZ`sͬ.߲8j%\!L|֙F .Oꦠư#Y6aֲDgsjT(Is"em[-VFdf̹2@DsLЈeЍ_.9@[Q:(y'Vu(tp94tJ},g1*mQ[7} KXl[:(COa_*}&ӂ/'=0 I#FG<]Ag>C `Y5eWlomn9x++CuygkV(E*jI83? Od+X]!8ka"89Up0*26iŤc&  89Aeg%l 0.+G>tIÊ F4( te9L1xtn>N71(r*= 䬧DBXG/wN 1ztGL-bqzvlwP^pr!.aհWVQ V*0,$h뢃c#<33!,`e5î̈ijzڞK+\*]jfDڤ ?/M5;vrS]Ԫr$ӱuv}72_wa3,B:խ0j7Ȓ%֍Idx2ղ°Ho)evykcXQ~xw.3Lfc0~av7ZR'X{xCa%]xJQpn0P"L*cO `}D ʯ0<!ܓam%"F#1-$/AZP +j0,g&`XS@PSR3**o( 0 aH D#ƺ Ê_xWEN9?>^^y0U.(X6ֱB6N}&;AżCT֍ QT r9Kk|%M$eaa`}kOaYJiqPu%taQ՜S@]ZYOf5O%Ļ >Su -1VmIfjAkK6u`DI%pLXR;!gƘږί4M{ίZ&՟L$ktTNޘJӰa KhU qf񣣂8 /,@*H܁°jyHf 1aArn<`}ͅ[$w$;xTJװsL)}g/!sɨ&כ5ڹz߿kbLNW=~MyZ0D.w8.1!F,E-#3dihb!GּQWPjPBB,F(%2O"W=o~|*fݑS[X 8ࣄ) ]tMI/qA8ֈ%Lq@P/oT{, Pf`JZ'x_<w +N6h *~ ]%& P>r$6ө^1TdUU$k0 #C$KL!eC8,ϣ 9V5,sդZK19$8ԓI=][xpAD35k{]@eBGY`la]qOjX$9(a8jC^J8P- Kÿ?0W:03~r[(?jy޼׊G䐺fƟ]'<4r}ufnѽELr%TCNZlBkdbrn|X}.77xe7 ,jLюjZ2Ǫ7`[i#RA[T(m)͋H+uDI?KI!E ce3D部Yҡ%"#+Y}9e{9 Q'9sydAaPк0v`:B>aTTpw֖gHYܸh!/^?{J-]FHZQa'ٍim @Z=Wk8=9㔋R)_])7e~wˢPU WhaAdZr/or8X =BH)MAzTX^&2ݱ/\%/rA0~ \LR b _=`AYɗV?;#l{>qk`闿8|H RmBA>-REL!vkp\q!esFZP8< 2? HsǒCkXRAd=x@ xŀrn28AnFYi"C6I4\Ufrxkytdz<L:BgU̞ŀVӃrރI%J0 XPLLT‰դPkŃKT.=P 06: * i`0`ZDDu󥝻CGd3x!ŒJhwz a-)Jsz @jEm2`Wߦ茛 ?{I+J$ (C͋D}z>׻ u饋ÿ0Z F^;XWB_~Wh7Uà%! C6ʴӈx %2y* G7s6tjj*{KE=?wQocco :gon<̳jVɳ=uQ /u~?ϿU{Rm-ZXS]%]E&*\U K<Ce/6!-c3ɥlb.G "( ?6eQ 4J|y2u4<=I,-ʲtK[KղТȴBiȘ֦M[[\XT.G|p,Zg7wNږ#ϩOnQ#~2 V|@Xw􃔹9`:g} Lͥhx} Z~NHcC|5Pjb&Z]0uzOH,jQnzy'E[̕-7z7L.P*%lޣ72$j~A[BYgϾt ⊪V% כ$:OuD~SV%d(otK[;׀eKyٹeiE/"#Z̢WqP1v \}q;~55 bWُTi`LO%Cz(ӧ0huf#O4S9ܒ hJl׿ _%"jq1HZ(Yw@*'X*Yσg}8'!]89@ tXzU+ a9,3=dy͚NV*شryUfO׽T)L%uSX4ul=,7Uj(#:9U!tȄz|19ݝΕ`_9e,Ka 0j W?vT%`ȵI}ppxs)pKV-c^2 Q&z1dW_Pz`*!*EI>-%>jI62E&*% hd=CH> H6Rh@MaٹQglr,_"0 tMxZ|Vrٲ18U2X@Fh6ӛGW#qc%"uW|>[hi- Ya9ՑѩOV( ;\++wu7n,sJu^E!Ugz7 ?hy' 딶凷l[p RU j } Ò=hr>.줹j(3Q:d=6//FLMsyD] . <摰*KZUG@k 6KTM2E`»eU.:N!FOR" E]Y6;fp b2Bd&>(_~Z;䘐,٥˲'F5'ʕUe`@F6Pj͌ǡ1ci3d ̎P髕Qm$Ks=@{ nsmКxD<41,DzbqZ~;(DZaecZ>a6b1Y _T6Gc܎QkOW]BiFfW_bYG''++^rt=%{ jVu )? 0,HaX.܅t3XaL KqD LhKSE1i,jp(DT?'h>=@Ko%fjJq°H';OT׿~;Y0bXQvZ:DZ/j)B71,/99/N>X*-xPȕE+[_PQ<&%LSX*hxq9j:1VLUxeReRaǖUMun$*4!J2`([r.OTH Y6'>~L66̥]ɱvlf j ]"kSB~[hP7ݞRBH*e qm6;6:{) +ӧvwn޽ӻ_J0֭[{F yfP: ՈT @{(H7͂O<+nSG3b@ k~J뛒1|z3l?/ZvjyrWrՃAu ,,)RB5GQ+:+J*#%9V= X# Ul!#R%DgAa֛ (32gJ= t`v"m= [@%,zA7OyK<6`\c3W&ƭ¡h{hbIɨWHE}\U(T؁mZiO T~VP~/0:[Q:3` 1jE[ `Q .$yh (Yly%Ga.@0kzex=qel\/mWwAuu}ql5z ZAA*q >^`k{=ɩ`eHZn uĭ҅aU:WW0"7t<-㔛xOUesmj C>a=IddUÉ^# h!Bw0kRgUSQ/kT--8!|+ XqP7äx&.Q2+RfW ~YPx =/XBj7''l=@[}9&FƮggXYźBHs+ieP摢9 Z珖`u^űNNJc#C=~xm,-"J&cBqgld.!;Wk#I2AU|"|C F jT} 8Cѻ:ھ3eK$~]=$K4EjP:,;rK4(ԼP.DR}l|uLC-W)φ(fQiMgۜ |z-7>FIU ֵB3 oz&fV F|W=O6vX Z5g)߉K(+ɩN Lv ("T 2BbʳpvV+jzbAJRl0٤b6/HRY3CdbچG&~%Pj&_m7%Jx= N%D*eX6VY{Sͥd&޻CR 0ԅB[/b5!4,Z!j8GuxII?-)fTbT Y#㏋_]6%D#>X]v f!N-}◥%;j3bV,a zѤvp At'GM]ȼNs#T5hM4k!+)4+^9ٿ Xn|g摒< )/#CwP,ꛈbV%V ɠ#UvN'_}EUufۤҳX5<˞faKbQWPB걝j+!OGE'dΌK3o#j_0Z=_QıTge٫?2W8:1&}͈4Y0bQDQqNe[r.W t+9dŗdʸL Zn,-P X }@V.Hʅ̸JTsZr)a~XTXn@+^\ޞĺ@vq1}h࿴ӛ+1`-wOtO{PAh s/_wQjk[R25Hv}X*>*ٛG-}NM!DKng<0m ӜcOX`T[!4=²Idī7bv5vۛwNqr/ Aw$Qm"/kI|A,W.:% 0/9_|5`;!s"2ȳ c%Cy<*@)(ùW8=]) 7UCC"_l?_ %a_^rfC24=zX7%k1=j1 ;"j37`TӌX=:''E$qHϛi+O0 ԣŨAZ:B$ u~k9!AJ$ ,Ki>aw7_L76^t\#&x8`\q`PPA|X3rIrJhaW58W as HK?<' cv\"`WN(f>wzUDPoӤB%ԺQQ8Slx^q0UG> Yu=q/U 9VW-V+ `w7_X^X^M^q?{vŅ܋N M2Zۨy%<&D*k(8( fͭiAG ,&[4Ű^QaِNrs}XIhR,922 Mx(I'Q?-[hJآ3M]wLxRȾDhA."7=sO#;U\ǏG Fx6Fe %3Jdm0SzRBMJ-3ww)Bҋhy&cH "9'=t<TD E=INMGr41r kJ;kpi [}}G Fa%dOQwVjs[$3f*MSS>*Y4褺9+ɣ~G(ƫX4*gYv>Yi*!bc\?^hƝɱ|ۻ9XU{sVQYDNqre"T+ ʅ| J'6ڮdMTIWKtZd3=8,c3PU(L3DR":NPSP?6c$@Wc =}:tW3d <.Cd]}^@R)-S=|ɫKa.+[8H IgVp4%W({*_%RzT0E)ʩKK.)fD` ^m0n*J3ojE'07xōO x ϲxop@cdZg!\25F]=I50"rb%2}~GUNfX֠*ϲwrsЈv[mM Z$ {6Yr5F0U]öaJq>S;d7gs3sdxs=aсTEO+(ĉk 8JCíyՀE!(Gk"ːj%;NȻN,k;7?@h}RK`~{6F dBA~WXbXͭMqȞ1s|Z6u|1}ߐiO֙q _m1l?Q5"n+ЧxbĈ7m JL x%II"18&ĪXIVeq`DaoO,D| m;&66v+r7KF<X6ks*݇'c5a EX.naG/r.2p 5Bs.ՠ";uOq&TjmH0ͱ$ YpqBXY.f)ٓX~=t%w3`9hN_ΡM/1_Q5IXG>0J_iEwܸ@ʞczYmG#:^/y΁K9w*F5 7:zL:] /r&GbW&8}ZYm:$\"֭/SD߸z,U ,gFې1{1E j(K1p2EbХh ĥSFȐFݥ'$R-o˛ } UIT- mH>M87y81IUz :57!}փL0ldOWgО''s)t!Z-W=7zrnzbC>(b̯fRAǂCJߗfbL$:y6ĴI2a`X7DUQMcMEQn/\1ahCa)ϻHb(IlXW{FԬr T5[Nu& VǾw71 z!Ն@րO6'R6vuܪ7z\4樲r/&V7E†lBylNT4vVr&Ng`8Qhn]zӳOC}O \a~*UtJ׋V7n<j{p,\QX`LIJF\!#; \R4FҊ8c\a6FSLÍt݅lzI U0m(#{n<59D!gIGd\zf6ɫ{լ$= }:\Wmv4bWt|SIg,6֧7;w}AMs+Tb& j솴 TT ,2_a{m:)z2fNW3aq> f2I8]yVVuDa4+vB-wp,Ob,cYkZՀGڢ ŵQX;1f58ZVؠ^M}Bz#+,p1}ɦ 4prS6\BXEP,oY$$4<)2%UlVeZ&xRј*v+0f\ \tp0#lt.:~؃xa į.$\zϞ_%zuI!O"d42LQ;Op?;{aA_*ҟ*{t21=)2eײY8>ZYe !ĝxKw% ABPSqYrnnyTzbfvdT_zba k,~YAe-tF[g?;29<4(|X_`%;OM'.<޸ XL DG2,5P~,/Qn,i$UB]Tu*.REhq^rQNp( ZRtGybT/L]ƐehJhX._@|kBw*=M41jq932՜+[RŮhO(D u$}yEwPuj - }aȈƨvgA cHͱrfbըo4tX{S+f(6Q?-(=/"(V?=}.ܡ互2Fb&XVzTH4kJ{ޡDv!  4pC 8R4/_TRs+a'`*V>1,Z(.5[DCH' a,CkNC,[v?RAWn^FrD7kx&w.1Y\BwywsNRT9TFw E/ա-J)g\[pwj+gά$LaI͏,CB_5"s]K/-/V&} ui3ѹ AS0â:ebXqfX@`k_N6>jNMCQJ8@,f8+".8%uTv*2;{8wB'tDi205]ʽ^Y)P֋ͯb}DI9|R̲XنIPi{PcF/ AnbO&UUCT)5_ı -K%`L%(;gȢxEuVGkG,Yh@=GU)}.jl[ʥiĄvBVn1A,úE68֊+Xw +Nρ>`mYhy`6yvp o j8,&;T($bo2nQo N L|=3cI(gxuIe3g&TI%HjEVaU1V &}Vوg20 a>z͏>ym L >,ă߆BkÇ$HNuwXɺYB/ /Yj3.2/XӒU*Be3G`aP .q VhD5E̴hDz+N'"e!BA w9B81 <?ċh b{L'3;{EכⰘʫ[t ՚jTJ2*=/yM4LO9p[^Hp j,]A 62,rOʍj+㰼9bX2_:p J/2d *Q0@m+ ҀWxU7/*)&XyrꁮDmlDSW$ dF ` ӡ-Ld͛tSk`}'[bRO & *|YL ]LeГ4DSs WYa à ׉l5 ) 3\ Sq 7:v>o?=ph@Z_ 1D"7 n Ӊs wmr͠Br9=[y9"Q Q"y}s50NMAR65.v-CX_ j_VT7Zu YFH%᪕ZZCtAuAX%+0+?v`_d [ЛSUx@P%`U(2kG$֒&ͣ)!Uye" XiU.] Ɠ!q0HDa1`~bv"!5Cw*J<*b8CM2 OUY Ryd7#V t.cx> B,.یP|$Q[3aӵeDs##y?@40d>5{{"3Z?nخVܯhgA֎~9v/7MBi.'}|EODrU ׫ӟuw6nxϗwtӷuPĂADMco Q` x:-cPl+gQ{qD#Y\Ԛ>v3`)gFsrXYjTJ@Ϯ_J(ѹ:RxY Q_Ӕ%ji-u$  }8 RGIzʎR%Sedic FM[- e w ԅA@**$PͪEQgE`qS4ZcEsf$Hf޻3=Z+sΝ7-> &D<&}9#@pv$X%KB,@耜+Y"WX.. wkARHvƴ?)úF, YW|4  >P7E~Vl gq=aFPcYBż#2 y] p2Vl$Aef* @{Ip>Ϥڠ^,>Oml効2rogYo^uP.٭ݍ,ݭK\$wX(.}ˉ 3LP7"8ZsT"),԰(ZFqy/8;}=4tSCmH<582sC. cL(b8D{p R3=CӰet,phSޏ>b~lnUyjI5dJobWn é(..Q}&(V7?>U~L6Z '4 gYUFߡHZkkKP =<d2ya-05ň;R~ѲXÍ5dc_7@JB͸ 5`5a %q?T+`|p W,^$w[w3|%-\+-DͺIr ݓkpVo{6P\a p՞YA8ovg拻,g]J_fOU;(~x_D:tomA,DO‚,:YLʟ.4\RQ+ T/) B wó E!]h 4Pa'!9|"3*/oXpȀ*Jkn,f9wm0Vo>/cSM0Ğ(!;]Y9JOOxa`(Ϥ0,Ҫ.1,*ťBZh+ {(МP*VC! gW YhSNmJ GL0nN@)X^Jwŵy*fLWMI_&$jdЧhm7/1Ӳ Yd䣕=p$J urZT~ۨ]%cW+7k81g󂙙Z[:r1H'&xh\X ami՘Z*3!r9ݔ(A/ aA4TQ tX|AN =a46|_GWPr*ڀ1rc\Npp+*ǂ uhU!q* WQA7*q D60&j $fXDV7yP] 0,PBYL5"4-c<99\*bXWR38 ,Yo(JsVsty2O&XA"2urCف5ũǟx~ KZ[H@W$ZA S-%.$8#_g ;t,-յ.I呹G(Hw u7L~9_`-r]]ayBJxʹ|~h̰c/?@ZreDc K(K_űv\*رy~^QQgN-D+ɕ*߹C\ Hz&na3;[/&+6)i Q͉rx^7@v Q>DeŻzXUlR%Kn^UectB=m\U J_H)fϿ@؜(L mN,*oSZQ`]ĀHDzT~PBG{cLݹ1*:j /wuF>!F *1ȗϋJ#>2:+FN^Ay)jseI5ߙYxD+Ja᳅y"%`Inn9f:f,+(]GCGtaƵ\bGA) ɉp 0a^JJ3p.L=23C1OmYn:#W"(jP ^Nk+=15CpzE@.Dّ޺_9uUVVP4qdqTlisstrQNh$bAeXq2,a]C:F{P2,>=XD2εQ.1K#iA/X;Dz0Re #ʰJysǨh;+?kJJ&C߯`.Y$6a5E])\qs97@-KY[X[f`,sOW@v: Dmi k΍qQ[sU㊣qF{\/lM C,?$uU\+^òJ p1R(9U\0jBȌY9A`ٙiاl,9Q+lM CRt<a $٠ws}^sI{=qgS)PeT 4apP31S)5)p*:bRX)V6Tz q L+C`Q.dtЂYJZi$E AFZڙA>+Ccm xْP"X ˤy|?8Wb@t70`PHWXWZ`1 8ge0csbQD!dQ\ 5 <.rDU[s({ua7n|Cp=Dda , Dc2'GjLa5ݨ2dW+j}/ >K~E`-- vAg Hj>>FH:oSݾ!Rq{wff1/g hy,WQ|VEyGjFWĥ*x‡&quf1 ʳj%` X t s*;ˮS$Pvݤ)g,okHcg`Z84^2uzVv=]_=ޥ= D2;+\w=9TLژ.j*[YkJX :qYoh90K92K@SjF * @ sB,p,ѱ9Q )7{V:S55 ~v W+5_BՐCpR6 &l)KK֩%!(X+N57aF*G/38DϩQץ'AωS}![CVd1h`W$Tg @av۳s5 _a_V~j  b<ǒؓ{7\3Ap{qL7@# ܶ+SsaISʈsy6 7QhfBj4M$WjdX _=ƐQU?JB&^=0&N%ɯ(* _ݻ?[L q&=^xC\EZV-]e0 _kZm䰋B[-|Ve_= T|8*ʔɘMt_l\,PX.^|pMja??uUĿFVyc ĨHJuE)d9LO%DlZjXۯ\XDɄ sgTN naAC"++897K=3D+D>k 85; 7Ўy֒?;1ڌF߭.6$+ 67k>K$N1CHT703a #5TsFӣxj.@L^\65pn5zK##[` ky|qܙnY}ٴ2eK٫:M\aB&_hQf,~3PZͦm4 3D՘aA\.{Y1 }ız,C|İȝAc\h>ӯ$ vGmL*Ppxn}|?ymёgjz1AduqG:jPH&~9`(EKR/c4aEe(6l˧O2r9[ cԈ>FcV !XG(~``@S_uQԩgZ9:Q&#wd<%uYgd0 蝑},/Cc#g> !s#*mQj\ nGx[r= >1 XѝGVM?#q'N0,Yr"E(9e|I),!/G9q"8xY U'iÄ:'U $V +awG/8:f*`BgX5.e?c*eX<2s +ܙckB$xzUyU2,.O<13;9٭nmBx:VjX2C dX¨&a!fJrkGu$ye)yNǘ/=LFg%Ko^y7~K'`Q4:Jicdc'>wQu T!Q߮a뾈My\3~< jOTщ22uX|yvƄc%u~5WwwXtߺ/$q"U`aRC/=CF?=tJ+F0L,1Ł qG\T8^|XeVLWU22BG:㢒˩W,ְ*y lѱ4d~{Ѥ~:=2:lmw=O/9RzQ,楐,dqw `!%)5=锢eXgkı ?qX@&hqq0cZc]hɄ}r8,/PcotF% ^+^^mB)jlPdB6Te7Bw4Q^k6ggT蜨FV/Ⅸt!.M^"T?qEa0Uz3uVcI7VDʴ>YsgugtR]Vu0%_M?+MO0W̵wHuM)qΫ;`\t@4՜Fa*\1Wh4^4{qh09A:SYO #@ޯS6R.+4fHa%Ɨ zfLs`C,YPrXī"X2Oda璐*p.Ы9a*6VtT0 3>[ qߚq:a|2DE*JU$0@ )6zp$uV/?_mtq)t6]bKY=&h:bU[wzc9&lMQSW: ffUɘt+>+s9lFiTzrT/x?jwvW#Hz"Nz< WbD`s"RgĉT&NB2u&C9 >a{ bO/,t1MxE8G+T!@fAm˕xeo%6k  gQ/G:ISa~A_᷈'JtXp9L+"Zpv?jGU~(*Ц5VM'ĨϐzN$ܟ8fؔhhrtcJO:;j9b2h-fx/%V2;x#˿RݐƊ& "JN|iVJsɴϷXP9bx+eWdg gQ(ѡ?a쌊ɉTt<'${5!R N"0,:|9S.3'FqʝJ@`X4./?{ʼ_j00 #aPκP!+JEhJ/R s+A{"{MX4EքHOP$\сAi#Y靯*k7IͮW*OqdX'9+ʰɨQEDa)9 ip/~28fXRVʕm%4p+Qjjuֵ^\EVY;\f/@,4 (DɰL(4 Ga5JA#|g@$%=qeO5E񝳻 OU3NJϡsw.)})%Yiv:fco˜O 'a&љ?3縩]pjN5(#p * *ư`a@VL2 2A7}3<+1.>Lea5m(|g!R-3ε>甗hH| 蛇H$" -޺tl,5aC%5':8I  U:af`*)3[c-eX0&bX4a4j%U="8(p[!VxƍBx. Ϝ)s26w^nwD+]@v2\P$wJD.*|N ȹ`D@Xb8Xp S)GM@]A1n)WsBP5Џnxݷ;C es!C3n.v'yUjʯ!ڷ̹_u :OPcm34>!JWZz jePcPRNv䛀7R# p\dG#fҍL}1C{bZAf2\-T(Y_:$\JJa}uGya1ȐiX6 WXWe! J 8as5 "Woĕ/yxԋ4Ds'Y[h7M$rTy)Nz`,wևmKe|$5D;PClX7uЫ[_ap\@g_A@c)'e1qt栣Pc*)T5q`$Fp4)y1 zV='@U W,R^$ڑ^<;;"d XOƚuaY'X]oK)V7gp!;[,zP2XX.awz>) S8X9"ղ*SCLbBT'rNF]i؉<~"|ד#3HE>K8pYXOI*+_ "wpg/[U:@ ,U+ u̝œoوGu\ukԓTVɰ* ,Ū2/kA.D,24 (b9ǀ1M:c0LׄQA^SVwoZ/wӟAmoc!Ǥ T"KAםAND:.ЉkqFq&=L4ʌG#K>`eeɄJa E!Jan `!˾Gw1 ꆶb_2ԏ^WV^~{EtM(facI%!erA 5l5.D.K¿WiT(l'ҕ{BSV Zʀlc_]kI2K˦XC{O3gދ-Ԩm/N#XTSeAeZ R ҫbYy2|DT{/"-{/xg=S$ OؠLp0yZ`lzÝ=Xa0Dt[/V]1a"eY.1=pM ?{HQ&22-fr!)iH8} q 5W-k~*Hfolƒ D}X8PIJk@y1 *dwT.j"xg^Aq-A!m7z !$b^aLGq:'Sƺ9N8)ɂMi^@mϥMN_N@1[]N@k4OYvvj9;Aכ-6f+ l!mM֭T{szd¬)aֈ Rృ.Aܧ'ߡ/ dn 6zWIZ$3¢sJ_ݢ"z{ $-)I[3GuDQ.BiR~^w^O(i]Ź#NxWLLhAztPD,ӧ;x\= K뎮aAsoøj!U] ǛzWXdF‡|_Uh JkBDi @XEٺznFwۣжlQOCGK&mB?n"f4Jb>>=jn;%>v+-t1BuzFyPBUCHHAۍM*lnpiAԡ^DfÅuNAqQ~oE8OTU9'( =3 )(( #KlCY] MpQdb ) ^ Re8ai'=zu- *h03PI9x0fB~Pv͠ '"eru%Jfcci࣏\AІ`guO6v Q+BCQ}5mx[+pWqL  swq &ච3=/!&T%EyK b ay&oA0+9;rMcȁe 6{ \ǭP qS+fuQ,j8ʃ@Y6Bٚ띟1 e!NAp|sZ 6y{:Pu#Âhwt“]MyEXwЈ2ՙ[PLVVɍK# )0rXDXA:bNOѓ}y;TBBNG}&QԅP>+ %]u N *EXR}5 ,%^>",sփ7YYM/a2%Cb ;du ( hQ  br>"Ø Mz"h9{Hݫ۷q_vjă6.TUuoa1gĥcY׼KJ]9do9*䬌8k oyYntѐ)Q Y,ҏuXq#MZVȉ ꊴ_Jx.>FP%yvG`׮r}Jsi-𰘁ҭ:+'LN9,G\\1A1h*JRb"MWFABT#2Q\'"S"(:x2a E@$e  'Ț3ŐOٞ9--.1BeJi!>VBWk)?JU;C[rG+ bQ#~W p7Zz}lBcN:1 ]_\3r4GB6$Ճߠ;ޤ !;O@[et,sWRz-B _@@HZ "2 wdox HxĈS JrUoHOdC,]b8IZDR4 {r"#+յE-I7}Jy ץLֈt3밦j5nuD+n]ɼNt8 \(|T)taEEmN|6 Z)([6&>4^m]آ'ma! DWu}Sa K$;VNM9mM v0ՕdJE~IMtըT3$}Ro-O^еᰬFt]MC-|Upzv~f"P8 L&ھSaD[H~% Bڴhs^ȣF8R8R_Ao솩ɢǼ߳\I j [$E=:SwXWd40g=ЯnE2vmSj^jÚf :ѪWR~_4(5$g)YGW"Ivv}D1uqlM8'WD-]qkP@kp @hUʻuHY]uePs6E)ߡ(A5SpXVškG^(R@i;.chzUi)]TWe]}bjvB|GAml!x%(&z Rq;JG1N ѥ %k,̦72(yT=Kش;I*Hm EuJw?z#67fϔz*"z_ ':L߲o_jvvb (x-! "A80+{e\ [OHy6kQZH>z:a}paN/ˇQ˧f^.wZXx.1׎vW](wA0*:p)::,7&ٕ)V$dipZLp\G3"WoL3C\C4h|Hgw;O-FܰY,mXn*lCRF #9F!}&z#>ܻwa%?7K it$-?Ut^$4S$ t)NCƋ2QD+U cҽb=dt"( {anC@M".DVF%kWc !j!?e4KLB{JRF&zK:'/$D;5/](;-ޏ*4k,=*#i'yvpvYA+"*tK BO*]&(RgO6i> 9y(bqyVwk Fǵx&KyjW^PJ"8']7;sY]8|WXL('i2+3&͇5軃_fn3$wcAk,zpjYzA|Dl\Q4O6:K78'Gk UlOmjp CA7 DžU7 (Eo`cNR( (mAv JN[GVlv4ڮ8AZ݂8WH>z*!\yP@oe}v QŖ LcC _"B]=U5DQƐ^aDQuolmK>W)ؼ$d`֡=V [vaB;qP: !wZ:lEu] . nh5u0*0u@S xTgO~ |V̀j6x:bbX[u3B3YVUfu];?\Y g;%:J,&mb@?ԖlFn-j=mגk{۔;TKT扢zeBaz; O#L>+Sv!`J NL C|/| "!7<+gGXEI2nҬ@,0pNWc)+l4a`A,90k0N:[lWo=)ȷUhQ-@ɚ⁠?a1y0=a#&3Ixa8A91E݆6:'2dT}XwB_/.ݜm">¼EJBDvn K-t$gPHټxsY#18ctf1֙@ˑy( i繇vT5 lNzH[U9+Q ..>ӋMD maY!,[Vjъ%1o<͘AOV:}9z=&|H@+QQUsW0z+/լVỀa-6to-LeO`zqŮ B [<,ૺ(M v 7y! E E(@i^eu, caJ 19VJS9֠5sX XFIgq'G [q V|< 4P[| JSZ(zph?߽ z,?H 9m2j8ã2clP}ͯb9," eJ8ޱc,Ke%% #ffr YVC8! WIhzx4'xGFCK}a1C='>2.UzGĕN\am<]]}тMj5R^ Kx.b^^A:YS~yHvmshB넝Ŷyt 3YH4f;iݥwuME=돢 ]ZeK@ hrZY`'ҮSf!S&]أ깯z%Wm^JpVWX*^7 ]W^ ^. pV%m ҕ0 qWu!IrrXfla!#UYJiuPLo( `YYZͺB#Tgs.ό*msɹΝ!%'3=痥=7 P!*|_Z tν]8(2AWpU">ˤlҘOh" ;h&B ׅhA䀧L%maU TF= qʀ+Yfe# Sw21e#Y\%a|?`ν7-Jvb@J ow8 y}eY!׀6X_{zӝ\PK\b1(F:xt I<܈ 0_$N+#^ bc8!*5` ;f,,>4B,lo}mn-)rg2ѤUip1uV ^[A/ aRn%fBMtP.s,JA;!*؛28BSxl*XC6c,=k~@aoxe§ǻL$b(fg(']l[ ǛyZ|,R-9ySAWqP3t}CvWiUL2ΟKB%us ə$([e]Nwke)6vED$9#AʕN4A a)¼!T+Y7F[qJ]EE(EY5wQč5>O~3'H-XYT,ҫ'םZw(ES볱!V-[uV6vQNa,2j[)rOqN9J{nN'SsUgpqaV4ە⪬TDK/WWbP=, ja X7ʸԙN? lDVHGrȓL=oseX Bƅ:/7}CCN!⴬!tr(dv} ɰtԁ0+8I l (%{"9bgJ:x f2d.Z`T W'*/R~Wit͈PrymBPњtJkT"t4v/4Gu(2E<pΓ(,14YCHzai,=gqHz_}l3eâp5p'lj,\քe*ѬŴ AQU׀Gol ~e%S)2i+W3 ~Źٖ2TVʯhiSZ'C*Q{ 1Ѩ;?C %wM$}~Ƥ c1U B KDKA)i}THLIPPmgXbSʆnf4 B ]#At7&f1egF 0_$v:S5q i$yw\[ԣcZXq4Hg#]1ѼRyϽ4I^N9\Ae 31W/eܚΉS " 9~'esY ȨjgX°A2,I2D`Zb&C46P- K"hiM%VBqP4kcl \=$zn}D!E u/UDAs#xwG 6ưg0CZR%ؑ-0"QZ`(8ADg6' Q*(F4i0w{Hx3{ R;J3,aaŅ$*b/ 'i؜Y:r/29yMHcإNT,mO+?` 3WVڭjxuԩSS*!R tyv :Uk2%J;4 /<- ըW> g)9^)b`2Ke[PcDˋ:4V֖bwAM<3)p8<-5UD!rlBT-S#]dr`$ )$~zNȪm?YDWϭjgDψe/9Ҵqnw7ۢzwgRI(q8AX"k;/Y[Yi7+++Vfx){r2Pz{ ΅fCJ)GưQ8JAP.hW0a}b-dSF87FP=(;^O -ߕ=%L ҄6Pel.z_R SJLjR:af_q"CVvM'z ^Q-b_=%9e`! G4U6:LFn[]zsWŠE gvPobXO+0|.ݘytsq@-{!ΟU^qx?zݪV`㝁*az Wh(b!^VE" G==%]׈2o7ebי P¹wkoxg`vS&Dԣ3.u`J»o^5:vB12uKYy=t'`SAg p!,+a mXh|r,#Qb 0'0T|H]MHFgKv`X/ɰU *OrfHgcf`0!Πu,ʹ0.2,&MbRk-BXkRovfǀMd8gw;erw?J~uX zYne ,k0;cٯ%zʕv'U bZl<`16{ȺZ,G0,wmMዝ7<*RSE-sB:C-W6v{h6P{ yB{Y!~GK?؟GEIw p:-k( r{:U87E2R߀\ġmT8:T/D^H5.kd_6'F1f) k+Ӈ 8BNo:TZ c?zp )_oScFPԈ%E] M1 XzVFռe]kkT ·.h\ʼnx٪*oa.aoS,vAܣP 6b{B(_bƻ{PQ_Q&ŪUf}j~\ZdY f5ZW A a"͇eP8 )j(רW A{%i yfQʹE, 'j7Zſ r 6$PqL<,O~xŵJd jaX30Ha::Iz)f#CюʑW2ε,P+c;aQR$ 8H+ kk ȐԌVɜ#. diz'Z|ю9zư%2r*۫#BBaTgXl\/ ++JXzLձE6y25 ɼXyִ8*WRXb<.¯(:gcqpMԢWPƋ/XĨjZZeB>a Nߐ֝_]$~2"&5d 2!˅Vnv ycZ+|3Ŭ,ؕqqy$4e1+4w !" J-˳dXo-|hK}4\:*D [Z\Dt)E3'S` Ԋ?Y]EviTUF5(|?FPF(I}< zɆmQ`HSnyTԞt Xo}q{ӏkI'K0?C{]:][ =s9t3Xj{/:ݝ_`gcw8#hVdcnO+56,&/_stjN=e {FWju"JW,hl k~*aAY՟{!,(}9Xȣ>'XSJrYr ܐ`ah*?9_"(S'} ޟN``0i/=Q&9~%:,p45mқaْPYbQvk`sR/#O:\ߘo᫵#BN}Y0 r忲<4YM@]aI?LP&eaMmZp-A+φ(50,MN#WZjw> - b8B`,T;,* Jh_wJdž!pP[yb@CuX/Jn\ztIIo}J3utQKIJK3ưXrԞ+!APׅj~w7AMbVgdX ['2Ȃk8[ Zm@+|TX!R ?# _d KB{UeIH ꄑtQrzvo`εP<9*9'!y 0) jYI )h0c]!2fd+g1rtYTRYDyU`'DZtWݐJA ss]WpB \3l` _E)Q/+JȔrU(ZL\qZ1%=I6BsE2 hs 'h^?5T'tɱv ^!+>g}D.M(D% ÛaasMG~f X+aXAFApC J1ˌҎ X%V{PJ3'Ld(>|닯l->*]*}HB"'" :`IFN6mY|. w37gdXa/v{x5jt\c,cTV"d(W+e,51hA8pIl0@@`o|R XӬ30bYSj۵֠@Njt.k0b5.`gta/!*}6a0* ݹ:] q*Ļ]z0A|`5YMTE&I'@@Ѧ/0_X.<<9]9&MK.htAp T#LD,gZxIE)ō .$Ϣ:aaٌs~.JSv9dy'~!Zkl0ŖE@j^K[ūmc ;ȶ|cC%/hBJU/CT"EcX~KaO?.M8YsJַ1DRnOo@ 8|ҡc Wlxݨ7*WWV0{s2^o@p1,X5%,$!Ao'hUA&pY! jkGsVc3tY,ut  \ݮgfen XF;0EJWCϰ}:1b?p,3 `d(uW{Q2QIĊzXd ""5ֽp ?;2RO ]. s7 yyviA&De/sJGcBFwZ" fo bܿW5TXbxK2eSe3Ņ`"* @)B'Ԙ`t7 Y 8cXr1/lt`U5J:{e)dxSr:@5hˌ#> S|jWJl*t³*"' AjwF@kc,@R4K-Dȓ-5R*Ts|e@J:;PNHЎX99Gswa"vsB?+#` [=3LHX .y(ǰTK@>"|H9V:; yeQ|k?CO{k5 fU.D2pf]H{ ]>/>NĀ+ $gg5%|H K!E=t{ G,65• vƃGsO-}R_؆ TuvF'TÙ7_^y% B2 7jcX <%*ԭ/_T"xxA8E%\gNXrjs aA kyE  Vk#iLcU-BVTHz6j`Fex2a?!]TEk7pg̘:a<^d>ΰDݠ5]q0FYTCrg&,Oŗ0:aq\YZ R۠׃8;g˰S08J)\aAxLn}fUsl*ջoBklCʇF).b8ʠdŬrq ** ż-\術`W |XD- G%4Kʀ ]yh+s@YTeK֑#G^):œ% MsRE2,"39zv dsss-2lb/"1cX;cVzԟF!zkY9!֡1ߔH'OB43g9=!K֡a v RN|tO?⮞㊂%J|X & 3 `vl!@dnDE@ʖCY9;s=&{qf#Yh{̹[cX]{rV >~:hήϛf0 ="!nM0퐃9!kĨ>`cR0kaRu 1G,YX0.!d!]YMw/\.,,'*r(&uViUWC Km%$rCdnЦ BhBtY9 !f_ArkA)r{daY?KRjԧpW$ӳNc;X힓`MX2x֩q/m'QqOBZpM^F15+"hdb(qZ7U0mJt1EܩHO(1"]>T Ptec]!nѝ҆!8beIO8,0.h^^}$Ã88s` !wGKHJ'q* zfyfȮHϛzå(y%nqvoœ=i C O:SljW* JЅH sPa3537YFX(B-, Zs@_zwt$E$V$.G}"Q|%GqO8qշyU5@:{X7:o`aYʉ (+^&1iJ]'D)I` JAXt dV⃃'7˸@-c3Ų J9q9NԘU,թ2cE֕:s,(&xBAζ `処blQ#eVkt)R3O5T~ XVY& 1,ِ X_PS)#`3tL ړzGU9^B6oHM]Ll&Rm®/ {اrн{Ro`j$~1_v^d؝85{K+X#Vѵ{*^q+ŰB/WD5{$`ovb/{{Up<+X%) ʌh;;ņ/`ͬ,lI/|=t ՋS@I3mu^PWpÀ ( 5ŲmVޝ6/+bw'Q%yPnHҧTL‚ W- 2vP`ns}~V3%d,UR52wT1WX`)`,vXyJ2X74t5fյWsb=i<Һ)#hcqF(_4e-xyzuػJv |ӥx± c/;=#x~a¶+7"BêYY rB(\h`&T WaJVώ:Ť)G/·{XfBY[_Ϧߠe/R*VNa'>qW>|C1UA'v,;hbHpŢ=Z-53-) fYWPz8L MYofW _p_ƈS̏B 3WG:ǫdoZgm,.;zxOO]7kA3^Y1R1'%Q"=E0;9(9G vքL-B=o5i`oq Wxz|ѧ ;٣0>wsV8y<O!1gu%xTX9(HPm|QBl\BGvQ ew5J^%QIQL6 VBJOkiK-{}r3=0zbJ,U옼 N(FbU}[*b eǰPQ"F(53)ie)EK#8It J آ0>Oz sJ=EQ`ȯA犚JUcQb%yhfHrmq4Б;&v Ce1_0ܧxPыӧ£8a`L,=ȤAZzYp8l-`r Ti@n5BkpZxB``ۅ_Ǟ*IX`%M3R#*6)װ%X2;k(_F+&4eU7Deø =Z-RzWgw=3/VvٕZlپJpfj`jD'(=SH ^(ge%,Vrrrl_:-vdhiAB=(ZCU!ZHzX^dh+v. +NIF [c@ Rm F(7ߑ؁EB>z{W41!g70P;yc#!05r1侦.M4pٽ$pI+PrV2PC>MqQt yݠ^NOdCjXz*JŢZ+Ap:c- (3>Y16^,yP.粰Fl>Z*`Ao@']{p*<M"yyU6T&M%|1w"Lő@/b/&K@r! l nng3h$/L,7\|Ѥ-rkćh|N9;㥓 6YPX0V\/ܶJVă^}f8CVQ5+.UYyȹBaX;,,`l,ezj+>%iIVR[`Κ IsDž5GG<;#XL8Mé-D#GO%iR ${=4^Xg}D oa K1&"F&-&f2g}U-%>unB\|U*WA1=)@l LdQ􈪃CD_/UqF!/ !H9h d4Z\SHy e_~B{'PpLh ʦ?XyCmMM-: -w_$g4Kj@/8wIRfs|VA<}J ji>$Jf+\RD40Rg:E?8BX4k<_j>$f/*;GL[ُXS"IgL~,VMaDR[f{" &Z⯖7 L!o c;6{ZSHb,~^BX,Ȍs(J%"bh Z!l~P=X-1X }fӉAsMfh ۽)KԠ@2ܷ = aMFg#kAj Fh8;Y'RCȖLa_/][jtk1+d5za ֳyۏZ{MإX$2DZ%UcU&w) (TTTQK̀u("W0de_ؒCy^FO}Jxd M1-4{>Tve*sQuwYHnF[î(F@)Ћ2`_oMAct\`4nDʗ0Pˤaj R)5l@&LsQ!s XC;M W@(*hZ]{2PK>~BF{dn;l5)l/AWu's]T!F=(vxj}^w%v->f|jǽ; h bsg]._ϬȄ}I5Bхq0h y=xί;'q?ax75%Bh: pM?-`ZEjji -vP&߂rS>+CIA-n>UK/N$s, C#٨9 1ţ=CbF1 sҠj@aJ3~CIQe}ѫ c"6Caʾ TN~6 V,]4kZTX-*@B*EA28d e !a֡v+D!, c aa{4W,%ƃ)Y-A+M z/% +_'NPbj)XTgaqxw55www1ܻAob^p )bE!D4Fb1 h6RVZ)AއW ;_k %v Fށork38&[y)]J`fFgkTUw٣ =8 gw<ù9?  Ydq? D!zc%ԉ D5Dҳ8c"zAiG}T x+0jq3]KM.|w0AkFZe G 2XBY\[ˡdYJ `Fx e^ŚhTYd82XOj =yn-̶צ;ޯ;qDב˒|њpҭGޠ] cE(d0^tfFbv;E}=//%5K;ON| #$4BC/]~e' ҥCfzDCerl,[A8b%9`a!V6kkL'rk5RЀ39gc~dvPHJhT4ڨHػV+_HG/-,Y% n}@'#~7Uo.&L`3[qvFJ ! Spyi;_ۥl43tMyY;;'] 7Iu}Ƶ8 6]^O/hRdO#rOkj#mP&Q]+&bP(ƺH YKk|r:%rrzAG)YD4JsK S:v#-NNS/Kw@[q2=o" g4FM~C.8d*!BtZⱒW3VKPcdž~L|X5֠7úHK E&fh EN>v$;Bn-2;!cu2[U=1ƁeF(!C$k%gW +ֽ"$@璑lSx>ޟ Hoʺ{WQG4s 1=AݮC^<e-ޛ^`!l =+0$e=?IjxxbLIiihtTQFXa cdPvg{Qqy{4H p/p!qUġݗS+h%ȁLdkG+`Dεb|Ҡk 5 x*jī {BstH7,T4N LLZ0L"->!MdO$]_@b(ͪ!)hJ0SrXI6qt{bRt؞6YF"@<ģWܩH=#>($8j! !w2+-ʤt%!W4#,buJ Cu<D'$< 9^X,vd֊7y_~|M/uz뱯5=` ʟ' VX'uF, 5SC&ٔsA,qbRù~/a68%*|5x*D免T_8~G1'67*55~E`+PiGIbi}"X aWdINά}HG ay_TS3y.ş:9sF+Zj_OǪb:2ҭR0Հ?ֺ3Fr 7EJ˂ A?b|F Q;jxS4_XbYK:1[t;Ԁ2+pGR}5#+K J :!(Z~<8ibpA萜ŵrCt: apl39`Vh{{SБr˕Tl;,xZ|b kW(\Wјc䵢! 3v.ֈMjİ2TSeA*(h G ]+49zʜXkD_fhj且OjI)Rny c3݌2(_hy\n KC3b0uq&Phɶ0VR_*ͳ.bA*_LGp\3Bub=x<MtJ8Rw5=ߣl5P|B,r\ks)>#xe^R /%"FPxWZ?$h%D" S: W0S]+aFUeНkؔW%ӽ[نHg&KBؤbz8޶dZ6s$Y8I= 6Ev莥Ti/(joo KsT(5boF쫼HܑJoB}qPYna)Q٧:R|W 1m8r NΈPi#T(ۢ/e\w|cp6 B"'+Z @ȽQ0aG?v1Πv/јOʖ5ePEBC+rsaM~9nW,4|"JB?9Q}QS¸tǢE%yX⏊> 3/ VЫ 62XLx~U!l5E{F]O>tIyѲTK`2)Z 7h3_&&eXk50tՉO;F^qt[qjy ґ5=|4XH)&eG0l`MB&_4_;ZY.KE)/2> ;(JH[0^d w{4ZbئC"ʀ[UaI 2Xp}C6=@T!I}4^P!рԤp(W> sի6Oqu8^dq1YP}7^ r\Jy? rKrh aiJ·| S&aYb-#) ONeq/J(3 $+q-ULs%z3D9~BJ3.D6d+r)΄ǴKq2#WwlD̴V{F۳kxU4YOPHI02lD^,bHDz*{%{FTqw^BNf}_0Yt D'22b&elu?o"B#~O-hIg9FNo + tdp*=C*:͠9"7w뉨T3_)n.jf0774X4X UJx\{8;cK֏aGޔ|Oxs;E,w,ݠG&^P+ 6a,3x(g V:|D2RCVgRS_q|Lz=@JZ m3ZT\D4Y%-N8{AqL`HozVl`2X۹<xS. tn|tDZۅSqkd BNЍr-bu>h;ʳk77#U_iBX|x} Vբ_2r-E鵡A&Au3­G7uH7me4csR\>c<)羚JXrB,&J.mO9;ۍ50Y;&\d/`Z0X׹ 0%!e#ՌtRO {>b+ӏDh&(VJjP?rLt.]Û'MI"h=gV@G/jѝB hE8ZO?&!! j*세x>,HBG=?ַ/Ln/_~y?]B@Yn(; :;l(!V0.%t/ [RVTzF N!X 3zW{ER7~LRdV.4$!p"rY8L[{AoZ͍ƀEz>8Stw7`X/|>3<(INBXnXZ5Nʏ*t a]H:`hRFp}w!~/.|7ĔVbbhWΠr]?J ibx(bVe8*P!W}p4ɈHkM8j\(YA¦DX(t&SKz}TklAϘTEmlJojQ(~zM-)`u d -@a.Ltl# ¿Y@,F1?풖p/Kc_G,L4qQSm` >Nt(PS_2[ !ۉm.XE~'vZG uAJH ]>j(suA<3ŠY?cI$ח V5|$;C?;CH#p D\*ucV0|} -X,Q7yr8l< U[Agyaɦʮ:떔|A_v|k؄R-~o bl6'֪@ذC`d`͈^o xE=Mݱ.ki)8$H,#|ӾXT+_i]894\CsMg8_lNU( uÆ3#B%8ŎСЍV#{:P\3CHʜWZ2lB!XEWYTMӕA`$en7hC: X}*XtC>z vԐJSDVKc $C ud]}Jd^^D,OQJ%ۯ[/~?3ƹq8OIʝe*ZKQ38qi<ز+lx8댽xiM_dXŖf}? V%9E1'x/9N)WEO.8p1hVUզaao$4.tvgt_%OO+Py2 ˯\{! 6 K=C I&d3H `Q a_ѸҐ;,ӓTKl bqV(Qk\Hc,gD^3NQHe Tvdt][ҾB&1'jp Y`J+M. &>aw<~>z?ziL -S7=[:e$O%!?#65E{͠N;C,8k+t h|1Ir%2Ck I]x(F_o|Srg 2gw_> YWC"DQMwM U;z)&j5=2Yl!a1L*t_N'o0,vtޥB6 YšV\DQG%7Vm\ N^H Ws`=lwwYGUGd Dz]vm0Ȧ()E! ,X"n M}$@kHK RB =ruY .ЧDO/̄ 7W2ؼ~WHG5O"atP8b:pTY ٣N&lwxhBJt,˷ 8l)J B3Np:9v~X n8N~ZTy/,!\sƒe(M <, gg:Z(0&Adǐ4)*ѤC%T> a)G2ka3ЍP4kL 3Ý˂\‚V.yu*ZTNk [Ӝą2ތ k2q4aDbQleVl!Ia zX[NJ V|Tk0BE,5<(\~YXgba?<;r2CͨSAaG6},Y +wUwV:MNp$9ZPB[7(Rf Ґuб#zf4|T+T0` E!Cg 2VYƅimVd+ :?)'ȱ,^+b't`X])ÕQZLGVN_1S0be']O4x>hJhaO2ldN|ky̰'?АI,Oj~6V:r :hs qg5OF6a̦j:i>O{jcb >Z-1|"ޱ1g3hs0 7-WX0hd/<26L^ T7|T_!cz̝! ܫl )q2`t&k֑AƂ1/**l]lH*p+aY?&V!FUcBUH1,T›ZW-DoGCG2BUrZaUu;M\<:frxr w dYŒ;z J-EbSd)TF$ Ũ4 }wWr}'Jpȋ̄سkV<Ƨt"Ei *i N67;Y̡j!z~Hlh'ni2: ԚMb2S>E)q"KJ-!XtZ}w ;8( 姗Gywx<%6p(.*QϤ?BrsE#F\%h$2Dm (MH4=;Ackx+˩zt׭:V֓0zVֈYtjJmلa|c.t+..!iNrN>tfc8ۇabX"u`e ,-#V94.TPY+L+ʜuNW$2` !e#DM)ɇ?KhґLnQ֊Z_6S~tUaGeyc4K~=@EPK( wӂXD@~Rե1e;!;܌GOV'iFC \L5ϵjz9 c{/EOUVyXvŎ%J0:\qcM6 P;/8A!CyX RB+aV0~=W鸊qS( S W`2|e{,^y{_pr\mL \U0 SR}1o߸0͑'Ύ>a8LWI53?2]:tg2Ap`KHZB@֜ZaIцY  ES^^+w,x:A݌)(gHZV y@ʋE:Ro$H yalr|Q(_ֿn!HtiQe EM2%X!_ĪKd]<T AuCq)mDLI;nJ' n-A:VNg5 b CpHC.y[!B`,VQxuk}0%)*~MKQBh=P+s;%$q tWP>hp\Bx\{_k6ĉq5p%, W{Cկ0 0R6%|í-1Yv Po飸 +fSU+ |əX65\B.V :qPL :9;d{VW9cK򫊲 Aw) [o{i\NVC8OS'|CRհ>/ Qw+Ĭ3FR.$l, BYfjPNrKp3%۽:sQώ#R1XM}}A-Y:326 V 4g2KU9M3c6iQfDQ 5*~𴕩͈[Z7)L F&Xް  ZІQlACgx`½8$#*e)0d*h:.ѕ QW;pPw"4I' +K?[:p3JiR~k5J38r{cI'@kt8Ƞm[z: I\̏O)$Rug$bCcBL#{a)hȇ !!"(sUֿ<ְU3Tuh [} "f\eChj]ZXX@"XX+V&.gA+ j%!A::hŒܖď?| e.םKMhܷ̄@(_F4^c`"0O4_,(;]!hUh:قUFG W xi%&$M2rb'IL&!XBVFƝo *1$@}rRVh*a:,c\YXX~9l@8+Aɩ[3E47b7%᫜ aV\݊8qwg7|rLC\4Wq?FU)+1FܞB-vq\*+T:rk˺Օr S9i|*F+!v|0KdktGcYX(And cx-,xvZϟ?lOvRSlT<d'l,xb=:CSJ[KoI_(E1lKdƢ+AjyzJyg9q!Jzsh(--}^bAba_soDzqGrIo>WK<$[Gv\~}BgG*u[6V,ij6X8&3@1 c4 oѼ-ZţU/',V5!UycV%)\*'* 2yV*45y˂771T{üi&.s:A+̔}aFɖL,T-ʝ'OD;v#  `!]Jl,,7lמXwv-r_?\q/Z>sNl5(:}ե<ǔ}Ĥ5Q@ xHjV olyH9S\aӄw\+b% L乧yͬP pA*"T(H%L0:Ϟ{{aEXldO$?4vtʌ(3YBЁL${lfQcI6l=c2Ĵ=Sl2麞6$ /I#D)\@>  Bҡu ?"rBaދbYV&023ޫz|M=WU13@%UU0ԱZ1D`&`S'*]:-u,X Te/U/4^c%T̃5drB54I^H>ĩo?a͠;hHfP~0Z_x"ց{,ֲ=ݫtF?Xu`pߠdkX@/BE44>Pk71 5yX+_\:mKb <*E \Z,_U2x/ΦUU"U:::bD^t*ќ Fh(2 ,CԨ?Wff}t>n! PGT]]aő6 񨄫@nRO8r)A6b^`̩ qShodh*t=fH*ٚ%qH 1T+iM56V1]b('Xdߺ$#zaMl6B$ iC -Aw,aaY6lZ¢X= , OBԝ%]fվů7+իܖs!@ 닽 +>N0@&SuhKw;qFBy'u$1P 6^6Ǩk`>>\F%ra!:/1>d -ATG{ kx +֨tPC5{Bd б7X,4;cmX<1Y@ub6sޗ6df,PH*4 4&p#Z)9Ii'`D~k:aIUOo(g\"1ё 8&aMhD9hB[)W*Ha5祴ZM⨍VΧ)|дt$rqUӎL3~vJu%s=kxA;TѧŅ92X-܂EEGLxux w6; JX5v)6VլuiZ@֨\«͘xaḉJ_FLk XY0La*-,k8ԪȸJ m̳S=uʥ6b/,`r_P c<1*yb-LKn[$qf͇Dt^Om\Y9Vd4ЩK$R*/ T{sLI &sj#f@t$]XɽŰz?ѤK We2_"3.JpJzƩgtp#eQJ⫔J&;+Ô V錒F`v*]ŊY'$Tnh籂 J>~hɰΈ\qJ:Ps-mm}Q_1{YHd?Ra)jF va_VYzKׂ] Fp!tG?ϝ!Ҵ:߂@V0{mb%W?a"aPO}#" 1 Kx8_M/,u'8ʒ&駥Ό;KҢ nii r] ]Yw $sI0DezU?Mzb1&e՛ݻU=w|JA䪔&v,qCڜ,tAZ~Ze"xaDp},vrDnRx xxjx >#9ݾghrh)f$oO1 -eaK#HBǾ,.RIuyQAM,?f ˈґ V+yX8ؗ|8 4ժ+CFCa5Ȋ oOY`MhY#rJXb^0-6ZPBSŏ6ozaBz~ :pjX%VX:k`j#[Xnj2:.@؝6Up@l橝Q HkT{p`hsQ,!䨠}^>hK.!p.{DguyEYoM$hvv[W9E)Um?ÓIen簮qTCJV,!-CνW Du|hA2bfQ!kO*CSχݩ`Ly# M!iOLH\BrGXUY}Ҳk$`C!wsZC+2Vj /PDKV9`m9`ejVG BN¼vx %p g:}:YT ‥(Bl-$d:f : DkrV,f 2s &V>J߼: ,pl,'A%Ab BY!mZT⨵8lSHP`ސ¾2Y+ғ[>T׏ewiTbf.D'Ղ6 S Yp哜N6t ib} |&qǦk#eǁY8.ƺ5B\i*X''Sl=°6 |LvThߐAw`a%|kKu |PFH%>v0Dh]QOWȵJ|CF LG%k`CYs¾]2;?w Oi]HӸ*m.b}X Ҙ$oP#eV?}zQWʨo"Quqk&+b/фE!wb iPuIh6Y4=,';%z)Hpږ^2} [P%*~)l(?m9V÷@ k5>?qJ#uf"UkXzXT2qejh=aBa KQxb ˊ4 E›j hX1"bjєE gK3>'++iaݐߠ!4fEEйBR~B]Oi@ĢiE1/ĵV{nBJ<Ũ|GmʺOѣWR8;#<='w|A*(Dc]ڛ_xN> bWN6׬G߶e U-q sXb>,Ut@dJ0PSr0\e0;Knє6VT>c/*17N//M wd>S͚V4kŒi%qyGO\4'p^}aI g "aόP/ O$5|) ȴ7;natgIR bS*M{)a3Izq^us?;7;?Ps;þqTRam{vt<ԥ!Sa&z~A1Pf!Å.t!n0拼ڮUؼCkiLXBo$8'@,nâWUZYXQ3 4a,'me5JyưL^)I,9",RQ9HbXN\^œψ !܆'%t:c&S%"@ªd‡!oxi&kMq |g(JVRu $.Y EB(g1*94o8 l)8I&ҎVS2TdiQ 'K5`[nntg$sXP=>lBS-ܑ}L莞UR $B 4|83H"ǮD8 S^>Y_r3Ȼ]XXz> !wThC,zƴ_ʨ ,>'!>WGj¢7솆qٞVQ`p0*Qղ7pPCGZFZ›i/" #+0yXP>L#6ˍ="簲2\:g1- QhaMÌ 1 x|!V v&@ydjT,n7dJ;T.{ JU@K@0<ν,#E#G3K[}KRn v#'%-dʇ 27TDu;&/P tNH{?!>z{ߊ~zXlX?IfX%`$`( $ؗJH*0Bh>[d/H:xշfc\Te]VϢXŠ{xIp `d?:n<ٻ`ðyAVbXY; TR.FTڮuB$, ǘ]A~n$&6bh+T8zPH=6d-tˡ1jE}Vs>#59]>s#>! Q;)h"@ex6# 5P6h /h'zth>"_L Kߦ(n.  B߮ᣨq;^}dzX Oysݢo 1Bd/>7Djīb^.jU68 x'!a ZJŀr83$v+N#qAxIӘr`삱Cc̫JOk;kq&G0Xf!b'D4+dghxٽ hC}6_%PmkYk/~(++0Ϧah>5ʓj༿a+fg]W,hxқ6V# {qPNSe> ﰯ%d1h 2tMicg9i=SW1Xvp[Ԫk0K(SJtޟ(al#ᭂ!qi1Y|^af IuQ_dӲ8K} Ď&?>qd4t]]k\ǖEv@iDF%lng5yihdk-1`0d<-zjK~֬W:ݧvsrkתmɿZ1܏R3^ꗺ O뫢x]^u>,N ;ʳjetlhՎѻNodQ,b@;/gs}F%@ Njx"tR:"qHi0/7dA$^sGvlѹ<ÃOqZf<<*FfqÕ׏7UiK|- -B(* =y= ɖd X_}ܟ.2Ʃp  U79\~( N?V? F%|(KUodP)*pX^ʑRuFq&5B52+EP$;FI8k4R7Uf7\ZJ^]7=((vZJ/i \!}bqZ:I?P&A ?f~Ё\ˌ'4"xg`UM`m -jRx@MwL&uz{ +g==2\<;d6n Tba.4ZKuT7-UĠckxC%IupMkb Lo;`7m4=]UdîN'R1h'U5>?dUzXM; 窠Th ,%tVv.'qvpm+rʒ aMV$p+~)}CRu?xj^X'XD]]+ ^'(BRFseDCeGPg ߑ-JhGՀa~K3\·:ښvZLVAHC*) !BWꔡ>F?ˤb27`|0h)[3S:հا.ǑBεqϨ5|!j|nUZ%x=DժR@.⃠177Oy ͤ6Rf.ÉyXT0$`#n +`H/Ȓ60=ځd@R[J/-ѭbn$ j@bfC"l3Z߭]({@H@+,%s@TJ%,oZ iVE ̈:udA.emun`Ҥ-i]I< A. v_TU΀6~?j9G8ZAt7ůvEأ+imkܿ:+Bb B)=/ \*B*\Ğ%yHtg9y+^P`6EEPv$3L<0w` r$p\LZ^8m"® _nGTJGϟ8.}o;Q=8 \3 M#CH4b߰EoM<ƉYODfk>K+nF/WHt$GyK0S’(UT+\36TPV l])>Q4|υSQK8" b3~hV8m|9+;F+=,5TU|$FxX0Xmː}zY@`!4I,Ib!^.g̱Tː:Y^(>ҥ0ɝ~+$\+qneU>a"ژyHeCe3ru2&S +'n)Ȯy ,W[r, XaxD2ȿxBƀ K ui>"G2CTD܌𕳩Jcҡc# NmCMY] Z>%ԫW#N"-Sj⪋]J6#%C`ʟ:2J#ʯAw+[ Pf}'ǪQTHʧDbbJZt准YVE7{ʭO[hhQGe㬢Dosb("k~39 j72T:X{(@+US1h( s%boYBYK)O EgS <,^Ca}OW<֖8ֹ;z|wX䁩0f@`5.IO> 3!Lq|=<4g 3fxNk*X_עDOv(FꈆkUj󘱅_|%4N;-~]"(-C!ά>դPlF[wSB%|kVe:1i,LZZ=8OC4C4hk1k1'VRrj8zZzTFKOА2W銕|0Ń'jk9oA2XʠZR\(w Z\+Vߩbu~~i/^\H՝+jP(;0q3Pbu(Y;0NA8RF(̥]BL xct6:tec|,ϔ ^1\VB[2R6b)h "2ygqJJU)i( ɚяHs XЅou bap^qB`ҕ6PQw-*lZ+R-S;YYm!}߉H{R+73GN!jGXiM35a ;i NH YUj joѴerlXRo?C{FB,w2TY8'zqQ쇃k|{ ]X/*Yb/]P hoX(j}~ZK#*5Fb`Y (dUg2[}c4"Y7 f .~pCkxuzzǀ}cg [(>5NV{qP0|utzƵ|:!{S\Pu >JCZ"-\ 7oB.RPk'4n(TCP>Yŧ4c<-]tׯQT)W4[*j5-&ڑ(f fTzbgҚ^Τ*ޡI~*aC5.8*ȰFވ!7Vwo_%=,9 X[*y0֎ -v4>~D),eQ_4TRʊmF %'=;ȺZ14!GͲ1r ҏ )9VPq/4ϖ'ZU (0lb`~3U2<+KAbZ \mY47xxmXVf=FgqH Wkv,"tYP=5ٞƴv`<57 y_%00v.Mƴ'‡ ̯X-zB∪9TS z>J3Z"<];!X ?/GHv%G)2G̦!mo2G񲥉*{b5ҜeM jPdJTo,)J+n'UIf[L/D{ڄ Sa,PS0 "l-?du؃`Y^ \߯1MЩ]/I,:Z7 {ïH9:gTE*Ύ]Elڟ}{q0.=K) #'Tqڂ JEJlY)$:ljYK=7Ch$jԮtn|\NޕA f&T@([+; {@?'ߧLOlZ4g%/^JGRlydba(GMDOlr,M`O F#-UVIՀPߵMhWx-wE,5%Rtt1BT/+Lw%L~ڥVCYK5%d 'AuT_x6lЃ. dK!j~/iNU)$O?P#I &ǔ/FsI$ J2î\r-UN \cqjc}dģXDhPW8ᓥ۱~9YpgaiEZ0K GZ8F ,HкuX]RW-eUs-/Ztf\)-*K3䕭z);m80^| V'zɟ4s{M|wx7U#'N^+:@+)J-*v>H|s\ͩ/ȶ`YV||YD.mCvkbuW ukPyΟc)Cj -s*YIH߂ꕽk-h ,$4WLv/7Ih_;E ,3))2n!O l9 nG \XJA QM<u>IHȓAy*X R I=i"8ߚ5Ɨid.PbPEt2;D7K@抽&P>gvuoNVbGCx͡o^Q Z(J7%@kaJVyX hd |g&mq, ]Z IZpb2`@>XwxG1>gL 7# }cГuU2n$! vh WܪZ2g^ejaJڽ`G8>.lJmufߣkwUVE o/V X T&!e"/<-FyH]DEFaI*/'uFe^M%d~\m8w CA]3q7٠ =TNkQ䔈uΜb<ݙQɺUiu^Ш\sdkB luhA]Eا>yW׊'+0_v_(rdt~_MGK*=OJ~!C׶`tcqܵpU|,9],tuOsڲ7UjU qTˤ1TWz ']ĉ*>@ q4$;x jVch ?-zXX(5mUL6md3B=:p?~W>eVvgw> u8=>{W:ksb^ ^*&j R["n+ F QKCqҳ3PwuJȾ+-CAtڲ7<<><>D"8XkU=29V[_r׊UtjI0Q7 ayLJ)dV{&>'Ju]WLWX- Ufcy彩SC],[ETOth\|rF]m7w,FG@;x \9":9BdP(E *=D\ 9V^(2g<ェ>+ ի+T~R)]۫$ L/00ԣBEPo2" M8זg V8,{YP`uGS+Ҙ\5^LnvD a$4mDFh򦘁{ιD|/#"#2ʢq\ݳ,gRs$}:YEPT$D Ivߵ"8QEf]B^`3=̙9d>H[Kgs 0+/yCn\?\QjZQ8*.bVz;ښdQCOb'(Jf}O#GIUux&_M)MD ݸ8GOTmaISWb"9 B;q"XwT`HݻīmE< ( E:E$!=AV$ V,^q)Ql{0cXy!2ρ ¡7T՗"X"2R}el<>/vduЕpqBU/%0>kuLX),ʑly޼v .V.|l z"8#dX?9{K=O SZ8m[ȵ,xHIH! q*V +?a@ BYA*b^>H'|q8?b`9* k#7OqpL%cYabc*pUaE + ()V٨6 X(۬:{`=x+` @ :ۍFEd~woR*0oG }|, kVTObZ|QZq1J1A Ti<U98(- ڲe6&X)Ňk Y#98U:fV1kV3-ˆ1v]f ˌ@]3Ź^אGXg@%!ƛ|5&lL/ka{"De+!Ki2IAKWJ[z4$a"o($.Oq#=MRj@.@Vz^ԭ +z5ab1ǢyzXeIk0EĉQ7B#\@.pА+(e 9)Y8 kyw~!ZXG@}vX2~u!r(mbV"̊Om|է  c] @_lጐ(>b^Zj+NT`^*!*,ߢ Xyjs*]yuTAASv4 +t}M;TiroR eTFt.q0rj.B~)XicSUen龖,EW~ff }@/PڙH3J ZpPc9gOh9dUн*h[PǸ~e_h`h1l%ƏP7_ʼnÚ p԰o܂::Qx=W*`Uע tZtOψWsa킉'ډU(Y_.qnc [@xﳊ.FV N"v0qD 3VGAdʴHhEc FZ4QQV WZy Ǡ;6aK7 ͈&֌nRЋf[VL/\-8a$ugӛSz4=j2Ջ  &r.,8_y]zxo!srqѢ $J8Y9isZH} [aYo_P=z _ߠ~ZX ށ~ÝhƢDנV~h~Š/O/\S4ha#`YTU5v޺woƖJ3Mī}l5DyYŜ&RJpBP!M[H eӞbFڛscY5XX+JOvz.`Dl(ZoiMx3)Z3sp*4e}֌ٞyQ JRot󪵛g3b*/>k! UbuDԾ,, ՁLnK!͗ep1e@5e4\F4w6d8ESz|CNW&.4i,KQ=%ô,:4"m+o+g!^X B)K -8`* ~h5(ZmSzoa$ }ZPIsH8ʯ`Za>kme70WCtJv@ ]G#\}\gb$XaeM }zwK"t@)LbAV4'KQ ^S/+T> s̽l\*e=Q?U!:p L1:b(E" J %5^P=q5ĸ㓦moNdM I8 '@P jۍ<u0٘@2: :gv㎵yu'W~n~yxEwa|%`]*V08e"ZY*ly9㐼Yg\4}:RmYr=+>dJzL;x (IڢMW7'Pk wBS3x-NtfbɸC Ve&F$@E(JP"*{IqFjlwy^xCX,T\hyip^[Wcg6U Y8#,VZB.XGSY9q#-P,,VdaĢB(%z'VJeqـߘd#B^'ɍ[ȧ( ye̤y4Ur0B్n:Bd: "\J΄.p4$Zsɻe9.t\PZK&9bjc}dn97@'O->"AJ&OSAO(BGE~(Ƨ1*G/xC>x}4t#r3A?(;6'mD+T+8T`sIj]Ql&! @:}xdaFd_"8WA%t wTHNratWլ?-J?W'N2>P$*VTT?y>=+)Y,"l,! p Jcᖈwd``M7d^*zQ,qZJckiA8SpH,_SM$ \/`&x4 ;+ i +.U8׻z=F‹l=>qi3LqT^g~:v%kE FW-pIB#lq(BA7N'F_^ΰց72΁@usA3Awr.2Ho'!-bqm!WŠ KHE' C4 H* C*+;i$!iDk ?ThFT;XK-e_p ~oXOJW"pfo4{d^l*\nosK0jhlCgMgbgso[T`[AM\'H!􈸿 ;cWTm2,fX۾.t6I(LkpR *%J4E1LsB3IyDRMhF_AH|_#08M/o(~7{͟e%UQeTrO3nh݀(t?irҡ-XZYW WWW1,gdTX8g ?4}Ij`=`!`"BXXaܣV ..+KW\B&*^q#J^r4kiC+lfY*2BB  /PNa9Ѡ| xP=3/]1xaww89Ĩ'~@蛱`t:oz ]v6Jx^%ȢH]Bh& K0@B5 ky9?gL@` ƹ<]_: YEJ"ɡ`bMw5جըZNU-R EegqqmUz0&}')FhdfT7PᘶUJ G!8V|U4Di173E/˘/>wQ[sԚؼ-~*WF3>[$ǂ;M:JI[%'Z0XU<2(Eh_L+ϲ7fq*+~V&↿6@O;VA-|vk:ʛ4Ƹlm81 ʸ[lbͲ WQјчV(»]{ECM6g(8x3:* V+֕cX(*M,P1޳3&R:*錫ma`1V=VU7no1 UĦ187;>n\ESh5F }9`3D>Ձր=94f BVrĝDl&r /HQˢ0(Ũ-,as/9$6Z!ɰUV @1.R?)%ë Կr̊eSˉRiU!v+`u4x߹{p~ܯKF4,—D/"X CC\=N:o\!tfl[k:?X^OC +'lK= 7JaRm [n"@?4Wb;gjS~y% XbUX=ӡ5cu%!b=CD ʦ<;؞3ew5HIUlMZ+ьEմN h7D1zTyP cO.9& FOq%2W$6%V ,,(Nw/E0!=lXɅKcP2|e0V:+Ur^, #OS 4?twjUQI3LƗTHUWVp"[7L+Zo+SP< 5+YTyfv/E0C87(Cx;x.zsbbX*)*e:,Rcwp0q5+El(*;L>҆z>UPg8f3Q4NTo2=>DM͖RVYp2\  >J':obsWgH /6SBy_̓ed%PXefǮ*ݕvXZ.<7?ct+haDѰ<0eIB6S%4!vLp7 #Z<ŗ|$J~Ia?uPm1*2CYtH"A2Xb3z& vpcڔC^•s4p wLZvQi n=ZI37Ͼ{cTx5Y*KheBA<<I8-J .z,(^ԊTa-odzpuhȫ&=NKK_Z1`Hp!4P,ZPF!eMhP{/i _&AX_>S nt ښHaW^(̓}bkIS8}VQxnNHBVA1Q=eQJ=A}oY{~7d IN_k,ĩ]`!Ϥp\\ā~t<{СxX}Ul.,'j#OON'`d@a4[j~xXL:N0Q0T'*J¹BM Cs5GE [ߊ@6`lCR(b٬fI$4 ׫G J|]FJ:fHK( ]B ȻeWeaz iNxrcUf4L8@X(!4bKj=Z^Erb!?)J{+F (5W\q$puNƅWea(rP0YUQG4"O*Tz~Ңz%g(=ĨMc\V!J/h -  yl?}(|%ܲ|P_"Q[aK[D(G8*k}K,.~6Ѵ:d $pÐ,a, es;6߰G%;KƽXa\r`_)•Xf52#vÛsPY-_XmW0ߔkVA RŦ*IƠfʀ:WbeYQ)^Õ/ ī"]*raʊwp FY58!^k,18L(qX;Հ餮y[,¹ub BV`,2HHq|QmYXT + J%&P}$L^ecG#@i". boFg)j%|9 X քSPw\J8HgL±on]c( JvUĊ2u{)⾏rz=d_g"M*4$v`űNAalQ$W[8p^$.X :*HU` ׵% D\4@0r٫wWQ W8Q%+XKI H ,V&"$U:֝H#G8~_xQm=]4>\(I7 R x(-sb[q^NWeK0%Qav\$R!5hiNT.!g)8Q}>Do)ֿZ9pj8:jO.!ҿx6Nlω|u|u5,ݑ֋\,TTB%!M?TZ\!"H9vZ[AX\f0K ZjbH"_BSr -+j'j=4&ʼn@*k/QrD5.)Ԡ7'G۝ڲ9- ܴXT"0 zhق<ΌsbNiK9i*˴[Eqnb +ēq;V!Չ UH%N0"ebmQYL`3Hj*ִhT`eU+kf7/^0t%* d iu".` Z㊰&jiU(H+8YxNE8cm]?QJi(/AzfIa,Vi;+rl*c޶l*ҩ8*ƥ2vYSeaI= b|ш =5G~elU#gӂ]J+Hy]BDtGk57a e¸Ê25"~)3W刅mW~ڨr:R3ĥII VelMxnhEo` HNǁHlGc9_B;gzöB !wxI 6s&qʋP:{FH58Bm㺩yKckBߢCce&#PMM,%?AzJGH ތPTli(#RY3<imo[ 7W}*FO\IYg'l!ez^@Fcs-1mr*,dr&{4XA:/"Din>%;Xna1$|e7V0ߊB ^~aDaO~8X( 4v wTQ>)yJ(+OQ k4NKt>XEePgw gUJV6H {蒀=λD⍶b+sɉ 0t:%|dXՏ= +>KKǏSUB ' @k`YXTtՎO tivYÿ^65\wu|*x}E _YGFaU|g-\SbZNʲ#0RN㝏C`aS^/hn{m='g:¸ t XjH*]BA+h iکM>, ĉm~~e֣5+Z>ka==,3BG$2k*|J X͢H \rrzOa[#M$gM'NȶYh=^ρH5G;ZǍd;'-ZrJ}z $*/*;YV_wW ÒURu)[ `;%&[uq#m܁[_H@zHdX+%iFa]r#(ʟ(z >>c6!(s< HE{%3ROݛ k{bRVxXٛZi c?[OIhRJAz#Cmi1dHC&k]D]) Z2jI  0Mɥe(DFZ{Dɘ*:?s"ՠ[LFCMMV"VGeJvuOq}nI36țcH"q^ pb ϐeM%lͶa4OXlch)o;*_%<=Gk)cA;K+dG FFK-7]j FrL,Cp3Q57黗B@qHϦlۀ,-pb_0spC˸}߱e'$OJ"Tc`pKӠ!ĠyU@gd{ԥTVzh*w}[FlrWқI(^@h\^㰴l[Xqw;%*DZ8[ pSxU1ia_qVcX!p" W\m P M1lN AE:@֊ _!{H, w1J w%(2 -RENqwF0`!U -dr+U3LιtfHl8m ]e^Ό簴^|Ґ+ǯ㌡pJ`uI}%hdZ CgMataW.h B%n |, " JQ>aB ̠sFKD鑩AJùQKpͽavJiXG$"Y^G{/E2p"ժxUln&{hwM"Wluqf1K:;A"׸h XQncq>d[YOOAkopǷ9;ёC8=ȮzbSњfqBW,ˊ%">XIjhS©G8I0T;RZěZ7EVW:DoƍUDUk!ccHS=H \&CYp[xh (ٰ* 6f9XVb}ԑ8 u+\$p*jjjՅ5N-S=ZBZ5XbkfaYX GRFNT3 s<0tWyGÉuD@Di\,mXQ%dvgvL;3%mT *2Iu XZXv ^^-Ƨ8S夼L ]B>VM HVS%8A%pW~ kO,: }[>ktEJ8nwP8م(0Aq*, \m>I% JMwhS ^@8H@ cqzM.cq [X3FފXE4zXWl;Fq {aȠNk?*9\!2moA _BuwYXv Ege)^X~85B׬s{2_ѠN`? ̲|2Zy8E&.$CW;xמisG#_ڮ{L XDQxм"+"b9l@T KܮqVZcŏ֒ QS:K`MV* 2\h UO,.DW#f;ɤ;Ct! 'ec!Ua'=݆WaRJƍ뺰WcPyHgEFv[|GSa+N`8)F k,v?>V|c! ,S+jd`y+Mҟg -,[Δ-RPH*g;U|+'kRz]z`(,*6^JOϧqzi֯ܨ#NV!1(9l[pnE Vj4IIqr81KpEǦ |#Yh`# |-.1MׁNKz1E/H}Sry𶐛ƗK%)?6J̃upEnˊ b6BOǫT #ϴ)bpg0iT5<;NYQNT6F=)t/ֻJ JsVS ,GWz~G'ZMb {aG eU*";c&O3?9ڐX>ǯP *? ]%$5o G= QPIkz\5[q Xah{ư$'YgJ e[dFE}d]lݑ @20vdƗ#@Hg xǺq *pa|]] kTB|Vq`}|;#r Kf)Xa-]B!8 `@)2=,,7uI誦Z6(kT-t:z,Z|FB}@$-"дzj8p6Ju5ԑ%URP+ȲU*4 f!k8Y~+adl- ->X4})tҵ?KZ}Ev`**;>$tN ՟ XVѱ*swa$+I$Vc |E( RAwq4~P0L|BM*Mzv [xa޵ -{*#gb"ƲH!Tހ  kj "v&7>qi!آN *unh *eJ(CAu dPquѰ>A9j(RhPOCVґb :JX.5Qtn (7!B[!ӥ D jPU[B%N-}ZO`0[j 'kTd0(t j?TQ&K~!Mb,րh9>V&{9T:Cu#,zh;tBYT;)PHKjV;XRA 0믝`AwuRGvy0 W3n#$b\% EIJ'iͪxD+:` {Yl낅4YɁYB.5WLڣcVLG!l;%1GӾzni{gm'=8= rk`JՉ͉uMD'bpCOl$>WFt9Ҟ B-\قfD}ȎrSwFr@&[ Xl2G !c1q^(JdqC>(׺юi ?b#z.^Xjcji ?ިYXEbm`z9X#[ B18X]G xx:V%㗱vxT.J1Vh XiUR_5r{:GYY$TJLTj,2adnKU5@)8‚"+6tD[M H9=ChaSFµ%4A0bs]ؐHdSm_PIYZ\qQJ{Rbզ%a=B&b(q>u.Y?^\TύZECԧfxf-4Tկ`0 胄0w^]]cGf۸Nڸ'Qu cXCZ̪U[3F#ʕc>oV`Sw֋ⰆO LNB;"nFihR7r0ud6g0<ŞU|/I h6/ }0b=tK/ͪyD2EcA݊Rw Oj_#P)KڇJ!FT֤YVgflp;EHii׋|͸Z,`i+DcY^m$<$*)=;~ z@·(/CBg n|?*hZqͲwz;To>QZrGe(Flqm>jAk=516V,Zj~>kz X^u0t^%t*Zv5UW~;J&tZHrUY[([8𔙅Ł"-vҩxʈd=J CպF&fc w݌t i'Jфq`,,& T$w-MEe>4fx<ZV&r(D%$0 6+~5;c!F~/- ;b䀏tNF*`u"z}qGRkfİBԩP*V9n`(JY9uop=B]qfY)j n!YX`2[:uoZCİ޾}d/3 so٬o)x>{0`k`_aSrEnR%S & -Cz;Yi֌WUt *U5gc@ͪ^SZ֍QeO7ڿiE;q4 ^)ZN16n.I)lBQH;aѴ[x.6 Vf2'=d@iX'p|3%\ЊYEB= L>< dFy]a_V?kOa<4?*/Ŵ\ N\.<}`G ڑĩ-FpN~^c,،ƱR'k#.6b}1ǟ׸v0bX$wo񎚢ԿoWhKrF7U^MG*- YHx6Z&BbUܾ12>|2# ~`S>4+3D /QƶCJ`@^, XXnX`aap4X` X X`` X` X X`` XY` X XkGǗ>I˒d֊,jdl*IX-;5jO ԑY꤄bC66 i) z)gufq?ΜafnA@\5N9qpW\ qoJyi|\y/乓+!㩕`#X R{q0mWpl>{pJ@*oA}OQ%'xj,R{|RRRrqn_r+0BW0^b >:1Y4 ^] Q,L-WXm-.npiIIKI\E(>2@L/5_Xz^"3 ̼ڍ~f" is&`y@ yʐgH7S9RRRW XL4HB @X4:8.1롹YX `*=!X4Qٓ3, ^̙~jDĜBb))`)y*X,*[BKF˜/+F"$F:NPҳ^<^3~~P9= dOviB Bo( !NJ XJ%EdJX<+X2T3,DY6Ͱ^q!.;羮|3"y~X ,2#{{=`c{qqC9:X%,%o=ŪG4L#9-agM-H ]|}/wRnp oX4OO%")bvkgwNNdaF?`f>j(Riٷ/TK˴{X/V]g>r/J74sX M`K쵿~x`~<T N<~{N=,%,%DZ+ B]Ir,=tW=V(lN(r妻uVн.‚V0eXt6[,dn#] n~Xz8}?^z`U $V; 8w_V|MGôoLe5Y`=DgXE67Gs#J-sS6,pϰa1C-g'3,:W"VLwXϝ`Q %iΰr}|.$V Gå)EN#:fOJ15^[@ %$ [B(X ^MJ㖰)v> a| g '>Z>-"l/"O:J]% .k<6ԃzAXǩj1> ! itK(ؼ%\.I80{5o +_8Q0=Ih9E ̟Jך1a<;iQV^Ц_\LYcx!PR3"_d,eU:3aˆŮ /.&W:WH}ń^bW|`{k)׃~o@,e69+dŠ@,vWx<L,%ńWP}b1a\"+~`ٷ~:s-a۵f&,T‹E췂LX0T,v`,{t1q-&,Wx+XLXL,v\,eŵȑ +X~) t &z`{X\Kzb1a]CBE:+d&*FvXث&uZ+^c, +u30_3J+n`+X L,&, &+;WD^z>גz]LLXKޫb1p.VN7+W6b,{M1B|1RE> K`3H)5ŜsL5 1}篦eK~jdW_"XF^M9A^o#RwzLXJ0Elr~^DŽ`.HY!Bgx*069I;גzu֟&"uV6b1a>%@"X9۵4-S,&^[iڈŮНGdpW2ѧ4Z!ak"+LXWn?Q/1@,e06kɾIsoMZM9ńU\kO+Ͱ+y5.OjݛE)dZ}5 mL R%RzW\y["Xvϓ!0tSeNBfQsh5 /B9X UaMT+TwJh{{\KkB7\届;w53au_˼\ώb,ܫ#Oj M5jsĄ>9%|Ů0곊c,{R)NU/;KגsV!iZ¡t K+I;,iMDӱ-i"[*Ad\wݿ*iT^oLXrΨƄ,71n E8$28s9?9蘰6{X'Q9]O,|x$nBU~+OŽlK)aO[hRu <%oSkr+({_ͫ}\s)9K߫T9uIa"X},Ě oUÐ8)5lkuB9XWl"Xxb۳˕ǫ!Wy+~Pz%sQ^1augx2pq.{׀ŧ5tuV{+v>Χ`"XxXg̨ X | }^yX˾X}{X^,p+V0 ?^bRrw>?8ɳ+eu%X+$1Ї.5;ߤɏw+VJRW|kKmAk+vUsjZ+e?5jR5𽄿*=%mSve.VbcMWB]+e0%pv4εKbzA,W~AT,W *+e]%6yŵb!bҳxE ]A `W~+%X,c"XuVX/xŮX`łyŵbbҌeXdRŮ`E,`^q-X(T,1`¼bR^+Xx<+% "X ]A˾2+% s>ȄT3,y&, BY/kIyńb/dRW n@,Ayŵb +&,=+{EˋbR^+ ^,{`^q-X04c"XE^1aX[ 2-/8T,WLX˾WLXXcWg,W^,k 0ݠ^1a2>_,{4_1aŊ]<%î0 D1 (B8Mh/oT<Zт+[*W X}_uC|ZƊ\X}_X-Ռ_)bc}EXXª+ra++kk/RX=c}*3֞uR+RX-LX{VWl aAa K @X#‚-)=*FؒaAa { @X#‚-)=*FؒaAa { @X#‚-)=*FؒaAa { @XC‚-),"]i³Uhհwd'cKJ}vdo]e*1s%Kȵ83 eBOXECDL(<;`Ҵ'9 2/ar)s؛#r7y:R^g?f r;C)(,jK>V=eUc\-|} !؟|D өWSTHrT4q^iR䥥#9{}!݀ rK Xw>t1LinT 蓵a)0fyVl?Iϟ#ᗄuaтV=U;V$fm'ёS{D6aoأxS>auN(GFP^uJAvkaz AQXd'ZU"WJ$=`'"՞5jGO )/~!x9ڲ{[:h*UQ0+(6ǤnJL Eeo˦,f&b@X=!QRrBK/TO*g!޶>-Q ,ޖKܰv&muQMXx)y1H`` +% INuӵ(ˁ%a]Λ °dz`VILW!ɝimȳSky a-;ƵlNf8ZNyԘNBk.C Z./;aHrnnDa"\a2W E\W ٩$'ѫWm: -T,RH5g=UrZ6]Z#h p +HaQY)-3t*̘ <*R}u0jX%MD86* 348z^ 6n ^tu&x,SFXhl`f4(aLRr-7}dB."2ij̗E \$C&+NFpa܀'Qj,a%"^am Jd+ &aPeH|>9( ?3 @-XQ\9F/V!jd*!a}(z|q@"',l-Nj $ŝRe ›Mc: ¢pQSƵ|Mw3)XUbK5J!.R,Ba12)I+1}ůɻ$Sw8aQ긦 }F#(+a`b;F-AXo՘z2( WBEev V[\F!'; +{_S"|0!U{{5V埾"t  M5NҁQXTp))0/ dvC76W6HE!P 6;\܏c;OODx^TN1+FRSrYt˭7²O k&TcȐ7U6HX)q{H)6)c$[>aS_}’o^AdHXg:$VT֭_yݛ&[~ќ鉂;%jWSX 2|G[k^Wyb2R|+,VbE2)_ѩBrQՊ\_8FX>Yg O0aQ(CA9{)AXf%sƃy ^ (8L>ahd&)K ]A;ΏQ_q’g#.x*GIg+06`Fta(OX) nq =Wю3eMޗPaaVȐ , 9Wúqv"*?԰(#|zra%K>3cM[в ݍ|I\P͗|XzY;9{wr66׼\(i'̹f^*v',!:t¬y0( ~mKGdސ `.ρB`Ƶ9Aa $ﻁ=|ʱg7ǴGlz0s^96//D90kٹ7ePnDT?? ?"Ul(_ͿJ _PPW>`w˦%a]/u|֟0 f%Ph"g$hUalM}S0.̿$ze^_[(,\: ؓ $=Xw xJWSaǫ(&;YAA#.PQPU[HrNe}}85z%,B;WPnl.JT`V9LҜXƣ0*r[6[X`a^yJ8)3H (|6W aXcΞ:t0ұ:e-_ЭY qN!yeؒ{ω?+K=|z8GҤ?=K(7uy8}qvJ#_]|гrR}⏈u  ;-ȿT#8P={/>{Ӟj  *VU?.KUty;d`  fXʟ_xf}kpX ,5XDU])MF/eAX* XV:%j8,Bz, pX`%EV %Vz,aJ pXd X@,JK8 X"+b  E, bEV:VIL/堳򘯗reÈyU>,"4oOK:j,wh+uR"}E$Êw3n}sJ][cnFΧsإ )! ބ]Z42D9ܛi}8^6Ưi{V=9Db GBK焙Dk sN@ڙlW)+?[6zdh6^'|+߬W6ֆ.X˵Ƒ,dc9 B:ED2E,ͩa }=}{NccvY'vzv rSի+9aEgGgͣRdhIp/TLpwF0<:c .8f%GHyvX2l cM;/7Gkl.aے lVS4Y2t9"4f063C"矍#S$&5q3{ 3,Y!˘0$n-R ʩ Ș,(!j9O.m+q{ 2sLY a/?w@EclA0Ic:]a% jp2V0K1Ņaaeڗ;5\kwQ@B u""|n lUϱ;QS`VŬi|]%XsB 0T2'I+.#l9V9J + a yyv́'YcXaE?.dZmZߤ;pu2c&1U)+4]F#G^~?SE zxA_{lofp' ke7k̸XëC=[FDۑ{R4Q~ZϹȻ݇z4߄VF5Y,_.mXonOQMv NƎ/깯+n"o~[n,|VNG֫WXlX͜/[wia^lXto1${s1` 81gy[ARgizڔ͚ [`K~3BUvqOYLfy+y킢5f\n:}??F')S~Њah *i<5&mJ KuI>ZXPWE-e֦6OmI֥4DQ0,S8c \eK$18aMcyؿRߏֳЅGd%^ʢ4ȳ=KuJE-wCN\<7`XH@= g!!!Q4a|bқTXI ;zLJ):9--B : J"K?ʇ$X2BbTU6zgbUc(^O4c7YN4,Z kV>C+M*,mRfeȺ%,όe4,H'dw %+0VбhJkMmBu'jqPPI/ b]o FWQ͂0S p.Iԉo Q<{?}G+sPaQ *aÊ<.#0]{t_Kq7jbe+ [m?BlXlX֜/M*,9D†q3Mm"JoaX*n<_a;*>5F𢅰$N۲?3v`eX;X0= -v49N-eQq-J#+Ow.SHD*4;BVқTX-JH'iZ3Ąf1#T@dXS?RRV2\džÆIh#_S1aaqd{12a&fc`֒AJ9.I(]^vz) 3.Naϭq ª"9h a1#\a yFpJ0,0V V0,4,Qdp>$ë3PCXaX=21 ' {p=:3,*YXz KI>rsdX  sٰ}u߰ҰU79?v !aWK Z0ZhR6Rlz[êb M*°dHK'_d%?UѷaIUjJiX] )Ꮾ`UʰOu8z+Z0fvI1\a/ aúLI`L&vV2Kwf)cS{ÚDR=@#nKrGcO /Wh mQ0ad}V7,L-™g$vQ}m 2,PɆ5qgi2,4,;o)N *,]!p}a0TK]aB{ypo ٰ{ f ɐCaB8S"pKR g2E7hPlmÆ53,iBXK9* jLJS] ;l? K3ARK(9Nx'E9ǭְJ"-Ziw¢m MJ8ccMQa%„6Ǝeb1 fn/+(s9b .*n^閹?;M-a.c֍0~j6p$Q57p2f(#;#OwZ,`%LjjRR!+O6@-V'+CVCK._QKG;m y8MuaaobtUQߨƒ0e~*J0k FHs_m`?F?2UF$Xi+[TX|cgZ t4@s^wu%Yba3=wX z-!SGr %ϺW6HƈTqGYdXC]nݷ4d'"4dNEq,j9B ݌ 8 {Rp7iz ˂2W"7xr0(9/qq";9?8'-GU~tWڿ"E;by -sΊM,}`Dbr+c1PU[ܙ4-[P HΜd<$2XSgr2òAp,2f*Q/l YTE"2[qof/vOԒ\kي+ιnd, ,+n\Dk^oB,nR lIENDB`style.css000064400000237703150212240530006424 0ustar00/* Theme Name: Business Club Theme URI: https://axlethemes.com/wordpress-themes/business-club/ Author: Axle Themes Author URI: https://axlethemes.com Description: Business Club is a multipurpose elegant, clean and Elementor compatible WordPress theme with premium look, feel and features that can be used for not only business websites but also for other WordPress sites like educational institutes, personal portfolio, blogging, etc. Business Club is simplistic but very elegant and mesmerizing theme which has all the features that you need handcrafted into it. Even with all the dazzling features the theme is optimized with a standard coding, frequent maintenance and expert quality assurance so that you will never have to compromise quality and speed. Demo - https://axlethemes.com/theme-demo/?demo=business-club Version: 2.0.2 License: GPLv3 License URI: http://www.gnu.org/licenses/gpl-3.0.html Text Domain: business-club Tags: one-column, two-columns, three-columns, left-sidebar, right-sidebar, custom-background, custom-menu, featured-images, full-width-template, translation-ready, theme-options, threaded-comments, footer-widgets, custom-logo, editor-style, blog This theme, like WordPress, is licensed under the GPL. Use it to make something cool, have fun, and share what you've learned with others. This theme is based on Underscores http://underscores.me/, (C) 2012-2017 Automattic, Inc. Underscores is distributed under the terms of the GNU GPL v2 or later. Normalizing styles have been helped along thanks to the fine work of Nicolas Gallagher and Jonathan Neal http://necolas.github.com/normalize.css/ */ /*========================================================= ****************** TABLE OF CONTENTS: ********************* =========================================================== # Normalize # Typography # Elements # Forms # Navigation ## Links ## Menus # Accessibility # Alignments # Clearings # Widgets # Content ## Posts and pages ## Asides ## Comments # Infinite scroll # Media ## Captions ## Galleries ==========================================================*/ /*=========================================================== # Normalize ===========================================================*/ html { font-family: sans-serif; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } body { margin: 0; } article, aside, details, figcaption, figure, footer, header, main, menu, 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-color: transparent; } a:active, a:hover { outline: 0; } abbr[title] { border-bottom: 1px dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } h1 { font-size: 2em; margin: 0.67em 0; } mark { background: #ff0; color: #000; } small { font-size: 80%; } sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 1em 40px; } hr { 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; box-sizing: content-box; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } legend { border: 0; padding: 0; } textarea { overflow: auto; } optgroup { font-weight: bold; } table { border-collapse: collapse; border-spacing: 0; } td, th { padding: 0; } /*=========================================================== # Typography ===========================================================*/ button, input, select, textarea { color: #737272; font-size: 14px; line-height: 1.5; } body { font-size: 13px; line-height: 1.7; color: #666666; font-family: 'Open Sans', sans-serif; } h1, h2, h3, h4, h5, h6, p { margin: 0 0 15px 0; } h1, h2, h3, h4, h5, h6 { color: #4e5052; font-weight: 500; font-family: 'Poppins', sans-serif; } h1 { font-size: 30px; } h2 { font-size: 22px; } h3{ font-size: 18px; } h4 { font-size: 18px; } h5 { font-size: 16px; } h6 { font-size: 14px; } p { color:#666; } dfn, cite, em, i { font-style: italic; } blockquote { margin: 0 1.5em; } address { margin: 0 0 1.5em; } pre { background: #eee; font-family: "Courier 10 Pitch", Courier, monospace; font-size: 15px; font-size: 0.9375rem; line-height: 1.6; margin-bottom: 1.6em; max-width: 100%; overflow: auto; padding: 1.6em; } code, kbd, tt, var { font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; font-size: 15px; font-size: 0.9375rem; } abbr, acronym { border-bottom: 1px dotted #666; cursor: help; } mark, ins { background: #fff9c0; text-decoration: none; } big { font-size: 125%; } blockquote, q { quotes: "" ""; padding-left: 15px; border-left: 5px solid #179bd7; display: block; margin-bottom: 15px; } /*=========================================================== **************************Elements ************************* ===========================================================*/ html { box-sizing: border-box; } *, *::before, *::after { /* Inherit box-sizing to make it easier to change the property for components that leverage other behavior; see http://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/ */ box-sizing: inherit; } body { background: #f1f0f0; /* Fallback for when there is no custom background color defined. */ } blockquote::before, blockquote::after, q::before, q::after { content: ""; } blockquote, q { quotes: "" ""; } hr { background-color: #ccc; border: 0; height: 1px; margin-bottom: 1.5em; } ul, ol { margin: 0 0 1.5em 3em; } ul { list-style: disc; } ol { list-style: decimal; } li > ul, li > ol { margin-bottom: 0; margin-left: 1.5em; } ul, ol { margin: 0 0 0.5em 1em; padding: 0; } dt { font-weight: bold; } dd { margin: 0 1.5em 1.5em; } img { height: auto; /* Make sure images are scaled correctly. */ max-width: 100%; /* Adhere to container width. */ } table { margin: 0 0 1.5em; width: 100%; } td, th { border: 1px solid #ddd; padding: 5px; } /*=========================================================== **************************** Forms ************************* ===========================================================*/ button, .comment-reply-link, .comment-reply-link:visited, a.button, a.button:visited, input[type="button"], input[type="reset"], input[type="submit"] { background: #179bd7 none repeat scroll 0 0; border: medium none; color: #ffffff; font-size: 15px; line-height: 1.5; padding: 5px 15px; } button:hover, .comment-reply-link:hover, a.button:hover, input[type="button"]:hover, input[type="reset"]:hover, input[type="submit"]:hover { background-color: #ffbe00 ; } button:focus, input[type="button"]:focus, input[type="reset"]:focus, input[type="submit"]:focus, button:active, input[type="button"]:active, input[type="reset"]:active, input[type="submit"]:active { border-color: #aaa #bbb #bbb; box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 0.5), inset 0 2px 5px rgba(0, 0, 0, 0.15); } input[type="text"], input[type="email"], input[type="url"], input[type="password"], input[type="search"], textarea, select { color: #666; border: 1px solid #ccc; } input[type="text"]:focus, input[type="email"]:focus, input[type="url"]:focus, input[type="password"]:focus, input[type="search"]:focus, textarea:focus { color: #111; outline:none; } input[type="text"], input[type="email"], input[type="url"], input[type="password"], input[type="search"]{ padding: 6px 0 6px 9px; } select { width: 100%; padding:5px; } textarea { padding:10px 20px; width: 100%; } a.button:hover{ color:#fff; } a.button::after, a.read-more::after, a.view-more::after { content: "\f178"; font-family: fontawesome; margin-left: 6px; font-size: 12px; font-weight: 100; } a.button:hover::after, a.read-more:hover::after, a.view-more:hover::after { content: "\f00c"; } a.view-more { border-radius: 0; color: #ffffff; padding: 8px 20px; transition: all 0.2s ease 0s; display: inline-block; margin: 0 5px; background: #179bd7; font-size: 15px; margin-top: 25px; } .view-more-wrapper { clear: both; text-align: center; } /*=========================================================== **************************** Links ************************* ===========================================================*/ a { color: #323232; text-decoration: inherit; } a:visited { color: #323232; } a:hover, a:focus, a:active { color: #179bd7; } a:focus { outline:inherit; } a:hover, a:active { outline: 0; } /*=========================================================== *************comment and post navigation ******************** ===========================================================*/ a.comment-reply-link { text-transform: uppercase; } .site-main .comment-navigation, .site-main .posts-navigation, .site-main .post-navigation { margin: 0 0 1.5em; overflow: hidden; clear: both; } #infinite-handle{ margin-bottom: 20px; height: auto; overflow: hidden; } #infinite-handle span:hover { border:1px solid #179bd7; background: #179bd7; color: #fff; } #infinite-handle span { border:1px solid #001837; padding: 5px 15px; width: auto; line-height: 1.5; color: #001837; display: block; } .post-title { font-size: 17px; margin-top: 15px; } .meta-nav { background: #179bd7 none repeat scroll 0 0; color: #ffffff; display: inline-block; font-size: 18px; margin-right: 15px; padding: 7px 10px; text-align: center; width: 115px; } .navigation .nav-links .nav-next, .navigation .nav-links .nav-next{ float: right; } .navigation .nav-links .nav-previous, .navigation .nav-links .nav-previous { float: left; } .post-navigation a:hover, .posts-navigation a:hover{ color:#179bd7; } .post-navigation a, .posts-navigation a { border-bottom: 4px solid #179bd7; padding: 10px 15px; background: #fff; display: block; } .navigation, .pagination { margin-top: 15px; } .post-navigation .nav-links .nav-next a::after, .posts-navigation .nav-next a:after{ content: "\f178"; font-family: FontAwesome; margin-left: 6px; font-size: 12px; font-weight: 100; } .post-navigation .nav-links .nav-previous a::before, .posts-navigation .nav-previous a:before { content: "\f177"; font-family: FontAwesome; margin-right: 6px; font-size: 12px; font-weight: 100; } .navigation.pagination .nav-links .page-numbers { padding: 5px 10px; text-align: center; background-color: #fff; } .navigation.pagination .nav-links .page-numbers.current, .navigation.pagination .nav-links a.page-numbers:hover { background: #179bd7 none repeat scroll 0 0; color: #ffffff; } #mobile-trigger, #mob-menu { display: none; } /*=========================================================== *************Accessibility ******************** ===========================================================*/ /* Text meant only for screen readers. */ .screen-reader-text { clip: rect(1px, 1px, 1px, 1px); position: absolute !important;/* It should be ablolute */ height: 1px; width: 1px; overflow: hidden; } .screen-reader-text:focus { background-color: #f1f1f1; border-radius: 3px; box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); clip: auto !important; /* It should be clip auto */ color: #21759b; display: block; font-size: 14px; font-size: 0.875rem; font-weight: bold; height: auto; left: 5px; line-height: normal; padding: 15px 23px 14px; text-decoration: none; top: 5px; width: auto; z-index: 100000; /* Above WP toolbar. */ } /*=========================================================== ********************** Alignments ******************** ===========================================================*/ .alignleft { display: inline; float: left; margin-right: 15px; } .alignright { display: inline; float: right; margin-left: 15px; } .aligncenter { clear: both; display: block; margin-left: auto; margin-right: auto; margin-bottom: 15px; } .alignnone{ clear: both; display: inline-block; margin-left: auto; margin-right: auto; margin-bottom: 15px; margin-top: 15px; } /*=========================================================== ********************** Clearings ******************** ===========================================================*/ .clear-fix::before, .clear-fix::after, .entry-content::before, .entry-content::after, .comment-content::before, .comment-content::after, .site-header::before, .site-header::after, .site-content::before, .site-content::after, .site-footer::before, .site-footer::after, #sidebar-front-page-widget-area::after, #sidebar-front-page-widget-area::before, #featured-slider::after, #featured-slider::before, #tophead::after, #tophead::before, .widget::after, .widget::before { content: ""; display: table; clear:both; } /*=========================================================== ********************** Widgets ******************** ===========================================================*/ .widget { margin:30px 0 0; } .widget:first-child { margin: 0; } /* Make sure select elements fit in widgets. */ .widget select { max-width: 100%; } #sidebar-front-page-widget-area .widget-title { font-size: 21px; text-align: center; font-weight: 600; text-transform: uppercase; } .subtitle { text-align: center; margin-bottom: 30px; color: #737272; font-size: 14px; letter-spacing: 1.5px; } /*========================================================== ********************** Content ******************** ===========================================================*/ /*========================================================== ********************** Posts and pages ******************** ===========================================================*/ .sticky { display: block; } .hentry { margin: 0 0 1.5em; } .byline, .updated:not(.published) { display: none; } .single .byline, .group-blog .byline { display: inline; } .page-content, .entry-content, .entry-summary { margin: 1.5em 0 0; } .entry-meta { margin-top: 15px; } .entry-meta > span, .entry-footer > span, .single-post-meta > span { margin: 0 10px 0 0; } .entry-meta > span a , .single-post-meta > span a, .entry-footer > span a{ } .page-content, .entry-content, .entry-summary { margin: 15px 0 0; } footer.entry-footer { margin-top: 15px; overflow: hidden; } .entry-meta > span::before, .entry-footer > span::before, .single-post-meta > span::before { display: inline-block; font-family: FontAwesome; height: 15px; margin-right: 8px; content: ""; color: #666; } .entry-meta .byline .author.vcard { margin-left: -4px; } .entry-footer span { margin-right: 15px; float: left; display: block; } span.comments-link::before { content: "\f086"; } .entry-meta .posted-on::before, .single-post-meta .posted-on::before { content: "\f017 "; } .entry-footer > .cat-links::before { content: "\f07c"; } .entry-meta .byline::before, .single-post-meta .byline::before { content: "\f007"; } .entry-footer .edit-link::before{ content: "\f044"; } .entry-footer .tags-links::before{ content: "\f02c"; } /*========================================================== ********************** Asides ******************** ===========================================================*/ .blog .format-aside .entry-title, .archive .format-aside .entry-title { display: none; } /*========================================================== ********************** Comments ******************** ===========================================================*/ #respond { clear: both; display: block; float: left; width: 97%; } .comment-content a { word-wrap: break-word; } .bypostauthor { display: block; } .comments-area form#commentform p { float: left; width:100%; } .comments-area #commentform p.comment-notes, .comments-area #commentform p.comment-form-comment { width: 100%; } .comment-content a { word-wrap: break-word; } .bypostauthor { display: block; } .comment-form-author input, .comment-form-email input, .comment-form-url input{ width: 100%; } #tab-reviews .comment-form-author, #tab-reviews .comment-form-email, #tab-reviews .comment-form-url{ width: 100%; } .comments-area form#commentform p.logged-in-as { width: 100%; } .comment-form-author, .comment-form-email, .comment-form-url{ width: 100%; float: left; } .comment-list li.comment::after { content: inherit; display: none; } .comment-list li{ padding-left: 0; } .comment { background-position: 0 -74px; display: block; float: left; width: 100%; } ol.comment-list { border-radius: 5px; float: left; margin-bottom: 15px; margin-left: 0; margin-right: 0; overflow: inherit; padding: 0; width: 100%; } ol.comment-list .children { border: medium none; float: left; margin: 15px 0 15px 15px; width: 98%; } ol.comment-list li { list-style: outside none none; margin-bottom: 15px; } .comment .comment-body { background-color: #ffffff; border: 1px solid #dddddd; border-radius: 0; clear: both; display: block; float: left; margin-top: 5px; padding: 10px 30px 10px 70px; position: relative; text-align: left; width: 100%; } .comment-author.vcard { font-size: 20px; margin-bottom: 5px; } .comment-list .children { background-position: left 20px; background-repeat: no-repeat; border-left: 1px solid rgb(238, 238, 238); margin-left: 0; padding-left: 40px; } .comment-list li.comment > div img.avatar { left: 29px; position: absolute; top: 29px; } #comment-form-title { font-size: 24px; padding-bottom: 10px; } .vcard .avatar { float: left; margin: 7px 15px 15px 0; } .comment-metadata { margin-bottom: 10px; } .comment-reply-link { color: #ffffff; display: inline-block; float: none; font-size: 15px; line-height: 1.5; margin-bottom: 10px; padding: 1px 15px 3px; border-radius: 2px; } a.comment-reply-link:hover { color: #fff; } .form-allowed-tags code { white-space: inherit; word-wrap: break-word; } .comments-title { font-weight: normal; margin: 25px 0 0; } .comment-content a { word-wrap: break-word; } .bypostauthor { display: block; } #commentform label { display: inline-block; } span.required { color: red; } .comment-form input[type="checkbox"], .comment-form input[type="radio"] { margin-right: 10px; } .comment-form .form-submit { margin-top: 15px; } /*========================================================== ********************** Infinite scroll ******************** ===========================================================*/ /* Globally hidden elements when Infinite Scroll is supported and in use. */ .infinite-scroll .posts-navigation, /* Older / Newer Posts Navigation (always hidden) */ .infinite-scroll.neverending .site-footer { /* Theme Footer (when set to scrolling) */ display: none; } /* When Infinite Scroll has reached its end we need to re-display elements that were hidden (via .neverending) before. */ .infinity-end.neverending .site-footer { display: block; } /*========================================================== ********************** Media ******************** ===========================================================*/ .page-content .wp-smiley, .entry-content .wp-smiley, .comment-content .wp-smiley { border: none; margin-bottom: 0; margin-top: 0; padding: 0; } /* Make sure embeds and iframes fit their containers. */ embed, iframe, object { max-width: 100%; } /*========================================================== ********************** Captions ******************** ===========================================================*/ .wp-caption { margin-bottom: 1.5em; max-width: 100%; } .wp-caption img[class*="wp-image-"] { display: inline-block; margin-left: auto; margin-right: auto; } .wp-caption .wp-caption-text { margin: 0.8075em 0; } .wp-caption-text { text-align: center; } /*========================================================== ********************** Galleries ******************** ===========================================================*/ .gallery { margin-bottom: 1.5em; margin-left: -5px; margin-right: -5px; } .gallery-item { display: inline-block; text-align: center; vertical-align: top; width: 100%; margin: 0; padding: 5px; } .gallery-item img { vertical-align: middle; } .gallery-columns-2 .gallery-item { max-width: 50%; } .gallery-columns-3 .gallery-item { max-width: 33.33%; } .gallery-columns-4 .gallery-item { max-width: 25%; } .gallery-columns-5 .gallery-item { max-width: 20%; } .gallery-columns-6 .gallery-item { max-width: 16.66%; } .gallery-columns-7 .gallery-item { max-width: 14.28%; } .gallery-columns-8 .gallery-item { max-width: 12.5%; } .gallery-columns-9 .gallery-item { max-width: 11.11%; } .gallery-caption { display: block; } /*=========================================================== **************************** Social Links ********************* ===========================================================*/ .business_club_widget_social { clear: both; overflow: hidden; } .business_club_widget_social ul { margin: 0; } .business_club_widget_social li a { background-color: #333; border: medium none; display: inline-block; height: 38px; line-height: 1.7; margin-right: 0; padding: 0; text-align: center; vertical-align: middle; width: 38px; } .business_club_widget_social li { display: block; float: left; margin-right: 5px; margin-bottom: 5px; } .widget-area .business_club_widget_social li, #footer-widgets .business_club_widget_social li { padding: 0; } .widget-area .business_club_widget_social li::before, #footer-widgets .business_club_widget_social li::before { display: none; } .business_club_widget_social li a i { color:#cacad8; font-size: 18px; font-weight: normal; } .business_club_widget_social ul li a::before { color: #ffffff; content: "\f0c1"; display: block; font-family: FontAwesome; font-weight: normal; line-height: 2.8; font-size: 14px; } .business_club_widget_social ul li a:hover { background-color:#cacad8; } .business_club_widget_social ul li a:hover::before { color: #fff; } .business_club_widget_social ul li a[href*="facebook.com"]::before { content: "\f09a"; } .business_club_widget_social ul li a[href*="twitter.com"]::before { content: "\f099"; } .business_club_widget_social ul li a[href*="linkedin.com"]::before { content: "\f0e1"; } .business_club_widget_social ul li a[href*="plus.google.com"]::before { content: "\f0d5"; } .business_club_widget_social ul li a[href*="youtube.com"]::before { content: "\f167"; } .business_club_widget_social ul li a[href*="dribbble.com"]::before { content: "\f17d"; } .business_club_widget_social ul li a[href*="pinterest.com"]::before { content: "\f0d2"; } .business_club_widget_social ul li a[href*="bitbucket.org"]::before { content: "\f171"; } .business_club_widget_social ul li a[href*="github.com"]::before { content: "\f113"; } .business_club_widget_social ul li a[href*="codepen.io"]::before { content: "\f1cb"; } .business_club_widget_social ul li a[href*="flickr.com"]::before { content: "\f16e"; } .business_club_widget_social ul li a[href$="/feed/"]::before { content: "\f09e"; } .business_club_widget_social ul li a[href*="foursquare.com"]::before { content: "\f180"; } .business_club_widget_social ul li a[href*="instagram.com"]::before { content: "\f16d"; } .business_club_widget_social ul li a[href*="tumblr.com"]::before { content: "\f173"; } .business_club_widget_social ul li a[href*="reddit.com"]::before { content: "\f1a1"; } .business_club_widget_social ul li a[href*="vimeo.com"]::before { content: "\f194"; } .business_club_widget_social ul li a[href*="digg.com"]::before { content: "\f1a6"; } .business_club_widget_social ul li a[href*="twitch.tv"]::before { content: "\f1e8"; } .business_club_widget_social ul li a[href*="stumbleupon.com"]::before { content: "\f1a4"; } .business_club_widget_social ul li a[href*="delicious.com"]::before { content: "\f1a5"; } .business_club_widget_social ul li a[href*="mailto:"]::before { content: "\f0e0"; } .business_club_widget_social ul li a[href*="soundcloud.com"]::before { content: "\f1be"; } .business_club_widget_social ul li a[href*="wordpress.org"]::before { content: "\f19a"; } .business_club_widget_social ul li a[href*="wordpress.com"]::before { content: "\f19a"; } .business_club_widget_social ul li a[href*="jsfiddle.net"]::before { content: "\f1cc"; } .business_club_widget_social ul li a[href*="tripadvisor.com"]::before { content: "\f262"; } .business_club_widget_social ul li a[href*="foursquare.com"]::before { content: "\f180"; } .business_club_widget_social ul li a[href*="angel.co"]::before { content: "\f209"; } .business_club_widget_social ul li a[href*="slack.com"]::before { content: "\f198"; } /*social links hover effect */ .business_club_widget_social ul li a[href*="facebook.com"]:hover { background-color: #3b5998; } .business_club_widget_social ul li a[href*="twitter.com"]:hover { background-color: #00aced; } .business_club_widget_social ul li a[href*="plus.google.com"]:hover { background-color: #dd4b39; } .business_club_widget_social ul li a[href*="/feed/"]:hover { background-color: #dc622c; } .business_club_widget_social ul li a[href*="wordpress.org"]:hover { background-color: #21759b; } .business_club_widget_social ul li a[href*="github.com"]:hover { background-color: #4183c4; } .business_club_widget_social ul li a[href*="linkedin.com"]:hover { background-color: #007bb6; } .business_club_widget_social ul li a[href*="pinterest.com"]:hover { background-color: #cb2027; } .business_club_widget_social ul li a[href*="flickr.com"]:hover { background-color: #ff0084; } .business_club_widget_social ul li a[href*="vimeo.com"]:hover { background-color: #aad450; } .business_club_widget_social ul li a[href*="youtube.com"]:hover { background-color: #bb0000; } .business_club_widget_social ul li a[href*="instagram.com"]:hover { background-color: #517fa4; } .business_club_widget_social ul li a[href*="dribbble.com"]:hover { background-color: #ea4c89; } .business_club_widget_social ul li a[href*="skype.com"]:hover { background-color: #12a5f4; } .business_club_widget_social ul li a[href*="digg.com"]:hover { background-color: #333; } .business_club_widget_social ul li a[href*="codepen.io"]:hover { background-color: #000; } .business_club_widget_social ul li a[href*="reddit.com"]:hover { background-color: #ff4500; } .business_club_widget_social ul li a[href*="mailto:"]:hover { background-color: #1d62f0; } .business_club_widget_social ul li a[href*="foursquare.com"]:hover { background-color: #f94877; } .business_club_widget_social ul li a[href*="stumbleupon.com"]:hover { background-color: #eb4924; } .business_club_widget_social ul li a[href*="twitch.tv"]:hover { background-color: #6441a5; } .business_club_widget_social ul li a[href*="tumblr.com"]:hover { background-color: #32506d; } .business_club_widget_social ul li a[href*="foursquare.com"]:hover { background-color: #f94877; } .business_club_widget_social ul li a[href*="stumbleupon.com"]:hover { background-color: #eb4924; } .business_club_widget_social ul li a[href*="twitch.tv"]:hover { background-color: #6441a5; } .business_club_widget_social ul li a[href*="tumblr.com"]:hover { background-color: #32506d; } .business_club_widget_social ul li a[href*="soundcloud.com"]:hover { background-color: #ff5500; } .business_club_widget_social ul li a[href*="wordpress.org"]:hover { background-color:#21759b; } .business_club_widget_social ul li a[href*="jsfiddle.net"]:hover { background-color:#4679bd; } .business_club_widget_social ul li a[href*="tripadvisor.com"]:hover { background-color:#86c171; } .business_club_widget_social ul li a[href*="foursquare.com"]:hover { background-color:#2d5be3; } .business_club_widget_social ul li a[href*="angel.co"]:hover { background-color:#000; } .business_club_widget_social ul li a[href*="slack.com"]:hover { background-color:#56b68b; } /*========================================================== ********************** Page ******************** ===========================================================*/ #page { position: relative; margin: 0 auto; } .container { width: 1200px; margin: 0 auto; padding-left: 20px; padding-right: 20px; max-width: 100%; } .inner-wrapper { margin-left: -20px; margin-right: -20px; } /*========================================================== ********************** Tophead Style ******************** ===========================================================*/ /*quick contact*/ #tophead { background-color: #10181d; clear: both; width: 100%; } #header-social { float: right; } #header-social li { border-right: 1px solid rgba(255, 255, 255, 0.15); display: inline-block; padding: 10px 12px; margin: 0; } #header-social li:first-child { border-left: 1px solid rgba(255, 255, 255, 0.15); } #header-social .business_club_widget_social ul li a::before { line-height: 1.5; font-size: 16px; color: rgba(255, 255, 255, 0.54); font-weight: normal; } #header-social .business_club_widget_social li a { background: rgba(0, 0, 0, 0) none repeat scroll 0 0; height: 25px; width: 10px; } #header-social .business_club_widget_social ul li a:hover::before { color: #fff; } .right-head { float: right; padding: 35px 0; margin-left: 15px; } .cart-section { float: right; margin-right: 20px; position: relative; } .cart-section i.fa.fa-shopping-cart { font-size: 22px; } .cart-section span.cart-value { position: absolute; top: -18px; left: 3px; background: #ffbe00; color: #fff; border-radius: 100%; min-height: 20px; min-width: 20px; font-size: 12px; text-align: center; } #quick-contact { float: left; margin-top: 0; } #quick-contact > ul { margin: 0; padding: 0; } #quick-contact a { color: #ffffff; display: inline-block; padding: 11px 5px; } #quick-contact li.quick-email::before { content: "\f0e0"; } #quick-contact li.quick-call::before { content: "\f2a0"; } #quick-contact li::before { color: #fff; content: ""; display: inline-block; font-family: FontAwesome; font-size: 14px; margin-right: 6px; padding: 8px 0; text-align: center; width: 29px; border: 1px solid #606765; text-align: center; } #quick-contact li { clear: inherit; float: left; font-size: 14px; line-height: 0.8; list-style: outside none none; margin-top: 5px; padding: 0 5px 5px 0; text-align: left; margin-right: 15px; } /*========================================================== ********************** Header Style ******************** ===========================================================*/ #masthead { background: #fff none repeat scroll 0 0; clear: both; top: 15px; width: 100%; z-index: 99999; -moz-transition: all 0.5s ease-in-out; -webkit-transition: all 0.5s ease-in-out; transition: all 0.5s ease-in-out; } .right-head { float: right; margin-left: 15px; padding: 36px 0; } /*sticky menu*/ #site-identity { float: left; } #custom-logo-link { max-width: 300px; } .site-branding { color: #222222; float: left; font-size: 36px; font-weight: 500; line-height: 0.8; margin-bottom: 0; margin-right: 30px; } #site-identity { float: left; margin-top: 25px; } .site-branding a { color: #179bd7; } .site-branding a:hover { color: #ffbe00; } .custom-logo-link { float: left; max-width: 95px; margin-right: 15px; } .site-title { font-size: 27px; font-weight: bold; float: left; margin-bottom: 10px; line-height: 1; margin-bottom: 7px; font-family: "Poppins", sans-serif; } .site-description { font-size: 14px; font-style: inherit; font-weight: 400; clear: both; } .header-search-box { float: right; position: relative; } .header-search-box > a { color: #001837; display: block; } .header-search-box > a i { font-size: 17px; } .header-search-box > a:hover { color: #4fc3dd; } .header-search-box .search-box-wrap { background: rgb(243, 243, 243) none repeat scroll 0 0; top: 59px; box-shadow: 0 2px 2px; display: none; padding: 12px; position: absolute; right: 7%; width: 300px; z-index: 9999; right: 3%; border-top: 5px solid #179bd7; } .right-head .header-search-box .search-box-wrap { width:300px; } .search-form input.search-field, .woocommerce-product-search .search-field { border: 1px solid #dddddd; height: auto; padding: 7px 10px; width: 100%; box-sizing: inherit; } .search-box-wrap .search-form input.search-field { color: #222222; } .search-form, .woocommerce-product-search { position: relative; } .search-form .search-submit, .woocommerce-product-search button { border: medium none; border-radius: 0; font-size: 13px; height: 37px; line-height: 1.8; padding: 0 20px; position: absolute; right: 0; top: 0; font-family: FontAwesome; } .woocommerce-product-search button { font-family: inherit; } /*=========================================================== **************************** Navigation ********************* ===========================================================*/ #main-nav { float: right; width: auto; } .main-navigation ul { display: block; margin: 0; padding: 0; } .main-navigation ul ul { position: absolute; top: 100%; left: 0; z-index: 1000; min-width: 235px; -webkit-transform-origin: top; transform-origin: top; -webkit-animation-fill-mode: forwards; animation-fill-mode: forwards; -webkit-transform: scale(1, 0); transform: scale(1, 0); display: block; opacity: 0; transition: transform 0.5s ease, opacity 0.2s ease; -webkit-transition: -webkit-transform 0.5s ease, opacity 0.2s ease; background-color: #fff; box-shadow: 1px 1px 2px #888; } .main-navigation ul li:hover > ul.sub-menu{ display: block; opacity: 1; z-index: 1000; -webkit-transform: scale(1, 1); transform: scale(1, 1); transition: transform 0.3s ease, opacity 0.2s ease .1s; -webkit-transition: -webkit-transform 0.3s ease, opacity 0.2s ease .1s; } .main-navigation ul ul ul { left:100%; top: 0 } .main-navigation li { display: inline-block; float: left; margin-bottom: 0; position: relative; } .main-navigation li li { float: none; display: block; } .main-navigation ul li li:first-child > a { border-left: none; } .main-navigation ul li a { color: #222222; display: block; font-size: 15px; padding: 36px 15px; position: relative; z-index: 99; } .main-navigation ul ul a { border-bottom: 1px solid rgba(221, 221, 221, 0.34); border-left: medium none; border-right: medium none; height: auto; padding: 7px 20px; text-align: left; width: 100%; font-size: 14px; color: #666; } .main-navigation ul ul li:last-child a { border: none; } .main-navigation ul li.menu-item-has-children > a::after, .main-navigation ul li.page_item_has_children > a::after { content: "\f107"; font-family: FontAwesome; margin-left: 10px; margin-right: 0; position: absolute; right: 10px; top: 36px; } .main-navigation ul li li.menu-item-has-children > a::after, .main-navigation ul li li.page_item_has_children > a::after { content: "\f105"; top: 10px; } .main-navigation ul li.menu-item-has-children a, .main-navigation ul li.page_item_has_children a { padding-right: 30px; } .main-navigation li a:hover, .main-navigation li.current-menu-item > a, .main-navigation li.current_page_item > a, .main-navigation li:hover > a { background: #179bd7 none repeat scroll 0 0; color: #ffffff; } .main-navigation ul ul li a:hover, .main-navigation ul ul li.current-menu-item a, .main-navigation ul ul li.current_page_item a, .main-navigation ul ul li:hover > a { color: #179bd7; background-color:inherit; } .main-navigation .menu-toggle, .main-navigation .dropdown-toggle { display: none; } /*========================================================== ********************** Main slider ******************** ===========================================================*/ #featured-slider { overflow: hidden; position: relative; clear: both; } #main-slider { clear: both; position: relative; z-index: 999; } #main-slider img { width: 100%; vertical-align: middle; } #main-slider article { width: 100%; display: none; } #main-slider article.first { display: block; } #main-slider .cycle-slideshow { margin-bottom: 0; padding: 0; } #main-slider .cycle-caption { bottom: 32%; left: 20%; max-width: 100%; position: absolute; right: 0; white-space: normal; width: 60%; z-index: 9999; text-align: center; } #main-slider h3 { font-size: 42px; font-weight: 600; line-height: 1.5; margin-bottom: 20px; text-shadow: 1px 2px 1px #222222; text-transform: uppercase; } #main-slider a, #main-slider h3 { color: #ffffff; } #main-slider p { color: #fff; font-size: 17px; font-weight: 400; margin-bottom: 5px; } #main-slider article:before { background: url(images/overlay.png); content: ""; opacity: 0.6; display: block; position: absolute; height: 100%; top: 0; z-index: 991; width: 100%; } /*slider pager box*/ #main-slider .cycle-pager { bottom: 40px; left: 0; position: absolute; z-index: 999; width: 100%; text-align: center; } #main-slider .pager-box { background-color: #fff; cursor: pointer; display: inline-block; float: none; height: 7px; margin: 0 3px; width: 25px; z-index: 99; } #main-slider .pager-box.cycle-pager-active, #main-slider .pager-box:hover { background-color: #179bd7 ; } /*Slider cycle next / previous*/ #main-slider .cycle-prev, #main-slider .cycle-next { color: #ffffff; cursor: pointer; display: block; font-weight: normal; line-height: 0.8; padding: 5px 15px; text-align: center; z-index: 999; position: absolute; top: 48%; } #main-slider .cycle-prev:hover, #main-slider .cycle-next:hover { background: #038fd6 none repeat scroll 0 0; } #main-slider .cycle-prev { left: 50px; } #main-slider .cycle-next { right:50px; } #main-slider .cycle-prev i, #main-slider .cycle-next i { font-size: 34px; } #main-slider .slider-buttons a { border: 2px solid rgba(255, 255, 255, 0.87); color: #ffffff; display: inline-block; font-size: 19px; line-height: 1.5; margin: 6px 15px 0; padding: 8px 20px; min-width: 125px; font-size: 15px; text-transform: uppercase; } span.divider-button { color: #fff; display: inline-block; margin-right: 15px; font-size: 21px; margin-left: 5px; } #main-slider .slider-buttons { margin-top: 30px; } #main-slider .slider-buttons a.button-primary { background: #179bd7; border-color: #179bd7; } #main-slider .slider-buttons a:hover { background: #ffbe00; color: #fff; border-color: #ffbe00; } #main-slider .cycle-slide.cycle-slide-active{ z-index:150 !important; } /*=========================================================== **************************** Main Content ******************* ===========================================================*/ #primary { width: 67%; padding-left: 20px; padding-right: 20px; float: left; } #content { padding: 40px 0; clear: both; } .page-template-front #content { display: none; } .elementor-template-full-width #content { padding: 0; } .blog #masthead { border-bottom: 3px solid #ddd; } #featured-content{ float: left; width: 100%; } #primary img.business-club-post-thumb { margin: 0 auto; display: block; vertical-align: middle; width: 100%; } /*=========================================================== **************************** Sidebar ******************* ===========================================================*/ .sidebar { width: 33%; padding-left: 20px; padding-right: 20px; } .sidebar .widget { background: #fff; padding: 20px 30px; box-shadow: 6px 7px #ddd; } .page-header { background: #fff; padding: 15px 30px; box-shadow: 6px 7px #ddd; border: 1px solid #f1f0f0; } .page-header h1 { margin-bottom: 0; font-size: 25px; font-weight: 500; text-align: center; } .taxonomy-description { text-align: center; } #primary .site-main article { background: #fff; box-shadow: 6px 7px #ddd; border: 1px solid #f1f0f0; border-top: inherit; margin-bottom: 30px; } h1.entry-title { margin-bottom: 0; } #primary .site-main article .entry-header, #primary .site-main article .entry-content, #primary .site-main article .entry-footer, #primary .site-main article .entry-summary { padding: 20px 30px; border-top: 1px solid #f1f0f0; margin-top: 0; text-align: center; } #primary .site-main .page-title { padding: 20px 30px; margin-top: 0; text-align: center; } #primary .site-main article .entry-title, #primary .site-main .page-title { position: relative; } #primary .site-main article .entry-title::after { content: ""; display: block; width: 60px; height: 1px; background-color: #179bd7; margin: 0 auto; margin-top: 5px; } #primary .site-main article .entry-content { text-align: left; } #primary .site-main .entry-footer a.read-more { float: right; } .sidebar .widget-title { border-bottom: 1px solid #f1f0f0; text-align: center; margin-left: -30px; margin-right: -30px; padding-bottom: 5px; font-weight: 400; font-size: 18px; position: relative; color: #179bd7; } .sidebar .widget-title:after { background: #dadada; position: absolute; bottom: -2px; content: ""; width: 20%; height: 3px; left: 40%; } #sidebar-primary { float: right; } .sidebar a.read-more { font-size: 13px; } .sidebar a.read-more::before { font-size: 10px; } #sidebar-secondary { float: left; } .widget-area .widget::after, .widget-area .widget::before { clear: both; content: ""; display: table; } .widget-area ul { list-style: outside none none; padding: 0; margin: 0; } .widget-area ul ul { border-bottom:none; padding-bottom: 0; } .widget-area ul li { padding-bottom: 5px; padding-left: 15px; padding-top: 5px; position: relative; } .widget-area ul li::before { content: "\f178"; display: inline-block; font-family: FontAwesome; font-size: 9px; left: 0; position: absolute; top: 10px; } .widget-area ul ul ul ul ul > li { padding-left: 0; } .widget-area ul ul ul ul ul > li::before { left:-20px; } .widget_calendar caption { background: #179bd7 none repeat scroll 0 0; color: #ffffff; padding: 5px; } /*=========================================================== **************************** Footer ******************* ===========================================================*/ #colophon { background-color: #2a2a2a; clear: both; color: rgba(255, 255, 255, 0.75); font-size: 14px; padding: 15px 0; text-align: center; } #colophon a { color:#ccc; } #colophon a:hover { color:#ffbe00; } #colophon .copyright { margin-bottom: 5px; } /*=========================================================== **************************** Footer Widgets ***************** ===========================================================*/ #footer-widgets { background: #232323; overflow: hidden; padding: 70px 0; color: rgba(255, 255, 255, 0.75); } #footer-widgets ul { list-style: none; margin: 0; } #footer-widgets ul li { font-size: 14px; letter-spacing: 0.5px; padding: 0px 15px 0 20px; position: relative; } #footer-widgets ul li::before { color: rgba(255, 255, 255, 0.75); content: "\f178"; display: inline-block; font-family: FontAwesome; font-size: 11px; left: 0; position: absolute; top: 5px; font-weight: 100; } #footer-widgets a:hover { color:#ffbe00; } #footer-widgets .widget-column { float: left; padding: 0 25px; width: 25%; } #footer-widgets a { color:rgba(255, 255, 255, 0.75); } #footer-widgets .footer-active-1 { width: 100%; } #footer-widgets .footer-active-2 { width: 50%; } #footer-widgets .footer-active-3 { width: 33.33%; } #footer-widgets .footer-active-4 { width: 25%; } #footer-widgets .widget-column { float: left; padding: 0 20px; } #footer-widgets .widget-title { color: #ffffff; font-size: 19px; font-weight: 500; } h3.widget-title::after { content: ""; display: block; background: #fff; width: 20%; height: 3px; margin-top: 5px; margin-bottom: 20px; } /*=========================================================== *********************** layout sidebar ***************** ===========================================================*/ .global-layout-left-sidebar #primary { float: right; } .three-columns-enabled #primary { display: inline-block; float: none; width: 50%; } .global-layout-three-columns #sidebar-primary{ float: right; } .global-layout-three-columns .sidebar { width: 25%; } .global-layout-no-sidebar #primary{ width: 100%; } /*=========================================================== *********************** Footer Navigation ***************** ===========================================================*/ #footer-navigation li { display: inline-block; list-style: outside none none; } #footer-navigation li a { color: #ffffff; display: block; padding: 5px 10px; } #footer-navigation ul { margin: 0; } /*Scrollup Style*/ .scrollup { background-color: #179bd7; bottom: 50px; color: #ffffff; display: none; float: right; line-height: 1.2; padding: 5px 10px; position: fixed; right: 32px; text-align: center; } .scrollup:hover { background-color:#333; } .scrollup i { color:#fff; font-size:32px; } /*=========================================================== *********************** Error 404 Page ***************** ===========================================================*/ section.error-404 { text-align: center; } #quick-links-404 ul li { display: inline-block; list-style: outside none none; } #quick-links-404 ul li a { color: #404040; display: block; padding: 5px 10px; } .error404 #primary { width: 100%; } .error404 .search-form { max-width: 300px; margin: 10px auto; } /*contact form 7*/ .wpcf7-form { max-width: 875px; } div.wpcf7 { margin: 0 auto; padding: 0; } .wpcf7 input { width: 100%; } .wpcf7 input.wpcf7-submit { width: auto; } /*=========================================================== *********************** Breadcrumb ***************** ===========================================================*/ #breadcrumb { background: #ffffff none repeat scroll 0 0; padding: 15px 0; border-bottom: 1px solid #dddddd; border-top: 3px solid #179bd7; } #breadcrumb { overflow: hidden; } #breadcrumb li { display: block; float: left; list-style: outside none none; padding-right: 10px; } #breadcrumb li.trail-item.trail-end::after { display: none; } #breadcrumb ul { margin: 0; padding: 0; } #breadcrumb li::after { content: "/"; margin-left: 10px; } #breadcrumb li:last-child::after { content: ""; } #breadcrumb .trail-items { margin: 0; padding: 0; } /*=========================================================== *********************** Front Page Widget ***************** ===========================================================*/ #sidebar-front-page-widget-area { clear: both; background: #fff; } #sidebar-front-page-widget-area .widget { padding: 40px 0; margin-top: 0; } #sidebar-front-page-widget-area .widget:first-child { margin-top: 0; } /*=========================================================== *********************** Service Widget ***************** ===========================================================*/ .services-layout-1.business_club_widget_services .service-block-item { float: left; padding:20px; transition: all 0s ease-in-out 0s; text-align: center; } .services-layout-1.business_club_widget_services .service-block-inner { padding: 20px 15px 15px; border: 1px solid #fff; background-color: #fff; transition:all 0.2s ease 0s; } .services-layout-1.business_club_widget_services .service-block-inner:hover a{ color: #179bd7; } .services-layout-1.business_club_widget_services .service-block-item i { border-radius: 100%; display: block; font-size: 30px; font-weight: normal; position: relative; transform: rotate(45deg); color: #fff; } .services-layout-1.business_club_widget_services .service-block-inner > a { display: block; text-align: center; width: 70px; transition: all 0.3s ease-in-out 0s; margin: 0 auto 20px; height: 70px; padding: 20px 0; margin-top: 25px; background: #5a95f5; transform: rotate(-45deg); } aside.services-layout-1.business_club_widget_services { background: #f5f8fa; } .services-layout-1.business_club_widget_services .service-block-inner-content { display: table; padding: 15px 10px 15px; } .services-layout-1.business_club_widget_services .service-item-title { margin-bottom: 10px; } .services-layout-1.business_club_widget_services .service-block-item .custom-button { background: rgba(0, 0, 0, 0) none repeat scroll 0 0; border: medium none; box-shadow: none; color: #222222; margin: 0; padding: 0; } .services-layout-1.business_club_widget_services .service-block-item .custom-button:hover { background:none; } .services-layout-1.business_club_widget_services .service-block-inner:hover { box-shadow: 2px 2px 20px 2px rgba(0, 0, 0, 0.3); z-index: 1; } .business_club_widget_services .service-block-inner { padding: 0 15px 30px; } .services-layout-1.business_club_widget_services .service-col-4 .service-block-item { width: 25%; } .services-layout-1.business_club_widget_services .service-col-3 .service-block-item { width: 33.33%; } .services-layout-1.business_club_widget_services .service-col-2 .service-block-item { width: 50%; } .services-layout-1.business_club_widget_services .service-col-4 .service-block-item:nth-child(4n+1), .services-layout-1.business_club_widget_services .service-col-3 .service-block-item:nth-child(3n+1), .services-layout-1.business_club_widget_services .service-col-2 .service-block-item:nth-child(2n+1) { clear: both; } .sidebar .services-layout-1.business_club_widget_services .service-block-item, #footer-widgets .service-block-item{ width: 100%; } .sidebar .services-layout-1.business_club_widget_services a.custom-button:hover { color: #fff; } /*=========================================================== *********************** call to action Widget ************** ===========================================================*/ #sidebar-front-page-widget-area .cta-layout-1.business_club_widget_call_to_action { margin-top: 30px; } .cta-layout-1.business_club_widget_call_to_action { background: #00aef0 none repeat scroll 0 0; padding: 30px 0; text-align: center; max-width: 1160px; margin: 0 auto; margin-bottom: 30px; } .cta-layout-1 .call-to-action-content { float: left; clear: both; padding-left: 60px; } .cta-layout-1 .call-to-action-content p { color: #fff; } .cta-layout-1.business_club_widget_call_to_action .call-to-action-buttons { float: right; } .cta-layout-1.business_club_widget_call_to_action .button:hover { background-color: #fff; } .cta-layout-1.business_club_widget_call_to_action .cta-content { float: left; text-align: left; width: 69%; } .cta-layout-1.business_club_widget_call_to_action p { color: #fff; text-align: center; } .cta-layout-1.business_club_widget_call_to_action .widget-title { margin-bottom: 0; text-align: left; border: none; padding: 0; font-weight: 500; font-size: 27px; padding-left: 60px; color: #fff; } .sidebar .cta-layout-1.business_club_widget_call_to_action .cta-content, #footer-widgets .cta-layout-1.business_club_widget_call_to_action .cta-content { float: left; text-align: left; width: 100%; } .sidebar .cta-layout-2.business_club_widget_call_to_action .call-to-action-buttons , #footer-widgets .cta-layout-2.business_club_widget_call_to_action .call-to-action-buttons{ margin-top: 15px; } .sidebar .cta-layout-1.business_club_widget_call_to_action .widget-title { font-size: 18px; padding-left: 0; margin: 0; text-align: center; margin-bottom: 15px; margin-bottom: 40px; padding-bottom: 30px; } .sidebar .cta-layout-1.business_club_widget_call_to_action { padding: 30px; text-align: center; } .sidebar .cta-layout-2.business_club_widget_call_to_action .button, .sidebar .cta-layout-1.business_club_widget_call_to_action .button, #footer-widgets .cta-layout-2.business_club_widget_call_to_action .button, #footer-widgets .cta-layout-1.business_club_widget_call_to_action .button { margin: 5px 3px; width: 100%; text-align: center; line-height: 1.5; border-radius: 0; padding: 10px 20px; font-weight: normal; } .sidebar .cta-layout-2.business_club_widget_call_to_action, #footer-widgets .cta-layout-2.business_club_widget_call_to_action { padding: 30px; } .sidebar .cta-layout-1.business_club_widget_call_to_action .call-to-action-buttons, #footer-widgets .cta-layout-1.business_club_widget_call_to_action .call-to-action-buttons { float: none; } #footer-widgets .cta-layout-1.business_club_widget_call_to_action { background-color: inherit; } #footer-widgets .cta-layout-1.business_club_widget_call_to_action .widget-title { padding: 0; } /*call to action Layout 2*/ .business_club_widget_call_to_action a.button.cta-btn-secondary { background: #ffffff; color: #222; } .business_club_widget_call_to_action .button { border-radius: 0; color: #ffffff; padding: 10px 20px; transition: all 0.2s ease 0s; display: inline-block; margin: 0 15px; font-size: 15px; } .business_club_widget_call_to_action .button.cta-button-secondary { background: #ffbe00; color: #fff; } .cta-layout-2.business_club_widget_call_to_action .button.cta-btn-primary { background-color: #179bd7; } .cta-layout-1.business_club_widget_call_to_action .button:hover, .cta-layout-2.business_club_widget_call_to_action .button:hover { color:#222; background-color: #fff; } .cta-layout-2.business_club_widget_call_to_action .cta-content { float: none; text-align: center; width: 100%; } #sidebar-front-page-widget-area .cta-layout-2.business_club_widget_call_to_action::before { background: rgba(0, 0, 0, 0.6); content: ""; height: 100%; position: absolute; width: 100%; top:0; left: 0; z-index: -1; display: block; } .cta-layout-2.business_club_widget_call_to_action::after { display: block; } .cta-layout-2.business_club_widget_call_to_action { background-position: 50% 50%; background-repeat: no-repeat; background-attachment: fixed; -webkit-background-size: cover; -moz-background-size: cover; -o-background-size: cover; background-size: cover; position: relative; z-index: 22; background: #179bd7 none repeat scroll 0 0; padding: 70px 0; text-align: center; } #sidebar-front-page-widget-area .cta-layout-2.business_club_widget_call_to_action { padding: 70px 0; } .cta-layout-2.business_club_widget_call_to_action .widget-title { text-align: center; border: none; padding: 0; font-weight: normal; font-size: 30px; text-transform: uppercase; margin-bottom: 30px; color: #fff; } .cta-layout-2.business_club_widget_call_to_action p { font-size: 17px; color: #fff; } .cta-layout-2.business_club_widget_call_to_action .call-to-action-buttons { margin-top: 30px; } .cta-layout-2.business_club_widget_call_to_action .call-to-action-buttons { margin-top: 50px; float: none; clear: both; display: block; } /*-------------------------------------------------------------- ### Featured Page Widget --------------------------------------------------------------*/ .business_club_widget_featured_page img.alignleft { margin-right: 30px; vertical-align: middle; margin-bottom: 0; max-width: 50%; } .business_club_widget_featured_page img.alignright { margin-left: 30px; vertical-align: middle; margin-bottom: 0; max-width: 50%; } .business_club_widget_featured_page .entry-content { margin: 0; } .business_club_widget_featured_page .widget-title { text-align: inherit!important; } /*-------------------------------------------------------------- ### Advaneced recent post widget --------------------------------------------------------------*/ .business_club_widget_advanced_recent_posts .advanced-recent-posts-item { clear: both; margin-top: 20px; float: left; width: 100%; border-bottom: 1px solid #efefef; margin-top: 15px; padding-bottom: 15px; } .advanced-recent-posts-text-wrap { display: table-cell; } .advanced-recent-posts-summary p { margin-bottom: 5px; } .advanced-recent-posts-item:first-child { margin: 0; } .advanced-recent-posts-title { font-size: 15px; margin-bottom:0; } .business_club_widget_advanced_recent_posts .advanced-recent-posts-date { display: block; margin-bottom: 3px; font-size: 13px; } .business_club_widget_advanced_recent_posts .advanced-recent-posts-date::before{ display: inline-block; font-family: FontAwesome; height: 15px; margin-right: 8px; content:"\f017"; color: #666; font-size: 12px; } #sidebar-front-page-widget-area::after, #sidebar-front-page-widget-area::before, #sidebar-front-page-widget-area .widget::after, #sidebar-front-page-widget-area .widget::before { display: table; clear: both; content: ""; } #footer-widgets .advanced-recent-posts-item { border-top: 1px solid #3c3c3c; margin-left: 0; margin-right: 0; margin-top: 5px; padding-top: 5px; } #footer-widgets .advanced-recent-posts-item:first-child { margin: 0; padding: 0; border: none; } /*-------------------------------------------------------------- ### Latest News post widget --------------------------------------------------------------*/ .business_club_widget_latest_news .latest-news-wrapper{ background: #ffffff none repeat scroll 0 0; box-shadow: 0 2px 3px #dddddd; clear: both; overflow: hidden; } .business_club_widget_latest_news .latest-news-item { float: left; padding: 20px; margin-bottom: 0; } .business_club_widget_latest_news .latest-news-text-wrap { /* background: #fafafa none repeat scroll 0 0; */ padding: 25px; } .business_club_widget_latest_news .latest-news-item img { margin: 0; } .business_club_widget_latest_news .latest-news-title { line-height: 1.2; } .business_club_widget_latest_news .latest-news-meta { background: rgb(23, 155, 215) none repeat scroll 0 0; bottom: 0; color: #ffffff; padding: 10px 16px; text-align: center; width: 100%; overflow: hidden; } .business_club_widget_latest_news .latest-news-thumb { position: relative; overflow: hidden; } .business_club_widget_latest_news .latest-news-item img { vertical-align: middle; -webkit-transition: -webkit-transform 0.5s ease; -moz-transition: -moz-transform 0.5s ease; transition: transform 0.5s ease; margin-bottom: 0; } .business_club_widget_latest_news .latest-news-item:hover img { -webkit-transform: scale(1.1); -moz-transform: scale(1.1); -o-transform: scale(1.1); transform: scale(1.1); -webkit-transform-origin: center center; -moz-transform-origin: center center; -o-transform-origin: center center; transform-origin: center center; } .business_club_widget_latest_news .latest-news-title a { color: #253b80; display: block; } .business_club_widget_latest_news .latest-news-item img { vertical-align: middle; } .business_club_widget_latest_news .latest-news-title { font-weight: 500; font-size: 20px; } .business_club_widget_latest_news .latest-news-col-3 .latest-news-item { width: 33.33%; } .business_club_widget_latest_news .latest-news-col-4 .latest-news-item { width: 25%; } .business_club_widget_latest_news .latest-news-col-2 .latest-news-item { width: 50%; } .business_club_widget_latest_news .latest-news-col-1 .latest-news-item { width: 100%; } .home-section-latest-new .latest-news-meta { margin-bottom: 15px; } .business_club_widget_latest_news .latest-news-meta > span::before{ display: inline-block; font-family: FontAwesome; height: 15px; margin-right:4px; content: ""; } .business_club_widget_latest_news .latest-news-meta > span.posted-on { float: left; } .business_club_widget_latest_news .latest-news-meta > span.comments-link { float: right; } .business_club_widget_latest_news .latest-news-meta > span, .business_club_widget_latest_news .latest-news-meta > span a { color: #ffffff; font-size: 14px; font-weight: 400; } .business_club_widget_latest_news .latest-news-meta > span { display: inline-block; } .business_club_widget_latest_news .latest-news-meta.byline .author.vcard { margin-left: -4px; } .business_club_widget_latest_news .latest-news-meta span.comments-link::before { content: "\f086"; } .business_club_widget_latest_news .latest-news-meta > .cat-links::before { content: "\f07c"; } .business_club_widget_latest_news .latest-news-meta > .byline::before { content: "\f007"; } .business_club_widget_latest_news .latest-news-meta .edit-link::before{ content: "\f044"; } .business_club_widget_latest_news .latest-news-meta .tags-links::before{ content: "\f02c"; } .business_club_widget_latest_news .latest-news-meta > .posted-on::before{ content: "\f073"; } /*sidebar and footer widget area style*/ #footer-widgets .business_club_widget_latest_news .latest-news-item, .sidebar .business_club_widget_latest_news .latest-news-item{ margin-bottom: 15px; width: 100%; } .latest-news-widget a.button { display: inline-block; clear: both; width: 160px; text-align: center; margin: 0 auto; display: block; padding: 10px 20px; border-radius: 2px; margin-top: 30px; } .inner-wrapper::after, .inner-wrapper::before { content: ""; display: table; clear: both; } /*-------------------------------------------------------------- ## Custom Woocommerce --------------------------------------------------------------*/ .entry-content p.cart-empty { margin-bottom: 15px; } .woocommerce #primary .button, .woocommerce #review_form #respond .form-submit input { background: #179bd7!important; font-weight: normal; border-radius: 0; color: #fff; } .woocommerce #primary .button:hover, .woocommerce #review_form #respond .form-submit input:hover { background-color: #ffbe00!important; } .woocommerce div#primary #main { background: #fff; box-shadow: 6px 7px #ddd; border: 1px solid #f1f0f0; border-top: inherit; margin-bottom: 30px; padding:20px; } .authorbox { background: #ffffff none repeat scroll 0 0; margin-top: 20px; overflow: hidden; padding: 15px; } .authorbox img { border-radius: 100%; } .authorbox .author-avatar { float: left; margin: 5px 15px 10px 0; } .authorbox.no-author-avatar .author-info { margin-left: 0; } .authorbox .author-bio-posts-content { margin-top: 10px; } .authorbox .author-bio-posts-content p { margin: 0; } .authorbox .author-bio-posts-content ul { list-style-position: inside; margin: 0; } .woocommerce span.onsale { background-color: orange; } .woocommerce .products .star-rating { display: inline-block; } .woocommerce ul.products li.product, .woocommerce-page ul.products li.product { padding-bottom: 20px; background: rgba(241, 240, 240, 0.25); box-shadow: 0 0 1px #DDD; text-align: center; } .woocommerce .star-rating span:before { color: orange; } /*-------------------------------------------------------------- ## Media Queries --------------------------------------------------------------*/ /* Smaller than standard 1139 (devices and browsers) */ @media only screen and (max-width:1260px) { .container { width: 97%; } .comments-area form#commentform p { float: left; width: 100%; } #commentform label { display: inline; } #comments input#submit { width: auto; } #main-slider .cycle-caption { visibility: visible; } .cta-layout-1.business_club_widget_call_to_action .widget-title { padding-left: 0; } .cta-layout-1.business_club_widget_call_to_action .button { font-size: 15px; margin: 0 2px; padding: 10px 15px; } } /* Smaller than standard 1024 (devices and browsers) */ @media only screen and (max-width:1023px) { h1 { font-size: 22px; } h2 { font-size: 20px; } h3{ font-size: 18px; } h4 { font-size: 16px; } h5 { font-size: 15px; } h6 { font-size: 14px; } /*Main slider*/ #main-slider .cycle-caption { top: 13%; } #main-slider .cycle-slide { width: 100%; } #main-slider h3 { margin-bottom:5px; font-size: 27px; } #main-slider .slider-buttons { margin-top: 10px; } #main-slider .cycle-pager { bottom: 10px; } td, th { font-size: 12px; padding: 2px; text-align: center; } .main-navigation ul ul a { padding-bottom: 5px; padding-top: 5px; } .business_club_widget_latest_news .latest-news-meta .latest-news-comments { clear: both; display: block; float: none; } .cta-layout-1.business_club_widget_call_to_action .cta-content { text-align: center; width: 100%; } .cta-layout-1.business_club_widget_call_to_action .button { font-size: 15px; margin: 4px 10px; padding: 10px 15px; } .three-columns-enabled #primary { display: inline-block; float: none; width: 100%; } .global-layout-three-columns .sidebar { float: left; width: 50%; } } /* All Mobile Sizes (devices and browser) */ @media only screen and (max-width:900px) { body{ padding-top: 0; } #page { padding-top:45px; } #main-nav { display: none; } .sidr-open #mobile-trigger { transition: inherit; } #mobile-trigger { background: #222 none repeat scroll 0 0; display: block; left: 0; padding: 5px; position: fixed; text-align: center; top: 0; width: 100%; z-index: 999999; } .logged-in #mobile-trigger { top: 45px; } .sidr-open #mobile-trigger { padding-left: 275px; text-align: left; transition: inherit; } .sidr-open #mobile-trigger { top: 0; } #masthead { text-align: center; } .site-logo-link, .custom-logo-link { max-width: inherit; } #mobile-trigger i { background-color: #179bd7; box-shadow: 4px 3px 0 #000000; color: #ffffff; font-size: 24px; padding: 6px 8px; } .sidr ul li ul li a, .sidr ul li ul li span { line-height: 1.5; padding-bottom: 10px; padding-left: 30px; padding-top: 10px !important; } body .sidebar, body #primary { width: 100%; padding-bottom: 30px; } .business_club_widget_services_primary .service-col-4 .service-block-item, .business_club_widget_latest_news .latest-news-col-4 .latest-news-item { width: 50%; } .services-layout-1.business_club_widget_services .service-block-item, .business_club_widget_latest_news .latest-news-item, .service-block-item, .business_club_widget_services_primary .service-block-item, .our-team-item { padding:10px; } .services-layout-1.business_club_widget_services .service-item-title { font-size: 14px; } .cta-layout-1.business_club_widget_call_to_action .call-to-action-buttons { float: inherit; } .inner-wrapper { margin-left: -10px; margin-right: -10px; } #primary, .sidebar, #colophon{ padding-left: 10px; padding-right: 10px; } .cta-layout-1.business_club_widget_call_to_action .widget-title { float: none; margin-bottom: 15px; padding: 0; text-align: center; } .business_club_widget_latest_news .latest-news-meta > span.comments-link { display: block; float: inherit; margin: 0; } } /* All Mobile Sizes (devices and browser) */ @media only screen and (max-width:767px) { #tophead { text-align: center; } #header-social li { display: inline-block; margin: 0; padding: 10px; } #quick-contact li { clear: inherit; font-size: 14px; margin-right: 10px; margin-top: 5px; padding: 0; text-align: left; } #quick-contact li::before { font-size: 13px; margin-right: 0; padding: 8px 0; text-align: center; width: auto; border:inherit; } .site-logo-link, .custom-logo-link, #site-identity { display: block; margin: 0; text-align: center; } .site-branding { margin-right: 0; max-width: 80%; text-align: left; margin-top: 25px; } h1 { font-size: 22px; } h2 { font-size: 20px; } h3{ font-size: 18px; } h4 { font-size:16px; } h5 { font-size: 15px; } h6 { font-size: 14px; } .widget.business_club_widget_call_to_action { display: block; margin-bottom: 25px; padding: 15px; } .container { padding: 0 15px; } .site-layout-boxed #featured-slider, .site-layout-boxed #footer-widgets, .site-layout-boxed #colophon { margin-left: -15px; margin-right: -15px; } #featured-slider, #footer-widgets, #colophon { margin-left: 0; margin-right: 0; } #sidebar-front-page-widget-area .cta-layout-2.business_club_widget_call_to_action { margin: 0; padding: 20px 0; } .site-branding { text-align: left; } .site-content { padding-top: 15px; } /*featured slider style*/ #main-slider .cycle-caption h3 { font-size: 19px; font-weight: bold; line-height: 1.4; margin-bottom: 6px; } #main-slider .cycle-caption { width: 80%; left: 10%; } #main-slider .cycle-next { right: 0; } #main-slider .cycle-prev { left: 0; } #main-slider .cycle-caption p { display: none; } #main-slider .slider-buttons a { font-size: 15px; line-height: 1.5; margin: 4px 5px 0; min-width: 120px; padding: 4px 10px; text-transform: uppercase; } #sidebar-front-page-widget-area .widget { margin-top: 15px; } /*sidebar layout*/ #primary, #sidebar-primary, #sidebar-secondary { width: 100%; clear: both; float: none; } .global-layout-three-columns #primary, .global-layout-three-columns .sidebar { display: inline-block; float: none; width: 100%; } /*footer widget area*/ .sibebar{ margin-top: 15px; } #footer-widgets .widget-column{ float: left; padding: 0 15px 20px 0; width: 50%; } #footer-widgets .widget-column:nth-child(3n) { clear: both; } .services-layout-1.business_club_widget_services .service-block-list .service-block-item { width: 100%; } .business_club_widget_featured_page img.alignright, .business_club_widget_featured_page img.alignleft { margin-bottom: 10px; margin-left: 0; margin-right: 0; max-width: 100%; vertical-align: middle; } .cta-layout-2.business_club_widget_call_to_action .call-to-action-buttons { clear: both; display: block; float: none; margin-top: 15px; } #sidebar-front-page-widget-area .widget { margin-top: 0; padding: 20px 0; } .business_club_widget_call_to_action { padding: 15px; } .services-layout-1.business_club_widget_services .service-item-title { font-size: 21px; } .business_club_widget_latest_news .latest-news-meta > span.comments-link { float: right; margin: 0; } .widget { margin: 15px 0 0; } .business_club_widget_advanced_recent_posts img { float: left; } .business_club_widget_advanced_recent_posts { text-align: left; } .business_club_widget_latest_news .latest-news-widget .latest-news-item { width: 50%; } #footer-widgets { padding: 30px 15px; } #colophon .copyright, #colophon .site-info { clear: both; text-align: center; width: 100%; } .business_club_widget_latest_news .latest-news-meta > span.posted-on, .business_club_widget_latest_news .latest-news-meta > span.comments-link { float: none; } .site-logo-link, .custom-logo-link { margin-right: 12px; max-width: 44px; } } /* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */ @media only screen and (max-width:479px) { a.custom-logo-link { max-width: 95px; margin: 0 auto 15px; } #quick-contact a { padding: 5px 5px; } #quick-contact li { margin: 0 5px; } .business_club_widget_latest_news .latest-news-widget .latest-news-item { width: 100%; } .business_club_widget_latest_news .latest-news-col-4 .latest-news-item { width: 100%; } .featured-page-widget { clear: both; } #sidebar-front-page-widget-area .widget-title { font-size: 17px; font-weight: 600; margin-bottom: 5px; text-align: center; } .business_club_widget_call_to_action .button { border-radius: 0; color: #ffffff; display: inline-block; font-size: 13px; margin: 0 5px; padding: 5px 13px; transition: all 0.2s ease 0s; } .custom-logo-link, .site-logo-link, #site-identity, .site-title { display: block; float: none; margin-right: 0; text-align: center; width: 100%; max-width: inherit; margin-bottom: 5px; } .site-branding { float: none; max-width: 100%; text-align: center; } #main-slider .slider-buttons a { font-size: 13px; line-height: 1.5; margin: 0 5px; min-width: inherit; padding: 0 10px; text-transform: capitalize; } #main-slider .cycle-caption { top:15%; } #main-slider .pager-box { height: 4px; margin: 0 3px; width: 15px; z-index: 99; } #main-slider .cycle-pager { bottom: 10px; } #main-slider .cycle-prev, #main-slider .cycle-next { padding: 0 10px; top: 33%; } #main-slider .cycle-prev i, #main-slider .cycle-next i { font-size: 28px; } #main-slider .cycle-caption h3 { font-size: 16px; height: auto; margin-bottom: 0; overflow: hidden; } #main-slider .cycle-caption p { display: none; } #footer-widgets .footer-widget-area { width: 100%; } #footer-widgets .footer-widget-area:first-child { border: none; margin-top: 0; padding-top: 0; } #footer-widgets .widget-column { width: 100%; padding-top: 15px; border-top: 1px solid #fff; margin-top: 15px; } .site-description { margin-bottom: 0; } .cta-layout-2.business_club_widget_call_to_action p { color: #ffffff; font-size: 13px; } .business_club_widget_latest_news .latest-news-widget .latest-news-item, .widget.business_club_widget_services_primary .service-block-item { width: 100%; } .search-box .search-box-wrap { right: 3%; width: 263px; } .social-links { float: right; max-width: 208px; text-align: right; } .social-links .business_club_widget_social li { display: inline-block; float: none; } .search-box { float: right; position: relative; width: 33px; } .right-head { float: inherit; } #masthead .right-head { border-top: 1px solid #dddddd; clear: both; float: left; margin: 10px 0 0; padding: 23px 0 10px; width: 100%; } #header-social li { border: medium none !important; float: inherit; } #header-social { clear: both; float: none; text-align: center; width: 100%; } #quick-contact { float: inherit; margin-top: 0; text-align: center; width: 100%; } #quick-contact li { clear: inherit; display: inline-block; float: inherit; margin:0 5px; margin-top: 5px; padding: 0; text-align: center; } .right-head .header-search-box .search-box-wrap { top: 31px; width: 280px; } .cart-section { float: left; } } images/overlay.png000064400000000147150212240530010174 0ustar00PNG  IHDR} PLTEgtRNSxIDATcX DIENDB`page.php000064400000002032150212240530006160 0ustar00
footer.php000064400000002251150212240530006545 0ustar00 template-parts/content-search.php000064400000001445150212240530013132 0ustar00
template-parts/content-single.php000064400000001744150212240530013150 0ustar00
>
', '' ); ?>
'', ) ); ?>
template-parts/footer-widgets.php000064400000001662150212240530013160 0ustar00

Get started here.', 'business-club' ), array( 'a' => array( 'href' => array() ) ) ), esc_url( admin_url( 'post-new.php' ) ) ); ?>

template-parts/content.php000064400000003045150212240530011665 0ustar00
> 'business-club-post-thumb aligncenter', ); the_post_thumbnail( 'large', $args ); ?>
', esc_url( get_permalink() ) ), '' ); ?>
→', 'business-club' ), array( 'span' => array( 'class' => array() ) ) ), the_title( '"', '"', false ) ) ); wp_link_pages( array( 'before' => '', ) ); ?>
template-parts/content-page.php000064400000001721150212240530012576 0ustar00
>
', '' ); ?>
'', ) ); ?>
', '' ); ?>
demo/widget.wie000064400000004742150212240530007462 0ustar00{"sidebar-1":{"search-2":{"title":""},"recent-posts-2":{"title":"","number":5},"recent-comments-2":{"title":"","number":5},"archives-2":{"title":"","count":0,"dropdown":0},"categories-2":{"title":"","count":0,"hierarchical":0,"dropdown":0}},"sidebar-front-page-widget-area":{"business-club-services-2":{"title":"OUR KEY FEATURES","subtitle":"Lorem ipsum dolor sit amet, consectetur adipiscing elit","excerpt_length":20,"more_text":"Read more","block_page_1":43,"block_icon_1":"fa-wordpress","block_page_2":46,"block_icon_2":"fa-tasks","block_page_3":49,"block_icon_3":"fa-pencil","block_page_4":0,"block_icon_4":"fa-cogs"},"business-club-call-to-action-2":{"title":"Lorem ipsum dolor sit amet, consectetur adipiscing elit","text":"","primary_button_text":"Read more","primary_button_url":"http:\/\/demo.axlethemes.com\/business-club\/","secondary_button_text":"Learn more","secondary_button_url":"http:\/\/demo.axlethemes.com\/business-club\/","layout":1,"background_image":""},"business-club-featured-page-2":{"title":"About Axle Themes","featured_page":55,"content_type":"full","excerpt_length":110,"featured_image":"full","featured_image_alignment":"right"},"business-club-call-to-action-3":{"title":"Lorem ipsum dolor sit amet, consectetur adipiscing elit","text":"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make","primary_button_text":"Read more","primary_button_url":"http:\/\/demo.axlethemes.com\/business-club\/","secondary_button_text":"Learn more","secondary_button_url":"http:\/\/demo.axlethemes.com\/business-club\/","layout":2,"background_image":"https:\/\/demo.axlethemes.com\/business-club\/wp-content\/uploads\/sites\/2\/2017\/01\/bg11.jpg"},"business-club-latest-news-2":{"title":"LATEST NEWS","subtitle":"Lorem ipsum dolor sit amet, consectetur adipiscing elit","post_category":0,"post_number":3,"post_column":3,"excerpt_length":40,"featured_image":"business-club-thumb","more_text":"Read more"}},"footer-1":{"text-2":{"title":"About Business Club","text":"Lorem irony actually meditation, occupy mumblecore wayfarers organic pickled 90's. Intelligentsia as actually +1 meh photo booth.","filter":true,"visual":true}},"footer-2":{"categories-3":{"title":"Categories","count":0,"hierarchical":0,"dropdown":0}},"footer-3":{"nav_menu-2":{"title":"Quick Links","nav_menu":3}},"footer-4":{"business-club-social-2":{"title":"Social Links"}}} demo/customizer.dat000064400000001226150212240530010361 0ustar00a:4:{s:8:"template";s:13:"business-club";s:4:"mods";a:5:{i:0;b:0;s:11:"custom_logo";s:0:"";s:13:"theme_options";a:9:{s:22:"featured_slider_status";s:9:"home-page";s:22:"featured_slider_page_1";i:30;s:22:"featured_slider_page_2";i:39;s:22:"featured_slider_page_3";i:32;s:31:"featured_slider_enable_autoplay";b:1;s:14:"contact_number";s:15:"+1-202-555-0162";s:12:"show_tagline";b:1;s:13:"contact_email";s:16:"mail@example.com";s:21:"show_social_in_header";b:1;}s:18:"nav_menu_locations";a:2:{s:7:"primary";i:3;s:6:"social";i:4;}s:18:"custom_css_post_id";i:113;}s:7:"options";a:2:{s:9:"site_icon";s:1:"0";s:23:"nav_menus_created_posts";a:0:{}}s:6:"wp_css";s:0:"";} demo/content.xml000064400000320355150212240530007666 0ustar00 Business Club https://demo.axlethemes.com/business-club WordPress Business Theme Fri, 08 Dec 2017 10:16:36 +0000 en-US 1.2 http://demo.axlethemes.com/ https://demo.axlethemes.com/business-club 1 2 1 5nav_menu 4nav_menu https://wordpress.org/?v=4.9.1 slide2 (1) https://demo.axlethemes.com/business-club/join-business-club/slide2-1/ Tue, 24 Jan 2017 15:53:55 +0000 http://demo.axlethemes.com/business-club/wp-content/uploads/sites/2/2017/01/slide2-1.jpg 38 30 0 0 banner2 https://demo.axlethemes.com/business-club/about-business/banner2/ Tue, 24 Jan 2017 15:56:49 +0000 http://demo.axlethemes.com/business-club/wp-content/uploads/sites/2/2017/01/banner2.jpg 41 39 0 0 bg11 https://demo.axlethemes.com/business-club/bg11/ Tue, 24 Jan 2017 16:19:02 +0000 http://demo.axlethemes.com/business-club/wp-content/uploads/sites/2/2017/01/bg11.jpg 54 0 0 0 factory-1593842_640 https://demo.axlethemes.com/business-club/2017/01/24/attractive-offers/factory-1593842_640/ Tue, 24 Jan 2017 16:29:03 +0000 http://demo.axlethemes.com/business-club/wp-content/uploads/sites/2/2017/01/factory-1593842_640.jpg 61 58 0 0 fashion-605508_640 https://demo.axlethemes.com/business-club/2017/01/24/attractive-offers/fashion-605508_640/ Tue, 24 Jan 2017 16:29:07 +0000 http://demo.axlethemes.com/business-club/wp-content/uploads/sites/2/2017/01/fashion-605508_640.jpg 62 58 0 0 hip-hop-1209499_640 https://demo.axlethemes.com/business-club/2017/01/24/attractive-offers/hip-hop-1209499_640/ Tue, 24 Jan 2017 16:29:19 +0000 http://demo.axlethemes.com/business-club/wp-content/uploads/sites/2/2017/01/hip-hop-1209499_640.jpg 64 58 0 0 ipad-1411864_640 https://demo.axlethemes.com/business-club/2017/01/24/attractive-offers/ipad-1411864_640/ Tue, 24 Jan 2017 16:29:34 +0000 http://demo.axlethemes.com/business-club/wp-content/uploads/sites/2/2017/01/ipad-1411864_640.jpg 66 58 0 0 workplace-1245776_640 https://demo.axlethemes.com/business-club/2017/01/24/official-meeting/workplace-1245776_640/ Tue, 24 Jan 2017 16:35:20 +0000 http://demo.axlethemes.com/business-club/wp-content/uploads/sites/2/2017/01/workplace-1245776_640.jpg 75 71 0 0 Facebook https://demo.axlethemes.com/business-club/2017/01/24/facebook/ Tue, 24 Jan 2017 16:47:37 +0000 http://demo.axlethemes.com/business-club/2017/01/24/facebook/ 84 0 1 0 Twitter https://demo.axlethemes.com/business-club/2017/01/24/twitter/ Tue, 24 Jan 2017 16:47:37 +0000 http://demo.axlethemes.com/business-club/2017/01/24/twitter/ 85 0 2 0 Linkedin https://demo.axlethemes.com/business-club/2017/01/24/linkedin/ Tue, 24 Jan 2017 16:47:37 +0000 http://demo.axlethemes.com/business-club/2017/01/24/linkedin/ 86 0 3 0 Dribbble https://demo.axlethemes.com/business-club/2017/01/30/dribbble/ Mon, 30 Jan 2017 09:40:05 +0000 http://demo.axlethemes.com/business-club/?p=93 93 0 4 0 Instagram https://demo.axlethemes.com/business-club/2017/01/30/instagram/ Mon, 30 Jan 2017 09:40:05 +0000 http://demo.axlethemes.com/business-club/?p=94 94 0 5 0 Google Plus https://demo.axlethemes.com/business-club/2017/01/30/google-plus/ Mon, 30 Jan 2017 09:40:05 +0000 http://demo.axlethemes.com/business-club/?p=95 95 0 6 0 tumblr https://demo.axlethemes.com/business-club/2017/01/30/tumblr/ Mon, 30 Jan 2017 09:41:30 +0000 http://demo.axlethemes.com/business-club/?p=96 96 0 7 0 Youtube https://demo.axlethemes.com/business-club/2017/01/30/youtube/ Mon, 30 Jan 2017 09:41:31 +0000 http://demo.axlethemes.com/business-club/?p=97 97 0 8 0 Pinterest https://demo.axlethemes.com/business-club/2017/01/30/pinterest/ Mon, 30 Jan 2017 09:47:02 +0000 http://demo.axlethemes.com/business-club/?p=99 99 0 9 0 business-club https://demo.axlethemes.com/business-club/2017/08/21/business-club/ Mon, 21 Aug 2017 08:13:28 +0000 https://demo.axlethemes.com/business-club/2017/08/21/business-club/ 113 0 0 0 page-1 https://demo.axlethemes.com/business-club/about-axle-themes/page-1/ Thu, 30 Nov 2017 06:45:35 +0000 https://demo.axlethemes.com/business-club/wp-content/uploads/sites/2/2017/11/page-1.jpg 122 55 0 0 https://demo.axlethemes.com/business-club/2017/12/08/148/ Fri, 08 Dec 2017 10:13:52 +0000 https://demo.axlethemes.com/business-club/?p=148 148 0 1 0 Hello world! https://demo.axlethemes.com/business-club/2016/09/28/hello-world/ Wed, 28 Sep 2016 06:44:42 +0000 http://demo.axlethemes.com/business-club/?p=1 1 0 0 0 About Us https://demo.axlethemes.com/business-club/about-us/ Tue, 24 Jan 2017 15:40:43 +0000 http://demo.axlethemes.com/business-club-pro/?page_id=6 6 0 0 0 Contact Us https://demo.axlethemes.com/business-club/contact-us/ Tue, 24 Jan 2017 15:40:50 +0000 http://demo.axlethemes.com/business-club-pro/?page_id=7 7 0 0 0 News & Events https://demo.axlethemes.com/business-club/news-events/ Tue, 24 Jan 2017 15:41:49 +0000 http://demo.axlethemes.com/business-club-pro/?page_id=8 8 0 0 0 Our Services https://demo.axlethemes.com/business-club/our-services/ Tue, 24 Jan 2017 15:42:04 +0000 http://demo.axlethemes.com/business-club-pro/?page_id=9 9 0 0 0 Join Business Club https://demo.axlethemes.com/business-club/join-business-club/ Tue, 24 Jan 2017 15:49:58 +0000 http://demo.axlethemes.com/business-club-pro/?page_id=30 30 0 0 0 About Business https://demo.axlethemes.com/business-club/about-business/ Tue, 24 Jan 2017 15:57:12 +0000 http://demo.axlethemes.com/business-club-pro/?page_id=39 39 0 0 0 Standard Coding https://demo.axlethemes.com/business-club/standard-coding/ Tue, 24 Jan 2017 16:08:08 +0000 http://demo.axlethemes.com/business-club-pro/?page_id=43 43 0 0 0 Translation Ready https://demo.axlethemes.com/business-club/translation-ready/ Tue, 24 Jan 2017 16:09:03 +0000 http://demo.axlethemes.com/business-club-pro/?page_id=45 45 0 0 0 Custom Widget Ready https://demo.axlethemes.com/business-club/custom-widget-ready/ Tue, 24 Jan 2017 16:09:05 +0000 http://demo.axlethemes.com/business-club-pro/?page_id=46 46 0 0 0 Easy To Customize https://demo.axlethemes.com/business-club/translation-ready-2/ Tue, 24 Jan 2017 16:09:36 +0000 http://demo.axlethemes.com/business-club-pro/?page_id=49 49 0 0 0 About Axle Themes https://demo.axlethemes.com/business-club/about-axle-themes/ Tue, 24 Jan 2017 16:21:52 +0000 http://demo.axlethemes.com/business-club-pro/?page_id=55 Users First " we move ahead to provide our customers what they want in a Theme/Plugin with unbound effort to make it as simple as possible to use, whilst providing the best and uttermost features on a Theme/Plugin .]]> 55 0 0 0 Attractive Offers https://demo.axlethemes.com/business-club/2017/01/24/attractive-offers/ Tue, 24 Jan 2017 16:29:59 +0000 http://demo.axlethemes.com/business-club-pro/?p=58 58 0 0 0 Home https://demo.axlethemes.com/business-club/ Tue, 24 Jan 2017 15:36:43 +0000 http://demo.axlethemes.com/business-club-pro/?page_id=4 77 0 0 0 Blog https://demo.axlethemes.com/business-club/blog/ Tue, 24 Jan 2017 17:09:22 +0000 http://demo.axlethemes.com/business-club/?page_id=89 89 0 0 0 https://demo.axlethemes.com/business-club/2017/12/08/149/ Fri, 08 Dec 2017 10:13:52 +0000 https://demo.axlethemes.com/business-club/?p=149 149 0 2 0 https://demo.axlethemes.com/business-club/2017/12/08/150/ Fri, 08 Dec 2017 10:13:52 +0000 https://demo.axlethemes.com/business-club/?p=150 150 0 3 0 News & Events https://demo.axlethemes.com/business-club/2017/12/08/news-events/ Fri, 08 Dec 2017 10:13:52 +0000 https://demo.axlethemes.com/business-club/?p=151 151 0 4 0 https://demo.axlethemes.com/business-club/2017/12/08/152/ Fri, 08 Dec 2017 10:13:52 +0000 https://demo.axlethemes.com/business-club/?p=152 152 0 5 0 https://demo.axlethemes.com/business-club/2017/12/08/153/ Fri, 08 Dec 2017 10:13:52 +0000 https://demo.axlethemes.com/business-club/?p=153 153 0 6 0 Business Plan https://demo.axlethemes.com/business-club/2017/01/24/business-plan/ Tue, 24 Jan 2017 16:31:25 +0000 http://demo.axlethemes.com/business-club-pro/?p=69 69 0 0 0 16 http://127.0.0.1 0 0 Quality Service https://demo.axlethemes.com/business-club/2017/01/24/quality-service/ Tue, 24 Jan 2017 16:31:05 +0000 http://demo.axlethemes.com/business-club-pro/?p=70 70 0 0 0 Official Meeting https://demo.axlethemes.com/business-club/2017/01/24/official-meeting/ Tue, 24 Jan 2017 16:30:46 +0000 http://demo.axlethemes.com/business-club-pro/?p=71 71 0 0 0 Contact form 1 https://demo.axlethemes.com/business-club/?post_type=wpcf7_contact_form&p=143 Fri, 08 Dec 2017 08:20:15 +0000 https://demo.axlethemes.com/business-club/?post_type=wpcf7_contact_form&p=143 Your Name (required) [text* your-name] [submit "Send"] 1 Business Club "[your-subject]" [your-name] mail@example.com From: [your-name] <[your-email]> Subject: [your-subject] Message Body: [your-message] -- This e-mail was sent from a contact form on Business Club (https://demo.axlethemes.com/business-club) Reply-To: [your-email] Business Club "[your-subject]" Business Club [your-email] Message Body: [your-message] -- This e-mail was sent from a contact form on Business Club (https://demo.axlethemes.com/business-club) Reply-To: axlethemes@gmail.com Thank you for your message. It has been sent. There was an error trying to send your message. Please try again later. One or more fields have an error. Please check and try again. There was an error trying to send your message. Please try again later. You must accept the terms and conditions before sending your message. The field is required. The field is too long. The field is too short. The date format is incorrect. The date is before the earliest one allowed. The date is after the latest one allowed. There was an unknown error uploading the file. You are not allowed to upload files of this type. The file is too big. There was an error uploading the file. The number format is invalid. The number is smaller than the minimum allowed. The number is larger than the maximum allowed. The answer to the quiz is incorrect. Your entered code is incorrect. The e-mail address entered is invalid. The URL is invalid. The telephone number is invalid.]]> 143 0 0 0 Your Name (required) [text* your-name] [submit "Send"]]]> ";s:9:"recipient";s:16:"mail@example.com";s:4:"body";s:193:"From: [your-name] <[your-email]> Subject: [your-subject] Message Body: [your-message] -- This e-mail was sent from a contact form on Business Club (https://demo.axlethemes.com/business-club)";s:18:"additional_headers";s:22:"Reply-To: [your-email]";s:11:"attachments";s:0:"";s:8:"use_html";b:0;s:13:"exclude_blank";b:0;}]]> ";s:9:"recipient";s:12:"[your-email]";s:4:"body";s:135:"Message Body: [your-message] -- This e-mail was sent from a contact form on Business Club (https://demo.axlethemes.com/business-club)";s:18:"additional_headers";s:30:"Reply-To: axlethemes@gmail.com";s:11:"attachments";s:0:"";s:8:"use_html";b:0;s:13:"exclude_blank";b:0;}]]> index.php000064400000002645150212240530006365 0ustar00

comments.php000064400000006220150212240530007074 0ustar00

1 && get_option( 'page_comments' ) ) : // Are there comments to navigate through? ?>
    'ol', 'short_ping' => true, ) ); ?>
1 && get_option( 'page_comments' ) ) : // Are there comments to navigate through? ?>

includes/theme-hooks.php000064400000024154150212240530011306 0ustar00

'primary', 'container' => '', 'fallback_cb' => 'business_club_primary_navigation_fallback', ) ); ?>
'footer', 'container' => 'div', 'container_id' => 'footer-navigation', 'depth' => 1, 'fallback_cb' => false, ) ); ?>
| Axle Themes' ); ?>
ID, 'business_club_settings', true ); if ( isset( $post_options['post_layout'] ) && ! empty( $post_options['post_layout'] ) ) { $global_layout = $post_options['post_layout']; } } // Include primary sidebar. if ( 'no-sidebar' !== $global_layout ) { get_sidebar(); } // Include secondary sidebar. switch ( $global_layout ) { case 'three-columns': get_sidebar( 'secondary' ); break; default: break; } } endif; add_action( 'business_club_action_sidebar', 'business_club_add_sidebar' ); if ( ! function_exists( 'business_club_custom_posts_navigation' ) ) : /** * Posts navigation. * * @since 1.0.0 */ function business_club_custom_posts_navigation() { the_posts_pagination(); } endif; add_action( 'business_club_action_posts_navigation', 'business_club_custom_posts_navigation' ); if ( ! function_exists( 'business_club_add_image_in_single_display' ) ) : /** * Add image in single template. * * @since 1.0.0 */ function business_club_add_image_in_single_display() { if ( has_post_thumbnail() ) { $args = array( 'class' => 'business-club-post-thumb aligncenter', ); the_post_thumbnail( 'large', $args ); } } endif; add_action( 'business_club_single_image', 'business_club_add_image_in_single_display' ); if ( ! function_exists( 'business_club_add_breadcrumb' ) ) : /** * Add breadcrumb. * * @since 1.0.0 */ function business_club_add_breadcrumb() { // Bail if home page. if ( is_front_page() || is_home() || is_page_template( 'templates/front.php' ) || is_page_template('elementor_header_footer') ) { return; } echo ''; } endif; add_action( 'business_club_action_before_content', 'business_club_add_breadcrumb', 7 ); if ( ! function_exists( 'business_club_footer_goto_top' ) ) : /** * Go to top. * * @since 1.0.0 */ function business_club_footer_goto_top() { echo ''; } endif; add_action( 'business_club_action_after', 'business_club_footer_goto_top', 20 ); if ( ! function_exists( 'business_club_add_front_page_widget_area' ) ) : /** * Add front page widget area. * * @since 1.0.0 */ function business_club_add_front_page_widget_area() { if ( is_page_template( 'templates/front.php' ) ) { echo ''; } } endif; add_action( 'business_club_action_before_content', 'business_club_add_front_page_widget_area', 7 ); if ( ! function_exists( 'business_club_add_footer_widgets' ) ) : /** * Add footer widgets. * * @since 1.0.0 */ function business_club_add_footer_widgets() { get_template_part( 'template-parts/footer-widgets' ); } endif; add_action( 'business_club_action_before_footer', 'business_club_add_footer_widgets', 5 ); if ( ! function_exists( 'business_club_add_top_head_content' ) ) : /** * Add top head section. * * @since 1.0.0 */ function business_club_add_top_head_content() { $contact_number = business_club_get_option( 'contact_number' ); $contact_email = business_club_get_option( 'contact_email' ); $show_social_in_header = business_club_get_option( 'show_social_in_header' ); if ( empty( $contact_number ) && empty( $contact_email ) ) { $contact_status = false; } else { $contact_status = true; } if ( false === $contact_status && ( false === business_club_get_option( 'show_social_in_header' ) || false === has_nav_menu( 'social' ) ) ) { return; } ?>
esc_html__( 'One Click Demo Import', 'business-club' ), 'slug' => 'one-click-demo-import', 'required' => false, ), array( 'name' => esc_html__( 'Contact Form 7', 'business-club' ), 'slug' => 'contact-form-7', 'required' => false, ), ); $config = array(); tgmpa( $plugins, $config ); } endif; add_action( 'tgmpa_register', 'best_business_register_recommended_plugins' ); includes/widgets.php000064400000121022150212240530010521 0ustar00 'business_club_widget_social', 'description' => esc_html__( 'Social Icons Widget', 'business-club' ), 'customize_selective_refresh' => true, ); parent::__construct( 'business-club-social', esc_html__( 'BC: Social', 'business-club' ), $opts ); } /** * Echo the widget content. * * @since 1.0.0 * * @param array $args Display arguments including before_title, after_title, * before_widget, and after_widget. * @param array $instance The settings for the particular instance of the widget. */ function widget( $args, $instance ) { $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base ); echo $args['before_widget']; // Render widget title. if ( ! empty( $title ) ) { echo $args['before_title'] . $title . $args['after_title']; } if ( has_nav_menu( 'social' ) ) { wp_nav_menu( array( 'theme_location' => 'social', 'container' => false, 'depth' => 1, 'link_before' => '', 'link_after' => '', ) ); } echo $args['after_widget']; } /** * Update widget instance. * * @since 1.0.0 * * @param array $new_instance New settings for this instance as input by the user. * @param array $old_instance Old settings for this instance. * @return array Settings to save or bool false to cancel saving. */ function update( $new_instance, $old_instance ) { $instance = $old_instance; $instance['title'] = sanitize_text_field( $new_instance['title'] ); return $instance; } /** * Output the settings update form. * * @since 1.0.0 * * @param array $instance Current settings. */ function form( $instance ) { // Defaults. $instance = wp_parse_args( (array) $instance, array( 'title' => '', ) ); ?>

'business_club_widget_featured_page', 'description' => esc_html__( 'Displays single featured Page', 'business-club' ), 'customize_selective_refresh' => true, ); parent::__construct( 'business-club-featured-page', esc_html__( 'BC: Featured Page', 'business-club' ), $opts ); } /** * Echo the widget content. * * @since 1.0.0 * * @param array $args Display arguments including before_title, after_title, * before_widget, and after_widget. * @param array $instance The settings for the particular instance of the widget. */ function widget( $args, $instance ) { $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base ); $featured_page = ! empty( $instance['featured_page'] ) ? $instance['featured_page'] : 0; $content_type = ! empty( $instance['content_type'] ) ? $instance['content_type'] : 'full'; $excerpt_length = ! empty( $instance['excerpt_length'] ) ? $instance['excerpt_length'] : 80; $featured_image = ! empty( $instance['featured_image'] ) ? $instance['featured_image'] : 'medium'; $featured_image_alignment = ! empty( $instance['featured_image_alignment'] ) ? $instance['featured_image_alignment'] : 'left'; echo $args['before_widget']; if ( absint( $featured_page ) > 0 ) { $qargs = array( 'p' => absint( $featured_page ), 'post_type' => 'page', 'no_found_rows' => true, 'ignore_sticky_posts' => true, ); $the_query = new WP_Query( $qargs ); if ( $the_query->have_posts() ) { while ( $the_query->have_posts() ) { $the_query->the_post(); // Display featured image. if ( 'disable' !== $featured_image && has_post_thumbnail() ) { the_post_thumbnail( esc_attr( $featured_image ), array( 'class' => 'align' . esc_attr( $featured_image_alignment ) ) ); } echo ''; } // End while. // Reset. wp_reset_postdata(); } // End if. } echo $args['after_widget']; } /** * Update widget instance. * * @since 1.0.0 * * @param array $new_instance New settings for this instance as input by the user. * @param array $old_instance Old settings for this instance. * @return array Settings to save or bool false to cancel saving. */ function update( $new_instance, $old_instance ) { $instance = $old_instance; $instance['title'] = sanitize_text_field( $new_instance['title'] ); $instance['featured_page'] = absint( $new_instance['featured_page'] ); $instance['content_type'] = sanitize_key( $new_instance['content_type'] ); $instance['excerpt_length'] = absint( $new_instance['excerpt_length'] ); $instance['featured_image'] = sanitize_text_field( $new_instance['featured_image'] ); $instance['featured_image_alignment'] = sanitize_key( $new_instance['featured_image_alignment'] ); return $instance; } /** * Output the settings update form. * * @since 1.0.0 * * @param array $instance Current settings. */ function form( $instance ) { // Defaults. $instance = wp_parse_args( (array) $instance, array( 'title' => '', 'featured_page' => '', 'content_type' => 'full', 'excerpt_length' => 80, 'featured_image' => 'medium', 'featured_image_alignment' => 'left', ) ); ?>

$this->get_field_id( 'featured_page' ), 'name' => $this->get_field_name( 'featured_page' ), 'selected' => $instance['featured_page'], 'show_option_none' => esc_html__( '— Select —', 'business-club' ), ) ); ?>

 

$this->get_field_id( 'featured_image' ), 'name' => $this->get_field_name( 'featured_image' ), 'selected' => $instance['featured_image'], ); business_club_render_select_dropdown( $dropdown_args, 'business_club_get_image_sizes_options' ); ?>

$this->get_field_id( 'featured_image_alignment' ), 'name' => $this->get_field_name( 'featured_image_alignment' ), 'selected' => $instance['featured_image_alignment'], ); business_club_render_select_dropdown( $dropdown_args, 'business_club_get_image_alignment_options' ); ?>

'business_club_widget_call_to_action', 'description' => esc_html__( 'Call To Action Widget', 'business-club' ), 'customize_selective_refresh' => true, ); parent::__construct( 'business-club-call-to-action', esc_html__( 'BC: Call To Action', 'business-club' ), $opts ); } /** * Echo the widget content. * * @since 1.0.0 * * @param array $args Display arguments including before_title, after_title, * before_widget, and after_widget. * @param array $instance The settings for the particular instance of the widget. */ function widget( $args, $instance ) { $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base ); $text = ! empty( $instance['text'] ) ? $instance['text'] : ''; $primary_button_text = ! empty( $instance['primary_button_text'] ) ? esc_html( $instance['primary_button_text'] ) : ''; $primary_button_url = ! empty( $instance['primary_button_url'] ) ? esc_url( $instance['primary_button_url'] ) : ''; $secondary_button_text = ! empty( $instance['secondary_button_text'] ) ? esc_html( $instance['secondary_button_text'] ) : ''; $secondary_button_url = ! empty( $instance['secondary_button_url'] ) ? esc_url( $instance['secondary_button_url'] ) : ''; $layout = ! empty( $instance['layout'] ) ? absint( $instance['layout'] ) : 1; $background_image = ! empty( $instance['background_image'] ) ? esc_url( $instance['background_image'] ) : ''; // Add background image for layout 2. if ( 2 === absint( $layout ) && ! empty( $background_image ) ) { $background_style = ''; $background_style .= ' style="background-image:url(' . esc_url( $background_image ) . ');" '; $args['before_widget'] = implode( $background_style . ' class="', explode( 'class="', $args['before_widget'], 2 ) ); } // Add layout class. $layout_class = 'cta-layout-' . absint( $layout ); $args['before_widget'] = implode( 'class="' . $layout_class . ' ', explode( 'class="', $args['before_widget'], 2 ) ); echo $args['before_widget']; echo '
'; // Render widget title. if ( ! empty( $title ) ) { echo $args['before_title'] . $title . $args['after_title']; } ?> '; ?>
'', 'text' => '', 'primary_button_text' => esc_html__( 'Read more', 'business-club' ), 'primary_button_url' => home_url( '/' ), 'secondary_button_text' => esc_html__( 'Learn more', 'business-club' ), 'secondary_button_url' => home_url( '/' ), 'layout' => '', 'background_image' => '', ) ); ?>

$this->get_field_id( 'layout' ), 'name' => $this->get_field_name( 'layout' ), 'selected' => $instance['layout'], ); business_club_render_select_dropdown( $dropdown_args, 'business_club_get_numbers_dropdown_options', array( 'min' => 1, 'max' => 2, 'prefix' => esc_html__( 'Layout', 'business-club' ) . ' ' ) ); ?>


'business_club_widget_latest_news', 'description' => esc_html__( 'Latest News Widget. Displays latest posts in grid.', 'business-club' ), 'customize_selective_refresh' => true, ); parent::__construct( 'business-club-latest-news', esc_html__( 'BC: Latest News', 'business-club' ), $opts ); } /** * Echo the widget content. * * @since 1.0.0 * * @param array $args Display arguments including before_title, after_title, * before_widget, and after_widget. * @param array $instance The settings for the particular instance of the widget. */ function widget( $args, $instance ) { $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base ); $subtitle = ! empty( $instance['subtitle'] ) ? $instance['subtitle'] : ''; $post_category = ! empty( $instance['post_category'] ) ? $instance['post_category'] : 0; $post_column = ! empty( $instance['post_column'] ) ? $instance['post_column'] : 4; $featured_image = ! empty( $instance['featured_image'] ) ? $instance['featured_image'] : 'business-club-thumb'; $post_number = ! empty( $instance['post_number'] ) ? $instance['post_number'] : 4; $excerpt_length = ! empty( $instance['excerpt_length'] ) ? $instance['excerpt_length'] : 0; $more_text = ! empty( $instance['more_text'] ) ? $instance['more_text'] : ''; echo $args['before_widget']; // Display widget title. if ( $title ) { echo $args['before_title'] . $title . $args['after_title']; } // Display widget subtitle. if ( $subtitle ) { echo '

' . esc_html( $subtitle ) . '

'; } $qargs = array( 'posts_per_page' => esc_attr( $post_number ), 'no_found_rows' => true, 'ignore_sticky_posts' => true, ); if ( absint( $post_category ) > 0 ) { $qargs['cat'] = absint( $post_category ); } $the_query = new WP_Query( $qargs ); ?> have_posts() ) : ?>
have_posts() ) : $the_query->the_post(); ?>
'; comments_popup_link( '' . esc_html__( '0 Comment', 'business-club' ) . '', esc_html__( '1 Comment', 'business-club' ), esc_html__( '% Comments', 'business-club' ) ); echo ''; } ?>

0 ) : ?>
'', 'subtitle' => '', 'post_category' => '', 'post_column' => 4, 'featured_image' => 'business-club-thumb', 'post_number' => 4, 'excerpt_length' => 40, 'more_text' => esc_html__( 'Read more', 'business-club' ), ) ); ?>

'name', 'hide_empty' => true, 'taxonomy' => 'category', 'name' => $this->get_field_name( 'post_category' ), 'id' => $this->get_field_id( 'post_category' ), 'selected' => $instance['post_category'], 'show_option_all' => esc_html__( 'All Categories','business-club' ), ); wp_dropdown_categories( $cat_args ); ?>

$this->get_field_id( 'post_column' ), 'name' => $this->get_field_name( 'post_column' ), 'selected' => $instance['post_column'], ); business_club_render_select_dropdown( $dropdown_args, 'business_club_get_numbers_dropdown_options', array( 'min' => 3, 'max' => 4 ) ); ?>

$this->get_field_id( 'featured_image' ), 'name' => $this->get_field_name( 'featured_image' ), 'selected' => $instance['featured_image'], ); business_club_render_select_dropdown( $dropdown_args, 'business_club_get_image_sizes_options', array( 'add_disable' => false ) ); ?>

 

block_count = 4; $opts = array( 'classname' => 'business_club_widget_services', 'description' => esc_html__( 'Show your services pages with icon and read more link.', 'business-club' ), 'customize_selective_refresh' => true, ); parent::__construct( 'business-club-services', esc_html__( 'BC: Services', 'business-club' ), $opts ); } /** * Echo the widget content. * * @since 1.0.0 * * @param array $args Display arguments including before_title, after_title, * before_widget, and after_widget. * @param array $instance The settings for the particular instance of the widget. */ function widget( $args, $instance ) { $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base ); $subtitle = ! empty( $instance['subtitle'] ) ? $instance['subtitle'] : ''; $excerpt_length = ! empty( $instance['excerpt_length'] ) ? $instance['excerpt_length'] : 0; $more_text = ! empty( $instance['more_text'] ) ? $instance['more_text'] : ''; // Add layout class. $layout_class = 'services-layout-1'; $args['before_widget'] = implode( 'class="' . $layout_class . ' ', explode( 'class="', $args['before_widget'], 2 ) ); echo $args['before_widget']; // Render widget title. if ( $title ) { echo $args['before_title'] . $title . $args['after_title']; } // Display widget subtitle. if ( $subtitle ) { echo '

' . esc_html( $subtitle ) . '

'; } $services_array = array(); for ( $i = 1; $i <= $this->block_count; $i++ ) { $page = 0; if ( ! empty( $instance[ 'block_page_' . $i ] ) && absint( $instance[ 'block_page_' . $i ] ) > 0 ) { $page = absint( $instance[ 'block_page_' . $i ] ); } if ( $page > 0 ) { $sitem = array(); $sitem['page'] = $page; $sitem['icon'] = ''; if ( ! empty( $instance[ 'block_icon_' . $i ] ) ) { $sitem['icon'] = $instance[ 'block_icon_' . $i ]; } $services_array[] = $sitem; } } // Render content. if ( ! empty( $services_array ) ) { $extra_args = array( 'excerpt_length' => $excerpt_length, 'more_text' => $more_text, ); $this->render_widget_content( $services_array, $extra_args ); } echo $args['after_widget']; } /** * Render services. * * @since 1.0.0 * * @param array $services Services details. * @param array $args Arguments. */ function render_widget_content( $services, $args = array() ) { $service_column = count( $services ); $ids = wp_list_pluck( $services, 'page' ); $qargs = array( 'post_type' => 'page', 'no_found_rows' => true, 'post__in' => $ids, 'posts_per_page' => count( $ids ), 'orderby' => 'post__in', 'ignore_sticky_posts' => true, ); $the_query = new WP_Query( $qargs ); if ( ! $the_query->have_posts() ) { return; } ?>
have_posts() ) : $the_query->the_post(); ?> get_the_ID() ), 'and', 'icon' ); $icon = array_shift( $icon_item ); ?>
ID ), 'large' ); } ?>

0 ) : ?>
block_count ; $i++ ) { $instance[ 'block_page_' . $i ] = absint( $new_instance[ 'block_page_' . $i ] ); $instance[ 'block_icon_' . $i ] = sanitize_text_field( $new_instance[ 'block_icon_' . $i ] ); } return $instance; } /** * Output the settings update form. * * @since 1.0.0 * * @param array $instance Current settings. */ function form( $instance ) { // Defaults. $widget_defaults = array( 'title' => '', 'subtitle' => '', 'excerpt_length' => 20, 'more_text' => esc_html__( 'Read more', 'business-club' ), ); for ( $i = 1; $i <= $this->block_count ; $i++ ) { $widget_defaults[ 'block_page_' . $i ] = ''; $widget_defaults[ 'block_icon_' . $i ] = 'fa-cogs'; } $instance = wp_parse_args( (array) $instance, $widget_defaults ); ?>

 


block_count ; $i++ ) { ?>

$this->get_field_id( 'block_page_' . $i ), 'name' => $this->get_field_name( 'block_page_' . $i ), 'selected' => $instance[ 'block_page_' . $i ], 'show_option_none' => esc_html__( '— Select —', 'business-club' ), ) ); ?>

register_control_type( 'Business_Club_Heading_Control' ); $wp_customize->register_control_type( 'Business_Club_Message_Control' ); $wp_customize->register_section_type( 'Business_Club_Upsell_Section' ); // Upsell section. $wp_customize->add_section( new Business_Club_Upsell_Section( $wp_customize, 'custom_theme_upsell', array( 'title' => esc_html__( 'Business Club Pro', 'business-club' ), 'pro_text' => esc_html__( 'Buy Pro', 'business-club' ), 'pro_url' => 'https://axlethemes.com/wordpress-themes/business-club-pro/', 'priority' => 1, ) ) ); // Load helpers. require_once trailingslashit( get_template_directory() ) . 'includes/helpers.php'; // Load customize sanitize. require_once trailingslashit( get_template_directory() ) . 'includes/customizer/sanitize.php'; // Load customize callback. require_once trailingslashit( get_template_directory() ) . 'includes/customizer/callback.php'; // Load customize options. require_once trailingslashit( get_template_directory() ) . 'includes/customizer/option.php'; // Load slider customize options. require_once trailingslashit( get_template_directory() ) . 'includes/customizer/slider.php'; } add_action( 'customize_register', 'business_club_customize_register' ); /** * Register Customizer partials. * * @since 1.0.0 * * @param WP_Customize_Manager $wp_customize Theme Customizer object. */ function business_club_customizer_partials( WP_Customize_Manager $wp_customize ) { // Bail if selective refresh is not available. if ( ! isset( $wp_customize->selective_refresh ) ) { $wp_customize->get_setting( 'blogname' )->transport = 'refresh'; $wp_customize->get_setting( 'blogdescription' )->transport = 'refresh'; return; } $wp_customize->get_setting( 'blogname' )->transport = 'postMessage'; $wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage'; // Register partial for blogname. $wp_customize->selective_refresh->add_partial( 'blogname', array( 'selector' => '.site-title a', 'container_inclusive' => false, 'render_callback' => 'business_club_customize_partial_blogname', ) ); // Register partial for blogdescription. $wp_customize->selective_refresh->add_partial( 'blogdescription', array( 'selector' => '.site-description', 'container_inclusive' => false, 'render_callback' => 'business_club_customize_partial_blogdescription', ) ); } add_action( 'customize_register', 'business_club_customizer_partials', 99 ); /** * Render the site title for the selective refresh partial. * * @since 1.0.0 * * @return void */ function business_club_customize_partial_blogname() { bloginfo( 'name' ); } /** * Render the site title for the selective refresh partial. * * @since 1.0.0 * * @return void */ function business_club_customize_partial_blogdescription() { bloginfo( 'description' ); } /** * Customizer control assets. * * @since 1.0.4 */ function business_club_customizer_control_scripts() { $min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; wp_enqueue_script( 'business-club-customize-controls', get_template_directory_uri() . '/js/customize-controls' . $min . '.js', array( 'jquery', 'customize-controls' ), '2.0.2' ); wp_enqueue_style( 'business-club-customize-controls', get_template_directory_uri() . '/css/customize-controls' . $min . '.css', array(), '2.0.2' ); } add_action( 'customize_controls_enqueue_scripts', 'business_club_customizer_control_scripts', 0 ); includes/template-functions.php000064400000013242150212240530012700 0ustar00post_content; if ( ! empty( $post_object->post_excerpt ) ) { $source_content = $post_object->post_excerpt; } $source_content = strip_shortcodes( $source_content ); $trimmed_content = wp_trim_words( $source_content, $length, '…' ); return $trimmed_content; } endif; if ( ! function_exists( 'business_club_breadcrumb' ) ) : /** * Breadcrumb. * * @since 1.0.0 */ function business_club_breadcrumb() { if ( ! function_exists( 'breadcrumb_trail' ) ) { require_once trailingslashit( get_template_directory() ) . 'vendors/breadcrumbs/breadcrumbs.php'; } $breadcrumb_args = array( 'container' => 'div', 'show_browse' => false, ); breadcrumb_trail( $breadcrumb_args ); } endif; if ( ! function_exists( 'business_club_fonts_url' ) ) : /** * Return fonts URL. * * @since 1.0.0 * @return string Font URL. */ function business_club_fonts_url() { $fonts_url = ''; $fonts = array(); $subsets = 'latin,latin-ext'; /* translators: If there are characters in your language that are not supported by Open Sans, translate this to 'off'. Do not translate into your own language. */ if ( 'off' !== _x( 'on', 'Open Sans font: on or off', 'business-club' ) ) { $fonts[] = 'Open Sans:400,700'; } /* translators: If there are characters in your language that are not supported by Poppins, translate this to 'off'. Do not translate into your own language. */ if ( 'off' !== _x( 'on', 'Poppins font: on or off', 'business-club' ) ) { $fonts[] = 'Poppins:100,400,500,600'; } if ( $fonts ) { $fonts_url = add_query_arg( array( 'family' => urlencode( implode( '|', $fonts ) ), 'subset' => urlencode( $subsets ), ), 'https://fonts.googleapis.com/css' ); } return $fonts_url; } endif; if ( ! function_exists( 'business_club_primary_navigation_fallback' ) ) : /** * Fallback for primary navigation. * * @since 1.0.0 */ function business_club_primary_navigation_fallback() { echo ''; } endif; if ( ! function_exists( 'business_club_the_custom_logo' ) ) : /** * Render logo. * * @since 1.0.0 */ function business_club_the_custom_logo() { if ( function_exists( 'the_custom_logo' ) ) { the_custom_logo(); } } endif; if ( ! function_exists( 'business_club_render_select_dropdown' ) ) : /** * Render select dropdown. * * @since 1.0.0 * * @param array $main_args Main arguments. * @param string $callback Callback method. * @param array $callback_args Callback arguments. * @return string Rendered markup. */ function business_club_render_select_dropdown( $main_args, $callback, $callback_args = array() ) { $defaults = array( 'id' => '', 'name' => '', 'selected' => 0, 'echo' => true, 'add_default' => false, ); $r = wp_parse_args( $main_args, $defaults ); $output = ''; $choices = array(); if ( is_callable( $callback ) ) { $choices = call_user_func_array( $callback, $callback_args ); } if ( ! empty( $choices ) || true === $r['add_default'] ) { $output = "\n"; } if ( $r['echo'] ) { echo $output; } return $output; } endif; if ( ! function_exists( 'business_club_get_numbers_dropdown_options' ) ) : /** * Returns numbers dropdown options. * * @since 1.0.0 * * @param int $min Min. * @param int $max Max. * @param string $prefix Prefix. * @param string $suffix Suffix. * @return array Options array. */ function business_club_get_numbers_dropdown_options( $min = 1, $max = 4, $prefix = '', $suffix = '' ) { $output = array(); if ( $min <= $max ) { for ( $i = $min; $i <= $max; $i++ ) { $string = $prefix . $i . $suffix; $output[ $i ] = $string; } } return $output; } endif; if ( ! function_exists( 'business_club_has_more_tag' ) ) : /** * Check if more tag is in the content. * * @since 1.0.0 * * @return bool Status. */ function business_club_has_more_tag() { $output = false; $post = get_post( get_the_ID() ); if ( $post ) { $pos = strpos( $post->post_content, '' ); if ( false !== $pos ) { $output = true; } } return $output; } endif; if ( ! function_exists( 'business_club_woocommerce_status' ) ) : /** * Return WooCommerce status. * * @since 1.0.5 * * @return bool Active status. */ function business_club_woocommerce_status() { return class_exists( 'WooCommerce' ); } endif; includes/template-tags.php000064400000010612150212240530011624 0ustar00%2$s'; if ( get_the_time( 'U' ) !== get_the_modified_time( 'U' ) ) { $time_string = ''; } $time_string = sprintf( $time_string, esc_attr( get_the_date( 'c' ) ), esc_html( get_the_date() ), esc_attr( get_the_modified_date( 'c' ) ), esc_html( get_the_modified_date() ) ); $posted_on = sprintf( '%s', '' . $time_string . '' ); $byline = sprintf( '%s', '' . esc_html( get_the_author() ) . '' ); if ( ! empty( $posted_on ) ) { echo '' . $posted_on . ''; // WPCS: XSS OK. } if ( ! empty( $byline ) ) { echo ''; // WPCS: XSS OK. } } endif; if ( ! function_exists( 'business_club_entry_footer' ) ) : /** * Prints HTML with meta information for the categories, tags and comments. */ function business_club_entry_footer() { // Hide category and tag text for pages. if ( 'post' === get_post_type() ) { /* Translators: used between list items, there is a space after the comma. */ $categories_list = get_the_category_list( esc_html__( ', ', 'business-club' ) ); if ( $categories_list && business_club_categorized_blog() ) { printf( '%1$s', $categories_list ); // WPCS: XSS OK. } /* Translators: used between list items, there is a space after the comma. */ $tags_list = get_the_tag_list( '', esc_html__( ', ', 'business-club' ) ); if ( $tags_list ) { printf( '%1$s', $tags_list ); // WPCS: XSS OK. } } if ( ! is_single() && ! post_password_required() && ( comments_open() || get_comments_number() ) ) { echo ''; comments_popup_link( esc_html__( 'Leave a comment', 'business-club' ), esc_html__( '1 Comment', 'business-club' ), esc_html__( '% Comments', 'business-club' ) ); echo ''; } edit_post_link( esc_html__( 'Edit', 'business-club' ), '', '' ); $archive_layout = business_club_get_option( 'archive_layout' ); if ( 'excerpt' === $archive_layout || business_club_has_more_tag() ) { $read_more_text = business_club_get_option( 'read_more_text' ); if ( ! empty( $read_more_text ) ) { $read_more_link = get_permalink(); echo '' . esc_html( $read_more_text ) . ''; } } } endif; /** * Returns true if a blog has more than 1 category. * * @return bool */ function business_club_categorized_blog() { if ( false === ( $all_the_cool_cats = get_transient( 'business_club_categories' ) ) ) { // Create an array of all the categories that are attached to posts. $all_the_cool_cats = get_categories( array( 'fields' => 'ids', // We only need to know if there is more than one category. 'number' => 2, ) ); // Count the number of categories that are attached to the posts. $all_the_cool_cats = count( $all_the_cool_cats ); set_transient( 'business_club_categories', $all_the_cool_cats ); } if ( $all_the_cool_cats > 1 ) { // This blog has more than 1 category so business_club_categorized_blog should return true. return true; } else { // This blog has only 1 category so business_club_categorized_blog should return false. return false; } } /** * Flush out the transients used in business_club_categorized_blog. */ function business_club_category_transient_flusher() { if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { return; } // Like, beat it. Dig? delete_transient( 'business_club_categories' ); } add_action( 'edit_category', 'business_club_category_transient_flusher' ); add_action( 'save_post', 'business_club_category_transient_flusher' ); includes/module/woocommerce.php000064400000010777150212240530012675 0ustar00'; echo '
'; } endif; if ( ! function_exists( 'business_club_end_woocommerce_wrapper_end' ) ) : /** * End WooCommerce wrapper. * * @since 1.0.5 */ function business_club_end_woocommerce_wrapper_end() { echo '
'; echo '
'; } endif; remove_action( 'woocommerce_before_main_content', 'woocommerce_output_content_wrapper', 10 ); remove_action( 'woocommerce_after_main_content', 'woocommerce_output_content_wrapper_end', 10 ); add_action( 'woocommerce_before_main_content', 'business_club_start_woocommerce_wrapper', 10 ); add_action( 'woocommerce_after_main_content', 'business_club_end_woocommerce_wrapper_end', 10 ); if ( ! function_exists( 'business_club_customize_woocommerce_breadcrumb' ) ) : /** * Customize WooCommerce breadcrumb. * * @since 1.0.5 * * @param array $defaults Breadcrumb defaults array. * @return array Customized breadcrumb defaults array. */ function business_club_customize_woocommerce_breadcrumb( $defaults ) { $defaults['delimiter'] = ''; $defaults['before'] = '
  • '; $defaults['after'] = '
  • '; $defaults['wrap_before'] = ''; return $defaults; } endif; add_filter( 'woocommerce_breadcrumb_defaults', 'business_club_customize_woocommerce_breadcrumb' ); if ( ! function_exists( 'business_club_customize_woocommerce_hooks' ) ) : /** * Customize WooCommerce hooks. * * @since 1.0.5 */ function business_club_customize_woocommerce_hooks() { // Breadcrumbs. if ( is_woocommerce() || is_product_category() || is_product_tag() ) { remove_action( 'woocommerce_before_main_content', 'woocommerce_breadcrumb', 20, 0 ); add_action( 'business_club_action_before_content', 'woocommerce_breadcrumb', 7 ); remove_action( 'business_club_action_before_content', 'business_club_add_breadcrumb', 7 ); } // Sidebar. $global_layout = business_club_get_option( 'global_layout' ); $global_layout = apply_filters( 'business_club_filter_theme_global_layout', $global_layout ); if ( 'no-sidebar' === $global_layout ) { remove_action( 'woocommerce_sidebar', 'woocommerce_get_sidebar', 10 ); } } endif; add_action( 'wp', 'business_club_customize_woocommerce_hooks' ); if ( ! function_exists( 'business_club_woocommerce_add_secondary_sidebar' ) ) : /** * Add secondary sidebar. * * @since 1.0.5 */ function business_club_woocommerce_add_secondary_sidebar() { $global_layout = business_club_get_option( 'global_layout' ); $global_layout = apply_filters( 'business_club_filter_theme_global_layout', $global_layout ); if ( 'three-columns' === $global_layout ) { get_sidebar( 'secondary' ); } } endif; add_action( 'woocommerce_sidebar', 'business_club_woocommerce_add_secondary_sidebar', 11 ); if ( ! function_exists( 'business_club_woocommerce_fix_global_layout' ) ) : /** * Fix global layout. * * @since 1.0.5 * * @param array $layout Layout. * @return array Customized layout. */ function business_club_woocommerce_fix_global_layout( $layout ) { if ( is_shop() ) { $shop_page_id = get_option( 'woocommerce_shop_page_id' ); if ( $shop_page_id ) { $post_options = get_post_meta( $shop_page_id, 'business_club_settings', true ); $global_layout = ''; if ( isset( $post_options['post_layout'] ) && ! empty( $post_options['post_layout'] ) ) { $global_layout = $post_options['post_layout']; } if ( $global_layout ) { $layout = esc_attr( $global_layout ); } } } return $layout; } endif; add_filter( 'business_club_filter_theme_global_layout', 'business_club_woocommerce_fix_global_layout', 15 ); includes/module/slider.php000064400000020466150212240530011634 0ustar00 esc_attr( $featured_slider_number ), 'no_found_rows' => true, 'orderby' => 'post__in', 'post_type' => 'page', 'post__in' => $ids, 'meta_query' => array( array( 'key' => '_thumbnail_id' ), ), ); // Fetch posts. $all_posts = get_posts( $qargs ); $slides = array(); if ( ! empty( $all_posts ) ) { $cnt = 0; foreach ( $all_posts as $key => $post ) { if ( has_post_thumbnail( $post->ID ) ) { $image_array = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'full' ); $slides[ $cnt ]['images'] = $image_array; $slides[ $cnt ]['title'] = $post->post_title; $slides[ $cnt ]['url'] = get_permalink( $post->ID ); $slides[ $cnt ]['excerpt'] = business_club_get_the_excerpt( apply_filters( 'business_club_filter_slider_caption_length', 30 ), $post ); if ( ! empty( $featured_slider_read_more_text ) ) { $slides[ $cnt ]['primary_button_text'] = $featured_slider_read_more_text; $slides[ $cnt ]['primary_button_url'] = $slides[ $cnt ]['url']; } $cnt++; } } } if ( ! empty( $slides ) ) { $input = $slides; } break; default: break; } return $input; } endif; add_filter( 'business_club_filter_slider_details', 'business_club_get_slider_details' ); if ( ! function_exists( 'business_club_render_featured_slider' ) ) : /** * Render featured slider. * * @since 1.0.0 * * @param array $slider_details Details of slider content. */ function business_club_render_featured_slider( $slider_details = array() ) { if ( empty( $slider_details ) ) { return; } $featured_slider_transition_effect = business_club_get_option( 'featured_slider_transition_effect' ); $featured_slider_enable_caption = business_club_get_option( 'featured_slider_enable_caption' ); $featured_slider_enable_arrow = business_club_get_option( 'featured_slider_enable_arrow' ); $featured_slider_enable_pager = business_club_get_option( 'featured_slider_enable_pager' ); $featured_slider_enable_autoplay = business_club_get_option( 'featured_slider_enable_autoplay' ); $featured_slider_transition_duration = business_club_get_option( 'featured_slider_transition_duration' ); $featured_slider_transition_delay = business_club_get_option( 'featured_slider_transition_delay' ); // Cycle data. $slide_data = array( 'fx' => esc_attr( $featured_slider_transition_effect ), 'speed' => absint( $featured_slider_transition_duration ) * 1000, 'pause-on-hover' => 'true', 'loader' => 'true', 'log' => 'false', 'swipe' => 'true', 'auto-height' => 'container', 'slides' => 'article', ); if ( $featured_slider_enable_pager ) { $slide_data['pager-template'] = ''; } if ( $featured_slider_enable_autoplay ) { $slide_data['timeout'] = absint( $featured_slider_transition_delay ) * 1000; } else { $slide_data['timeout'] = 0; } $slide_attributes_text = ''; foreach ( $slide_data as $key => $item ) { $slide_attributes_text .= ' '; $slide_attributes_text .= ' data-cycle-' . esc_attr( $key ); $slide_attributes_text .= '="' . esc_attr( $item ) . '"'; } ?>
    esc_html__( 'About Business Club', 'business-club' ), 'page_name' => esc_html__( 'About Business Club', 'business-club' ), /* translators: theme version */ 'welcome_title' => sprintf( esc_html__( 'Welcome to %s - v', 'business-club' ), 'Business Club' ), /* translators: 1: theme name */ 'welcome_content' => sprintf( esc_html__( '%1$s is now installed and ready to use! We want to make sure you have the best experience using %1$s and that is why we gathered here all the necessary information for you. We hope you will enjoy using %1$s.', 'business-club' ), 'Business Club' ), // Quick links. 'quick_links' => array( 'theme_url' => array( 'text' => esc_html__( 'Theme Details','business-club' ), 'url' => 'https://axlethemes.com/wordpress-themes/business-club/', ), 'demo_url' => array( 'text' => esc_html__( 'View Demo','business-club' ), 'url' => 'https://axlethemes.com/theme-demo/?demo=business-club', ), 'documentation_url' => array( 'text' => esc_html__( 'View Documentation','business-club' ), 'url' => 'https://axlethemes.com/documentation/business-club/', 'button' => 'primary', ), 'rate_url' => array( 'text' => esc_html__( 'Rate This Theme','business-club' ), 'url' => 'https://wordpress.org/support/theme/business-club/reviews/', ), ), // Tabs. 'tabs' => array( 'getting_started' => esc_html__( 'Getting Started', 'business-club' ), 'recommended_actions' => esc_html__( 'Recommended Actions', 'business-club' ), 'demo_content' => esc_html__( 'Demo Content', 'business-club' ), 'useful_plugins' => esc_html__( 'Useful Plugins', 'business-club' ), 'support' => esc_html__( 'Support', 'business-club' ), 'upgrade_to_pro' => esc_html__( 'Upgrade to Pro', 'business-club' ), ), // Getting started. 'getting_started' => array( array( 'title' => esc_html__( 'Theme Documentation', 'business-club' ), 'text' => esc_html__( 'Even if you are a long-time WordPress user, we still believe you should give our documentation a very quick read.', 'business-club' ), 'button_label' => esc_html__( 'View Documentation', 'business-club' ), 'button_link' => 'https://axlethemes.com/documentation/business-club/', 'is_button' => false, 'recommended_actions' => false, 'is_new_tab' => true, ), array( 'title' => esc_html__( 'Recommended Actions', 'business-club' ), 'text' => esc_html__( 'We have compiled a list of steps for you, to take make sure the experience you will have using one of our products is very easy to follow.', 'business-club' ), 'button_label' => esc_html__( 'Check Recommended Actions', 'business-club' ), 'button_link' => esc_url( admin_url( 'themes.php?page=business-club-about&tab=recommended_actions' ) ), 'is_button' => false, 'recommended_actions' => false, 'is_new_tab' => false, ), array( 'title' => esc_html__( 'Theme Demo Content', 'business-club' ), 'text' => esc_html__( 'You can easily import demo content as we have bundled demo content file within the theme folder. Importer plugin is needed.', 'business-club' ), 'button_label' => esc_html__( 'Demo Content', 'business-club' ), 'button_link' => esc_url( admin_url( 'themes.php?page=business-club-about&tab=demo_content' ) ), 'is_button' => true, 'recommended_actions' => false, 'is_new_tab' => false, ), array( 'title' => esc_html__( 'Customize Everything', 'business-club' ), 'text' => esc_html__( 'Using the WordPress Customizer you can easily customize every aspect of the theme.', 'business-club' ), 'button_label' => esc_html__( 'Go to Customizer', 'business-club' ), 'button_link' => esc_url( wp_customize_url() ), 'is_button' => true, 'recommended_actions' => false, 'is_new_tab' => false, ), array( 'title' => esc_html__( 'View Theme Demo', 'business-club' ), 'text' => esc_html__( 'To get quick glance of the theme, please visit theme demo.', 'business-club' ), 'button_label' => esc_html__( 'View Demo', 'business-club' ), 'button_link' => 'https://axlethemes.com/theme-demo/?demo=business-club', 'is_button' => false, 'recommended_actions' => false, 'is_new_tab' => true, ), array( 'title' => esc_html__( 'Child Theme', 'business-club' ), 'text' => esc_html__( 'If you want to customize theme file, you should use child theme rather than modifying theme file itself.', 'business-club' ), 'button_label' => esc_html__( 'About Child Theme', 'business-club' ), 'button_link' => 'https://developer.wordpress.org/themes/advanced-topics/child-themes/', 'is_button' => false, 'recommended_actions' => false, 'is_new_tab' => true, ), ), // Recommended actions. 'recommended_actions' => array( 'content' => array( 'front-page' => array( 'title' => esc_html__( 'Setting Static Front Page','business-club' ), 'description' => esc_html__( 'Select A static page then Front page and Posts page to display front page specific sections. Note: Static page will be set automatically when you import demo content.', 'business-club' ), 'id' => 'front-page', 'check' => ( 'page' === get_option( 'show_on_front' ) ) ? true : false, 'help' => '' . esc_html__( 'Static Front Page', 'business-club' ) . '', ), 'one-click-demo-import' => array( 'title' => esc_html__( 'One Click Demo Import', 'business-club' ), 'description' => esc_html__( 'Please install the One Click Demo Import plugin to import the demo content.', 'business-club' ), 'check' => class_exists( 'OCDI_Plugin' ), 'plugin_slug' => 'one-click-demo-import', 'id' => 'one-click-demo-import', ), ), ), // Demo content. 'demo_content' => array( 'description' => sprintf( esc_html__( 'Demo content files are bundled within this theme. %1$s plugin is needed to import demo content. Please make sure plugin is installed and activated. If you have not installed the plugin, please go to Installed Plugins page under Appearance. After plugin activation, go to Import Demo Data menu under Appearance.', 'business-club' ), '' . esc_html__( 'One Click Demo Import', 'business-club' ) . '' ), ), // Useful plugins. 'useful_plugins' => array( 'description' => esc_html__( 'This theme supports some helpful WordPress plugins to enhance your website.', 'business-club' ), 'plugins_list_title' => esc_html__( 'Useful Plugins List:', 'business-club' ), ), // Support. 'support_content' => array( 'first' => array( 'title' => esc_html__( 'Contact Support', 'business-club' ), 'icon' => 'dashicons dashicons-sos', 'text' => esc_html__( 'Got theme support question or found bug? Best place to ask your query is our dedicated Support forum.', 'business-club' ), 'button_label' => esc_html__( 'Contact Support', 'business-club' ), 'button_link' => esc_url( 'https://axlethemes.com/support-forum/forum/business-club/' ), 'is_button' => true, 'is_new_tab' => true, ), 'second' => array( 'title' => esc_html__( 'Theme Documentation', 'business-club' ), 'icon' => 'dashicons dashicons-book-alt', 'text' => esc_html__( 'Please check our theme documentation for detailed information on how to setup and use theme.', 'business-club' ), 'button_label' => esc_html__( 'View Documentation', 'business-club' ), 'button_link' => 'https://axlethemes.com/documentation/business-club/', 'is_button' => false, 'is_new_tab' => true, ), 'third' => array( 'title' => esc_html__( 'Pro Version', 'business-club' ), 'icon' => 'dashicons dashicons-products', 'icon' => 'dashicons dashicons-star-filled', 'text' => esc_html__( 'Upgrade to pro version for more exciting features and additional theme options.', 'business-club' ), 'button_label' => esc_html__( 'View Pro Version', 'business-club' ), 'button_link' => 'https://axlethemes.com/wordpress-themes/business-club-pro/', 'is_button' => true, 'is_new_tab' => true, ), 'fourth' => array( 'title' => esc_html__( 'Pre-sale Queries', 'business-club' ), 'icon' => 'dashicons dashicons-cart', 'text' => esc_html__( 'Have any query before purchase, you are more than welcome to ask.', 'business-club' ), 'button_label' => esc_html__( 'Pre-sale Question?', 'business-club' ), 'button_link' => 'https://axlethemes.com/pre-sale-question/', 'is_button' => false, 'is_new_tab' => true, ), 'fifth' => array( 'title' => esc_html__( 'Customization Request', 'business-club' ), 'icon' => 'dashicons dashicons-admin-tools', 'text' => esc_html__( 'Needed any customization for the theme, you can request from here.', 'business-club' ), 'button_label' => esc_html__( 'Customization Request', 'business-club' ), 'button_link' => 'https://axlethemes.com/customization-request/', 'is_button' => false, 'is_new_tab' => true, ), 'sixth' => array( 'title' => esc_html__( 'Child Theme', 'business-club' ), 'icon' => 'dashicons dashicons-admin-customizer', 'text' => esc_html__( 'If you want to customize theme file, you should use child theme rather than modifying theme file itself.', 'business-club' ), 'button_label' => esc_html__( 'About Child Theme', 'business-club' ), 'button_link' => 'https://developer.wordpress.org/themes/advanced-topics/child-themes/', 'is_button' => false, 'is_new_tab' => true, ), ), // Upgrade. 'upgrade_to_pro' => array( 'description' => esc_html__( 'Upgrade to pro version for more exciting features and additional theme options.', 'business-club' ), 'button_label' => esc_html__( 'Upgrade to Pro', 'business-club' ), 'button_link' => 'https://axlethemes.com/wordpress-themes/business-club-pro/', 'is_new_tab' => true, ), ); Business_Club_About::init( apply_filters( 'business_club_about_filter', $config ) ); includes/module/structure.php000064400000007357150212240530012416 0ustar00>
    'home', 'posts_page' => 'blog', 'menu_locations' => array( 'primary' => 'main-menu', 'top' => 'top-menu', 'social' => 'social-menu', ), 'ocdi' => array( array( 'import_file_name' => esc_html__( 'Theme Demo Content', 'business-club' ), 'local_import_file' => trailingslashit( get_template_directory() ) . 'demo/content.xml', 'local_import_widget_file' => trailingslashit( get_template_directory() ) . 'demo/widget.wie', 'local_import_customizer_file' => trailingslashit( get_template_directory() ) . 'demo/customizer.dat', ), ), 'intro_content' => esc_html__( 'NOTE: In demo import, category selection could be omitted in old (non-fresh) WordPress setup. After import is complete, please go to Widgets admin page under Appearance menu and select the appropriate category in the widgets.', 'business-club' ), ); Business_Club_Demo::init( apply_filters( 'business_club_demo_filter', $config ) ); includes/module/metabox.php000064400000007232150212240530012005 0ustar00ID; // Metabox nonce for verification. wp_nonce_field( basename( __FILE__ ), 'business_club_settings_meta_box_nonce' ); // Fetch values of current post meta. $values = get_post_meta( $post_id, 'business_club_settings', true ); $fields = wp_parse_args( $values, array( 'post_layout' => '', )); ?>

    'business_club_settings_post_layout', 'name' => 'business_club_settings[post_layout]', 'selected' => $fields['post_layout'], 'add_default' => true, ); business_club_render_select_dropdown( $dropdown_args, 'business_club_get_global_layout_options' ); } endif; if ( ! function_exists( 'business_club_save_theme_settings_meta' ) ) : /** * Save theme settings metabox value. * * @since 1.0.0 * * @param int $post_id Post ID. * @param WP_Post $post Post object. */ function business_club_save_theme_settings_meta( $post_id, $post ) { // Verify nonce. if (! ( isset( $_POST['business_club_settings_meta_box_nonce'] ) && wp_verify_nonce( sanitize_key( $_POST['business_club_settings_meta_box_nonce'] ), basename( __FILE__ ) ) ) ) { return; } // Bail if auto save or revision. if ( defined( 'DOING_AUTOSAVE' ) || is_int( wp_is_post_revision( $post ) ) || is_int( wp_is_post_autosave( $post ) ) ) { return; } // Check the post being saved == the $post_id to prevent triggering this call for other save_post events. if ( empty( $_POST['post_ID'] ) || absint( $_POST['post_ID'] ) !== $post_id ) { return; } // Check permission. if ( isset( $_POST['post_type'] ) && 'page' === $_POST['post_type'] ) { if ( ! current_user_can( 'edit_page', $post_id ) ) { return; } } elseif ( ! current_user_can( 'edit_post', $post_id ) ) { return; } if ( isset( $_POST['business_club_settings'] ) && is_array( $_POST['business_club_settings'] ) ) { $post_value = wp_unslash( $_POST['business_club_settings'] ); if ( ! array_filter( $post_value ) ) { delete_post_meta( $post_id, 'business_club_settings' ); } else { $meta_fields = array( 'post_layout' => array( 'type' => 'select', ), ); $sanitized_values = array(); foreach ( $post_value as $mk => $mv ) { if ( isset( $meta_fields[ $mk ]['type'] ) ) { switch ( $meta_fields[ $mk ]['type'] ) { case 'select': $sanitized_values[ $mk ] = sanitize_key( $mv ); break; case 'checkbox': $sanitized_values[ $mk ] = absint( $mv ) > 0 ? 1 : 0; break; default: $sanitized_values[ $mk ] = sanitize_text_field( $mv ); break; } } } update_post_meta( $post_id, 'business_club_settings', $sanitized_values ); } } // End if isset. } endif; add_action( 'save_post', 'business_club_save_theme_settings_meta', 10, 2 ); includes/customizer/sanitize.php000064400000013355150212240530013116 0ustar00manager->get_control( $setting->id )->choices; // If the input is a valid key, return it; otherwise, return the default. return ( array_key_exists( $input, $choices ) ? $input : $setting->default ); } endif; if ( ! function_exists( 'business_club_sanitize_checkbox' ) ) : /** * Sanitize checkbox. * * @since 1.0.0 * * @param bool $checked Whether the checkbox is checked. * @return bool Whether the checkbox is checked. */ function business_club_sanitize_checkbox( $checked ) { return ( ( isset( $checked ) && true === $checked ) ? true : false ); } endif; if ( ! function_exists( 'business_club_sanitize_positive_integer' ) ) : /** * Sanitize positive integer. * * @since 1.0.0 * * @param int $input Number to sanitize. * @param WP_Customize_Setting $setting WP_Customize_Setting instance. * @return int Sanitized number; otherwise, the setting default. */ function business_club_sanitize_positive_integer( $input, $setting ) { $input = absint( $input ); // If the input is an absolute integer, return it. // otherwise, return the default. return ( $input ? $input : $setting->default ); } endif; if ( ! function_exists( 'business_club_sanitize_dropdown_pages' ) ) : /** * Sanitize dropdown pages. * * @since 1.0.0 * * @param int $page_id Page ID. * @param WP_Customize_Setting $setting WP_Customize_Setting instance. * @return int|string Page ID if the page is published; otherwise, the setting default. */ function business_club_sanitize_dropdown_pages( $page_id, $setting ) { // Ensure $input is an absolute integer. $page_id = absint( $page_id ); // If $page_id is an ID of a published page, return it; otherwise, return the default. return ( 'publish' === get_post_status( $page_id ) ? $page_id : $setting->default ); } endif; if ( ! function_exists( 'business_club_sanitize_image' ) ) : /** * Sanitize image. * * @since 1.0.0 * * @see wp_check_filetype() https://developer.wordpress.org/reference/functions/wp_check_filetype/ * * @param string $image Image filename. * @param WP_Customize_Setting $setting WP_Customize_Setting instance. * @return string The image filename if the extension is allowed; otherwise, the setting default. */ function business_club_sanitize_image( $image, $setting ) { /** * Array of valid image file types. * * The array includes image mime types that are included in wp_get_mime_types(). */ $mimes = array( 'jpg|jpeg|jpe' => 'image/jpeg', 'gif' => 'image/gif', 'png' => 'image/png', 'bmp' => 'image/bmp', 'tif|tiff' => 'image/tiff', 'ico' => 'image/x-icon', ); // Return an array with file extension and mime_type. $file = wp_check_filetype( $image, $mimes ); // If $image has a valid mime_type, return it; otherwise, return the default. return ( $file['ext'] ? $image : $setting->default ); } endif; if ( ! function_exists( 'business_club_sanitize_number_range' ) ) : /** * Sanitize number range. * * @since 1.0.0 * * @see absint() https://developer.wordpress.org/reference/functions/absint/ * * @param int $input Number to check within the numeric range defined by the setting. * @param WP_Customize_Setting $setting WP_Customize_Setting instance. * @return int|string The number, if it is zero or greater and falls within the defined range; otherwise, the setting default. */ function business_club_sanitize_number_range( $input, $setting ) { // Ensure input is an absolute integer. $input = absint( $input ); // Get the input attributes associated with the setting. $atts = $setting->manager->get_control( $setting->id )->input_attrs; // Get min. $min = ( isset( $atts['min'] ) ? $atts['min'] : $input ); // Get max. $max = ( isset( $atts['max'] ) ? $atts['max'] : $input ); // Get Step. $step = ( isset( $atts['step'] ) ? $atts['step'] : 1 ); // If the input is within the valid range, return it; otherwise, return the default. return ( $min <= $input && $input <= $max && is_int( $input / $step ) ? $input : $setting->default ); } endif; if ( ! function_exists( 'business_club_sanitize_post_id' ) ) : /** * Sanitize post ID. * * @since 1.0.0 * * @param int $post_id Post ID. * @param WP_Customize_Setting $setting WP_Customize_Setting instance. * @return int|string Page ID if the post is published; otherwise, the setting default. */ function business_club_sanitize_post_id( $post_id, $setting ) { // Ensure $input is an absolute integer. $post_id = absint( $post_id ); // If $post_id is an ID of a published post, return it; otherwise, return the default. return ( 'publish' === get_post_status( $post_id ) ? $post_id : $setting->default ); } endif; if ( ! function_exists( 'business_club_sanitize_textarea' ) ) : /** * Sanitize textarea. * * @since 1.0.0 * * @param string $input Content to be sanitized. * @param WP_Customize_Setting $setting WP_Customize_Setting instance. * @return string Sanitized content. */ function business_club_sanitize_textarea( $input, $setting ) { return wp_kses_post( $input ); } endif; includes/customizer/control.php000064400000006373150212240530012752 0ustar00json['value'] = $this->value(); $this->json['link'] = $this->get_link(); $this->json['id'] = $this->id; } /** * Render content. * * @since 1.0.0 */ public function render_content() {} /** * Content template. * * @since 1.0.0 */ public function content_template() { ?> <# if ( data.label ) { #>

    {{ data.label }}

    <# } #> <# if ( data.description ) { #> {{ data.description }} <# } #> json['value'] = $this->value(); $this->json['link'] = $this->get_link(); $this->json['id'] = $this->id; } /** * Render content. * * @since 1.0.0 */ public function render_content() {} /** * Content template. * * @since 1.0.0 */ public function content_template() { ?> <# if ( data.label ) { #> {{ data.label }} <# } #> <# if ( data.description ) { #> {{ data.description }} <# } #> pro_text; $json['pro_url'] = esc_url( $this->pro_url ); return $json; } /** * Outputs the Underscore.js template. * * @since 1.0.0 * @access public * @return void */ protected function render_template() { ?>
  • {{ data.title }} <# if ( data.pro_text && data.pro_url ) { #> {{ data.pro_text }} <# } #>

  • add_panel( 'theme_slider_panel', array( 'title' => esc_html__( 'Featured Slider', 'business-club' ), 'priority' => 100, 'capability' => 'edit_theme_options', ) ); // Slider Type Section. $wp_customize->add_section( 'section_theme_slider_type', array( 'title' => esc_html__( 'Slider Type', 'business-club' ), 'priority' => 100, 'capability' => 'edit_theme_options', 'panel' => 'theme_slider_panel', ) ); // Setting featured_slider_status. $wp_customize->add_setting( 'theme_options[featured_slider_status]', array( 'default' => $default['featured_slider_status'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'business_club_sanitize_select', ) ); $wp_customize->add_control( 'theme_options[featured_slider_status]', array( 'label' => esc_html__( 'Enable Slider On', 'business-club' ), 'section' => 'section_theme_slider_type', 'type' => 'select', 'priority' => 100, 'choices' => business_club_get_featured_slider_content_options(), ) ); // Setting featured_slider_image_info. $wp_customize->add_setting( 'theme_options[featured_slider_image_info]', array( 'default' => '', 'capability' => 'edit_theme_options', 'sanitize_callback' => 'sanitize_text_field', ) ); $wp_customize->add_control( new Business_Club_Message_Control( $wp_customize, 'theme_options[featured_slider_image_info]', array( 'label' => esc_html__( 'Info:', 'business-club' ), 'description' => sprintf( esc_html__( 'Recommended size for slider image: %1$dpx X %2$dpx', 'business-club' ), 1920, 770 ), 'section' => 'section_theme_slider_type', 'settings' => 'theme_options[featured_slider_image_info]', 'priority' => 100, 'active_callback' => 'business_club_is_featured_slider_active', ) ) ); // Setting featured_slider_type. $wp_customize->add_setting( 'theme_options[featured_slider_type]', array( 'default' => $default['featured_slider_type'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'business_club_sanitize_select', ) ); $wp_customize->add_control( 'theme_options[featured_slider_type]', array( 'label' => esc_html__( 'Select Slider Type', 'business-club' ), 'section' => 'section_theme_slider_type', 'type' => 'select', 'priority' => 100, 'choices' => business_club_get_featured_slider_type(), 'active_callback' => 'business_club_is_featured_slider_active', ) ); // Setting featured_slider_number. $wp_customize->add_setting( 'theme_options[featured_slider_number]', array( 'default' => $default['featured_slider_number'], 'capability' => 'edit_theme_options', 'transport' => 'postMessage', 'sanitize_callback' => 'business_club_sanitize_number_range', ) ); $wp_customize->add_control( 'theme_options[featured_slider_number]', array( 'label' => esc_html__( 'No of Slides', 'business-club' ), 'description' => sprintf( esc_html__( 'Enter number between %1$d and %2$d. Save and refresh the page if No of Slides is changed.', 'business-club' ), 1, 10 ), 'section' => 'section_theme_slider_type', 'type' => 'number', 'priority' => 100, 'active_callback' => 'business_club_is_featured_slider_active', 'input_attrs' => array( 'min' => 1, 'max' => 10, 'step' => 1, 'style' => 'width: 60px;' ), ) ); $featured_slider_number = absint( business_club_get_option( 'featured_slider_number' ) ); if ( $featured_slider_number > 0 ) { for ( $i = 1; $i <= $featured_slider_number; $i++ ) { $wp_customize->add_setting( "theme_options[featured_slider_page_$i]", array( 'default' => isset( $default[ 'featured_slider_page_' . $i ] ) ? $default[ 'featured_slider_page_' . $i ] : '', 'capability' => 'edit_theme_options', 'sanitize_callback' => 'business_club_sanitize_dropdown_pages', ) ); $wp_customize->add_control( "theme_options[featured_slider_page_$i]", array( 'label' => esc_html__( 'Featured Page', 'business-club' ) . ' #' . $i, 'section' => 'section_theme_slider_type', 'type' => 'dropdown-pages', 'priority' => 100, 'active_callback' => 'business_club_is_featured_page_slider_active', ) ); } // End for loop. } // Setting featured_slider_read_more_text. $wp_customize->add_setting( 'theme_options[featured_slider_read_more_text]', array( 'default' => $default['featured_slider_read_more_text'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'sanitize_text_field', ) ); $wp_customize->add_control( 'theme_options[featured_slider_read_more_text]', array( 'label' => esc_html__( 'Read More Text', 'business-club' ), 'section' => 'section_theme_slider_type', 'type' => 'text', 'priority' => 100, 'active_callback' => 'business_club_is_featured_slider_active', ) ); // Slider Options Section. $wp_customize->add_section( 'section_theme_slider_options', array( 'title' => esc_html__( 'Slider Options', 'business-club' ), 'priority' => 100, 'capability' => 'edit_theme_options', 'panel' => 'theme_slider_panel', ) ); // Setting featured_slider_transition_effect. $wp_customize->add_setting( 'theme_options[featured_slider_transition_effect]', array( 'default' => $default['featured_slider_transition_effect'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'business_club_sanitize_select', ) ); $wp_customize->add_control( 'theme_options[featured_slider_transition_effect]', array( 'label' => esc_html__( 'Transition Effect', 'business-club' ), 'section' => 'section_theme_slider_options', 'type' => 'select', 'priority' => 100, 'choices' => business_club_get_featured_slider_transition_effects(), ) ); // Setting featured_slider_transition_delay. $wp_customize->add_setting( 'theme_options[featured_slider_transition_delay]', array( 'default' => $default['featured_slider_transition_delay'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'business_club_sanitize_number_range', ) ); $wp_customize->add_control( 'theme_options[featured_slider_transition_delay]', array( 'label' => esc_html__( 'Transition Delay', 'business-club' ), 'description' => esc_html__( 'in seconds', 'business-club' ), 'section' => 'section_theme_slider_options', 'type' => 'number', 'priority' => 100, 'input_attrs' => array( 'min' => 1, 'max' => 10, 'step' => 1, 'style' => 'width: 55px;' ), ) ); // Setting featured_slider_transition_duration. $wp_customize->add_setting( 'theme_options[featured_slider_transition_duration]', array( 'default' => $default['featured_slider_transition_duration'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'business_club_sanitize_number_range', ) ); $wp_customize->add_control( 'theme_options[featured_slider_transition_duration]', array( 'label' => esc_html__( 'Transition Duration', 'business-club' ), 'description' => esc_html__( 'in seconds', 'business-club' ), 'section' => 'section_theme_slider_options', 'type' => 'number', 'priority' => 100, 'input_attrs' => array( 'min' => 1, 'max' => 10, 'step' => 1, 'style' => 'width: 55px;' ), ) ); // Setting featured_slider_enable_caption. $wp_customize->add_setting( 'theme_options[featured_slider_enable_caption]', array( 'default' => $default['featured_slider_enable_caption'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'business_club_sanitize_checkbox', ) ); $wp_customize->add_control( 'theme_options[featured_slider_enable_caption]', array( 'label' => esc_html__( 'Enable Caption', 'business-club' ), 'section' => 'section_theme_slider_options', 'type' => 'checkbox', 'priority' => 100, ) ); // Setting featured_slider_enable_arrow. $wp_customize->add_setting( 'theme_options[featured_slider_enable_arrow]', array( 'default' => $default['featured_slider_enable_arrow'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'business_club_sanitize_checkbox', ) ); $wp_customize->add_control( 'theme_options[featured_slider_enable_arrow]', array( 'label' => esc_html__( 'Enable Arrow', 'business-club' ), 'section' => 'section_theme_slider_options', 'type' => 'checkbox', 'priority' => 100, ) ); // Setting featured_slider_enable_pager. $wp_customize->add_setting( 'theme_options[featured_slider_enable_pager]', array( 'default' => $default['featured_slider_enable_pager'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'business_club_sanitize_checkbox', ) ); $wp_customize->add_control( 'theme_options[featured_slider_enable_pager]', array( 'label' => esc_html__( 'Enable Pager', 'business-club' ), 'section' => 'section_theme_slider_options', 'type' => 'checkbox', 'priority' => 100, ) ); // Setting featured_slider_enable_autoplay. $wp_customize->add_setting( 'theme_options[featured_slider_enable_autoplay]', array( 'default' => $default['featured_slider_enable_autoplay'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'business_club_sanitize_checkbox', ) ); $wp_customize->add_control( 'theme_options[featured_slider_enable_autoplay]', array( 'label' => esc_html__( 'Enable Autoplay', 'business-club' ), 'section' => 'section_theme_slider_options', 'type' => 'checkbox', 'priority' => 100, ) ); includes/customizer/callback.php000064400000002362150212240530013020 0ustar00manager->get_setting( 'theme_options[featured_slider_status]' )->value() ) { return true; } else { return false; } } endif; if ( ! function_exists( 'business_club_is_featured_page_slider_active' ) ) : /** * Check if featured page slider is active. * * @since 1.0.0 * * @param WP_Customize_Control $control WP_Customize_Control instance. * * @return bool Whether the control is active to the current preview. */ function business_club_is_featured_page_slider_active( $control ) { if ('featured-page' === $control->manager->get_setting( 'theme_options[featured_slider_type]' )->value() && 'disabled' !== $control->manager->get_setting( 'theme_options[featured_slider_status]' )->value() ) { return true; } else { return false; } } endif; includes/customizer/option.php000064400000015150150212240530012573 0ustar00add_panel( 'theme_option_panel', array( 'title' => esc_html__( 'Theme Options', 'business-club' ), 'priority' => 100, 'capability' => 'edit_theme_options', ) ); // Header Section. $wp_customize->add_section( 'section_header', array( 'title' => esc_html__( 'Header Options', 'business-club' ), 'priority' => 100, 'capability' => 'edit_theme_options', 'panel' => 'theme_option_panel', ) ); // Setting show_title. $wp_customize->add_setting( 'theme_options[show_title]', array( 'default' => $default['show_title'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'business_club_sanitize_checkbox', ) ); $wp_customize->add_control( 'theme_options[show_title]', array( 'label' => esc_html__( 'Show Site Title', 'business-club' ), 'section' => 'section_header', 'type' => 'checkbox', 'priority' => 100, ) ); // Setting show_tagline. $wp_customize->add_setting( 'theme_options[show_tagline]', array( 'default' => $default['show_tagline'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'business_club_sanitize_checkbox', ) ); $wp_customize->add_control( 'theme_options[show_tagline]', array( 'label' => esc_html__( 'Show Tagline', 'business-club' ), 'section' => 'section_header', 'type' => 'checkbox', 'priority' => 100, ) ); // Setting contact_number. $wp_customize->add_setting( 'theme_options[contact_number]', array( 'default' => $default['contact_number'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'sanitize_text_field', ) ); $wp_customize->add_control( 'theme_options[contact_number]', array( 'label' => __( 'Contact Number', 'business-club' ), 'section' => 'section_header', 'type' => 'text', 'priority' => 100, ) ); // Setting contact_email. $wp_customize->add_setting( 'theme_options[contact_email]', array( 'default' => $default['contact_email'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'sanitize_email', ) ); $wp_customize->add_control( 'theme_options[contact_email]', array( 'label' => __( 'Contact Email', 'business-club' ), 'section' => 'section_header', 'type' => 'text', 'priority' => 100, ) ); // Setting show_social_in_header. $wp_customize->add_setting( 'theme_options[show_social_in_header]', array( 'default' => $default['show_social_in_header'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'business_club_sanitize_checkbox', ) ); $wp_customize->add_control( 'theme_options[show_social_in_header]', array( 'label' => __( 'Enable Social Icons', 'business-club' ), 'section' => 'section_header', 'type' => 'checkbox', 'priority' => 100, ) ); $wp_customize->add_setting( 'theme_options[show_search_in_header]', array( 'default' => $default['show_search_in_header'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'business_club_sanitize_checkbox', ) ); $wp_customize->add_control( 'theme_options[show_search_in_header]', array( 'label' => esc_html__( 'Enable Search Form', 'business-club' ), 'section' => 'section_header', 'type' => 'checkbox', 'priority' => 100, ) ); // Layout Section. $wp_customize->add_section( 'section_layout', array( 'title' => esc_html__( 'Layout Options', 'business-club' ), 'priority' => 100, 'capability' => 'edit_theme_options', 'panel' => 'theme_option_panel', ) ); // Setting global_layout. $wp_customize->add_setting( 'theme_options[global_layout]', array( 'default' => $default['global_layout'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'business_club_sanitize_select', ) ); $wp_customize->add_control( 'theme_options[global_layout]', array( 'label' => esc_html__( 'Global Layout', 'business-club' ), 'section' => 'section_layout', 'type' => 'select', 'choices' => business_club_get_global_layout_options(), 'priority' => 100, ) ); // Setting archive_layout. $wp_customize->add_setting( 'theme_options[archive_layout]', array( 'default' => $default['archive_layout'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'business_club_sanitize_select', ) ); $wp_customize->add_control( 'theme_options[archive_layout]', array( 'label' => esc_html__( 'Archive Layout', 'business-club' ), 'section' => 'section_layout', 'type' => 'select', 'choices' => business_club_get_archive_layout_options(), 'priority' => 100, ) ); // Footer Section. $wp_customize->add_section( 'section_footer', array( 'title' => esc_html__( 'Footer Options', 'business-club' ), 'priority' => 100, 'capability' => 'edit_theme_options', 'panel' => 'theme_option_panel', ) ); // Setting copyright_text. $wp_customize->add_setting( 'theme_options[copyright_text]', array( 'default' => $default['copyright_text'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'sanitize_text_field', ) ); $wp_customize->add_control( 'theme_options[copyright_text]', array( 'label' => esc_html__( 'Copyright Text', 'business-club' ), 'section' => 'section_footer', 'type' => 'text', 'priority' => 100, ) ); // Blog Section. $wp_customize->add_section( 'section_blog', array( 'title' => esc_html__( 'Blog Options', 'business-club' ), 'priority' => 100, 'capability' => 'edit_theme_options', 'panel' => 'theme_option_panel', ) ); // Setting excerpt_length. $wp_customize->add_setting( 'theme_options[excerpt_length]', array( 'default' => $default['excerpt_length'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'business_club_sanitize_positive_integer', ) ); $wp_customize->add_control( 'theme_options[excerpt_length]', array( 'label' => esc_html__( 'Excerpt Length', 'business-club' ), 'description' => esc_html__( 'in words', 'business-club' ), 'section' => 'section_blog', 'type' => 'number', 'priority' => 100, 'input_attrs' => array( 'min' => 1, 'max' => 200, 'style' => 'width: 60px;' ), ) ); // Setting read_more_text. $wp_customize->add_setting( 'theme_options[read_more_text]', array( 'default' => $default['read_more_text'], 'capability' => 'edit_theme_options', 'sanitize_callback' => 'sanitize_text_field', ) ); $wp_customize->add_control( 'theme_options[read_more_text]', array( 'label' => esc_html__( 'Read More Text', 'business-club' ), 'section' => 'section_blog', 'type' => 'text', 'priority' => 100, ) ); includes/core.php000064400000005366150212240530010017 0ustar00 0 ) { $length = absint( $excerpt_length ); } return $length; } endif; add_filter( 'excerpt_length', 'business_club_implement_excerpt_length', 999 ); if ( ! function_exists( 'business_club_implement_read_more' ) ) : /** * Implement excerpt read more. * * @since 1.0.0 * * @param string $more The string shown within the more link. * @return string The excerpt. */ function business_club_implement_read_more( $more ) { return '…'; } endif; add_filter( 'excerpt_more', 'business_club_implement_read_more' ); if ( ! function_exists( 'business_club_content_more_link' ) ) : /** * Implement content read more. * * @since 1.0.0 * * @param string $more_link Read More link element. * @param string $more_link_text Read More text. * @return string Link. */ function business_club_content_more_link( $more_link, $more_link_text ) { return '…'; } endif; add_filter( 'the_content_more_link', 'business_club_content_more_link', 10, 2 ); if ( ! function_exists( 'business_club_custom_body_class' ) ) : /** * Custom body class. * * @since 1.0.0 * * @param string|array $input Array of classes. * @return array Modified array of classes. */ function business_club_custom_body_class( $input ) { // Adds a class of group-blog to blogs with more than 1 published author. if ( is_multi_author() ) { $input[] = 'group-blog'; } // Global layout. global $post; $global_layout = business_club_get_option( 'global_layout' ); $global_layout = apply_filters( 'business_club_filter_theme_global_layout', $global_layout ); // Check if single template. if ( $post && is_singular() ) { $post_options = get_post_meta( $post->ID, 'business_club_settings', true ); if ( isset( $post_options['post_layout'] ) && ! empty( $post_options['post_layout'] ) ) { $global_layout = $post_options['post_layout']; } } $input[] = 'global-layout-' . esc_attr( $global_layout ); // Common class for three columns. switch ( $global_layout ) { case 'three-columns': $input[] = 'three-columns-enabled'; break; default: break; } return $input; } endif; add_filter( 'body_class', 'business_club_custom_body_class' ); if ( ! function_exists( 'business_club_custom_content_width' ) ) : /** * Custom content width. * * @since 1.0.0 */ function business_club_custom_content_width() { global $post, $wp_query, $content_width; $global_layout = business_club_get_option( 'global_layout' ); $global_layout = apply_filters( 'business_club_filter_theme_global_layout', $global_layout ); // Check if single template. if ( $post && is_singular() ) { $post_options = get_post_meta( $post->ID, 'business_club_settings', true ); if ( isset( $post_options['post_layout'] ) && ! empty( $post_options['post_layout'] ) ) { $global_layout = $post_options['post_layout']; } } switch ( $global_layout ) { case 'no-sidebar': $content_width = 1220; break; case 'three-columns': $content_width = 570; break; case 'left-sidebar': case 'right-sidebar': $content_width = 895; break; default: break; } } endif; add_filter( 'template_redirect', 'business_club_custom_content_width' ); includes/start.php000064400000003643150212240530010220 0ustar00 esc_html__( 'Left Sidebar', 'business-club' ), 'right-sidebar' => esc_html__( 'Right Sidebar', 'business-club' ), 'three-columns' => esc_html__( 'Three Columns', 'business-club' ), 'no-sidebar' => esc_html__( 'No Sidebar', 'business-club' ), ); return $choices; } endif; if ( ! function_exists( 'business_club_get_archive_layout_options' ) ) : /** * Returns archive layout options. * * @since 1.0.0 * * @return array Options array. */ function business_club_get_archive_layout_options() { $choices = array( 'full' => esc_html__( 'Full Post', 'business-club' ), 'excerpt' => esc_html__( 'Post Excerpt', 'business-club' ), ); return $choices; } endif; if ( ! function_exists( 'business_club_get_image_sizes_options' ) ) : /** * Returns image sizes options. * * @since 1.0.0 * * @param bool $add_disable True for adding No Image option. * @param array $allowed Allowed image size options. * @param bool $show_dimension True for showing dimension. * @return array Image size options. */ function business_club_get_image_sizes_options( $add_disable = true, $allowed = array(), $show_dimension = true ) { global $_wp_additional_image_sizes; $choices = array(); if ( true === $add_disable ) { $choices['disable'] = esc_html__( 'No Image', 'business-club' ); } $choices['thumbnail'] = esc_html__( 'Thumbnail', 'business-club' ); $choices['medium'] = esc_html__( 'Medium', 'business-club' ); $choices['large'] = esc_html__( 'Large', 'business-club' ); $choices['full'] = esc_html__( 'Full (original)', 'business-club' ); if ( true === $show_dimension ) { foreach ( array( 'thumbnail', 'medium', 'large' ) as $key => $size ) { $choices[ $size ] = $choices[ $size ] . ' (' . get_option( $size . '_size_w' ) . 'x' . get_option( $size . '_size_h' ) . ')'; } } if ( ! empty( $_wp_additional_image_sizes ) && is_array( $_wp_additional_image_sizes ) ) { foreach ( $_wp_additional_image_sizes as $key => $size ) { $choices[ $key ] = $key; if ( true === $show_dimension ) { $choices[ $key ] .= ' (' . $size['width'] . 'x' . $size['height'] . ')'; } } } if ( ! empty( $allowed ) ) { foreach ( $choices as $key => $value ) { if ( ! in_array( $key, $allowed, true ) ) { unset( $choices[ $key ] ); } } } return $choices; } endif; if ( ! function_exists( 'business_club_get_image_alignment_options' ) ) : /** * Returns image options. * * @since 1.0.0 * * @return array Options array. */ function business_club_get_image_alignment_options() { $choices = array( 'none' => esc_html_x( 'None', 'alignment', 'business-club' ), 'left' => esc_html_x( 'Left', 'alignment', 'business-club' ), 'center' => esc_html_x( 'Center', 'alignment', 'business-club' ), 'right' => esc_html_x( 'Right', 'alignment', 'business-club' ), ); return $choices; } endif; if ( ! function_exists( 'business_club_get_featured_slider_transition_effects' ) ) : /** * Returns the featured slider transition effects. * * @since 1.0.0 * * @return array Options array. */ function business_club_get_featured_slider_transition_effects() { $choices = array( 'fade' => esc_html_x( 'fade', 'transition effect', 'business-club' ), 'fadeout' => esc_html_x( 'fadeout', 'transition effect', 'business-club' ), 'none' => esc_html_x( 'none', 'transition effect', 'business-club' ), 'scrollHorz' => esc_html_x( 'scrollHorz', 'transition effect', 'business-club' ), ); ksort( $choices ); return $choices; } endif; if ( ! function_exists( 'business_club_get_featured_slider_content_options' ) ) : /** * Returns the featured slider content options. * * @since 1.0.0 * * @return array Options array. */ function business_club_get_featured_slider_content_options() { $choices = array( 'home-page' => esc_html__( 'Static Front Page', 'business-club' ), 'disabled' => esc_html__( 'Disabled', 'business-club' ), ); return $choices; } endif; if ( ! function_exists( 'business_club_get_featured_slider_type' ) ) : /** * Returns the featured slider type. * * @since 1.0.0 * * @return array Options array. */ function business_club_get_featured_slider_type() { $choices = array( 'featured-page' => esc_html__( 'Featured Pages', 'business-club' ), ); return $choices; } endif; vendors/tgm/class-tgm-plugin-activation.php000064400000360734150212240530015060 0ustar00wp_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 ) ); // 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', 'business-club' ), 'menu_title' => __( 'Install Plugins', 'business-club' ), /* translators: %s: plugin name. */ 'installing' => __( 'Installing Plugin: %s', 'business-club' ), /* translators: %s: plugin name. */ 'updating' => __( 'Updating Plugin: %s', 'business-club' ), 'oops' => __( 'Something went wrong with the plugin API.', 'business-club' ), '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.', 'business-club' ), '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.', 'business-club' ), '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.', 'business-club' ), '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.', 'business-club' ), '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.', 'business-club' ), '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.', 'business-club' ), 'install_link' => _n_noop( 'Begin installing plugin', 'Begin installing plugins', 'business-club' ), 'update_link' => _n_noop( 'Begin updating plugin', 'Begin updating plugins', 'business-club' ), 'activate_link' => _n_noop( 'Begin activating plugin', 'Begin activating plugins', 'business-club' ), 'return' => __( 'Return to Required Plugins Installer', 'business-club' ), 'dashboard' => __( 'Return to the Dashboard', 'business-club' ), 'plugin_activated' => __( 'Plugin activated successfully.', 'business-club' ), 'activated_successfully' => __( 'The following plugin was activated successfully:', 'business-club' ), /* translators: 1: plugin name. */ 'plugin_already_active' => __( 'No action taken. Plugin %1$s was already active.', 'business-club' ), /* 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.', 'business-club' ), /* translators: 1: dashboard link. */ 'complete' => __( 'All plugins installed and activated successfully. %1$s', 'business-club' ), 'dismiss' => __( 'Dismiss this notice', 'business-club' ), 'notice_cannot_install_activate' => __( 'There are one or more required or recommended plugins to install, update or activate.', 'business-club' ), 'contact_admin' => __( 'Please contact the administrator of this site for help.', 'business-club' ), ); 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' ) ); } } /** * 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( '%3$s', esc_url( $this->get_tgmpa_status_url( 'update' ) ), esc_attr__( 'This plugin needs to be updated to be compatible with your theme.', 'business-club' ), esc_html__( 'Update Required', 'business-club' ) ); 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 ) { $this->page_hook = add_theme_page( $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 ); ?>

    prepare_items(); ?> message ) && is_string( $this->message ) ) { echo wp_kses_post( $this->message ); } ?> views(); ?>
    display(); ?>
    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 '

    ', sprintf( esc_html( $this->strings['complete'] ), '' . esc_html__( 'Return to the Dashboard', 'business-club' ) . '' ), '

    '; echo ''; } else { echo '

    ', esc_html( $this->strings['return'] ), '

    '; } 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.', 'business-club' ) . ' ' . esc_html__( 'Please contact the plugin provider and ask them to package their plugin according to the WordPress guidelines.', 'business-club' ), 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.', 'business-club' ) . ' ' . esc_html__( 'Please contact the plugin provider and ask them to package their plugin according to the WordPress guidelines.', 'business-club' ), 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 '

    ', wp_kses_post( $activate->get_error_message() ), '

    ', '

    ', esc_html( $this->strings['return'] ), '

    '; 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 '

    ', esc_html( $this->strings['activated_successfully'] ), ' ', esc_html( $this->plugins[ $slug ]['name'] ), '.

    '; } } else { // Simpler message layout for use on the plugin install page. echo '

    ', esc_html( $this->strings['plugin_activated'] ), '

    '; } } } elseif ( $this->is_plugin_active( $slug ) ) { // No simpler message format provided as this message should never be encountered // on the plugin install page. echo '

    ', sprintf( esc_html( $this->strings['plugin_already_active'] ), '' . esc_html( $this->plugins[ $slug ]['name'] ) . '' ), '

    '; } 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 '

    ', sprintf( esc_html( $this->strings['plugin_needs_higher_version'] ), '' . esc_html( $this->plugins[ $slug ]['name'] ) . '' ), '

    '; } } else { // Simpler message layout for use on the plugin install page. echo '

    ', sprintf( esc_html( $this->strings['plugin_needs_higher_version'] ), esc_html( $this->plugins[ $slug ]['name'] ) ), '

    '; } } 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

    and as the final message can't be // filtered, using

    's in our html would render invalid html output. $line_template = '%s' . "\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', 'business-club' ) . ' ' . $last_plugin ); $rendered .= sprintf( $line_template, sprintf( translate_nooped_plural( $this->strings[ $type ], $count, 'business-club' ), $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 ? '' . esc_html( $this->strings['dismiss'] ) . '' : '', ); $link_template = '%1$s'; 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, 'business-club' ), 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, 'business-club' ), 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, 'business-club' ), 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( '%2$s', 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( '%2$s', 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 '

    ', esc_html( sprintf( /* translators: %s: version number */ __( 'TGMPA v%s', 'business-club' ), self::TGMPA_VERSION ) ), '

    '; } /** * 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 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'] = '' . $this->tgmpa->get_info_link( $slug ) . ''; $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', 'business-club' ); } return __( 'Recommended', 'business-club' ); } /** * 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', 'business-club' ); break; case 'external': $string = __( 'External Source', 'business-club' ); break; case 'bundled': $string = __( 'Pre-Packaged', 'business-club' ); 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', 'business-club' ); } if ( ! $this->tgmpa->is_plugin_active( $slug ) ) { $install_status = __( 'Installed But Not Activated', 'business-club' ); } else { $install_status = __( 'Active', 'business-club' ); } $update_status = ''; if ( $this->tgmpa->does_plugin_require_update( $slug ) && false === $this->tgmpa->does_plugin_have_update( $slug ) ) { $update_status = __( 'Required Update not Available', 'business-club' ); } elseif ( $this->tgmpa->does_plugin_require_update( $slug ) ) { $update_status = __( 'Requires Update', 'business-club' ); } elseif ( false !== $this->tgmpa->does_plugin_have_update( $slug ) ) { $update_status = __( 'Update recommended', 'business-club' ); } if ( '' === $update_status ) { return $install_status; } return sprintf( /* translators: 1: install status, 2: update status */ _x( '%1$s, %2$s', 'Install/Update Status', 'business-club' ), $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 (%s)', 'All (%s)', $count, 'plugins', 'business-club' ); break; case 'install': /* translators: 1: number of plugins. */ $text = _n( 'To Install (%s)', 'To Install (%s)', $count, 'business-club' ); break; case 'update': /* translators: 1: number of plugins. */ $text = _n( 'Update Available (%s)', 'Update Available (%s)', $count, 'business-club' ); break; case 'activate': /* translators: 1: number of plugins. */ $text = _n( 'To Activate (%s)', 'To Activate (%s)', $count, 'business-club' ); break; default: $text = ''; break; } if ( ! empty( $text ) ) { $status_links[ $type ] = sprintf( '%s', 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( '', 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"', 'business-club' ); $color = ''; if ( ! empty( $item['minimum_version'] ) && $this->tgmpa->does_plugin_require_update( $item['slug'] ) ) { $color = ' color: #ff0000; font-weight: bold;'; } $output[] = sprintf( '

    %2$s' . __( 'Installed version:', 'business-club' ) . '

    ', $color, $installed ); } if ( ! empty( $item['minimum_version'] ) ) { $output[] = sprintf( '

    %1$s' . __( 'Minimum required version:', 'business-club' ) . '

    ', $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( '

    %2$s' . __( 'Available version:', 'business-club' ) . '

    ', $color, $item['available_version'] ); } if ( empty( $output ) ) { return ' '; // 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.', 'business-club' ) . ' ' . esc_html__( 'Return to the Dashboard', 'business-club' ) . ''; echo ''; } /** * 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' => '', 'plugin' => __( 'Plugin', 'business-club' ), 'source' => __( 'Source', 'business-club' ), 'type' => __( 'Type', 'business-club' ), ); if ( 'all' === $this->view_context || 'update' === $this->view_context ) { $columns['version'] = __( 'Version', 'business-club' ); $columns['status'] = __( 'Status', 'business-club' ); } 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', 'business-club' ); } 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', 'business-club' ); } // 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', 'business-club' ); } } // 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( '' . esc_html( $text ) . '', // $text contains the second placeholder. esc_url( $nonce_url ), '' . esc_html( $item['sanitized_plugin'] ) . '' ); } $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 ' '; } /** * 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', 'business-club' ); } } if ( 'install' !== $this->view_context ) { if ( current_user_can( 'update_plugins' ) ) { $actions['tgmpa-bulk-update'] = __( 'Update', 'business-club' ); } if ( current_user_can( 'activate_plugins' ) ) { $actions['tgmpa-bulk-activate'] = __( 'Activate', 'business-club' ); } } 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.', 'business-club' ); } else { $message = __( 'No plugins were selected to be updated. No action taken.', 'business-club' ); } echo '

    ', esc_html( $message ), '

    '; 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.', 'business-club' ); } else { $message = __( 'No plugins are available to be updated at this time.', 'business-club' ); } echo '

    ', esc_html( $message ), '

    '; 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 '
    ', '

    ', esc_html( get_admin_page_title() ), '

    '; // 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 '
    '; 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 '

    ', esc_html__( 'No plugins were selected to be activated. No action taken.', 'business-club' ), '

    '; 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 '

    ', esc_html__( 'No plugins are available to be activated at this time.', 'business-club' ), '

    '; 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 '

    ', wp_kses_post( $activate->get_error_message() ), '

    '; } 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', 'business-club' ) . ' ' . $last_plugin ); printf( // WPCS: xss ok. '

    %1$s %2$s.

    ', esc_html( _n( 'The following plugin was activated successfully:', 'The following plugins were activated successfully:', $count, 'business-club' ) ), $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.', 'business-club' ); $this->strings['activation_success'] = __( 'Plugin activated successfully.', 'business-club' ); } /** * 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'] . "
    \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)', 'business-club' ); } else { /* translators: 1: plugin name, 2: error message. */ $this->upgrader->strings['skin_update_failed_error'] = __( 'An error occurred while installing %1$s: %2$s.', 'business-club' ); /* translators: 1: plugin name. */ $this->upgrader->strings['skin_update_failed'] = __( 'The installation of %1$s failed.', 'business-club' ); 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.', 'business-club' ); /* translators: 1: plugin name. */ $this->upgrader->strings['skin_update_successful'] = __( '%1$s installed and activated successfully.', 'business-club' ) . ' ' . esc_html__( 'Show Details', 'business-club' ) . '.'; $this->upgrader->strings['skin_upgrade_end'] = __( 'All installations and activations have been completed.', 'business-club' ); /* 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)', 'business-club' ); } 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.', 'business-club' ); /* translators: 1: plugin name. */ $this->upgrader->strings['skin_update_successful'] = esc_html__( '%1$s installed successfully.', 'business-club' ) . ' ' . esc_html__( 'Show Details', 'business-club' ) . '.'; $this->upgrader->strings['skin_upgrade_end'] = __( 'All installations have been completed.', 'business-club' ); /* 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)', 'business-club' ); } } } /** * 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 ''; $update_actions['dashboard'] = sprintf( esc_html( $this->tgmpa->strings['complete'] ), '' . esc_html__( 'Return to the Dashboard', 'business-club' ) . '' ); } else { $update_actions['tgmpa_page'] = '' . esc_html( $this->tgmpa->strings['return'] ) . ''; } /** * 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 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 '' . wp_kses_post( $string ) . ''; } /** * Wrap an arbitrary string in 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 '' . wp_kses_post( $string ) . ''; } /** * 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 vendors/demo/class-demo.php000064400000006721150212240530011710 0ustar00config = $config; self::$instance->setup_actions(); } } } /** * Setup actions. * * @since 1.0.0 */ public function setup_actions() { // Disable branding. add_filter( 'pt-ocdi/disable_pt_branding', '__return_true' ); // OCDI import files. add_filter( 'pt-ocdi/import_files', array( $this, 'ocdi_files' ), 99 ); // OCDI after import. add_action( 'pt-ocdi/after_import', array( $this, 'ocdi_after_import' ) ); // OCDI additional intro text. add_filter( 'pt-ocdi/plugin_intro_text', array( $this, 'additional_intro_text' ) ); } /** * OCDI files. * * @since 1.0.0 */ public function ocdi_files() { $ocdi = isset( $this->config['ocdi'] ) ? $this->config['ocdi'] : array(); return $ocdi; } /** * Intro message. * * @since 1.0.0 * * @param string $intro Intro. * @return string Modified intro. */ public function additional_intro_text( $intro ) { $intro_content = isset( $this->config['intro_content'] ) ? $this->config['intro_content'] : ''; if ( ! empty( $intro_content ) ) { $message = '
    '; $message .= wp_kses_post( wpautop( $intro_content ) ); $message .= '
    '; $intro .= $message; } return $intro; } /** * OCDI after import. * * @since 1.0.0 */ public function ocdi_after_import() { // Set static front page. $static_page = isset( $this->config['static_page'] ) ? $this->config['static_page'] : ''; $posts_page = isset( $this->config['posts_page'] ) ? $this->config['posts_page'] : ''; update_option( 'show_on_front', 'page' ); $pages = array( 'page_on_front' => $static_page, 'page_for_posts' => $posts_page, ); foreach ( $pages as $option_key => $slug ) { $result = get_page_by_path( $slug ); if ( $result ) { if ( is_array( $result ) ) { $object = array_shift( $result ); } else { $object = $result; } update_option( $option_key, $object->ID ); } } // Set menu locations. $menu_details = isset( $this->config['menu_locations'] ) ? $this->config['menu_locations'] : array(); if ( ! empty( $menu_details ) ) { $nav_settings = array(); $current_menus = wp_get_nav_menus(); if ( ! empty( $current_menus ) && ! is_wp_error( $current_menus ) ) { foreach ( $current_menus as $menu ) { foreach ( $menu_details as $location => $menu_slug ) { if ( $menu->slug === $menu_slug ) { $nav_settings[ $location ] = $menu->term_id; } } } } set_theme_mod( 'nav_menu_locations', $nav_settings ); } } } } // End if(). vendors/breadcrumbs/breadcrumbs.php000064400000114224150212240530013515 0ustar00 * @copyright Copyright (c) 2008 - 2015, Justin Tadlock * @link http://themehybrid.com/plugins/breadcrumb-trail * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html */ /** * Shows a breadcrumb for all types of pages. This is a wrapper function for the Breadcrumb_Trail class, * which should be used in theme templates. * * @since 0.1.0 * @access public * @param array $args Arguments to pass to Breadcrumb_Trail. * @return void|string */ function breadcrumb_trail( $args = array() ) { $breadcrumb = apply_filters( 'breadcrumb_trail_object', null, $args ); if ( !is_object( $breadcrumb ) ) $breadcrumb = new Breadcrumb_Trail( $args ); return $breadcrumb->trail(); } /** * Creates a breadcrumbs menu for the site based on the current page that's being viewed by the user. * * @since 0.6.0 * @access public */ class Breadcrumb_Trail { /** * Array of items belonging to the current breadcrumb trail. * * @since 0.1.0 * @access public * @var array */ public $items = array(); /** * Arguments used to build the breadcrumb trail. * * @since 0.1.0 * @access public * @var array */ public $args = array(); /** * Array of text labels. * * @since 1.0.0 * @access public * @var array */ public $labels = array(); /** * Array of post types (key) and taxonomies (value) to use for single post views. * * @since 1.0.0 * @access public * @var array */ public $post_taxonomy = array(); /* ====== Magic Methods ====== */ /** * Magic method to use in case someone tries to output the layout object as a string. * We'll just return the trail HTML. * * @since 1.0.0 * @access public * @return string */ public function __toString() { return $this->trail(); } /** * Sets up the breadcrumb trail properties. Calls the `Breadcrumb_Trail::add_items()` method * to creat the array of breadcrumb items. * * @since 0.6.0 * @access public * @param array $args { * @type string $container Container HTML element. nav|div * @type string $before String to output before breadcrumb menu. * @type string $after String to output after breadcrumb menu. * @type bool $show_on_front Whether to show when `is_front_page()`. * @type bool $network Whether to link to the network main site (multisite only). * @type bool $show_title Whether to show the title (last item) in the trail. * @type bool $show_browse Whether to show the breadcrumb menu header. * @type array $labels Text labels. @see Breadcrumb_Trail::set_labels() * @type array $post_taxonomy Taxonomies to use for post types. @see Breadcrumb_Trail::set_post_taxonomy() * @type bool $echo Whether to print or return the breadcrumbs. * } * @return void */ public function __construct( $args = array() ) { $defaults = array( 'container' => 'nav', 'before' => '', 'after' => '', 'show_on_front' => true, 'network' => false, 'show_title' => true, 'show_browse' => true, 'labels' => array(), 'post_taxonomy' => array(), 'echo' => true ); // Parse the arguments with the deaults. $this->args = apply_filters( 'breadcrumb_trail_args', wp_parse_args( $args, $defaults ) ); // Set the labels and post taxonomy properties. $this->set_labels(); $this->set_post_taxonomy(); // Let's find some items to add to the trail! $this->add_items(); } /* ====== Public Methods ====== */ /** * Formats the HTML output for the breadcrumb trail. * * @since 0.6.0 * @access public * @return string */ public function trail() { // Set up variables that we'll need. $breadcrumb = ''; $item_count = count( $this->items ); $item_position = 0; // Connect the breadcrumb trail if there are items in the trail. if ( 0 < $item_count ) { // Add 'browse' label if it should be shown. if ( true === $this->args['show_browse'] ) $breadcrumb .= sprintf( '

    %s

    ', $this->labels['browse'] ); // Open the unordered list. $breadcrumb .= '
      '; // Add the number of items and item list order schema. $breadcrumb .= sprintf( '', absint( $item_count ) ); $breadcrumb .= ''; // Loop through the items and add them to the list. foreach ( $this->items as $item ) { // Iterate the item position. ++$item_position; // Check if the item is linked. preg_match( '/()(.*?)(<\/a>)/i', $item, $matches ); // Wrap the item text with appropriate itemprop. $item = !empty( $matches ) ? sprintf( '%s%s%s', $matches[1], $matches[2], $matches[3] ) : sprintf( '%s', $item ); // Add list item classes. $item_class = 'trail-item'; if ( 1 === $item_position && 1 < $item_count ) $item_class .= ' trail-begin'; elseif ( $item_count === $item_position ) $item_class .= ' trail-end'; // Create list item attributes. $attributes = 'itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem" class="' . $item_class . '"'; // Build the meta position HTML. $meta = sprintf( '', absint( $item_position ) ); // Build the list item. $breadcrumb .= sprintf( '
    • %s%s
    • ', $attributes, $item, $meta ); } // Close the unordered list. $breadcrumb .= '
    '; // Wrap the breadcrumb trail. $breadcrumb = sprintf( '<%1$s role="navigation" aria-label="%2$s" class="breadcrumb-trail breadcrumbs" itemprop="breadcrumb">%3$s%4$s%5$s', tag_escape( $this->args['container'] ), esc_attr( $this->labels['aria_label'] ), $this->args['before'], $breadcrumb, $this->args['after'] ); } // Allow developers to filter the breadcrumb trail HTML. $breadcrumb = apply_filters( 'breadcrumb_trail', $breadcrumb, $this->args ); if ( false === $this->args['echo'] ) return $breadcrumb; echo $breadcrumb; } /* ====== Protected Methods ====== */ /** * Sets the labels property. Parses the inputted labels array with the defaults. * * @since 1.0.0 * @access protected * @return void */ protected function set_labels() { $defaults = array( 'browse' => esc_html__( 'Browse:', 'business-club' ), 'aria_label' => esc_attr_x( 'Breadcrumbs', 'breadcrumbs aria label', 'business-club' ), 'home' => esc_html__( 'Home', 'business-club' ), 'error_404' => esc_html__( '404 Not Found', 'business-club' ), 'archives' => esc_html__( 'Archives', 'business-club' ), // Translators: %s is the search query. The HTML entities are opening and closing curly quotes. 'search' => esc_html__( 'Search results for “%s”', 'business-club' ), // Translators: %s is the page number. 'paged' => esc_html__( 'Page %s', 'business-club' ), // Translators: Minute archive title. %s is the minute time format. 'archive_minute' => esc_html__( 'Minute %s', 'business-club' ), // Translators: Weekly archive title. %s is the week date format. 'archive_week' => esc_html__( 'Week %s', 'business-club' ), // "%s" is replaced with the translated date/time format. 'archive_minute_hour' => '%s', 'archive_hour' => '%s', 'archive_day' => '%s', 'archive_month' => '%s', 'archive_year' => '%s', ); $this->labels = apply_filters( 'breadcrumb_trail_labels', wp_parse_args( $this->args['labels'], $defaults ) ); } /** * Sets the `$post_taxonomy` property. This is an array of post types (key) and taxonomies (value). * The taxonomy's terms are shown on the singular post view if set. * * @since 1.0.0 * @access protected * @return void */ protected function set_post_taxonomy() { $defaults = array(); // If post permalink is set to `%postname%`, use the `category` taxonomy. if ( '%postname%' === trim( get_option( 'permalink_structure' ), '/' ) ) $defaults['post'] = 'category'; $this->post_taxonomy = apply_filters( 'breadcrumb_trail_post_taxonomy', wp_parse_args( $this->args['post_taxonomy'], $defaults ) ); } /** * Runs through the various WordPress conditional tags to check the current page being viewed. Once * a condition is met, a specific method is launched to add items to the `$items` array. * * @since 1.0.0 * @access protected * @return void */ protected function add_items() { // If viewing the front page. if ( is_front_page() ) { $this->add_front_page_items(); } // If not viewing the front page. else { // Add the network and site home links. $this->add_network_home_link(); $this->add_site_home_link(); // If viewing the home/blog page. if ( is_home() ) { $this->add_posts_page_items(); } // If viewing a single post. elseif ( is_singular() ) { $this->add_singular_items(); } // If viewing an archive page. elseif ( is_archive() ) { if ( is_post_type_archive() ) $this->add_post_type_archive_items(); elseif ( is_category() || is_tag() || is_tax() ) $this->add_term_archive_items(); elseif ( is_author() ) $this->add_user_archive_items(); elseif ( get_query_var( 'minute' ) && get_query_var( 'hour' ) ) $this->add_minute_hour_archive_items(); elseif ( get_query_var( 'minute' ) ) $this->add_minute_archive_items(); elseif ( get_query_var( 'hour' ) ) $this->add_hour_archive_items(); elseif ( is_day() ) $this->add_day_archive_items(); elseif ( get_query_var( 'w' ) ) $this->add_week_archive_items(); elseif ( is_month() ) $this->add_month_archive_items(); elseif ( is_year() ) $this->add_year_archive_items(); else $this->add_default_archive_items(); } // If viewing a search results page. elseif ( is_search() ) { $this->add_search_items(); } // If viewing the 404 page. elseif ( is_404() ) { $this->add_404_items(); } } // Add paged items if they exist. $this->add_paged_items(); // Allow developers to overwrite the items for the breadcrumb trail. $this->items = array_unique( apply_filters( 'breadcrumb_trail_items', $this->items, $this->args ) ); } /** * Gets front items based on $wp_rewrite->front. * * @since 1.0.0 * @access protected * @return void */ protected function add_rewrite_front_items() { global $wp_rewrite; if ( $wp_rewrite->front ) $this->add_path_parents( $wp_rewrite->front ); } /** * Adds the page/paged number to the items array. * * @since 1.0.0 * @access protected * @return void */ protected function add_paged_items() { // If viewing a paged singular post. if ( is_singular() && 1 < get_query_var( 'page' ) && true === $this->args['show_title'] ) $this->items[] = sprintf( $this->labels['paged'], number_format_i18n( absint( get_query_var( 'page' ) ) ) ); // If viewing a paged archive-type page. elseif ( is_paged() && true === $this->args['show_title'] ) $this->items[] = sprintf( $this->labels['paged'], number_format_i18n( absint( get_query_var( 'paged' ) ) ) ); } /** * Adds the network (all sites) home page link to the items array. * * @since 1.0.0 * @access protected * @return void */ protected function add_network_home_link() { if ( is_multisite() && !is_main_site() && true === $this->args['network'] ) $this->items[] = sprintf( '%s', esc_url( network_home_url() ), $this->labels['home'] ); } /** * Adds the current site's home page link to the items array. * * @since 1.0.0 * @access protected * @return void */ protected function add_site_home_link() { $network = is_multisite() && !is_main_site() && true === $this->args['network']; $label = $network ? get_bloginfo( 'name' ) : $this->labels['home']; $rel = $network ? '' : ' rel="home"'; $this->items[] = sprintf( '%s', esc_url( home_url() ), $rel, $label ); } /** * Adds items for the front page to the items array. * * @since 1.0.0 * @access protected * @return void */ protected function add_front_page_items() { // Only show front items if the 'show_on_front' argument is set to 'true'. if ( true === $this->args['show_on_front'] || is_paged() || ( is_singular() && 1 < get_query_var( 'page' ) ) ) { // Add network home link. $this->add_network_home_link(); // If on a paged view, add the site home link. if ( is_paged() ) $this->add_site_home_link(); // If on the main front page, add the network home title. elseif ( true === $this->args['show_title'] ) $this->items[] = is_multisite() && true === $this->args['network'] ? get_bloginfo( 'name' ) : $this->labels['home']; } } /** * Adds items for the posts page (i.e., is_home()) to the items array. * * @since 1.0.0 * @access protected * @return void */ protected function add_posts_page_items() { // Get the post ID and post. $post_id = get_queried_object_id(); $post = get_post( $post_id ); // If the post has parents, add them to the trail. if ( 0 < $post->post_parent ) $this->add_post_parents( $post->post_parent ); // Get the page title. $title = get_the_title( $post_id ); // Add the posts page item. if ( is_paged() ) $this->items[] = sprintf( '%s', esc_url( get_permalink( $post_id ) ), $title ); elseif ( $title && true === $this->args['show_title'] ) $this->items[] = $title; } /** * Adds singular post items to the items array. * * @since 1.0.0 * @access protected * @return void */ protected function add_singular_items() { // Get the queried post. $post = get_queried_object(); $post_id = get_queried_object_id(); // If the post has a parent, follow the parent trail. if ( 0 < $post->post_parent ) $this->add_post_parents( $post->post_parent ); // If the post doesn't have a parent, get its hierarchy based off the post type. else $this->add_post_hierarchy( $post_id ); // Display terms for specific post type taxonomy if requested. if ( !empty( $this->post_taxonomy[ $post->post_type ] ) ) $this->add_post_terms( $post_id, $this->post_taxonomy[ $post->post_type ] ); // End with the post title. if ( $post_title = single_post_title( '', false ) ) { if ( 1 < get_query_var( 'page' ) || is_paged() ) $this->items[] = sprintf( '%s', esc_url( get_permalink( $post_id ) ), $post_title ); elseif ( true === $this->args['show_title'] ) $this->items[] = $post_title; } } /** * Adds the items to the trail items array for taxonomy term archives. * * @since 1.0.0 * @access protected * @global object $wp_rewrite * @return void */ protected function add_term_archive_items() { global $wp_rewrite; // Get some taxonomy and term variables. $term = get_queried_object(); $taxonomy = get_taxonomy( $term->taxonomy ); $done_post_type = false; // If there are rewrite rules for the taxonomy. if ( false !== $taxonomy->rewrite ) { // If 'with_front' is true, dd $wp_rewrite->front to the trail. if ( $taxonomy->rewrite['with_front'] && $wp_rewrite->front ) $this->add_rewrite_front_items(); // Get parent pages by path if they exist. $this->add_path_parents( $taxonomy->rewrite['slug'] ); // Add post type archive if its 'has_archive' matches the taxonomy rewrite 'slug'. if ( $taxonomy->rewrite['slug'] ) { $slug = trim( $taxonomy->rewrite['slug'], '/' ); // Deals with the situation if the slug has a '/' between multiple // strings. For example, "movies/genres" where "movies" is the post // type archive. $matches = explode( '/', $slug ); // If matches are found for the path. if ( isset( $matches ) ) { // Reverse the array of matches to search for posts in the proper order. $matches = array_reverse( $matches ); // Loop through each of the path matches. foreach ( $matches as $match ) { // If a match is found. $slug = $match; // Get public post types that match the rewrite slug. $post_types = $this->get_post_types_by_slug( $match ); if ( !empty( $post_types ) ) { $post_type_object = $post_types[0]; // Add support for a non-standard label of 'archive_title' (special use case). $label = !empty( $post_type_object->labels->archive_title ) ? $post_type_object->labels->archive_title : $post_type_object->labels->name; // Core filter hook. $label = apply_filters( 'post_type_archive_title', $label, $post_type_object->name ); // Add the post type archive link to the trail. $this->items[] = sprintf( '%s', esc_url( get_post_type_archive_link( $post_type_object->name ) ), $label ); $done_post_type = true; // Break out of the loop. break; } } } } } // If there's a single post type for the taxonomy, use it. if ( false === $done_post_type && 1 === count( $taxonomy->object_type ) && post_type_exists( $taxonomy->object_type[0] ) ) { // If the post type is 'post'. if ( 'post' === $taxonomy->object_type[0] ) { $post_id = get_option( 'page_for_posts' ); if ( 'posts' !== get_option( 'show_on_front' ) && 0 < $post_id ) $this->items[] = sprintf( '%s', esc_url( get_permalink( $post_id ) ), get_the_title( $post_id ) ); // If the post type is not 'post'. } else { $post_type_object = get_post_type_object( $taxonomy->object_type[0] ); $label = !empty( $post_type_object->labels->archive_title ) ? $post_type_object->labels->archive_title : $post_type_object->labels->name; // Core filter hook. $label = apply_filters( 'post_type_archive_title', $label, $post_type_object->name ); $this->items[] = sprintf( '%s', esc_url( get_post_type_archive_link( $post_type_object->name ) ), $label ); } } // If the taxonomy is hierarchical, list its parent terms. if ( is_taxonomy_hierarchical( $term->taxonomy ) && $term->parent ) $this->add_term_parents( $term->parent, $term->taxonomy ); // Add the term name to the trail end. if ( is_paged() ) $this->items[] = sprintf( '%s', esc_url( get_term_link( $term, $term->taxonomy ) ), single_term_title( '', false ) ); elseif ( true === $this->args['show_title'] ) $this->items[] = single_term_title( '', false ); } /** * Adds the items to the trail items array for post type archives. * * @since 1.0.0 * @access protected * @return void */ protected function add_post_type_archive_items() { // Get the post type object. $post_type_object = get_post_type_object( get_query_var( 'post_type' ) ); if ( false !== $post_type_object->rewrite ) { // If 'with_front' is true, add $wp_rewrite->front to the trail. if ( $post_type_object->rewrite['with_front'] ) $this->add_rewrite_front_items(); // If there's a rewrite slug, check for parents. if ( !empty( $post_type_object->rewrite['slug'] ) ) $this->add_path_parents( $post_type_object->rewrite['slug'] ); } // Add the post type [plural] name to the trail end. if ( is_paged() ) $this->items[] = sprintf( '%s', esc_url( get_post_type_archive_link( $post_type_object->name ) ), post_type_archive_title( '', false ) ); elseif ( true === $this->args['show_title'] ) $this->items[] = post_type_archive_title( '', false ); } /** * Adds the items to the trail items array for user (author) archives. * * @since 1.0.0 * @access protected * @global object $wp_rewrite * @return void */ protected function add_user_archive_items() { global $wp_rewrite; // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Get the user ID. $user_id = get_query_var( 'author' ); // If $author_base exists, check for parent pages. if ( !empty( $wp_rewrite->author_base ) ) $this->add_path_parents( $wp_rewrite->author_base ); // Add the author's display name to the trail end. if ( is_paged() ) $this->items[] = sprintf( '%s', esc_url( get_author_posts_url( $user_id ) ), get_the_author_meta( 'display_name', $user_id ) ); elseif ( true === $this->args['show_title'] ) $this->items[] = get_the_author_meta( 'display_name', $user_id ); } /** * Adds the items to the trail items array for minute + hour archives. * * @since 1.0.0 * @access protected * @return void */ protected function add_minute_hour_archive_items() { // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Add the minute + hour item. if ( true === $this->args['show_title'] ) $this->items[] = sprintf( $this->labels['archive_minute_hour'], get_the_time( esc_html_x( 'g:i a', 'minute and hour archives time format', 'business-club' ) ) ); } /** * Adds the items to the trail items array for minute archives. * * @since 1.0.0 * @access protected * @return void */ protected function add_minute_archive_items() { // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Add the minute item. if ( true === $this->args['show_title'] ) $this->items[] = sprintf( $this->labels['archive_minute'], get_the_time( esc_html_x( 'i', 'minute archives time format', 'business-club' ) ) ); } /** * Adds the items to the trail items array for hour archives. * * @since 1.0.0 * @access protected * @return void */ protected function add_hour_archive_items() { // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Add the hour item. if ( true === $this->args['show_title'] ) $this->items[] = sprintf( $this->labels['archive_hour'], get_the_time( esc_html_x( 'g a', 'hour archives time format', 'business-club' ) ) ); } /** * Adds the items to the trail items array for day archives. * * @since 1.0.0 * @access protected * @return void */ protected function add_day_archive_items() { // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Get year, month, and day. $year = sprintf( $this->labels['archive_year'], get_the_time( esc_html_x( 'Y', 'yearly archives date format', 'business-club' ) ) ); $month = sprintf( $this->labels['archive_month'], get_the_time( esc_html_x( 'F', 'monthly archives date format', 'business-club' ) ) ); $day = sprintf( $this->labels['archive_day'], get_the_time( esc_html_x( 'j', 'daily archives date format', 'business-club' ) ) ); // Add the year and month items. $this->items[] = sprintf( '%s', esc_url( get_year_link( get_the_time( 'Y' ) ) ), $year ); $this->items[] = sprintf( '%s', esc_url( get_month_link( get_the_time( 'Y' ), get_the_time( 'm' ) ) ), $month ); // Add the day item. if ( is_paged() ) $this->items[] = sprintf( '%s', esc_url( get_day_link( get_the_time( 'Y' ) ), get_the_time( 'm' ), get_the_time( 'd' ) ), $day ); elseif ( true === $this->args['show_title'] ) $this->items[] = $day; } /** * Adds the items to the trail items array for week archives. * * @since 1.0.0 * @access protected * @return void */ protected function add_week_archive_items() { // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Get the year and week. $year = sprintf( $this->labels['archive_year'], get_the_time( esc_html_x( 'Y', 'yearly archives date format', 'business-club' ) ) ); $week = sprintf( $this->labels['archive_week'], get_the_time( esc_html_x( 'W', 'weekly archives date format', 'business-club' ) ) ); // Add the year item. $this->items[] = sprintf( '%s', esc_url( get_year_link( get_the_time( 'Y' ) ) ), $year ); // Add the week item. if ( is_paged() ) $this->items[] = esc_url( get_archives_link( add_query_arg( array( 'm' => get_the_time( 'Y' ), 'w' => get_the_time( 'W' ) ), home_url() ), $week, false ) ); elseif ( true === $this->args['show_title'] ) $this->items[] = $week; } /** * Adds the items to the trail items array for month archives. * * @since 1.0.0 * @access protected * @return void */ protected function add_month_archive_items() { // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Get the year and month. $year = sprintf( $this->labels['archive_year'], get_the_time( esc_html_x( 'Y', 'yearly archives date format', 'business-club' ) ) ); $month = sprintf( $this->labels['archive_month'], get_the_time( esc_html_x( 'F', 'monthly archives date format', 'business-club' ) ) ); // Add the year item. $this->items[] = sprintf( '%s', esc_url( get_year_link( get_the_time( 'Y' ) ) ), $year ); // Add the month item. if ( is_paged() ) $this->items[] = sprintf( '%s', esc_url( get_month_link( get_the_time( 'Y' ), get_the_time( 'm' ) ) ), $month ); elseif ( true === $this->args['show_title'] ) $this->items[] = $month; } /** * Adds the items to the trail items array for year archives. * * @since 1.0.0 * @access protected * @return void */ protected function add_year_archive_items() { // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Get the year. $year = sprintf( $this->labels['archive_year'], get_the_time( esc_html_x( 'Y', 'yearly archives date format', 'business-club' ) ) ); // Add the year item. if ( is_paged() ) $this->items[] = sprintf( '%s', esc_url( get_year_link( get_the_time( 'Y' ) ) ), $year ); elseif ( true === $this->args['show_title'] ) $this->items[] = $year; } /** * Adds the items to the trail items array for archives that don't have a more specific method * defined in this class. * * @since 1.0.0 * @access protected * @return void */ protected function add_default_archive_items() { // If this is a date-/time-based archive, add $wp_rewrite->front to the trail. if ( is_date() || is_time() ) $this->add_rewrite_front_items(); if ( true === $this->args['show_title'] ) $this->items[] = $this->labels['archives']; } /** * Adds the items to the trail items array for search results. * * @since 1.0.0 * @access protected * @return void */ protected function add_search_items() { if ( is_paged() ) $this->items[] = sprintf( '%s', esc_url( get_search_link() ), sprintf( $this->labels['search'], get_search_query() ) ); elseif ( true === $this->args['show_title'] ) $this->items[] = sprintf( $this->labels['search'], get_search_query() ); } /** * Adds the items to the trail items array for 404 pages. * * @since 1.0.0 * @access protected * @return void */ protected function add_404_items() { if ( true === $this->args['show_title'] ) $this->items[] = $this->labels['error_404']; } /** * Adds a specific post's parents to the items array. * * @since 1.0.0 * @access protected * @param int $post_id * @return void */ protected function add_post_parents( $post_id ) { $parents = array(); while ( $post_id ) { // Get the post by ID. $post = get_post( $post_id ); // If we hit a page that's set as the front page, bail. if ( 'page' == $post->post_type && 'page' == get_option( 'show_on_front' ) && $post_id == get_option( 'page_on_front' ) ) break; // Add the formatted post link to the array of parents. $parents[] = sprintf( '%s', esc_url( get_permalink( $post_id ) ), get_the_title( $post_id ) ); // If there's no longer a post parent, break out of the loop. if ( 0 >= $post->post_parent ) break; // Change the post ID to the parent post to continue looping. $post_id = $post->post_parent; } // Get the post hierarchy based off the final parent post. $this->add_post_hierarchy( $post_id ); // Display terms for specific post type taxonomy if requested. if ( !empty( $this->post_taxonomy[ $post->post_type ] ) ) $this->add_post_terms( $post_id, $this->post_taxonomy[ $post->post_type ] ); // Merge the parent items into the items array. $this->items = array_merge( $this->items, array_reverse( $parents ) ); } /** * Adds a specific post's hierarchy to the items array. The hierarchy is determined by post type's * rewrite arguments and whether it has an archive page. * * @since 1.0.0 * @access protected * @param int $post_id * @return void */ protected function add_post_hierarchy( $post_id ) { // Get the post type. $post_type = get_post_type( $post_id ); $post_type_object = get_post_type_object( $post_type ); // If this is the 'post' post type, get the rewrite front items and map the rewrite tags. if ( 'post' === $post_type ) { // Add $wp_rewrite->front to the trail. $this->add_rewrite_front_items(); // Map the rewrite tags. $this->map_rewrite_tags( $post_id, get_option( 'permalink_structure' ) ); } // If the post type has rewrite rules. elseif ( false !== $post_type_object->rewrite ) { // If 'with_front' is true, add $wp_rewrite->front to the trail. if ( $post_type_object->rewrite['with_front'] ) $this->add_rewrite_front_items(); // If there's a path, check for parents. if ( !empty( $post_type_object->rewrite['slug'] ) ) $this->add_path_parents( $post_type_object->rewrite['slug'] ); } // If there's an archive page, add it to the trail. if ( $post_type_object->has_archive ) { // Add support for a non-standard label of 'archive_title' (special use case). $label = !empty( $post_type_object->labels->archive_title ) ? $post_type_object->labels->archive_title : $post_type_object->labels->name; // Core filter hook. $label = apply_filters( 'post_type_archive_title', $label, $post_type_object->name ); $this->items[] = sprintf( '%s', esc_url( get_post_type_archive_link( $post_type ) ), $label ); } } /** * Gets post types by slug. This is needed because the get_post_types() function doesn't exactly * match the 'has_archive' argument when it's set as a string instead of a boolean. * * @since 0.6.0 * @access protected * @param int $slug The post type archive slug to search for. * @return void */ protected function get_post_types_by_slug( $slug ) { $return = array(); $post_types = get_post_types( array(), 'objects' ); foreach ( $post_types as $type ) { if ( $slug === $type->has_archive || ( true === $type->has_archive && $slug === $type->rewrite['slug'] ) ) $return[] = $type; } return $return; } /** * Adds a post's terms from a specific taxonomy to the items array. * * @since 1.0.0 * @access protected * @param int $post_id The ID of the post to get the terms for. * @param string $taxonomy The taxonomy to get the terms from. * @return void */ protected function add_post_terms( $post_id, $taxonomy ) { // Get the post type. $post_type = get_post_type( $post_id ); // Get the post categories. $terms = get_the_terms( $post_id, $taxonomy ); // Check that categories were returned. if ( $terms && ! is_wp_error( $terms ) ) { // Sort the terms by ID and get the first category. if ( function_exists( 'wp_list_sort' ) ) { $terms = wp_list_sort( $terms, 'term_id' ); } else { usort( $terms, '_usort_terms_by_ID' ); } $term = get_term( $terms[0], $taxonomy ); // If the category has a parent, add the hierarchy to the trail. if ( 0 < $term->parent ) $this->add_term_parents( $term->parent, $taxonomy ); // Add the category archive link to the trail. $this->items[] = sprintf( '%s', esc_url( get_term_link( $term, $taxonomy ) ), $term->name ); } } /** * Get parent posts by path. Currently, this method only supports getting parents of the 'page' * post type. The goal of this function is to create a clear path back to home given what would * normally be a "ghost" directory. If any page matches the given path, it'll be added. * * @since 1.0.0 * @access protected * @param string $path The path (slug) to search for posts by. * @return void */ function add_path_parents( $path ) { // Trim '/' off $path in case we just got a simple '/' instead of a real path. $path = trim( $path, '/' ); // If there's no path, return. if ( empty( $path ) ) return; // Get parent post by the path. $post = get_page_by_path( $path ); if ( !empty( $post ) ) { $this->add_post_parents( $post->ID ); } elseif ( is_null( $post ) ) { // Separate post names into separate paths by '/'. $path = trim( $path, '/' ); preg_match_all( "/\/.*?\z/", $path, $matches ); // If matches are found for the path. if ( isset( $matches ) ) { // Reverse the array of matches to search for posts in the proper order. $matches = array_reverse( $matches ); // Loop through each of the path matches. foreach ( $matches as $match ) { // If a match is found. if ( isset( $match[0] ) ) { // Get the parent post by the given path. $path = str_replace( $match[0], '', $path ); $post = get_page_by_path( trim( $path, '/' ) ); // If a parent post is found, set the $post_id and break out of the loop. if ( !empty( $post ) && 0 < $post->ID ) { $this->add_post_parents( $post->ID ); break; } } } } } } /** * Searches for term parents of hierarchical taxonomies. This function is similar to the WordPress * function get_category_parents() but handles any type of taxonomy. * * @since 1.0.0 * @param int $term_id ID of the term to get the parents of. * @param string $taxonomy Name of the taxonomy for the given term. * @return void */ function add_term_parents( $term_id, $taxonomy ) { // Set up some default arrays. $parents = array(); // While there is a parent ID, add the parent term link to the $parents array. while ( $term_id ) { // Get the parent term. $term = get_term( $term_id, $taxonomy ); // Add the formatted term link to the array of parent terms. $parents[] = sprintf( '%s', esc_url( get_term_link( $term, $taxonomy ) ), $term->name ); // Set the parent term's parent as the parent ID. $term_id = $term->parent; } // If we have parent terms, reverse the array to put them in the proper order for the trail. if ( !empty( $parents ) ) $this->items = array_merge( $this->items, $parents ); } /** * Turns %tag% from permalink structures into usable links for the breadcrumb trail. This feels kind of * hackish for now because we're checking for specific %tag% examples and only doing it for the 'post' * post type. In the future, maybe it'll handle a wider variety of possibilities, especially for custom post * types. * * @since 0.6.0 * @access protected * @param int $post_id ID of the post whose parents we want. * @param string $path Path of a potential parent page. * @param array $args Mixed arguments for the menu. * @return array */ protected function map_rewrite_tags( $post_id, $path ) { $post = get_post( $post_id ); // If the post doesn't have the `post` post type, bail. if ( 'post' !== $post->post_type ) return; // Trim '/' from both sides of the $path. $path = trim( $path, '/' ); // Split the $path into an array of strings. $matches = explode( '/', $path ); // If matches are found for the path. if ( is_array( $matches ) ) { // Loop through each of the matches, adding each to the $trail array. foreach ( $matches as $match ) { // Trim any '/' from the $match. $tag = trim( $match, '/' ); // If using the %year% tag, add a link to the yearly archive. if ( '%year%' == $tag ) $this->items[] = sprintf( '%s', esc_url( get_year_link( get_the_time( 'Y', $post_id ) ) ), sprintf( $this->labels['archive_year'], get_the_time( esc_html_x( 'Y', 'yearly archives date format', 'business-club' ) ) ) ); // If using the %monthnum% tag, add a link to the monthly archive. elseif ( '%monthnum%' == $tag ) $this->items[] = sprintf( '%s', esc_url( get_month_link( get_the_time( 'Y', $post_id ), get_the_time( 'm', $post_id ) ) ), sprintf( $this->labels['archive_month'], get_the_time( esc_html_x( 'F', 'monthly archives date format', 'business-club' ) ) ) ); // If using the %day% tag, add a link to the daily archive. elseif ( '%day%' == $tag ) $this->items[] = sprintf( '%s', esc_url( get_day_link( get_the_time( 'Y', $post_id ), get_the_time( 'm', $post_id ), get_the_time( 'd', $post_id ) ) ), sprintf( $this->labels['archive_day'], get_the_time( esc_html_x( 'j', 'daily archives date format', 'business-club' ) ) ) ); // If using the %author% tag, add a link to the post author archive. elseif ( '%author%' == $tag ) $this->items[] = sprintf( '%s', esc_url( get_author_posts_url( $post->post_author ) ), get_the_author_meta( 'display_name', $post->post_author ) ); // If using the %category% tag, add a link to the first category archive to match permalinks. elseif ( '%category%' == $tag ) { // Force override terms in this post type. $this->post_taxonomy[ $post->post_type ] = false; // Add the post categories. $this->add_post_terms( $post_id, 'category' ); } } } } } vendors/cycle2/js/jquery.cycle2.min.js000064400000054634150212240530013646 0ustar00/*! * jQuery Cycle2; version: 2.1.6 build: 20141007 * http://jquery.malsup.com/cycle2/ * Copyright (c) 2014 M. Alsup; Dual licensed: MIT/GPL */ !function(a){"use strict";function b(a){return(a||"").toLowerCase()}var c="2.1.6";a.fn.cycle=function(c){var d;return 0!==this.length||a.isReady?this.each(function(){var d,e,f,g,h=a(this),i=a.fn.cycle.log;if(!h.data("cycle.opts")){(h.data("cycle-log")===!1||c&&c.log===!1||e&&e.log===!1)&&(i=a.noop),i("--c2 init--"),d=h.data();for(var j in d)d.hasOwnProperty(j)&&/^cycle[A-Z]+/.test(j)&&(g=d[j],f=j.match(/^cycle(.*)/)[1].replace(/^[A-Z]/,b),i(f+":",g,"("+typeof g+")"),d[f]=g);e=a.extend({},a.fn.cycle.defaults,d,c||{}),e.timeoutId=0,e.paused=e.paused||!1,e.container=h,e._maxZ=e.maxZ,e.API=a.extend({_container:h},a.fn.cycle.API),e.API.log=i,e.API.trigger=function(a,b){return e.container.trigger(a,b),e.API},h.data("cycle.opts",e),h.data("cycle.API",e.API),e.API.trigger("cycle-bootstrap",[e,e.API]),e.API.addInitialSlides(),e.API.preInitSlideshow(),e.slides.length&&e.API.initSlideshow()}}):(d={s:this.selector,c:this.context},a.fn.cycle.log("requeuing slideshow (dom not ready)"),a(function(){a(d.s,d.c).cycle(c)}),this)},a.fn.cycle.API={opts:function(){return this._container.data("cycle.opts")},addInitialSlides:function(){var b=this.opts(),c=b.slides;b.slideCount=0,b.slides=a(),c=c.jquery?c:b.container.find(c),b.random&&c.sort(function(){return Math.random()-.5}),b.API.add(c)},preInitSlideshow:function(){var b=this.opts();b.API.trigger("cycle-pre-initialize",[b]);var c=a.fn.cycle.transitions[b.fx];c&&a.isFunction(c.preInit)&&c.preInit(b),b._preInitialized=!0},postInitSlideshow:function(){var b=this.opts();b.API.trigger("cycle-post-initialize",[b]);var c=a.fn.cycle.transitions[b.fx];c&&a.isFunction(c.postInit)&&c.postInit(b)},initSlideshow:function(){var b,c=this.opts(),d=c.container;c.API.calcFirstSlide(),"static"==c.container.css("position")&&c.container.css("position","relative"),a(c.slides[c.currSlide]).css({opacity:1,display:"block",visibility:"visible"}),c.API.stackSlides(c.slides[c.currSlide],c.slides[c.nextSlide],!c.reverse),c.pauseOnHover&&(c.pauseOnHover!==!0&&(d=a(c.pauseOnHover)),d.hover(function(){c.API.pause(!0)},function(){c.API.resume(!0)})),c.timeout&&(b=c.API.getSlideOpts(c.currSlide),c.API.queueTransition(b,b.timeout+c.delay)),c._initialized=!0,c.API.updateView(!0),c.API.trigger("cycle-initialized",[c]),c.API.postInitSlideshow()},pause:function(b){var c=this.opts(),d=c.API.getSlideOpts(),e=c.hoverPaused||c.paused;b?c.hoverPaused=!0:c.paused=!0,e||(c.container.addClass("cycle-paused"),c.API.trigger("cycle-paused",[c]).log("cycle-paused"),d.timeout&&(clearTimeout(c.timeoutId),c.timeoutId=0,c._remainingTimeout-=a.now()-c._lastQueue,(c._remainingTimeout<0||isNaN(c._remainingTimeout))&&(c._remainingTimeout=void 0)))},resume:function(a){var b=this.opts(),c=!b.hoverPaused&&!b.paused;a?b.hoverPaused=!1:b.paused=!1,c||(b.container.removeClass("cycle-paused"),0===b.slides.filter(":animated").length&&b.API.queueTransition(b.API.getSlideOpts(),b._remainingTimeout),b.API.trigger("cycle-resumed",[b,b._remainingTimeout]).log("cycle-resumed"))},add:function(b,c){var d,e=this.opts(),f=e.slideCount,g=!1;"string"==a.type(b)&&(b=a.trim(b)),a(b).each(function(){var b,d=a(this);c?e.container.prepend(d):e.container.append(d),e.slideCount++,b=e.API.buildSlideOpts(d),e.slides=c?a(d).add(e.slides):e.slides.add(d),e.API.initSlide(b,d,--e._maxZ),d.data("cycle.opts",b),e.API.trigger("cycle-slide-added",[e,b,d])}),e.API.updateView(!0),g=e._preInitialized&&2>f&&e.slideCount>=1,g&&(e._initialized?e.timeout&&(d=e.slides.length,e.nextSlide=e.reverse?d-1:1,e.timeoutId||e.API.queueTransition(e)):e.API.initSlideshow())},calcFirstSlide:function(){var a,b=this.opts();a=parseInt(b.startingSlide||0,10),(a>=b.slides.length||0>a)&&(a=0),b.currSlide=a,b.reverse?(b.nextSlide=a-1,b.nextSlide<0&&(b.nextSlide=b.slides.length-1)):(b.nextSlide=a+1,b.nextSlide==b.slides.length&&(b.nextSlide=0))},calcNextSlide:function(){var a,b=this.opts();b.reverse?(a=b.nextSlide-1<0,b.nextSlide=a?b.slideCount-1:b.nextSlide-1,b.currSlide=a?0:b.nextSlide+1):(a=b.nextSlide+1==b.slides.length,b.nextSlide=a?0:b.nextSlide+1,b.currSlide=a?b.slides.length-1:b.nextSlide-1)},calcTx:function(b,c){var d,e=b;return e._tempFx?d=a.fn.cycle.transitions[e._tempFx]:c&&e.manualFx&&(d=a.fn.cycle.transitions[e.manualFx]),d||(d=a.fn.cycle.transitions[e.fx]),e._tempFx=null,this.opts()._tempFx=null,d||(d=a.fn.cycle.transitions.fade,e.API.log('Transition "'+e.fx+'" not found. Using fade.')),d},prepareTx:function(a,b){var c,d,e,f,g,h=this.opts();return h.slideCount<2?void(h.timeoutId=0):(!a||h.busy&&!h.manualTrump||(h.API.stopTransition(),h.busy=!1,clearTimeout(h.timeoutId),h.timeoutId=0),void(h.busy||(0!==h.timeoutId||a)&&(d=h.slides[h.currSlide],e=h.slides[h.nextSlide],f=h.API.getSlideOpts(h.nextSlide),g=h.API.calcTx(f,a),h._tx=g,a&&void 0!==f.manualSpeed&&(f.speed=f.manualSpeed),h.nextSlide!=h.currSlide&&(a||!h.paused&&!h.hoverPaused&&h.timeout)?(h.API.trigger("cycle-before",[f,d,e,b]),g.before&&g.before(f,d,e,b),c=function(){h.busy=!1,h.container.data("cycle.opts")&&(g.after&&g.after(f,d,e,b),h.API.trigger("cycle-after",[f,d,e,b]),h.API.queueTransition(f),h.API.updateView(!0))},h.busy=!0,g.transition?g.transition(f,d,e,b,c):h.API.doTransition(f,d,e,b,c),h.API.calcNextSlide(),h.API.updateView()):h.API.queueTransition(f))))},doTransition:function(b,c,d,e,f){var g=b,h=a(c),i=a(d),j=function(){i.animate(g.animIn||{opacity:1},g.speed,g.easeIn||g.easing,f)};i.css(g.cssBefore||{}),h.animate(g.animOut||{},g.speed,g.easeOut||g.easing,function(){h.css(g.cssAfter||{}),g.sync||j()}),g.sync&&j()},queueTransition:function(b,c){var d=this.opts(),e=void 0!==c?c:b.timeout;return 0===d.nextSlide&&0===--d.loop?(d.API.log("terminating; loop=0"),d.timeout=0,e?setTimeout(function(){d.API.trigger("cycle-finished",[d])},e):d.API.trigger("cycle-finished",[d]),void(d.nextSlide=d.currSlide)):void 0!==d.continueAuto&&(d.continueAuto===!1||a.isFunction(d.continueAuto)&&d.continueAuto()===!1)?(d.API.log("terminating automatic transitions"),d.timeout=0,void(d.timeoutId&&clearTimeout(d.timeoutId))):void(e&&(d._lastQueue=a.now(),void 0===c&&(d._remainingTimeout=b.timeout),d.paused||d.hoverPaused||(d.timeoutId=setTimeout(function(){d.API.prepareTx(!1,!d.reverse)},e))))},stopTransition:function(){var a=this.opts();a.slides.filter(":animated").length&&(a.slides.stop(!1,!0),a.API.trigger("cycle-transition-stopped",[a])),a._tx&&a._tx.stopTransition&&a._tx.stopTransition(a)},advanceSlide:function(a){var b=this.opts();return clearTimeout(b.timeoutId),b.timeoutId=0,b.nextSlide=b.currSlide+a,b.nextSlide<0?b.nextSlide=b.slides.length-1:b.nextSlide>=b.slides.length&&(b.nextSlide=0),b.API.prepareTx(!0,a>=0),!1},buildSlideOpts:function(c){var d,e,f=this.opts(),g=c.data()||{};for(var h in g)g.hasOwnProperty(h)&&/^cycle[A-Z]+/.test(h)&&(d=g[h],e=h.match(/^cycle(.*)/)[1].replace(/^[A-Z]/,b),f.API.log("["+(f.slideCount-1)+"]",e+":",d,"("+typeof d+")"),g[e]=d);g=a.extend({},a.fn.cycle.defaults,f,g),g.slideNum=f.slideCount;try{delete g.API,delete g.slideCount,delete g.currSlide,delete g.nextSlide,delete g.slides}catch(i){}return g},getSlideOpts:function(b){var c=this.opts();void 0===b&&(b=c.currSlide);var d=c.slides[b],e=a(d).data("cycle.opts");return a.extend({},c,e)},initSlide:function(b,c,d){var e=this.opts();c.css(b.slideCss||{}),d>0&&c.css("zIndex",d),isNaN(b.speed)&&(b.speed=a.fx.speeds[b.speed]||a.fx.speeds._default),b.sync||(b.speed=b.speed/2),c.addClass(e.slideClass)},updateView:function(a,b){var c=this.opts();if(c._initialized){var d=c.API.getSlideOpts(),e=c.slides[c.currSlide];!a&&b!==!0&&(c.API.trigger("cycle-update-view-before",[c,d,e]),c.updateView<0)||(c.slideActiveClass&&c.slides.removeClass(c.slideActiveClass).eq(c.currSlide).addClass(c.slideActiveClass),a&&c.hideNonActive&&c.slides.filter(":not(."+c.slideActiveClass+")").css("visibility","hidden"),0===c.updateView&&setTimeout(function(){c.API.trigger("cycle-update-view",[c,d,e,a])},d.speed/(c.sync?2:1)),0!==c.updateView&&c.API.trigger("cycle-update-view",[c,d,e,a]),a&&c.API.trigger("cycle-update-view-after",[c,d,e]))}},getComponent:function(b){var c=this.opts(),d=c[b];return"string"==typeof d?/^\s*[\>|\+|~]/.test(d)?c.container.find(d):a(d):d.jquery?d:a(d)},stackSlides:function(b,c,d){var e=this.opts();b||(b=e.slides[e.currSlide],c=e.slides[e.nextSlide],d=!e.reverse),a(b).css("zIndex",e.maxZ);var f,g=e.maxZ-2,h=e.slideCount;if(d){for(f=e.currSlide+1;h>f;f++)a(e.slides[f]).css("zIndex",g--);for(f=0;f=0;f--)a(e.slides[f]).css("zIndex",g--);for(f=h-1;f>e.currSlide;f--)a(e.slides[f]).css("zIndex",g--)}a(c).css("zIndex",e.maxZ-1)},getSlideIndex:function(a){return this.opts().slides.index(a)}},a.fn.cycle.log=function(){window.console&&console.log&&console.log("[cycle2] "+Array.prototype.join.call(arguments," "))},a.fn.cycle.version=function(){return"Cycle2: "+c},a.fn.cycle.transitions={custom:{},none:{before:function(a,b,c,d){a.API.stackSlides(c,b,d),a.cssBefore={opacity:1,visibility:"visible",display:"block"}}},fade:{before:function(b,c,d,e){var f=b.API.getSlideOpts(b.nextSlide).slideCss||{};b.API.stackSlides(c,d,e),b.cssBefore=a.extend(f,{opacity:0,visibility:"visible",display:"block"}),b.animIn={opacity:1},b.animOut={opacity:0}}},fadeout:{before:function(b,c,d,e){var f=b.API.getSlideOpts(b.nextSlide).slideCss||{};b.API.stackSlides(c,d,e),b.cssBefore=a.extend(f,{opacity:1,visibility:"visible",display:"block"}),b.animOut={opacity:0}}},scrollHorz:{before:function(a,b,c,d){a.API.stackSlides(b,c,d);var e=a.container.css("overflow","hidden").width();a.cssBefore={left:d?e:-e,top:0,opacity:1,visibility:"visible",display:"block"},a.cssAfter={zIndex:a._maxZ-2,left:0},a.animIn={left:0},a.animOut={left:d?-e:e}}}},a.fn.cycle.defaults={allowWrap:!0,autoSelector:".cycle-slideshow[data-cycle-auto-init!=false]",delay:0,easing:null,fx:"fade",hideNonActive:!0,loop:0,manualFx:void 0,manualSpeed:void 0,manualTrump:!0,maxZ:100,pauseOnHover:!1,reverse:!1,slideActiveClass:"cycle-slide-active",slideClass:"cycle-slide",slideCss:{position:"absolute",top:0,left:0},slides:"> img",speed:500,startingSlide:0,sync:!0,timeout:4e3,updateView:0},a(document).ready(function(){a(a.fn.cycle.defaults.autoSelector).cycle()})}(jQuery),/*! Cycle2 autoheight plugin; Copyright (c) M.Alsup, 2012; version: 20130913 */ function(a){"use strict";function b(b,d){var e,f,g,h=d.autoHeight;if("container"==h)f=a(d.slides[d.currSlide]).outerHeight(),d.container.height(f);else if(d._autoHeightRatio)d.container.height(d.container.width()/d._autoHeightRatio);else if("calc"===h||"number"==a.type(h)&&h>=0){if(g="calc"===h?c(b,d):h>=d.slides.length?0:h,g==d._sentinelIndex)return;d._sentinelIndex=g,d._sentinel&&d._sentinel.remove(),e=a(d.slides[g].cloneNode(!0)),e.removeAttr("id name rel").find("[id],[name],[rel]").removeAttr("id name rel"),e.css({position:"static",visibility:"hidden",display:"block"}).prependTo(d.container).addClass("cycle-sentinel cycle-slide").removeClass("cycle-slide-active"),e.find("*").css("visibility","hidden"),d._sentinel=e}}function c(b,c){var d=0,e=-1;return c.slides.each(function(b){var c=a(this).height();c>e&&(e=c,d=b)}),d}function d(b,c,d,e){var f=a(e).outerHeight();c.container.animate({height:f},c.autoHeightSpeed,c.autoHeightEasing)}function e(c,f){f._autoHeightOnResize&&(a(window).off("resize orientationchange",f._autoHeightOnResize),f._autoHeightOnResize=null),f.container.off("cycle-slide-added cycle-slide-removed",b),f.container.off("cycle-destroyed",e),f.container.off("cycle-before",d),f._sentinel&&(f._sentinel.remove(),f._sentinel=null)}a.extend(a.fn.cycle.defaults,{autoHeight:0,autoHeightSpeed:250,autoHeightEasing:null}),a(document).on("cycle-initialized",function(c,f){function g(){b(c,f)}var h,i=f.autoHeight,j=a.type(i),k=null;("string"===j||"number"===j)&&(f.container.on("cycle-slide-added cycle-slide-removed",b),f.container.on("cycle-destroyed",e),"container"==i?f.container.on("cycle-before",d):"string"===j&&/\d+\:\d+/.test(i)&&(h=i.match(/(\d+)\:(\d+)/),h=h[1]/h[2],f._autoHeightRatio=h),"number"!==j&&(f._autoHeightOnResize=function(){clearTimeout(k),k=setTimeout(g,50)},a(window).on("resize orientationchange",f._autoHeightOnResize)),setTimeout(g,30))})}(jQuery),/*! caption plugin for Cycle2; version: 20130306 */ function(a){"use strict";a.extend(a.fn.cycle.defaults,{caption:"> .cycle-caption",captionTemplate:"{{slideNum}} / {{slideCount}}",overlay:"> .cycle-overlay",overlayTemplate:"
    {{title}}
    {{desc}}
    ",captionModule:"caption"}),a(document).on("cycle-update-view",function(b,c,d,e){if("caption"===c.captionModule){a.each(["caption","overlay"],function(){var a=this,b=d[a+"Template"],f=c.API.getComponent(a);f.length&&b?(f.html(c.API.tmpl(b,d,c,e)),f.show()):f.hide()})}}),a(document).on("cycle-destroyed",function(b,c){var d;a.each(["caption","overlay"],function(){var a=this,b=c[a+"Template"];c[a]&&b&&(d=c.API.getComponent("caption"),d.empty())})})}(jQuery),/*! command plugin for Cycle2; version: 20140415 */ function(a){"use strict";var b=a.fn.cycle;a.fn.cycle=function(c){var d,e,f,g=a.makeArray(arguments);return"number"==a.type(c)?this.cycle("goto",c):"string"==a.type(c)?this.each(function(){var h;return d=c,f=a(this).data("cycle.opts"),void 0===f?void b.log('slideshow must be initialized before sending commands; "'+d+'" ignored'):(d="goto"==d?"jump":d,e=f.API[d],a.isFunction(e)?(h=a.makeArray(g),h.shift(),e.apply(f.API,h)):void b.log("unknown command: ",d))}):b.apply(this,arguments)},a.extend(a.fn.cycle,b),a.extend(b.API,{next:function(){var a=this.opts();if(!a.busy||a.manualTrump){var b=a.reverse?-1:1;a.allowWrap===!1&&a.currSlide+b>=a.slideCount||(a.API.advanceSlide(b),a.API.trigger("cycle-next",[a]).log("cycle-next"))}},prev:function(){var a=this.opts();if(!a.busy||a.manualTrump){var b=a.reverse?1:-1;a.allowWrap===!1&&a.currSlide+b<0||(a.API.advanceSlide(b),a.API.trigger("cycle-prev",[a]).log("cycle-prev"))}},destroy:function(){this.stop();var b=this.opts(),c=a.isFunction(a._data)?a._data:a.noop;clearTimeout(b.timeoutId),b.timeoutId=0,b.API.stop(),b.API.trigger("cycle-destroyed",[b]).log("cycle-destroyed"),b.container.removeData(),c(b.container[0],"parsedAttrs",!1),b.retainStylesOnDestroy||(b.container.removeAttr("style"),b.slides.removeAttr("style"),b.slides.removeClass(b.slideActiveClass)),b.slides.each(function(){var d=a(this);d.removeData(),d.removeClass(b.slideClass),c(this,"parsedAttrs",!1)})},jump:function(a,b){var c,d=this.opts();if(!d.busy||d.manualTrump){var e=parseInt(a,10);if(isNaN(e)||0>e||e>=d.slides.length)return void d.API.log("goto: invalid slide index: "+e);if(e==d.currSlide)return void d.API.log("goto: skipping, already on slide",e);d.nextSlide=e,clearTimeout(d.timeoutId),d.timeoutId=0,d.API.log("goto: ",e," (zero-index)"),c=d.currSlide .cycle-pager",pagerActiveClass:"cycle-pager-active",pagerEvent:"click.cycle",pagerEventBubble:void 0,pagerTemplate:""}),a(document).on("cycle-bootstrap",function(a,c,d){d.buildPagerLink=b}),a(document).on("cycle-slide-added",function(a,b,d,e){b.pager&&(b.API.buildPagerLink(b,d,e),b.API.page=c)}),a(document).on("cycle-slide-removed",function(b,c,d){if(c.pager){var e=c.API.getComponent("pager");e.each(function(){var b=a(this);a(b.children()[d]).remove()})}}),a(document).on("cycle-update-view",function(b,c){var d;c.pager&&(d=c.API.getComponent("pager"),d.each(function(){a(this).children().removeClass(c.pagerActiveClass).eq(c.currSlide).addClass(c.pagerActiveClass)}))}),a(document).on("cycle-destroyed",function(a,b){var c=b.API.getComponent("pager");c&&(c.children().off(b.pagerEvent),b.pagerTemplate&&c.empty())})}(jQuery),/*! prevnext plugin for Cycle2; version: 20140408 */ function(a){"use strict";a.extend(a.fn.cycle.defaults,{next:"> .cycle-next",nextEvent:"click.cycle",disabledClass:"disabled",prev:"> .cycle-prev",prevEvent:"click.cycle",swipe:!1}),a(document).on("cycle-initialized",function(a,b){if(b.API.getComponent("next").on(b.nextEvent,function(a){a.preventDefault(),b.API.next()}),b.API.getComponent("prev").on(b.prevEvent,function(a){a.preventDefault(),b.API.prev()}),b.swipe){var c=b.swipeVert?"swipeUp.cycle":"swipeLeft.cycle swipeleft.cycle",d=b.swipeVert?"swipeDown.cycle":"swipeRight.cycle swiperight.cycle";b.container.on(c,function(){b._tempFx=b.swipeFx,b.API.next()}),b.container.on(d,function(){b._tempFx=b.swipeFx,b.API.prev()})}}),a(document).on("cycle-update-view",function(a,b){if(!b.allowWrap){var c=b.disabledClass,d=b.API.getComponent("next"),e=b.API.getComponent("prev"),f=b._prevBoundry||0,g=void 0!==b._nextBoundry?b._nextBoundry:b.slideCount-1;b.currSlide==g?d.addClass(c).prop("disabled",!0):d.removeClass(c).prop("disabled",!1),b.currSlide===f?e.addClass(c).prop("disabled",!0):e.removeClass(c).prop("disabled",!1)}}),a(document).on("cycle-destroyed",function(a,b){b.API.getComponent("prev").off(b.nextEvent),b.API.getComponent("next").off(b.prevEvent),b.container.off("swipeleft.cycle swiperight.cycle swipeLeft.cycle swipeRight.cycle swipeUp.cycle swipeDown.cycle")})}(jQuery),/*! progressive loader plugin for Cycle2; version: 20130315 */ function(a){"use strict";a.extend(a.fn.cycle.defaults,{progressive:!1}),a(document).on("cycle-pre-initialize",function(b,c){if(c.progressive){var d,e,f=c.API,g=f.next,h=f.prev,i=f.prepareTx,j=a.type(c.progressive);if("array"==j)d=c.progressive;else if(a.isFunction(c.progressive))d=c.progressive(c);else if("string"==j){if(e=a(c.progressive),d=a.trim(e.html()),!d)return;if(/^(\[)/.test(d))try{d=a.parseJSON(d)}catch(k){return void f.log("error parsing progressive slides",k)}else d=d.split(new RegExp(e.data("cycle-split")||"\n")),d[d.length-1]||d.pop()}i&&(f.prepareTx=function(a,b){var e,f;return a||0===d.length?void i.apply(c.API,[a,b]):void(b&&c.currSlide==c.slideCount-1?(f=d[0],d=d.slice(1),c.container.one("cycle-slide-added",function(a,b){setTimeout(function(){b.API.advanceSlide(1)},50)}),c.API.add(f)):b||0!==c.currSlide?i.apply(c.API,[a,b]):(e=d.length-1,f=d[e],d=d.slice(0,e),c.container.one("cycle-slide-added",function(a,b){setTimeout(function(){b.currSlide=1,b.API.advanceSlide(-1)},50)}),c.API.add(f,!0)))}),g&&(f.next=function(){var a=this.opts();if(d.length&&a.currSlide==a.slideCount-1){var b=d[0];d=d.slice(1),a.container.one("cycle-slide-added",function(a,b){g.apply(b.API),b.container.removeClass("cycle-loading")}),a.container.addClass("cycle-loading"),a.API.add(b)}else g.apply(a.API)}),h&&(f.prev=function(){var a=this.opts();if(d.length&&0===a.currSlide){var b=d.length-1,c=d[b];d=d.slice(0,b),a.container.one("cycle-slide-added",function(a,b){b.currSlide=1,b.API.advanceSlide(-1),b.container.removeClass("cycle-loading")}),a.container.addClass("cycle-loading"),a.API.add(c,!0)}else h.apply(a.API)})}})}(jQuery),/*! tmpl plugin for Cycle2; version: 20121227 */ function(a){"use strict";a.extend(a.fn.cycle.defaults,{tmplRegex:"{{((.)?.*?)}}"}),a.extend(a.fn.cycle.API,{tmpl:function(b,c){var d=new RegExp(c.tmplRegex||a.fn.cycle.defaults.tmplRegex,"g"),e=a.makeArray(arguments);return e.shift(),b.replace(d,function(b,c){var d,f,g,h,i=c.split(".");for(d=0;d1)for(h=g,f=0;f= 1); if ( startSlideshow ) { if ( !opts._initialized ) opts.API.initSlideshow(); else if ( opts.timeout ) { len = opts.slides.length; opts.nextSlide = opts.reverse ? len - 1 : 1; if ( !opts.timeoutId ) { opts.API.queueTransition( opts ); } } } }, calcFirstSlide: function() { var opts = this.opts(); var firstSlideIndex; firstSlideIndex = parseInt( opts.startingSlide || 0, 10 ); if (firstSlideIndex >= opts.slides.length || firstSlideIndex < 0) firstSlideIndex = 0; opts.currSlide = firstSlideIndex; if ( opts.reverse ) { opts.nextSlide = firstSlideIndex - 1; if (opts.nextSlide < 0) opts.nextSlide = opts.slides.length - 1; } else { opts.nextSlide = firstSlideIndex + 1; if (opts.nextSlide == opts.slides.length) opts.nextSlide = 0; } }, calcNextSlide: function() { var opts = this.opts(); var roll; if ( opts.reverse ) { roll = (opts.nextSlide - 1) < 0; opts.nextSlide = roll ? opts.slideCount - 1 : opts.nextSlide-1; opts.currSlide = roll ? 0 : opts.nextSlide+1; } else { roll = (opts.nextSlide + 1) == opts.slides.length; opts.nextSlide = roll ? 0 : opts.nextSlide+1; opts.currSlide = roll ? opts.slides.length-1 : opts.nextSlide-1; } }, calcTx: function( slideOpts, manual ) { var opts = slideOpts; var tx; if ( opts._tempFx ) tx = $.fn.cycle.transitions[opts._tempFx]; else if ( manual && opts.manualFx ) tx = $.fn.cycle.transitions[opts.manualFx]; if ( !tx ) tx = $.fn.cycle.transitions[opts.fx]; opts._tempFx = null; this.opts()._tempFx = null; if (!tx) { tx = $.fn.cycle.transitions.fade; opts.API.log('Transition "' + opts.fx + '" not found. Using fade.'); } return tx; }, prepareTx: function( manual, fwd ) { var opts = this.opts(); var after, curr, next, slideOpts, tx; if ( opts.slideCount < 2 ) { opts.timeoutId = 0; return; } if ( manual && ( !opts.busy || opts.manualTrump ) ) { opts.API.stopTransition(); opts.busy = false; clearTimeout(opts.timeoutId); opts.timeoutId = 0; } if ( opts.busy ) return; if ( opts.timeoutId === 0 && !manual ) return; curr = opts.slides[opts.currSlide]; next = opts.slides[opts.nextSlide]; slideOpts = opts.API.getSlideOpts( opts.nextSlide ); tx = opts.API.calcTx( slideOpts, manual ); opts._tx = tx; if ( manual && slideOpts.manualSpeed !== undefined ) slideOpts.speed = slideOpts.manualSpeed; // if ( opts.nextSlide === opts.currSlide ) // opts.API.calcNextSlide(); // ensure that: // 1. advancing to a different slide // 2. this is either a manual event (prev/next, pager, cmd) or // a timer event and slideshow is not paused if ( opts.nextSlide != opts.currSlide && (manual || (!opts.paused && !opts.hoverPaused && opts.timeout) )) { // #62 opts.API.trigger('cycle-before', [ slideOpts, curr, next, fwd ]); if ( tx.before ) tx.before( slideOpts, curr, next, fwd ); after = function() { opts.busy = false; // #76; bail if slideshow has been destroyed if (! opts.container.data( 'cycle.opts' ) ) return; if (tx.after) tx.after( slideOpts, curr, next, fwd ); opts.API.trigger('cycle-after', [ slideOpts, curr, next, fwd ]); opts.API.queueTransition( slideOpts); opts.API.updateView( true ); }; opts.busy = true; if (tx.transition) tx.transition(slideOpts, curr, next, fwd, after); else opts.API.doTransition( slideOpts, curr, next, fwd, after); opts.API.calcNextSlide(); opts.API.updateView(); } else { opts.API.queueTransition( slideOpts ); } }, // perform the actual animation doTransition: function( slideOpts, currEl, nextEl, fwd, callback) { var opts = slideOpts; var curr = $(currEl), next = $(nextEl); var fn = function() { // make sure animIn has something so that callback doesn't trigger immediately next.animate(opts.animIn || { opacity: 1}, opts.speed, opts.easeIn || opts.easing, callback); }; next.css(opts.cssBefore || {}); curr.animate(opts.animOut || {}, opts.speed, opts.easeOut || opts.easing, function() { curr.css(opts.cssAfter || {}); if (!opts.sync) { fn(); } }); if (opts.sync) { fn(); } }, queueTransition: function( slideOpts, specificTimeout ) { var opts = this.opts(); var timeout = specificTimeout !== undefined ? specificTimeout : slideOpts.timeout; if (opts.nextSlide === 0 && --opts.loop === 0) { opts.API.log('terminating; loop=0'); opts.timeout = 0; if ( timeout ) { setTimeout(function() { opts.API.trigger('cycle-finished', [ opts ]); }, timeout); } else { opts.API.trigger('cycle-finished', [ opts ]); } // reset nextSlide opts.nextSlide = opts.currSlide; return; } if ( opts.continueAuto !== undefined ) { if ( opts.continueAuto === false || ($.isFunction(opts.continueAuto) && opts.continueAuto() === false )) { opts.API.log('terminating automatic transitions'); opts.timeout = 0; if ( opts.timeoutId ) clearTimeout(opts.timeoutId); return; } } if ( timeout ) { opts._lastQueue = $.now(); if ( specificTimeout === undefined ) opts._remainingTimeout = slideOpts.timeout; if ( !opts.paused && ! opts.hoverPaused ) { opts.timeoutId = setTimeout(function() { opts.API.prepareTx( false, !opts.reverse ); }, timeout ); } } }, stopTransition: function() { var opts = this.opts(); if ( opts.slides.filter(':animated').length ) { opts.slides.stop(false, true); opts.API.trigger('cycle-transition-stopped', [ opts ]); } if ( opts._tx && opts._tx.stopTransition ) opts._tx.stopTransition( opts ); }, // advance slide forward or back advanceSlide: function( val ) { var opts = this.opts(); clearTimeout(opts.timeoutId); opts.timeoutId = 0; opts.nextSlide = opts.currSlide + val; if (opts.nextSlide < 0) opts.nextSlide = opts.slides.length - 1; else if (opts.nextSlide >= opts.slides.length) opts.nextSlide = 0; opts.API.prepareTx( true, val >= 0 ); return false; }, buildSlideOpts: function( slide ) { var opts = this.opts(); var val, shortName; var slideOpts = slide.data() || {}; for (var p in slideOpts) { // allow props to be accessed sans 'cycle' prefix and log the overrides if (slideOpts.hasOwnProperty(p) && /^cycle[A-Z]+/.test(p) ) { val = slideOpts[p]; shortName = p.match(/^cycle(.*)/)[1].replace(/^[A-Z]/, lowerCase); opts.API.log('['+(opts.slideCount-1)+']', shortName+':', val, '('+typeof val +')'); slideOpts[shortName] = val; } } slideOpts = $.extend( {}, $.fn.cycle.defaults, opts, slideOpts ); slideOpts.slideNum = opts.slideCount; try { // these props should always be read from the master state object delete slideOpts.API; delete slideOpts.slideCount; delete slideOpts.currSlide; delete slideOpts.nextSlide; delete slideOpts.slides; } catch(e) { // no op } return slideOpts; }, getSlideOpts: function( index ) { var opts = this.opts(); if ( index === undefined ) index = opts.currSlide; var slide = opts.slides[index]; var slideOpts = $(slide).data('cycle.opts'); return $.extend( {}, opts, slideOpts ); }, initSlide: function( slideOpts, slide, suggestedZindex ) { var opts = this.opts(); slide.css( slideOpts.slideCss || {} ); if ( suggestedZindex > 0 ) slide.css( 'zIndex', suggestedZindex ); // ensure that speed settings are sane if ( isNaN( slideOpts.speed ) ) slideOpts.speed = $.fx.speeds[slideOpts.speed] || $.fx.speeds._default; if ( !slideOpts.sync ) slideOpts.speed = slideOpts.speed / 2; slide.addClass( opts.slideClass ); }, updateView: function( isAfter, isDuring, forceEvent ) { var opts = this.opts(); if ( !opts._initialized ) return; var slideOpts = opts.API.getSlideOpts(); var currSlide = opts.slides[ opts.currSlide ]; if ( ! isAfter && isDuring !== true ) { opts.API.trigger('cycle-update-view-before', [ opts, slideOpts, currSlide ]); if ( opts.updateView < 0 ) return; } if ( opts.slideActiveClass ) { opts.slides.removeClass( opts.slideActiveClass ) .eq( opts.currSlide ).addClass( opts.slideActiveClass ); } if ( isAfter && opts.hideNonActive ) opts.slides.filter( ':not(.' + opts.slideActiveClass + ')' ).css('visibility', 'hidden'); if ( opts.updateView === 0 ) { setTimeout(function() { opts.API.trigger('cycle-update-view', [ opts, slideOpts, currSlide, isAfter ]); }, slideOpts.speed / (opts.sync ? 2 : 1) ); } if ( opts.updateView !== 0 ) opts.API.trigger('cycle-update-view', [ opts, slideOpts, currSlide, isAfter ]); if ( isAfter ) opts.API.trigger('cycle-update-view-after', [ opts, slideOpts, currSlide ]); }, getComponent: function( name ) { var opts = this.opts(); var selector = opts[name]; if (typeof selector === 'string') { // if selector is a child, sibling combinator, adjancent selector then use find, otherwise query full dom return (/^\s*[\>|\+|~]/).test( selector ) ? opts.container.find( selector ) : $( selector ); } if (selector.jquery) return selector; return $(selector); }, stackSlides: function( curr, next, fwd ) { var opts = this.opts(); if ( !curr ) { curr = opts.slides[opts.currSlide]; next = opts.slides[opts.nextSlide]; fwd = !opts.reverse; } // reset the zIndex for the common case: // curr slide on top, next slide beneath, and the rest in order to be shown $(curr).css('zIndex', opts.maxZ); var i; var z = opts.maxZ - 2; var len = opts.slideCount; if (fwd) { for ( i = opts.currSlide + 1; i < len; i++ ) $( opts.slides[i] ).css( 'zIndex', z-- ); for ( i = 0; i < opts.currSlide; i++ ) $( opts.slides[i] ).css( 'zIndex', z-- ); } else { for ( i = opts.currSlide - 1; i >= 0; i-- ) $( opts.slides[i] ).css( 'zIndex', z-- ); for ( i = len - 1; i > opts.currSlide; i-- ) $( opts.slides[i] ).css( 'zIndex', z-- ); } $(next).css('zIndex', opts.maxZ - 1); }, getSlideIndex: function( el ) { return this.opts().slides.index( el ); } }; // API // default logger $.fn.cycle.log = function log() { /*global console:true */ if (window.console && console.log) console.log('[cycle2] ' + Array.prototype.join.call(arguments, ' ') ); }; $.fn.cycle.version = function() { return 'Cycle2: ' + version; }; // helper functions function lowerCase(s) { return (s || '').toLowerCase(); } // expose transition object $.fn.cycle.transitions = { custom: { }, none: { before: function( opts, curr, next, fwd ) { opts.API.stackSlides( next, curr, fwd ); opts.cssBefore = { opacity: 1, visibility: 'visible', display: 'block' }; } }, fade: { before: function( opts, curr, next, fwd ) { var css = opts.API.getSlideOpts( opts.nextSlide ).slideCss || {}; opts.API.stackSlides( curr, next, fwd ); opts.cssBefore = $.extend(css, { opacity: 0, visibility: 'visible', display: 'block' }); opts.animIn = { opacity: 1 }; opts.animOut = { opacity: 0 }; } }, fadeout: { before: function( opts , curr, next, fwd ) { var css = opts.API.getSlideOpts( opts.nextSlide ).slideCss || {}; opts.API.stackSlides( curr, next, fwd ); opts.cssBefore = $.extend(css, { opacity: 1, visibility: 'visible', display: 'block' }); opts.animOut = { opacity: 0 }; } }, scrollHorz: { before: function( opts, curr, next, fwd ) { opts.API.stackSlides( curr, next, fwd ); var w = opts.container.css('overflow','hidden').width(); opts.cssBefore = { left: fwd ? w : - w, top: 0, opacity: 1, visibility: 'visible', display: 'block' }; opts.cssAfter = { zIndex: opts._maxZ - 2, left: 0 }; opts.animIn = { left: 0 }; opts.animOut = { left: fwd ? -w : w }; } } }; // @see: http://jquery.malsup.com/cycle2/api $.fn.cycle.defaults = { allowWrap: true, autoSelector: '.cycle-slideshow[data-cycle-auto-init!=false]', delay: 0, easing: null, fx: 'fade', hideNonActive: true, loop: 0, manualFx: undefined, manualSpeed: undefined, manualTrump: true, maxZ: 100, pauseOnHover: false, reverse: false, slideActiveClass: 'cycle-slide-active', slideClass: 'cycle-slide', slideCss: { position: 'absolute', top: 0, left: 0 }, slides: '> img', speed: 500, startingSlide: 0, sync: true, timeout: 4000, updateView: 0 }; // automatically find and run slideshows $(document).ready(function() { $( $.fn.cycle.defaults.autoSelector ).cycle(); }); })(jQuery); /*! Cycle2 autoheight plugin; Copyright (c) M.Alsup, 2012; version: 20130913 */ (function($) { "use strict"; $.extend($.fn.cycle.defaults, { autoHeight: 0, // setting this option to false disables autoHeight logic autoHeightSpeed: 250, autoHeightEasing: null }); $(document).on( 'cycle-initialized', function( e, opts ) { var autoHeight = opts.autoHeight; var t = $.type( autoHeight ); var resizeThrottle = null; var ratio; if ( t !== 'string' && t !== 'number' ) return; // bind events opts.container.on( 'cycle-slide-added cycle-slide-removed', initAutoHeight ); opts.container.on( 'cycle-destroyed', onDestroy ); if ( autoHeight == 'container' ) { opts.container.on( 'cycle-before', onBefore ); } else if ( t === 'string' && /\d+\:\d+/.test( autoHeight ) ) { // use ratio ratio = autoHeight.match(/(\d+)\:(\d+)/); ratio = ratio[1] / ratio[2]; opts._autoHeightRatio = ratio; } // if autoHeight is a number then we don't need to recalculate the sentinel // index on resize if ( t !== 'number' ) { // bind unique resize handler per slideshow (so it can be 'off-ed' in onDestroy) opts._autoHeightOnResize = function () { clearTimeout( resizeThrottle ); resizeThrottle = setTimeout( onResize, 50 ); }; $(window).on( 'resize orientationchange', opts._autoHeightOnResize ); } setTimeout( onResize, 30 ); function onResize() { initAutoHeight( e, opts ); } }); function initAutoHeight( e, opts ) { var clone, height, sentinelIndex; var autoHeight = opts.autoHeight; if ( autoHeight == 'container' ) { height = $( opts.slides[ opts.currSlide ] ).outerHeight(); opts.container.height( height ); } else if ( opts._autoHeightRatio ) { opts.container.height( opts.container.width() / opts._autoHeightRatio ); } else if ( autoHeight === 'calc' || ( $.type( autoHeight ) == 'number' && autoHeight >= 0 ) ) { if ( autoHeight === 'calc' ) sentinelIndex = calcSentinelIndex( e, opts ); else if ( autoHeight >= opts.slides.length ) sentinelIndex = 0; else sentinelIndex = autoHeight; // only recreate sentinel if index is different if ( sentinelIndex == opts._sentinelIndex ) return; opts._sentinelIndex = sentinelIndex; if ( opts._sentinel ) opts._sentinel.remove(); // clone existing slide as sentinel clone = $( opts.slides[ sentinelIndex ].cloneNode(true) ); // #50; remove special attributes from cloned content clone.removeAttr( 'id name rel' ).find( '[id],[name],[rel]' ).removeAttr( 'id name rel' ); clone.css({ position: 'static', visibility: 'hidden', display: 'block' }).prependTo( opts.container ).addClass('cycle-sentinel cycle-slide').removeClass('cycle-slide-active'); clone.find( '*' ).css( 'visibility', 'hidden' ); opts._sentinel = clone; } } function calcSentinelIndex( e, opts ) { var index = 0, max = -1; // calculate tallest slide index opts.slides.each(function(i) { var h = $(this).height(); if ( h > max ) { max = h; index = i; } }); return index; } function onBefore( e, opts, outgoing, incoming, forward ) { var h = $(incoming).outerHeight(); opts.container.animate( { height: h }, opts.autoHeightSpeed, opts.autoHeightEasing ); } function onDestroy( e, opts ) { if ( opts._autoHeightOnResize ) { $(window).off( 'resize orientationchange', opts._autoHeightOnResize ); opts._autoHeightOnResize = null; } opts.container.off( 'cycle-slide-added cycle-slide-removed', initAutoHeight ); opts.container.off( 'cycle-destroyed', onDestroy ); opts.container.off( 'cycle-before', onBefore ); if ( opts._sentinel ) { opts._sentinel.remove(); opts._sentinel = null; } } })(jQuery); /*! caption plugin for Cycle2; version: 20130306 */ (function($) { "use strict"; $.extend($.fn.cycle.defaults, { caption: '> .cycle-caption', captionTemplate: '{{slideNum}} / {{slideCount}}', overlay: '> .cycle-overlay', overlayTemplate: '
    {{title}}
    {{desc}}
    ', captionModule: 'caption' }); $(document).on( 'cycle-update-view', function( e, opts, slideOpts, currSlide ) { if ( opts.captionModule !== 'caption' ) return; var el; $.each(['caption','overlay'], function() { var name = this; var template = slideOpts[name+'Template']; var el = opts.API.getComponent( name ); if( el.length && template ) { el.html( opts.API.tmpl( template, slideOpts, opts, currSlide ) ); el.show(); } else { el.hide(); } }); }); $(document).on( 'cycle-destroyed', function( e, opts ) { var el; $.each(['caption','overlay'], function() { var name = this, template = opts[name+'Template']; if ( opts[name] && template ) { el = opts.API.getComponent( 'caption' ); el.empty(); } }); }); })(jQuery); /*! command plugin for Cycle2; version: 20140415 */ (function($) { "use strict"; var c2 = $.fn.cycle; $.fn.cycle = function( options ) { var cmd, cmdFn, opts; var args = $.makeArray( arguments ); if ( $.type( options ) == 'number' ) { return this.cycle( 'goto', options ); } if ( $.type( options ) == 'string' ) { return this.each(function() { var cmdArgs; cmd = options; opts = $(this).data('cycle.opts'); if ( opts === undefined ) { c2.log('slideshow must be initialized before sending commands; "' + cmd + '" ignored'); return; } else { cmd = cmd == 'goto' ? 'jump' : cmd; // issue #3; change 'goto' to 'jump' internally cmdFn = opts.API[ cmd ]; if ( $.isFunction( cmdFn )) { cmdArgs = $.makeArray( args ); cmdArgs.shift(); return cmdFn.apply( opts.API, cmdArgs ); } else { c2.log( 'unknown command: ', cmd ); } } }); } else { return c2.apply( this, arguments ); } }; // copy props $.extend( $.fn.cycle, c2 ); $.extend( c2.API, { next: function() { var opts = this.opts(); if ( opts.busy && ! opts.manualTrump ) return; var count = opts.reverse ? -1 : 1; if ( opts.allowWrap === false && ( opts.currSlide + count ) >= opts.slideCount ) return; opts.API.advanceSlide( count ); opts.API.trigger('cycle-next', [ opts ]).log('cycle-next'); }, prev: function() { var opts = this.opts(); if ( opts.busy && ! opts.manualTrump ) return; var count = opts.reverse ? 1 : -1; if ( opts.allowWrap === false && ( opts.currSlide + count ) < 0 ) return; opts.API.advanceSlide( count ); opts.API.trigger('cycle-prev', [ opts ]).log('cycle-prev'); }, destroy: function() { this.stop(); //#204 var opts = this.opts(); var clean = $.isFunction( $._data ) ? $._data : $.noop; // hack for #184 and #201 clearTimeout(opts.timeoutId); opts.timeoutId = 0; opts.API.stop(); opts.API.trigger( 'cycle-destroyed', [ opts ] ).log('cycle-destroyed'); opts.container.removeData(); clean( opts.container[0], 'parsedAttrs', false ); // #75; remove inline styles if ( ! opts.retainStylesOnDestroy ) { opts.container.removeAttr( 'style' ); opts.slides.removeAttr( 'style' ); opts.slides.removeClass( opts.slideActiveClass ); } opts.slides.each(function() { var slide = $(this); slide.removeData(); slide.removeClass( opts.slideClass ); clean( this, 'parsedAttrs', false ); }); }, jump: function( index, fx ) { // go to the requested slide var fwd; var opts = this.opts(); if ( opts.busy && ! opts.manualTrump ) return; var num = parseInt( index, 10 ); if (isNaN(num) || num < 0 || num >= opts.slides.length) { opts.API.log('goto: invalid slide index: ' + num); return; } if (num == opts.currSlide) { opts.API.log('goto: skipping, already on slide', num); return; } opts.nextSlide = num; clearTimeout(opts.timeoutId); opts.timeoutId = 0; opts.API.log('goto: ', num, ' (zero-index)'); fwd = opts.currSlide < opts.nextSlide; opts._tempFx = fx; opts.API.prepareTx( true, fwd ); }, stop: function() { var opts = this.opts(); var pauseObj = opts.container; clearTimeout(opts.timeoutId); opts.timeoutId = 0; opts.API.stopTransition(); if ( opts.pauseOnHover ) { if ( opts.pauseOnHover !== true ) pauseObj = $( opts.pauseOnHover ); pauseObj.off('mouseenter mouseleave'); } opts.API.trigger('cycle-stopped', [ opts ]).log('cycle-stopped'); }, reinit: function() { var opts = this.opts(); opts.API.destroy(); opts.container.cycle(); }, remove: function( index ) { var opts = this.opts(); var slide, slideToRemove, slides = [], slideNum = 1; for ( var i=0; i < opts.slides.length; i++ ) { slide = opts.slides[i]; if ( i == index ) { slideToRemove = slide; } else { slides.push( slide ); $( slide ).data('cycle.opts').slideNum = slideNum; slideNum++; } } if ( slideToRemove ) { opts.slides = $( slides ); opts.slideCount--; $( slideToRemove ).remove(); if (index == opts.currSlide) opts.API.advanceSlide( 1 ); else if ( index < opts.currSlide ) opts.currSlide--; else opts.currSlide++; opts.API.trigger('cycle-slide-removed', [ opts, index, slideToRemove ]).log('cycle-slide-removed'); opts.API.updateView(); } } }); // listen for clicks on elements with data-cycle-cmd attribute $(document).on('click.cycle', '[data-cycle-cmd]', function(e) { // issue cycle command e.preventDefault(); var el = $(this); var command = el.data('cycle-cmd'); var context = el.data('cycle-context') || '.cycle-slideshow'; $(context).cycle(command, el.data('cycle-arg')); }); })(jQuery); /*! hash plugin for Cycle2; version: 20130905 */ (function($) { "use strict"; $(document).on( 'cycle-pre-initialize', function( e, opts ) { onHashChange( opts, true ); opts._onHashChange = function() { onHashChange( opts, false ); }; $( window ).on( 'hashchange', opts._onHashChange); }); $(document).on( 'cycle-update-view', function( e, opts, slideOpts ) { if ( slideOpts.hash && ( '#' + slideOpts.hash ) != window.location.hash ) { opts._hashFence = true; window.location.hash = slideOpts.hash; } }); $(document).on( 'cycle-destroyed', function( e, opts) { if ( opts._onHashChange ) { $( window ).off( 'hashchange', opts._onHashChange ); } }); function onHashChange( opts, setStartingSlide ) { var hash; if ( opts._hashFence ) { opts._hashFence = false; return; } hash = window.location.hash.substring(1); opts.slides.each(function(i) { if ( $(this).data( 'cycle-hash' ) == hash ) { if ( setStartingSlide === true ) { opts.startingSlide = i; } else { var fwd = opts.currSlide < i; opts.nextSlide = i; opts.API.prepareTx( true, fwd ); } return false; } }); } })(jQuery); /*! loader plugin for Cycle2; version: 20131121 */ (function($) { "use strict"; $.extend($.fn.cycle.defaults, { loader: false }); $(document).on( 'cycle-bootstrap', function( e, opts ) { var addFn; if ( !opts.loader ) return; // override API.add for this slideshow addFn = opts.API.add; opts.API.add = add; function add( slides, prepend ) { var slideArr = []; if ( $.type( slides ) == 'string' ) slides = $.trim( slides ); else if ( $.type( slides) === 'array' ) { for (var i=0; i < slides.length; i++ ) slides[i] = $(slides[i])[0]; } slides = $( slides ); var slideCount = slides.length; if ( ! slideCount ) return; slides.css('visibility','hidden').appendTo('body').each(function(i) { // appendTo fixes #56 var count = 0; var slide = $(this); var images = slide.is('img') ? slide : slide.find('img'); slide.data('index', i); // allow some images to be marked as unimportant (and filter out images w/o src value) images = images.filter(':not(.cycle-loader-ignore)').filter(':not([src=""])'); if ( ! images.length ) { --slideCount; slideArr.push( slide ); return; } count = images.length; images.each(function() { // add images that are already loaded if ( this.complete ) { imageLoaded(); } else { $(this).load(function() { imageLoaded(); }).on("error", function() { if ( --count === 0 ) { // ignore this slide opts.API.log('slide skipped; img not loaded:', this.src); if ( --slideCount === 0 && opts.loader == 'wait') { addFn.apply( opts.API, [ slideArr, prepend ] ); } } }); } }); function imageLoaded() { if ( --count === 0 ) { --slideCount; addSlide( slide ); } } }); if ( slideCount ) opts.container.addClass('cycle-loading'); function addSlide( slide ) { var curr; if ( opts.loader == 'wait' ) { slideArr.push( slide ); if ( slideCount === 0 ) { // #59; sort slides into original markup order slideArr.sort( sorter ); addFn.apply( opts.API, [ slideArr, prepend ] ); opts.container.removeClass('cycle-loading'); } } else { curr = $(opts.slides[opts.currSlide]); addFn.apply( opts.API, [ slide, prepend ] ); curr.show(); opts.container.removeClass('cycle-loading'); } } function sorter(a, b) { return a.data('index') - b.data('index'); } } }); })(jQuery); /*! pager plugin for Cycle2; version: 20140415 */ (function($) { "use strict"; $.extend($.fn.cycle.defaults, { pager: '> .cycle-pager', pagerActiveClass: 'cycle-pager-active', pagerEvent: 'click.cycle', pagerEventBubble: undefined, pagerTemplate: '' }); $(document).on( 'cycle-bootstrap', function( e, opts, API ) { // add method to API API.buildPagerLink = buildPagerLink; }); $(document).on( 'cycle-slide-added', function( e, opts, slideOpts, slideAdded ) { if ( opts.pager ) { opts.API.buildPagerLink ( opts, slideOpts, slideAdded ); opts.API.page = page; } }); $(document).on( 'cycle-slide-removed', function( e, opts, index, slideRemoved ) { if ( opts.pager ) { var pagers = opts.API.getComponent( 'pager' ); pagers.each(function() { var pager = $(this); $( pager.children()[index] ).remove(); }); } }); $(document).on( 'cycle-update-view', function( e, opts, slideOpts ) { var pagers; if ( opts.pager ) { pagers = opts.API.getComponent( 'pager' ); pagers.each(function() { $(this).children().removeClass( opts.pagerActiveClass ) .eq( opts.currSlide ).addClass( opts.pagerActiveClass ); }); } }); $(document).on( 'cycle-destroyed', function( e, opts ) { var pager = opts.API.getComponent( 'pager' ); if ( pager ) { pager.children().off( opts.pagerEvent ); // #202 if ( opts.pagerTemplate ) pager.empty(); } }); function buildPagerLink( opts, slideOpts, slide ) { var pagerLink; var pagers = opts.API.getComponent( 'pager' ); pagers.each(function() { var pager = $(this); if ( slideOpts.pagerTemplate ) { var markup = opts.API.tmpl( slideOpts.pagerTemplate, slideOpts, opts, slide[0] ); pagerLink = $( markup ).appendTo( pager ); } else { pagerLink = pager.children().eq( opts.slideCount - 1 ); } pagerLink.on( opts.pagerEvent, function(e) { if ( ! opts.pagerEventBubble ) e.preventDefault(); opts.API.page( pager, e.currentTarget); }); }); } function page( pager, target ) { /*jshint validthis:true */ var opts = this.opts(); if ( opts.busy && ! opts.manualTrump ) return; var index = pager.children().index( target ); var nextSlide = index; var fwd = opts.currSlide < nextSlide; if (opts.currSlide == nextSlide) { return; // no op, clicked pager for the currently displayed slide } opts.nextSlide = nextSlide; opts._tempFx = opts.pagerFx; opts.API.prepareTx( true, fwd ); opts.API.trigger('cycle-pager-activated', [opts, pager, target ]); } })(jQuery); /*! prevnext plugin for Cycle2; version: 20140408 */ (function($) { "use strict"; $.extend($.fn.cycle.defaults, { next: '> .cycle-next', nextEvent: 'click.cycle', disabledClass: 'disabled', prev: '> .cycle-prev', prevEvent: 'click.cycle', swipe: false }); $(document).on( 'cycle-initialized', function( e, opts ) { opts.API.getComponent( 'next' ).on( opts.nextEvent, function(e) { e.preventDefault(); opts.API.next(); }); opts.API.getComponent( 'prev' ).on( opts.prevEvent, function(e) { e.preventDefault(); opts.API.prev(); }); if ( opts.swipe ) { var nextEvent = opts.swipeVert ? 'swipeUp.cycle' : 'swipeLeft.cycle swipeleft.cycle'; var prevEvent = opts.swipeVert ? 'swipeDown.cycle' : 'swipeRight.cycle swiperight.cycle'; opts.container.on( nextEvent, function(e) { opts._tempFx = opts.swipeFx; opts.API.next(); }); opts.container.on( prevEvent, function() { opts._tempFx = opts.swipeFx; opts.API.prev(); }); } }); $(document).on( 'cycle-update-view', function( e, opts, slideOpts, currSlide ) { if ( opts.allowWrap ) return; var cls = opts.disabledClass; var next = opts.API.getComponent( 'next' ); var prev = opts.API.getComponent( 'prev' ); var prevBoundry = opts._prevBoundry || 0; var nextBoundry = (opts._nextBoundry !== undefined)?opts._nextBoundry:opts.slideCount - 1; if ( opts.currSlide == nextBoundry ) next.addClass( cls ).prop( 'disabled', true ); else next.removeClass( cls ).prop( 'disabled', false ); if ( opts.currSlide === prevBoundry ) prev.addClass( cls ).prop( 'disabled', true ); else prev.removeClass( cls ).prop( 'disabled', false ); }); $(document).on( 'cycle-destroyed', function( e, opts ) { opts.API.getComponent( 'prev' ).off( opts.nextEvent ); opts.API.getComponent( 'next' ).off( opts.prevEvent ); opts.container.off( 'swipeleft.cycle swiperight.cycle swipeLeft.cycle swipeRight.cycle swipeUp.cycle swipeDown.cycle' ); }); })(jQuery); /*! progressive loader plugin for Cycle2; version: 20130315 */ (function($) { "use strict"; $.extend($.fn.cycle.defaults, { progressive: false }); $(document).on( 'cycle-pre-initialize', function( e, opts ) { if ( !opts.progressive ) return; var API = opts.API; var nextFn = API.next; var prevFn = API.prev; var prepareTxFn = API.prepareTx; var type = $.type( opts.progressive ); var slides, scriptEl; if ( type == 'array' ) { slides = opts.progressive; } else if ($.isFunction( opts.progressive ) ) { slides = opts.progressive( opts ); } else if ( type == 'string' ) { scriptEl = $( opts.progressive ); slides = $.trim( scriptEl.html() ); if ( !slides ) return; // is it json array? if ( /^(\[)/.test( slides ) ) { try { slides = $.parseJSON( slides ); } catch(err) { API.log( 'error parsing progressive slides', err ); return; } } else { // plain text, split on delimeter slides = slides.split( new RegExp( scriptEl.data('cycle-split') || '\n') ); // #95; look for empty slide if ( ! slides[ slides.length - 1 ] ) slides.pop(); } } if ( prepareTxFn ) { API.prepareTx = function( manual, fwd ) { var index, slide; if ( manual || slides.length === 0 ) { prepareTxFn.apply( opts.API, [ manual, fwd ] ); return; } if ( fwd && opts.currSlide == ( opts.slideCount-1) ) { slide = slides[ 0 ]; slides = slides.slice( 1 ); opts.container.one('cycle-slide-added', function(e, opts ) { setTimeout(function() { opts.API.advanceSlide( 1 ); },50); }); opts.API.add( slide ); } else if ( !fwd && opts.currSlide === 0 ) { index = slides.length-1; slide = slides[ index ]; slides = slides.slice( 0, index ); opts.container.one('cycle-slide-added', function(e, opts ) { setTimeout(function() { opts.currSlide = 1; opts.API.advanceSlide( -1 ); },50); }); opts.API.add( slide, true ); } else { prepareTxFn.apply( opts.API, [ manual, fwd ] ); } }; } if ( nextFn ) { API.next = function() { var opts = this.opts(); if ( slides.length && opts.currSlide == ( opts.slideCount - 1 ) ) { var slide = slides[ 0 ]; slides = slides.slice( 1 ); opts.container.one('cycle-slide-added', function(e, opts ) { nextFn.apply( opts.API ); opts.container.removeClass('cycle-loading'); }); opts.container.addClass('cycle-loading'); opts.API.add( slide ); } else { nextFn.apply( opts.API ); } }; } if ( prevFn ) { API.prev = function() { var opts = this.opts(); if ( slides.length && opts.currSlide === 0 ) { var index = slides.length-1; var slide = slides[ index ]; slides = slides.slice( 0, index ); opts.container.one('cycle-slide-added', function(e, opts ) { opts.currSlide = 1; opts.API.advanceSlide( -1 ); opts.container.removeClass('cycle-loading'); }); opts.container.addClass('cycle-loading'); opts.API.add( slide, true ); } else { prevFn.apply( opts.API ); } }; } }); })(jQuery); /*! tmpl plugin for Cycle2; version: 20121227 */ (function($) { "use strict"; $.extend($.fn.cycle.defaults, { tmplRegex: '{{((.)?.*?)}}' }); $.extend($.fn.cycle.API, { tmpl: function( str, opts /*, ... */) { var regex = new RegExp( opts.tmplRegex || $.fn.cycle.defaults.tmplRegex, 'g' ); var args = $.makeArray( arguments ); args.shift(); return str.replace(regex, function(_, str) { var i, j, obj, prop, names = str.split('.'); for (i=0; i < args.length; i++) { obj = args[i]; if ( ! obj ) continue; if (names.length > 1) { prop = obj; for (j=0; j < names.length; j++) { obj = prop; prop = prop[ names[j] ] || str; } } else { prop = obj[str]; } if ($.isFunction(prop)) return prop.apply(obj, args); if (prop !== undefined && prop !== null && prop != str) return prop; } return str; }); } }); })(jQuery); vendors/about/css/about.css000064400000004122150212240530011743 0ustar00.at-wrap .wp-badge.about-logo { background-color: #FFF; background-position: center center; background-size: 70%; background-repeat: no-repeat; } .at-wrap h1 { font-size: 2em; } .at-wrap h3 { font-size: 1.1em; } .at-wrap .nav-tab { font-size: 16px; } .at-wrap .dashicons { margin-right: 15px; position: relative; top: 3px; } .at-wrap .nav-tab-wrapper .dashicons { color: #D54E21; margin-right: 3px; } .at-wrap .action-recommended ul { list-style-type: disc; list-style-position: inside; font-size: 14px; } .at-wrap .action-recommended-box { background: #FFF; border-left: 4px solid #F8800C; display: block; margin-bottom: 15px; padding: 10px 30px; position: relative; -webkit-box-shadow: 0 1px 1px 0 rgba(0 ,0, 0, .1); box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1); } .at-wrap .action-recommended-box.complete { border-left: 4px solid #46B450; } .at-wrap .action-recommended .action-recommended-box:last-of-type { margin-bottom: 0; } .at-wrap .action-recommended-box h3 { margin: 0 0 10px; } .at-wrap .action-recommended-box p { display: block; margin-top: 0; width: 100%; max-width: 100%; } .at-wrap .feature-section { padding: 0px; } .at-wrap .feature-section .col { margin-top: 0; margin-bottom: 5%; } .at-wrap .feature-section .col:nth-child(3n + 1) { clear:both; } .at-wrap .recommended-action-button { position: absolute; top: 10px; right: 10px; text-decoration: none; color: #B4B9BE; border-radius: 50%; cursor: pointer; } .at-wrap .recommended-action-button:hover:before { color: #C00; } .at-wrap .three-col .plugin_box.col { -webkit-box-sizing: border-box; box-sizing: border-box; float: left; width: 30%; } .at-wrap .useful-plugins, .at-wrap .demo-content { padding-top: 60px; } .at-wrap .useful-plugins .button-wrap { margin-top: 20px; } .at-wrap .useful-plugins .all-active { font-weight: 800; margin-bottom: 15px; } .at-wrap .useful-plugins ul { list-style-type: disc; list-style-position: inside; } .at-wrap .upgrade-to-pro { height: auto; overflow: hidden; padding-top: 40px; } .at-wrap .upgrade-to-pro div { margin-bottom: 20px; } vendors/about/css/about.min.css000064400000003462150212240530012533 0ustar00.at-wrap .action-recommended ul,.at-wrap .useful-plugins ul{list-style-type:disc;list-style-position:inside}.at-wrap .wp-badge.about-logo{background-color:#FFF;background-position:center center;background-size:70%;background-repeat:no-repeat}.at-wrap h1{font-size:2em}.at-wrap h3{font-size:1.1em}.at-wrap .nav-tab{font-size:16px}.at-wrap .dashicons{margin-right:15px;position:relative;top:3px}.at-wrap .nav-tab-wrapper .dashicons{color:#D54E21;margin-right:3px}.at-wrap .action-recommended ul{font-size:14px}.at-wrap .action-recommended-box{background:#FFF;border-left:4px solid #F8800C;display:block;margin-bottom:15px;padding:10px 30px;position:relative;-webkit-box-shadow:0 1px 1px 0 rgba(0 ,0,0,.1);box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}.at-wrap .action-recommended-box.complete{border-left:4px solid #46B450}.at-wrap .action-recommended .action-recommended-box:last-of-type{margin-bottom:0}.at-wrap .action-recommended-box h3{margin:0 0 10px}.at-wrap .action-recommended-box p{display:block;margin-top:0;width:100%;max-width:100%}.at-wrap .feature-section{padding:0px}.at-wrap .feature-section .col{margin-top:0;margin-bottom:5%}.at-wrap .feature-section .col:nth-child(3n+1){clear:both}.at-wrap .recommended-action-button{position:absolute;top:10px;right:10px;text-decoration:none;color:#B4B9BE;border-radius:50%;cursor:pointer}.at-wrap .recommended-action-button:hover:before{color:#C00}.at-wrap .three-col .plugin_box.col{-webkit-box-sizing:border-box;box-sizing:border-box;float:left;width:30%}.at-wrap .demo-content,.at-wrap .useful-plugins, .at-wrap .action-recommended{padding-top:40px}.at-wrap .useful-plugins .button-wrap{margin-top:20px}.at-wrap .useful-plugins .all-active{font-weight:800;margin-bottom:15px}.at-wrap .upgrade-to-pro{height:auto;overflow:hidden;padding-top:40px}.at-wrap .upgrade-to-pro div{margin-bottom:20px}vendors/about/images/logo.png000064400000013626150212240530012253 0ustar00PNG  IHDRz]IDATxw\mh-BU:P>-R-VωRGZ@ZG0^aC $!0 I?^7ws9wPZTZ@ X-jjQVZԀgT|m+l#fYEN$(n!C)Ƀ ($ ;rTId9bVIzmpPf+::11~ YndBѥih\MDL#e%+[U14UW4Qɚ?dhE'ϴ Ԁe%B.ih2*arG1m}B06 #R wŌEnTFꚤbGT"5Iy04gf/^hj~N6,I2"fϣ)~mР_Zrr-g(-~Y٩+mmVTm_zg9زq#Fy%Čhjv}{X j|4m =:(h 7.0lԨ!C3dݙ4[-=C b~ ;QXji  Fmf&XwwC^[ZKёl=Wb,Sgp[zzL߿?˫WW4Z~&%cMX̕A!X/ 0 gcCV[ .Ι?x0#n/(H{h@\uXI7o9˞6w*xOưkѣ͊`Yh!NN#j# UUJ 8Eh&NL]:f .C[>&N):FWggM(K s3n0ZZ U\.awɑqrEҷ!W兦jiS]$z܌+W^\'Ǔ`̜b! 9@F-IO/`Z8d/߲LX֒=ZL Vf  Ǹoa–e?8\|3k$mݫ,0;55t&{r,t]ħ*w[7l@|Aj[@/^e;8`qLVl+{C/_u/p8FFh0B>q0R1CH>L \s6Z i4 8S7u- 5GQdg/_jk 7}Zibc~u2psS/<~ד@˜vd4 Zn8 `SguoH]p!ChTh()pz{lQ6nm dioG/@|⿇A,,vӖ0n{DǏ᦯SqhL{]矸rs'-Y8Btt:I %Zﶛ xU_2YNDŊuuRmYScrǏÁYGï:R& ӧ1 bcnt:=*JWuAgTRg#ڎpeyرRJNKjkUVu%}&p+]%NIȀss1.-Zp῀ZZYUP;ӡꃂ:x<[4?.1ۺyK{09+8PNO_&uzJblF;l\I䬇zI,j0P_XlfaE_x/ׯ= xG6`Jb",\ C 8BO7X֖ 8$0/`{6zU m\a}Ŗ/3E(GFMIAL/. R~0+22a+tvĀ7>?~*I7@HzKE,noX [R.77' 4lHD GZ J Ǎx47ϛ:Uj M@{/nM8vc9šW&[CC)*ɠR^%pAfe$-SQLBݦ$&"._6|®x0%wE+;V<T3J3 2czja!)"'Gf\&yL]A;%~.v66R_0K4(;{J{$;8(& ]8w44߾p)>Xjp<@K̥qX2_LL$d"o qqx?0͌9? E/y}(dٗ]Y?Iߴ]7>a) ?Xfη j/RgGIOZyp;;,>]7>x ߻s'AB *Q<}7vҾlTpV<(Ԋ\.TٹyFO6H\6淵%, yz>BVf|:B0\u-I6FG~q8|BTHZdlh͑-` %ت$d)63d%>%rDYA~>H_!OPAE[PRm‘^f$j*[yi53KC bQMcE ˒rN5),Ak͉>PW\G-}u~p.'!74c|6`@)ثJ%j%D pYn] UבiN XrB+,jmC3 Dwݸ'87C IQ >>͜0_K4gc9iWzE[VRro?z,&~nflooňd-L&779hn2LY<`'dƄn Q \.ť vWvݓ)Z(q{ cBݸ1 E(=.N|*NL:6IƄn_>&YH{[GJ)KuWen? &ϸ%K~v@1!R%Jp2ZTSsZI:,GGf~ ,奥JkԗH&lɒO`umܾU -ͲsC}}ld䕳gZ c\o9-rU>|qfܵu B޼A ÌQ[痓'6m) '-=E޾²E >}^'sǏSX}}|"㣢( z׽{/vuq݊؉]~b0 |}2V(t:mRiUzG{iS'XϴVIv7T >De.[f >EgM2Uj .򏈓4 }aN(ŋhLCv>H9SwISYU_a>U.ZM-=-JtGw=9i/p\a!gъ/]^PLiwyV* WWZ)o:kvslvt&7'%Y@5`9 WD١羰w ̕馓rXx7nq:q)R|XtK+si)iqQ 1qI)Y².&jjQVZԀբ~øυIENDB`vendors/about/js/about.min.js000064400000000631150212240530012176 0ustar00!function($){"use strict";$(document).ready(function(){$(".recommended-action-button").on("click",function(){var id=$(this).attr("id"),action=$(this).data("action"),nonce=$(this).data("nonce");$.ajax({type:"GET",dataType:"html",url:businessClubAboutObject.ajaxurl,data:{action:"at_about_action_dismiss_recommended_action",id:id,_wpnonce:nonce,todo:action},success:function(){location.reload()}})})})}(jQuery);vendors/about/js/about.js000064400000001123150212240530011411 0ustar00( function( $ ) { 'use strict'; $(document).ready(function () { $('.recommended-action-button').on('click',function() { var id = $(this).attr('id'); var action = $(this).data('action'); var nonce = $(this).data('nonce'); $.ajax({ type : 'GET', dataType : 'html', url : businessClubAboutObject.ajaxurl, data : { 'action' : 'at_about_action_dismiss_recommended_action', 'id' : id, '_wpnonce' : nonce, 'todo' : action }, success : function () { location.reload(); } }); }); }); } )( jQuery ); vendors/about/class-about.php000064400000067450150212240530012272 0ustar00config = $config; self::$instance->setup_config(); self::$instance->setup_actions(); } } } /** * Setup the class props based on the config array. * * @since 1.0.0 */ public function setup_config() { $theme = wp_get_theme(); if ( is_child_theme() ) { $this->theme_name = $theme->parent()->get( 'Name' ); $this->theme = $theme->parent(); } else { $this->theme_name = $theme->get( 'Name' ); $this->theme = $theme->parent(); } $this->theme_version = $theme->get( 'Version' ); $this->theme_slug = $theme->get_template(); $this->page_slug = $this->theme_slug . '-about'; $this->action_key = $this->theme_slug . '-recommended_actions'; $this->menu_name = isset( $this->config['menu_name'] ) ? $this->config['menu_name'] : $this->theme_name; $this->page_name = isset( $this->config['page_name'] ) ? $this->config['page_name'] : $this->theme_name; $this->logo_url = isset( $this->config['logo_url'] ) ? $this->config['logo_url'] : get_template_directory_uri() . '/vendors/about/images/logo.png'; $this->logo_link = isset( $this->config['logo_link'] ) ? $this->config['logo_link'] : 'https://axlethemes.com/'; $this->tabs = isset( $this->config['tabs'] ) ? $this->config['tabs'] : array(); $dismiss_url = wp_nonce_url( add_query_arg( array( 'business-club-at-dismiss' => '1' ), admin_url( 'themes.php' ) ), 'business-club-action-dismiss-' . get_current_user_id(), 'business-club-dismiss-nonce' ); $this->notification = isset( $this->config['notification'] ) ? $this->config['notification'] : ( '

    ' . sprintf( esc_html__( 'Welcome! Thank you for choosing %1$s! To fully take advantage of the best our theme can offer please make sure you visit our %2$swelcome page%3$s.', 'business-club' ), $this->theme_name, '', '' ) . '

    ' . sprintf( esc_html__( 'Get started with %s', 'business-club' ), $this->theme_name ) . '' ) . '' . esc_html__( 'Dismiss', 'business-club' ) . '

    '; } /** * Setup actions. * * @since 1.0.0 */ public function setup_actions() { add_action( 'admin_menu', array( $this, 'register' ) ); add_action( 'wp_loaded', array( $this, 'hide_notice' ) ); add_action( 'load-themes.php', array( $this, 'activation_admin_notice' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'load_assets' ) ); add_action( 'wp_ajax_at_about_action_dismiss_recommended_action', array( $this, 'dismiss_recommended_action_callback' ) ); add_action( 'wp_ajax_nopriv_at_about_action_dismiss_recommended_action', array( $this, 'dismiss_recommended_action_callback' ) ); } /** * Register the page under Appearance. * * @since 1.0.0 */ public function register() { if ( ! empty( $this->menu_name ) && ! empty( $this->page_name ) ) { $count = $this->get_total_recommended_actions(); $title = $this->page_name; if ( $count > 0 ) { $title .= '' . esc_html( $count ) . ''; } add_theme_page( $this->menu_name, $title, 'edit_theme_options', $this->page_slug, array( $this, 'render_about_page' ) ); } } /** * Hide notice * * @since 1.0.0 */ function hide_notice() { // Verify nonce. if (! ( isset( $_GET['business-club-dismiss-nonce'] ) && wp_verify_nonce( sanitize_key( $_GET['business-club-dismiss-nonce'] ), 'business-club-action-dismiss-' . get_current_user_id() ) ) ) { return; } if ( 1 === absint( $_GET['business-club-at-dismiss'] ) ) { update_user_meta( get_current_user_id(), 'business_club_at_dismissed', 1 ); } } /** * Get total recommended actions count. * * @since 1.0.0 * * @return int Total count. */ private function get_total_recommended_actions() { $actions = $this->get_recommended_actions(); return count( $actions ); } /** * Return valid array of recommended actions. * * @return array Valid array of recommended actions. */ private function get_recommended_actions() { $saved_actions = get_option( $this->action_key ); if ( ! is_array( $saved_actions ) ) { $saved_actions = array(); } $valid = array(); $action_config = isset( $this->config['recommended_actions'] ) ? $this->config['recommended_actions'] : array(); if ( ! empty( $action_config['content'] ) ) { foreach ( $action_config['content'] as $item ) { if ( isset( $item['check'] ) && true === $item['check'] ) { continue; } if ( isset( $saved_actions[ $item['id'] ] ) && false === $saved_actions[ $item['id'] ] ) { continue; } $valid[] = $item; } } return $valid; } /** * Render quick links. * * @since 1.0.0 */ public function render_quick_links() { $quick_links = ( isset( $this->config['quick_links'] ) ) ? $this->config['quick_links'] : array(); if ( empty( $quick_links ) ) { return; } echo '

    '; foreach ( $quick_links as $link ) { $link_class = 'button'; if ( isset( $link['button'] ) ) { $link_class .= ' button-' . esc_attr( $link['button'] ); } echo '' . esc_html( $link['text'] ) . '  '; } echo '

    '; } /** * Render main page. * * @since 1.0.0 */ public function render_about_page() { if ( ! empty( $this->config['welcome_title'] ) ) { $welcome_title = $this->config['welcome_title']; } if ( ! empty( $this->config['welcome_content'] ) ) { $welcome_content = $this->config['welcome_content']; } if ( ! empty( $welcome_title ) || ! empty( $welcome_content ) || ! empty( $this->tabs ) ) { echo '
    '; if ( ! empty( $welcome_title ) ) { echo '

    '; echo esc_html( $welcome_title ); if ( ! empty( $this->theme_version ) ) { echo esc_html( $this->theme_version ); } echo '

    '; } if ( ! empty( $welcome_content ) ) { echo '
    ' . wp_kses_post( $welcome_content ) . '
    '; } if ( $this->logo_url && $this->logo_link ) { echo ''; } $this->render_quick_links(); // Display tabs. if ( ! empty( $this->tabs ) ) { $active_tab = isset( $_GET['tab'] ) ? wp_unslash( $_GET['tab'] ) : 'getting_started'; echo ''; // Display content for current tab. if ( method_exists( $this, $active_tab ) ) { $this->$active_tab(); } } // End if(). echo '
    '; } // End if(). } /** * Adds an admin notice upon successful activation. * * @since 1.0.0 */ public function activation_admin_notice() { $current_screen_id = null; $current_screen_object = get_current_screen(); if ( $current_screen_object ) { $current_screen_id = $current_screen_object->id; } $dismissed_status = get_user_meta( get_current_user_id(), 'business_club_at_dismissed', true ); if ( 'themes' === $current_screen_id && 1 !== absint( $dismissed_status ) ) { add_action( 'admin_notices', array( $this, 'welcome_admin_notice' ), 99 ); } } /** * Display an admin notice linking to the about page. * * @since 1.0.0 */ public function welcome_admin_notice() { if ( ! empty( $this->notification ) ) { echo '
    '; echo wp_kses_post( $this->notification ); echo '
    '; } } /** * Load assets. * * @since 1.0.0 * * @param string $hook Hook name. */ public function load_assets( $hook ) { $min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; $custom_css = '.badge-action-count { padding: 0 6px; display: inline-block; background-color: #d54e21; color: #fff; font-size: 9px; line-height: 17px; font-weight: 600; margin: 1px 0 0 2px; vertical-align: top; border-radius: 10px; z-index: 26; margin-top: 5px; margin-left: 5px; } .wp-submenu .badge-action-count { margin-top: 0; }'; wp_add_inline_style( 'admin-menu', $custom_css ); $custom_css = '.btn-at-dismiss { margin-left: 10px; }'; wp_add_inline_style( 'themes', $custom_css ); if ( 'appearance_page_' . $this->page_slug === $hook ) { wp_enqueue_style( 'plugin-install' ); wp_enqueue_script( 'plugin-install' ); wp_enqueue_script( 'updates' ); wp_enqueue_style( 'business-club-about', get_template_directory_uri() . '/vendors/about/css/about' . $min . '.css', array(), '2.0.2' ); wp_enqueue_script( 'business-club-about', get_template_directory_uri() . '/vendors/about/js/about' . $min . '.js', array( 'jquery' ), '2.0.2' ); $js_vars = array( 'ajaxurl' => esc_url( admin_url( 'admin-ajax.php' ) ), ); wp_localize_script( 'business-club-about', 'businessClubAboutObject', $js_vars ); } } /** * Render getting started tab. * * @since 1.0.0 */ public function getting_started() { if ( ! empty( $this->config['getting_started'] ) ) { $getting_started = $this->config['getting_started']; if ( ! empty( $getting_started ) ) { echo '
    '; foreach ( $getting_started as $getting_started_item ) { echo '
    '; if ( ! empty( $getting_started_item['title'] ) ) { echo '

    ' . esc_html( $getting_started_item['title'] ) . '

    '; } if ( ! empty( $getting_started_item['text'] ) ) { echo '

    ' . esc_html( $getting_started_item['text'] ) . '

    '; } if ( ! empty( $getting_started_item['button_link'] ) && ! empty( $getting_started_item['button_label'] ) ) { echo '

    '; $button_class = ''; if ( $getting_started_item['is_button'] ) { $button_class = 'button button-primary'; } $count = $this->get_total_recommended_actions(); if ( $getting_started_item['recommended_actions'] && isset( $count ) ) { if ( 0 === $count ) { echo ''; } else { echo ''; } } $button_new_tab = '_self'; if ( isset( $getting_started_item['is_new_tab'] ) ) { if ( $getting_started_item['is_new_tab'] ) { $button_new_tab = '_blank'; } } echo '' . esc_html( $getting_started_item['button_label'] ) . ''; echo '

    '; } echo '
    '; } // End foreach(). echo '
    '; } // End if(). } // End if(). } /** * Render recommended actions tab. * * @since 1.0.0 */ public function recommended_actions() { $recommended_actions = isset( $this->config['recommended_actions'] ) ? $this->config['recommended_actions'] : array(); if ( ! empty( $recommended_actions ) ) { echo '
    ', esc_html__( 'Upgrade message from the plugin author:', 'business-club' ), ' ', wp_kses_data( $item['upgrade_notice'] ), '