Jump to content
Larry Ullman's Book Forums

chop

Members
  • Posts

    192
  • Joined

  • Last visited

  • Days Won

    5

Everything posted by chop

  1. There are indeed some problems with PP sandbox. I don't think they have a budget big enough to keep it running smoothly. I've found links to be broken and page styling to be missing now and then. But they have a pretty good support team and will return an email answer to you in 24 hours. A further note on using sandbox: Use the IPN simulator first to check your IPN script (it's way faster) and make sure you have the following variables plugged into it. Assuming that you're going by the script in the e-commerce book, which has the following lines of code: if ( isset($_POST['payment_status']) && ($_POST['payment_status'] == 'Completed') && ($_POST['receiver_email'] == 'chopth_1337786135_biz@gmail.com') && ($_POST['mc_gross'] == 25.00) && ($_POST['mc_currency'] == 'USD') && (!empty($_POST['txn_id'])) ) { Your variables receiver email, mc gross, mc currency (in your simulator script) must agree with the above or it won't make it past this conditional. Also, if you are updating a database, you should keep changing the txn_id (transaction id) to something different because there aren't supposed to be duplicates. One more thing that I suggest is to change the script that Larry provides in his book in the following way ( if it hasn't been changed already): Instead of: $header .= "POST /cgi-bin/webscr HTTP/1.0\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; you should have: $header .= "POST /cgi-bin/webscr HTTP/1.0\r\n"; $header .= "Host: www.paypal.com\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; with the one additional line. This seems to be a new thing with PP. As Abigail suggests, set up some debugging using something like: $fileName= "checkFile"; file_put_contents ($fileName,$_POST['payment_status']) to write a file that contains variable values to you server OR you stick in the lines: ini_set('log_errors', true); ini_set('error_log', dirname(__FILE__).'/ipn_errors.log'); at the beginning of your script and then put: gotThisFar(); at a strategic point in your script. If the error is listed in your error file "ipn_errors.log" then you know that PayPal the script go at least that far without bombing. I've spent a lot of time recently messing with this so it's fresh in my mind. Let me know if there's anything else I can help with.
  2. Thanks. Let me experiment with this for a while. The ski mountain now says they will be changing the format a little for this year (oh, here we go) so I might have ot hold off on it for a while. thanks
  3. The "payment review enabled" or "disabled" is part of the sandbox testing area. If you are still having problems with IPN or have plans to use paypal on a continuing basis I suggest you set up a PayPal sandbox account. There are several advantages to this besides not having to actually use your credit card to test a site. It is especially important if you use more complicated features like the IPN. In the PP sandbox you get a way to test your IPN script without actually having to create a payment button. Instead, you use The IPN simulator.This is located under the Testing Tools menu. In this environment you can type in the values for all the variables that you would have in the button... buyer info , basic info and even the "custom" variable. When everything is working and your IPN script is updating your database okay. Then you can try making an actual button (still within the sandbox environment) on your server page and click on it . I t should work the same from the button as the simulator. Then, assuming everything is working okay, you're ready to try it on the real payPal site. Note that a PayPal sandbox account is completely separate from any other PP account you might already have. It has nothing to do with your merchant account except that you cannot use the same email address in both accounts. It's a little confusing because when you create a sandbox account, you use a real email and a password so you can log in, like into your merchant account. When you get into the sandbox environment, you create a buyer and a seller account which are "pretend" accounts that have pretend emails and pretend passwords. I kept getting mixed up between the real and not real. That is between my merchant account email/pw , my sandbox email/pw and three different pretend peoples email/pw within the sandbox. But once you have it down, you can use it over again for testing any scenario. Hope that helps.
  4. Yes, thanks to both of you for the time you put into helping me. This is something that can work I think. First, I will check to see if there is some way of avoiding the ,, in the csv file in the first place but this is part of Nastar's software. I believe it is there because it is suppose to contain a handicap, which s a number so doesn't need quotes. If there is no handicap (which happens often), it comes across as just two commas. If they can fix it on their end, ( maybe they could insert a -1 to represent no handicap -which is different than a handicap of 0- ) that would be best but at least I have a model to go on if that is not possible. thanks again
  5. I'm currently working on building a db of Nastar ski race results. I receive the raw data from a ski mountain in the form of a csv (comma delimited) flat file. The code below reads in the csv and puts it into an array. Then the data within the array is inserted into a table. The problem is that the csv files that I receive are inconsistent in that some of the blank columns appear as ,"", ( a pair of double quotes delimited by commas) and some appear as ,, (just a pair of commas with no quotes between them). The latter gives me a mySql syntax error. I know it is the lack of quotation pairs that is the problem because if I do a search and replace to insert the quote pairs, everything runs okay. Is there something I can do to make my code accept either ,, OR ,"", as a blank to be inserted in the table. I'm not sure that I can lay the responsibility on the client to guarantee a consistent file structure. thanks----- $arrResult = array(); $arrLines = file('Mon wk 1.csv'); $kountLines = 0; foreach($arrLines as $line) { ++$kountLines; echo $kountLines."<br />"; if ($kountLines >1) {// don't include the column names which are in the 1st line $arrResult[] = explode( ',', $line); $q = "INSERT INTO rawRaceResults (bib,nastarID, lastName, firstName, initial, address, city, state, zip, country, birthdate, raceAge, sex, discipline, ffSkiTeam, skiClubTeam, skiResortTeam, email, teamPoints, misc1, misc2, misc3, highSchoolPoints, ageGroup,course1, result1, handicap1, medal1, course2, result2, handicap2, medal2) VALUES ({$arrResult[0][0]},{$arrResult[0][1]}, {$arrResult[0][2]}, {$arrResult[0][3]},{$arrResult[0][4]},{$arrResult[0][5]}, {$arrResult[0][6]}, {$arrResult[0][7]}, {$arrResult[0][8]}, {$arrResult[0][9]}, {$arrResult[0][10]}, {$arrResult[0][11]}, {$arrResult[0][12]}, {$arrResult[0][13]}, {$arrResult[0][14]}, {$arrResult[0][15]}, {$arrResult[0][16]}, {$arrResult[0][17]}, {$arrResult[0][18]}, {$arrResult[0][19]}, {$arrResult[0][20]}, {$arrResult[0][21]}, {$arrResult[0][22]}, {$arrResult[0][23]}, {$arrResult[0][24]}, {$arrResult[0][25]}, {$arrResult[0][26]}, {$arrResult[0][27]}, {$arrResult[0][28]}, {$arrResult[0][29]}, {$arrResult[0][30]}, {$arrResult[0][31]})"; $r = mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($dbc)); if (mysqli_affected_rows($dbc) == 1) { // If it ran OK. echo "Line ".$kountLines.". "; echo "<br /><br />"; } } //if ($kountLines >1) loop $arrResult = array(); } //foreach loop
  6. That makes sense now. My need for databases / tables has been on a simple level so far. But every so often I get into a situation where I know, conceptually, what needs to be done. Realizing that I'm not the first person to encounter this, I know there must be a solution though have no idea what it might be, or be called. So, every once in a while it's good to re-visit the book(s) just to see what I missed (or skimmed over because I didn't think I needed it at the time) or to get back to this forum. It's a matter of "filling in the holes" within a conceptual framework that becomes more solid with time. It's my non-linear way of learning something which has always been my style. I'm so appreciative of having the great reference books around even years after I've finished "studying them". They sit on my bookshelf like soldiers at constant attention waiting to be called into active duty. The forums add a dynamic and human character to the overall process trying to understand something that sometimes seems beyond the bounds one would normally venture without either of these two aids. I wish you could see my copy of PHP 6 and MySQL 5. The pages are turning soft with wear, there are 32 plastic tabs that identify all the "most important" ideas and, because it was left out on my deck in a thunderstorm two years ago, the binding is peeling back and the pages are wavy and curled at the edges making the book itself about 20% thicker than when it was new. It's more valuable to me now despite the beating it has taken. I imagine a Kindle might not have fared quite as well ( and where do the tabs go?). Here's to all the good books and to the people of these forums. Chop
  7. Sorry, I misused the term. I am actually talking about tables in the same database as the constants DBTABLE and GALLERY (both tables)
  8. Yes, it appears you are correct. I assumed that the database name was optional where you have it mentioned in the FROM. It seems that you can eliminate it from some of the items but not from others. I thought that maybe, because the DBTABLE is the one "calling" the other table in on the Join, that the only required mention, in this case, is the GALLERY table. I actually tried eliminating the ".DBTABLE.". part from several items under the Select and it still works. But, I suppose the WHERE could be applied to either of the databases? thank you
  9. I have a similar SELECT query to the one below that works fine. The only difference is that it doesn't have a WHERE clause. I'm not really sure if I have it in the correct place. I want the WHERE to apply to 'DBTABLE' table. As a result I get this warning: Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given which I assume means there's an error in the way I set up the query $q = "SELECT ".DBTABLE.".imageID, ".DBTABLE.".imageName, ".DBTABLE.".H, ".DBTABLE.".W, ".DBTABLE.".matted, ".DBTABLE.".media, ".DBTABLE.".framed, ".DBTABLE.".imageTitle, ".DBTABLE.".imageDescription, ".DBTABLE.".comment, ".DBTABLE.".thePrice, ".DBTABLE.".available, ".DBTABLE.".hold, ".DBTABLE.".imageID, ".DBTABLE.".isSold, ".DBTABLE.".dateSold, ".DBTABLE.".sellPrice, ".DBTABLE.".soldTo, ".DBTABLE.".contactInfo, ".DBTABLE.".dateCreated, ".GALLERY.".oil, ".GALLERY.".water, ".GALLERY.".airlight, ".GALLERY.".equine, DATE_FORMAT(dateAdded, '%M %d, %Y') AS da FROM ".DBTABLE." INNER JOIN ".GALLERY." ON ".DBTABLE.".imageID=".GALLERY.".imageID WHERE imageID = $imageID";
  10. Epilogue to the IPN debacle and caveat to sandbox users: My high from solving this listener script problem was, however, short lived when I tried it (in the sandbox) using a "pay now" button after it had provd successful in the IPN simulator. The button would not work, the $_POST['payment_status'] would get to 'pending' but never 'Completed'. Therefore the script could not be completed. I spent many hours going over the ipn listener code but couldn't figure it out. I tossed in that towel and called tech. support at PayPal. I had to go 3 support levels down before I found someone who figured it out right away. Here it is: The SELLER account CANNOT BE SET TO 'payment review enabled'. You MUST disable this feature or nothing you do with this account will ever get past the 'pending' stage. Even though it will work in the test tools / IPN simulator. I'm not sure if it is enabled by default but you should make sure that it is not. Who'd a thunk it!
  11. Okay, problem solved and a suggestion to all IPN users: I overlooked a feature that the PP sandbox offers which helped me discover the problem in the script. I wish I had seen this earlier as it would have save me hours of debugging. Here is the feature: 1. Go to the sandbox Home page you will see "Test Tools" located in the left column 2. Go here and click on "Instant Payment Notification Simulator" 3. Fill in the necessary information particular to your own site. (note: each time you test with this, make sure you change the "txn_id" to indicate a different transaction than the last one you tried. The simulator eliminates the need to find bugs by testing through your own sandbox pseudo-buyer that you create. It is much much faster! My originally stated problem was that I couldn't get the value of $_POST['payment_status'] to be anything but "pending". But when I tried it in the simulator, I found that it did "Complete" the operation with my ipn.php script - hmmm. I believe that the reason for this is that the "pending" I got was only form the first loop the "while" statement that it was in and that, after a few loops, it probably changes to "Complete" ( I used an UPDATE sql to write the status to a 'test' table to find out what was happening. I don't know why that table wasn't written to multiple time as it looped through the "while" which would have finally yielded a "Complete") I also discovered a great way to help debug this "browserless" covert operation between PP and the listener IPN on my own server: put these lines at the beginning of your ipn.php code ini_set('log_errors', true); ini_set('error_log', dirname(__FILE__).'/ipn_errors.log'); This code will put any generated errors in an "ipn_errors.log" on the same level as your ipn.php script. Choose a point in the code ( such as inside a conditional) where you want to see if the condition is true or false. Then put something that will produce an error like xxx() yielding: [26-Jun-2012 12:37:46] PHP Fatal error: Call to undefined function xxx() in /home/portfoli/public_html/maaa/myIPN.php on line 9 You can do multiple tests like this in only a minute with the simulator. THE ACTUAL PROBLEM WITH MY SCRIPT: I wanted to shoot myself, but the reason it was not updating my database is: $q = "UPDATE".DBTABLE." SET paid_thru = '$newdate' WHERE maaMembersID = $uid LIMIT 1"; Can you see it? It took me 2 days because I was sidetracked by the "pending" problem. No space after the UPDATE within the quotes $q = "UPDATE".DBTABLE I hope this helps anyone having trouble using IPN ...Now I can mow my lawn.
  12. The value of payment_status is "pending". I check it by inserting the query (below) just after the line "if (strcmp ($res, "VERIFIED") == 0) { // a-okay, proceed" // check the value(s) of payment_status $ps = $_POST['payment_status']; $q = "INSERT INTO test (my_values) VALUES ('$ps')"; $r = mysqli_query ($dbc, $q); I expected to get more than 1 INSERT however because the query is in a WHILE loop. Maybe there would be many INSERTS as it changed from "pending" to "Completed". But there is only 1! How is the IPN script debugged without a browser window. I have sent variable values in emails to myself and by posting them to a database as above. As I mentioned, this script worked a week ago before I make some changes to it. But the changes were only to the query portions of it which come after the status was "complete". I don't know what happened. Later on... I found this to be a helpful way of detecting errors that might be in the ipn.php (I found no errors in the script above) // tell PHP to log errors to ipn_errors.log in this directory ini_set('log_errors', true); ini_set('error_log', dirname(__FILE__).'/ipn_errors.log');
  13. Thank you. I guess even though "000-00-00" was echoed out on both local and remote servers, the actual value of the two must be different. Else the strtotime() should have worked on both of them.
  14. I had this thing working okay at some point. Now it doesn't work at all. I have tested the listener script extensively - the script is out of the book except for the query stuff- and have located the point where it seems to be hanging up as noted below. I am testing this from a sandbox account. <?php // This page handles the Instant Payment Notification communications with PayPal. // Most of the code comes from PayPal's documentation. // This script is created in Chapter 6. // Require the configuration before any PHP code as the configuration controls error reporting: require ('includes/commonDefs.inc.php'); require(CONNECTION); $uid = "215"; // HARD WIRED IN FOR TESTING PURPOSES. THIS SAME $UID IS ALSO IN THE PAYPAL BUTTON // The config file also starts the session // Start by creating a request variable: $req = 'cmd=_notify-validate'; // Add each received key=value pair to the request: foreach ($_POST as $key => $value) { // Get all the POST vars from Paypal $value = urlencode(stripslashes($value)); $req .= "&$key=$value"; // the $req will be sent back to PP for confirmation } // Open a socket connection to PayPal: $fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30); // Test //$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30); // Live if (!$fp) { trigger_error('Could not connect for the IPN!'); } else { // Send the request to PayPal: $header = "POST /cgi-bin/webscr HTTP/1.0\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; fputs ($fp, $header . $req); // Paypal must get back exactly what it sent // Read in the response: while (!feof($fp)) { // keep reading until no more to read // ================================= $res = fgets ($fp, 1024); // get the completed response from Paypal if (strcmp ($res, "VERIFIED") == 0) { // a-okay, proceed // ============ THE ABOVE CONDITIONAL HAS TESTED FOR TRUE // ============ THE CONDITIONAL BELOW NEVER SEEMS TO BE TRUE if ($_POST['payment_status'] == 'Completed'){ I PUT IN AN UPDATE QUERY HERE TO TEST TO SEE IF IT WAS GETTING WITHIN THIS CONDITIONAL. IT DOES NOT. ABOVE THIS CONDITIONAL, IT SEEMS TO WORK OKAY. THIS CONDITIONAL IS A DUPLICATE OF THE ONE IN THE SCRIPT RIGHT BELOW HERE } // ====== THE ABOVE CONDITIONAL NEVER SEEMS TO BE TRUE ===== // Check for the right values: if ( isset($_POST['payment_status']) && ($_POST['payment_status'] == 'Completed') && ($_POST['receiver_email'] == 'chopth_1337786135_biz@gmail.com') && ($_POST['mc_gross'] == 25.00) && ($_POST['mc_currency'] == 'USD') && (!empty($_POST['txn_id'])) ) { // Need the database connection now: // Check for this transaction in the database: $txn_id = mysqli_real_escape_string($dbc, $_POST['txn_id']); $q = "SELECT maaMembersID FROM payments WHERE trans_id='$txn_id'"; $r = mysqli_query ($dbc, $q);
  15. I was perplexed why the same script yielded different results on my local and remote servers: In a mySql database (locally) I have "0000-00-00" in the Date column (formatted as a date). I have the same thing in my remote server. A select statement for retrieved the value of the 'paid thru' column for a member whom has never made a dues payment has always been set to "0000-00-00" by design. strtotime ($paid_thru) would therefor yield a gigantic negative number on my local server and serve the purpose for the conditional: if (strtotime ($paid_thru) <0) { ....} The same thing on the remote server yields no value at all and stopped all the gears. After several head-scratching minutes, I decided to change the "0000-00-00" scheme to the arbitrary date of 1969-06-06 ( a great year as some of us recall -Larry?). Discovering the db concept of "The Epoch" year, 1970-01-01, -which, as far as sql servers is concerned, is the beginning of the universe- 1969 was a time before time actually existed and therefore yielded a negative value instead of nothing from the remote. Because no member would never have gotten this far without paying their dues since "the summer of love" without getting the boot, this will work. But my actual question: I'm guessing that my version of PHP or MYSQL is earlier than that on the remote server. But which one? Does mySQL no longer treat 0000-00-00 like a date (though it still allows it in a date formatted column" or does the 'strtotime' php function no longer do the math on it as it used to? p.s. If I echo $paid_thru, it prints out 0000-00-00 on both servers and this was what was throwing me. (so maybe it's the php version?)
  16. In my "Dues_Date" column I have "2012-10-01" which is the time the dues must be paid for the coming term. I want that date to update itself, if possible, to "2013-10-01" on precisely the original dues date above. Can mySql do this by itself or do I need to write a script for it? In that case, how does the script get run if I'm, let's say, in Jamaica drinking a pina colada at the time?
  17. Okay, will see about getting a certificate. Thank you both for helping me out.
  18. I believe you! I don't want to jeopardize this site. From your explanation of "perceived and actual" , I understand that the ipn script needs ssl because of the sensitive data included in the variables it's sending. I'm just trying to understand the workings of ssl: when it's needed and at what point does it become trivial. For instance, let's say that a customer completes a payment at Paypal and chooses to go to the "thanks.php" page. Let's assume that all that's on that page is the following: echo "Thank You." You seem to be saying that it does because of "perceived security" (rather than actual) but it's important to do it anyway because so the customer doesn't think it's unsafe. Can you clarify what might cause an "unsafe" warning to pop up? Is it the fact that the last (Paypal) page was secure and now the very next one isn't? Personally, I've not seen such a warning appear from playing around in the PP sandbox. That doesn't mean it can't. At this point I'm still in the sandbox experimenting so I haven't screwed anything up yet. To summarize: IPN.php needs ssl the thankYou.php needs ssl everything else (the actual payment process) is on payPal's side and that's their certificate This is what I am hearing. Please let me know if I'm still missing the boat. thanks.
  19. Thanks Abigail. Yes, I understand that IPN is separate from SSL. If I could get away without buying a certificate and not having an "untrusted" screen come up that would be good. As I mentioned, the transaction actually takes place on Paypal so I'm not sure how big the risk is in not having https. When the IPN response kicks in, however, and my notification (ipn.php) page is accessed from Paypal, will this create an "untrusted" screen. Also, though you say: on page 151 of "e-commerce" Larry states: "The notification URL needs to be a page a page on your site accessed via HTTPS". So I wonder if this is possible at all. I am browsing through the IPN.pdf to see if it mentions this and will call tech support if I can't find out. Will post the results later.
  20. Abigail - Thanks for your time in posting a very informative chunk of information. Yes, I see the shortcomings of circumventing the IPN with PayPal more than I did before. I will check out your site as well as read over the Paypal .pdf. I am still wondering why an ssl is needed for Paypal to connect with the server on my end because the money transaction happens at their server not mine. I assume there's a good reason however. thanks again, chop
  21. I can understand that the IPN is the "correct" way but I wanted to find out if, for my one-time use in the described situation above, if there would be an easier alternative that would suffice because it gets more complicated. Beyond the IPN programming, there is the certificate issue: understanding it and expense. This is why I at least had to pose the question. I really don't have any experience in ssl certificates or did I want to pay $85 for a private certificate. I would probably risk my "kludge-y" version if it weren't for the fact that (as stated in 'e-commerce') it is up to the customer to click on the final button that returns the buyer from PayPal to the original website -where the DB update occurs. I agree it shouldn't be the buyers responsibility to click on that button to be credited for the purchase after the payment has been made. Thanks for your comments FYI: You can get a PayPal IPN Guide (pdf) here: https://cms.paypal.com/cms_content/en_US/files/developer/IPNGuide.pdf "That which doesn't kill us makes us stronger" - nietzsche
  22. On page 150 of Larry's e-commerce book starts a discussion of "Using IPN" with regard to Paypal. I now have a need for updating a user in my MySql database who just paid his fee via Paypal by marking that user as "paid". The point, as I read it, is to get Paypal to "talk" directly to the database of the Merchant (me) to signal that a transaction of payment has actually been completed. I was a bit blown away at how complicated this is (or seems to me) and decided at least try and think of a simpler way of handling it, albeit maybe less secure. I was looking for a reasonable trade-off. I decided that I would send the user to a "thank you" page upon clicking the button that actually completes the transaction on the Paypal side. Paypal will do this for me. Because the amount paid is already set in the button, I can be sure that the user has paid the required amount. The "thankYou.php" page (on my server) will then update the DB and mark the user as having paid his dues for that year and that will be that. EXCEPT that the "thankYou.php" appears in the browser window. If the user were to see that he could simply type in the full URL for that page and bypass the Paypal payment page, getting credit for it anyway. So, my next solution was to change "thankYou.php" to something like "iwi429en298fn.php" and put in a redirect to a new "thankYou.php" that just says "Thank You for your payment" and that's all. This means that "iwi429en298fn.php" records the payment to the DB but its name doesn't stay in the browser window long enough to even be noticed. All one actually sees is "thankYou.php" that comes afterwards. I know this isn't the professional way to do it and wouldn't even try if the group of people involved in this organization only numbers about 110 and are a group of fine artists that are, in general, not likely to ever try to beat this system even if someone told them how. - I suppose a savvy and sneaky person might think to look in the browser history- In addition, there are always the Paypal receipts that are sent to seller and buyer to fall back on if there is a question. The payment is also only $25/year which limits possible damages. So my real question is: Is this a valid way of handling this given the circumstances or are there risks that I am not thinking of? Am I just being lazy in not wanting to do it the "right way" or does this seem to you like this really might be a "reasonable trade-off". Very interested n your opinion.
  23. Thank you for clearing that up. I have a (vaguely) related question that I will post in the Effortless E-Commerce forum regarding "Using IPN" in a Paypal situation.
  24. As i look at the cookies on my web browser, I notice that the PHPSESSID does not get deleted after I have logged out. The logout script contains: $_SESSION = array(); // Clear the variables. session_destroy(); // Destroy the session itself. setcookie ('PHPSESSID', '', time()-3600, '/', '', 0, 0); // Destroy the cookie. Shouldn't the third line here do that? According to page 356, this line: "...sends a cookie to replace the existing session cookie in the browser" However, the content of the cookie (9580067fe06d9b5c25c89e1c230b062a) remains the same. ALSO (while I'm on the subject): While I have sessions going in my browser, I will go to a PayPal page and "buy something". When I return to my own site after completing the PayPal purchase, I find that the session values are still intact (that's good) and still have access to the original "user_id" etc. I'm unclear, really, about how a session ends other than by coding it such as in "session_destroy". Obviously, going to another page and back doesn't do it. Thanks for clarifying this for me.
×
×
  • Create New...