Commit inicial - WordPress Análisis de Precios Unitarios

- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
root
2025-11-03 21:04:30 -06:00
commit a22573bf0b
24068 changed files with 4993111 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,5 @@
<?php
return array(
'go_to_TD' => __( 'Go to the Thrive Themes Dashboard', Thrive_Product_Manager::T ),
'go_to_TTB_dashboard' => __( 'Go to the Theme Builder Dashboard', Thrive_Product_Manager::T ),
);

View File

@@ -0,0 +1,109 @@
<?php
/**
* Class TPM_Admin
* - included by main plugin class if the current request is_admin()
*
* @see is_admin()
*/
class TPM_Admin {
private static $instance;
private function __construct() {
/**
* update tpm_version option
*/
add_action(
'admin_init',
function () {
/**
* On each TPM update clear cache
* - clear cache each time user updates TPM
*/
if ( $this->check_plugin_version( Thrive_Product_Manager::V ) ) {
$this->clear_all_cache();
update_option( 'tpm_version', Thrive_Product_Manager::V );
}
}
);
/**
* delete tpm_version from DB
*/
add_action(
'admin_init',
static function () {
register_deactivation_hook(
WP_PLUGIN_DIR . '/thrive-product-manager/thrive-product-manager.php',
array(
TPM_Admin::get_instance(),
'deactivation_callback',
)
);
}
);
}
/**
* @return TPM_Admin
*/
public static function get_instance() {
if ( empty( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Clears all cache
* - ttw products list
* - ttw licenses
*/
public function clear_all_cache() {
TPM_Product_List::get_instance()->clear_cache();
TPM_License_Manager::get_instance()->clear_cache();
}
/**
* Checks if the option saved in DB is lower strict than the current TPM plugin constant
* - used to run some code
*
* @param string version
*
* @return bool
*/
public function check_plugin_version( $version ) {
return version_compare( get_option( 'tpm_version', '1.0' ), $version, '<' );
}
/**
* Deletes tpm_version option from DB
*/
public function delete_tpm_version() {
delete_option( 'tpm_version' );
}
/**
* Callback when TPM is deactivated
* @see register_deactivation_hook()
*/
public function deactivation_callback() {
TPM_Product_List::get_instance()->clear_cache();
TPM_License_Manager::get_instance()->clear_cache();
TPM_License_Manager::get_instance()->deactivate_all_licenses();
$this->delete_tpm_version();
delete_option( 'tpm_bk_connection' );
}
}
if ( is_admin() ) {
return TPM_Admin::get_instance();
}

View File

@@ -0,0 +1,413 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-product-manager
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
/**
* Class TPM_Connection
*
* @property int ttw_id
* @property string ttw_salt
* @property string ttw_email
* @property string status
* @property string ttw_expiration datetime until the current connection is known by TTW; ttw_salt has to be refreshed after this date;
*/
class TPM_Connection {
const CONNECTED = 'connected';
const NAME = 'tpm_connection';
const SIGNATURE = 's6!xv(Q7Zp234L_snodt]CvG2meROk0Gurc49KiyJzz6kSjqAyqpUL&9+P4s';
protected $_data = array();
protected $_messages = array();
protected $_errors = array();
protected $_expected_data
= array(
'ttw_id',
'ttw_email',
'ttw_salt',
'ttw_expiration',
);
protected static $_instance;
private function __construct() {
$this->_data = get_option( self::NAME, array() );
$this->_messages = get_option( 'tpm_connection_messages', array() );
add_filter( 'tpm_messages', array( $this, 'apply_messages' ) );
}
/**
* @return TPM_Connection
*/
public static function get_instance() {
if ( ! self::$_instance ) {
self::$_instance = new self();
}
return self::$_instance;
}
public function __isset( $name ) {
return isset( $this->_data[ $name ] );
}
public function __set( $key, $value ) {
$this->_data[ $key ] = $value;
return $this->_data[ $key ];
}
public function __get( $param ) {
$value = null;
if ( isset( $this->_data[ $param ] ) ) {
$value = $this->_data[ $param ];
}
return $value;
}
public function is_connected() {
return $this->status === self::CONNECTED;
}
public function set_data( $data ) {
$this->_data = $data;
}
public function get_login_url() {
return add_query_arg( array(
'callback_url' => urlencode( base64_encode( $this->get_callback_url() ) ),
'tpm_site' => base64_encode( get_site_url() ),
), Thrive_Product_Manager::get_ttw_url() . '/connect-account' );
}
/**
* URL where user is redirected back after he logs in TTW
*
* @return string
*/
protected function get_callback_url() {
$url = Thrive_Product_Manager::get_instance()->get_admin_url();
$url = add_query_arg( array(
'tpm_token' => base64_encode( $this->get_token() ),
), $url );
return $url;
}
public function get_token() {
$token = get_option( 'tpm_token', null );
if ( ! empty( $token ) ) {
return $this->decrypt( $token );
}
$rand_nr = mt_rand( 1, 11 );
$rand_chars = '^!#)_@%*^@(yR&dsYh';
$rand_string = substr( str_shuffle( $rand_chars ), 0, $rand_nr );
$token = $rand_string . strrev( base_convert( bin2hex( hash( 'sha512', uniqid( mt_rand() . microtime( true ) * 10000, true ), true ) ), 16, 36 ) );
$to_length = ceil( strlen( $token ) / 2 );
$token = $rand_nr . substr( $token, mt_rand( 1, 9 ), $to_length );
add_option( 'tpm_token', $this->encrypt( $token ) );
return $token;
}
public function encrypt( $str ) {
$str .= '-' . self::SIGNATURE;
$str = base64_encode( $str );
return $str;
}
public function decrypt( $str ) {
$str = base64_decode( $str );
$str = explode( '-', $str );
return $str[0];
}
protected function _is_valid_token( $token ) {
$tpm_token = get_option( 'tpm_token', null );
return $this->decrypt( $tpm_token ) === $token;
}
/**
* Process the request
* Validate it and sve the connection into DB
*
* @return bool
*/
public function process_data() {
if ( ! $this->_is_valid_token( base64_decode( $_REQUEST['tpm_token'] ) ) ) {
$this->_errors[] = __( 'Invalid token', Thrive_Product_Manager::T );
return false;
}
$data = $this->_read_data();
if ( ! $this->_is_valid( $data ) ) {
$this->_errors[] = __( 'Invalid data', Thrive_Product_Manager::T );
return false;
}
return $this->_save_connection( $data );
}
/**
* Reads expected data from request
*
* @return array
*/
protected function _read_data() {
$data = array();
$no_decode = array(
'ttw_salt',
);
foreach ( $this->_expected_data as $key ) {
//this has to be in clear; not encoded
if ( in_array( $key, $no_decode, false ) ) {
$data[ $key ] = $_REQUEST[ $key ];
continue;
}
if ( ! empty( $_REQUEST[ $key ] ) ) {
$data[ $key ] = base64_decode( urldecode( $_REQUEST[ $key ] ) );
}
}
return $data;
}
public function render( $return = false ) {
ob_start();
include thrive_product_manager()->path( 'inc/templates/header.phtml' );
if ( count( $this->_errors ) ) {
include thrive_product_manager()->path( 'inc/templates/connection/error.phtml' );
} else {
include thrive_product_manager()->path( 'inc/templates/connection/form.phtml' );
}
$html = ob_get_clean();
if ( $return === true ) {
return $html;
}
echo $html;
}
public function get_data() {
return $this->_data;
}
/**
* @param $data
*
* @return bool
*/
protected function _save_connection( $data ) {
$data['status'] = self::CONNECTED;
$this->_data = $data;
update_option( self::NAME, $data );
delete_option( 'tpm_bk_connection' );
tpm_cron()->log( '_save_connection()' );
if ( ! tpm_cron()->schedule( $this->ttw_expiration ) ) {
add_filter( 'tpm_messages', array( tpm_cron(), 'push_message_event_unscheduled' ) );
}
tpm_delete_transient( 'td_ttw_licenses_details' );
tpm_delete_transient( 'td_ttw_connection_error' );
return true;
}
/**
* Check if data is as expected
*
* @param $data array
*
* @return bool
*/
protected function _is_valid( $data ) {
if ( ! is_array( $data ) ) {
return false;
}
$keys = array_intersect( array_keys( $data ), $this->_expected_data );
return $keys === $this->_expected_data;
}
public function apply_messages( $messages = array() ) {
$messages = array_merge( $messages, $this->_messages );
$this->_messages = array();
update_option( 'tpm_connection_messages', array() );
return $messages;
}
public function push_message( $str, $status ) {
$str = __( $str, Thrive_Product_Manager::T );
$this->_messages[] = array(
'message' => $str,
'status' => $status,
);
update_option( 'tpm_connection_messages', $this->_messages );
}
public function disconnect() {
TPM_Product_List::get_instance()->clear_cache();
TPM_License_Manager::get_instance()->clear_cache();
tpm_cron()->unschedule();
//save the connection data to be used at TPM deactivation plugin
update_option( 'tpm_bk_connection', $this->_data );
tpm_delete_transient( 'td_ttw_licenses_details' );
tpm_delete_transient( 'td_ttw_connection_error' );
return delete_option( self::NAME );
}
public function get_email() {
return $this->ttw_email;
}
public function get_disconnect_url() {
$url = Thrive_Product_Manager::get_instance()->get_admin_url();
$url = add_query_arg( array( 'tpm_disconnect' => 1 ), $url );
return $url;
}
/**
* Checks if token's validation date is lower or equal than now()
*
* @return bool
*/
public function is_expired() {
$date = (int) strtotime( $this->ttw_expiration );
return $date <= time();
}
/**
* Does a request to TTW for a new token and saves it on connection
* - sets a WP Cron
*
* @return bool
*/
public function refresh_token() {
tpm_cron()->log( 'refresh_token()' );
$user_id = $this->ttw_id;
if ( empty( $user_id ) ) {
return false;
}
$ttw_salt = $this->ttw_salt;
if ( empty( $ttw_salt ) ) {
return false;
}
$params = array();
$request = new TPM_Request( '/api/v1/public/refresh-tokens/user/' . $user_id, $params );
$request->set_header( 'Authorization', $ttw_salt );
tpm_cron()->log( var_export( $request, true ) );
$proxy_request = new TPM_Proxy_Request( $request );
$response = $proxy_request->execute( '/tpm/proxy' );
$body = wp_remote_retrieve_body( $response );
tpm_cron()->log( var_export( $body, true ) );
if ( empty( $body ) ) {
return false;
}
$defaults = array(
'success' => false,
'auth_token' => '',
);
$body = json_decode( $body, true );
if ( true === is_array( $body ) ) {
$body = array_merge( $defaults, $body );
} else {
$body = $defaults;
}
if ( empty( $body['auth_token'] ) ) {
return false;
}
! empty( $body['auth_token'] ) ? $this->_data['ttw_salt'] = $body['auth_token'] : null;
! empty( $body['ttw_expiration'] ) ? $this->_data['ttw_expiration'] = $body['ttw_expiration'] : null;
return $this->_save_connection( $this->_data );
}
}

View File

@@ -0,0 +1,207 @@
<?php
/**
* Class TPM_Cron
* WP Cron Event for refreshing TPM Token
* - schedules a cron event to be executed on custom interval at a date defined by TTW
* - when a new token is recived and connection saved a new event will be set
* and the current one unscheduled
*/
final class TPM_Cron {
/**
* @var TPM_Cron
*/
private static $instance;
/**
* Cron hook name
*/
const CRON_HOOK_NAME = 'tpm_cron_hook';
/**
* Name of the Custom Cron Interval
*/
const CRON_INTERVAL_NAME = 'tpm_interval';
/**
* TPM_Cron private constructor to ensure the singleton
*/
private function __construct() {
$this->_init_hooks();
}
/**
* Defines hooks to be loaded once
*/
private function _init_hooks() {
/**
* Cron Hook Definition
*/
add_action( self::CRON_HOOK_NAME, array( $this, 'execute' ) );
/**
* define custom interval for wp cron
*/
add_filter( 'cron_schedules', array( $this, 'cron_interval' ) );
/**
* unschedule cron from DB when TPM is deactivated
*/
add_action(
'admin_init',
function () {
register_deactivation_hook(
WP_PLUGIN_DIR . '/thrive-product-manager/thrive-product-manager.php',
array(
$this,
'unschedule',
)
);
}
);
}
/**
* Pushes a custom interval
*
* @param array $schedules
*
* @return array
*/
public function cron_interval( $schedules ) {
$schedules[ self::CRON_INTERVAL_NAME ] = array(
'interval' => DAY_IN_SECONDS,
'display' => esc_html__( 'Once Daily' ),
);
return $schedules;
}
/**
* Execution of Cron Event
* - fetches a new token from TTW
*/
public function execute() {
tpm_cron()->log( 'execute()' );
TPM_Connection::get_instance()->refresh_token();
}
/**
* Schedule a new Cron Event on a specific date
* - usually specified by TTW
* - unschedules current event before
*
* @param string $date
*
* @return bool
*/
public function schedule( $date ) {
tpm_cron()->log( 'schedule()' );
/**
* when this cron will be executed 1st time
*/
$at = strtotime( $date );
$set = false;
if ( $at < time() ) {
return false;
}
if ( ! $this->unschedule() ) {
return add_filter( 'tpm_messages', array( $this, 'push_message_event_unscheduled' ) );
}
if ( ! wp_next_scheduled( self::CRON_HOOK_NAME ) ) {
$set = wp_schedule_event( $at, self::CRON_INTERVAL_NAME, self::CRON_HOOK_NAME );
}
tpm_cron()->log( "set was " . var_export( $set, true ) . " to execute first time at: " . date( 'Y-m-d H:i:s', $at ) . "\n===========================" );
return $set;
}
/**
* Unschedule current event
* - if it doesn't exist true is returned
*
* @return bool
*/
public function unschedule() {
$timestamp = wp_next_scheduled( self::CRON_HOOK_NAME );
$unset = true;
if ( false !== $timestamp ) {
$unset = wp_unschedule_event( $timestamp, self::CRON_HOOK_NAME );
tpm_cron()->log( 'unschedule event with: ' . var_export( $unset, true ) . ' scheduled at: ' . date( 'Y-m-d H:i:s', $timestamp ) );
}
return $unset;
}
/**
* Push a tpm message to be displayed by JS
* when the cron event cannot be unscheduled
*
* @param $messages
*
* @return array
*/
public function push_message_event_unscheduled( $messages ) {
$messages[] = array(
'status' => 'warning',
'message' => 'A cron event could not be unschedule. Please contact Thrive Themes Support !',
);
return $messages;
}
/**
* Singleton
*
* @return TPM_Cron
*/
public static function get_instance() {
if ( ! self::$instance ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Log log messages only if the debug mode is ON
*
* @param string $message
*/
public function log( $message ) {
if ( false === Thrive_Product_Manager::is_debug_mode() ) {
return;
}
$filename = WP_CONTENT_DIR . '/cron.log';
file_put_contents( $filename, date( 'Y-m-d H:i:s', time() ) . " => " . $message . "\n", FILE_APPEND );
}
}
/**
* Helper for TPM_Cron Singleton
*
* @return TPM_Cron
*/
function tpm_cron() {
return TPM_Cron::get_instance();
}
tpm_cron();

View File

@@ -0,0 +1,38 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-product-manager
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
class TPM_Dashboard {
public static function init() {
/* the priority here must be lower than the one set from thrive-dashboard/version.php */
add_action( 'plugins_loaded', [ __CLASS__, 'load_dash_version' ], 1 );
}
/**
* Check the current version of the dashboard and decide if we load this one or a newer one
*/
public static function load_dash_version() {
$tpm_dash_path = thrive_product_manager()->path() . '/thrive-dashboard';
$tve_dash_file_path = $tpm_dash_path . '/version.php';
if ( is_file( $tve_dash_file_path ) ) {
$version = require_once( $tve_dash_file_path );
$GLOBALS['tve_dash_versions'][ $version ] = array(
'path' => $tpm_dash_path . '/thrive-dashboard.php',
'folder' => '/thrive-product-manager',
'from' => 'plugins',
);
}
}
}

View File

@@ -0,0 +1,411 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-product-manager
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
class TPM_License_Manager {
const NAME = 'tpm_ttw_licenses';
const CACHE_LIFE_TIME = 28800; //8 hours
/**
* @var TPM_License_Manager
*/
protected static $_instance;
/**
* Array of tags set from old licensing system
* Used for backwards compatibility
*
* @var array
*/
protected $_thrive_license;
/**
* List of all licenses the user has on ttw website
*
* @var array
*/
protected $_ttw_licenses = array();
protected $ttw_license_instances = array();
private function __construct() {
$this->_thrive_license = get_option( 'thrive_license', array() );
}
public static function get_instance() {
if ( ! self::$_instance ) {
self::$_instance = new self();
}
return self::$_instance;
}
/**
* Checks if there is a license saved/used for current site and has $product tag
*
* @param $product TPM_Product
*
* @return bool
*/
public function is_licensed( TPM_Product $product ) {
$exists = false;
/**
* @var $license_id int
* @var $license TPM_License
*/
foreach ( TPM_License::get_saved_licenses() as $license_id => $license ) {
if ( $license->has_tag( $product->get_tag() ) ) {
$exists = true;
break;
}
}
return $exists;
}
/**
* Checks in TTW licenses if there is one which has $product tag
*
* @param TPM_Product $product
*
* @return bool
*/
public function is_purchased( TPM_Product $product ) {
//check old licenses
$thrive_license = get_option( 'thrive_license', array() );
if ( in_array( 'all', $thrive_license, false ) || in_array( $product->get_tag(), $thrive_license, false ) ) {
return true;
}
/** @var $license TPM_License */
foreach ( $this->get_ttw_license_instances() as $id => $license ) {
if ( $license->has_tag( $product->get_tag() ) ) {
return true;
}
}
}
public function get_ttw_license_instances() {
if ( ! empty( $this->ttw_license_instances ) ) {
return $this->ttw_license_instances;
}
foreach ( $this->_get_ttw_licenses() as $license_id => $data ) {
$instance = new TPM_License( $license_id, $data['tags'], $data['usage']['used'], $data['usage']['max'] );
$this->ttw_license_instances[ $license_id ] = $instance;
}
return $this->ttw_license_instances;
}
/**
* Based on current connection a request is made to TTW for assigned licenses
*
* @param TPM_Connection $connection
*
* @return array
*/
protected function _get_connection_licenses( TPM_Connection $connection ) {
if ( ! $connection->is_connected() ) {
return array();
}
$licenses = tpm_get_transient( self::NAME );
if ( Thrive_Product_Manager::CACHE_ENABLED && $licenses !== false ) {
return $licenses;
}
$params = array(
'user_id' => $connection->ttw_id,
);
$route = '/api/v1/public/get_licenses';
$request = new TPM_Request( $route, $params );
$request->set_header( 'Authorization', $connection->ttw_salt );
$proxy_request = new TPM_Proxy_Request( $request );
$response = $proxy_request->execute( '/tpm/proxy' );
$body = wp_remote_retrieve_body( $response );
$body = json_decode( $body, true );
if ( ! is_array( $body ) || empty( $body['success'] ) ) {
tpm_set_transient( self::NAME, array(), self::CACHE_LIFE_TIME );
return array();
}
$licenses = $body['data'];
//sort licenses so that the ones with 'all' tags will be 1st in list
//so they have priority on usage
uasort( $licenses, static function ( $license_a, $license_b ) {
$a_tags = is_array( $license_a ) && ! empty( $license_a['tags'] ) && is_array( $license_a['tags'] ) ? $license_a['tags'] : array();
$b_tags = is_array( $license_b ) && ! empty( $license_b['tags'] ) && is_array( $license_b['tags'] ) ? $license_b['tags'] : array();
if ( in_array( 'all', $a_tags, true ) && in_array( 'all', $b_tags, true ) ) {
return 0;
}
if ( false === in_array( 'all', $a_tags, true ) && in_array( 'all', $b_tags, true ) ) {
return 1;
}
return - 1;
} );
tpm_set_transient( self::NAME, $licenses, self::CACHE_LIFE_TIME );
return $licenses;
}
/**
* Searches in all licenses user has bought on TTW site
*
* @param TPM_Product $product
*
* @return int|null
*/
public function get_product_license( TPM_Product $product ) {
/** @var TPM_License $license */
foreach ( $this->get_ttw_license_instances() as $license ) {
if ( $license->has_tag( $product->get_tag() ) && $license->get_used() < $license->get_max() ) {
return $license->get_id();
}
}
return null;
}
/**
* If $products have a license id assigned then
* - a request to TTW is made to increase the usage of the license/licenses
*
* @param array $products tag
*
* @return array|bool
*/
public function activate_licenses( $products = array() ) {
if ( empty( $products ) ) {
return false;
}
$licenses_ids = array();
$product_tags = array();
/** @var TPM_Product $product */
foreach ( $products as $product ) {
$product_tags[ $product->get_tag() ] = false;
$id = $product->get_license();
if ( ! empty( $id ) ) {
$licenses_ids[] = $id;
}
}
$licenses_ids = array_filter( $licenses_ids );
$licenses_ids = array_unique( $licenses_ids );
if ( empty( $licenses_ids ) ) {
return false;
}
$params = array(
'user_id' => TPM_Connection::get_instance()->ttw_id,
'user_site_url' => get_site_url(),
'data' => $licenses_ids,
);
$request = new TPM_Request( '/api/v1/public/license_uses', $params );
$request->set_header( 'Authorization', TPM_Connection::get_instance()->ttw_salt );
$proxy_request = new TPM_Proxy_Request( $request );
$response = $proxy_request->execute( '/tpm/proxy' );
if ( is_wp_error( $response ) ) {
return false;
}
$body = wp_remote_retrieve_body( $response );
$result = json_decode( $body, true );
if ( ! is_array( $result ) || ! isset( $result['success'] ) || ! isset( $result['data'] ) || ! is_array( $result['data'] ) ) {
return false;
}
$ttw_licenses = $this->_get_ttw_licenses();
foreach ( $result['data'] as $license_id => $activated ) {
if ( ! array_key_exists( $license_id, $ttw_licenses ) ) {
continue;
}
$license = $ttw_licenses[ $license_id ];
$license_instance = new TPM_License( $license_id, $license['tags'] );
if ( $activated === true ) {
$license_instance->save();
//prepare response
foreach ( $product_tags as $tag => $value ) {
if ( $license_instance->has_tag( $tag ) ) {
$product_tags[ $tag ] = true;
}
}
}
}
return $product_tags;
}
/**
* @return array
*/
protected function _get_ttw_licenses() {
if ( empty( $this->_ttw_licenses ) ) {
$this->_ttw_licenses = $this->_get_connection_licenses( TPM_Connection::get_instance() );
}
return $this->_ttw_licenses;
}
/**
* @param $license_id
*
* @return TPM_License|null;
*/
public function get_license_instance( $license_id ) {
$license_id = (int) $license_id;
if ( empty( $license_id ) ) {
return null;
}
$license = null;
$list = TPM_License::get_saved_licenses();
/** @var TPM_License $item */
foreach ( $list as $item_id => $item ) {
if ( $item->get_id() === $license_id ) {
$license = $item;
break;
}
}
return $license;
}
public function license_deactivate( WP_REST_Request $request ) {
$authorization = $request->get_param( 'Authorization' );
$connection = TPM_Connection::get_instance();
$tpm_token = $connection->decrypt( get_option( 'tpm_token', null ) );
if ( $authorization !== $tpm_token ) {
return array(
'success' => false,
'message' => 'No permission',
);
}
$deactivated = true;
$message = 'License deactivated with success';
$response = array(
'success' => $deactivated,
'message' => $message,
);
$license_id = (int) $request->get_param( 'id' );
if ( empty( $license_id ) ) {
$response['success'] = false;
$response['message'] = 'Invalid param license id ' . $request->get_param( 'id' );
return $response;
}
$license = $this->get_license_instance( $license_id );
if ( ! ( $license instanceof TPM_License ) ) {
$response['success'] = true;
$response['message'] = "Couldn't find any license with ID " . $request->get_param( 'id' );
return $response;
}
if ( $license->delete() !== true ) {
$response['success'] = false;
$response['message'] = "Couldn't not deactivate license " . $request->get_param( 'id' );
}
TPM_Product_List::get_instance()->clear_cache();
self::get_instance()->clear_cache();
return $response;
}
public function clear_cache() {
return tpm_delete_transient( self::NAME );
}
/**
* Deletes the local saved licenses
* - increments the usages for licenses by doing a request to TTW
*/
public function deactivate_all_licenses() {
$licenses = TPM_License::get_saved_licenses();
if ( empty( $licenses ) ) {
return;
}
$connection = TPM_Connection::get_instance();
//if user has disconnected TPM then try to use the backup connection saved at disconnecting
if ( false === $connection->is_connected() ) {
$connection->set_data( get_option( 'tpm_bk_connection', array() ) );
}
$params = array(
'user_id' => $connection->ttw_id,
'user_site_url' => get_site_url(),
'direction' => 'down',
'data' => array_keys( $licenses ),
);
$request = new TPM_Request( '/api/v1/public/license_uses', $params );
$request->set_header( 'Authorization', $connection->ttw_salt );
$proxy_request = new TPM_Proxy_Request( $request );
$response = $proxy_request->execute( '/tpm/proxy' );
TPM_Log_Manager::get_instance()->set_message( var_export( $response, true ) )->log();
delete_option( TPM_License::NAME );
}
}

View File

@@ -0,0 +1,112 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-product-manager
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
class TPM_License {
const NAME = 'tpm_licenses';
/** @var integer */
protected $id = 0;
/** @var array */
protected $tags = array();
/** @var int */
protected $used = 0;
/** @var int */
protected $max = 0;
public function __construct( $id, $tags, $used = 0, $max = 0 ) {
$this->id = (int) $id;
$this->used = (int) $used;
$this->max = (int) $max;
if ( is_array( $tags ) ) {
$this->tags = $tags;
}
}
/**
* @param $tag string
*
* @return bool
*/
public function has_tag( $tag ) {
return in_array( $tag, $this->tags ) || in_array( 'all', $this->tags );
}
public function get_id() {
return $this->id;
}
public function get_max() {
return (int) $this->max;
}
public function get_used() {
return (int) $this->used;
}
public function save() {
$current_licenses = get_option( self::NAME, array() );
$current_licenses[ $this->id ] = $this->tags;
update_option( self::NAME, $current_licenses );
return true;
}
public function delete() {
$current_licenses = get_option( self::NAME, array() );
if ( isset( $current_licenses[ $this->id ] ) ) {
unset( $current_licenses[ $this->id ] );
}
update_option( self::NAME, $current_licenses );
return true;
}
/**
* Fetches a list of licenses which are used on current site
* - each license may have more tags
*
* @return TPM_License[]
*/
public static function get_saved_licenses() {
$licenses = array();
foreach ( get_option( self::NAME, array() ) as $license_id => $tags ) {
$licenses[ $license_id ] = new self( $license_id, $tags );
}
return $licenses;
}
/**
* Checks of max is strict greater than used
*
* @return bool
*/
public function has_usages() {
return $this->get_max() > $this->get_used();
}
}

View File

@@ -0,0 +1,80 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-product-manager
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
class TPM_Log_Manager {
const FILE_NAME = 'tpm.log';
protected $_message;
protected static $_instance;
private function __construct() {
}
public static function get_instance() {
if ( empty( self::$_instance ) ) {
self::$_instance = new self();
}
return self::$_instance;
}
protected function _is_valid() {
return ! empty( $this->_message );
}
/**
* @param $message string|WP_Error
*
* @return $this
*/
public function set_message( $message ) {
if ( is_wp_error( $message ) ) {
$message = $message->get_error_message();
}
$this->_message = $message;
return $this;
}
public function log() {
if ( ! $this->_is_valid() ) {
return false;
}
return $this->_write();
}
protected function _get_file() {
return thrive_product_manager()->path( self::FILE_NAME );
}
protected function _write() {
$bytes = 0;
if ( Thrive_Product_Manager::is_debug_mode() && wp_is_writable( $this->_get_file() ) ) {
$bytes = file_put_contents( $this->_get_file(), "\n" . "[" . date( 'Y-m-d h:i:s' ) . "] " . $this->_message, FILE_APPEND );
}
return $bytes !== false;
}
}

View File

@@ -0,0 +1,21 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-product-manager
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
class TPM_Message {
protected $_instance;
protected $_messages = array();
private function __construct() {
}
}

View File

@@ -0,0 +1,36 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-product-manager
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
class TPM_Page_Manager {
protected static $_instance;
private function __construct() {
}
public function render() {
if ( TPM_Connection::get_instance()->is_connected() === false ) {
TPM_Connection::get_instance()->render();
} else {
TPM_Product_List::get_instance()->render();
}
}
public static function get_instance() {
if ( ! self::$_instance ) {
self::$_instance = new self();
}
return self::$_instance;
}
}

View File

@@ -0,0 +1,32 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-product-manager
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
class TPM_Plugin_Installer_Skin extends Plugin_Installer_Skin {
public $done_header = true;
public $done_footer = true;
public $messages = array();
public function request_filesystem_credentials( $error = false, $context = false, $allow_relaxed_file_ownership = false ) {
return $this->options;
}
public function feedback( $string, ...$args ) {
if ( empty( $string ) ) {
return;
}
$this->messages[] = $string;
}
}

View File

@@ -0,0 +1,190 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-product-manager
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
class TPM_Product_List {
const NAME = 'tpm_all_ttw_products';
const CACHE_LIFE_TIME = WEEK_IN_SECONDS;
protected $_products = array();
public static $type_to_tag_dependencies = array(
'skin' => array( 'ttb' ), // a skin has a dependency on TTB
);
protected static $_instance;
private function __construct() {
}
public static function get_instance() {
if ( empty( self::$_instance ) ) {
self::$_instance = new self();
}
return self::$_instance;
}
public function render( $return = false ) {
ob_start();
include thrive_product_manager()->path( 'inc/templates/header.phtml' );
include thrive_product_manager()->path( 'inc/templates/product/list.phtml' );
$html = ob_get_clean();
if ( $return === true ) {
return $html;
}
echo $html;
}
protected function _get_products() {
if ( empty( $this->_products ) ) {
$this->_products = $this->_get_all_ttw_products();
}
foreach ( $this->_products as &$product ) {
$instance = $this->_product_factory( $product );
$product['status'] = $instance->get_status();
if ( isset( self::$type_to_tag_dependencies[ $product['type'] ] ) ) {
$product['dependencies'] = self::$type_to_tag_dependencies[ $product['type'] ];
}
}
return $this->_products;
}
public function get_products_array() {
return array_values( $this->_get_products() );
}
/**
* @return array
*/
protected function _get_all_ttw_products() {
if ( ! TPM_Connection::get_instance()->is_connected() ) {
return array();
}
if ( Thrive_Product_Manager::CACHE_ENABLED && ( $products = tpm_get_transient( self::NAME ) ) !== false ) {
return $products;
}
$connection = TPM_Connection::get_instance();
$params = array(
'user_id' => $connection->ttw_id,
'tpm_version' => Thrive_Product_Manager::V,
);
$request = new TPM_Request( '/api/v1/public/get_products', $params );
$request->set_header( 'Authorization', $connection->ttw_salt );
$proxy_request = new TPM_Proxy_Request( $request );
$response = $proxy_request->execute( '/tpm/proxy' );
$body = wp_remote_retrieve_body( $response );
$body = json_decode( $body, true );
$products = array();
if ( is_array( $body ) && ! empty( $body['data'] ) ) {
foreach ( $body['data'] as $product_data ) {
$product = $this->_product_factory( $product_data );
$products[ $product->get_tag() ] = $product->to_array();
}
}
if ( ! empty( $products ) ) {
tpm_set_transient( self::NAME, $products, self::CACHE_LIFE_TIME );
}
return $products;
}
/**
* @param $data
*
* @return TPM_Product_Plugin|TPM_Product_Theme|TPM_Product_Skin|TPM_Product
*/
protected function _product_factory( $data ) {
if ( ! is_array( $data ) || empty( $data ) ) {
$data = array();
}
$instance_name = 'TPM_Product';
//defaults
$name = 'No name';
$description = 'No description';
$logo_url = 'https://thrivethemes.com/wp-content/uploads/2016/10/thrive-themes-logo-home-2.png';
$type = '';
$tag = '';
$api_slug = '';
$file = '';
extract( $data );
if ( empty( $type ) || ! in_array( $type, array( 'plugin', 'theme', 'skin' ) ) ) {
return new TPM_Product( $name, $description, $logo_url, $tag, $api_slug, $file );
}
$instance_name .= '_' . ucfirst( $type );
if ( $tag === 'ttb' ) {
$instance_name .= '_Builder';
} elseif ( $tag === 'tap' ) {
$instance_name .= '_Automator';
}
$instance = new $instance_name( $name, $description, $logo_url, $tag, $api_slug, $file );
return $instance;
}
/**
* Create a TPM_Product instance based on $tag string
*
* @param string $tag
*
* @return TPM_Product|TPM_Product_Plugin|TPM_Product_Skin|TPM_Product_Theme
*/
public function get_product_instance( $tag ) {
$ttw_products = $this->_get_products();
$product_data = ! empty( $ttw_products[ $tag ] )
? $ttw_products[ $tag ]
: array(
'tag' => $tag,
);
return $this->_product_factory( $product_data );
}
/**
* Deletes transient for TTW Products
* - TTW Product list will be fetched
*/
public function clear_cache() {
tpm_delete_transient( self::NAME );
}
}

View File

@@ -0,0 +1,31 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package ${NAMESPACE}
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
/**
* Class fro Thrive Automator
* - which extends and overwrites the Thrive Plugin
* - TAP is a free product of TTW
*/
class TPM_Product_Plugin_Automator extends TPM_Product_Plugin {
/**
* @return true because this product offered by TTW as free
*/
public function is_purchased() {
return true;
}
/**
* @return true because this product offered by TTW as free
*/
public function is_licensed() {
return true;
}
}

View File

@@ -0,0 +1,152 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-product-manager
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
class TPM_Product_Plugin extends TPM_Product {
/**
* Checks if product is installed/downloaded in WP_PLUGIN_DIR
*
* @return bool
*/
public function is_installed() {
if ( empty( $this->file ) ) {
return false;
}
$path = rtrim( WP_PLUGIN_DIR, '/' ) . '/' . trim( $this->file, '/' );
return file_exists( $path );
}
/**
* Returns array of its properties
*
* @return array
*/
public function to_array() {
$data = parent::to_array();
$data['type'] = 'plugin';
return $data;
}
protected function _get_download_url() {
$result = $this->_prepare_download_url();
if ( is_wp_error( $result ) ) {
return $this->_prepare_download_url( true );
}
return $result;
}
/**
* This method will prepare the download URL when someone tries to download any of the Thrive Themes products from TPM.
*
* @param boolean $with_ssl_verify
* @return void
*/
private function _prepare_download_url( $with_ssl_verify = false ) {
$options = [
'timeout' => 20, //seconds
'sslverify' => $with_ssl_verify,
'headers' => [
'Accept' => 'application/json',
],
];
/**
* prepare the POST parameters
*/
$options['body'] = [
'api_slug' => $this->api_slug,
];
$url = add_query_arg( [ 'p' => $this->_get_hash( $options['body'] ) ], 'https://service-api.thrivethemes.com/plugin/update' );
$result = wp_remote_post( $url, $options );
if ( ! is_wp_error( $result ) ) {
$info = json_decode( wp_remote_retrieve_body( $result ), true );
if ( ! empty( $info ) ) {
return $info['download_url'];
}
}
return new WP_Error( '400', wp_remote_retrieve_body( $result ) );
}
/**
* @param $credentials array
*
* @return bool|WP_Error
*/
public function install( $credentials ) {
if ( $this->is_installed() ) {
return true;
}
add_filter( 'upgrader_package_options', array( $this, 'upgrader_package_options' ) );
include_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
$url = $this->_get_download_url();
if ( is_wp_error( $url ) ) {
$error = "Couldn't get download URL for " . $this->name;
TPM_Log_Manager::get_instance()->set_message( $error )->log();
return new WP_Error( 'download_url', $error );
}
/** @var $wp_filesystem WP_Filesystem_Base */
global $wp_filesystem;
$connected = WP_Filesystem( $credentials );
if ( $connected === false ) {
return $wp_filesystem->errors;
}
require_once __DIR__ . '/class-tpm-plugin-installer-skin.php';
$installer = new Plugin_Upgrader( new TPM_Plugin_Installer_Skin( $credentials ) );
$result = $installer->install( $url );
remove_filter( 'upgrader_package_options', array( $this, 'upgrader_package_options' ) );
return $result;
}
public function upgrader_package_options( $options ) {
$options['clear_destination'] = true;
return $options;
}
public function is_activated() {
return is_plugin_active( $this->file );
}
public function activate() {
if ( $this->is_activated() ) {
return true;
}
return activate_plugin( $this->file );
}
}

View File

@@ -0,0 +1,284 @@
<?php
/**
* Class TPM_Product_Skin
* Beside Plugins and Themes TPM offers Thrive Theme Builder Skins
* Which are handled by this class and are known as TTB Themes
*/
class TPM_Product_Skin extends TPM_Product_Theme {
/**
* The default skin which will be installed together with the theme
* This is also used in TTB
*/
const DEFAULT_TAG = 'q1qj01';
/**
* @var WP_Term
*/
protected $ttb_skin;
/**
* @var [WP_Term]
*/
protected $ttb_downloaded_skins = array();
/**
* @return array
*/
public function to_array() {
$data = parent::to_array();
$data['type'] = 'skin';
return $data;
}
/**
* Download and install the current skin
* - TTB API is used which TTB is required to be installed and activated
*
* @param array $credentials
*
* @return bool|WP_Error
* @see activate()
*
*/
public function install( $credentials ) {
/* Before installing the skin we need to make sure the theme code is available */
$this->include_thrive_theme();
$response = $this->_install_ttb_skin( $this->api_slug );
if ( true === $response instanceof WP_Term ) {
$this->ttb_skin = $response;
}
return $response;
}
/**
* Include TTB & TAR code in order to be able to do the skin install without the theme being active
* Hope this behaves well in the wild :)
*/
public function include_thrive_theme() {
global $thrive_theme;
if ( false === empty( $thrive_theme ) ) {
return;
}
error_reporting( E_ALL );
ini_set( 'display_errors', 1 );
/**
* We are changing this constant because in the theme we are using get_template_directory() - which is based on the active theme
* And in this case the theme is not active
*/
defined( 'THEME_PATH' ) || define( 'THEME_PATH', get_theme_root() . '/thrive-theme' );
defined( 'TVE_TCB_ROOT_PATH ' ) || define( 'TVE_TCB_ROOT_PATH ', get_theme_root() . '/thrive-theme/architect/' );
if ( ! defined( 'TVE_TCB_CORE_INCLUDED' ) ) {
include_once THEME_PATH . '/architect/plugin-core.php';
}
if ( false === defined( 'TVE_DASH_VERSION' ) ) {
define( 'TVE_DASH_PATH', THEME_PATH . '/thrive-dashboard' );
require_once TVE_DASH_PATH . '/thrive-dashboard.php';
}
require_once THEME_PATH . '/inc/constants.php';
require_once THEME_PATH . '/inc/classes/class-thrive-theme.php';
$thrive_theme = new Thrive_Theme();
$thrive_theme->init();
}
/**
* Uses TTB to activate current skin
*
* @return bool|WP_Error
*/
public function activate() {
if ( $this->is_activated() ) {
return true;
}
$skin = $this->_get_ttb_skin();
if ( false === $skin instanceof WP_Term ) {
return new WP_Error( 400, sprintf( __( 'Could not activate skin: %s', Thrive_Product_Manager::T ), $this->name ) );
}
$skin_id = $skin->term_id;
Thrive_Skin_Taxonomy::set_skin_active( $skin_id );
/* We need to make sure that the instance is the one with the active skin before we generate the css file */
thrive_skin( $skin_id )->generate_style_file();
return true;
}
/**
* The skin is installed if the theme is installed
*
* @return bool
*/
public function is_installed() {
$theme = wp_get_theme( 'thrive-theme' );
return ! is_wp_error( $theme->errors() );
}
/**
* Check if the skin exists
*
* @return bool
*/
public function exists() {
$installed = false;
$skins = $this->_get_all_downloaded_skins();
foreach ( $skins as $skin ) {
if ( ! empty( $skin->tag ) && $skin->tag === $this->api_slug ) {
$installed = true;
break;
}
}
return $installed;
}
/**
* @return WP_Term[]
*/
protected function _get_all_downloaded_skins() {
if ( false === class_exists( 'Thrive_Skin_Taxonomy', false ) ) {
return $this->ttb_downloaded_skins;
}
if ( empty( $this->ttb_downloaded_skins ) ) {
$this->ttb_downloaded_skins = Thrive_Skin_Taxonomy::get_all();
}
return $this->ttb_downloaded_skins;
}
/**
* Gets the current Thrive_Skin instance
* - instance exists if the current flow is install one
*
* @return WP_Term|null
*/
protected function _get_ttb_skin() {
if ( false === $this->ttb_skin instanceof WP_Term ) {
return null;
}
return $this->ttb_skin;
}
/**
* Uses TTB API to install a skin
*
* @param $skin_id
*
* @return WP_Term|WP_Error on error
*/
protected function _install_ttb_skin( $skin_id ) {
if ( false === class_exists( 'Thrive_Theme_Cloud_Api_Factory', false ) ) {
return new WP_Error( 400, sprintf( __( 'Could not install Theme: %s', Thrive_Product_Manager::T ), $this->name ) );
}
try {
/**
* Try to create some default data for TTB cos it ain't created on try_install_activate request for TTB
*/
if ( class_exists( 'Thrive_Theme_Default_Data', false ) ) {
Thrive_Theme_Default_Data::create_default();
}
$zip = Thrive_Theme_Cloud_Api_Factory::build( 'skins' )->download_item( $skin_id, null );
$import = new Thrive_Transfer_Import( $zip );
$response = $import->import( 'skin' );
} catch ( Exception $e ) {
$response = new WP_Error( 400, $e->getMessage() );
}
return $response;
}
/**
* Checks if current skin is active for TTB
*
* @return bool
*/
public function is_activated() {
$skin_activated = false;
if ( class_exists( 'Thrive_Skin', false ) ) {
$current_skin = new Thrive_Skin( 0 ); //current active skin in TTB
$skin_activated = $current_skin->get_tag() === $this->api_slug;
}
return $skin_activated;
}
public function get_status() {
if ( ! empty( $this->status ) ) {
return $this->status;
}
if ( ! $this->is_purchased() ) {
$this->status = self::AVAILABLE;
return $this->status;
}
if ( ! $this->is_licensed() ) {
$this->status = self::TO_LICENSE;
return $this->status;
}
if ( ! $this->is_installed() ) {
$this->status = self::TO_INSTALL;
return $this->status;
}
if ( ! $this->is_activated() ) {
$this->status = self::TO_ACTIVATE;
return $this->status;
}
$this->status = self::READY;
return $this->status;
}
/**
* When installing the skin, change the response data
*
* @param array $data
*
* @return array|mixed
*/
public function before_response( $data ) {
return $this->get_response_status( 'installed' );
}
}

View File

@@ -0,0 +1,185 @@
<?php
class TPM_Product_Theme_Builder extends TPM_Product_Theme {
public function to_array() {
$data = parent::to_array();
$data['type'] = 'theme';
$data['hidden'] = true;
return $data;
}
/**
* Finds out URL where to download the zip from
*
* @param string $api_slug
*
* @return WP_Error|string url
*/
protected function _get_download_url( $api_slug ) {
$request = array(
'sslverify' => false,
'body' => array(
'action' => 'theme_update',
'type' => 'latest',
),
'timeout' => 60,
);
$thrive_update_api_url = add_query_arg( array(
'p' => $this->_get_hash( $request['body'] ),
), 'https://service-api.thrivethemes.com/theme/update' );
$result = wp_remote_get( $thrive_update_api_url, $request );
if ( ! is_wp_error( $result ) ) {
$info = @unserialize( wp_remote_retrieve_body( $result ) );
if ( Thrive_Product_Manager::is_debug_mode() ) {
$package = defined( 'TTB_TEST_ARCHIVE' ) ? TTB_TEST_ARCHIVE : '';
}
if ( empty( $package ) ) {
$package = ! empty( $info['package'] ) ? $info['package'] : new WP_Error( '404', 'Bad request' );
}
return $package;
}
return new WP_Error( '400', $result->get_error_message() );
}
/**
* Activates TTB
*
* @return bool|WP_Error
*/
public function activate() {
if ( ! $this->previously_installed ) {
return true;
}
$activated = $this->is_activated();
if ( ! $activated && $this->is_installed() ) {
$theme = wp_get_theme( 'thrive-theme' );
$activated = true;
switch_theme( $theme->get_stylesheet() );
}
return $activated;
}
/**
* Install Theme Builder
*
* @param array $credentials
*
* @return array|bool|WP_Error|WP_Term
*/
public function install( $credentials ) {
$installed = parent::install( $credentials );
/* If the theme builder install went ok, we will install also the default skin */
if ( $installed && ! $this->previously_installed && ! is_wp_error( $installed ) ) {
$skin = TPM_Product_List::get_instance()->get_product_instance( TPM_Product_Skin::DEFAULT_TAG );
$installed = $skin->install( $credentials );
if ( ! is_wp_error( $installed ) ) {
static::set_fresh_install_flag( 1 );
}
}
return $installed;
}
/**
* Set a flag to let the theme know if the user installed TTB for the first time
* Also called from TTB
*
* @param $value
*/
public static function set_fresh_install_flag( $value ) {
update_option( 'thrive_theme_is_fresh_install', $value );
}
/**
* Check if the fresh install flag is set, defaulting to 0. Also called from TTB
* @return bool
*/
public static function is_fresh_install() {
return (int) get_option( 'thrive_theme_is_fresh_install', 0 ) === 1;
}
/**
* Used in frontend/js
*
* @return string
*/
public static function get_dashboard_url() {
return admin_url( 'admin.php?page=thrive-theme-dashboard' );
}
/**
* Check if the TTB with slug thrive-theme is installed
*
* @return bool
*/
public function is_installed() {
$theme = wp_get_theme( 'thrive-theme' );
return ! is_wp_error( $theme->errors() );
}
/**
* Change the response after installing / activating theme builder
*
* @param array $data
*
* @return array|mixed
*/
public function before_response( $data ) {
return $this->get_response_status( empty( $this->previously_installed ) ? 'installed' : 'ready' );
}
public function get_status() {
if ( ! empty( $this->status ) ) {
return $this->status;
}
if ( ! $this->is_purchased() ) {
$this->status = self::AVAILABLE;
return $this->status;
}
if ( ! $this->is_installed() ) {
$this->status = self::TO_INSTALL;
return $this->status;
}
if ( ! $this->is_activated() ) {
return $this->status = self::TO_ACTIVATE;
}
if ( ! $this->is_licensed() ) {
$this->status = self::TO_LICENSE;
return $this->status;
}
$this->status = self::READY;
return $this->status;
}
}

View File

@@ -0,0 +1,157 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-product-manager
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
class TPM_Product_Theme extends TPM_Product {
/**
* Keep a flag to check if the theme was installed before
*
* @var bool
*/
protected $previously_installed = false;
public function get_status() {
if ( ! empty( $this->status ) ) {
return $this->status;
}
if ( ! $this->is_purchased() ) {
$this->status = self::AVAILABLE;
return $this->status;
}
if ( ! $this->is_installed() ) {
$this->status = self::TO_INSTALL;
return $this->status;
}
if ( ! $this->is_licensed() ) {
$this->status = self::TO_LICENSE;
return $this->status;
}
if ( $this->is_activated() ) {
$this->status = self::ACTIVATED;
return $this->status;
}
$this->status = self::READY;
return $this->status;
}
public function is_activated() {
/** @var WP_Theme $current_theme */
$current_theme = wp_get_theme();
return $this->name === $current_theme->get( 'Name' );
}
public function is_installed() {
$theme = wp_get_theme( $this->api_slug );
return ! is_wp_error( $theme->errors() );
}
public function to_array() {
$data = parent::to_array();
$data['type'] = 'theme';
return $data;
}
protected function _get_download_url( $api_slug ) {
global $wp_version;
$args = array(
'slug' => $api_slug,
'version' => '1.0',
);
$request = array(
'sslverify' => false,
'body' => array(
'action' => 'theme_update',
'request' => serialize( $args ),
'api-key' => md5( home_url() ),
),
'timeout' => 30,
'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url(),
);
$thrive_update_api_url = add_query_arg(
array(
'p' => $this->_get_hash( $request['body'] ),
),
'https://service-api.thrivethemes.com/theme/update'
);
$result = wp_remote_post( $thrive_update_api_url, $request );
if ( ! is_wp_error( $result ) ) {
$info = @unserialize( wp_remote_retrieve_body( $result ) );
if ( ! empty( $info ) ) {
return $info['package'];
}
}
return new WP_Error( '400', $result->get_error_message() );
}
public function install( $credentials ) {
if ( $this->is_installed() ) {
$this->previously_installed = true;
return true;
}
include_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
$url = $this->_get_download_url( $this->api_slug );
global $wp_filesystem;
$connected = WP_Filesystem( $credentials );
if ( false === $connected ) {
return $wp_filesystem->errors;
}
require_once __DIR__ . '/class-tpm-theme-installer-skin.php';
$skin = new TPM_Theme_Installer_Skin( $credentials );
$installer = new Theme_Upgrader( $skin );
$installed = $installer->install( $url );
if ( null === $installed ) {
/** @var TPM_Theme_Installer_Skin $installer ->skin */
$installed = new WP_Error( '500', end( $installer->skin->messages ) );
}
return $installed;
}
/**
* @param $previously_installed
*/
public function set_previously_installed( $previously_installed ) {
$this->previously_installed = $previously_installed;
}
}

View File

@@ -0,0 +1,216 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-product-manager
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
class TPM_Product {
const AVAILABLE = 'available'; //product has been purchased by the user and there is a license for it
const INSTALLED = 'installed'; //product is downloaded in its folder
const ACTIVATED = 'activated'; //product is downloaded in its folder and WP knows it as activated
const READY = 'ready'; //product is installed/activated/licensed and ready to be used
const TO_INSTALL = 'to_install'; //product is not downloaded in its folder
const TO_ACTIVATE = 'to_activate'; //product is downloaded in its folder but not activated
const TO_LICENSE = 'to_license'; //product has to be licensed
protected $name;
protected $description;
protected $logo_url;
protected $tag;
protected $file;
protected $api_slug;
protected $status;
protected $_license_id;
public function __construct( $name, $description, $logo_url, $tag, $api_slug, $file ) {
$this->name = $name;
$this->description = $description;
$this->logo_url = $logo_url;
$this->tag = $tag;
$this->api_slug = $api_slug;
$this->file = $file;
}
public function to_array() {
$data = array(
'name' => $this->name,
'description' => empty( $this->description ) ? $this->name : $this->description,
'logo_url' => $this->logo_url,
'tag' => $this->tag,
'api_slug' => $this->api_slug,
'file' => $this->file,
'hidden' => false,
);
return $data;
}
/**
* Checks if its tag exists somewhere in DB and
*
* @return bool
*/
public function is_licensed() {
$thrive_license = get_option( 'thrive_license', array() );
$backwards = in_array( $this->get_tag(), $thrive_license ) || in_array( 'all', $thrive_license );
return $backwards || TPM_License_Manager::get_instance()->is_licensed( $this );
}
/**
* Product is installed and activated physically on WP site
*
* @return bool
*/
public function is_activated() {
return false;
}
/**
* @return bool
*/
public function is_installed() {
return false;
}
/**
* Checks in TTW licenses if there is one which has $product tag
*
* @return bool
*/
public function is_purchased() {
return TPM_License_Manager::get_instance()->is_purchased( $this );
}
/**
* We care only for statuses which are relate to TTW license
* - available (not purchased)
* - purchased
* - licensed
*
* @return string
*/
public function get_status() {
if ( ! empty( $this->status ) ) {
return $this->status;
}
if ( ! $this->is_purchased() ) {
return $this->status = self::AVAILABLE;
}
if ( ! $this->is_installed() ) {
return $this->status = self::TO_INSTALL;
}
if ( ! $this->is_activated() ) {
return $this->status = self::TO_ACTIVATE;
}
if ( ! $this->is_licensed() ) {
return $this->status = self::TO_LICENSE;
}
return $this->status = self::READY;
}
public function get_tag() {
return $this->tag;
}
public function get_name() {
return $this->name;
}
/**
* @param $credentials array
*
* @return bool|WP_Error
*/
public function install( $credentials ) {
return new WP_Error( 'empty_product_install', 'This product cannot be installed' );
}
public function activate() {
return false;
}
public function search_license() {
$license_id = TPM_License_Manager::get_instance()->get_product_license( $this );
$this->_license_id = $license_id;
}
public function set_license( $id ) {
$this->_license_id = (int) $id;
}
public function get_license() {
return $this->_license_id;
}
protected function _get_hash( $data ) {
$key = '@#$()%*%$^&*(#@$%@#$%93827456MASDFJIK3245';
return md5( $key . serialize( $data ) . $key );
}
/**
* Change the response before sending it
*
* @param array $data
*
* @return mixed
*/
public function before_response( $data ) {
return $data;
}
/**
* Get a comprehensive response message based on a status
*
* @param string $status
*
* @return array
*/
public function get_response_status( $status ) {
switch ( $status ) {
case self::READY:
$data['status'] = self::READY;
$data['message'] = sprintf( '%s is now ready to use', $this->get_name() );
break;
case self::INSTALLED:
$data['status'] = self::INSTALLED;
$data['message'] = sprintf( '%s is now installed successfully', $this->get_name() );
break;
default:
$data = array();
break;
}
return $data;
}
}

View File

@@ -0,0 +1,98 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-product-manager
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
/**
* Class TPM_Proxy_Request
* Decorator for TPM_Request
*/
class TPM_Proxy_Request {
const URL = 'https://service-api.thrivethemes.com';
const API_PASS = '!!@#ThriveIsTheBest123$$@#';
const API_KEY = '@(#$*%)^SDFKNgjsdi870234521SADBNC#';
protected $secret_key = '@#$()%*%$^&*(#@$%@#$%93827456MASDFJIK3245';
/** @var TPM_Request */
protected $request;
public function __construct( TPM_Request $request ) {
$this->request = $request;
}
public function execute( $route ) {
// Allow bypassing proxy server
if ( defined( 'TPM_BYPASS_PROXY' ) && TPM_BYPASS_PROXY ) {
return $this->request->execute();
}
$params['body'] = $this->request->get_body();
$params['headers'] = $this->request->get_headers();
$params['url'] = $this->request->get_url();
$params['pw'] = self::API_PASS;
$headers = array(
'X-Thrive-Authenticate' => $this->_buildAuthString( $params ),
);
$args = array(
'headers' => $headers,
'body' => $params,
'timeout' => 30,
'sslverify' => false,
);
$url = add_query_arg( array(
'p' => $this->_calc_hash( $params ),
), trim( $this->_get_url(), '/' ) . '/' . ltrim( $route, '/' ) );
$response = wp_remote_post( $url, $args );
if ( is_wp_error( $response ) ) {
$args['sslverify'] = true;
$response = wp_remote_post( $url, $args );
return $response;
}
return $response;
}
protected function _get_url() {
if ( defined( 'TPM_DEBUG' ) && TPM_DEBUG === true && defined( 'TVE_CLOUD_URL' ) ) {
return TVE_CLOUD_URL;
}
return self::URL;
}
protected function _calc_hash( $params ) {
return md5( $this->secret_key . serialize( $params ) . $this->secret_key );
}
protected function _buildAuthString( $data = null ) {
$string = '';
foreach ( $data as $field => $value ) {
if ( is_array( $value ) ) {
$value = serialize( $value );
}
$string .= $field . '=' . $value;
$string .= '|' . self::API_KEY . '|';
}
return md5( $string );
}
}

View File

@@ -0,0 +1,69 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-product-manager
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
class TPM_Request {
protected $url;
protected $args
= array(
'headers' => array(
'Content-Type' => 'application/json',
),
'timeout' => 20,
);
protected $params = array();
protected $route;
public function __construct( $route, $params ) {
$this->route = $route;
$this->params = $params;
$this->url = Thrive_Product_Manager::get_ttw_url();
}
public function execute() {
$this->args['body'] = $this->get_body();
return wp_remote_post( $this->get_url(), $this->args );
}
public function get_body() {
return json_encode( $this->params );
}
public function get_params() {
return $this->params;
}
public function set_header( $name, $value ) {
$this->args['headers'][ $name ] = $value;
}
public function get_headers() {
return $this->args['headers'];
}
public function get_url() {
$url = trim( $this->url, '/' ) . '/' . trim( $this->route, '/' );
return $url;
}
}

View File

@@ -0,0 +1,32 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-product-manager
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
class TPM_Theme_Installer_Skin extends Theme_Installer_Skin {
public $done_header = true;
public $done_footer = true;
public $messages = array();
public function request_filesystem_credentials( $error = false, $context = false, $allow_relaxed_file_ownership = false ) {
return $this->options;
}
public function feedback( $string, ...$args ) {
if ( empty( $string ) ) {
return;
}
$this->messages[] = $string;
}
}

View File

@@ -0,0 +1,101 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-product-manager
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
/**
*
* Replacement for WordPress's set_transient.
* There are cases when set_transient() will simply fail if an external cache plugin declares the global $_wp_using_ext_object_cache
* ( e.g. using memcached ) BUT the memcached server is not reachable.
* In this case both set_transient() and get_transient() will not work.
* Use this only if you really want the transient functionality to work regardless of caching plugins.
* To be used in critical circumstances, e.g. storing licensing data - as it will add the option with autoload = 'yes', so don't use to store huge amounts of data!
*
* @param string $transient Transient name
* @param mixed $value Transient value
* @param int $expiration Optional. Time until expiration in seconds. Default null (no expiration).
*
* @return bool True if the value was set, false otherwise.
*/
function tpm_set_transient( $transient, $value, $expiration = null ) {
/**
* Filter the expiration value
*
* @param int $expiration expiration time, in seconds
*/
$expiration = (int) apply_filters( "thrive_transient_expiration_{$transient}", (int) $expiration );
/**
* Filter the transient value
*
* @param mixed $value
*/
$value = apply_filters( "thrive_transient_value_{$transient}", $value );
$option_name = "_thrive_tr_{$transient}";
if ( $expiration !== 0 ) {
$expiration = time() + $expiration;
}
$data = get_option( $option_name );
if ( false === $data ) {
// does not exist. add it
$result = add_option( $option_name, [
'value' => $value,
'exp' => $expiration,
] );
} else {
// transient found, update it
$data['value'] = $value;
$data['exp'] = $expiration;
$result = update_option( $option_name, $data );
}
return $result;
}
/**
* To be used in conjunction with `thrive_set_transient`
*
* @param string $transient
*
* @return bool
* @see thrive_set_transient()
*
*/
function tpm_delete_transient( $transient ) {
return delete_option( "_thrive_tr_{$transient}" );
}
/**
* Replacement for WordPress's get_transient()
* There are cases when get_transient() will simply fail if an external cache plugin declares
* the global $_wp_using_ext_object_cache ( e.g. using memcached ) BUT the memcached server is not reachable.
* In this case both set_transient() and get_transient() will not work.
*
* @param string $transient Transient name
*
* @return mixed transient value, or false if transient is not set or is expired
*/
function tpm_get_transient( $transient ) {
$data = get_option( "_thrive_tr_{$transient}" );
$value = is_array( $data ) && isset( $data['value'], $data['exp'] ) ? $data['value'] : false;
/* if data has the correct format, then check expiration - if not zero and in the past, return false */
if ( $value !== false && $data['exp'] && $data['exp'] < time() ) {
$value = false;
}
return $value;
}

View File

@@ -0,0 +1,8 @@
<button id="tpm-back" class="blue-button" style="display: none;">
<?php echo __( 'Back to dashboard', Thrive_Product_Manager::T ) ?>
</button>
<button id="tpm-install" disabled data-fn="install">
<span><?php echo __( 'Install and register selected products', Thrive_Product_Manager::T ) ?></span>
<span>(0)</span>
</button>

View File

@@ -0,0 +1,13 @@
<h3>
<#= model.get('name') #>
<span>
( <#= model.get('description') #> )
</span>
</h3>
<span class="tpm-product-status tpm-<#= model.get('status') #>">
<#= typeof model.get_status === 'function' ? model.get_status() : model.get('status') #>
</span>
<div class="tpm-status-extra tpm-<#= model.get('status') #>"><#= model.get('extra') #></div>

View File

@@ -0,0 +1,21 @@
<div class="modal-content">
<h3><?php echo __( 'Convert this site to Client Mode', Thrive_Product_Manager::T ) ?></h3>
<p>
<?php echo __( 'If you convert this website to "Client Mode", then the user of this website will no longer be able to access products from your ThriveThemes.com account.', Thrive_Product_Manager::T ) ?>
</p>
<p>
<?php echo __( "This can be useful if you're handing over websites to clients and you want to prevent them from accessing products that you've purchased.", Thrive_Product_Manager::T ) ?>
</p>
<p>
<?php echo __( 'You can add new products at any point in the future by reconnecting your ThriveThemes.com account in the Product Manager.', Thrive_Product_Manager::T ) ?>
</p>
<div class="modal-footer">
<button class="tpm-button-gray tpm-modal-cancel">
<?php echo __( 'Cancel', Thrive_Product_Manager::T ) ?>
</button>
<button class="tpm-button-green tpm-modal-submit">
<?php echo __( 'Convert to Client Mode', Thrive_Product_Manager::T ) ?>
</button>
</div>
<span class="close"></span>
</div>

View File

@@ -0,0 +1,3 @@
<h3><?php echo __( 'Ooops!', Thrive_Product_Manager::T ) ?></h3>
<p><?php echo __( 'Something went wrong, cant connect to account.', Thrive_Product_Manager::T ) ?></p>
<span id="tpm-close-notification"></span>

View File

@@ -0,0 +1,2 @@
<span class="info dash-tooltip" data-tooltip-position="top" data-tooltip="<#= model.get('description') #>">i</span>
<div class="tpm-img-container" style="background-image: url('<#= model.get('logo_url') #>');"></div>

View File

@@ -0,0 +1,31 @@
<h1><?php echo __( 'Which products would you like to install and license on this site?', Thrive_Product_Manager::T ) ?></h1>
<h2 class="products-h2"><?php echo __( 'Plugins', Thrive_Product_Manager::T ) ?></h2>
<div class="tpm-items-controls">
<a href="<?php echo thrive_product_manager()->get_clear_cache_url() ?>"><?php echo __( 'Refresh list', Thrive_Product_Manager::T ) ?></a>
<label for="tpm-plugins-deselect-all">
<?php echo __( 'Deselect all', Thrive_Product_Manager::T ) ?>
<input type="checkbox" id="tpm-plugins-deselect-all" data-fn="deselect_all" data-args="plugins">
<span class="checkmark"></span>
</label>
<label for="tpm-plugins-select-all">
<?php echo __( 'Select all', Thrive_Product_Manager::T ) ?>
<input type="checkbox" id="tpm-plugins-select-all" data-fn="select_all" data-args="plugins">
<span class="checkmark"></span>
</label>
</div>
<div id="tpm-plugins-list"></div>
<div id="tpm-skins-wrapper">
<h2 class="products-h2"><?php echo __( 'Thrive Theme Builder', Thrive_Product_Manager::T ) ?></h2>
<div class="tpm-items-controls">
<a href="<?php echo thrive_product_manager()->get_clear_cache_url() ?>"><?php echo __( 'Refresh list', Thrive_Product_Manager::T ) ?></a>
</div>
<div id="tpm-skins-list"></div>
</div>

View File

@@ -0,0 +1 @@
<h1><?php echo __( 'Processing your products', Thrive_Product_Manager::T ) ?>&hellip;</h1>

View File

@@ -0,0 +1,3 @@
<span class="info dash-tooltip" data-tooltip-position="top" data-tooltip="<#= model.get('description') #>">i</span>
<div class="tpm-img-container" style="background-image: url('<#= model.get('logo_url') #>');"></div>
<p class="ttb-skin-title"><#= model.get( 'name' ) #></p>

View File

@@ -0,0 +1,5 @@
<div class="bottom-bar">
<div>
<span class="activated"><?php echo __( 'Active', Thrive_Product_Manager::T ) ?></span>
</div>
</div>

View File

@@ -0,0 +1,8 @@
<div class="bottom-bar">
<div>
<span><?php echo __( 'Product not purchased', Thrive_Product_Manager::T ) ?></span>
<div class="container-on-hover">
<a href="http://thrivethemes.com/suite"><?php echo __( 'Upgrade to access', Thrive_Product_Manager::T ) ?></a>
</div>
</div>
</div>

View File

@@ -0,0 +1,5 @@
<div class="bottom-bar">
<div>
<span class="installed"><?php echo __( 'Ready to use', Thrive_Product_Manager::T ) ?></span>
</div>
</div>

View File

@@ -0,0 +1,5 @@
<div class="bottom-bar">
<div>
<span class="installed"><?php echo __( 'Ready to use', Thrive_Product_Manager::T ) ?></span>
</div>
</div>

View File

@@ -0,0 +1,10 @@
<div class="bottom-bar">
<div>
<label>
<?php echo __( 'Activate', Thrive_Product_Manager::T ) ?>
<span><#= model.productOrTheme() #></span>
<input type="checkbox" data-type="<#= model.get('type') #>">
<span class="checkmark"></span>
</label>
</div>
</div>

View File

@@ -0,0 +1,10 @@
<div class="bottom-bar">
<div>
<label>
<?php echo __( 'Install ', Thrive_Product_Manager::T ) ?>
<span><#= model.productOrTheme() #></span>
<input type="checkbox" data-type="<#= model.get('type') #>">
<span class="checkmark"></span>
</label>
</div>
</div>

View File

@@ -0,0 +1,9 @@
<div class="bottom-bar">
<div>
<label>
<?php echo __( 'License product', Thrive_Product_Manager::T ) ?>
<input type="checkbox" data-type="<#= model.get('type') #>">
<span class="checkmark"></span>
</label>
</div>
</div>

View File

@@ -0,0 +1,3 @@
<div class="notice notice-info is-dismissible">
<p><?php echo $error ?></p>
</div>

View File

@@ -0,0 +1,23 @@
<?
/** @var TPM_Connection $this */
?>
<div class="tpm-connect-screen">
<h1><?php echo __( 'There seems to be a problem' ) ?></h1>
<p>
<?php echo __( "We can't seem to connect to your ThriveThemes.com account. Usually this is because of some kind of restrictions with your hosting company.", Thrive_Product_Manager::T ) ?>
</p>
<p>
<?php echo sprintf( __( "Not to worry, %s to let us know about the issue and we'll quickly solve this problem for you", Thrive_Product_Manager::T ), '<a target="_blank" href="https://thrivethemes.com/forums/forum/account-and-presales-support/">' . __( "click here", Thrive_Product_Manager::T ) . '</a>' ); ?>
</p>
<a class="tpm-retry" href="<?php echo thrive_product_manager()->get_admin_url(); ?>">
<?php echo __( 'Try again', Thrive_Product_Manager::T ) ?>
</a>
</div>
<div id="tpm-notification-box" class="tpm-error tpm-show">
<h3><?php echo __( 'Ooops!', Thrive_Product_Manager::T ) ?></h3>
<p><?php echo __( 'Something went wrong, cant connect to account.', Thrive_Product_Manager::T ) ?></p>
</div>

View File

@@ -0,0 +1,25 @@
<?php
/** @var TPM_Connection $this */
/** @var string $login_url */
$login_url = $this->get_login_url();
?>
<div class="tpm-connect-screen">
<div>
<h2><?php echo __( 'Connect to ThriveThemes.com to access your product.', Thrive_Product_Manager::T ) ?></h2>
<p><?php echo __( 'Click on the button below to be taken to Thrive Themes and simply log into your account to install your product', Thrive_Product_Manager::T ) ?></p>
<p><?php echo __( 'Make sure that you use the same username and password that used when signing up at ThriveThemes.com', Thrive_Product_Manager::T ) ?></p>
<hr class="tpm-le-rule"/>
<a class="tpm-login" href="<?php echo $login_url; ?>">
<?php echo __( 'Log into my account', Thrive_Product_Manager::T ) ?>
</a>
<p>
<a href="https://thrivethemes.com/tkb_item/how-to-use-the-thrive-product-manager/"
target="_blank"><?php echo __( 'See how it works.', Thrive_Product_Manager::T ) ?></a>
</p>
</div>
</div>
<?php include thrive_product_manager()->path( 'inc/templates/debugger.phtml' ) ?>

View File

@@ -0,0 +1,68 @@
<?php if ( Thrive_Product_Manager::is_debug_mode() ) : ?>
<h2>Debug mode: ON</h2>
<ul>
<li>
<label for="tpm-debug-server">Hit server</label>:
<select id="tpm-debug-server">
<?php foreach ( Thrive_Product_Manager::$ttw_urls as $name => $url ) : ?>
<option <?php echo $url === Thrive_Product_Manager::get_ttw_url() ? 'selected="selected"' : '' ?>
value="<?php echo $url ?>"><?php echo $name ?></option>
<?php endforeach; ?>
</select>
</li>
</ul>
<ul>
<li>
<b>TTW URL</b>:
<a href="<?php echo Thrive_Product_Manager::get_ttw_url() ?>"
target="_blank"><?php echo Thrive_Product_Manager::get_ttw_url() ?></a>
</li>
<li>
<b>TTW
Licenses</b>: <?php echo var_export( TPM_License_Manager::get_instance()->get_ttw_license_instances(), true ); ?>
</li>
<li>
<b>CONNECTED</b>
as: <?php echo TPM_Connection::get_instance()->is_connected() ? var_export( TPM_Connection::get_instance()->get_data(), true ) : 'not connected' ?>
</li>
<li>
<b>OLD way thrive_license</b>: <?php echo var_export( get_option( 'thrive_license', array() ), true ) ?>
</li>
<li>
<b>NEW way tpm_licenses used</b>: <?php echo var_export( get_option( 'tpm_licenses', array() ), true ) ?>
</li>
<li>
<b>CACHE enabled</b>: <?php echo Thrive_Product_Manager::CACHE_ENABLED ? 'true' : 'false' ?>
</li>
<li>
<b>CACHE life time for products</b> <?php echo (int) TPM_Product_List::CACHE_LIFE_TIME / 86400 ?> days <br>
</li>
<li>
<b>CACHE life time for licenses</b> <?php echo (int) TPM_License_Manager::CACHE_LIFE_TIME / 3600 ?> hours
</li>
<li>
<b>TPM Token</b> <?php echo get_option( 'tpm_token', 'not_set' ) ?>
</li>
<li>
<b>Cron Refresh Token Scheduled on</b>:
<?php echo date( 'Y-m-d H:i:s', wp_next_scheduled( TPM_Cron::CRON_HOOK_NAME ) ); ?>
</li>
</ul>
<?php endif; ?>
<script type="text/javascript">
( function ( $ ) {
$( function () {
$( '#tpm-debug-server' ).change( function () {
window.location = TPM.tpm_url + '&tpm_action=set_url&url=' + this.value;
} );
} );
} )( jQuery );
</script>

View File

@@ -0,0 +1,10 @@
<div class="tpm-connect-screen-header">
<h1><span>Thrive</span> Product Manager</h1>
<?php $connection = TPM_Connection::get_instance() ?>
<?php if ( $connection->is_connected() ) : ?>
<a class="tpm-disconnect-account" href="<?php echo $connection->get_disconnect_url() ?>">
<?php echo __( 'Disconnect Thrivethemes.com account', Thrive_Product_Manager::T ) ?>
<span><?php echo $connection->get_email() ?></span>
</a>
<?php endif; ?>
</div>

View File

@@ -0,0 +1,2 @@
<div id="tpm-app"></div>
<?php include thrive_product_manager()->path( 'inc/templates/debugger.phtml' ) ?>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,31 @@
# Thrive Product Manager (TPM)
Helps users to install Thrive Products that they have access to.
## Requirements
* NodeJS - [info here](https://nodejs.org/)
## After checkout from git
We use node for installing dependencies in our current project
```bash
npm install
```
We need to make 1 symlinks:
1. [thrive-dashboard](https://github.com/ThriveThemes/thrive-dashboard) project under `thrive-dashboard` folder name
See `package.json` for running additional scripts
## For developers
`npm run watch` for developing. This command watches every modification on asset files (*.js, *.scss) and generate the corresponding (*.js..min, *.css) files
For additional details please see `webpack.config.js` file
Make sure you have the following constants in `wp-config.php` file
```
define( 'WP_DEBUG', true );
define( 'TPM_DEBUG', true );
define( 'TVE_DEBUG', true );`
```

View File

@@ -0,0 +1,31 @@
# Thrive Dashboard
A piece of functionality that exists for all thrive products.
## Requirements
* NodeJS - [info here](https://nodejs.org/)
## After checkout from git
We use node for installing dependencies in our current project
```bash
npm install
```
See `package.json` for running additional scripts
## For developing:
`npm run watch` for developing. This command watches every modification on asset files (*.js, *.scss) and generate the corresponding (*.js..min, *.css) files
For additional details please see `webpack.config.js` file
Make sure you have the following constants in `wp-config.php` file
```
define( 'WP_DEBUG', false );
define( 'TCB_TEMPLATE_DEBUG', true );
define( 'THRIVE_THEME_CLOUD_DEBUG', true );
define( 'TCB_CLOUD_DEBUG', true );
define( 'TL_CLOUD_DEBUG', true );
define( 'TVE_DEBUG', true );`
```

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,3 @@
<svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg">
<path d="m5.112.393-.464.464a.281.281 0 0 0 0 .398L8.284 4.89H.28A.281.281 0 0 0 0 5.17v.657c0 .155.126.281.281.281h8.003L4.648 9.745a.281.281 0 0 0 0 .398l.464.464c.11.11.288.11.397 0l4.909-4.908a.281.281 0 0 0 0-.398L5.509.393a.281.281 0 0 0-.397 0z"/>
</svg>

After

Width:  |  Height:  |  Size: 350 B

View File

@@ -0,0 +1,3 @@
<svg width="19" height="14" viewBox="0 0 19 14" xmlns="http://www.w3.org/2000/svg">
<path d="M1 12.793 18 1" stroke="#B0B9C1" stroke-width="2" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 235 B

View File

@@ -0,0 +1,4 @@
<svg width="16" height="15" viewBox="0 0 16 15" xmlns="http://www.w3.org/2000/svg">
<path d="m15.649 8.38-1.963-1.977a.328.328 0 0 0-.561.231v1.337H10.5V4.359a1.32 1.32 0 0 0-.387-.93L7.819 1.136A1.312 1.312 0 0 0 6.892.75h-5.58A1.317 1.317 0 0 0 0 2.065v11.373c0 .724.588 1.312 1.312 1.312h7.874c.724 0 1.314-.588 1.314-1.312v-2.842H9.187v2.842H1.312V2.065h4.374v2.843c0 .364.293.656.657.656h2.844v2.407H4.703a.328.328 0 0 0-.328.328v.656c0 .181.147.328.328.328h8.422v1.337c0 .293.355.439.561.23l1.963-1.976a.35.35 0 0 0 0-.493zm-8.65-4.128v-2.08l2.08 2.08H7z" fill="#6D7882"
fill-rule="nonzero"/>
</svg>

After

Width:  |  Height:  |  Size: 620 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 B

View File

@@ -0,0 +1,3 @@
<svg width="548" height="84" viewBox="0 0 548 84" xmlns="http://www.w3.org/2000/svg">
<path d="m39.714 44.914 24.108-18.507c11.54-8.857 27.77-8.16 38.508 1.654l27.76 25.374a30 30 0 0 0 36.142 3.295l20.477-12.8a30 30 0 0 1 18.993-4.403l34.234 3.547a30 30 0 0 0 12.11-1.228l33.749-10.637a30 30 0 0 1 22.86 1.996l22.16 11.525a30 30 0 0 0 33.292-3.775l24.757-21.082a30 30 0 0 1 19.45-7.159h34.749a30 30 0 0 0 10.285-1.818l23.52-8.583a30 30 0 0 1 33.526 9.212L548 57.599v26.193H0V60.898l31.746-11.605a30 30 0 0 0 7.968-4.38z" fill="#EAEFEF" fill-rule="evenodd"/>
</svg>

After

Width:  |  Height:  |  Size: 569 B

View File

@@ -0,0 +1,6 @@
<svg width="60" height="50" viewBox="0 0 60 50" xmlns="http://www.w3.org/2000/svg">
<g fill="#B0B9C1" fill-rule="nonzero">
<path d="M14.613 37.095 2.894 48.863a1.698 1.698 0 0 1-2.393-2.41l11.755-11.819a23.14 23.14 0 0 0 2.357 2.461zM30 0c11.046 0 20 8.954 20 20 0 1.291-.122 2.554-.356 3.777a14.37 14.37 0 0 0-3.42.192c.312-1.272.476-2.601.476-3.969 0-9.223-7.477-16.7-16.7-16.7-9.223 0-16.7 7.477-16.7 16.7 0 9.223 7.477 16.7 16.7 16.7 1.562 0 3.074-.214 4.508-.615a14.217 14.217 0 0 0-.08 3.423A20.046 20.046 0 0 1 30 40c-11.046 0-20-8.954-20-20S18.954 0 30 0zM45.702 32.624l2.596 2.745 2.564-2.71a5.525 5.525 0 0 1 2.285 2.335l-2.584 2.74 2.405 2.594a5.523 5.523 0 0 1-2.472 2.194l-2.198-2.324-2.226 2.354a5.522 5.522 0 0 1-2.5-2.16l2.443-2.608-2.645-2.822a5.525 5.525 0 0 1 2.332-2.338z"/>
<path d="M48.25 26a11.501 11.501 0 1 1 0 23.002 11.501 11.501 0 0 1 0-23.002zm0 2.862a8.637 8.637 0 1 0 0 17.274 8.637 8.637 0 0 0 0-17.274z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 975 B

View File

@@ -0,0 +1,17 @@
<svg width="960" height="224" viewBox="0 0 960 224" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="evenodd">
<path fill="#EAEFEF" opacity=".3" d="M0 0h960v34H0z"/>
<path d="M20 7c5.524 0 10 4.476 10 10s-4.476 10-10 10-10-4.476-10-10S14.476 7 20 7zm1.935 12.58a.998.998 0 0 0-.286.045 5.027 5.027 0 0 1-3.298 0 .998.998 0 0 0-.286-.044c-1.73 0-3.214.984-3.972 2.41A7.726 7.726 0 0 0 20 24.742a7.726 7.726 0 0 0 5.907-2.75c-.758-1.426-2.242-2.41-3.972-2.41zM20 10.872a3.548 3.548 0 1 0 0 7.097 3.548 3.548 0 0 0 0-7.097z" fill="#FFF" fill-rule="nonzero"/>
<path fill="#EAEFEF" opacity=".3" d="M0 38h960v34H0z"/>
<path d="M20 45c5.524 0 10 4.476 10 10s-4.476 10-10 10-10-4.476-10-10 4.476-10 10-10zm1.935 12.58a.998.998 0 0 0-.286.045 5.027 5.027 0 0 1-3.298 0 .998.998 0 0 0-.286-.044c-1.73 0-3.214.984-3.972 2.41A7.726 7.726 0 0 0 20 62.742a7.726 7.726 0 0 0 5.907-2.75c-.758-1.426-2.242-2.41-3.972-2.41zM20 48.872a3.548 3.548 0 1 0 0 7.097 3.548 3.548 0 0 0 0-7.097z" fill="#FFF" fill-rule="nonzero"/>
<path fill="#EAEFEF" opacity=".3" d="M0 76h960v34H0z"/>
<path d="M20 83c5.524 0 10 4.476 10 10s-4.476 10-10 10-10-4.476-10-10 4.476-10 10-10zm1.935 12.58a.998.998 0 0 0-.286.045 5.027 5.027 0 0 1-3.298 0 .998.998 0 0 0-.286-.044c-1.73 0-3.214.984-3.972 2.41a7.726 7.726 0 0 0 5.907 2.75 7.726 7.726 0 0 0 5.907-2.75c-.758-1.426-2.242-2.41-3.972-2.41zM20 86.872a3.548 3.548 0 1 0 0 7.097 3.548 3.548 0 0 0 0-7.097z" fill="#FFF" fill-rule="nonzero"/>
<path fill="#EAEFEF" opacity=".3" d="M0 114h960v34H0z"/>
<path d="M20 45c5.524 0 10 4.476 10 10s-4.476 10-10 10-10-4.476-10-10 4.476-10 10-10zm1.935 12.58a.998.998 0 0 0-.286.045 5.027 5.027 0 0 1-3.298 0 .998.998 0 0 0-.286-.044c-1.73 0-3.214.984-3.972 2.41A7.726 7.726 0 0 0 20 62.742a7.726 7.726 0 0 0 5.907-2.75c-.758-1.426-2.242-2.41-3.972-2.41zM20 48.872a3.548 3.548 0 1 0 0 7.097 3.548 3.548 0 0 0 0-7.097zM20 121c5.524 0 10 4.476 10 10s-4.476 10-10 10-10-4.476-10-10 4.476-10 10-10zm1.935 12.58a.998.998 0 0 0-.286.045 5.027 5.027 0 0 1-3.298 0 .998.998 0 0 0-.286-.044c-1.73 0-3.214.984-3.972 2.41a7.726 7.726 0 0 0 5.907 2.75 7.726 7.726 0 0 0 5.907-2.75c-.758-1.426-2.242-2.41-3.972-2.41zM20 124.872a3.548 3.548 0 1 0 0 7.097 3.548 3.548 0 0 0 0-7.097z"
fill="#FFF" fill-rule="nonzero"/>
<path fill="#EAEFEF" opacity=".3" d="M0 152h960v34H0z"/>
<path d="M20 159c5.524 0 10 4.476 10 10s-4.476 10-10 10-10-4.476-10-10 4.476-10 10-10zm1.935 12.58a.998.998 0 0 0-.286.045 5.027 5.027 0 0 1-3.298 0 .998.998 0 0 0-.286-.044c-1.73 0-3.214.984-3.972 2.41a7.726 7.726 0 0 0 5.907 2.75 7.726 7.726 0 0 0 5.907-2.75c-.758-1.426-2.242-2.41-3.972-2.41zM20 162.872a3.548 3.548 0 1 0 0 7.097 3.548 3.548 0 0 0 0-7.097z" fill="#FFF" fill-rule="nonzero"/>
<path fill="#EAEFEF" opacity=".3" d="M0 190h960v34H0z"/>
<path d="M20 197c5.524 0 10 4.476 10 10s-4.476 10-10 10-10-4.476-10-10 4.476-10 10-10zm1.935 12.58a.998.998 0 0 0-.286.045 5.027 5.027 0 0 1-3.298 0 .998.998 0 0 0-.286-.044c-1.73 0-3.214.984-3.972 2.41a7.726 7.726 0 0 0 5.907 2.75 7.726 7.726 0 0 0 5.907-2.75c-.758-1.426-2.242-2.41-3.972-2.41zM20 200.872a3.548 3.548 0 1 0 0 7.097 3.548 3.548 0 0 0 0-7.097z" fill="#FFF" fill-rule="nonzero"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -0,0 +1,13 @@
<svg width="446" height="264" viewBox="0 0 446 264" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="evenodd">
<path d="M26 184h137a4 4 0 0 1 4 4v9a4 4 0 0 1-4 4H26a4 4 0 0 1-4-4v-9a4 4 0 0 1 4-4zm0 21h416a4 4 0 0 1 4 4v26a4 4 0 0 1-4 4H26a4 4 0 0 1-4-4v-26a4 4 0 0 1 4-4zM26 122h137a4 4 0 0 1 4 4v9a4 4 0 0 1-4 4H26a4 4 0 0 1-4-4v-9a4 4 0 0 1 4-4zm0 21h416a4 4 0 0 1 4 4v26a4 4 0 0 1-4 4H26a4 4 0 0 1-4-4v-26a4 4 0 0 1 4-4zM26 1h137a4 4 0 0 1 4 4v6a4 4 0 0 1-4 4H26a4 4 0 0 1-4-4V5a4 4 0 0 1 4-4zm0 18h416a4 4 0 0 1 4 4v26a4 4 0 0 1-4 4H26a4 4 0 0 1-4-4V23a4 4 0 0 1 4-4zM26 65h137a4 4 0 0 1 4 4v6a4 4 0 0 1-4 4H26a4 4 0 0 1-4-4v-6a4 4 0 0 1 4-4zm0 18h416a4 4 0 0 1 4 4v26a4 4 0 0 1-4 4H26a4 4 0 0 1-4-4V87a4 4 0 0 1 4-4z"
fill="#EAEFEF" opacity=".3"/>
<path d="M39 26c5.524 0 10 4.476 10 10s-4.476 10-10 10-10-4.476-10-10 4.476-10 10-10zm1.935 12.58a.998.998 0 0 0-.286.045 5.027 5.027 0 0 1-3.298 0 .998.998 0 0 0-.286-.044c-1.73 0-3.214.984-3.972 2.41A7.726 7.726 0 0 0 39 43.742a7.726 7.726 0 0 0 5.907-2.75c-.758-1.426-2.242-2.41-3.972-2.41zM39 29.872a3.548 3.548 0 1 0 0 7.097 3.548 3.548 0 0 0 0-7.097zM39 88c5.524 0 10 4.476 10 10s-4.476 10-10 10-10-4.476-10-10 4.476-10 10-10zm1.935 12.58a.998.998 0 0 0-.286.045 5.027 5.027 0 0 1-3.298 0 .998.998 0 0 0-.286-.044c-1.73 0-3.214.984-3.972 2.41a7.726 7.726 0 0 0 5.907 2.75 7.726 7.726 0 0 0 5.907-2.75c-.758-1.426-2.242-2.41-3.972-2.41zM39 91.872a3.548 3.548 0 1 0 0 7.097 3.548 3.548 0 0 0 0-7.097zM39 150c5.524 0 10 4.476 10 10s-4.476 10-10 10-10-4.476-10-10 4.476-10 10-10zm1.935 12.58a.998.998 0 0 0-.286.045 5.027 5.027 0 0 1-3.298 0 .998.998 0 0 0-.286-.044c-1.73 0-3.214.984-3.972 2.41a7.726 7.726 0 0 0 5.907 2.75 7.726 7.726 0 0 0 5.907-2.75c-.758-1.426-2.242-2.41-3.972-2.41zM39 153.872a3.548 3.548 0 1 0 0 7.097 3.548 3.548 0 0 0 0-7.097zM40 212c5.524 0 10 4.476 10 10s-4.476 10-10 10-10-4.476-10-10 4.476-10 10-10zm1.935 12.58a.998.998 0 0 0-.286.045 5.027 5.027 0 0 1-3.298 0 .998.998 0 0 0-.286-.044c-1.73 0-3.214.984-3.972 2.41a7.726 7.726 0 0 0 5.907 2.75 7.726 7.726 0 0 0 5.907-2.75c-.758-1.426-2.242-2.41-3.972-2.41zM40 215.872a3.548 3.548 0 1 0 0 7.097 3.548 3.548 0 0 0 0-7.097z"
fill="#FFF" fill-rule="nonzero"/>
<path stroke="#F7F9F9" stroke-linecap="square" d="M3.5.5v263"/>
<circle fill="#F7F9F9" cx="3.5" cy="7.5" r="3.5"/>
<circle fill="#F7F9F9" cx="3.5" cy="67.5" r="3.5"/>
<circle fill="#F7F9F9" cx="3.5" cy="132.5" r="3.5"/>
<circle fill="#F7F9F9" cx="3.5" cy="194.5" r="3.5"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,3 @@
<svg width="23" height="15" viewBox="0 0 23 15" xmlns="http://www.w3.org/2000/svg">
<path d="M5.335.593c.364-.818 1.537-.782 1.85.057L11.2 11.407l3.868-6.754a1 1 0 0 1 1.643-.135l.076.107 3.109 5.039h1.54a1 1 0 0 1 .993.884l.007.116a1 1 0 0 1-1 1h-2.098a1 1 0 0 1-.85-.475l-2.521-4.083-4.09 7.145a1 1 0 0 1-1.755-.033l-.05-.114L6.167 3.642 3.839 8.873a1 1 0 0 1-.784.585l-.13.009H1a1 1 0 0 1 0-2l1.275-.001L5.335.593z" fill="#B0B9C1" fill-rule="nonzero"/>
</svg>

After

Width:  |  Height:  |  Size: 467 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 B

View File

@@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M10 0c5.524 0 10 4.476 10 10s-4.476 10-10 10S0 15.524 0 10 4.476 0 10 0zm1.935 12.58a.998.998 0 0 0-.286.045 5.027 5.027 0 0 1-3.298 0 .998.998 0 0 0-.286-.044c-1.73 0-3.214.984-3.972 2.41A7.726 7.726 0 0 0 10 17.742a7.726 7.726 0 0 0 5.907-2.75c-.758-1.426-2.242-2.41-3.972-2.41zM10 3.872a3.548 3.548 0 1 0 0 7.097 3.548 3.548 0 0 0 0-7.097z" fill="#FFF" fill-rule="nonzero"/>
</svg>

After

Width:  |  Height:  |  Size: 482 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -0,0 +1,609 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-dashboard
*/
use TVD\Dashboard\Access_Manager\Main;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
/**
* should handle all AJAX requests
*
* implemented as a singleton
*
* Class TVE_Dash_AjaxController
*/
class TVE_Dash_AjaxController {
/**
* @var TVE_Dash_AjaxController
*/
private static $instance;
/**
* @var string TTW base URL
*/
private $_thrv_base_url;
/**
* Token API endpoint
*
* @var string
*/
private $_token_endpoint;
/**
* @var string
*/
private $_ttw_auth_endpoint;
/**
* For signing temp key request
*
* @var string
*/
private $_ttw_auth_endpoint_salt = 'lJHug785$)+3hHO*Yhl^H,dO4rv0op{941kjdFsh5fgvBNkxlu9uhF';
/**
* Option name for temp key used on doing the request on TTW API /token endpoint
*
* @var string
*/
private $_temp_key_option = 'ttw_temp_key';
private $json_content_type = 'application/json';
/**
* TVE_Dash_AjaxController constructor.
*/
public function __construct() {
$this->_thrv_base_url = defined( 'THRV_ENV' ) && is_string( THRV_ENV ) ? THRV_ENV : 'https://thrivethemes.com';
$this->_token_endpoint = esc_url( "{$this->_thrv_base_url}/api/v1/public/token" );
$this->_ttw_auth_endpoint = esc_url( "{$this->_thrv_base_url}/api/v1/public/get_key" );
}
/**
* singleton implementation
*
* @return TVE_Dash_AjaxController
*/
public static function instance() {
if ( null === self::$instance ) {
self::$instance = new TVE_Dash_AjaxController();
}
/**
* Remove these actions
* Because some other plugins have hook on these actions and some errors may occur
*/
remove_all_actions( 'wp_insert_post' );
remove_all_actions( 'save_post' );
return self::$instance;
}
/**
* entry-point for each ajax request
* this should dispatch the request to the appropriate method based on the "route" parameter
*
* @return array|object
*/
public function handle() {
$route = $this->param( 'route' );
$route = preg_replace( '#([^a-zA-Z0-9-])#', '', $route );
$method_name = $route . 'Action';
return $this->{$method_name}();
}
/**
* gets a request value and returns a default if the key is not set
* it will first search the POST array
*
* @param string $key
* @param mixed $default
*
* @return mixed
*/
private function param( $key, $default = null ) {
if ( isset( $_POST[ $key ] ) ) {
$result = map_deep( $_POST[ $key ], 'sanitize_text_field' );
} else {
$result = isset( $_REQUEST[ $key ] ) ? map_deep( $_REQUEST[ $key ], 'sanitize_text_field' ) : $default;
}
return $result;
}
/**
* Reset post/template/design css
*/
public function resetPostStyleAction() {
$post_id = $this->param( 'post_id' );
$default_design = apply_filters( 'tvd_default_post_style', '', $post_id );
return update_post_meta( $post_id, 'tve_custom_css', $default_design );
}
/**
* Save FontAwesomePro kit
*/
public function saveFaKitAction() {
if ( ! wp_verify_nonce( $_POST['_wpnonce'], 'tve-dash' ) ) {
wp_send_json( null, 400 );
}
if ( ! current_user_can( 'manage_options' ) ) {
wp_send_json( 'You do not have access', 403 );
}
update_option( 'tvd_fa_kit', sanitize_text_field( $_POST['option_value'] ) );
wp_send_json( 'success', 200 );
}
/**
* save global settings for the plugin
*/
public function generalSettingsAction() {
$allowed = apply_filters( 'tvd_ajax_allowed_settings', array(
'tve_social_fb_app_id',
'tve_comments_facebook_admins',
'tve_comments_disqus_shortname',
'tve_google_fonts_disable_api_call',
'tve_stock_images_disable_service',
'tvd_enable_login_design',
'tve_allow_video_src',
'tvd_coming_soon_page_id',
) );
$field = $this->param( 'field' );
$value = map_deep( $this->param( 'value' ), 'sanitize_text_field' );
if ( ! in_array( $field, $allowed ) ) {
wp_die( 'unknown setting.' );
}
$result = array(
'valid' => 1,
'elem' => $field,
);
switch ( $field ) {
case 'tve_social_fb_app_id':
$object = wp_remote_get( "https://graph.facebook.com/{$value}" );
$body = json_decode( wp_remote_retrieve_body( $object ), false );
if ( ! $body || empty( $body->link ) ) {
$result['valid'] = 0;
}
break;
case 'tve_comments_facebook_admins':
case 'tve_comments_disqus_shortname':
$result['valid'] = (int) ! empty( $value );
break;
default:
break;
}
if ( $result['valid'] ) {
update_option( $field, $value );
set_transient( '_thrive_tvd_' . $field, $value, 5 * DAY_IN_SECONDS );
}
return $result;
}
public function licenseAction() {
$email = ! empty( $_POST['email'] ) ? sanitize_email( trim( $_POST['email'], ' ' ) ) : ''; // phpcs:ignore
$key = ! empty( $_POST['license'] ) ? sanitize_text_field( trim( $_POST['license'], ' ' ) ) : ''; // phpcs:ignore
$tag = ! empty( $_POST['tag'] ) ? sanitize_text_field( trim( $_POST['tag'], ' ' ) ) : false; // phpcs:ignore
$licenseManager = TVE_Dash_Product_LicenseManager::getInstance();
$response = $licenseManager->checkLicense( $email, $key, $tag );
if ( ! empty( $response['success'] ) ) {
$licenseManager->activateProducts( $response );
}
exit( json_encode( $response ) );
}
/**
* Generate the unique dashboard token Action
*
* @return mixed|string|void
*/
public function tokenAction() {
$rand_nr = rand( 1, 9 );
$rand_chars = '#^@(yR&dsYh';
$rand_string = substr( str_shuffle( $rand_chars ), 0, $rand_nr );
$token = strrev( base_convert( bin2hex( hash( 'sha512', uniqid( mt_rand() . microtime( true ) * 10000, true ), true ) ), 16, 36 ) ) . $rand_string;
$referer = $this->param( 'referer' );
$data = array(
'token' => $token,
'valid_until' => date( 'Y-m-d', strtotime( '+15 days' ) ),
'referer' => ! empty( $referer ) ? $referer : get_site_url(),
);
/* store the generated token in the database instead of reading it from POST in the saveToken action */
update_option( 'tve_dash_generated_token', array(
'token' => $token,
'referer' => $data['referer'],
) );
/**
* Grab a temporary key for signing TTW /token's endpoint request
*/
$response = tve_dash_api_remote_post(
$this->_ttw_auth_endpoint,
array(
'body' => json_encode( $data ),
'headers' => array(
'Content-Type' => $this->json_content_type,
'Authorization' => base64_encode( $this->_ttw_auth_endpoint_salt ),
),
'timeout' => 15,
'sslverify' => false,
)
);
if ( $response && ! is_wp_error( $response ) ) {
$ttw_data = json_decode( wp_remote_retrieve_body( $response ), false );
if ( $ttw_data && ! empty( $ttw_data->temp_token ) ) {
// Save temp token option in order to sign /token request
update_option( $this->_temp_key_option, $ttw_data->temp_token );
}
}
unset( $data['referer'] );
return json_encode( $data );
}
/**
* Save token data Action
*
* @return array|mixed|object
*/
public function saveTokenAction() {
$generated_token = get_option( 'tve_dash_generated_token' );
if ( empty( $generated_token['token'] ) || empty( $generated_token['referer'] ) ) {
return array(
'error' => __( 'Invalid request', 'thrive-dash' ),
'next' => false,
);
}
$data = $generated_token +
array(
'valid_until' => $this->param( 'valid_until' ),
'saved' => true,
);
$response = tve_dash_api_remote_post(
$this->_token_endpoint,
array(
'body' => json_encode( $data ),
'headers' => array(
'Content-Type' => $this->json_content_type,
'Authorization' => base64_encode( get_option( $this->_temp_key_option, '' ) ),
'X-Thrive-Request' => 1,
),
'timeout' => 15,
'sslverify' => false,
)
);
if ( is_wp_error( $response ) ) {
return array(
'error' => __( 'Error in communication with Thrive Themes', 'thrive-dash' ),
'next' => true,
);
}
if ( $response ) {
$ttw_data = json_decode( wp_remote_retrieve_body( $response ), false );
if ( isset( $ttw_data->error ) ) {
return $ttw_data;
}
if ( isset( $ttw_data->pass, $ttw_data->user_name, $ttw_data->user_email ) && $ttw_data->pass && $ttw_data->user_name && $ttw_data->user_email ) {
$pass = base64_decode( $ttw_data->pass );
$user_id = username_exists( $ttw_data->user_name );
if ( ! $user_id && email_exists( $ttw_data->user_email ) === false ) {
/**
* Create the support user
*/
$user_id = wp_create_user( $ttw_data->user_name, $pass, $ttw_data->user_email );
$user_id = wp_update_user(
array(
'ID' => $user_id,
'nickname' => 'Thrive Support User',
'first_name' => 'Thrive Support',
'last_name' => 'User',
)
);
} else {
/**
* Update the support user
*/
$user_id = wp_update_user(
array(
'ID' => $user_id,
'user_pass' => $pass,
'nickname' => 'Thrive Support User',
'first_name' => 'Thrive Support',
'last_name' => 'User',
)
);
}
$user = new WP_User( $user_id );
$user->set_role( 'administrator' );
update_user_meta( $user_id, '_thrive_support_user', 1 );
update_option( 'thrive_token_support', $data );
if ( isset( $ttw_data->success ) ) {
return array( 'success' => $ttw_data->success );
}
return array(
'error' => __( 'An error occurred, please try again', 'thrive-dash' ),
'next' => true,
);
}
}
}
/**
* Delete token data and user Action
*
* @return array
*/
public function deleteTokenAction() {
$data = $this->param( 'token_data' );
if ( $data ) {
if ( defined( 'TVE_DASH_TOKEN_ENDPOINT' ) ) {
$this->_token_endpoint = TVE_DASH_TOKEN_ENDPOINT;
}
$response = tve_dash_api_remote_request( $this->_token_endpoint, array(
'body' => json_encode( $data ),
'method' => 'DELETE',
'headers' => array(
'Content-Type' => $this->json_content_type,
'Authorization' => base64_encode( $this->_ttw_auth_endpoint_salt ),
),
'timeout' => 15,
'sslverify' => false,
) );
$ttw_data = json_decode( wp_remote_retrieve_body( $response ) );
if ( delete_option( 'thrive_token_support' ) && delete_option( 'tve_dash_generated_token' ) ) {
$result = array( 'success' => isset( $ttw_data->success ) ? $ttw_data->success : __( 'Token has been deleted', 'thrive-dash' ) );
} else {
$result = array( 'error' => __( 'Token is not deleted', 'thrive-dash' ) );
}
return $result;
}
return array( 'error' => __( 'There is no token to delete', 'thrive-dash' ) );
}
public function activeStateAction() {
$_products = $this->param( 'products' );
if ( empty( $_products ) ) {
wp_send_json( array( 'items' => array() ) );
}
$installed = tve_dash_get_products( false );
$to_show = array();
foreach ( $_products as $product ) {
if ( $product === 'all' ) {
$to_show = $installed;
break;
} elseif ( isset( $installed[ $product ] ) ) {
$to_show [] = $installed[ $product ];
}
}
$response = array();
foreach ( $to_show as $_product ) {
/** @var TVE_Dash_Product_Abstract $product */
ob_start();
$_product->render();
$response[ $_product->get_tag() ] = ob_get_contents();
ob_end_clean();
}
wp_send_json( $response );
}
public function affiliateLinksAction() {
$product_tag = $this->param( 'product_tag' );
$value = $this->param( 'value' );
return tve_dash_update_product_option( $product_tag, $value );
}
public function saveAffiliateIdAction() {
$aff_id = sanitize_text_field( $this->param( 'affiliate_id' ) );
return update_option( 'thrive_affiliate_id', $aff_id );
}
public function getAffiliateIdAction() {
return get_option( 'thrive_affiliate_id' );
}
public function getErrorLogsAction() {
$order_by = ! empty( $_GET['orderby'] ) ? sanitize_text_field( $_GET['orderby'] ) : 'date';
$order = ! empty( $_GET['order'] ) ? sanitize_text_field( $_GET['order'] ) : 'DESC';
$per_page = ! empty( $_GET['per_page'] ) ? sanitize_text_field( $_GET['per_page'] ) : 10;
$current_page = ! empty( $_GET['current_page'] ) ? sanitize_text_field( $_GET['current_page'] ) : 1;
return tve_dash_get_error_log_entries( $order_by, $order, $per_page, $current_page );
}
/**
* Change the capability for a specific role based on plugin tag given
*
* @return array
*/
public function changeCapabilityAction() {
$response = array();
if ( is_super_admin() ) {
if ( current_user_can( TVE_DASH_CAPABILITY ) ) {
$role = $this->param( 'role' );
if ( $wp_role = get_role( $role ) ) {
$capability = $this->param( 'capability' );
$action = $this->param( 'capability_action' );
/** User should not be allowed to remove TD capability of the administrator */
if ( $role === 'administrator' && $capability === TVE_DASH_CAPABILITY ) {
$response = array(
'success' => false,
'message' => __( 'You are not allowed to remove this capability!', 'thrive-dash' ),
);
} else {
/**
* Add the capability to edit Thrive CPT was set for the users which have edit_posts capability
*
* eg. Edit Leads Form if you have granted access
*
*/
$wp_role->add_cap( TVE_DASH_EDIT_CPT_CAPABILITY );
if ( $action === 'add' ) {
$wp_role->add_cap( $capability );
} else {
$wp_role->remove_cap( $capability );
}
$success = $action === 'add' ? $wp_role->has_cap( $capability ) : ! $wp_role->has_cap( $capability );
$response = array(
'success' => $success,
'message' => $success ? __( 'Capability changed successfully', 'thrive-dash' ) : __( 'Changing capability failed', 'thrive-dash' ),
);
}
} else {
$response = array(
'success' => false,
'message' => __( 'This role does not exist anymore', 'thrive-dash' ),
);
}
} else {
$response = array(
'success' => false,
'message' => __( 'You do not have this capability', 'thrive-dash' ),
);
}
}
return $response;
}
/**
* Add functionalities for users
*
* @return array
*/
public function updateUserFunctionalityAction() {
$response = array();
if ( is_super_admin() ) {
$functionality_tag = $this->param( 'functionality' );
$role = $this->param( 'role' );
$updated_value = $this->param( 'value' );
$functionality = Main::get_all_functionalities( $functionality_tag );
$functionality::update_option_value( $role, $updated_value );
$success = $functionality::get_option_value( $role ) === $updated_value;
$response = array(
'success' => $success,
'message' => $success ? __( 'Functionality changed successfully', 'thrive-dash' ) : __( 'Changing functionality failed', 'thrive-dash' ),
);
}
return $response;
}
/**
* Reset capabilities & functionalities to their default value
*
* @return array
*/
public function resetCapabilitiesToDefaultAction() {
$response = array();
if ( is_super_admin() ) {
$role = $this->param( 'role' );
$wp_role = get_role( $role );
$should_have_capability = $role === 'administrator' || $role === 'editor';
$capability_action = $should_have_capability ? 'add' : 'remove';
$updated_products = array();
$updated_functionalities = array();
$success = true;
/* Reset product capabilities */
foreach ( Main::get_products() as $product ) {
if ( $capability_action === 'add' ) {
$wp_role->add_cap( $product['prod_capability'] );
} else if ( $capability_action = 'remove' ) {
$wp_role->remove_cap( $product['prod_capability'] );
}
$updated_products[ $product['tag'] ] = $wp_role->has_cap( $product['prod_capability'] );
$success = $success && ( $should_have_capability === $updated_products[ $product['tag'] ] );
}
/* Reset functionalities */
foreach ( Main::get_all_functionalities() as $functionality ) {
$default_value = $functionality::get_default();
$functionality_tag = $functionality::get_tag();
$functionality::update_option_value( $role, $default_value );
$success = $success && $functionality::get_option_value( $role ) === $default_value;
$updated_functionalities[ $functionality_tag ] = $functionality::get_option_value( $role );
}
$response = array(
'success' => $success,
'message' => $success ? __( 'Default values were set successfully', 'thrive-dash' ) : __( 'Changing functionality failed', 'thrive-dash' ),
'updated_products' => $updated_products,
'updated_functionalities' => $updated_functionalities,
);
}
return $response;
}
}

View File

@@ -0,0 +1,289 @@
<?php /** @noinspection PhpCSValidationInspection */
/** @noinspection PhpCSValidationInspection */
/** @noinspection PhpCSValidationInspection */
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-dashboard
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
abstract class TVE_Dash_Product_Abstract {
private static $instances = array();
protected $tag;
protected $slug = '';
protected $version = '';
protected $logoUrl;
protected $logoUrlWhite;
protected $title;
protected $description;
protected $productIds;
protected $type;
protected $activated = false;
protected $moreLinks = array();
protected $button = array();
protected $required_data
= array(
'tag',
'logoUrl',
'title',
'description',
'productIds',
'type',
'activated',
);
protected $needs_architect = false;
/**
* Is true if the TAR version is incompatible with the product version
*
* @var bool
*/
protected $incompatible_architect_version = false;
public function __construct( $data = array() ) {
foreach ( $data as $key => $value ) {
$this->{$key} = $value;
}
}
public function localize_data() {
return [
'type' => $this->type,
'tag' => $this->tag,
'slug' => $this->slug,
'title' => $this->title,
'is_activated' => $this->is_activated(),
'capability' => $this->get_cap(),
'has_access' => self::has_access(),
'admin_url' => $this->get_admin_url(),
'version' => $this->version,
];
}
/**
* Check each required data if it's empty
*
* @throws Exception
*/
final public function validate() {
foreach ( $this->required_data as $data ) {
if ( $data === 'productIds' && ! is_array( $this->productIds ) ) {
throw new Exception( "{$data} is not array" );
}
if ( is_null( $this->{$data} ) ) {
throw new Exception( "Field {$data} is empty" );
}
}
}
public function render() {
try {
$this->validate();
} catch ( Exception $exception ) {
require TVE_DASH_PATH . '/templates/product/error.phtml';
return;
}
if ( $this->is_activated() ) {
require TVE_DASH_PATH . '/templates/product/activated.phtml';
return;
}
require TVE_DASH_PATH . '/templates/product/inactive.phtml';
}
public function is_activated() {
if ( $this->activated === true ) {
return true;
}
return TVE_Dash_Product_LicenseManager::getInstance()->itemActivated( $this );
}
public function render_button() {
return sprintf( '<a class="%s" href="%s" target="%s" data-source="%s">%s</a>',
"tvd-waves-effect tvd-waves-light tvd-btn tvd-btn-green tvd-full-btn" . ( $this->button['active'] ? '' : 'tvd-disabled' ) . ' ' . ( ! empty( $this->button['classes'] ) ? $this->button['classes'] : '' ),
$this->button['active'] && ! empty( $this->button['url'] ) ? $this->button['url'] : 'javascript:void(0)',
! empty( $this->button['target'] ) ? $this->button['target'] : '_self',
! empty( $this->button['data-source'] ) ? $this->button['data-source'] : '',
$this->button['label']
);
}
public function render_more_links() {
if ( $this->is_activated() && ! empty( $this->moreLinks ) ) {
$links = '<a class="tvd-dropdown-button tvd-btn-floating tvd-right tvd-card-options" data-constrainwidth="false" data-beloworigin="true" data-alignment="right" data-activates="dropdown-' . $this->tag . '" href="javascript:void(0)"><i class="tvd-icon-more_vert"></i></a>';
$links .= '<ul id="dropdown-' . $this->tag . '" class="tvd-dropdown-content" style="white-space: nowrap; position: absolute; top: 43px; left: 162px; opacity: 1; display: none;">';
foreach ( $this->moreLinks as $link ) {
$icon_class = isset( $link['icon_class'] ) ? $link['icon_class'] : '';
$class = isset( $link['class'] ) ? $link['class'] : '';
$target = isset( $link['target'] ) ? $link['target'] : '_self';
$href = isset( $link['href'] ) ? $link['href'] : '';
$text = isset( $link['text'] ) ? $link['text'] : 'Item';
$links .= "<li><a class='" . $class . "' target='" . $target . "' href='" . $href . "'><i class='" . $icon_class . "'></i>" . $text . "</a></li>";
}
$links .= '</ul>';
return $links;
}
return '';
}
public function get_tag() {
return $this->tag;
}
public function get_slug() {
return $this->slug;
}
public function get_title() {
return $this->title;
}
public function get_logo() {
return $this->logoUrl;
}
public function get_type() {
return $this->type;
}
public function setMoreLinks( $links ) {
$this->moreLinks = $links;
}
public function get_cap() {
return 'tve-use-' . $this->tag;
}
/**
* Checking if the default capabilities were set for the current plugin
*/
public function check_default_cap() {
$admin = get_role( 'administrator' );
$option = $this->tag . '_def_caps_set';
if ( $admin && ! get_option( $option ) && $admin->has_cap( $this->get_cap() ) ) {
update_option( $option, true );
return;
}
if ( ! get_option( $option ) ) {
$editor = get_role( 'editor' );
if ( $admin ) {
$admin->add_cap( $this->get_cap() );
}
if ( $editor ) {
$editor->add_cap( $this->get_cap() );
}
}
}
/**
* Check if the current user has access to the product
*
* @return bool
*/
public static function has_access() {
$product = static::instance()->get_tag();
return apply_filters( 'thrive_has_access_' . $product, current_user_can( static::cap() ) );
}
public static function cap() {
return static::instance()->get_cap();
}
/**
* Make sure that each class is instantiated only once
*
* @return mixed
*/
public static function instance() {
$cls = get_called_class();
if ( ! isset( self::$instances[ $cls ] ) ) {
self::$instances[ $cls ] = new static;
}
return self::$instances[ $cls ];
}
/**
* Whether or not this product has a dependency on TAr
*
* @return bool
*/
public function needs_architect() {
return $this->needs_architect;
}
/**
* Getter for invalid architect version
*
* @return bool
*/
public function get_incompatible_architect_version() {
return $this->incompatible_architect_version;
}
/**
* Returns the product admin URL
*
* @return string
*/
public function get_admin_url() {
return ! empty( $this->button['url'] ) ? $this->button['url'] : '';
}
/**
* Define reset functionality for our products
*
* @return bool
*/
public static function reset_plugin() {
return true;
}
/**
* Returns true if product is ready from TPM point of view
* Used in ThriveApprentice for certificate functionality
*
* @return boolean
*/
public static function is_ready() {
if ( ! TD_TTW_Connection::get_instance()->is_connected() || ! class_exists( 'TPM_Product_List', false ) ) {
return false;
}
$tpm_product = TPM_Product_List::get_instance()->get_product_instance( static::instance()->get_tag() );
return $tpm_product->get_status() === 'ready';
}
}

View File

@@ -0,0 +1,275 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-dashboard
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
class TVE_Dash_Product_LicenseManager {
const LICENSE_OPTION_NAME = 'thrive_license';
const TCB_TAG = 'tcb';
const TL_TAG = 'tl';
const TCW_TAG = 'tcw';
const ALL_TAG = 'all';
const TU_TAG = 'tu';
const THO_TAG = 'tho';
const TVO_TAG = 'tvo';
const TQB_TAG = 'tqb';
const TCM_TAG = 'tcm';
const TVA_TAG = 'tva';
const TAB_TAG = 'tab';
const TPM_TAG = 'tpm';
const TAG_FOCUS = 'focusblog';
const TAG_LUXE = 'luxe';
const TAG_IGNITION = 'ignition';
const TAG_MINUS = 'minus';
const TAG_SQUARED = 'squared';
const TAG_VOICE = 'voice';
const TAG_PERFORMAG = 'performag';
const TAG_PRESSIVE = 'pressive';
const TAG_STORIED = 'storied';
const TAG_RISE = 'rise';
protected $secret_key = '@#$()%*%$^&*(#@$%@#$%93827456MASDFJIK3245';
protected static $instance;
protected $license_data;
protected $accepted_tags = array();
protected function __construct() {
$this->license_data = get_option( static::LICENSE_OPTION_NAME, array() );
$reflection = new ReflectionClass( $this );
$constants = $reflection->getConstants();
$this->accepted_tags = array();
foreach ( $constants as $name => $value ) {
if ( strpos( $name, 'TAG' ) !== false ) {
$this->accepted_tags [] = $value;
}
}
}
public static function getInstance() {
if ( empty( static::$instance ) ) {
static::$instance = new TVE_Dash_Product_LicenseManager();
}
return static::$instance;
}
/**
* whether or not $tag is a theme tag
* used in backwards-compatible license check
*
* @param string $tag
*
* @return array
*/
public static function isThemeTag( $tag ) {
return in_array( $tag, array(
static::TAG_FOCUS,
static::TAG_IGNITION,
static::TAG_LUXE,
static::TAG_MINUS,
static::TAG_PERFORMAG,
static::TAG_PRESSIVE,
static::TAG_RISE,
static::TAG_SQUARED,
static::TAG_STORIED,
static::TAG_VOICE,
) );
}
/**
* Checks license options
*
* @param string|TVE_Dash_Product_Abstract $item
*
* @return bool
*/
public function itemActivated( $item ) {
if ( $item instanceof TVE_Dash_Product_Abstract ) {
$item = $item->get_tag();
}
if ( function_exists( 'thrive_product_manager' ) ) {
return thrive_product_manager()->itemActivated( $item, $this );
}
if ( $this->isThemeTag( $item ) ) {
$licensed = get_option( 'thrive_license_status', false ) === 'ACTIVE';
} else {
switch ( $item ) {
case static::TCB_TAG:
$licensed = get_option( 'tve_license_status', false ) === 'ACTIVE';
break;
case static::TL_TAG:
$licensed = get_option( 'tve_leads_license_status', false ) === 'ACTIVE';
break;
case static::TCW_TAG:
$licensed = get_option( 'tcw_license_status', false ) === 'ACTIVE';
break;
default:
$licensed = false;
break;
}
}
if ( $licensed === false ) {
$licensed = $this->checkData( $item );
}
return $licensed;
}
/**
* @param $item TVE_Dash_Product_Abstract|string
*
* @return bool
*/
protected function checkData( $item = null ) {
if ( empty( $this->license_data ) || null === $item ) {
return false;
}
if ( in_array( static::ALL_TAG, $this->license_data ) ) {
return true;
}
if ( $item instanceof TVE_Dash_Product_Abstract ) {
$tag = $item->get_tag();
} elseif ( is_string( $item ) ) {
$tag = $item;
}
return isset( $tag ) ? in_array( $tag, $this->license_data ) : false;
}
public function checkLicense( $email, $key, $tag = false ) {
$service_api_url = defined( 'TD_SERVICE_API_URL' ) ? TD_SERVICE_API_URL : 'https://service-api.thrivethemes.com';
$api_url = rtrim($service_api_url, '/') . '/license';
$body = array(
'email' => $email,
'license' => $key,
'site_url' => get_site_url(),
);
if ( $tag !== false ) {
$body['tag'] = $tag;
}
$api_url = add_query_arg( array(
'p' => $this->calc_hash( $body ),
), $api_url );
$_args = array(
'sslverify' => false,
'timeout' => 120,
'headers' => array(
'User-Agent' => 'WordPress',
),
'body' => $body,
);
$licenseValid = wp_remote_post( $api_url, $_args );
$response = array();
if ( is_wp_error( $licenseValid ) ) {
/** @var WP_Error $licenseValid */
/** Couldn't connect to the API URL - possible because wp_remote_get failed for whatever reason. Maybe CURL not activated on server, for instance */
$response['success'] = 0;
$response['reason'] = sprintf( __( "An error occurred while connecting to the license server. Error: %s. Please login to thrivethemes.com, report this error message on the forums and we'll get this sorted for you", 'thrive-dash' ), $licenseValid->get_error_message() );
return $response;
}
$response = @json_decode( $licenseValid['body'], true );
if ( empty( $response ) ) {
$response = new stdClass();
$response['success'] = 0;
$response['reason'] = sprintf( __( "An error occurred while receiving the license status. The response was: %s. Please login to thrivethemes.com, report this error message on the forums and we'll get this sorted for you.", 'thrive-dash' ), $licenseValid['body'] );
return $response;
}
return $response;
}
protected function calc_hash( $data ) {
return md5( $this->secret_key . serialize( $data ) . $this->secret_key );
}
public function activateProducts( &$response ) {
//check success flag
if ( empty( $response['success'] ) ) {
$response['success'] = 0;
$response['reason'] = __( 'Invalid response!', 'thrive-dash' );
return null;
}
//check if products is not empty and is array
if ( empty( $response['products'] ) || ! is_array( $response['products'] ) ) {
$response['success'] = 0;
$response['reason'] = __( 'Invalid products returned from server!', 'thrive-dash' );
return null;
}
foreach ( $response['products'] as $product_tag ) {
if ( ! in_array( $product_tag, $this->accepted_tags ) ) {
$response['success'] = 0;
$response['reason'] = __( 'Products returned from server are not accepted for licensing!', 'thrive-dash' );
return null;
}
}
//do the logic and update the option in DB
if ( in_array( static::ALL_TAG, $response['products'] ) ) {
update_option( static::LICENSE_OPTION_NAME, array( static::ALL_TAG ) );
} else {
$existing = get_option( static::LICENSE_OPTION_NAME, array() );
update_option( static::LICENSE_OPTION_NAME, array_unique( array_merge( $existing, $response['products'] ) ) );
}
return $response;
}
/**
* Based on $text_domain returns a tag associated
*
* @param string $text_domain
*
* @return string
*/
public static function get_product_tag( $text_domain ) {
$mapping = array(
'thrive-cb' => static::TCB_TAG,
'thrive-leads' => static::TL_TAG,
'thrive-clever-widgets' => static::TCW_TAG,
'thrive-ult' => static::TU_TAG,
'thrive-headline' => static::THO_TAG,
'thrive-ovation' => static::TVO_TAG,
'thrive-quiz-builder' => static::TQB_TAG,
'thrive-comments' => static::TCM_TAG,
'thrive-apprentice' => static::TVA_TAG,
'thrive-optimize' => static::TAB_TAG,
'thrive-product-manager' => static::TPM_TAG,
);
return $mapping[ $text_domain ] ?? '';
}
}

View File

@@ -0,0 +1,77 @@
<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-dashboard
*/
class Tve_Wpdb extends wpdb {
/**
* @var Tve_Wpdb
*/
protected static $instance;
public static function instance() {
if ( static::$instance === null ) {
$dbuser = defined( 'DB_USER' ) ? DB_USER : '';
$dbpassword = defined( 'DB_PASSWORD' ) ? DB_PASSWORD : '';
$dbname = defined( 'DB_NAME' ) ? DB_NAME : '';
$dbhost = defined( 'DB_HOST' ) ? DB_HOST : '';
static::$instance = new static( $dbuser, $dbpassword, $dbname, $dbhost );
}
return static::$instance;
}
/**
* Just run a query, without anything else
*
* @param $query
*
* @return $this
*/
public function do_query( $query ) {
if ( ! empty( $this->dbh ) ) {
if ( $this->use_mysqli ) {
/* @codingStandardsIgnoreLine */
$this->result = mysqli_query( $this->dbh, $query );
} else {
/* @codingStandardsIgnoreLine */
$this->result = mysql_query( $query, $this->dbh );
}
}
$this->num_queries ++;
return $this;
}
/**
* Return only one row from result
*
* @return $1|false|mixed|object|stdClass|null
*/
public function get_one_row() {
/* @codingStandardsIgnoreLine */
if ( $this->use_mysqli && $this->result instanceof mysqli_result ) {
/* @codingStandardsIgnoreLine */
return mysqli_fetch_object( $this->result );
} elseif ( is_resource( $this->result ) ) {
/* @codingStandardsIgnoreLine */
return mysql_fetch_object( $this->result );
}
return null;
}
/**
* count results
*
* @return mixed
*/
public function num_rows() {
return $this->result->num_rows;
}
}

View File

@@ -0,0 +1,12 @@
{
"name": "thrive-themes/thrive-dashboard",
"description": "The thrive dashboard",
"type": "project",
"autoload": {
"psr-4": {
"Thrive_Dashboard\\Font_Library\\": "inc/font-library/classes/",
"Thrive_Dashboard\\Font_Library\\Interfaces\\": "inc/font-library/interfaces/"
}
},
"require": {}
}

View File

@@ -0,0 +1,18 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "1cea552656b4d4ff62908fbfd4a41724",
"packages": [],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": {},
"prefer-stable": false,
"prefer-lowest": false,
"platform": {},
"platform-dev": {},
"plugin-api-version": "2.6.0"
}

View File

@@ -0,0 +1,7 @@
Copyright 2014 Amsul, http://amsul.ca
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -0,0 +1,27 @@
// Copyright (c) 2014 The Polymer Authors. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@@ -0,0 +1 @@
.notice.tve-dashboard-license-message{border-left-color:#f4791c;color:#3c434a !important;font-size:13px !important;padding:20px 25px 20px 0;background-repeat:no-repeat;background-position:30px center;background-size:85px;display:grid;grid-template-columns:145px 1fr;grid-template-rows:repeat(3, min-content);align-items:center;justify-content:center}.notice.tve-dashboard-license-message .notice-dismiss:hover:before{color:#f4791c}.notice.tve-dashboard-license-message svg{width:90px;height:80px;grid-row:1/span 3;justify-self:center;align-self:flex-start;color:#f4791c}.notice.tve-dashboard-license-message.tvd-expired{border-left-color:#e32627}.notice.tve-dashboard-license-message.tvd-expired svg{color:#e32627}.notice.tve-dashboard-license-message.tvd-expired .notice-dismiss:hover:before{color:#e32627}.notice.tve-dashboard-license-message h4:not(#_){font-size:13px;font-weight:bold;color:#3c434a;margin:0}.notice.tve-dashboard-license-message p:not(#_){margin:0;padding:0;font-size:13px;color:#3c434a;line-height:1.46}.notice.tve-dashboard-license-message div{text-align:right}.notice.tve-dashboard-license-message div a{margin-right:50px;text-decoration:none}.notice.tve-dashboard-license-message div a.tve-license-link{cursor:pointer;width:130px;height:29px;border-radius:3px;background-color:#46a31d;display:inline-flex;align-items:center;justify-content:center;font-size:13px;font-weight:500;color:#fff !important;border-color:#46a31d;margin-right:0}

View File

@@ -0,0 +1,732 @@
<svg style="position: absolute; width: 0; height: 0; overflow: hidden;" version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<symbol id="icon-tvd-ct-symbols-icon" viewBox="0 0 32 32">
<title>templatesnsymbols</title>
<path fill="#42b265" style="fill: var(--color1, #42b265)"
d="M18.631 10.311c-4.267 0-7.751 3.484-7.751 7.751 0 1.316 0.32 2.56 0.889 3.627 0.036 0.071 0.071 0.107 0.107 0.178 1.351 2.347 3.876 3.947 6.756 3.947 4.267 0 7.751-3.484 7.751-7.751 0.036-4.302-3.449-7.751-7.751-7.751zM24.64 21.013h-1.636c0.213-0.782 0.32-1.671 0.356-2.596h1.956c-0.036 0.924-0.284 1.813-0.676 2.596zM12.622 15.147h1.6c-0.178 0.711-0.284 1.458-0.32 2.24h-1.956c0.107-0.818 0.32-1.564 0.676-2.24zM19.271 14.080v-2.56c0.924 0.32 1.742 1.244 2.276 2.56h-2.276zM21.938 15.147c0.178 0.676 0.32 1.458 0.391 2.24h-3.022v-2.24h2.631zM18.24 11.449v2.631h-2.524c0.604-1.422 1.493-2.418 2.524-2.631zM18.24 15.147v2.24h-3.271c0.036-0.782 0.178-1.529 0.391-2.24h2.88zM11.947 18.418h1.956c0.036 0.924 0.142 1.778 0.356 2.596h-1.636c-0.391-0.782-0.64-1.671-0.676-2.596zM14.969 18.418h3.271v2.596h-2.88c-0.249-0.782-0.391-1.671-0.391-2.596zM18.24 22.044v2.596c-0.996-0.213-1.92-1.209-2.524-2.596h2.524zM19.271 24.604v-2.56h2.276c-0.533 1.316-1.351 2.24-2.276 2.56zM19.271 21.013v-2.596h3.058c-0.036 0.924-0.178 1.778-0.391 2.596h-2.667zM23.36 17.351c-0.036-0.782-0.142-1.529-0.32-2.24h1.636c0.32 0.676 0.569 1.422 0.64 2.24h-1.956zM24.036 14.080h-1.316c-0.284-0.782-0.64-1.458-1.067-2.027 0.924 0.498 1.742 1.173 2.382 2.027zM15.609 12.089c-0.427 0.569-0.782 1.244-1.067 1.991h-1.316c0.64-0.853 1.458-1.529 2.382-1.991zM13.262 22.044h1.316c0.284 0.747 0.64 1.422 1.067 1.991-0.96-0.462-1.778-1.138-2.382-1.991zM21.653 24.036c0.427-0.569 0.782-1.244 1.067-1.991h1.316c-0.64 0.853-1.458 1.529-2.382 1.991z"></path>
<path fill="#333" style="fill: var(--color2, #333)"
d="M30.578 4.764h-3.236v-2.951c0-0.782-0.64-1.422-1.422-1.422h-24.498c-0.782 0-1.422 0.64-1.422 1.422v24.996c0 0.782 0.64 1.422 1.422 1.422h3.236v1.956c0 0.782 0.64 1.422 1.422 1.422h24.498c0.782 0 1.422-0.64 1.422-1.422v-24c0-0.782-0.64-1.422-1.422-1.422zM30.933 30.187c0 0.213-0.178 0.356-0.356 0.356h-24.498c-0.213 0-0.356-0.178-0.356-0.356v-7.644h-1.067v4.622h-3.236c-0.213 0-0.356-0.178-0.356-0.356v-24.996c0-0.213 0.178-0.356 0.356-0.356h24.498c0.213 0 0.356 0.178 0.356 0.356v2.916h-4.907v1.067h9.209c0.213 0 0.356 0.178 0.356 0.356v24.036z"></path>
<path fill="#333" style="fill: var(--color2, #333)" d="M10.098 4.764h5.12v1.067h-5.12v-1.067z"></path>
<path fill="#333" style="fill: var(--color2, #333)" d="M16.462 4.764h3.947v1.067h-3.947v-1.067z"></path>
<path fill="#333" style="fill: var(--color2, #333)" d="M4.658 15.431h1.067v5.12h-1.067v-5.12z"></path>
<path fill="#333" style="fill: var(--color2, #333)" d="M4.658 10.453h1.067v3.769h-1.067v-3.769z"></path>
<path fill="#333" style="fill: var(--color2, #333)"
d="M3.769 8.996h4.836v-4.8h-4.836v4.8zM4.836 5.227h2.702v2.702h-2.702v-2.702z"></path>
</symbol>
<symbol id="icon-tvd-icon-exchange" viewBox="0 0 32 32">
<title>API_connections</title>
<path fill="#42b265" style="fill: var(--color1, #42b265)"
d="M17.707 18.524c-0.249 0.178-0.284 0.533-0.107 0.782 0.107 0.142 0.284 0.213 0.427 0.213 0.107 0 0.249-0.036 0.356-0.107l3.769-2.951-3.769-3.129c-0.249-0.178-0.569-0.178-0.782 0.071s-0.178 0.569 0.071 0.782l2.204 1.813h-10.133v1.102h9.778l-1.813 1.422z"></path>
<path fill="#42b265" style="fill: var(--color1, #42b265)"
d="M14.4 19.413c0.249-0.178 0.284-0.533 0.107-0.782s-0.533-0.284-0.782-0.107l-3.769 2.951 3.769 3.093c0.107 0.071 0.213 0.142 0.356 0.142s0.32-0.071 0.427-0.213c0.178-0.249 0.178-0.569-0.071-0.782l-1.813-1.493h9.28v-1.102h-9.742l2.24-1.707z"></path>
<path fill="#333" style="fill: var(--color2, #333)"
d="M5.191 7.111c0.427 0 0.747-0.32 0.747-0.747 0-0.391-0.32-0.747-0.747-0.747s-0.747 0.32-0.747 0.747c-0.036 0.427 0.32 0.747 0.747 0.747z"></path>
<path fill="#333" style="fill: var(--color2, #333)"
d="M3.627 6.364c0 0.412-0.334 0.747-0.747 0.747s-0.747-0.334-0.747-0.747c0-0.412 0.334-0.747 0.747-0.747s0.747 0.334 0.747 0.747z"></path>
<path fill="#333" style="fill: var(--color2, #333)"
d="M8.249 6.364c0 0.412-0.334 0.747-0.747 0.747s-0.747-0.334-0.747-0.747c0-0.412 0.334-0.747 0.747-0.747s0.747 0.334 0.747 0.747z"></path>
<path fill="#333" style="fill: var(--color2, #333)"
d="M30.009 3.413h-28.018c-1.067 0-1.956 0.889-1.956 1.956v21.262c0 1.067 0.889 1.956 1.956 1.956h28.018c1.067 0 1.956-0.889 1.956-1.956v-21.262c0-1.067-0.889-1.956-1.956-1.956zM1.991 4.48h28.018c0.498 0 0.889 0.391 0.889 0.889v2.809h-29.796v-2.809c0-0.498 0.391-0.889 0.889-0.889zM30.009 27.52h-28.018c-0.498 0-0.889-0.391-0.889-0.889v-17.387h29.796v17.387c0 0.498-0.391 0.889-0.889 0.889z"></path>
</symbol>
<symbol id="icon-tvd-icon-rocket" viewBox="0 0 32 32">
<title>retina_icons</title>
<path fill="#396" style="fill: var(--color1, #396)"
d="M11.769 13.511l-2.062-1.813-8.604 8.498 0.747 0.747 7.893-7.787 1.244 1.067v0.711h1.422v-1.422z"></path>
<path fill="#42b265" style="fill: var(--color2, #42b265)"
d="M15.182 14.862h1.351v1.351h-1.351v-1.351z"></path>
<path fill="#42b265" style="fill: var(--color2, #42b265)"
d="M20.978 17.956h1.351v1.351h-1.351v-1.351z"></path>
<path fill="#42b265" style="fill: var(--color2, #42b265)"
d="M19.484 16.462h1.351v1.351h-1.351v-1.351z"></path>
<path fill="#42b265" style="fill: var(--color2, #42b265)"
d="M22.4 19.342h1.351v1.351h-1.351v-1.351z"></path>
<path fill="#42b265" style="fill: var(--color2, #42b265)"
d="M17.991 14.862h1.351v1.351h-1.351v-1.351z"></path>
<path fill="#42b265" style="fill: var(--color2, #42b265)"
d="M16.604 13.44h1.351v1.351h-1.351v-1.351z"></path>
<path fill="#42b265" style="fill: var(--color2, #42b265)"
d="M12.302 17.742h1.351v1.351h-1.351v-1.351z"></path>
<path fill="#42b265" style="fill: var(--color2, #42b265)"
d="M10.702 19.164h1.778v1.351h-1.778v-1.351z"></path>
<path fill="#42b265" style="fill: var(--color2, #42b265)"
d="M13.796 14.933h-1.387v1.422h1.316v1.316h1.351v-1.351h-1.28z"></path>
<path fill="#333" style="fill: var(--color2, #333)"
d="M6.258 5.724h-0.178c-1.209 0-2.24 0.996-2.24 2.24v0.178c0 1.209 0.996 2.24 2.24 2.24h0.178c1.209 0 2.24-0.996 2.24-2.24v-0.178c0-1.244-0.996-2.24-2.24-2.24zM7.431 8.107c0 0.64-0.533 1.173-1.173 1.173h-0.178c-0.64 0-1.173-0.533-1.173-1.173v-0.178c0-0.64 0.533-1.173 1.173-1.173h0.178c0.64 0 1.173 0.533 1.173 1.173v0.178z"></path>
<path fill="#333" style="fill: var(--color3, #333)"
d="M30.933 29.76l-4.978-5.156c1.493-1.671 2.418-3.876 2.418-6.258 0-3.093-1.493-5.831-3.804-7.502v-8.142c0-1.458-1.209-2.667-2.667-2.667h-18.524c-1.458 0-2.667 1.209-2.667 2.667v18.524c0 1.458 1.209 2.667 2.667 2.667h8.178c1.707 2.311 4.444 3.804 7.502 3.804 1.742 0 3.378-0.498 4.764-1.316l5.049 5.049c0.356 0.356 0.747 0.569 1.173 0.569 0.107 0 0.178 0 0.284-0.036 0.462-0.107 0.782-0.391 0.924-0.818 0.107-0.498 0-1.067-0.32-1.387zM3.378 22.827c-0.889 0-1.6-0.711-1.6-1.6v-18.524c0-0.889 0.711-1.6 1.6-1.6h18.524c0.889 0 1.6 0.711 1.6 1.6v7.467c-1.316-0.711-2.844-1.138-4.444-1.138-5.156 0-9.316 4.196-9.316 9.316 0 1.636 0.427 3.129 1.138 4.48h-7.502zM12.089 22.827c-0.818-1.28-1.316-2.809-1.316-4.48 0-4.551 3.698-8.249 8.249-8.249 1.636 0 3.164 0.498 4.444 1.316v0 0c0 0 0 0 0 0v0 9.813c0 0.889-0.711 1.6-1.6 1.6h-9.778zM19.058 26.596c-2.418 0-4.622-1.067-6.116-2.738h8.996c1.458 0 2.667-1.209 2.667-2.667v-8.996c1.671 1.529 2.738 3.698 2.738 6.151-0.036 4.551-3.733 8.249-8.284 8.249zM30.187 30.791c0 0.036-0.036 0.071-0.107 0.071-0.178 0.036-0.356-0.107-0.462-0.213l-4.907-4.907c0.178-0.107 0.32-0.249 0.462-0.391l4.978 5.12c0.071 0.071 0.107 0.213 0.036 0.32z"></path>
</symbol>
<symbol id="icon-tvd-icon-cogs" viewBox="0 0 32 32">
<title>general_settings</title>
<path fill="#333" style="fill: var(--color1, #333)" d="M10.667 17.422h11.022v1.067h-11.022v-1.067z"></path>
<path fill="#42b265" style="fill: var(--color2, #42b265)"
d="M12.693 16.747h2.24v2.489h-2.24v-2.489z"></path>
<path fill="#333" style="fill: var(--color1, #333)"
d="M29.191 17.742c0.142-1.209 0.142-2.418-0.036-3.627l2.88-2.667-0.107-0.32c-0.32-1.067-0.782-2.133-1.316-3.129l-0.178-0.284-3.911 0.249c-0.747-0.96-1.6-1.813-2.596-2.56l0.178-3.947-0.391-0.213c-0.107-0.071-0.249-0.142-0.356-0.178-0.818-0.391-1.707-0.747-2.667-1.031l-0.32-0.107-2.596 2.987c-1.209-0.142-2.418-0.142-3.627 0.036l-2.667-2.88-0.32 0.107c-1.067 0.356-2.133 0.782-3.093 1.316l-0.284 0.178 0.213 3.911c-0.96 0.747-1.813 1.636-2.56 2.596l-3.911-0.142-0.213 0.427c-0.071 0.107-0.107 0.213-0.178 0.32-0.427 0.853-0.747 1.742-1.031 2.667l-0.107 0.32 2.951 2.596c-0.142 1.209-0.142 2.418 0.036 3.627l-2.88 2.667 0.107 0.32c0.32 1.067 0.782 2.133 1.316 3.129l0.178 0.284 3.911-0.249c0.747 0.96 1.6 1.813 2.596 2.56l-0.178 3.947 0.427 0.213c0.107 0.071 0.213 0.107 0.356 0.178 0.853 0.427 1.742 0.747 2.667 1.031l0.32 0.107 2.596-2.951c1.209 0.142 2.418 0.142 3.627-0.036l2.667 2.88 0.32-0.107c1.067-0.32 2.098-0.782 3.129-1.316l0.284-0.178-0.249-3.947c0.96-0.747 1.813-1.6 2.56-2.596l3.911 0.178 0.213-0.391c0.071-0.107 0.142-0.249 0.178-0.391 0.427-0.853 0.747-1.742 1.031-2.667l0.107-0.32-2.987-2.596zM30.044 22.898c-0.036 0.036-0.036 0.107-0.071 0.142l-3.84-0.142-0.142 0.213c-0.747 1.067-1.671 1.991-2.702 2.773l-0.249 0.178 0.213 3.84c-0.747 0.391-1.529 0.711-2.311 0.996l-2.596-2.809h-0.249c-1.28 0.213-2.596 0.249-3.876 0.036l-0.32-0.036-2.524 2.88c-0.747-0.249-1.493-0.533-2.169-0.853-0.036-0.036-0.107-0.036-0.142-0.071l0.178-3.84-0.249-0.178c-1.067-0.747-1.991-1.671-2.773-2.702l-0.178-0.249-3.804 0.249c-0.391-0.747-0.711-1.529-0.96-2.311l2.809-2.596-0.036-0.284c-0.213-1.28-0.249-2.596-0.036-3.876l0.036-0.284-2.844-2.524c0.213-0.782 0.498-1.493 0.853-2.204 0.036-0.036 0.036-0.071 0.071-0.142l3.84 0.142 0.178-0.249c0.747-1.067 1.671-1.991 2.702-2.773l0.249-0.178-0.249-3.804c0.747-0.391 1.493-0.711 2.311-0.996l2.596 2.809 0.284-0.036c1.28-0.213 2.631-0.249 3.876-0.036l0.284 0.036 2.524-2.88c0.782 0.249 1.493 0.533 2.169 0.853 0.036 0.036 0.107 0.036 0.142 0.071l-0.178 3.84 0.249 0.178c1.067 0.747 1.991 1.671 2.773 2.702l0.178 0.249 3.804-0.213c0.391 0.747 0.711 1.529 0.96 2.311l-2.809 2.596 0.036 0.284c0.213 1.316 0.213 2.596 0.036 3.876l-0.036 0.284 2.844 2.524c-0.213 0.782-0.498 1.493-0.853 2.204z"></path>
<path fill="#333" style="fill: var(--color1, #333)"
d="M16 5.867c-2.738 0-5.298 1.031-7.253 2.951s-3.022 4.409-2.987 7.111c0 5.582 4.622 10.027 10.24 10.027v0c2.738 0 5.298-0.96 7.253-2.88 1.92-1.92 2.987-4.373 2.987-7.076 0.036-5.582-4.587-10.133-10.24-10.133zM22.507 22.4c-1.742 1.707-4.053 2.667-6.507 2.667v0c-4.978 0-9.173-4.089-9.173-9.067 0-2.418 0.96-4.693 2.702-6.4s4.053-2.667 6.507-2.667c5.049 0 9.173 4.053 9.173 9.067 0 2.418-0.96 4.693-2.702 6.4z"></path>
<path fill="#333" style="fill: var(--color1, #333)"
d="M19.093 12.729h-2.489v0.782h-5.938v1.067h5.902v0.64h2.489v-0.64h2.631v-1.067h-2.596v-0.782zM18.382 14.507h-1.067v-1.067h1.067v1.067z"></path>
</symbol>
<symbol id="icon-tvd-growth-tools" width="80" height="80" viewBox="0 0 80 80" fill="none" xmlns="http://www.w3.org/2000/svg">
<title>Growth_Tools</title>
<path d="M22.8182 30.8851C23.1062 29.9738 23.1782 29.008 23.0287 28.0641C22.8793 27.1202 22.5123 26.2239 21.9569 25.4462C21.4014 24.6685 20.6727 24.0307 19.8284 23.583C18.984 23.1354 18.0471 22.8903 17.0917 22.867C12.1443 22.7942 7.27589 24.1119 3.04069 26.6702C5.86478 30.7323 9.77255 33.92 14.3192 35.8704C15.201 36.2389 16.1565 36.3973 17.1101 36.333C18.0637 36.2687 18.9891 35.9834 19.8135 35.4998C20.6378 35.0162 21.3385 34.3476 21.8599 33.5466C22.3815 32.7459 22.7095 31.8346 22.8182 30.8851Z" fill="white" stroke="#333333" stroke-width="3"/>
<path d="M33.6446 21.8086C34.5632 21.5445 35.4075 21.0704 36.1113 20.4239C36.8152 19.7773 37.3589 18.9759 37.6997 18.083C38.0405 17.1902 38.1689 16.2303 38.0748 15.2792C37.9807 14.3282 37.6669 13.4121 37.1578 12.6032C34.4824 8.44104 30.692 5.1137 26.2183 3C24.3958 7.59944 23.9012 12.6181 24.7908 17.4848C24.9715 18.4233 25.368 19.3069 25.9489 20.0658C26.5298 20.8247 27.2793 21.438 28.1381 21.8574C28.9969 22.2768 29.9415 22.4907 30.8972 22.4822C31.8529 22.4738 32.7935 22.2431 33.6446 21.8086Z" fill="white" stroke="#333333" stroke-width="3"/>
<path d="M29.0294 42.7181C28.6247 41.8522 28.0242 41.0925 27.2754 40.4988C26.5265 39.9048 25.6499 39.4934 24.7146 39.2967C23.7794 39.1 22.8113 39.1236 21.8867 39.3654C20.9622 39.6075 20.1065 40.0611 19.3874 40.6905C15.6957 43.9848 13.0033 48.2498 11.6165 52.9993C16.4446 54.0786 21.4789 53.781 26.1461 52.1398C27.0447 51.8145 27.8553 51.2845 28.5138 50.5919C29.1723 49.8992 29.6607 49.0628 29.9404 48.149C30.2201 47.2352 30.2833 46.2685 30.1253 45.3262C29.9671 44.3836 29.592 43.4908 29.0294 42.7181Z" fill="white" stroke="#333333" stroke-width="3"/>
<path d="M57.9381 31.4189C57.65 30.5076 57.5778 29.5418 57.7272 28.5979C57.8765 27.654 58.2433 26.7577 58.7986 25.9799C59.354 25.2021 60.0826 24.5641 60.9269 24.1163C61.7711 23.6686 62.708 23.4233 63.6634 23.3999C68.6108 23.3263 73.4794 24.6433 77.715 27.2009C74.8915 31.2635 70.9843 34.4517 66.4379 36.4029C65.5561 36.7715 64.6007 36.93 63.6471 36.8659C62.6935 36.8017 61.768 36.5166 60.9436 36.0331C60.1192 35.5496 59.4184 34.8812 58.8968 34.0802C58.3752 33.2796 58.047 32.3684 57.9381 31.4189Z" stroke="#42B265" stroke-width="3"/>
<path d="M48.3536 21.8086C47.435 21.5445 46.5907 21.0704 45.8869 20.4239C45.1831 19.7773 44.6393 18.9759 44.2985 18.083C43.9578 17.1902 43.8293 16.2303 43.9234 15.2792C44.0175 14.3282 44.3313 13.4121 44.8405 12.6032C47.5158 8.44104 51.3063 5.1137 55.78 3C57.6024 7.59944 58.0971 12.6181 57.2075 17.4848C57.0268 18.4233 56.6303 19.3069 56.0494 20.0658C55.4684 20.8247 54.7189 21.438 53.8601 21.8574C53.0013 22.2768 52.0568 22.4907 51.1011 22.4822C50.1454 22.4738 49.2048 22.2431 48.3536 21.8086Z" fill="white" stroke="#333333" stroke-width="3"/>
<path d="M51.9718 43.538C52.3409 42.6563 52.9099 41.8728 53.6339 41.249C54.3579 40.625 55.217 40.1782 56.1435 39.9435C57.0699 39.7088 58.0382 39.6929 58.9719 39.8968C59.9055 40.101 60.7789 40.5192 61.5231 41.1188C65.3461 44.2598 68.2103 48.4114 69.7897 53.1003C65.0096 54.3757 59.9674 54.2837 55.2371 52.8343C54.326 52.5459 53.4945 52.0494 52.8082 51.3842C52.122 50.719 51.5999 49.9032 51.2832 49.0016C50.9665 48.0999 50.8639 47.1367 50.9833 46.1887C51.1029 45.2404 51.4413 44.3331 51.9718 43.538Z" fill="white" stroke="#333333" stroke-width="3"/>
<path d="M33.5919 78.0001C33.9194 67.0044 36.7159 57.7368 36.9402 50.1972C37.0881 45.2219 37.3373 42.7136 33.5919 39.6259C31.9846 38.0449 26.9799 33.6001 26.7152 33.172C26.235 32.3951 26.6873 31.1556 27.0284 30.8275C27.7042 30.1642 28.717 29.9147 29.7357 30.478C30.2169 30.8202 30.5796 31.0558 30.9335 31.2882L30.9727 31.314L31.0316 31.3527L31.0895 31.3909C31.1007 31.3983 31.1119 31.4057 31.1231 31.4132L31.1568 31.4355C31.6966 31.7938 32.2691 32.1947 33.2594 33.0013C35.1514 34.5424 36.7021 36.1687 37.3373 36.8381C37.4677 32.4485 37.5598 29.3355 37.6139 27.5009C37.6126 27.0895 37.6115 26.5694 37.6113 25.8336L37.6113 25.6461C37.6113 25.0677 38.1545 23.6196 40.1646 23.6196C40.1984 23.6196 40.2317 23.62 40.2647 23.6207L40.3048 23.62L40.3646 23.6196C42.3747 23.6196 42.9179 25.0677 42.9179 25.6461C42.9179 27.2465 42.9138 27.8878 42.9116 28.5025L42.9112 28.6008C42.9107 28.7729 42.9103 28.9467 42.9103 29.1429L42.9103 29.2846L42.9103 29.3199C42.9106 29.9006 42.9137 30.6953 42.9221 32.1318C42.9219 32.1477 42.9217 32.1636 42.9215 32.1794C42.9316 33.6462 42.9422 35.2999 42.9531 37.0872C43.3192 36.7126 45.0621 34.7996 47.2698 33.0013C48.2602 32.1947 48.8326 31.7938 49.3724 31.4355L49.4061 31.4132C49.4173 31.4057 49.4285 31.3983 49.4397 31.3909L49.4976 31.3527C49.8834 31.0985 50.2678 30.8519 50.7935 30.478C51.8122 29.9147 52.825 30.1642 53.5009 30.8275C53.842 31.1556 54.2943 32.3951 53.814 33.172C53.5494 33.6001 48.5447 38.0449 46.9373 39.6259C42.9215 43.2344 43.2227 44.8624 43.0454 49.5439C43.2346 54.7397 46.3141 64.2249 46.9373 78.0001H33.5919Z" fill="white" stroke="#333333" stroke-width="3"/>
</symbol>
<symbol id="icon-tvd-icon-notification" viewBox="0 0 32 32">
<title>notification_manager</title>
<path fill="#fff" style="fill: var(--color1, #fff)"
d="M30.044 5.938h-27.982c-0.782 0-1.316 0.533-1.316 1.316v16.96c0 0.782 0.533 1.6 1.316 1.6h19.484c0 0 0.036 0.071 0.036 0.178 0.249 3.307-2.062 4.8-2.062 4.8s3.413-0.391 5.547-3.058c0.533-0.64 0.782-1.529 0.924-1.884h4.124c0.782 0 1.564-0.818 1.564-1.6v-16.996c-0.071-0.782-0.853-1.316-1.636-1.316z"></path>
<path fill="#333" style="fill: var(--color2, #333)"
d="M17.244 31.573l1.956-1.28c0.107-0.071 1.956-1.351 1.849-4.124h-18.987c-1.102 0-2.027-0.889-2.027-1.92v-16.996c0-1.067 0.96-2.027 2.027-2.027h28.018c1.067 0 1.92 0.924 1.92 2.027v16.96c0 1.102-0.853 1.92-1.92 1.92h-3.698c-0.178 0.604-0.462 1.173-0.924 1.742-2.24 2.809-5.724 3.307-5.867 3.342l-2.347 0.356zM2.062 6.293c-0.498 0-0.96 0.462-0.96 0.96v16.96c0 0.462 0.462 0.889 0.96 0.889h19.484c0.498 0 0.533 0.498 0.569 0.711v0.036c0.142 1.707-0.356 2.987-0.924 3.84 1.067-0.427 2.418-1.173 3.449-2.453 0.462-0.569 0.711-1.102 0.818-1.707l0.071-0.427h4.551c0.498 0 0.853-0.391 0.853-0.889v-16.96c0-0.533-0.391-0.96-0.853-0.96h-28.018z"></path>
<path fill="#333" style="fill: var(--color2, #333)" d="M3.236 15.858h12.053v1.067h-12.053v-1.067z"></path>
<path fill="#333" style="fill: var(--color2, #333)" d="M3.236 18.524h15.964v1.067h-15.964v-1.067z"></path>
<path fill="#333" style="fill: var(--color2, #333)" d="M3.236 21.191h15.964v1.067h-15.964v-1.067z"></path>
<path fill="#42b265" style="fill: var(--color3, #42b265)"
d="M29.049 12.658c0-0.107-0.036-0.213-0.107-0.284-0.498-0.498-0.853-1.067-1.102-1.707-0.178-0.533-0.249-1.067-0.249-1.636-0.036-0.996-0.036-1.991-0.142-2.951-0.071-0.711-0.178-1.387-0.498-2.027s-0.782-1.138-1.351-1.564c-0.427-0.284-0.853-0.462-1.316-0.604 0.071-0.142 0.107-0.284 0.107-0.427 0-0.569-0.462-1.031-1.031-1.031s-1.031 0.462-1.031 1.031c0 0.142 0.036 0.284 0.107 0.427-0.853 0.249-1.529 0.604-2.098 1.209-0.462 0.498-0.747 1.067-0.924 1.671-0.213 0.711-0.249 1.458-0.284 2.204-0.036 0.818-0.036 1.671-0.071 2.489-0.036 1.031-0.462 1.956-1.173 2.738-0.213 0.249-0.32 0.462-0.284 0.782 0.036 0.178 0 0.178 0.213 0.178 3.698 0 7.396 0 11.129 0 0.036 0 0.036 0 0.071 0 0.071 0 0.107-0.036 0.107-0.107-0.071-0.107-0.071-0.249-0.071-0.391z"></path>
<path fill="#42b265" style="fill: var(--color3, #42b265)"
d="M23.324 16c1.031 0 1.884-0.853 1.884-1.884h-3.804c0 1.067 0.853 1.884 1.92 1.884z"></path>
</symbol>
<symbol id="icon-tvd-nm-icon-code" viewBox="0 0 32 32">
<title>lps_analytics_scripts</title>
<path fill="#333" style="fill: var(--color1, #333)"
d="M31.787 13.333c-0.284-0.071-0.569 0.142-0.64 0.427l-1.813 8.818c-0.071 0.284 0.142 0.569 0.427 0.64 0.036 0 0.071 0 0.107 0 0.249 0 0.462-0.178 0.533-0.427l1.813-8.818c0.071-0.32-0.142-0.604-0.427-0.64z"></path>
<path fill="#333" style="fill: var(--color1, #333)"
d="M28.124 16.071c-0.178-0.213-0.533-0.249-0.747-0.071l-2.773 2.311 2.773 2.169c0.107 0.071 0.213 0.107 0.32 0.107 0.142 0 0.32-0.071 0.427-0.213 0.178-0.249 0.142-0.569-0.107-0.747l-1.707-1.351 1.778-1.458c0.213-0.178 0.249-0.498 0.036-0.747z"></path>
<path fill="#333" style="fill: var(--color1, #333)"
d="M5.191 5.653c-0.427 0-0.747 0.32-0.747 0.747 0 0.391 0.32 0.747 0.747 0.747s0.747-0.32 0.747-0.747c0-0.427-0.356-0.747-0.747-0.747z"></path>
<path fill="#333" style="fill: var(--color1, #333)"
d="M3.627 6.364c0 0.412-0.334 0.747-0.747 0.747s-0.747-0.334-0.747-0.747c0-0.412 0.334-0.747 0.747-0.747s0.747 0.334 0.747 0.747z"></path>
<path fill="#333" style="fill: var(--color1, #333)"
d="M8.249 6.364c0 0.412-0.334 0.747-0.747 0.747s-0.747-0.334-0.747-0.747c0-0.412 0.334-0.747 0.747-0.747s0.747 0.334 0.747 0.747z"></path>
<path fill="#333" style="fill: var(--color1, #333)"
d="M30.898 26.631c0 0.498-0.391 0.889-0.889 0.889h-28.018c-0.498 0-0.889-0.391-0.889-0.889v-17.387h29.796v2.204h1.067v-6.080c0-1.067-0.889-1.956-1.956-1.956h-28.018c-1.067 0-1.956 0.889-1.956 1.956v21.262c0 1.067 0.889 1.956 1.956 1.956h28.018c1.067 0 1.956-0.889 1.956-1.956v-1.813h-1.067v1.813zM1.102 5.369c0-0.498 0.391-0.889 0.889-0.889h28.018c0.498 0 0.889 0.391 0.889 0.889v2.809h-29.796v-2.809z"></path>
<path fill="#333" style="fill: var(--color1, #333)"
d="M3.378 11.804v13.369h18.667v-1.067h-17.6v-12.302z"></path>
<path fill="#333" style="fill: var(--color1, #333)" d="M6.258 21.724h1.067v1.493h-1.067v-1.493z"></path>
<path fill="#333" style="fill: var(--color1, #333)" d="M8.924 20.658h1.067v2.56h-1.067v-2.56z"></path>
<path fill="#333" style="fill: var(--color1, #333)" d="M11.556 19.591h1.067v3.627h-1.067v-3.627z"></path>
<path fill="#333" style="fill: var(--color1, #333)" d="M14.222 18.027h1.067v5.191h-1.067v-5.191z"></path>
<path fill="#333" style="fill: var(--color1, #333)" d="M16.853 15.396h1.067v7.822h-1.067v-7.822z"></path>
<path fill="#42b265" style="fill: var(--color2, #42b265)"
d="M18.702 14.009l-0.533-2.24-2.382 0.569c-0.284 0.071-0.462 0.356-0.391 0.64s0.356 0.462 0.64 0.391l0.462-0.107c-2.56 3.52-5.796 5.44-10.133 5.973-0.284 0.036-0.498 0.32-0.462 0.604s0.249 0.462 0.533 0.462c0.036 0 0.036 0 0.071 0 4.658-0.604 8.284-2.773 11.022-6.613l0.142 0.569c0.071 0.249 0.284 0.427 0.533 0.427 0.036 0 0.071 0 0.142 0 0.249-0.107 0.427-0.391 0.356-0.676z"></path>
</symbol>
<symbol id="icon-tvd-coming-soon" viewBox="0 0 90 73">
<g fill="none" fill-rule="evenodd">
<g fill-rule="nonzero">
<g>
<g>
<g fill="#333">
<g>
<path d="M86.995 68.15L87 68V5c0-1.054-.816-1.918-1.85-1.995L85 3H5c-1.054 0-1.918.816-1.995 1.85L3 5v63c0 1.054.816 1.918 1.85 1.995L5 70v3c-2.761 0-5-2.239-5-5V5c0-2.761 2.239-5 5-5h80c2.761 0 5 2.239 5 5v63c0 2.761-2.239 5-5 5v-3c1.054 0 1.918-.816 1.995-1.85z" transform="translate(-168.000000, -68.000000) translate(35.000000, 16.000000) translate(133.000000, 52.000000)"/>
<g transform="translate(-168.000000, -68.000000) translate(35.000000, 16.000000) translate(133.000000, 52.000000) translate(7.000000, 6.031236)">
<circle cx="1.257" cy="1.257" r="1.257"/>
<circle cx="6.785" cy="1.257" r="1.257"/>
<circle cx="12.314" cy="1.257" r="1.257"/>
</g>
<path d="M7 12L83 12 83 15 7 15zM73 6L83 6 83 9 73 9z" transform="translate(-168.000000, -68.000000) translate(35.000000, 16.000000) translate(133.000000, 52.000000)"/>
</g>
</g>
<path fill="#42B265"
d="M69.081 61.03L56.933 48.874c-1.523-1.523-3.525-2.285-5.527-2.285-1.504 0-3.008.43-4.307 1.299l-8.35-8.348v-7.167L26.25 23 20 29.249l9.375 12.497h7.168l8.35 8.348c-2.013 3.037-1.68 7.157.995 9.832l12.158 12.156c.606.606 1.406.918 2.207.918.801 0 1.602-.303 2.207-.918l6.631-6.63c1.21-1.23 1.21-3.202-.01-4.422zM35.625 38.436v.186h-4.688l-6.806-9.08 2.412-2.412 9.082 6.805v4.501zm24.618 31.43L48.095 57.71c-.888-.888-1.377-2.06-1.377-3.31s.489-2.431 1.377-3.31c.889-.888 2.06-1.376 3.31-1.376s2.432.488 3.311 1.376l12.158 12.146-6.63 6.63zM26.25 65.179c0 .86.703 1.562 1.562 1.562.86 0 1.563-.703 1.563-1.562 0-.859-.703-1.562-1.563-1.562-.859 0-1.562.703-1.562 1.562zm20.78-35.647c2.218-2.216 5.137-3.408 8.184-3.408.674 0 1.348.059 2.022.176l-6.768 6.776 1.348 8.104 8.115 1.347 6.767-6.766c.655 3.73-.517 7.499-3.232 10.203-.869.87-1.865 1.562-2.93 2.1l2.305 2.304c1.016-.606 1.973-1.328 2.832-2.197 3.691-3.69 5.146-8.924 3.877-13.992-.225-.927-.947-1.66-1.865-1.913-.928-.254-1.924 0-2.608.683l-6.24 6.24-4.316-.723-.723-4.316 6.24-6.239c.674-.674.938-1.67.684-2.587-.254-.928-.996-1.64-1.924-1.875-5.049-1.26-10.283.186-13.984 3.876-1.26 1.26-2.236 2.724-2.94 4.296v6.62l2.159 2.158c-.938-3.945.156-8.026 2.998-10.867zM30.45 68.606c-1.621 1.621-4.453 1.621-6.074 0-1.67-1.67-1.67-4.403 0-6.073L38.642 48.27l-2.207-2.207-14.267 14.265c-2.89 2.89-2.89 7.596 0 10.496 1.396 1.396 3.262 2.167 5.244 2.167 1.982 0 3.848-.771 5.244-2.177l9.941-9.93c-.654-.898-1.152-1.884-1.513-2.91L30.449 68.607z"
transform="translate(-168.000000, -68.000000) translate(35.000000, 16.000000) translate(133.000000, 52.000000)"/>
</g>
</g>
</g>
</g>
</symbol>
<symbol id="icon-tvd-icon-font" viewBox="0 0 32 32">
<title>custom_fonts</title>
<path fill="#fff" stroke="#333" stroke-width="1.0667" stroke-miterlimit="10" stroke-linecap="butt"
stroke-linejoin="miter" style="stroke: var(--color3, #333)" style="fill: var(--color2, #fff)"
d="M17.173 21.156h-9.209c-1.031 2.311-1.529 3.911-1.529 4.8 0 0.64 0.249 1.067 0.747 1.244s1.209 0.249 2.204 0.249v1.316h-8.924v-1.316c0.498-0.071 0.96-0.178 1.316-0.284 0.391-0.107 0.711-0.249 0.996-0.462 0.284-0.178 0.533-0.462 0.782-0.782 0.213-0.32 0.427-0.711 0.604-1.138l8.569-21.44h2.418l7.787 18.987c0.462 1.102 0.853 1.991 1.138 2.596 0.32 0.64 0.64 1.102 0.996 1.458 0.356 0.32 0.782 0.569 1.244 0.711s1.067 0.213 1.813 0.284v1.351h-12.302v-1.351c1.031-0.036 1.778-0.142 2.24-0.32s0.676-0.533 0.676-1.031c0-0.32-0.071-0.711-0.213-1.173s-0.356-1.067-0.604-1.742l-0.747-1.956zM8.711 19.2h7.751l-3.733-9.849h-0.142l-3.876 9.849z"></path>
<path fill="#42b265" style="fill: var(--color4, #42b265)"
d="M32 17.387c-0.32 0.107-0.569 0.213-0.782 0.249-0.213 0.071-0.498 0.107-0.782 0.107-0.498 0-0.889-0.107-1.209-0.356-0.284-0.249-0.498-0.569-0.569-1.031h-0.071c-0.427 0.462-0.853 0.818-1.351 1.067-0.462 0.249-1.067 0.356-1.742 0.356-0.711 0-1.316-0.213-1.778-0.64s-0.676-0.996-0.676-1.707c0-0.356 0.036-0.711 0.142-0.996s0.249-0.533 0.462-0.782c0.178-0.178 0.356-0.356 0.64-0.533 0.249-0.142 0.498-0.284 0.747-0.356 0.284-0.107 0.889-0.32 1.778-0.604s1.493-0.533 1.778-0.711v-0.96c0-0.071 0-0.249-0.036-0.498s-0.107-0.462-0.213-0.676c-0.142-0.249-0.32-0.462-0.533-0.64-0.249-0.178-0.569-0.249-0.996-0.249-0.284 0-0.569 0.036-0.818 0.142s-0.427 0.213-0.533 0.32c0 0.142 0.036 0.32 0.107 0.569s0.107 0.498 0.107 0.711c0 0.213-0.107 0.427-0.32 0.604s-0.498 0.284-0.853 0.284c-0.32 0-0.569-0.107-0.711-0.356-0.142-0.213-0.213-0.498-0.213-0.782s0.107-0.569 0.32-0.853c0.213-0.284 0.498-0.498 0.818-0.711 0.284-0.178 0.64-0.32 1.067-0.462s0.818-0.178 1.209-0.178c0.533 0 0.996 0.036 1.422 0.107 0.391 0.071 0.782 0.249 1.102 0.462 0.32 0.249 0.569 0.569 0.747 0.96 0.178 0.427 0.249 0.924 0.249 1.564 0 0.924 0 1.742-0.036 2.453s-0.036 1.493-0.036 2.347c0 0.249 0.036 0.462 0.142 0.604 0.071 0.142 0.213 0.284 0.391 0.391 0.107 0.071 0.249 0.107 0.462 0.107s0.427 0 0.64 0v0.676zM28.622 12.302c-0.533 0.178-1.031 0.32-1.422 0.462-0.427 0.142-0.782 0.356-1.138 0.569-0.32 0.213-0.569 0.462-0.747 0.782-0.178 0.284-0.284 0.64-0.284 1.067 0 0.533 0.142 0.924 0.427 1.173s0.64 0.391 1.067 0.391c0.462 0 0.853-0.107 1.209-0.32s0.64-0.498 0.889-0.782v-3.342z"></path>
</symbol>
<symbol id="icon-tvd-users"
viewBox="0 0 90 90" style="enable-background:new 0 0 90 90;">
<g id="user-manager_card-" transform="translate(-111.000000, -64.000000)">
<g id="user-manager_card-group" transform="translate(29.000000, 29.000000)">
<g id="user-manager_card-group-6" transform="translate(82.000000, 35.000000)">
<g id="user-manager_card-group-3" transform="translate(19.000000, 0.000000)">
<path id="Combined-Shape" fill="#333" style="fill: var(--color1, #333)" d="M32.8,40.9c-11.1,0-20-9.1-20-20.4s9-20.4,20-20.4s20,9.1,20,20.4
S43.8,40.9,32.8,40.9z M32.8,3.1c-9.3,0-16.9,7.8-16.9,17.4s7.6,17.4,16.9,17.4s16.9-7.8,16.9-17.4S42.2,3.1,32.8,3.1z"/>
</g>
<path fill="#333" style="fill: var(--color1, #333)" d="M15.9,42c-7.2,0-13-6.2-13-13.9s5.8-13.9,13-13.9s13,6.2,13,13.9S23.1,42,15.9,42z M15.9,17.3
c-5.6,0-10.1,4.9-10.1,10.8s4.5,10.8,10.1,10.8S26,34.1,26,28.1S21.5,17.3,15.9,17.3z"/>
<path fill="#42B265;" style="fill: var(--color4, #42b265)" d="M80.9,52.2h-2.7v-2.3c0-4.3-3.8-7.8-8.5-7.8s-8.5,3.5-8.5,7.8v7.8h15.1h4.6h2.2c3.7,0,6.7,3.1,6.7,6.9V83
c0,3.8-3,6.9-6.7,6.9h-27c-3.7,0-6.7-3.1-6.7-6.9V64.6c0-3.8,3-6.9,6.7-6.9h2.2v-6.9c0-6.3,5-11.5,11.2-11.5s11.2,5.2,11.2,11.5
V52.2z M57.3,60.6c-2.8,0-5.1,2.3-5.1,5.1v16.6c0,2.8,2.3,5.1,5.1,5.1h24.8c2.8,0,5.1-2.3,5.1-5.1V65.6c0-2.8-2.3-5.1-5.1-5.1
H57.3z M69.7,68.9c0.8,0,1.4,0.6,1.4,1.3v8.3c0,0.7-0.6,1.3-1.4,1.3c-0.8,0-1.4-0.6-1.4-1.3v-8.3C68.3,69.5,68.9,68.9,69.7,68.9
z"/>
<path fill="#333" style="fill: var(--color1, #333)" d="M46.3,75h-21c-1.9,0-3.5-1.6-3.5-3.5v-6.6c0-9.5,7.7-17.2,17.1-17.2l0,0c0.8,0,1.6,0.1,2.6,0.4
c0.5,0.1,2.4,0.7,2.8,0.9c2.8,0.8,5.3,1.2,8.6,1.2c0.9,0,1.7,0,2.4-0.1c0-1.1,0.2-2.1,0.4-3.1C55,47.1,54,47.1,53,47.1
c-3.3,0-5.5-0.4-8.4-1.3c-0.3-0.1-1.2-0.4-1.1-0.4c-0.4-0.1-0.7-0.2-1.1-0.3c-1.3-0.4-2.3-0.5-3.5-0.5
c-11.1,0-20.1,9.1-20.1,20.3v6.6c0,3.6,2.9,6.6,6.6,6.6h21V75z"/>
<path fill="#333" style="fill: var(--color1, #333)" d="M21.8,48.6c0.5-0.5,1-0.9,1.5-1.3c0.4-0.3,0.9-0.7,1.3-1c-1.4-0.6-3-0.9-4.5-0.9h-7.4
c-7,0-12.7,5.8-12.7,12.9c0,0.8,0.7,1.5,1.6,1.5s1.6-0.7,1.6-1.5c0-5.4,4.3-9.9,9.6-9.9h7.4C20.7,48.4,21.3,48.5,21.8,48.6z"/>
</g>
</g>
</g>
</symbol>
<symbol id='icon-tvd-thrive-design-packs' viewBox="0 0 85 74">
<g fill-rule="nonzero" fill="none">
<path d="M57 .5A6.5 6.5 0 0 1 63.5 7v8.5H78a6.5 6.5 0 0 1 6.496 6.267L84.5 22v45a6.5 6.5 0 0 1-6.267 6.496L78 73.5H7a6.5 6.5 0 0 1-6.496-6.267L.5 67V22a6.5 6.5 0 0 1 6.267-6.496L7 15.5h14.5V7A6.5 6.5 0 0 1 28 .5h29zM34 34H3.5v33a3.5 3.5 0 0 0 3.308 3.495L7 70.5h71a3.5 3.5 0 0 0 3.495-3.308L81.5 67V34H51v3H34v-3zm14-3H37v3h11v-3zm30-12.5H7a3.5 3.5 0 0 0-3.495 3.308L3.5 22v9H34v-3h17v3h30.5v-9a3.5 3.5 0 0 0-3.308-3.495L78 18.5zm-21-15H28l-.192.005A3.5 3.5 0 0 0 24.5 7v8.5h36V7A3.5 3.5 0 0 0 57 3.5z"
fill="#333"/>
<path d="m49.788 41.5 1.18.003c2.75 0 5.452.367 7.368.926a1.5 1.5 0 0 1 .585 2.553l-1.03.928-.535.497c-.376.356-.723.7-1.055 1.049-1.05 1.103-1.846 2.148-2.335 3.122l-.042.106-.585 1.629-.303.812c-.463 1.19-.96 2.271-1.56 3.32-1.569 2.743-3.583 4.791-6.201 5.883-1.44.6-3.078 1.027-4.881 1.307-2.881.447-5.87.492-8.778.306l-.425-.028c-1.012 1.253-1.999 2.57-2.962 3.947a1.5 1.5 0 0 1-2.458-1.72 76.465 76.465 0 0 1 2.706-3.64 2.588 2.588 0 0 1-.496-1.514c0-4.978.6-8.25 2.668-11.05 4.688-6.35 11.228-8.394 19.14-8.435zm.008 3c-7.05.037-12.747 1.819-16.734 7.217-1.388 1.88-1.945 4.242-2.059 7.77a61.667 61.667 0 0 1 4.711-4.77c3.566-3.23 6.65-5.51 9.284-6.84a1.5 1.5 0 0 1 1.353 2.677c-2.16 1.092-4.762 2.972-7.787 5.639l-.835.747a58.473 58.473 0 0 0-4.078 4.088c2.116.055 4.247-.042 6.283-.358 1.58-.245 2.99-.613 4.187-1.112 1.926-.802 3.483-2.386 4.75-4.603.256-.446.558-1.083.861-1.772l.302-.701.292-.705.272-.677.242-.619.201-.529.158-.43.076-.22.025-.091c0-.004-.005.003-.015.021l.183-.348c.637-1.162 1.536-2.316 2.66-3.496.123-.13.248-.258.374-.386l.249-.248-.207-.027a28.744 28.744 0 0 0-3.117-.22l-.463-.004z"
fill="#42B265"/>
</g>
</symbol>
<symbol id="icon-map-marker-solid" viewBox="0 0 384 512">
<path d="M172.268 501.67C26.97 291.031 0 269.413 0 192 0 85.961 85.961 0 192 0s192 85.961 192 192c0 77.413-26.97 99.031-172.268 309.67-9.535 13.774-29.93 13.773-39.464 0z"></path>
</symbol>
<symbol id="icon-phone-solid" viewBox="0 0 512 512">
<path d="M493.4 24.6l-104-24c-11.3-2.6-22.9 3.3-27.5 13.9l-48 112c-4.2 9.8-1.4 21.3 6.9 28l60.6 49.6c-36 76.7-98.9 140.5-177.2 177.2l-49.6-60.6c-6.8-8.3-18.2-11.1-28-6.9l-112 48C3.9 366.5-2 378.1.6 389.4l24 104C27.1 504.2 36.7 512 48 512c256.1 0 464-207.5 464-464 0-11.2-7.7-20.9-18.6-23.4z"></path>
</symbol>
<svg id="icon-home-lg-alt-regular" viewBox="0 0 34 34">
<path d="M14.167 28.333v-8.5h5.666v8.5h7.084V17h4.25L17 4.25 2.833 17h4.25v11.333z"/>
</svg>
<symbol id="icon-format-capital" viewBox="0 0 32 32">
<path d="M18.667 8v3.6h-1.867l-0.133-1.867h-3.6v12.667l1.733 0.267v1.333h-5.733v-1.333l1.733-0.267v-12.667h-3.467l-0.133 1.867h-1.867v-3.6h13.333z"/>
<path d="M23.867 9.333v2.8h2.267v1.6h-2.267v7.067c0 0.533 0.133 0.933 0.4 1.2s0.533 0.4 0.933 0.4c0.133 0 0.4 0 0.667 0s0.4 0 0.533-0.133l0.267 1.467c-0.267 0.133-0.533 0.267-0.933 0.267s-0.667 0-1.067 0c-0.8 0-1.6-0.267-2-0.8-0.533-0.533-0.8-1.333-0.8-2.4v-7.067h-1.867v-1.6h1.867v-2.8h2z"/>
</symbol>
<symbol id="icon-format-align-justify" viewBox="0 0 32 32">
<path d="M4 6.667h24v2.667h-24v-2.667zM4 12h24v2.667h-24v-2.667zM4 17.333h24v2.667h-24v-2.667zM4 22.667h24v2.667h-24v-2.667z"/>
</symbol>
<symbol id="icon-crosshairs-regular" viewBox="0 0 512 512">
<path d="M500 232h-29.334C459.597 131.885 380.115 52.403 280 41.334V12c0-6.627-5.373-12-12-12h-24c-6.627 0-12 5.373-12 12v29.334C131.885 52.403 52.403 131.885 41.334 232H12c-6.627 0-12 5.373-12 12v24c0 6.627 5.373 12 12 12h29.334C52.403 380.115 131.885 459.597 232 470.666V500c0 6.627 5.373 12 12 12h24c6.627 0 12-5.373 12-12v-29.334C380.115 459.597 459.597 380.115 470.666 280H500c6.627 0 12-5.373 12-12v-24c0-6.627-5.373-12-12-12zM280 422.301V380c0-6.627-5.373-12-12-12h-24c-6.627 0-12 5.373-12 12v42.301C158.427 411.84 100.154 353.532 89.699 280H132c6.627 0 12-5.373 12-12v-24c0-6.627-5.373-12-12-12H89.699C100.16 158.427 158.468 100.154 232 89.699V132c0 6.627 5.373 12 12 12h24c6.627 0 12-5.373 12-12V89.699C353.573 100.16 411.846 158.468 422.301 232H380c-6.627 0-12 5.373-12 12v24c0 6.627 5.373 12 12 12h42.301C411.84 353.573 353.532 411.846 280 422.301zM288 256c0 17.673-14.327 32-32 32s-32-14.327-32-32c0-17.673 14.327-32 32-32s32 14.327 32 32z"></path>
</symbol>
<symbol id="icon-cog-regular" viewBox="0 0 512 512">
<path d="M452.515 237l31.843-18.382c9.426-5.441 13.996-16.542 11.177-27.054-11.404-42.531-33.842-80.547-64.058-110.797-7.68-7.688-19.575-9.246-28.985-3.811l-31.785 18.358a196.276 196.276 0 0 0-32.899-19.02V39.541a24.016 24.016 0 0 0-17.842-23.206c-41.761-11.107-86.117-11.121-127.93-.001-10.519 2.798-17.844 12.321-17.844 23.206v36.753a196.276 196.276 0 0 0-32.899 19.02l-31.785-18.358c-9.41-5.435-21.305-3.877-28.985 3.811-30.216 30.25-52.654 68.265-64.058 110.797-2.819 10.512 1.751 21.613 11.177 27.054L59.485 237a197.715 197.715 0 0 0 0 37.999l-31.843 18.382c-9.426 5.441-13.996 16.542-11.177 27.054 11.404 42.531 33.842 80.547 64.058 110.797 7.68 7.688 19.575 9.246 28.985 3.811l31.785-18.358a196.202 196.202 0 0 0 32.899 19.019v36.753a24.016 24.016 0 0 0 17.842 23.206c41.761 11.107 86.117 11.122 127.93.001 10.519-2.798 17.844-12.321 17.844-23.206v-36.753a196.34 196.34 0 0 0 32.899-19.019l31.785 18.358c9.41 5.435 21.305 3.877 28.985-3.811 30.216-30.25 52.654-68.266 64.058-110.797 2.819-10.512-1.751-21.613-11.177-27.054L452.515 275c1.22-12.65 1.22-25.35 0-38zm-52.679 63.019l43.819 25.289a200.138 200.138 0 0 1-33.849 58.528l-43.829-25.309c-31.984 27.397-36.659 30.077-76.168 44.029v50.599a200.917 200.917 0 0 1-67.618 0v-50.599c-39.504-13.95-44.196-16.642-76.168-44.029l-43.829 25.309a200.15 200.15 0 0 1-33.849-58.528l43.819-25.289c-7.63-41.299-7.634-46.719 0-88.038l-43.819-25.289c7.85-21.229 19.31-41.049 33.849-58.529l43.829 25.309c31.984-27.397 36.66-30.078 76.168-44.029V58.845a200.917 200.917 0 0 1 67.618 0v50.599c39.504 13.95 44.196 16.642 76.168 44.029l43.829-25.309a200.143 200.143 0 0 1 33.849 58.529l-43.819 25.289c7.631 41.3 7.634 46.718 0 88.037zM256 160c-52.935 0-96 43.065-96 96s43.065 96 96 96 96-43.065 96-96-43.065-96-96-96zm0 144c-26.468 0-48-21.532-48-48 0-26.467 21.532-48 48-48s48 21.533 48 48c0 26.468-21.532 48-48 48z"></path>
</symbol>
<symbol id="icon-dynamic-list" viewBox="0 0 20 20">
<g fill="none" fill-rule="evenodd">
<path d="M0 0h20v20H0z"/>
<path fill="#757575" fill-rule="nonzero"
d="M3.333 15.833h5v-1.666h-5v1.666zM16.667 4.167H3.333v1.666h13.334V4.167zm-2.5 5H3.333v1.666h11.042c.917 0 1.667.75 1.667 1.667s-.75 1.667-1.667 1.667H12.5V12.5L10 15l2.5 2.5v-1.667h1.667a3.332 3.332 0 1 0 0-6.666z"/>
</g>
</symbol>
<symbol id="icon-text" viewBox="0 0 20 20">
<defs>
<path id="a" d="M20 20H0V0h20z"/>
<path id="b"
d="M2.083 3.333v2.5H6.25v10h2.5v-10h4.167v-2.5H2.083zM17.917 7.5h-7.5V10h2.5v5.833h2.5V10h2.5V7.5z"/>
</defs>
<g fill="none" fill-rule="evenodd">
<mask id="c" fill="#fff">
<use xlink:href="#b"/>
</mask>
<use fill="#FFF" fill-rule="nonzero" xlink:href="#b"/>
<g fill="currentColor" mask="url(#c)">
<path d="M0 0h20v20H0z"/>
</g>
</g>
</symbol>
<symbol id="icon-trash" viewBox="0 0 20 20">
<defs>
<path id="a"
d="M5 15.833v-10h10v10c0 .917-.75 1.667-1.667 1.667H6.667C5.75 17.5 5 16.75 5 15.833zm10.833-12.5V5H4.167V3.333h2.916l.834-.833h4.166l.834.833h2.916z"/>
</defs>
<g fill="none" fill-rule="evenodd">
<mask id="b" fill="#fff">
<use xlink:href="#a"/>
</mask>
<use fill="#FFF" fill-rule="nonzero" xlink:href="#a"/>
<g fill="#379108" mask="url(#b)">
<path d="M0 0h20v20H0z"/>
</g>
</g>
</symbol>
<symbol id="icon-trash-new" viewBox="0 0 14 16">
<g fill="none" fill-rule="evenodd" stroke="#686868">
<path stroke-linecap="round" stroke-linejoin="round" d="M12.334 3.513l-.597 10.118c-.04.667-.625 1.19-1.334 1.19H3.598c-.71 0-1.295-.523-1.334-1.19L1.667 3.513"/>
<path stroke-linecap="square" d="M5.667 6.474v5.385M8.333 6.474v5.385"/>
<path stroke-linecap="round" stroke-linejoin="round" d="M9 1H5c-.736 0-1.333.563-1.333 1.256v1.257h6.667V2.256C10.334 1.563 9.736 1 9 1zM1 3.513h12"/>
</g>
</symbol>
<symbol id="icon-edit-new" viewBox="0 0 14 16">
<path d="M1.263 7.523L0 12l4.477-1.263L9.495 5.72 6.28 2.505 1.263 7.523zM11.334.666c-.429-.43-1-.666-1.607-.666S8.549.236 8.12.666L6.989 1.797l3.214 3.214 1.131-1.131c.43-.429.666-1 .666-1.607 0-.608-.236-1.178-.666-1.607z"/>
</symbol>
<symbol id="icon-question-circle" viewBox="0 0 15 15">
<path fill="#4C9C22" fill-rule="nonzero"
d="M7.5 0a7.501 7.501 0 0 0 0 15 7.5 7.5 0 1 0 0-15zm0 13.548A6.045 6.045 0 0 1 1.452 7.5 6.046 6.046 0 0 1 7.5 1.452 6.046 6.046 0 0 1 13.548 7.5 6.045 6.045 0 0 1 7.5 13.548zm3.243-7.717c0 2.027-2.19 2.059-2.19 2.808v.192c0 .2-.162.363-.363.363H6.81a.363.363 0 0 1-.363-.363v-.262c0-1.081.82-1.513 1.439-1.86.53-.298.856-.5.856-.895 0-.522-.665-.868-1.203-.868-.701 0-1.025.332-1.48.906a.363.363 0 0 1-.504.065l-.841-.638a.364.364 0 0 1-.08-.495c.714-1.05 1.624-1.639 3.041-1.639 1.484 0 3.068 1.159 3.068 2.686zM8.77 10.887c0 .7-.57 1.27-1.27 1.27-.7 0-1.27-.57-1.27-1.27 0-.7.57-1.27 1.27-1.27.7 0 1.27.57 1.27 1.27z"
opacity=".647"/>
</symbol>
<symbol id="icon-question-circle-full" viewBox="0 0 512 512">
<path d="M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zM262.655 90c-54.497 0-89.255 22.957-116.549 63.758-3.536 5.286-2.353 12.415 2.715 16.258l34.699 26.31c5.205 3.947 12.621 3.008 16.665-2.122 17.864-22.658 30.113-35.797 57.303-35.797 20.429 0 45.698 13.148 45.698 32.958 0 14.976-12.363 22.667-32.534 33.976C247.128 238.528 216 254.941 216 296v4c0 6.627 5.373 12 12 12h56c6.627 0 12-5.373 12-12v-1.333c0-28.462 83.186-29.647 83.186-106.667 0-58.002-60.165-102-116.531-102zM256 338c-25.365 0-46 20.635-46 46 0 25.364 20.635 46 46 46s46-20.636 46-46c0-25.365-20.635-46-46-46z"/>
</symbol>
<symbol id="icon-facebook-brands" viewBox="0 0 448 512">
<path d="M448 56.7v398.5c0 13.7-11.1 24.7-24.7 24.7H309.1V306.5h58.2l8.7-67.6h-67v-43.2c0-19.6 5.4-32.9 33.5-32.9h35.8v-60.5c-6.2-.8-27.4-2.7-52.2-2.7-51.6 0-87 31.5-87 89.4v49.9h-58.4v67.6h58.4V480H24.7C11.1 480 0 468.9 0 455.3V56.7C0 43.1 11.1 32 24.7 32h398.5c13.7 0 24.8 11.1 24.8 24.7z"></path>
</symbol>
<symbol id="icon-youtube-brands" viewBox="0 0 576 512">
<path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"></path>
</symbol>
<symbol id="icon-linkedin-brands" viewBox="0 0 448 512">
<path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"></path>
</symbol>
<symbol id="icon-pinterest-brands" viewBox="0 0 496 512">
<path d="M496 256c0 137-111 248-248 248-25.6 0-50.2-3.9-73.4-11.1 10.1-16.5 25.2-43.5 30.8-65 3-11.6 15.4-59 15.4-59 8.1 15.4 31.7 28.5 56.8 28.5 74.8 0 128.7-68.8 128.7-154.3 0-81.9-66.9-143.2-152.9-143.2-107 0-163.9 71.8-163.9 150.1 0 36.4 19.4 81.7 50.3 96.1 4.7 2.2 7.2 1.2 8.3-3.3.8-3.4 5-20.3 6.9-28.1.6-2.5.3-4.7-1.7-7.1-10.1-12.5-18.3-35.3-18.3-56.6 0-54.7 41.4-107.6 112-107.6 60.9 0 103.6 41.5 103.6 100.9 0 67.1-33.9 113.6-78 113.6-24.3 0-42.6-20.1-36.7-44.8 7-29.5 20.5-61.3 20.5-82.6 0-19-10.2-34.9-31.4-34.9-24.9 0-44.9 25.7-44.9 60.2 0 22 7.4 36.8 7.4 36.8s-24.5 103.8-29 123.2c-5 21.4-3 51.6-.9 71.2C65.4 450.9 0 361.1 0 256 0 119 111 8 248 8s248 111 248 248z"></path>
</symbol>
<symbol id="icon-instagram-brands" viewBox="0 0 448 512">
<path d="M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z"></path>
</symbol>
<symbol id="icon-link" viewBox="0 0 34 34">
<g fill="none" fill-rule="evenodd">
<path d="M0 0h34v34H0z"/>
<path fill="#000" fill-opacity=".54" fill-rule="nonzero"
d="M5.692 17.083a4.395 4.395 0 0 1 4.391-4.391h5.667V10h-5.667A7.086 7.086 0 0 0 3 17.083a7.086 7.086 0 0 0 7.083 7.084h5.667v-2.692h-5.667a4.395 4.395 0 0 1-4.391-4.392zM11.5 18.5h11.333v-2.833H11.5V18.5zM24.25 10h-5.667v2.692h5.667a4.395 4.395 0 0 1 4.392 4.391 4.395 4.395 0 0 1-4.392 4.392h-5.667v2.692h5.667a7.086 7.086 0 0 0 7.083-7.084A7.086 7.086 0 0 0 24.25 10z"/>
</g>
</symbol>
<symbol id="icon-map-marker-solid" viewBox="0 0 384 512">
<path d="M172.268 501.67C26.97 291.031 0 269.413 0 192 0 85.961 85.961 0 192 0s192 85.961 192 192c0 77.413-26.97 99.031-172.268 309.67-9.535 13.774-29.93 13.773-39.464 0z"></path>
</symbol>
<symbol id="icon-envelope-light" viewBox="0 0 34 34">
<path d="M28.5 6H5.833a2.83 2.83 0 0 0-2.819 2.833l-.014 17a2.842 2.842 0 0 0 2.833 2.834H28.5a2.842 2.842 0 0 0 2.833-2.834v-17A2.842 2.842 0 0 0 28.5 6zm0 5.667L17.167 18.75 5.833 11.667V8.833l11.334 7.084L28.5 8.833v2.834z"/>
</symbol>
<symbol id="icon-phone-solid" viewBox="0 0 512 512">
<path d="M493.4 24.6l-104-24c-11.3-2.6-22.9 3.3-27.5 13.9l-48 112c-4.2 9.8-1.4 21.3 6.9 28l60.6 49.6c-36 76.7-98.9 140.5-177.2 177.2l-49.6-60.6c-6.8-8.3-18.2-11.1-28-6.9l-112 48C3.9 366.5-2 378.1.6 389.4l24 104C27.1 504.2 36.7 512 48 512c256.1 0 464-207.5 464-464 0-11.2-7.7-20.9-18.6-23.4z"></path>
</symbol>
<symbol id="icon-format-capital" viewBox="0 0 32 32">
<path d="M18.667 8v3.6h-1.867l-0.133-1.867h-3.6v12.667l1.733 0.267v1.333h-5.733v-1.333l1.733-0.267v-12.667h-3.467l-0.133 1.867h-1.867v-3.6h13.333z"/>
<path d="M23.867 9.333v2.8h2.267v1.6h-2.267v7.067c0 0.533 0.133 0.933 0.4 1.2s0.533 0.4 0.933 0.4c0.133 0 0.4 0 0.667 0s0.4 0 0.533-0.133l0.267 1.467c-0.267 0.133-0.533 0.267-0.933 0.267s-0.667 0-1.067 0c-0.8 0-1.6-0.267-2-0.8-0.533-0.533-0.8-1.333-0.8-2.4v-7.067h-1.867v-1.6h1.867v-2.8h2z"/>
</symbol>
<symbol id="icon-format-align-justify" viewBox="0 0 32 32">
<path d="M4 6.667h24v2.667h-24v-2.667zM4 12h24v2.667h-24v-2.667zM4 17.333h24v2.667h-24v-2.667zM4 22.667h24v2.667h-24v-2.667z"/>
</symbol>
<symbol id="icon-crosshairs-regular" viewBox="0 0 512 512">
<path d="M500 232h-29.334C459.597 131.885 380.115 52.403 280 41.334V12c0-6.627-5.373-12-12-12h-24c-6.627 0-12 5.373-12 12v29.334C131.885 52.403 52.403 131.885 41.334 232H12c-6.627 0-12 5.373-12 12v24c0 6.627 5.373 12 12 12h29.334C52.403 380.115 131.885 459.597 232 470.666V500c0 6.627 5.373 12 12 12h24c6.627 0 12-5.373 12-12v-29.334C380.115 459.597 459.597 380.115 470.666 280H500c6.627 0 12-5.373 12-12v-24c0-6.627-5.373-12-12-12zM280 422.301V380c0-6.627-5.373-12-12-12h-24c-6.627 0-12 5.373-12 12v42.301C158.427 411.84 100.154 353.532 89.699 280H132c6.627 0 12-5.373 12-12v-24c0-6.627-5.373-12-12-12H89.699C100.16 158.427 158.468 100.154 232 89.699V132c0 6.627 5.373 12 12 12h24c6.627 0 12-5.373 12-12V89.699C353.573 100.16 411.846 158.468 422.301 232H380c-6.627 0-12 5.373-12 12v24c0 6.627 5.373 12 12 12h42.301C411.84 353.573 353.532 411.846 280 422.301zM288 256c0 17.673-14.327 32-32 32s-32-14.327-32-32c0-17.673 14.327-32 32-32s32 14.327 32 32z"></path>
</symbol>
<symbol id="icon-cog-regular" viewBox="0 0 512 512">
<path d="M452.515 237l31.843-18.382c9.426-5.441 13.996-16.542 11.177-27.054-11.404-42.531-33.842-80.547-64.058-110.797-7.68-7.688-19.575-9.246-28.985-3.811l-31.785 18.358a196.276 196.276 0 0 0-32.899-19.02V39.541a24.016 24.016 0 0 0-17.842-23.206c-41.761-11.107-86.117-11.121-127.93-.001-10.519 2.798-17.844 12.321-17.844 23.206v36.753a196.276 196.276 0 0 0-32.899 19.02l-31.785-18.358c-9.41-5.435-21.305-3.877-28.985 3.811-30.216 30.25-52.654 68.265-64.058 110.797-2.819 10.512 1.751 21.613 11.177 27.054L59.485 237a197.715 197.715 0 0 0 0 37.999l-31.843 18.382c-9.426 5.441-13.996 16.542-11.177 27.054 11.404 42.531 33.842 80.547 64.058 110.797 7.68 7.688 19.575 9.246 28.985 3.811l31.785-18.358a196.202 196.202 0 0 0 32.899 19.019v36.753a24.016 24.016 0 0 0 17.842 23.206c41.761 11.107 86.117 11.122 127.93.001 10.519-2.798 17.844-12.321 17.844-23.206v-36.753a196.34 196.34 0 0 0 32.899-19.019l31.785 18.358c9.41 5.435 21.305 3.877 28.985-3.811 30.216-30.25 52.654-68.266 64.058-110.797 2.819-10.512-1.751-21.613-11.177-27.054L452.515 275c1.22-12.65 1.22-25.35 0-38zm-52.679 63.019l43.819 25.289a200.138 200.138 0 0 1-33.849 58.528l-43.829-25.309c-31.984 27.397-36.659 30.077-76.168 44.029v50.599a200.917 200.917 0 0 1-67.618 0v-50.599c-39.504-13.95-44.196-16.642-76.168-44.029l-43.829 25.309a200.15 200.15 0 0 1-33.849-58.528l43.819-25.289c-7.63-41.299-7.634-46.719 0-88.038l-43.819-25.289c7.85-21.229 19.31-41.049 33.849-58.529l43.829 25.309c31.984-27.397 36.66-30.078 76.168-44.029V58.845a200.917 200.917 0 0 1 67.618 0v50.599c39.504 13.95 44.196 16.642 76.168 44.029l43.829-25.309a200.143 200.143 0 0 1 33.849 58.529l-43.819 25.289c7.631 41.3 7.634 46.718 0 88.037zM256 160c-52.935 0-96 43.065-96 96s43.065 96 96 96 96-43.065 96-96-43.065-96-96-96zm0 144c-26.468 0-48-21.532-48-48 0-26.467 21.532-48 48-48s48 21.533 48 48c0 26.468-21.532 48-48 48z"></path>
</symbol>
<symbol id="icon-plus-circle-regular" viewBox="0 0 512 512">
<path d="M384 240v32c0 6.6-5.4 12-12 12h-88v88c0 6.6-5.4 12-12 12h-32c-6.6 0-12-5.4-12-12v-88h-88c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h88v-88c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v88h88c6.6 0 12 5.4 12 12zm120 16c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zm-48 0c0-110.5-89.5-200-200-200S56 145.5 56 256s89.5 200 200 200 200-89.5 200-200z"></path>
</symbol>
<symbol id="icon-dynamic-list" viewBox="0 0 20 20">
<g fill="none" fill-rule="evenodd">
<path d="M0 0h20v20H0z"/>
<path fill="#757575" fill-rule="nonzero"
d="M3.333 15.833h5v-1.666h-5v1.666zM16.667 4.167H3.333v1.666h13.334V4.167zm-2.5 5H3.333v1.666h11.042c.917 0 1.667.75 1.667 1.667s-.75 1.667-1.667 1.667H12.5V12.5L10 15l2.5 2.5v-1.667h1.667a3.332 3.332 0 1 0 0-6.666z"/>
</g>
</symbol>
<symbol id="icon-text" viewBox="0 0 20 20">
<defs>
<path id="a" d="M34 34H0V0h34z"/>
</defs>
<g fill="none" fill-rule="evenodd">
<mask id="b" fill="#fff">
<use xlink:href="#a"/>
</mask>
<path fill="#000" fill-opacity=".54" fill-rule="nonzero" d="M4 6v4.25h7.083v17h4.25v-17h7.084V6H4zm26.917 7.083h-12.75v4.25h4.25v9.917h4.25v-9.917h4.25v-4.25z" mask="url(#b)"/>
</g>
</symbol>
<symbol id="icon-facebook-brands-new" viewBox="0 0 448 512">
<path d="M448 56.7v398.5c0 13.7-11.1 24.7-24.7 24.7H309.1V306.5h58.2l8.7-67.6h-67v-43.2c0-19.6 5.4-32.9 33.5-32.9h35.8v-60.5c-6.2-.8-27.4-2.7-52.2-2.7-51.6 0-87 31.5-87 89.4v49.9h-58.4v67.6h58.4V480H24.7C11.1 480 0 468.9 0 455.3V56.7C0 43.1 11.1 32 24.7 32h398.5c13.7 0 24.8 11.1 24.8 24.7z"></path>
</symbol>
<symbol id="icon-youtube-brands-new" viewBox="0 0 576 512">
<path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"></path>
</symbol>
<symbol id="icon-linkedin-brands-new" viewBox="0 0 448 512">
<path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"></path>
</symbol>
<symbol id="icon-pinterest-brands-new" viewBox="0 0 496 512">
<path d="M496 256c0 137-111 248-248 248-25.6 0-50.2-3.9-73.4-11.1 10.1-16.5 25.2-43.5 30.8-65 3-11.6 15.4-59 15.4-59 8.1 15.4 31.7 28.5 56.8 28.5 74.8 0 128.7-68.8 128.7-154.3 0-81.9-66.9-143.2-152.9-143.2-107 0-163.9 71.8-163.9 150.1 0 36.4 19.4 81.7 50.3 96.1 4.7 2.2 7.2 1.2 8.3-3.3.8-3.4 5-20.3 6.9-28.1.6-2.5.3-4.7-1.7-7.1-10.1-12.5-18.3-35.3-18.3-56.6 0-54.7 41.4-107.6 112-107.6 60.9 0 103.6 41.5 103.6 100.9 0 67.1-33.9 113.6-78 113.6-24.3 0-42.6-20.1-36.7-44.8 7-29.5 20.5-61.3 20.5-82.6 0-19-10.2-34.9-31.4-34.9-24.9 0-44.9 25.7-44.9 60.2 0 22 7.4 36.8 7.4 36.8s-24.5 103.8-29 123.2c-5 21.4-3 51.6-.9 71.2C65.4 450.9 0 361.1 0 256 0 119 111 8 248 8s248 111 248 248z"></path>
</symbol>
<symbol id="icon-instagram-brands-new" viewBox="0 0 448 512">
<path d="M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z"></path>
</symbol>
<symbol id="icon-xing-brands-new" viewBox="0 0 448 512">
<path d="M162.7 210c-1.8 3.3-25.2 44.4-70.1 123.5-4.9 8.3-10.8 12.5-17.7 12.5H9.8c-7.7 0-12.1-7.5-8.5-14.4l69-121.3c.2 0 .2-.1 0-.3l-43.9-75.6c-4.3-7.8.3-14.1 8.5-14.1H100c7.3 0 13.3 4.1 18 12.2l44.7 77.5zM382.6 46.1l-144 253v.3L330.2 466c3.9 7.1.2 14.1-8.5 14.1h-65.2c-7.6 0-13.6-4-18-12.2l-92.4-168.5c3.3-5.8 51.5-90.8 144.8-255.2 4.6-8.1 10.4-12.2 17.5-12.2h65.7c8 0 12.3 6.7 8.5 14.1z"/>
</symbol>
<symbol id="icon-x-brands-new" viewBox="0 0 512 512">
<path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"/>
</symbol>
<symbol id="icon-twitter-x" viewBox="0 0 512 512">
<path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"/>
</symbol>
<symbol id="icon-tiktok-brands-new" viewBox="0 0 448 512">
<path d="M448,209.91a210.06,210.06,0,0,1-122.77-39.25V349.38A162.55,162.55,0,1,1,185,188.31V278.2a74.62,74.62,0,1,0,52.23,71.18V0l88,0a121.18,121.18,0,0,0,1.86,22.17h0A122.18,122.18,0,0,0,381,102.39a121.43,121.43,0,0,0,67,20.14Z"/>
</symbol>
<symbol id="icon-bluesky-brands-new" viewBox="0 0 512 512">
<path d="M111.8 62.2C170.2 105.9 233 194.7 256 242.4c23-47.6 85.8-136.4 144.2-180.2c42.1-31.6 110.3-56 110.3 21.8c0 15.5-8.9 130.5-14.1 149.2C478.2 298 412 314.6 353.1 304.5c102.9 17.5 129.1 75.5 72.5 133.5c-107.4 110.2-154.3-27.6-166.3-62.9l0 0c-1.7-4.9-2.6-7.8-3.3-7.8s-1.6 3-3.3 7.8l0 0c-12 35.3-59 173.1-166.3 62.9c-56.5-58-30.4-116 72.5-133.5C100 314.6 33.8 298 15.7 233.1C10.4 214.4 1.5 99.4 1.5 83.9c0-77.8 68.2-53.4 110.3-21.8z"/>
</symbol>
<symbol id="icon-check-light" viewBox="0 0 448 512">
<path d="M413.505 91.951L133.49 371.966l-98.995-98.995c-4.686-4.686-12.284-4.686-16.971 0L6.211 284.284c-4.686 4.686-4.686 12.284 0 16.971l118.794 118.794c4.686 4.686 12.284 4.686 16.971 0l299.813-299.813c4.686-4.686 4.686-12.284 0-16.971l-11.314-11.314c-4.686-4.686-12.284-4.686-16.97 0z"/>
</symbol>
<symbol id="icon-tvd-smart-site" viewBox="0 0 89.8 89.2">
<path class="cls-1"
d="M45,0h-.2A33,33,0,0,0,17.5,51.5a35.73,35.73,0,0,0,3,3.8,42.71,42.71,0,0,0,4.1,4.4c3.6,3.6,6.9,6.7,6.8,12.9v6.6l3.4,8.4c.5,1.4,1.1,1.6,2.1,1.6H52.8c.9,0,1.5-.3,2-1.7l3.5-8.2V72.7h0v-.1h0c-.1-6.2,3.1-9.3,6.7-12.9a35.37,35.37,0,0,0,4.1-4.5,26.94,26.94,0,0,0,3-3.7A33,33,0,0,0,45,0Zm7.2,86.4H37.6l-2.6-6H54.8Zm3.3-8.9H34.2V74.3H55.5ZM69.8,49.9A30.67,30.67,0,0,1,67,53.4l-.1.1A30.37,30.37,0,0,1,63,57.7c-3.5,3.4-7.1,7-7.5,13.5v.2H34.2v-.2c-.4-6.5-4-10-7.5-13.5a38.08,38.08,0,0,1-3.9-4.2l-.1-.1c-1-1.1-1.9-2.3-2.8-3.5a30.09,30.09,0,0,1,24.8-47h.2a30.09,30.09,0,0,1,24.9,47Z"/>
<line class="cls-2" x1="47.5" y1="72.4" x2="47.5" y2="72.4"/>
<line class="cls-2" x1="55.5" y1="36.7" x2="55.4" y2="36.8"/>
<path fill="#42b265" style="fill: var(--color1, #42b265)" class="cls-3" d="M8.7,30.9H.6a.65.65,0,0,0-.6.6v1.6a.65.65,0,0,0,.6.6H8.8A8.78,8.78,0,0,1,8.7,30.9Z"/>
<path fill="#42b265" style="fill: var(--color1, #42b265)" class="cls-3" d="M18,7.7,12.3,2a.75.75,0,0,0-.9,0L10.3,3.1a.75.75,0,0,0,0,.9L16,9.7A15.12,15.12,0,0,1,18,7.7Z"/>
<path fill="#42b265" style="fill: var(--color1, #42b265)" class="cls-3" d="M16.2,56.9l-5.6,5.7a.75.75,0,0,0,0,.9l1.1,1.1a.75.75,0,0,0,.9,0l5.7-5.7A9.83,9.83,0,0,1,16.2,56.9Z"/>
<path fill="#42b265" style="fill: var(--color1, #42b265)" class="cls-3" d="M89.2,30.9H81a13.1,13.1,0,0,1,0,2.8h8.2a.65.65,0,0,0,.6-.6V31.5A.58.58,0,0,0,89.2,30.9Z"/>
<path fill="#42b265" style="fill: var(--color1, #42b265)" class="cls-3" d="M78.3,2a.75.75,0,0,0-.9,0L71.7,7.7a7.74,7.74,0,0,1,2,2L79.4,4a.56.56,0,0,0,0-.9Z"/>
<path fill="#42b265" style="fill: var(--color1, #42b265)" class="cls-3" d="M73.5,56.9a8.19,8.19,0,0,1-2,2l5.7,5.7a.75.75,0,0,0,.9,0l1.1-1.1a.75.75,0,0,0,0-.9Z"/>
<path fill="#42b265" style="fill: var(--color3, #42b265)" class="cls-3"
d="M63.43,27.58A7.51,7.51,0,0,0,56.91,17.1,7.56,7.56,0,0,0,45,12.79a7.58,7.58,0,0,0-11.9,4.32,7.49,7.49,0,0,0-6.51,10.55A8.08,8.08,0,0,0,26,41.38,7.51,7.51,0,0,0,32.33,52c.08,4.26,5.78,9.42,12.63,4.44A7.86,7.86,0,0,0,57.57,52a8.29,8.29,0,0,0,6.1-3.87,7.41,7.41,0,0,0,.1-6.81A8.38,8.38,0,0,0,67.3,34.5v-.13A8.4,8.4,0,0,0,63.43,27.58ZM43.7,15.84V23a4.3,4.3,0,0,1-5-1.27c-.43-.51-.79-1.25-1.46-1.26a1,1,0,0,0-1,1.18,3.13,3.13,0,0,0,.71,1.57A6.5,6.5,0,0,0,43.7,25.4V54.2A2.62,2.62,0,0,1,43,55a5.83,5.83,0,0,1-4.12,1,4.76,4.76,0,0,1-3.28-2A5.51,5.51,0,0,1,36,47.33a3.75,3.75,0,0,1,2.74-1.25c.65-.07,1.44-.07,1.79-.63a1.08,1.08,0,0,0-.89-1.66,4.18,4.18,0,0,0-2.14.35,5.67,5.67,0,0,0-.44-3.65,1.83,1.83,0,0,0-1.45-1,1,1,0,0,0-.87,1.55,5.31,5.31,0,0,1,.66,1.89,3.61,3.61,0,0,1-.07,1.79,6.43,6.43,0,0,0-2.94,4.91,5.29,5.29,0,0,1-2.83-9.31,6.08,6.08,0,0,1-4.76-5,5.76,5.76,0,0,1,3.43-6,5.52,5.52,0,0,1,6.5,2,6.22,6.22,0,0,0-2.17,1.76c-.58.73-.77,2,.1,2.37a1.39,1.39,0,0,0,1.33-.3,10.57,10.57,0,0,0,1-1,4.59,4.59,0,0,1,3.08-1.41,9.12,9.12,0,0,0,1.48-.06,1.34,1.34,0,0,0,1.07-.91c.15-.75-.57-1.37-1.44-1.41a6.68,6.68,0,0,0-2.28.2A7.7,7.7,0,0,0,28.71,27a4.94,4.94,0,0,1,.72-5.69,5.86,5.86,0,0,1,5.65-1.57,5.34,5.34,0,0,1,7.86-5.42c.58.35.76.48.76.48ZM61.6,39.7l-1.3.5.8,1.2a5.39,5.39,0,0,1,1,3,5,5,0,0,1-4.7,5.1A7.42,7.42,0,0,0,54.8,45a5.7,5.7,0,0,0,1.1-2.8,1.12,1.12,0,0,0-2.2-.4,5,5,0,0,1-3.9,4,1.16,1.16,0,0,0,.2,2.3,5.58,5.58,0,0,0,3.2-1.4,5.12,5.12,0,0,1,1.9,4,5,5,0,0,1-5,5,5.84,5.84,0,0,1-4.2-1.5V37.3a14.28,14.28,0,0,0,3-.1,5.17,5.17,0,0,0,.8,2c.45.65,1.4.4,1.6.3a1.25,1.25,0,0,0,.3-1.6,6.47,6.47,0,0,1-.6-4.2,1.18,1.18,0,0,0-1-1.6,1.16,1.16,0,0,0-1.1.7,6.46,6.46,0,0,0-.3,2.2,11.05,11.05,0,0,1-2.7,0V14.8a5,5,0,0,1,3.5-1.4,5.14,5.14,0,0,1,5,3.9,7.24,7.24,0,0,0-3.6,2.3,1.25,1.25,0,0,0,.1,1.6,1.35,1.35,0,0,0,1.6-.1,5.18,5.18,0,0,1,3.3-1.8c2.79-.44,5.7,2.3,5.7,5.1a4.65,4.65,0,0,1-.6,2.3,11.14,11.14,0,0,0-1.7-.2,8.53,8.53,0,0,0-3.5.8,6.44,6.44,0,0,0-2.5-1.5c-.1,0-1.1-.34-1.5.6a1.23,1.23,0,0,0,.7,1.5A5.42,5.42,0,0,1,56,32.5a1.14,1.14,0,0,0,1.2,1,1.23,1.23,0,0,0,.8-.4c.2-.2.71-2-.8-3.9a4.85,4.85,0,0,1,2.07-.57A5.07,5.07,0,0,1,64.5,32.3,6,6,0,0,1,61.6,39.7Z"/>
</symbol>
<symbol id="icon-tvd-lightspeed" viewBox="0 0 90 77">
<g fill="none" fill-rule="evenodd">
<g>
<g transform="translate(-168 -94) translate(168 94)">
<g fill="#333" fill-rule="nonzero">
<path d="M86.995 68.15L87 68V5c0-1.054-.816-1.918-1.85-1.995L85 3H5c-1.054 0-1.918.816-1.995 1.85L3 5v63c0 1.054.816 1.918 1.85 1.995L5 70v3c-2.761 0-5-2.239-5-5V5c0-2.761 2.239-5 5-5h80c2.761 0 5 2.239 5 5v63c0 2.761-2.239 5-5 5v-3c1.054 0 1.918-.816 1.995-1.85z"/>
<g transform="translate(7 6.031)">
<circle cx="1.257" cy="1.257" r="1.257"/>
<circle cx="6.785" cy="1.257" r="1.257"/>
<circle cx="12.314" cy="1.257" r="1.257"/>
</g>
<path d="M7 12L83 12 83 15 7 15zM63 6L83 6 83 9 63 9z"/>
<path d="M10 18v29.5c0 .245.177.45.41.492l.09.008h69c.245 0 .45-.177.492-.41L80 47.5V18h3v29.5c0 1.869-1.464 3.395-3.308 3.495L79.5 51h-69c-1.869 0-3.395-1.464-3.495-3.308L7 47.5V18h3z" transform="matrix(1 0 0 -1 0 69)"/>
</g>
<path fill="#42B265" fill-rule="nonzero"
d="M45.082 31.557c20.914 0 37.869 16.955 37.869 37.87 0 .87-.03 1.735-.087 2.591h-2.725c-.024-.398-.08-.853-.17-1.575-.052-.417.08-2.358-.239-5.03-.147-1.231-.367-2.617-.723-4.08-.284-1.165-.666-2.378-1.072-3.601-.81-2.44-2.167-5.082-3.59-7.28-1.195-1.844-2.422-3.331-3.556-4.568-6.423-7.008-15.598-11.329-25.707-11.329-6.697 0-12.982 1.89-18.386 5.244-4.476 2.777-8.237 6.518-11.084 10.933-1.802 2.796-3.189 5.97-4.096 9.21-.471 1.685-.765 3.258-1.023 5.08-.246 1.743-.322 3.282-.279 5.421.01.513.037 1.046.069 1.572H7.3c-.058-.856-.087-1.719-.087-2.589 0-20.914 16.955-37.869 37.869-37.869z"/>
<path fill="#42B265" fill-rule="nonzero" d="M70.025 69.426c0 .625-.023 1.247-.07 1.866l-.053.618-2.985-.296c.072-.723.108-1.453.108-2.188 0-11.806-9.325-21.434-21.01-21.923l.061-2.999c13.314.52 23.949 11.48 23.949 24.922zM41.923 44.682l.408 2.972c-1.52.19-3.006.537-4.442 1.035l-.489.176-1.05-2.81c1.793-.67 3.66-1.131 5.573-1.373z"/>
<path stroke="#333" stroke-width="2.5"
d="M40.659 73.77c-1.2-1.2-1.77-2.895-1.679-4.603.09-1.663.806-3.322 2.12-4.502 1.001-.901 4.338-2.846 7.728-4.645 2.055-1.09 4.125-2.133 5.669-2.857.764-.358 1.403-.64 1.856-.816.264-.104.478-.175.63-.214l1.004-.262.443.938c.369.784.24 1.203.023 1.726-.195.468-.504 1.13-.895 1.917-.786 1.587-1.908 3.704-3.07 5.783-1.891 3.383-3.905 6.649-4.792 7.535-1.18 1.179-2.844 1.789-4.519 1.789-1.674 0-3.337-.61-4.518-1.789z"/>
<circle cx="45.195" cy="69.314" r="2.367" fill="#333"/>
<path fill="#42B265" fill-rule="nonzero" d="M28 70L28 73 7.216 73 7.216 70zM82.95 70L82.95 73 62 73 62 70z"/>
<path fill="#42B265"
d="M11.84 58.026l5.393 1.577-.625 2.586-5.672-1.27.904-2.893zm66.507-.122l.793 2.815-4.641 1.185-.704-2.43 4.552-1.57zM17.963 46.715l4.34 3.494-1.496 2.084-4.757-3.215 1.913-2.363zm54.177.08l2.238 2.027-4.439 3.136-1.533-1.999 3.734-3.165zM28.177 38.54l2.521 4.638-2.149 1.325-3.15-4.565 2.778-1.398zm33.954.342l2.744 1.188-2.793 4.246-2.2-1.304 2.249-4.13zm-21.845-4.24l.737 4.956-2.496.483-1.193-4.989 2.952-.45zm9.845.045l2.877.64-1.027 4.68-2.502-.47.652-4.85z"/>
</g>
</g>
</g>
</symbol>
<symbol id="icon-tvd-login-editor" viewBox="0 0 95 89">
<g fill="none" fill-rule="evenodd">
<g>
<g>
<path fill="#333" fill-rule="nonzero"
d="M60 0c19.054 0 34.5 15.446 34.5 34.5C94.5 53.554 79.054 69 60 69c-6.409 0-12.409-1.747-17.55-4.792l-3.488 3.487-.145.135c-.498.43-1.136.67-1.8.67H33v7.25l-.005.168c-.087 1.44-1.282 2.582-2.745 2.582H23v7.25l-.005.168c-.087 1.44-1.282 2.582-2.745 2.582H2.75l-.168-.005C1.142 88.408 0 87.213 0 85.75V71.482l.007-.198c.048-.657.33-1.277.798-1.746L26.02 44.324l.68-.774c-.783-2.884-1.2-5.918-1.2-9.05C25.5 15.446 40.946 0 60 0zm0 3C42.603 3 28.5 17.103 28.5 34.5c0 3.686.633 7.225 1.797 10.513 3.272 3.964 8.701 11.217 10.724 14.63C46.298 63.632 52.873 66 60 66c17.397 0 31.5-14.103 31.5-31.5S77.397 3 60 3z"
transform="translate(-165 -91) translate(165 91)"/>
<path fill="#FFF" fill-rule="nonzero" d="M43.787 59.204l-.424-.154-6.449 6.45H30v10H20v10H3V71.586l26.449-26.45 1.725-1.886c-.793-2.282 15.072 16.808 12.613 15.954z" transform="translate(-165 -91) translate(165 91)"/>
<path stroke="#4BB35E" stroke-width="2.7"
d="M60.51 40.902L67.073 58.9c-2.16.893-4.574 1.251-7.074 1.251-2.025 0-3.991-.238-5.88-.684l6.39-18.564zM35.334 27.45L45.68 55.78c-2.983-2.015-5.521-4.638-7.434-7.693-2.468-3.94-3.895-8.598-3.895-13.587 0-2.445.344-4.81.985-7.05zm47.749 7.012c.916-2.3 1.484-4.337 1.803-6.197.498 1.995.763 4.083.763 6.235 0 8.025-3.687 15.181-9.455 19.88l6.889-19.918zm-8.006 6.39l-.193.614-1.474 4.933-7.857-23.327c.832-.071 1.406-.138 1.407-.138.741-.086 1.274-.428 1.636-.863.416-.5.607-1.15.559-1.788-.05-.645-.343-1.26-.833-1.686-.428-.372-1.013-.623-1.767-.58-.025.003-4.333.337-7.113.337-2.613 0-7.005-.335-7.005-.335-.78-.045-1.37.213-1.803.6-.48.43-.77 1.05-.82 1.694-.05.657.152 1.316.57 1.806.369.432.907.763 1.655.819.183.022 1.002.117 1.991.196l3.74 10.26-4.484 13.442-7.99-23.764c.832-.071 1.407-.138 1.408-.138.741-.086 1.274-.428 1.636-.863.415-.5.607-1.15.559-1.788-.05-.645-.343-1.26-.833-1.686-.428-.372-1.013-.623-1.767-.58-.023.002-3.493.272-6.214.328C44.79 12.555 51.959 8.85 60 8.85c5.726 0 11.02 1.881 15.292 5.054-.548.279-1.034.634-1.455 1.045-1.172 1.146-1.832 2.744-1.832 4.404 0 2.284 1.134 4.263 2.523 6.507l.32.52c.934 1.627 2.036 3.72 2.036 6.752 0 2.08-.781 4.462-1.806 7.72z"
transform="translate(-165 -91) translate(165 91)"/>
</g>
</g>
</g>
</symbol>
<symbol id="icon-link" viewBox="0 0 34 34">
<path d="M0 0h34v34H0z"/>
</symbol>
<symbol id="icon-link" viewBox="0 0 34 34">
<g fill="none" fill-rule="evenodd">
<path d="M0 0h34v34H0z"/>
<path fill="currentColor"
d="M5.692 17.083a4.395 4.395 0 0 1 4.391-4.391h5.667V10h-5.667A7.086 7.086 0 0 0 3 17.083a7.086 7.086 0 0 0 7.083 7.084h5.667v-2.692h-5.667a4.395 4.395 0 0 1-4.391-4.392zM11.5 18.5h11.333v-2.833H11.5V18.5zM24.25 10h-5.667v2.692h5.667a4.395 4.395 0 0 1 4.392 4.391 4.395 4.395 0 0 1-4.392 4.392h-5.667v2.692h5.667a7.086 7.086 0 0 0 7.083-7.084A7.086 7.086 0 0 0 24.25 10z"/>
</g>
</symbol>
<symbol id="icon-tvd-phone" viewBox="0 0 60 60">
<g fill="none" fill-rule="evenodd">
<path d="M0 0h60v60H0z"/>
<path fill="#000" fill-rule="nonzero"
d="M50 38.75a28.4 28.4 0 0 1-8.925-1.425 2.551 2.551 0 0 0-2.55.6l-5.5 5.5c-7.075-3.6-12.875-9.375-16.475-16.45l5.5-5.525c.7-.675.9-1.65.625-2.525A28.4 28.4 0 0 1 21.25 10c0-1.375-1.125-2.5-2.5-2.5H10A2.507 2.507 0 0 0 7.5 10c0 23.475 19.025 42.5 42.5 42.5 1.375 0 2.5-1.125 2.5-2.5v-8.75c0-1.375-1.125-2.5-2.5-2.5z"/>
<path fill="#379108" fill-rule="nonzero" d="M32.5 22.5h-5v5h5zM42.5 22.5h-5v5h5zM47.5 22.5v5h5v-5z"/>
</g>
</symbol>
<symbol id="icon-tvd-email" viewBox="0 0 60 60">
<defs>
<path id="tvd-email-node"
d="M11.142 20.9L6 17.688v-1.812C6 13.194 8.205 11 10.9 11h39.2c2.695 0 4.9 2.194 4.9 4.875v1.822l-4.9 3.062v-.009L30.5 32.938 11.142 20.9zM50.1 15.876H10.9l19.6 12.188 19.6-12.188z"/>
</defs>
<g fill="none" fill-rule="evenodd">
<path d="M0 0h60v60H0z"/>
<path fill="#000" fill-rule="nonzero"
d="M10.9 25.466v19.659h39.2V25.476l4.9-3.062v22.711C55 47.806 52.795 50 50.1 50H10.9C8.205 50 6 47.806 6 45.125v-22.72l4.9 3.061z"/>
<use fill="#379108" fill-rule="nonzero" xlink:href="#tvd-email-node"/>
</g>
</symbol>
<symbol id="icon-tvd-user" viewBox="0 0 60 60">
<g fill="none" fill-rule="evenodd">
<path fill="#000" fill-rule="nonzero"
d="M30.478 13.703a5.774 5.774 0 0 1 5.775 5.775 5.774 5.774 0 0 1-5.775 5.775 5.774 5.774 0 0 1-5.775-5.775 5.774 5.774 0 0 1 5.775-5.775zm0-5.225c-6.077 0-11 4.923-11 11 0 6.078 4.923 11 11 11 6.078 0 11-4.922 11-11 0-6.077-4.922-11-11-11z"/>
<path fill="#379108" fill-rule="nonzero"
d="M30.478 33.228c7.343 0 22 3.685 22 11v8.25h-44v-8.25c0-7.315 14.658-11 22-11zm0 5.225c-8.167 0-16.775 4.015-16.775 5.775v3.025h33.55v-3.025c0-1.76-8.607-5.775-16.775-5.775z"/>
<path d="M0 0h60v60H0z"/>
</g>
</symbol>
<symbol id="icon-tvd-comments" viewBox="0 0 60 60">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="60" height="60" viewBox="0 0 60 60">
<defs>
<path id="a" d="M0 .32h48.776v44.295H0z"/>
<path id="c" d="M1.604.173h34.089v23.041H1.604z"/>
</defs>
<g fill="none" fill-rule="evenodd">
<g transform="translate(3 6.466)">
<mask id="b" fill="#fff">
<use xlink:href="#a"/>
</mask>
<path fill="#000"
d="M48.562 11.112C47.447 4.987 42.072.32 35.628.32H13.165C5.906.32.017 6.208.017 13.467v29.1s-.32 2.034 1.779 2.034c0 0 .79.193 2.42-.834l8.585-7.902h6.403c.065-.107.15-.214.215-.321l1.155-1.627c.214-.3 1.007-1.243 1.648-1.886H10.874c-.6 0-1.114.3-1.455.729l-.023-.022-5.63 5.933V27.899c.02-.107.063-.193.063-.321V13.467c0-5.14 4.197-9.336 9.336-9.336h22.463c5.139 0 9.314 4.197 9.314 9.336v8.929c1.393-.193 2.784-.343 3.834-.363v-6.725l-.214-4.196z"
mask="url(#b)"/>
</g>
<path fill="#57A244" d="M17.107 24.661a3.178 3.178 0 0 1-3.175-3.175 3.178 3.178 0 0 1 3.175-3.173h20.56a3.178 3.178 0 0 1 3.176 3.173 3.178 3.178 0 0 1-3.175 3.175h-20.56z"/>
<path fill="#000" d="M17.107 31.204h20.56a2.281 2.281 0 0 0 2.285-2.284 2.281 2.281 0 0 0-2.284-2.284h-20.56a2.282 2.282 0 0 0-2.285 2.284 2.282 2.282 0 0 0 2.284 2.284"/>
<g transform="translate(20.857 30.466)">
<path fill="#57A244"
d="M35.694.838c-.622 0-.836.085-1.286.257-.47.171-.984.536-1.37.877l-.964.9c-.086.085-.086.107-.15.192-1.777 2.227-2.182 2.592-3.596 5.418-.643 1.327-1.415 2.549-2.227 3.768-.536.836-1.05 1.672-1.672 2.441-.064.086-.107.107-.17.193-.387.472-.878.9-1.35 1.329-.3.278-.683.535-1.026.771-.3.213-.6.405-.922.577l-.492.278c-.108.065-.15.086-.258.15-.064.022-.171.086-.235.108a3.488 3.488 0 0 0-.279.128c-1.948.963-4.518 1.584-6.744 1.82l-1.349.15c-.407.043-1.478.086-2.464.086-.834 0-1.605-.022-1.863-.086l.172-.386c.321-.748.686-1.477 1.093-2.184.064-.128.107-.214.193-.343l.812-1.37 2.057-2.826 1.841-1.927.129-.128.17-.129.409-.364c.064-.043.107-.065.17-.107.106-.108.17-.15.278-.236l1.95-1.348c.662-.429 1.37-.836 2.034-1.222l2.12-1.134c.79-.407 2.14-1.114 2.912-1.414L25.8 4.05c-.322.043-.729.213-1.029.322a20.2 20.2 0 0 0-1.005.34l-2.014.708c-.963.321-1.927.75-2.89 1.136l-1.843.812c-.684.279-1.755.836-2.46 1.243-.772.428-1.522.941-2.293 1.391l-2.548 1.8c-.065.062-.129.105-.193.15l-1.434 1.241c-.45.429-.965.879-1.348 1.348-.086.086-.086.107-.174.193-.384.386-.705.836-1.026 1.264a20.611 20.611 0 0 0-1.35 2.013l-.684 1.307c-.279.534-1.413 3.168-1.456 3.896h-.087c0-.107-.277-1.307-.363-2.333v-.858c0-.042 0-.064.02-.085.087-.557.066-.943.173-1.649.32-1.926 1.177-3.898 2.248-5.525l1.113-1.583c.321-.408 1.5-1.779 1.862-2.034.343-.279.643-.686 1.008-.965.17-.128.32-.278.492-.428.193-.129.322-.257.515-.406l1.048-.773a23.77 23.77 0 0 1 3.384-2.034c1.262-.64 2.505-1.134 3.832-1.648 1.691-.684 4.005-1.157 5.76-1.52 1.842-.364 6.533-1.2 8.78-1.2h.47c1.158 0 2.956.043 3.385.665"
mask="url(#d)"/>
</g>
</g>
</svg>
</symbol>
<symbol id="icon-tvd-leads" viewBox="0 0 60 60">
<defs>
<polygon id="path-1" points="0.000112903226 0.0353225806 49.8033387 0.0353225806 49.8033387 49.8385806 0.000112903226 49.8385806"></polygon>
</defs>
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/card/lead_form/default">
<g id="Group-6" transform="translate(5.000000, 5.000000)">
<g id="Group-3" transform="translate(0.000000, 0.125968)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="Clip-2"></g>
<path d="M46.6804355,43.6053548 C46.6804355,43.9214839 46.6299516,44.2122903 46.5414032,44.5029355 L32.5701129,30.5443871 L46.6804355,19.2789032 L46.6804355,43.6053548 Z M5.53785484,46.627129 L19.8380161,32.3397097 L24.8954355,35.8168065 L29.9654355,32.3397097 L44.2654355,46.627129 C44.0378548,46.6905161 5.76559677,46.6905161 5.53785484,46.627129 L5.53785484,46.627129 Z M3.12285484,43.6053548 L3.12285484,19.2789032 L17.2207581,30.5443871 L3.26204839,44.5029355 C3.1735,44.2122903 3.12285484,43.9214839 3.12285484,43.6053548 L3.12285484,43.6053548 Z M43.6586613,10.5800323 L43.4310806,11.0226129 C42.9505968,11.9329355 42.6217258,12.5650323 42.3309194,13.209871 L46.6804355,15.5869677 L39.7643065,20.8468065 L39.7643065,20.8593871 L35.7309194,23.9192258 L35.7309194,23.9318065 L35.7183387,23.9318065 L24.8954355,32.1755161 L18.9907581,27.6743871 L16.4115645,25.7145484 L12.9091452,23.0468065 L10.8862419,21.5042258 L3.12285484,15.5869677 L24.8701129,3.65132258 L30.1425323,6.53406452 C30.7620484,6.28116129 32.2033387,5.71229032 33.8851129,5.08003226 L24.8954355,0.0351935484 L0.000112903226,14.0318065 L0.000112903226,43.6053548 C0.000112903226,47.0443871 2.79414516,49.8385806 6.22059677,49.8385806 L43.5701129,49.8385806 C47.0091452,49.8385806 49.8033387,47.0443871 49.8033387,43.6053548 L49.8033387,14.0318065 L43.6586613,10.5800323 Z"
id="Fill-1" fill="#000000" mask="url(#mask-2)"></path>
</g>
<path d="M45.5931452,5.58529032 C44.8850806,5.71174194 44.6321774,5.86351613 44.1644355,6.15432258 C43.6207258,6.48303226 43.1023387,7.014 42.7355645,7.50722581 L41.8126613,8.79690323 C41.7366935,8.92319355 41.7366935,8.94867742 41.6734677,9.0623871 C40.0804032,12.0969032 39.7012097,12.6025484 38.6895968,16.2691613 C38.2218548,17.9760968 37.6149194,19.5944839 36.9321774,21.2130323 C36.5402419,22.1612581 36.1862097,23.1348065 35.7308871,24.0577097 L24.8954032,32.3014194 L18.9907258,27.8002903 L20.0402419,25.5370645 L21.7597581,22.844 C21.8104032,22.7681935 21.8355645,22.7175484 21.8987903,22.6543226 C21.9745968,22.5531935 21.9745968,22.5657742 22.0505645,22.4772258 L22.4678226,21.9462581 C22.5310484,21.8704516 22.5562097,21.845129 22.6321774,21.7691613 C22.7460484,21.642871 22.7965323,21.5669032 22.9229839,21.427871 L24.8954032,19.4048065 C25.5654032,18.7348065 26.3115323,18.1152903 27.0195968,17.4957742 L29.2447581,15.6749677 C30.0792742,15.030129 31.5207258,13.8669032 32.3425,13.3359355 L34.6942742,11.629 C34.3275,11.7427097 33.8723387,12.0588387 33.543629,12.2359355 C33.1642742,12.4507742 32.8229839,12.6404516 32.4310484,12.8680323 L30.243629,14.1577097 C29.1689516,14.7646452 28.1321774,15.5106129 27.0952419,16.1680323 L25.1104032,17.5588387 C24.3770161,18.0393226 23.2389516,18.9496452 22.5057258,19.5691613 C21.6839516,20.2646452 20.9252419,21.0359355 20.1287903,21.744 L17.5241129,24.4623871 C17.4608871,24.5381935 17.3976613,24.6014194 17.3471774,24.6646452 L16.4115323,25.8406129 L12.9091129,23.1727097 C13.2378226,22.629 13.5666935,22.1233548 13.7310484,21.9335161 C14.0723387,21.529 14.3378226,20.9852903 14.7171774,20.5681935 C14.8815323,20.3910968 15.0205645,20.1635161 15.1976613,19.9610968 C15.3747581,19.7588387 15.5137903,19.5691613 15.6907258,19.3669032 L16.7528226,18.2164194 C17.8276613,17.0657742 19.0160484,15.9910968 20.2678226,15.030129 C21.6207258,13.9933548 22.9608871,13.1083548 24.4023387,12.2106129 C26.2608871,11.0348065 28.8402419,9.93480645 30.8379839,9.11303226 C32.9241129,8.25319355 38.2595968,6.17964516 40.9023387,5.67383871 L40.9275,5.66125806 L41.0539516,5.63593548 L41.458629,5.56012903 C42.2552419,5.40835484 43.3171774,5.21867742 44.1770161,5.21867742 C44.7966935,5.21867742 45.3276613,5.31980645 45.5931452,5.58529032"
id="Fill-4" fill="#59A31D"></path>
</g>
</g>
</g>
</symbol>
<symbol id="icon-tvd-one" viewBox="0 0 60 60">
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/card/single_page/default" fill-rule="nonzero">
<path d="M49,52.5 L11,52.5 C9.06700338,52.5 7.5,50.9329966 7.5,49 L7.5,11 C7.5,9.06700338 9.06700338,7.5 11,7.5 L49,7.5 C50.9329966,7.5 52.5,9.06700338 52.5,11 L52.5,49 C52.5,50.9329966 50.9329966,52.5 49,52.5 Z" id="Path" stroke="#379108" stroke-width="5"></path>
<polygon id="Shape" fill="#000000" points="29.5555556 43.7777778 35.1111111 43.7777778 35.1111111 16 24 16 24 21.5555556 29.5555556 21.5555556"></polygon>
</g>
</g>
</symbol>
<symbol id="icon-tvd-contact-form" viewBox="0 0 60 60">
<g fill="none" fill-rule="nonzero">
<path fill="#000" d="M51.999 15.806L48 19.946v-7.284C48 11.183 46.287 10 44.145 10H8.855C6.713 10 5 11.183 5 12.662v35.676C5 49.817 6.713 51 8.855 51h35.29C46.287 51 48 49.817 48 48.338v-9.679l3.999-4.141V49.13c.084 3.275-3.558 5.87-7.964 5.87H9.048C4.643 55 1 52.343 1 49.13V11.87C1 8.657 4.643 6 9.048 6H43.95c4.405 0 8.048 2.657 8.048 5.87v3.936z"/>
<path fill="#379108" d="M36.36 32H12.122C10.934 32 10 30.9 10 29.5s.934-2.5 2.122-2.5h27.756c.373 0 .72.108 1.022.3L36.36 32zm-8.29 12H12.122C10.934 44 10 42.9 10 41.5s.934-2.5 2.122-2.5h17.119l-1.171 5zm11.808-24H12.122C10.934 20 10 18.9 10 17.5s.934-2.5 2.122-2.5h27.756C41.066 15 42 16.1 42 17.5s-.934 2.5-2.122 2.5z"/>
<path fill="#000" d="M47.683 23.259l6.148 6.462-15.537 16.217-6.147-6.463 15.536-16.216zm10.73-1.646l-2.682-2.82c-1.006-1.057-2.795-1.057-3.8 0l-2.683 2.703 6.147 6.463 3.018-3.173a2.438 2.438 0 0 0 0-3.173zm-29.396 26.91c-.112.47.336.94.894.822l6.818-1.762-6.147-6.463-1.565 7.403z"/>
</g>
</symbol>
<symbol id="icon-tvd-reload" viewBox="0 0 60 60">
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/card/one_session/default">
<g id="Group" transform="translate(9.000000, 5.000000)">
<path d="M23.5442561,7.13169978 L23.5442561,12.5328132 C31.0320151,13.8162461 36.7269303,20.3938397 36.7269303,28.3350807 C36.7269303,36.2763217 31.0320151,42.8539152 23.5442561,44.1373481 L23.5442561,49.5384615 C33.9585687,48.2282905 42,39.2442602 42,28.3350807 C42,17.4259011 33.9585687,8.44187086 23.5442561,7.13169978 Z" id="Path" fill="#000000" fill-rule="nonzero"></path>
<polygon id="Triangle" fill="#000000" transform="translate(17.230769, 10.230769) scale(-1, 1) rotate(90.000000) translate(-17.230769, -10.230769) " points="17.2307692 3.23076923 26.9230769 17.2307692 7.53846154 17.2307692"></polygon>
<path d="M8.01506591,19.0569304 L4.29755179,15.2601081 C1.92467043,18.3617376 0.448210923,21.9446544 0,25.6612621 L5.32580038,25.6612621 C5.69491525,23.33504 6.61770245,21.0622943 8.01506591,19.0569304 L8.01506591,19.0569304 Z" id="Path" fill="#379108" fill-rule="nonzero"></path>
<path d="M5.32580038,31.0088992 L0,31.0088992 C0.448210923,34.7255069 1.89830508,38.3084237 4.27118644,41.4100532 L7.98870056,37.6132309 C6.61770245,35.607867 5.69491525,33.3618595 5.32580038,31.0088992 L5.32580038,31.0088992 Z" id="Path" fill="#379108" fill-rule="nonzero"></path>
<path d="M7.98870056,45.2336137 C11.047081,47.6400504 14.606403,49.0839124 18.2711864,49.5384615 L18.2711864,44.1106099 C15.9774011,43.7095372 13.7627119,42.8004389 11.7853107,41.3565769 L7.98870056,45.2336137 Z" id="Path" fill="#379108" fill-rule="nonzero"></path>
</g>
</g>
</g>
</symbol>
<symbol id="icon-tvd-ovation" viewBox="0 0 60 60">
<defs>
<polygon id="path-1" points="0 0.0533076923 50.2812308 0.0533076923 50.2812308 42.0725385 0 42.0725385"></polygon>
<polygon id="path-3" points="0.540307692 0.320307692 25.0853846 0.320307692 25.0853846 16.9230769 0.540307692 16.9230769"></polygon>
</defs>
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/card/testimonial_form/default">
<g id="Group-9" transform="translate(4.000000, 5.000000)">
<path d="M17.3803846,13.0911538 C17.5234615,13.2380769 17.6496154,13.3957692 17.7596154,13.5573077 C17.8680769,13.7219231 17.9588462,13.9080769 18.0296154,14.1173077 C18.1011538,14.325 18.1373077,14.5596154 18.1373077,14.8234615 C18.1373077,15.1419231 18.075,15.4419231 17.9557692,15.7280769 C17.8357692,16.0103846 17.6680769,16.2596154 17.4542308,16.4734615 C17.2411538,16.6865385 16.9896154,16.8573077 16.6996154,16.9826923 C16.4096154,17.1073077 16.0934615,17.1719231 15.755,17.1719231 C15.415,17.1719231 15.105,17.1003846 14.8188462,16.9588462 C14.5334615,16.8165385 14.2903846,16.6273077 14.0888462,16.3919231 C13.8857692,16.1565385 13.7296154,15.8819231 13.6203846,15.5726923 C13.5103846,15.2580769 13.4565385,14.9326923 13.4565385,14.5926923 C13.4565385,13.8580769 13.5780769,13.1857692 13.825,12.5711538 C14.0719231,11.9603846 14.3919231,11.4126923 14.7842308,10.9288462 C15.1811538,10.4473077 15.6173077,10.025 16.0996154,9.655 C16.5819231,9.29192308 17.0519231,8.98730769 17.5126923,8.74653846 C17.6657692,8.65807692 17.7819231,8.66653846 17.8642308,8.77038462 C17.9457692,8.875 17.9126923,9.00730769 17.7596154,9.17423077 C17.5288462,9.40192308 17.3211538,9.67730769 17.1334615,9.99423077 C16.9496154,10.3119231 16.8088462,10.635 16.7165385,10.9634615 C16.6234615,11.2919231 16.5888462,11.6065385 16.6180769,11.9073077 C16.645,12.2096154 16.7557692,12.4573077 16.955,12.6534615 C17.095,12.7973077 17.2373077,12.9442308 17.3803846,13.0911538 M11.7965385,13.0911538 C11.9403846,13.2380769 12.0642308,13.3957692 12.175,13.5573077 C12.2834615,13.7219231 12.3726923,13.9080769 12.4442308,14.1173077 C12.5165385,14.325 12.5526923,14.5596154 12.5526923,14.8234615 C12.5526923,15.1419231 12.4919231,15.4419231 12.3726923,15.7280769 C12.2503846,16.0103846 12.0826923,16.2596154 11.8703846,16.4734615 C11.6565385,16.6865385 11.405,16.8573077 11.1142308,16.9826923 C10.825,17.1073077 10.5088462,17.1719231 10.1696154,17.1719231 C9.83038462,17.1719231 9.51961538,17.1003846 9.23423077,16.9588462 C8.94884615,16.8165385 8.70576923,16.6273077 8.505,16.3919231 C8.30038462,16.1565385 8.145,15.8819231 8.03576923,15.5726923 C7.92653846,15.2580769 7.87192308,14.9326923 7.87192308,14.5926923 C7.87192308,13.8580769 7.99423077,13.1857692 8.23961538,12.5711538 C8.48576923,11.9603846 8.80653846,11.4126923 9.20115385,10.9288462 C9.59730769,10.4473077 10.0326923,10.025 10.5165385,9.655 C10.9965385,9.29192308 11.4673077,8.98730769 11.9273077,8.74653846 C12.0811538,8.65807692 12.1973077,8.66653846 12.2811538,8.77038462 C12.3634615,8.875 12.3288462,9.00730769 12.175,9.17423077 C11.9426923,9.40192308 11.7357692,9.67730769 11.5503846,9.99423077 C11.3642308,10.3119231 11.225,10.635 11.1311538,10.9634615 C11.0380769,11.2919231 11.005,11.6065385 11.0326923,11.9073077 C11.0596154,12.2096154 11.1703846,12.4573077 11.3703846,12.6534615 C11.5111538,12.7973077 11.6542308,12.9442308 11.7965385,13.0911538"
id="Fill-1" fill="#59A31D"></path>
<g id="Group-5" transform="translate(0.000000, 0.715923)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="Clip-4"></g>
<path d="M43.5958462,17.6186923 L43.0812308,18.1340769 L33.7673846,27.4363846 L31.9773846,29.2256154 L25.0796923,36.1240769 L15.7466154,26.6517692 L14.7696923,25.7033077 L6.68738462,17.6079231 C5.232,16.1656154 4.43969231,14.2425385 4.43969231,12.1848462 C4.43969231,10.1279231 5.232,8.19330769 6.69738462,6.73869231 C8.13969231,5.28715385 10.0635385,4.49176923 12.1196923,4.49176923 C14.1766154,4.49176923 16.1004615,5.28715385 17.5550769,6.751 L25.1243077,14.3202308 L28.2650769,11.1894615 L32.7150769,6.751 C34.1689231,5.29715385 36.1035385,4.49176923 38.1612308,4.49176923 C40.2073846,4.49176923 42.1396923,5.29715385 43.5958462,6.751 C45.0389231,8.19330769 45.8435385,10.1279231 45.8435385,12.1848462 C45.8435385,14.231 45.0389231,16.1656154 43.5958462,17.6186923 M46.7258462,3.60869231 C44.4450769,1.31715385 41.392,0.0533076923 38.1612308,0.0533076923 C34.9073846,0.0533076923 31.8773846,1.31715385 29.5858462,3.60869231 L25.1343077,8.04869231 L20.6950769,3.60869231 C18.4050769,1.31715385 15.3627692,0.0533076923 12.1196923,0.0533076923 C8.87815385,0.0533076923 5.83738462,1.31715385 3.54507692,3.60869231 C1.25276923,5.88946154 -0.000307692308,8.94253846 -0.000307692308,12.1848462 C-0.000307692308,15.4171538 1.25276923,18.4686923 3.54507692,20.7486923 L24.8550769,42.0725385 C25.1581538,41.3233077 25.5489231,40.5740769 26.0081538,39.881 L26.0166154,39.8571538 L26.0304615,39.8463846 L26.8458462,38.6848462 C27.0596923,38.4048462 28.0089231,37.2979231 28.412,36.9733077 C28.4673846,36.9286923 28.5573846,36.8525385 28.6366154,36.7617692 C28.7796923,36.6156154 28.9589231,36.4263846 29.172,36.2686923 C29.2050769,36.2471538 29.2373846,36.2240769 29.2612308,36.2017692 C29.3496923,36.1240769 29.4289231,36.0463846 29.5073846,35.9786923 C29.5512308,35.9456154 29.5966154,35.9117692 29.6412308,35.8771538 C29.7204615,35.8094615 29.8089231,35.7440769 29.8989231,35.6663846 L30.6704615,35.0948462 C31.4635385,34.5256154 32.3473846,33.9871538 33.2866154,33.5179231 C33.6996923,33.3063846 34.1250769,33.1171538 34.5266154,32.9486923 L46.7258462,20.7486923 C49.0181538,18.4686923 50.2812308,15.4171538 50.2812308,12.1848462 C50.2812308,8.94253846 49.0181538,5.88946154 46.7258462,3.60869231"
id="Fill-3" fill="#000000" mask="url(#mask-2)"></path>
</g>
<g id="Group-8" transform="translate(26.153846, 33.023615)">
<mask id="mask-4" fill="white">
<use xlink:href="#path-3"></use>
</mask>
<g id="Clip-7"></g>
<path d="M22.3103077,0.320307692 C20.6949231,0.320307692 17.3164615,0.929538462 15.9864615,1.19569231 C14.7218462,1.44723077 13.068,1.79646154 11.838,2.27646154 C10.8926154,2.64646154 9.99415385,3.01030769 9.08338462,3.46415385 C8.23723077,3.888 7.41107692,4.38184615 6.64415385,4.93876923 L5.88876923,5.49723077 C5.75492308,5.59492308 5.65876923,5.68723077 5.52569231,5.79107692 C5.39876923,5.88953846 5.288,6.00492308 5.17030769,6.09261538 C4.90415385,6.29184615 4.68415385,6.58569231 4.43338462,6.78338462 C4.18030769,6.97953846 3.32261538,7.95415385 3.10184615,8.25338462 L2.29569231,9.39030769 C1.51876923,10.5695385 0.911076923,11.9795385 0.684153846,13.378 C0.601846154,13.8895385 0.607230769,14.158 0.550307692,14.5572308 C0.544923077,14.5764615 0.542615385,14.5964615 0.540307692,14.6156923 L0.540307692,15.2333846 C0.595692308,15.9833846 0.797230769,16.8510769 0.798,16.9233846 L0.855692308,16.9233846 C0.899538462,16.3933846 1.70646154,14.5049231 1.90338462,14.1110769 L2.40107692,13.1795385 C2.70107692,12.6795385 3.02184615,12.1872308 3.37107692,11.7218462 C3.60261538,11.4110769 3.84646154,11.0941538 4.12107692,10.8141538 C4.18338462,10.7510769 4.18338462,10.7372308 4.23646154,10.6718462 C4.52107692,10.3303077 4.89415385,10.018 5.20569231,9.69953846 L6.25184615,8.80338462 C6.29338462,8.77030769 6.33492308,8.74184615 6.38107692,8.70569231 L8.22569231,7.40569231 C8.78107692,7.078 9.31261538,6.71261538 9.87492308,6.398 C10.3810769,6.11569231 11.1510769,5.71107692 11.6433846,5.50953846 L12.9710769,4.91953846 C13.6587692,4.64876923 14.3549231,4.328 15.0595385,4.09646154 L16.498,3.59030769 C16.7510769,3.50415385 16.9741538,3.43030769 17.2233846,3.348 C17.4395385,3.27492308 17.7426154,3.14030769 17.9710769,3.12184615 L16.3872308,3.85261538 C15.8449231,4.07338462 14.8626154,4.588 14.2926154,4.87415385 L12.7695385,5.69338462 C12.2872308,5.97492308 11.7772308,6.258 11.3087692,6.57107692 L9.90569231,7.54107692 C9.81876923,7.60646154 9.78107692,7.64338462 9.69646154,7.70492308 C9.65030769,7.74107692 9.628,7.75569231 9.58338462,7.78953846 L9.27569231,8.05415385 C9.22261538,8.10030769 9.21646154,8.09492308 9.16261538,8.14184615 C9.12415385,8.178 9.09953846,8.20492308 9.06261538,8.24338462 L7.73569231,9.63030769 L6.26107692,11.668 L5.67184615,12.6533846 C5.61953846,12.7410769 5.58723077,12.8095385 5.54107692,12.8933846 C5.248,13.398 4.98261538,13.9272308 4.74261538,14.4656923 L4.62723077,14.7495385 C5.02184615,14.8418462 7.208,14.8187692 7.73492308,14.7441538 L8.71338462,14.638 C10.3156923,14.4656923 12.1626154,14.0203077 13.5695385,13.3203077 C13.6387692,13.2895385 13.6987692,13.2656923 13.7703077,13.2364615 C13.8249231,13.2118462 13.888,13.1787692 13.9426154,13.1503077 C14.0149231,13.1133846 14.0449231,13.088 14.1226154,13.0456923 L14.4749231,12.8541538 C14.7126154,12.7264615 14.9264615,12.5795385 15.1418462,12.4364615 C15.3956923,12.2672308 15.6649231,12.0756923 15.8918462,11.8718462 C16.2218462,11.5756923 16.5749231,11.2633846 16.8533846,10.9172308 C16.8956923,10.8626154 16.9326154,10.8372308 16.9741538,10.7826154 C17.4233846,10.2249231 17.7903077,9.618 18.1887692,9.02415385 C18.7718462,8.14953846 19.3164615,7.25953846 19.7895385,6.31261538 C20.8095385,4.268 21.0941538,4.01184615 22.3749231,2.41261538 C22.4264615,2.34723077 22.4287692,2.33415385 22.4926154,2.27107692 L23.1756923,1.61415385 C23.4564615,1.36723077 23.8210769,1.11261538 24.1749231,0.981846154 C24.4903077,0.865692308 24.6518462,0.806461538 25.0856923,0.806461538 C24.7826154,0.356461538 23.4903077,0.321846154 22.6564615,0.320307692 L22.4018462,0.320307692 L22.3249231,0.320307692 L22.3103077,0.320307692 Z M18.0564615,3.09338462 C18.0241538,3.12184615 18.1049231,3.12184615 17.9710769,3.12184615 C18.0018462,3.09338462 17.9210769,3.09338462 18.0564615,3.09338462 L18.0564615,3.09338462 Z"
id="Fill-6" fill="#59A31D" mask="url(#mask-4)"></path>
</g>
</g>
</g>
</g>
</symbol>
<symbol id="icon-tvd-contact-form" viewBox="0 0 60 60">
<g fill="none" fill-rule="nonzero">
<path fill="#000" d="M51.999 15.806L48 19.946v-7.284C48 11.183 46.287 10 44.145 10H8.855C6.713 10 5 11.183 5 12.662v35.676C5 49.817 6.713 51 8.855 51h35.29C46.287 51 48 49.817 48 48.338v-9.679l3.999-4.141V49.13c.084 3.275-3.558 5.87-7.964 5.87H9.048C4.643 55 1 52.343 1 49.13V11.87C1 8.657 4.643 6 9.048 6H43.95c4.405 0 8.048 2.657 8.048 5.87v3.936z"/>
<path fill="#379108" d="M36.36 32H12.122C10.934 32 10 30.9 10 29.5s.934-2.5 2.122-2.5h27.756c.373 0 .72.108 1.022.3L36.36 32zm-8.29 12H12.122C10.934 44 10 42.9 10 41.5s.934-2.5 2.122-2.5h17.119l-1.171 5zm11.808-24H12.122C10.934 20 10 18.9 10 17.5s.934-2.5 2.122-2.5h27.756C41.066 15 42 16.1 42 17.5s-.934 2.5-2.122 2.5z"/>
<path fill="#000" d="M47.683 23.259l6.148 6.462-15.537 16.217-6.147-6.463 15.536-16.216zm10.73-1.646l-2.682-2.82c-1.006-1.057-2.795-1.057-3.8 0l-2.683 2.703 6.147 6.463 3.018-3.173a2.438 2.438 0 0 0 0-3.173zm-29.396 26.91c-.112.47.336.94.894.822l6.818-1.762-6.147-6.463-1.565 7.403z"/>
</g>
</symbol>
<symbol id="icon-delete" viewBox="0 0 14 16">
<g fill="none" fill-rule="evenodd">
<g fill="#B0B9C1" fill-rule="nonzero">
<g>
<path d="M649.75 22h-3.25l-1.05-1.4c-.283-.378-.728-.6-1.2-.6h-2.5c-.472 0-.917.222-1.2.6L639.5 22h-3.25c-.138 0-.25.112-.25.25v.5c0 .138.112.25.25.25h.59l1.038 11.634c.07.774.718 1.366 1.494 1.366h7.256c.776 0 1.424-.592 1.494-1.366L649.159 23h.591c.138 0 .25-.112.25-.25v-.5c0-.138-.112-.25-.25-.25zm-8.4-.8c.095-.126.243-.2.4-.2h2.5c.157 0 .305.074.4.2l.6.8h-4.5l.6-.8zm5.775 13.344c-.021.258-.238.457-.497.456h-7.256c-.26 0-.476-.198-.497-.456L637.844 23h10.312l-1.031 11.544z"
transform="translate(-1156.000000, -327.000000) translate(520.000000, 307.000000)"/>
</g>
</g>
</g>
</symbol>
<symbol id="icon-edit" viewBox="0 0 16 16">
<g fill="none" fill-rule="evenodd">
<g fill="#C0CAD1" fill-rule="nonzero">
<g>
<path d="M613.682 20.44l1.879 1.878c.585.585.585 1.535 0 2.12l-11.16 11.16-3.568.397c-.478.054-.882-.35-.828-.828l.396-3.568 11.16-11.16c.586-.585 1.536-.585 2.121 0zm-3.846 3.345l-8.342 8.34-.296 2.681 2.681-.296 8.34-8.343-2.383-2.382zm2.536-2.539l-1.729 1.729 2.382 2.382 1.729-1.729c.139-.135.139-.364 0-.503l-1.879-1.879c-.135-.135-.364-.143-.503 0z"
transform="translate(-1120.000000, -327.000000) translate(520.000000, 307.000000)"/>
</g>
</g>
</g>
</symbol>
<symbol id="icon-checkmark-light" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M7.778 15.556l-5.556-5.342 1.556-1.496 4 3.846 8.444-8.12 1.556 1.496z"/>
</symbol>
<symbol id="icon-content-sets" viewBox="0 0 23 20">
<g fill="none" fill-rule="evenodd">
<g>
<g>
<g fill="#444648" fill-rule="nonzero">
<path d="M20.714 0H2.143C.96 0 0 .96 0 2.143V5c0 .393.321.714.714.714h.715v12.143c0 1.183.96 2.143 2.142 2.143h15.715c1.183 0 2.143-.96 2.143-2.143V5.714h.714c.393 0 .714-.321.714-.714V2.143C22.857.96 21.897 0 20.714 0zM20 17.857c0 .393-.321.714-.714.714H3.57c-.392 0-.714-.321-.714-.714V5.714H20v12.143zm1.429-13.571h-20V2.143c0-.393.321-.714.714-.714h18.571c.393 0 .715.321.715.714v2.143zM9.107 8.4h4.643c.295 0 .536-.241.536-.536v-.357c0-.294-.241-.536-.536-.536H9.107c-.294 0-.536.242-.536.536v.357c0 .295.242.536.536.536z"
transform="translate(-172.000000, -225.000000) translate(172.000000, 225.000000)"/>
</g>
<path stroke="#3E9411" stroke-linecap="round" stroke-width="1.3" d="M4.8 13.6L18.4 13.6M4.8 11.2L18.4 11.2M4.8 16L18.4 16" transform="translate(-172.000000, -225.000000) translate(172.000000, 225.000000)"/>
</g>
</g>
</g>
</symbol>
<symbol id="icon-global-fields" viewBox="0 0 24 20">
<g fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
<path stroke="#444648" d="M21.5 19h-20"/>
<path stroke="#3E9411" d="M13.5 13h-12M13.5 7h-12"/>
<path stroke="#444648" d="M21.5 1h-20"/>
<path stroke="#3E9411" d="M23 14l-4.5-4L23 6"/>
</g>
</symbol>
<symbol id="icon-smart-complete" viewBox="0 0 20 26">
<path fill="#636363" fill-rule="nonzero"
d="M17.409 3.218h-4.59c.02-.13.03-.266.03-.402C12.85 1.262 11.55 0 9.948 0 8.347 0 7.046 1.262 7.046 2.816c0 .136.01.272.032.402H2.487C1.114 3.218 0 4.3 0 5.632v17.702c0 1.332 1.114 2.413 2.487 2.413h14.922c1.373 0 2.487-1.08 2.487-2.413V5.632c0-1.332-1.114-2.414-2.487-2.414zM9.948 1.61c.689 0 1.243.538 1.243 1.207s-.554 1.207-1.243 1.207c-.69 0-1.244-.538-1.244-1.207S9.26 1.61 9.948 1.61zm8.29 21.725a.82.82 0 0 1-.83.804H2.488a.82.82 0 0 1-.829-.804V5.632a.82.82 0 0 1 .829-.804h2.487v1.005c0 .332.28.604.622.604H14.3a.615.615 0 0 0 .622-.604V4.828h2.487a.82.82 0 0 1 .829.804v17.702zm-12.435-6.84c-.69 0-1.244.539-1.244 1.207 0 .67.555 1.207 1.244 1.207s1.243-.538 1.243-1.207c0-.668-.554-1.207-1.243-1.207zm8.704.403H8.704a.41.41 0 0 0-.414.402v.805a.41.41 0 0 0 .414.402h5.803a.41.41 0 0 0 .415-.402v-.805a.41.41 0 0 0-.415-.402zm-7.968-3.3L9.865 10.4a.265.265 0 0 0 0-.383l-.653-.638a.284.284 0 0 0-.394 0l-2.466 2.373-1.067-1.05a.284.284 0 0 0-.394 0l-.658.633a.265.265 0 0 0 0 .382l1.922 1.88c.099.106.275.106.384 0zm7.968-1.528h-4.02l-1.674 1.61h5.694a.41.41 0 0 0 .415-.403v-.805a.41.41 0 0 0-.415-.402z"/>
</symbol>
<symbol id="icon-ss-logo" viewBox="0 0 43 41">
<g fill="none" fill-rule="nonzero" stroke="#FFF">
<g stroke-width="1.7">
<path d="M22.293 5.083c1.223-.944 2.48-1.18 3.77-.708 1.292.472 2.086 1.483 2.385 3.033 1.351-.24 2.475.375 3.371 1.847.896 1.472.896 2.698 0 3.679"/>
<path d="M28.602 13.216c2.864-.862 4.593-.23 5.189 1.897.595 2.127.007 3.831-1.766 5.114.656 1.649.656 2.978 0 3.987-.656 1.01-1.797 1.514-3.423 1.514"/>
<path d="M26.977 22.65c1.883 1.503 2.229 3.232 1.037 5.187-1.787 2.933-5.712.977-5.712-.5"/>
<path stroke-linecap="round" d="M26.558 12.259c.908.08 1.622.472 2.143 1.172.52.701.741 1.458.661 2.27M25.052 23.734c.757.04 1.423-.28 1.997-.959.573-.678.84-1.312.802-1.9"/>
</g>
<g stroke-width="1.7">
<path d="M20.707 5.083c-1.223-.944-2.48-1.18-3.77-.708-1.292.472-2.086 1.483-2.385 3.033-1.351-.24-2.475.375-3.371 1.847-.896 1.472-.896 2.698 0 3.679"/>
<path d="M14.398 13.216c-2.864-.862-4.593-.23-5.189 1.897-.595 2.127-.007 3.831 1.766 5.114-.656 1.649-.656 2.978 0 3.987.656 1.01 1.797 1.514 3.423 1.514"/>
<path d="M16.023 22.65c-1.883 1.503-2.229 3.232-1.037 5.187 1.787 2.933 5.712.977 5.712-.5"/>
<path stroke-linecap="round" d="M16.442 12.259c-.908.08-1.622.472-2.143 1.172-.52.701-.741 1.458-.661 2.27M17.948 23.734c-.757.04-1.423-.28-1.997-.959-.573-.678-.84-1.312-.802-1.9"/>
</g>
<g stroke-width="1.7">
<path d="M21.5 3.631V28.21M17.29 34.206h8.21v3.9l-2.538 2.032h-3.5l-2.172-2.033z"/>
</g>
<g stroke-linecap="round" stroke-width="1.6">
<path d="M35.813 3.472l2.526-2.388M35.813 29.315l2.526 2.388M38.339 16.37h3.367"/>
</g>
<g stroke-linecap="round" stroke-width="1.6">
<path d="M7.187 3.472L4.661 1.084M7.187 29.315l-2.526 2.388M4.661 16.37H1.294"/>
</g>
</g>
</symbol>
<symbol id="icon-phone-new" viewBox="0 0 19 19">
<path fill="none" fill-rule="evenodd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"
d="M17.628 13.367l-2.261-2.252a1.57 1.57 0 0 0-2.215 0l-1.876 1.868a9.734 9.734 0 0 1-5.223-5.2l1.875-1.868a1.556 1.556 0 0 0 0-2.206L5.667 1.457a1.571 1.571 0 0 0-2.216 0l-1.075 1.07a4.707 4.707 0 0 0-1.285 4.251c1.1 5.615 5.554 10.05 11.193 11.146 1.55.301 3.153-.168 4.27-1.28l1.074-1.07a1.555 1.555 0 0 0 0-2.207z"/>
</symbol>
<symbol id="icon-text-new" viewBox="0 0 18 16">
<g fill="none" fill-rule="evenodd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5">
<path d="M1 1h16M1 5.737h16M1 10.474h16M1 15.21h9.6"/>
</g>
</symbol>
<symbol id="icon-address-new" viewBox="0 0 17 23">
<g fill="none" fill-rule="evenodd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5">
<path d="M8.501 22s7.5-9.188 7.5-13.125C16 4.937 13.5 1 8.5 1c-5 0-7.5 3.938-7.5 7.875C1 12.813 8.5 22 8.5 22"/>
<path d="M8.5 11.5c-1.553 0-2.812-1.283-2.812-2.864 0-1.58 1.259-2.863 2.812-2.863s2.813 1.283 2.813 2.863c0 1.581-1.26 2.864-2.813 2.864z"/>
</g>
</symbol>
<symbol id="icon-envelope-new" viewBox="0 0 19 16">
<g fill="none" fill-rule="evenodd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5">
<path d="M1 4.72L8.205 7.97a3.16 3.16 0 0 0 2.59 0L18 4.72"/>
<path d="M16.455 14.6H2.545C1.694 14.6 1 13.923 1 13.089V2.51C1 1.677 1.693 1 2.546 1h13.909C17.308 1 18 1.677 18 2.511V13.09c0 .834-.692 1.511-1.545 1.511z"/>
</g>
</symbol>
<symbol id="icon-link-new" viewBox="0 0 17 18">
<path fill-rule="evenodd"
d="M7.371 15.863c-.553.554-1.2.924-1.942 1.113a4.454 4.454 0 0 1-2.225 0 4.146 4.146 0 0 1-1.942-1.113 4.146 4.146 0 0 1-1.113-1.942 4.454 4.454 0 0 1 0-2.225 4.146 4.146 0 0 1 1.113-1.942l2.756-2.756c.11-.11.249-.133.415-.066.166.066.249.182.249.348 0 .166.01.321.033.465.022.144-.011.26-.1.349l-2.49 2.523a2.928 2.928 0 0 0-.93 2.192c0 .863.305 1.599.913 2.208a3.008 3.008 0 0 0 2.208.913c.864 0 1.594-.31 2.192-.93l2.656-2.623c.598-.62.897-1.356.897-2.208 0-.852-.3-1.588-.897-2.208a3.004 3.004 0 0 0-.93-.63c-.177-.067-.26-.19-.249-.366.011-.177.05-.354.117-.531A.303.303 0 0 1 8.3 6.2a.432.432 0 0 1 .332 0c.509.222.963.531 1.361.93.554.553.93 1.2 1.129 1.942.2.742.2 1.483 0 2.225a4.273 4.273 0 0 1-1.129 1.942l-2.623 2.623zm-.365-5.744a4.273 4.273 0 0 1-1.13-1.942c-.198-.742-.198-1.483 0-2.225.2-.741.576-1.389 1.13-1.942l2.623-2.623A4.146 4.146 0 0 1 11.57.274a4.454 4.454 0 0 1 2.225 0 4.146 4.146 0 0 1 1.942 1.113c.554.553.924 1.2 1.113 1.942a4.454 4.454 0 0 1 0 2.225 4.146 4.146 0 0 1-1.113 1.942l-2.756 2.756c-.11.11-.249.133-.415.066-.166-.066-.249-.182-.249-.348 0-.166-.01-.321-.033-.465-.022-.144.011-.26.1-.349l2.49-2.523c.62-.598.93-1.328.93-2.192 0-.863-.305-1.599-.913-2.208a3.008 3.008 0 0 0-2.208-.913c-.864 0-1.594.31-2.192.93L7.836 4.873a3.073 3.073 0 0 0-.897 2.208c0 .852.3 1.588.897 2.208.266.266.575.476.93.63.177.067.26.19.249.366-.011.177-.05.354-.117.531a.303.303 0 0 1-.199.233.432.432 0 0 1-.332 0 4.38 4.38 0 0 1-1.361-.93z"/>
</symbol>
<symbol id="icon-search" viewBox='0 0 512 512'>
<path fill='#b0b9c1' d='M508.5 468.9L387.1 347.5c-2.3-2.3-5.3-3.5-8.5-3.5h-13.2c31.5-36.5 50.6-84 50.6-136C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c52 0 99.5-19.1 136-50.6v13.2c0 3.2 1.3 6.2 3.5 8.5l121.4 121.4c4.7 4.7 12.3 4.7 17 0l22.6-22.6c4.7-4.7 4.7-12.3 0-17zM208 368c-88.4 0-160-71.6-160-160S119.6 48 208 48s160 71.6 160 160-71.6 160-160 160z'/>
</symbol>
<symbol id="icon-times" viewBox="0 0 9 9">
<path d="m5.281 4.062 2.717 2.743c.085.067.127.16.127.279a.338.338 0 0 1-.127.28l-.635.634a.338.338 0 0 1-.279.127.338.338 0 0 1-.28-.127L4.063 5.281 1.32 7.998a.338.338 0 0 1-.279.127.338.338 0 0 1-.28-.127l-.634-.635A.338.338 0 0 1 0 7.084c0-.119.042-.212.127-.28l2.717-2.742L.127 1.32A.338.338 0 0 1 0 1.041C0 .923.042.829.127.761L.762.128A.338.338 0 0 1 1.04 0c.119 0 .212.042.28.127l2.741 2.717L6.805.127A.338.338 0 0 1 7.084 0c.118 0 .212.042.28.127l.634.635c.085.067.127.16.127.279a.338.338 0 0 1-.127.28L5.281 4.061z"
fill-rule="evenodd"/>
</symbol>
<symbol id="icon-upload-design-packs" viewBox="0 0 32 42">
<g fill-rule="nonzero" stroke="#F7F8F8" fill="none">
<path d="m14.61 17.929-5.393 5.605a2.2 2.2 0 0 0-.431 2.409 2.133 2.133 0 0 0 1.98 1.306h4.167v6.876c0 .345.284.625.634.625h1.266c.35 0 .634-.28.634-.625v-6.877h4.169c.87 0 1.63-.5 1.979-1.306a2.195 2.195 0 0 0-.43-2.407l-5.394-5.608c-.846-.874-2.336-.875-3.181.002zm-3.068 6.82 4.658-4.844 4.658 4.843h-9.316z" fill="#42B265"/>
<path d="M20.96 1c.928 0 1.822.34 2.514.945l.17.157 6.64 6.553a3.748 3.748 0 0 1 1.109 2.427l.007.228v25.94c0 2.006-1.597 3.645-3.604 3.745l-.195.005H4.799c-2.031 0-3.692-1.576-3.794-3.556L1 37.25V4.757c0-2.005 1.597-3.644 3.604-3.751L4.799 1H20.96zm-2.224 2.5H4.799c-.653 0-1.195.5-1.26 1.13l-.006.127v32.494c0 .644.5 1.179 1.137 1.243l.13.007h22.8c.654 0 1.196-.495 1.26-1.123l.007-.127V13.5h-8.231a1.88 1.88 0 0 1-1.895-1.723l-.005-.147V3.5zm2.533.046v7.46h7.559a1.225 1.225 0 0 0-.333-.579l-6.64-6.553a1.25 1.25 0 0 0-.586-.328z"
fill="#484848"/>
</g>
</symbol>
<symbol id="icon-clock" viewBox='0 0 12 12'>
<path d='M6 0C2.685 0 0 2.685 0 6s2.685 6 6 6 6-2.685 6-6-2.685-6-6-6zm2.238 7.573-.484.604a.387.387 0 0 1-.544.06L5.589 7.036a.968.968 0 0 1-.363-.756V2.516c0-.214.173-.387.387-.387h.774c.214 0 .387.173.387.387V6l1.403 1.028a.387.387 0 0 1 .06.545z' fill='#1DA5E5' fill-rule='nonzero'/>
</symbol>
<symbol id="icon-check" viewBox='0 0 12 12'>
<g fill='none' fill-rule='evenodd'>
<g transform='translate(-494 -357) translate(494 357)'>
<circle cx='6' cy='6' r='6' fill='#4BB35E'/>
<path fill='#FFF' fill-rule='nonzero' d='M8.764 3.483L4.666 7.582 3.16 6.076c-.073-.073-.192-.073-.265 0l-.44.44c-.073.073-.073.192 0 .265L4.533 8.86c.073.073.192.073.265 0l4.671-4.672c.073-.073.073-.191 0-.264l-.44-.44c-.074-.074-.192-.074-.265 0z'/>
</g>
</g>
</symbol>
<symbol id="icon-lock" viewBox="0 0 16 19">
<path d="M14.312 7.25h-1.125V5.612c0-2.799-2.25-5.105-5.048-5.112a5.07 5.07 0 0 0-5.077 5.063V7.25H1.937C1.006 7.25.25 8.006.25 8.938v7.875c0 .931.756 1.687 1.687 1.687h12.375c.932 0 1.688-.756 1.688-1.687V8.938c0-.932-.756-1.688-1.688-1.688zM4.75 5.563a3.38 3.38 0 0 1 3.375-3.375A3.38 3.38 0 0 1 11.5 5.563V7.25H4.75V5.563zm9.562 11.25H1.937V8.938h12.375v7.875z" fill="#FFF" fill-rule="nonzero"/>
</symbol>
<symbol id="icon-plus" viewBox="0 0 384 512">
<path d="M368 224H224V80c0-8.84-7.16-16-16-16h-32c-8.84 0-16 7.16-16 16v144H16c-8.84 0-16 7.16-16 16v32c0 8.84 7.16 16 16 16h144v144c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V288h144c8.84 0 16-7.16 16-16v-32c0-8.84-7.16-16-16-16z"/>
</symbol>
<symbol id="icon-circle-plus-solid" width="30" height="30" viewBox="0 0 30 30">
<path d="M0 15C0 6.715 6.715 0 15 0s15 6.715 15 15-6.715 15-15 15S0 23.285 0 15zm15 6.563c.78 0 1.406-.627 1.406-1.407v-3.75h3.75c.78 0 1.407-.627 1.407-1.406 0-.78-.627-1.406-1.407-1.406h-3.75v-3.75c0-.78-.627-1.406-1.406-1.406-.78 0-1.406.626-1.406 1.406v3.75h-3.75c-.78 0-1.406.627-1.406 1.406 0 .78.626 1.406 1.406 1.406h3.75v3.75c0 .78.627 1.407 1.406 1.407z" fill="#4BB35E" fill-rule="nonzero"/>
</symbol>
<symbol id='icon-circle-check-solid' width="30" height="30" viewBox="0 0 30 30">
<g fill-rule="nonzero" fill="none">
<path d="M0 15C0 6.715 6.715 0 15 0s15 6.715 15 15-6.715 15-15 15S0 23.285 0 15z" fill="#4BB35E"/>
<path d="M21.785 12.41a1.644 1.644 0 0 0 0-2.32 1.644 1.644 0 0 0-2.32 0l-6.34 6.34-2.59-2.59a1.644 1.644 0 0 0-2.32 0 1.644 1.644 0 0 0 0 2.32l3.75 3.75a1.644 1.644 0 0 0 2.32 0l7.5-7.5z" fill="#FFF"/>
</g>
</symbol>
<symbol id='icon-times-circle' viewBox="0 0 512 512">
<path fill='#dc3232' d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm121.6 313.1c4.7 4.7 4.7 12.3 0 17L338 377.6c-4.7 4.7-12.3 4.7-17 0L256 312l-65.1 65.6c-4.7 4.7-12.3 4.7-17 0L134.4 338c-4.7-4.7-4.7-12.3 0-17l65.6-65-65.6-65.1c-4.7-4.7-4.7-12.3 0-17l39.6-39.6c4.7-4.7 12.3-4.7 17 0l65 65.7 65.1-65.6c4.7-4.7 12.3-4.7 17 0l39.6 39.6c4.7 4.7 4.7 12.3 0 17L312 256l65.6 65.1z"/>
</symbol>
<symbol id='icon-exclamation-circle' viewBox="0 0 512 512">
<path d="M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zm-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z"/>
</symbol>
<symbol id='icon-angle-down-light' viewBox="0 0 256 512">
<path d="M119.5 326.9L3.5 209.1c-4.7-4.7-4.7-12.3 0-17l7.1-7.1c4.7-4.7 12.3-4.7 17 0L128 287.3l100.4-102.2c4.7-4.7 12.3-4.7 17 0l7.1 7.1c4.7 4.7 4.7 12.3 0 17L136.5 327c-4.7 4.6-12.3 4.6-17-.1z"/>
</symbol>
<symbol id='icon-angle-up-light' viewBox="0 0 256 512">
<path d="M136.5 185.1l116 117.8c4.7 4.7 4.7 12.3 0 17l-7.1 7.1c-4.7 4.7-12.3 4.7-17 0L128 224.7 27.6 326.9c-4.7 4.7-12.3 4.7-17 0l-7.1-7.1c-4.7-4.7-4.7-12.3 0-17l116-117.8c4.7-4.6 12.3-4.6 17 .1z"/>
</symbol>
<symbol id="icon-download-file" viewBox="0 0 32 42">
<g fill-rule="nonzero" fill="none">
<path d="m14.61 31.092-5.393-5.605a2.2 2.2 0 0 1-.431-2.409 2.133 2.133 0 0 1 1.98-1.306h4.167v-6.876a.63.63 0 0 1 .634-.625h1.266c.35 0 .634.28.634.625v6.877h4.169c.87 0 1.63.5 1.979 1.306a2.195 2.195 0 0 1-.43 2.407l-5.394 5.608c-.846.874-2.336.875-3.181-.002zm-3.068-6.82 4.658 4.844 4.658-4.843h-9.316z" stroke="#F7F8F8" fill="#42B265" stroke-linejoin="round"/>
<path d="M23.081 34.404a.75.75 0 0 1 .102 1.494l-.102.006H9.553a.75.75 0 0 1-.101-1.493l.101-.007h13.528z" fill="#42B265"/>
<path d="M20.96 1c.928 0 1.822.34 2.514.945l.17.157 6.64 6.553a3.748 3.748 0 0 1 1.109 2.427l.007.228v25.94c0 2.006-1.597 3.645-3.604 3.745l-.195.005H4.799c-2.031 0-3.692-1.576-3.794-3.556L1 37.25V4.757c0-2.005 1.597-3.644 3.604-3.751L4.799 1H20.96zm-2.224 2.5H4.799c-.653 0-1.195.5-1.26 1.13l-.006.127v32.494c0 .644.5 1.179 1.137 1.243l.13.007h22.8c.654 0 1.196-.495 1.26-1.123l.007-.127V13.5h-8.231a1.88 1.88 0 0 1-1.895-1.723l-.005-.147V3.5zm2.533.046v7.46h7.559c-.055-.22-.17-.42-.333-.579l-6.64-6.553a1.25 1.25 0 0 0-.586-.328z"
stroke="#F7F8F8" fill="#484848"/>
</g>
</symbol>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 110 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 74 KiB

View File

@@ -0,0 +1,30 @@
<svg style="position: absolute; width: 0; height: 0; overflow: hidden;" version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<symbol id="icon-search-regular" viewBox="0 0 512 512">
<path d="M508.5 468.9L387.1 347.5c-2.3-2.3-5.3-3.5-8.5-3.5h-13.2c31.5-36.5 50.6-84 50.6-136C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c52 0 99.5-19.1 136-50.6v13.2c0 3.2 1.3 6.2 3.5 8.5l121.4 121.4c4.7 4.7 12.3 4.7 17 0l22.6-22.6c4.7-4.7 4.7-12.3 0-17zM208 368c-88.4 0-160-71.6-160-160S119.6 48 208 48s160 71.6 160 160-71.6 160-160 160z"/>
</symbol>
<symbol id="icon-cog-light" viewBox="0 0 512 512">
<path d="M482.696 299.276l-32.61-18.827a195.168 195.168 0 0 0 0-48.899l32.61-18.827c9.576-5.528 14.195-16.902 11.046-27.501-11.214-37.749-31.175-71.728-57.535-99.595-7.634-8.07-19.817-9.836-29.437-4.282l-32.562 18.798a194.125 194.125 0 0 0-42.339-24.48V38.049c0-11.13-7.652-20.804-18.484-23.367-37.644-8.909-77.118-8.91-114.77 0-10.831 2.563-18.484 12.236-18.484 23.367v37.614a194.101 194.101 0 0 0-42.339 24.48L105.23 81.345c-9.621-5.554-21.804-3.788-29.437 4.282-26.36 27.867-46.321 61.847-57.535 99.595-3.149 10.599 1.47 21.972 11.046 27.501l32.61 18.827a195.168 195.168 0 0 0 0 48.899l-32.61 18.827c-9.576 5.528-14.195 16.902-11.046 27.501 11.214 37.748 31.175 71.728 57.535 99.595 7.634 8.07 19.817 9.836 29.437 4.283l32.562-18.798a194.08 194.08 0 0 0 42.339 24.479v37.614c0 11.13 7.652 20.804 18.484 23.367 37.645 8.909 77.118 8.91 114.77 0 10.831-2.563 18.484-12.236 18.484-23.367v-37.614a194.138 194.138 0 0 0 42.339-24.479l32.562 18.798c9.62 5.554 21.803 3.788 29.437-4.283 26.36-27.867 46.321-61.847 57.535-99.595 3.149-10.599-1.47-21.972-11.046-27.501zm-65.479 100.461l-46.309-26.74c-26.988 23.071-36.559 28.876-71.039 41.059v53.479a217.145 217.145 0 0 1-87.738 0v-53.479c-33.621-11.879-43.355-17.395-71.039-41.059l-46.309 26.74c-19.71-22.09-34.689-47.989-43.929-75.958l46.329-26.74c-6.535-35.417-6.538-46.644 0-82.079l-46.329-26.74c9.24-27.969 24.22-53.869 43.929-75.969l46.309 26.76c27.377-23.434 37.063-29.065 71.039-41.069V44.464a216.79 216.79 0 0 1 87.738 0v53.479c33.978 12.005 43.665 17.637 71.039 41.069l46.309-26.76c19.709 22.099 34.689 47.999 43.929 75.969l-46.329 26.74c6.536 35.426 6.538 46.644 0 82.079l46.329 26.74c-9.24 27.968-24.219 53.868-43.929 75.957zM256 160c-52.935 0-96 43.065-96 96s43.065 96 96 96 96-43.065 96-96-43.065-96-96-96zm0 160c-35.29 0-64-28.71-64-64s28.71-64 64-64 64 28.71 64 64-28.71 64-64 64z"/>
</symbol>
<symbol id="icon-exclamation-circle-solid" viewBox="0 0 512 512">
<path d="M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zm-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z"/>
</symbol>
<symbol id="icon-trash-alt-light" viewBox="0 0 448 512">
<path d="M296 432h16a8 8 0 0 0 8-8V152a8 8 0 0 0-8-8h-16a8 8 0 0 0-8 8v272a8 8 0 0 0 8 8zm-160 0h16a8 8 0 0 0 8-8V152a8 8 0 0 0-8-8h-16a8 8 0 0 0-8 8v272a8 8 0 0 0 8 8zM440 64H336l-33.6-44.8A48 48 0 0 0 264 0h-80a48 48 0 0 0-38.4 19.2L112 64H8a8 8 0 0 0-8 8v16a8 8 0 0 0 8 8h24v368a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V96h24a8 8 0 0 0 8-8V72a8 8 0 0 0-8-8zM171.2 38.4A16.1 16.1 0 0 1 184 32h80a16.1 16.1 0 0 1 12.8 6.4L296 64H152zM384 464a16 16 0 0 1-16 16H80a16 16 0 0 1-16-16V96h320zm-168-32h16a8 8 0 0 0 8-8V152a8 8 0 0 0-8-8h-16a8 8 0 0 0-8 8v272a8 8 0 0 0 8 8z"></path>
</symbol>
<symbol id="icon-sync-regular" viewBox="0 0 512 512">
<path d="M500 8h-27.711c-6.739 0-12.157 5.548-11.997 12.286l2.347 98.575C418.212 52.043 342.256 8 256 8 134.813 8 33.933 94.924 12.296 209.824 10.908 217.193 16.604 224 24.103 224h28.576c5.674 0 10.542-3.982 11.737-9.529C83.441 126.128 161.917 60 256 60c79.545 0 147.942 47.282 178.676 115.302l-126.39-3.009c-6.737-.16-12.286 5.257-12.286 11.997V212c0 6.627 5.373 12 12 12h192c6.627 0 12-5.373 12-12V20c0-6.627-5.373-12-12-12zm-12.103 280h-28.576c-5.674 0-10.542 3.982-11.737 9.529C428.559 385.872 350.083 452 256 452c-79.546 0-147.942-47.282-178.676-115.302l126.39 3.009c6.737.16 12.286-5.257 12.286-11.997V300c0-6.627-5.373-12-12-12H12c-6.627 0-12 5.373-12 12v192c0 6.627 5.373 12 12 12h27.711c6.739 0 12.157-5.548 11.997-12.286l-2.347-98.575C93.788 459.957 169.744 504 256 504c121.187 0 222.067-86.924 243.704-201.824 1.388-7.369-4.308-14.176-11.807-14.176z"/>
</symbol>
<symbol id="icon-check-regular" viewBox="0 0 512 512">
<path d="M435.848 83.466L172.804 346.51l-96.652-96.652c-4.686-4.686-12.284-4.686-16.971 0l-28.284 28.284c-4.686 4.686-4.686 12.284 0 16.971l133.421 133.421c4.686 4.686 12.284 4.686 16.971 0l299.813-299.813c4.686-4.686 4.686-12.284 0-16.971l-28.284-28.284c-4.686-4.686-12.284-4.686-16.97 0z"/>
</symbol>
<symbol id="icon-close2" viewBox="0 0 30 32">
<path d="M0.655 2.801l1.257-1.257 27.655 27.655-1.257 1.257-27.655-27.655z"/>
<path d="M28.31 1.543l1.257 1.257-27.655 27.655-1.257-1.257 27.655-27.655z"/>
</symbol>
<symbol id="icon-file-search-solid" viewBox="0 0 640 512">
<path d="M288 320c0-65.45 39.59-121.68 96-146.44V160H248a24.07 24.07 0 0 1-24-24V0H24A23.94 23.94 0 0 0 0 24v464a23.94 23.94 0 0 0 24 24h336a23.94 23.94 0 0 0 24-24v-21.56c-56.41-24.75-96-80.99-96-146.44zm96-198.1a23.92 23.92 0 0 0-7-16.9L279.1 7a24 24 0 0 0-17-7H256v128h128zm251.31 340.16l-77.41-77.41A126.69 126.69 0 0 0 576 320a128 128 0 1 0-128 128c23.7 0 45.61-6.88 64.65-18.11l77.41 77.42a16 16 0 0 0 22.63 0l22.62-22.62a16 16 0 0 0 0-22.63zM448 384a64 64 0 1 1 64-64 64 64 0 0 1-64 64z"></path>
</symbol>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 56 KiB

View File

@@ -0,0 +1 @@
#toplevel_page_tve_dash_section ul li:last-child{border-top:1px solid #474f53}#toplevel_page_tve_dash_section ul li:last-child a[href="admin.php?page=about_tve_theme_team"]{color:rgba(240,246,252,.7);font-weight:normal}#toplevel_page_tve_dash_section ul li:last-child a[href="admin.php?page=about_tve_theme_team"]:focus,#toplevel_page_tve_dash_section ul li:last-child a[href="admin.php?page=about_tve_theme_team"]:hover{color:#72aee6}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

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