|
Welcome to the Frontpage
|
Best methods to optimize JPEG images for websites |
|
|
|
|
Saturday, 31 July 2010 11:24 |
|
While Internet connections becoming faster and faster, it’s still important to keep your website as fast as possible. One of the “slow” parts of your website are the images. In this article we show several ways to down-size the JPEG images for your website.
If you design your website should use some compression for your photos, banners and many other web elements. You favorite image editor should have some function to down-size your images. For this article we compare 4 ways to compress our example photo (file-size 393KB):
Adobe Photoshop
If you use the “Save for web…” function it’s possible to create a web optimized version from your image that is small enough and has a quality which is good enough for the Internet. In our example we used the preset “High Quality” which is equal to 60% quality. The result is a smaller file with a file-size of 95KB.
Adobe Fireworks
Fireworks is my favorite web image editor because of the unique feature to have bitmap and vector elements in a single file. We did an export with 80% quality and the compressed version has a file-size of 85KB.
GIMP (free Image Editor)
Both Adobe products are not free and are only available for Wndows or Mac. If you need a free editor you should try Gimp, an Image editor which many functions like the other commercial products mentioned before. The editor has also a “Safe for web” function and we used and 86% quality for our export file which becomes a size of 87KB. If you use GIMP to down-size your photos from your digital camera you should check the option “Strip EXIF”, removing the photo’s meta data will make the file smaller for another ~10KB.
ImageMagick (command line tools)
The last option is a tool we used via the command line. Using the following command the file is down-sized using an 80% quality (file size after conversion is 89KB):
convert original_100.jpg -quality 80 imagemagick_80.jpg
Sure this method works different from the other methods but the good point is that you can use this code in your PHP scripts or just from the command line of your web server.
Original image and compressed copies
Check the images below and note that the quality for the compressed images (file 2-5) is very similar.
web-development-blog.com/wp-content/uploads/2010/03/original_100-150x150.jpg" class="attachment-thumbnail" alt="Original 100%" title="Original 100%" />
web-development-blog.com/wp-content/uploads/2010/03/photoshop_60-150x150.jpg" class="attachment-thumbnail" alt="Adobe Photoshop 60%" title="Adobe Photoshop 60%" />
web-development-blog.com/wp-content/uploads/2010/03/fireworks_80-150x150.jpg" class="attachment-thumbnail" alt="Adobe Fireworks 80%" title="Adobe Fireworks 80%" />
web-development-blog.com/wp-content/uploads/2010/03/imagemagick_80-150x150.jpg" class="attachment-thumbnail" alt="Imagemagick 80%" title="Imagemagick 80%" />
web-development-blog.com/wp-content/uploads/2010/03/gimp_86-150x150.jpg" class="attachment-thumbnail" alt="GIMP 86%" title="GIMP 86%" />
The results after compression is very similar and the file size is between 85KB (fireworks) and 95KB (Photoshop). If you’re looking to down-size another 5-10%, you should try Smush.it a free service from Yahoo. They offer a tool which is able to optimize your images for 5-10% smaller file size without to lower the grade of quality.
Optimize your JPEG images with ImageMagick and PHP
If you need to optimize the images for your existing website, the following code might be useful:
<?php
$dir = '/home/some_directory/'; // the directory with your files
$compr = 80; // the quality precentage
if ($handle = opendir($dir)) {
while (false !== ($file = readdir($handle))) {
$path = $dir.$file;
if (is_file($path)) {
$ext = pathinfo($path, PATHINFO_EXTENSION);
if (preg_match('/^(jpg|jpeg)$/i', $ext)) {
exec(sprintf('convert %s -quality %d %s', $path, $compr, $path));
}
}
}
closedir($handle);
}
?>
Just enter the path to the the directory you like to optimize safe the code as a PHP script and execute the file from the command line of browser. Note only the JPEG files are getting compressed.
Optimize your images top make them load faster, but be careful don’t compress them too much. Similar Posts:
- Image manipulations with Imagemagick
- Upload images for usage in TinyMCE
- Tutorial: FTP Upload via cURL
 |
|
|
Create surveys with Google Forms |
|
|
|
|
Saturday, 31 July 2010 11:24 |
|
These days I needed an online tool to create a customer survey. Google Docs has a form feature which I tried this time and I was very surprised how easy and powerful this function is. Using Google forms, you don’t need any knowledge about how a web based form works. In this article we will show-case the following functionality:
- Create a form with the WYSIWYG form editor
- How your customers getting access to the survey
- Analyze and and work on the results
- Optional: How-to insert your survey form in your website using a lightbox
About Google Forms and Google Docs
Google Forms is part of Google Docs or better some kind of extension for Google Spreadsheets a web based spreadsheet program. To create a form using Google Docs, you need to have a Google account or a Google Apps account. Both account types are free available. Google offers also premium services for Google applications.
Creating web based forms without being a webmaster
If you start using Google Docs the first time, you get the idea that you’re using a similar application from the Microsoft Office suite. The menu and a lot of functions are very similar. Creating a form is very easy, you don’t need to write any code, just click some buttons and enter your text information:
web-development-blog.com/wp-content/uploads/2010/04/summary-150x150.png" class="attachment-thumbnail" alt="Summary" title="Summary" />
web-development-blog.com/wp-content/uploads/2010/04/resulttable-150x150.png" class="attachment-thumbnail" alt="Results" title="Results" />
web-development-blog.com/wp-content/uploads/2010/04/conformation-150x150.png" class="attachment-thumbnail" alt="Confirmation Screen" title="Confirmation Screen" />
web-development-blog.com/wp-content/uploads/2010/04/editform-150x150.png" class="attachment-thumbnail" alt="Edit form" title="Edit form" />
web-development-blog.com/wp-content/uploads/2010/04/datatypes-150x150.png" class="attachment-thumbnail" alt="Form elements" title="Form elements" />
web-development-blog.com/wp-content/uploads/2010/04/themes-150x150.png" class="attachment-thumbnail" alt="Themes for Google Forms" title="Themes for Google Forms" />
Using Google Docs, you can build forms with all form elements you need: text fields, text areas, check boxes, radio buttons, select lists. Create forms with multiple pages and describe each page and/or form element with the information you like. There are also basic validations for required fields.
Every element has clear and easy to use dialogs. Based on the language you’re using in Google Docs, you can create forms in most common languages. If your form is ready, you can choose from many fancy themes or if you don’t like them use plain theme type.
How-to send the survey to your customers?
Each Google Form is connected to the contact list from your Gmail account, you can use this list or just post the link to your survey using your mailing list hosted by Mailchimp or any other provider you like. If you use the Google contact list you should create a contact group to save time. Google Apps users are able to collect the user name and/or restrict the form only for users having an Google account from the same domain. If you use a regular Google account, these functions are not available. Don’t forget to post the survey to your company’s facebook fan page or your twitter feed if you have one or both of them.
Easy data access and statistics
Every form submission is stored in a spreadsheet at the moment the user has clicked the submit button. All submitted form values are accessible and stored together with the timestamp from the moment that the form was submitted. Beside the spreadsheet there is a data summary using graphics which will give you some quick information about how often the data was submitted.
Optional: Stylish integrations for your website or blog
Since Google Forms are hosted off-site, you need some way to embed the code in your website. Google is offering some code snippet which you can use as an Iframe but you can’t customize the style to match your own site’s design. Because you can’t change the style or code, we need an easy way “make it a part” from your website:
- Create your form and use the plain theme
- Add the following code to your websites header to include jQuery and the thickbox plugin:
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="thickbox.js"></script>
<link rel="stylesheet" type="text/css" href="thickbox.css" media="screen" />
You need to download upload the files if they don’t exist on your site.
- Create a link to the form URL (copy paste from the footer section on the page where you can edit the form)
<a href="http://spreadsheets.google.com/viewform?hl=en&formkey=dDZjNGROdVllS2JYMGdSZnVSSWF4YkE6MA&TB_iframe=true&height=400&width=500" class="thickbox">Survey Form</a>
Don’t mix the query parameters, any parameter after “TB_iframe” is not recognized on the target page. Change also the values for the width and height to match your forms dimensions. The pseudo class name “thickbox” is used to enable the tickbox feature.
- After submission Google will show a confirmation screen, don’t forget to edit this message (from the edit screen: More actions -> Edit confirmation
We created some example forms using multiple pages and most of the form elements.
Similar Posts:
- Integrate your MailChimp Newsletter Subscription
- jQuery form plugin and PHP file uploads
- jQuery Contact form for your website
 |
|
Sync Outlook and Google Apps on your mobile phone |
|
|
|
|
Saturday, 31 July 2010 11:24 |
|
I’m using Google Apps as my primary e-mail service for almost 4 years now and I must say the product has grown a lot within the last 2 years. A year ago I got my first cell phone powered by windows mobile and a few days ago I decided to synchronize my e-mail plus calendar with the data I have entered on my phone. Just one more feature offered by Google Apps.
Honestly I tried this before but without success, why? Because I missed one big point, this service is only available for premium accounts. In my case, I like to synchronize much more. As I mentioned before, I have a “personal” Google Apps account and a Windows mobile phone, but I’m using also a Microsoft Exchange account at the office, which I like to synchronize with my Windows mobile phone. The synchronization tool on the phone allows only one server and in fact I have two. But there is a possibility to arrange this.
Synchronize Microsoft Outlook with Google Apps
There is a Google Apps Sync tool to synchronize both accounts (Outlook and Google Apps) with each other including contacts, e-mail, tasks and the calendar. I tried that tool, but I don’t like to have a second Outlook profile for my personal stuff. 1-2 year ago there was already the Google Calendar Sync tool which is able to synchronize the Outlook calendar with the calendar from a Google Apps account. I needed to search the Google Calendar Documentation to find this tool back because Google doesn’t mention this tool anymore (the suggest the new sync tool instead). It works for Outlook 2003/2007 and with the latest version I’m able to synchronize my calendars in one or two ways:
web-development-blog.com/wp-content/uploads/2010/05/calendar-sync-tool-285x300.jpg" alt="" title="google calendar sync tool" width="285" height="300" class="alignnone size-medium wp-image-1088" />
In my case I want to show events from my Outlook calendar in my Google calendar; this is the one way synchronization (the 3rd option). I’m very surprised about the quality of this tool. I tested the following calendar updates, I made in Microsoft Outlook and all of them are updated to my Google calendar as well:
- Changing details from an existing item in the future
- Moving the item to another day
- Removing the item from the calendar
- Updating some items from the past
After the synchronization between Outlook and Google Apps is working we can start the synchronization between Google Apps and my Windows phone.
Synchronize Google Apps with Windows Mobile
Be sure you have a Google Apps Premium account and ActiveSync is available on your Windows mobile phone. Otherwise the synchronization will not work. Follow the instructions on how-to setup the Google Apps account for ActiveSync using these instructions. The screen-shots on that page might be different from them on your phone, but they should explain how-to setup the different options. I suggest to un-check the Contacts; in my case I use 20-30 contacts on my phone and have hundreds in my contact list on Google (you don’t wanna sync them all). After anything is done start the synchronization, but don’t forget that the synchronization process is done via the mobile Internet. If you don’t have a mobile Internet account it might be very expensive for you.
Similar Posts:
- Online Backup Service – Comparison
- .tel domain launch, the next mobile story
- Create surveys with Google Forms
 |
|
|
PHP Mail Scripts using SMTP transport, a guide for beginners |
|
|
|
|
Saturday, 31 July 2010 11:24 |
|
PHP has a very simple mail function which is used very often for basic text mail messages. What if you need to attach files or if you need to send your e-mail messages via SMTP? Than it’s time to use a more advanced script. This is because the standard mail function has only limited standard capabilities. There are many reasons to use SMTP transport for sending e-mail messages from your web application, some of them are:
- Many shared hosting providers doesn’t allow to use the PHP mail() function for security reasons
- Your web application is more flexible if you use the Simple Message Transfer Protocol (SMTP). This way your e-mail function is not limited to the servers port or e-mail configuration anymore.
- SMTP is much more powerful and secure (using SSL)
In this article we will compare three of the bigger PHP projects which allow to send e-mail messages via SMTP, including attachments.
- The Mail class included in the Zend Framework (http://framework.zend.com/)
- Swift Mailer (http://swiftmailer.org/)
- PHPMailer (http://phpmailer.worxware.com)
We reviewed these three PHP classes because they’re written for PHP5 and they are updated frequently. For our review we tried the provided examples and the documentation. We’re sure that all three classes are very powerful and offer many functions for almost every type of web application. Because this review should help the beginning PHP developer, this article is sho-case for a few functions only.
Our test case for this review
For our example we tested all three classes to send a plain text mail message with a single image attachment, using SMTP transport with authentication. Here is the good news; as a more experienced PHP user, I was able to use the provided examples within several minutes for each of the classes.
Zend Mail Class
ini_set('include_path', '.:/path2directory/ZendFramework/library/');
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Mail');
Zend_Loader::loadClass('Zend_Mail_Transport_Smtp');
$config = array('auth' => 'login',
'username' => 'smtpUser',
'password' => 'smtpPassword');
$transport = new Zend_Mail_Transport_Smtp('smtp.server.com', $config);
$mail = new Zend_Mail();
$at = $mail->createAttachment(file_get_contents('path/logo.png'));
$at->filename = 'logo.png';
$mail->setBodyText('This is the text inside the mail send by Zend_Mail using SMTP transport.');
$mail->setFrom('
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
', 'Your Name');
$mail->addTo('
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
', 'Your friend');
$mail->setSubject('Mail Subject');
$mail->send($transport);
I don’t like the documentation from the Zend framework, you need to check many pages to get all the required code for the snippet above. You need to create a second object to send your message via SMTP. I’m missing the information on their site about how-to test the “send” function to create use a success or error message. Using the class is not very difficult, but installing the Zend Framework might be a hard job for the beginner. This class is a great solution for people already using the Zend Framework or where the the library is provided by the hosting provider.
Swift Mailer
require_once 'Swift/lib/swift_required.php';
$transport = Swift_SmtpTransport::newInstance('smtp.server.com', 25)
->setUsername('smtpUser')
->setPassword('smtpPassword');
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance('Wonderful Subject')
->setFrom(array('
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
' => 'Your Name'))
->setTo(array('
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
' => 'Your friend'))
->setBody('This is the text of the mail send by Swift using SMTP transport.');
$attachment = Swift_Attachment::newInstance(file_get_contents('path/logo.png'), 'logo.png');
$message->attach($attachment);
$numSent = $mailer->send($message);
printf("Sent %d messages\n", $numSent);
The snippet looks similar to the code from the Zend mail class, but you have to create 4 different objects:
- An object for the SMTP transport (Swift_SmtpTransport)
- The object that will send the message (Swift_Mailer)
- The message object for all mail parts (Swift_Message)
- An object for the attachment (Swift_Attachment)
The configuration/installation is much easier than for the Zend Framework, just include one single file and you’re ready to use the class. If you like this OOP (Object Oriented Programming) style used in this class, this script might be for you.
PHPMailer
require_once 'PHPMailer5/class.phpmailer.php';
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Host = 'smtp.server.com';
$mail->Port = 25;
$mail->SMTPAuth = true;
$mail->Username = 'smtpUser';
$mail->Password = 'smtpPassword';
$mail->SetFrom('
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
', 'Your Name');
$mail->AddAddress('
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
', 'Your friend');
$mail->Subject = 'PHPMailer Message';
$mail->Body = 'This e-mail is sent through PHPMailer.';
$mail->AddAttachment('path/logo.png', 'logo.png');
if(!$mail->Send()) {
echo 'Mailer error: '.$mail->ErrorInfo;
} else {
echo 'Message has been sent.';
}
The coding style from this example looks very different from the two others and some PHP developer would say this is not really OOP code. Right PHPMailer doesn’t have one file for each method and for the example above you need to upload only two files. I like the PHPMailer class because of all the information you get on the project’s website.
The three examples above should help you to make the decision which script will work the best for you. Check the links below for the documentation related to the snippets I have used in this artikel:
- http://framework.zend.com/manual/en/zend.mail.html
- http://swiftmailer.org/docs/introduction
- http://phpmailer.worxware.com/index.php?pg=examplebsmtp
Similar Posts:
- Sending e-mails via SMTP with PHPmailer and Gmail
- jQuery Contact form for your website
- Integrate your MailChimp Newsletter Subscription
 |
|
Create PDF documents Online with TCPDF |
|
|
|
|
Saturday, 31 July 2010 11:24 |
|
Many web applications using PDF documents for invoices, contracts and many other doc types. There are a few PHP classes which are able to create PDF documents online, one of them is TCPDF. This tutorial is about how-to use the TCPDF class while creating a simple invoice document. If you like to take a sneak peak on the result, check this website which generates the PDF Invoice document on the fly.
Why TCPDF and not some other PHP class?
TCPDF is based on the FPDF class, a very stable project written for PHP4. Since several years has TCPDF much more features than FPDF and is written for PHP5 (there is also a PHP4 version). The TCPDF has also some great documentation and of course examples for all important PDF jobs like:
WriteHTML and RTL support, Multiple columns, JavaScript and Forms, Bookmarks (Table of Content), Multicell complex alignment, Barcodes, Set PDF viewer display preferences, EPS/AI vectorial images and many more.
The Zend Framework has some PDF class too…
Yes right, the first plan was to write this tutorial about the Zend Framework, but after writing a few rows of code I’ve noticed that the PDF Class is missing some important functions, like the MultiCell, which is used to wrap multiple rows of text. It’s a required function which was suggested as the Zend_Pdf_Cell 2 years ago and didn’t find the way to the core version until now. I like the Zend Framework a lot but not for creating PDF documents, the PDF class is much too limited. web-development-blog.com/wp-includes/images/smilies/icon_sad.gif" alt=":(" class="wp-smiley" />
Okay let’s start the tutorial:
In this tutorial we create a PDF invoice including header logo, the invoice rows, an information box and some footer row.
In our code we include some PHP files, next we’ve created a small class extension to have a custom header/footer and some handy method which creates a text box.
require_once('tcpdf/config/lang/eng.php');
require_once('tcpdf/tcpdf.php');
class MYPDF extends TCPDF {
public function Header() {
$this->setJPEGQuality(90);
$this->Image('logo.png', 120, 10, 75, 0, 'PNG', 'http://www.finalwebsites.com');
}
public function Footer() {
$this->SetY(-15);
$this->SetFont(PDF_FONT_NAME_MAIN, 'I', 8);
$this->Cell(0, 10, 'finalwebsites.com - PHP Script Resource, PHP classes and code for web developer', 0, false, 'C');
}
public function CreateTextBox($textval, $x = 0, $y, $width = 0, $height = 10, $fontsize = 10, $fontstyle = '', $align = 'L') {
$this->SetXY($x+20, $y); // 20 = margin left
$this->SetFont(PDF_FONT_NAME_MAIN, $fontstyle, $fontsize);
$this->Cell($width, $height, $textval, 0, false, $align);
}
}
The header method has only two functions, one sets the image quality and the second will place an image (including hyperlink) on a defined place (x=120, Y=10, width=75). All coordinates are measured in Millimeters and the height for the image is calculated by the script. Inside the footer method we’re using some basic TCPDF methods to define the position, the font/style and the cell with the footer text. The third method (CreateTextBox) is just a group of TCPDF functions which makes it easier to place some text box into the PDF document. Note, the constant variable PDF_FONT_NAME_MAIN is defined inside the TCPDF config file, which is located inside the config directory.
The invoice header
The following code will create a TCPDF object with default values, the PDF meta data gets defined (author, title, etc.), a page is added and the invoice header with information is created using our custom text box method.
// create a PDF object
$pdf = new MYPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
// set document (meta) information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Olaf Lederer');
$pdf->SetTitle('TCPDF Example');
$pdf->SetSubject('TCPDF Tutorial');
$pdf->SetKeywords('TCPDF, PDF, example, tutorial');
// add a page
$pdf->AddPage();
// create address box
$pdf->CreateTextBox('Customer name Inc.', 0, 55, 80, 10, 10, 'B');
$pdf->CreateTextBox('Mr. Tom Cat', 0, 60, 80, 10, 10);
$pdf->CreateTextBox('Street address', 0, 65, 80, 10, 10);
$pdf->CreateTextBox('Zip, city name', 0, 70, 80, 10, 10);
// invoice title / number
$pdf->CreateTextBox('Invoice #201012345', 0, 90, 120, 20, 16);
// date, order ref
$pdf->CreateTextBox('Date: '.date('Y-m-d'), 0, 100, 0, 10, 10, '', 'R');
$pdf->CreateTextBox('Order ref.: #6765765', 0, 105, 0, 10, 10, '', 'R');
Invoice Rows
Now we create the information about the products we like put into the PDF invoice. First we create some headers and than we use a foreach loop to output our $orders array.
// list headers
$pdf->CreateTextBox('Quantity', 0, 120, 20, 10, 10, 'B', 'C');
$pdf->CreateTextBox('Product or service', 20, 120, 90, 10, 10, 'B');
$pdf->CreateTextBox('Price', 110, 120, 30, 10, 10, 'B', 'R');
$pdf->CreateTextBox('Amount', 140, 120, 30, 10, 10, 'B', 'R');
$pdf->Line(20, 129, 195, 129);
// some example data
$orders[] = array('quant' => 5, 'descr' => '.com domain registration', 'price' => 9.95);
$orders[] = array('quant' => 3, 'descr' => '.net domain name renewal', 'price' => 11.95);
$orders[] = array('quant' => 1, 'descr' => 'SSL certificate 256-Byte encryption', 'price' => 99.95);
$orders[] = array('quant' => 1, 'descr' => '25GB VPS Hosting, 200GB Bandwidth', 'price' => 19.95);
$currY = 128;
$total = 0;
foreach ($orders as $row) {
$pdf->CreateTextBox($row['quant'], 0, $currY, 20, 10, 10, '', 'C');
$pdf->CreateTextBox($row['descr'], 20, $currY, 90, 10, 10, '');
$pdf->CreateTextBox('$'.$row['price'], 110, $currY, 30, 10, 10, '', 'R');
$amount = $row['quant']*$row['price'];
$pdf->CreateTextBox('$'.$amount, 140, $currY, 30, 10, 10, '', 'R');
$currY = $currY+5;
$total = $total+$amount;
}
$pdf->Line(20, $currX+4, 195, $currX+4);
After the headers and after the list of invoice items we create a line. Inside the loop, we use the variable $currY to raise the Y coordinate by 5 for each new row. The row amount is calculated by PHP and also the total amount is raised inside the foreach loop.
Invoice footer and information
First we create a total row using the value from the variable $total we created before. After that row we have a MultiCell which can hold the payment conditions or just some other information. You can use HTML code in this cell as well, for example a link to your terms and conditions.
// output the total row
$pdf->CreateTextBox('Total', 20, $currX+5, 135, 10, 10, 'B', 'R');
$pdf->CreateTextBox('$'.number_format($total, 2, '.', ''), 140, $currX+5, 30, 10, 10, 'B', 'R');
// some payment instructions or information
$pdf->setXY(20, $currX+30);
$pdf->SetFont(PDF_FONT_NAME_MAIN, '', 10);
$pdf->MultiCell(175, 10, '<em>Lorem ipsum dolor sit amet, consectetur adipiscing elit</em>. <br />
Vestibulum sagittis venenatis urna, in pellentesque ipsum pulvinar eu. In nec <a href="http://www.google.com/">nulla libero</a>, eu sagittis diam. Aenean egestas pharetra urna, et tristique metus egestas nec. Aliquam erat volutpat. Fusce pretium dapibus tellus.', 0, 'L', 0, 1, '', '', true, null, true);
//Close and output PDF document
$pdf->Output('test.pdf', 'F');
At the end we call the output method which will safe the created PDF under the name test.pdf and sends the document to the browser.
This is just an example to show how easy it is to create PDF files online. Before you start your own PDF scripts, check all the TCPDF examples to get an idea how-to use the different methods.
Similar Posts:
- Search for photos using PHP and the flickr API
- jQuery form plugin and PHP file uploads
- jQuery Contact form for your website
 |
|
|
|
|
|
|
Page 1 of 96 |
|