Jump to content

Leaderboard


Popular Content

Showing content with the highest reputation since 01/22/2019 in all areas

  1. 2 points
    Works fine,it's pretty simple and could do with some refinement in the future to make the UI a little nicer and add additional features such as an API so those of us with a larger catalogue can setup automated order processing (for licenses etc). PayPal do also take a fee on top of the CubeCart fee.
  2. 2 points
    Your database and dB user names and passwords will almost certainly be different on your new hosting and you need to update the /includes/global.ini.php file with the new values Ian
  3. 1 point
    This is most likely to be your browser auto-filling variables trying to be helpful ! This is a problem in a few areas in CubeCart even when the field is set to not autofill (for example the SMTP Authorisation password when configuring the store email in the Store Settings). Depending on what browser you are using you can disable this for various types of information. For Chrome, go to the Settings page (enter chrome://settings/ in the browser url) go to the autofill section and then you can disable for passwords, payments methods and addresses and more Ian
  4. 1 point
    You can implement this: https://forums.cubecart.com/topic/54715-potential-malicous-attack/ but to also catch that IP address, you can make this change: <?php // Add this new line // Is a hit if IP address starts with... if( strpos($_SERVER['REMOTE_ADDR'],"31.184.238") === 0 ) exit;
  5. 1 point
    I guess it must be working, on the front page of my store I now see a "Protected by reCAPTCHA" icon! And hopefully no more bot spam! Thanks Al Brookbanks and bsmither for the good advice.
  6. 1 point
    Return to CubeCart's admin and edit the Homepage document. Remove the Mailerlite code from this Homepage document - including the {literal} and {/literal}. After saving the edited document, be sure to click the button "Clear Cache" that is lit up in the upper-right corner.
  7. 1 point
    Welcome Courtney! Glad to see you made it to the forums. Using a programmer's text editor (your hosting account's control panel has one of these), you will open /skins/foundation/templates/main.php (and main.checkout.php). Here you will find the </head> tag. You should include these additional two lines of code so that the template rendering engine (Smarty) will not get confused because it uses braces that javascript also uses. {literal} Mailerlite javascript goes here... {/literal} Then, return to CubeCart's admin and edit the Homepage document. Remove the Mailerlite code from this document.
  8. 1 point
    Mycrypt library missing from server required to encrypt credit card details I upgraded from 6.0.11 to CubeCart Version 6.2.2 PHP Version (5.6 Recommended) 7.3.2 MySQL Version 5.5.41-MariaDB and now cannot accept credit card information Need advice or help Thank you Doc
  9. 1 point
    Ian is wrong. Logging in with the same staff account will kick out the other staff member who will need to login again thus kicking the other out. It's a security feature to prevent session hijacking. You'll need an account for each staff member.
  10. 1 point
    To change details about the database, please edit the file /includes/global.inc.php. Ok, not being able to maintain session, which, having items in the Shopping Basket (aka Cart) stay in the shopping basket between pages, means PHP is having some difficulty with using a session manager. And yet, not being able to use these means of maintaining session should be getting logged in error_log. I think submitting a trouble ticket with your hosting provider to discuss session-related issues is warranted.
  11. 1 point
    Welcome Claud! Glad to see you made it to the forums. We would ask that you create the error log. There may be an issue with maintaining session state.
  12. 1 point
    I switched to Ubuntu 18.04 from Windows 10 on my main computer a couple of years back and haven't looked back. Now with Ubuntu's minimal installation option too I have my computer running just the software I want with no annoying desktop apps being pushed on me or that nasty new start menu. Which operating system do you use, and why?
  13. 1 point
    Yes. In admin, Documents, click Create Document tab. On the new page, for the Title, enter FAQ. For Status, click the checkbox. On the Content tab, in the editor window, (as an example) enter: Q1. How do I link to a paragraph in a document? A1. How do I link to a paragraph in a document? Highlight A1. Click the 'Anchor' toolbar button (looks like a flag). A dialog window will show. The Anchor Name is A1. Click OK. Select Q1. Click the 'Link' toolbar button. A dialog window will show. The Link Type is 'Link to anchor'. Select the A1 anchor name. Click OK. Click Save. (Click the Clear Cache button that is lit in the upper-right corner.) Reload the storefront Homepage. Click the FAQ document link. Click on Q1. Note the page scrolls so that A1 is at the top of the screen.
  14. 1 point
    A scenario has been known to happen whenever one mouse-swipes some text to select it, then copies it to the clipboard, and then pastes the clipboard to a text entry field -- that the mouse-swipe inadvertently also includes hidden white-space: a tab character, a space character, a newline character. So, in this scenario, which can and does happen everywhere, extra illegal (invisible) characters was part of the token sent to the Marketplace.
  15. 1 point
    The format of the sitemap that CubeCart creates is OK but there are third party packages available that create much better versions and will optionally create image or video sitemap files as well and even more importantly can be scheduled to run via cron, for example weekly, whereas with CubeCart you have to remember to re-run it manually each week. The number of CubeCart sites I see with sitemap files that were created a year or two ago and never updated ! This is worse than not having a sitemap file at all
  16. 1 point
    did you generate one yet? Store Admin -> Maintenance it will then be here: https://testvalleymodels.co.uk/sitemap.xml.gz
  17. 1 point
    Welcome TimB! Glad to see you made it to the forums. The top Navigation bar contains three language specific links: Sale Items, Gift Certificates, and Home (Home being visible on mobile devices). The rest are the names of Categories that you have created -- in English. Now that you have another language installed and enabled, you can now use the Translate function. In admin, Categories, click the Edit icon for a category. On the editing screen, click the Translate tab. Click "Add Translation". On the page that is shown, choose the language for this translation and enter new data to be shown for this category when the storefront is showing that language. Once finished and Saved, be sure to Clear the Cache.
  18. 1 point
    Please make this edit. In /classes/catalogue.class.php: Lines 1835-1849: From: if (isset($search_data['featured'])) { $where[] = "I.featured = '1'"; } // Only look for items that are in stock if (isset($search_data['inStock'])) { $where[] = $this->outOfStockWhere(); } $whereString = (isset($where) && is_array($where)) ? implode(' AND ', $where) : ''; if (!empty($whereString)) { $whereString = ' AND '.$whereString; } $whereString .= $this->_where_live_from; $joinString = (isset($joins) && is_array($joins)) ? implode(' JOIN ', $joins) : ''; To: if (isset($search_data['featured'])) { $where[] = "I.featured = '1'"; } $whereString = (isset($where) && is_array($where)) ? implode(' AND ', $where) : ''; // Only look for items that are in stock if (true || isset($search_data['inStock'])) { // Forcing a filter for only in-stock items. Includes _where_live_from. $whereString .= $this->outOfStockWhere(false,'I'); // BUG!! Using this method at this location requires using the table alias. } else { $whereString .= $this->_where_live_from; // Adding the _where_live_from to the $whereString. } if (!empty($whereString)) { $whereString = ' AND '.$whereString; $whereString = str_replace('AND AND', 'AND', $whereString); // Hack to kill double verb from empty $where[] causing _where_live_from being first. Note two spaces between verbs. } $joinString = (isset($joins) && is_array($joins)) ? implode(' JOIN ', $joins) : '';
  19. 1 point
    In CubeCart's administration backend, on the left navigation panel, click Email Templates. The Email Contents tab is a list of all the main contents of CubeCart's emails - click the flag of the language you wish to edit. The Email Templates tab is a list of the email's overall common content - click the Edit icon of Default Emails. On the page that is now shown, click the HTML Content tab. (Do Not Edit Anything. Possible bug here.) Hover the mouse over the blue squares to see a tooltip as to what protected content is here.
  20. 1 point
    Thanks Al. It's working great now.
  21. 1 point
    Thank you,I changed this part of code.I decided to move to other host,so I hope it will be than solved.But your work-arround code works,so at least for now it is some solution to solve this issue for a moment.Thank you.I always appreciate your quick and helpful advices.David
  22. 1 point
    Earlier, I said: The line numbers shown indicates that CubeCart is using the 'X-Forwarded-For' header. This then suggests that the web server is mis-reporting or mis-interpreting the IP address in that X-Forwarded-For header. So, we have verified that the SERVER_ADDR and REMOTE_ADDR is correct. It is the PHP function apache_request_headers() - line 523 - is where Cubecart is getting the value of the server address. Conclusion: There is an appliance just ahead of the web server that is adding/mangling the X-Forwarded-For entry in the Request Headers HTTP stream with an erroneous value. It is possible that this appliance (a reverse proxy server?) uses in a correct fashion the newer Forward header. See if Forward is in the two PHP Info tables discussed earlier. Until the above gets sorted, you can implement a work-around: In the function get_ip_address(), find: // Remove port if it exists $parts = explode(':',$address); $address = (empty($parts[0])) ? $address : $parts[0]; Change to: $address = $_SERVER['REMOTE_ADDR']; // Remove port if it exists $parts = explode(':',$address); $address = (empty($parts[0])) ? $address : $parts[0]; We will use the REMOTE_ADDR because we have verified in PHP Info that it is correct -- FOR YOU!
  23. 1 point
    In the Noodleman skin template main.php, find: Near line 26: <a href="{$ROOT_PATH}" class="main-logo"><img src="{$STORE_URL}/skins/noodleman_v6/images/noodleman/noodleman-logo.png" alt="{$CONFIG.store_name}"></a> Change to: <a href="{$ROOT_PATH}" class="main-logo"><img src="{$STORE_LOGO}" alt="{$CONFIG.store_name}"></a>
  24. 1 point
    The scenario is that there is some part of a document where the HTML for that part must not be present when the document is being displayed on a mobile device. The version of CubeCart must support parsing Smarty tags in the document (apparently, all versions of CC6). The mobile device must send a User Agent (UA) string that CubeCart will recognize as being a mobile device. When editing the Content of a document (the HomePage's BXSlider, for example), use the following: {if !GUI::getInstance()->mobile} <ul class="bxslider"> <li><img src="skins/foundation/images/examples/slide1.jpg" title="Message Foo" /></li> <li><img src="skins/foundation/images/examples/slide2.jpg" title="Message Bar" /></li> <li><img src="skins/foundation/images/examples/slide3.jpg" title="Message Baz" /></li> </ul> {/if} Be sure to have "Parse Smarty Tags" setting enabled. Then, create a snippet. In admin, Manage Hooks, Code Snippets tab, click Add Snippet. In the form that appears, fill in fields as follows: Enabled: Checked Unique ID: [email protected]+ Execution Order: 1 Description: Forces CubeCart to detect if a mobile device Trigger: class.gui.css Version: 1.0 Author: https://forums.cubecart.com/topic/54744-how-to-turn-bxslider-off-on-mobile-homepage PHP Code: <?php $current_disable_mobile_skin_setting = $GLOBALS['config']->get('config', 'disable_mobile_skin'); $GLOBALS['config']->set('config', 'disable_mobile_skin', false); $this->_detectMobile(); $GLOBALS['config']->set('config', 'disable_mobile_skin', $current_disable_mobile_skin_setting); The reason we use the "class.gui.css" hook is because CubeCart processes this hook early - before processing the action of getting a document ready for display. It also has to be a hook in the GUI class because that is where the private code is located that determines if the UA string is mobile. Let me know if I left anything out.
  25. 1 point
    The solution is going to involve having CubeCart make a decision on how to deal with the HomePage document. This before CubeCart sends the finished page to the browser so as to not include the <ul class="bxslider"> block of code. By removing this block of code, the <img> tags will not be present and so the total time to finally display the page will be lessened. On the other hand, if you just want to hide it on a mobile skin, we can create a simple CSS rule: .bxslider { display:none;} To hide it on a responsive screen: The html in the document would be: <ul class="show-for-medium-up bxslider"> Getting back to not including it, we need a version of CubeCart that includes the ability to parse Smarty tags. In admin, Documents, click the edit icon for any document. On the General tab, check for the presence of the "Parse Smarty Tags" checkbox.
  26. 1 point
    Click on the "Follow" button top right of the page just above the green "Reply to this topic" button
  27. 1 point
    To follow up on this, I contacted FastComet support and spent a little time trying to figure out the problem, and looked at a few other shopping carts... But aside from the problem I was having I did like CubeCart so decided to just download CubeCart 6.2.4 and install a new Database... The new version appears to be working perfectly! So if you have a similar problem a reinstall may be a quick and simple solution. Regards, Dave
  28. 1 point
    In admin, Languages, click the Edit icon of the language(s) you use in your store. From the drop-down selector, choose Basket. From the list that appears a few seconds later, change 'shipping_select' to what you desire. I am going to experiment with the Store Collection module. I will experiment by using two of these modules and renaming them to Summit and Milton. In the e-Tone template content.checkout.php, near line 120, find: <p class="basket_actions"> <a href="{$STORE_URL}/index.php?_a=basket&empty-basket=true" class="button_submit left"><span class="icon icon-cross"></span> {$LANG.basket.basket_empty}</a> <button type="submit" name="update" class="button_submit update"><span class="icon icon-cycle"></span> {$LANG.basket.basket_update}</button> {if $DISABLE_CHECKOUT_BUTTON!==true} <input type="submit" name="proceed" class="button_submit" value="{$CHECKOUT_BUTTON}" /> {/if} </p> Change to: <p class="basket_actions"> <a href="{$STORE_URL}/index.php?_a=basket&empty-basket=true" class="button_submit left"><span class="icon icon-cross"></span> {$LANG.basket.basket_empty}</a> </p> <p class="basket_actions"> <button type="submit" name="update" class="button_submit update"><span class="icon icon-cycle"></span> {$LANG.basket.basket_update}</button> </p> {if $DISABLE_CHECKOUT_BUTTON!==true} <p class="basket_actions"> By clicking Secure Checkout, you are creating an order...etc.<br> <input type="submit" name="proceed" class="button_submit" value="{$CHECKOUT_BUTTON}" /> </p> {/if}
  29. 1 point
    Agreed - failed upgrades have been very common in the past when done via the built in upgrade option and often result in a mix of files from different versions - this will cause this type of problem. It has been covered in quite a few threads on here before and a manual upgrade would definitely solve it. Ian
  30. 1 point
    Yes the reply to address is wrong. Well get this fixed first thing tomorrow we will also let you know the correct email address to reply to.
  31. 1 point
    Please make the following edits: In /classes/seo.class.php, find: public function buildURL($type, $item_id = false, $amp = '&') { // Some SEO paths are not stored in the database if (!$item_id && in_array($type, $this->_static_sections)) { if (($item = $GLOBALS['db']->select('CubeCart_seo_urls', array('path'), array('type' => $type))) !== false) { return $GLOBALS['storeURL'].'/'.$item[0]['path'].$this->_extension; } else { return $GLOBALS['storeURL'].'/'.$this->setdbPath($type, '', '', false).$this->_extension; } } elseif (($item = $GLOBALS['db']->select('CubeCart_seo_urls', array('path'), array('type' => $type, 'item_id' => $item_id))) !== false) { return $GLOBALS['storeURL'].'/'.$item[0]['path'].$this->_extension; } else { return $GLOBALS['storeURL'].'/'.$this->setdbPath($type, $item_id, '', false).$this->_extension; } } Change to: public function buildURL($type, $item_id = false, $amp = '&', $absolute = true) { // Some SEO paths are not stored in the database $url = ($absolute) ? $GLOBALS['storeURL'].'/' : $GLOBALS['rootRel']; if (!$item_id && in_array($type, $this->_static_sections)) { if (($item = $GLOBALS['db']->select('CubeCart_seo_urls', array('path'), array('type' => $type))) !== false) { return $url.$item[0]['path'].$this->_extension; } else { return $url.$this->setdbPath($type, '', '', false).$this->_extension; } } elseif (($item = $GLOBALS['db']->select('CubeCart_seo_urls', array('path'), array('type' => $type, 'item_id' => $item_id))) !== false) { return $url.$item[0]['path'].$this->_extension; } else { return $url.$this->setdbPath($type, $item_id, '', false).$this->_extension; } } In the file /classes/gui.class.php, near the end of the file, find: private function _makeTree($tree_data) { A few lines later, find: $branch['url'] = $GLOBALS['seo']->buildURL('cat', $branch['cat_id'], '&'); Change to: $branch['url'] = $GLOBALS['seo']->buildURL('cat', $branch['cat_id'], '&', false); Then find: private function _displayNavigation() { A few lines later, find: 'saleitems' => $GLOBALS['seo']->buildURL('saleitems',false,'&'), 'certificates' => $GLOBALS['seo']->buildURL('certificates',false,'&') Change to: 'saleitems' => $GLOBALS['seo']->buildURL('saleitems',false,'&',false), 'certificates' => $GLOBALS['seo']->buildURL('certificates',false,'&',false) You will need to have CubeCart clear its internal cache.
  32. 1 point
    I have yet to confirm CC6011 contributes to this problem. I will check on this shortly.
  33. 1 point
    I think the key thing to fix is to have your hosting provider assist you with having sub-domains (mail, hostmaster, etc) resolve to alternate services - not to your site. Also, your domain name registrar should also assist you in making sure non-existent sub-domains (ww) return a "Server Not Found" error.
  34. 1 point
    Please let us know the exact version of CubeCart you are running. Some versions back, absolute URLs were constructed for the nav menu. Given that CubeCart can use whatever domain name used to call for it, the menu structure could (until the cached structure is cleared) contain the domain name, even if it is incorrect. This means that your domain's DNS records could show that some subdomains point to the same location as www - the CubeCart store. Or, that unknown subdomains (i.e., hostmaster) do not return a "Host not found" error, but rather defaults to an actively resolved domain -- which is a problem with your web server configuration.
  35. 1 point
    CubeCart 6.2.2 uses openssl instead of mcrypt making it compatible with the newest PHP versions. If you still get mcrypt errors then your store code is not up to date. See: https://github.com/cubecart/v6/issues/2113
  36. 1 point
    Welcome Doc! Glad to see you made it to the forums. Ignore everything below. Completely confused with something else. -------------------- If you have your store hosted somewhere, then your host should have given you a control panel for that account (Cpanel?). There, you should find a way to select which version of PHP you want to use and to choose which PHP extensions you need. You will find MBString as an extension to be enabled. If you cannot find where to do this, please contact your hosting provider to enable this for you. If you have direct and total control of your server installation, you will need to edit the PHP.INI file to enable the MBString extension.
  37. 1 point
    Thanks @AI and @Bsmither. @Bsmither my first installation was done manually, however, I deleted it and used the Token method, its working properly now. Thanks.
  38. 1 point
    Have to agree with Havenswift here. I had a similar problem and changed to a recommended hosting company (yes it was Havenswift) and not had the problem again. Its the old adage you pay for what yo get.
  39. 1 point
    I'm confused. The first sentence says you want to manually apply an image (and presumably show it). The second sentence you want to suppress displaying it. Can you clear this up?
  40. 1 point
    https://github.com/cubecart/v6/issues/2016
  41. 1 point
    Here is the fix. classes/cubecart.class.php Find: $old_addresses = md5(serialize(array_merge($this->_basket['billing_address'], $this->_basket['delivery_address']))); Replace with: $old_addresses = $GLOBALS['user']->addressCompare($this->_basket['billing_address'], $this->_basket['delivery_address']); Find: $new_addresses = md5(serialize(array_merge($this->_basket['billing_address'], $this->_basket['delivery_address']))); Replace with: $new_addresses = $GLOBALS['user']->addressCompare($this->_basket['billing_address'], $this->_basket['delivery_address']); Save then open classes/user.class.php Find: /** * Change a user password * * @return bool */ public function changePassword() ABOVE this add: public function addressCompare($address1, $address2) { $allowed_keys = array('line1','line2','town','postcode','state_id','state','state_abbrev','country','country_id','country_iso','country_name'); $address1_filtered = array(); foreach($address1 as $key => $value) { if(in_array($key, $allowed_keys)) $address1_filtered[$key] = strtolower($value); } $address2_filtered = array(); foreach($address2 as $key => $value) { if(in_array($key, $allowed_keys)) $address2_filtered[$key] = strtolower($value); } return md5(serialize($address1_filtered).serialize($address2_filtered)); } This will be released in 6.2.3.
  42. 1 point
    After several hours, posts and attempts to figure out a way around this problem I finally had to give up and try another self hosted cart script. I spent a lot of time in CubeCart and there are a lot of things I love about it but I simply cannot hand off a store to my client with this behavior, bug or whatever it is. I would suggest a fix for this problem ASAP and after that a PayPal donation link for the developer. In my opinion, technical support cost might be too high or not needed for most folks but I for one would certainly consider a donation for this great free script. Just a thought.
  43. 1 point
    Solved it Al - Many thanks. I'd not noticed that before.
  44. 1 point
    You need to clear the cache in your store. Top right of admin control panel.
  45. 1 point
    Cheers guys Look forward to sharing my creations
  46. 1 point
    Hi @NiteFox This is correct. It's a legal obligation for us to collect taxes on your behalf as a marketplace. Say you sell a £100 skin to an Italian customer (22% VAT rate). You will receive £70, we will take £30 and the tax man will get £22. Please note that PayPal may take a transaction fee from the £70 but I'm not entirely sure.
  47. 1 point
    Out of the box, as a Trexle product, here is our Cubecart NAB Transact Integration.
  48. 1 point
    Yes, CC622 will work with PHP 7.2. Be aware, however, plugins provided by some third-parties will need to have new versions replace older versions. These plugins require the ionCube loader, and ionCube is such that there are specific versions of the loader for respective versions of PHP, and also that PHP code that requires the loader be "compiled" against that specific version of the loader being used. That is, if upgrade PHP, then also upgrade the ionCube loader to match, then the plugin author will need to recompile their PHP scripts against that new loader version, and the plugin user replaces the previous version of the plugin with the new version. Also, there are PHP extensions that CubeCart 622 needs that have, on the rare occasion, not been enabled with PHP 7: ZIPArchive and MBString. So, in admin, PHP Info, scroll through the tables verifying the presence of these extensions.
  49. 1 point
    The Login/Register is two separate links. That would be done in the template box.session.php: From: {else} <a href="{$STORE_URL}/login.html" class="button white small nopad-sides">{$LANG.account.login}</a> / <a href="{$STORE_URL}/register.html" class="button white small nopad-sides">{$LANG.account.register}</a> {/if} To: {else} <a href="{$STORE_URL}/login.html" class="button white small nopad-sides">{$LANG.account.login}</a>{* / <a href="{$STORE_URL}/register.html" class="button white small nopad-sides">{$LANG.account.register}</a> *} {/if} Have CubeCart clear its cache. Then there is the option to register at checkout.
  50. 1 point
    Try this. Line numbers refer to CC6114: In the admin skin template dashboard.index.php, near line 162: <td align="right"> {if isset($order.notes)} <a href="?_g=orders&action=edit&order_id={$order.cart_order_id}&source=dashboard#order_notes" title="{foreach $order.notes as $note}{$note.time} {$note.content}{"\r\n"}{/foreach}"><i class="fa fa-sticky-note" title="{$LANG.common.notes}" aria-hidden="true"></i></a> {/if} <a href="{$order.link_print}" class="print" target="_blank" title="{$LANG.common.print}"><i class="fa fa-print" title="{$LANG.common.print}"></i></a> Change to: <td align="right" NOWRAP> {if isset($order.notes)} <a href="?_g=orders&action=edit&order_id={$order.cart_order_id}&source=dashboard#order_notes" title="{foreach $order.notes as $note}{$note.time} {$note.content}{"\r\n"}{/foreach}"><i class="fa fa-sticky-note" title="{$LANG.common.notes}" aria-hidden="true"></i></a> {/if} <!-- --> {if isset($order.items)} <a href="?_g=orders&action=edit&order_id={$order.cart_order_id}&source=dashboard#order_inventory" title="{foreach $order.items as $item}{$item.quantity}{" x "}{$item.product_code}{"\r\n"}{/foreach}"><i class="fa fa-shopping-cart" alt="{$LANG.common.items}"></i></a> {/if} <!-- --> <a href="{$order.link_print}" class="print" target="_blank" title="{$LANG.common.print}"><i class="fa fa-print" title="{$LANG.common.print}"></i></a> In the admin source file dashboard.index.inc.php, near line 299, find: foreach ($GLOBALS['hooks']->load('admin.dashboard.unsettled_orders') as $hook) include $hook; We can use this hook. But to complete this experiment, on a new blank line after this, add: /**/ if (($order_inventory = $GLOBALS['db']->select('CubeCart_order_inventory', '`cart_order_id`,`product_code`,`quantity`', array('cart_order_id' => $cart_order_ids))) !== false) { foreach ($order_inventory as $inventory) { $order_items[$inventory['cart_order_id']]['items'][] = $inventory; } $orders = merge_array($orders, $order_items); } /**/ In admin, Dashboard, Unsettled Orders tab, this gives an icon (shopping basket - available in latest versions of CubeCart having a recent version of the Font Awesome files) that, when hovering the mouse over it, will show a 'tooltip' listing the products of that order.


  • Newsletter

    Want to keep up to date with all our latest news and information?
    Sign Up
×
×
  • Create New...