Manualjquery
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,495
On Slideshare
1,495
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
44
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. I.U.T. 1 de Grenoble Département Réseaux & Télécommunication 2008 / 2009 Programmation Web Initiation à l'utilisation de jQuery Table des matières 1.Introduction...........................................................................................................................1 2.Les sélecteurs.........................................................................................................................2 3.Les événements......................................................................................................................3 4.Manipulation des attributs........................................................................................................3 5.Manipuler et traverser le DOM...................................................................................................5 6.Ajax......................................................................................................................................6 7.Les effets et jQuery UI.............................................................................................................8 8.Utiliser et créer un plugin jQuery...............................................................................................9 1. Introduction a) Qu'est-ce que jQuery ? jQuery est un framework qui a pour vocation de simplifier l'utilisation du langage JavaScript. Créé par John Resig, les premières expérimentations virent le jour en 2005 autour d'un concept de base : offrir à JavaScript un moyen simple de sélectionner des éléments au delà du traditionnel getElementById(). Par la suite de nombreuses fonctionnalités ont été ajoutées afin de gérer les événements JavaScript, les attributs, manipuler le DOM, créer des effets, utiliser AJAX... La liste des sites utilisant ce framework est assez impressionnante, pour n'en citer que quelques uns : Google, Twitter, Amazon, Intel, Sourceforge. jQuery s'utilise de préférences de façon non intrusive. C'est à dire bien séparé du code HTML, soit dans un script .js, soit dans la balise <head>. Il se présente sous forme d'une fonction : jQuery(selector, context) jQuery retourne un objet contenant une liste d'élément et une multitude de méthodes permettant d'agir sur ces éléments. Afin de réduire au maximum la taille des instructions, un alias de cette fonction est fourni : $(selector, context) Cela peut paraitre un peu déroutant mais le $ est bien autorisé dans le nommage des fonctions JavaScript. b) jQuery et les autres framework jQuery est loin d'être le seul framework JavaScript open source disponible sur Internet, les plus connus sont MooTools, Prototype, Dojo. Ils ont parfois des approches un peu différentes mais se ressemblent beaucoup dans les concepts. A tels points qu'ils ont tous la fâcheuse tendance à définir le même alias $. Il est donc préférable, lors de l'utilisation de plusieurs framework en même temps, d'utiliser la fonction jQuery() plutôt que $(). jQuery fourni, de plus, une méthode noConflict() permettant de désactiver ou renommer cet alias. c) Utiliser jQuery jQuery est très facile à utiliser. Il est disponible sous forme d'un script .js à charger dans le <head> : <script type="text/javascript" src="jquery.js"></script> Afin d'exécuter son code qu'une fois le chargeur DOM jQuery fourni les instructions suivantes : <script type="text/javascript"> $(document).ready(function(){ // Your code here }); </script> B.P. 1/9
  • 2. I.U.T. 1 de Grenoble Département Réseaux & Télécommunication 2008 / 2009 Programmation Web 2. Les sélecteurs Un des gros avantages de jQuery est sa capacité à sélectionner un élément ou une liste d'élément de l'arbre DOM bien au delà des fonctions JavaScript traditionnelles. Afin de simplifier la prise en main du framework, les développeurs de jQuery ont choisi d'utiliser la méthode de sélection de CSS3. Autrement dit, sélectionner un élément ou une liste d'élément avec jQuery se fait de la même manière que dans une feuille de style. La méthode each(fn) permet de parcourir la liste d'éléments retourné par un sélecteur. Il s'agit d'une méthode de base utilisée par beaucoup d'autres méthodes du framework. Elle attend une fonction comme argument soit par référence, soit en déclarant la fonction à la volée comme il est de coutume dans l'utilisation de jQuery. Voici la syntaxe : $(selector).each(function(){ // Code here }); Au sein de cette fonction, this contient l'élément HTML courent et $(this) constitue un sélecteur à partir de cette élément. Documentation de références : http://docs.jquery.com/Selectors a) Javascript vs jQuery Code Javascript Equivalent jQuery document.getElementById("MyElement") $("#MyElement") document.getElementsByTagName("input") $("input") document.getElementsByName("MyName") $("[name=MyName]") document.getElementsByTagName("input")[2] $("input:eq(2)") b) Exemples Afin de visualiser plus simplement la sélection des éléments nous allons utiliser une méthode jQuery appelée addClass. Son rôle est d'ajouter une classe aux éléments sélectionnés. La feuille css comporte des règles background-color associées à chaque classe. Code HTML Code jQuery <table> <tr id="ligne1"> $("#ligne1").addClass("myClassBlue"); <td class="colonne1">&nbsp;</td> $(".colonne1").addClass("myClassYellow"); <td class="colonne2">&nbsp;</td> $("#ligne1 > .colonne1").addClass("myClassGreen"); <td class="colonne3">&nbsp;</td> $("td:last").addClass("myClassRed"); <td class="colonne4">&nbsp;</td> $("a[name=lien]").addClass("myClassRed"); </tr> <tr id="ligne2"> Résultat <td class="colonne1">&nbsp;</td> <td class="colonne2"> <a name="lien" href="#">Lien</a> </td> <td class="colonne3">&nbsp;</td> <td class="colonne4">&nbsp;</td> </tr> <tr id="ligne3"> <td class="colonne1">&nbsp;</td> <td class="colonne2">&nbsp;</td> <td class="colonne3">&nbsp;</td> <td class="colonne4">&nbsp;</td> </tr> <tr id="ligne4"> <td class="colonne1">&nbsp;</td> <td class="colonne2">&nbsp;</td> <td class="colonne3">&nbsp;</td> <td class="colonne4">&nbsp;</td> </tr> </table> B.P. 2/9
  • 3. I.U.T. 1 de Grenoble Département Réseaux & Télécommunication 2008 / 2009 Programmation Web 3. Les événements jQuery fourni dans son API tout un jeu de méthodes permettant de lier des actions à des événements particuliers : par exemple au survol de la souris, lors d'un click ou la pression d'une touche. On pourra facilement faire le parallèle avec les attributs HTML onclick, onmouseover, onkeypress etc. Ces fonctions s'utilisent en association avec les sélecteurs sous la forme : $("#MyElement").click(); Cet exemple place un événement onclick sur l'élément dont l'id est MyElement. Tous les événements gérés par JavaScript on leur équivalent dans l'API de jQuery mais pas seulement. La méthode hover() permet de gérer en une seule fois les événements onmouseover et onmouseout. De même la méthode toggle() permet d'alterner 2 fonctions sur un événement onclick. Enfin one() permet de déclencher un événement qu'une seule fois. Autre différence notable, les méthodes jQuery permettent à plusieurs scripts différents de définir un événement sur le même élément. Par exemple en JavaScript, si exécute 2 fois l'instruction .onclick = ... sur un même élément, la 2ième exécution va remplacer la 1ère alors qu'avec jQuery les instructions .click( ... ) s'ajoutent. On pourra aussi supprimer toutes les actions placés sur un événement grâce à la fonction unbind(). Documentation de références : http://docs.jquery.com/Events a) Javascript vs jQuery Code Javascript Equivalent jQuery document.getElementById("MyElement").onclick = function() $("#MyElement").click( function() { alert("welcome"); } { alert("welcome"); } ) b) Exemples Code HTML <button id="button1">alert() à chaque double click</button> <button id="button2">alert() au premier click</button> <button id="button3">Activer / Désactiver alert() keycode</button> Code jQuery Résultat $("#button1").dblclick(function(){ alert( "Double Click !" ); }); $("#button2").one("click",function(){ alert( "One click !" ); - Le double click sur le 1er bouton affiche un message }); d'alerte $("#button3").toggle( function(){ alert( "Appuyer sur une touche" ); - Le 1er click sur le 2ième bouton affiche un message $("body").keydown(function(e){ d'alerte, les suivants n'affiche rien alert( 'keyCode = ' + e.keyCode ); return false; - Le click sur le dernier bouton active et désactive }); }, alternativement un bind sur la pression d'une touche où que function(){ l'on soit dans la page (si actif, à chaque pression de touche $("body").unbind("keydown"); un message d'alerte affiche le keyCode correspondant). } ); 4. Manipulation des attributs La méthode jQuery attr() permet de lire et écrire les attributs HTML du/des élément(s) sélectionné(s) grâce aux sélecteurs : • attr( myAttr ) permet de récupérer la valeur de l'attribut myAttr. • attr( myAttr, myValue ) permet de définir la valeur de l'attribut myAttr avec la valeur myValue. B.P. 3/9
  • 4. I.U.T. 1 de Grenoble Département Réseaux & Télécommunication 2008 / 2009 Programmation Web Une fois encore l'API de jQuery permet d'aller plus loin dans la gestion des attributs. Nous avons précédemment utilisé la fonction addClass(). Cette méthode fait parti d'une série (removeClass, toggleClass) permettant de manipuler l'attribut class: . L'utilisation de ces fonctions permet d'ajouter ou supprimer des classes a un élément sans se soucier de son état initial. Ainsi l'élément <p class="myClass1"> associé au code $("p").addClass("myClass2") est équivalent à l'élément <p class="myClass1 myClass2"> alors qu'en l'associant au code $ ("p").attr("class","myClass2") cela équivaudrait à l'élément <p class="myClass2"> De même la méthode css() permet de manipuler l'attribut style : • css( styleName ) permet de récupérer la valeur du style styleName. • css( styleName, myValue ) permet de définir la valeur du style styleName avec la valeur myValue. La récupération de la valeur du style est particulièrement intéressante car jQuery récupère la valeur réelle du style en tenant compte des feuilles de style et des styles hérités. Enfin la méthode val() permet de manipuler la valeur des champs de formulaire, soit l'attribut HTML value : • val() permet de récupérer la valeur d'un champ de formulaire. Elle retourne un tableau de valeur si l'élément est un select multiple. • val( myValue ) permet de définir la valeur d'un champ de formulaire. • Val( [ myValue1, myValue2 ] ) permet de définir plusieurs valeurs d'un champ de formulaire par exemple pour les checkbox ou les select multiple. Attention ! Curieusement cette méthode ne permet pas de récupérer la valeur des checkbox et des boutons radio sélectionné. Il faudra pour cela utiliser la pseudo-classe : checked au niveau sélecteur par exemple : $("input[name=radio1]:checked").val(). Documentation de références : http://docs.jquery.com/Attributes / http://docs.jquery.com/CSS a) Javascript vs jQuery Code Javascript Equivalent jQuery document.getElementById("MyElement").value = "myValue" $("#MyElement").val("myValue") document.getElementById("MyElement").class = "myClass" $("#MyElement").addClass("myClass") document.getElementById("MyElement").setAttribute("align" $("#MyElement").attr("align","center") ,"center") b) Exemples Code HTML <button id="button1">-</button> <button id="button2">+</button> <button id="button3">Permutter l'alignement</button> <button id="button4">Bold</button> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut quam orci, rutrum eu rutrum quis, tincidunt vitae risus. Donec tempus ipsum in turpis aliquet sit amet malesuada eros accumsan. Vestibulum ipsum elit, auctor in suscipit non, dictum at eros. Vestibulum bibendum eros vel eros fermentum vitae egestas lectus dignissim. Donec sagittis ultrices mollis.</p> Code jQuery $("#button1").click(function(){ var height = parseInt($("#exemples p").css("height")) – 20; $("#exemples p").css("height", height + "px"); var width = parseInt($("#exemples p").css("width")) – 20; $("#exemples p").css("width", width + "px"); }); $("#button2").click(function(){ var height = parseInt($("#exemples p").css("height")) + 20; $("#exemples p").css("height", height + "px"); var width = parseInt($("#exemples p").css("width")) + 20; $("#exemples p").css("width", width + "px"); }); B.P. 4/9
  • 5. I.U.T. 1 de Grenoble Département Réseaux & Télécommunication 2008 / 2009 Programmation Web $("#button3").toggle( function(){ $("#exemples p").attr("align", "center"); }, function(){ $("#exemples p").attr("align", "right"); }, function(){ $("#exemples p").attr("align", "justify"); }, function(){ $("#exemples p").attr("align", "left"); } ); $("#button4").click(function(){ $(this).toggleClass("myBold"); $("#exemples p").toggleClass("myBold"); }); Résultat - Les boutons « + » et « - » augmente et diminue la taille de la balise <p>. - Le bouton suivant permute l'alignement du texte. - Le dernier alterne mise en en gras ou non du texte. 5. Manipuler et traverser le DOM jQuery simplifie grandement la manipulation du DOM, d'une part grâce à la sélection aisé d'un élément (vu précédemment) et d'autre part en fournissant la méthode html() permettant de lire et écrire le contenu de cet élément : • $("#myElement").html() retourne le contenu de l'élément dont l'id est myElement. • $("#myElement").html( myHTML ) remplace le contenu de l'élément dont l'id est myElement avec le code HTML myHTML. text() est une méthode variante de html(), elle s'utilise de la même manière avec la particularité de supprimer toutes les balises HTML du contenu. Afin d'aller un peu plus loin dans la manipulation du DOM jQuery fournit des méthodes tel que append(), prepend(), after() et before() permettant non pas de replacer mais d'ajouter du contenu respectivement à la fin, au début, après et avant le/les élément(s) sélectionné(s). Traverser le DOM consiste à parcourir des parents / enfants de l'arbre DOM à partir d'un point précis. Ainsi la méthode parent() retourne l'élément parent d'un sélecteur donné et la méthode children( mySelector ) les enfants sachant qu'il est possible de filtrer les enfants grâce à un sélecteur mySelector. find() fonctionne de la même manière que children() à la différence qu'elle retourne tous les descendants et pas seulement les enfants. next() et prev() quand à elle retourne respectivement l'élément juste après et juste avant. Documentation de références : http://docs.jquery.com/Manipulation / http://docs.jquery.com/Traversing a) Javascript vs jQuery Code Javascript Equivalent jQuery document.getElementById("MyDiv").innerHTML = "myHTML" $("#MyDiv").html("myHTML") document.getElementById("MyDiv").firstChild.nodeValue = "myText" $("#MyDiv").text("myHTML") var myText = document.createTextNode(texte); $("body").append("myText") document.getElementsByTagName("body")[0].appendChild(myText); B.P. 5/9
  • 6. I.U.T. 1 de Grenoble Département Réseaux & Télécommunication 2008 / 2009 Programmation Web b) Exemples Code HTML <p><b><i>Lorem ipsum</i></b> dolor sit amet, consectetur adipiscing elit.</p> <p>Ut quam orci, rutrum eu rutrum quis, <i>tincidunt vitae risus.</i></p> <p><i>Donec tempus ipsum</i> in turpis aliquet sit amet malesuada <i>eros accumsan</i>.</p> <p><b>Vestibulum ipsum</b> elit, <i>auctor in suscipit non</i>, dictum at eros.</p> Code jQuery Résultat $("#exemples").dblclick(function(){ if($("#exemples pre")[0]){ $(this).html( $(this).text() ); } else { $(this).text( $(this).html() ); $(this).wrapInner("<pre></pre>"); } }); - Le double click sur le texte affiche la source $("#exemples p b").hover( html et vise versa. function(){ $(this).parent().append("<b> <--</b>"); - Au survol des textes en gras, une flèche est }, affichée en gras juste avant la balise </p> function(){ - Au survol de chaque ligne, les textes en $(this).parent().children("b:last").remove(); italique à l'intérieur de la ligne sont transformé } en majuscule. ); $("#exemples p").mouseenter(function(){ $(this).find("i").each(function(){ $(this).html($ (this).html().toUpperCase()); }); }); 6. Ajax AJAX est un acronyme signifiant Asynchronous JavaScript and XML. Il ne s'agit pas d'une technologie mais d'une méthodologie qui consiste, au travers de l'objet JavaScript XMLHttpRequest, de créer un dialogue XML entre une page HTML et un serveur PHP (ou autres) sans à avoir à recharger la page. Le format XML étant un peu fastidieux à traiter avec JavaScript il est souvent remplacé par le format de sérialisation JSON ou plus simplement par des échanges PLAIN TEXT. Au final, Ajax a lancé une mode mais la méthodologie est rarement suivie à la lettre. Pour des raisons de sécurités l'objet XMLHttpRequest ne permet pas de faire des requêtes en dehors de son domaine. Afin de contourner se problème jQuery utilise la balise <script> qui permet de charger du code JavaScript venant d'un autre domaine mais le code retourné par le serveur doit impérativement être du code JavaScript. Récemment une méthodologie, appelée JSONP, à vu jour pour rendre transparent l'utilisation de la balise <script> dans le cas d'un retour de chaine JSON. Cela nécessite un support au niveau serveur avec appel d'une fonction de callback mais au final la méthode ajax() retourne une chaine comme si le script était sur le même domaine. Comme toujours, jQuery fourni un certain nombre de méthodes permettant d'utiliser Ajax en toute simplicité. La méthode ajax() permet de répondre à la plus part des besoins. Cette dernière provient directement de $ et non d'un sélecteur. Elle s'utilise simplement par un appel de type $.ajax(). De nombreux paramètres sont disponible, voici les principaux : • type défini la méthode d'envoi : "POST", "GET" • dataType défini le type de donnée retourné par le serveur : "xml", "html", "script", "json", "jsonp", "text" • url défini la page du serveur à appeler : "script.php" • data défini les valeurs à envoyer : "param1=valeur1&param2=valeur2" ou {param1:valeur1, param2:valeur2} • success défini une fonction de callback exécutée au succès de la requête : function(data, textType) où data contient les données retournés par le serveur et textType le type de ces données. • error défini une fonction de callback exécutée en cas d'erreur de la requête : function(XMLHttpRequest, textStatus, errorThrown) où textStatus contient le type d'erreur et errorThrown un object de type exception. Documentation de références : http://docs.jquery.com/Ajax B.P. 6/9
  • 7. I.U.T. 1 de Grenoble Département Réseaux & Télécommunication 2008 / 2009 Programmation Web a) Exemples Code HTML <input type="text"> <button id="button1">Traduire !</button> <button id="button2">Ajax Erreur 404</button> Code jQuery $("#button1").click(function(){ var texte = encodeURIComponent( $("#exemples input[type=text]").val() ); $.ajax( { type: "GET", url: "http://ajax.googleapis.com/ajax/services/ language/translate", data: "v=1.0&langpair=fr|en&q=" + texte, dataType: "jsonp", success: function(retour){ $("#exemples div").remove(); $("#exemples").append( "<div>" + retour['responseData']['translatedText'] + "</div>" ); $("#exemples div").css("font-weight","bold"); } }); }); $("#button2").click(function(){ $.ajax( { type: "GET", url: "naz.php", error: function(XMLHttpRequest){ var message = ''; for( i in XMLHttpRequest ) message += i + ' = ' + XMLHttpRequest[i] + 'n'; alert(message); } }); }); Résultat - Le bouton « Traduire ! » traduit en anglais le texte rentré dans le champ texte. - Le bouton « Ajax Erreur 404 » appel une page inexistant et affiche le contenu de l'objet XMLHttpRequest sur le retour d'erreur. 7. Les effets et jQuery UI Jusqu'à lors, les méthodes présentées étaient en lien direct avec JavaScript, leurs but étant de simplifier les choses. Mais au final, le résultat n'était pas si éloigné de ce que l'on peut faire en JavaScript traditionnel. Dans cette partie, les méthodes sont beaucoup plus atypiques. On pourrait presque les apparenter à des minis applications : elles ont, pour la plus part, des paramètres de configuration et le point commun de bousculer les règles de l'esthétisme et de l'ergonomie. C'est en général ce genre de méthodes qui font la réputation d'un tel framework. jQuery permet de réaliser des effets visuels lors du changement d'état d'un élément ( affichage, masquage, déplacement... ) : fadeIn(), fadeOut() et fadeTo() réalisent des effets de fondu sur un élément respectivement lors de l'affichage, du masquage et vers un état personnalisé. De même slideUp() et sildeDown() réalisent des effets de glissières sur les éléments. Enfin la méthode animate() permet, d'une façon plus générale, de réaliser automatiquement des effets de transition entre 2 états d'un élément. Cette méthode est beaucoup plus complète de part sa multitude de paramètres de configuration mais aussi beaucoup plus complexe à utiliser. jQuery UI est un projet annexe qui a pour vocation de compléter l'api de jQuery au niveau des effets visuel et des interactions utilisateurs. Il fournit de plus un certain nombre de widgets d'utilisation courante. Son utilisation nécessite le chargement d'une librairie supplémentaire. B.P. 7/9
  • 8. I.U.T. 1 de Grenoble Département Réseaux & Télécommunication 2008 / 2009 Programmation Web Les méthodes d'interactions utilisateurs permettent de déplacer, trier, redimensionner des éléments simplement avec la souris, au même titre qu'on peut le faire avec les fenêtres de son système d'exploitation. Ainsi draggable() permet en toute simplicité à un élément d'être déplacé à l'aide de la souris. droppable() permet de déclencher une fonction de callback au contact d'un élément draggable avec lui-même. Enfin resizable() permet à un élément d'être redimensionner. La méthode sortable() quand à elle interagi avec des listes HTML de type <ul> et <ol> pour les rendre triable. Au niveau des effets, jQuery UI fourni une méthode effect() disposant d'une quinzaine d'effets plus ou moins originaux à passer en paramètre. Cela permet notamment de faire exploser, clignoter ou bouger un élément. Documentation de références : http://docs.jquery.com/Effects / http://docs.jquery.com/UI a) Exemples Code HTML <button id="button1"><<</button> <button id="button2">Masquer</button> <button id="button3">>></button> <div></div> Code jQuery Résultat $("#button1").click(function(){ $("#exemples div").animate({"left": "-=50px"}, "slow"); }); $("#button2").toggle( function(){ $("#exemples > div").fadeOut("slow"); $(this).html("Afficher"); }, function(){ $("#exemples div").fadeIn("slow"); $(this).html("Masquer"); } ); - Le 1er et le dernier bouton déplacent le $("#button3").click(function(){ div à gauche et à droite $("#exemples div").animate({"left": "+=50px"}, "slow"); }); - Le bouton du milieu affiche ou masque $("#exemples div").draggable(); le div avec un effet de fondu - Enfin le div peut être déplacé n'importe où grâce à la souris. 8. Utiliser et créer un plugin jQuery jQuery référence sur son site internet des centaines de plugins poussant javascript au plus loin de ses capacités. Ils sont triés par catégories et dispose bien souvent de démonstration. Il s'avère assez intéressant de les parcourir pour ce rendre compte de toutes les capacités du framework et parfois donner des idées. Les plugins ajoutent des méthodes aux sélecteurs ou agissent directement sur le DOM. Selon leur complexité, ils peuvent disposer d'une documentation propre. Leur installation est souvent simple : un script js à charger dans le <head> et éventuellement une css et des images. jQuery est structuré de telle sorte que les plugins ne rentrent rarement en conflit, à moins qu'ils ajoutent une méthode du même nom. Il est important, avant d'utiliser un plugin, de s'assurer que ce dernier est bien maintenu par ses développeurs : jQuery est un projet très actif et il n'est pas rare de voir des vieux plugins être incompatibles avec les nouvelles versions du framework. La création d'un plugin jQuery est relativement simple. Il suffit de rajouter une méthode à l'objet jQuery.fn ou $.fn pour que cette dernière devienne disponible via n'importe quel sélecteur. Ainsi, par exemple, le plugin : $.fn.test = function(){ $(this).addClass("myClassBlue"); } B.P. 8/9
  • 9. I.U.T. 1 de Grenoble Département Réseaux & Télécommunication 2008 / 2009 Programmation Web ajoute une class myClassBlue à tous les éléments sélectionnés. Il s'utilise comme ceci : $("myElement").test(); Documentation de références : http://docs.jquery.com/Plugins/Authoring a) Exemples Code HTML Code jQuery <table> $.fn.damier = function(color){ <tr> if(!color) color = "blue"; <td>&nbsp;</td><td>&nbsp;</td> $(this).children("tr:even > td:odd, tr:odd > <td>&nbsp;</td><td>&nbsp;</td> td:even").css("background-color", color); </tr> } <tr> $("table").damier("lightGray"); <td>&nbsp;</td><td>&nbsp;</td> <td>&nbsp;</td><td>&nbsp;</td> Résultat </tr> <tr> <td>&nbsp;</td><td>&nbsp;</td> <td>&nbsp;</td><td>&nbsp;</td> </tr> <tr> <td>&nbsp;</td><td>&nbsp;</td> <td>&nbsp;</td><td>&nbsp;</td> </tr> </table> B.P. 9/9