PK 4HwEoa,mimetypeapplication/epub+zipPK4HwEiTunesMetadata.plistu artistName Oracle Corporation book-info cover-image-hash 920316917 cover-image-path OEBPS/dcommon/oracle-logo.jpg package-file-hash 448339431 publisher-unique-id E16272-05 unique-id 540169272 genre Oracle Documentation itemName Oracle® Fusion Middleware Java EE Developer's Guide for Oracle Application Development Framework, 11g Release 1 (11.1.1.7.0) releaseDate 2013-02-28T11:52:01Z year 2013 PKO6PK4HwEMETA-INF/container.xml PKYuPK4HwEOEBPS/data_lists_shuttles.htmeu Creating Databound Selection Lists

6 Creating Databound Selection Lists

This chapter describes how to add selection lists components to pages. It includes instructions for creating selection components with fixed-value lists or dynamically generated lists. It also describes how to add navigation list bindings to let users navigate through a list of objects in a collection.

This chapter includes the following sections:

6.1 Introduction to Selection Lists

Selection lists work the same way as do standard JSF list components. ADF Faces list components, however, provide extra functionality such as support for label and message display, automatic form submission, and partial page rendering.

When the user selects an item from a navigation list, a corresponding component bound to the list also changes its value in response to the selection. For example, when the user selects a product from a shopping list, the table that is bound to the products list updates to display the details of the selected product.

6.2 Creating a Single Selection List

ADF Faces Core includes components for selecting a single value and multiple values from a list. For example, selectOneChoice allows the user to select an item from a dropdown list, and selectManyChoice allow the user to select several items from a list of checkboxes. Selection list components are described in Table 6-1.

Table 6-1 ADF Faces Single and Multiple List Components

ADF Faces componentDescriptionExample

SelectOneChoice

Select a single value from a list of items.

SelectOneChoice.

SelectOneRadio

Select a single value from a set of radio buttons.

SelectOneRadio

SelectOneListbox

Select a single value from a scrollable list of items.

SelectOneListbox


SelectManyChoice

Select multiple values from a scrollable list of checkboxes. Each selection displays at the top of the list.

SelectManyChoice.

SelectManyCheckbox

Select multiple values from a group of checkboxes.

SelectManyCheckbox.


SelectManyListbox

Select multiple values from a scrollable list of checkboxes.

SelectManyListBox.


SelectBooleanRadio

Select a radio button in a group of radio buttons. The buttons can be placed anywhere on the page.

selectBooleanRadio

SelectBooleanCheckbox

Select a checkbox that toggles between selected and unselected states.

SelectBooleanCheckbox

You can create selection lists using the SelectOneChoice ADF Faces component. The steps are similar for creating other single-value selection lists, such as SelectOneRadio and SelectOneListbox.

A databound selection list displays values from an accessor returned collection or a static list and updates an attribute in another collection or a method parameter based on the user's selection. When adding a binding to a list, you use an attribute from the data control that will be populated by the selected value in the list.


Note:

Using an ADF Model list binding with the valuePassThru=true on a selectOneChoice component is not supported. The list binding will return indexes, not values.


To create a selection list, you choose a base data source and a list data source in the Edit List Binding dialog:

You can create two types of selection lists in the Edit List Binding dialog:

6.2.1 How to Create a Single Selection List Containing Fixed Values

You can create a selection list containing selections that you code yourself, rather than retrieving the values from another data source.

Figure 6-1 Selection List Bound to a Fixed List of Values

select list with static list

Before you begin:

Prepare a list of values that you will enter into the component as a fixed list.

To create a list bound to a fixed list of values:

  1. From the Data Controls panel, drag and drop the attribute onto the JSF page and choose Create > Single Selections > ADF Select One Choice.

    The Edit List Binding dialog displays. The accessor returned collection containing the attribute you dropped on the JSF page is selected by default in the Base Data Source list.

    To select a different accessor returned collection, click the Add icon next to the list.

  2. Select the Fixed List radio button.

    The Fixed List option lets end users choose a value from a static list that you define.

  3. In the Base Data Source Attribute list, choose an attribute.

    The Base Data Source Attribute list contains all of the attributes in the collection you selected in the Base Data Source list. For example, if you selected CountryCodes as the Base Data Source, you can choose CountryName in the list.

  4. In the Set of Values box, enter each value you want to appear in the list. Press the Enter key to set a value before typing the next value. For example, you could add the country codes India, Japan, and Russia.

    The order in which you enter the values is the order in which the list items are displayed in the SelectOneChoice control at runtime.

    The SelectOneChoice component supports a null value. If the user has not selected an item, the label of the item is shown as blank, and the value of the component defaults to an empty string. Instead of using blank or an empty string, you can specify a string to represent the null value. By default, the new string appears at the top of the list.

  5. Click OK.

6.2.2 How to Create a Single Selection List Containing Dynamically Generated Values

You can populate a selection list component with values dynamically at runtime.

Before you begin:

Define two data sources: one for the list data source that provides the dynamic list of values, and the other for the base data source that is to be updated based on the user's selection.

To create a selection list bound containing dynamically generated values:

  1. From the Data Controls panel, drag and drop the attribute onto the JSF page and choose Create > Single Selections > ADF Select One Choice.

    The Edit List Binding dialog displays. The accessor returned collection containing the attribute you dropped on the JSF page is selected by default in the Base Data Source list.

    To select a different accessor returned collection, click the Add icon next to the list.

  2. Select the Dynamic List radio button.

    The Dynamic List option lets you specify one or more base data source attributes that will be updated from another set of bound values.

  3. Click the Add button next to List Data Source.

  4. In the Add Data Source dialog, select the accessor returned collection that will populate the values in the selection list.


    Note:

    The list and base collections do not have to form a master-detail relationship, but the attribute in the list collection must have the same type as the base collection attributes.


  5. Accept the default iterator name and click OK.

    The Data Mapping section of the Edit List Binding dialog updates with a default data value and list attribute. The Data Value control contains the attribute on the accessor returned collection that is updated when the user selects an item in the selection list. The List Attribute Control contains the attribute that populates the values in the selection list.

  6. You can accept the default mapping or select different attributes items from the Data Value and List Attribute lists to update the mapping.

    To add a second mapping, click Add.

  7. Click OK.

6.2.3 What Happens When You Create a Fixed Selection List

When you add a fixed selection list, JDeveloper adds source code to the JSF page and list and iterator binding objects to the page definition file.

Example 6-1 shows the page source code after you add a fixed SelectOneChoice component to it.

Example 6-1 Fixed SelectOneChoice List in JSF Page Source Code

<af:selectOneChoice value="#{bindings.city.inputValue}"
                    label="#{bindings.city.label}">
     <f:selectItems value="#{bindings.city.items}"/>
</af:selectOneChoice>

The f:selectItems tag, which provides the list of items for selection, is bound to the items property on the CountryId list binding object in the binding container

In the page definition file, JDeveloper adds the definitions for the iterator binding objects into the executables element, and the list binding object into the bindings element, as shown in Example 6-2.

Example 6-2 List Binding Object for the Fixed Selection List in the Page Definition File

  <executables>
    <variableIterator id="variables"/>
    <iterator Binds="root" RangeSize="25" DataControl="SupplierFacadeLocal"
              id="SupplierFacadeLocalIterator"/>
    <accessorIterator MasterBinding="SupplierFacadeLocalIterator"
                      Binds="addressesFindAll" RangeSize="25"
                      DataControl="SupplierFacadeLocal"
                      BeanClass="oracle.fodemo.supplier.model.Addresses"
                      id="addressesFindAllIterator"/>
  </executables>
  <bindings>
    <list IterBinding="addressesFindAllIterator" id="city" DTSupportsMRU="true"
          StaticList="true">
      <AttrNames>
        <Item Value="city"/>
      </AttrNames>
      <ValueList>
        <Item Value="redwood city"/>
        <Item Value="fremont"/>
        <Item Value="stockton"/>
      </ValueList>
    </list>
  </bindings>

6.2.4 What Happens When You Create a Dynamic Selection List

When you add a dynamic selection list to a page, JDeveloper adds source code to the JSF page, and list and iterator binding objects to the page definition file.

Example 6-3 shows the page source code after you add a dynamic SelectOneChoice component to it.

Example 6-3 Dynamic SelectOneChoice List in JSF Page Source Code

<af:selectOneChoice value="#{bindings.orderId.inputValue}"
                    label="#{bindings.orderId.label}"
                    required="#{bindings.orderId.hints.mandatory}"
                    shortDesc="#{bindings.orderId.hints.tooltip}"
                    id="soc1">
     <f:selectItems value="#{bindings.orderId.items}" id="si1"/>
</af:selectOneChoice>

The f:selectItems tag, which provides the list of items for selection, is bound to the items property on the orderId list binding object in the binding container.

In the page definition file, JDeveloper adds the definitions for the iterator binding objects into the executables element, and the list binding object into the bindings element, as shown in Figure 6-1.

Example 6-4 List Binding Object for the Dynamic Selection List in the Page Definition File

  <executables>
    <variableIterator id="variables"/>
    <iterator Binds="root" RangeSize="25" DataControl="FODFacadeLocal"
              id="FODFacadeLocalIterator"/>
    <accessorIterator MasterBinding="FODFacadeLocalIterator"
                      Binds="orders1FindAll" RangeSize="25"
                      DataControl="FODFacadeLocal"
                      BeanClass="oracle.model.Orders1"
                      id="orders1FindAllIterator"/>
    <iterator Binds="root" RangeSize="25" DataControl="FODFacadeLocal"
              id="FODFacadeLocalIterator1"/>
    <accessorIterator MasterBinding="FODFacadeLocalIterator1"
                      Binds="ordersFindAll" RangeSize="-1"
                      DataControl="FODFacadeLocal"
                      BeanClass="oracle.model.Orders"
                      id="ordersFindAllIterator"/>
  </executables>
  <bindings>
    <list IterBinding="orders1FindAllIterator" id="orderId"
          DTSupportsMRU="true" StaticList="false"
          ListIter="ordersFindAllIterator">
      <AttrNames>
        <Item Value="orderId"/>
      </AttrNames>
      <ListAttrNames>
        <Item Value="orderId"/>
      </ListAttrNames>
      <ListDisplayAttrNames>
        <Item Value="orderId"/>
      </ListDisplayAttrNames>
    </list>
  </bindings>

By default, JDeveloper sets the RangeSize attribute on the iterator element for the ordersFindAll iterator binding to a value of -1 thus allowing the iterator to furnish the full list of valid products for selection. In the list element, the id attribute specifies the name of the list binding object. The IterBinding attribute references the iterator that iterates over the order1FindAll collection. The ListIter attribute references the iterator that iterates over the ordersFindAll collection. The AttrNames element specifies the base data source attributes returned by the base iterator. The ListAttrNames element defines the list data source attributes that are mapped to the base data source attributes. The ListDisplayAttrNames element specifies the list data source attribute that populates the values users see in the list at runtime.

6.3 Creating a List with Navigation List Binding

Navigation list binding lets users navigate through the objects in a collection. As the user changes the current object selection using the navigation list component, any other component that is also bound to the same collection through its attributes will display from the newly selected object.

In addition, if the collection whose current row you change is the master collection in a data model master-detail relationship, the row set in the detail collection is automatically updated to show the appropriate data for the new current master row.

Before you begin:

Create an accessor returned collection in the Data Controls panel.

To create a list that uses navigation list binding:

  1. From the Data Controls panel, drag and drop an accessor returned collection to the page and choose Create > Navigation > ADF Navigation Lists.

  2. In the Edit List Binding dialog, from the Base Data Source dropdown list, select the collection whose members will be used to create the list.

    This should be the collection you dragged from the Data Controls panel. If the collection does not appear in the dropdown menu, click the Add button to select the collection you want.

  3. From the Display Attribute dropdown list, select a single attribute, all the attributes, or choose Select Multiple to launch a selection dialog.

    In the Select Multiple Display Attributes dialog, shuttle the attributes you want to display from the Available Attributes pane to the Attributes to Display pane. Click OK to close the dialog.

  4. Click OK.

PK;=eePK4HwEOEBPS/dcommon/oracle.gifJGIF87aiyDT2F'G;Q_oKTC[ 3-Bq{ttsoGc4I)GvmLZ).1)!ꑈ53=Z]'yuLG*)g^!8C?-6(29K"Ĩ0Яl;U+K9^u2,@@ (\Ȱ Ë $P`lj 8x I$4H *(@͉0dа8tA  DсSP v"TUH PhP"Y1bxDǕ̧_=$I /& .)+ 60D)bB~=0#'& *D+l1MG CL1&+D`.1qVG ( "D2QL,p.;u. |r$p+5qBNl<TzB"\9e0u )@D,¹ 2@C~KU 'L6a9 /;<`P!D#Tal6XTYhn[p]݅ 7}B a&AƮe{EɲƮiEp#G}D#xTIzGFǂEc^q}) Y# (tۮNeGL*@/%UB:&k0{ &SdDnBQ^("@q #` @1B4i@ aNȅ@[\B >e007V[N(vpyFe Gb/&|aHZj@""~ӎ)t ? $ EQ.սJ$C,l]A `8A o B C?8cyA @Nz|`:`~7-G|yQ AqA6OzPbZ`>~#8=./edGA2nrBYR@ W h'j4p'!k 00 MT RNF6̙ m` (7%ꑀ;PKl-OJPK4HwEOEBPS/dcommon/oracle-logo.jpgoJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222'7" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE!KEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEzE7V%ȣOΏ9??:a"\fSrğjAsKJ:nOzO=}E1-I)3(QEQEQEQEQEQEQE֝Hza<["2"pO#f8M[RL(,?g93QSZ uy"lx4h`O!LŏʨXZvq& c՚]+: ǵ@+J]tQ]~[[eϸ (]6A&>ܫ~+כzmZ^(<57KsHf妬Ϧmnẁ&F!:-`b\/(tF*Bֳ ~V{WxxfCnMvF=;5_,6%S>}cQQjsOO5=)Ot [W9 /{^tyNg#ЄGsֿ1-4ooTZ?K Gc+oyڙoNuh^iSo5{\ܹ3Yos}$.nQ-~n,-zr~-|K4R"8a{]^;I<ȤL5"EԤP7_j>OoK;*U.at*K[fym3ii^#wcC'IIkIp$󿉵|CtĈpW¹l{9>⪦׺*ͯj.LfGߍԁw] |WW18>w.ӯ! VӃ :#1~ +މ=;5c__b@W@ +^]ևՃ7 n&g2I8Lw7uҭ$"&"b eZ":8)D'%{}5{; w]iu;_dLʳ4R-,2H6>½HLKܹR ~foZKZ࿷1[oZ7׫Z7R¢?«'y?A}C_iG5s_~^ J5?œ tp]X/c'r%eܺA|4ծ-Ե+ْe1M38Ǯ `|Kյ OVڅu;"d56, X5kYR<̭CiطXԮ];Oy)OcWj֩}=܅s۸QZ*<~%뺃ȶp f~Bðzb\ݳzW*y{=[ C/Ak oXCkt_s}{'y?AmCjޓ{ WRV7r. g~Q"7&͹+c<=,dJ1V߁=T)TR՜*N4 ^Bڥ%B+=@fE5ka}ędܤFH^i1k\Sgdk> ֤aOM\_\T)8靠㡮3ģR: jj,pk/K!t,=ϯZ6(((((((49 xn_kLk&f9sK`zx{{y8H 8b4>ÇНE|7v(z/]k7IxM}8!ycZRQ pKVr(RPEr?^}'ðh{x+ՀLW154cK@Ng C)rr9+c:׹b Жf*s^ fKS7^} *{zq_@8# pF~ [VPe(nw0MW=3#kȵz晨cy PpG#W:%drMh]3HH<\]ԁ|_W HHҡb}P>k {ZErxMX@8C&qskLۙOnO^sCk7ql2XCw5VG.S~H8=(s1~cV5z %v|U2QF=NoW]ո?<`~׮}=ӬfԵ,=;"~Iy7K#g{ñJ?5$y` zz@-~m7mG宝Gٱ>G&K#]؃y1$$t>wqjstX.b̐{Wej)Dxfc:8)=$y|L`xV8ߙ~E)HkwW$J0uʟk>6Sgp~;4֌W+חc"=|ř9bc5> *rg {~cj1rnI#G|8v4wĿhFb><^ pJLm[Dl1;Vx5IZ:1*p)إ1ZbAK(1ׅ|S&5{^ KG^5r>;X׻K^? s fk^8O/"J)3K]N)iL?5!ƾq:G_=X- i,vi2N3 |03Qas ! 7}kZU781M,->e;@Qz T(GK(ah(((((((Y[×j2F}o־oYYq $+]%$ v^rϭ`nax,ZEuWSܽ,g%~"MrsrY~Ҿ"Fت;8{ѰxYEfP^;WPwqbB:c?zp<7;SBfZ)dϛ; 7s^>}⍱x?Bix^#hf,*P9S{w[]GF?1Z_nG~]kk)9Sc5Ո<<6J-ϛ}xUi>ux#ţc'{ᛲq?Oo?x&mѱ'#^t)ϲbb0 F«kIVmVsv@}kҡ!ˍUTtxO̧]ORb|2yԵk܊{sPIc_?ħ:Ig)=Z~' "\M2VSSMyLsl⺿U~"C7\hz_ Rs$~? TAi<lO*>U}+'f>7_K N s8g1^CeКÿE ;{+Y\ O5|Y{/o+ LVcO;7Zx-Ek&dpzbӱ+TaB0gNy׭ 3^c T\$⫫?F33?t._Q~Nln:U/Ceb1-im WʸQM+VpafR3d׫é|Aү-q*I P7:y&]hX^Fbtpܩ?|Wu󭏤ʫxJ3ߴm"(uqA}j.+?S wV ~ [B&<^U?rϜ_OH\'.;|.%pw/ZZG'1j(#0UT` Wzw}>_*9m>󑓀F?EL3"zpubzΕ$+0܉&3zڶ+jyr1QE ( ( ( ( ( ( ( (UIdC0EZm+]Y6^![ ԯsmܶ捆?+me+ZE29)B[;я*wGxsK7;5w)}gH~.Ɣx?X\ߚ}A@tQ(:ͧ|Iq(CT?v[sKG+*רqҍck <#Ljα5݈`8cXP6T5i.K!xX*p&ќZǓϘ7 *oƽ:wlຈ:Q5yIEA/2*2jAҐe}k%K$N9R2?7ýKMV!{W9\PA+c4w` Wx=Ze\X{}yXI Ү!aOÎ{]Qx)#D@9E:*NJ}b|Z>_k7:d$z >&Vv󃏽WlR:RqJfGإd9Tm(ҝEtO}1O[xxEYt8,3v bFF )ǙrPNE8=O#V*Cc𹾾&l&cmCh<.P{ʦ&ۣY+Gxs~k5$> ӥPquŽўZt~Tl>Q.g> %k#ú:Kn'&{[yWQGqF}AЅ׮/}<;VYZa$wQg!$;_ $NKS}“_{MY|w7G!"\JtRy+贾d|o/;5jz_6fHwk<ѰJ#]kAȎ J =YNu%dxRwwbEQEQEQEQEQEQEQEQEQE'fLQZ(1F)hQ@X1KEQE-Q@ 1KE3h=iPb(((1GjZ(-ʹRPbR@ 1KE7`bڒyS0(-&)P+ ڎԴP11F)h&:LRmQ@Q@Š(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((_ğ<+F; sU%ԑ >,BH(uSU xþ1Wϲs${wgoQn_swB/'L\ܓFgԏZ ^dj^L^NmH Ҁ6(?nƓjh%ةlΣ /F6}pj2E3HgHЌ(UQR8oX,G8OB]>o9@$xWy'ڹOM=ҼWb"٠9-*r⬻zWokeh͝(F@n~X=q+⟇1b>ƑeIX.~C,o5የ-m;D Nʬ` `+CcE??Ki!R!cxw[ jvc}&Eٱ7T)8&þ/?os$wSn^bo:-4^js4JKm!#rv89>' O59t , \8r,Vk|IgxEv((RmĜ+bkz6,u/}-|.'<VÚ~tk,^cH61¢ !;M;Ėz[#CuAƶ+j_&*/;Q8d ǹHyAsM↷7l-6rò,%Fs;A*',}'f[]tݷs~UWhk?:4JE]WpcY=" ƚw/|_xSw(kycH#r28,X7D5Kh76 mɍ~0H;6194WpGӧգ%8Z&GdPƧo6kcO5Kv`{}fyq \`@?Kv=26OޝyAe Qɼ芍H8͟2敮j#;iѻm؏6+wTx;KYY\-%'Aӣ?|=\-ٴk+٬$ɷi:w"^+| 7ͅ3ۆqph4MoN}}\7mbAOӣ/>k$)ːH@OE?hX]}N<|I/p$pkfpJg ⟂uE,4~|IT3Fr}+{M>>[G4fEfޛ 1ī'~\Cޭx4썥 ",;McA+;5߉^*#·]P 3hK d1&3⭶yqH]DR!Ld9ߞxR>vWnt{;Fʈԧ1*#skޫ;R/eepJNd;=NYG×zskkz@:[~+\-[hזWeq%M1I(U'Qr#RQ^w^(ߍ|-5d]3TFH׀Cg Ҵ;Xv8<zM ~}o IfUǕ7p9Efl+75ON!II }*eS᳐{ƾoٶi\';p &@$PQ@Q@Q@Q@Q@Q@Q@Q@Q@& ,^~]vw8ǽvQ@W;3K>}il -jk&- !;; o7<# 4k+m ZY~էvFJF(F獡\WQ@W ]#]\EG&6~Vddd*~?ơ [Is 7Gnn!9z܌ fj:G<3#U>OAĒ)Ki5Uw(@3wCgqysg ]ZD) /ܣgX;yxLgO-O=E=WTp(*0u: tMGß4'V=w}v AaEx5/ew IDĜ9* Ѧ7~|:egO(jddYRr?h tPU=KQfaK u POm֫:G<3#U>OAĒ)Ki5Uw(@3waY7MRƺgf m ;TP28ϩyzg<]xm}IZ)"ڣAU'[|EQ4?%ٚ5ȓ>@_$zWO<6\K0DF dOjlvZ,k#Lgg@8bÐsڀ9GL{:=B+K@n@=x=/|1wwM+Kӵ{svL )*$\ b>#V|c}˗N}T;O y$rNP9 j">?/gϝm] !c»g|m[ǻtwcv:X>w* O2Frjgzέe>2 ? |8\'YmMѺu{r~g8$zWqEyď˥m<2Iu)1rѣ XDv$U5XxkI;WҞ9ZhT~vbrNH<(υ>Cζ6omv4MGX5u}/P,gUI$,G˵x=75×36fMBP]Y#G?.SIpԼ[xCҳ\x.N&irx#Q@Wxg\~zU7ҬeaVHdq r?h lx@UcO ,wLؾp9'BQ@w('|S8h4-3KdHdI_u4gƗzirx#dnx v] R2Np@+@ݟ?>$KM0;d /cQG=dd8;jx豴X4{  #V!n8(l$[MFf[cv`ITᗍ\φ<9wWh#V؉>Dc$'X?xPEPEPEPEPEPEPEPEPEP7yb[ۻ]ECm)f2Z+p 9nSurvÚgW2e2G,u Aæ b[|@7tu9S$BB?ǒ'#V{x/{a 6=g7YYcP LaF=uxvѴn7ύcFer@=1 i+}]f2Ik$QJL%Jp )``n u.GcIdD)*,aשtwqow;R𕳸:REQnb'<IR6_]FY3:p OiV ^h%M (I.4::]F{H 0XO>'#Iyx𪼼gȒ@KoZxz.rF/~S2$n5::xbM")uhftIlH78=8/g&㿈wRaEI$b-@ g^=x^6/ M@ﰆxo`i1(,SA xz ح4K {L&6 2{f<'[W~&3j_ExeXYz vsǎ]̹3h' *E-8% 41'%_rE!qw*89^Yuyg&Z{.D$.%VP'8<sxZ5mV}Z5yqL 2hr~f Wq)?ǕKY]$#̉X4lAFH[j }[JI|Ic#< %7V񥝍ޑծͶ;*ZrK`m_AsV-./Mww}< $3,8.A*v%8 !пJ$,S[I}Y#Lqē`A]{<92&2~1+ɒ<\5w/|;^5{cHCq#WzO__nѵ_FWS͕N[DZN4.,lۻBDK9<,F@K1 @ g oW &I#TQnĒOj;_α:?+ V#dO@3F896_]FY3:p O#JC}73ukdrb;H  6~!{kwʙ UlFx  x.wrH.B apshwgM igMȆW!w/*WukP W  +d?z}:|W$c]GGrYAvb P|Hohz퐞Ҩ/)gP¦&N8'ß6O$2x~S)lv`|,($|sc+~8X{2 (L;?sڹ#dg@: x?Ohh Ine@b0pq*jzh.-CJ qyPyJCp<; W֗7XIu.ڔY \jFI_qwc;gZi;"ż@ҖSڡ\z`d񝏌xx#LOme8*qpp3 NK://uޕCEy_,}˱[_2"np $k@tta+, z>d`xX s^IȾ7Ğ 5+Au'Hl컐Ts0}M{Ty ';lp= #7[E}b]1&ޟ6J_6<9M^t3Mi¶HA NWFT65;z?m&3˗c&"9r*;i~O5A$zCDEX"+Ƞd#=_hQCk.M#{wM vU#;Kszo/k\~^C?7Ѣ+#||sRxBo|K񭕤~-06eZ̈@r9-ς_Ht/x҉(cZkHm.yUP28jWCI^@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@$VN? h~&ŵ]_W;1#nԏxVtP[Qk=pO,H9 Ee#<-_Gih&1TǩO@jqyC໒<  e8 v1: +?Gzۏ:8x$ "2:0 ==OVϓOArQbIø hQ\\?>t-;&WHYBc1g h}l WrQ\߉|}\Ao:1AHE$ qt5 A}Hkr%FW@WŤĶ2T1qA^\{kf;8..9$o  08@W'|M^\i~ {G}ۑ6˕Fr Rh|#돢z7lbs  QEa^ԣIܤ@;9' 2q*OxB]8/c_7!.vd #آy0x ;k;E#pw R '_|-Ic4N\q`r xþ1Wϲs${wgoQnK[|9VմArWۺdSEvWa6^|E]ro~j &r3[ώ<5E5}^ +7& 7D )e8Q\Ŀx~]֣OwKY 2n!wqG·axyJ;āJ22228>7+n%da3ێ{U{~ >/5#ːȲw|w#xssR_M^7^  vSgP\ H u/w@ZΡMCd 7 d{敪]\sgp:0`AAksNO òout+&8ȠҊӿ!GL#c߳vmc9+C{iڇhɑvlp p ˲[WeĶגH k \ scQtZ{BC$EzN9YEsώ<5E5}^ +7& 7D )e8x-o=Ny4GKxB\X;Xd{+5qD3` oG_ PEWguw)~fnqs .&r f[$Qg Tn+ĐN]X]I(I.iT$zqEa^ԣIܤ@;9' 2q*=FZ ͐;b$ #(p<(o|I-|Ao;yRSDw#d vg{%ijxfqo(H$vBFy9q|?>t-;&WHYBc1(g h}l Wr_x_[뺴v΅F6qI9g tV^MWћX-' pC`J}kTl5Dns='rEvV|ax> J;4D 32p 'h#uMR#h2M"4}бX& ~Ig;Wt:7C=#IOۻC@!Tā O9K?"K[+%rVv"eÞX1=ܾ?BK9HȂY!At9ֺI<9Iޛ}!,?g>6ێ~6' ]|aoE$_ڣGvd !hc<;7SÓo60Bn'vIsһWDӵhae2gkpFq兝!j}%ozs-r: >* \xᢌΞ(DܪŋzJ#]iؿm{o3#8{Qv/;7q&Ln2x94H?>P>ͳw:b7d2xºŮA{$sggM63d+81s1-  Huw҈ǂ|;`icV;Inv8ZމxGIխc>2-웶aʐG  s'?55K|WFԼ_*W]8GqcowFZM<{њgh9zEgbio&d߷nvs[YxOCԬt[mNhy 0D1Ɍ; ; ;?Li|Kw nWs`t8]ƕi']{qo'`{Qhv'r^||nnIp8sA5LRB",vWd"HC:mxK!uݡ ]s @'׬iZ&}:uܗ;6qr^Iu7 IK$(0=z7⫵Ojwɦ]O0Ll-Зj-d&ψR:oq!YR~P̊~@W5{cilf*T QJ'ú߇ GO/y.͈Q~`4O.Ϊ+Yep``WA ky9'/vc˝תO7VEJ$E `+>x?z>VIJn q  ;{2i%ls;FO~Waϯ+/z3J^hւj-lDHY~`W%C2G#M;b߽qz.M:Xӵk}oIw18@_i1ǫu_}dJpo;˛8no!Ix G#=k?mxTsJ&1PBo_GjTuWPծ(VG"gz^7 rqco6Q<3&7#dr2 \?)//@?Y3w%t|;z@t;L"؅ IX< j6zuk*M sԂp@@Gw4'KoOS;sU//hcFvM7cuj|IEť< jmΗ$:6VA,gRxba⫿'ޖ,,4ׄı3ϓ9#8 _?+[\Xx\tK3zEhY&xsGImc.-w1cO$My^~߳]v2iۭݍ.%;J[tozF÷v(׆ 'H[.QK ck$?/NO0Yڧ 1m^YӑO}gȠQKxz Q̉v}<ˆݷovxxRI{{E FD,Nc6p%_qƻu<R9m'8%32qֆ#Z-vRX,z xtIu<RA\5G~(-ɸ٣igKءh3JH nr _Ht/x҉(!J/5ifWsa Ppr@NwQ #\U7''k2Wv?=zySˏrxwv:UriGS+Fy$B,r9;Y Q@ _?9xcK}eHmvȿ;*ÿ^xn]y!]$Q޺_Ht/x҉(+GUyŤ3Ms2NTRl#EzEy?k+ğgGWۼѿOvvc5EyY_;Ǟު|"; csYC8 9k+<>)|[Z@Xߕݕ'JII11Fb6ûldLI[N:McB-7p1!f1TcБUs1DZM.GΠ 8C@\#pȊFި}+y#zĭcڡ5M:M(KyrDwv¼ſWOIֽ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9?,`kiaz"Ud (!{0oV~~#~ ;g1]ݟ&_y??Ehl /ǩ>/m 2`$XJٛwH,q#krcoj--PyYRĞ09Gnlt"!X GW0}bS=/WW_iڝD:78B)+dlxS_"縺u{vdI9w2qrzOAEqN|J Oracle Legal Notices

Oracle Legal Notices

Copyright Notice

Copyright © 1994-2014, Oracle and/or its affiliates. All rights reserved.

Trademark Notice

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.

Intel and Intel Xeon are trademarks or registered trademarks of Intel Corporation. All SPARC trademarks are used under license and are trademarks or registered trademarks of SPARC International, Inc. AMD, Opteron, the AMD logo, and the AMD Opteron logo are trademarks or registered trademarks of Advanced Micro Devices. UNIX is a registered trademark of The Open Group.

License Restrictions Warranty/Consequential Damages Disclaimer

This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited.

Warranty Disclaimer

The information contained herein is subject to change without notice and is not warranted to be error-free. If you find any errors, please report them to us in writing.

Restricted Rights Notice

If this is software or related documentation that is delivered to the U.S. Government or anyone licensing it on behalf of the U.S. Government, the following notice is applicable:

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs. No other rights are granted to the U.S. Government.

Hazardous Applications Notice

This software or hardware is developed for general use in a variety of information management applications. It is not developed or intended for use in any inherently dangerous applications, including applications that may create a risk of personal injury. If you use this software or hardware in dangerous applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and other measures to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability for any damages caused by use of this software or hardware in dangerous applications.

Third-Party Content, Products, and Services Disclaimer

This software or hardware and documentation may provide access to or information on content, products, and services from third parties. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to third-party content, products, and services. Oracle Corporation and its affiliates will not be responsible for any loss, costs, or damages incurred due to your access to or use of third-party content, products, or services.

Alpha and Beta Draft Documentation Notice

If this document is in preproduction status:

This documentation is in preproduction status and is intended for demonstration and preliminary use only. It may not be specific to the hardware on which you are using the software. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to this documentation and will not be responsible for any loss, costs, or damages incurred due to the use of this documentation.

Oracle Logo

PK0hPK4HwEOEBPS/dcommon/blafdoc.cssc@charset "utf-8"; /* Copyright 2002, 2011, Oracle and/or its affiliates. All rights reserved. Author: Robert Crews Version: 2011.8.12 */ body { font-family: Tahoma, sans-serif; /* line-height: 125%; */ color: black; background-color: white; font-size: small; } * html body { /* http://www.info.com.ph/~etan/w3pantheon/style/modifiedsbmh.html */ font-size: x-small; /* for IE5.x/win */ f\ont-size: small; /* for other IE versions */ } h1 { font-size: 165%; font-weight: bold; border-bottom: 1px solid #ddd; width: 100%; text-align: left; } h2 { font-size: 152%; font-weight: bold; text-align: left; } h3 { font-size: 139%; font-weight: bold; text-align: left; } h4 { font-size: 126%; font-weight: bold; text-align: left; } h5 { font-size: 113%; font-weight: bold; display: inline; text-align: left; } h6 { font-size: 100%; font-weight: bold; font-style: italic; display: inline; text-align: left; } a:link { color: #039; background: inherit; } a:visited { color: #72007C; background: inherit; } a:hover { text-decoration: underline; } a img, img[usemap] { border-style: none; } code, pre, samp, tt { font-family: monospace; font-size: 110%; } caption { text-align: center; font-weight: bold; width: auto; } dt { font-weight: bold; } table { font-size: small; /* for ICEBrowser */ } td { vertical-align: top; } th { font-weight: bold; text-align: left; vertical-align: bottom; } li { text-align: left; } dd { text-align: left; } ol ol { list-style-type: lower-alpha; } ol ol ol { list-style-type: lower-roman; } td p:first-child, td pre:first-child { margin-top: 0px; margin-bottom: 0px; } table.table-border { border-collapse: collapse; border-top: 1px solid #ccc; border-left: 1px solid #ccc; } table.table-border th { padding: 0.5ex 0.25em; color: black; background-color: #f7f7ea; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; } table.table-border td { padding: 0.5ex 0.25em; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; } span.gui-object, span.gui-object-action { font-weight: bold; } span.gui-object-title { } p.horizontal-rule { width: 100%; border: solid #cc9; border-width: 0px 0px 1px 0px; margin-bottom: 4ex; } div.zz-skip-header { display: none; } td.zz-nav-header-cell { text-align: left; font-size: 95%; width: 99%; color: black; background: inherit; font-weight: normal; vertical-align: top; margin-top: 0ex; padding-top: 0ex; } a.zz-nav-header-link { font-size: 95%; } td.zz-nav-button-cell { white-space: nowrap; text-align: center; width: 1%; vertical-align: top; padding-left: 4px; padding-right: 4px; margin-top: 0ex; padding-top: 0ex; } a.zz-nav-button-link { font-size: 90%; } div.zz-nav-footer-menu { width: 100%; text-align: center; margin-top: 2ex; margin-bottom: 4ex; } p.zz-legal-notice, a.zz-legal-notice-link { font-size: 85%; /* display: none; */ /* Uncomment to hide legal notice */ } /*************************************/ /* Begin DARB Formats */ /*************************************/ .bold, .codeinlinebold, .syntaxinlinebold, .term, .glossterm, .seghead, .glossaryterm, .keyword, .msg, .msgexplankw, .msgactionkw, .notep1, .xreftitlebold { font-weight: bold; } .italic, .codeinlineitalic, .syntaxinlineitalic, .variable, .xreftitleitalic { font-style: italic; } .bolditalic, .codeinlineboldital, .syntaxinlineboldital, .titleinfigure, .titleinexample, .titleintable, .titleinequation, .xreftitleboldital { font-weight: bold; font-style: italic; } .itemizedlisttitle, .orderedlisttitle, .segmentedlisttitle, .variablelisttitle { font-weight: bold; } .bridgehead, .titleinrefsubsect3 { font-weight: bold; } .titleinrefsubsect { font-size: 126%; font-weight: bold; } .titleinrefsubsect2 { font-size: 113%; font-weight: bold; } .subhead1 { display: block; font-size: 139%; font-weight: bold; } .subhead2 { display: block; font-weight: bold; } .subhead3 { font-weight: bold; } .underline { text-decoration: underline; } .superscript { vertical-align: super; } .subscript { vertical-align: sub; } .listofeft { border: none; } .betadraft, .alphabetanotice, .revenuerecognitionnotice { color: #f00; background: inherit; } .betadraftsubtitle { text-align: center; font-weight: bold; color: #f00; background: inherit; } .comment { color: #080; background: inherit; font-weight: bold; } .copyrightlogo { text-align: center; font-size: 85%; } .tocsubheader { list-style-type: none; } table.icons td { padding-left: 6px; padding-right: 6px; } .l1ix dd, dd dl.l2ix, dd dl.l3ix { margin-top: 0ex; margin-bottom: 0ex; } div.infoboxnote, div.infoboxnotewarn, div.infoboxnotealso { margin-top: 4ex; margin-right: 10%; margin-left: 10%; margin-bottom: 4ex; padding: 0.25em; border-top: 1pt solid gray; border-bottom: 1pt solid gray; } p.notep1 { margin-top: 0px; margin-bottom: 0px; } .tahiti-highlight-example { background: #ff9; text-decoration: inherit; } .tahiti-highlight-search { background: #9cf; text-decoration: inherit; } .tahiti-sidebar-heading { font-size: 110%; margin-bottom: 0px; padding-bottom: 0px; } /*************************************/ /* End DARB Formats */ /*************************************/ @media all { /* * * { line-height: 120%; } */ dd { margin-bottom: 2ex; } dl:first-child { margin-top: 2ex; } } @media print { body { font-size: 11pt; padding: 0px !important; } a:link, a:visited { color: black; background: inherit; } code, pre, samp, tt { font-size: 10pt; } #nav, #search_this_book, #comment_form, #comment_announcement, #flipNav, .noprint { display: none !important; } body#left-nav-present { overflow: visible !important; } } PKr.hcPK4HwEOEBPS/dcommon/doccd_epub.jsM /* Copyright 2006, 2012, Oracle and/or its affiliates. All rights reserved. Author: Robert Crews Version: 2012.3.17 */ function addLoadEvent(func) { var oldOnload = window.onload; if (typeof(window.onload) != "function") window.onload = func; else window.onload = function() { oldOnload(); func(); } } function compactLists() { var lists = []; var ul = document.getElementsByTagName("ul"); for (var i = 0; i < ul.length; i++) lists.push(ul[i]); var ol = document.getElementsByTagName("ol"); for (var i = 0; i < ol.length; i++) lists.push(ol[i]); for (var i = 0; i < lists.length; i++) { var collapsible = true, c = []; var li = lists[i].getElementsByTagName("li"); for (var j = 0; j < li.length; j++) { var p = li[j].getElementsByTagName("p"); if (p.length > 1) collapsible = false; for (var k = 0; k < p.length; k++) { if ( getTextContent(p[k]).split(" ").length > 12 ) collapsible = false; c.push(p[k]); } } if (collapsible) { for (var j = 0; j < c.length; j++) { c[j].style.margin = "0"; } } } function getTextContent(e) { if (e.textContent) return e.textContent; if (e.innerText) return e.innerText; } } addLoadEvent(compactLists); function processIndex() { try { if (!/\/index.htm(?:|#.*)$/.test(window.location.href)) return false; } catch(e) {} var shortcut = []; lastPrefix = ""; var dd = document.getElementsByTagName("dd"); for (var i = 0; i < dd.length; i++) { if (dd[i].className != 'l1ix') continue; var prefix = getTextContent(dd[i]).substring(0, 2).toUpperCase(); if (!prefix.match(/^([A-Z0-9]{2})/)) continue; if (prefix == lastPrefix) continue; dd[i].id = prefix; var s = document.createElement("a"); s.href = "#" + prefix; s.appendChild(document.createTextNode(prefix)); shortcut.push(s); lastPrefix = prefix; } var h2 = document.getElementsByTagName("h2"); for (var i = 0; i < h2.length; i++) { var nav = document.createElement("div"); nav.style.position = "relative"; nav.style.top = "-1.5ex"; nav.style.left = "1.5em"; nav.style.width = "90%"; while (shortcut[0] && shortcut[0].toString().charAt(shortcut[0].toString().length - 2) == getTextContent(h2[i])) { nav.appendChild(shortcut.shift()); nav.appendChild(document.createTextNode("\u00A0 ")); } h2[i].parentNode.insertBefore(nav, h2[i].nextSibling); } function getTextContent(e) { if (e.textContent) return e.textContent; if (e.innerText) return e.innerText; } } addLoadEvent(processIndex); PKo"nR M PK4HwE OEBPS/toc.ncx@ Oracle® Fusion Middleware Java EE Developer's Guide for Oracle Application Development Framework, 11g Release 1 (11.1.1.7.0) Cover Title and Copyright Information Contents Preface What's New in This Guide for Release 11.1.1.7.0 1 Introduction to Building Java EE Web Applications with Oracle ADF 2 Using ADF Model Data Binding in a Java EE Web Application 3 Creating a Basic Databound Page 4 Creating ADF Databound Tables 5 Displaying Master-Detail Data 6 Creating Databound Selection Lists 7 Creating Databound Search Forms 8 Deploying an ADF Java EE Application Index Copyright PK~qE @ PK4HwEOEBPS/content.opf.J Oracle® Fusion Middleware Java EE Developer's Guide for Oracle Application Development Framework, 11g Release 1 (11.1.1.7.0) en-US E16272-05 Oracle Corporation Oracle Corporation Oracle® Fusion Middleware Java EE Developer's Guide for Oracle Application Development Framework, 11g Release 1 (11.1.1.7.0) 2013-02-28T11:52:01Z Describes how to create web-based applications using Java EE, ADF Model, ADF Controller, and ADF Faces Rich Client components. PKae]..PK4HwEOEBPS/master_detail_data.htm Displaying Master-Detail Data

5 Displaying Master-Detail Data

This chapter describes how to use the Data Controls panel to create master-detail objects that are based on ADF Faces components. It shows how to display master-detail data by using prebuilt master-detail widgets, tables, trees and tree tables and how to work with selection events.

This chapter includes the following sections:

For information about using a selection list to populate a collection with a key value from a related master or detail collection, see Chapter 6, "Creating Databound Selection Lists."

5.1 Introduction to Displaying Master-Detail Data

When objects have a master-detail relationship, you can declaratively create pages that display the data from both objects simultaneously. For example, the page shown in Figure 5-1 displays an order in a form at the top of the page and its related order items in a table at the bottom of the page. This is possible because the objects have a master-detail relationship. In this example, the Order is the master object and OrderItem is the detail object. ADF iterators automatically manage the synchronization of the detail data objects displayed for a selected master data object. Iterator bindings simplify building user interfaces that allow scrolling and paging through collections of data and drilling-down from summary to detail information.

Figure 5-1 Detail Table

master form and detail table

You display master and detail objects in forms and tables. The master-detail form can display these objects on separate pages. For example, you can display the master object in a table on one page and detail objects in a read-only form on another page.


Note:

There are some cases when the master-detail UI components that JDeveloper provides cannot provide the functionality you require. For example, you may need to bind components programatically instead of using the master-detail UI components.

A master object can have many detail objects, and each detail object can in turn have its own detail objects, down to many levels of depth. If one of the detail objects in this hierarchy is dropped from the Application Navigator as a master-detail form on a page, only its immediate parent master object displays on the page. The hierarchy will not display all the way up to the topmost parent object.

If you display the detail object as a tree or tree table object, it is possible to display the entire hierarchy with multiple levels of depth, starting with the topmost master object, and traversing detail children objects at each node.


5.2 Identifying Master-Detail Objects on the Data Controls Panel

You can declaratively create pages that display master-detail data using the Data Controls panel. The Data Controls panel displays master-detail related objects in a hierarchy that mirrors the data model where the detail objects are children of the master objects.

To display master-detail objects as form or table objects, drag the detail object from the Data Controls panel and drop it on the page. Its master object is automatically created on the page.

Figure 5-2 shows two master-detail related accessor returned collections in the Data Controls panel. ProductImageList appears as a child of ProductFindAll.


Note:

The master-detail hierarchy displayed in the Data Controls panel does not reflect the cardinality of the relationship (that is, one-to-many, one-to-one, many-to-many). The hierarchy simply shows which accessor returned collection (the master) is being used to retrieve one or more objects from another accessor returned collection (the detail).


Figure 5-2 Master-Detail Objects in the Data Controls Panel

Master-detail objects in the Data Controls panel.

In this example, the relationship between ProductFindAll and ProductImageList is a one-way relationship.

5.3 Using Tables and Forms to Display Master-Detail Objects

You can create a master-detail browse page in a single declarative action using the Data Controls panel. All you have to do is drop the detail accessor returned collection on the page and choose the type of widget you want to use.

The prebuilt master-detail widgets available from the Data Controls panel include range navigation that enables the end user to scroll through the data objects in collections. You can delete unwanted attributes by removing the text field or column from the page.

Figure 5-3 shows an example of a prebuilt master-detail widget, which displays warehouse information in a form at the top of the page and stock levels in a table at the bottom of the page. When the user clicks the Next button to scroll through the records in the master data at the top of the page, the page automatically displays the related detail data.

Figure 5-3 Prebuilt Data Controls Panel Master-Detail Widget

form for warehouse and table for stock levels

5.3.1 How to Display Master-Detail Objects in Tables and Forms

If you do not want to use the prebuilt master-detail widgets, you can drag and drop the master and detail objects individually from the Data Controls panel as tables and forms on a single page or on separate pages.

The Data Controls panel enables you to create both the master and detail widgets on one page with a single declarative action using prebuilt master-detail forms and tables.

To create a master-detail page using the prebuilt ADF master-detail forms and tables:

  1. From the Data Controls panel, locate the detail object.

  2. Drag and drop the detail object onto the JSF page.


    Note:

    If you want to create an editable master-detail form, drop the master object and the detail object separately on the page.


  3. In the context menu, choose one of the following master-details UI components:

    • ADF Master Table, Detail Form: Displays the master objects in a table and the detail objects in a read-only form under the table.

      When a specific data object is selected in the master table, the first related detail data object is displayed in the form below it. The user must use the form navigation to scroll through each subsequent detail data object.

    • ADF Master Form, Detail Table: Displays the master objects in a read-only form and the detail objects in a read-only table under the form.

      When a specific master data object is displayed in the form, the related detail data objects are displayed in a table below it.

    • ADF Master Form, Detail Form: Displays the master and detail objects in separate forms.

      When a specific master data object is displayed in the top form, the first related detail data object is displayed in the form below it. The user must use the form navigation to scroll through each subsequent detail data object.

    • ADF Master Table, Detail Table: Displays the master and detail objects in separate tables.

      When a specific master data object is selected in the top table, the first set of related detail data objects is displayed in the table below it.

5.3.2 What Happens When You Create Master-Detail Tables and Forms

When you drag and drop an accessor returned collection from the Data Controls panel, JDeveloper does many things for you, including adding code to the JSF page and the corresponding entries in the page definition file.

5.3.2.1 Code Generated in the JSF Page

The JSF code generated for a prebuilt master-detail widget is similar to the JSF code generated when you use the Data Controls panel to create a read-only form or table. If you are building your own master-detail widgets, you might want to consider including similar components that are automatically included in the prebuilt master-detail tables and forms.

The tables and forms in the prebuilt master-detail widgets include a panelHeader tag that contains the fully qualified name of the data object populating the form or table. You can change this label as needed using a string or an EL expression that binds to a resource bundle.

If there is more than one data object in a collection, a form in a prebuilt master-detail widget includes four commandButton tags for range navigation: First, Previous, Next, and Last. These range navigation buttons enable the user to scroll through the data objects in the collection. The actionListener attribute of each button is bound to a data control operation, which performs the navigation. The execute property used in the actionListener binding invokes the operation when the button is clicked. (If the form displays a single data object, JDeveloper automatically omits the range navigation components.)


Tip:

If you drop an ADF Master Table, Detail Form or ADF Master Table, Detail Table widget on the page, the parent tag of the detail component (for example, panelHeader tag or table tag) automatically has the partialTriggers attribute set to the id of the master component. At runtime, the partialTriggers attribute causes only the detail component to be rerendered when the user makes a selection in the master component, which is called partial rendering. When the master component is a table, ADF uses partial rendering, because the table does not need to be rerendered when the user simply makes a selection in the facet. Only the detail component needs to be rerendered to display the new data.


5.3.2.2 Binding Objects Defined in the Page Definition File

Example 5-1 shows the page definition file created for a master-detail page that was created by dropping WarehouseStockLevelList, which is a detail object under the ProductFindAll object, on the page as an ADF Master Form, Detail Table.

The executables element defines two accessorIterators: one for the product (the master object) and one for WarehouseStockLevels (the detail object). At runtime, the UI-aware data model and the row set iterator keep the row set of the detail collection refreshed to the correct set of rows for the current master row as that current row changes.

The bindings element defines the value bindings. The attribute bindings that populate the text fields in the form are defined in the attributeValues elements. The id attribute of the attributeValues element contains the name of each data attribute, and the IterBinding attribute references an iterator binding to display data from the master object in the text fields.

The attribute bindings that populate the text fields in the form are defined in the attributeValues elements. The id attribute of the attributeValues element contains the name of each data attribute, and the IterBinding attribute references an iterator binding to display data from the master object in the text fields.

The range navigation buttons in the form are bound to the action bindings defined in the action elements. As in the attribute bindings, the IterBinding attribute of the action binding references the iterator binding for the master object.

The table, which displays the detail data, is bound to the table binding object defined in the table element. The IterBinding attribute references the iterator binding for the detail object.

Example 5-1 Binding Objects Defined in the Page Definition for a Master-Detail Page

  <executables>
    <variableIterator id="variables"/>
    <iterator Binds="root" RangeSize="25" DataControl="SupplierFacadeLocal"
              id="SupplierFacadeLocalIterator"/>
    <accessorIterator MasterBinding="SupplierFacadeLocalIterator"
                      Binds="productFindAll" RangeSize="25"
                      DataControl="SupplierFacadeLocal"
                      BeanClass="oracle.fodemo.supplier.model.Product"
                      id="productFindAllIterator"/>
    <accessorIterator MasterBinding="productFindAllIterator"
                      Binds="warehouseStockLevelList" RangeSize="25"
                      DataControl="SupplierFacadeLocal"
                      BeanClass="oracle.fodemo.supplier.model.WarehouseStockLevel"
                      id="warehouseStockLevelListIterator"/>
  </executables>
  <bindings>
   <action IterBinding="productFindAllIterator" id="First"
            RequiresUpdateModel="true" Action="first"/>
   <action IterBinding="productFindAllIterator" id="Previous"
            RequiresUpdateModel="true" Action="previous"/>
   ...
    <attributeValues IterBinding="productFindAllIterator" id="attribute1">
      <AttrNames>
        <Item Value="warrantyPeriodMonths"/>
      </AttrNames>
    </attributeValues>
    ...
    <tree IterBinding="productFindAllIterator" id="productFindAll">
      <nodeDefinition DefName="oracle.fodemo.supplier.model.Product">
        <AttrNames>
          <Item Value="attributeCategory"/>
          <Item Value="listPrice"/>
          <Item Value="minPrice"/>
          <Item Value="objectVersionId"/>
          <Item Value="productId"/>
          <Item Value="productName"/>
          <Item Value="productStatus"/>
         </AttrNames>
      </nodeDefinition>
    </tree>
    <tree IterBinding="warehouseStockLevelListIterator"
          id="warehouseStockLevelList">
      <nodeDefinition DefName="oracle.fodemo.supplier.model.WarehouseStockLevel">
        <AttrNames>
          <Item Value="lastUpdateDate"/>
          <Item Value="objectVersionId"/>
          <Item Value="productId"/>
          <Item Value="quantityOnHand"/>
          <Item Value="warehouseId"/>
        </AttrNames>
      </nodeDefinition>
    </tree>
  </bindings>

5.3.3 What Happens at Runtime: ADF Iterator for Master-Detail Tables and Forms

At runtime, an ADF iterator determines which row from the master table object to display in the master-detail form. When the form first displays, the first master table object row appears highlighted in the master section of the form. Detail table rows that are associated with the master row display in the detail section of the form.

As described in Section 5.3.2.2, "Binding Objects Defined in the Page Definition File," ADF iterators are associated with underlying rowsetIterator objects. These iterators manage which data objects, or rows, currently display on a page. At runtime, the row set iterators manage the data displayed in the master and detail components.

Both the master and detail row set iterators listen to row set navigation events, such as the user clicking the range navigation buttons, and display the appropriate row in the UI. In the case of the default master-detail components, the row set navigation events are the command buttons on a form (First, Previous, Next, Last).

The row set iterator for the detail collection manages the synchronization of the detail data with the master data. The detail row set iterator listens for row navigation events in both the master and detail collections. If a row set navigation event occurs in the master collection, the detail row set iterator automatically executes and returns the detail rows related to the current master row.

5.3.4 What You May Need to Know About Displaying Master-Detail Widgets on Separate Pages

The default master-detail components display the master-detail data on a single page. However, using the master and detail objects on the Data Controls panel, you can also display the collections on separate pages, and still have the binding iterators manage the synchronization of the master and detail objects.

To display master-detail objects on separate pages, create two pages, one for the master object and one for the detail object, using the individual tables or forms available from the Data Controls panel. Remember that the detail object iterator manages the synchronization of the master and detail data. Be sure to drag the appropriate detail object from the Data Controls panel when you create the page to display the detail data. For more information, see Section 5.2, "Identifying Master-Detail Objects on the Data Controls Panel."

To handle the page navigation, create an ADF task flow, and then add two view activities to it, one for the master page and one for the detail page. Add command buttons or links to each page, or use the default Submit button available when you create a form or table using the Data Controls panel. Each button must specify a navigation rule outcome value in the action attribute. In the task-flow-defintion.xml file, add a navigation rule from the master data page to the detail data page, and another rule to return from the detail data page to the master data page. The from-outcome value in the navigation rules must match the outcome value specified in the action attribute of the buttons.

5.4 Using Trees to Display Master-Detail Objects

In addition to tables and forms, you can also display master-detail data in hierarchical trees. The ADF Faces tree component is used to display hierarchical data. It can display multiple root nodes that are populated by a binding on a master object. Each root node in the tree may have any number of branches, which are populated by bindings on detail objects. A tree can have multiple levels of nodes, each representing a detail object of the parent node. Each node in the tree is indented to show its level in the hierarchy.

The tree component includes mechanisms for expanding and collapsing the tree nodes; however, it does not have focusing capability. If you need to use focusing, consider using the ADF Faces treeTable component (for more information, see Section 5.5, "Using Tree Tables to Display Master-Detail Objects"). By default, the icon for each node in the tree is a folder; however, you can use your own icons for each level of nodes in the hierarchy.

Figure 5-4 shows an example of a tree that displays two levels of nodes: root and branch. The root node displays parent product categories such as Media, Office, and Electronics. The branch nodes display and subcategories under each parent category, such as Hardware, Supplies, and Software under the Office parent category.

Figure 5-4 Databound ADF Faces Tree

tree with two levels of nodes

5.4.1 How to Display Master-Detail Objects in Trees

A tree consists of a hierarchy of nodes, where each subnode is a branch off a higher level node. Each node level in a databound ADF Faces tree component is populated by a different data collection. In JDeveloper, you define a databound tree using the Edit Tree Binding dialog, which enables you to define the rules for populating each node level in the tree. There must be one rule for each node level in the hierarchy. Each rule defines the following node-level properties:

  • The accessor returned collection that populates that node level

  • The attributes from the accessor returned collection that are displayed at that node level

To display master-detail objects in a tree:

  1. Drag the master object from the Data Controls panel, and drop it onto the page. This should be the master data that will represent the root level of the tree.

  2. In the context menu, choose Trees > ADF Tree.

    JDeveloper displays the Edit Tree Binding dialog, as shown in Figure 5-5. You use the binding editor to define a rule for each level that you want to appear in the tree.

    Figure 5-5 Edit Tree Binding Dialog

    Shows the Edit Tree Binding dialog.
  3. In the Root Data Source dropdown list, select the accessor returned collection that will populate the root node level.

    This will be the master data collection. By default, this is the same collection that you dragged from the Data Controls panel to create the tree, which was a master collection.


    Tip:

    If you don't see the accessor returned collection you want in the Root Data Source list, click the Add button. In the Add Data Source dialog, select a data control and an iterator name to create a new data source.


  4. Click the Add icon to add the root data source you selected to the Tree Level Rules list.

  5. In the Tree Level Rules list, select the data source you just added.

  6. Select an attribute in the Available Attributes list and move it to the Display Attributes list.

    The attribute will be used to display nodes at the master level.

    After defining a rule for the master level, you must next define a second rule for the detail level that will appear under the master level in the tree.

  7. To add a second rule, click the Add icon above the Tree Level Rules list.

    A detail data source should appear automatically under the master data source, as shown in Figure 5-6.

    Figure 5-6 Master-Detail Tree Level Rules

    Shows master-detail tree rules.

    For example, if you specified ProductFindAll as the master root data source, WarehouseStockLevelList will automatically appear underneath in the Tree Level Rules list, because the two data sources share a master-detail relationship.

    If you are creating a tree with a recursive master-detail hierarchy, then you only need to define a rule that specifies a data source with a self-accessor. A recursive tree displays root nodes based on a single collection and displays the child nodes from the attributes of a self-accessor that recursively fetches data from that collection. The recursive tree differs from a typical master-detail tree because it requires only a single rule to define the branches of the tree. A recursive data source should display the data source followed by the name of the self-accessor in brackets, as shown in Figure 5-7.

    Figure 5-7 Recursive Tree-Level Rule

    Shows a recursive tree rule.

    For example, in a collection defined by EmployeesView, the root node of each branch could be specified by the ManagerId for the employee, and the child nodes of the same branch would then be the employees who are related to the ManagerId, as specified by the self-accessor DirectReports.

  8. Click OK.

  9. You can add data sources to the Tree Level Rules list to increase the number of nodes that display in the tree. The order of the remaining data sources should follow the hierarchy of the nodes you want to display in the tree.

5.4.2 What Happens When You Create an ADF Databound Tree

When you drag and drop from the Data Controls panel, JDeveloper does many things for you.

When you create a databound tree using the Data Controls panel, JDeveloper adds binding objects to the page definition file,Wi and it also adds the tree tag to the JSF page. The resulting UI component is fully functional and does not require any further modification.

5.4.2.1 Code Generated in the JSF Page

Example 5-2 shows the code generated in a JSF page when you use the Data Controls panel to create a tree. This sample tree displays the order numbers as the root nodes and the product names as the leaf nodes.

Example 5-2 Code Generated in the JSF Page for a Databound Tree

<af:tree 
   value="#{bindings.orderItemFindAll.treeModel}" 
   var="node"
   selectionListener="#{bindings.orderItemFindAll.treeModel.makeCurrent}"
   rowSelection="single" id="orderItemsTree">
   <f:facet name="nodeStamp">
       <af:outputText value="#{node}" id="ot2"/>
   </f:facet>
</af:tree>

By default, the af:tree tag is created inside a form. The value attribute of the tree tag contains an EL expression that binds the tree component to the orderItemFindAll tree binding object in the page definition file. The treeModel property in the binding expression refers to an ADF class that defines how the tree hierarchy is displayed, based on the underlying data model. The var attribute provides access to the current node.

In the f:facet tag, the nodeStamp facet is used to display the data for each node. Instead of having a component for each node, the tree repeatedly renders the nodeStamp facet, similar to the way rows are rendered for the ADF Faces table component.

The ADF Faces tree component uses an instance of the oracle.adf.view.faces.model.PathSet class to display expanded nodes. This instance is stored as the treeState attribute on the component. You may use this instance to programmatically control the expanded or collapsed state of an element in the hierarchy. Any element contained by the PathSet instance is deemed expanded. All other elements are collapsed.

5.4.2.2 Binding Objects Defined in the Page Definition File

Example 5-3 shows the binding objects defined in the page definition file for the ADF databound tree.

Example 5-3 Binding Objects Defined in the Page Definition File for a Databound Tree

<executables>
    <variableIterator id="variables"/>
    <iterator Binds="root" RangeSize="25" DataControl="SupplierFacadeLocal"
              id="SupplierFacadeLocalIterator"/>
    <accessorIterator MasterBinding="SupplierFacadeLocalIterator"
                      Binds="orderItemFindAll" RangeSize="25"
                      DataControl="SupplierFacadeLocal"
                      BeanClass="oracle.fodemo.supplier.model.OrderItem"
                      id="orderItemFindAllIterator"/>
</executables>
<bindings>
    <tree IterBinding="orderItemFindAllIterator" id="orderItemFindAll">
      <nodeDefinition DefName="oracle.fodemo.supplier.model.OrderItem"
                      Name="orderItemFindAll0">
        <AttrNames>
          <Item Value="orderId"/>
        </AttrNames>
        <Accessors>
          <Item Value="product"/>
        </Accessors>
      </nodeDefinition>
      <nodeDefinition DefName="oracle.fodemo.supplier.model.Product"
                      Name="orderItemFindAll1">
        <AttrNames>
          <Item Value="productName"/>
        </AttrNames>
      </nodeDefinition>
    </tree>
</bindings>

The tree element is the value binding for all the attributes displayed in the tree. The iterBinding attribute of the tree element references the iterator binding that populates the data in the tree. The AttrNames element within the tree element defines binding objects for all the attributes in the master collection. However, the attributes that you select to appear in the tree are defined in the AttrNames elements within the nodeDefinition elements.

The nodeDefinition elements define the rules for populating the nodes of the tree. There is one nodeDefinition element for each node, and each one contains the following attributes and subelements:

  • DefName: An attribute that contains the fully qualified name of the data collection that will be used to populate the node

  • id: An attribute that defines the name of the node

  • AttrNames: A subelement that defines the attributes that will be displayed in the node at runtime

  • Accessors: A subelement that defines the accessor attribute that returns the next branch of the tree

The order of the nodeDefintion elements within the page definition file defines the order or level of the nodes in the tree, where the first nodeDefinition element defines the root node. Each subsequent nodeDefinition element defines a subnode of the one before it.

5.4.3 What Happens at Runtime: Displaying an ADF Databound Tree

Tree components use org.apache.myfaces.trinidad.model.TreeModel to access data. This class extends CollectionModel, which is used by the ADF Faces table component to access data. For more information about the TreeModel class, refer to the ADF Faces Javadoc.

When a page with a tree is displayed, the iterator binding on the tree populates the root nodes. When a user expands or collapses a node to display or hide its branches, a DisclosureEvent event is sent. The isExpanded method on this event determines whether the user is expanding or collapsing the node. The DisclosureEvent event has an associated listener.

The DisclosureListener attribute on the tree is bound to the accessor attribute specified in the node rule defined in the page definition file. This accessor attribute is invoked in response to the DisclosureEvent event; in other words, whenever a user expands the node the accessor attribute populates the branch nodes.

5.5 Using Tree Tables to Display Master-Detail Objects

Use the ADF Faces treeTable component to display a hierarchy of master-detail collections in a table. The advantage of using a treeTable component rather than a tree component is that the treeTable component provides a mechanism that enables users to focus the view on a particular node in the tree.

For example, you can create a tree table that displays three levels of nodes: countries, states or provinces, and cities. Each root node represents an individual country. The branches off the root nodes display the state or provinces in the country. Each state or province node branches to display the cities contained in it.

As with trees, to create a tree table with multiple nodes, it is necessary to have master-detail relationships between the collections. For example, to create a tree table with three levels of country, state, and city, it was necessary to have a master-detail relationship from the CountryCodes collection to the StatesandProvinces collection, and a master-detail relationship from the StatesandProvinces collection to the Cities collection.

A databound ADF Faces treeTable displays one root node at a time, but provides navigation for scrolling through the different root nodes. Each root node can display any number of branch nodes. Every node is displayed in a separate row of the table, and each row provides a focusing mechanism in the leftmost column.

You can edit the following treeTable component properties in the Property Inspector:

  • Range navigation: The user can click the Previous and Next navigation buttons to scroll through the root nodes.

  • List navigation: The list navigation, which is located between the Previous and Next buttons, enables the user to navigate to a specific root node in the data collection using a selection list.

  • Node expanding and collapsing mechanism: The user can open or close each node individually or use the Expand All or Collapse All command links. By default, the icon for opening and closing the individual nodes is an arrowhead with a plus or minus sign. You can also use a custom icon of your choosing.

  • Focusing mechanism: When the user clicks on the focusing icon (which is displayed in the leftmost column) next to a node, the page is redisplayed showing only that node and its branches. A navigation link is provided to enable the user to return to the parent node.

5.5.1 How to Display Master-Detail Objects in Tree Tables

The steps for creating an ADF Faces databound tree table are exactly the same as those for creating an ADF Faces databound tree, except that you drop the accessor returned collection as an ADF Tree Table instead of an ADF Tree.

5.5.2 What Happens When You Create a Databound Tree Table

When you drag and drop from the Data Controls panel, JDeveloper does many things for you.

When you create a databound tree table using the Data Controls panel, JDeveloper adds binding objects to the page definition file, and it also adds the treeTable tag to the JSF page. The resulting UI component is fully functional and does not require any further modification.

5.5.2.1 Code Generated in the JSF Page

Example 5-4 shows the code generated in a JSF page when you use the Data Controls panel to create a tree table. This sample tree table displays two levels of nodes: products and stock levels.

By default, the treeTable tag is created inside a form. The value attribute of the tree table tag contains an EL expression that binds the tree component to the binding object that will populate it with data. The treeModel property refers to an ADF class that defines how the tree hierarchy is displayed, based on the underlying data model. The var attribute provides access to the current node.

Example 5-4 Code Generated in the JSF Page for a Databound ADF Faces Tree Table

<af:treeTable value="#{bindings.orderItemFindAll.treeModel}" var="node"
     selectionListener="#{bindings.orderItemFindAll.treeModel.makeCurrent}"
     rowSelection="single" id="tt1">
     <f:facet name="nodeStamp">
          <af:column id="c1">
              <af:outputText value="#{node}" id="ot1"/>
          </af:column>
     </f:facet>
     <f:facet name="pathStamp">
          <af:outputText value="#{node}" id="ot2"/>
     </f:facet>
</af:treeTable>

In the facet tag, the nodeStamp facet is used to display the data for each node. Instead of having a component for each node, the tree repeatedly renders the nodeStamp facet, similar to the way rows are rendered for the ADF Faces table component. The pathStamp facet renders the column and the path links above the table that enable the user to return to the parent node after focusing on a detail node.

5.5.2.2 Binding Objects Defined in the Page Definition File

The binding objects created in the page definition file for a tree table are exactly the same as those created for a tree.

5.5.3 What Happens at Runtime: Events

Tree components use oracle.adf.view.faces.model.TreeModel to access data. This class extends CollectionModel, which is used by the ADF Faces table component to access data. For more information about the TreeModel class, refer to the ADF Faces Javadoc.

When a page with a tree table is displayed, the iterator binding on the treeTable component populates the root node and listens for a row navigation event (such as the user clicking the Next or Previous buttons or selecting a row from the range navigator). When the user initiates a row navigation event, the iterator displays the appropriate row.

If the user changes the view focus (by clicking on the component's focus icon), the treeTable component generates a focus event (FocusEvent). The node to which the user wants to change focus is made the current node before the event is delivered. The treeTable component then modifies the focusPath property accordingly. You can bind the FocusListener attribute on the tree to a method on a managed bean. This method will then be invoked in response to the focus event.

When a user expands or collapses a node, a disclosure event (DisclosureEvent) is sent. The isExpanded method on the disclosure event determines whether the user is expanding or collapsing the node. The disclosure event has an associated listener, DisclosureListener. The DisclosureListener attribute on the tree table is bound to the accessor attribute specified in the node rule defined in the page definition file. This accessor attribute is invoked in response to a disclosure event (for example, the user expands a node) and returns the collection that populates that node.

The treeTable component includes Expand All and Collapse All links. When a user clicks one of these links, the treeTable sends a DisclosureAllEvent event. The isExpandAll method on this event determines whether the user is expanding or collapsing all the nodes. The table then expands or collapses the nodes that are children of the root node currently in focus. In large trees, the expand all command will not expand nodes beyond the immediate children. The ADF Faces treeTable component uses an instance of the oracle.adf.view.faces.model.PathSet class to determine expanded nodes. This instance is stored as the treeState attribute on the component. You can use this instance to programmatically control the expanded or collapsed state of a node in the hierarchy. Any node contained by the PathSet instance is deemed expanded. All other nodes are collapsed. This class also supports operations like addAll() and removeAll().

For more information about the ADF Faces treeTable component, refer to the oracle.adf.view.faces.component.core.data.CoreTreeTable class in the ADF Faces Javadoc.

5.5.4 Using the TargetIterator Property

You can expand a node binding in the page definition editor to view the page's node Definition elements. These are the same tree binding rules that you can configure in the tree binding dialog.

For each node definition (rule), you can specify an optional TargetIterator property. Its value is an EL expression that is evaluated at runtime when the user selects a row in the tree. The EL expression evaluates an iterator binding in the current binding container. The iterator binding's row key attributes match (in order, number, and data type) the row key of the iterator from which the nodeDefinition type's rows are retrieved for the tree.

At runtime, when the tree control receives a selectionChanged event, it passes in the list of keys for each level of the tree. These keys uniquely identify the selected node.

The tree binding starts at the top of the tree. For each tree level whose key is present in the Currently Selected Tree Node Keys list, if there is a TargetIterator property configured for that nodeDefinition, the tree binding performs a setCurrentRowWithKey() operation on the selected target iterator. It uses the key from the appropriate level of the Currently Selected Tree Node Keys list.

5.6 Using Selection Events with Trees and Tables

There may be cases when you need to determine which node in a tree or tree table has been selected in order to handle some processing in your application. For example, when a user selects a category node in a Browse tree, a selection event is fired. The listener associated with this event needs to determine the product category of the node selected, and then to return all products whose category attribute matches that value.

5.6.1 How to Use Selection Events with Trees and Tables

To programmatically use selection events, you need to create a listener in a managed bean that will handle the selection event and perform the needed logic. You then need to bind the selectionListener attribute of the tree or table to that listener.

To use selection events with trees and tables:

  1. If one does not already exist, create a managed bean to contain the needed listener.

  2. Create a listener method on the managed bean. For more information about creating listener methods, see the "Using ADF Faces Server Events" section of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework. Your listener should do the following:

    1. Access the component using the event source. Example 5-5 shows how the productCategoriesTreeSelectionListener method on the HomeBean managed bean accesses the tree that launched the selection event.

      Example 5-5 Getting the Source of an Event

      public void productCategoriesTreeSelectionListener(SelectionEvent evt) {
          RichTree tree = (RichTree)evt.getSource();
      

      For more information about finding the event source component, see the "How to Return the Original Source of the Event" section of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.

    2. Access the tree model to get the value of the model, use the RowKeySet object to get the currently selected node, and then set that as the current row on the model, as shown in Example 5-6. For more information about RowKeySet objects, see Section 5.6.2, "What Happens at Runtime: RowKeySet Objects and SelectionEvent Events."

      Example 5-6 Setting the Current Row on a Tree Model

      TreeModel model = (TreeModel)tree.getValue();
      RowKeySet rowKeySet = evt.getAddedSet();
      Object key = rowKeySet.iterator().next();
      model.setRowKey(key);
      
    3. You can now add logic to execute against the currently selected row. For example, the productCategoriesTreeSelectionListener method uses the value binding of the selected row to determine the category ID, and then uses that value as the parameter for another method that, when executed, returns all products with that category ID, as shown in Example 5-7.

      Example 5-7 Returning Objects That Match a Given Attribute Value

      JUCtrlValueBinding nodeBinding = 
          (JUCtrlValueBinding)model.getRowData();
      Number catId = (Number)nodeBinding.getAttribute("CategoryId");
      _selectedCategory = (String)nodeBinding.getAttribute("CategoryName");
      
      OperationBinding ob =
           ADFUtils.findOperation("ProductsByCategoriesExecuteWithParams");
      ob.getParamsMap().put("category", catId);
      ob.execute();
      
  3. On the associated JSF page, select the tree or table component. In the Property Inspector, expand the Behavior section and set the value of the SelectionListener attribute to the listener method just created. You can use the Edit option from the dropdown method to declaratively select the bean and the method.

5.6.2 What Happens at Runtime: RowKeySet Objects and SelectionEvent Events

Whenever a user selects a node in a tree (or a row in a table), the component triggers selection events. A selectionEvent event reports which rows were just deselected and which rows were just selected. The current selection, that is, the selected row or rows, is managed by the RowKeySet object, which keeps track of all currently selected nodes by adding and deleting the associated key for the row into or out of the key set. When a user selects a new node, and the tree or table is configured for single selection, then the previously selected key is discarded and the newly selected key is added. If the tree or table is configured for multiple selection, then the newly selected keys are added to the set, and the previously selected keys may or may not be discarded, based on how the nodes were selected. For example, if the user pressed the CTRL key, then the newly selected nodes would be added to the current set.

PK aWPK4HwEOEBPS/deploy_java_ee_app.htm Deploying an ADF Java EE Application

8 Deploying an ADF Java EE Application

This chapter describes how to deploy Oracle ADF Java EE applications to a target application server. It describes how to create deployment profiles, how to create deployment descriptors, and how to load ADF runtime libraries. It includes instructions for running an application in the Integrated WebLogic Server as well as deploying to a standalone Oracle WebLogic Server or IBM WebSphere Application Server.

This chapter includes the following sections:

8.1 Introduction to Deploying ADF Java EE Web Applications

Deployment is the process of packaging application files as an archive file and transferring this file to a target application server. You can use JDeveloper to deploy Oracle ADF Java EE web applications directly to the application server (such as Oracle WebLogic Server or IBM WebSphere Application Server), or indirectly to an archive file as the deployment target, and then install this archive file to the target server. For application development, you can also use JDeveloper to run an application in Integrated WebLogic Server. JDeveloper supports deploying to server clusters. You cannot use JDeveloper to deploy to individual Managed Servers within a cluster.


Note:

Normally, you use JDeveloper to deploy applications for development and testing purposes. If you are deploying Oracle ADF Java EE web applications for production purposes, you can use Enterprise Manager or scripts to deploy to production-level application servers.

For more information about deployment to later-stage testing or production environments, see the Oracle Fusion Middleware Administrator's Guide for Oracle Application Development Framework.


ADF Java EE applications are based on standardized, modular components and can be deployed to the following application servers:

Deploying a Fusion web application is slightly different from deploying a standard Java EE application. JSF applications that contain ADF Faces components have a few additional deployment requirements:

  • ADF Faces requires Sun's JSF Reference Implementation 1.2 and MyFaces 1.0.8 (or later).

You can use JDeveloper to:

  • Run applications in Integrated WebLogic Server

    You can run and debug applications using Integrated WebLogic Server and then deploy to a remote a WebLogic Server or to WebSphere.

    Integrated IBM WebSphere Application Server is not supported for this release.

  • Deploy directly to the application server

    You can deploy applications directly to the application server by creating a connection to the server and choosing the name of that server as the deployment target.

  • Deploy to an archive file

    You can deploy applications indirectly by choosing an EAR file as the deployment target. The archive file can subsequently be installed on a target application server.

8.1.1 Developing Applications with Integrated WebLogic Server

If you are developing an application in JDeveloper and you want to run the application in Integrated WebLogic Server, you do not need to perform the tasks required for deploying directly to Oracle WebLogic Server or to an archive file. JDeveloper has a default connection to Integrated WebLogic Server and does not require any deployment profiles or descriptors. Integrated WebLogic Server has a preconfigured domain that includes the ADF libraries, as well as the -Djps.app.credential.overwrite.allowed=true setting, both of these are required to run Oracle ADF applications. You can run an application by choosing Run from the JDeveloper main menu.

8.1.2 Developing Applications to Standalone Application Server

Typically, for deployment to standalone application servers, you test and develop your application by running it in Integrated WebLogic Server. You can then test the application further by deploying it to testing Oracle WebLogic Server (in development mode) or to IBM WebSphere Application Server to more closely simulate the production environment.

In general, you use JDeveloper to prepare the application or project for deployment by:

  • Creating a connection to the target application server

  • Creating deployment profiles (if necessary)

  • Creating deployment descriptors (if necessary, and that are specific to the application server)

  • Updating application.xml and web.xml to be compatible with the application (if required)

  • Enabling the application for Real User Experience Insight (RUEI) in web.xml (if desired)

  • Migrating application-level security policy data to a domain-level security policy store

  • Configuring the Oracle Single Sign-On (Oracle SSO) service and properties in the domain jps-config.xml file when you intend the web application to run using Oracle SSO

You must already have an installed application server. For Oracle WebLogic Server, you can use the Oracle 11g Installer or the Oracle Fusion Middleware 11g Application Developer Installer to install one. For other applications servers, follow the instructions in the applications server documentation to obtain and install the server.

You also must prepare the application server for ADF application deployment. For more information, see the "Preparing the Standalone Application Server for Deployment" section of the Oracle Fusion Middleware Administrator's Guide for Oracle Application Development Framework.

  • Installing the ADF runtime into the application server installation:

    • For WebLogic Server

      • If you installed Oracle WebLogic Server together with JDeveloper using the Oracle 11g Installer for JDeveloper, the ADF runtime should already be installed.

      • If the ADF runtime is not installed and you want to use Oracle Enterprise Manager to manage standalone ADF applications (which are applications without Oracle SOA Suite or Oracle WebCenter Portal components), use the Oracle Fusion Middleware 11g Application Developer Installer. This installer will install the necessary Oracle Enterprise Manager components into the Oracle WebLogic installation.

      • If the ADF runtime is not installed and you do not need to install Enterprise Manager, use the Oracle 11g Installer for JDeveloper.

    • For WebSphere

  • Extending Oracle WebLogic Server domains or WebSphere Cells to be ADF-compatible using the ADF runtime

  • For WebLogic, setting the Oracle WebLogic Server credential store overwrite setting as required (-Djps.app.credential.overwrite.allowed=true setting)

  • Creating a global JDBC data source for applications that require a connection to a data source

After the application and application server have been prepared, you can:

  • Use JDeveloper to:

    • Directly deploy to the application server using the deployment profile and the application server connection.

    • Deploy to an EAR file using the deployment profile. For ADF applications, WAR and MAR files can be deployed only as part of an EAR file.

  • Use Enterprise Manager, scripts, or the application's administration tool to deploy the EAR file created in JDeveloper. For more information, see the Oracle Fusion Middleware Administrator's Guide for Oracle Application Development Framework.

8.2 Running a Java EE Application in Integrated WebLogic Server

JDeveloper is installed with Integrated WebLogic Server, which you can use to test and develop your application. For most development purposes, Integrated WebLogic Server will suffice. When your application is ready to be tested, you can select the run target and then choose the Run command from the main menu.

When you run the application target, JDeveloper detects the type of Java EE module to deploy based on artifacts in the projects and workspace. JDeveloper then creates an in-memory deployment profile for deploying the application to Integrated WebLogic Server. JDeveloper copies project and application workspace files to an "exploded EAR" directory structure. This file structure closely resembles the EAR file structure that you would have if you were to deploy the application to an EAR file. JDeveloper then follows the standard deployment procedures to register and deploy the "exploded EAR" files into Integrated WebLogic Server. The "exploded EAR" strategy reduces the performance overhead of packaging and unpackaging an actual EAR file.

In summary, when you select the run target and run the application in Integrated WebLogic Server, JDeveloper:

  • Detects the type of Java EE module to deploy based on the artifacts in the project and application

  • Creates a deployment profile in memory

  • Copies project and application files into a working directory with a file structure that would simulate the "exploded EAR" file of the application.

  • Performs the deployment tasks to register and deploy the simulated EAR into Integrated WebLogic Server

  • Automatically migrates identities, credentials, and policies

    Later on, if you plan to deploy the application to a standalone WebLogic Server instance, you will need to migrate this security information.


Note:

JDeveloper ignores the deployment profiles that were created for the application when you run the application in Integrated WebLogic Server.


The application will run in the base domain in Integrated WebLogic Server. This base domain has the same configuration as a base domain in a standalone WebLogic Server instance. In other words, this base domain will be the same as if you had used the Oracle Fusion Middleware Configuration Wizard to create a base domain with the default options in a standalone WebLogic Server instance.

JDeveloper will extend this base domain with the necessary domain extension templates, based on the JDeveloper technology extensions. For example, if you have installed JDeveloper Studio, JDeveloper will automatically configure the Integrated WebLogic Server environment with the ADF runtime template (JRF Fusion Middleware runtime domain extension template).

You can explicitly create a default domain for Integrated WebLogic Server. You can use these domains to run and test your applications in addition to using the default domain. Open the Application Server Navigator, right-click IntegratedWebLogicServer and choose Create Default Domain.

JDeveloper has a default connection to Integrated WebLogic Server. You do not need to create a connection to run an application. If you do want to manually create an application server connection to Integrated WebLogic Server, use the instructions in Section 8.3.1, "How to Create a Connection to the Target Application Server," to create the connection, selecting Integrated Server instead of Standalone Server in Step 2.

8.2.1 How to Run an Application in Integrated WebLogic Server

You can test an application by running it in Integrated WebLogic Server. You can also set breakpoints and then run the application within the ADF Declarative Debugger.

To run an application in Integrated WebLogic Server:

  1. In the Application Navigator, select the project, unbounded task flow, JSF page, or file as the run target.

  2. Right-click the run target and choose Run or Debug.

    If this is the first time you run your application in Integrated WebLogic Server, the Configure Default Domain dialog appears for you to define an administrator password for the new domain. Passwords you enter can be eight characters or more and must have a numeric character.

8.2.2 How to Run an Application with Metadata in Integrated WebLogic Server

When an application is running in Integrated WebLogic Server, the MAR profile itself will not be deployed to a repository, but a simulated MDS repository will be configured for the application that reflects the metadata information contained in the MAR. This metadata information is simulated, and the application runs based on this location in source control.

By default, only the customizations in ADF view and ADF Model are included in the MAR. If the Java EE application has customizations in other directories, you must create a custom MAR profile that includes these directories.

Any customizations or documents created by the application that are not configured to be stored in other MDS repositories are written to this simulated MDS repository directory. For example, if you customize an object, the customization is written to the simulated MDS repository. If you execute code that creates a new metadata object, then this new metadata object is also written to the same location in the simulated MDS repository. You can keep the default location for this directory (ORACLE_HOME\jdeveloper\systemXX.XX\o.mds.dt\adrs\Application\AutoGeneratedMar\mds_adrs_writedir), or you can set it to a different directory. You also have the option to preserve this directory across different application runs, or to delete it before each application run.

If your workspace has different working sets, only the metadata from the projects defined in the working set and their dependent projects will be included in the MAR. You can view and change a project's dependencies by right-clicking the project in the Application Navigator, choosing Project Properties, and then selecting Dependencies. For instance, an application may have several projects but workingsetA is defined to be viewcontroller2 and viewcontroller5; and viewcontroller5 has a dependency on modelproject1. When you run or debug workingsetA, only the metadata for viewcontroller2, viewcontroller5, and modelproject1 will be included in the MAR for deployment.

There should already be a MAR profile, either generated automatically by JDeveloper, or manually generated by a user.

To deploy the MAR profile to Integrated WebLogic Server:

  1. In the Application Navigator, right-click the application and choose Application Properties.

  2. In the Application Properties dialog, expand Run and choose MDS.

  3. In the Run MDS page:

    • Select the MAR profile from the MAR Profile dropdown list

    • Enter a directory path in Override Location if you want to customize the location of the simulated MDS repository.

    • Select the Directory Content option. You can chose to preserve the customizations across application runs or delete customizations before each run.

    Select the MAR profile from the MAR Profile dropdown list. Figure 8-1 shows Demometadata1 selected as the MAR profile.

    Figure 8-1 Setting the Run MDS options

    Application roperties Run MDS options

8.3 Preparing the Application

Before you deploy an ADF application to an application server, you must perform prerequisite tasks within JDeveloper to prepare the application for deployment.

The prerequisite tasks are:

  • Creating a connection to the target application server

  • Creating deployment profiles

  • Creating deployment descriptors

  • Migrating applicable security, credentials, identities, and policies

  • Replicating memory scopes in a clustered environment

  • Enabling the application for ADF MBeans (optional)

8.3.1 How to Create a Connection to the Target Application Server

You can deploy applications to the application server via JDeveloper application server connections.

If your application involves customization using MDS, you should register your MDS repository with the application server:

To create a connection to an application server:

  1. Launch the Application Server Connection wizard.

    You can:

    • In the Application Server Navigator, right-click Application Servers and choose New Application Server Connection.

    • In the New Gallery, expand General, select Connections and then Application Server Connection, and click OK.

    • In the Resource Palette, choose New > New Connections > Application Server.

  2. In the Create AppServer Connection dialog Usage page, select Standalone Server.

  3. In the Name and Type page, enter a connection name.

  4. In the Connection Type dropdown list, choose:

    • WebLogic 10.3 to create a connection to Oracle WebLogic Server

    • WebSphere Server 7.x to create a connection to IBM WebSphere Server

  5. Click Next.

  6. On the Authentication page, enter a user name and password for the administrative user authorized to access the application server.

  7. Click Next.

  8. On the Configuration page, enter the information for your server:

    For WebLogic:

    • The Oracle WebLogic host name is the name of the WebLogic Server instance containing the TCP/IP DNS where your application (.jar,.war,.ear) will be deployed.

    • In the Port field, enter a port number for the Oracle WebLogic Server instance on which your application (.jar,.war,.ear) will be deployed.

      If you don't specify a port, the port number defaults to 7001.

    • In the SSL Port field, enter an SSL port number for the Oracle WebLogic Server instance on which your application (.jar,.war,.ear) will be deployed.

      Specifying an SSL port is optional. It is required only if you want to ensure a secure connection for deployment.

      If you don't specify an SSL port, the port number defaults to 7002.

    • Select Always Use SSL to connect to the Oracle WebLogic Server instance using the SSL port.

    • Optionally enter a WebLogic Domain only if Oracle WebLogic Server is configured to distinguish nonadministrative server nodes by name.

    For WebSphere:

    • In the Host Name field, enter the name of the WebSphere server containing the TCP/IP DNS where your Java EE applications (.jar, .war, .ear) are deployed. If no name is entered, the name defaults to localhost.

    • In the SOAP Connector Port field, enter the port number. The host name and port are used to connect to the server for deployment. The default SOAP connector port is 8879.

    • In the Server Name field, enter the name assigned to the target application server for this connection.

    • In the Target Node field, enter the name of the target node for this connection. A node is a grouping of Managed Servers. The default is machineNode01, where machine is the name of the machine the node resides on

    • In the Target Cell field, enter the name of the target cell for this connection. A cell is a group of processes that host runtime components. The default is machineNode01,Cell where machine is the name of the machine the node resides on.

    • In the Wsadmin script location field, enter, or browse to, the location of the wsadmin script file to be used to define the system login configuration for your IBM WebSphere application server connection. The default location is websphere-home/bin/wsadmin.sh for Unix/Linux and websphere-home/bin/wsadmin.bat for Windows.

  9. Click Next.

  10. If you have chosen WebSphere, the JMX page appears. On the JMX page, enter the JMX information:

    • Select Enable JMX for this connection to enable JMX.

    • In the RMI Port field, enter the port number of WebSphere's RMI connector port. The default is 2809.

    • In the WebSphere Runtime Jars Location field, enter or browse to the location of the WebSphere runtime JARs.

    • In the WebSphere Properties Location (for secure MBEAN access) field, enter or browse to the location of the file that contains the properties for the security configuration and the mbeans that are enabled. This field is optional.

  11. Click Next.

  12. If the SSl Signer Exchange Prompt dialog appears, click Y.

  13. On the Test page, click Test Connection to test the connection.

    JDeveloper performs several types of connections tests. The JSR-88 test must pass for the application to be deployable. If the test fails, return to the previous pages of the wizard to fix the configuration.

  14. Click Finish.

8.3.2 How to Create Deployment Profiles

A deployment profile defines the way the application is packaged into the archive that will be deployed to the target environment. The deployment profile:

  • Specifies the format and contents of the archive file that will be created

  • Lists the source files, deployment descriptors, and other auxiliary files that will be packaged

  • Describes the type and name of the archive file to be created

  • Highlights dependency information, platform-specific instructions, and other information

You need a WAR deployment profile for each web view-controller project that you want to deploy in your application. If you want to package seeded customizations or place base metadata in the MDS repository, you need an application-level metadata archive (MAR) deployment profile as well. For more information about seeded customizations, see the "Customizing Applications with MDS" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework. If the application has customization classes, you need a JAR file for those classes and you need to add that JAR when you create the EAR file. If you are using EJB, you need an EJB JAR profile. Finally, you need an application-level EAR deployment profile and you must select the projects you want to include from a list, such as WAR and MAR profiles and customization classes JAR files. When the application is deployed, the EAR file will include all the projects that were selected in the deployment profile.

For Oracle ADF applications, you can deploy the application only as an EAR file. The WAR and MAR files that are part of the application should be included in the EAR file when you create the deployment profile.

8.3.2.1 Adding Customization Classes into a JAR

If your application has customization classes, create a JAR that contains only these customization classes. When you create your EAR, you can add the JAR to the EAR assembly. And when you create WAR profiles for your web projects, you must make sure they don't include the customization classes JAR.

Before you begin:

Make sure that your project has customization classes. You do not need to perform this procedure if the application does not have customization classes. For more information about customization classes, see the "How to Create Customization Classes" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

To add customization classes into a JAR:

  1. In the Application Navigator, right-click the data model project that contains the customization classes you want to create a JAR for, and choose New.

  2. In the New Gallery, expand General, select Deployment Profiles and then JAR File, and click OK.

    Alternatively, if you want to create a shared library, select Shared Library JAR File from the list of profile types, and click OK.


    Note:

    If you don't see Deployment Profiles in the Categories tree, click the All Technologies tab.


  3. In the Create Deployment Profile -- JAR File dialog, enter a name for the project deployment profile (for example, CCArchive) and click OK.

  4. In the Edit JAR Deployment Profile Properties dialog, select JAR Options.

  5. Enter the location for the JAR file.

  6. Expand Files Groups > Project Output > Filters.

  7. In the Files tab, select the customization classes you want to add to the JAR file. If you are using a customization.properties file, it needs to be in the same class loader as the JAR file. You can select the customization.properties file to package it along with the customization classes in the same JAR.

  8. Click OK to exit the Edit JAR Deployment Profile Properties dialog.

  9. Click OK again to exit the Project Properties dialog.

  10. In the Application Navigator, right-click the project containing the JAR deployment profile, and choose Deploy > deployment profile > to JAR file.


    Note:

    If this is the first time you deploy to a JAR from this deployment profile, you choose Deploy > deployment profile and select Deploy to JAR in the wizard.


8.3.2.2 Creating a WAR Deployment Profile

You will need to create a WAR deployment profile for each web-based project you want to package into the application. Typically, the WAR profile will include the dependent model projects it requires.

To create WAR deployment profiles for an application:

  1. In the Application Navigator, right-click the web project that you want to deploy and choose New.

    You will create a WAR profile for each web project.

  2. In the New Gallery, expand General, select Deployment Profiles and then WAR File, and click OK.

    If you don't see Deployment Profiles in the Categories tree, click the All Technologies tab.

  3. In the Create Deployment Profile -- WAR File dialog, enter a name for the project deployment profile and click OK.

  4. In the Edit WAR Deployment Profile Properties dialog, choose items in the left pane to open dialog pages in the right pane. Configure the profile by setting property values in the pages of the dialog.

    • If you have customization classes in your application, they must be loaded from the EAR-level application class loader and not from the WAR. You will later add these customization classes to the EAR.

      By default, customization classes are added to the model project's WAR class path. So for each WAR, you must exclude the customization classes.

      If you created your customization classes in an extension project of the application, be sure to deselect any customization class archive on the Library Dependencies page of the WAR deployment profile for each view controller project.

      If you created your customization classes in the model project of the application, deselect any customization classes on the File Groups > WEB-INF/classes > Filters page of the WAR deployment profile for each view controller project. If you are using a customization.properties file, it should also be deselected.

    • You might also want to change the Java EE web context root setting (choose General in the left pane).

      By default, when Use Project's Java EE Web Context Root is selected, the associated value is set to the project name, for example, Application1-Project1-context-root. You need to change this if you want users to use a different name to access the application.

      If you are using custom JAAS LoginModule for authentication with JAZN, the context root name also defines the application name that is used to look up the JAAS LoginModule.

  5. Click OK to exit the Edit WAR Deployment Profile Properties dialog.

  6. Click OK again to exit the Project Properties dialog.

  7. Repeat Steps 1 through 7 for all web projects that you want to deploy.

8.3.2.3 Creating a MAR Deployment Profile

If you have seeded customizations or base metadata that you want to place in the MDS repository, you need to create a MAR deployment profile.

The namespace configuration under <mds-config> for MAR content in the adf-config.xml file is generated based on your selections in the MAR Deployment Profile Properties dialog.

Although uncommon, an enterprise application (packaged in an EAR) can contain multiple web application projects (packaged in multiple WARs), but the metadata for all these web applications will be packaged into a single metadata archive (MAR). The metadata contributed by each of these individual web applications can be global (available for all the web applications) or local to that particular web application.To avoid name conflicts for metadata with global scope, make sure that all metadata objects and elements have unique names across all the web application projects that form part of the enterprise application.To avoid name conflicts and to ensure that the metadata for a particular web application remains local to that application, you can define a web-app-root for that web application project.The web-app-root is an element in the adf-settings.xml file for a web application project. The adf-settings.xml file should be kept in the META-INF directory under the public_html directory for the web project. Example 8-1 shows the contents of a sample adf-settings.xml file.

Example 8-1 web-app-root Element in the adf-settings.xml File

<?xml version="1.0" encoding="UTF-8" ?>
 <adf-settings xmlns="http://xmlns.oracle.com/adf/settings"
 xmlns:wap="http://xmlns.oracle.com/adf/share/http/config">
    <wap:adf-web-config xmlns="http://xmlns.oracle.com/adf/share/http/config">
        <web-app-root rootName="order"/>
    </wap:adf-web-config>
</adf-settings>

In this example, the adf-settings.xml file has a web-app-root element that defines rootName as order.If your enterprise application has only one web application project, there is no need to define a web-app-root element. If your enterprise application has multiple web application projects, you should supply a web-app-root for all the web applications except one, without which the deployment will fail. For example, if you have web-application1, web-application2, and web-application3, two of these web application projects must define a web-app-root to preclude any name conflicts.

JDeveloper creates an auto-generated MAR when the Enable User Customizations and Across Sessions using MDS options are selected in the ADF View page of the Project Properties dialog or when you explicitly specify the deployment target directory in the adf-config.xml file.

By default, only the customizations in ADF view and ADF Model are included in the MAR. If the Java EE application has customizations in other directories, you must create a custom MAR profile that includes those directories.

Before you begin:

Create an MDS repository for your customization requirements to deploy metadata using the MAR deployment profile.

To create a MAR deployment profile:

  1. In the Application Navigator, right-click the application and choose New.

    You will create a MAR profile if you want to include customizations.

  2. In the New Gallery, expand General, select Deployment Profiles and then MAR File, and click OK.

    If you don't see Deployment Profiles in the Categories tree, click the All Technologies tab.

  3. In the Create Deployment Profile -- MAR File dialog, enter a name for the MAR deployment profile and click OK.

  4. In the Edit MAR Deployment Profile Properties dialog, choose items in the left pane to open dialog pages in the right pane.

    Figure 8-2 shows a sample User Metadata directory tree.

    Figure 8-2 Selecting Items for the MAR Deployment Profiles

    MAR deployment profile dialog

    Note the following important points:

    • To include all customizations, you need only create a file group with the desired directories.

    • To include files from other than ADF Model and ADF view, create a new file group under User Metadata with the desired directories and explicitly select the required content in the Directories page.

    • ADF Model and ADF view directories are added by default. No further action is required to package the ADF Model and ADF view customizations into the MAR. ADF view content is added to HTML Root dir, while ADF Model content is added to User Metadata. If your application has other customization directories, such as from an EJB project, you must add those directories.

    • To include the base metadata in the MDS repository, you need to explicitly select these directories in the dialog.

      When you select the base document to be included in the MAR, you also select specific packages. When you select one package, all the documents (including subpackages) under that package will be used. When you select a package, you cannot deselect individual items under that package.

    • If a dependent ADF library JAR for the project contains seeded customizations, they will automatically be added to the MAR during MAR packaging. They will not appear in the MAR profile.

    • If ADF Library customizations were created in the context of the consuming project, those customizations would appear in the MAR profile dialog by default.

  5. Click OK to exit the Edit MAR Deployment Profile Properties dialog.

  6. Click OK again to exit the Application Properties dialog.

8.3.2.4 Creating an EJB JAR Deployment Profile

If you are using an EJB module in the model project, you need to create an EJB JAR deployment profile.

Before you begin:

Create a model project that has an EJB module.

To create an EJB JAR deployment profile for an application:

  1. In the Application Navigator, right-click the web project that you want to deploy and choose New.

  2. In the New Gallery, expand General, select Deployment Profiles and then EJB JAR File, and click OK.

    If you don't see Deployment Profiles in the Categories tree, click the All Technologies tab.

  3. In the Create Deployment Profile -- EJB JAR File dialog, enter a name for the deployment profile and click OK.

  4. In the Edit EJB JAR Deployment Profile Properties dialog, choose items in the left pane to open dialog pages in the right pane. Configure the profile by setting property values in the pages of the dialog.

  5. Click OK to exit the Edit EJB JAR Deployment Profile Properties dialog.

  6. Click OK again to exit the Project Properties dialog.

8.3.2.5 Creating an Application-Level EAR Deployment Profile

The EAR file contains all the necessary application artifacts for the application to run in the application server. For more information about the EAR file, see Section 8.4.5, "What You May Need to Know About EAR Files and Packaging."

Before you begin:

To create an EAR deployment profile for an application:

  1. In the Application Navigator, right-click the application and choose New.

    You will create an EAR profile for the application.

  2. In the New Gallery, expand General, select Deployment Profiles and then EAR File, and click OK.

    If you don't see Deployment Profiles in the Categories tree, click the All Technologies tab.

  3. In the Create Deployment Profile -- EAR File dialog, enter a name for the application deployment profile and click OK.

  4. In the Edit EAR Deployment Profile Properties dialog, choose items in the left pane to open dialog pages in the right pane. Configure the profile by setting property values in the pages of the dialog.

    Be sure that you:

    • Select Application Assembly and then in the Java EE Modules list, select all the project profiles that you want to include in the deployment, including any WAR or MAR profiles.

    • Select Platform, and select the application server you are deploying to, and then select the target application connection from the Target Connection dropdown list.


    Note:

    If you are using custom JAAS LoginModule for authentication with JAZN, the context root name also defines the application name that is used to look up the JAAS LoginModule.


  5. If you have customization classes in your application, configure these classes so that they load from the EAR-level application class loader.

    1. In the Edit EAR Deployment Profile Properties dialog, select Application Assembly.

    2. Select the JAR deployment profile that contains the customization classes, and enter lib in the Path in EAR field at the bottom of the dialog.


      Note:

      You should have created this JAR as described in Section 8.3.2.1, "Adding Customization Classes into a JAR."


    The JAR file containing the customization classes is added to the EAR file's lib directory.


    Note:

    If you have customization classes in your application, you must also make sure they are not loaded from the WAR. By default, customization classes that are added to the model project's Libraries & Classpath are packaged to the WAR class path.

    To make sure customization classes from an extension project are not duplicated in the WAR, be sure to deselect any customization class archive on the Library Dependencies page for the WAR.

    If you created your customization classes in the model project of the consuming application, deselect any customization classes on the File Groups > WEB-INF/classes > Filters page for the WAR.


  6. Click OK to exit the Deployment Profile Properties dialog.

  7. Click OK again to exit the Application Properties dialog.


Note:

To verify that your customization classes are put correctly in the EAR class path, you can deploy the EAR profile to file system. Then you can examine the EAR to make sure that the customization class JAR is available in the EAR class path (the EAR/lib directory) and not available in the WAR class path (the WEB-INF/lib and WEB-INF/classes directories).


8.3.2.6 Delivering Customization Classes as a Shared Library

As an alternative to adding your customization classes to the EAR, as described in Section 8.3.2.5, "Creating an Application-Level EAR Deployment Profile," you can also include the customization classes in the consuming application as a shared library.

Before you begin:

With the application containing the customization classes open in JDeveloper in the Default role, use the procedure described in Section 8.3.2.1, "Adding Customization Classes into a JAR," making sure that you select Shared Library JAR File as the type of archive to create.


Note:

This procedure describes how to create and use a shared library if you are deploying to Oracle Weblogic Server.


To create and use a shared library for your customization classes:

  1. In the Application Navigator, right-click the customization classes project, and choose Deploy > deployment-profile.

  2. In the Deploy wizard, select Deploy to a Weblogic Application Server and click Next.

  3. Select the appropriate application server, and click Finish.

    This makes the shared library available on the application server. You must now add a reference to the shared library from the consuming application.

  4. Open the application you want to customize in JDeveloper in the Default role.

  5. In the Application Resources panel of the Application Navigator, double-click the weblogic-application.xml file to open it.

  6. In the overview editor, click the Libraries tab.

  7. In the Shared Library References section, click the add icon.

  8. In the Library Name field of the newly created row in the Shared Library References table, enter the name of the customization classes shared library you deployed, and save your changes.

8.3.2.7 Viewing and Changing Deployment Profile Properties

After you have created a deployment profile, you can view and change its properties.

To view, edit, or delete a project's deployment profile:

  1. In the Application Navigator, right-click the project and choose Project Properties.

  2. In the Project Properties dialog, click Deployment.

    The Deployment Profiles list displays all profiles currently defined for the project.

  3. In the list, select a deployment profile.

  4. To edit or delete a deployment profile, click Edit or Delete.

8.3.3 How to Create and Edit Deployment Descriptors

Deployment descriptors are server configuration files that define the configuration of an application for deployment and that are deployed with the Java EE application as needed. The deployment descriptors that a project requires depend on the technologies the project uses and on the type of the target application server. Deployment descriptors are XML files that can be created and edited as source files, but for most descriptor types, JDeveloper provides dialogs or an overview editor that you can use to view and set properties. If you cannot edit these files declaratively, JDeveloper opens the XML file in the source editor for you to edit its contents.

In addition to the standard Java EE deployment descriptors (for example, application.xml and web.xml), you can also have deployment descriptors that are specific to your target application server. For example, if you are deploying to Oracle WebLogic Server, you can also have weblogic.xml, weblogic-application.xml, and weblogic-ejb-jar.xml.

For WebLogic Server, make sure that the application EAR file includes a weblogic-application.xml file that contains a reference to adf.oracle.domain, and that it includes an ADFApplicationLifecycleListener to clean up application resources between deployment and undeployment actions. Example 8-2 shows a sample weblogic-application.xml file.

Example 8-2 Sample weblogic-application.xml

<weblogic-application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-application.xsd"
 xmlns="http://www.bea.com/ns/weblogic/weblogic-application">
  <listener>
    <listener-class>oracle.adf.share.weblogic.listeners.
          ADFApplicationLifecycleListener</listener-class>
  </listener>
  <listener>
    <listener-class>oracle.mds.lcm.weblogic.WLLifecycleListener</listener-class>
  </listener>
  <library-ref>
    <library-name>adf.oracle.domain</library-name>
    </library-ref>
</weblogic-application>

If you are deploying web services, you may need to modify your weblogic-application.xml and web.xml files as described in the "How to Deploy Web Services to Oracle WebLogic Server" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

If you want to enable the application for Real User Experience Insight (RUEI) monitoring, you must add a parameter to the web.xml file, as described in Section 8.3.3.5, "Enabling the Application for Real User Experience Insight."

During deployment to WebLogic, the application's security properties are written to the weblogic-application.xml file to be deployed with the application in the EAR file.

Because the application server runs on Java EE 5, you may need to modify the application.xml and web.xml files to be compatible with the server.

For IBM WebSphere, the deployment descriptors are created at runtime and cannot be edited. Some of the relevant descriptors are shown in Table 8-1.

Table 8-1 IBM WebSphere Deployment Descriptors

WebSphereAction

ibm-application-bnd.xml

This references the security role just mapped in application.xml and maps it to the well-known name "AllAuthenticatedUsers". Similar to weblogic.xml for WebLogic Server. Maps the "valid-users" JEE security role to the well-known name "Users".

application.xml

A standard Java EE deployment description, but it is also used to populate a security mapping for the “valid-users” role (which is defined in web.xml when using ADF Security).

<EAR_ROOT>/META-INF/manifest.mf

References application-shared libraries such as adf.oracle.domain.

<EAR_ROOT>/META-INF/deployment.xml

References WAR-shared libraries such as adf.oracle.domain.webapp.


8.3.3.1 Creating Deployment Descriptors

JDeveloper automatically creates many of the required deployment descriptors for you. If they are not present, or if you need to create additional descriptors, you can explicitly create them.

Before you begin:

Check to see whether JDeveloper has already generated deployment descriptors.

To create a deployment descriptor:

  1. In the Application Navigator, right-click the project for which you want to create a descriptor and choose New.

  2. In the New Gallery, expand General, select Deployment Descriptors and then a descriptor type, and click OK.

    If you can't find the item you want, make sure that you chose the correct project, and then choose the All Technologies tab or use the Search field to find the descriptor. If the item is not enabled, check to make sure that the project does not already have a descriptor of that type. A project is allowed only one instance of a descriptor.

    JDeveloper starts the Create Deployment Descriptor wizard and then opens the file in the overview or source editor, depending on the type of deployment descriptor you choose.


Note:

For EAR files, do not create more than one deployment descriptor per application or workspace. These files are assigned to projects, but have application workspace scope. If multiple projects in an application have the same deployment descriptor, the one belonging to the launched project will supersede the others. This restriction applies to application.xml, weblogic-jdbc.xml, jazn-data.xml, and weblogic.xml.

The best place to create an application-level descriptor is in the Descriptors node of the Application Resources panel in the Application Navigator. This ensures that the application is created with the correct descriptors.


8.3.3.2 Viewing or Modifying Deployment Descriptor Properties

After you have created a deployment descriptor, you can change its properties by using JDeveloper dialogs or by editing the file in the source editor. The deployment descriptor is an XML file (for example, application.xml) typically located under the Application Sources node.

To view or change deployment descriptor properties:

  1. In the Application Navigator or in the Application Resources panel, double-click the deployment descriptor.

  2. In the editor window, select either the Overview tab or the Source tab, and configure the descriptor by setting property values.

    If the overview editor is not available, JDeveloper opens the file in the source editor.

8.3.3.3 Configuring the application.xml File for Application Server Compatibility

You may need to configure your application.xml file to be compliant with Java EE 5.


Note:

Typically, your project has an application.xml file that is compatible and you would not need to perform this procedure.


To configure the application.xml file:

  1. In the Application Navigator, right-click the project and choose New.

  2. In the New Gallery, expand General, select Deployment Descriptors and then Java EE Deployment Descriptor Wizard, and click OK.

  3. In the Select Descriptor page of the Create Java EE Deployment Descriptor dialog, select application.xml and click Next.

  4. In the Select Version page, select 5.0 and click Next.

  5. In the Summary page, click Finish.

  6. Edit the application.xml file with the appropriate values.

8.3.3.4 Configuring the web.xml File for Application Server Compatibility

You may need to configure your web.xml file to be compliant with Java EE 5 (which corresponds to servlet 2.5 and JSP 1.2).


Note:

Typically, your project has a web.xml file that is compatible and you would not need to perform this procedure. JDeveloper creates a starter web.xml file when you create a project.


To configure the web.xml file:

  1. In the Application Navigator, right-click the project and choose New.

  2. In the New Gallery, expand General, select Deployment Descriptors and then Java EE Deployment Descriptor Wizard, and click OK.

  3. In the Select Descriptor page of the Create Java EE Deployment Descriptor dialog, select web.xml and click Next.

  4. In the Select Version page, select 2.5 and click Next.

  5. In the Summary page, click Finish.

8.3.3.5 Enabling the Application for Real User Experience Insight

Real User Experience Insight (RUEI) is a web-based utility to report on real-user traffic requested by, and generated from, your network. It measures the response times of pages and transactions at the most critical points in the network infrastructure. Session diagnostics allow you to perform root-cause analysis.

RUEI enables you to view server and network times based on the real-user experience, to monitor your Key Performance Indicators (KPIs) and Service Level Agreements (SLAs), and to trigger alert notifications on incidents that violate their defined targets. You can implement checks on page content, site errors, and the functional requirements of transactions. Using this information, you can verify your business and technical operations. You can also set custom alerts on the availability, throughput, and traffic of all items identified in RUEI.

For more information about RUEI, see the Oracle Real User Experience Insight User's Guide at http://download.oracle.com/docs/cd/E16339_01/doc.60/e16359/toc.htm.

You must enable an application for RUEI by adding the context-param tag to the web.xml file shown in Example 8-3.

Example 8-3 Enabling RUEI Monitoring for an Application in web.xml

<context-param>
  <description>This parameter notifies ADF Faces that the 
               ExecutionContextProvider service provider is enabled.
               When enabled, this will start monitoring and aggregating
               user activity information for the client initiated
               requests. By default this param is not set or is false.
  </description>
  <param-name>
         oracle.adf.view.faces.context.ENABLE_ADF_EXECUTION_CONTEXT_PROVIDER
  </param-name>
  <param-value>true</param-value>
</context-param>

8.3.4 How to Deploy Applications with ADF Security Enabled

If you are developing an application in JDeveloper using Integrated WebLogic Server, application security deployment properties are configured by default, which means that the application and security credentials and policies will be overwritten each time you redeploy for development purposes.

8.3.4.1 Applications That Will Run Using Oracle Single Sign-On (SSO)

Before you can deploy and run the web application with ADF Security enabled on the application server, the administrator of the target server must configure the domain-level jps-config.xml file for the Oracle Access Manager (OAM) security provider. To assist with this configuration task, an Oracle WebLogic Scripting Tool (WLST) script has been provided with the JDeveloper install. You can also use this command for configuring WebSphere for OAM. For details about running this configuration script (with command addOAMSSOProvider(loginuri, logouturi, autologinuri)), see the procedure for configuring Oracle WebLogic Server for a web application using ADF Security, OAM SSO, and OPSS SSO in the Oracle Fusion Middleware Security Guide.

Running the configuration script ensures that the ADF Security framework defers to the OAM service provider to clear the SSO cookie token. OAM uses this token to save the identity of authenticated users and, unless it is cleared during logout, the user will be unable to log out.

After the system administrator runs the script on the target server, the domain jps-config.xml file will contain the following security provider definition that is specific for ADF Security:

<propertySet name="props.auth.uri">
    <property name="login.url.FORM" value="/${app.context}/adfAuthentication"/>
    <property name="logout.url" value=""/>
</propertySet>

Additionally, the authentication type required by SSO is CLIENT-CERT. The web.xml authentication configuration for the deployed application must specify the <auth-method> element as one of the following CLIENT-CERT types.

WebLogic supports two types of authentication methods:

  • For FORM-type authentication method, specify the elements like this:

    <login-config>
      <auth-method>CLIENT-CERT,FORM</auth-method>
      <realm-name>myrealm</realm-name>
      <form-login-config>
         <form-login-page>/login.html</form-login-page>
         <form-error-page>/error.html</form-error-page>
      </form-login-config>
    </login-config>
    
  • For BASIC-type authentication method, specify the elements like this:

    <login-config>
       <auth-method>CLIENT-CERT,BASIC</auth-method>
       <realm-name>myrealm</realm-name>
    </login-config>
    

WebSphere supports a single authentication method. Specify the elements like this:

<login-config>
  <auth-method>CLIENT-CERT</auth-method>
  <realm-name>myrealm</realm-name>
  <form-login-config>
     <form-login-page>/login.html</form-login-page>
     <form-error-page>/error.html</form-error-page>
  </form-login-config>
</login-config>

You can configure the web.xml file either before or after deploying the web application. For further details about setting up the authentication method for Single Sign-On, see the Oracle Fusion Middleware Security Guide.

8.3.4.2 Configuring Security for WebLogic Server

In a development environment, JDeveloper will automatically migrate application-level credentials, identities, and policies to the remote WebLogic Server instance only if the server is set up to be in development mode. Integrated WebLogic Server is set up in development mode by default. You can set up a remote WebLogic Server to be in development mode during Oracle WebLogic Server domain creation using the Oracle Fusion Middleware Configuration Wizard. For more information about configuring Oracle WebLogic Server domains, see Oracle Fusion Middleware Creating Domains Using the Configuration Wizard.

JDeveloper will not migrate application-level security credentials to WebLogic Server setup in production mode. Typically, in a production environment, administrators will use Enterprise Manager or WLST scripts to deploy an application, including its security requirements.

When you deploy an application to WebLogic Server, credentials (in the cwallet.sso and jazn-data.xml files) will either overwrite or merge with the WebLogic Server domain-level credential store, depending on whether a property in weblogic-application.xml is set to OVERWRITE or MERGE. In production-mode WebLogic Server, to avoid security risks, only MERGE is allowed. For development-mode WebLogic Server, you can set to OVERWRITE to test user names and passwords. You can set the mode by running setDomainEnv.cmd or setDomainEnv.sh with the following option added to the command (usually located in ORACLE_HOME/user_projects/domains/MyDomain/bin).

For setDomainEnv.cmd:

set EXTRA_JAVA_PROPERTIES=-Djps.app.credential.overwrite.allowed=true 
    %EXTRA_JAVA_PROPERTIES%

For setDomainEnv.sh:

EXTRA_JAVA_PROPERTIES="-Djps.app.credential.overwrite.allowed=true
     ${EXTRA_JAVA_PROPERTIES}"
export EXTRA_JAVA_PROPERTIES

If the Administration Server is already running, you must restart it for this setting to take effect.

You can check to see whether WebLogic Server is in production mode by using the Oracle WebLogic Server Administration Console or by verifying the following line in the WebLogic Server config.xml file:

<production-mode-enabled>true</production-mode-enabled>

By default, JDeveloper sets the application's credentials, identities, and policies to OVERWRITE. That is, the Application Policies, Credentials, and Users and Groups options are selected by default in the Application Properties dialog Deployment page. However, an application's credentials will be migrated only if the target WebLogic Server instance is set to development mode with -Djps.app.credential.overwrite.allowed=true

When your application is ready for deployment to a production environment, you should remove the identities from the jazn-data.xml file or disable the migration of identities by deselecting Users and Groups from the Application Properties dialog. Application credentials must be manually migrated outside of JDeveloper.


Note:

Before you migrate the jazn-data.xml file to a production environment, check that the policy store does not contain duplicate permissions for a grant. If a duplicate permission (one that has the same name and class) appears in the file, the administrator migrating the policy store will receive an error and the migration of the policies will be halted. You should manually edit the jazn-data.xml file to remove any duplicate permissions from a grant definition.


For more information about migrating application credentials and other jazn-data user credentials, see the Oracle Fusion Middleware Security Guide.

8.3.4.2.1 Applications with JDBC Data Source for WebLogic

If your application uses application-level JDBC data sources with password indirection for database connections, you may need to create credential maps in WebLogic Server to enable the database connection. For more information, see Section 8.3.7, "What You May Need to Know About JDBC Data Source for Oracle WebLogic Server."

8.3.4.3 Configuring Security for WebSphere Server

Applications with credentials and policies in the jazn-data.xml and cwallet.sso files can be migrated to WebSphere. You will need to perform additional tasks in WebSphere Be aware that the opss-application.xml file is not included in the application EAR file if it is intended for WebSphere.


Note:

Before you migrate the jazn-data.xml file to a production environment, check that the policy store does not contain duplicate permissions for a grant. If a duplicate permission (one that has the same name and class) appears in the file, the administrator migrating the policy store will receive an error and the migration of the policies will be halted. You should manually edit the jazn-data.xml file to remove any duplicate permissions from a grant definition.


For more information about setting up WebSphere to accept credentials and policies, see the Oracle Fusion Middleware Third-Party Application Server Guide.

8.3.4.3.1 Applications with JDBC Data Source for WebSphere

If your application uses application-level JDBC data sources with password indirection for database connections, you will need to create a JDBC data source in WebSphere. For more information, see the IBM WebSphere documentation.

8.3.4.3.2 Editing the web.xml File to Protect the Application Root for WebSphere

When you enable ADF Security for your web application, the web.xml file includes the Java EE security constraint allPages to protect the Java EE application root. By default, to support deploying to Oracle WebLogic Server, JDeveloper specifies the URL pattern for the security constraint as / (backslash). If you intend to deploy the application to IBM WebSphere, the correct URL pattern is /* (backslash-asterisk). Before you deploy the application to WebSphere, manually edit the web.xml file for your application to change the allPages security constraint as follows:

<security-constraint>
   <web-resource-collection>
      <web-resource-name>allPages</web-resource-name>
       <url-pattern>/*</url-pattern>
   </web-resource-collection>
   . . .
</security-constraint>

8.3.5 How to Replicate Memory Scopes in a Clustered Environment

If you are deploying an application that is intended to run in a clustered environment, you need to ensure that all managed beans with a lifespan longer than one request are serializable, and that the ADF framework is aware of changes to managed beans stored in ADF scopes (view scope and page flow scope).

For more information, see the "How to Set Managed Bean Memory Scopes in a Server-Cluster Environment" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

8.3.6 How to Enable the Application for ADF MBeans

An ADF application uses many XML files for setting configuration information. Some of these configuration files have ADF MBean counterparts that are deployed with the application. After the application has been deployed, you can change configuration properties by accessing the ADF MBeans using the Enterprise Manager Fusion Middleware Control MBean browser.

To enable ADF MBeans, you must register them in the web.xml file. Example 8-4 shows a web.xml file with listener entries for connections and configuration.

Example 8-4 Enabling ADF MBeans in the web.xml File

<listener>
   <listener-class>
        oracle.adf.mbean.share.connection.ADFConnectionLifeCycleCallBack
   </listener-class>
</listener>
<listener>
   <listener-class>
        oracle.adf.mbean.share.config.ADFConfigLifeCycleCallBack</listener-class>
</listener>

Additionally, the ADFConnection and ADFConfig MBeans require the application to be configured with an MDS repository. MDS configuration entries in the adf-config.xml file for a database-based MDS are shown in Example 8-5. For more information about configuring MDS, see the Oracle Fusion Middleware Administrator's Guide.

Example 8-5 MDS Configuration Entries in the adf-config.xml File

<adf-mds-config xmlns="http://xmlns.oracle.com/adf/mds/config">
   <mds-config xmlns="http://xmlns.oracle.com/mds/config" version="11.1.1.000">
      <persistence-config>
         <metadata-store-usages>
            <metadata-store-usage 
                default-cust-store="true" deploy-target="true" id="myStore">
            </metadata-store-usage>
         </metadata-store-usages>
      </persistence-config>
   </mds-config>
</adf-mds-config>

In a production environment, an MDS repository that uses a database is required. You can use JDeveloper, Enterprise Manager Fusion Middleware Control, or WLST commands to switch from a file-based repository to a database MDS repository.

Additionally, if several applications are sharing the same MDS configuration, you can ensure that each application has distinct customization layers by defining a adf:adf-properties-child property in the adf-config.xml file. JDeveloper automatically generates this entry when creating applications. If your adf-config.xml file does not have this entry, add it to the file with code similar to that of Example 8-6.

Example 8-6 Adding MDS Partition Code to the adf-config.xml File

<adf:adf-properties-child xmlns="http://xmlns.oracle.com/adf/config/properties">
     <adf-property name="adfAppUID" value="Application3-4434"/>
     <adf-property name="partition_customizations_by_application_id"
            value="true"/>
</adf:adf-properties-child> 

The value attribute is either generated by JDeveloper or you can set it to any unique identifier within the server farm where the application is deployed. This value can be set to the value attribute of the adfAppUID property.

When adf-property name is set to adfAppUid, then the corresponding value property should be set to the name of the application. By default, JDeveloper generates the value property using the application's package name. If the package name is not specified, JDeveloper generates the value property by using the workspace name and a four-digit random number.

For more information about configuring Oracle ADF applications using ADF MBeans, see the Oracle Fusion Middleware Administrator's Guide for Oracle Application Development Framework.

8.3.7 What You May Need to Know About JDBC Data Source for Oracle WebLogic Server

An Oracle ADF Java EE application can use a JDBC data source to connect to the database. You use the Oracle WebLogic Server Administration Console to configure a JDBC data source. A JDBC data source has three types: global, application level, and application level with password indirection. You generally set up a global JDBC data source in WebLogic Server. Any application that requires access to that database can use that JDBC data source. An application can also include application-level JDBC data sources. When the application is packaged for deployment, if the Auto Generate and Synchronize weblogic-jdbc.xml Descriptor During Deployment option is selected, JDeveloper creates a connection_name-jdbc.xml file for each connection that was defined. Each connection's information is written to the corresponding connection_name-jdbc.xml file (entries are also changed in weblogic-application.xml and web.xml). When the application is deployed to WebLogic Server, the server looks for application-level data source information before it looks for the global data source.

If the application is deployed with password indirection set to true, WebLogic Server will look for the connection_name-jdbc.xml file for user name information and it will then attempt to locate application-level credential maps for these user names to obtain the password. If you are using JDeveloper to directly deploy the application to WebLogic Server, JDeveloper automatically creates the credential map and populates the map to the server using an MBean call.

However, if you are deploying to an EAR file, JDeveloper will not be able to make the MBean call to WebLogic Server. You must set up the credential maps using the Oracle WebLogic Administration Console. Even if you have a global JDBC data source set up, if you do not also have credential mapping set up, WebLogic Server will not be able to map the credentials with passwords and the connection will fail. For more information about JDBC data sources, password indirection, and how to set up application credential mappings, see "JDBC Data Sources" in the "Deploying Applications" section of the JDeveloper online help.

For more information, see the "Preparing the Standalone Application Server for Deployment" section of the Oracle Fusion Middleware Administrator's Guide for Oracle Application Development Framework.

8.4 Deploying the Application

You can use JDeveloper to deploy applications directly to the standalone application server or create an archive file and use other tools to deploy to the application server.


Note:

Before you begin to deploy applications that use Oracle ADF to the standalone application server, you need to prepare the application server environment by performing tasks such as installing the ADF runtime and creating and extending domains or cells. For more information, see the "Preparing the Standalone Application Server for Deployment" section of the Oracle Fusion Middleware Administrator's Guide for Oracle Application Development Framework.


Table 8-2 describes some common deployment techniques that you can use during the application development and deployment cycle. The deployment techniques are listed in order from deploying on development environments to deploying on production environments. It is likely that in the production environment, the systemp administrators deploy applications by using Enterprise Manager Fusion Middleware Control or scripts.

Table 8-2 Deployment Techniques for Development or Production Environments

Deployment TechniqueEnvironmentWhen to Use

Run directly from JDeveloper

Test or Development

When you are developing your application. You want deployment to be quick because you will be repeating the editing and deploying process many times.

JDeveloper contains Integrated WebLogic Server, on which you can run and test your application.

Use JDeveloper to directly deploy to the target application server

Test or Development

When you are ready to deploy and test your application on an application server in a test environment.

On the test server, you can test features (such as LDAP and Oracle Single Sign-On) that are not available on the development server.

You can also use the test environment to develop your deployment scripts, for example, using Ant.

Use JDeveloper to deploy to an EAR file, then use the target application server's tools for deployment

Test or Development

When you are ready to deploy and test your application on an application server in a test environment. As an alternative to deploying directly from JDeveloper, you can deploy to an EAR file and then use other tools to deploy to the application server.

On the test server, you can test features (such as LDAP and Oracle Single Sign-On) that are not available on the development server.

You can also use the test environment to develop your deployment scripts, for example, using Ant.

Use Enterprise Manager or scripts to deploy applications

Production

When your application is in a test and production environment. In production environments, system administrators usually use Enterprise Manager or run scripts to deploy applications.


Any necessary MDS repositories must be registered with the application server. If the MDS repository is a database, the repository maps to a data source with MDS-specific requirements.

If you are deploying the application to Oracle WebLogic Server, make sure to target this data source to the WebLogic Administration Server and to all Managed Servers to which you are deploying the application. For more information about registering MDS, see the Oracle Fusion Middleware Administrator's Guide.

If you are using the application server's administrative consoles or scripts to deploy an application packaged as an EAR file that requires MDS repository configuration in adf-config.xml, you must run the getMDSArchiveConfig command to configure MDS before deploying the EAR file. MDS configuration is required if the EAR file contains a MAR file or if the application is enabled for DT@RT (Design Time At Run Time).

For more information about WLST commands, see the Oracle Fusion Middleware WebLogic Scripting Tool Command Reference. For more information about wsadmin commands, see the Oracle Fusion Middleware Third-Party Application Server Guide and the Oracle Fusion Middleware Configuration Guide for WebSphere.

If you plan to configure ADF connection information or adf-config.xml using ADF MBeans after the application has been deployed, make sure that the application is configured with MDS and that you have the MBean listeners enabled in the web.xml file. For more information, see Section 8.3.6, "How to Enable the Application for ADF MBeans."

8.4.1 How to Deploy to the Application Server from JDeveloper

Before you begin:

Create an application-level deployment profile that deploys to an EAR file.


Note:

When you are deploying to Oracle WebLogic Server from JDeveloper, ensure that the HTTP Tunneling property is enabled in the Oracle WebLogic Server Administration Console. This property is located under Servers > ServerName > Protocols. ServerName refers to the name of Oracle WebLogic Server.



Note:

JDeveloper does not support deploying applications to individual Managed Servers that are members of a cluster. You may be able to target one or more Managed Servers within a cluster using the Oracle WebLogic Server Administration Console or other Oracle WebLogic tools; however, the cluster can be negatively affected. For more information about deploying to Oracle WebLogic Server clusters, see the Oracle Fusion Middleware Administrator's Guide.


To deploy to the target application server from JDeveloper:

  1. In the Application Navigator, right-click the application and choose Deploy > deployment profile.

  2. In the Deploy wizard Deployment Action page, select Deploy to Application Server and click Next.

  3. In the Select Server page, select the application server connection.

  4. If you are deploying to a WebLogic Server instance, the WebLogic Options page appears. Select a deploy option and click Next.


    Note:

    If you are deploying an ADF application, do not use the Deploy to all instances in the domain option.


  5. Click Finish.

    During deployment, you can see the process steps displayed in the deployment Log window. You can inspect the contents of the modules (archives or exploded EAR) being created by clicking on the links that are provided in the log window. The archive or exploded EAR file will open in the appropriate editor or directory window for inspection.

    If the adf-config.xml file in the EAR file requires MDS repository configuration, the Deployment Configuration dialog appears for you to choose the target metadata repository or shared metadata repositories, as shown in Figure 8-3. The Repository Name dropdown list allows you to choose a target metadata repository from a list of metadata repositories registered with the Administration Server. The Partition Name dropdown list allows you to choose the metadata repository partition to which the application's metadata will be imported during deployment. You can use WLST/wsadmin scripts, Oracle WebLogic Server Administration Tool, or WebSphere Administrative Tool, respectively, to configure and register MDS. For more information about managing the MDS repository, see the Oracle Fusion Middleware Administrator's Guide.

    Figure 8-3 MDS Configuration and Customization for Deployment

    MDS configuration

    Note:

    If you are deploying a Java EE application, click the application menu next to the Java EE application in the Application Navigator.


    For more information on creating application server connections, see Section 8.3.1, "How to Create a Connection to the Target Application Server."


    Tip:

    You may get an exception in JDeveloper when trying to deploy large EAR files. The workaround is to deploy the application using the Oracle WebLogic Server Administration Console.


8.4.2 How to Create an EAR File for Deployment

You can also use the deployment profile to create an archive file (EAR file). You can then deploy the archive file using Enterprise Manager, WLST/wsadmin scripts, Oracle WebLogic Server Administration Console, or WebSphere Administrative Tool, respectively.

Although an Oracle ADF Java EE application is encapsulated in an EAR file (which usually includes WAR, MAR, and JAR components), it may have parts that are not deployed with the EAR.

To create an EAR archive file:

  • In the Application Navigator, right-click the application containing the deployment profile, and choose Deploy > deployment profile > to EAR file.

    If an EAR file is deployed at the application level, and it has dependencies on a JAR file in the data model project and dependencies on a WAR file in the view-controller project, then the files will be located in the following directories by default:

    • ApplicationDirectory/deploy/EARdeploymentprofile.EAR

    • ApplicationDirectory/ModelProject/deploy/JARdeploymentprofile.JAR

    • ApplicationDirectory/ViewControllerProject/deploy/WARdeploymentprofile.WAR


Tip:

Choose View >Log to see messages generated during the creation of the archive file.


8.4.3 How to Deploy New Customizations Applied to ADF LIbrary

If you have created new customizations for an ADF Library, you can use the MAR profile to deploy these customizations to any deployed application that consumes that ADF Library. For instance, applicationA, which consumes ADFLibraryB, was deployed to a remote application server. Later on, when new customizations are added to ADFLibraryB, you only need to deploy the updated customizations into applicationA. You do not need to repackage and redeploy the whole application, nor do you need to manually patch the MDS repository.


Note:

This procedure is for applying ADF Library customization changes to an application that has already been deployed to a remote application server. It is not for the initial packaging of customizations into a MAR that will eventually be a part of an EAR. For information about the initial packaging of the customization using a MAR, see Section 8.3.2.3, "Creating a MAR Deployment Profile."


To deploy ADF Library customizations, create a new MAR profile that includes only the customizations to be deployed and then use JDeveloper to:

  • Deploy the customizations directly into the MDS repository in the remote application server.

  • Deploy the customizations to a JAR. And then import the JAR into the MDS repository using tools such as the Fusion Middleware Control.

8.4.3.1 Exporting Customization to a Deployed Application

You can export the customizations directly from JDeveloper into the MDS repository for the deployed application on the remote application server.

Before you begin:

Create new customizations to the ADF Library using the deployer role in JDeveloper.

To export the customizations directly into the application server:

  1. In the Application Navigator, right-click the application and choose Deploy > metadata.

  2. In the Deploy Metadata dialog Deployment Action page, select Export to a Deployed Application and click Next.

    If the MAR profile is included in any of the application's EAR profiles, Export to a Deployed Application will be dimmed and disabled.

  3. In the Application Server page, select the application server connection and click Next.

  4. For WebLogic Server, the Server Instance page appears. In this page, select the server instance where the deployed application is located and click Next.

  5. In the Deployed Application page, select the application you want to apply the customizations to and click Next.

  6. In the Sandbox Instance page, if you want to deploy to a sandbox, select Deploy to an associated sandbox, choose the sandbox instance and click Next.

  7. In the Summary page, verify the information and click Finish.

8.4.3.2 Deploying Customizations to a JAR

When you deploy the ADF Library customizations to a JAR, you are packaging the contents as defined by the MAR profile.

Before you begin:

Create new customizations to the ADF Library using the deployer role in JDeveloper.

To deploy the customizations as a JAR

  1. In the Application Navigator, right-click the application and choose Deploy > metadata.

  2. In the Deploy Metadata dialog Deployment Action page, select Deploy to MAR.

  3. In the Summary page, click Finish.

  4. Use Enterprise Manager Fusion Middleware Control or the application server's administration tool to import the JAR into the MDS repository.

8.4.4 What You May Need to Know About ADF Libraries

An ADF Library is a JAR file that contains JAR services registered for ADF components such as ADF task flows, pages, or application modules. If you want the ADF components in a project to be reusable, you create an ADF Library deployment profile for the project and then create an ADF Library JAR based on that profile.

An application or project can consume the ADF Library JAR when you add it using the Resource Palette or manually by adding it to the library classpath. When the ADF Library JAR is added to a project, it will be included in the project's WAR file if the Deployed by Default option is selected.

For more information, see the "Reusing Application Components" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

8.4.5 What You May Need to Know About EAR Files and Packaging

When you package an Oracle ADF application into an EAR file, it can contain the following:

  • WAR files: Each web-based view-controller project should be packaged into a WAR file.

  • MAR file: If the application has customizations that are deployed with the application, it should be packaged into a MAR.

  • ADF Library JAR files: If the application consumes ADF Library JARs, these JAR files may be packaged within the EAR.

  • Other JAR files: The application may have other dependent JAR files that are required. They can be packaged within the EAR.

8.4.6 How to Deploy the Application Using Scripts and Ant

You can deploy the application using commands and automate the process by putting those commands in scripts. The ojdeploy command can be used to deploy an application without JDeveloper. You can also use Ant scripts to deploy the application. JDeveloper has a feature to help you build Ant scripts. Depending on your requirements, you may be able to integrate regular scripts with Ant scripts.

For more information about commands, scripts, and Ant, see the Oracle Fusion Middleware Administrator's Guide for Oracle Application Development Framework.

8.4.7 What You May Need to Know About JDeveloper Runtime Libraries

When an application is deployed, it includes some of its required libraries with the application. The application may also require shared libraries that have already been loaded to WebLogic Server as JDeveloper runtime libraries. It may be useful to know which JDeveloper libraries are packaged within which WebLogic Server shared library. For a listing of the contents of the JDeveloper runtime libraries, see the Oracle Fusion Middleware Administrator's Guide for Oracle Application Development Framework.

8.5 Postdeployment Configuration

After you have deployed your application to WebLogic Server, you can perform configuration tasks.

8.5.1 How to Migrate an Application

If you want to migrate an Oracle ADF Java EE application from one application server to another application server, you may need to perform some of the same steps you did for a first time deployment.

In general, to migrate an application, you would:

8.5.2 How to Configure the Application Using ADF MBeans

If ADF MBeans were enabled and packaged with the deployed application, you can configure ADF properties using the Enterprise Manager Fusion Middleware Control MBean Browser. For instructions to enable an application for MBeans, see Section 8.3.6, "How to Enable the Application for ADF MBeans."

For information on how to configure ADF applications using ADF MBeans, see the Oracle Fusion Middleware Administrator's Guide for Oracle Application Development Framework.

8.6 Testing the Application and Verifying Deployment

After you deploy the application, you can test it from Oracle WebLogic Server. To test-run your ADF application, open a browser window and enter a URL:

  • For non-Faces pages: http://<host>:port/<context root>/<page>

  • For Faces pages: http://<host>:port/<context root>/faces/<view_id>

    where <view_id> is the view ID of the ADF task flow view activity.


Tip:

The context root for an application is specified in the view-controller project settings by default as ApplicationName/ProjectName/context-root. You can shorten this name by specifying a name that is unique across the target application server. Right-click the view-controller project, and choose Project Properties. In the Project Properties dialog, select Java EE Application and enter a unique name for the context root.



Note:

/faces has to be in the URL for Faces pages. This is because JDeveloper configures your web.xml file to use the URL pattern of /faces in order to be associated with the Faces Servlet. The Faces Servlet does its per-request processing, strips out /faces part in the URL, then forwards the URL to the JSP. If you do not include the /faces in the URL, then the Faces Servlet is not engaged (since the URL pattern doesn't match). Your JSP is run without the necessary JSF per-request processing.


PKL PK4HwEOEBPS/using_bind_model.htm Using ADF Model Data Binding in a Java EE Web Application

2 Using ADF Model Data Binding in a Java EE Web Application

This chapter describes how to create ADF model data controls for EJB session beans and how to use the Data Controls panel to create databound UI components on JSF web pages.

This chapter includes the following sections:

For more comprehensive information about using ADF Model data binding, refer to the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

2.1 Introduction to ADF Model Data Binding

ADF Model implements two concepts that enable the decoupling of the user interface technology from the business service implementation: data controls and declarative bindings. Data controls abstract the implementation technology of a business service by using standard metadata interfaces to describe the bean's operations and data collections, including information about the properties, methods, and types involved. Using JDeveloper, you can view that information as icons which you can drag and drop onto a page. Using those icons, you can create databound HTML elements (for JSP pages), databound UI components (for JSF pages), and databound Swing UI components (for ADF Swing panels) by dragging and dropping them from the panel onto the visual editor for a page. JDeveloper automatically creates the metadata that describes the bindings from the page to the services. At runtime, the ADF Model layer reads the metadata information from the appropriate XML files for both the data controls and the bindings, and then implements the two-way connection between your user interface and your business services.

Declarative bindings abstract the details of accessing data from data collections in a data control and of invoking its operations. There are three basic kinds of declarative binding objects:

  • Executable bindings: Include iterator bindings, which simplify the building of user interfaces that allow scrolling and paging through collections of data and drilling-down from summary to detail information. Executable bindings also include bindings that allow searching and nesting a series of pages within another page.

  • Value bindings: Used by UI components that display data. Value bindings range from the most basic variety that work with a simple text field to more sophisticated list and tree bindings that support the additional needs of list, table, and tree UI controls.

  • Action bindings: Used by UI command components like hyperlinks or buttons to invoke built-in or custom operations on data collections or a data control without writing code.

Figure 2-1 shows how bindings connect UI components to data control collections and methods.

Figure 2-1 Bindings Connect UI Components to Data Controls

Bindings connect components to data

The group of bindings supporting the UI components on a page are described in a page-specific XML file called the page definition file. The ADF Model layer uses this file at runtime to instantiate the page's bindings. These bindings are held in a request-scoped map called the binding container. In a JSF application, the binding container is accessible during each page request using the EL expression #{bindings}.


Tip:

For more information about ADF EL expressions, see the "Creating ADF Data Binding EL Expressions" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.


To use the ADF Model layer to data-bind, you need to create a data control for your services. The data controls will then appear as icons in the Data Controls panel, which you can use to declaratively create pages whose components will be automatically bound to those services.

2.2 Exposing Services with ADF Data Controls

Once you have your application's services in place, you can use JDeveloper to create data controls that provide the information needed to declaratively bind UI components to those services. In a Java EE application, you normally create entity beans that represent tables in a database and then create a session facade over all the EJBs. This facade provides a unified interface to the underlying entities. In an ADF application, you can create a data control for the session bean, and that data control will contain representation of all the EJBs under the session bean. The data control consists of a number of XML metadata files that define the capabilities of the service that the bindings can work with at runtime.

For example, the Suppliers module uses the FOD database schema, which contains a number of relational database tables. The module has a number of entity beans that represent the tables in the schema used by the Suppliers module. There is an Addresses bean, a Product bean, a Persons bean, and so on. The module also contains two session beans: the SupplierFacade bean, which is used to access the beans created from tables, and the GenericServiceFacade bean, which contains generic service methods used by all beans in the application. A data control exists for each of those session beans, which allows developers to declaratively create UI pages using the data and logic contained in those beans.

2.2.1 How to Create ADF Data Controls

You create data controls from within the Application Navigator of JDeveloper.

Before you begin:

  1. Create JPA/EJB 3.0 entities. For more information, see the "Building a Persistence Tier" section of the JDeveloper online help.

  2. Create one or more session beans for the entities. For more information see the "Implementing Business Processes in Session Facade Design Pattern" section of the JDeveloper online help.

    When creating your entities and session bean(s), keep the following in mind:

    • For a class to be a valid data control source, it has to meet the JavaBeans specification. It needs to have a public default constructor.

    • Because the metadata files that represent the beans for the data control are named based on the class names for the beans, you must ensure that if beans have the same name, they are in different packages. If two beans with the same name are in the same package, one metadata file will overwrite the other.

    • If you rename the bean used to create a data control, you must re-create the data control.

To create a data control:

  1. In the Application Navigator, right-click the session bean for which you want to create a data control.

  2. From the context menu, select Create Data Control.

  3. In the Choose EJB Interface dialog, choose Local.

2.2.2 What Happens in Your Project When You Create a Data Control

When you create a data control based on an EJB session bean, the data control contains a representation of all the methods exposed on the bean, as well as underlying entity beans, and the methods and properties exposed on those.

For the data control to work directly with the service and the bindings, JDeveloper creates the following metadata XML files:

  • Data control definition file (DataControls.dcx). This file defines the factory class and ID for each data control. It also contains settings that determine how the data control behaves. For example, you can use the .dcx file to set global properties, such as whether the service supports transactions. To change the settings, you select the data control in the overview editor and change the value of the property in the Property Inspector. Figure 2-2 shows the DataControls.dcx file in the overview editor and Property Inspector of JDeveloper.

    Figure 2-2 DataControls.dcx File in the Overview Editor and Property Inspector

    dcx file values set in Property Inspector

    Example 2-1 shows the code from the corresponding XML file (available by clicking the source tab).

    Example 2-1 DataControls.dcx File

    <?xml version="1.0" encoding="UTF-8" ?>
    <DataControlConfigs xmlns="http://xmlns.oracle.com/adfm/configuration"
                        version="11.1.1.54.7" id="DataControls"
                        Package="oracle.fodemo.supplier.model">
      <AdapterDataControl id="SupplierFacadeLocal"
                       FactoryClass="oracle.adf.model.adapter.DataControlFactoryImpl"
                       ImplDef="oracle.adfinternal.model.adapter.ejb.EjbDefinition"
                       SupportsTransactions="false" SupportsSortCollection="true"
                       SupportsResetState="false" SupportsRangesize="false"
                       SupportsFindMode="false" SupportsUpdates="true"
                       Definition="oracle.fodemo.supplier.service.SupplierFacadeLocal"
                       BeanClass="oracle.fodemo.supplier.service.SupplierFacadeLocal"
                       xmlns="http://xmlns.oracle.com/adfm/datacontrol">
        <CreatableTypes>
          <TypeInfo FullName="oracle.fodemo.supplier.model.CountryCode"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.ProductCategory"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.Addresses"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.AddressUsage"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.Person"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.Supplier"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.Product"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.ProductImage"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.ProductTranslation"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.WarehouseStockLevel"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.OrderItem"/>
          <TypeInfo FullName="oracle.fodemo.supplier.model.LookupCode"/>
        </CreatableTypes>
        <Source>
          <ejb-definition ejb-version="3.0" ejb-name="SupplierFacade"
                          ejb-type="Session"
           ejb-business-interface="oracle.fodemo.supplier.service.SupplierFacadeLocal"
                          ejb-interface-type="local"
                       initial-context-factory="weblogic.jndi.WLInitialContextFactory"
          DataControlHandler="oracle.adf.model.adapter.bean.jpa.JPQLDataFilterHandler"
                          xmlns="http://xmlns.oracle.com/adfm/adapter/ejb"/>
        </Source>
      </AdapterDataControl>
      <AdapterDataControl id="GenericServiceFacadeLocal"
    . . .
      </AdapterDataControl>
    </DataControlConfigs>
    
  • Structure definition files for every entity object and structured object that this service exposes. These files define how attributes, accessors, and operations will display and behave. For example, you can set how the label for an attribute will display in a client. A structure definition file contains the following information:

    • Attributes: Describes the attributes available on the service. You can set UI hints that define how these attributes will display in the UI. You can also set other properties, such as whether the attribute value is required, whether it must be unique, and whether it is visible. For information about setting UI hints, see the "Defining Attribute Control Hints for View Objects" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.


      Note:

      View objects are ADF Business Components used to encapsulate SQL queries and to simplify working with the results. When reading this section, simply substitute "bean" for "view object."


      You can also set validation for an attribute and create custom properties. For more information, see the "Using the Built-in Declarative Validation Rules" and the "How to Implement Generic Functionality Driven by Custom Properties" sections of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

    • Accessors: Describes the different accessor methods.

    • Operations: Describes custom methods on the service, along with any parameters.

    Figure 2-3 shows the structure definition file for the Addresses bean in the Suppliers module.

    Figure 2-3 Structure File in the Overview Editor

    Structure file

    Example 2-2 shows the code from the corresponding XML file (available by clicking the source tab).

    Example 2-2 Structure File

    <?xml version="1.0" encoding="UTF-8" ?>
    <JavaBean xmlns="http://xmlns.oracle.com/adfm/beanmodel" version="11.1.1.54.7"
              id="Addresses" Package="oracle.fodemo.supplier.model"
              BeanClass="oracle.fodemo.supplier.model.Addresses" isJavaBased="true">
      <Attribute Name="address1" Type="java.lang.String" Precision="40">
        <Properties>
          <SchemaBasedProperties>
            <LABEL ResId="oracle.fodemo.supplier.model.Addresses.address1_LABEL"/>
            <TOOLTIP ResId="oracle.fodemo.supplier.model.Addresses.address1_TOOLTIP"/>
            <DISPLAYWIDTH Value="40"/>
          </SchemaBasedProperties>
        </Properties>
      </Attribute>
      <Attribute Name="address2" Type="java.lang.String" Precision="40">
        <Properties>
          <SchemaBasedProperties>
            <LABEL ResId="oracle.fodemo.supplier.model.Addresses.address2_LABEL"/>
            <TOOLTIP ResId="oracle.fodemo.supplier.model.Addresses.address2_TOOLTIP"/>
            <DISPLAYWIDTH Value="40"/>
          </SchemaBasedProperties>
        </Properties>
      </Attribute>
    . . .
      <AccessorAttribute id="addressUsageList" IsCollection="true"
                         RemoveMethod="removeAddressUsage"
                         AddMethod="addAddressUsage"
                         BeanClass="oracle.fodemo.supplier.model.AddressUsage"
                         CollectionBeanClass="UpdateableCollection">
        <Properties>
          <Property Name="RemoveMethod" Value="removeAddressUsage"/>
          <Property Name="AddMethod" Value="addAddressUsage"/>
        </Properties>
      </AccessorAttribute>
    . . .
      <MethodAccessor IsCollection="false"
                      Type="oracle.fodemo.supplier.model.AddressUsage"
                      BeanClass="oracle.fodemo.supplier.model.AddressUsage"
                      id="addAddressUsage" ReturnNodeName="AddressUsage">
        <ParameterInfo id="addressUsage"
                       Type="oracle.fodemo.supplier.model.AddressUsage"
                       isStructured="true"/>
      </MethodAccessor>
      <MethodAccessor IsCollection="false"
                      Type="oracle.fodemo.supplier.model.AddressUsage"
                      BeanClass="oracle.fodemo.supplier.model.AddressUsage"
                      id="removeAddressUsage" ReturnNodeName="AddressUsage">
        <ParameterInfo id="addressUsage"
                       Type="oracle.fodemo.supplier.model.AddressUsage"
                       isStructured="true"/>
      </MethodAccessor>
    . . .
      <ConstructorMethod IsCollection="true"
                         Type="oracle.fodemo.supplier.model.Addresses"
                         BeanClass="oracle.fodemo.supplier.model.Addresses"
                         id="Addresses">
        <ParameterInfo id="address1" Type="java.lang.String" isStructured="false"/>
        <ParameterInfo id="address2" Type="java.lang.String" isStructured="false"/>
        <ParameterInfo id="addressId" Type="java.lang.Long" isStructured="false"/>
        <ParameterInfo id="city" Type="java.lang.String" isStructured="false"/>
        <ParameterInfo id="countryId" Type="java.lang.String" isStructured="false"/>
        <ParameterInfo id="createdBy" Type="java.lang.String" isStructured="false"/>
        <ParameterInfo id="creationDate" Type="java.sql.Timestamp"
                       isStructured="false"/>
        <ParameterInfo id="lastUpdateDate" Type="java.sql.Timestamp"
                       isStructured="false"/>
        <ParameterInfo id="lastUpdatedBy" Type="java.lang.String"
                       isStructured="false"/>
        <ParameterInfo id="latitude" Type="java.lang.Long" isStructured="false"/>
        <ParameterInfo id="longitude" Type="java.lang.Long" isStructured="false"/>
        <ParameterInfo id="objectVersionId" Type="java.lang.Long"
                       isStructured="false"/>
        <ParameterInfo id="postalCode" Type="java.lang.String"
                       isStructured="false"/>
        <ParameterInfo id="stateProvince" Type="java.lang.String"
                       isStructured="false"/>
      </ConstructorMethod>
      <ConstructorMethod IsCollection="true"
                         Type="oracle.fodemo.supplier.model.Addresses"
                         BeanClass="oracle.fodemo.supplier.model.Addresses"
                         id="Addresses"/>
      <ResourceBundle>
        <PropertiesBundle xmlns="http://xmlns.oracle.com/adfm/resourcebundle"
                          PropertiesFile="oracle.fodemo.supplier.model.ModelBundle"/>
      </ResourceBundle>
    </JavaBean>
    

JDeveloper also adds the icons to the Data Controls panel that you can use to create databound UI components. The Data Controls panel lists all the data controls that have been created for the application's business services and exposes all the collections, methods, and built-in operations that are available for binding to UI components.


Tip:

If the Data Controls panel is not visible, see the "How to Open the Data Controls Panel" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework for instructions on opening the panel.


When a data control is created for a session bean, and that session bean was configured to contain an accessor method for the underlying beans, those beans appear as an accessor returned collection whose name matches the bean instance name. The Data Controls panel reflects the master-detail hierarchies in your data model by displaying detail data collections nested under their master data collection. For example, Figure 2-4 shows the Data Controls panel for the Suppliers module of the Fusion Order Demo application. Note that the Addresses, Person, and Product beans are all represented by accessor returned collections in the Data Controls panel.

The Data Controls panel also displays each service method on the session bean as a method icon whose name matches the method name. If a method accepts arguments, those arguments appear in a Parameters node as parameters nested inside the method's node. Objects that are returned by the methods appear as well, as shown in Figure 2-4.

Figure 2-4 Data Controls Panel

Sample Data Control Palette

Each returned collection or object displays any attributes and custom methods that were defined on the associated bean. Figure 2-5 shows the attributes and methods defined on the Supplier bean that is returned by the supplierFindAll accessor method.

Figure 2-5 Child Nodes to Returned Collections

Child nodes to the collections

By default, implicit view criteria are created for each attribute that is able to be queried on a bean. They appear as the All Queriable Attributes node under the Named Criteria node, as shown in Figure 2-5. This node is used to create quick search forms, as detailed in Chapter 7, "Creating Databound Search Forms."

As shown in Figure 2-5, the Operations node under a returned collection displays all its available built-in operations. If an operation accepts one or more parameters, then those parameters appear in a nested Parameters node. At runtime, when one of these data collection operations is invoked by name by the data binding layer, the data control delegates the call to an appropriate method on the bean interface to handle the built-in functionality. Most of the built-in operations affect the current row. Only the execute operation refreshes the data control itself. Following are the built-in operations:

  • Create: Creates a new row that becomes the current row, but does not insert it.

  • Delete: Deletes the current row.

  • Execute: Refreshes the data collection by executing or reexecuting the accessor method.

  • First: Sets the first row in the row set to be the current row.

  • Last: Sets the last row in the row set to be the current row.

  • Next: Sets the next row in the row set to be the current row.

  • Next Set: Navigates forward one full set of rows.

  • Previous: Sets the previous row in the row set to be the current row.

  • Previous Set: Navigates backward one full set of rows.

  • removeCurrentRowWithKey: Tries to find a row using the serialized string representation of the row key passed as a parameter. If found, the row is removed.

  • setCurrentRowWithKey: Tries to find a row using the serialized string representation of the row key passed as a parameter. If found, that row becomes the current row.

  • setCurrentRowWithKeyValue: Tries to find a row using the primary key attribute value passed as a parameter. If found, that row becomes the current row.


Note:

By default, JavaBeans assume the rowIndex as the key. If you do not explicitly define a key, the index will be used.


The Data Controls panel is a direct representation of the DataControls.dcx and structure definition files created when you created a data control. By editing the files, you can change the elements displayed in the panel.


Note:

Whenever changes are made to the underlying services, you need to manually refresh the data control in order to view the changes. To refresh the data control, click the Refresh icon in the header of the Data Controls panel.


2.3 Paginated Fetching of Data in EJB Data Controls

When you create an EJB or bean data control, you can determine how records are accessed from the database and whether to limit the number of records that are held in memory at a time.

There are the following possibilities for fetching and storing data in memory:

  • Scrollable access mode.

    If you accept the defaults when creating the data control, the data access mode is set to scrollable. This means that the data that your application needs to display is retrieved from the database as needed (in increments equal to the range size specified by the UI component's iterator) and stored in memory. Then, when the user scrolls forward through the application, additional rows are fetched as needed and stored in memory. All rows that have been fetched remain in memory.

    For example, if the running application contains a table that displays rows 1 through 20 on a web page and the table's iterator has a range size of 25 (the default), the data control will fetch the first 25 rows. If the user scrolls down to display rows 477 through 496 of the result set, the data will be fetched in sets of 25 as the user scrolls until rows 26 through 500 are fetched. At that point, a total of 500 rows will be stored in memory.

    This is the default mode for data controls using oracle.adf.model.adapter.bean.DataFilterHandler and oracle.adf.model.adapter.bean.jpa.JPQLDataFilterHandler. However, for data controls using oracle.adf.model.adapter.bean.DataFilterHandler, you still need to add paging methods to your data control to implement the access mode. For more information, see Section 2.3.6, "How To Manually Implement Pagination Support in a Bean Data Control."

  • Range paging access mode

    To limit the amount of records that are fetched and stored in memory at a time, you can use the rangePaging access mode. As with scrollable mode, range paging mode allows your applications to fetch data in increments. The main difference in range paging mode is that only the most recently fetched increment is retained in memory. So, for example, if the accessor iterator's rangeSize attribute is set to 25, no more than 25 records will be held in memory at any given time.

    In a range paging version of the scrollable example above, the data control would fetch rows 1 through 25 and hold them in memory in order to display rows 1 through 20. If the user scrolled down, the data control would fetch data in increments of 25 as the user was scrolling but release the previous 25 records from memory as it fetched a new range. By the time the user reached rows 477 through 496 as in the example above, only rows 476 through 500 would be in memory.

    When scrolling to a position that displays data from multiple increments, only the data from the increment last fetched is held in memory.


    Note:

    When you use range paging in a data control, the built-in navigation operation Last does not work on databound UI components created from that data control.


  • No pagination. When there is no pagination, all available data for a UI component is fetched. No pagination is implemented when the data control does not implement a data control handler, such as oracle.adf.model.adapter.bean.DataFilterHandler or oracle.adf.model.adapter.bean.jpa.JPQLDataFilterHandler. You can also use annotations to turn off paging for specific collections. For more information, see Section 2.3.4, "How to Specify Access Mode for Individual Objects in the Data Control."

  • Custom pagination. If the built-in pagination options do not suit your needs, you can implement your own pagination by implementing a custom handler class. For more information, see Section 2.3.7, "How to Implement a Custom Handler for Querying and Pagination."

For more information about access mode and data control handlers, see Section 2.3.3, "What You May Need to Know About the Scrollable and Range Paging Modes."

2.3.1 How to Change Paging Mode for a Data Control

If you want to change the paging mode for an EJB or bean data control, you can do so in the Data Controls panel.


Note:

For data controls using the oracle.adf.model.adapter.bean.DataFilterHandler or oracle.adf.model.adapter.bean.jpa.JPQLDataFilterHandler handler, the default access mode is scrollable.


Before you begin:

It may be helpful to have a general understanding of access modes for EJB and bean data controls. For more information, see Section 2.3, "Paginated Fetching of Data in EJB Data Controls.".

You need to complete this task:


Create an EJB or bean data control. For more information, see Section 2.2.1, "How to Create ADF Data Controls.".

To change paging mode for a data control:

  1. In the Data Controls panel, right-click the data control's node and choose Edit Definition.

  2. In the ejb-definition Properties or the bean-definition Properties dialog, select rangePaging or scrollable from the AccessMode dropdown list.

  3. If you are changing the data control to use range paging, make sure that the data control's FactoryClass property is specified as oracle.adf.model.adapter.bean.BeanDCFactoryImpl.

    You can access the FactoryClass property in the source editor for the DataControls.dcx file or in the Property Inspector that appears when you open DataControls.dcx in the source editor or overview editor.

2.3.2 How to Set Range Size for a Data Control that Uses Range Paging

When you set a data control's access mode to rangePaging, the data control determines the range size by reading the rangeSize property of the accessor iterator of each component that is bound to a collection in the data control.

To set the range size for a component:

  1. In the Application Navigator, select the page containing the component that is bound to the data control.

  2. In the Structure window, select the component that is bound to the data control collection.

  3. In the Property Inspector, expand the Behavior node, and set the rangeSize property to the desired value.

For more information on iterator bindings, see "Creating and Using Iterator Bindings" in Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

2.3.3 What You May Need to Know About the Scrollable and Range Paging Modes

Data controls that support scrollable and range paging modes rely on methods in the bean class to implement that functionality. The method that the data control uses depends on the data control handler class that the data control uses.

For JPA-based data controls, typically the JPQLDataFilterHandler handler is specified. JPQLDataFilterHandler relies on the presence of JPA queries and a queryByRange() method in the bean.

For non-JPA bean data controls (and for JPA-based bean and EJB data controls that do not have a queryByRange() method), DataFilterHandler is specified. To implement range paging in data controls that use this handler, you need to add code to your bean class as shown in Section 2.3.6, "How To Manually Implement Pagination Support in a Bean Data Control."

For data controls that do not have either of these handler classes (such as data controls that were generated in an earlier version of the IDE), there is no built-in support for scrollable or range paging.

2.3.4 How to Specify Access Mode for Individual Objects in the Data Control

If your data control encompasses multiple collections of different sizes, you may wish to set different access modes for some of the collections. You can do so by placing annotations on the accessor methods in the bean that the data control represents.

For the methods on which the annotations are used, the annotations override the access mode set for the data control. If an accessor method does not have such an annotation, it inherits its access mode from the one that is defined for the data control.

To specify access mode for individual objects in a bean or EJB data control:

  1. Open the bean class on which the data control is based.

  2. Add annotations for the accessor methods for which you want a different access mode than that generally specified for the data control.

    Example 2-3 shows the necessary import statements and the available annotations and how they can be used on a collection.

Example 2-3 Access Mode Annotations

import oracle.adf.model.adapter.bean.annotation.AccessMode;
import oracle.adf.model.adapter.bean.annotation.AccessModeType;

...
   * List with scrollable access
   */  
  @AccessMode(type=AccessModeType.SCROLLABLE)
  public List<Employees> getEmployees() {
 ...
   * List with range paging.
   */  
  @AccessMode(type=AccessModeType.RANGE_PAGING)
  public List<Employees> getEmployees() {
 ...
   * List with no paging.
   */  
  @AccessMode(type=AccessModeType.NO_PAGING)
  public List<Countries> getCountries() {
...

2.3.5 What You May Need to Know About Sorting Tables Based on Range Paginated Collections

By default, if a user sorts a table that is bound to a JPA-based data control, the ADF Model runtime forces the iterator to return all rows into memory for sorting, even if the back-end JPQL queries have already done the sort at the database level, which can cause memory problems if collection is too large. If you are using range paging for a collection, you can disable the ADF Model runtime full in-memory sort and have the data control handle it instead, based on just the currently selected range.

To use the data control to handle the sort for range paginated collections:

  1. In the Application Navigator, double-click the DataControls.dcx file to open it in the overview editor.

  2. In the overview editor, select the node for the data control that you want to edit.

  3. In the Property Inspector, set the ImplementsSort property to true.

2.3.6 How To Manually Implement Pagination Support in a Bean Data Control

With non-JPA data controls (or any bean data control that uses the oracle.adf.model.adapter.bean.jpa.DataFilterHandler handler), you need to add three methods for each collection in the session or service facade in order for the ADF Model runtime to implement scrollable paging and range paging. The method signatures should take the following form:

List<EntityBeanName> getEntityBeanNameList()
List<EntityBeanName> getEntityBeanNameList(int firstResult, int maxResults)
long getEntityBeanNameListSize()

2.3.7 How to Implement a Custom Handler for Querying and Pagination

If the built-in querying and paging options are not sufficient for your application, you can implement your own custom paging and querying behavior by providing your own data handler class for your data control.

To implement a custom handler for querying and pagination:

  1. Write a custom data control handler class and add it to the data control's project.

    You can sub-classes an existing handler, such as oracle.adf.model.adapter.bean.jpa.JPQLDataFilterHandler or oracle.adf.model.adapter.bean.DataFilterHandler. See Example 2-4 for an outline of a custom handler class.

  2. In the Source view of the DataControls.dcx file, type the fully-qualified class name of the handler as the value for the DataControlHandler attribute of each data control.

    DataControlHandler is an attribute of the ejb-definition element of EJB data controls and an attribute of the bean-definition element for bean data controls.

Example 2-4 Custom Data Control Handler

public class MyJPQLDataFilterHandler  extends JPQLDataFilterHandler
{
 public boolean invoke(Map bindingContext,
                                 OperationBinding action,
                                 DataFilter filter)
 {
    /** TODO: Developer provides custom criteria. */
 }
 
 public Object invoke(RowContext rowCtx, String name,
                               DataFilter filter)
 {
    /** TODO: Developer provides custom criteria. */
 } 
 
}

2.4 Using the Data Controls Panel

You can design a databound user interface by dragging an item from the Data Controls panel and dropping it on a page as a specific UI component. When you use data controls to create a UI component, JDeveloper automatically creates the various code and objects needed to bind the component to the data control you selected.

In the Data Controls panel, each object is represented by a specific icon. Table 2-1 describes what each icon represents, where it appears in the Data Controls panel hierarchy, and what components it can be used to create.

Table 2-1 The Data Controls Panel Icons and Object Hierarchy

IconNameDescriptionUsed to Create...

Data control icon.


Data Control

Represents a data control. You cannot use the data control itself to create UI components, but you can use any of the child objects listed under it. Depending on how your business services were defined, there may be more than one data control.

Serves as a container for the other objects, and is not used to create anything.

Accessor return icon.


Accessor Returned Collection

Represents an object returned by a bean-style accessor method on the business service. For example, if when you created a session bean, you chose to also create accessor methods for each of the Java entities under the session bean, then an accessor returned collection is displayed for each of those entities.

If an entity contains a relationship to another entity (for example, a foreign key), then a child accessor returned collection is shown for that entity In ADF, the relationship between parent and child entities is called a master-detail relationship.

The children under a collection may be attributes of the elements that make up the collection, operations on the entire collection, or operations on the row for each element in the collection.

For collections: forms, tables, trees, range navigation components, and master-detail widgets.

For single objects: forms, master-detail widgets, and selection lists.

For more information about creating forms, and navigation components, see Chapter 3, "Creating a Basic Databound Page."

For more information about creating tables, see Chapter 4, "Creating ADF Databound Tables."

For information about creating trees and other master-detail UI components, see Chapter 5, "Displaying Master-Detail Data."

For information about creating lists, see Chapter 6, "Creating Databound Selection Lists."

Attribute icon.


Attribute

Represents a discrete data element in an object (for example, an attribute in a row). Attributes appear as children under the collections or method returns to which they belong.

Label, text field, date and selection list components.

For information about creating text fields, see Section 3.2, "Using Attributes to Create Text Fields."

Method icon


Method

Represents an operation in the data control or one of its exposed structures that may accept parameters, perform some business logic, and optionally return a single value, a structure, or a collection of a single value and a structure.

Command components.

For methods that accept parameters: command components and parameterized forms.

For information about creating command components from methods, see Section 3.6, "Creating a Form to Edit an Existing Record."

For information about creating parameterized forms, see Section 3.5, "Creating a Form Using a Method That Takes Parameters."

Method return icon.


Method Return

Represents an object that is returned by a custom method. The returned object can be a single value or a collection.

A method return appears as a child under the method that returns it. The objects that appear as children under a method return can be attributes of the collection, other methods that perform actions related to the parent collection, or operations that can be performed on the parent collection.

For single values: text fields and selection lists.

For collections: forms, tables, trees, and range navigation components.

When a single-value method return is dropped, the method is not invoked automatically by the framework. A user either has to also create an invoke action as an executable, or drop the corresponding method as a button to invoke the method.

Data control operation icon.


Operation

Represents a built-in data control operation that performs actions on the parent object. Data control operations are located in an Operations node under collections or method returns. The operations that are children of a particular collection or method return operate on those objects only.

If an operation requires one or more parameters, they are listed in a Parameters node under the operation.

Command components such as buttons or links.

For information about creating command components from operations, see Section 3.4, "Incorporating Range Navigation into Forms."

Parameter icon.


Parameter

Represents a parameter value that is declared by the method or operation under which it appears. Parameters appear in the Parameters node under a method or operation.

Label, text, and selection list components.


2.4.1 How to Use the Data Controls Panel

JDeveloper provides you with a predefined set of UI components from which to choose for each data control item you drop.

To use the Data Controls panel to create UI components:

  1. Select an item in the Data Controls panel and drag it onto the visual editor for your page. For a definition of each item in the panel, see Table 2-1.

  2. From the ensuing context menu, select a UI component.

    When you drag an item from the Data Controls panel and drop it on a page, JDeveloper displays a context menu of all the default UI components available for the item you dropped.

    Figure 2-6 shows the context menu displayed when an accessor returned collection from the Data Controls panel is dropped on a page.

    Figure 2-6 Data Controls Panel Context Menu

    Data Control Palette Context Menu

    Depending on the component you select from the context menu, JDeveloper may display a dialog that enables you to define how you want the component to look.

    The resulting UI component appears in the JDeveloper visual editor, as shown in Figure 2-7.

    Figure 2-7 Databound UI Component: ADF Table

    Sample databound UI component

Tip:

Instead of creating automatically bound UI components using the Data Controls panel, you can create your UI first and then bind the components to the ADF Model layer. For more information, see the "Using Simple UI First Development" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.


2.4.2 What Happens When You Use the Data Controls Panel to Create UI Components

When a web application is built using the Data Controls panel, JDeveloper does the following:

  • Creates a DataBindings.cpx file in the default package for the project (if one does not already exist), and adds an entry for the page.

    DataBindings.cpx files define the binding context (a container object that holds a list of available data controls and data binding objects) for the application. Each DataBindings.cpx file maps individual pages to the binding definitions in the page definition file and registers the data controls used by those pages. Figure 2-8 shows a DataBindings.cpx file in the overview editor of JDeveloper.

    Figure 2-8 DataBindings.cpx File in the Overview Editor

    cpx file

    Example 2-5 shows the code from the corresponding XML file.

    Example 2-5 DataBindings.cpx File

    <?xml version="1.0" encoding="UTF-8" ?>
    <Application xmlns="http://xmlns.oracle.com/adfm/application"
                 version="11.1.1.54.7" id="DataBindings" SeparateXMLFiles="false"
                 Package="oracle.fodemo.supplier" ClientType="Generic"
                 ErrorHandlerClass="oracle.fodemo.frmwkext.CustomErrorHandlerImpl">
      <definitionFactories>
        <factory nameSpace="http://xmlns.oracle.com/adf/controller/binding"
                 className="oracle.adf.controller.internal.binding.
                                                      TaskFlowBindingDefFactoryImpl"/>
        <dtfactory className="oracle.adf.controller.internal.dtrt.binding.
                                                             BindingDTObjectFactory"/>
      </definitionFactories>
      <pageMap>
        <page path="/templates/StoreFrontTemplate.jspx"
              usageId="oracle_fodemo_supplier_StoreFrontTemplatePageDef"/>
        <page path="/browse.jspx" usageId="oracle_fodemo_supplier_browsePageDef"/>
        <page path="/supplier/supplierDetails.jspx"
              usageId="oracle_fodemo_supplier_supplierdetailPageDef"/>
        <page path="/login_error.jspx"
              usageId="oracle_fodemo_supplier_login_errorPageDef"/>
    . . .
      </pageMap>
      <pageDefinitionUsages>
        <page id="oracle_fodemo_supplier_StoreFrontTemplatePageDef"
              path="templates.StoreFrontTemplatePageDef"/>
        <page id="oracle_fodemo_supplier_browsePageDef"
              path="oracle.fodemo.supplier.pageDefs.browsePageDef"/>
        <page id="oracle_fodemo_supplier_supplierdetailPageDef"
              path="oracle.fodemo.supplier.pageDefs.supplierdetailPageDef"/>
        <page id="oracle_fodemo_supplier_login_errorPageDef"
              path="oracle.fodemo.supplier.pageDefs.login_errorPageDef"/>
    . . .
      </pageDefinitionUsages>
      <dataControlUsages>
        <dc id="GenericServiceFacadeLocal"
            path="oracle.fodemo.supplier.model.GenericServiceFacadeLocal"/>
        <dc id="SupplierFacadeLocal"
            path="oracle.fodemo.supplier.model.SupplierFacadeLocal"/>
      </dataControlUsages>
    </Application>
    

    For more information about the .cpx file, see the "Working with the DataBindings.cpx File" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

  • Creates the adfm.xml file in the META-INF directory. This file creates a registry for the DataBindings.cpx file, and is used by the applications metadata layer to allow customization and personalization of the application. Example 2-6 shows an example of an adfm.xml file.

    Example 2-6 adfm.xml File

    <MetadataDirectory xmlns="http://xmlns.oracle.com/adfm/metainf"
                       version="11.1.1.0.0">
      <DataBindingRegistry path="oracle/fodemo/supplier/DataBindings.cpx"/>
    </MetadataDirectory>
    
  • For web applications, registers the ADF binding filter in the web.xml file.

    The ADF binding filter preprocesses any HTTP requests that may require access to the binding context. For more information about the filter, see the "Configuring the ADF Binding Filter" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

  • Adds the following libraries to the project:

    • ADF Model Runtime

    • ADF Model Generic Runtime

  • Adds a page definition file (if one does not already exist for the page) to the page definition subpackage. The default subpackage is view.pageDefs in the adfmsrc directory.

    The page definition file (pageNamePageDef.xml) defines the ADF binding container for each page in an application's view layer. The binding container provides runtime access to all the ADF binding objects. Figure 2-9 shows a page definition file in the overview editor of JDeveloper.

    Figure 2-9 Page Definition File

    Page definition file
  • Configures the page definition file, which includes adding definitions of the binding objects referenced by the page. Example 2-7 shows the corresponding XML for a page definition.

    Example 2-7 Page Definition File

    <pageDefinition xmlns="http://xmlns.oracle.com/adfm/uimodel"
                    version="11.1.1.54.43" id="browsePageDef"
                    Package="oracle.fodemo.supplier.pageDefs">
      <parameters/>
      <executables>
        <variableIterator id="variables"/>
        <page path="templates.StoreFrontTemplatePageDef" id="pageTemplateBinding"
              Refresh="ifNeeded"/>
        <iterator Binds="root" RangeSize="25" DataControl="SupplierFacadeLocal"
                  id="SupplierFacadeLocalIterator"/>
        <accessorIterator MasterBinding="SupplierFacadeLocalIterator"
                          Binds="productFindAll" RangeSize="25"
                          DataControl="SupplierFacadeLocal"
                          BeanClass="oracle.fodemo.supplier.model.Product"
                          id="productFindAllIterator" Refresh="ifNeeded"/>
        <searchRegion Criteria="__ImplicitViewCriteria__"
                      Customizer="oracle.jbo.uicli.binding.JUSearchBindingCustomizer"
                      Binds="productFindAllIterator"
                      id="ImplicitViewCriteriaQuery" />
      </executables>
      <binding9Ps>
        <tree IterBinding="productFindAllIterator" id="productFindAll">
          <nodeDefinition DefName="oracle.fodemo.supplier.model.Product"
                          Name="productFindAll0">
            <AttrNames>
              <Item Value="productId"/>
              <Item Value="productName"/>
              <Item Value="costPrice"/>
              <Item Value="listPrice"/>
              <Item Value="minPrice"/>
              <Item Value="productStatus"/>
            </AttrNames>
          </nodeDefinition>
        </tree>
        <methodAction id="removeProduct" RequiresUpdateModel="true"
                      Action="invokeMethod" MethodName="removeProduct"
                      IsViewObjectMethod="false" DataControl="SupplierFacadeLocal"
                      InstanceName="SupplierFacadeLocal.dataProvider">
          <NamedData NDName="product"
                  NDValue="${bindings.productFindAllIterator.currentRow.dataProvider}"
                     NDType="oracle.fodemo.supplier.model.Product"/>
        </methodAction>
        <action IterBinding="productFindAllIterator" id="Delete"
                RequiresUpdateModel="false" Action="removeCurrentRow"/>
      </bindings>
    </pageDefinition>
    

    For more information about the page definition file, see the "Working with Page Definition Files" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

  • Adds prebuilt components to the view page.

    These prebuilt components include ADF data bindings that reference the binding objects in the page definition file. Example 2-8 shows a JSF page that contains components that have been bound using ADF Model data binding. Note that values of the output text components are bound to values of the productsFindAll binding object, as defined in the page definition file in Example 2-7.

    Example 2-8 JSF Page with ADF Model Data Binding

    .
    .
    .
    <af:column sortProperty="costPrice" sortable="false"
               headerText="#{bindings.productFindAll.hints.costPrice.label}"
               id="c6" align="right">
      <af:outputText value="#{row.costPrice}" id="ot1">
        <af:convertNumber groupingUsed="false"
                         pattern="#{bindings.productFindAll.hints.costPrice.format}"/>
      </af:outputText>
    </af:column>
    <af:column sortProperty="listPrice" sortable="false"
               headerText="#{bindings.productFindAll.hints.listPrice.label}"
               id="c1" align="right">
      <af:outputText value="#{row.listPrice}" id="ot6">
        <af:convertNumber groupingUsed="false"
                         pattern="#{bindings.productFindAll.hints.listPrice.format}"/>
      </af:outputText>
    </af:column>
    <af:column sortProperty="minPrice" sortable="false"
               headerText="#{bindings.productFindAll.hints.minPrice.label}"
               id="c3" align="right">
      <af:outputText value="#{row.minPrice}" id="ot3">
        <af:convertNumber groupingUsed="false"
                          pattern="#{bindings.productFindAll.hints.minPrice.format}"/>
      </af:outputText>
    </af:column>.
    .
    .
    .
    
  • For applications that use ADF Faces, adds all the files, and configuration elements required by ADF Faces components. For more information, see the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.

2.4.3 What Happens at Runtime

When a page contains ADF bindings, at runtime the interaction with the business services initiated from the client or controller is managed by the application through the binding context. The binding context is a runtime map (named data and accessible through the EL expression #{data}) of all data controls and page definitions within the application.

The ADF lifecycle creates the ADF binding context from the DataControls.dcx, DataBindings.cpx, and page definition files, as shown in Figure 2-10. The DataControls.dcx file defines the data controls available to the application at design time, while the DataBindings.cpx files define what data controls are available to the application at runtime. A DataBindings.cpx file lists all the data controls that are being used by pages in the application and maps the binding containers, which contain the binding objects defined in the page definition files, to web page URLs, or in the case of a Java Swing application, the Java class. The page definition files define the binding objects used by the application pages. There is one page definition file for each page.

Figure 2-10 ADF Binding File Runtime Usage

dcx, cpx, page def make up binding context

The binding context does not contain real live instances of these objects. Instead, the map first contains references that become data control or binding container objects on demand. When the object (such as the page definition) is released from the application (for example when a task flow ends or when the binding container or data control is released at the end of the request), data controls and binding containers turn back into reference objects. For more information, see the "Understanding the Fusion Page Lifecycle" chapter of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

2.4.4 What You May Need to Know About Iterator Result Caching

When a data control modifies a collection, the data control must instantiate a new instance of the collection in order for the ADF Model layer to understand that it has been modified. In other words, although some action in the client may change the collection, that change will not be reflected in the UI unless a new instance of the collection is created. However, for performance reasons, accessor and method iterators cache their results set (by default, the cacheResults attribute on the iterator is set to true). This setting means that the iterator is refreshed and a new instance of the collection is created only when the page is first rendered. The iterator is not refreshed when the page is revisited, for example, if the page is refreshed using partial page rendering, or if the user navigates back to the page.

For example, say you want to allow sorting on a table on your page. Because you want the page to refresh after the sort, you add code to the listener for the sort event that will refresh the table using partial page rendering (for more information, see the "Rendering Partial Page Content" chapter of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework). Because the instance of the collection for the table has already been instantiated and is cached, the accessor iterator will not reexecute, which means that a new instance of the collection with the new sort order will not be created, so the sort order on the page will remain the same.

To work around this issue, you can either configure the iterator so that it does not cache the results, or you can place a button on the page that can be used to reexecute the iterator when the page is refreshed. If your page does not have a button whose action attribute can be bound to a method, then you can use an invokeAction executable that will be invoked whenever the page is refreshed.


Note:

If your page uses the navigation operations to navigate through the collection, do not set CacheResults to false, as that navigation will no longer work. You must use a button to reexecute the iterator. For more information about the navigation operations, see Section 3.4, "Incorporating Range Navigation into Forms."



Performance Tip:

If you set an iterator to not cache its result set, and that result set is a collection that may return a large number of rows, performance will be negatively affected. For large result sets, you should use an invokeAction.


To set an iterator to not cache its result set:

  1. Open the page definition file, and in the Structure window, select the iterator whose results should not be cached.

  2. In the Property Inspector, expand the Advanced section and set CacheResults to false.

To use a button to reexecute the iterator:

  1. From the ADF Faces page of the Component Palette, drag and drop a Button onto the page.

  2. In the Structure window, right click the button and in the context menu, choose Bind to ADF Control.

  3. In the Bind to ADF Control dialog, expand the accessor associated with the iterator to reexecute, expand that accessor's Operations node, and select Execute.

To use an invokeAction to reexecute the iterator:

  1. Open the page definition file, and in the Structure window, right-click executables and choose Insert inside executables > invokeAction.

  2. In the Insert invokeAction dialog, set id to a unique name. Use the Binds dropdown list to select the iterator to be reexecuted.

  3. With the newly created invokeAction still selected, in the Property Inspector, set Refresh to prepareModel.

    This setting will cause the accessor method to be invoked during the Prepare Model phase. This refreshes the binding container.

  4. Set RefreshCondition to an EL expression that will cause the refresh to happen only if any value has actually changed. If this condition is not set, the invokeAction will be called twice.

    For example, the expression #{(userState.refresh) and (!adfFacesContext.postback)} will cause the refresh to happen only if the page is refreshed.

    For more information about the page lifecycle phases and using the refresh and refreshCondition attributes, see "The JSF and ADF Page Lifecycle" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

2.4.5 What You May Need to Know About Configuring Validation

You can set validation on the attribute bindings in a page definition file. When a user edits or enters data in a field for an attribute for which validation has been defined, and submits the form, the bound data is validated against the configured rules and conditions. If validation fails, the application displays an error message. For information and procedures on setting model layer validation, see the "Adding ADF Model Layer Validation" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

When you set validation, you can define the error message that will be displayed. By default, these messages are displayed in a client dialog. You can configure these messages to display inline instead. For more information, see the "Displaying Error Messages" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

You can also change the way messages are handled by creating your own error handling class. For more information, see the "Customizing Error Handling" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

PK099PK4HwEOEBPS/databound_table.htm Creating ADF Databound Tables

4 Creating ADF Databound Tables

This chapter describes how to use the Data Controls panel to create basic databound tables that are based on ADF Faces components, including editable tables and input tables.

This chapter includes the following sections:

4.1 Introduction to Adding Tables

Unlike forms, tables allow you to display more than one data object from a collection returned by an accessor at a time. Figure 4-1 shows a table on the browse page of the Suppliers module, with the products returned from the search.

Figure 4-1 Results Table Displays Products That Match the Search Criteria

table of products on the browse page

You can create tables that simply display data, or you can create tables that allow you to edit or create data. Once you drop an accessor as a table, you can add command buttons bound to actions that execute some logic on a selected row. You can also modify the default components to suit your needs.

4.2 Creating a Basic Table

Unlike with forms where you bind the individual UI components that make up a form to the individual attributes on the collection, with a table you bind the ADF Faces table component to the complete collection or to a range of n data objects at a time from the collection. The individual components used to display the data in the columns are then bound to the attributes. The iterator binding handles displaying the correct data for each object, while the table component handles displaying each object in a row. JDeveloper allows you to do this declaratively, so that you don't need to write any code.

4.2.1 How to Create a Basic Table

To create a table using a data control, you bind the table component to a returned collection. JDeveloper allows you to do this declaratively by dragging and dropping a collection from the Data Controls panel.


Tip:

You can also create a table by dragging a table component from the Component Palette and completing the Create ADF Faces Table wizard. For more information, see the "How to Display a Table on a Page" section of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.


To create a databound table:

  1. From the Data Controls panel, select a collection.

    For example, to create a simple table in the Suppler module that displays products in the system, you would select the productFindAll accessor collection.

  2. Drag the collection onto a JSF page, and from the context menu, choose the appropriate table.

    When you drag the collection, you can choose from the following types of tables:

    • ADF Table: Allows you to select the specific attributes you need your editable table columns to display, and what UI components to use to display the data. By default, ADF inputText components are used for most attributes, thus enabling the table to be editable. Attributes that are dates use the inputDate component. Additionally, if a control type control hint has been created for an attribute, or if the attribute has been configured to be a list, then the component set by the hint is used instead. For more information about setting control hints, see the "Defining Attribute Control Hints for View Objects" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework

    • ADF Read-Only Table: Same as the ADF Table; however, each attribute is displayed in an outputText component.

    • ADF Read-Only Dynamic Table: Allows you to create a table when the attributes returned and displayed are determined dynamically at runtime. This component is helpful when the attributes for the corresponding object are not known until runtime, or you do not wish to hardcode the column names in the JSF page.

  3. The ensuing Edit Table Columns dialog shows each attribute in the collection, and allows you to determine how these attributes will behave and appear as columns in your table.


    Note:

    If the collection contains a structured attribute (an attribute that is neither a Java primitive type nor a collection), the attributes of the structured attributes will also appear in the dialog.


    Using this dialog, you can do the following:

    • Allow the ADF Model layer to handle selection by selecting the Row Selection checkbox. Selecting this option means that the iterator binding will access the iterator to determine the selected row. Select this option unless you do not want the table to allow selection.

    • Allow the ADF Model layer to handle column sorting by selecting the Sorting checkbox. Selecting this option means that the iterator binding will access the iterator, which will perform an order-by query to determine the order. Select this option unless you do not want to allow column sorting.

    • Allow the columns in the table to be filtered using entered criteria by selecting the Filtering checkbox. Selecting this option allows the user to enter criteria in text fields above each column. That criteria is then used to build a Query-by-Example (QBE) search on the collection, so that the table will display only the results returned by the query. For more information, see Section 7.5, "Creating Standalone Filtered Search Tables."

    • Group columns for selected attributes together under a parent column, by selecting the desired attributes (shown as rows in the dialog), and clicking the Group button. Figure 4-2 shows how two grouped columns appear in the visual editor after the table is created.

      Figure 4-2 Grouped Columns in an ADF Faces Table

      You can group columns together
    • Change the display label for a column by entering text or an EL expression to bind the label value to something else, for example, a key in a resource file. By default, the label is bound to the labels property for any control hint defined for the attribute on the table binding. This binding allows you to change the value of a label text one time in the structure file, and have the change propagate to all pages that display the label.

    • Change the value binding for a column by selecting a different attribute to bind to. If you simply want to rearrange the columns, you should use the order buttons. If you do change the attribute binding for a column, the label for the column also changes.

    • Change the UI component used to display an attribute using the dropdown menu. The UI components are set based on the table you selected when you dropped the collection onto the page, on the type of the corresponding attribute (for example, inputDate components are used for attributes that are dates), and on whether or not default components were set as control hints in the Java class's structure file.


      Tip:

      If one of the attributes for your table is also a primary key, you may want to choose a UI component that will not allow a user to change the value.



      Tip:

      If you want to use a component that is not listed in the dropdown menu, use this dialog to select the outputText component, and then manually add the other tag to the page.


    • Change the order of the columns using the order buttons.

    • Add a column using the Add icon. There's no limit to the number of columns you can add. When you first click the icon, JDeveloper adds a new column line at the bottom of the dialog and populates it with the values from the first attribute in the bound collection; subsequent new columns are populated with values from the next attribute in the sequence, and so on.

    • Delete a column using the Delete icon.

  4. Once the table is dropped on the page, you can use the Property Inspector to set other display properties of the table. For example, you may want to set the width of the table to a certain percentage or size. For more information about display properties, see the "Using Tables and Trees" chapter of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.


    Tip:

    When you set the table width to 100%, the table will not include borders, so the actual width of the table will be larger. To have the table set to 100% of the container width, expand the Style section of the Property Inspector, select the Box tab, and set the Border Width attribute to 0 pixels.


  5. If you want the user to be able to edit information in the table and save any changes, you need to provide a way to submit and persist those changes. For more information, see Section 4.3, "Creating an Editable Table." For procedures on creating tables that allow users to input data, see Section 4.4, "Creating an Input Table."

4.2.2 What Happens When You Create a Table

Dropping a table from the Data Controls panel has the same effect as dropping a text field or form. Briefly, JDeveloper does the following:

  • Creates the bindings for the table and adds the bindings to the page definition file

  • Adds the necessary code for the UI components to the JSF page

For more information, see Section 3.2.2, "What Happens When You Create a Text Field."

4.2.2.1 Iterator and Value Bindings for Tables

When you drop a table from the Data Controls panel, a tree value binding is created. A tree consists of a hierarchy of nodes, where each subnode is a branch off a higher level node. In the case of a table, it is a flattened hierarchy, where each attribute (column) is a subnode off the table. Like an attribute binding used in forms, the tree value binding references the accessor iterator binding, while the accessor iterator binding references the iterator for the data control, which facilitates iterating over the data objects in the collection. Instead of creating a separate binding for each attribute, only the tree binding to the table node is created. In the tree binding, the AttrNames element within the nodeDefinition element contains a child element for each attribute that you want to be available for display or reference in each row of the table.

The tree value binding is an instance of the FacesCtrlHierBinding class that extends the core JUCtrlHierBinding class to add two JSF specific properties:

  • collectionModel: Returns the data wrapped by an object that extends the javax.faces.model.DataModel object that JSF and ADF Faces use for collection-valued components like tables.

  • treeModel: Extends collectionModel to return data that is hierarchical in nature. For more information, see Chapter 5, "Displaying Master-Detail Data."

Example 4-1 shows the value binding for the table created when you drop the productFindAll accessor collection. For simplicity, only a few of the attributes from the collection are shown.

Example 4-1 Value Binding Entries for a Table in the Page Definition File

<bindings>
  <tree IterBinding="productFindAllIterator" id="productFindAll">
    <nodeDefinition DefName="oracle.fodemo.supplier.model.Product">
      <AttrNames>
        <Item Value="productId"/>
        <Item Value="productName"/>
        <Item Value="costPrice"/>
        <Item Value="listPrice"/>
        <Item Value="minPrice"/>
        <Item Value="productStatus"/>
        <Item Value="shippingClassCode"/>
        <Item Value="warrantyPeriodMonths"/>
      </AttrNames>
    </nodeDefinition>
  </tree>
</bindings>

Only the table component needs to be bound to the model (as opposed to the columns or the text components within the individual cells), because only the table needs access to the data. The tree binding for the table drills down to the individual structure attributes in the table, and the table columns can then derive their information from the table component.

4.2.2.2 Code on the JSF Page for an ADF Faces Table

When you use the Data Controls panel to drop a table onto a JSF page, JDeveloper inserts an ADF Faces table component, which contains an ADF Faces column component for each attribute named in the table binding. Each column then contains another component (such as an inputText or outputText component) bound to the attribute's value. Each column's heading is bound to the labels property for the control hint of the attribute.


Tip:

If an attribute is marked as hidden in the associated structure file, no corresponding UI is created for it.


Example 4-2 shows a simplified code excerpt from a table created by dropping the productFindAll accessor collection as a read-only table.

Example 4-2 Simplified JSF Code for an ADF Faces Table

<af:table value="#{bindings.productFindAll.collectionModel}" var="row"
          rows="#{bindings.productFindAll.rangeSize}"
          emptyText="#{bindings.productFindAll.viewable ? 'No data to display.' :
                                                                'Access Denied.'}"
          fetchSize="#{bindings.productFindAll.rangeSize}"
          rowBandingInterval="0" id="t1">
  <af:column sortProperty="productId" sortable="false"
             headerText="#{bindings.productFindAll.hints.productId.label}"
             id="c1">
    <af:outputText value="#{row.productId}" id="ot8">
      <af:convertNumber groupingUsed="false"
                     pattern="#{bindings.productFindAll.hints.productId.format}"/>
    </af:outputText>
  </af:column>
  <af:column sortProperty="productName" sortable="false"
             headerText="#{bindings.productFindAll.hints.productName.label}"
             id="c4">
    <af:outputText value="#{row.productName}" id="ot7"/>
  </af:column>
. . .
</af:table>

The tree binding iterates over the data exposed by the iterator binding. Note that the table's value is bound to the collectionModel property, which accesses the collectionModel object. The table wraps the result set from the iterator binding in a collectionModel object. The collectionModel allows each item in the collection to be available within the table component using the var attribute.

In the example, the table iterates over the rows in the current range of the productFindAll accessor binding. This binding binds to a row set iterator that keeps track of the current row. When you set the var attribute on the table to row, each column then accesses the current data object for the current row presented to the table tag using the row variable, as shown for the value of the af:outputText tag:

<af:outputText value="#{row.productId}"/>

When you drop an ADF Table (as opposed to an ADF Read-Only Table), instead of being bound to the row variable, the value of the input component is implicitly bound to a specific row in the binding container through the bindings property, as shown in Example 4-3. Additionally, JDeveloper adds validator and converter components for each input component. By using the bindings property, any raised exception can be linked to the corresponding binding object or objects. The controller iterates through all exceptions in the binding container and retrieves the binding object to get the client ID when creating FacesMessage objects. This retrieval allows the table to display errors for specific cells. This strategy is used for all input components, including selection components such as lists.

Example 4-3 Using Input Components Adds Validators and Converters

<af:table value="#{bindings.productFindAll.collectionModel}" var="row"
          rows="#{bindings.productFindAll.rangeSize}"
          emptyText="#{bindings.productFindAll.viewable ? 'No data to display.' 
                                                             : 'Access Denied.'}"
          fetchSize="#{bindings.productFindAll.rangeSize}"
          rowBandingInterval="0"
         selectedRowKeys="#{bindings.productFindAll1.collectionModel.selectedRow}"
         selectionListener="#{bindings.productFindAll1.collectionModel.
                                                           makeCurrent}"
          rowSelection="single"
          filterModel="#{bindings.productFindAllQuery.queryDescriptor}"
          queryListener="#{bindings.productFindAllQuery.processQuery}"
          filterVisible="true" varStatus="vs" id="t1">
  <af:column sortProperty="productId" sortable="false"
             headerText="#{bindings.productFindAll.hints.productId.label}"
             id="c5">
    <af:inputText value="#{row.bindings.productId.inputValue}"
                  label="#{bindings.productFindAll.hints.productId.label}"
                  required="#{bindings.productFindAll.hints.productId.mandatory}"
                 columns="#{bindings.productFindAll.hints.productId.displayWidth}"
              maximumLength="#{bindings.productFindAll.hints.productId.precision}"
                  shortDesc="#{bindings.productFindAll.hints.productId.tooltip}"
                  id="it4">
       <f:validator binding="#{row.bindings.productId.validator}"/>
       <af:convertNumber groupingUsed="false"
                     pattern="#{bindings.productFindAll.hints.productId.format}"/>
     </af:inputText>
   </af:column>
. . .
</af:table>

For more information about using ADF Faces validators and converters, see the "Validating and Converting Input" chapter of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.

Table 4-1 shows the other attributes defined by default for ADF Faces tables created using the Data Controls panel.

Table 4-1 ADF Faces Table Attributes and Populated Values

AttributeDescriptionDefault Value

rows

Determines how many rows to display at one time.

An EL expression that, by default, evaluates to the rangeSize property of the associated iterator binding, which determines how many rows of data are fetched from a data control at one time. Note that the value of the rows attribute must be equal to or less than the corresponding iterator's rangeSize value, as the table cannot display more rows than are returned. For more information about the rangeSize property, see Section 3.4.2.2, "Iterator RangeSize Attribute."

emptyText

Text to display when there are no rows to return.

An EL expression that evaluates to the viewable property on the iterator. If the table is viewable, the attribute displays No data to display when no objects are returned. If the table is not viewable (for example, if there are authorization restrictions set against the table), it displays Access Denied.

fetchSize

Number of rows of data fetched from the data source.

An EL expression that, by default, evaluates to the rangeSize property of the associated iterator binding. For more information about the rangeSize property, see Section 3.4.2.2, "Iterator RangeSize Attribute." This attribute can be set to a larger number than the rows attribute.

selectedRowKeys

The selection state for the table.

An EL expression that, by default, evaluates to the selected row on the collection model.

selectionListener

Reference to a method that listens for a selection event.

An EL expression that, by default, evaluates to the makeCurrent method on the collection model.

rowSelection

Determines whether rows are selectable.

Set to single to allow one row to be selected at a time.

Column Attributes



sortProperty

Determines the property by which to sort the column.

Set to the column's corresponding attribute binding value.

sortable

Determines whether a column can be sorted.

Set to false. When set to true, the iterator binding will access the iterator to determine the order.

headerText

Determines the text displayed at the top of the column.

An EL expression that, by default, evaluates to the label control hint set on the corresponding attribute.


4.2.3 What You May Need to Know About Setting the Current Row in a Table

When you use tables in an application and you allow the ADF Model layer to manage row selection, the current row is determined by the iterator. When a user selects a row in an ADF Faces table, the row in the table is shaded, and the component notifies the iterator of the selected row. To do this, the selectedRowKeys attribute of the table is bound to the collection model's selected row, as shown in Example 4-4.

Example 4-4 Selection Attributes on a Table

<af:table value="#{bindings.Products1.collectionModel}" var="row"
.
.
.
          selectedRowKeys="#{bindings.Products.collectionMvodel.selectedRow}"
          selectionListener="#{bindings.Products.collectionModel.
                                                               makeCurrent}"
          rowSelection="single">

This binding binds the selected keys in the table to the selected row of the collection model. The selectionListener attribute is then bound to the collection model's makeCurrent property. This binding makes the selected row of the collection the current row of the iterator.


Note:

If you create a custom selection listener, you must create a method binding to the makeCurrent property on the collection model (for example, #{binding.Products.collectionModel.makeCurrent}) and invoke this method binding in the custom selection listener before any custom logic.


Although a table can handle selection automatically, there may be cases where you need to programmatically set the current row for an object on an iterator.

You can call the getKey() method on any view row to get a Key object that encapsulates the one or more key attributes that identify the row. You can also use a Key object to find a view row in a row set using the findByKey(). At runtime, when either the setCurrentRowWithKey or the setCurrentRowWithKeyValue built-in operation is invoked by name by the data binding layer, the findByKey() method is used to find the row based on the value passed in as a parameter before the found row is set as the current row.

The setCurrentRowWithKey and setCurrentRowWithKeyValue operations both expect a parameter named rowKey, but they differ precisely by what each expects that rowKey parameter value to be at runtime:

The setCurrentRowWithKey Operation

setCurrentRowWithKey expects the rowKey parameter value to be the serialized string representation of a view row key. This is a hexadecimal-encoded string that looks like this:

000200000002C20200000002C102000000010000010A5AB7DAD9

The serialized string representation of a key encodes all of the key attributes that might comprise a view row's key in a way that can be conveniently passed as a single value in a browser URL string or form parameter. At runtime, if you inadvertently pass a parameter value that is not a legal serialized string key, you may receive exceptions like oracle.jbo.InvalidParamException or java.io.EOFException as a result. In your web page, you can access the value of the serialized string key of a row by referencing the rowKeyStr property of an ADF control binding (for example. #{bindings.SomeAttrName.rowKeyStr}) or the row variable of an ADF Faces table (for example, #{row.rowKeyStr}).

setCurrentRowWithKeyValue

The setCurrentRowWithKeyValue operation expects the rowKey parameter value to be the literal value representing the key of the view row. For example, its value would be simply "201" to find product number 201.

4.3 Creating an Editable Table

You can create a table that allows the user to edit information within the table, and then commit those changes to the data source. To do this, you use operations that can modify data records associated with the returned collection (or the data control itself) to create command buttons, and place those buttons in a toolbar in the table. For example, the table in the browse.jspx page has a button that allows the user to remove a product. While this button currently causes a dialog to display that allows the user to confirm the removal, the button could be bound to a method that directly removes the product.


Tip:

To create a table that allows you to insert a new record into the data store, see Section 4.4, "Creating an Input Table."


As with editable forms, it is important to note that the ADF Model layer is not aware that any row has been changed until a new instance of the collection is presented. Therefore, you need to invoke the execute operation on the accessor iterator in order for any changes to be committed. For more information, see Section 2.4.4, "What You May Need to Know About Iterator Result Caching."

When you decide to use editable components to display your data, you have the option of having the table displaying all rows as editable at once, or having it display all rows as read-only until the user double-clicks within the row. Figure 4-3 shows a table whose rows all have editable fields. The page is rendered using the components that were added to the page (for example, inputText, inputDate, and inputNumberSpinbox components).

Figure 4-3 Table with Editable Fields

shipping details table with all rows editable

Figure 4-2 shows the same table, but configured so that the user must double-click (or single-click if the row is already selected) a row in order to edit or enter data. Note that outputText components are used to display the data in the nonselected rows, even though the same input components as in Figure 4-3 were used to build the page. The only row that actually renders those components is the row selected for editing.

Figure 4-4 Click to Edit a Row

shipping details table

For more information about how ADF Faces table components handle editing, see the "Editing Data in Tables, Trees, and Tree Tables" section of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.

4.3.1 How to Create an Editable Table

To create an editable table, you follow procedures similar to those for creating a basic table, then you add command buttons bound to operations. However, in order for the table to contain a toolbar, you need to add an ADF Faces component that associates the toolbar with the items in the collection used to build the table.

To create an editable table:

  1. From the Data Controls panel, select the collection to display in the table.

    For example, to create a simple table in the Suppliers module that will allow you to edit suppliers in the system, you would select the supplierFindAll accessor collection.

  2. Drag the accessor onto a JSF page, and from the context menu, choose ADF Table.

  3. Use the ensuing Edit Table Columns dialog to determine how the attributes should behave and appear as columns in your table. Be sure to select the Row Selection checkbox, which will allow the user to select the row to edit.

    For more information about using this dialog to configure the table, see Section 4.2, "Creating a Basic Table."

  4. With the table selected in the Structure window, expand the Behavior section of the Property Inspector and set the EditingMode attribute. If you want all the rows to be editable select editAll. If you want the user to click into a row to make it editable, select clickToEdit.

  5. From the Structure window, right-click the table component and select Surround With from the context menu.

  6. In the Surround With dialog, ensure that ADF Faces is selected in the dropdown list, select the Panel Collection component, and click OK.

    The panelCollection component's toolbar facet will hold the toolbar which, in turn, will hold the command components used to update the data.

  7. In the Structure window, right-click the panelCollection's toolbar facet folder, and from the context menu, choose Insert inside toolbar > Toolbar.

    This creates a toolbar that already contains a default menu which allows users to change how the table is displayed, and a Detach link that detaches the entire table and displays it such that it occupies the majority of the space in the browser window. For more information about the panelCollection component, see the "Displaying Table Menus, Toolbars, and Status Bars" section of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.

  8. From the Data Controls panel, select the method or operation associated with the collection of objects on which you wish to execute the logic, and drag it onto the toolbar component in the Structure window. This will place the databound command component inside the toolbar.

    For example, if you want to be able to remove a supplier record, you would drag the removeSuppliers(Suppliers) method. Figure 4-5 shows the remove methods in the Suppliers module.

    Figure 4-5 Operations Associated with a Collection

    Navigation operations in the DCP
  9. For the context menu, choose Operations > ADF Toolbar Button.

    Because the method takes parameters, the Action Binding Editor opens, asking you to set the value of the parameters.

  10. In the Edit Action Binding dialog, you need to populate the value for the method's parameter. For the remove methods (and the other default methods), this is the selected object.

    1. In the Parameters section, use the Value dropdown list to select Show EL Expression Builder.

    2. In the Expression Builder, expand the node for the accessor's iterator, then expand the currentRow node, and select dataProvider.

      This will create an EL expression that evaluates to the data for the current row in the accessor's iterator.

    3. Click OK.

    For example, if you created a table using the suppliersFindAll accessor, then JDeveloper would have created an accessorIterator binding named suppliersFindAllIterator. You would need to select the dataProvider object for the current row under that iterator, as shown in Figure 4-8. This reference means that the parameter value will resolve to the value of the currently selected row.

    Figure 4-6 dataProvider for the Current Row on the suppliersFindAllIterator Binding

    dataProvider for Current Row on suppliersFindAllIterator
  11. To notify the ADF Model layer that the collection has been modified, you need to also bind the toolbar button to a method that will refresh the iterator.

    1. Open the page definition for the JSPX file by right-clicking the file and choosing Go to Page Definition.

    2. In the Structure Window for the page definition, right-click bindings and choose Insert inside bindings > Generic Bindings > action.

    3. In the Create Action Binding dialog, use the Select an Iterator dropdown list to select the iterator associated with the collection, and for Operation, select Execute.

      JDeveloper creates an action binding for the execute operation of the iterator. You now need to have your command button call this operation.

  12. In the JSF page, select the command component created when you dropped the method in Step 10. In the Property Inspector, set Action to the following:

    #{bindings.Execute.execute}
    

    When the command component is clicked, the binding to the action attribute is evaluated after the binding for the actionListener attribute. This order ensures iterator refreshes and/or executes after the deletion of entity.

4.3.2 What Happens When You Create an Editable Table

Creating an editable table is similar to creating a form used to edit records. Action bindings are created for the operations dropped from the Data Controls panel. For more information, see Section 3.6.2, "What Happens When You Use Methods to Change Data."

4.4 Creating an Input Table

You can create a table that allows users to insert a new blank row into a table and then add values for each column (any default values set on the corresponding entity object will be automatically populated).

4.4.1 How to Create an Input Table

When you create an input table, you want the user to see the new blank row in the context of the other rows within the current row set. To allow this insertion, you need to use the create operation associated with the accessor for the collection. For example, to create a table that allows users to create new suppliers, you would create a table from the supplierFindAll accessor collection and then add a button using the create operation for the supplierFindAll accessor collection.

Because the create operation only creates a row in the cache, you also need to add a button that actually merges the newly created row into the collection. Figure 4-7 shows how this table might look with a new row created.

Figure 4-7 User Can Create Suppliers in This Input Table

input table for suppliers

ADF Faces components can be set so that one component refreshes based on an interaction with another component, without the whole page needing to be refreshed. This is known as partial page rendering. When the user clicks the button to create the new row, you want the table to refresh to display that new row. To have that happen, you need to configure the table to respond to that user action.

Before you begin:

You need to create an editable table, as described in Section 4.3, "Creating an Editable Table."

To create an input table:

  1. From the Data Controls panel, drag the create operation associated with the dropped collection and drop it as a toolbar button into the toolbar.


    Tip:

    You may want to change the ID to something more recognizable, such as Create. This will make it easier to identify when you need to select it as the partial trigger.


  2. In the Structure window, select the table component.

  3. In the Property Inspector, expand the Behavior section, click the dropdown menu for the PartialTriggers attribute, and select Edit.

  4. In the Edit Property dialog, expand the toolbar facet for the panelCollection component and then expand the toolbar that contains the Create command component. Select that component and shuttle it to the Selected panel. Click OK. This sets that component to be the trigger that will cause the table to refresh.

  5. Create a button that allows the user to merge the new object(s) into the collection. From the Data Controls panel, drag the merge method associated with the collection used to create the table, and drop it as a toolbar button or link into the toolbar.


    Tip:

    If you will want the user to be able to continue updating the row after it is persisted, then you should create the button using the persist method instead. For more information, see Section 3.6.3, "What You May Need to Know About the Difference Between the Merge and Persist Methods."


    Figure 4-8 shows merge method for the Suppliers collection.

    Figure 4-8 Merge Methods in the Data Controls Panel

    The Commit operation is nested under the Operators folder.

4.4.2 What Happens When You Create an Input Table

When you use the create operation to create an input table, JDeveloper:

  • Creates an iterator binding for the collection, an action binding for the create operation, and attribute bindings for the table. The create operation is responsible for creating the new row in the row set. If you created command buttons or links using the merge method, JDeveloper also creates an action binding for that method.

  • Inserts code in the JSF page for the table for the ADF Faces components.

Example 4-5 shows the page definition file for an input table created from the Supplier collection (some attributes were deleted in the Edit Columns dialog when the collection was dropped).

Example 4-5 Page Definition Code for an Input Table

<executables>
  <variableIterator id="variables"/>
  <iterator Binds="root" RangeSize="25" DataControl="SessionEJBLocal"
            id="SessionEJBLocalIterator"/>
  <accessorIterator MasterBinding="SessionEJBLocalIterator"
                    Binds="suppliersFindAll" RangeSize="25"
                    DataControl="SessionEJBLocal" BeanClass="model.Suppliers"
                    id="suppliersFindAllIterator"/>
</executables>
<bindings>
  <action IterBinding="suppliersFindAllIterator" id="Create"
          RequiresUpdateModel="true" Action="createRow"/>
  <methodAction id="mergeSuppliers" RequiresUpdateModel="true"
                Action="invokeMethod" MethodName="mergeSuppliers"
                IsViewObjectMethod="false" DataControl="SessionEJBLocal"
                InstanceName="SessionEJBLocal.dataProvider"
                ReturnName="SessionEJBLocal.methodResults.mergeSuppliers_
                            SessionEJBLocal_dataProvider_mergeSuppliers_result">
    <NamedData NDName="suppliers"
               NDValue="#{bindings.Create.currentRow.dataProvider}"
               NDType="model.Suppliers"/>
  </methodAction>
  <tree IterBinding="suppliersFindAllIterator" id="suppliersFindAll">
    <nodeDefinition DefName="model.Suppliers">
      <AttrNames>
        <Item Value="email"/>
        <Item Value="phoneNumber"/>
        <Item Value="supplierId"/>
        <Item Value="supplierName"/>
        <Item Value="supplierStatus"/>
      </AttrNames>
    </nodeDefinition>
  </tree>
</bindings>

Example 4-6 shows the code added to the JSF page that provides partial page rendering, using the Create Supplier and Commit New Suppliers command toolbar button as the triggers to refresh the table.

Example 4-6 Partial Page Trigger Set on a Command Button for a Table

<af:form id="f1">
  <af:panelCollection id="pc1">
    <f:facet name="menus"/>
    <f:facet name="toolbar">
      <af:toolbar id="t2">
        <af:commandToolbarButton actionListener="#{bindings.Create.execute}"
                                 text="Create New Supplier"
                                 disabled="#{!bindings.Create.enabled}"
                                 id="ctb1"/>
        <af:commandToolbarButton
                               actionListener="#{bindings.mergeSuppliers.execute}"
                               text="Commit New Suppliers"
                               disabled="#{!bindings.mergeSuppliers.enabled}"
                               id="ctb2"/>
      </af:toolbar>
    </f:facet>
    <f:facet name="statusbar"/>
    <af:table value="#{bindings.suppliersFindAll.collectionModel}"
              var="row" rows="#{bindings.suppliersFindAll.rangeSize}"
              emptyText="#{bindings.suppliersFindAll.viewable ? 'No data to
                                                  display.' : 'Access Denied.'}"
              fetchSize="#{bindings.suppliersFindAll.rangeSize}"
              rowBandingInterval="0"
              selectedRowKeys=
                        "#{bindings.suppliersFindAll.collectionModel.selectedRow}"
              selectionListener=
                  "#{bindings.suppliersFindAll.collectionModel.makeCurrent}"
              rowSelection="single" id="t1"
              partialTriggers="::ctb1 ::ctb2">
      <af:column sortProperty="supplierId" sortable="false"
                 headerText=
                    "#{bindings.suppliersFindAll.hints.supplierId.label}"
                 id="c6">
        <af:inputText value="#{row.bindings.supplierId.inputValue}"
                      label="#{bindings.suppliersFindAll.hints.supplierId.label}"
                required="#{bindings.suppliersFindAll.hints.supplierId.mandatory}"
              columns="#{bindings.suppliersFindAll.hints.supplierId.displayWidth}"
           maximumLength="#{bindings.suppliersFindAll.hints.supplierId.precision}"
                 shortDesc="#{bindings.suppliersFindAll.hints.supplierId.tooltip}"
                 id="it4">
          <f:validator binding="#{row.bindings.supplierId.validator}"/>
          <af:convertNumber groupingUsed="false"
                  pattern="#{bindings.suppliersFindAll.hints.supplierId.format}"/>
        </af:inputText>
      </af:column>
.
.
.
    </af:table>
  </af:panelCollection>
</af:form>

4.4.3 What Happens at Runtime: How Create and Partial Page Refresh Work

When the button bound to the create operation is invoked, the action executes, and a new instance for the collection is created as the page is rerendered. Because the button was configured to be a trigger that causes the table to refresh, the table redraws with the new empty row shown at the top. When the user clicks the button bound to the merge method, the newly created rows in the row set are inserted into the database. For more information about partial page refresh, see the "Rendering Partial Page Content" chapter in the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.

4.4.4 What You May Need to Know About Creating a Row and Sorting Columns

If your table columns allow sorting, and the user has sorted on a column before inserting a new row, then that new row will not be sorted. To have the column sort with the new row, the user must first sort the column opposite to the desired sort, and then re-sort. This is because the table assumes the column is already sorted, so clicking on the desired sort order first will have no effect on the column.

For example, say a user had sorted a column in ascending order, and then added a new row. Initially, that row appears at the top. If the user first clicks to sort the column again in ascending order, the table will not re-sort, as it assumes the column is already in ascending order. The user must first sort on descending order and then ascending order.

If you want the data to automatically sort on a specific column in a specific order after inserting a row, then programmatically queue a SortEvent after the commit, and implement a handler to execute the sort.

4.5 Modifying the Attributes Displayed in the Table

Once you use the Data Controls panel to create a table, you can then delete attributes, change the order in which they are displayed, change the component used to display them, and change the attribute binding for the component. You can also add new attributes, or rebind the table to a new data control.

For more information about modifying existing UI components and bindings, see the "Modifying the Attributes Displayed in the Table" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

PKAziPK4HwEOEBPS/index.htm Index

Index

A  B  C  D  E  F  I  J  L  M  N  O  P  Q  R  S  T  U  V  W 

Numerics

4GL development
described, 1.2

A

ADF. See Oracle ADF
Accessors element, 5.4.2.2
Action Binding Editor, 4.3.1
action bindings
enabled property, 3.4.2.3
for iterator bindings, 3.6.2.1
for operations, 3.4.2.1
actionListener attribute
command buttons for methods, 3.6.2.2
See also action listeners
ADF binding container
at runtime, 2.4.3
introduced, 2.1
page definition file, and, 2.4.2
ADF binding context
about, 2.4.3
DataBindings.cpx and, 2.4.2
defined, 2.4.2
ADF binding filter, 2.4.2
ADF bindings
at runtime, 2.4.3
files for, 2.2.2
introduced, 2.1
ADF Controller
overview, 1.1
ADF data controls. See data controls
ADF Faces
overview, 1.1
ADF Faces components
creating
commandButton components, 3.6.2.2
tree components, creating, 5.4
treeTable components, creating, 5.5
ADF Form. See forms
ADF Input Text widget. See text fields
ADF Input Text with a Label widget. See text fields
ADF Label widget. See text fields
ADF Master Form, Detail Form. See master-detail objects
ADF Master Form, Detail Table. See master-detail objects
ADF Master Table, Detail Form. See master-detail objects
ADF Master Table, Detail Table. See master-detail objects
ADF Model
overview, 1.1
ADF Model layer, introduced, 2.1
ADF Output Formatted widget. See text fields
ADF Output Formatted with a Label widget. See text fields
ADF Output Text widget. See text fields
ADF Output Text with a Label widget. See text fields
ADF Read-Only Dynamic Table. See dynamic tables
ADF Read-Only Form. See forms
ADF Read-Only Table. See tables
ADF Security
migrating application credentials, 8.3.4.2
using single sign-on, 8.3.4.1
ADF Table. See table components
ADF Tree. See tree components
ADF Tree Table. See treeTable components
adfm.xml file, 2.4.2
application server connection, 8.3.1
application.xml file, 8.3.3.3
attribute bindings
described, 3.2.2.2
EL expressions for, 3.2.2.3
attributes
binding to text fields, 3.2.1
AttrNames element, 5.4.2.2

B

base data source, 6.2
binding objects
list
dynamic selection, 6.2.4
fixed selection, 6.2.3
bindings
action, 3.6.2.1
action for operations, 3.4.2.1
attribute, 3.2.2.2
iterator
described, 3.2.2.1
rangeSize attribute, 3.4.2.2
tables and, 4.2.2.1
table, 4.2.2.1
text fields, 3.2.1
value, 3.2.2.2
bindings. See ADF bindings

C

CollectionModel class, 4.2.2.2
columns
attributes for, 4.2.2.2
column tag, 4.2.2.2
command buttons
binding to methods, 3.6.2.2
command components
ID for, 3.6.2.2
passing parameter values with, 3.5.4
commandButton components
creating for navigation operations, 3.4.1
in navigation operations, 3.4.1
commandLink components
navigation operations, 3.4.1
commandLink components, creating for navigation operations, 3.4.1
contextual events
Create operation
partial page rendering and, 4.4.3
tables and, 4.4.1
Createt operation
input forms, 3.7.2

D

Data Control panel
identifying master-detail objects, 5.2
data controls
at runtime, 2.4.3
creating, 2.2.1
displayed on the Data Controls panel, 2.2.2
introduced, 2.1
using to create a user interface, 2.4.1
Data Controls panel
context menu, 2.4.1, 2.4.1
icons defined, 2.2.2
using to create a user interface, 2.4
DataBindings.cpx file
about, 2.4.2
at runtime, 2.4.3
DataControls.dcx file
at runtime, 2.4.3
declarative development, 1.2
defName attribute, 5.4.2.2
deploying ADF applications
application.xml file for, 8.3.3.3
deployment descriptors for, 8.3.3
deployment profiles for, 8.3.2
to EAR file, 8.4
from JDeveloper, 8.4
using application server connections, 8.3.1
using MAR files, 8.2.2
using scripts, 8.4
web.xml file for, 8.3.3.4
deployment descriptors, 8.3.3
deployment profiles
creating, 8.3.2
DisclosureAllEvent event, 5.5.3
DisclosureEvent event
in tree components, 5.4.3
in treeTable components, 5.5.3
disclosureListener attribute
in tree components, 5.4.3
in treeTable components, 5.5.3
dynamic forms
creating, 3.8.1
described, 3.8
dynamic lists, 6.2
dynamic tables, 4.2.1

E

EAR files for deploying ADF applications, 8.4
edit forms
creating, 3.6.1
described, 3.6
editable tables
creating, 4.3.1
described, 4.3
EL expressions
binding attributes with, 3.2.2.3
navigation operations, 3.4.2.3
Enterprise Manager, 8.3.4.2
events
contexual. See contextual events
DisclosureAllEvent event, 5.5.3
DisclosureEvent event, 5.4.3, 5.5.3
FocusEvent event, 5.5.3
execute property, 3.4.2.3

F

FacesCtrlActionBinding class
defined, 3.4.2.3
facets
in tree components, 5.4.2.1
in treeTable components, 5.5.2.1
nodeStamp
tree components, 5.4.2.1
treeTable components, 5.5.2.1
pathStamp , 5.5.2.1
filtered tables
creating, 7.5
described, 7.1.3
FocusEvent event, 5.5.3
FocusListener listener, 5.5.3
forms
basic, creating, 3.3
creating edit, 3.6.1
creating using parameters, 3.5, 3.5.1
dynamic
creating, 3.8.1
described, 3.8
edit
creating, 3.6.1
described, 3.6
generated JSF page code for, 3.3.2
input
Create operation, 3.7.2
described, 3.7
modifying the default, 3.9
navigation operations, 3.4
using the Data Controls panel to create, 3.3.2
widgets for basic, 3.3.1, 3.8.1

I

input forms
Createt operation, 3.7.2
described, 3.7
input tables
creating, 4.4.1
described, 4.4.1
inputText components
creating, 3.2.1
See also text fields
isExpanded method, 5.4.3
iterator bindings
described, 3.2.2.1
rangeSize attribute, 3.4.2.2
tables and, 4.2.2.1

J

JSF
Oracle ADF and, 1.2

L

list data source, 6.2
list of values
list binding object, 6.2.3, 6.2.4
listeners
actionListener listener
EL expressions used, 3.4.2.3
DisclosureListener listener, 5.4.3
FocusListener listener, 5.5.3
selectionListener listener
collection models and, 4.2.2.2
setPropertyListener listener, 3.5.4
lists
fixed values, 6.2.1
navigation, 6.3

M

MAR files for deploying ADF applications, 8.2.2
Master Form, Detail Form. See master-detail objects
Master Form, Detail Table. See master-detail objects
Master Table, Detail Form. See master-detail objects
Master Table, Detail Table. See master-detail objects
master-detail objects
displaying
in tree components, 5.4
in treeTable components, 5.5
in separate pages, 5.3.4
in the Data Control Palette, 5.2
managing row currency, 5.3.3
managing synchronization of data, 5.3.3
RowSetIterator objects, 5.3.3
treeTable components, 5.5.1
widgets, 5.3.1
Master-Details UI components, 5.3.1
MDS
configuring for deployment, 8.4, 8.4.1
registering with WebLogic domain, 8.3.1, 8.3.1, 8.4
migrating application credentials, 8.3.4.2
model-driven lists
list binding objects, 6.2.2

N

NamedData element
creating, 3.5.1
navigation list bindings, 6.3
navigation operations
EL expressions for, 3.4.2.3
inserting, 3.4
types, 3.4.2.2
navigation, range in forms, 3.4
nodeDefinition element, 5.4.2.2
nodeStamp facet
tree components, 5.4.2.1
treeTable components, 5.5.2.1

O

operations
EL expressions for navigation, 3.4.2.3
navigation, 3.4, 3.4.2.1, 3.4.2.2
Oracle ADF
4GL development and, 1.2
described, 1.1
JSF and, 1.2
Oracle Application Development Framework. See Oracle ADF
outputText components
creating, 3.2.1
See also text fields; forms

P

page definition files
about, 2.4.2
introduced, 2.1
nodeDefinition element, 5.4.2.2
tree bindings, 5.4.2.2
parameter methods
creating forms with, 3.5
parameter methods, passing values to, 3.5.4
parameters
creating forms with, 3.5, 3.5.1
passing values for, 3.5.4
partial page rendering
Create operation, 4.4.3
tables and, 4.4.1
pathStamp facet, 5.5.2.1

Q

QBE. See Query-by-Example
Query-by-Example
using filtered tables, 7.1.3
quick query, 7.1.2

R

range navigation in forms, 3.4
rangeSize attribute
described, 3.4.2.2
read-only tables, 4.2.1
row currency
on master-detail objects, 5.3.3
setting programmatically, 4.2.3
RowKeySet object, 5.6.2
RowSetIterator objects
used to manage master-detail objects, 5.3.3

S

saved searches at runtime, 7.1.1
scripting
using WLST, 8.3.4.2
search forms
advanced link, 7.1.2
advanced mode, 7.1.1
basic mode, 7.1.1
creating quick query, 7.4.1
dynamically add criteria, 7.1.1
filtered tables, 7.1.3
match all, 7.1.1
match any, 7.1.1
MDS, 7.1.1
persisting saved searches, 7.2.3
personalize saved searches, 7.1.1
query, 7.1
quick query, 7.1.2
results table, 7.2
saved searches, 7.1.1
simple mode, 7.1.1
selection lists
dynamically generated, 6.2.2
selectionEvent events, 5.6.2
tree and table components, 5.6
selectionListener listener
collection models and, 4.2.2.2
described, 4.2.3
SelectManyCheckbox component, 6.2
SelectManyChoice component, 6.2
SelectManyListBox component, 6.2
SelectOneChoice component, 6.2
SelectOneListBox component, 6.2$
SelectOneRadio component, 6.2
setCurrentRowWithKey operation
compared to setCurrentRowWithKeyValue, 4.2.3
setting programmatically, 4.2.3
single selection lists
creating, 6.2
single sign-on, using, 8.3.4.1
static lists, 6.2

T

table tag, 4.2.2.2
tables
attributes for, 4.2.2.2
bindings for, 4.2.2.1
Create operation, 4.4.1
creating, 4.2.1
creating editable, 4.3.1
creating input, 4.4.1
described, 4.2
dynamic, 4.2.1
editable, 4.3
creating, 4.3.1
described, 4.3
filtered, 7.1.3
input
creating, 4.4.1
described, 4.4.1
partial page rendering, 4.4.1
read-only, 4.2.1
table tag, 4.2.2.2
var attribute, 4.2.2.2
versus forms, 4.2
widgets for, 4.2.1
text fields
binding, 3.2.1
creating for attributes, 3.2.1
input text widgets, 3.2.1
label widgets, 3.2.1
output text widgets, 3.2.1
using the Data Controls panel to create, 3.2.2
See also inputText components
tree components
Accessors element, 5.4.2.2
AttrNames element, 5.4.2.2
binding objects created for, 5.4.2.2
defName attribute, 5.4.2.2
described, 5.4
DisclosureEvent event, 5.4.3
disclosureListener attribute, 5.4.3
example of, 5.4
facet tag, 5.4.2.1
FocusEvent event, 5.5.3
FocusListener listener, 5.5.3
isExpanded method, 5.4.3
nodeDefinition tag, 5.4.2.2
nodeStamp facet, 5.4.2.1
treeModel property, 5.4.2.1
using to display master-detail objects, 5.4
var attribute, 5.4.2.1
TreeModel class, 5.5.3
treeModel property, 5.4.2.1, 5.5.2.1
treeState attribute, 5.5.3
treeTable components
Accessors element, 5.4.2.2
AttrNames element, 5.4.2.2
creating from Data Control panel, 5.5.1
defName attribute, 5.4.2.2
described, 5.5
DisclosureAllEvent event, 5.5.3
DisclosureEvent event, 5.5.3
disclosureListener attribute, 5.5.3
displaying master-detail objects, 5.5
example of, 5.5
facet tag, 5.5.2.1
nodeStamp facet, 5.5.2.1
pathStamp facet, 5.5.2.1
TreeModel class, 5.5.3
treeModel property, 5.5.2.1
treeState attribute, 5.5.3
var attribute, 5.5.2.1

U

UI components
modifying, 3.9
rebinding, 3.9

V

value bindings
described, 3.2.2.2
table, 4.2.2.1
var attribute
tables, 4.2.2.2
tree tables, 5.5.2.1
trees, 5.4.2.1

W

WebLogic Server
creating a JDBC data source for, 8.3.7
web.xml file, 2.4.2
for deploying ADF applications, 8.3.3.4
WLST scripts, 8.3.4.1, 8.3.4.2
PKNjL PK4HwEOEBPS/intro_java_ee.htmx Introduction to Building Java EE Web Applications with Oracle ADF

1 Introduction to Building Java EE Web Applications with Oracle ADF

This chapter describes the architecture and key functionality of the Oracle Application Development Framework (Oracle ADF) when used to build a web application with session and entity beans that use EJB 3.0 annotations and the Java Persistence API (JPA), along with ADF Model, ADF Controller, and ADF Faces rich client. This chapter also discusses high-level development practices.

This chapter includes the following sections:

1.1 Introduction to Oracle ADF

The Oracle Application Development Framework (Oracle ADF) is an end-to-end application framework that builds on Java Platform, Enterprise Edition (Java EE) standards and open-source technologies to simplify and accelerate implementing service-oriented applications. If you develop enterprise solutions that search, display, create, modify, and validate data using web, wireless, desktop, or web services interfaces, Oracle ADF can simplify your job. Used in tandem, Oracle JDeveloper 11g and Oracle ADF give you an environment that covers the full development lifecycle from design to deployment, with drag and drop data binding, visual UI design, and team development features built in.

Figure 1-1 illustrates where each Oracle ADF module fits in the web application architecture. The core module in the framework is ADF Model, which is a declarative data binding facility. The ADF Model layer enables a unified approach to bind any user interface to any business service, without the need to write code. The other modules that make up the application technology stack aside from EJBs, are:

  • ADF Faces rich client, which offers a rich library of AJAX-enabled UI components for web applications built with JavaServer Faces (JSF). For more information about ADF Faces, refer to the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.

  • ADF Controller, which integrates JSF with ADF Model. The ADF Controller extends the standard JSF controller by providing additional functionality, such as reusable task flows that pass control not only between JSF pages, but also between other activities, for instance method calls or other task flows. For more information about ADF Controller, see "Part III Creating ADF Task Flows" of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.


Note:

In addition to ADF Faces, Oracle ADF also supports using the Swing, JSP, and standard JSF view technologies. For more information about these technologies, refer to the JDeveloper online help. Oracle ADF also provides support for using Microsoft Excel as a view layer for your application. For more information, see the Oracle Fusion Middleware Desktop Integration Developer's Guide for Oracle Application Development Framework


Figure 1-1 Simple Oracle ADF Architecture

Image of ADF architecture

1.2 Developing with Oracle ADF

Oracle ADF emphasizes the use of the declarative programming paradigm throughout the development process to allow users to focus on the logic of application creation without having to get into implementation details. Using JDeveloper 11g with Oracle ADF, you benefit from a high-productivity environment that automatically manages your application's declarative metadata for data access, validation, page control and navigation, user interface design, and data binding.


Note:

This guide covers developing an application with session and entity beans using EJB 3.0 annotations and JPA (Java Persistence API) for model persistence, along with the Oracle ADF Model layer, ADF Controller, and ADF Faces. This process is very similar to developing a Fusion web application. The main difference is that a Fusion web application uses ADF Business Components for the back-end services. When the development process and procedures are the same for both application types, this guide refers you to the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework for that information.

Please disregard any information in the Fusion Developer's guide regarding ADF Business Components (such as entity objects and view objects). For similar information for EJB/JPA, refer to the "Developing EJB and JPA Components" topic in the JDeveloper online help.


At a high level, the declarative development process for a Java EE web application usually involves the following:

  • Creating an application workspace: Using a wizard, JDeveloper automatically adds the libraries and configuration needed for the technologies you select, and structures your application into projects with packages and directories. For more information, see the "Creating an Application Workspace" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

  • Modeling the database objects: You can create an offline replica of any database, and use JDeveloper editors and diagrammers to edit definitions and update schemas. For more information, see the "Modeling with Database Object Definitions" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

  • Creating use cases: Using the UML modeler, you can create use cases for your application. For more information, see the "Creating Use Cases" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

  • Designing application control and navigation: You use diagrammers to visually determine the flow of application control and navigation. JDeveloper creates the underlying XML for you. For more information, see the "Designing Application Control and Navigation using ADF Task Flows" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

  • Identifying shared resources: You use a resource library that allows you to view and use imported libraries by simply dragging and dropping them into your application. For more information, see the "Identifying Shared Resources" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

  • Creating the persistence model: From your database tables, you create EJB 3.0 entity beans using wizards or dialogs. From those beans, you create the session bean as the facade that will be used by the pages in your application. You can implement validation rules and other types of business logic using editors on the metadata files that describe the session bean and its underlying entity beans. For more information about using JDeveloper with EJBs, see the "Developing EJB and JPA Components" topic in the JDeveloper online help.

  • Creating data controls for your services: Once you've created your entity and session beans, you create the data controls that use metadata interfaces to abstract the implementation of your EJBs, and describe their operations and data collections, including information about the properties, methods, and types involved. These data controls are displayed in the Data Controls Panel. For more information, see Chapter 2, "Using ADF Model Data Binding in a Java EE Web Application."

  • Binding UI components to data using the ADF Model layer: When you drag an object from the Data Controls panel, JDeveloper automatically creates the bindings between the page and the data model. For more information, see Chapter 2, "Using ADF Model Data Binding in a Java EE Web Application."

  • Implementing the user interface with JSF: JDeveloper's Data Controls panel contains a representation of the beans for your application. Creating a user interface is as simple as dragging an object onto a page and selecting the UI component you want to display the underlying data. For UI components that are not databound, you use the Component Palette to drag and drop components. JDeveloper creates all the page code for you. For more information, see the "Implementing the User Interface with JSF" section in the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

    For information about creating specific types of web pages, see the following in this guide:

  • Incorporating validation and error handling: Once your application is created, you use editors to add additional validation and to define error handling. For more information, see Section 2.4.5, "What You May Need to Know About Configuring Validation."

  • Developing pages and applications to allow customization: Using the customization features provided by the Oracle Metadata Services (MDS), you can create applications that customers can customize yet still easily accept upgrades, create pages that allow end users to change the application UI at runtime, and create applications that are completely customizable at runtime. For more information, see the "Customizing Applications with MDS" and "Allowing User Customizations at Runtime" chapters of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

  • Securing the application: You use editors to create roles and populate these with test users. You then use a flat file editor to define security policies for these roles and assign them to specific resources in your application. For more information, see the "Enabling ADF Security in a Fusion Web Application" chapter in the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

  • Testing and debugging: JDeveloper includes an integrated application server that allows you to fully test your application without needing to package it up and deploy it. JDeveloper also includes the ADF Declarative Debugger, a tool that allows you to set breakpoints and examine the data. For more information, see the "Testing and Debugging ADF Components" chapter of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

  • Deploying the application: You use wizards and editors to create and edit deployment descriptors, JAR files, and application server connections. For more information, see Chapter 8, "Deploying an ADF Java EE Application."

1.3 Introduction to the ADF Sample Application

As a companion to this guide, the Suppliers module of the Fusion Order Demo application was created to demonstrate the use of the Java EE and ADF web application technology stack to create transaction-based web applications as required for a web supplier management system. The demonstration application is used to illustrate points and provide code samples.

Before examining the individual components and their source code in depth, you may find it helpful to install and become familiar with the functionality of the Fusion Order Demo application. See the following sections of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework for information:

1.3.1 Running the Suppliers Module of the Fusion Order Demo Application

The Suppliers module consists of a business services project named Model and a web user interface project named ViewController. You run the Suppliers module of the Fusion Order Demo application in JDeveloper by running the ViewController project. The ViewController project uses JavaServer Faces (JSF) as the view technology, and relies on the ADF Model layer to interact with the EJBs in the Model project. To learn more about the Suppliers module and to understand its implementation details, see Section 1.3.2, "Taking a Look at the Supplier Module Code" and Section 1.3.3, "Touring the Supplier Module."

To run the Suppliers module of the Fusion Order Demo application:

  1. Download and install the Fusion Order Demo application as described in the "Setting Up the Fusion Order Demo Application" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

  2. Open the application in Oracle JDeveloper:

    1. From the JDeveloper main menu, choose File > Open.

    2. Navigate to the location where you extracted the demo ZIP file to and select the SupplierModule_2.0.jws application workspace from the SupplierModule directory. Click Open.

      Figure 1-2 shows the Application Navigator after you open the file for the application workspace. For a description of each of the projects in the workspace, see Section 1.3.2, "Taking a Look at the Supplier Module Code."

      Figure 1-2 The Supplier Module Projects in Oracle JDeveloper

      FOD application project folders
  3. In the Application Navigator, click the Application Resources accordion title to expand the panel.

  4. In the Application Resources panel, expand the Connections and Database nodes.

  5. Right-click FOD connection and choose Properties.

  6. In the Edit Database Connection dialog, modify the connection information shown in Table 1-1 for your environment.

    Table 1-1 Connection Properties Required to Run the Fusion Order Demo Application

    PropertyDescription

    Host Name

    The host name for your database. For example:

    localhost

    JDBC Port

    The port for your database. For example:

    1521

    SID

    The SID of your database. For example:

    ORCL or XE


    Do not modify the user name and password fod/fusion. These must remain unchanged. Click OK.

  7. In the Application Navigator, right-click Model and choose Rebuild.

  8. In the Application Navigator, right-click ViewController and choose Run.

    The login.jspx page is displayed. Because of the way security is configured in this module, you must first log in.

  9. Enter SHEMANT for User Name and welcome1 for Password.

Once you log in, the browse page appears, which allows you to search for products. Once you select a product in the results table, you can edit or remove the product information. Using the command links at the top of the page, you can edit the corresponding supplier's information, or add a new supplier. For more information about the Suppliers module at runtime, see Section 1.3.3, "Touring the Supplier Module."

1.3.2 Taking a Look at the Supplier Module Code

Once you have opened the projects in Oracle JDeveloper, you can then begin to review the artifacts within each project. The Model project contains the Java classes and metadata files that allow the data to be displayed in the web application. The oracle.fodemo.common project contains components used by multiple classes in the application. The oracle.fodemo.supplier project contains the components used to access the supplier data. Figure 1-3 shows the Model project and its associated directories.

Figure 1-3 The Model Project in JDeveloper

Directories in the Model project

The ViewController project contains the files for the web interface, including the backing beans, deployment files, and JSPX files. The Application Sources node contains the code used by the web client, including the managed and backing beans, property files used for internationalization, and the metadata used by Oracle ADF to display bound data. The Web Content node contains web files, including the JSP files, images, skin files, deployment descriptors, and libraries. Figure 1-4 shows the ViewController project and its associated directories.

Figure 1-4 The ViewController Project in JDeveloper

Directories in the ViewController project

1.3.3 Touring the Supplier Module

The Supplier module contains eight main pages that allow a user to perform the following functionality:

  • Search for products: The browse.jspx page allows a user to search for products. Search results are displayed in a table. Figure 1-5 shows the search form on the browse page.

    Figure 1-5 Search Form in Supplier Module

    product search form
  • Edit row data in a table: From the table on the browse.jspx page, a user can select a product and choose Update to navigate to the productInfo.jspx page (clicking the product link also navigates to this page). From the table, a user can also click Remove, which launches a popup that allows the removal of the selected product. Figure 1-6 shows the table on the browse page.

    Figure 1-6 Table on the browse Page

    table showing products
  • Edit row data in a form: From the productInfo.jspx page, a user can change the data for a row. A selection list contains valid values for the product status. The Choose File button allows a user to upload a graphic file, which is then displayed below the form. Figure 1-7 shows the productInfo page.

    Figure 1-7 The productInfo Page

    details page for product info
  • The Add Supplier link takes the user to a series of pages contained within the regisrationDetails.jspx page that are used to create a new supplier, as shown in Figure 1-8.

    Figure 1-8 Create a Supplier Train

    train for adding supplier details
    • For information about creating a train, see the "Creating a Train" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

    • For information about creating forms that allow users to create new records, see Section 3.7, "Creating an Input Form."

  • Log in to the application: The login.jspx page allows users to log in to the application. For more information, see the "Enabling ADF Security in a Fusion Web Application" chapter of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

PK@xxPK4HwEOEBPS/databound_forms.htm Creating Databound Search Forms

7 Creating Databound Search Forms

This chapter describes how to create search forms to perform complex searches on multiple attributes and search forms to search on a single attribute. For complex query search forms, it describes how to set up the query search form mode, results table, saved searches list, and personalization. For single attribute search forms, it describes how to configure the form layout. In addition, it includes information on using Query-by-Example (QBE) filtered table searches.

This chapter includes the following sections:

7.1 Introduction to Creating Search Forms

You can create search forms that allow users to enter search criteria into input fields for known attributes of an object. The search criteria can be entered via input text fields or selected from a list of values in a popup list picker or dropdown list box. The entered criteria is constructed into a query to be executed. The results of the query can be displayed as a table, a form, or another UI component.

Search forms are region-based components that are reusable and personalizable. They encapsulate and automate many of the actions and iterator management operations required to perform a query. You can create several search forms on the same page without any need to change or create new iterators.

The search forms are based on the model-driven af:query and af:quickQuery components. Because these underlying components are model-driven, the search form will change automatically to reflect changes in the model. The view layer does not need to be changed.

The query search form is a full-featured search form. The quick query search form is a simplified form with only one search criteria. Each of these search forms can be combined with a filtered table to display the results, thereby enabling additional search capabilities. You can also create a standalone filtered table to perform searches without the query or quick query search panel.

A filtered table is a table that has additional Query-by-Example (QBE) search criteria fields above each searchable column. When the filtering option of a table is enabled, you can enter QBE-style search criteria for each column to filter the query results.

For more information about individual query and table components, see the "Using Query Components" and the "Using Tables and Trees" chapters of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.

7.1.1 Query Search Forms

The query search form is the standard form for complex transactional searches. You can build complex search forms with multiple search criteria fields each with a dropdown list of built-in operators. You can also add custom operators and customize the list. The query search form supports lists of values, AND and OR conjunctions, and saving searches for future use.

A query search form has a basic mode and an advanced mode. The user can toggle between the two modes using the basic/advanced button. At design time, you can declaratively specify form properties (such as setting the default state) to be either basic or advanced. Figure 7-1 shows an advanced mode query search form with three search criteria.

Figure 7-1 Advanced Mode Query Search Form with Four Search Criteria Fields

Advanced mode query

The advanced mode query form features are:

  • Selecting search criteria operators from a dropdown list

  • Adding custom operators and deleting standard operators

  • Selecting WHERE clause conjunctions of either AND or OR (match all or match any)

  • Dynamically adding and removing search criteria fields at runtime

  • Saving searches for future use

  • Personalizing saved searches

Typically, the query search form in either mode is used with an associated results table or tree table. For example, the query results for the search form in Figure 7-1 may be displayed in a table, as shown in Figure 7-2.

Figure 7-2 Results Table for a Query Search

Query results table

The basic mode has all the features of the advanced mode except that it does not allow the user to dynamically add search criteria fields. Figure 7-3 shows a basic mode query search form with one search criteria field. Notice the lack of a dropdown list next to the Save button used to add search criteria fields in the advanced mode.

Figure 7-3 Basic Mode Query Form with Four Search Criteria Fields

Basic mode query

In either mode, each search criteria field can be modified by selecting operators such as Greater Than and Equal To from a dropdown list, and the entire search panel can be modified by the Match All/Any radio buttons. Partial page rendering is also supported by the search forms in almost all situations. For example, if a Between operator is chosen, another input field will be displayed to allow the user to select the upper range.

A Match All selection implicitly uses AND conjunctions between the search criteria in the WHERE clause of the query. A Match Any selection implicitly uses OR conjunctions in the WHERE clause. Example 7-1 shows how a simplified WHERE clause may appear (the real WHERE in the view criteria is different) when Match All is selected for the search criteria shown in Figure 7-1.

Example 7-1 Simplified WHERE Clause Fragment When "Match All" Is Selected

              WHERE (ProductId=4) AND (InStock > 2) AND (ProductName="Ipod")

Example 7-2 shows a simplified WHERE clause if Match Any is selected for the search criteria shown in Figure 7-3.

Example 7-2 Simplified WHERE Clause Fragment When "Match Any" Is selected

              WHERE (ProductId=4) OR (InStock > 2) OR (ProductName="Ipod")

Advanced mode query forms allow users to dynamically add search criteria fields to the query panel to perform more complicated queries. These user-created search criteria fields can be deleted, but the user cannot delete existing fields. Figure 7-4 shows how the Add Fields dropdown list is used to add the CategoryId criteria field to the search form.

Figure 7-4 Dynamically Adding Search Criteria Fields at Runtime

Dynamically add search criteria

Figure 7-5 shows a user-added search criteria with the delete icon to its right. Users can click the delete icon to remove the criteria.

Figure 7-5 User-Added Search Criteria with Delete Icon

Delete search criteria

If either Match All or Match Any is selected and then the user dynamically adds the second instance of a search criteria, then both Match All and Match Any will be deselected. The user must reselect either Match All or Match Any before clicking the Search button.

If you intend for a query search form to have both a basic and an advanced mode, you can define each search criteria field to appear only for basic, only for advanced, or for both. When the user switches from one mode to the other, only the search criteria fields defined for that mode will appear. For example, suppose three search fields for basic mode (A, B, C) and three search fields for advanced mode (A, B, D) are defined for a query. When the query search form is in basic mode, search criteria fields A, B, and C will appear. When it is in advanced mode, then fields A, B, and D will appear. Any search data that was entered into the search fields will also be preserved when the form returns to that mode. If the user entered 35 into search field C in basic mode, switched to advanced mode, and then switched back to basic, field C would reappear with value 35.

Along with using the basic or advanced mode, you can also determine how much of the search form will display. The default setting displays the whole form. You can also configure the query component to display in compact mode or simple mode. The compact mode has no header or border, and the Saved Search dropdown lists moves next to the expand/collapse icon. Figure 7-6 shows a query component set to compact mode.

Figure 7-6 Query Component in Compact Mode

Compact mode query

The simple mode displays the component without the header and footer, and without the buttons normally displayed in those areas. Figure 7-7 shows the same query component set to simple mode.

Figure 7-7 Query Component in Simple Mode

query in simple mode.

Users can also create saved searches at runtime to save the state of a search for future use. The entered search criteria values, the basic/advanced mode state, and the layout of the results table/component can be saved by clicking the Save button to open a Save Search dialog, as shown in Figure 7-8. User-created saved searches persist for the session. If they are intended to be available beyond the session, you must configure a persistent data store to store them. For Oracle ADF, you can use an access-controlled data source such as MDS. For more information about using MDS, see the "Customizing Applications with MDS" chapter in the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

Figure 7-8 Runtime Saved Search Dialog Window

Saved search dialog.

When you perform a saved search, you can specify whether the layout of the results component is also saved. Creating saved searches and saving the results components layout require that MDS is configured. If you set the query component's saveResultsLayout attribute to always, the results component layout will be saved. If saveResultsLayout is set to never, the layout is not saved.

Example 7-3 web.xml Entry for Saving Query Results Component Layout

<context-param>
   <description>Saving results layout</description>
       <param-name>oracle.adf.view.rich.query.SAVE_RESULTS_LAYOUT</param-name>
   <param-value>true</param-value>
</context-param>

If saveResultsLayout is not defined, saving layout defaults to the application-level property oracle.adf.view.rich.query.SAVE_RESULTS_LAYOUT in the web.xml file. The default value of oracle.adf.view.rich.query.SAVE_RESULTS_LAYOUT is true.

If the user made changes to the layout of a saved search and proceeds without saving, a warning message appears to remind the user to save, otherwise the changes will be lost. In addition, if the user adds or deletes search fields and proceeds without saving, a warning message also appears.

Table 7-1 shows the saveResultsLayout and SAVE_RESULTS_LAYOUT values and their resultant action. Note that MDS must be configured to save layout.

Table 7-1 Save Results Component Layout Attributes

web.xml SAVE_RESULT_LAYOUTQuery Component saveResultsLayoutResultant action

true

always

Saves layout

true

never

Not saved

true

not defined

Saves layout

false

always

Saves layout

false

never

Not saved

false

not defined

Saves layout


Table 7-2 lists the possible scenarios for creators of saved searches, the method of their creation, and their availability.

Table 7-2 Design Time and Runtime Saved Searches

CreatorCreated at Design time as View CriteriaCreated at Runtime with the Save Button

Developer

Developer-created saved searches (system searches) are created during application development and typically are a part of the software release. They are created at design time as view criteria. They are usually available to all users of the application and appear in the lower part of the Saved Search dropdown list.


Administrator


Administrator-created saved searches are created during predeployment by site administrators. They are created before the site is made available to the general end users. Administrators can create saved searches (or view criteria) using the JDeveloper design time when they are logged in with the appropriate role. These saved searches (or view criteria) appear in the lower part of the Saved Search dropdown list.

End User


End-user saved searches are created at runtime using the query form Save button. They are available only to the user who created them. End-user saved searches appear in the top part of the Saved Search dropdown list.


End users can manage their saved searches by using the Personalize function in the Saved Search dropdown list to bring up the Personalize Saved Searches dialog, as shown in Figure 7-9.

End users can use the Personalize function to:

  • Update a user-created saved search

  • Delete a user-created saved search

  • Set a saved search as the default

  • Set a saved search to run automatically

  • Set the saved search to show or hide from the Saved Search dropdown list

Figure 7-9 Personalize Saved Searches Dialog

Personalized saved search dialog

7.1.2 Quick Query Search Forms

A quick query search form is intended to be used in situations where a single search will suffice or as a starting point to evolve into a full query search. Both the query and quick query search forms are ADF Faces components. A quick query search form has one search criteria field with a dropdown list of the available searchable attributes from the associated data collection. Typically, the searchable attributes are all the attributes in the associated view collection. The user can search against the selected attribute or search against all the displayed attributes. The search criteria field type will automatically match the type of its corresponding attribute. An Advanced link built into the form offers you the option to create a managed bean to control switching from quick query to advanced mode query search form. For more information, see the "Using Query Components" chapter in the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.

You can configure the form to have a horizontal layout, as shown in Figure 7-10.

Figure 7-10 Quick Query Search Form in Horizontal Layout

quick query in horizontal mode

You can also choose a vertical layout, as shown in Figure 7-11.

Figure 7-11 Quick Query Search Form in Vertical Layout

Quick Query in vertical mode

7.1.3 Filtered Table and Query-by-Example Searches

A filtered table can be created standalone or as the results table of a query or quick query search form. Filtered table searches are based on Query-by-Example and use the QBE text or date input field formats. The input validators are turned off to allow for entering characters such as > and <= to modify the search criteria. For example, you can enter >1500 as the search criteria for a number column. Wildcard characters may also be supported. If a column does not support QBE, the search criteria input field will not render for that column.

The filtered table search criteria input values are used to build the query WHERE clause with the AND operator. If the filtered table is associated with a query or quick query search panel, the composite search criteria values are also combined to create the WHERE clause.

Figure 7-12 shows a query search form with a filtered results table. When the user enters a QBE search criteria, such as >100 for the PersonId field, the query result is the AND of the query search criteria and the filtered table search criteria.

Figure 7-12 Query Search Form with Filtered Table

query with filtered table

Table 7-3 lists the acceptable QBE search operators that can be used to modify the search value.

Table 7-3 Query-by-Example Search Criteria Operators

OperatorDescription

>

Greater than

<


Less than

>=

Greater than or equal to

<=


Less than or equal to

AND

And

OR

Or


7.2 Creating Query Search Forms

You create a query search form by dropping the All Queriable Attributes item from the Data Controls panel onto a page. You have a choice of dropping only a search panel, dropping a search panel with a results table, or dropping a search panel with a tree table.

If you choose to drop the search panel with a table, you can select the filtering option in the dialog to turn the table into a filtered table.

Typically, you would drop a query search panel with the results table or tree table. JDeveloper will automatically create and associate a results table or tree table with the query panel.

If you drop a query panel by itself and want a results component or if you already have an existing component for displaying the results, you will need to match the query panel's ResultsComponentId with the results component's Id.

7.2.1 How to Create a Query Search Form with a Results Table or Tree Table

You create a search form by dragging and dropping All Queriable Attributes from the Data Controls panel onto the page. You have the option of having a results table or only the query panel.

Before you begin:

You should have created a accessor returned collection in the Data Control panel.

To create a query search form with a results table or tree table:

  1. From the Data Controls panel, select the accessor returned collection and expand the Named Criteria node to display All Queriable Attributes.

  2. Drag the All Queriable Attributes item and drop it onto the page or onto the Structure window.


    Note:

    Dropping All Queriable Attributes onto the page creates a search form with a search criteria field for each searchable attribute defined in the underlying collection. If you only want to create search criteria fields for some of those attributes, you can create another accessor returned collection in the Data Control panel that returns only the attributes you want. You can then drag and drop All Queriable Attributes from this new accessor returned collection.


  3. From the context menu, choose Create > Query > ADF Query Panel with Table or Create > Query > ADF Query Panel with Tree Table, as smhhown in Figure 7-13.

    Figure 7-13 Data Controls Panel with Query Context Menu

    Data Control query context menu
  4. In the Edit Table Columns dialog, you can rearrange any column and select table options. If you choose the filtering option, the table will be a filtered table.

After you have created the form, you may want to set some of its properties or add custom functions. For more information on how to do this, see Section 7.3, "Setting Up Search Form Properties."

7.2.2 How to Create a Query Search Form and Add a Results Component Later

You create a search form by dragging and dropping All Queriable Attributes from the Data Controls panel onto the page. You have the option of having a results table or only the query panel.

Before you begin:

You should have created a accessor returned collection in the Data Control panel.

To create a query search form and add a results component in a separate step:

  1. From the Data Controls panel, select the accessor returned collection and expand the Named Criteria node to display All Queriable Attributes.

  2. Drag the All Queriable Attributes item and drop it onto the page or onto the Structure window.


    Note:

    Dropping All Queriable Attributes onto the page creates a search form with a search criteria field for each searchable attribute defined in the underlying collection. If you only want to create search criteria fields for some of those attributes, you can create another accessor returned collection in the Data Control panel that returns only the attributes you want. You can then drag and drop All Queriable Attributes from this new accessor returned collection.


  3. Choose Create > Query > ADF Query Panel from the context menu, as shown in Figure 7-13.

  4. If you do not already have a results component, then drag the accessor returned collection and drop it onto the page as a table, tree, or treetable component.

  5. In the Property Inspector for the table, copy the value of the Id field.

  6. In the Property Inspector for the query panel, paste the value of the table's ID into the query's ResultsComponentId field.

After you have created the search form, you may want to set some of its properties or add custom functions. See Section 7.3, "Setting Up Search Form Properties," for more information.

7.2.3 How to Persist Saved Searches into MDS

If you want saved searches to be persisted to MDS, you need to define the /persdef namespace in the adf-config.xml file. In addition, you need to perform the regular MDS configuration, such as specifying metadatapath. Example 7-4 shows an adf-config.xml file with the /persdef namespace defined.

Example 7-4 Sample adf-config.xml with /persdef Namespace

<persistence-config>
   <metadata-namespaces>
        <namespace path="/persdef" metadata-store-usage="mdsstore"/>
   </metadata-namespaces>
   <metadata-store-usages>
        <metadata-store-usage id="mdsstore" deploy-target="true"
                 default-cust-store="true"/>
        </metadata-store-usage>
   </metadata-store-usages>
</persistence-config>

In order for the added saved searches to be available the next time the user logs in, cust-config needs to be defined as part of the MDS configuration. For more information about setting cust-config and MDS, see "How to Create Customization Classes" of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework

If you are also saving the layout of the results component, the application must have the ADF PageFlow Runtime and ADF Controller Runtime libraries installed. Set the project's technology scope to include ADF Page Flow.

7.2.4 What Happens When You Create a Query Form

When you drop a query search form onto a page, JDeveloper creates an af:query tag on the page. If you drop a query with table or tree table, then an af:table tag or af:treeTable tag will follow the af:query tag.

Under the af:query tag are several attributes that define the query properties. They include:

  • The id attribute, which uniquely identifies the query.

  • The resultsComponentId attribute, which identifies the component that will display the results of the query. Typically, this will be the table or tree table that was dropped onto the page together with the query. You can change this value to be the id of a different results component. For more information, see Section 7.2.2, "How to Create a Query Search Form and Add a Results Component Later."

In the page definition file, JDeveloper creates an iterator, accessorIterators, and a searchRegion entry in the executables section. Example 7-5 shows the sample code for a page definition file.

In the page definition file executable section:

  • The iterator RangeSize property is set to a default value of 25. If you want a different page size, you must edit this value.

  • The iterator id property is set to the root iterator. In the example, the value is set to SupplierFacadeLocalIterator

  • The accessorIterator Binds property is set to the accessor. In the example, the value is set to productFindAll.

  • The accessorIterator id property is set to the accessor iterator. In the example, the value is set to productFindAllIterator.

  • The searchRegion Criteria property is set to _ImplicitViewCriteria_.

  • The searchRegion Binds property is set to the search iterator. In the example, the value is set to productFindAllIterator

  • The searchRegion id property is set to ImplicitViewCriteriaQuery.

If the query was dropped onto the page with a table or tree, then in the page definition file bindings section, a tree element is added with the Iterbinding property set to the search iterator. In this example, the value is set to productFindAllIterator.

Example 7-5 Search Form Code in the Page Definition File

  <executables>
    <variableIterator id="variables"/>
    <iterator Binds="root" RangeSize="25" DataControl="SupplierFacadeLocal"
              id="SupplierFacadeLocalIterator"/>
    <accessorIterator MasterBinding="SupplierFacadeLocalIterator"
                      Binds="productFindAll" RangeSize="25"
                      DataControl="SupplierFacadeLocal"
                      BeanClass="oracle.fodemo.supplier.model.Product"
                      id="productFindAllIterator"/>
    <searchRegion Criteria="__ImplicitViewCriteria__"
                  Customizer="oracle.jbo.uicli.binding.JUSearchBindingCustomizer"
                  Binds="productFindAllIterator"
                  id="ImplicitViewCriteriaQuery"/>
  </executables>
  <bindings>
    <tree IterBinding="productFindAllIterator" id="productFindAll">
      <nodeDefinition DefName="oracle.fodemo.supplier.model.Product">
        <AttrNames>
          <Item Value="listPrice"/>
          <Item Value="minPrice"/>
          <Item Value="objectVersionId"/>
          <Item Value="productId"/>
          <Item Value="productName"/>
        </AttrNames>
      </nodeDefinition>
    </tree>
  </bindings>

7.2.5 What Happens at Runtime: Search Forms

At runtime, the search form displays as a search panel on the page. The search panel will display in either basic mode or advanced mode.

After the user enters the search criteria and clicks Search, a query is executed and the results are displayed in the associated table, tree table, or component.

7.3 Setting Up Search Form Properties

Search form properties that can be set after the query component has been added to the JSF page include:

  • id of the results table or results component

  • Show or hide of the basic/advanced button

  • Position of the mode button

  • Default, simple, or compact mode for display

7.3.1 How to Set Search Form Properties on the Query Component

After you have dropped the query search form onto a page, you can edit other form properties in the Property Inspector, as shown in Figure 7-14. Some of the common properties you may set are:

  • Enabling or disabling the basic/advanced mode button

  • Setting the ID of the query search form

  • Setting the ID of the results component (for example, a results table)

  • Selecting the default, simple, or compact mode for display

Figure 7-14 Property Inspector for a Query Component

Query component in the Property Inspector

One common option is to show or hide the basic/advanced button.

To enable or hide the basic/advanced button in the query form:

  1. In the Structure window, double-click af:query.

  2. In the Property Inspector, click the Appearance tab.

  3. To enable the basic/advanced mode button, select true from the ModeChangeVisible field. To hide the basic/advance mode button, select false from the ModeChangeVisible field.

7.4 Creating Quick Query Search Forms

You can use quick query search forms to let users search on a single attribute of a collection. Quick query search form layout can be either horizontal or vertical. Because they occupy only a small area, quick query search forms can be placed in different areas of a page. You can create a managed bean to enable users to switch from a quick query to a full query search. For more information about switching from quick query to query using a managed bean, see the "Using Query Components" chapter in the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.

If you drop a quick query panel with a results table or tree, JDeveloper will automatically create the results table, as described in Section 7.4.1, "How to Create a Quick Query Search Form with a Results Table or Tree Table." If you drop a quick query panel by itself and subsequently want a results table or component or if you already have one, you will need to match the quick query Id with the results component's partialTrigger value, as described in Section 7.4.2, "How to Create a Quick Query Search Form and Add a Results Component Later."

7.4.1 How to Create a Quick Query Search Form with a Results Table or Tree Table

You can create quick query searches using the full set of searchable attributes and simultaneously add a table or tree table as the results component.

Before you begin:

Create an accessor returned collection in the Data Control panel.

To create a quick query search form with a results table:

  1. From the Data Controls panel, select the accessor returned collection and expand the Named Criteria node to display All Queriable Attributes.

  2. Drag the All Queriable Attributes item and drop it onto the page or onto the Structure window.

  3. From the context menu, choose Create > Quick Query > ADF Quick Query Panel with Table or Create > Quick Query > ADF Quick Query Panel with Tree Table, as shown in Figure 7-15.

  4. In the Edit Table Columns dialog, you can rearrange any column and select table options. If you choose the filtering option, the table will be a filtered table.

Figure 7-15 Data Control Panel with Quick Query Context Menu

Quick Query Context menu

7.4.2 How to Create a Quick Query Search Form and Add a Results Component Later

You can create quick query searches using the full set of searchable attributes and add a table or tree table as the results component later.

Before you begin:

Create an accessor returned collection in the Data Control panel.

To create a quick query search form and add a results component in a separate step:

  1. From the Data Controls panel, select the accessor returned collection and expand the Named Criteria node to display All Queriable Attributes

  2. Drag the All Queriable Attributes item and drop it onto the page or onto the Structure window.

  3. From the context menu, choose Create > Quick Query > ADF Quick Query Panel.

  4. If you do not already have a results component, then drag the accessor returned collection and drop it onto the page as a table, tree, or treetable component.

  5. In the Property Inspector for the quick query, copy the value of the Id field.

  6. In the Property Inspector for the results component (for example, a table), paste or enter the value into the PartialTriggers field.

7.4.3 How to Set the Quick Query Layout Format

The default layout of the form is horizontal. You can change the layout option using the Property Inspector.

To set the layout:

  1. In the Structure window, double-click af:quickQuery.

  2. In the Property Inspector, on the Commons page, select the Layout property using the dropdown list to specify default, horizontal, or vertical.

7.4.4 What Happens When You Create a Quick Query Search Form

When you drop a quick query search form onto a page, JDeveloper creates an af:quickQuery tag. If you have dropped a quick query with table or tree table, then an af:table tag or af:treeTable tag is also added.

Under the af:quickQuery tag are several attributes and facets that define the quick query properties. Some of the tags are:

  • The id attribute, which uniquely identifies the quick query. This value should be set to match the results table or component's partialTriggers value. JDeveloper will automatically assign these values when you drop a quick query with table or tree table. If you want to change to a different results component, see Section 7.4.2, "How to Create a Quick Query Search Form and Add a Results Component Later."

  • The layout attribute, which specifies the quick query layout to be default, horizontal, or vertical.

  • The end facet, which specifies the component to be used to display the Advanced link (that changes the mode from quick query to the query). For more information about creating this function, see the "Using Query Components" chapter of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.

7.4.5 What Happens at Runtime: Quick Query

At runtime, the quick query search form displays a single search criteria field with a dropdown list of selectable search criteria items. If there is only one searchable criteria item, then the dropdown list box will not be rendered. An input component that is compatible with the selected search criteria type will be displayed, as shown in Table 7-4. For example, if the search criteria type is date, then inputDate will be rendered.

Table 7-4 Quick Query Search Criteria Field Components

Attribute TypeRendered Component

DATE

af:inputDate

VARCHAR

af:inputText

NUMBER

af:inputNumberSpinBox


In addition, a Search button is rendered to the right of the input field. If the end facet is specified, then any components in the end facet are displayed. By default, the end facet contains an Advanced link.

7.5 Creating Standalone Filtered Search Tables

You use query search forms for complex searches, but you can also perform simple QBE searches using the filtered table. You can create a standalone ADF-filtered table without the associated search panel and perform searches using the QBE-style search criteria input fields. For more information about filtered tables, see Section 7.1.3, "Filtered Table and Query-by-Example Searches."

When creating a table, you can make almost any table a filtered table by selecting the filtering option if the option is enabled. There are three ways to create a standalone filtered table:

  • You can drop a table onto a page from the Component Palette, bind it to a data collection, and set the filtering option. For more information, see the "Using Query Components" chapter of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.

  • You can create a filtered table by dragging and dropping an accessor returned collection onto a page and setting the filtering option.

  • You can also create a filtered table or a read-only filtered table by dropping All Queriable Attributes onto the page. The resulting filtered table will have a column for each searchable attribute and an input search field above each column.

You can set the QBE search criteria for each filterable column to be a case-sensitive or case-insensitive search using the filterFeature attribute of af:column in the af:table component. For more information, see the "Enable Filtering in Tables" section of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.

Before you begin:

Create an accessor returned collection in the Data Control panel.

To create a filtered table:

  1. From the Data Controls panel, select the accessor returned collection and expand the Named Criteria node to display All Queriable Attributes.

  2. Drag the All Queriable Attributes item and drop it onto the page or onto the Structure window.

  3. From the context menu, choose Create > Tables > ADF Filtered Table or Create > Tables >ADF Read-Only Filtered Table.

  4. In the Edit Table Columns dialog, you can rearrange any column and select table options. Because the table is created by JDeveloper during quick query creation, the filtering option is automatically enabled and not user-selectable, as shown in Figure 7-16.

Figure 7-16 Edit Table Columns Dialog for Filtered Table

Edit table columns dialog for filtered table.
PKgwmPK4HwEOEBPS/databound_page.htm Creating a Basic Databound Page

3 Creating a Basic Databound Page

This chapter describes how to use the Data Controls panel to create basic databound pages that are based on ADF Faces components. It includes information on creating text fields from individual attributes, generating entire forms from accessor returned collections, and creating forms for editing existing records and creating new records.

This chapter includes the following sections:

3.1 Introduction to Creating a Basic Databound Page

You can create UI pages that allow you to display and collect information using data controls created for your business services. For example, using the Data Controls panel, you can drag an attribute for an item, and then choose to display the value either as read-only text or as an input text field with a label. JDeveloper creates all the necessary JSF tag and binding code needed to display and update the associated data. For more information about the Data Controls panel and the declarative binding experience, see Chapter 2, "Using ADF Model Data Binding in a Java EE Web Application."

Instead of having to drop individual attributes, JDeveloper allows you to drop all attributes for an object at once as a form. The actual UI components that make up the form depend on the type of form dropped. You can create forms that display values, forms that allow users to edit values, and forms that collect values (input forms).

For example, the Suppliers module contains a page that allows users to view and edit information about a supplier, as shown in Figure 3-1. This form was created by dragging and dropping the supplierFindAll accessor collection from the Data Controls panel.

Figure 3-1 Supplier Details Form in the Suppliers Module

supplier details edit form

Once you create the UI components, you can then drop built-in operations as command UI components that allow you to navigate through the records in a collection or that allow users to operate on the data. For example, you can create a button that allows users to delete data objects displayed in the form. You can also modify the default components to suit your needs.

3.2 Using Attributes to Create Text Fields

JDeveloper allows you to create text fields declaratively in a WYSIWYG development environment for your JSF pages, meaning you can design most aspects of your pages without needing to look at the code. When you drag and drop items from the Data Controls panel, JDeveloper declaratively binds ADF Faces text UI components to attributes on a data control using an attribute binding.

3.2.1 How to Create a Text Field

To create a text field that can display or update an attribute, you drag and drop an attribute of a collection from the Data Controls panel.

To create a bound text field:

  1. From the Data Controls panel, select an attribute for a collection. For a description of the icons that represent attributes and other objects in the Data Controls panel, see Table 2-1.

    For example, Figure 3-2 shows the address1 attribute under the addressFindAll accessor collection of the SupplierFacedLocal data control in the Supplier module. This is the attribute to drop to display or enter the first part of an address.

    Figure 3-2 Attributes Associated with a Collection in the Data Controls Panel

    Attributes for CustomerRegistration
  2. Drag the attribute onto the page, and from the context menu choose the type of widget to display or collect the attribute value. For an attribute, you are given the following choices:

    • Text:

      • ADF Input Text w/ Label: Creates an ADF Faces inputText component with a nested validator component. The label attribute is populated.


        Tip:

        For more information about validators and other attributes of the inputText component, see the "Using Input Components and Defining Forms" chapter of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.


      • ADF Input Text: Creates an ADF Faces inputText component with a nested validator component. The label attribute is not populated.

      • ADF Output Text w/ Label: Creates a panelLabelAndMessage component that holds an ADF Faces outputText component. The label attribute on the panelLabelAndMessage component is populated.

      • ADF Output Text: Creates an ADF Faces outputText component. No label is created.

      • ADF Output Formatted w/Label: Same as ADF Output Text w/Label, but uses an outputFormatted component instead of an outputText component. The outputFormatted component allows you to add a limited amount of HTML formatting. For more information, see the "Displaying Output Text and Formatted Output Text" section of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework

      • ADF Output Formatted: Same as ADF Output Formatted w/Label, but without the label.

      • ADF Label: An ADF Faces outputLabel component.

    • Single Selections: Creates single selection lists. For more information about creating lists on a JSF page, see Chapter 6, "Creating Databound Selection Lists."

    For the purposes of this chapter, only the text components (and not the lists) will be discussed.

3.2.2 What Happens When You Create a Text Field

When you drag an attribute onto a JSF page and drop it as a UI component, among other things, a page definition file is created for the page (if one does not already exist). For a complete account of what happens when you drag an attribute onto a page, see Section 2.4.2, "What Happens When You Use the Data Controls Panel to Create UI Components." Bindings for the iterator and attributes are created and added to the page definition file. Additionally, the necessary JSPX page code for the UI component is added to the JSF page.

3.2.2.1 Creating and Using Iterator Bindings

Whenever you create UI components on a page by dropping an item that is part of a collection from the Data Controls panel (or you drop the whole collection as a form or table), JDeveloper creates an iterator binding if it does not already exist. An iterator binding references an iterator for the data collection, which facilitates iterating over its data objects. It also manages currency and state for the data objects in the collection. An iterator binding does not actually access the data. Instead, it simply exposes the object that can access the data and it specifies the current data object in the collection. Other bindings then refer to the iterator binding in order to return data for the current object or to perform an action on the object's data. Note that the iterator binding is not an iterator. It is a binding to an iterator.

For example, if you drop the address1 attribute under the addressFindAll collection, JDeveloper creates an iterator binding for the
SupplierFacadeLocal
data control and an accessorIterator binding for the addressFindAll accessor, which in turn has the SupplierFacadeLocal iterator as its master binding.


Tip:

There is one accessor iterator binding created for each collection returned from an accessor. This means that when you drop two attributes from the same accessor (or drop the attribute twice), they use the same binding. This is fine, unless you need the binding to behave differently for the different components. In that case, you will need to manually create separate iterator bindings.


The iterator binding's rangeSize attribute determines how many rows of data are fetched from a data control each time the iterator binding is accessed. This attribute gives you a relative set of 1-n rows positioned at some absolute starting location in the overall row set. By default, the attribute is set to 25. Example 3-1 shows the iterator bindings created when you drop an attribute from the addressFindAll accessor collection.

Example 3-1 Page Definition Code for an Iterator Accessor Binding

<executables>
  <iterator Binds="root" RangeSize="25" DataControl="SupplierFacadeLocal"
            id="SupplierFacadeLocalIterator"/>
  <accessorIterator MasterBinding="SupplierFacadeLocalIterator"
                    Binds="addressesFindAll" RangeSize="25"
                    DataControl="SupplierFacadeLocal"
                    BeanClass="oracle.fodemo.supplier.model.Addresses"
                    id="addressesFindAllIterator"/>
</executables>

This metadata allows the ADF binding container to access the attribute values. Because the iterator binding is an executable, by default it is invoked when the page is loaded, thereby allowing the iterator to access and iterate over the collection returned by the addressFindAll accessor. This means that the iterator will manage all the objects in the collection, including determining the current row in the collection or determining a range of address objects.

3.2.2.2 Creating and Using Value Bindings

When you drop an attribute from the Data Controls panel, JDeveloper creates an attribute binding that is used to bind the UI component to the attribute's value. This type of binding presents the value of an attribute for a single object in the current row in the collection. Value bindings can be used both to display and to collect attribute values.

For example, if you drop the address1 attribute under the addressFindAll accessor as an ADF Output Text w/Label widget onto a page, JDeveloper creates an attribute binding for the address1 attribute. This allows the binding to access the attribute value of the current record. Example 3-2 shows the attribute binding for address1 created when you drop the attribute from the addressFindAll accessor. Note that the attribute value references the iterator named addressesFindAllIterator.

Example 3-2 Page Definition Code for an Attribute Binding

<bindings>
  <attributeValues IterBinding="addressesFindAllIterator" id="address1">
    <AttrNames>
      <Item Value="address1"/> 
    </AttrNames>
  </attributeValues
</bindings>

For information regarding the attribute binding element properties, see the "Oracle Binding Properties" appendix of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

3.2.2.3 Using EL Expressions to Bind UI Components

When you create a text field by dropping an attribute from the Data Controls panel, JDeveloper creates the UI component associated with the widget dropped by writing the corresponding tag to the JSF page.

For example, when you drop the address1 attribute as an Output Text w/Label widget, JDeveloper inserts the tags for a panelLabelAndMessage component and an outputText component. It creates an EL expression that binds the label attribute of the panelLabelAndMessage component to the label property of hints created for the address1's binding. This expression evaluates to the label UI hint set in the Java object's structure XML file. It creates another expression that binds the outputText component's value attribute to the inputValue property of the address1 binding, which evaluates to the value of the address1 attribute for the current row. An ID is also automatically generated for both components.


Tip:

JDeveloper automatically generates IDs for all ADF Faces components. You can override these values as needed.


Example 3-3 shows the code generated on the JSF page when you drop the address1 attribute as an Output Text w/Label widget.

Example 3-3 JSF Page Code for an Attribute Dropped as an Output Text w/Label

<af:panelLabelAndMessage label="#{bindings.address1.hints.label}"
                         id="plam1">
  <af:outputText value="#{bindings.address1.inputValue}" id="ot1"/>
</af:panelLabelAndMessage>

If instead you drop the address1 attribute as an Input Text w/Label widget, JDeveloper creates an inputText component. As Example 3-4 shows, similar to the output text component, the value is bound to the inputValue property of the address1 binding. Additionally, the following properties are also set:

  • label: Bound to the label property of the control hint set on the object.

  • required: Bound to the mandatory property, which in turn references the isNotNull property of the UI control hint.

  • columns: Bound to the displayWidth property of the control hint, which determines how wide the text box will be.

  • maximumLength: Bound to the precision property of the control hint. This control hint property determines the maximum number of characters per line that can be entered into the field.

In addition, JDeveloper adds a validator component.

Example 3-4 JSF Page Code for an Attribute Dropped as an Input Text w/Label

<af:inputText value="#{bindings.address1.inputValue}"
              label="#{bindings.address1.hints.label}"
              required="#{bindings.address1.hints.mandatory}"
              columns="#{bindings.address1.hints.displayWidth}"
              maximumLength="#{bindings.address1.hints.precision}">
              shortDesc="#{bindings.address1.hints.tooltip}" id="it1">
  <f:validator binding="#{bindings.address1.validator}"/>
</af:inputText>

You can change any of these values to suit your needs. For example, the isNotNull control hint on the structure file is set to false by default, which means that the required attribute on the component will evaluate to false as well. You can override this value by setting the required attribute on the component to true. If you decide that all instances of the attribute should be mandatory, then you can change the control hint in the structure file, and all instances will be required. For more information about these properties, see Section 2.4.2, "What Happens When You Use the Data Controls Panel to Create UI Components."

3.3 Creating a Basic Form

Instead of dropping each of the individual attributes of a collection to create a form, you can create a complete form that displays or collects data for all the attributes on an object. For example, the form on the Edit Suppliers Details page was created by dropping the productFindAll accessor collection from the Data Controls panel.

You can also create forms that provide more functionality than simply displaying data from a collection. For information about creating a form that allows a user to update data, see Section 3.6, "Creating a Form to Edit an Existing Record." For information about creating forms that allow users to create a new object for the collection, see Section 3.7, "Creating an Input Form." You can also create search forms. For more information, see Chapter 7, "Creating Databound Search Forms."

3.3.1 How to Create a Form

To create a form using a data control, you bind the UI components to the attributes on the corresponding object in the data control. JDeveloper allows you to do this declaratively by dragging and dropping a returned collection from the Data Controls panel.

To create a basic form:

  1. From the Data Controls panel, select the collection that returns the data you wish to display. Figure 3-3 shows the productFindAll accessor returned collection.

    Figure 3-3 productFindAll Accessor in the Data Controls Panel

    CustomerInfo collection
  2. Drag the collection onto the page, and from the context menu choose the type of form that will be used to display or collect data for the object. For a form, you are given the following choices:

    • ADF Form: Launches the Edit Form Fields dialog that allows you to select individual attributes instead of having JDeveloper create a field for every attribute by default. It also allows you to select the label and UI component used for each attribute. By default, ADF inputText components are used for most attributes. Each inputText component has the label attribute populated.

      Attributes that are dates use the InputDate component. Additionally, if a control hint has been created for an attribute, or if the attribute has been configured to be a list, then the component set by the hint is used instead. InputText components contain a validator tag that allows you to set up validation for the attribute, and if the attribute is a number or a date, a converter is also included.


      Tip:

      For more information about validators, converters, and other attributes of the inputText component, see the "Using Input Components and Defining Forms" chapter of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.


    • ADF Read-Only Form: Same as the ADF Form, but read-only outputText components are used. Since the form is meant to display data, no validator tags are added (converters are included). Attributes of type Date use the outputText component when in a read-only form. All components are placed inside panelLabelAndMessage components, which have the label attribute populated. The panelLabelAndMessage components are placed inside a panelFormLayout component.

    • ADF Dynamic Form: Creates a form whose bindings are determined at runtime. For more information, see Section 3.8, "Using a Dynamic Form to Determine Data to Display at Runtime."

  3. In the Edit Form Fields dialog, configure your form.

    You can elect to include navigational controls that allow users to navigate through all the data objects in the collection. For more information, see Section 3.4, "Incorporating Range Navigation into Forms." You can also include a Submit button used to submit the form. This button submits the HTML form and applies the data in the form to the bindings as part of the JSF/ADF page lifecycle. For additional help in using the dialog, click Help. All UI components are placed inside a panelFormLayout component.

  4. If you are building a form that allows users to update data, you now need to drag and drop a method that will perform the update. For more information, see Section 3.6, "Creating a Form to Edit an Existing Record."

3.3.2 What Happens When You Create a Form

Dropping an object as a form from the Data Controls panel has the same effect as dropping a single attribute, except that multiple attribute bindings and associated UI components are created. The attributes on the UI components (such as value) are bound to properties on that attribute's binding object (such as inputValue) or to the values of control hints set on the corresponding service. Example 3-5 shows some of the code generated on the JSF page when you drop the suppliersFindAll accessor collection as a default ADF form to create the Edit Suppliers Details form.


Note:

If an attribute is marked as hidden on the associated structure definition file, then no corresponding UI is created for it.


Example 3-5 Code on a JSF Page for an Input Form

<af:panelFormLayout id="pfl1">
  <af:inputText value="#{bindings.supplierName.inputValue}"
                label="#{bindings.supplierName.hints.label}"
                required="#{bindings.supplierName.hints.mandatory}"
                columns="#{bindings.supplierName.hints.displayWidth}"
                maximumLength="#{bindings.supplierName.hints.precision}"
                shortDesc="#{bindings.supplierName.hints.tooltip}"
                id="it4">
    <f:validator binding="#{bindings.supplierName.validator}"/>
  </af:inputText>
  <af:inputText value="#{bindings.email.inputValue}"
                label="#{bindings.email.hints.label}"
                required="#{bindings.email.hints.mandatory}"
                columns="#{bindings.email.hints.displayWidth}"
                maximumLength="#{bindings.email.hints.precision}"
                shortDesc="#{bindings.email.hints.tooltip}"
                id="it3">
    <f:validator binding="#{bindings.email.validator}"/>
  </af:inputText>
  <af:inputText value="#{bindings.phoneNumber.inputValue}"
                label="#{bindings.phoneNumber.hints.label}"
                required="#{bindings.phoneNumber.hints.mandatory}"
                columns="#{bindings.phoneNumber.hints.displayWidth}"
                maximumLength="#{bindings.phoneNumber.hints.precision}"
                shortDesc="#{bindings.phoneNumber.hints.tooltip}"
                id="it1">
    <f:validator binding="#{bindings.phoneNumber.validator}"/>
  </af:inputText>
  <af:inputText value="#{bindings.supplierStatus.inputValue}"
                label="#{bindings.supplierStatus.hints.label}"
                required="#{bindings.supplierStatus.hints.mandatory}"
                columns="#{bindings.supplierStatus.hints.displayWidth}"
                maximumLength="#{bindings.supplierStatus.hints.precision}"
                shortDesc="#{bindings.supplierStatus.hints.tooltip}"
                id="it2">
    <f:validator binding="#{bindings.supplierStatus.validator}"/>
  </af:inputText>
. . .
</af:panelFormLayout>

Note:

For information regarding the validator and converter tags, see the "Validating and Converting Input" chapter of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.


3.4 Incorporating Range Navigation into Forms

When you create an ADF Form, if you elect to include navigational controls, JDeveloper includes ADF Faces command components bound to existing navigational logic on the data control. This built-in logic allows the user to navigate through all the data objects in the collection. For example, Figure 3-4 shows a form that would be created if you dragged the suppliersFindAll accessor and dropped it as an ADF Form that uses navigation.

Figure 3-4 Navigation in a Form

Navigation buttons in the detail page for search results

3.4.1 How to Insert Navigation Controls into a Form

By default, when you choose to include navigation when creating a form using the Data Controls panel, JDeveloper creates First, Last, Previous, and Next buttons that allow the user to navigate within the collection.

You can also add navigation buttons to an existing form manually.

To manually add navigation buttons:

  1. From the Data Controls panel, select the operation associated with the collection of objects on which you wish the operation to execute, and drag it onto the JSF page.

    For example, if you want to navigate through a collection of products, you would drag the Next operation associated with the suppliersFindAll accessor. Figure 3-5 shows the operations associated with the suppliersFindAll accessor.

    Figure 3-5 Operations Associated with a Collection

    Navigation operations in the DCP
  2. From the ensuing context menu, choose either ADF Button or ADF Link.


Tip:

You can also drop the First, Previous, Next, and Last buttons at once. To do so, drag the corresponding collection, and from the context menu, choose Navigation > ADF Navigation Buttons.


3.4.2 What Happens When You Create Command Buttons

When you drop any operation as a command component, JDeveloper:

  • Defines an action binding in the page definition file for the associated operations

  • Configures the iterator binding to use partial page rendering for the collection

  • Inserts code in the JSF page for the command components

3.4.2.1 Action Bindings for Built-in Navigation Operations

Action bindings execute business logic. For example, they can invoke built-in methods on the action binding object. These built-in methods operate on the iterator or on the data control itself, and are represented as operations in the Data Controls panel. JDeveloper provides navigation operations that allow users to navigate forward, backwards, to the first object in the collection, and to the last object.

Like value bindings, action bindings for operations contain a reference to the iterator binding when the action binding is bound to one of the iterator-level actions, such as Next or Previous. These types of actions are performed by the iterator, which determines the current object and can therefore determine the correct object to display when a navigation button is clicked.

Action bindings use the RequiresUpdateModel property, which determines whether or not the model needs to be updated before the action is executed. In the case of navigation operations, by default this property is set to true, which means that any changes made at the view layer must be moved to the model before navigation can occur. Example 3-6 shows the action bindings for the navigation operations.

Example 3-6 Page Definition Code for an Operation Action Binding

<action IterBinding="CustomerInfoVO1Iterator" id="First"
         RequiresUpdateModel="true" Action="first"/>
<action IterBinding="CustomerInfoVO1Iterator" id="Previous"
        RequiresUpdateModel="true" Action="previous"/>
<action IterBinding="CustomerInfoVO1Iterator" id="Next"
        RequiresUpdateModel="true" Action="next"/>
<action IterBinding="CustomerInfoVO1Iterator" id="Last"
        RequiresUpdateModel="true" Action="last"/>

3.4.2.2 Iterator RangeSize Attribute

Iterator bindings have a rangeSize attribute that the binding uses to determine the number of data objects to make available for the page for each iteration. This attribute helps in situations when the number of objects in the data source is quite large. Instead of returning all objects, the iterator binding returns only a set number, which then become accessible to the other bindings. Once the iterator reaches the end of the range, it accesses the next set. Example 3-7 shows the default range size for the suppliersFindAll iterator.

Example 3-7 RangeSize Attribute for an Iterator

<accessorIterator MasterBinding="SessionEJBLocalIterator"
                  Binds="suppliersFindAll" RangeSize="25"
                  DataControl="SessionEJBLocal" BeanClass="model.Suppliers"
                  id="suppliersFindAllIterator" ChangeEventPolicy="ppr"/>

Note:

This rangeSize attribute is not the same as the rows attribute on a table component.


By default, the rangeSize attribute is set to 25. This means that a user can view 25 objects, navigating back and forth between them, without needing to access the data source. The iterator keeps track of the current object. Once a user clicks a button that requires a new range (for example, clicking the Next button on object number 25), the binding object executes its associated method against the iterator, and the iterator retrieves another set of 25 records. The bindings then work with that set. You can change this setting as needed. You can set it to -1 to have the full record set returned.


Note:

When you create a navigable form using the Data Controls panel, the CacheResults property on the associated iterator is set to true. This ensures that the iterator's state, including currency information, is cached between requests, allowing it to determine the current object. If this property is set to false, navigation will not work.


Table 3-1 shows the built-in navigation operations provided on data controls and the result of invoking the operation or executing an event bound to the operation. For more information about action events, see the "What Happens at Runtime: How Action Events and Action Listeners Work" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

Table 3-1 Built-in Navigation Operations

OperationWhen invoked, the associated iterator binding will...

First

Move its current pointer to the beginning of the result set.

Last

Move its current pointer to the end of the result set.

Previous

Move its current pointer to the preceding object in the result set. If this object is outside the current range, the range is scrolled backward a number of objects equal to the range size.

Next

Move its current pointer to the next object in the result set. If this object is outside the current range, the range is scrolled forward a number of objects equal to the range size.

Previous Set

Move the range backward a number of objects equal to the range size attribute.

Next Set

Move the range forward a number of objects equal to the range size attribute.


3.4.2.3 EL Expressions Used to Bind to Navigation Operations

When you create command components using navigation operations, the command components are placed in a panelGroupLayout component. JDeveloper creates an EL expression that binds a navigational command button's actionListener attribute to the execute property of the action binding for the given operation.

At runtime an action binding will be an instance of the FacesCtrlActionBinding class, which extends the core JUCtrlActionBinding implementation class. The FacesCtrlActionBinding class adds the following methods:

  • public void execute(ActionEvent event): This is the method that is referenced in the actionListener property, for example #{bindings.First.execute}.

    This expression causes the binding's operation to be invoked on the iterator when a user clicks the button. For example, the First command button's actionListener attribute is bound to the execute method on the First action binding.

  • public String outcome(): This can be referenced in an Action property, for example #{bindings.Next.outcome}.

    This can be used for the result of a method action binding (once converted to a String) as a JSF navigation outcome to determine the next page to navigate to.


    Note:

    Using the outcome method on the action binding implies tying the view-controller layer too tightly to the model, so it should rarely be used.


Every action binding for an operation has an enabled boolean property that Oracle ADF sets to false when the operation should not be invoked. By default, JDeveloper binds the UI component's disabled attribute to this value to determine whether or not the component should be enabled. For example, the UI component for the First button has the following as the value for its disabled attribute:

#{!bindings.First.enabled}

This expression evaluates to true whenever the binding is not enabled, that is, when the operation should not be invoked, thereby disabling the button. In this example, because the framework will set the enabled property on the binding to false whenever the first record is being shown, the First button will automatically be disabled because its disabled attribute is set to be true whenever enabled is False. For more information about the enabled property, see the "Oracle ADF Binding Properties" appendix of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

Example 3-8 shows the code generated on the JSF page for navigation operation buttons. For more information about the partialSubmit attribute on the button, see the "Enabling Partial Page Rendering Declaratively" section of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework. For information about automatic partial page rendering for the binding, see the "What You May Need to Know About Automatic Partial Page Rendering" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

Example 3-8 JSF Code for Navigation Buttons Bound to ADF Operations

<f:facet name="footer">
   <af:panelGroupLayout>
     <af:commandButton actionListener="#{bindings.First.execute}"
                       text="First"
                       disabled="#{!bindings.First.enabled}"
                       partialSubmit="true" id="cb1"/>
     <af:commandButton actionListener="#{bindings.Previous.execute}"
                       text="Previous"
                       disabled="#{!bindings.Previous.enabled}"
                       partialSubmit="true" id="cb2"/>
     <af:commandButton actionListener="#{bindings.Next.execute}"
                       text="Next"
                       disabled="#{!bindings.Next.enabled}"
                       partialSubmit="true" id="cb3"/>
     <af:commandButton actionListener="#{bindings.Last.execute}"
                       text="Last"
                       disabled="#{!bindings.Last.enabled}"
                       partialSubmit="true" id="cb4"/>
   </af:panelGroupLayoutr>
 </f:facet>

3.5 Creating a Form Using a Method That Takes Parameters

There may be cases where a page needs information before it can display content. For these types of pages, you create the form using a returned collection from a method that takes parameters. The requesting page needs to supply the value of the parameters in order for the method to execute.

For example, the form on the productInfo page is created using the returned collection from the findProductById(Long) method. Instead of returning all products, it returns only the product the user selected on the previous page. The toolbar button on the previous page sets the parameter (Long), which provides the product's ID. For more information about using a command component to set a parameter value, see Section 3.5.4, "What You May Need to Know About Setting Parameters with Methods."

3.5.1 How to Create a Form or Table Using a Method That Takes Parameters

To create forms that require parameters, you must be able to access the values for the parameters in order to determine the record(s) to return. You access those values by adding logic to a command button on another page that will set the parameter value on some object that the method can then access. For example, on the browse.jspx page, the Edit toolbar button sets the product ID in the pageFlow scope. To create the form showing the product information, you use the return of the findProductById(Long) method, and you have that method access the parameter on the pageFlow scope, where it is stored.

Before you begin:

You need to create a method on your session bean that will return the items needed to be displayed in your form. For example, the findProductById(Long) method was added to the SupplierFacadeBean.java class.


Tip:

You need to refresh the Data Controls panel in order for any changes made to services to display in the panel. To refresh the panel, click the Refresh icon.


To create a form or table that uses parameters:

  1. From the Data Controls panel, drag a collection that is a return of a method that takes a parameter or parameters and drop it as any type of form.

    For example, to create the form that displays when you click the toolbar button to edit a product, you would drag and drop the Product return, as shown in Figure 3-6.

    Figure 3-6 Return of a Custom Method That Takes Parameters

    Method return that takes parameters
  2. In the Edit Form Fields dialog, configure the form as needed and click OK.

    For help in using the dialogs, click Help.

    Because the method takes parameters, the Edit Action Binding dialog opens, asking you to set the value of the parameters.

  3. In the Action Binding Editor, enter the value for each parameter by clicking the browse (...) icon in the Value field to open the EL Expression Builder. Select the node that represents the value for the parameter.

    For example, the toolbar button uses a setActionListenerComponent that sets the productId parameter value on the pageFlow scope. To access that value, you would use #{pageFlowScope.ProductId} as the value for the parameter.

    This editor uses the value to create the NamedData element that will represent the parameter when the method is executed. Since you are dropping a collection that is a return of the method (unlike a method bound to a command button), this method will be run when the associated iterator is executed as the page is loaded. You want the parameter value to be set before the page is rendered. This means the NamedData element needs to get this value from wherever the sending page has set it.

3.5.2 What Happens When You Create a Form Using a Method That Takes Parameters

When you use a return of a method that takes parameters to create a form, JDeveloper:

  • Creates an action binding for the method, a method iterator binding for the result of the method, and attribute bindings for each of the attributes of the object, or in the case of a table, a table binding. It also creates NamedData elements for each parameter needed by the method.

  • Inserts code in the JSF page for the form using ADF Faces components.

Example 3-9 shows the action method binding created when you drop the findProductById(Long) method, where the value for the productId was set to the ProductId attribute stored in pageFlowScope.

Example 3-9 Method Action Binding for a Method Return

<bindings>
  <methodAction id="findProductById" RequiresUpdateModel="true"
                Action="invokeMethod" MethodName="findProductById"
                IsViewObjectMethod="false" DataControl="SupplierFacadeLocal"
                InstanceName="SupplierFacadeLocal.dataProvider"
                ReturnName="SupplierFacadeLocal.methodResults.findProductById_
                         SupplierFacadeLocal_dataProvider_findProductById_result">
    <NamedData NDName="productId" NDValue="#{pageFlowScope.ProductId}"
                       NDType="java.lang.Long"/>
  </methodAction>
...
</bindings>

Note that the NamedData element will evaluate to productID on the pageFlowScope, as set by any requesting page.

3.5.3 What Happens at Runtime: Setting Parameters for a Method

Unlike a method executed when a user clicks a command button, a method used to create a form is executed as the page is loaded. When the method is executed in order to return the data for the page, the method evaluates the EL expression for the NamedData element and uses that value as its parameter. It is then able to return the correct data. If the method takes more than one parameter, each is evaluated in turn to set the parameters for the method.

For example, when the ProductInfo page loads, it takes the value of the ProductId parameter on the pageFlow scope, and sets it as the value of the parameter needed by the findProductById(Integer) method. Once that method executes, it returns only the record that matches the value of the parameter. Because you dropped the return of the method to create the form, that return is the product that is displayed.

3.5.4 What You May Need to Know About Setting Parameters with Methods

There may be cases where an action on one page needs to set parameters that will be used to determine application functionality. For example, you can create a command button on one page that will navigate to another page, but a component on the resulting page will display only if the parameter value is false.

You can use a managed bean to pass this parameter between the pages, and to contain the method that is used to check the value of this parameter. A setPropertyListener component with the type property set to action, which is nested in the command button, is then used to set parameter. For more information about setting parameters using methods, see the "Setting Parameter Values Using a Command Component" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.


Note:

If you are using task flows, you can use the task flow parameter passing mechanism. For more information, see the "Using Parameters in Task Flows" chapter of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.


3.5.5 What You May Need to Know About Using Contextual Events Instead of Parameters

Often a page or a region within a page needs information from somewhere else on the page or from a different region (for more information about regions, see the "Using Task Flows as Regions" sections of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework). While you can pass parameters to obtain that information, doing so makes sense only when the parameters are well known and the inputs are EL-accessible to the page. Parameters are also useful when a task flow may need to be restarted if the parameter value changes.

However, suppose you have a task flow with multiple page fragments that contain various interesting values that could be used as input on one of the pages in the flow. If you were to use parameters to pass the value, the task flow would need to surface output parameters for the union of each of the interesting values on each and every fragment. Instead, for each fragment that contains the needed information, you can define a contextual event that will be raised when the page is submitted. The page or fragment that requires the information can then subscribe to the various events and receive the information through the event.

You can create and configure contextual events using a page definition file. For more information, see the "Creating Contextual Events" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

3.6 Creating a Form to Edit an Existing Record

You can create a form that allows a user to edit the current data, and then commit those changes to the data source. To do this, you use methods that can modify data records associated with the collection to create command buttons. For example, you can use the default mergeSuppliers(Suppliers) method to create a button that allows a user to update a supplier.

If the page is not part of a bounded task flow, you need to use the merge or persist method associated with the collection to merge the changes back into the collection (for more information about the difference between the two, see Section 3.6.3, "What You May Need to Know About the Difference Between the Merge and Persist Methods"). If the page is part of a transaction within a bounded task flow, you use the commit and rollback operations to resolve the transaction in a task flow return activity. For more information, see the "Using Task Flow Return Activities" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

3.6.1 How to Create Edit Forms

To use methods on a form, you follow the same procedures as with the operations.

To create an edit form:

  1. From the Data Controls panel, drag the collection for which you wish to create the form, and choose ADF Form from the context menu.

    This creates a form using inputText components, which will allow the user to edit the data in the fields.

  2. From the Data Controls panel, select the merge or persist method associated with the collection of objects on which you wish the operation to execute, and drag it onto the JSF page.

    For example, if you want to be able to update a supplier record and will not be working with that instance again, you would drag the mergeSuppliers(Suppliers) method. For more information about the difference between the merge and persist methods, see Section 3.6.3, "What You May Need to Know About the Difference Between the Merge and Persist Methods."

  3. From the ensuing context menu, choose either ADF Button or ADF Link.

  4. In the Edit Action Binding dialog, you need to populate the value for the method's parameter. For the merge methods (and the other default methods), this is the object being updated.

    1. In the Parameters section, use the Value dropdown list to select Show EL Expression Builder.

    2. In the Expression Builder, expand the node for the accessor's iterator, then expand the currentRow node, and select dataProvider.

      This will create an EL expression that evaluates to the data for the current row in the accessor's iterator.

    3. Click OK.

    For example, if you created a form using the suppliersFindAll accessor collection, then JDeveloper would have created an accessorIterator binding named suppliersFindAllIterator. You would need to select the dataProvider for the current row under that iterator, as shown in Figure 3-7. This reference means that the parameter value will resolve to the value of the row currently being shown in the form.

    Figure 3-7 dataProvider for the Current Row on the suppliersFindAllIterator Binding

    dataProvider for Current Row on suppliersFindAllIterator

    Note:

    If the page is part of a transaction within a bounded task flow, then instead of creating a button from the merge method (or other default method), you would set that method as the value for the transaction resolution when creating the task flow return activity. For more information, see the "Using Task Flow Return Activities" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.


3.6.2 What Happens When You Use Methods to Change Data

When you drop a method as a command button, JDeveloper:

  • Defines a method binding for the method. If the method takes any parameters, JDeveloper creates NamedData elements that hold the parameter values. For more information about NamedData elements, see Section 3.5.3, "What Happens at Runtime: Setting Parameters for a Method."

  • Inserts code in the JSF page for the ADF Faces command component. This code is the same as code for any other command button, as described in Section 3.6.2.2, "Using EL Expressions to Bind to Methods." However, instead of being bound to the execute method of an action binding for an operation, the buttons are bound to the execute method of the action binding for the method that was dropped.

3.6.2.1 Method Bindings

Similar to when you create a button from a built-in operation, when you create a button from a method, JDeveloper creates an action binding for the method. Example 3-10 shows the action binding created when you drop the mergeSuppliers(Suppliers) method.

Example 3-10 Page Definition Code for an Action Binding Used by the Iterator

<bindings>
  <methodAction id="mergeSuppliers" RequiresUpdateModel="true"
                Action="invokeMethod" MethodName="mergeSuppliers"
                IsViewObjectMethod="false" DataControl="SessionEJBLocal"
                InstanceName="SessionEJBLocal.dataProvider"
                ReturnName="SessionEJBLocal.methodResults.mergeSuppliers_
                            SessionEJBLocal_dataProvider_persistSuppliers_result">
      <NamedData NDName="suppliers" NDType="model.Suppliers"/>
    </methodAction>
</bindings>

In this example, when the binding is accessed, the method is invoked because the action property value is invokeMethod.

When you drop a method that takes parameters onto a JSF page, JDeveloper also creates NamedData elements for each parameter. These elements represent the parameters of the method. For example, the mergeSuppliers(Suppliers) method action binding contains a NamedData element for the Suppliers parameter.

3.6.2.2 Using EL Expressions to Bind to Methods

Like creating command buttons using navigation operations, when you create a command button using a method, JDeveloper binds the button to the method using the actionListener attribute. The button is bound to the execute property of the action binding for the given method. This binding causes the binding's method to be invoked on the business service. For more information about the actionListener attribute, see the "What Happens at Runtime: How Action Events and Action Listeners Work" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.


Tip:

Instead of binding a button to the execute method on the action binding, you can bind the button to a method in a backing bean that overrides the execute method. Doing so allows you to add logic before or after the original method runs. For more information, see Section 3.6.4, "What You May Need to Know About Overriding Declarative methods."


Like navigation operations, the disabled property on the button uses an EL expression to determine whether or not to display the button. Example 3-11 shows the EL expression used to bind the command button to the mergeSuppliers(Suppliers) method.

Example 3-11 JSF Code to Bind a Command Button to a Method

<af:commandButton actionListener="#{bindings.mergeSupplier.execute}"
                  text="mergeSupplier"
                  disabled="#{!bindings.mergeSupplier.enabled}"
                  id="cb1"/>

Tip:

When you drop a UI component onto the page, JDeveloper automatically gives it an ID based on the number of the same type of component previously dropped, for example, cb1, cb2. You may want to change the ID to something more descriptive, especially if you will need to refer to it in a backing bean that contains methods for multiple UI components on the page.


3.6.3 What You May Need to Know About the Difference Between the Merge and Persist Methods

If when you created your session bean, you chose to expose the merge and persist methods for a structured object, then those methods appear in the Data Controls panel and you can use them to create buttons that allow the user to merge and persist the current instance of the object. Which you use depends on whether the page will need to interact with the instance once updates are made. If you want to be able to continue to work with the instance, then you need to use the persist method.

The merge methods are implementations of the JPA EntityManager.merge method. This method takes the current instance, copies it, and passes the copy to the PersistenceContext. It then returns a reference to that persisted entity and not to the original object. This means that any subsequent changes made to that instance will not be persisted unless the merge method is called again.

The persist methods are implementations of the JPA EntityManager.persist method. Like the merge method, this method passes the current instance to the PersistenceContext. However, the context continues to manage that instance so that any subsequent updates will be made to the instance in the context.

3.6.4 What You May Need to Know About Overriding Declarative methods

When you drop an operation or method as a command button, JDeveloper binds the button to the execute method for the operation or method. However, there may be occasions when you need to add logic before or after the existing logic. JDeveloper allows you to add logic to a declarative operation by creating a new method and property on a managed bean that provides access to the binding container. By default, this generated code executes the operation or method. You can then add logic before or after this code. JDeveloper automatically binds the command component to this new method, instead of to the execute property on the original operation or method. Now when the user clicks the button, the new method is executed. For more information, see the "Overriding Declarative Methods" section in the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

3.7 Creating an Input Form

You can create a form that allows a user to enter information for a new record and then commit that record to the data source. You need to use a task flow that contains a method activity that will call the Create operation before the page with the input form is displayed. This method activity causes a blank row to be inserted into the row set which the user can then populate using a form.


Tip:

For more information about task flows, see the "Creating ADF Task Flows" part of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.


For example, in the Supplier module, you could create a new form that allows the user to create an address. You might create a create-address-task-flow task flow that contains a createAddress method activity, which calls the Create operation on the addresses accessor. Control is then passed to the createAddress view activity, which displays a form where the user can enter a new address, as shown in Figure 3-8.

Figure 3-8 Create an Address

Address input form

Note:

If your application does not use task flows, then the calling page should invoke the create operation similar to the way in which a task flow's method activity would. For example, you could provide application logic within an event handler associated with a command button on the calling page.


3.7.1 How to Create an Input Form Using a Task Flow

You create an input form within a bounded task flow to ensure proper transaction handling.

Before you begin:

You need to create a bounded task flow that will contain both the form and the method activity that will execute the Create operation. The task flow should start a new transaction. For procedures, see the "Creating a Task Flow" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

To create an input form:

  1. To the bounded task flow, add a method activity. Have this activity execute the Create operation associated with the accessor for which you are creating the form. For these procedures on using method activities, see the "Using Method Call Activities" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

    For example, to create the form that would allow users to create addresses, you would have the method activity execute the Create operation associated with the addresses accessor.

  2. In the Property Inspector, enter a string for the fixed-outcome property. For example, you might enter create as the fixed-outcome value.

  3. Add a view activity that represents the page for the input form. For information on adding view activities, see the "Using View Activities" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

  4. Add a control flow case from the method activity to the view activity. In the Property Inspector, enter the value of the fixed-outcome property of the method activity set in Step 2 as the value of the from-outcome of the control flow case.

  5. Open the page for the view activity in the design editor, and from the Data Controls panel, drag the collection for which the form will be used to create a new record, and choose ADF Form from the context menu.

    For example, for the form to create addresses, you would drag the addresses accessor collection from the Data Controls panel.


    Tip:

    If you want the user to be able to create multiple entries before committing to the database, do the following:

    1. In the task flow, add another control flow case from the view activity back to the method activity, and enter a value for the from-outcome method. For example, you might enter createAnother.

    2. Drag and drop a command component from the Component Palette onto the page, and set the action attribute to the from-outcome just created. This will cause the task flow to return to the method activity and reinvoke the Create operation.


  6. In the task flow, add a return activity. This return activity must execute the commit operation on the data control. For these procedures, see the "Using Task Flow Return Activities" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.


    Tip:

    If when you set the return activity to execute the commit operation the activity shows an error, it is probably because the task flow itself is not set up to start a transaction. You need to set it to do so. For more information, see the "Managing Transactions" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.


  7. Add a control flow case from the view activity to the return activity. Set the fixed-outcome attribute to a text string. For example, you might set it to return.

  8. From the Component Palette, drag and drop a button or other command component that will be used to invoke the return activity. Set the action attribute to the text string set as the fixed-outcome created in Step 7.

3.7.2 What Happens When You Create an Input Form Using a Task Flow

When you use an ADF Form to create an input form, JDeveloper:

  • Creates an iterator binding for the accessor and an action binding for the Create operation in the page definition for the method activity. The Create operation is responsible for creating a row in the row set and populating the data source with the entered data. In the page definition for the page, JDeveloper creates an iterator binding for the returned collection and attribute bindings for each of the attributes of the object in the collection, as for any other form.

  • Inserts code in the JSF page for the form using ADF Faces inputText components, and in the case of the operations, commandButton components.

For example, the form shown in Figure 3-8 might be displayed by clicking a "Create Address" link on the main page. This link then navigates to the form where you can input data for a new address. Once the address is created, and you click the Save button, you return to the main page. Figure 3-9 shows a create-address-task-flow task flow with the newAddress method activity.

Figure 3-9 Task Flow for an Input Form

Task flow for an input form

Example 3-12 shows the page definition file for the method activity.

Example 3-12 Page Definition Code for a Creation Method Activity

<executables>
  <iterator Binds="root" RangeSize="25" DataControl="SupplierFacadeLocal"
            id="SupplierFacadeLocalIterator"/>
  <accessorIterator MasterBinding="SupplierFacadeLocalIterator"
                    Binds="addresses" RangeSize="25"
                    DataControl="SupplierFacadeLocal"
                    BeanClass="oracle.fodemo.supplier.model.Addresses"
                    id="addressesIterator"/>
</executables>
<bindings>
  <action IterBinding="addressesIterator" id="Create"
          RequiresUpdateModel="true" Action="createRow"/>
</bindings>

3.7.3 What Happens at Runtime: Invoking the Create Action Binding from the Method Activity

When the newAddress method activity is accessed, the Create action binding is invoked, which executes the CreateInsertRow operation, and a new blank instance for the collection is created. Note that during routing from the method activity to the view activity, the method activity's binding container skips validation for required attributes, allowing the blank instance to be displayed in the form on the page.

3.8 Using a Dynamic Form to Determine Data to Display at Runtime

ADF Faces offers a library of dynamic components that includes dynamic form and dynamic table widgets that you can drop from the Data Controls panel. Dynamic components differ from standard components in that all the binding metadata is created at runtime. This dynamic building of the bindings allows you set display information using control hints for attributes on the entity, instead of configuring the information in the Edit Form Fields dialog as you drop the control onto the page. Then if you want to change how the data displays, you need only change it in the structure definition file, and all dynamic components bound to that Java object will change their display accordingly. With standard components, if you want to change any display attributes (such as the order or grouping of the attributes), you would need to change each page on which the data is displayed.

For example, in the Suppliers module, you could set the category and field order attribute hints on the Suppliers Java object that groups the supplierName and supplierID attributes together and at the top of a form (or at the leftmost columns of a table), the supplierStatus at the bottom of a form (or the rightmost columns of a table), and the email and phoneNumber together and at the middle of a form or table.

Figure 3-10 shows a dynamic form at runtime created by dragging and dropping the Supplier collection with control hints set in this manner.

Figure 3-10 Dynamic Form Displays Based on Hints Set on the Metatdata for the Java Object

supplier detail dynamic form

3.8.1 How to Use Dynamic Forms

To use dynamic forms you first need to set control hints (especially the order and grouping hints) on the structure file for the corresponding Java objects. Next you import the libraries for the dynamic components. You can then drop the dynamic form or table widgets onto your page.

Before you begin:

You need to set the category and field order control hints on the attributes in the structure file for the associated Java object.

For example, for the dynamic form in Figure 3-10, you would set the category and field order control hints for the supplierId, supplierName, phoneNumber, email, and supplierStatus attributes, as follows:

  1. Enter a String for the Category field.

    Use this same String for the Category value for any other attribute that you want to appear with this attribute in a group. For example, the Category value for both the phoneNumber and email attributes is contact.

  2. Enter a number for the Field Order field that represents where in the group this attribute should appear.

    For example, the phoneNumber has a Field Order value of 1 and the email attribute has a value of 2.

For procedures on creating control hints, see the "Defining Attribute Control Hints for View Objects" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

To use dynamic components:

  1. If not already included, import the dynamic component library.

    1. In the Application Navigator, right-click the view project in which the dynamic components will be used, and from the context menu, choose Project Properties.

    2. In the Project Properties dialog, select the JSP Tag Libraries node.

    3. On the JSP Tag Libraries page, click Add.

    4. In the Choose Tag Libraries dialog, select ADF Dynamic Components and click OK.

    5. On the JSP Tag Libraries page, click OK.

  2. From the Data Controls panel, drag the collection onto the page, and from the context menu, choose Forms > ADF Dynamic Form.


    Tip:

    If dynamic components are not listed, then the library was not imported into the project. Repeat Step 1.


  3. In the Property Inspector, enter the following: for the Category field:

    • Category: Enter the string used as the value for the Category UI hint for the first group you'd like to display in your form. For example, in Figure 3-10, the Category value would be id.

    • Editable: Enter true if you want the data to be editable (the default). Enter false if the data should be read-only.

  4. Repeat Steps 6 and 7 for each group that you want to display on the form. For example, the form in Figure 3-10 is actually made up of three different forms: one for the category id, one for the category contact, and one for the category status.

3.8.2 What Happens When You Use Dynamic Components

When you drop a dynamic form, only a binding to the iterator is created. Example 3-13 shows the page definition for a page that contains one dynamic form component created by dropping the supplier collection. Note that no attribute bindings are created.

Example 3-13 Page Definition Code for a Dynamic Form

<pageDefinition xmlns="http://xmlns.oracle.com/adfm/uimodel"
                version="11.1.1.53.2" id="DynamicFormPageDef"
                Package="package.pageDefs">
  <parameters/>
  <executables>
    <iterator Binds="root" RangeSize="25"
              DataControl="SupplierFacadeLocal"
              id="SupplierFacadeLocalIterator"/>
    <accessorIterator MasterBinding="SupplierFacadeLocalIterator"
                      Binds="supplier" RangeSize="25"
                      DataControl="SupplierFacadeLocal"
                      BeanClass="oracle.fodemo.supplier.model.Supplier"
                      id="supplierIterator"/>
  </executables>
  <bindings/>
</pageDefinition>

JDeveloper inserts a form tag which contains a dynamic form tag for each of the forms dropped. The form tag's value is bound to the iterator binding, as shown in Example 3-14. This binding means the entire form is bound to the data returned by the iterator. You cannot set display properties for each attribute individuality, nor can you rearrange attributes directly on the JSF page.

Example 3-14 JSF Page Code for a Dynamic Form

<af:document>
  <af:messages/>
  <af:form>
    <dynamic:form value="#{bindings.supplierIterator}" id="f1"
                  category="id"/>
    <dynamic:form value="#{bindings.supplierIterator}" id="f2"
                  category="contact"/>
    <dynamic:form value="#{bindings.supplierIterator}" id="f3"
                  category="status"/>  </af:form>
</af:document>

Tip:

You can set certain properties that affect the functionality of the form. For example, you can make a form available for upload, set the rendered property, or set a partial trigger. To do this, select the af:form tag in the Structure window, and set the needed properties using the Property Inspector.


3.8.3 What Happens at Runtime: How Attribute Values Are Dynamically Determined

When a page with dynamic components is rendered, the bindings are created just as they are when items are dropped from the Data Controls panel at design time, except that they are created at runtime. For more information, see Section 3.3.2, "What Happens When You Create a Form."


Tip:

While there is a slight performance hit because the bindings need to be created at runtime, there is also a performance gain because the JSF pages do not need to be regenerated and recompiled when the structure of the view object changes.


3.8.4 What You May Need to Know About Converters for Dynamic Forms

By default, when you create a dynamic form, any necessary converters are created dynamically and the converter's pattern string is set to the format hint on the attribute definition in the view object.

If you want to use an alternate format string for a converter for attributes of a given Java type, you can do so by creating a custom converter and registering it in the faces-config.xml file to be used on attributes of that type. Example 3-15 shows a faces-config.xml entry for a converter for java.sql.Date attributes.

Example 3-15 faces-config.xml Entry for a Custom Converter

<converter>
   <display-name>Date Time Converter</display-name>
   <converter-for-class>java.sql.Date</converter-for-class>
   <converter-class>sample.apps.view.DateTimeConverter</converter-class>
</converter>

The custom converter that you create must extend an ADF Faces or Trinidad converter class (such as org.apache.myfaces.trinidadinternal.convert.DateTimeConverter and implement the getPattern() method. For more information on creating a custom converter, see "Creating Custom JSF Converters" in the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.

The dynamic form looks up the converter based on the Java type specified in the faces-config.xml entry. If the attribute definition in the view object has a format hint specified, then that hint is used as a pattern on the converter. Otherwise, the pattern is untouched and the default pattern from the return of the converter's getPattern() method is used.

3.9 Modifying the UI Components and Bindings on a Form

Once you use the Data Controls panel to create any type of form (except a dynamic form), you can then delete attributes, change the order in which they are displayed, change the component used to display data, and change the attribute to which the components are bound.

For more information about modifying existing UI components and bindings, see the "Modifying the UI Components and Bindings on a Form" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

PK~aMPK4HwEOEBPS/img/adf_structure.pngPNG  IHDR=?.sRGBgAMA a cHRMz&u0`:pQ<rIDATx^sW[؈$b;ucf^,l0͛0׻^P ? 9Ǿ MWcX+@P @(2Q _p8f5c&w@ l(( ~_ѳ>+ifʝT"`T aUpa;C(J^\g*;wLs~%-nM¦X:wl8=P*P @(@RSLmݷ+j|ͰII};Χa0qJ;6V+T)m]s6p̿ӡ(P0HG;}h qiQI+( B-PD0AST(!SswlQ p,LGP @(@HGW \"`L@ @&YOn>Ol2,8kB|>! }ƱFf頦jwjK?DIS4UGss1',8QP @(P ~Mj@{O4Usӵ5;F I58i Dq46 (P _L @(Qp̏gT(P8ΩqAP @(@~8Y( @((:Ǣsj\P @(xJP @(N#P G#1?RP @Sp,:A(Qp̏gT(P8ΩqAP @(@~8Y( @((:|iSb1'mj?z+ן6mMt.纞t9sn2. @(P %4ǐuT) 28$1n2'xB1*.ƻZƧ]hAbmj0*kl`%U%o[ye'JiT+mMtG3|whVG\ w-W4ÈWn^#(<ׅw`qjb,ZG ,])vV~P@6 yM_QB_A\S_Ž+ 84(Q\ ϥ5|Ǥf2S=ڨ6hz~Ȥӯ=&:mTLaѤiB2*kuT>/ {p̨Z9;GfaoE MAbG0~d&$hP,>S\ ϥ5|a'$TMĞ&eG 08T0l#v;7W#~5E!Èp?HР8|-ku>*ȇ_O[d|ddV*/JΗQf:>_a'x$$4%{[R胨tp sF(xI{S_ Bw,~eX${@KqܟhA~պO/ߗrښ>[=_}BMnʔ9领>xljI2c[340yJe~kߦ)ȯ,?I-=Y:Z&{.ðѰc&&&;=8V# YFe{αXM6a;e6β=ċC Q3Ցu_8|OIfX?yu?~e{l}H̖"?[> ?f懹)ȯ}W=ǵx햠w|>g>磼 u-Q~2ugkɵ(/:8&W(/?(=ˬL|pi=6D1o2%^x`{`Yp?;Dž㟽  Sj<B8:0ѯ_61;?w"Q|a'TıPo6vo.y(d~?W+Nd^(^8iVh?5A(YQ; ?G?{:q,>@(n^VywWŨjH{oq6~6p#h^ L޹I4L~uw-=ߋu#Au=0&F|D3GG xo,jH >-8J~Z[>sCy-_Ï+SpTj~  w 8·3~>ku6p,]Ba?bkc#:gY[1of7ܗ~ -gXx9BxxG;Z]t1l:LoA(P jǨ}A(T`ffhrrR.)w>7Ɏ/"q]oFA(870Vi x4Ih}0(Gkmۨby=/xTz@& ǭnI^ 08{bzidhvP8 ֝uk5kNSU-&ne>G_%Kަ8C)8Qf584 v._s%4FbyO+ JQeڽ.`{tpTFidhuV_LQh 824f-^2]t)S,ضZg}Y-GU Xܦ43ՍbQQo&;w訄ƛ7oFcj+p4׊H#o T}G;Gw侭\vАnɼ?2+x9~܎HnX5~~\W}v~Cn+" gQ:)Yn'j%E k|uyX8:nC_RA$/%׉~c: ,dzje#w5wo"xm8tǝ;]WЩ"no=:8dQyFSHj6&꯾_n0 D@p\sy&$(c4%4^BK}h"贼Q?Y HӉJ+ }LsqDzR?'HY8`U/Vd0xA6*TXO1'],8rFb8M7nܠ)p4W="F34N\OZ;Iߚ>%4zUdPW 8 pLi*/)*ָO)Z>C~+y|ҕ/m;M1\^oukQׯן6|ZMճ}?m6O}p?-3ܟD-y~e)-JW^' ٲGʯn Uw[B`a)0$MЧbZn45I;3~SKTvGcDjP @BWp,tP @(033Cu 2<8OãylP8KC(bbw \A#O֭TP8g hR¸ zXi zWQF׭J]p:}oZ Z$=\B+oi=9dzGdi|/[k u}׷.ow6H#C#O G1m◳_`.Q\S]WFS Dh<X)=8)+gpԛWQK޼y FC\*p4׊H#o+{ߑΑro,ȟ?kW2Ҍws/ϒ2jⷔ bAo>ϺR.6A[;;ak:6,,rp;*'\5 v4?BbPϾ< ,_ԿMITvzPxߝ2WXvz@{Ϧ~CfQ7L /CPb@p|z)闯:8Nnܥ_%afN:v5ǞC>E k|>Ŵ֏NxnkX:nä;BhH>_Ka>t@/eq" vNfnMwOW rs "> *Ҩ ֣^OqujGGI֮&j (0w  ի?=6!A{dTψ,-ZT~E lD_ n`*$D%X>;=Q>p,C@N9`U/Vd0oE%5U{qIݲR]5Uh 8zEGghl;o5O7F^u5Uw5}28Jh4O`",Cu[|ZZ<6C[[r:*?ǧhk "<UJW.Se4|sz޿®}F^zr\*]/jSp5mQzQ-EXhVh 8\$37O"m_ӱiF X424xzYpQ5t=SOjJ4u+P[|cV6ڻQ1 73MIo*ss`nUU" :/.6EEY7AU4[%_yӮ'ȮLWuaoiEiרèi}jc*HX~gʝ:=#Foa-o ׿T]'XB9tcǓafi>I*Ҩ Qv`t [Xc("9$eSq/O0X+gNA?rd"۞)`:266NA=Ӵ1y'}ɦ~u[~ER}y C0 R?f?kE~/"Uh 8twwK GcDjP @BWp,tP @(033Cu'&)tO_,Xo@^ w)A, +jYZg-KjYPڃd9xp-˽\`[U{|,"|H8"\AǓ|vm]sxJjL^Dy4򞡱@8 @pd6yؠi 9Iyl45I;ľ(2Uo<fh+W˗%4vuuh(GC1rO@P O cg` Ԃ!ͭizhhHBc__/\@yzJP,(VXZ p e324^x:;;Ξ=[ Rp̕/(@A+x 8#r5TP Gc0P D#91aO %fizx7OՃ Gc?~(T`zzZc\Lϓu!(uRpŠ@Zpm`pԣ4A###ق  dž{к_К5'mZxUW7x&OK8Z/ S `j=k`-UQN w tpTFidh钰ARWh 824f-^r ̦fXtV+aJs, LMԼZ'J]VDy_wܗ/}[Mg@X!f77YkDm_xK~S%yKag'9x jIuI,_ɋS&65k S;~$*;U({N+uh:ngS n87Sh#(<ؠ@+p4^sJ4ӹwwIXپA'ghС{hp0/^7Eߥg@PDҎ wKvUqtp<\<@HpITFA[z=Y?3Q@#DVɤŬ@p\ssc_ڱGFOO o/˾O{]`dpkNǑ2S'~Q]YO- 5D:™DӔ"~ܔ'=|SEEP R֟;Uҥc 8hOA#[M''W]Mo_pT } ٠@i*/)*ָO)Z>C~+y|ҕ/m;M1\^oukQׯן6|Zԟ\ofp͓r,-3ܟD-y~e)-JW^' ٲGʯ)(7]GL$c3V;S5[iS>g65&8oo=ԯ{HO#ahAV(;#n a7ňQg5k%Q蛓7A&@S9o7De)wx4C]r._, 4(y\z&̥W7ZvPZp;4PMCCCG#(WB*p8td408ʨgdhx"uvvR{{;={6 (Pd EҸ(@v `:tYXZP @(Vpyp"P!:Pbj&GuT=ؠ@+p83P H%8< !Lqt@ | ~ GSuD 5D:™DӔ"~ "ASӢ"~M^DsRԪvq(p4W="壟F34N\OZ;Iߚ@pTHyqlׂ=':M2EWV1I<>E[gh/y1>/ ?Revz-{)sͶ.vS6ՓSن~V o##j)‚}a8ȑGq&y{yilH5jhD×dCξڎZl'E4Qq 8s"vv> Ջ=36EG'Y̏́[f?WU[ɗ2cS[|oN{T%pKe:%_yӮ'ȮLWuaoiEiרèi}j'TX~gʝ:=#Foa-o ׿?85K0%E{J6} Sp_nsd~ 0=ݐTVFɩL &)r|y2Z?s ʯMW#Nq͖qTꙦM6[>[O6(aipp7Y+r0(#n agܦ18oNRl}::*MMG̾]nC#O֭TP8{`tZZMAkUY)Gyi)FFFfU>NŠ@pl8| [YsZFOj7QuugrĞd6h#''V~Wb؊W|];Y3[̍om®ȯLGmTFF (u#Cc6/GlQ.aͅ(|ba;SP 08Dͫɨ%yrplP8kE7ƽ/_ޑΛ}Cv5/C+$ouTEo?nR$}(gh\u$נ8}\[W!GD֖*,P_Z9x αK&0fG3 ^-4p ,_ԿM3O$QB=.Vt,_AJԳ߶븽Mz nտfjmexB(ukNI|Ձq:w.. j5wұ37U> -X:q-ZX^K@lTGS]/g5mkrSzߥE*ȝ _ю.=xm8t|ǝ;]iWrOB4 zztpɢBwB_#DV)뀍P  ի?{lBK;H㩞YB!Z%tp,ؘ ~Mc>}#VP61e߯+_BTa>+gBjt3)_E#`q'L*TXO1'G|J:L^JwךGq-~*h=Ccyy5GB-E?=1SpDFO3[yF(oiji mmѫx$3O엋W)]^Lޖ9u{f[ )u{qlw OMܷGQFs@p\I7O"m_ӱiF X424xz̛]iRV6љqt`/| A}eT9|8Puofp͓r,-3ܟD-y~e)-JW^' ٲGʯZHqL )Wcq*+SV&UN9y:>guޗ<fh+W˗%4vuuC+GC=beg CN4=44$zzz?.\z8q5P ,@p p e324^x:;;Ξ= Gc5. @(^L^3Qz b(P +Ǭ'A(M#81aO %fizxT7OՃ Gc?~(T`zzZc\LΓu!(uRp@к֥7IG=ȫȨH#O 422ՠ@+p4_;C~Ak֜VѓZhMT]|?-'?pxt` |ָN{2̩&Z-ba$ߩrWXZ\:qM$UQEyj$lP8 l7ńi1ug#0)[sBT(Qo&j^MF-Aȓc@p\+"R}}G;Gw侭󦳔P]J3ɛZO-9M.'h/y֗vUyIDy+V$"t-V곒C?Ԏɵԝ!*4&܎ډ[mPCȣypM\\-B蚀\?ؼ۟yvd}XE)vPk\=q l8G8#EӶM}81 տfjmexB(ukNI|Ձq:w.. R5wұ37U> -X:q-ZX~LlKc֋R$g5Eg/)(׬NZZczBuf`{?s}APYm'nqO.Ӄ{oÙ f lp0`עE[lT>שG_+[s} ~5##VkWsZUB|(p4W\ /##zFg 'hᷗeߧ=t.Z`c28Y?pഈD ѷ鹚G]Auٞ'efIDJ ҁKTd/jr,8 z4.g[8\+:TZ.GVɞ KC(p4W="oF34N\OZ;Iߚ>{pL)Ԛ~Ǔ@P_HpD-:9!di*/)*ָO)Z>C~+y|o2gh6a6֯-UmlSR>N]%҄&jȣHZpOJ@p\Iz7O"m_ӱiF X424xz̛]nbv\)}bj ϴnO8 kStyRxؼebUU"{e<eU "tbOT۪ ΣSug|omilEKv9{ʥ{ަK<`<_]O) d@p3N}מrG^ŋˁ0Ђ7QiUc\Ӌ4 iZ*]}wqsEfbzQo&u'њ3{+TVFɩL )r|y2Z?s ʯ{@2hM\+60EpȄS_}N~ף]g:ySboR4@a~n֊ITUh 86yؠi 9Iyl4͛cr}xM(Ly_p:::X(P8 㭰`408ʨgdhx"uvvR{{;={`Ar+_B9P @V)p8Fj @((tBaȉ333QGqbžJLl(uRpP @Ǹ''WVC*(P ֝eGʍZ7;R1] ex2WXvz@{Ϧ(nUס7L /CPb@p|z)闯:8Nnܥ_%fN:v5ǞC>E kRXI?ogq+/J R$!|~.r-;ֽv RR# C)/q&򻎧+S|xܹITFe^z?;Vթyy$Zժ2%) . h  ի?{lBK;H㩞YB!Z%tp,ؘ"u61칺GZDy"2R*/Y86U' NP>;y i-T@pɯ"~ND OAEP b|TT FwZX  UOH/R{ƶVtӉkIUWS{;[cRd0?!t2OҎtuzRT-X20zi*/)*ָO)Z>C~+y|ҕ/m;M1\^oukQׯן6|ZQF?#Cŋٳڠ@F 9 2A(]LSwח \ʀP @(J@#ȞS34=<J]#ԟ\?P@*0==-1.&vmh պՐ bGSF=bG?~1i=9Lp)Gyi)FFF(ycugh/h͚6zrU |<%Ovl-a$yu=I%:ȣ&Z-b1$ߩrW 4M$QEUFJ]ИͶx+d L&Ri1[8l[suuQՓ+{KGy5!O Gq4K/_ޑΛr~Cv5/C+͸6 N.\K,OXb\մg+j-q2pי̡v-~טa٥6%vp WdZ]DDxpVW>)58~<y?$R&|޺5Zk NiX{7?QEPbs362 !C G5_@8q^|};ؙxr*{,-I .g%F]b]:0h-בj9()֛vbyՅ,}: 5j^qУwm"$7xrYm8sAlQA\qXMN 6K:賂ǻZtEyy$Zժ2EwѸ (Rz6vMHP|ii<3"?Kh<1D .>tтSO x {02U oq$RM--STq9zUoӟS|rWe,6C{'o.].߷ V_Q?e~mlcΰuZןp,o&<7QsFEGRQGODV[ψ͑BmZඍ73MIoqs`y>WU[ɗ2cS[Ws'hG=Qn.?28Oxm ЪڶٲYO]/U){.q4kTaT~u?0 ZX~gʝ:=#Foa-o ׿Na1/#\NJ7?yȫ7/}&o.׮OvC՚N+hgS68}XXc("9#eSq/O0X+gNAccRk&.4.ϵhq GL8uէw}=z~k~mlu&S~jwk4tIi0 488Hۛij~`'}k@p<.ANk.eL 4Seni*/)*ָO)Z>C~+y|ҕ/m;M1\_qvLaY֥׋8 -x n澍}_FvC=5]}h`RE1T[M u%s(ofp͓r,-3ܟD-y~e)-JW^' ٲGWvȼqq.QnZ22!ͽ<`<_]lTh 8ֿrkO#@EjhhB@oljQ5ɩ nq%&p\z0*TVFɩL4;UN9yDz}\;f\SԵboJO#ahAY+ 郑P  G&>0M7')6o>M&ie]m]GcDjP @BWp,tP @(033Cu9#'&)LA-9'1pNi)p,epԛWQKؠ@+p4׊H#o+{ߑΑro,ǟ?kW2ҌkKZ{Z-;^zau]ϒ U$0.U('L,ixbR(? +H.q)nklBX<7W$ oNԝsngrNs$Ε۶d]W9@\s362 !C G5_@8q^|}Ś;ؙxr*{,- 'Z~,7GםkX{+T(ײNl^i ޲J,2T MLKʷ4rTDG\ |-\ǑGRZ*S 3@8W.ox؄ŗv쑑S=#CKhS:A-X1MiqLgדHHQ( VI>DH"dD'q/XڟԯLg[ל T `pH@p\Ds yvjn:q>iꂮvҷ8ڑGTE`1Д`5a'iz_EV :M2EWV1I<>E[gh/y1>/ ?Revz-{)s+_?)l;˺zwGOMܷGQFa?0 DrE<}z4u~MNs5GOcK2xzgk )Ywَ`&Gp;Ql"k ω;Sofp͓r,-3ܟD-y~e)-JW^' ٲGWvȼqq.QnZ22!ͽ<`<_m3@T  =Sw)wy5ZxhQ -xx͟Uh\xQ~樣ޔ)TvE vA3Qy?L8ũQDrj+Q*<_'`VϜyӕDr==cS:1u\ŪKc>p)M]Z\%է04 Sooo=A @pd6yyyoNRl}::*MMG#/ʺL4x4Oãʕ+te ]]]EҠ@f  n_~shE]cg Ԃ!ͭizhhHBc__/\@ʠ@  A408ʨgdhx"uvvR{{;={6gB"Qp,We@(f㙝~848KqP @(8gD( @(P Iyȉ {J(15O#ylP8KC(bx |܆F\[ @+p,UpRO(Vu_ Bh#""D {rge`)[JvXf[M&r.g"si-7k(s v^~a׭6H#C#O G1m3_ */H0#o~8W)Qo&j^MF-Aȓc@p\+"ۯ}G;Gw侭k9ռ !4#n'dGjj׹zĐײVh~g!&u+mr CF} C7"ʰlq#;'nBSy_KayZlOnO~8/V(+V$嶝*Զ[+f]Wtw5yPypnVF^Q!y(ARWh 8>Whs7ҋ0T}';sOQcЂEߡCТ5>h0$8%@PaAMlW+u\6;kP"/i*4 e =:~Tפ{XR  b0';_;2)xms/;w0 28J`km](7jGGI֮&jLB GqϥuMHP|ii<3"?Kh<1D .>tт7Җ0;h#|ZTQ-=97HdΨL$*p sM~w>1:ETND!O^`/N6,Gu˧ec35.Gbx|>_.c|^@~>_tz2z[NS8W~\)Sغwu=B o##j)B-"Wh 8\$OXƶίi4^Hi?|IFA=lj &l8I8)m>34z†j-#_xjRut#Kf):<)b~kE~'T-!0lfJf] DoNRl}::*MMG#/ʺL4x4Oãʕ+te ]]]x@+p43)vf9Q\zTG;[wܟin5PMCCCG#0QP J( uAG /^Njoogϖˆ G<P @( tD {rw29ommubvfR_R v.u-斷TuGa)QEUKJ]ИͶx[ % =։Z2L˴,+~"4YS(*9=8Eu z357Qj2j B(uZi䍣t}G;Gw侭ܫX!f\jHuePgA_ mM=`E:c9xZ#ѧ%idh[O6(aipp7V H-!0l\X9Iyl45I;3~SKTvirGO34 Е+W!ŕA 8 ޿5B*0;): TАƾ>_p:::p(P  ac+$h`pQxEv:{l?@(N#1{(@I(xJ6"g8KP @(@(p8:)!:Pbj&GuT=ؠ@+p83P H%8< M.Uh/uܠ4}Z*Ju*K$:Ե>/B&0fG*1ٷ39X2Mmdy"NoqTSf U~h?wdVy]lnVF^Q!y(ARWh 8>Whs7ҋT}';sOQcЂEߡCТ5kU'֧a*CgnFZEW8_/_/ǎh*N@d:6"9ǯ CUqZ~tp1 ds "m*ITFA[z=|!;Xիyy$Zժ2%!. Ph 8^ec_ڱGFOO o/˾O{]`Fi~$lԗъ$ȢXmuHLMIU-oϵ>p,C@Np&4嫈'= Aklz?:ѻ(׈ FwZX  UOH/R{ƶVtӉkIUWS{;[6U[.$ Ԛtqj}vB-\i*/)*ָO)Z>C~+y|ҕ/m;M1\^oukQׯן6|Ze%ouxs΂OwӰ'* mxkbA5qK4;M>6|0= 73MIoqs`nUU"{e<e+[U l٣s}IWe +U][Gy50yZ_:OJ@p3N}מrG^ŋˁ0Ђ7QHTm *qc`>y޴=D2fqT04%4gЇ2UyF4i1Neeqj`)8ϗ' 3zt92\mXkMLlMeiԘl哾dS~-?"><qxxz{{3bn7@p;-!0lA}sb&Qhjv>:>guޗ<fh+W˗%4vuuh(GC1rO@P O eg CN4=44$zzz?.\<=%( Gcx+,-X8 L2/^HNgϞ-gC\)p8ʗPPt<}`|D P @( ]#}C()p8Fj @((tBaP D(P8 ݇a?P @(GcDjP @BWp,tP @(@D P @( ]#}C()p8Fj @((tBaP D(P8 ݇a?P @(GcDjP @BWp,tP @(@D P @( ]#}C()p8Fj @((tBaP D(P8 ݇a?P @(GcDjP @BWp,tP @(@D P @( ]#}C()p8Fj @((tBaP D(P8 ݇a?P @(GcDjP @BWp,tP @(@D P @( ]#}C()p8Fj @((tBaP D(P8 ݇a?P @(GcDjP @BWp,tP @(@D P @( ]xup9s |>`` GodP @(Ȇ9#0 @(yW# h8r46(P D@8KP  9x?'a3ʄP @(P |Ǵa~vezdJMMM2O>I>͛7S{{{baG#4#g>,9ͦ)޺˷R+۝~>f$R8 p0Ǧ`h;#LLx#}-[UMsN'~mmm8*xasDH >h6zMLtէzpl-t}QMy9cFwzpF䯡>jy|{qLՍc#cMߐB41_>ﲌ "x} /400Hv.\i耢 H 0 3cKl4G026L׎aF<)4*/ƍe0g PweHdb0fу U^?%2r35p{{/yΝ;'c7Qf]UԼf}fiLG}==[q5rk48'W_ETU:*ϮߜdK5wO<qsf&B3Ӓ2Q@c&10aԀտ ?v+0a HƖuldd$/nfh|`fi4;Fҗ+ >h6q+!bPU^?&,]W `͓REEqϱbP\e򾩭Xe2F®|Ӹ6үojR_Y,e F9*SOQiףoѣf7YИO b^(<χ[ǝ;hil={>eǖWֳtGR|,n5i^w=8-&'}|Ko :;ϋipI<F@RեVxBcc1w0Vȑ_B޽{%z??w< }ySUX8/4Ʈ/kZ14Z0g*s y ? m hCki~+T0hJ*TQV>/_&B#ۄ{=Vke"4MhQ QF0@:6ٳ; z}`1M1Y7'S9{7՞c")h}!Fdq|'W.SͯĵDW&bL1i$iB7w|g>q <9L,:/丗sׯ_ƍ9O|Y# h8O$h@>|342 LP @(GcP @Vp,`P @(@ QP @( X#C(Q*p411ze¯|@%T< GQFFP @( _lh827 P @`1XvppP T0쁈a07/^ P @T {%ࢡPiÆ 2G?"<˗^)655%!漟|I}m޼+8xS4͈lSK~hOo~O?˪< liFf^>FurzFTL})*_ΦS數vgb`|̜y6x-͞ /NʇKٳr___>xԩr;vo{pR {46v~z.=~Qt{]KNÇiΝǩ7PVOF.^@4x:[0>qx0!"?tIϿӭK˖"o%泿'/H9E'd?FuF7vU7`2bl6f:& œW[F{rTvהԆcC* gdxy˰>iߵF2/8_<;SWE wޥcǎ9OtRݾ}G JMTSS%4rUֱr e{\< 9L~ r}Mԙh6q+!sWyy_x`JhxsXM1zo%4*eL4w/+u)#,VI$lo7RYF:2󯏈|}[X-U P=IUe'VFEJYZ]~2D_-Fe}>ѮK^(OWIokmJ*WmwD 8*.#?eM&H!5ϧyxLL&jl&C#RL귓Y?)C㫯'Oz]4~grŖ[=z4(#C#f(=y\=e</bL\8> ǽ9ݿ;idhF2^ut(Y_~?t0M 61)xN6N]T<:O9/9.9,, ?է' 8tJ.`T? ƐȠm 4M&B#d^fǰz?'? qR}|glt>Ш9ٳGFۗ8 `4ۢ${[&wnX Wv^?e[.h72ʨ-Fc";ܪFGߤGchçh޼ (y-q.ңȣ=W۩*_}|LLz }?|2Os~xz>kU߾n.9k?d}2jc;h0yȉ2CC*[gGɚ@<͑Ž_}%_¦Ʀ>| *qĕӖ-}6"DŽ[?p _'RGoq^ljx~CX4O;.{KoyojͣnѭD[vROKwXes2D]A+u{3KںcenR&T>W4WzĻϿ5oJ",!Ǐx ޯaK^dZ Gܹ4<ȋ0k0s0{d Gq|9 |>ȇtvvFf)#P @(TpPP @(P 0 @(R#1JC]P @(@+p8t(P J( uA(X ӡP @(87P Gc/LP @(TpPP @(P 0 @(R#1JC]P @(@+p8t(P J( uA(X ӡP @(87P Gc/LP @(TpPP @(P 0 @(R/*)X IENDB`PK,TksPK4HwE(OEBPS/img/query_search_with_filtered.pngj`PNG  IHDRhQ~{ pHYsttfx IDATx\[?wՖV[aֹCJ$͚Nck7\&ݰϲ`[W`wVZ +ޱNT 靹{SEjA'99INBC+׹Ε\%o\ " N8d@@NR}>i6G65aS8P?MUb_PZ gY|ڼ Fza7UÞ$$"''HÞE VIʏ\xO:9%_HÞmo<9` 9l3F j&=SW_8U OQC ID5e>Sx̨0-$"bZ{8k#DD4늞^0ybwnoY??zag٘`+` G_x  Oex3y6<({?yugKH}uϣ~6)r7n]lRp: l+ ' 2 pȀ ' 2 pȀ ' 2D; |ʻѮBtTycC8dXs2UkuD @SD 1-vEcT0(>I6N8ჹѷ9kODrp=,N \RS^}*7HL˞=ugskDv\..6jZYۨ '¢f'j̹ ^ee՝cS>F]-9`\F/'uk֨uk}u> l;_Ivw1u"}ws8go̹?x% /DDOڝ?3l}y*p"d0 O}Ϳ#%q!c2G(͕沆<(Q|8{$4Ewz-tW?<ʚ+1w3D|D]DAأ CJm𝮡 oXslA%#: ")#2g)pOɋ'>:{u:]:;:(u>~UxiCDܢi~F|LƑ_ݽ/zk57UVItܧYCa}U3W摆=mM|u|6qoh~m? #>V> Ņ钙LW#V bcWӝGDcUNuk0w؆&_ M;9:v;D{ +PJ4\ij裢HDzcc}rq DTw弸yOl= ';]DacA`1=q=Bv-<Ϝ9gɒ%ǏC2C?&8H1Pv؆ۆ7&g%pG^>pG13{c^Yl-:l:lڡ=Uچ^4<{Tco?]U*;]C:KHDO$[OӒ%7Xdg Kɹ>0yŷR]  KnmkKٗ+C!x \"b:ItkN1w+CD42:".UUwzbZ~J+cJL6Vkʥ4[Q}o{~0!ER@("Y+"SCj F~~Q&+%/";JDYk |S7|Ƽ"}펢_oR% )+Z 8iVyqN{.:6`z޻7z ~9 J`|}eqѕJuJ<,99*:|! ]T(YQnNI},} NRPNN"n7XxŋzO帏>&~8TNA2VY} ێ|+f :NeJZ7+| 7lT~ތ{_(W\TV⒧qTt!n߸7)U(O$km%[kW8ݰ[ il8) uRIWI,“%e_D#t1Bv}kLw-W@=N ;HY>vSwUN._g+sJhT%~~ϟ_xf #Ns>qפ{sMDtUQ?HD#9㙡͖x 3p`Eg/H|8%`1셾0L<1y#XYC U;e lYk 5y4ا,hMc{}D|p(\  |ݮ}872fwX˹]erޑa~pU:D2けG"aD#N L%,wneP(16`j|r'/4ײ$BHR(j +(1pAzGq(ips0??P~O:H@&.U|U!s#Ot(Q quRYk }Ã}ʂqS!_v`dg,0tOtL` P-F9+w!bo'GcV*Lg>xKO XQZ_K+(YO2ތt%ïddd5ɭN8w\ǯNWde,ZhE .N_8}QBr2ӒKDl|PN*?J@x7jؗ RS^ *qO߿ =}9Jf|Gsn5NEQ~^6!}%"~s@+h8xplV ;xoqaw_@qJ>dpB”C6{/r*Zgmgs6m*DrYk Mz*q9DY5Ue+@*$B]UU6l𔙳i'LtAUqZ+ 99pO@Ie,O.W4jY pȀ ' 2 puu:<8dP- 2 pȀ ' 2 p0_6>yo<~Dxo̹9ܜf[ҥKӧW}Dt…ѿo뿦g07"p75P}wM#'''>//>x'gh+-\HDçNڸqcJηըnSvmqڔ]Tg@psYYYYp`JuXC:ý|^k6//oҥ}oC^;ǡ߷wd^^޵^oLUըVF3d43\A E9?EN:ч]v|bЛovl5ww~W/]vڏ?ɰ7Z,a81y>wUW]}U;43ܴ9 =uVmj擪v;ݏnذUeu_G=?yD.~۝Ϸ\z&9E:ޑOLLdff.k!mFS2EgJBhAڢ.Z0-_jbb|<m6e S%r,mfw.]2Od8o9@k䬬,qrQcx_^XU}\t9xc" ?=wO,NU|p>~ngN}ttbRzz BbD -HMMY0m´E.H_`´ RR)N-HLqs%l6x `VnڷoDFɹϱdg.+)))))geo280Ag.\HNNNJJr\E"MD1j/tӕW^qR(駟~>{ٰO|)MNN~iE驩)DD E")55qwqnjFu-5ٌp̦?Zκ>裱'l6[~~2 h5޹a N>o|@D\s /tMqPMq`͗9B5~9 l]8d@@N{1vjϨdABvEѓs@. Ȁ ' 8.ckb`qXguUSٹR*d}rMqؑ`r~t%ϓ2\o&/aQ~퉂hW$ss{[&jE1_ M;[ʳ8T(8.9묮Tx)peZgSf{sAEKޟ?jjCε-Yhrou!|!xP8huɖ|mxOYSoгܧ~O'3km1vGQ}p1d!ʊw4lU[u@\A<ºG+n}Y| >t8) B"9N,3QR;JEDY-aV嵲1BZ[ hd/q! ʷU(7Hܭ /:;B_h7ͺo:D sY-74npEyDW]Oe Dq9Dzy5UekT*MQE1vj~1.U 0k8d@!fnFOv `q @N8dpcXR с{H,)-x a@N8d@@ ee՝c:vZ|psYYYY뢧=N408:ڝ nMpsYc[۩ vwQM G/p**; +8Z]۩֯PQΦ-Y n沆j|&:ߤV(hA".lo<'U`QvwgXguUC'5y|p U1` ?T zyE`Gil8)lO=ԾojS@^|AYEO(`bcȾA̙G#_D} µJDfj}ӈWX߽bOٴsQV6 ֖<"*V1Pհ_!\U~Q{CPtSYÆ~q\NEkb) ];8a<bVL9 pȀ Ü!<*@ 0T ' 2 pȀU8ưv/쳉s]LNNqnoZR"))\hEif,b=8[ ؇IKX q߽@t}z"'D'ĄKW,\`AS/^HD_&%%O8*'nNIIY0흿CD7'&'' Ѯ#AlpqնsWαii)牬Ѯ)w5p7 [ZCP((%%P_lo817,U=T;Y]+_7 :5Tgya/I;_25uMW_xojWߴj||"9ΜM;=QkyCؙUҽjA3^]\rr ժ/^(>Qrrۅ N s8(ap&/h_ _dn.˴V5QQ}w 55{zޮ(+CpsYUToow* υ Lњ (q4~qt7 &ڱD{baUs6U5|r_'4u69Fye +Zg˚;O޹60tuVW/nZ5 v_ n[IN s8hxn(?=yE7ȯQVzqR2|ν}ʊmހUBٷsZt煬Jcnw*ȥP(Ν;G?|ç;wn.zݏnMY<:+T""Eie{vs9QA#cIY}ofqN#x Ev>s8HD"dtuV?{vly,+%%%55-%%9}qJB$7GONNpѹsUrkVyr묮x3";:Fyޣnԝά[ie-Xwv.\HD/^t]_=>  Q_p΀9IQA˳۽cfgt2̆Դ䳟9?{'O='gRӒ];ݫ66 7((8fewn֖<"o.ڰ;rIO*hmi*_RQDY|{0=OV'Z7$"mׯ\y<.Gp¶bsoN\qŒԔԔcmj~K&'&&Ξ=w]Yװ; Ą$BPĄroXpw(}vi%>CR|2 N (|ht\ϹnΟHްqۍ2N R&]P(كK« q7\eSѮ¼dqϞOJJ tO\ eQdR 8d@@N8d@@N8d@@N8d~Z_y7U,Uw(~/o'N p@[s2U:ciC x;8N*̤8};qZ`8*̤8};qZ` o'N Dӷ lýo3RT,ijC7 c5⧿73Nn5f{/m\Ni1 _oꍚǂR3X3^.-H+\>NH|T/W($ k+lM?(d >8!1@Y依=QS8`+88E NH|S^A*C74MtzjoG4bǀӘV̧HfYÄ;~_ XH?21@qSVlzo'8C /T5TiW8cCI}|f!P05A\}+8ip9/ H 8\hʣ޾_?m%]N#<6T+P8Tg'eB[ J_#L$QmG߾OJsRsl+ U_v^ SH*6#_̡EI`+H~)3. p@ss0??P~Kcqi?P? 8Ŕgo'Le$+&N #$?pIGO>P#;ik€K|b@J݃E⮏dBi_齝Pi; ƃgڡZ!< [RLE+YZLQciC x;q@KA8v0NH| ͋ӷ ϝXsRqv8`foq&NNV;'$[o'N :tDӔo'NJ(2A2 pȐWhߪhW`fu\}hW ;b{g_'9. w9g>V=>*1"FuٙJ=`䩀ET!$'Cx`@N8d@@N2`\uk֨(b'e0[^#}-CmCmEu?O 05].~eUտi pLծ[^F:?@a"+7:'@D ~h:lڑzzue{ 'ơö]$xZg/;]C̔ pDdG_&"UՋMD̂d:" CScSaᎈ&.{sKP3wWIAtqL w~4C !ox qm@N8GOJ= "F!@/p~nUѪ@[4?OF C2щ> Qh BD]뮹:ڕ:h;v@N8dSlIksw>D)h8J-~JLZ@DD^V贎=TW/I=f*wn>U"]XVS>_B 8,\孫&ΜK[k,`<}ahOx~~^7gs{':Zs^17'p1ӷ?PDK/}e𧻓Uz⿋E/C§u HwʼnG*Y]w2Ow?[ڴ5QSbFp;L[~ODKo 8J=X)#+/* ~~_nD_Zw3&)=̏}duݗ^N/t׹3ZwP|; puO#ꩺwÿF۽G$kض9)U Hg]Mzouѣ"4Gxo{E)J:}֬^2{Kϯ]OL]7H+g_=FTw#.d]_2boh~kGW:NT{Vm>*02hǩ?z˹V{pȏ>Uv[>u, ;d@[{7~y窜@&2 pȀ DS\sMJJJZZZRnB!q8EP(/~x~s0RhUNӧ322] 4D@[g~>v-bjd@@xg5Fk$Wfv$ըB%֬%;ea/֬~ W'0zAd3j&jmaxS[%Y{#+œj$ϱ3bը T ]JƛCM_֬יe`P[Mq*AkWVy%xЕtnDq~cQ6~8ߨ75Dy21l.*05 *qDDd6^LhɩѮAy%ZK%bm#%!fΔd(LgFfuTLJ@Q]KM6f5tB, N=cW6ϋ䤤k&%%!v<2pZjL\Ҕh=Y`X:db O).U{D^k_S%+xB*;QO]QsժU .׿ 8fMWWF,2t J&FuݢS|Iй36i6z7Fu^ٕhɫV2 0LڦM rEvC).U[B}jSH ]6 w!_dU O4 =+VXyW}lFg\`KUڒ0KclE#8249IELij #99*..[n[n[n[WZ/ <@ 9T 10ϡ1vFtCO)RmDx89jTZg5-ZSm~jkr=^usX8FCΤSDCn%i&Rת= ]$9:q]6yZȻ8@c5y\0rۊ$$ l+;m!6>>`?N',2 pȐBDO Qh Azzz+R(## b"v-ǣ]XZp'DԩSǏ裏ĉ/GYlʕ+稊s"rk~srGD/^qǹ\3g>yNH0>ǹ\n7܅ ~rnפ볋}eK kngSYju&f5`Z+LfcR#o? jf^Q\'79(~0[&bBУ-UD9RNojDZ' ]D9zSDmAK^18t{䪜hU`fǙpմ0 0Ǚ`Z &fz Fc٢]DBDO Qh Azzz+R(## b"v-ǣ]X9N8d@@i5qoӨlXxdz|VƚH,؏3jT֙;*+;lQռ#ܫVe:dwxoi5kGJ*D|v֬יr=l[rAuML^ *q[FK^+*{Y$RIC\p:R|]eE{>%ZZH̚).U{z#(={ };4F[L:ZVzJ1- H0'DKu"lWMDN%ԅ9X^Se`X^g2 0BN,'CDLe3p*)h-knZ+`F W.x݊z K8cS\ w#H!m ItxՏ3 (sp IDATZ08cShPYj#b֔hR+cF3+%%Vsneh|)s.gƏkn[qC1)Z/il_|TJ"F*|=uTɒ  zZg0h)g`שMǣ1lVZ]KDZ͆ EqqbUN&R׉G3g||瞫8r\.r|8IҥW {?- ;hW VQFFA4D@[G C2 pȀ ' jT؆`HޫwM FO`sΧQc5ۤ6֔H `#f5k-ޛkיY [BT"Hյ#V?CjsQ-0ZTf*+~"vҫOƏ ie<m6[AI:kn Vc* *Kg ZHUZ,ٷil6e Jj_TYju'B&\N8{@M%fkZjh7zKl6ͨ,jh$Ǽ2g3$dJt1`.\THwj['3\ѓRϖ^ʰ3|)ђ 1ť*{Aa|Дh}a@eAJ:FH8?Ro;qOC@g\r:씻E<(#-ui0u&a༒2ť*I6ͯeLeGC-@R@ 8!e.ш%,`bhjTZMIj:lY3tj<fs*!N6d&ť:35k0T4FĨO ] $JƔhk"D)l4 -٥rI8$Qeis :yHĪLl=#m!6>>sUTTpr].vg>Dmkbbb|||+{Ͻ\, Ȁ ' )Dtiuh؁G "222"F!bBl||).Uz,i;o`Xۓ|Dkn گ5u&; ]6c"~zwm|RhѢ$ eA"gLEN_SW1%IAsj/w Ty~bu&""V'Cqn>ǸU!$2a4 *K,?eFΔdl6[tf242 8cS\2Z7+M`If#*͑[4F '|$.W} s8cS\2թI) KvXsɮm`HՂ9Jx0kn`V6Q]k հս%DܖVgcKU&(ni&Z6O9ͯ*KQ ZOy%\Ivȭ XGǿR%&zq¼88*';(4D@[?sǹ\dK:t=~x~rUNV` Ӂ9N8`:0 'L8aJ!ӧO CC 911v].O>O^tJ! h؁ǜ% ' 2 pȀ df V}YF1f=[b§ 85@ di&QCf42Yx$7Ŀ'y;VZm4{Hd֬יd7}1fuT^ʰ?~[-[Q];by6FݤmtvB:ғC]6[g."Էse\Tm""%Sը`]&!@ԢXsEehF8Ѡy:*Cw|ݿ/T%/$t~R`7֢mˆek3>BD98t)wh؏Q :Fn&"<6mGp??zaC''UN :/.sDD(xCML}~\\B@C"loo?zu]vl>%ukw:yˇ/ť*p0T '@ 1 CC"4;;tҢ@DXh@[Du: N83OuN34p2ׯv>p)b.-'FfV&qN ]$ pZVu&J?6L7?x2 hlQF_Y; V{LD+FpKeN;^Bՠ{jYœe""Mj5 C}?zXQ^T&|ɮɊȦ=NM.F[IB',"?Qxt!GH'Bhm 0Ǚv&fff}3.Ô^ d.|EvIT,-dޖ-uS<=R&{K?+i= L+"ʖ?oy?Le]\11jj'Sw'+0!"uΟ &`O~*W C9N""<'y2Nc@m?[..!`J!mt=z亮m;m;cΫׯźon۵;<}RRX N Dtpp~ġ!mM iQ EH 4Dz-:NUH Ā '@ \M=u[q]F+N]q K2qa_!8^KLO>7B&q]!tՕi~i5"m s2'q䷊.s{2ǵ e CXb'^G)ݡ^>$#r &bƊk| g* Q&dd .m*V0d"ujN?RkU0vxO™&*R.62pj^~*mmܥY4 n@Z3o)#SߑrUkY,uS#V\AvM9δ5֪<],VU$B=bW^\$b&r,RW `asr0h=Ur0 0°SG Tֱs,Z*$6c, B V{oQ8exX*`*U, :˰W`>B4Y99-rc.E jR/6r4NrSd5 7>1h ;x6|.r:~Wfn՛+eEQ F[sϼlqw|E"^ [r߶-z0%遶t:ۏ=r]׶۶DZmbݷnǝNgaao>rq)\, Ā '@ ":88B遶&]("A"=QN'*>1뺮8㸮NYg;Ψh0.(n׶mqvF tݮm{\M Ʋի|>Oelq됺ZT. zbO'|^~7)n}ᇗW%D I};HvZU)ZN@>7|g=]$-?,׮]{cr2Fr\.͛%C>δ5.sҺraO" }LI\UkXjM`9G2  LbeWS2ɪZ8LRj>Q^jE8ge*ޱi˽+f[+'t]*d İ]:a4J5 b.maMu/ha=+a솠I5b;M ShOxD/Ҩ\ Ri5iOlNeȮS{!guT:LȬ9*]O|R75bWWN/:7 00ǙvZZ{Lˣy#vx< A<5"d>29cAZZi ւ#ཕW6M2;w69QQR:q'-FNaQٶY=!yYɡo)& ޛ֔‰gKz1ǂl+V6tD.:XrWRQ0Xw`c!V;M#zKee#ƴ\l J)q fi 9SDu:ϟ ; ⰻ\\\. f"ڙS`vD&;@<> p Dtpp~ġ!mM iQ EH 4Dz-:NUH , N8b@ahe_m&pty ._mcXj Ou=|DYH!Hd p6.s scYȌ5\S'a?G#34pzZ*&Ju;M_ÜkzKc5҉,u]1$ tu 0e5m6 0"Izʆh N4")EL})ĊM0 @Ab6QGT&YOv^@9Tۗ|躉 -IDATID,i]@RKHxusR|*mxu@Z{~b_R75bS3xuS ,g5.sY=25/tPnW`c,+6xOo2'Ր 3eb[I0v¥-0`X02˯l]xDbJe2O[ %7,j!X&DXb#,!"Kenʼn|:ct*1+lKSD Fs8 Cq!Vl։8jYlQ:cU*!g2'i4-Z[W-h~6eNeN"Z]渖w\9i?RkUNڿ̃7nܘyo~ ML%mwvOVkuI${0^ &n"!b=Qm2_T7^koMu5m/9?7x;wn߾=77G'?q' \"q҈]]yvi0 h$ @aR Ae[Z4a5S*:9|)f۶mӟnݺ577Dz5݄l85*$X=ޗOs<2+" t*BF>0nvƿaN!Nj}>,.//{gX=2 $ &,u]1{ð#0F;,en m;w5G qS*yi1 ĀZU&y0yT*^b/_`8SoP5i)1,jaX=*'i-<}lwrN "۶߾}EMt7a p/7S֢Ky,VI᜴Xtt*1+Bo2SRqRkƊYQ;33s2v)Z\0 զ/FE梳aFѠج_z=MoiDW(Xˆ'yG lfu|>?~,DԄL}~\\B@C"<|~~> GGG/ťK%@uy2L n ']v:+HEԛ7oa={gD!V˲,:88A$V2_gqqag4&9o޼y5DzwJZY֭[7nH_O?4Lg>^M1Fh D{̉q~zqqq\"N8X⺮ss0O}߿k2?pRNrgiqr9%"qzWqns^&L!v8ٝ{offێ *t\׵mǓt]~e޼ys5@ڎMr* |>8N;:SY^o;ɝq]gѿ~hQuuI{a|/ipH[WV ͤg}ӟ޿&B"@ZW. wcd ?~?:]wS{`7n.,˗\yΞ= Wf~n?sc`Qݻ{އ&8p)_xw?b`_|q=aݽwZ@D}2|0q25 qƝ;w޽/9s7ZObӧO_0~͛o߾y?Ys7 DZ]iqcG} 0xjs\$>0%Y"_vk.?5w :/v>x'gznw /_|O|d8/_L/ݠ݃!q׿Fo߾<]>::::z3qQ'㸶m;Yx pqo?DZ8\n*yӛF;w|ݭ[ y9>NO \88xS3b@ NGaGIENDB`PKc0jjPK4HwEOEBPS/img/table_input.png`DPNG  IHDR-q:sRGBgAMA a cHRMz&u0`:pQ< pHYsodtIME  <CIDATx^]uտ!@ZH[M~/FFڮaO$MݴI,ٖ8qdٲPV-ͷJ|qyKI"M\rpk̜>K_33{:3o]633,mz rUqO{kDVΕZ~ͮ?k|}3߁OS|x>Gׇ>Vv_@'qo?s谸rf^K%W:v#?) o?M_/ַ/d2uI;=p}Z0}X\q=6#߲ =X{mv_U(Un 69B:=G2m9)lMf`ϙ6} ȰݳS%m0_ Sj ]xַ/dns|K_2f*$uR塩VN$!;&;NLNWh|كW>U~\q9p"׾nʧ>[+]֭ۦ륥š5?Gm}B&DnqjBLr^'UvtqޑIso-Dؚn+[nn{/t;;/b@WS9nFnˆl/ö{,snd=R`uْ?OO9ѶnUnr VyKǕ'Ϣ11q 23 9*SK)vFwg$Dz1;$-n}`9 L{ceAtKsf.o=z(GѿG?/~6;_lxe(Х+Dnt:]&uGళ= A `*?m'´qsp+z:+]v. \{@N6l$wCG766zrop .eA eYX;}Xe#wxZqw-ŽX Y Zkq܃~o ;np $= y|"=K]~9b:zE ݶt}+0qlA r!Ϸ1~-g:;\(g](y!w_YЏ-޾x>ιkKGf('Xm5[=lIǡ\܍ʛ,1q,]Ld-[WNvk1:vv<At=3=s[ͳ`:],m|Fe)ԟl HS?< WAoX wW ݊wV;,x?"sw/끭ʑ-gǭ{SG0qŽH]dh=8;/3~޼sڹkk2FCLA ް~!?x~nٿm}22orM)"v{/37~kP>W`tu+{q[߾;dG}gԕ_UPWc*aq45W+Bo{=\LA&ϼ_K7__&S4sSwXrlFK%W:v#:OwS~k)w{K={Ļ z7Vc誸?umRL(x]|;`)ړ/NytW]wx^8еGg$̡kpW/U6vN|ͧ%(O'_<~tU7M\cpDKA^Oʹ Ʈ<cf7Tq3::I[}E$ **#0a&x~Cw1îSquWAPщ*E><cf7Tq3:,qmtox|(:&7nenmtݟ WStNL@ܰ^%)9lc{}Ǥ! P~c}Eǡ]n2 `[MщMy2w0qg)D'>=[,V3w7שea0OT*T)~N}]_GNLRэ!}'o9fa֕3 h'%(Z2 ~nJU@*?qr ;xx2tv.]!flѹRgFyWAteE]vDWhJ޻^$I+'04 R~#楟)Ɯi$ wOKRH©Di{Ɉ8? q3wwm)9܇ЖL#mGwdĂw^/ zVJ*GP%`=gs8]Xܼuy.A jf1ČA^R6)U]Lc ൧~'k #Uq-}&[c9H,c]sps' qe@ADX[lb ӄCngy]Ay9vK˷+Ai{P fg] ھB fUK R]WeXA̻)"17W嶋f̬Pll\ HnT09t|"1Aá{lI4x7WܽMpgwe?9ڞ] 7&ą,"bun|pfUZ+HZ')̪s+:ɒе*`!bl+$ Stb:Ü(%@; }ÞZ]&hMCt׮tԇU g`m|o}Y}mLN^xx^eLLA%b J}]G^:[ؼ~ޅ ?{Eys;(ş]r[KȜvL]a8{o;78rvɕ'VN/>>19x~biYy;d K1~72g/^#ġ!`rvP#oY7==5=/<pi۫sP#@r+:8@؂C; }bܟu5s_cJ=T0{ߝŞݪUѵd,8*YOL᛫bN߹s||4}փn?,Vq\qUhMŐx;>uES`A +wEucL u<qWJv;SpWD"}?5d 7ƪ915x6޹rƣi5N?x`N͕݆ |t ʽ{,M `hX9s%s$eNrNMUwq#_<-w cw {U̽sⰈTfNnP^zn\cdCP45V- Te7Ge͓ GN,ݿ~fq1~3|tw/ُsr|ⱴ Gc!~K/{G:)؆Fcnv}GP (#ː?3扻]\1#3igICgȭ@pQѹR뱊 mdM A "7`>;$as>:Zd3uvFܟ~ivŭ˫?VX>2|uA]X{j z\+= Zѹz']VmFWu ons}˾@x ١aϼ}KzW6y'1E u W>ҹG֟ӿSҥwÜ?%h):::9uWܙ鵚G@(:7h-3+PVzIێ `0{Xnݺ̹ U+`r ]Ut_ܽeaj;MGef3T_Л/߯^_u͡}^'f/<4u ؇6ln3wX12.]#PщEJ):C W84>1qWt(:q(:E*7~L?:xib!WjFG'Rè$]~Vt7`AX)g3{[@Le;*wwB42w;kP{*}EݳI@gY0zMѻ9GiXݬy'I&38砸Qyq'!h"hm'|_^RC|&IXѹɎ:3^18r1wη |t4{>vla}ly%"eΥzE,Tܫ_}%(&X`Yw21{Ttz`9-0 ]cBP{;/=.])qakYefuxΊ3XRTLDE&t8h+^5=5]:㰢 z$6eKK15~ʑ"3ig'|_{p^@7*:WG:i#GSՠcL=IBK"Tf޺& q1G/%1#!)̘Z!7ơcO(Vo:K)'H|7+RpV_=(F։} <fgN.vvI+ixS'PmKjQmg6't_[FGR\7 qnmm2'Ԇ.% sY]g/ d| I4Ttb3wa盌mC}&Nщ v{KRJ@ ( p1{?{dĄ3wILplv7n yN?fOP ]O\,9.RGщ1-#ӑ^^[ w̖7MO3TKj}n@3M3%{U~&YCE'y귩ӫ_9eʎm}]!dװTe2Eеdô` ӂ}BW}?w0 g+aoJoӒF}S y2m[5v; Ɩ' 욉Jlx5'=Y.7Vwxg.@&ّ4 #7h ;0-E6/*/qpwN<;(I`m.ԍV{]PY|I|(#1aIo`b^D g:%9ia[c[ɭCǚ7ۿk5O@=|tXpg^ܑxly#I $tc=W#NP{1E\1 /b%CHa;FO{0S|bt)0Qo%YG&vj6#kTv\,!RcRXVQ `*F2Vy5#[KЌi_6*84n j*=BiO=3&;B݆q$tĽ\ hںPMN11tC ' ub,‡$=6Lz4C$9tQȥ4Jo!- ,A{5jZ7Ƨ:E4"6q$tle/ӈE7sŝy11ŸfϯftC;l{YTunhlblN- ]2 ՘c|StNL@ܰ^*ri8T<s[l7k ʆ̮5s ik\l2 8bPtNL@ܰ^ݍzW!J@ (%^Wߺz}gO|I\|r᧦Yw{\GM&Ptcz9(޹1͹ŅˋPVVnZ6w}j_(Pѥsg-wˈOPt8q[&K>w™zv۬8l i!{Y>QC>mRtbNѩ}:6007TStۦ {?>!?̂6.XVڝ F$g{bM.!lzѷec!#IBpo/7D3v/л'S0WmӬ1>:ٓhcΘԛ`M谲` ap-$ =Tb>i= 1/ xnNwՋp}H= :ozG B, :o.?-d '%[`5h(3 v׻h7&߮W(v$tG2FW<=ܐ+8cC/D+|6 MBG?9LV]9Yn1iA8Ziw/ sS˜fuS 6@Ap{ E(X|c]ec"ؘ{? ñU$vGE؈36 &'TUJ`{'?ZL+( ޘM{KX{C,t$so8U\F  R$_Ơ{l[)%gGQpGܷrgʹ' ]'hbtg$sNyq q$gmn+8k\A'+V\#hx]^KzhFaܓI m &Iw <"~.^KL SNcyqO:}+}"Iwf tޤΫ( r劻-C_]>)xJZ2;uVLU ]뮐1W&sYщQ+:Eg 䊻>C>>2FkD^'F4>r]|m^):1qz\@PJ@ d>fOm&#7@э!:yn`3T.^r}~] uQw2+N@an4w}ݷC {v0+:1힡wo1־6ކl#E'Pqoˮwvi[N*SOf+⽜N{a 2ScI( ͉mW᥎9 ]ݓ+ۢ$Stزy (8GIawlSēA3e»{t$MUS}X*C!4A M4ZiJ%,XG\Uk<#VèiyqE^Rc( 0W<% eƭGx"?ܼ 12]#C/?ë Ē'qǚNhĽUM~aI(q&/zb1 3%gm]05;:B;WJ/اG ]01Ҙ1AXk F7]0aFYp]$|$i#JKnҴV9Wb;?!{5-d޻s3ŝ\>LqH?^z1H)O1|t` ;t9×Aˁ1|<{iIVTm&,5 6byvَmflQqf1N g .I܃æݏpD-s5>0EeΫ[w̙yx<1w `lۊٳG$$Nma^A1^Vkw$ˊ{,v]l y8S<^G3=ZAO=5RF,w"=]l"68ftE|^'}B+ g-٪BsK1G0+St@3Ts\@cd+FDubD.W7ۆL7]PP%P/鲆Md-Jщa*1D'U=UO}>TJ@ \q׻en N' 7劻>†=x$v;|}ې*8Le0١7U(1REj;R܈Jl6L 3bӒsl:7JMgF1O}3I'bZЈiѩƅCGt`: ]0rVwċqD,ث''J{0(2]lЕ|_ i87>=].v1W 4| w"ыEGy:ձ𽮪7-e9D:~ؔا^DcF|ʉ >4?({"pr9Syq_đЪaft`a׭Vމ\a[:zA&CPdzd$)kÙ)3T!>-,FfdwӾJ_ ftf@ڌKu't{^ճ*JI+g:^j8\q]!cֿMƕ۹Vtw}*| }hLqE׈HNh|劻&cP#6Stb:Ɂ:2%gtY&l0g U_X*g>CUQ:]2zEwؿr]s] >>g.%e$F9 !Kщ+:Er3wwڍ44 ]-q-'xCnH76vmb.!7N \9fnaX0 sXb#dZxIBXpĎٽ-%2E| ݛ 2;D+f'X+Yo٥8Y-0 * ;ʗ$xL,3kʎ6g̱:=Yq36J^ygvt} / ,c$t1>76hn C{5'FZ! ߠDŽ h-"Mܽ1Fۦ>xvdX N̟rs:bR`&>i㍱ F5V![М]VʊR"W@.UzHu$tS̜ڈ3ѧZn| ' nՊy0EGx5&8?l07G= JF ة#g/. I{Nض*myj0q0[Śf"-l0ƼwLSp}ѩ{2Gupy}8UīJ܉4 XIr3)bcHpja`Ŗ幈eX58rbM"z&͜T .fq|,'|myq.YvefdNBden*H>hSgǝ4D:<}wlA)*4#<_-^xH-57I<ڄNJVg|1L,/blOx .mFWd:\q׽e?VtDBWVg劻 m2'Ԇ.%+ U, ㊮zwMƶ>GlzE urq'*%@{ 3TKaw| Rtbn 3w}*}կd,~3zSP{i6Wn[F|St ;ߍF}pRtqz>C5a;>M3N Z):Er3wp#1qha&Stb}*2w(uE5 Wٞ>G'4.`IcÕ[I肦zcF9,6Zp+̭$j!F1aXP!ˋ;v o١&|_{NVpYҘFg󕤳׮u8< DQF&GgMA'qgŽ\ʋ{p-Wd&+v=G!n0 ōCo[Iy!GK}(vպb&(ʎ4{Aܱ@cx0|SqOvL 3B].x\hݶ1Ў<86cTSN<6\?F5Ij1U܉unsRxIDׄutxs'K5yG&ηpz 1 W,ȦZ\[Lq'zF'CcCטUQmZ$誊{+sC'Pt1o.vH9nΗx~%AHG1b~C~rlо3qwWk%pL#C4XًmOqWBe蘟rb3MXocb7B܉(XyqN:]bwVf8~\Kw]p)[8 hؼ{$٢M0FF`s0coxF!8t-!H4<+/#w} C,=-Nй F`&h3:֪ٔOr]!ܮ[U41BtSW6\q]!cԿM1Pѥr] E#x\5"R#t.~6gMawN.}rL (%%]ְl[):1LE7䙻>C׿G2P>ATNC+z-#?A)F\qܻuܰgw\qAbаO?xSt@@Ž-Bݱ P/a.k ]qEWv%Rvo│ Ɠ¸?9U҉G#1svbུN^| ļ+=ʋ7[t0NR֛[ N0$8Y4B)磋yũWp-$l쟐 6ᣳotoVB̥"wz|˙XK}1Nu/P?ǓT*d>:7qCC`=XoqR1P [ > 57B}m$22m,x&Ic + {'#ްDF4"ʞ[.-R5&Hfe]c13橾b#.7p 2tjlU[~|]pkA! GF\1/☀:7T] `Tp#n-҆* Wۍ|%AYLwUs>XD,ūjf5Oi _p2tނZb+%^cNW,+%K-Ϙ2e2gvހAwN@}vlyrى-9.VK#Vq">]{VVsI[F:[J9tz^IˀcSy1!M2p#G_<22(#i.?oqrNxC|\+x1aB˄ T3B22LUqo4JZ3/n>ubyJK'Z,ݻn ElY$_! LԞu8L2KxW3B15ybƜ2B &bMLֈũqy\߲o61^Ev([gvݮo@͵/oB.hߘو*W\1;sce}(+6]ba`⥮A[`!lMX N, gA,1*L/vQ" j!@n$ix:M.1wL[5mE)Ǫ>W gmFG,ÜծftЁX_>KYOfOM>ıI(ڔ:ȺWfܯ*%h!+S2I? OZM (%Pw7wަ*;{c> "~7.pU6yKR\)q צTՋL%$#Ϟ~%ŊL%Bo=؁,ioaeUⲻ/O+?h*qUJȵ)U[Kp{ \֒b{Y|)iOxWjuTV&2j)Uw,bcsﴤXtbkc?n\| TAv;ͭ~k&Z4baUpyzͣ=l'1*RŝTVڎ4t2"tZq_9ג}wYnUc>N|1f|@S+pv)^V\./rT7X ϷavK,`o)Up$9.' ( VodJP<}z%c>`1wܸ3qr'X=Q˝]:zm5LJ:J5`M#}ޙB//lI0ٿ7,qmwWqxg嘬пdMK{2ʎSq_\^nE>sO6|' ~ۑ @U-| ];y*:K=EڔwfaLt'so0`<޾mjY({p'x߆W!+6 |r"bQw^ Vt8kSHV`#\xނn\mrh)f\UΕrmJlqbSSn-xR6K܃;N]\\0,k_!&rLk{_Ǧ骧z[z̶HRur@PiB4 TԉLgN+"WH QQ:HuQՄRwwSGnѕ EvECFM9/[Tq"D8rFdܙ{sC\W#O}f= T(L=PW",BWe9Weվ-ϩ:?؝5l/nrDzG/kjaAꡠCH΋⁣Stiǘb =[ \ODIhi:' C70U#;7oFϙ}RvmL3ۮMϤg:NQ1"/&j)LTB~!@9#.B!%72@f>{zڝOeT]VlF։IU>WJFn ?s~33Ћ5#I {Ȑ. \> V+isBv9.RcL>&( (ꢳ:{) ŶRP% 򫚸Kߣ~m 9%_njά!+d9n8hTœy9Â##zC۴F P*J} 7?dЌ._ן?ۖZk]b3YⓏ>{RlL,"DyTI))vQPot,p>ЃވJF9U_?~O鶟߽qk[aNCelz5Utlwh\{׼%"?׋TVtjۊ{e.fWO =&]y^U(T ͗OI]׌n31c[ӭJWRm|^uɟ;?_k7%idĎzzxS([Qߺt!Ee;*/n?ף}QܴT2S䷷gFIՉL*S/ yPR(JZ5"t8LO>zgզ.|@7פ5km4˧)kmC).g7ĬTj`e秅SұKܭtv*2Bʿ"Ub t]eCEanR/ |zyCvwiҝ^<[}BPmp fAY)M}4uaV}+wy??.2Q:=)TwJӎ;^zeJX^X⻊CO:>W(/0.O5y>mԅÿ>H>[pyhLKzOgdq}w ֞)9V#];E]Z6)uW~Eu j~c->Y[mA<`ǔ=LkPjR6@4ͨjM깬S j< bF_7{b*j?0R]jkDv3ffR8@oGl01"muUV wv㳪zR2L&ZgalCWoqZS>}+9ulW-:@æ\W׵l!ץކ>SlLI?O:5{jrEyT&1@ЕA>ӧEhh~.Ui{ B{$cMuX6wCQ:.^`)ʠЕ/L1TuKUv*]JN]J]QO\6_7^Y+yT#t1P|&W%q@;=֫y]qN^NCu%G豶m2 S"E5Gvj z~Supz ݝP1SUn_yq߁O|n)'lO޻gzݠ޸2H1> 5ԧx/!v2E1Z6OR=gfyV޴ݣgҗv5q@=cǼ[w}6`9c?GӰi%wo{RGU4UX)ꓢmz׫vNRRrjsڵK~:Xˉtz^k.PY,fxЩ7soE"=WZ/ZcVtR>5o!:fhZSUd'hֈiBӰm.G6 CU{~^E Z]K+JK >T#gq ?X$@wxw}J)Wn濪jZ _|]Z:UCTwت)N^~54eR&K׻/*@TlڶSCg]iG : [S|Jɥ ]\zo ̳\6])"n}XFiɫVTA-U:NQ49zc~tV~",M=USJp p5m)2\i$5/R[,-S@>Md`MԖ\V&>la6f&yQ6O]viwfuW S[cIF}]ykfo[qC}F}v(:3iW_:*J_~tÓ&n|]N)Y괗Wd[mLQ_owgtu}ӗ*|+l[yc eӺMU2 %kz;GB3?_'=3u Wh /n(XUAK28:x/XU+5/6e}lՉbnТ31!!װ.پBߺS bfPR)yQQD]/>@(Fgphu'jyåbr [TJm ݐB}WQD)6=2֕C@ znVu'TnXӔh=Ů2f޾d%P] JX(tч@: t@: t@: t!D1 U~j&:nR:Yqɘ蒃VwgڰKNg!^NZmk݋vv)[ Knz_l7S.K58H-@Ufe 5݄9/KVcJUnQUF.ےN$MQ-MC-2OL[coK/mnt$PDlZHeh*B^.R6JIĶj="[c`;NVjVfi-m1ea6[9bvJ]vi|1cTwGcx8Kv ,`~m}b:RY[խ+l;v*/+uI1eV}[:h~}4/[K j2_% ~ផ:rVnHZRm)9x9"^B{.y:w@&_Wcӌ7x\m8. VZkK`To#YZKcCTf[{Smxe:@OCXUjB Bjz4b.g y;;h.[lφ$$lJ`u)|pLɒ߭&W۟ZܥK/q#/O@C@.\]z^匹S5٥ =&Vo&OQ_<Cns%ay]_}gR~(,Yf.E,g+ Tx1p+SǟUOo! ˀt]}uk

ME]0zjW⇒KuIc=z9M [6 /hgpKoAy) xý[`]0o-y|j%y=Q-e5Hs ߋ5 \&rt,B8=+T|Zݻ(TAЩy%O=_.cXe ֽh&i~;_NѸ0=/zY.J|۫{a^~H:XM ˢDXw4/Lo~$%;+yV諲(=.] /X]bFZrCom/G#I$GI;Krg^]Е$r2D ы^>/C.|$]DcO}k~o"" xu!t9Bυ;VBWD7\ k`sdEBrd7o:~r ݩw / 1BzK7uН^k MB0vȗGۢte=" t@ t@'kRvC_ns9w\(/`BBA)R( XBV^a$ˋ jcU~655-\vHt야vem-+)7`ѽns__v/](<{i ır'vabmgjS&tk`g<uQzl۶m 029gr6/ Sf$lg`z۔M!imGkzrd}6衱Qж)NΕ麑ݧ}׆Gu౯1QM#սn = S,ڴiqoݺ5z#CTs cTy8=n)8Ư(tYm[[[D[/;fr`ʔ).{d}moo7OW'k>>UGj]f98ghǺj~b[8NiWQn&TY;u;dKU6\#Pc7ms_orx|}aڏ~#/Tɶl٢Wq9?ɑak^ bU0W410 fj\%tV=CSAYq)"n&q*sk+mrQvZ0EmKdKږm$M.F ݹ~hZntTe ҭ$+6n9h}FK9 AK4)GpaZ0ar.2m- ]q8@|G5\Lw+: ]cz]Ӆ_bSwdda[cSjq)ڧgJ#.}|9l^fZr-J)}al+[}NhvIF.wmGІ ] = TQ]5TEmmP_ ]w%dCkqZSi^.#%ea!mNz˟iM=E6E4`!0_M92SLkj;ZJfhL]=g%`5.`M LQA|p]ܦz K6XIl˴I/rIvеC>䭉zu}9}:Oh JeqXWKzm98{~K"Mmg;qBMYQjDĿGeX\" 6ϊ)_Wʝ"tmvId`\}5&?0җK|B_?C~)Xh ).Ln9smgX*{gĚ!*-6j\_̙sǶO4ɥ= 6vcC݅^3KccUN՛E:@dHo_,×~9 yW<[ϗ?vپ})kǮw|AiK?T ׮]R+\~X 1/~;b=r[:9 }=ܱcG?rͧ]WĐ3sNBKFۚ"S5NŶ]Z?WA?K+ s6M.kmt=PKJJM6dgk{T8jBOKKOy"t5{Oҥ(n|B>?}ɒ+Q\D/c2+7㴨pK{m.c(1ӭ"7w/>?NНB]_$. m?1MwJw9YvW/Tg;$ɿ6`f 1⧞Ҝ?xpO~ Uh4Spm}LK.)g\q`\/nt)L>=L6v9|u__eABwieqL=~jpPL6,m$O.^ ?vz OUk'G}~3gPԝ.m>3:`sAf5oθkZ~77ߴ\:}264iҰa:@dFGO# ҂j JR^ KtP^1:Hsb $t|q̘)3aqf&k~7TF/}&?K18s2$"E$ 5`v(ӂ}s^xeMM_$ /7Ӽ BׄWDӯ%3tY$| MƹNSii \r^0v< g[OJкfR2f67ӂNkjI9ͨdee͹{\}_\r~/-xgY[2ړWeZrX[cp tkv-~x 2h ⑦o\kÉ$:iS[y9ue=!mn\v|L'8 _rF%_ G5۩sz~) pmu=CI\|-Y{\/j3@1;[ӟsjBL ګ(qZ B@̴Ba:@mEBBBB]EM"tBBB:BzJQ(jF!B"@B@B@BBW+@: t: t: t@: t@5/P UL"tZ): t: t: t@:O)J: t@: t@: t@: t@: t@: t@ t@ t@ t@B@B@BBBBBBB:B:B: t:zkk+PB3f P#: t@/oٲmY&  IЍ."n%PP-6FuZ[ti?ٶ3$D_7l`$d mזНo5@ޔ4{b\*.t'lܰ-NqvBٙr4C mjKW{`C Bh"t/}cX1A[C /$Y)("UB* e=djDIt:•@B@B@ MK/.k'PWBB2UJӒ0U B7F[&bPWBw)X)M%LNery]jt_B8\GT {?Ut%>r15X՘4l;mzxO=---k׮ Icccss3 7_޲ekL eٳgJS1E@7q>9͍Na6]~71]>@-D!Mf͚q&Nx./ Eǫ'ZL6mƟ=?mvy`lr6P(~}qq"]..浆^^%&]{zx/wj%]W B1B2l~%,ZhӦMݛYGT`ן 7.mޡUΘ3fѣCkoA(f̘=X;444csYW>HСj`_Xr]ZK˂GfLʟ1 m `[ohmZQU&t~OYzdQIcbsD|Zm*s ;÷mݿ>{R ƱzK.q"tH~6ߢСE7]x_u1FX5R@&LCk^{,;=I%hi'&>#Flذ8x t :8LIB29H9r :KʚUVM:*tѷWtʬ(OC !'d&22FF[n/}1:Ҳt) B\ˆ ehcM8Bpz3-F2GU#t:F---k׮ mPY|-[̤mov=3]1:8\~Ν;K5D_-Yb Cl.?M>_w($ 6"tnH.\HyBE͵]7#pM׭2;to8eNOK^|D#$E-ڹs??1 tH[pmaӖ-mwﯴ)w:(q)IHׯ_駷Ⱥz1D9BDG2<_Vo]Xd_NS ]1L.<ɷVKV\)&OС#NOFݻ&_u>8Дޞw8S:B\O|dСf#tN=`K[y~w#+n֗o -ajL!6׫+qYK_R%^3SlۅܛߜM>N/xȃ7S\LG"tH&F-HO2wa#ƲDWz.H9Br۝+;ukZs6< &_!i,ZHҳfjoomZ aÆ =~Wz^HM)Cl{koc>FNSΞ5@f̘f9;444csYW>H[׶7s]F.9/^Kv4zvLxx.㙿n1f[)3&N=z w@b8q|뭷V ݶaĔwbEo˩v2>.!Xt{_X|twGƏ֦7=1W|gtl|a4% Dk]m2zp>]ތ5)Yƒ3UuN>/)krO^R7s5s۔/lן<' 5JTJ1BEѡ,Y$G?Gt't^)jEwvs׮ްnnBIB26okk3sQ6@#tel>7o|^9c CcC}.@4lyg^f{;v C?y@]y1cC-Hk*&t[ ;@c;t.67U$sl~}ָcb :$f&Ez0ssWA4\3TzwF:$e˖dzje]F 9v~cvĿ_?[^{65CkE] \&O KYfĉ1 b{'eٷ};vGVp݉X!r1,Yr'kQy2B?nr(7No,m! 9Ӭڵ/|n$0utń vsF뱹QB·wf_ ืY*wkNە^s/<3ӆIcɲfӦM3|ȑC>^/Bd~3u|aJ~k~ߜ1!ȝϱ+kU^:* \ 7rپ$Z ]k~51wļ,ݏ 3% , ]$!|_?~ ͻ#$3FV[G66)IH2Qu\xYwn^}]ILvJrN3.IqժU*tѷWe)BommYQP MCNLdVem-ijv0\`MtYd斖K?09Rž^6t`eUNg Ԓ)?*mKo=6T/>tc3_x߽Ծ*)t&o=S4)C֬lh,zkr>9e]]6ٕ{Pv–k׆;mPY|-[̤mN0],7Y\6(+26w}sܹ3SВ+VȬp:Tsڴu Cns/B7\i…'T;~wO0vdr_:A.ă[.ax6]N_K)w NL/䒎=eɒ%Q=dOansfVn\F_z|툻^l^M'S6pC /$$i6c6l[.hgK"tWo0B+IDATS> h eY;99U洡C#tmhs%?zmZʙѣGA:% DwFx6!NyW^̾#̿}OcY3qU#$e˖kE\z.STZ*cuױ\M?7ﵹrvm6oll:BZ}Ei]]]{'On͚5'NLJ]~E)Ƿ^Ȩ/ө51(CGaWW~n۞\w`zƎ+m H Ǐ_d'6ta\Ѽѯͣ2/w.RnnѾ[lQǠBX7nk7+')ۣ2A'8CҘ0aƍ{?q=66yz+wb;B[m~6vL 6-:e咉8\W.Cl.wBcx.ICl8{Ȋ;q+&TL)J/9J ' /ӦM3|l~QGuvv0 &4dM8WU]9qm:;v|ؼKMaMo,waJkniV|#Gm0' ]o!tH r?jժc=VW^Fҙm(f^\v!tr빇ޞs9mWNz9-xdԴ1W ho KSSʕ+_{c9&Z# ZҦ%ps۳w;ÕܚEw?}5g?wo'Nu=?ԓr>`ĈDpN=g}6r`wھMfK UQO9,7v}nЅU?<|/K&暏*x ;}Gt|hۢ)yH,vںu|Gbs cZZSlm20ekʇmqϟakkQcFeD#G)ȣ>eٳgb7im:b"9ɷyL.UD!-U>b^45kJ"X:b!1u%2UVM:*tѷWerUfEyBE2d7 9!3YUw斖K?09Rž^6t`(;Ebp:5gjbρ j5WڷwPJ=b}V'4om"m~q-zri{^QxWr|w'|g2L&M)"BwCm5Ck|c%.uzn]f]YUN.Uz]xWK{Vzi"[s=} z~^%>qſv#S9?o_+W>{giet2DvC wL%~cOҜ|33gl.or1F$Q$T4[)-{$HUeL(4N#KѼ?[9@2^t_cK%`[q\﷜u<46$3g΢ oСBSQ -ByAC5.j 1 t@ t@.t%E!T3REJq_,}s60tPcz[[[yZ1e.:b$W蒫FiE߫?ȤB >g$t^cר{ݡ4\lw 0/>a@Cin@7}9}Z^󲻾C{8';f{6׉=VzWI_׽?P._>$RjJIÚb0 3KrHwiux.5IIo< oӠw~|ݻ;:\J ;MzI֫.qZY("yasHЗNJ K1Oe$HCH`@#rK*IMRGw|8֩9:@DB:BZzKKڵkU466677SK"Q&~-^ܹs姢t? ?BA)R( XB8N\~~rgF^iû"<*X{Ei*GljjZp!r{܈cNU*7jDXwǴ8 lLRK/A}vpPq],k~Bzg,8ٱ HB{BeЍOQ۷o/ӱtM !Mʺ^z$"P4MEP&q,JSBD3}3N6GR&׽0aZ2=|Q:$*H|g}mۦ Nm8v,d\h H, \L%,l>x`֭[t=јNGiȽIDznrXjNۭ}kQ/zTej&i Bw*HBciyڰ6#kze{`8cs 'pJ\e:'qW*2SKB+9-[!Ch2-PɁV!.Br2q%.v# =2_9N).BM';T/&؄].=N˽O͸FRrL:T__9QNBOȿB7Yh_8`ƍtf=ݐAFPq].w+i.mw4}/3{BNfu{P~zY@W9l,JkzY *'[NdCiگ3Z[w7/wDk!k_M)B7PXn㏍R*)=CU!tQ[ѭ;q4e7JƘb[V/j*~ GxHjr1E)B={^& %LУ*?КFv) 9l.+dMv Zʤ*^=x#BG1'd"4 aȄ^{M>r??r@@u@AuBCwCCwEEzFEyGH|HH|JJ~LLOOQQTTVVWWXXZZ[[\\]]^^__`aaabbdcddeeff𠠤!,77j89m99l:;n:;o<>r??r@@u@AuBCwCCwEEzFEyGH|HH|JJ~LLOOQQTTVVWWXXZZ[[\\]]^^__`aaabbdcddeeff𠠤H@0^` #D>|ؑ& /[:7i#*FigO:q؜EK)d؃Fi< *ԁƌ/Y4MrAf9p0:h E*o~M$lRË+_.wxoy,!Ÿcmk%$L=Wot'7U}'@ Pvu'u֩@1)߄4x ` \eivc Ge8~RsØ_X(2`W.ߊ~u(c4䒭G|:>s8nX1~xg0Y9眧_J@勱>r%`)2cױ!w=gK3yJm{h04H3Aku n{oӏ_ HL:'H Z̠7z GH(LN0! +"8̡w@ ÕHL&:P_X̢-",H2hL6pd# O8x̣> d爳p!F:c"GRHZ̤&7I5Nd<'NL(?RT򕰌,/Ju24-g^.Ib󘪌0́,2!4IjZd4nzwlEF|IN2)팧<ϙGq:{'>ŸyӚLIPj>Hv3(q7ZThF6-T hyQj>#IKΓHPpMє4); *O]SBl c"TvodjSTzn4gS]qS%QբuUc$Qj|YV5.k7 4e ZzWh4i-aם5_[V*d-i,6Ȗ1*_=+*2jbIP"mOB[RVr<#ZΔж+nN3G*vx^ ĸEjcE6g,.vϡr:oyQz^,!nM`^, vbq2ނwk|*Vw$%Z+$er;ߍw5cs k& g1`X8>Ëؼu-v_,ab5qn~=LF<@C͕o0 ic_!zbGO&'_]`'xBIqKO{u?f[ըc9FWq"vts{aVbߧeg9LmYujԴ9դk5Gq 0yO7 %ѷvӴqo1{vs?P$?Ue fk`U]/zY#zpp.Q{F$l Q;Rv  y~V@(DTFJTiCx[a#s(Y(d1wMABM8)"G m0;D~ Z'~d,ٶ;htU \'wxR{Gy;ݦxtu&h{@ɷWq 1mc‰iH~4mhӔDE!RfPo/U(>s7 1/1;s.Gedh1ҔP'{up xRͶ'xu(MR} Q%p?X-c.vDq'V)~((d v>yfdV ΓWMjxS$Y-*8{ÒpH?R} %PS5EQ)ӆ#s8E!dDHD ~6~(ɔAՕ~g)|u kߖu䧀7+v!`[لHxXjH YmlIY9ňzڵ&"vH),i '" yEšQ+c(h")!)*9Zb#sG~9F)[QxM(c0Mdr8t# _  iYmXQƀKx/ uʩw1JH&Zc@T/6O =7ɞ9(MRgb{bڒ~ћ'բxR0 4,\S1>s$r2{1/Iџ:'d @tyzҔ~W 5W~q fz~g hkZD7 Y}Q Tʣ~aD1ږAp帛ղjʙ*OJ4\0zQi}T*'ÚVpJTjFn/ȪI2 {n*)y4fWiAҤjڨ~Ghxນ;[Y!Q+Xj g% +MP Gx#Zʙ%Qثws ;Z.层JMYUQd!c+Ip#wB,S t8*ǟJkh$Q^!j#jZbxZbd,GMpؘf{umŶJ*FyxR' bN\l {0 NAZDުFS|Muy\*^LT8ceN!0.43nղ=ȴR H|\,?Pls[PG車'4 EhxnFE} d{EE.miLvv髎E谎=鮾^NY/̪M Zd>^~8ovn܉nSb.]훎>H|{ͪ\゙7^ߤĎEn޾>LFdtZ$b}^n)F6޿^^_(gO&/jeCO;.E]9?;Ϸkvd (]?loQYXVY46n`FdfiٮD}ZOurmdrO϶vT1SuF/4i|HfţOxdR_jom`bF>A`ՏwO{/?\0Gۧ`oo$Iq6 D1 >x D-F TRȈ%MvQ#J>9RL5 ęSgÖ=[i1?EETRM>UԨ^9UKsX]7\iװmC"ЮZ6*[pb/Xqbƅ 8Zw-_ƜYfVN,szD|M\*h΢ն^hdԸ߾jXOՔ9?]:tY>Z]8Zݽ^xcG^zkW^|aǟ0@"K.*K/$L3J5|JL4<3N9=LS*73O=M?dqH8$44QEO@UՖQKtK7S24+%)R=EHP5MUW_hUQg%C5W(eeUW_ՓWZETC0XeDDd6'%Z?5Nd[o%\sE7]ue]w߅7 㥷^{7_}_eZĶ.Q8aUab'b; afxc?cG&d0~tMu[_XcfDP5y͙{:hhYN֕J\-㕏h/j:tŌ~ y@nfۆ;+t*Î9;m|{papNLXJ,p1K|s-sG_*Eڌc!LYs}vevr-ZrH|rWyw>{"Wc"7eEo'?GjÞ#e7}m^&1 dꇼз 8Ao{,V@~R`Bpbs]~EJ%10"E!thoN_8,Q̰HFJR`gG5ɐ <_#HMvdXq 06X w<җIObpeBmrTDe W X*®7ʍmA.J#ӗtf4K[`nPdi4INqJ3K^Fiu%7r,Ή p~cLx44HyO,A{FO2S(ETΎD. E+z8Yg"QWWi6Sִ]&Nř x ;HD IFQ3uȥFSLO@ɎBjʪ"UwrD9J3ͪtTQgSկl` VuWTL$YldCT>֡DUdUHjֳ&*į/huΪֵm,ϊtEYEbc˫՜KFs ꎧ:*1V˩L;^׼ZWbPRjZђAzQc-׿%/A_.ڑq4f[d ` Wؼ IˤY>G*bXK'G$)gUbw$.U=҈}<DÉ `v-î1Q<ܘ8Еq¨*FŬ V iU(wMZ59_'L:L; AQ F3¸ln#,g6 |)=[5x!9MUdZODj3&#ʳLk֢}SGzt jTjlK)_:fٵ=X.1iݴC_) $_+@SAns[3n`g; q{l8"\ևB&ybU]Sċoz(Tı!uqRćGG=$EyY6.(3a)gSo rO1,r(ΙrZ 2ylM{9}~dw_JJ0Gq V{ӳ \)+/ֽcbyzPvSh}qxB!Gg37!Q}}MS=3yOc>^/i}6ȳ8J1Q (1 fB^J?o`Y?s.mt a@|:zџA7]+J5S^ cX  =ܸK[<k@>ٲ <:? 3 <(;ۃ0<%:*E{??d($=؛<6|EA;%7î{<\C"7CH,Z̺[U9@EĹB#sPQ͠éxDĨs2LT c2 ($3 SC+ :1>`ZRD@]dE^İ_Ƣ1P0 lH<0 CIɰ 0I`CPI+I@93#å)3\ǪHǽQ8&Wl|E<$TB,w,FVKK ˃hǽ)EX pshk8JllIt?@M̜ɖ$%ҴfXr0Na>dwK0.A,Z. M;gk3̗Ⱦgԑ$x;Yl KE=Ŵ HLT3\X 0F(Op*T8ULUK\3»J8= WHp8ĜdF= TAnԙ?5%zҙN$WmΐE/TЉP}3$դ%%wOKăBʱQ^CxA"X%%V$LϏ0Y]X|cւ8[}؃7Tɢ`pe͖֤ÜЛP*DEVkjTIk@OԱיW %Pͣ 2kPVNT-Qr˖m Xs[b >|sa֫Ug%& Xqа!jLCS;YY9\@W`DD0ЫŠJ6ԩDPʬkUy=[d ө ZbSѴZZZX1+.Ɛ/&IVm=Dәبh7Mز34ESeF&}b}?B0d5@ fvNG@ *Dѧk`v$<>dtuvw n B"3weGtDg5zk{xaSvmg^O5jrKC8W6X(/z?0xmlhxKv wbu 'xv8xyyi jyglynf5}V'z7gwyQ_7y<:0bOq[z=iG{ x1bgG|q${7Ymc{8|yw@/Z?8{wO?z_7xџ?-J} 4?0:AzǑO{};{R H$1Qr7_.7wpQ"%SrTwٗ79U[;s,h 2l!Ĉ'Rh"ƌ7> #ȏ 9,i$ʔ*Wl%̘=i&Μ:wiskQ7il rTRʬj*LRAR+ذbǒ-KRִjײmJD71(C,u+9-l8%Z3n1( lr݅D2搀S,Y&vZ6ܺw.Y5o3Zsd[ 2mg;xۧ/B㮐Uy m>P8 hyՅ :8}Jz{ msF! %t )"-"18#5h"9V `Q@_!Η#<$M:d`OJ9%UW+DiiCQKZ$`Qy&i&mie0%{$c{'f:(Zuu'aih|e )N'j)BƆE1xaijN*t 'Xl+ k^,,bV,CTR 36l)qAFCBj{N߂K/I/EQ CiZk:K,k v811E2ɼjZQ 9א%+\2m}[3ήjZ2D,3=ٛ4Ӕ.P1%+ O|t]va﹘\CU=WD5'qbs}&B36DZ~ׇ#8}YP3Ɋ3{\fCV-2:>McCm4{ǿ?|fϒ3H[) N|uS=YM %G/'mWD5h_.~㿿Zsl7͏~Kg)>A ![3@~N5cePaNV$Ԛ6Bp6 I_}^s'$G!'?Ѕ2 g L (3h,эr($e!HZѕ.&HV!`=+hN'N>)PSUj"RM3N}*T,NZˆҽ`S^*XúG!*`J Pn'Uq)F0N·~h\kV =,bXuLO JJ؄$l2[ )Wђ$E: hL4-lc+[hd7W5D],id tR@C*U)^WESta% 3!=X'BJA/ 0#C3;9q:5rzI٥ ߆2C$D2-ΗJnO\a(0RjC$Pkhf?@XZ fRg<فnjܨ `J?Y0M&QHZ۸ֲ`0A+*t@$o~gf6GӼ5Wi+rI/k[x5 EyJp^x!nqCH(&dFd)c!OF##"u&h>6A*dhg&kDMaflmަk&rH&nmpBL EM% TB*p.5'tE(oF&vn'\RT^'wnsy6҉"yv|n^FLh'Ȑ~g~_g4`>@JQFhؗzBD򁤄.d(W?vh m((kV/.'Yhƨ_׊d(਎D7$ʨwx*ae)臞čFiy@vh-4gj|D$)em @m&RiAG\D~iYщQMJf &jƉqI(2*,*:iiU] H^^jX*hq '?2~>,{jb>މh)pJ@6(jp.kjhK*Vʰ^+mvdp|j4hVnfkNh''*麾ثjħ(U~*Z+w%M,&.,6vl _VFe`X,V1"~"~*v,ʖ/ɦ,f8e,G즴l/%Ж]wYq&6melA{g>Zn-vn-GH׎mגDZ-ڂmIFڶm:mbAh*Y#.[-ߞElEߒ-FEࢭFm-: EiܭՖ%Cdm-6`CEmvZ~׆ߺrڦFI@nmS|nb-,BWM֮.6HS 2/Exn*N"*nph/fpon.oή^MWb-B/.oBn^/b9 D/-GpLro;DOOTo+pe`Z :_>/:pCt#0p 0_.N ?0Fo.'0. /1 p0psc1gm}A/T 0DW w_1kl k1߄DqE k optAn0)e!p'/-m-J*'+}u +.+ "p++f ,B*E(#'*r[43'20N2 qcs6'25bf(O&i_r27Pp7C3)+J){-,$232?/1C$E<Ks1,W)J 50t))3Aws3>߳ 3? …t0k1l1L˳5wtp,tR3B*q-4@:cqa<oHSVKQז@Y4=C[/CJt(Y;Eu4!u^+ @g>s9K*u;v84^O{s  f+P4^5{e쎁H*c$n,:iv]w5TVrߎA1ph0+׵kO|HXs~e359XCs-+X wMurv#[E_t$pH(`AvưbICSYc%k-W3w#}yf!܇ um,©7gub#/+Zl «ն SφYMs3T Vww.ruvN׺t ~s$q8`8k-N'۸_xOJ D2tSp6Ht[C)tc9M501l+AQD5p v-xDkACb~$c(W wf9Au&7Ubĝo"D92-s"d?yg۞V:Ús1tsîc6zwP2'v81z8˰+:];ĕ¸vr|6@m5H8O#y׆bzʺ_Bxe{K{Jh3;^[1{﻽#;G|7evH㴃y_b'on%3y:ەԺg59C"P6Ԯ#uGx5j;|9ĶPKxi˶WG}o|vk9:6pvF{3t+׹|?4{|k"XH[Æ`DtzծA编Tc osů=R:1ocÎcîǀ{3@+7;_{|C9G)p/QPж}#|[ߏw.=7=OƇJ{s9B ܲu_y'c[L㧾9h?CI;;·?@H0k#a"E$[IbDa_I'QTeK9fM.ԹgO>IdB2<)c7Pd6:NGDMhY%+Ů D cJhYVZ~)]veuN#ݴn=xM$ <%%c`EAQ̷q{ɒ/s\mjcۙPVu.jvc (7G:ܸaL1cqx{eѿ3~nk&T1k 32f X$hKSL<{i,.4UI•DI. ͬs@bʘU88X|2HT'2$zJ@c2Vȕa%KRp< 2 D=b7b/ņIXRMszSFES~`9PXMV4t <#3F )5)R4*KkT/&53(UڃS+DO 9dViiJkK\6%kCbQ@Xs2`)ZENlL֬cY(r S!ENC!nj=` ~״X#z567s5$fi6HSs~ щM޵+O2QmQ͌J9v5ToSXWͲYr rҡ3zρש‘^? I[i6[lV ![:b#b1ٲ=ay{ݚ]NZ'~y*2A|yy\܆nY+Csث> seVj ,)Qm15shߕ7WJUߗ:ҽZSs7b8;Ƭhg y3=-`MtVurI}o]@QFPV>,^r*L7:i_q@ŎUS!T:^Ù%:SKEG݁c|8i2 _tF%" 0A?%6t Xq$ъ00<$BP04'A")D`Ԑȷ?coR_mErWDZE.hpBW@*aBKdP|[IX1 OX;a6*PU|!ArT"#3(>`9)pcPyqce*zAcլ'7o;,@yFGj2;_JH|NF!( $L9䡑$&IP)AXjӍԓ6e(5RZT-JmĨt*˧=2.NGF|tur;di f(P>.jQ5Ս36EZ_#mXҔ, E#dzek6X A ZU/6#uGW *IiH\2R"6O`\b,F}AaaCrҗ E hIٳaPP4Eۨ@%PGkwaG", ^DY4"|m^#c C+2!&Cg6 zJE!~1+h᚜64jiPͷ٤ kRQWf-%\Ғ:y 6n.-Ҋ$UWgM3',᪥&ensKtȍt1Y~LS"d P!HA9q)37ܫHSv1+Ϥ!sr6V`Ӽ 誅-^X5ڌ!ތj]R Ed95d IvHfV "}#8g];oy?l V%>cTx5q>8'_V8bÕ$XWF\x`NoĊbUҔc@#,ձvLפqpf L.0aDEZVjD߉H#xo^FuÒuw~Ax@<& 7#(|N-?5#I'+ ϱጊ͚0/y6zvø9XW>!{>*.=X=Z&Ρ¿)eăጧ|u}~˗W[ӷ/iF=(G.~O<Ƣl / k뺪C/Ưo _+Ln0O 'Ԫ؏'O% 7@ 9SN :~Pp o InD8O.Jb<$n*p#2)YBfP˄oP w ?PQGId 1 m EoΏ7 KcqP LQoo#6NB$@A6m~͐Q$KrOW1F'b+1 G$*5@I^bq㰅_ c ?QW GIrp!"ѱ'`eQ/>/ 9r#{ "z)r?1%-oXr$'}1ñ((2)(Gq))Zr*R)*2+2ErI pe*w!%a2&-r14%/ W,'2/0(e(Q+s* 20 S#)0.s1D+ɰ-&2-(2S*5+3As+O/I4r/Us5Y5]5a s$r2/14q3937#y3)u74NsR36993:gq0:3;s;58 <%9o9<3=scb Js=3?s?ғn3<3AtAL>0B-B;5N@@ /1DMDID">6C>Q4FetFHC=#B8sF4HSJpH] FIDm&@#vT/{~IK[c5ZZ"d+F:\o(=[c8@c@~KO3JmDSbk\p |OP%P5 xtDO5uS( ԉ:.4b*FJ9K(Un3!mO9Vq56&,>P%05K @/̂p2KkKsZq, re/Xf\5"*neƶӰ" fM6ý!ɸ [^rW+^JY}fY#)`YEJZDub5̭H1~`q̄fMa *NmbYeiГHY0^ZX$W zlVbCZ]hQT܎ r8P,if/6X $k]V_=l.QɖYl7 N.9kvA-l41Frw^)v"l.T6nOV&t64HIP%̖K1u/Y {w?'pßFo7Հˇ\a`t2tmK% Lr0%4Nh~%OsVb?wowHs5BuDl kVj鼘F`bpWLr6vZw}4w]G bN0 r}&4` QTa72:)v5B6VG6e4*vFF]HeFcLVB}}]$TWAlTظ!~G/V#33(ԄRE7bFu,"j V%H\b8c]` ~$1LJꀆKb1$R!U7SqP,!BJn8:8Mp7 Ǡ5EJ=َuʓp7ٻZT27S-?yQbkTC%JhΚD WoSySimeAyYbW YJQxyɒY=g9E H&$yJyEwSz;Y=ѝ&2Y9 ]t R%:q zG Z(9ڌ?5:R W:_;@?/CzFENL7[)A[#|@ men-Z11k:97wE B@ą6B}e$7"Oz,_: ثOB?B bVm9 xiMغB.7:Y9C9}%HeV6މ N*z$ۮy麮5{y}{[8DIwQhg ONx'*۲C({fbĊߪJV.su;3'oA[j׻ 0BIҾwy!{D[l"&˔"7zأsV6U|o' +Do2f(RQ\G <*k*YȍI]0%ܳǯYN?*C`(fMg3@CO|O'.|[O.NG|I#XHn¼/4Ҝ<[nLj"foˣ<>j=5= }4} s\Z%k{Q=R;}>}BfoֱURU=u;[]_CΚ0ĸMp;w=ٕ=_{=]]i؊}D/|ٵ}ۡﲿ;j ˙}qۿ=kM9IC1'?=aߝ[ޣ:=] YCjǙ)~^_1A^/Ec=Q>9uI^ZLU>e^HYa~u~iy~~5}>!=ڋ>=>7걾^ꡙ>~ɾ>~پ>~>~? ף?}%)-#9=A M?Q?rYSa!emp?y_wY ?I~_kߓ?C%ſ'͟?C忦?%?& <0… :|1ĉ%.xƍ;zcF$K8G{e,v'Sn7s3ТKnԪn-y$ٴ]ˮ=5wn;p.ngN3HSiڻ{g ;qW/ iNJi^ii~ j2Өj*ʪVO7Mwk*wv4,uŲj.^ .I%Yk$i+on k޸{OnE6/EvĶ .5{ \dg /M gB_6U7<ƊyLȈlqD$vr2`'%/$3^2|8t9s]A\qݼܳ5N4n!v1ʹ^c (4I#6e:ou^;]L` YmaM6:9x+Zuq7=uCy1o|#Z u1rIo3>q.G̽G z}nPsK'Б{ոs?x=?NGO<`r6$nSӪGUU/=v)=&sZ)JamshI>A KF2P]'Z{J@N{<4@kP#KbI_G0 B`q_!xЏ"\1T:=/\ Ʌ!Zcd8ïІa [3Ŏ=!7 J01ԡy(! @rJPB8u$J2X0 xhr'xx>u"[+(0FdEX74Vc 1vXE{C()4?}59HBҐ dƠHdI8tȇ;7 x`e @WsdWShI RҖfH6t,iBKb͘Df)QeEc稛@Fd"9mhiK Hn T\9Krt}`O Ԡ,*?Т @oY3PZ%{CP$1*zLNq+DV})IyRtut)(<( CMxXa;P Yu_X RO-wj0ZAGZء VgEl ?P4*RԤyM^Wr֖]`dMc!ݟJvG^'u j.u"QZ[(BEj+vE+'q[vWB4i7~n"ӯu@:1jnuswuZtUnS;{N ]h{X=b0tĤci;JWB9~+TͽNx/0lQ.(Y#Fu?8%n?+L].0d|PWlv\Z69m%2c r^E)8a:O f %DYS t.)p9NPdPk*|U% "ܖwjF7[׬`uc I&ڬ춷Uc5S\g:GwVDՑV3v@AmڭN蒴]gu921p~<=ࠣKEYۇ_'/Ĝ<Лl 4=mjq/u ~} ^bpnpCl&p}AK^tt5z';uL_>`|Urɷ|xrp&S F}Df}WV'n});(yot{oXzIkzg )O 2Qwt6hjĆguwx8ŧww|&xW4ih"[V s&w\Z51 \pJw'oIy4Xu $z'I;AxP x 'PpLrRgoU{Šl$X ^HZ\mKev1 ssVV6oV%H4 A‚L㧈18o'W^dS;` Q khˀ Sx ԄkGcv͆r苀_J%8'wh،G94@ Ӹ_wxHވPy#gXtyJt6lXTeNXAWb8b0  @/_=YG>g Ʌ$'kĸrՆlV̘sVDG1 1` {)03IW~XRS˥YWVY<p I-Е0I S`uk)ThjE AJ9XpYIHl0=THx zɗ" N%\Øfxpdip}}8iY)XwX<)IQ )5w8  Ő * 0 *  1刚I 9W XfTȖC>Л YI]ǩ?  GfL0C\`C)ȅ?` SyZրzGxFyy)h@ވQ:(эʙ 5w@џPz:Psw+j-vt戠Z:Jt*X3Ð00 xU )! ˩8 Z>I[[)3 1,`$X&IϵHd9OXX @ T`IZO@RB@ A˵aDn{/Pr6]@cg8ȮZTzU' a Zui je IV5 ˠ  xbڲڹ.kxy#3K/JW WIa-;kM~T>WbDk-SNQkk Pl'hDgt6;~7fkCm)Gyps;_u;_c|C}+k+[p6 /ٯk8Qm;|jߨyه|۩P[E١ +,9$ S-*e"eRYV_w,M5HەJ fHȪpʩ{.J`;[5^Ci+}Ǿq5 rVuVUyF9~ZKńd@5#Z:!L:+[~K+5| oa+WOýk{JE+p S,JZ;8a,!%ic W.?m|ro,:8wyP,y[K#P0qZȅ|zhs D*sCq琩DK#,]P *1Xۡ"ְч!èݤH>uÿ_T\gKr|[qYnjAH]R̤tٛ{ל͖૔?\@`-tL5_>p$Zt,avBϧUH^ܖǤ6h]z S$—z>C!@ QxȲ$+. kQm$[.{3<yoTg7W[B rǛްpPMv]ܠYM]ܵ_I9aa WcmְqܾrwuYׁf ePy#҅]؇sh،6 ݶ x&x4F=ȖY:|/ Z ʡ۸5~[5ZʼMՙ\U^<;Ìaέ*=_IJ\XiܼnJ\?MyTH^ypvpq8&Iu ^hm`\lᆍ܇xب "N_-i 3s+ypЍ͡~!wny ["a0yF>H\eZSX DvW@[c^~Żm/Nnp>$xgw&a:o;=[^{mؑa ]Czs/ Mduy'  @E :ٚ. Y`39S& x7ZTGi[/dZ}ڬ7|l>0Nc( _cNy؁)Nzp `i(#6UGs6m7y :/ӽ?o?O  uR/a9FZ_O^VoT˶ hk>P߂av{vu> ^[U r_Nk \G@ ؒN3 $A C%F 0E5nG!E$ibɉyP@˗$ԡ99uPk\=AN "JјJ|L -Of?XĎ%[uiծeV- Υ[͸w#L I QxT.>eLⓏ mϾR\QH#/GCRDf& ɧ )$ʨPb)~a D'uRVlq?^׷qعnTR\QH( ÔL2,S3͚l ОԚJ\Sb<6ͷalc3 )c۬8ߤNÓ=cOcYMA%TR 4!NVQFmcCKK%8JSN= %Hx q)RU\@V eZߍto"Nz!eX i^g1Ǯ=Ҳ]')5=w+e.My|wR&[EYOH08%nN1BTοBI=:XCNQ%xD(&0YDP0ŋABДҌ!T|@F駓E!1 Yo4 ;ւ;ֈTh4?nB~;둳~$-` ʭy$#)ݦ .3 [,i 6Ņr)HRHR+Ō=(p'[GP7zySҢq0 P$&"O$Wb1"z;h fbUYFmj/f,:HO~0K!J~51K36`?$,=TSPuȁB8YE=SZ[F3xai*˩4t@@m.7ٜVY-Dzzğ6(T<F@[(0DUYz5j«^EBlY쒂eSn} ^v\|iVU0gؐ8_.@3RC#k]o`ꖱ3nͅ Z^ٹhَ,F^06| lt"Ϧ_#ˏQ %܉ .0;\;(R :4I<&-:dH@6Yp]s ٻ=zx+dp'/yˑk6:C70Eʺ<00xAu(EK(7` 0>Q%k@E!~;y?B1+񎁸?оCԑ<8)&j"H*yax |9)$9)4ul/,=ޛ/m룼"ɍ4r ¹Ƀ0h7#D(.jx*x(R6B80T1Q`Hĉ `7ãP57<<;CC[s U$&E%h`kY¨ǠɲЗ\ЈQ%(L4TDy]U)D!U0:ȰAU.(h^a:ˊTMCԀ)JcƂۡXF#{XUXX*GEM]z<9)YyK˻ŝa\`rG`,*P8˕s"I@l]9MVӭfYsb Zp]O-꽈ȼAtV =UU2p< !p(IMYTz Wml%F8[莄@IT 4UEX9U ICcDzDGI`\`Eڬ(]Ӎ`ju ׽`dX3EHa$a%f|ǘuhtRZ[&a~TC x2}gS c@HAڅ3oK䑄Bh}kQxIe}x4 bAÃ?JYB )2V`lT3D6%4$ci &cvdpj{,j'Oе4J|g=gLg ZDx]z@Iji S{S|WE4,; %_ ;;i Y`۩- f3?E`FJʑ%ʑnbNS-b՟`bc_ jh`FToP&]~VC>juglVdyҍ)MVEmRHXlmoV gpj)k?jh=S jd~VI:V 4dDd`@K%@q 0`ͨ| !棵(88k(bPVpN =ab.p3'nP]:Up2oO@`٥DԄp=sg k V򌐀ݙf9k'.:`1\ȝ Lڭ]1/)ݷ)^ĆoZJ?Uai-r2`Ui#o;s`𿝮bEٜQ f /uqVO`NWƀ а 2ybW|WY RppbTgo; !Z_i4e_yUſ`@W=,% ݩ6?e#g TaѶ,%gsFg>nyՈe @hI"ZDPu#pQ(w)h7eT,Te_,lrW勤bkFEN҂nyCkaXAD:5fC~* >dVggXP̢S& `.S(DiɃ aD+O~Ÿ6G)Uurێ{I圓lk{\rOwx0+ՏsP )=ǗGtOfgcE<\~(1A(q"ŊX̨q#G?N 'k$ɒ&Kb2h%˖._3o&͚6orgD<jSQ FI Ç02e,TB">0Ԙ1\A S'alUąul=޾VFf …LLbÊ?^EjÆ+fR>beҦ)Zz֊JaOUƌ} 'V8?/Ə#O|9q)QЀ(u $|:fmy 5-Ŋv[9 uKtr(ʄ7\ER 5 KPJ,E1>X"]ZcUyWaFfxЦZcK@"-c $'pI)}1g bE*֚kX c +Q npHp أw♧;ytUaSSqXxez@\uT?=ig{SNҁs:FԆETJX("% ̐k@Pu(B\4*yXgEQQZFbZjaUIn+ݒ)[¦F d9%\0rwNw0 G-5hY*"){]E*(GO# 2"z=,u=UKѕv\^W&J póTZʒU>Q f %k6)9n"Y[vN)zpYUuѦfrȿt^]nr50u$uP,q1\r Χ0KŴ\8Ap0H (\%.t!x!cmu f))afk(hnߦYcG.v7ުO߷x݃t  'a*ʆj|r3v>D L9⑲ӑ$uCPA؍fzy YIwS! '̠ 0BK:T, +[Jbg8 EkGސt%=2f"H ~VaOpeRh71;AbrPhB4w+P$jt9ah0a]M~BPX)R ܝzGoDϣ"ӴU$)ɑsbL, ( |ߕT1=`T 72E Ñ#5IV>;ܦ- ͽ|d(4y Sѣ]$5½\rIqdh1p+U\j(#AI0yM%ė.JX 5TkSFcH8k4 JW%Ý#0%j겚^Blީ0pgq Shق,ky YƝ$\Ld( .93 'wQka|b%/ Kd5=ի7_Z?}âJC{O,]Ҁ ds*qQKD7} Ӽz̷͗s 'gW`minwNӷ._rEԇ=ˎB48,>QTi5ܬ<[6*zmj+| -n)i?2MM">9]UHe׿kqQ QGPf$,[gz 0Kƻ͗>sW(c#1e bfMDg 89+\0>=-~`XQUu|@tȜeZ R8t|C}ç67i ŶYmfl~0And;x7A RJSK@KvcV+KQbF b)2鑈5e6z09yųY-dUPZVU1\wN΅hF.qidhT-E)|z3 ,ʮ5mLs1;>(-H faF u)Jc>ZfDN޶}'[<Gwfr[gCf{FIfr nsA<⩞e'wy:G-p{-yJwR]N9y `7Iꊌ{>c fNqFU#b{o<|oous0p}LθU c=I4L&rMN{ET)XNio#"~CO~ƒM"J1yX^`b~p!fa!a!La!>Zar@a  b!"b" !!*b$$R$b%b^b&rb2b9 $va)"nb*"Z+¢~9bb X.bb/b0c b59b1.23 40Jc,I2V6"5z#*c85n%j#9a7c+c;V;#%##.:c><#"?b=_%z@!;"d+CPEOTVNV%UV*P%+V%XOeRCFX:dFNdSvG 19 a\#!*\B]%W:WCHLf MJ&a!]Bb eCvCdfXTҥkakCTe\%XelCMfM6RvDdbc`hlO:&D&`xfNɦgn'Dhehp6&Wf'vxFfrd]%$wf[gXuf~'zi"'.gDd&Iq fObfx&$W'.^gZ+.~a g,gxC䈞Cedk&Z>b?|zuNst &bDNDE&IƧDdE%UFg^b)痶gּale'f}&e`bef)}zDQb&b*Z&inG)HV%spi.C戒"mȡ@6E8^>vs4)rD(iO)a%E]f2T:iPGLe.C'*ڪ|>Su$i+*j.~"ZNjB^Pi&j k*~FFZk%L*uvګG.iP>Gj6+'nf&g^صjDNRvkN֪r+Ǝ+Ɗ,NFC`bl"jƎl\컚!\6I:(yª)I-&-iq&l,n(kFm^Zm\ebL>k>$]ÙneJ,i.blϢۺmFg.mU.WRlazJvNebkjkǚVa|bXB䒫+D.i£JC%fm έ!91ӚAre*j.Ƥj)If-bnmvnnPdL2'D"od2o,z,-j%zDM).irgj/+DooK]TeC+EgEe֬h.Ioƭ/Ӥf.'u,eᡞ}rki { ;oo6-ʭd?Ife*jN&j%n]gl%Xe*qkߜю[wlkRƚdyF1 O,yjY jBD!W!!R2mqnUr1V&nhr)OX iίkmro>j%.gl⫢V2 p+ۜѾ'2x2RB[1)/!GČJ6/7j2KVe|Cbfz&%kf9Cf,{ps; eJR.1J/cpn2,Js-e&D;-N#-ck.FtY4CI[G1؊ov4FsbH;*4t$VtOg$M&PN;Q_t* uSPCN#M5 UTkQsuWoUX5 5IYCu@ε5U3u\Su%]{[K^Y,u``*ubCl^; td vb5egbvjfvg{6b[6g5a_jvkkciG3lvm9ʶTnvooQ@;PK|D:PK4HwEOEBPS/img/web_md_form_tab.pngPNG  IHDRdesRGBgAMA a cHRMz&u0`:pQ< pHYsodtIME +!iIDATx^ٮ '4^Xi7!?ՄG^??-i,$?HioZfv4v~B9]ι4 5kz+z4 ^ͽPoBUW-\(X{ 4B`g\mIZ @d"\z4%nD81ܹ*C_ytMsKۘuo[KlN}DS:@}dqua=C'._<)Ch !G:&a7. 45rfY9"ԦY3R$Ũ#I] 'ף9Uf0&l5ּX|I4+0{մu #(4^0,fPgbi\&kCɺ wZy2d.y-ZMӡYSٓb)Us>kSchYۊ5ky Y&T9i`*4' ``RCso '!kIa|ҭIMh eMb$[D{)~%f` hNT0RZ6ٌ^$v}akt<Ex*l{Vp3ĭz. y)A}gȗއ+DJuQ,Zqx|ON qyq4Hȏ/qL@WP7-x!ݠFMyܡQh^K㷎1/8Nwz;vVDj} 4ɴj9"k*Sf1/ˠRԄvvAi2I.x* sPnaanoi+4 cR椁[@ LМ40p hInm~{X̠${3GB;ʗED/?h&ąԘ;G9S()p٬(ΈO x2wF+lz]2A[,6~4fAs(+Ga]d']ah"ky.&_䐒A5Mxn*:^M}PZ, 4ɛ-i E{*4{ MX(SSmePhBў ͞j-@ \GODS8]9BQtJCǝ C&W (T[.fgMv_Gr 5h&s ‡t*pr|h(6KKzXjI4 j#a&dH쀦~(˚@E>٦4OC| ܑ:9qrxXUn9Cp5׀. I=JhV4pl&NݎʙnB?]{#nK\Ѵ"̟;ir秜Q#݊շ;[.7y}{c\t9ISILnDz&\umw5{1=ʁ1ˠ޽o`4~Kܿ݃-w{c|//qv8Q @G/[k/nw{ w!~ʝ_yWysG:8Qv{ŗ_?x=v˵ZtoH=ʁno4CE(T)VhVKmmjftVмj,hz Klٝy>F`eZ>q7.;B3CЉ+3gC'' {һߠKx&$Nr:P( Mh'S"ef-\+4. RJ4Z\! -6u@Or"Hs>h>) .V UJ4 )eLI^Ir/}\ d rHY3{Ё ,1PAdTņh u\J0ICv&sXGqVnC4IJwB\xs Q!XNVhZAyhLRk*64sS &Ѽ8׬s dnV3 0IMs3`*FL'w2Id5[dMY>%؍::\D6[5c:xbZChVOEYk-CP5\ ܻw8t@[4_3ِKWf@hUA͛VdM" ;bif4/BXhr c"τQzaF(.װ,dM5LUyu +C/Z)O:t]ȚmʹfȈG]xzhD5C<ܷd=-hjIjeSOZeF“F bAԢ lb7:p@^ +MVJ+?PCqӻb9:͚?[@:D@Z:UE)UhVK4U2f^V9N,&Id 4=[ޔ,&64JՅmZ1^1{ lfbMN$LE |<ږbc4ӖACah-_tf@mePsfS64wV~djgk|<-.[)oFSt {5@Z:UE)UhVK4U2AA=45jUEdMLGfuW kVK4U2!kVT]hwv%T$'7sLkz1Ďy@jCxH#gvӌfxv4 4SUtkW7q!68B>;dL7o۷ցf[e4Cm;:lV5hʜi(738ibYœPx&f4MAa|rfhVK4U2 jTJ#h 诀j}gv2I M63g?"An޹8rmv?| xl!ޥ⑃$, >.}"D)85b'!(?(=P 0^tUd&]F3{ղ?1~;W t@)7V?Iayw ĩ {+ cd ݙa).-9="keVf)7K˳e#ؔǏfF0aG@Cl}a?y¨gz[y孬C\i~~ K0&]FqSڒ׶`%eċ{ݫ 9+YV䊭/~ʜ/`A3\AR OoMk1˖10pz4_dL0&cȳ$ IQLd}T): +ż\TM}*+}ɚ_){k úDEB֎vB&=g `|Yͻ!I`8YO( Xs67s9Z'g >(y$ox~hsɒ%#̝;bLbPM$  o.D"eX_f^h??A)ݘ'ْ{`N5Bzf=ToJ뽭ZqD{՝B!tEe5FjL-ݑ®OϤbG @#lNa4|v.IQ {kk)$_UZFL3O+{kL`+VW;wlv4>}HΟo?%  JA)HR'edLaX\MiZeȤGB^X!^ `Q_V9/D/\okm/kpTvpq'Uԙy2(a9ɟ-J͇4cdl$RhȡJCؐgj!c攽Dn*_(uT-r~ПTwv&e >[Z>)5nxq|cccHHkoHHȗ_~)"O;a;v<@}{} _Nq5Z ow\?Q;|CjkgG W2nG)s&Er+'-#:{@ NԤ= _`5ZNsYZa!ͯk*Zv5᛬Ѷκ^Bl*[A[q7ZFQ{1hW^N7[A-f!k{,{>F&_ɗgKdA_ƻj\oټ*@-l?Y\ynzn2]Z+${1!Q5a@3e vgAϪ2s>oU#nܽ]:)I˫ek2qpխRrKlogz90ڑ 7}Gsatnv]΄j@0FAO&;oۧ=Gimӷwqqq; t ~hJ~u #7oZBuF᰻?}eٞFL^ d2>MlAð Pg[g$`[bEC@ȏ"Bg6`X2"nʄޘav$9`A 7 x7q8!,<9; i`MYyGSgSB()K"ω͟8nz$) ~h='HX؃A!4 B/ tSHBM2L0! B!B/0  L0! B!B/0  L0! B!B/C9IENDB`PK PK4HwEOEBPS/img/deploy_run_mds.gifFGIF89a&((8:: !D 1uADDY\\duuquu  !!!!!(((11:::11:: DD\8\DDOO\DODDOO\\\\hhhh huuuhhh&h/hAhqu}u 8&Y}YAALYYAYYq}q}}\!! (!! 1( 1:!!!( (1 11 : 1:::::DDDDOD!D!O(O1\1\:\!h1hDuDuD\u\\h‚11ʩhO\u1!(huDɌ௵ɵɵق٩ɩ!, )БaEAqx\aNBDI\BpA ($CZaMXfeLFv`dihH-v)H4œ#|iBSN8"E0*蠄j衈&(a6hF*餔Vj饘f馜vj)fϨj>cyg@0{&D%譸뮼N:K_ l 2۬*lRkfvj=r$H" $BȻ:c,#9i+kIlDTl.Ӵ)1S ,$>c 0r(`r%;HعC`M5B&'43,>lC 1 O\-o`-d;ڂ>/-, &,#ȡlABMd=DXQe'nO 47ݔ O.ZS^W}l;NJn騧1P` 1l<3K 7= 8EcO3i}'k77/zYsz_m$+0QX 3s78B|;C8W2{@^Jd VG$yT9e1orҲN0W$ZJ^ΐ7V 0W ᭄+"d?!!6OE0ي`5BL$NLCNTd4 @V2aa%IC;Q$'?YSr ]IrWT +oEEI Z#HeE,$4; ьJ@5Αu,(4h4TD%&NByNk)' >qVGu-=mՖ6|QQmg۪םqV7H~6njy>1K\"n ܇:#@螑`:؁܈4\a'(pnWNb:>i~C[&M*"@P-,]6zoj= ~zmmHs8lFm*<6λV,*׹.ns7A-smӜs"!$1 K8ޤbD":+A* ` qsc4rU@CؐS{}!3@Oӏ=d?"W~oHvQOҕntk=G)u b>u'n ^efr͆ozwwxx Xw}G7wv1w8d.%5* @*ppy,yy,zK0 ސ zPA ~7*kUG@`HGGKKXaIaMOaFhaWHQE](DxtWt~GgdžkUtgxt}LjfEv8aD|acȄa8*lZXNUHYsXUCȅ8hS]Hxhȅ}=0*=PAxR B @*{.y!aN@ ҰM M(`8TR'8sHdȇIOH痏o}~m 8k(k8;gx刏GH t 8PH鈷x$I))yik Y*iX,. ;XagՋ .B ǘX.A0 P ^0~gy| jgyEh)v|sYk{ppٖٗx QDgtonxgHk|{4əuɗ)9 h{a(OVafÙ)̩a y 9ky9i )YVh. y)~mF%ЌYik] !u  ڠXhi  Z4!"j*ꡥ,ڢ2~}P'zp.`4ʖQZTJSZXJ*Ik(~٘_Y*}it큢Wʦ02i *dawpxx0}q@?>K?Х1ٙvڢj[ʡsljgzjZUag0vr*tps gШ Y ڬZʘ`:zؚںڭ⺭xrgp, 8A!zڡzگ;[{{a6WH.9ڮ{#'I'9ұ ";$[&{(*,.02;2+6{8:<۳>@B;D[F{6 :{gL۴N!\!@&pZkX[`b;d[f{hjlWpr;t[v{xz|۷~;[{yF;[{۹;[{ۺ.@z֟;ۻ;[{[븐;[{؋ʋ;[Kۋ{۾;˼{ۿ[<\| < \|L L (*,.02<4\6,@ @0^B ħ@{,Ԥ"AMԣrL}*P[}<̦rހճ|(7gԠY>m*@]KHF=v=q]jR׀TW-p а Q@i4M*ٜ3ٟןn?{yH|ڬױ]*-ظPSPV U~Y 3^bRI: n>o~-m.~zVGI@膎薽٠ٙ}֑NxƮå }ל~snCn]稞~|*`B`R ^릮l}=^H. rJM뻜ή竎0ҥА֎nۗk~~ե NM-r>{ P_ v_m p > Gl*/}02?4_, ΐ v>O+!L^HJ!N{P?T_No+Z^X_\?f#[lpOjvxz|~?_n ?_ Wb?_ ?s?  hK_f ?^ԟ+\?̛['^?owN=ġG]O鬹m5vmc B >QD-^ĘQF=~R`#MD D$ 4 ęSΜNC53ҥM: EhÊ_. xgůŖuVmJmݾJҕע^wXnĿ [9ӡBy6Ǖ#|2;!S3џ>TV]͚+o`Yk\ g429`'? S&ͼ=OOىf>y;SZlެ޶-v~/6 <@0B ! ÕZ )tC O,)D?4q$\)Ū /1Gwd1;3G#r!='wro! Z )qKO0L71bsB7߄3.HlH0.C=dN:Y%4:ž< 3"Q&%HJC'7'J-'J,o,-L2OKUuKsA5]]58o5W@-t>C_ ( ]Ƨ,MZܶn4ܛ<*S0Tև`6͌]Uٕ_u_-B:3LAu ͳE:4uZ6+4,4n7[Brdq7%w\/' R{UzMKYu^z8^{uׂmhfIfa|vy=!OkJײ)P-JS;UV{?W}u[WYc KEdid_XjƓ:sͽ[*SytOw(Zgv\"jқLjT\Sx;b]Nj-+v駧>':'p?|_ΩBg/?~g~ OD_\`S@`㗍lHp0<vЃ{,8B~/Ba UBЅ/a eX fuI־',a8D"rLr>8E*Vq~΂^r85&sOⓤhE2ь|"ècK18}!E ud  &QLTH`zƸ  qJ'HNv~u4JqgIET#cJ<*ãZ IJ\q ljy7!KӜ1T2;*#j̚*O> 2XyY77xmj ^ MPtVb2Dєd";6z.e6 2!Y*UȴV2MN4!g>ũEG&Ps$%iIi7Pa`CJmēOwSY4_hhU լD=b!xM!U Rڊ-g*8O5T}nxo'ݭw-yհtn| ׾$oE=?׿ }zp:M1Oc'` W8WΚwIPO20c'laBVc}+E)!~Ms7yus?zЅ\H|2Sc/E.pTWzֵuw_{>vgG{~vf̈z~C<)^:V^!"$ <T%dӿKd;)jJ% KT77̭ʭ6#tHaBkA,4Uj%Bp@1qP|΢y-,^+<< vC?豻DElĬDҒ(5ĊZMD_@P EE>?TcVlW+G))C˳D͂şEa2b E>fC8e\ [%ؓ|EY܍_Uu%ڦ}a]=ZhUMyBt%$9>.`"I͕^4PH kV#. %~ݞ1&263F4Vc24'˻ZwO3f2. .f>7^9U::nj)B&I;ڊHV@^1:bzRy z3_I彡dMӵ:A{E4=OWQSB 5EDcV~d`Y^7>dvbKdVh> f>\_Fiܵ]smf=qV('>g_N/\yv~kgS}f {gt^n h&hgNt^ƈvhh肎Vkvuhqin>mNinii~iKil & $b雾iH jj^jmƦ>j6>j&jj귖ꪦnꝎ>kmf봶뷮붾Ǯjk6klŦ뾆l^k; 6zjlvknmVԖlkm؞mmޜEŎl6nצmܦln&6FVoR>h߮vﵦ͆nmV.T[o͑okvkώp^p^p~~ 6  p,pq+8Q񬆐_qTl~q ?.q /r&>r$!%&wr'Qr)U*q,_'Xyr6$2345gses8r(c=?. @:sXDmΕEB/c}Ma` c H ~=WNOF\t0Cg L-uLOVoVG?ts uZg7TT/<fM7YbcuYm]fh`naf` fWcGVwiaoWjOj`%WpWu_vw ~vjGwr/avo}wi?ExwqS"l6ut'a`5rG߮xFg܀w^F_MגxPuomHyxUwy_y/^hoPu wO_wMm\zy~yGw?xWv`~_aߴG?vWE{ܭVP/zzMyyW\hg޶{˝_zwԏ|O|G5s'w՗}_iooO|/~_y_~=~_}(}Wۧ@wsYpwn| <0P A&,h! Bŋ'jcBCn\X1F*lʊ,P$ɒ.9l9ˌ@oҤihA+Slӄ.H@hp!Q +ذbǒ-k,ڴjײmK/[Ak.޼y)/.l/ÊMQVunW7sf n ]ǨWnᖰ7mۮ馔bպ53‡/OtBQsn9ҧSNyD\m;"')v׳o=| j;*/\7 x U_w zU>5%`j!( 9%H-"1"UVهى9Y#A 9$ݎI*V $QJ _668Yj)VM%aZ][c&qV!&l7s'Oyyjb(n8.y(%cצz)nY"Y)] iVr &kk*iSzUsml,zբgr}j+vޢ.KkڴHZ{/hԪԲ{nC<0 ;,X;1g嬿*3[wl ?|2yE%-e1'Lp3,so\=2A.$i{ױ?7ms !C Yk}FFФG ƾm k"mu&o}wD;6\&]x >xz7"fkl7K`Vzx∗=9 9ߛ{~:PؤSlz\^Ͼ;ՎO {^_κb<6k}jg>髿>>?????k r礼0{ZE S" >L +h&'(px ^Jx*[Zhhs3d)k0A4ɤ# cabbpy_(S"Ȉ(Ʀlk{gL+Ȝç%dWfAv""2lNS*/Tc9,EjB̕V.@lV~c'% Q$d4~񏥌bHT|@]hD$yGP s8cȳHs#/醶3l]ܚ6o6ummV6iM=p{&YFnlB9 xVt > Ψ5e"oI)Ff+mVSƤIS3,>G*fXS)yqIgu>ͫY] vѐt)m Ώtc/Ғ泇l)PCTizid{”lhF(ҧT4=JϒU<۰ үNJ#FUuYHZWs j@.T%izLBÜ#NӦ uiEzǑc-Yg]U2Uih%{͏Z6b5,B d浯"`%&CVEtc5=J~qXQVe*f=zR"-v?{Z2ԝmMV-c ^&k.Anw;\bjT* uZ/873t>̣֍= Lф̘N 3rf;a3Xn:bNno^vtOjrO=$c 9.*f,j-cWRSVe˳Q2}lc'?/ ӌ.,$ss|ۻPv^19KP3C=~6sbE3ю~4#-ISҋfsݜCCZ 4ANo>5FMNӨ~Tj%ֶvg'O־Λ xE]ս5ukb~9֞j_D qQݟr-Jnw[Cx]}-p*[7%8+ m{a%k#eY:xqL[IՑoA>.T8t$6OrlW1͹wsU? 6 {ަf6 4N V;X) :  fҘIQ ངW 6;: ʠ,! &a> _EN* `:Ma^*IVlava:|a O桎@!`B4`6aʝ9!%"!#:"($<iy!b&&`~b(΢q"U8Sb:C&a,"2-C"0!!'bc2n#g@"9p].:47ba6r;nE6 У>C>ڣ#?<9x9 E9b;CE<@N$EVE^$Fd!NA#B6bC>$IEDf$E#J$KndA6x$"_HfPIdZ@`EO$PP%Q97$B6zMNFeY/U^%VZ%G¤RV0^c1SƅTeXdVZ/6eW*_:a(%^^e^_.4`&aaa"%\nCzeB䰉Xz_-%e6N&e~&}$X֤Xr_̀&hn jjjk&ŦlBmmf&oop' qrr.5'='ttRuV']'evww~ڍ'yyrzҵ{^||'է'~&[-g!ԕ+MNz%(ɵ)h:jT^6sQ8 ^: %(BhdmeL8*W٥V(yO>߃nh^]uzhʤhi:_en]!> :BwEITb]b6̕huX%65֊ׅ5X*i"*%udrv.ziJΟ6e*g:2k2hJjtR2bujjiz*n*a9*iv横ݱjdjjqjj:! _C.B7+^@*\;;l+@é*tB*j4>b.pk[A֜FUdJ]*kEW{FGU)ҪK5;A;7$֝U%YXvߕhKUKqM*VjO*\k>`6A>yz -x uN-֐ƫV((֐&蝊 .|EЎӉ8WYb)-2عD]^I^]槩)ګ]lB2xEa}T-RQR&U.V8mkI){n.BnF.lC(n;xJT jJ]jFծB-_nz*Ҭ~E>B:f,~֊Mll[6.Wm>^fF+9.hbj-_Pk7lk)Ưί` 0C*Wpkkrpn#$g"U͞&j ; ' *ϰ0] p0 c 7n#)1;{ʯ/W1 .^ zoZqzp+Vf+>C1 K E.ը3uF'"Nnce"!F""8Q4uˑ$b:ݮ9\)n2׿mwq]& Zv).`u-/{EЦ[qV<Z.an)/Rr+j.w2>}h*s蓦8irܔ-:&s6r^.E(ǼЅ?3B48@.ݲAG+BqF2 /D2^oɺl,cMhs:3 sOO0>p늗 s/k:5Q1 [A+WW; XuY)VVZwu[#l\'\c[k]?k^?p]u5 53bob&c7=6lFdoeצe_dnn6gCg&h6qij'js6lˎ~Z6n[o33r`7^#ws237f G1qtkoogn"M^1`]{7luy zzQw /qh7uo}O{{7 t6kc'GLxwV on~7N燗88}랊5[7x8{8Nj'xpϸGΎg~9)+7y7m?9t9~wa7\_9;Wr{YgyuyB9 Nkۂǹչ 399;C39뚢/ A9/( y4ovzVa[zyzSy;G7븫:wqy:ϺO:K;'/;7?;GO7+\;go;w;;;;;ǻ;q[vォxc߾3xۿx<;{{ï7Gv2s`=/p~ 2-P>n>+k'#> j";l>gS`f~a./Fҿ b>j&aھ+y_k?>"GaL_? !ނ-, ڿ ?@8_Av%RaC|.H@hpAz F4 @ɂ!K#„9fM7qԹgO?:P/xqs$C$e+&FJl*Reʦ)Ov2L%R*V^Av V-o_3-Y :rk\쏣՚\1uY:oѧW޶>9YǷfm:®4jIs! ) b]jp>< ^O.BK6%|(":m%pQGGvR:Gv,ȗ&B l'JC12+ K$G ,)E;/? )C|0DQDsɕԮD%"ۄI%&FAI-SB]2mH!f:q;aUԳf̎" Va-cTQQmgMnUkMRIYXl Zmܕ^]Yo]]igq]߁^|㑯@,r硏^驯^_/O_o/ H_@4@. t!A N1A n _"%4 QB-t aCΐ5 qC=D!?|@D%.MtE)NUE-n]F1e4јF51 ;PKGFPK4HwEOEBPS/img/adf_table.pngPNG  IHDR TsRGBgAMA a cHRMz&u0`:pQ<iIDATx^͊;4 ;0q8YeipJh/6Uh3wތ2Y27e(S:Jҧ[*So*an-?rCǮh^F` 쿇"~k?/sƏm`F}@D$FԞN`Fk8Xp$;$~vm G=X4|o_ov_!yhx~hk,Mv[2Rm_=2Gbѧ;|BgnS9Ѷ6ڪgj7RH!cgjÉ%Āϖw^B?|qWdtW(f+܇x0jc NR4Ȥ%9>xsTg; +s{;Yi 4QȢkk0M|\\ֵ} I;\'!+<~jeLc>oVkr{QQ.91Gd\Ƙǟ~0?k찢. ehJ49RP3E7?Q)wqG<׵ yHиfm#rlzlF7s>?ccVYc'Yiwlw0=D֊YU{T铵o53 FVZ}tGGbd~@gAl5%w)mp>_Xղͤ` ٓ7 d̢0vb4GDqD4JT$ofhsFu)l9dsF ꧭb fzI,msˉ &#;iѠgjpY-Z e(D4gJXp&1 Y\v߉hqĚ*}Vmָ&fT:[[[X6#nyM詽)Ѡ(/ U9qC2v0W_>9k ٷh|DoP+/o97I%;Yw0ڞ\>` syz,Fss0ڞ\hBaCV.\]D964\!v`c8k`t9 6d@MQ6< 64~f`i OepH4l)7[F]Bxz!~z4<% WὸK=>&+:tF^{MF}DpnGQ3i`u8l̦7%yNԤ&zx8Mcz8\ѧC2*S 1ubc;Qh!:ăzQgkNv\ "YWBڎ^F29*ޢU܌}<Άmq )W4oي]8"ɒkKxǑʼf&!֯tL?>o/p7pg.U!^4>ٱQr]qpWe&6ym2 ^E!pfbe-V~yHft9ځAo $"S去~g[ {}sm>B ddBH)$ϵ &\Աq$'n @+9?ffv+0=r"*^na\b昲%FLb-|ءK@48Eی7IBt']ũ -ܹϙ!PiYU4QlKFHG/%J]^0oꥀȀ6s"/ ;4X6K15JPʱCQhHMly| `D? Ɋqx]ɀt:Fj}/1J؝ʉ4劆E c@.6 ~3myXu}K̼}Ѡ84,2W40W.,@aHGYHUJ{ !"B7}J`kҩBNɲZu=qT[bDxq`,FsϷ|2b;&j1OiȞ |xFH 3{ (*";s2ʮ4COÕԛ U9Fp#d8ӗntA`ς<,U3VYzיuts1 E؈gV#]ζK:7AE&?B>ߌ(Tfm9lt@ʭ-F$Di~Cy .9OEz N#QhhjZ2uK+K[<فQQ<; e1Zڂ纓 F-Ay\H;i vY =~E4j.rIet<@eD.D\y `Pc0ZkkZ&DC_.^k F>e0ʵvvm9QR4w]eYOn |T7 ׭'s~8I0bERԧhe`4g?,R4 |>04l/ޒ=vCt`F{(Ȋv6(u g}>ƥ?`ԇ 0oF q~Z٥R?ۼE0*XkA4tdU twM84\!v`c8k`t :E u4veS`TiQGcW6FxY-#@B@#0g8\F3p{?<p/C|tn% nx]x/mp;x滧ä{X'HGߨ(j? Gy_$4)T/wӄ;6nj>QA.OZ،/;ߵҢ:f |G!ER۳įd$d"sU&E5625x~hhhЌ2_J~JL$c+hފ327)]w\ˈ b5:;JF4kbDQ3QܓJC!s{ԩq!+ /E>h؁LjgöxrПq&s1 A3#[G$Yrqm)ֲoP8\:L%V53 χ'Z&f_ϛA<k \zyh_Un0E+퓝{%E hwUfbh lYO8=bG(Yi9pfbe-v Tsns9-hOݗ;)l5͵) )u|E"0kn&Is82 .Mtdu87 Yl33 ;hW9 /sy{ѠҽpG)F/j)[rkT,bWq NQ6t)i<]U85P^E;w9S4!m= 2}qRV(Hko2.[ª5/GA Z7R@ud@c9yFQDHf 0&&\J?[9vs2Z6EQp̿N4$+Ὢw &WUٷ C3 -sE|"= tęeTYd""t~lAKqh40V Q:Us,M[+'Vmfm,o7eJvLc2.o>=by8* ZQPEd0EQ6961{Q'O:_.KQޞ(ZKlkhfX2)`1(HR#ZH5w|ha5" ]eБ-+Ju :)04\jA4* Q? %2 [wKSȯZm5c/5^ڟu,o.^\OZyD,oPҟVdDrb/ķJ.[r'h"xIN!5qXCY(-새ΛV_s6o-ǟOt~1y/1JN'd/]jCP h~}Qr]y4,gcym2JV8Y$Jd`JW.yhsēG\5=u_2EF󽾹6E[!?#a Mf`$$G\TU:DItZTp~CL4LH۹hP^OZǣ#/oh)[ryƈXŘ;'Z(!rmF銛9KAt']ũ -ܹϙ!PHPAh8+9FHG_{˗uVɎ~8 rT^f+ hLac+ӜmIݡEĈdk•c>G+ oS$'q#hHV<{U?xNTY"= h+aw*F+'d](_Ԓn+ڹaA-1EjЌDg\0_9vWޚ= tęeTYdA Zr3 b& S1 XGjNɲZu㨶ʉ!((}%"3Yjd >mR5;f:m'gC,/'^H%<<+ǎa,>ӽ&p.f7xmxW,9!ൽnP4{T{d`b7ptFfcݘl FjeFm44Hl }ǑZtK:7AA븑 !oF>ۄsF^hc8Db3e8gHTO8a)vs2N`tw҃\Ycd25MF ˊ#ULT>yEO,FFH.YLeT'Z^E >j!)Cvy"uWWc'ç+trc%ϑZFaԧERj0*XK[R?_~a|>|76|`  |> p,GS3|>p>,?x[T?IENDB`PKgPK4HwE"OEBPS/img/intro_viewcontroller.png`PNG  IHDRsRGBgAMA a cHRMz&u0`:pQ<_IDATx^ Źۏ{/n{lc0`α/p16$w$4B b $!Ħ-$!5GFhF }/ʪo"RWo̮q )@ :@P" P2XD:pDP>PhX04=p O=P" -b΃9 `gהPQf.,mz=oYkS" J^h3\JBE1@ģkKҙdr`$DKFl laűڞ{S;nyz \i3Ot?EO>pgWT;acJk tνK`褺"ʎ`,!#XA`.~~BxZbKix"Gx reǾhJliҺYPo+:Xfl7AUX"s"KiJSQ9,CBbmpk(Gڴi8osr ͉࢞a 9IʝY.BHe@znIT%[g]uk{K`),fk,ȔLXڊKǎEA` ~8n'rbUXj'kZOKE\fh:*?q'b9PE_-L@g'3i*BF8Xy}ooAJ"Z@ώ\;Ւ GGι~K|pb vbfO[^n瞏Icn;l #:ג]#~ (PO`IX~>{IOϿ^k+~`QC,4)';kϰßtηLv.,?[wX^qn|gݿb&q9uxnE=:׺nfy9>F:XP/u0x~'S ;lmELl@LpzCy9Wك~~OmTyE+]Y7yڂu^oArTZ; :87 EV;zx~huZ^Xϰ:Vǀ"߱8ip7[-T9~R sI-o ʬ-V`:]9<0^'lP(T= t^/|ݗXtՎn߷c`ysv8ݬzzez(-7͒&?c )>?VK+̓r m{h{%kw쇅vl:^*vApHr8%17@r N~ʠV %:)Q ϰA; ';`yCL/y Z%{ώH`ayCʗ%~&k)lOςZ7^߹uV(:p+?_sګ\~~HBɯЈ/0 HT Ͽ=z֌oNo>'\{G{hVDV$[tN44qE|&= ~k%1t]>?`dMX0y?֋<粏^9Z}q_7,GkJlȂ7򕯶^iMIvF]XJ~XtXU#>QJ^=岂~V;kx}J=f pͿ#`{MAX?,,FB삎XxIb k)<7h<5E)o]C$.X.`I,Jٕt- Y.zXA"p[۲c18o.^";H%0BaP]HZ`?ک@A᷾ 9`]_aI=^{#= !8h ]=`YK`ciP>Ð5+JeeLX`Y#4Q" J綝M5/&J}@>,#/ȥLTJ 82&ҀY;q*J}v;Pyp`0a#HvW@OK:>b\r2zY`Zxf\i@}>GTHTP=ۨ9P>伇WãKRN7sPc,Ȕ˘S;>C}4> ߄EN9<ҕiTcUF,~@:6A@XJ1Ve ’sZx|q9[ w11 [6X`^Gtb~=ʦ=h[%4sXܓ:N=j=enf!z z3l){u *l,>$3DEǻ S+yhTU+%l\c5~`AdX>d'@"^ceO|ceȑ9 _w`5B, Tn1S!Q?fv_6y/12h=\a5Y.Ս˂w|wLwVnrgz˞Qߨzq^\qQ/XX(!K΁kq6ٖBuT_9Vv)nrGأUU= Q7m!,bi0_f{Ѝq q"B+z@6SOGcA Nix ~`y*^Q 0PE,j\QXg5k,u|ʦ`80ᐰ/N(;`A<%P _c⍌ )񏴤y"0`s+¾RndPYϠRϾ '뭇q~ad*6`M5pJr"/=Ҟ4}?\zq{FC]},k鉑l'!he%;! 0=bsS "VS(Cr/l:ֺޔSuu,XU,AdX>^0c{ $DyC]tG:gwg=_H&Qmx#6üX5fZ"TcUGXo::Z Ή7ﮦiS,/8|q#,&

%{J/zH`9X&n=S祉̄k>oC40t]/[aJO=,5 ,iC |+O4>`^0a"#0 v9`tqi#0d>J}Y!#,w H,.i@}@>`AdX6=H>P" PHrr DGu*i}E9P" *O%!j-9!} vC?§KvG7yZ/ok64[%X,ifpy~29RAzf [gA&;2} xyIAYe"K)MAN/ =~jD~R?W#10zzhw,#FG6u_S~oFn>k_l^=FXti38g <> VhG ׷ M0*Ny|2y:׿Lqʇ`]fX,evë#ϖ5{aa8t+Xv 2 <&<89p ^|[gToBpY617Bg n?rfƎ;y9K>w}]#6~c>4zy.xy5y߲?,,]A,R᲎kMa֬Cxu{ˆ`_.`7yZh*("XW19`i{T~˨а̡p`{^3my_;v s~{b=rݿW?}}G]Q_[ >j!uY+x݁ 3c,8~0hH>u4m+g„-PpajeF4X;˧>ZS\&OS6äIMpUΰ0sH阹3ȴ? wa/[ȵCr|cs~aK pb|tlXs:l6cse߰^g}f1trߟmqu>{[NP}C^W=/X?2pQe>?ipỳ.Ki0cD6솿m Zk[ c&N-;v&|rr]nk>aZ8`WB?j&fPz vܪ9Ὥo}_3<%Z/ P\\ieՙ> AfOϼķf_`O{e7F_mAiπGm؂sαg_lV}7 'L|NY7e_ӡVWu=_&΄ =n?mw';A='%n]e!L { `@~OY \u܀粯űo{sۂ pn^}UlY-ӿch7˲|Nhպ:.:A@yǓ\XEwXV8cf_4{p/z{L'dVdk;dE,auWN~o#_>Kc YL\LH3/{n :$2X+ejٚ e Es^l֩_ϯGq{&),m} -f-/e8XZ_$K>w& XS9`|(uG_]Z4"R`t#Xˆ{W~= z ]| 4Xnηp KWNx|4!oyٿZ`R򻏥7Z~˸@4(Fwǝ ore¤pʍw?ꀥ˫#ǧ̅'ٱϼ9?ޡ I獱yw^?Thu7<W_֥cyO (Rv)_%ҠX}`бPhSqS`а< !|66;Qp.|LPS<lii@}@>&)@ (evf!HR dJTJO B RЮET )@ ,#fk{O+mwe[N=yv#H2P$`iv?7]YH:ݹf D?)`%U=vAsvq*G anotnW<̨j+}N ,xĉ{ ?siV}fʳgo zg0O|HXyb>gmN.Xpl5Y^(JG5>'*H 2%,|c^,_1|28v}h:8֮4xӠۃ/KUUUP- RAݜ 7| ~k%4T|?vG2~d x X8 X0wʥP7'˳77σ{g@{Ojf ɂJZڈ1dmؿ'{voBE" ;گu1`>7JCs[~Y2+fjH. $ߢ/E,7:űmkavڊ,Eaɼ)-U=`ٲі0{#жE!T]S$X)(QS X/S?ia0kH`=E_2|TЩwv2TN7|ռ k;ޡkz\ЀZ:ӹlgQX*opP+P0Xt"Evk3|4=",N9IRH  Q^VT]ܷ~~BiEtT|gVwmbIJT 1X⊆S)9))@ 'biYHRT 8`Y5},( G 2%,q"FOG_TSH 8iPFPҧjJ?@%N =XEdHQ^T 1XȨ2Ιl]͍Fq8  74z:2d5ðfqR@=L?} +707)^tI2w/, j(,>>Gt=_a-L;aAv \I'6$>: ͞Ji`ET"^O35p NJ7zqxӣ\_ZV^v. O3 `c4ǪW}B~p41* ,KD# ͞Ji"'_:5hHJL>L 3rΠ b<&(̷|,auCL% , 1L!x/#4 '[Kf)8{ u"E-?r{sзB: lo= u*BFOXoPiZ7}J˃Z.zHmEEX쩓 :migk[iG)?j{ ,Āb* 4zb*;%it=X,:$WI%X *M%cDS `!?c7$$ =Xt@e^,nuekW^?A/p:{t齋]]* |@ S2%Uz_/sW_-σt?s"))@ $P8ĉXccއ#Gރ淡@XrOgfO\çBO/ƿ@Y鱬DCҨ@ㆻϟ ^ y_ s\ usCkكg,ػwtX=gTWegĽAZ$uT[UuQ[AU%K%x| ӟ/c"8zt!ʶBcc/ذX:i`ŊnSuU I#s*\ٌ:[Sp()O#8?[5A,"{v۷ͽ`agau}O*KvUk?q`" }͏eoGL怇gP5n綏W{'4JfK.^'.<y+`XGq:`PًPo[{s44< (+Wti ŝ[~@ɺ!>PXgGe:T*4H2>S #&%|ablRBPrx*Rp =?!dPpdCwXJ}TYLɘ*q̣-[G Ɓ%NB R8%Ն (`XtG,ˋ#2!*MRiK Q;U[W4[k3i&R@ƁEK4"֏>F=gԩƳE,*~| LqϓAZivDWs`S"_7ay^s#F]1/1 y,`b Ջ%Bu~QOʉZ2>LɘZ\<{N}*a.V +Gv%w~GgeԌ1S_ٺʉZ2>8DAc~8 w&o ; Q˗ѓWψ.;?Ce'܍N݇cwR, [5Qٳ(Λ79>>{L5yxeO^{A\@~;8Qhc9#1(tW;.s/ƘgE3,I!,ǎCM{a{X`OJ>A +XƠd#og%1pggWd;Y@]&8{ N!0ǔ*_4`x/Ǫ96rZyY%ȿM|Ӧs"8D("QX6N}T/`y*<< pÙ`Q;isA`*K?ݶ0}?IVn 5| TG| #+Ba`XzWC z~%*KʈE6B^V M%DȎp ~#]aK7/ǠR֝ЭՏ 39J~&JP'{|aS!gJt|Kga|y"fT3{Jy"~;|4IJ4ޘ\Ɓ%$5:+fy…\>Ce;3Y+Og﬊x+1>)a{⭺*K1Rj$EMCL1:ZI~mRיltqh6|:`cQ¯?Zo\^oJ֧υ]C}ݜ(dJsz^s%R0,IR/0E(2L*`X mO )eCey&ΈżG5"TLɘ3eZ@!  %*U,̘ z!+C2QƔ S* =7 ԉBS1uƭw|I;m k"\\c2zbJ@[RMr2אPѓ=9QyWl5Rsg #cOΏ`AdLKԈ"H2z X 2ÌT{qXL1"ml1,I[`!< ~0)g@[AJ~߶1#džt945w2S2zW;I>Jc pz!Eۀ6 T= _ 3zRS!_3g Yg&8X)X>>0zR hP%? ̸J8Vu փ^im#Psq`I(ܡ ,EwRތ[[^g$Zё1,:" . q`Vm: LV80tgŤ(e&#lLA @ S2Ew<2z(g)`XLdTFOu q`IaAnk1X5]1/sujr'}dt%Kի3`iHK>0\\u2zbJX4̀K˜yKFO~p'ΰ*'a]wդt(J+?q_u U/Ftg`6 Ɓ%8dTFO\My8g? C'(*l*/ݝI;d7,Q*A׋(ԏFONb5cFm # w8 T(7lCBI[`!'FONuŔ- ~6@Q"B#X)S#b!'x=e- *~fK9kOQ:D2LJԖnS fmB0S>Z 0zRc@.Z3tY)ɂq%(EP"]dU %YuΌ͒Ǫ =xU׉mi˜p*M5<2zt+`X-7 /*[P+Id 8`Sd͡ܤ)`dJ0tgE:+`XLL2T/0,#S=-BIyefJXt GFO_R(ǔtx,Ȕ)`Ia˟sq)Rú57,I%!'?Sdg$u}\6ʈ@fFaDCm9T8$-}.OFO%i-q`:"'?eɳ'? :*iru5jË+}Qf(Y[l(DƁ%d'1}7*+&c?̝m6}_su4MCEQ:"G9z԰y28Owm{_ '> w- V|8lXރ g¸qr/IN|jbb$;6Kʱ煢@v("*iNJe|e~b)`XbBʄ '1̰UF@dD Ŏx|˴tBFOvg'QB4I/la60|` zkDK.O[B={z2ʱ˃ S`(Oodo^J%! EP4zrjYXɸ;o>z_tCZq{LhLU8$m.('a)6j"y(/[X}@TdO Q8X2zr.e1;0OtȅEvo-Ia&ӌ%CGkϤ))N)wXv'S 2%c XtD,F=9S!ɒISTƞ>1 ^e[,Y()UA麏bTH,4)DE:\,3c*4bQ5Q^"B.2X`aL?&XS`0[$|M?)q`a]u"Rȯq`_e: LWDCB# ~A~ X)Sb(TRHq`a*u4]Y 7 Ţ{\L2TOusC r^kɂĪQ<}ܵr|ސGȟfLA`La$( |vWIk/y`HzPT˄%{MH躏C=Aʸ2GhLɘul1'C4bQ5Y=a"0,yѤ@0,:# VKEQ8T()@ ƁEw%s_{cgOnыC'#UboeNꫥpt? U:F+e|Jc̡rp{ltp ]xi~O?r*OO=|*t{TbKF_l)R X)S:npy0wʥP7' gMMpl{΀k֬6Al ;OήeVWߝ}Dh}?MY`՗"lNBI{de7,qDK/ϱ7;/X]ȡm 6lx֮}ի+AǻO38>**~˽~}0"/`]"ԣ2:Ɓ%f;l:Z\Sij"gkk}[h 6n|֭}V tih`)PD dѸ)€ :ayX'QՒpI/ (K^!FOz T"Tv* A=yZ xqgx!X )< NFP!_7ǙM*jdJ$m,%ӫ]O=vPB+òeOTǠ`pI=A`!ٞG2|Y^^ _ (k aLS Tv@~NBl(k=I/ ($N8ݿvheW`Vh),c`hvn;xPEAkXw:fuZ8[VVԸ&Tn\c1, :cyeʦ/U=+UTjkٳmxA(CK5`/COvGmN'8wv2d[}8{2Oh{Wϻ,:.Q S;hfBSΝ4A X>^lTȄSTLɘTL"*LBK@jn*0,qT&c8QRx 8 3Pɤ@KFeDs )O(9XtЦݘI],?l]Rzw+fPZ!+4i+E,|S|j̤0g>{Pݽ:|1Sű8.mZMS HjX-*'\j?rIG #<;v5"E1U ,zʲM~1HRD&OEVc8l 1'rw4Hb(?? R F(c&0H1-W&fUUo sh)N# o>p@)*N |*4vQinW{voBE")je#ɢ7rB 7r/,l`s+L4(H X)%lT|.^V M%,: .:O5NYk `g*\:S /\>MQQzXVN42*0,MکOGO4}05yd$h5f9Y xNPmŤ1P_cĤ?]b_qÀ[E},d̤[Py@2$2š2NsȘ)j(XvK!cu*(TԀІ)P<,ӖJ&*V,.,P^Aj8)`dJ&`Q.de`O*KAQqT<@'b18z+)P ,:n+qTv2)PK%(^B/ O lgJj%0l'[4yWT&c>{!?)6{B*@*"G+qwNˆMr/9qʢP)%ݥ=U 8` T((OĂntvŤ3=Gg4eH-HLdJ&M`in>MM`|JPR㨈`@!|jDWow"LjjY5$`,%5*,zyB? ew!bg_x=#$R ㌞d;0 lX8Љn3z ia/̥-7 )CTD'n0}J`!@>Dž@QT(,qH%XL4z"p2r^:nY؎p9m rJ޶1TTH:;+չ|@ S2iqFOoZiVxi]h0(u_6=PbXo U\tTiy):踏Em׈jQ u`ѡV'KBeK=YO@bTRBH=XF,r@QH=XJ  8``TZSƉXF )L 2%VđFyHWԃ%NRt' `HXt Wt'?lR>*yXFd%_sE7z"T("X)4('֩==|p ȵQYPV{}rsF+Jgn(J+e6,LD#iw2FtC @*bѓmyX ?c'rLQT'R)Jet3CF,5$/qG g8QKݘ0PT4&L^[JH("Z٪8J\T('g c-+7F,ʡNL @>FO^x)PL BBhFOżzT6)`dJ&`;=UKN[)WԃE\T)@ DQ `%J7cH ,q"8QRU ` R KynR~y~ATf =:n+ѓ @WT)S 2%u,S̋"]JR9H%X /'BJ1y< FE|<|\4!*GTl<0ϸm\ՂQ1E6@ Y,CSƂS0z3sʙ (6 V/<\ܙxR@(`Adr1zr̛acEG. R `) 'iMd[Nb{m"oK':@*b_Oe0]1cKi'10۳ +-E:~O YԁE},%3z ,((0u+:dFO0@ԃ% q~ׁ TUː鸥lUHdJ&`SSHW `iqE鄤)74SĢt2zA $S `#=QK51zHx6PԁE rڍ9;'U|HXE(>K詘;JQ)>L57P,gmK5%,P-79wfLS71{Gǿ%~ T%3@ S2iQFO9 afL6dHbcemΞ%IT 7@)CT,'e5g BZ|v6syvP-Ⱥ2(,9 ,="':&"X,8ɾ2OyOѐ7."XOQFO"bpj%b 0{QNYTe$H%c@ S2iYFOV]efLA` 2Z9yl(wBR=+p@P(:踏dFOaה2㩔Q u`QUrߊdFOt+ef:c%=RʩD8XS2HO%mP{HV `iiA|)L@Ws2z#̧BSƢ#bA @ SR dPnR@gt=oz?v[PR ,q/E믿'cG'w1hݪ;7.()*\LM-XXxe/K;v!jXPc*˜ҰW( "?;򼩱P0X E%rHԃ%=l=o髯a;GN@ӡ/ac{ؾ`Æ _ jR"-jÓ1Swϯ۞[ on5k?B7%|eNF,Q@0[mEڽGa׮#*oOvEςwåVm86p~!D MbOH5sl /kg6&1WLɤ,qïOx;֭xPfApEOEt.f{;NMD1x^fN+W Av;ciΗzo={z 6n8oZ#JWüy ;D nl9Irm+؄)IMk%gtvN3"-`' _ڛ/Ў殧 SVK삅v`F ,0 kz[cO,q{Yz`1_7]c馗a۶+,N?H`q|f~hy+_)oKS!̩s_!w;ᓫ&cZV,)cqks i`v3g6ԩ`>:9I~4aRC ;g*$9LD>\KMK܈n~xsT0vO2 0qbC0XL;a9Mz/`_Zevb\Oasfo7oT>E*7{¯=3R">ˀNF,\ӉL+O? Vp_-;T|'I+X( MIGyI(zčXr@)H=XJFOq|yP܈hxH=XJCFOq|E,}@S92yrnս 8[ӝڌ} `{b*Lɤ,qX=r XoK\=aL'88w'yV1 J3TnXR6%>X}t^㧀|O ̫e+fSgF< O2j=J-D*͔j$jz?uJ:J>UF >s{_ 1?:P<"?d(UA S2iKhFO"Q@"GJ^9 ,$/ڠ؈'-!d(Uh,SBѓ: |@R"㷫B˙ Rϙ*" ɗz]cf>q rMl=I, we8޺d(U>(.Xl&9I1z*ARt+\,)'֔q#J0zj>KR-9I=XJMFOq|W"PO?) 協N"@+ 2%V]c!t(zĽTdW9G XS!X|z= +er:n+6'!{ (_+˜>Jj3z J˩ЧϙzĽڌhŽH=X~+)$I QS> s: T2q,Τ,q/n'_@W#t)Xl)$TX)noK_ԃ%6HS`Rlc)d>hnVS[\/,:@o1`,2q<<˷8 2%VčXJf$˩OS9]kWŖ4z#= yl#ĪCS =U(jWgRyK)z`aL?WЧ@W*2z#,?X|z= +嵔NJCFOq| S2iKo艆)_ԃ%4eiܸP>R\|J ɺS%8XS2On{I7w(s?qg( *0ʺލ I" H*Zԃ%KY=ɖ 'JMcA$m4π*JEAS+,>rs88O{;qKlp.zxY0o6U_ųKYѓb@KF SXT#^Y=,ފ>r@N쩔3%*+QRULXݢ,pƲ X.LY= nS-KX֭ojpS^}Zp6ĉ >Rh_JbDKMI,}'Ͳ=y{.iP@ S2~d?Q&R+@` dD%n Bn駮B ZX,ZBHR^c!PW H B"!=IENDB`PKM! ``PK4HwEOEBPS/img/form_supplier.png"PNG  IHDRtqrsRGBgAMA a cHRMz&u0`:pQ< pHYsodtIME :v3IDATx^UG?M1jH}kmIMc i6F+Zo4-<,eyaaYX KAذ. {Rסt~|Ϲ3̈́{of~9~39:8?(@ )4s`k!A(Q`wi 7nzP @.9mP tyP0NG@ =Z1@ =Z@(_ D!P Pʉ"kk@(2W *#]j7U Ͼͬv *A^>;Z{jp5pӦMqAdxzi^e%P ց^` '7| u0Pq#zqI2s}4{=A uӃK71,BTgASpN )-Z; !jQM=A6BdHӭy/Xϸy H*\4NɢR;LFhc7_DL֬Ot)RC9H;e 3}Ǥ>Íh0{y\gWZş>? !63FvM/P8E큨r8`"mriaҬ@PV/{dlյ|Ym.&~= tV-Z4=1o F@A=r/Y5o_ȅU_ jCJ%``Yj h:;~tLՌ8f2fg%-<'/?ƒ_#gV|<N 5\>.Gl'̂hjƧ q4 8>3007.C_zsgW~GmKf5 Ѹ^ ΪXq8!DkLcQY0F?]>B}s}CÃ>t.A(P0G@ܽn`q:k|.Tc c=G ! ܵB']++h)h'f @(pfޖ@ ̶p(t(2V1`ƝC dqP {@+fh:^0!@ q+榦/E$(j]WfBW>G@fn.-/-@ԦK>aM,.kp @]S/)# @+@r1ZJ), ˳r0Yu POs%$AQ1*O|˱EC*R]#{QNri!5 E(g NB9$RV-WZiu *P1 'xh<ƀZPi^WCS;"cC,XbEd&A*I@EvXX]0=SYGi%rqr8PO:͸y^#;8'u45FЃ0gA@ #w,wYZh#k1<U̹c.5S:aiC!cfP ԕhvP%qHjwo Eyj`ksU#X@ h\Ԉ&qbF=2^Kz6b }@4N$vw;3>а͠ P`(d,.iSm#e8 g@ NAҸRTlD44ߟ lA>U wlԡ¡@ `otQNVՙxvۢa(Hx]qh!V@(@( @f#Z@ `j@3D`q]F+u/,q2rX7Z0{2pӟe?rX7Z0{UI^ɟu9@X.E*6e7*q̶`1`fm&u%|B9vr ^ Fg7kDXʈPX8ЉreB86e71y*ZA{XL4@^ڦ4&|+V1jjt7Te$"ˆ@DH4:[ (ƶȧ9%%th|Ϫk*4tP@=QcOG!CW^4c 6ekmMrи~(C@h3se6~yik<n*8T5l+x# yJ:Htxi۽_x-aY e֗t6A$4ohsKq|А#Vz|?[ NyWR9RA.FfO!7JIjQ!8kËG8gzeu[ݎY1ߩ#^ trTHu٨*ohM+o8Y6PYj]~mm0 `hdtp2A9D[wzhsXcY=&_}^jR ^E}F#`}c_#2/0 U%6a]6ODni 8X |jx'ca4l+n!GEFoQKPł]¢ً'`#e"˪Af_itPUก5*uS/9Yqwr@+.ngd fh* *h9 *h9 `jy/Yqy.QFɼ:{\T.MH(wL3Ƒv.v ^^ܼoa3ӷS/u63Pd.l7uǧ:(tl{tr7گ.mัu qs洢 ՟,c2,&η[& h=;I׏tH!XЌ~C)7NɽCMEdzw/"/ ZמKDodMiDctY&"k&\Yd# InK.$ ѢUA}A iND" }vs=6;oC-Q}O2FK3mVרY;kX{S$mS-27F5,0n:kL3t߃?J;($L l6źi]EMu@7#|.2Qjl+ցW5{ UHp5>{m4W>uq4{t;k2:DXΛBA6k):*\YԀZxb<,*Ug$ 6զ >{#J-YvD-zdtyIBpL.m^kY^hK:09 zKAM<ǻxuAC<6 Zq0XxbOtۗ I'$ֱN|aҦa< (LS2E]6#*}BUB<>G6"b_ȝmުZZN}My2+NH!,K+Dw<#M~}[(QH|ioi|ḥ*6؞ل<݇sF>AISrQk~[G['O6/+{;,gI**2 iv `6yַfퟣD_iO$RG;u~ryfhk]b T57L\Yqݍwr@+.ngd fh* *h9 *G Ma'&}U6A=w P:8td9sBӞk/yv[ = yuc5C|#g{rv w_UMh9N8Do 9֪rmx=n f(B2=G^h9Nh=Par *q~ yuc5C|&L;xK.I*]| ZS o%l!!wE%9-yuc5C|&y[" S2TYqTz(I͆| ZS ow$ nCW$G^=^'C x-^ϫ @4_?=nL]tGqn ڪr לTg-jo4>x=w P: D\ 3HvJ8 1ŝtڥVj*MCAĿ"~6Sݰ9]ry ^h9NhnKPHG┗#d-$yuc5C|&&/GȠBU{=w P: \2=G^ϫ @40y9Byc-)Ms&/GȠBU{=n f(q<6WI~Wzh%| ZS O_vN|xf㱹Ϭ998zU 1@ |{ zw8QT59 = yc-)GDP @%B(P ª1IENDB`PK*PK4HwEOEBPS/img/list_selectradio.gif[GIF87at.Ϳϴ龾ʒ|33333|۝Y33Y۝Y3Y۝Y33||Y||叐|33Y||33Y띞眜Y33|3YếY||嵶̽⤤̿ĥ︽ò𽽽AAAqppqD^rE_swY3||!AZ.A&;HHH"B[ -E Q| y wO| -E$C\{!:NNsIs۝`u+<+.+% | %7pj~CZmE|znmmۓ8Ul. =[)F\|3YYJIIYog>j$=P[poAZ;Xo7Tj?XqØܳى,t.H*\ȰÇ#JHŋ3j4" 1r(& ;n\a i2f8Mزσ9ÎQ5QPĤ?!A"*7&s&8q JNZm8ځzLHM6nݺy@}˰-aLM4jժY τ<?=a2e+fdɔ-cI2TR(I7 nl "h8\yϨ ][mOa8ū_jL aK>^Çǥȇ:l`r^OZd]w߅7^y8hY)YՖg H = a(`Tqq%Vֈ-12",R- 0+F"ZHUE2'$pH)-!qAJ* +PD#+i&#^qmiXgVi2p҉'J(BCh2aMi膄a m 4`A%\ɦX 0Cl% IXݧRp7pOp4#@$Lp gua ItҶ[Xpd5]`Ap&D*=A4@@+B)-H#1" 4G,Wl1E'"D`W L4لN!KPuTRK 1VZq5aUEsp2'\|iхEuXr=taEA+ fHlCDP[pх_ 4qDIXPJroVm^̷߀ NGr0!L߁;TTa+ \qH@*:_0jf,eJ,DN *O)@pnX?! 1'E,`D@A G*@mM5p9ȁvP*x=@&%x  w,hAeRtkRA]A ̅.ukA-Tq7!KfD—/Al h,PH*Z1e@@ W\K0h, ";PKr`[PK4HwEOEBPS/img/query_simple.png]PNG  IHDR~ pHYsttfxIDATxLw'7lB6<;SD<=hcOKr;diiS;+S_9bE+-p#N&%eW;(}nlΘB6iHpM4oHh'`c<_y|Uy|C7T%w^qQQa?+!"" Ņ(/wDDDr`ɊKDD$+F/DDDbɊKDD$+F/DDDbɊKDD$+F/DDD*}{Zzd%""HV^"""Y1zd%""HV^"""Y1zd%""U7cc/ݹs''zV#FDD}K6O 7o~yBܹs ֭۰ $ˆ(K^dmߠs&]$2ӉePQ۹s']fh ֔O''/^).Ob #"zw+fd"'\;vzKI?Q:=ߢϿS9=k:ݏܹs]v}!7nݲɝ;ws<رX@۳UJ흙V0""^;G=u\;L 9#CM9cA6"k_~uE؉_/ߑ~v^^tvӵ& @o|Э`۳F\BaCkiYNPPPwrFDD"`|ak<!`?P݃y`SBctKj@@j.OuUts?;/F C'7mͩcoꫫ:qԷ57V=/O.l{ͪ?ePؚ5׭PTTXR\ p-n޺4qYˆhY^3j'cs^;lHП<_ Db" cy_W***ݛwow_59-$.k7X8zfffffFWypTs50~IɅ]v}5j՚Ғ5%kԪR|떙e*,4<v޵;: }7v]u^Oe'нT[9xqxxb7\XQEfU-0 'rIVu,vOv[q uO44n>77+/z9 ./E~{n%Y^N5Qdyd#`aI9o*m-sw]{'.O.ܙ ޽sLQQQQQQaaN\!N /TK=A[XIqqT]RVZVT%*UZžmx@<8,1y!;-Bwt9UtdذaÍ7um|7 nνΟl1JRU7o\n݂^r]DO4rwcu4PXԪ-))).. =z#0n׶7KDE}F]咢sC= F>S@rI`XVwerRRUv((]?\u_}y孾ߔ\CњM,*,,*,|NBN o;^?B6opP(**AZ-Ga//M?~ӼDDQ:z~( ͝z٦ >Sy)m vgC_TZ9~٪ly!A]` GxcÉ_}K '*}/ܹqP(,,RY {q\XKDEENvucs~ ǟtڲEԶal|NCo^}QTPPl٢K>70Z {ɟ\ݵ+[SVRR jlU6P}m^`(kyg}^Sq[ՏWl(zܸq^xŦŚNO44n;~#/^K1>T_X-o Kl(6nSq&\hc67^.=|:zOwXEŖ-[B+;\Ļz |2`}/._[h1~ {6bDDF/}(0zd%""HV^"""Y1zd%""U^Ù2AKE=}MJWAD`R۟T"G2PV+]-dvV ( ^ڲ2KܸyOhq^ʀZRZ]<;ϟW Zח[7oR "ZDDDbɊKDD$+F/̊uwJ@2+KDD$+6d%""HV^"""Y1zd_@%Q{zyvK0nRy^@Zt Dfg`0z)kʔ.ԍ.a0z)jJ(o1zUt4v7蔮D^([oRdmn[@)a@S|{>-ԥy 葷rIfq}LpQ05JLŻ^"+5,BQ-z}JWmM;qߣtDDyv.x:a |+5wJájzV 6 @2N'S&F @уG^k7>&\KLU@hɳ Q;6&1ݠ6C"iUt,:~܀pI1qsTvc 3LPb.;Rs}Z w^cǴ"|`lUc''kYm"*΀0tKZe}` Ho=AaO8}`:ZwX15w؀snr`jҗ\~Q6dOw~GÉʣ +7H F' MsMRU/>""Z*hQqNBtu5Z8_Y,:ƚl MUg>ԭ'RI0ΈFCC"75”իwhՒqJ `1# K>ed1#ٙ O}q1~h1 yZEHcGNJP\aZ&uIfoqEjJF4U`S`k>O4_9(?m4\Y % 5vB}r1JV񮗈(kyJ qT ^ҕ87NLHVUq`<Ԙ݋}p&m=3 @R7=^A0w(`HG:ңM[^U=xĮ7/ N bwlL"; ]K)}ZCȢ >ns-%%LH[]+&ԦXF+芹WF/l xN{p׺hWg+[csD}\ԥ'~@XEo+u C͢U-p-U>0gRBH+[Jqwt9woW=.&"M.@W]LMF; N]]Kp)S:AQpSMQv,fC w!=X ,OY |v&>w{?%;qOic>wl?kB-Ggf{ -"#"s4MalSTO@}J8[̭͝À<5πMI5V"gT=^?Mczl-+O̫Smj1|ScW8ɪikGÇg_JWA__lݼI*(_LDD$+F/DDDbɊˬ(]W}t D9eV$F/p&""HV^"""Y1zd%""}óJ@+uOoE$F/eIK "z1z)j%P>aR֖)]QNܸyO(0z)jJrKQ$z]yJ=Tٗ#r-V1ߠjb[([4kc6Z:%Y=~RϙggSI:AAg%"ZUrc''Lӑ"C0ڧ&OVvMϝDŻ^"oR;17gU G;"tO Y8xZ@1kyOɩ葔 ̀ }ΕNދ}uу[wŌSYs҉5rR5r}wl?+zw!}`1#( ;Éioסb#*;Gu52.0k;0xl3<,ҾrB`okiDD#9;Xi8iɳʣ3^RVؕ#Z춓oR~Y*M;ib__Q`jlFhyuM-rcf٦|uiB}jg߉V۷a> fO/畮('غyUPqwvMy$3Ö5RR9 ,eMDD+L+ δLr3xKz;K !lDDDbÙHV^"""Y1zd%""ElhGIENDB`PK@`Eb]PK4HwE!OEBPS/img/adf_dcp_datacontrol.gif_GIF87aĴ䌊dfLN|DFlTRllj|ܴtr|~܄LJtLJ\$"$TV̬$& ?56789/""%01234)٠",,%&''&(),-.@1 vɓÇq0R1>A ,(XIL @`l/s ;PK>0vd_PK4HwEOEBPS/img/form_merge.pngPNG  IHDR;UsRGBgAMA a cHRMz&u0`:pQ<IDATx^ ՙ.MN&'3\39g&$f-"d I ^6F[AD c6`/(-/@5=F t ͝~oUګjm]g=vժWz2\F~3ϳ> }[~>coff}w';5 H"f~>LQH΅??O>dRm7cqg̟Yp\({d9k>[ܸ~+q բ.WD8@8п2\2\}.oaQg?ohLByXc]daBE ]hP`_\;;Ǣj+ePA8n8u{`s 9R1">;}Ho>?diCm?>(UgSۥLnչtuT[az-xl-rN&̀90́$R`XB\೵ti߃?zDvVMj~L;֗vC~݅v7^lڱ)wC,(ag鳃b3'~K(/@ǎ5g7-RtGj4镟/|S.=Hܵ)Q UXxul ރojV|"mQhսϻ?)<_Njcd_?,s4u1MڜIS Xx\~}O Vٛ`,p@`Sxyl+~E«qxW_ظ;kʞv_hZ/4j_NFodEoDMoMo ƪh—h3M?go:CzZn0J:U>yJ fŧmgL!b7a·D&[.p,cǚLשc:}v}ML0+6?yn0ؐE\W <pRzQG/mn;Bt&6v=uc/uC!8*i_Zz?1RB;QKhs3᥅zS?G~? 2e 1{#W#>3?gd D%>{! 4vSd @v*Ƿϊ>ZRY$nS@op){sO5ڕu@Sz~=#2E$3bX p>7*(PaH)i 7oikoה8޸Hn97|v]>glx\_>G`{*zݶ0&wm<7uzLI'S;ǎOJr˧Va嬛E ;a/;h-3\of/25O27g1!r|ި϶n|hwڟl\onwԕqglsp.uCo%!"X|miX^>Hk{Ўkҍv&h_=x9{mh9_= {7~D2 }<)oKc~']x[?CS|(R  8d>Sx@hw>iN[8ڮK^w,á?~]x/^bsp9຤%~lxgz_^< I34쿤W4[9)˟,-Y42{׿C`!_^%!wtvPEx>^`19B)X'N:1$Vdܵ'iڞ<)BwWq GFdw5x)CNnC)@b=df9MJx7'v+^OJVj3-g(O|_̣(X3"ɷyPT~,[m 6SwYpCJ}~VяweO?gcGIkQA8Pa pp Ndu88.pp v@pd w7ppbH;pg;ppp v@pd w6ppbH;pg;ppp v@pd w6ppbGIO?Mw;ƏOO=۱H3ʉ+^ @p 8:PEE -} }hܹCѫJtڵkXjkk^ݻwX@5TZ騭Z;ƌ傚 dľLj6™& [ 1~tz\¸:}9o]pؘ:u*ٳ>,GұcJ8~1F4dp6 Z2Ic"Y }U8an*)؜G}Fݥe01G;mpNadvgKl?~N8Akbػ*0Zͻ-  gCCY2wU6F}\Ea09 cPEymLtxpvk.c5HCbLd;rJ19^{=ZX|w.Ksz;^avaq/y6`qIZfq32wf_\PX{caoz\Uk.Fo88<CತfC-(nzM^Nv'_J?{=EpA) 9Ĕ\WuDӫp-x"/GBA)MqŸq p.XvgcM[UW0lݒmB,ݖ'}QTդkV 6w>٫ R%<unSsЗQbԩSRhp i<ʠe Kd,aS`*׻ZfSYǍ.L:E>y2#i,%KtXQ1nb ӧ+y X;T/,r /NG^.z{݌ͫbvp[æE:q‡4yVsFO^bvrD}ȍ+vxp2߈{36sy/Hp_W %(My] !:ֹzn1n!yo߾ ='k _ʬ'n/ҍ]wN~d%6áF8 -rS'ǼW)G؟{p8)]>931lg`5@0B{W1K*NχCUsˉ8#ĥMø8/<-Xl|Ol9sV^áě-|BS( 368*a*CQp8sƐߕ Bpv܍^ 9p-1;戙]ő36sy8X- ӑȺA9KzݚV :4mp?۝^n GvFwW8)nLw^{/2ŷvZz壯u>A*TrTlc^ %ܼ t`B'91 ^'N,|Rg/Y(eNăS*Jod6yB(?#y>~~}Uʽ{B|USpĉsgqxpx(?'Pw 7vŅ7ߔ`>Q:Q{ c6`+m̊Ѩqb7߄_,s rbEK,}UT|IRX(hyyx.\dp\@p@pD7\ܘpH6 8 8 8p9N2u$@䂣؏}~fU~ (iW `>&n̂Xc2qr>κ!틢QEP =9QF4+co8+t7$;jG\Ca"9T]Ig' 8?_-Ǩ ~T`GUpIp~7:_s$K[:cУnH磮b__!u6el:73}U&)יϡe^mm(j4sȹ s]ǙnՊ[F$ASm_^EUfj\,W=76ٶX)=_0s1Z~ca(j5swv>VAݟ7z}oy.kq_]>^ΗTQsnQ${Jvlyg0 ?T D#NJ oubW=tW\8*㚶L;89^I6ykSNpy km;I%mׄZnU,..75?' Cxe Nds{DpX3J:lIl&oSɧre#dݞvViw#NL5HK+Vt &нaܞ Ko/WB0cfNʓܔ<_>ɜ~Z}B˻7>n)yey"ܽKtq&m^\O* M;wjgnrDlŶ;2Q!qK0z4$9ٴ@n4xHe9m:&]͚K&o9h ^׆s,ң#7W 蟷 #PxK(0Q<n)i#m#F aYwy0n\7oKW.7hn:ol)*JpTK)ʘ8\N\WZ3t>R +*N/Rӻ+SphOTݚNXRqV}u$Fos5_1c/^&yGA>K*X {QfݎzߒCEeKEvQo},uϫafr%[`n염ո:Oqnی;םׂ&$7ror9{ ?a^Oͽnp\wu xy{<\KWydrlWZb8`:`}wkW;NM*Vp(Sb1Pz=kX%kll]D.@;\rFa;˵]1 MgM.vw|бڪ&zsg%^ :[ ga3ݜ|{e=g0ףKx{;.uW5mauo98+7p ̊lݧs5n }y.:Iݥ:ZR)Σ_Mrqa $}c +Xo\Ǥu|0L@.RpbH;Ҩ-ʓ8@b'fnq8@b'rp88I׻t]+ ^K"}y\Z悱ݼy3͜9NJuuu4ez/|ڟӰs2 $g/>8ǁ3ޣ9j9-j9L ?8Ax#x=>iڢ5y{fϞMǏG{|@< ̻|5ea #"Cd[z.cZ.C)sj;ǾNBwC4a-ѣ&m JT3oyGh֭y͵>,/)f ѐD?]It!9x6})_^5_vJ ;4k,)6֮]KO<w'|VZ%f)>x Zr%}ݴlٲPp_ ^,gBlPӰ g `u@apPdF?n'"Ct\K.?=KӧOzw_i4I/D[Rpؘ4i,(^yzǩQ ޏ^{뮂.66}3WJφ3ta B6I΁˩Bt,$ןWϠGӢE]Ϋ{#tӭߝ@>d͛';w5OriFlXt);6/a FZIЏHFhQPV*fAGQ Uǂ":7 8@Ư^̀j&e~eLb1X )N{ӎ={xW_}U>m6i8pt2@\Fax Aze+2)6gbz#f3 Pv\a.@9p l< v}3􏃞KoHs̡}}sO8=\–}eKb $<Jl4]\F?K#=.Z^M$= e-PEUYHUm񻨧WQLǨ^5Yynz>ףm8Cok4pa0@8P`>n۱nj;N ~wFp,顇r :ϝ9 bMx6Xl43{,bpt<%gj* 2UR`Ld})X q`Q*ulv_ko>JLHaRUkKdp;l.P>pH>;/z%R/_^楕'Ҍ3diɝ?< `tSlNy8T<"'Dy>1vrqa bضӑ^"Eob>:EzLtɟ0F#pxbJ>OП=褧8ф c/rdsy/y)F$`8V OW 1QPȈ@9mn6qzѧS&a,flQa τۆBhoIC: /zs)#aĞ*b.p\6)8T<s'̠`_#8Otڵ+2Q+ղ۫^xk =X- gF1Z{kβ& TvK/rD4Η?b8}a08B |cy/p(o~ewu#Gy  p8@g8\*6u88pp v@pd w+yqŸ@>pb@(ioQ88q # |@ @h@ĊGr @@b HhS)fs1UVΎKhl; =>&sea-=i|]Wm3ucDGjJB\뽎3o^HK _xj\ Y1Hc*E@t[ $|D :_}/ڈ㼪0HL{T[h8 ;]$8E^mx.McG(dFDr#R3nBX$S᥮#(<^&c!8~.8vK[oa;:]pS=U?F^v.1ѩ=p<|1i:YJ`_gle uh0MC]6JoXʲ`3 W׫5NN1:ϗGq{^3@ t߰gLvA×q愨s5q`V8[x M3^m ؞kscp= lVqM$h Fvs ۘ+~2WWm@)>%TG=9צGѭ~S׽ʚQ}ri=VH) Nqs %@CE;'`mnr M-N%]۝]Xd pSu31Ӎ Z]Rqa4~Gv'7#>V]<RJN`_MnLNϧ2ɗQ깉3 @ ^`:b 'l.q!pG"`)i qTvG[>pչLhK%!kSΉرp8&TQk| -ߣݮK:yK\Zᚽ#WFgIʼnK*aC8 ג!8WӰWVܽSO}乧슱,IQ@ Gu`>FOd 5oJ%OV.AΥq2P #*c!{av4zP,M8ɽti$1S]c = g9 균%@k"1~O]9(k4ڡ:FHNy8 x,np`l#CLYӣn^6 ā@#vDqEyꏲ V/xx@v'YxYq<<xh1D @$Bpt8 H)$4 @H@ RG  M@ v 8>h?@ AB@ @ @p`D iG## H)$4 @H@ RG  M@ v 8>h?@ AB@ @ @p`D iG## H)$4 @H@ RG  M@ v 8>h?@ AB@ @ @p`D iG## H)$4 @H@ RG  M@ v 8>h?@ AB@ @ @p`D iG## H)$4 @H@ RG  M@ v 8>h?@ AB@ @ @p`D iG## H)$4 @\pp(pؿ?L=D`p@pPe &ppst"E8 p Y$888; 8@I;ـ8@p@p@p8s$d 888; 8@I;ـ8@p@p@p8sC#ٴiӐIpHxNgt<#`bs9s,OʩSɓ'e9q 0p8~8=z9BJAs2DGɩNN %2܄_$(qMlػw/޽v%Mr耇p( GCy5r1B8tgҫg)6vI;v(Mpeݫ&6Xp:bQg۩#^Nǂ+k{6p(3VCl( +s`@8t9ʳbc۶mV҂#N]= X@5T.r,N!6 X0);ppr@ݳbc͑5dRQ q!A0j_ b rQ+݀(q1غu6mbCwtRIQb ,8xՀuVYەPT¬XK&WQURzxEi)֬wVI2c_ /(1=&b5g+G'vp mp{˖-RlU.sI&CU8mYE6ϰcL;U 2I`"#SU+V -G p !7!M x-bߵU> s֐ Rn@h&tbB?7R(٭(^(? : 04sKthiip^W$Үv_n-yݲ]Iە$AԖ9`2~a2 BP{k~"#Aá^uPGT/aڿ,3aXRRM{ɺE} ( |{Yn[{-0[hDfڸ$W0<° ckz:*ԉm.ͧSB T#<@sι^֞BQ('&߳/=9Zȃ6~ V 7n 6PsssG6˛?SpxR !.%خ4qSp?庇*X.DeM5\߫cəK*)shԢzlK[h e|Vy#r{^{kmP8&Q,/(φk׮ umJa:^<>I.P*a-dxX+D YR߱,c-AIb_AkrD.P~4a׃OsGMht#hxYsfP߀z|z? 04s@/(oiXg360 <@0cԍ:cHkIŰi!lW4u4}*i[mg=(  5ۥpH3xE=,6"^=d%W,8䲅X.QWwU|p:W~"Ey6y)6|N GpݞbΔ{ R\0)qW/j@8 89Q%6}]Zf ^ZUVuZpJs 8mtC/898c6b^@{\=Jd(/ ]dhA8tz/g7ސ+VPcc#G iӦP"_BÅ]|p:~/ Pr^@8<'` >G pa΅X@qw8@b'Ytw8pp v@pd w 3`ƁX'yg{ߎ- 0pqô7ߢ}"afY'bwM_M?8;i@ DɓG˿4xko3f{8X>S@0ؘD-  |C *zxD.8q\F裏<{ȿ=/}IK}[m> i@sZ=@ P>&F?os=,njgК5l_==ӟT{wjjjg!CHۯj۷/Ӈ8>@ P>4.kb e2\*iLKuNbCJіTt`ϱ{Ypx 﫯~2|8}[ߒ;v@-;w},:8*+ǐuՔb[.8t&:&8^:}\s54{lz7d{7~>Rx;mE]D?d:x|@<8u{|,qL%U.MpVpz.68hQ4/s9twӥ\B_%o]p7z{կ~=\׿NV*aG۔(TgC,bTjK+~ѣS*OEA/~+g/H_/פ2rt PDP(͐1,8I.VC{8Ş̸7}FJ{; (Kv@DAV؆"xԌOcӟN=zKӕOS6ܽ2ӟX G83@,0ȖT86Cg o}*%K~~{12c~Ԟ̤O׍#rx PL2y58dF%.l9E*G{{;>TJ'Mm&/yX-hٲe{9 4(wm&S&1} ==-yY7ti„ 1W~Jo6z_w{ H)[oi$GāDjOOhu1j~l꠹olo| IQrnlH> up%'dۼy|uѢEWڂ~:iA`A5sV$bQgdz6IHKw.0[aP( (5,6{8Vg߿#Jp@/o\NHHz{#@8rpôpH<'u?w7ơpfa_>2#ёJK BJ0T:1bs@lH.FAD8qs3<j5Mɻ?8 P)a%(nD-HP |JB웘!@䃀x̙rJ>y:gMK/A ^U(( 7וfXȿir g3;.:FZ䑎VLE]_;(sņ*NQNp$ԞysǡD|_|Vs"ڸq-YkT4QG_MՕdvJǍ#Dտj@# ]l!u80y$d g䉣2 _פ;ƌC/[o#F ~"slsPͷv-0YjkaT&CuEMy#tPϿ׉*WĬSWH2Jg8%hH JpbԩӖC_^(ΨNpegOK*9upa 67@ps6R|~p p',"tq1bqQ"Np&ㇳ͈n`5(qpȳ{*x8 < G'!V8ە <nq!ڤ  خ h{\l%|K*UHJȏ!{8:Lǎ7N<%E(Npt#ᄹGq⻨cNڻ6 py睁0`O Gbzoygp{j3~M۲syĹ$8KXe:@1l [7ҦwMjY:mX5-wcWUǕW^麤RK c-}Hۡ-ұp87\c=NLQ 0"=LjXGs!ᶥ(DzODŽV>K*I{8iB"":YDuMҪshy jl,^~^{eVcсYR18T~_):P.h {c҄#3}ʳ fDƚu}1aGa/٠VZ Ԙ d vG6u#iH,?я~Թb~d&m JiG<QxLd_E24 ذ@>K 8@@ C 9+EQ_5|p:t|C*߿?׏.2biSq@ @p$rXlJ(Eg}Dl -@ċGFQ{GF@ PZOprB5ޤNpkXoAm@d P<7cdHH H&WJ ˭$Mh @ *!8Tg̼T*dT}L{=i@HT#QH5ѰoҐ!+tݠ%4+M@>M^:y~he]U-ZLoUyB1a GRB>z%M/![EbAxO B( 8='[[=V>˛?N7ڳjQUdsĈMlއznmދ12GHf\lon0E^{iWث P07L(*7 Y%oΣtK`R/8tNENpG"{ʖ#; Xq_>TuM4sF{Խ^|B%wBXyGr꾒:W;´Yy.vuŌrF#:|HA.PbYl43QVlKؖTLw+8֖Q ߗḈ Mx RpkWĥR@ph@#H(GG48A( Fc^Z=ۨ~i13Jy.84C-4Ñג0W!? @HNp$R Fh!@t5" s(:GW_8@ $Cp7kJ>t] .C'@ Pla<ݦ~H t] x88@ 5Opx'5u]CS'8  ҂@<LI#xPɃ @l(0F R'8DG50~ȐtFnxMUW;B:o!:uY'b 5.֬%LO$sShô @2jRq x8g|zZ[[ 94{L7 Iv-_1;B YTP7gݼ4ldUeHUsN YQ'WMVDs Ȼb;2Fɨ X-ɗ<>T9 &(lh 3Vr1@tG1vl8'sÐUO-qBfǥ=7̱+銫SѬygѮ2bfR6)&.B(\7%S8yEիa/87aԕ}־N$݃# @pExNpY߃/m9rZ  NSKz\؇I(w~eTvzi'{,(Oeߣ>UpXm/(ޅ35 $x5 tD%6F:ca6ZtmIt~Cm%(S7^+8q&%P"gKx-haKK>?V`l#@jHPNpÑ|R򨤱#h3(S 8?ɇ-@Fxc>xNpfX@(`ͧIP^#{:Qc. @fT =om.?H<w@@"j|ZE+S'8:߁@H×xpD (@ Ga:}WwAp BxOea<C[?84C7uk| ԩ˂+W{%TTOc=mo7Y#8x@(H#ZisGq`JYYl.jmm wh qMꖉ6C { #1QթpP?~uϤ)yIil̍НWKR%RSbfx="V.UouQέpq=F"H%FY>}pzL\ rS u#7 Y%1'd;x\ jiqz8uy͚z*8l=RyF<F@z4]{OVjGleEB] SX;2Z)N})Ydɺ*ZP@p$S'8á{y-GNK1vҳi)6VS PՕ74eou.w =%-+m6RLpԷ^)&#<{i-,E 8?ɇ-t%6F:ca6ZtmIt~C móa3ʶG2a:ãѨRg>+8lM:'9Z@p$ȗF4CxeuhlKWgc/m9"fcV`1uZ:;A!.9^ۛT 1R]YI !_. #P}%}pSEtB.-@@pDbuNp Gi>sF:|w{Wq2@gQԭbc K*zJ!*{QqV1wPR8Vp8'K ee ҠzG(}/#ZZZxȷq LA#1Cx8?Fha=" M @@K0Np d5j^Le@MpF އ ߼߿5n/3zp@`!q)OOhu1j~l꠹olo|@ot^)bU IEC .c#k2<A A՗/> 2fab8&8@| Y~CO~\c(7D)laRwu#z᭡] >A .cVOVK\c(?wЍÚhHS?dJ~p#]7h A6| ԩk[>7uu&HLg}M!Hq381MpD}_(ӫ]|5xp 1nm #:{ 2f r\c[Pgݼ4ldUeHUU^$lUϙ(so|2lz5'F7MG{n+'e쟛O%y@TNj>T_K q3&8J#7!d-qBfǥ1=7̱+銫SѬygѮ>=4VL'(SknFX Tnae}'u^B#}HTg5Gt&8zzjR#eZc'gRlh+oi74ݻ.8ֽ \#8\b5t=~H1akx@h@K@\ #:5F B $A.MTbYl43QVlKؖTLw+8^BTz%XR1S+-;±-Ƈ@xD7Š& 5e 8(6]KdxeuhlKWgc/m9"fcV`1uZ:;&%*Y87a$ǨE(]ޠg@ e 8cE\c#xghqzEC2#[DK N!A{  q3+1MpK1y;?*8:l\/gMp---R<[D}Tg 4 86"kbɇ-,vMYc9KŸ(6GyL%@ 2fcȰjG^a' (+2f x8@<&e5@ eq;A@ Y"kb摈)B?nGO'|JNB{{QCfS}c+=|3=;} %&lܜ?9R'8"@RG`ǎ4yWXl]ψ Ue BFT@tعk7OcǎөS̙r GtSSG>+}50~ȐtFnxMUW;B:o!:uY8Ȋ%8o8 P@p$S'8#QHYl.jmm >X+|/*J]Q@HpNp$pl3inR~sznl62Ǫ2[$s**܏nU!c":)M*zMi7{jQ<[-^#>Hc*m9wze.}{up6&h() 8? C)wÐU-qBfǥ=7̱+銫SѬyg.0JPȊM#nmsW<(/sdyr7 |*.Nn:t[{?Onpo%rD ӅG+u#FB%~\6i)0N|Bz68M=/Ɗvqa&~LS߽-Z"XxeBL[ ~]S!Yu]ڀT_'HNpG"j̠k*oeh-%7FvJpHq*S(NYhy G{,ppx]\[G]G!-~ hemgy/-^͞mT战[giknpz,dZ q_.yhO~ؖT8ܡ`L>_uu5ɸ 1bOlAn<fdžhfQG=-Yl.jmm >##@"ѥpt x8yls3inR~sznl62Ǫ2[$s**܏LR߲ضCܶ{ ƨ{Np4!d3[b{K0z\--ncWW=/Y6R @QPd´l*:m˶46  8?LP}=xrɼ#; 4+کDž}ʛD2M} 哜tl̴(K"ɿO PJ@p$4S'8G)-|>@!P47SXR E PN@ PV@p$S'8H>B @W#P<=MR'8 5Zq!P47/ x8B-v@ Eep;:. (5 8?p$Th!@j?_G]@ P@p$S'8H>B @W#Ո #^z%bQUOt&&H ZBiz[H'S-S. Kq@$ GSR'8JԿyYl.jmm-q ~ XG!\ YP|G':y|} 8='7f#s*E27ί¯B\u=i@%sSVds+e$fŶѦjcg-s %3hmus<$j[;6T@HƥNp1='O71}N8F[%8nJB0'd;x\jiqz8uy͚zWX&8,x@0rr8kjuV3é:dZOZ$3A| GG(#v,8?l>(/ĖY|%߃/h9rZ3vҳi)6VS PՕ74eonosnsx8BU1\^Xn6<)uBlq}8w G !8Q_6b"멳>ȑtP߿:{کm#})cеKdoeh-6Qf:[VEpoa.HFhK);3$"Q)u#v,8oHZߡ7ea*Z״y㏡ l46ūٳꗶ1s~lؘ:m-wT |Fe ܏Tvq&K*,J#a۹@$D <~t#ᬻ^UKY<ʬPcǣutkR^dhϞ[T)ȑ܃FmQ"\ƻ20?kX!A UЂOP#><`؏_h!Op؃`|us.Ho@  )pÑ&GMh/@ 8 Akkـ@  8b5*S'8:#!틘? !8Dr:\(2 (B>yS'8A(E`"-qԖ:`Q1|EY E#Z<-u<IoX!=< -Gmq:8=qp'љvCptpA#c:;Rl_t&&H ZBiwt21j:u겜+Ƹ}lg;BG bM^KGɟ!1KH>B|zZ[[m*84Oٯ!sQ#p  R f;Tx694E~7?)9=76hU-q~a0o>z=Zv0rϱ4sOR em\_ߖ8%v۷v9xz@!u#^ oJvj%6NLw<&ve;]qp"5o#1:Gp{I!DW % PmGoG!dƚK-ɞ_gy!J~:]*pW_^(k=*>Np$?) ~\Vrc'>!=bcE;U]yH{Q\+ Q](zg&,;󡉜 ) mp;l@ֳ 4-w ?cGNpt5@8ѠkHoeh-%7FG0NG()G!/!o[!+8\bEb< 8pUӨkL#j 7p@܉QV潴x5{6Q6#b6fo SλcI%+lKV۳Z~ϒ >oKX]K'.v,x , { P,8Һ٪ؙ.%?" -G_b޽^ў=GS FQn#R#'҅`n pZBm֙:1Rxm)ȫ=|~x8Hr4)Kp.@<]T---R<[87Bp8k#NH>hB@@pājuNp-6W@p$S'8)Z6\p#=Qט:Gآ [lײg+ 8?ʩɇ-@F|p?8 P@p$S'8)Z]GW#R'8qD 41 ƀ- Qh]|HGA7ka"!+tݠ%4w5t21:uW7[RI~j @#kؾa? B.8ꪩ:B#hr<bO^wQkkk!wSp^i ^,D<r:cDF 5"P4!#9Uܩ:QTFCg?gݼldzUeHP幟:6ricj_۝顰gɸSh16;`cۥ 7ADuz[m)'+a̬Gc\{(UOeyzX_ cC؄j?.DF|Nm}up w4@ QMp{VB;*{-GNK1vҳi)6VS PՕ7eZon?\Yc0+kx.CUƾN:C:zNY;j)Wy"l.֠e"MY:\P&'m11x`&2J1lK#pLiеKNJl7u2JÊm`ےӛn#n.G#/9Yl|l)Oa1w?5|ЗgT_Hqk;XÓ6H>Eɇ-L(:b)h l46ūٳꗶ1s~lؘ:m-wTw>/kЌH `^wvIbICy9Kx;'\t]sK-6~j9&GD)\\bNd̶xygm/G 8&'D<9k]l>ڻԫ8 ڳh~(mU 1rQXFtW rX PՙAZ0D/ 8 3FD;F. 0l}iMA|ns<] v9n`a ( 85IH>haKK>G@x7ѽB#:GI&%2R MEE|G @ 6 8?bp$Th!@j?_G]@ P@p$S'8H>B @W#Ո #@HNpÑ|R@F|wG @#PtwAϳppt&&H ZBiwt21B:uʻz̪DiZB_x-5WjLR6-8M$R'80(ӫ]Zȡ礳/49[6B@(PYz::G0 pϤ)yIil̍s?Fb4U| >S'դes@ˁ"33a9kv[n.l#Ou>[M#k;řիf q2G[,HN_أ(q$: F!N-qBfǥ1=7̱+銫SѬygz =)Y{&]?Ι\M ymi׽f'^$]3c7 pj` ]Č:Dz}3˲K9h|`DBq.u=a^.i)0N|Bz68M=/Ɗvqa&~LS߽yAK31P ˠ(뵌i5u.C(Wgu\6bC2UjMp qBS㶤'v2Ա(m)8\҆=Ǎt)OOhu1j~l꠹olo|@c!y,0;(4%Jl7u2JÊm`ےӛn#n~BW|zKlČ:ã(DqBH=/ӿ0&?7[PiyqM9M| )<)h-Ğb-Zb}4H26óؼf6_FsDҳbc괵ty7_Rт51@Pr}D%HW%›K+_[FG[uA b{Ewu,!ۡMfXRI \<1#D-G_b޽^ў=GS FQn#R#':2 !2Ja94 eY$84ڡZz vCa )$pDf1!}c8\bDRK4o^FO%R@\[nV8lx5F RH Wmii!RGC"iJJY@Fx.5F ]Þ@ >r~s_P3Hq3aI\c( r/r`_ @Z˘y8҂O&8B .c85F rHD訃A .c5F 躎@T˘ApDǐ(6uP@ 9(csω7ScǎөS̙d|^*5F 躎@T`cƢBGIqv(6Qn[Y\t-MwJtEH<=#cQ(1Mp(V[50~ȐtFnxMxw-ҩSuɴp|gAw{ո-sV{>_nװֽF P+Ñ1Z;w qQl#;RF!^BgGXܙ>>!_N5$;w}îX<nOWJ5F \X  'ISwwc9V"WW~taMP*'I߈ݖDˁ"33aIrs8g%Y]<ͬ,*}=QMrx)jqnf9;ezhlۜ`/nS11MpGo(7 Y%o2s<.qId]NW\=fH={-Kp`Mj7)PяJLa+[lV4BPQp"Sg&/OG %l$=O rDG G.~JŚ+#ݭmSޏ3n c)lY2<:Je@+eZiRKƫ|+1Mpr! vlbqҰb-XŶf:[ju-g![b7ҳQAE(˜Ƭ aϟōOzyCh !TNy1˧-a"/%n Qg|ytS8Ɂ0gP0cTS9jpp(u@pK8@9/ 88; 8@I;Y` 08Pl@p@p@p8s$dV8?p(> 8 8 8p9N2Yc1bsp Y$+qg@98,v΢w88@b'YU5Ώ;;ppp v@pd wſ` ppbH;Ɋq~ف8P|@p@p@p8s$d(c88;B k+L2Z툥# jtxׯfb+@w!8ȁЂԩtAQo? MH#/G\#hP 2pq#8ρǥS'Op x,G,0 j*^SttR)w-ңQS*Xo_/"YaѱjmgǖGD !SEKiob %?~c` @q O*,8B (ٸBD m{m[/łn%⥣*GD𲋵lGn)vjߵ% 58@hqJ,pZpHa` S(O+\ }G Cpl!4dq 8xh'rp 3id.7,2x8xq رc3عIRp"qFLጋ`PUXfqtKǒ3aph m)Dy/z%Ņ p@hizrrm$y)Y0XK*rKfL TA%#C_Ɖ9k аAXR &..`8B |ÑO },ZC .gΜV9uq9y,'N(rq:z(9r>L'1baaʇj~X.RjUAzb;s|qݸ^\FneCϳkluv-`φ.6pܸr-nb޽{iݴk.!)#X u/Ye-,_ʽLZ!=QI*#[7ga(Z^=Nj(q1*ע{68 {bcΝcǎPB ]p`#~, 5*okZFѽnbPbQg۩=ԅ#R:Fc PԘg6oe1qP, lky %j( +b/Js+$(" 4n{>Ͼz(/ 7ou!Xb,r pz5xsu^d2V9֗x G\hͳ,6.88%6 8hcS/D`p9 QiN"dIENDB`PKӫ PK4HwEOEBPS/img/deploy_mar.gif[EGIF89a{I 7-..|&m.m7|ABABB\^^\mmkmmz|| &7    77&&..&&...77777 P-PB^B^BBBBP PPP^^ ^^mmm||%^-|6|O|O| 66AOOOOkzzݚP|P|| &&&&..7&&... ..77|&BBPP&P.^7m7m7|B|P|mPڷ&Ӫ^m|&7|B΋ķݨηηݪĪĪ!,{I  ޸!#C Hŋ3jȱǏ CIɓ(S\ɲ˗0cd#Ǎ4Q1|Ҩ! "y$-\JիXjʵׯ`ÊKٳhӪ]˶۷pʝ˕ݻN$9Q)!H0me/+^̸ǐ#KL˘3k̹ϠCMӟ oAliaխaΫDoFaoI?Nȓ+_μУKNسkΝzOӫ_ϾO 5=H͊7[ /a`Ǟ} 6F(Vhfv ($h(↿AQC (c %T 6h`-b3iH&L6PFCTHcX"t \^i&Qlp)tix|矀*蠄j(VX:4裐C ^dP>6t&l&*ꨤjꩨꪬ*무j뭸뮼ZY=P#8#2Ȳ;dTAhP .t d +k覫춛O'I;$D#$90´^-6 3CF,Wlg|1 P"0xBoH"ɾ,x9Z{ I444&Ej@-DPHKN@Pl>$qT}YsP Qt+Ÿ  .9XK叶: >ꬷ>P>%:j,87~L-$(tFLa7SJF 5 pgyk}>Ы<=>?Oo*^$3XN`5x31sc0| )LI~1=iGAVOt&$_ Ixp {5 8̡';Q!8@,\ N("&cq~j)5*"7F{dcx51ctT/QcF=1[d(?q XH8cD&R̤&7Nz (GIRL*W9!&;پ 5Ze'0" <` 73d`"d&V g\Fȣ(> yL4MMy̦5Yl}L_8|ls7 N/ϝ&6msh˸PSBNVZͨF7юz[$L/cn(!n/9gC891q|` C*?irs&7ԃXhVUr]]jXPrSJjSֳ~UY'9JWJxͫ^UgL#"9Hi!!B axG$ՈE,Ȇk`)bp*PR,8wD1yɃcr.9xHr3Ϳ\/wʅ򜇼5'ɗ^b|'W9ΓMO:|{ַǎo"#L NYz܋e)8*mBrN;=-ߞ3񐏼'O[ B0-D!=}Xv9=ww:P:{C|>vxxzOGOOsxO8wCa_~XGv ؀ Bjf)(`ٗ 11 "8$X&xBH j5X9]0W5Wxvf-% q9CB8DXFxHJL؄NPR8TXV@Z\؅^`b8dXfxh@].R򆹔K)pxgk-<ȃ|ȇ}8Xx({8Xx؉8Xx8uw(3Y8Xx؋8XxȘʸ،X1xؘڸ؍8(W䘎긎؎'08؏hYy (Ȑ9Yiّ$Y&y(",ْ.0+4Y6y/98` @B9DYFyHJLٔN 0 pZ\ٕ^`bPfyhjlٖnpr9tYf:y c9Y `UWi99vyyxY瘑L~Yyby0ؘYٙy 0 Ɖ ٜY%bٛg(h )0PP0ɝy YYI*Zꙿ 9 PYZМ yڢ.㙠ɠ )fư ] Fڡ+ PVrT_LJ0`4*P٦ƹ<陕J*uڥxʕp#*\*z9 z P :\yp:jjx} SjW*:VZZJ^Zu@X (@YP 0 EJzʭҭ:Q *쪫ʮR:JگȪب@=  [^GKkLj駏¥ :%˯j| ) N 5{9`"Fx:|z "k&["[ H ).۵ IV)PbX> e{iAr[B[N O۷ZTSW;&w뵊`k ) h^0{[zBjw롫0ڴ'+KWꫳ{`ڸe)>PP [ǛɴZk:Q RЛ;.껸h 7zPpо;;{˺jȚh(S@pΐ]ZI H  |Ѐ sj ΰ I%*̛|` P( 1 OyHJL@i %jŒ=X-,\`̐E!a&fj'@Ǝp~{}>z|耞U.nx;UR80>h^bcN׬.a~뺎uN~腾^.̾n~^ҾM>^zXy9NjZ~k5nhI^>.>>Îʎ:Sᎏ)nXNN^1ii햾 wn.?K/ OBY'S(Eyp-L^ﮥϫ=Ün^qonoYM/>~ӎPNoS?-YώS`{Ӭ\>qbp6gO=ٵ]OMooկпҿ_͏oя_Z/ލBG-o*{=|O@ D8W= >a$^lF=~RHZ|OJ-]SL5m)q=ʼnCIRP2N`} ,u0j|^jU`փ\ d^:PXkþEKUܹ&:0hH}|W`‚YVqNƍ?Ls9?-QJ:ZUqRQM6赢ͺZ6֭*Wؽm'Iל\raN]tխ_Ǟ]v+[̜9K^|*pj,|qs~o.#8@dP9V.B 'B i#ϳ$J5J,kEEq@ 0H!GrB#D2 3C,D@SO*lkˬtRD2]Jڴ-M2sd IGiJ;·1f 4PA%PCE4QE5tC'O¤ =J67ӹ7GSfC5UUWeUW_5VYg5:!2&S]wW_6Xa%Xc5FI*RC6ZiŜV+R6[m[otĈJ\sEwTJ]w߅7^y Jt7_6 y8`^KE8aݼV/8b5PQ\8cjظ?9dcVD{7F9Nߑ_9f#x\h1V9t;>pfZ!"WA5Z.?r9hۡ*G_6@4:!N:=j:jFĒdzdshT:MFT.zG D'B*R1n,|i#yO\h:M]{Vm~4[c1MSAc}lU s*4V8Jz-YŴ=[򵴳iPV0'?QӞNNy[!aVo?R({!TL07](tlrVzV- W{ŭ^]μQ\WV7mkzo%h$q7X1v.mt YR7Doakh{Kw~ڻF-߻f+e_sk*>.tde! {W&6@jRiUG1t/|{1e͚i.Fkn`c:XG8k ۔kP˅G6cFȋv`B#D!Z|XBuh2Wկv+#lwE͡# *X=VtA Mʅ#7&gU'-+!z#F4t ףV+hrz~2'OilEmzHhԢm] ܹsz8Mmkc;wr?Wp+BVrhyFq\χ-q@7kT!ub˅>\wMVPUkOfWח+sv VGYSRFE0s]8G_.="ཀྵpD᏶z߫s{LV7¶f΍U)L[>7i^w|p7>Z0R1ʏW;Vď1q#;>~{࿵Ү,   44{-?}rC+Ay0?C$2\//ȫ:NKyj-0C`['连)|);<1\BA>@4{)R+:K飏#$T&2, --s"ʒ+˷>>Y,/X0,*|11H2pCۙC:4QEQ\,|¡ [{"+;/[:-Dm4$a #{PrD-+4adyFE{-Js1E8."q,F#u0l0e<-.E3kĵEo<8$ǀ Ctk`CE.TED9<03TI144ɫ8tk[HHZw, I Iɚ3X@kf;74l؅YeItGg<ʕ1Dp61EJʢԗ#˶Ldɨ J╊% 'C%KP%RZ'3,I-*?C\̺,˻D$l$BLLW-ֽLWa,wN^W_-rRWhW5,X{|OY+ZȇMD:DI+ Ԍ՘3XmVȼU5TaU؃`m14[CXUU؏eX E4E _0O.EY3jLXTڔaZrZ\8}9hZ&x*ZG\ی)YN^UV[)ړZwխuOY܋M۳ϴH+MUt[\ 4=Z}U;zYp5ӿZ[U ЂҍMXZĞؕ]xE\m9M]MT}]XV5^CޟU}֍VU^pY%eќ]_tXLuNuVVe^-]%N^%_}AԌJ?[]_m_pD %=sq\ܝݭ\9R OKSSN` OUgQa(Rc7r \MsdA6#fa" b2UW#P$ =M \į*6+Sf[UO\34PYE4Nc YU_-_7`x%\P2)LZ>!5f,v;aCN [dFT=PH!I!"&˥LF:Q2H:#6`\CUtbQWR/[:RUJ.K>VLFSfocA-f==QgfL kfl-\6]^_QJ"${^S&Syb=~ŨأeOY~h|#TMOhK~{qt>hE(e0~iq=Μ`"͛^JSr~`%&L)C3V]6R䠶a֮*3ieiVe%Vc:fveҊfhV^Kbv(NT1l1j܍~m~lMd k+]ϖ矮 mh#NX4 1CRUma vm}v`|aiRc3Bl~Kg"fivn$ 1in&;foKh}'7Gpdooo`=P<k.f*  i&7#~|.;I*e'qlaa3a^%񇊬'&do j0>&'6(*Ir>x~mޢNkV>r/02#qs2G3o4o/6O~/OEoH{4`FEk&?b@f^릢8@FDWHtHtSG7&tVome>QtCTt^t n䱮]/Vkbdl0Wu^vvV"v}cNBoۆe<̇&_2>/7kGG2uku~u}r a([nc&5iGhhnmY#hmyz{/5xxv]_ߑt1R7b_쨶rnKXoppQpnx8oyd|W6r bwzK:,;B=3zn7v4z5_"ިF/ĮOߺ1{{j'eJ 2wß{n7{|Wi|0{hB{t_q5k4ul(fS?gv}oW|DQV@{Q}חد[/F| )~!.'y?Qmt.2> T fz..z'7tm* „ 2l!Ĉ'Rh"ƌƓWJ+i$z2N`)Oh&Μ:5g|(I=YJѝJ%}X Ԑ .j*֬Z/v(#Ѣ&W|hͭjײS,ܓBƭG-^7/ RdXd]”3-Ȓ1 wEn<ϢG.m+‘ur؟+[.fewӈWd|1miynGк W.hʼb/=/+yϣG>:Ru~B(X~ 7_jq9x!Dgq !NE5] S )("AxwqQL!\B#^ CaHbBXb(,UVb>1*V\kY>(UzQG"&12_Z5w6cnlBy]=jyP%nS 1Ĥb p)T)馗"ԩ-)O|Wj~'nxhFToB*'V ir: GcJ6.K-SJEUN &T,v.NˬGyLZ8{5  )SʬykC۴9^-2iGw_N{&9M6eG}SE%^tKmw;/X@ o7h`ד1R/jo?^>c}r/ ĿT|ThU}Pe)IUk3>YVpAqЃ&t"VZR% .cMbV& X3LAfԍƄzY]IE71NsjaD`h1+bEHbxiq/hq$#h$9*brDO l#"1bGLv4?2^G!D1O[k)BGE\Ժų]~x3PF^DZ! ydR4qU9M dg&O~s'Nj8΁scf(3nu #k)lrf97αxLV~r#Y>m9<@i`*zHBPn$Mk yװ1J~T< "!E;H}ߘS $,R3ՙgUBaQMSURP~"S}MU S֊~I[ WFp',.+*F; c/Q6`!^E5r !Y2VGډ|U\AJ[ӦČmz&hA]KkiCqP)"5E"U׸ aJڼ*Ld () J.i^c$f+GÍtҦy5^veKxjוu"kM]/$uI-l~EZZ氘Ml^KMY?5vcmuG3ZibjҭxK>&CI\Otg3]Xl Rm?(`b 򉋜#OR1mBYqfcRM&6Me^~1?9f&Kk73r)8Uɱ}9VqOL>tNMr[`6s|ˇߐ:7^I;.hn/REn|U3k.xK 4L ${ٕ0{=i_z`o]B4I>pr9XUdP{b=CuҰn7%Rl[{ TBvyp \Z5 ߯r$N&L 61s=Rs'29qO9^)J\_垿56[mʖyIdM5"&mbRk}q]yd4 -G+:ςy։~v\^G9Ko2܍]LlFj|GSc9˷%LR2[Ŗ4r~]k-zz}R|`%REKeF I*'!C!I"B!NY""!G##G$`6DO^B>`کXM/K,ZER.&"L'‹$a|!ar 1ˆYB"q6b!H@!3M1&3JOa]A5S,b-n7#7#cb$9Ab;4NZNc*~]5^6*6"7J!-1H_C!iG)) * "5"-GdJ_)(7%BB(֙:JJ#Rc/c%DPz0"7>Z7ZR7_1cI*GLL&*Ch%DGze@V!CeY%%C74c:f` D%0mtiadMVM]N.&iFdDRPEbE^eFBia~avea+&^fTf&&=nJjWv cJeI*1e"Ҕ[eR[ד.k~JV֪`2jM9껊 N>B(clJ~2rNai&xȩ2+nޡUÆgQ];^: ZƪVbF)gNJ\WĶQ(Jb_˞AlhJew֌ϺgFkY5RdZUkޥz,{:B-΀^FbUӂ ۾P,ȺikVj{U,e!~(֑f-knmt`lV V΢Ki/"i/M)Zjr$.D$m9-NkV"#>j*8de6ځz)2V--)i)Z@^Z+n$Rn>dU,o56ojdVRbPb**dRL/K"R2aZY?jjAo/*$b0eZ-I,jf hX_0YX fp:ZZXC%܊">Ols.0+6Nn%W%lq&~p071hcBqiH[I3mC*V+4>lz;- 'F*q-nyjm>n hqa"t s !SqªFѾ1%j&Ӭ&۬C//{Z!ӑۄ"C##"-Tgz∦3/,xVTZr@.HR!ߺgߞhN3E3(rpdݲ',^nnN1s =".9(+b~*G; |ޮv*Xs/8[%_fr&מR@p^2+j$S/ks0G#kȢϮzdW44noz0NNw4@,4NbtRRޯjDoJt3t!1 #E"5.%ፍꖨ* o:Se'9:"K`G2/dPe#Ssm>Cvs|v.r'32xvvCr#2|Avd7 #4{ &3b97@7*:2 Iw5y:sH;n4,)8~}HzHh5)su&trr+]B1xW cgG|!AC}Gy_I{SwXwIc7Q#X,ALރsd 0<'ka_C͒wut]{+\3s,7]4 08x-΁tW\;k-Dx}Mx+ I|8#>Ls"rϺظ59B9V߶û{#_3 ?IONy N~<=Wp kyyD9wο_6 fK# 6sOT=pϬ sS6ߺ؇v}}v"=|i~&ݽ4_◳+o9G>11>8>vu7{ɠzS ?cJvT򹃗?] h!r|7Q郻/ 7eŇ%.c!w37|Jd\ S?48Zˮ{~Ə'M}! $"鴪j"Khľ )(7췣PD&,Bp+YQ/:0yDDbJEV$n,%tpr|LHNJ/IK*G@ SM̲%1@tCLK"E O- 5FHks'JUMLԴ1PU(Y+Jb1R%m 4uU]eS A=lb`m #55_a+)X u]bY,dQڽV 2o5oU[iP|g8q;93%uוb򁘘|HF}LT5Q`F\BF*bD+kZh!ѫŸl޸6dmE@' LOSR '?Ei0 Mys;"Sѐm@ wBⶈx&^Aax,lp{".RQ{I`ƘF}%$t H*Dɠ}#@W%=(Q/># 2G-]{̲,hIˑު1^LOԥ랇 4[=ZE*Fig*{f ??<"G-SzNґrchzJ'2뀡 v)崟 i@{75C]'wʗR4;KΎ޴gAHNfr#+e$x-3@ '<`Uhb5KՈ]PP|e MRmF0P!ڋ6Ea J>1[Z>zdjw bRF@{ V.d4n9>ϪQ4AٰsvDFjȚ%33F2֧F/:״okүV}\Lʹuwxg<!+WLۆMc*{ۣ}hEk=íӚ#t2 IfYޤ'$3OޯnѱN7~) 2*s?;=+FT>P @4AtAA  0B%tB)4*9'km5W=NuW}WU{|*XNyX5YVuY YuZNZXn4[[[Փpr\\U9-LUUa']TKuAI_u_u` GOu^7uaaabu[0@.16c5vc`{bacEvdIve:vOV) Kdee\2Jfm6c?fog}VseKaeS6_+~i6+rij6juKS֫vZib*lk6jVlٶd6kCuhYSSVl*voq%n9Uovp1 ppkkUh =Tp ^r-7c3 qrEst5.;7>WhqKGިL1 8";*dnnvsB Wxxycsauwg!xwsMxrQo=yTq;uqqi7vo|'weL_afxxweWut}W{Wcz~yar%(cah'"X)i78 v+`R%T!XX Z…cx VT؆qsixa؆o(S[؇}x{_c8؊8x'Y7Cu-؂'q9|c7%}NO8&dXx )ꏁyF! )'Y9)9ثwG8 Q9/CkוËOy'Vrwbxw9x=y-bwXq9Yؘx9مøuSYX1؍/kg8襐ByYؗ859_W(tY99X 홞y\ 8e9أcvY}ḣ? K1z뙗 :vY.:Q[ڥYk:Yx9˘=XO:C|Y9ȃCx|AX79O&!z ԚϭZzZ 9Zњ;隯;z{گ[{3h=U?&1u1{YT{m;t7LI[DLNk]۳~O{9۳{u閫K;lmKKaxٻ;{;_ۻ{O;뻿<;yɻQO!.t85|9|½݄|7ug9|Y=<,ܬUi.!5a#AbUaOν:ɕ|əɝɡ<ʥ)02`ɧ|˹˽;cTd^5I[ËoT` c|UZWz ЃU=Y }AU!X}-T1=W+}=TA]V;}M1ZQ}Y]]xe}i}Eq=uWo}}ׁQ{=؉؍]Lؕ}ٙOc١=ڥ=K}ڭڏڱ}۹=׵=W}X =ݽ}`ѝ۽_%@p9]DJ>Ja\ S"]cOvgpP=K!,0>5~9=A>3H 0N8UW'+>.6W k'Bw%T|jm~߶Mn>d鹰ds闷sa1ui~鯽q끖{ea[^v짽0^wϞ^#uzW+9gbxd;dwt7 gwz!_)?sae!P^m{2LDlzS#E{.{cB؋ߩ>%KHوQ}Wx;I1:ړgHl@=<0‚{8n\+Z1ƍ;z2ȑ$KY .|,[$xP &{x.֫ K#͘3e4H(ҍ6qFIQ @P2âO$iEuǦ"J<6ڵlۺ} 7n+]jtH^G0Æ#ߧRU+K^= r8qPz :Ѥ=emfvXߞE=25sn<լ;'^? i",%)nFi|nڣb㧢:6JhV,k l;_$AʬjB/h1(jVnm~ .Z[k뙵an oKT{.d- p辧z1N.p? qOLq)Ơqp rN^\Q"$W4m s2L֌s:s-sBMt!LJ/t8#tROMuPWuZo]\ vbfv-U n w5@wvߍwzw~ xNxx/x?yONy'| 8B 'Nz馟zꪯz뮿{N{ߎ{{|; Cp/|?}OO}_}o}~O~柏~꯯HAOߏ p,*p lJp~;PK*0q"[[PK4HwE OEBPS/img/adf_collectionicon.gifIGIF89a434656767878:9:;:;<;<>=>A?ACACCBCFDFGEGHGHKIKLJLNLNPOPQOQTRTUTUXWYZXZ^\^_]_cacdbdhfhigimjmnlnqorsqsvtvyvy{x{{y{~{~|}𠠤!,434656767878:9:;:;<;<>=>A?ACACCBCFDFGEGHGHKIKLJLNLNPOPQOQTRTUTUXWYZXZ^\^_]_cacdbdhfhigimjmnlnqorsqsvtvyvy{x{{y{~{~|}𠠤H@;ta/\XbQ F 5<1$3Tl00q̐-x8'ˠN0JH'tpӠN:H!|pԁ NvÅ $D'˷o߳:;PK";׻PK4HwEOEBPS/img/adf_cpx.pngPNG  IHDR_6 sRGBgAMA a cHRMz&u0`:pQ<IDATx^͏G/.Ad P 3ż(@Pd. ~PT,`eEDoE}JWRD]R 32217s?v<#Ianf9ncn= @@ h@i@ fU0 @qXj"ygG;@6@ U CzanܭBUvNUN$#jm*q꭪*OsJ@ G N$]/'L)p㈤F6>j#ٍpwLu pT4 @"PO$uE/KĹL#nE6sCݮy#*e6msWW ˘uKmvvNfYI{JIRo!t@IH"dKݥ  K۲>S?I`emQE$I|97/spI#ؚ 9?3:i@ !0t<{D2^?@$# ar);J2#D$}m:z>{D+w*H|- 89@ P@1%HQHVׯ la(2MFcI|_$$%IdHFYȍ,B @"PO$Že~i~Hz4HIk=2ZGHzOx=YϐD2/dN'( (#0\6,#&9Vߧgs^;H$ b뿾(^>'9QE$F2nqN ?^9c@ "KBq}ӖQV#=  hi-B5"S  "9 zh @s9v>L@ $HN @#"yӁ@ 0  @ 8Hct @L$-@ 1 0  "9 zh @s9v>L@ $HN @#"yӁ@ 0  @ 8Hct @L$-@ 1 0  "9 zh @s9v>L@ $HN @#"yӁ@ 0  @ 8Hct @L$-@ 1 0  "9 zh @s9v>L@ $̇H>V$S;{~SJP>U~>(zG[4u,OӖϣoS.aeST-?symV?XLXoD=׿FQUMlԶ{ب@.mYd8@K^Qh{5'UڄcHmj/"{1]]6]31=F MiySdY,7o[>#%;7(aƲyW[zLO[6`Uib?SLq>jytBDN$~ҸΉTRRNfpoAZ<9 4@&S  j/b$<xj#Kku&nE,:zımcKߤ$eCcn>M:?$sW8hfj/ #KBe`X6XZ|"^%=IxD265qia,$2^lBT7G6`V%oi`6)Yߡar.~x9_B\e[ǟ)dH1vEi9±㏗E;<+6~q]~%<֊q(;*l:}~Ucus]йwHUlw7&9D6*y=blt>\ڎɗil:gM*99)dHʫs]so AR!3i ߗMmK?A7!N[y?`Uw#IIvfCCeM~qZ/zVqRm8x:8bV1q5'cOޖEȮfU> l)Dj|c˝ EMm1ŹkjTL{̝$/CU^\|E榆olά]\;TU+_*ҖgEQjF5Jγ/lcB UG$! !GPSR4[7mi'kd'"kIF(6m"ɳ߸'eQGH%@(ZxQ_c D2"kd%S":Gdȳ'-x!vJ8ʋ|Wcbcnj/dQe[R,+2^®Ttj$|e5B$Uիiv.Mh*$wܺD׭r]ptlu<]6pI&h G2l{}ni@{q;xH~e+@]qa\^ 1XReb9q[rtyϗ [L^ HSX6X 2c2Jx|ch']6@1E-B&BXw$FΑ\6L~2xI2W7$ U7s#F_DC/mB`PAAV36O:U|1eۨBLMt!3n`sԑ:P֌Wk^op bB$ۈ6JJ:Փ`urMư6>-Ց!=0UA$Gwνn aXV}8H {_k_19W=8R\y W.Ρx,'@ }$)D4ccȄ_"^ {0P_-4ꗖ CxK69ICdNFsoΑ$a̕N}~JЩ.eCy7:t[NdKiUU/S7;Bcc|Gt縜$OfJ$倂@`Y,!SLZ'FX̤r[{yl#[|̥\.%&X&1=Lt-W IF.̹E@tɟ+}lY]F.3nJ'J\O$'4%Y[S u̍H~S?? tٸ;{cN6T#;DJI$CK.[]n|-3Qɺǁ@F$?KVքHtȗԎX1@ @c`.DrII9@ BD\ @=@$= @\!"y c@  a@ p1@ 1@Dx@ #ѩ "Hp "(XS=n16ͧO@jOYO/ooю#pD EªjLxE'tϪbDX埮hRzﮂ{?4toX_]KVw?gJe 0A 72" l<76x˳zMyy6J9U7ۈ!|+4`OK* |zvld1f 4%[c^/_Ab>>Z2/hI=ޑi₾q!C$>}ŕ4U;pA1b`hL$ @l430>fdXP;:G$_xgp@ݖ:0?uM$x:oSj/ DY D$XӱxyPqb:8I$wiizKɁ`K/iD3sWOI|8 qV TI;Α,7ظV^x3˜}k.=SSم:xD^ػ|n~s 10%uSEy}=\c+7r 0A 'Hư?xxЍ{CqP9^>M6^s0bf>1܁{[1A"I<؞ɺ]@c #Lެ삜p^>;G$խUɕM$t,Tee 0A t7HN|eYFS{D=wKA$\1E LHf H2n3D؇ɶnE?1XzfYl8_#obŸ1K tH* @, ((#pvvF:99Q ڋ5P_/~g+ sqNOO ڑȣ#C"'+&Z]UJ7Y g%gzHͯg`7?!yz$?NUz;8wTT^UY&[f?4=ZDRLJctIX IIS8&/dǰ$m,B )uBm:*8tH$?L&;j\O$oP4M/Uw217T;Cqa'!oMkWnSc# RIm&Nm[&K{yNIM³Aj}J)ujG\{t@Xl ]>"9Ln/:-\LIMKwuxxhH?)l316l'7]$޺-0ߎi);$j)?NNZ29y<+[tH麭㙯5mq E+gM6K$id<2f'{3C^#|un2Ycw$29ad}Q!/6i.FF~S\v6~It Č"(xsxKw6f8thyt"imzRnI/o٤R zҤu ʬثf"e^đ(|&_]6#$LȨ}a{.A,D6^-'|ȷc匘V۔y\ LS`]O}.*\x㙻I-UU{oPqey{+~ yw.r~%D+PЍt9BNv8Qd ]ѷ/ HS"OyWa!,ɚDzScR%'E;$1LY>´-r_4[:G$HzȆl$-i CC9A2%{<%iY V##yK6X ѩ ^FgkorS%A#RqpEhi;5d {!KD:DžMl(KQƾze"gtl{Zf+a-*KZL@\ Ce'p8RWgꃡyqT~EN'VǕ߿?0}j{g׿dz~`[`UhnJXUҖ9!X-*1a+mȭ3C$W 򇖴H"t_D_/#U3fU=.\=>t=}9VgoﵺUȋʥ Coq&^6}=G|E)/b.!yd\b-һ2"qkH~ޒC~*p|WTOw-m$g):I$DF@_H߃Pkwcۄ;8 )W.li`uH^(|4:2[a\爍FݮK1XFH!C.d,mHf8f(.3(&k|/M`ǂHp$ɐz\–۶x6{T?{u^\7SϏB,GXP?jGylhHWֶ;:zi|c%O90(ckD~7ꫯRO>U}z䉷0u1f0]iƾb,W~FD/V'9 t!y{{B?}2,6 Fz :ޒ$7Vҙǫ΁}=?%1?dV q -1rȑqGg6'?6Nl#}6+˗~cPxq7l*7뱴D%.84K=m} ]ZLgbyƉEbtoyqIOg/_|>SC"?CHzx4Gv}~8ԓ}ҍYX'|H/. 0HMO>D}>PG$Slγg҃ٹ^{yz>{5M$_S00V>.m:.km`q" _TE!c$s|b11@YHP#}zǏջeG ,^ tH:@,<^@A e*l@  3EYIz^NN'3@@y@ NOO N} @`tH-A(6' h "<IܸL$ڃݞߤۯ~U O*o`4m[94:c*i"I{^D1/ CItH"ꏩMD^=7d)ݣ{LMi}כ[m+^1T7/!i"/<ԵH"c"@D/kӒ6vL9$Őcy&ͬZ۶$@H]( \3T[bYK&ljIp@[@mmnsl˷5٤;d-m 24nr;e>{LT9n~tw' ٦@pG mHL%qvRփJGzps[!et(_dL!FJeCm聜߸H/yDIY,dgL']kӶ =[>~.0#(:XH-;~Ĕ b9Z#Ik@w$4M%2dM7CҴu șmQ{G0n貜̱~,m&'z4-YtxHh''-HtOI"{ݮ7DZq,ҏle2FdHq$J(dc#1:LLfZ2cc߉ 1Jc =er"os1tcĖԔ{H1^YuA6Y]?`Q3#PF21\//SNž.⠰:uHcB5|2e*@=:/"jU, ߿«z,+~1ڸpx|ssՓ:%Yʌ˺fl'HHsT> պv}wx=N}k::_޸wE}ѧ7RZ77zϛ'Hl./C]|/0bYcHp[oɁ;z1]=mqfˌ٘>{Vu=w \`͔%,ʥ?AL_ju2 7cz>:rz[M;PJW.Vokumc|u;WS9b1lT%?%NQgDrTlԎj=@[}}nwW;R;)?zzjsфc$0R?%mLv>Og0XpD҃5D"W_O>L=y[d:[6]3)[4iG0nzem-?KmXO)} t3Z.$ooOcubrB1rtZhs-2|c!y]q*o!F6Nc0` u=&\\U:VӮNt,,Ɖ]8Vw=V".uGt6⇞&_/B}駆D~ϧûX+/8ԓxҍôDR>r~}Rǀ[ '|>c{#gϮ1(wAγ;i"zGg9αq}цʞf+zu4e鎕$tu0@ =( $G_=~X\v<`y@'$@<X8@$%P @D~@Ce%v5>Z zJ^ ? <' @ɡ~4ܑHzAw @~pj}TEȴ$:YIB[ 0#Hl$r2jq]w:{Zj뼋IMfwɖtmt5`Z1kjuH^S݇=!ZXIi\^qqNuP$"FL$HzT&ȳ=io俉%KME|6KiK5ߧ퍞nef`0w4@lVGi%'OLm"|Yie"|)~L397'7U KkJ?)u1KY6ɹp#IF~yfMgH+]}(~Odնm-K]Ev񲐝ڨme=Q)IA3>ΘOK>:yf( g);#!ZvHMwy^fŒ8;Ing#}"%瞗Q K˛ztw]&}]fSf[6ƪ[.$t" ''))dB']kӶssEѵdE8:@d1oP|e1&z-/ ~9ƛ$ߗiP.$⡉!qQDR#;EK^LX9#-iɉt:FDnG4'IUq x:O>2uXDtA"i:߶H'۴v)&67 ~eW(ci17% qVH#~c0JYq_HM\tI"9`hh]6$Lݼ?Rz_a=85rL].rNe<"0tXR;ӇA;-Xߵ>>e:3;ZҦ{#)mt['m=]eU}~^@ynw_:|]l) "p}d1=M 4xc D 44mzrk_iSٸ8Zῠ5[v7_Q=oqU/O2$b^^{4|=xԮ>NKB[dtmg^;J*w=?Vݬ_QG`0m߹3b+8iܥ2q?]Чߙ03E}KW`,h9t׸l6_^dȍO[}[ٖxoSO@E{^s?VG\`u3-t dvrӕڭo}=ǥu6X|t9qw=ía(%]3/)o4-9vb2OW,>bxsbYwHóyKƖ]9q+k#2T{{j[}?vP]qtϢXTm k?Yn% wpEGLjڎcG_>=?+>IoW_}>}>3o!hSSnn͎oleӌ_;zt۬=u7>elXn׃H.$ooOcbrBt&WJ:r;7VҙǫEյ\ [xbYc6Y\1JUs1D%.84K=M>wՅ 6VޤoY :Nb48QH4|4 gsxUEOg+~l"_~/ԧ~jH~I9;?^yKC=!.hfײ$;{QAS0j 쯿ڐ?\}'?V|z<"9k;=. ;kCgFk8EtY~?sQ]~EF'$] eB!D~GW?VG$؇s1x1I"/V@vhvE7 @ I0@ DD1XPe%s5g = J@`H}@T pzzjPԛ^N>$I/(wn@ <6Ro7O4! "D$y6vqHzuȏ?آ@W%lΞKO*oh4m[5vӸ=_蔬4.^Img]KK'.2D""Sd{No7وx"ySEy=weZ͸T3Yi=ѓ{-*NQc-SNI}Ѡ=&\&/ "|Yie"|37$ț*ct޶-m7I6Ppu[5Goe-'n[{uHnhol}g/!Ezh۹5)u/4_~^%htF/|OY%̎ ]O2e,Hڣ]6vmzޟ$Nz@Ybh{5_ryYC/rɠܽ2~?Dt3cN*yƖ lοWOd=,xBv\/t˭ݵ6m+`sbK;+xA"ni8]8Rdu8V1bۥ|cK$`iC#pqQD(v-wTGx?qR/P$WdSFV-7'xrJli #IDq{oӒ%1PEQLi2BڑHYJv̫dȨ}l;%џ!$U}TF͉0#F8/g.ӭ# K6FDc]LԷ_q(p6 e$#VJe6ݮ2#=;K$DٱO_m,/cil)\f$vÙDrْbYn5<d e TI=?ocʽ`i;qMLkc%ȴF3n2Fcr.@ceyǂ-e]5%۲I"9`NUdSwn{RƱc#.w0)sKX'#ӕڭodc1 M>7@sw3j?U|2WSAy}VOuMc,=A7Rx'ZP+v=fvt{vj/ߡ/Gg wzLk/0(b4uv8E1P9p.wO$=XC$oQ_}zԓ'OUM=v53M3F:vW~FD)7[6>%B>V.+&'8qao0\)dd{K XyHg^W9ƿ]6ו"}Cah|Xqes?{f_6y_5=`evH޸ԥfƉ]4nTNò͇wՅȱ6u@_c IcΦWD"K_O?Ԑ?#Cx}]X<eҍNuM0[v`1ﺝ$^vgϼVAZ n)믿6$?W||{=HڟϞ]WKPzg 3ƴw^D5scb]_dQ]Tׅ!&7Ǿqe]I"IWb`c~H"}zǏջeG ,^ tH. @4z @9@ X@$Dd%t_ =I@`H}@T pzzjPP^N>%I/(wn@ <6{2RjKy @  "ɳˍD+?~ zOh:vqfIڽII%4*mv3bAMgQh:>&tBcAK 9HlDWLo"B&DDΣ{t7ʴv}kPo~`_뤋 gyi귂@XQH:@L"|Yie"|u$J! I$ mK9d\n&mt,%nB4YB^}'?Qr}vmMJ݋΃;3mYQguU#{iYe#i6ީyK,QQG۫sRxMF2~?DLt3c"N"mG:B-jCr#wc,ﯞzX8=% r/vڴq _, ̮LݠDPwn8i3AL*O f_w$;M 1#"as$=:.Hvt8Xrh*eF OSznԳh}=D$!6-i]o eɷ5Yu @F). 1ˌdǼ:LLfZac߉, J}ם =2h9fȷ9e1t;)CWicKN$96舦#jPF21|V/vU\DBDț2")_X:RHW;UA JG/)$b눥`I%@F/$ GtD(IBaT$ek}2TZެ#m|LGlD |Ud+2c=ʽ`i;am$uPF_ b\8;DR!+Ό$H]ퟩjT~M=h{gSՓ~O}z\6KZoe:}n%pb.?MFS<Ng=WxUt%P/Ʀnw_:][/ߘn]>Ϙ\˹e煘-=^)kWW |E5 :o|EuLo)ηv8bbnK]NƑ:Ts=?Vښ݁e-MևkC]~{#+Q-rcIofImu4:P?.$`@ bHp[ouM1]=mi-]O@eEl<{{= vF&f\tv[? z,C|u: rwSO<񖿎7ײ1V6dA-S=u7>RnHl|^K҅ }\VLNߣ=>3,6 F+%loi+U@K_?.벸\h099YQE,}7;I$o\RҍCsxD. #9cu,9TGoW`̖1lz=M$/T_|O =",Mw_c?V>oDٻtcD'ԝ|I"ey'|b1_矫O>D}>PG$gGϞ]WKPzg 3w^D5scb]_(]Tׅ$JN[鎯$tu0@ =( $G_=~X\v<`y@'dg@ h )@`\@$E@ p<X\e%]xc =J@`H}@T pzzjPP^N>%I/(wn@ <6p{wS@= "<IܸL$nSgΞ$K,Tth2r6vcڹBIӲFҎ7m"S41/$NdYbh{5_ryYC"/ɠM]&^{F0eVJeCm?[.HxX8=9Yi|^[kmsNh| {;os@M\v\W?3,q C&`Q։*h 7'FT rl7I/]"IID #<Ҡv!_ԟ%SQkFI'7#zxN7%냲D9Aēigx,M@`JHl۴v)Dg\1iH?,12Rec2KyelOD7/Y#/#Ě{w"?C6K"tgcCH0bɦr#d3bV,XjB0G]cڕ@y[nw_ƴqmil~cEt>cz: nA>c"^6}uW;\CJ0c#7N Vmk1ׅ T,*ms `*/5cz՝zDrp@k;ZV-Ceߢ&Sr=&K}$׃>^ɾXz2]ex-=pH{q҄7}=#gC8q,+`,fMEkr6/mk2ƒvǩ-sgc=?Eў׽z| ^\7Sgc%,ʥNNLWju2 z|C|l9 rw~ۍԎkJigL*G;Y]CSl)ttB1,R[^k;[ѧgq0u {""|ꫯӧOg}10pK_!O>{yDr־z캺Xz 2|k<[ =&wtv+m:ehw"{wQ]Z͆NI: C裏￯?~}]H.;`0~耺@D "ɳˍD+P~7Vpf))ʛ.z-1gZ6C{z4Y؞;M$i\E5ұH'Z5Wa~DZm#FL$Hz T&" ^5N$oH4^k&I7;(Z&B qIP]#S䪾hwvhw}N˶6@T#@D/kӒ6vLOo\@Jɻ!!DTyْB$uGt֘njvJ"٦N!"IJLM[&Zۖ mhB^mÖokI&sGel<'ʉ'i7v.քYRgS ' ۜ):jyj"γZ%ڏ+%e`#i^ZvHMwy^Œ8;aog#=`%瞗5,bB˛ .CDτ1)EU-jCr#=pzJґz_ni[qԍ- CS>usikOyƿ2*JOoW׿Z3I68 hFv9$>;ذD&pC0uHm&g cH>4dB= Vurd˅ c#g1t$'0[EG$=dަ%mM!01NO.B٫oܽNnd:,(ߌedN5=o ̼靍PaenDm}Ny9#n6%Cc|cr;3D }!V+CөDܒl)Aȭ_Ulyg|7;,$R3<]{:hF.J$kUYJ,/kdOgaHZBgb9H`~k7Oh}hBD2MޤQb}"uH.f٪ȖƲ.T&A"-g^{[d}uebz6{"1'UhFyhF0˜z'ƥ-;qfpf@,!}[yDr83uP ~T=ЯǠޙr}z[׻y?\~b94rzx:jY/*-GeVG mcs,fWВ6IOiL:1_-WwYqW}6z}Q/̿t}4Z-;?toyjNYkWTifK*H62O!|jb*>$bWTOzRc[m]̟$"#uߩƿ`wluL`ֵE4aY3u]Hjy}*Rm~tbt4M_ZXɓm񘛭[%3ƛ/_ƗG9_Ys~0l/=\㖳E>ozl1nWM[z,2e6V=?hў׽^)1 aLyNY,s>0pD҃5D"W_O>L=y[K;[^c.[}mV~FD2&M_NHl]K҅ }l\VLN9:bsߜ[+%lo +uuo1 C.O+[Tn4˸* /bbe !=} 8y8I"yRnû…cu0(4+=o^'Ya9svt6⇞&_/B}駆D~M]zy4ʻjg>nҍ$:wHZeŃ pK_!O>{yDr<{v]],=@Y w-9ۆyM;:;q6tWv]ƺ tɖI"IWb`c~H"}zǏջeG ,^ tHa5 F9o^ Ʌp@ @Ϡ13EYIz?{rCOҫ' D"9/Ԧ D ݾ 0OM$chG[L9=9n-%C$F.7.Ik[ę}k=cZO*oh4}lifno\54}'3z2ؚb t!'{fS[{@p"鲑.I$^2տPwɛ*;AݼZ}WsZ]-| K'^ؽꝧ&& Գ 䩮˶t,4mkAG"UDPKtFN/g= PB$_֦%mmH/+$LƀIM1:_8[$׿]]mfgN$wzMΖXfljIu]&DDȒ\"e܋Mr?4W5&w/'OP?/׺>Vm1Y JΪ[D/YE%?aBIҲFҎ7m"S4/$NzYbO.(^|yS`.C⡗AbSf[6t-?RwDLNh ''<^f/ rkwMۊ'j4b> `dBľt7YP1;yDċG k 4\)e9F0%Dn(+'2at-N$yJ$S?VNDεN[:1# QsHOAFuMakKzCI"{ݮ7E$Y$t~ej(Sdy#Qd:LLfZdsc߉ aJQԝ =02dƶ'ʍ|[q^Έiy&,˖(]S |%~<'dcB U㟲eg$w.y25INn5Y3^Isq҇gȘW1HZ2-3 rSF C92V VLͲ,_Hy o^@N*"d)ö!ރʝN~Fe}5SA6ObD؟GCPmץ~CF3lۑsf]& g 7K$#6dI)NpCD#}!dgO s}_6guQ_v}.9}Nԇ7mn^@R=-m[ʉa% s sRP}g10z-iӽ6DyJOU6]Ue=^ s@zy?VkKc- GӔk94FU;c"^6}=|E5RGb|SG.yDA3æW 3u~^n/fW"&}K6 /|/bXl/=\㖳|i{]!7>lUo}W[z2ev.M=}=~y{&X]r9>͔1%,ʥNNLWju2 zxClrz[M;PJWO496b/Ա6K_gHf?>#iTĞ81DrTlԎ^5Lʩ[z^Y;V+ޒH+aܵ}</thru~6WjzSdgg-;Fu2v&>gk/x~;Y?> %=` oF}Wӧ>SO<Ύ7X;V6UŒZ~oS~豞ScbuBB`nɼJ'sY19!vxưܷJI'#[beC:xULHQ{Ycuu e.y0{z>{5M$_S09V>/Ey ѭm;C:LCqlE1$s|b11@YH~?$ȏ>Hwp#/:I$0 x @H @, ER"pvvfc冞$W 0O@$>d *8==5Dr_M/'wA} @`tHm7)mF1nFUf-{Vz@XHl$r2:qNw:{j܈IMf/-,_Mr-&v'LL\Cd)߮@$Ʊm`scpw$ʉLeqImqN,A2c匘t%$t?/{c^e.C\&^d$=Ycw)[X}.N)<<=D$!6-i]o #IH2iH?25)WDʼq̑(IBR2X^n_&F^FF-a2DETDvƆ?D&IN|[?VΈiy&CZ veLi>c.&GbR#5 ?+Fȍ/B<ƈR&5%v;?rրI"0\ e#&t#&6宝?%cNrC"c.;Zn_h rYI}ٞv.hBrDGNUhdbͨ#dvHfBH^I^2]t2q*abD%\Qt3. 1@[!f>a/6 -m0␞{`YY,B}WdfdĆ,!.H2]#;I$Ñ?SW ˆG?U+3̱}Ynڜ+E}Qlۿq::R^ߴuzK~}o)'_UK60s{oe101@%m7Hu"_q.dy??t=}cut}4ZQUH$%W@M__Qp +mG2ߔz3zfTG|y~7~ }~4ny;c7_ xX8^?.wHԁ~}_r/=V[`%vun֯p}Be`0 cAֿkgLkk_g2=\7[Qx{;XT-g}K `zޖ/qmh{{=6b vny.ay^W.trbR zL]g@sw3jUz-0ͱ!=u<c|Y*T?G2y~ YE1Faxlҫ.q<>VwHóyKƖ]9qPoIyv0^Cuq҉>Կmdw4:R??W+쁢ީ?2r賳#Cvzz~2| ֆ_v #^vgpD҃5D"W_O>L=y[:c[[.[4W1fK+kkq}O]ozOi f =%*]Hޞe>:bsߎ+%lPP+U1!YomÃaj%9?y/y$;1?G //\\ ͻe;DqrNxI"yRn&û…cuo+oҷ;'wiƐmgt `7 Fh,~ËΦWD"K_O?Ԑ?#z`//dԻtydva$4Nw 1kC"?s'?X}䬱}캺e\zg sw^D5sc ]_Njyڶ34VINI: C裏￯?~}]H.;v9]nIRz5DDrC6@SC$r~gHzAw @sn6g4oQevޒ@("<IܸL$N.Jn'iWi<Ѭe_i\.EsհDRJo9?d5>ڹs{(=% r^ݕ{wOk, HlDWoLo"2ڋFۉM}^{k؃zu=1nr!$| ië{#.P<54ʝSqZyۖ%ߤ:|۫cbj.%"͟] PB$_֦%mmH/+$L $ /-@nTW=# 4e$RgK,k8q9SNI"WD\(뗿\\↮ꛠc^"3hm)}t:0)?Wd)++tw-QkY\/׹ `PLAb_`H,e%e39K䴐Ʊm k9.m簏I"7/:'Rqi אܵ3.E o_&m4q02P$YJ:X6ug^Ni$H]ퟩFPeC#؃S,7mԕ뢾(wd\s8|o:SޥzV[>޷/սuY˷ \zp̥?->*?MFS<Ņ&=9WٸwU{xx%P]O/eqX]캶4y1"p}d1=MCcT-=&I)kW;\CJ*u(7y䲞GD=3l|U\tv[.7ρ.8gՔ1 ?t LG`cCzx("LkU~6dg:G2^~|iTĞP1׏ѝ$jes`ާvtRebWNu+k#2T{{j[R}?vP]qt#oۻ%Mn {w6eP1 ~BNoOO"l?> %=` oF}Wӧ>SO<ʎ7yV6UŒZ~oS~豞ScbuBecZO.$ooOcbrBxaoNF\tu񪘐xf205#<—W<[/}H}<ҷ6zgnβ>=QlD\S=^wH޸ԥfpX=ʛ-뎫#Ɖ]41s]M6_u𢧳?t6/R}O?5$?$bdz1rxu=?C=.ham(~Xf=:I$]Nw 1kC"?s'?X}䬱}캺Xz2[k<[ =&wtv+mz"<^Tֶׅ!8MEXuH9>1X,$HG}}czDr}8$=@4z@9@ X@$DLQVew|^s60Гj  <чl @HK>"r6@nmFmѦM] vkйHl$r2:)]L/ۊ]Fޗɖf/f94;M$u\(*NڊuDxLYn>+Sz@`p"鲑.I$^1տ&l|M',}ɪöxta{O҇xT<^l6|ؿ<>o{s }i"zA!8B2uɦqQAuT՞$Md7Ǩ"|Yie"|3.IpBDT2A-Gd 6PM/ob_shPIN6^ *0DnX^Zn֏{Yڛ+~[[*.x;t<ԏ#<')٪l3{DNxmt&$naɱ2 ɦrP@FR_Jvheo45(Z%_n_ N:b#~iYe#i6ީyK$g'G7[RxMm aCÐn9d/vWhlPjt߸H#&'j ''^Fɷ[kmcv០?fd=Gvl֣Ñg_p̄e-o!2˂vW`߶X|n2s%qn־9$?ˑD&n8F@Gr9!aDH+gD%9Q#ٮ^O)ChQ%[9$0z%tbrvd1s/"6z O ?f]H:"'`,W\ǐ>œr=$ʬQf]..eY 9ؑy&6`g:E291cD2T?43 tB@#:rXH Sd1kg!b"|!jy$OX6rie}2S&;=ޖ$/w"k-aȷB|RIsi<3_~ᑠXDRƪNW^KN佋좋H)m-I"9`hh]6DLݼ?Rz_a=85rL].rNe<ɗͭ3K;9bum 0Fv@d?W]9>Gٻz-iӽ6D9q>.dy >~_Υ:\\) "p}d1=M 4Nx \D 44mzrk_iSA |t벞GQ3yQ_i`,N{%?Ώ]濰ϋ'W0J9ιy$N5^{4|iI`H;vGIݽj]#>\P<> 3uVkY{KV l'm4حs]]H3oYR`lbat}EcAt_{-gt>wezz,^:s9>͔1%,ʥNNLWju2 zxClrz[M;PJWO4{96VOGڜ#:.ݩ1#v1?-alϽqXbv~!ϙoyI"yV6}jGG/[uT-APouv0^Cuq҉>Կmdw4:~~Y˖d/\>)rÂluc1L js?GbpzB:%؟eR^Q_8Z۱}?}:{W|f'!7ߨJ=}T}gɓ'b>rtʦv閩W~FD2&L_NH7s?E'sY19=:c*bsߎ+%loْ+U3븿9ls6dX\|99fbRbTvE#a;P\¶\ `qW"$7.)uơYi9{.\8Vw&}˺9qzlDeikp 웆7l<^t6⇞&_/B}駆D~NUz`/ Nz2]y!_hq'|{_矫O>D}>PG$g߳gպ^{œ3m4|MXhCC8u󸺡]1NI: C裏￯?~}]H.;#I/(wn@ <6 m8)mvd4KNOG_ǁhI]n\&^O?6q=:5NgO'kl,-Яiz=[ryYCʼ/ɠȽ2~?Dt '{v'㼜j!嶗 ٫R<8#2xF1%.<2y:R[u,oWxJ7>Ag$yWDt#B&YF3o_G$c18uIN %yf8[ǑFl9wa9@ C9y8# ~6ejb|ɖI/˦zk.TA$_f ~:WtaX z~O]Q{bUcU:-7%abfX[") ##NpC5|pS@nc{g_.o]p$ :2KGioY1L.%oS֙Y _ޡ081@%m7Hub>뉰߿Z1fS]O/f=7[D3f)rB7V oyCNCӦ(w6UaZ0&3 dWEˍ'!7ߨJ=}T}gɓ'Z>ݒ uʦ7= ԥ6z'hbuBeZ.$ooOcbrBюo\)dd7Vҙǫg/|됽4wJ\ave/f"RAxDcŏi!=_}#<wH޸ԥfpX=~/ʧ :N'͢mژ9G z:^COg/_|>SC"?CHvxxu=׼^kbm9+9m=ۻtcax,mN52^&^ūv G `p^b-e׆D~O>Q{Yuu;\mCgFk8E\Qq,KCYues$s|b11@YH~?$ȏ>Hwp#/:I$[?`"@@5z@9@ X@$ s@DrC$@ e"l@  @e@Dr@ 0@$:D @`\/ @9@ X@$ s@DrC$@ e"l@  @e@Dr@ 0@$:D @`\/ @9@ X@$ s@DrC$@ e"l@  @e@Dr@ 0@$:D @`\/ @9@ X@$ s@DrC$@ e"l@  @e@Dr@ 0@$:D @`\/ @9@ X@$ s@DrC$@ e"l@  @e@Dr@ 0@$ Uguє{ @C}<ld̑궚 -HA$He>z%0r6n8 J/+J@܈˗O~D2Dґ񙚻Gjd bNDu[A$[ 8,Tg%ib0'vYM.!ZY6m e9$ PM62k6JҵY]Ĵ\tЉ/{Wѝ@$&:%샲@t I"O/>R۫DVQ$o֒|--;Fx2/YY"Y,fU~dN,C/653qu>bB$ۄKW~8Ƚ|?۴}\֜@ J̍H6zd+sʄ"{D@eD`.Drv@ƳlJ KN$Ϗ#a)@ f\Q b1@ t;B$g͖! @}@$= @\ "y. #@ > c@ p.<n@ h1E@ 8H 7H @dG @ @$υa$@ GD}L#@  0eF2ۀX`@$9P  d J4<;;Sb1PIs1G tH*|b1(b$9@ #:G$GS0@ E 8'y@HiWUU=89In78'c #>#';+2 D$71vm@JSarԾQ/ X!D$˜C뷶|~y@0?]ф&/멞r8`f dD266^c+xiJ'{}uOz|'u]ٌW^)Gt3V7X*"/^ ` Ɉ@ ,J TIKIחxEWE7ݔS0T i_XfE$y+LqBNfb`V1PVk̘.m1zS"81=Z/ @n{ SǕߡ(+ L b[1@DjlԺ&oLAyC1v+.p_"w ǃ-}& 8fq2Al^1L$wii|JC DL+!;9"9M|LzTP;&1н "Çu{;~xF o c-{qgӈI"b1b #e<b9MTbsD9eb "qHh" b10D`M%@q] Ĉ$|0;k`}^cDDD1x HĜW#ӸQ}db1{ئ6Awn@ۿ)|b1(b__1.bn@ #J5u-j? @$$I痧BJOIcG]%HRV}\vrɉ&;jЉ-XZ[iŶ[uNQFP)`zne2OnSmgRIm& ["mrq̨mAvLMYm%=MyfNȪSd백IJLsHL IW@J)uK°1%"9,k ˜8u( &NR{PfURG`gwgHzY K$G3Yz/+,Y)C7$]i d79[6Ԇfmy\f+?qcr"a,/vڴª!b^`g'֧1R#}(޲X|3F}(1:bOc[F}!Iln z"X$4Yu ʬQHw%H[lGH" ]aD^FFn c߉0ѩےHq"ɗ|[?VΈiMi˘wŀKqOEoǐ~}|b_/F;0hW(G챇v6oדwD6yߎex$[X%ߑDRAH4"CV?E.;[=xԾV%f$G"nGZ_ G}h am Oɦv !䈎|,[lt瑼@%Q,ǵTdc|mt;* Z)+BK۩q c Y"'l"gdCXr5!_?U`ָLL~um^l %_eD+:,yPf:QGrL]Cg] a㙺UhnJ.1,%)rBZ$UNo#Ke2R/X*"I#?]D_N[~͹7U-m[eT21F+g3Xl?INؖ(&yQg$2~AsHM)D9Q=5)HF >'̜#cKd2 `0Tz_/^S?RT'I~ vG$+[FXmցŵ%ևq#2.+SE P=^򑋑*\=?ֱeqʫcPb=,H6~!?3Ov}_`HF/-3RaށWKNhDVr>aө4 &lH6ΧƆ8e>fbDUMӳ*1zňdmtSX\emc祇(~m؉fye/vֲ{ W6hV2PQv\|7ǽWԎd9k$?PkғeZYG9UG^M^%>,)LWۼ>b1q6I kybЋ1߿!_xzwvn"h<w˒E_t ٹhO?I?wՅ }M ڇ>:qz.%OFO?޸h }~ Ex|\lAׅ}, ^>CH)J>Ԁ~PNɷneHaϫ9A6SESb`1I"I#'O )lv@ N?d @:I$D鯢|2KH8 %D"ڏ[[rm@ @c@$C`'a{AK0ifUڶfČ5qsB`ܽݶlJ ƕ3'X&ptkK&~][U?M0>cXJ"ǽl3juM&"/^1uDR̰N䓈_$l˱N@-1׊d ư% aҾӋ^I mG#;S+`s> T}f\o_3I{mk{OB^ 6T׶-m7 R$}.(,$ƉIuEn 0jz9`WlzZՏkƐECBYUi+fi[RIy$D$+6eĎoo ;Eb]QT#U[6(@[m) a",3.+[zY m?AuB+⠼4av~E~GN^C8=V|;–t7#DfLv^BmO?o;;={aM)}2=M&C̉⸉=$ڰn4lݘ> ۝~T̢:i<^Y, 'g{.x=) cT-ga]e]MH -xJ6R;GGʔ վ/Z(?WozϬM&B:z;Y]t 9{{B.%Tklires`tY=-c2w=x㢢Cnk`Y 3ZsfD]BtZ@5҂ ou9x,z kNɷneHaϫ DrAfR!w)|b10$ɓ'6P; @L@'N^e2@ $D"otvWQT^pd$ @I"ro_-_D,6< @tip-ػr'7 Kk[8o\_Vk}#^U6=!6LPujQ7im)p)SS"}\:Ea-fNtM_:}^4Xs=$Z)Q}F9{C9gRqwy&: vRdMN[X]:URɿKϻg&BY͸ΌKڲTD^V-mOJ82 sbFva mNl :"2ʆvk4q#g\_ζiȯQ[XR'{#XKY6/.̇KE$=v"qlMzfaǷHˆj;2ںj;z 7dg b/[We AO3-MgsϷ)`, iyKFXnW2/oNkR"SaNo;-6X濘g(^|y-Չc)ޞ&O3>s""*n ɱ6l:nYUw㢘?Ф/]Nf+tS1;81YmCX7Jc#bD$u?_DÇm vGM?$J˷HWMoyI*yuIJ)"/ۃN4=oAEFwv(;aF|[/orFmJXJ]H]}ϜUbHmKr3{g1*S΃.ҕ&bDKGGcg'M,6-a\P'_q![-ǑQC^=^w"?C`vg'kGfuKI_ʵrMX9#N'83bGR&6r݅CkNxJ~cIź V[qߣA 4:_-\<ό^(&eS'3:|ⷤy _xsY ,HMqwM_2% 'ZI#SVo@1%U"κ ""C9 R% .sJ䢎I9^@ 1pY87"˓d]{L,OW^uW0@*h{ 07DRocgN%QpX\4;r^uC| ޖH宿6#T"ɳz,,OD%mR"8YK$I$1HٔkoxMtVɐ,޲+daĢGclL Œ %A$"q%z05|p3u(X~>"xcZ=Z*tRwg-s8fR%ks\xrKOSI7K~yzX:1nҗn]:5]칓an-]L]v\\"&䞓Gܤ[ޏdF~- #[u8Z{Dli;a*YH]kGK$#|vB$>(*m̚ wŋ`Lևjp@gYmT[={}11Fj7`0:3ut5:pCe;''Gm׷33ƛ'9;p)wSl aXWDn7¬ҵO}$U##"bٗw1!c%,CI/%/#}j[ O4h1dU}_`4+dE.0T.ad*]JUC=`bՒJө -2Z)˰Q^6w(K$lGceb_tn|(& t1>*GC/ё2e+C/泳V=fCOH:12Q%]uBdO?iû…cu4VxD. :º-O|Y"yoD㍋B }~ Ex|M3J+}Ytm9Sg*k"N~91?&tHu-C ~^}UOOS)@`|w `@ 2:I$i~!M?@ #I"绿SCL @@'$H>]~b!G!|dmԕOQt 1u~*3yZ~o7OUO=K';#M-Qb]盛5z}MΛ|kع9"tO$GjbI1s[R|sjK ˯(T-m[eLo-=F~o3,ۚ$ %6L(3r?dS (6H["^anϏ vo/UO^$2CL~] uuzC58 3R\6{_~ў׽Xz#0zrL:`rΡﲝ`[cmzO]qe8Ք)0,+"aV`ڧ>*‘|c!G,"n?X󰭈h֜7ɬ~/%/#}j[˵ Ū/0_K~mhj>4!tz}U7HelYԸpŪ%[/-{DS֍Ro!~f]0&XO@~4>-_mb;J6R;GGʔ վ/Z(?WozϬM&B:z;Y]t 9{{B.%Tklyres`tY=-M3 r81?Y~:I$ߺ!M?*ڞ<@LN Y@'$O<1 @`r:I$|w(? @v$$I痧,##N @tH{k?bom z$- @`r@$'ǰäaʥN*ogl钮cY5=ǖTB,U.8+,&cNOT'y]o]J"ǽl3OD0N+)M$/E l7Cu*EkeM}؋ܼEM:uK8"59P^:=󍻚WGfGG$}m@TR%@.KE$/=Ike6mcɛ0c wym>i]e\]C4y*m*דYտ%8ؤvevlg Q$Ж*eSpUO9j|$Y3ݖm"I{;Hz m-bVƷ3j_N".$^r mWU|7Ԇ>[i ;w! *B"e+d2N~oh1sD/Wr|K.<_}+^,lf[.ںvmC ;R[Ljest&m~ɝof,c^"eC~{#7DMrG\?#@ %;u=β+1v`t>ȗ+ }O\fGšcL 3QDRP FԺF\6zW]Aۏ؛|# D"-!1y†83w%r'F+{]Wڔ)O ke.3o{X#;I% N}lW'\Gb]?*Jeݮ:Jw&cLUlI CQ`ԏ3PU"[x}ncM.hpvD(I[BRTډۂxrIvs임xt d1Wdm3Wa)Ѕd"] |dW9u$9H%rdy1g_{o=~L%<&ВnݱȚH2>>cdOd*$Lx:A$l4'm s׵%LZ +zq;F)#Y"sbm"F;[me Y֌6D #uLgOՃ0;/M3u庨/];ٞ;y\H::LHg]pK%:Sd\3_P%Y]W^nԇVT{> Ƚ4*t1 ʳkQ?KE$H"Svv Y[NX~Dț䪖 P"]uD2#hQfj#˞JIH.!Lr">v{;#N'}KEqb_m yEeb[Z֏.Ťu^xc?SoyH`H;[>%vu={fhѯхʬ}t:,aNS~2]9>_i'ՕXx>9_BLaK[ۯygylLaǿx9}q.ίEb)|yS2X2;_1dU}?lM` 2W=xU[C$s uO,Zvp:WÄ2J2ktN_@] ; X5>b>K6>K\zŴw F,[_'7`c9>[a-K\cK+/MY+k#2T{{j{Haܵ$>Yjt4Yfjs?'{Pٿ󋠝Z哒\w;_ֱv=>sa7&(`cx++ksiQ? TX:ub"N]ҕ?tA7%#O?cu±{xՏv.l>qzIطӬ;6 eY"yoD㍋B }~ ExI%Ɣ+Ytm<#^5OƼ[|Y˖|c~PtNɷneHaϫ9o w},cDF'ORC@ 09$;uo{?@ @;tHm_EQ{e‘l'p @ :K$Dʽ}|=CD@ 09 cXaW۰w%dRy`>dKtڮ98%Km7z]qxtI띞$Od9u)SS<ȶdWp"yϴFw3UBظe77Wuc^bu/oҹ[?u96 hTأ{alW>Ѝ_|,U3.٭ۣ; ;[}KkTRHq0{؈:sA`_3I{m٦mǝI]^K1z]e\]LqKr/q"іXN^s,ߕ D2q Ф>n~\e;KZ%YXC4vc"lEp?mp)Ԧ~Mb u!TDR3I{o'I/omvvne-2ڥm٨ML:ےmyq'hEb/ ;RV?I-|ɭ Ov~)^Lm[?V'2P EvR,=dPbo‘! ]~e6,Kjm`t>ȗ+ }Gp$9y)y.4$*3яFE]6zW]DAxxo6t:] Ee{[Bb cv!9s@dt}KItkrFmJX\D]+3uq{i{ğ3T ]U~mQnέPrxOR~νeSu"O "a祘oCrGԏ3PP"[x}nHdvZ1m# N8fHq R}qޯG^TKl}?C?ȧy DRN*vB.g2&Y]f`/Ш:V" K;.SA9&ko3c@ܑA5ucd/13DR|USH'$6</e] #w9Hd$y&ko@\%^('OK2~Hp+Tt dX`kJN2!,eB H[C4W]d֑T")1J dgRɿަ{$VU#J$yVOEňH2*>czV\낤bHٔkqA Z&dD]ƓX:oHhgK.K#/F^o c7'T:99QH]6yS`8T؃S,7mԕ뢾(wd{r"0!w-gxLq|A}d>t|_zٺQZS}, $|ӕ$<S(y|H=Dq`I-=ŗ_\vA ]Ҡ뷎HƖco#Ďme[s$eO%\T5/!Lr">v{;#'}KY Ns\^n*2'LlKp,f025o/^Xmohb4R)?"4RtvGIݽj]Y38 "Zkt2}_4 `Ӕ~GWIu%vWP;S}+}Y#}?`<^8vNߪXm8RI2ڧeȤ;aU}_-Gљ{b9/_b҅yKU2_{`aղө4}K:W*7`#t[CaQB]!L5<9Pԙ%[6R++CwV%ۑ9:RGxkI6}>mG/բh693N~gNA;ͅ'%w"c|12{}NgoLQJ{1ǁWWNяg"|@$;8YtJ.ݏ%]1 ʞR~R)û…cuЫ+O:]|xD. oYwl&DߨmvhD +JRYiAϙ.:xD̽yq  en?(|NɷneHaϫ9o w},cDF'ORC@ 09$;uo{?@ @;tHm_EQ{e‘l'p @ :K$Dʽ}|=CD@ 09 cXawEaR'7 m[o\fٮiR7nSgư֌Jk;.V]2_wMkt]J"ǽl3oND^-LRԛH^Ixu#mŦ|uꍔIO{҄,wi*w:aY(gUpzW!-_%uvutӆ RɿKϻg&BYMΨ#!UtzM"/UƬmK9drIpT;?ˋ@ݤNč&q,]AiU?hC_엲&!߬iGۅegN"۾mmvvƍ˰[$eKx /87dCmQ۸Cc6CTEh_e/X0=AOP]Nb639 A%IcmcWimp] J" )Yo{#{=xNEݗ7YP84? 1GBr [.׻ .194};8E'3_rco-a37EK u:kүo KcME9 s;$\Vs< 1C臝Wim)9efVdǼ:1(&tH&_y~זl]HNdY;zۡ ZN6m}K{H1t{x_Esl`ɉ0޸ &nBq2gx]W)1VFPЄZthV|,tU"gXHx N\#o9jC˿3JKGZBЧIJ:'|)5c匘0sD鿔 $}ȿ`I?jcbq,'| wI~mDRơme$c h=Bȁ,7q|Pf d]2$2I7ugCI.}!\f-JEFRf]tU&X2Hm̶ãc2u1P)eSzFto_"MH~G2H$2s%Q Hb>kHV0$1HTk6A/6XW# ")q"p-iDz05|p3u(X~>"xcZ=Z*tRwg-s8ˆD 蒵9SW -CƎ &YyٮS_FI~%;|qq%<|< E%<1SfVrl_,~'O;=V.p'wiй8޳V؁re <|:I$ߺ!M?*Ȅ5hw},cD'ORC@ 09$;uo{?@ @;tHm_EQ{e‘l'p @ :K$Dʽ}|=CD@ 09 cXaW۰ %M'7 sl.e'Ie̺}؞~#^1#/5=!6LPujQ_d׵b̮O>'D{)٦ZU'"CbK0:]#O[=l Xȗ_?u1bIh|cIzfuB>i'} dcN|oq[ 7PrA}TDPlIU'!vf$ ӕ&*cVfˢI{R_Fv_ƉIuEɮ:,kuWlzZ՟:kC#rINd)uV/H{&i$"YE1#v| v|D]$/v[."OLjCƝlU"}`d 0R/Ve AOtl>oKB\v^`xoXNږB'nOzyeoxUfVӜo8[6^FeyN͗7ْ;qi}ŷtnHaCqKsqiLgӏO"dKBYnMS1d*AYmC1TKg@|})v1;1.y6eH'­򜛃%[s4i&]z*3,C}M9i"XP'_qUqdԐW{^W]>%D/[~fΖ?"2w,#?GX~dc(S^GRK.JBq鰒l."ma g "\ #sK, O(ꕲ]Ͳ j3z ["_p e$y*OdR;I1Tub^Wjq"G\$fbXd,b.j)y) !"r ٻ͂PV[O1dMuD2}(x0H r7.b6bXCY̎1d?q~T=ɉ>8Uޙy,zyct<1r{Nrb}rB9e%ks\xrKOSI7K~yzX:1nҗnPIcV!BBM}Yi.vSTD$?OmW,a&{7y‡zi;ed[]oY{#c,mo7H6g$n;k5+k^K9>6,[ dhbfuҁ =lOgwtR|V6FMa ׇ1q.8p \~cX;deN~%!#8cP|q772VCԗ!jϹ  h\@bvTd I O?)|pX=<08QKAυDߨmvhDjvziAϙtmv3uW]<-o5Gx ZtHu-C ~^}U}gYN Y@'$O<1 @`r:I$|w(? @v$$I痧,##N @tH{k?bom z$- @`r@$'ǰC˲#;ʛ9/[ftf^v뗦pQVLBLtV«N'MSq XJ"ǽl3x$d[Ǥ73fUl\ʇ^>N|6 m~C`\r5n;⸼5'{> 2roz٩u{W -%^),LID˼[$nm2`/ÎoXi/զC儳ز1zѫo6Vw6cr"a MmWeV[]QOLj+-%v |V]myv7*6v6%*c5f7bKhFv9+]uY" {9mFVnNyIzJM&v9yL>K:.ϔdg[kj3}!t5C"`YT);'`"Q+Dd{ qADN֎PA?˷&w[dT5k;K D"22j'zs ɉH/kzG;UN5'F+gĴڦ4! l }&3/q. 8ft*$7ڝqs15+'f8CĽqD.qEM2鏗;#u}"1Ivt!j`Vaө|>yv>Nɉ$Ōvh@H&ri@6'8z$e MMء@ZKդ,ϫ?e#H$=?wmIrS U'U߸bUiaGj< ]tD32f76aY&ֻ?6|#rq('hl^qgD2FdJQ)[d)I2M[cԬ*YkIےl@< "9sH]*"tߪ{$L<#ȚHjN$ $:jI$)"6XP6-5A$3}h"á:99QH]+G~o]p$uMc.ldlyz_,pã7/>1X*"IDq#K5|iST/m7\~V-E,׺,FN%fKƦm0F~ȫ%9^&2ЩdEa(+72%P\9"pN)fst9?7:R @xB vGԽ|0Tz_lP L:`}ovm>?E?ԗ{ )LǢra'c0C[m1b6\#e+9LRI2ڧOa}kW͑9:RGC2T/b>,3;|QnSg~?JdelB;f31١M]s哠N* Vw+=OE_?;  Gjb@,NPe|4pX=Ɖ]oεӧο'o\TbۭX-+RSƟckق3#-:Hj3~u2(KOY!U1?(|A[1Ɍ[72W_^ۘoXZ;0@ f$4 |$-F$|k m?7?|ꐿpMbx! :7H2s0^.#^=G$ I`yu ->Lƾ a `SC3frFLmJͤzz|7 %_ _a7VIC9Aw>ϏX(ar*^SbRh-"dđG$9ۙrF@K/}WݳȸycRq[Av2Ω`1N$ y 7Crޕx>>i-Px)dp/@ ̳v:{Ĺzlbb*;e \5isr y^@hlby.CU&NlB!1E)#56UzжB=lZN3pa4#Ř)Ǣ.%$ "4λ/X0j{mA<-q.#ig2+W HH~B=lZn_^CIظ~25]n[Ɉ XӼc/KE$r{[U}d*Y=Ie'JmR"^)2q BYIn= u65% _`i[r2rXFWy$LS\;ye]a]Ʉw1p.sn~T=9/M3u庨/];ٞ;y`$Iđڎ,&#n4^NX~sPi4],e e$Xșo3,$qħyFR.G Zd"/F6#Z@_.e]V6{C~#JOk(}. ܮSG d$&hh}XxB jxD{#;-"h#u@l`wT{~챾>"EF*:0܏)?S[Y> 9\u<\ .xİ >"lXJ")_F^ԶgA`B+}rX?l#*CBR,[Jfҥ^L~½? t*/M3|Wwh%-)x:& c4;{`~6և9?@^{;'pOXJ u~\c˰+/M%+k#2T{{j[R#u?vP]qd'oNjPzMn ;UGF}vֲcd{ɖ ]{s7'eY\ .+!+g11O*sxX]pzc)}Nջ4HJYז}3)SgӿQ{7.* 1?,u*l|".=gF$'וg+& Tpt0ͳ~Py@'[72W_^  w)|b10$ɓ'6P; @L@'N^e2@ $D"otvWQT^pd$ @I"ro_-_Dp @L{I]^^\}.-b#-c6nH='[Hq;>;L^u*N$Oٮo*= 'Z;R=Bp\&m#.PMK$^Cg؃ZMJvC6{]?|QVm~@CH_z=6ڝmV[}bg&zM0@#ꥴ]: g$P'UgI#yhKI|9v'.'m IIZH7kHjsmw035, =]WK,G֯UR;-hnX*")dz4q/[[/Îo(+x 0uaVv/EFIN~v~F@#K؊ ː(t0[F^I y e$ ?ɕzWЏY638H( MpYl/Uy /KF.sZ&N!1:1,I0_&d=CXv15B%$ "90;.S*")Hp)גsϳb{J#Kr+2oavBeb,cZCkx"!;B @ "MH~G Y㙥(Q*&AK Id({3fC-tۻHfݯ?YY gc a #-yA4hKViN_ O^"##/U}%Z*deFF|UudVEM(`&Đ 9RF"Rދ%N *J{. c"n"zG}/'lDy` x݃xv(Y/{[\<~FQk+Pϕ;}p!Y^I\km{vHvחޣ#e>7obTDRT#˺ɟW8xkRQ낖9)2CE$Xެ{@ hO@tP;+JMP/f(\U6`T9A0$u>Æ#3g% _;=qww'ݞY{4k8vu"hCT˿{0,*w| 9{l*"Zպ2>i9AOsv+LOد)fgƅл/G ^p,{헌dXJ"_F}j[ҳ˵Qʩ+@l_%܃ ɥX E瑶Tta :0)\zK>ΰ.pOlE<=S`??T?der=R[mGliWȦzS~Y'z,^JKי`yu+nooɶX]XbFܜ宝{BEU02|?q%:*|۫n^l~Աn)[vc\+O/ej\xyCPɊo19 HN΂512Ĥz8Nζnh67 ע:ꉕ8KdN@tٖc$ee ia*"u|HDDڂS#u?ʧC1"9f~PKhIDAT~yy)` f I$=פpckksmbv>F`*\\\>iBIuG>??פpC#0#0@sHy83"aF`Fh$D;nEG9"َF`F`H*skK[H=Z #0#0@sH60I]^hZk&2ɖq1vzIp)"anI$_w3L/!*sFFM&"]y ۽yi"<| 1&s%.vsjukTo"uǼ E7# X#0*KE$Tf\&$HO M/}KiȍMuz&a#KE2'e'q~~he &P2X;DR2DxS !3Mi>i>* oj(w-"TDTd"ENg#K(]v(B3\IZG|]nXÂJYEMʉMëيTT:g5EԉaD+a_O8 iF$ rG{.N+( OADMYǽ\8=y()ѡSrdC+{d"RQʄ~}C@=e]mDoԷ]O6^Mbw10D^ӓ5Xb2RBs$ W'E$E3-wO:OAѩ2$ H$]J֏b`Yz|1 Pe"@VD)]#?|!g09Lk vX|KHH )Vi@}yɱ[G]3D>Rn>HL!eH&qSȨċI,&͘`2ƽW0$Ȑ(Bfz"qc ̲5I4i D?e SڋHY*~/Na.Az21"aji;2tLy/{4nHBL.RU])%XE."hNE<(}JA2b7~\ぢHDLSxiD.sKRɿj"GH¨&8%Q~ԔHRѫ̘(׺&Ir4ٔXNڥC+*m- Esmbĺt '/׮=(xcxL"jO"?XN N} _1aM-mQZI*"9&+7U#V:abOEUD/G ZaD2&O. 0~+_Fj]G qzGl`"9]68no2www퉝OnW(6oNe{j˻ârͧؐƁ"^\*:nΩ7d^?1H?gtgXg!{> W w!^6Tp {폌tXJ"_F}j[ңP/~.VhI0YKAFH]`)/KNV˦/p Npi-{D/ƶPp,G-L BM6`e#\#Q#6#[1<}2;Ѧq k ud[FlPqOz˦Cs#nNrN=ou@m8B>UPs/Ont?_7- }j\xyCPɊ'<L$[ ޺ysW=p\mg[z74kQr\JO]]yc%2'Yjo :_ulK1m{زkq㴰DgGOo{_ :uR$שWf"zmAϩˆ_1ޥqBjy\`>DsM G=8\M{ #Ņ1``,$T7sM G=T;0#0#4G`!G?ï;#*F`F`vXH"H QT>~z)#8KaF`F`a"8_Թ+8Hp0#0#4Gds C M欅6o+slyj154Oϣ.TysuZqp,%(Ӗ}̾$_w3L`DMzQM7,IDms+I<\ۥ&]s8^d3>hn:%0.v2$(f(ˮǂJ'rbG #J"X>6bG`t=*׶"6mCD" `jM+`͖qH}Su94ok~\r5m\sv%v뱀H~Rzs* qbd6a!TDTS괈 xaS$tt0jTTT*;s=!oM&?n0HЋh}W}"]Oh1R<[Qj:،'=}f}_څi )_F< ^vR;~MD$c#kedE"̢gݦIx괂DDڔuKMNCjb<ym{F^ uL6dO`l Y{jlxm~.=ծN(٠yWNط}̦^jH+?;RU 4s!31e7aTՋ$ל0L$W*=Y&TtfbILzK"A^nHg']?&w |W$0Az;~HE*" Țևdb`)7ǚ1TBBl6" .5Xyd+caR~IC1V|.@^C&|CxKTy뒈9BbjcȽ$\GMtRxr.BP.m~v&c>Fb>hhEb?xl'Ŀ`qs2cƖȾ^0y[0#:x#)dA>2LLv2O?>!?\ؒ"fr!0RW90d;H/G4Q{.rGa)!R9& 0 yAG1!o]m_i oK7c X{S2_aۘ?fя"jO"?X&2;O.] '/oL-m-:9"9\FY@lYW1O4 O l %HTLE^6Hň/THeQej̒>`[AtM NA鉻;ڃ$OCqEІͩ,Omy`XTڽr80r=UDuQeV|rt95]?UMtsX( vF]_Ragbv㕲_5bd1$0.[hS>B/7$e٧e8zS~}xo;FMpɥX ޓEO"Yg_5. O$a@K_jɟ8,fXTZnj;`+"]Ќ'3J񖍫py=̕Xzvzt/m[W'v|оGDWVlȓ-_]վ8>UoIy(onI?^ɿ'T]t^#ȷ '_[#ϝlU2׍'mΩ wjA۠되ދ퓺[[Nhoz>Sf_J/5ʢL$?B#bO")ZWG=GWW^XyIֹW"&2fˮeqm[X"y3q'/JH:G)+JW>)=F$ hC5c"|z~@_{x`!zlmmqc,`fŅ1``,$TsM G=T;0#0#4G`!G?ï;#*F`F`vXH"H QT>~z)#8KaF`F`a"8_Թ+8Hp0#0#4Gds C M_m޵ {m$0W2 FqDE}x,L"pu6/z1 o?`8uӱd[N^%7ՍO6H3ұT%qIbe(Zv>X)=*m",{&U""E\:-));0gkO,!9U>*zK4.t|cփ) a0:B\}-a:DZGvKn"q?^^I`,?95qzA8.%AZX:O.#Ϯ?F#C[H;1-ؔŽx\k@ȲMSjUGdwqHE\Ou)_Wqjlp4 yi&I)қ>|=NJ|tHIIc'诼*! ^=Z?<ۇ)/Gw˝tTc4ف׊"}E?I2;#d}Ek0ݛW "V#6GTG^tDRMn#.t<^!nS6#teX0$b@#*H#;.RifH-K6Ѫd !%tѦIvd: fܳ*J \~)aA&~A̮V47xER:",4֖H&q&ӝ "g/LD EB"(DdFHD$Irp$KZh0NHȦm_EHN|$-ϽH~ {$G!0"9RrDDeDP$-!r:ULHl*S׋Q G!8h+Esm(MuffJv/}1 D?O:⻟~}-]maSrܼuΑ=\X޾8n*=<ߍ1KE$՞HEj; Y>|G-eI/A0^ze Z‘1*"9&ܳ+:NGKb+"ð4Uc.vlCiD2 l~*mc"Yr[Gɡ8vݝ %A7οq`^JۥSWtUo)t(onI_ʼn~{{]V5t$|u}X;ٖQ3ܗ#nYھ.sʓŋ㞇cIHpwhlw/*?Vyދ"Y^\|;LɘV?As2TLF{I^yMa c>>0MXH"nzvaF`Fh榳F`F`&0leF`F#D>0#0@H6A2#0#GhMEIENDB`PKnfPK4HwE"OEBPS/img/deploy_mds_repos_win.gif7UGIF89aX{/1c/1k?Bs_GJ{nssns{v{s~{{!!))!)!))11911999/Z6k?k6s?sBJBBJJJRBBJJJRRZRZkckckcks{/kNRVZGcNk_c_{fkfknknsv{G{v{~{/'/_vn~v____~ƞ)!))119)c1B){k{B)999)1999BBBJJRB!J!J)R1J!R)R)Z)R1Z9c1BBJRZRcss{ZBcJkBkJkRsRsZ{Z{cc{cck͜BݭBs{RRƆƎΎΦ֦ޭ޵Ƶ޵羽սݽ圄奌奔ތƵ!,X1/VÇ@ Hŋ3jȱǏ CIɓ(S\ɲ˗0cʜIb8rpX#5fZ&0 "EVbXjʵׯ`ÊKٳhӪ]˶۷pʝKݻxN-2$L xU+`Yǐ#KL+D2k9ϠCMӨS^ͺװc˾< ڸs.̛H.q8:+_μУs>NzuسkνOӫ_Ͼ˟Oy<ȃq@3v"/'lI&(mӦVK / 7G,15Ӊ4l "|P 4Å:"sl8 &<I%$+H%\/?/cM< @`-ds&h > 2 j42TC,Ϡׂ)xِG.>tGB)0`M6\dĸ> 08ךC־.Sn'W&{b#|ӦC[8P5" ?{N;3P>"cC H@yޖ)B8zuAD].DSb`'b\w7AnNPJ>^)05a[Ї4d iCP3}&*q?kӕ,@?<`p%ӎ p#l oäp1L8S&= k8xe 8.w@L"HN&;PLe(Q@-!*a "M˔}5z`RqTP {+XSY5Vq'h=WNt9TMڢ:jMWҘδ7N{Ӡu_C$8 1bq(CK6e@B XXBZB42 ==Ojc'=;0j=}miwζa|Jmw{ noMzO@uCebЀ%8p TR>ŷۓ)hn(OW0gDہ|( 뵴{e}G|7zcӧ~47W[XϺַuAv@z8n90oM񊣧9A|uO=<@48h0`3 jM9Go~OW& ?ځ TO΁nXv,ç{hZp&1OOO_(Ͽ8Xxh@-Ѐ4N-0 $A$P}r}؁ "8$X&x(*,؂.0284X6x8:#YA 7DXFxHJL؄NPITXVxXZ\؅^`b8dXfxhiSl؆npr8tXvxox#`NB(8XxD؈xXxn|臈8XxȊȉH牥x׊¨XxmH}،8XxTڸȌ8ልx蘎jȍ؎tH8x؏?X9لx Ɏ9yو  Y9$Y_ȑ(),ْh0&4+8(<ٓ YHDFyHM@K Hp`SwxYL]ل[Iai>Yf@YH{Жnٖ`0tpwI@uh^i[9HHhby8Oɘ☑ysØwk)ot9xIv藝RɋZ ٛșv虛ٖP 0six sȚٚ Y ڹÝ)㕷ٝ׹ߙ 9iؙ)9)ɞIɞ ڠ tK)9 ɜJ)z)٢/*J543Z:z=ʢ?ڢci5?1@ʟRjZI P)C1:*joڦlDj,C4iL:B*kj2 iZ蹢٦k SʅU: 0 ^ʡb:"ڗ$*yڪn:iڪJA>zjj9zrJjJ zyڬΚP n P*#H& ~ʣ9jZ򪪯ʦ*ʫJʬzSҺPs [`氱@#j.qj(ꙠKJEj6[z- ۲(%ʨ%k p8cత ʜ;;Y皪\ybe[j˛L:OS jYk +ac@+bikm:Ou@w{y䰵ezط`L듋ۆ븑[wY*{CXˆc P{ 䰼˵f!;ӻK TK0ɜK{b0ۼ K+иzk廼 ۵۾|;) a ʠ 뼜 ~<hKw |yH{* hܺj l{;SQ0ܿ+<,F|Wƻŋ8<%KXG{ L><ɀ U̷Wj\\X{<ʐ e|Ƴk0 |alw\`@^~ ">$^&~(*,.02> 8:~>@B>D޻=^HJLI~NR>T^V6.W\^M`>d^f~i)hln{\p>t^vj~z|ߝ~>~ 뇅芾N>~敞^>^ꨞ~Α^붮Y~뺾rwȞʾ>e>qHH~~ގ֞Km.AN?emly9.mK? _.MwX /Z^ .ύ_p ,:Nh5o'DH\?/o8/GV& Tb/YOXc._xۈjrOvڈzo./;ĎxhJOo?ֽ;?XwhqmhSOu/VNφ_/ƈʿQoϏ/__OoO؏OoQO@DhB 6LPB R0cF-:ŐMDRJ-]SL5męSN=}tI\D˃<Q"Ñ#%NzdV >ꕫH!Kxu TmݾW\uśW^}X`… L0*KF*e$NjRRƬ5͗6<#PҥMFZj֭]xe! lgd3|oΔCE[r͝?]:M*i_bb*vkxaՎ߱O_|;zO @$@DP6r;P$LB /0 ݂ ԱyY^?9dG&Y_ 6یӎ-9fgfO.X[!O hrzhҼi:jsqGW~7SRZ雼 id[Vh;nu ZeUNZlh?pUV%q{ |R?wmٙ15|u Zuw|k}vc߽%wesx^u?G>Cggg;]<pouyiaisG|W_wݿw?Ox7鮶7nzƛ~_{V '-u$:0TLLW@DO#\ 7Bp !}W+qs`QhƯz"4W8E(=!kc1Ώ hF`@!9Ʊs#:rd^8H?cxH:̑d$%9IJVҒd&5INvғe(E9JRb8CІ#PD.rl!oIH]*e#oBӐDf2Lf6әτf49TjQ?\tCCry.{Y_3& )u3449OzӞg>IMnsd6ֱHoB! oUhD!:Q.ԡhBЃ^BCQԤ'EiJURԥ/iLe:SԦ7iNu~r㟫 $*sGEjRT6թOjT:Փ°i(lTkX:VլgEkRSf%!Bn#kwk^Wկl`;XְElbX6ֱld%׫Z@j+ZTmhE;ZҖִ˵zMmlI@UmngWַZ7n׸-o\6Wyus;]HAonvdj׻Up])W׼]λ^)ko|;po׿/y4>>T9K=0!iBo"hRAšTxêQ=|as)a!'FM<#]$lqu\%]*H?ɏ"Tm\gʖM Ng2qWx5qwyE>[ fDeW&R$ye>s7yu{vhrGGzҕt79q1̲.ҽuw_{iuQ}Bo*vo{yNvp͚}u@|?x 2ɴFk>Q^~8/Oxw;Ӥh"nz5xc?{ǽ-X>HvJxw+>!J|1jї~}[Ͼs?~fۦCcxwV L@\@Q4+  73 5@ DDܓL#Z>L:"4I2,$ܜL M KԬ4M M1?YN42ԴC3ID'2L4|?TNrN%Nܤ$dO ON:OtOdN?.NLLM%:0DЩTO,Ϊt2H۠lP ;Q ;D\Ŀ,5U!T3}. Uǯ# '-5$5%Q(mL ,R(0/@15S^$<5=d7579 9;;=5=??AA%C]4=EDeT0FxHT՘TԚJK䐉TNNmOe6ES NU]ՙ`UXGLXU H pVXVh (i k Pfni `V0S=̨ՒHW j5Uso}7Y%5xUwHc%~ UdURׅXaȈ؉؊׉\ XWXXpr5֎ՆՌTW{ȍ]YqWY=xWs%xurYb qXR n]Z֒}cZZiZփ3Z)iٮ5P%^+ڑL۶DD0u۹ ۻ%۽Uۿ5 ܹS5EUŵX(\}|8n\\eoC.F͕9%]}@\l ]]M٥ԝu؅\]͏-^M^ez@^]^9Gƅ F=^ ʭDkB<4ކCA'tE \E۾ľ[ _u |48AU`;`-MT8_I `ޝ{9@5=a>= Na?F@=S8a8TaB_=_Va)DHDn? >^C(,A9(f/9Ia0C2&cL.^`6c% 7`btޥc[.d&&ڣV1`Cfb3FBߌ[dc1~Ccd nbK+7c·|WY~eX[Z堹e[eY`a&b6cFdVe~en^]hfZi\fmncvfifhopgeq^g`k6xyftwf_NvlVgqgugz&z>^^\grvh.艦s`gnfirgy^Nv|8|jibifUVvA&^jVꦆjn(yfaf>j\kVjjFjykvk>BF= ¦k`k`algyl]jq6b1lD*\l^19Ԯj>umaYD/ aޗrns6imNnvA熖lmN@so.o>hbv'7GWO)'ac*n o[ ge WpDE'?7q@EqVxѾpWgnpqEh;n.r`= _rOm|rr)rV+)/*_q.,wpp1T/E0q"Gs3Ue4p786sFs6C$@t2sC?qDpE\FAq+Iwtt׽=:tMQ7LOqStTRHwu8uНWWuguQuuuZm`?_]dgSeaf_SgjhOabcv)-.Bvpv$0wn/w''O wwww(wz_w*ow{wwKw/wwt?x5/x_Lx=Pxox9ʋ7v^xylo?sI_tԍsytyYyyNyy?ɝ?uoIvGI?y6w_?z/ɮzȱ'4W{wcO{r{m{h_|c#G|^SſwV/[]lt||}q7G_}e#XO֗}`K}y]}`~ݷ}?O~_~}?~~~V+e~[g~o~ʏ~V~Ei?OK_;k~.cz,h „ 2l!Ĉ'Rh"ƌ7r#Ȑ"=R1X\DC}Oi&Μ:w'Р=i$0ʖ/c)ԨRRjjH&D%L2 rj,ڴjײm;CJ6[-޼zֲeJ/Ċ3n6p\_m2̚7s乆v.m4j?7$LeղgӮm#k2+P‡7h•o9t;:ڷC5ޱ/oYcx:X%]wdewݙmߌAoymi xgizf9斀z(c":^F9"ZjtRz)lz:*Bʧ*q6gu:+$h٭{Bj':[,::,Z2Z({.&+>AJ;/$/j/A/)@0ף030[#^q1N+mԆ|r#7첩2k 3r9#xs:ϛ<4yA}*7H;OK]-Sk\[{u ^_M[g][kZoYsۍYwX" Jv{ W[U~8䏅]ah~7Ƒk~&oZ7 :hХĦ::rϱV'eX;#+okVn/?F8٧7Cڋ/c?>黟6>̦.׿By ~,@)pkNoT/H jw>B؉p+ I~n,Ԝ _k~2$!T/|7 aAzؾ"!AĄA1êhab[,]gB1f<#Ө5n|#(9ұv#=~# )A CLGJp,$)YAK^&it$:e'IYB|%,c)YҲ%.sFNzҔ2Db#}yA$ ,0džLc*sd3Mxh"p5ɿlj~ s+9tRo\;Yxw퀉OlJr? Ѐs=A΄* H,tX4#()bT%Y*/X裤&>Rҕ.})Lc*ӔdHOjҙ>iM?Z?=*RTa1EM*T ӂu7SUR,TVÊԮ2uNŪVUjzNֹo=ZKJ׽Nw]YSWvv+\)2jZǖ5N5d';ժ`3Wv!hfYZ- mfVҲClQ`+Y٪}-fQ SԷ'VJ\|,Wf*v"_*6IUnj ޥt]vϛTNwUV+ߕWߟذ}ZƔ" ȃ]<Q8qR 0)]X$1#a 1KlKXYqV#qMp,gb @v@y}q{< 2zٓ\n#9kNtߣB+SV:ֳ뎺.cL*ɮk]Wfzӽ,׽};nk2pkcu|/s/Ώ~ũk?o?  &. 6> FN V^ fn v @ Ơ ֠   !!&.!6~@.DV^!fn!v~!!!!!ơ!֡v,@,!  "!!""&"."#6#>"$F$N"%V%^"&f&n"'v'b@;PK&77PK4HwEOEBPS/img/queryquickvert.pnghPNG  IHDR5( pHYsttfxIIDATx}Pg_ CF7иєx9f¢ Q bAMrZgB,^\w!Xr eP4U/ 2:/c oQw$ߒkb]޺bYL4*v3Rsd +0.:=0.?. K.oE?)Aap ;3(4G'+rޓP.ceM}p:gPVK[uS¶bpb.j=+hV|uy>Q_:KP08j+fNDW 函L fkes3[SR?;ecGL-VRaE/_#.`\C3E]1111uUPU$UՓ8TI};Ti)Dn7\ȵ0])47VfVgSOo8mƘs)"L8.bPk: sroo ,#:HbD>'fWuirT=Jÿ_$"8?2b2Cm3Y`wꏔhHU(ȶdu9$]{);и@Tw0!ϠBU1ַWQhfv6e1T~4Z][H)116 0xc-ipOYv9( Q BT!*BC#kly!0lR$4D'ğ^qd"Di*ǧM5^|f-B*˯JKi[&R.?FbN/)%L>Zf.y 櫎_t*Ac32ěo4$={4559Zqܹ[nM$}7xf}`1,  *ǻ nQ&:':*گ~x\CD$4~ BT!*Bx,uQ߽լϿɋv9km7iɋ5wb;;W~%*ZyGŤ'!FD#bF"{Ӂ&Y/}gL%c?em#"Gk^+ueS7p3L.7g2S~?!2\QN"Ҷ]ˍF~XeDDFfc{zv޸^}V*H2axચ ^gV':cĈ7pO}x'8pCb-#*Ul,eDfdq)Oxy=8y?9kidF,U ֊kPચ Hd$d=۷drO7{>cKe?YI=="FTeDO-kgN~|kǟ"bqRL)Ե5}Z_=/<|uo6[ \z_€ C_`3 DDqڷWNor̓b-#*U)<Č1I2C*<2GWRt?ܬg51RKk3(pU} 1FQoOLثq]JC.wFt^/ x/E]2+LcIeuTFjrwn]Wtϓ~$AGWfh^Ȍܿ{w߻Kw7;N[># o~ʈ+񛡟36Y/ֿ޻όRkQp-y⣻?Ma}F (SDW *UM-eg=n~gg{Ƚzs*M}IdD"$)t=0%RQ.2A?{9"{ʓmZj⍚ઔSݨ}~_'GR{SnoWSN??ps~|H!W I=Դ7~~მXWo3 o3j@Q 9-Qaal_rluhrζY3*l<**=>۝?t +Wmͬ%yAvr5c)VlzŴ0Vl_n ӵZ-UWЂsiy>/?l\{^nnXwI_>G4QѼppe25~p|F˼+j̺S6"2 2׈zH2n4L{T|VPdnP+F]V8jn HfP5"ӹxJݶ^E2VUޭV RW-3(#jMsZ,~e$CFJ"**-)'tUvj+カk~CZuBq.19gyrb#Z|9v85bG EG:73}Պg1ԨZW:fP jGa$<_m %M>N•-0]huUeʙqe"3k&u򋍶_?j˹+SS󫚇 :n7JJ}m{cY˱8"Ū2.BV.RSE@L7vɔP-4ғK -se*0 xO Q BT!*B !D@Q BT!*B !D@Q BT!*B2ηcNIENDB`PKPK4HwEOEBPS/img/adf_accessor.pngPNG  IHDR jusRGBgAMA a cHRMz&u0`:pQ<IDATx^XU[ T9WW}P_9M[9 fA$䌠 * "s$'> P@Eе܆1Ƶ`9 9@ {}b…*=)1 +K/xP|φ2g}}}_|W_}1cƌIbF`>; "}JE#22X!"2S0#|NŦ"''g?zuuxPPUYJTޯ\Q^raKvW(^?];1쪘4v #0I@`BΛ&M-7'mq7B\ \5_\z.7anjS='2Ȳ/;,ýӋ>Ó=dF4 L賳QXX8iji)i*z\D)?CMU cHQ5]Yˤ%@|s(u0_I;ʞd8+o^Q/R׾|EET́ĝdF4 L蛛0/901V* Ӕm)ťPQV@1&KAq|-Y=/rIXe㧳P4t̞1C:_?Go$bd ;ANSHebLd0߄ɓ'CPPBBB`mm (**k+%)> I1 xWflOٚoQPX  729$$ecb ?ăF؞-مl;+(8=,6/u@5\#pXԭ'2ʘ2[ t6>;D[U" 7}uqR)_bBPLs^ 0+M-zzwԫ^cx X 1Wo)8Ԍ:@t&VӹKr o>_u>Elh \jq9n%u*Y*~W$#+YKE#߈F?e!يr?e&ϐv+H9>@6(Gt#Bω=v#?CiH;i ]w}^_+W^{5\.Vп.%'V@a{&TIh 2/ }~X\0}lB3[Q%Ryk8$`wZUVD7 Ȃ*\mF0Pd h:`X # =[uc"қ|>saS&x\o}^eJ 4]J`Q!N2Rt13c1۲-nCVK?cʰkؕ!{QbΞ ' =|3Zv JGۧv?&;77WDOg+:9,q'5t / ;IEvx l]KSӁv4W5Dkt(>DaY |R{!ێ򮇸ԀG)x˛pCMU\\ 6GT\ "p1 ԛ(OJ: EPnAcW? _Ў\m@l6=@4#z[qv N~5NzYAϫ (+Ŷ]шœ W#-R0Ǧ S+G@lȍHߗ϶޼2%>ń}Q{?-Z=~ŕzUznZ[[z'p3*yY赨);/ \< 1\'Ux{6$(A6yNjC^L DC?^҇Tא ['Qc^G(Hs фxu--E`?ZQv  N<+o5A]+.AͥCl9g pñm𠇃&#C}\ 6ɄIZ;2H*WJzMg+S9?y`?p"Χ/>w}Q.cVDQcU ËbkzF~tk{=#ljU;^Ƿc卹]hfta/jXؤt^b:2=uًz't̵ib̏L =Uw tS;wnnzdD㜳Pu _{ECCv V5{ fʍ }"/ uZZbi+B3:Y܈ (+S>NhAR@6_Dp1ԃoɘ&  }xڎ*hZdC.f|M8_NJ@o"G\8"$ 1͸唉EbјT͛kڂ,ƣWp5Au2I|6"mcj͋kÈ(zSt/D9߫,^ߣٛp~U,?VAT*ϝEZQWr1j$7QC=ץ\=ׯsN{;oRYسgKB?P܈0zHlCZC6Y- sp~/ q;/ $Y$ViX(J ,iW =N0?;Rhq~χx=W?=ّ_!c||/y,W PYP/ vmo`&f^mxӽz+=L1}>1Зጃc N>[ksտ||3; o=3cIb$ rQ@ι{TFH=(}C\+1z(jA[.#15=(n^»B8ت .4;Y{!>VzCBɫYpl۔&܎GPj#S~1ڟX:cO=4lq5É,fHJ=Ȧ6 -:O/aV G`?gp"^7-02E0=,;^)SC~ *xy:~lO oj+OBttT}oOtJm!=\߄` gN;f|}}yCKAAM<<RI9y?rr!$%G,7BJ2 ZXqY79(!D,L"ڻm%q!UB=sa6H% X)32J3M3Ḑ69tb:Q{gQtB:v_޾3`BVP1TW7wl١gIUQu}'i0CmZuO>4?fx*?_|pPhqai8  ص{v $[ c횵8$uK A>ɞ0sb<8o8MeIb*wפ? D_ ^^H5Իz|oT~`Lfċ^-CS i\r_÷z7z#S]7^ _/ab'4Ћe6̄~&K7_y'&&FFgn ]zz:Ҟgd]4$:+!j'^O@VM:׽?QYgfވ-zL@'bx7BSy[FƔdbNz/?' xV)ϧ |V{zӼ]DߡL_7o}.B_SSBǏTBO?/voq;șY#01|ii)_pN aF`>'zN'm?4@wwTNa2#0WTTsG<~ q?}`FLt|G[:::&]V]]<=c)鵐SY,٥R8$XY ʼn]/==&][qWR89~Z #8l ֐ٷ;o{V70#Aա/˭O6]\I 5VwPnGB|#R5! &7MH&cbhh\ǭ[TTOUt\o=1 =m=٣:0Q߃E[pG E#0#0 =-///ȥmeږJw9 Gu-u%&C"GauBūY7vq,Ò%Km.hZ{XCr6k6 vn``ъ'KX{o9%N#xRm?O_Mj3NsWH)vhao3$/Ea ՠ4v)-5!0V{pk]8qpId2#|&S 3InޣG( /ޫ^F)dw /a($yTm_#J&_ac 7@_<鎇) O~.+sf9\녱Q r;yCXl L%O`hu?㫯Ӑqo0ömz܋ sJ0ܳR6(G}c3Z[i3O59AlR1)H9I8c9|ܶևx`BfHiB2$9}04 utDP޹*Sn`F }RRzS`JK/ {;~Ep Kp.;w@Oώ_ݳ ilEPW Z^̿geR]LV TZ݄({K&dG@{Ly%%c>[D{21&jL&9ذQ 'vx~yqmƱ0pDpcYr3~uD,^ߌ&1o,X;" ,7x@zl=d\ڌ?t )œspr$&Ʃ8ik`hiAQAk'[_ G[Xߡ9p=iˉU<2GCqCJ3c?P[V`9=8 Ox<@ux?hDA_qt1:aT=v!fGCl8j/3}'+`6 x9ڟ*E~~7I};(T/d?͛_~F槡O|G7BV٘9s&Vo&zmGȉ%8 \ڊ9[q»=$IbBzX%lA4$[@݋=VYǕjf̘5pa#^E(fE{MG=2%Mz.dM:q:4CAa?ο~%GG͘n6YbF4 Lij n*s{)ssc`i{r`$j;q*o`b!)u0pkgt d:3G?Ԧ5B!++).@WB4!rȳ-wVW³qiU؎xҗӇEj*,|`oAfa%5wbi$Ü.I`%*3oAs L kidy;:KgJ1T+Dc4W@.L;jy"=P˅*4uCn1/=A:vn7 *X?.r7 6iRrq, M0~AV#0E@`BUܞ9 "&FhW.3x򢏁=8ji5=1t7⳰]*A`+l!rCl/|}}Kؿy?h=0z 5;eq5a鉋iw36ظ#Y 9 7 d!ez7=wBfZ\,A]D샩/n8yx]x;|qńlzGϡ)sY#>++o|TWT<҇ᰔ+hX# қa^c'{>4q)_EB?z1(:T5kZH&h"ҕkY/ڦ~^֮8 bNtCzxEnt2A^`z4 ]Aձ}z^{֬9S-+!^l26 9}{N:6`%K wy@_#0! 0gd)Guy{Ȧ˅rG.{q9-c`FTL9qWdSƱ`Fx&tKKKcuk*cFTLG?oF`J@`Bm\bbbh\?be0#0 }}}= 3ST aF`>zn^=7 )44mmc{F`F' 0onnDkjj0+ 9=z偗rS!O'mOAc8xԑV8y9ٰ0#6#!p'#'?O$pDyѧ},Wf KQPS3y+ɶw@= >V0Q? wT;`F =?MmԣwkG!,_eb & FYc~2Q8 ~(@֭s,UWDPU? S}%eB V#0L9zq<繕}}}WwnUWW.>Zadܜn&OJBn#(hR}KXY nCFϏ?Coy*A v`^5.( "Y.׹X^gi@#rBtBAvZ9 L`e0#L>==z["nw"~0+{.8$y~M3ta?˱b X)cj00Vu,]W ɶQaƧ"qlY :8}Z0fBV#0 LkkkY#q1dEw@P f.BTZMAie/ۀ BG_h?At$`")YW[Gp2Oav@zr;p(VN?KC=mbZwЅBv#0L<)..nJ\/ܹlxW)_/$tt {2'ȇ^[?jwu1OS=/Y9XrW-Q=]$1g>y#p冣"q,-to2ۮ KKRa0d`e0#U-?7,=ql<ݡ wCq;"zs7!ָ}ۗ\ƅڭ$$$ qXp/*08XHOo5YWn_ @Zc@AJGar o">>w#"wbJ1I_6;`Fxn ) =W@/F)rMMpZ.Wr]myW>}ʗ6BF`>??P)!!$+`F# 0q+,G F`FS 0׫G`6`FL`6 -{gws3#0J@`B{}W(|F`FS! 0秩 |?{ҏ~<}{A<}ԇqeNF`G@`B賲r%MÇxFPG )sq)Жn]rmk-x)N~︶\)8h'g҉<BbOMK {d1GO"`NrΩba G}Vvp§؊-ϚYӾ](}jDh@8=w`FLSSS>/9O|2iŃ$&&Y9SVV#"<() ܠ@;#IBfLN# <3׃4i!ޏH.Bc;*t~޸o{lw Y#z2(iSoנ(3TfD4JO OۋM(ԎȡcQϨuv&hģtLHb3iKb9<դ j& )wJ+ly\DqLJ^b :h`q[o’ݺLC;"w(kC_>+`F]L=U-?R]]?~<+x6 yal;,^rؼS/sQ](BG4׍ĺ{,Tr*$uKj x<@5 YUkVǟw*+ N?e8bxӓK*PчZbwƂB(K.¬owPZZB'hC|Ï- XjCt;##4A"AyU";bn~ĴdiX.Ka}qVfsuZ q0tO^LF`B@`Bŧ/,,Kyq󋋋yW{MpqEmm5ۍ̪#nE'}f?W}X}Pg/FzfH:vWtc6H9N@SB4k34 K5@cvE㨻:欂E$c乨c1pK}eNHbI g8Sw(se:O\9mrhy0^pHR1Riu\x'v-wJ^G",!v}^tlP&b-0I aF@&\{nP=g1z%/m>Yv\ 2pD?_\gCȰ8?zpKm@څ`-X1s5FR9I텸& 2w")n'M y#sqUS jǵCaߖCb$V!{.!DȐ'%l{oj̞'UYuޥeM0êbnٳ"`f{&-⠿A&qZ{c<wg5S0ZD g` q.CV`BϏ/6+`@@`B_D+*^'nM6YYf};lἷTXҌbB9ퟻ{`փ02 ;W򣷡{^ } DvB v#+PNS tdM933P|;k"a< D,Ma(TY&j=s@26/VOf űYBXCC<ǻP رvKAA|-h5n!,;+/yuIIk58+o·VB{Ojv %Ja|`%6ӱeBeFecn.q"dĚ=C ['}k؁#0oCߓMq# נFmmMghwqа-խlSSGM3%%{~ ML=dͅmF`HOv}[A];/(_ғ.4Tסw\+`F`&\Z~ s=M*=z4nSnZ(dn9!=$'ߧP-x6F(2^p{ ~]()9Oֿ{$ TM"@#(R+^_ eUhdj}(,Q`pQ!ͤF`> >EF7}}?WSyp<]Di8eIdbagxS>"3l!檁4G6Aml;l1r^O.AH2ySzKDZ]녾Bq~B =} gb 7 vXbFL諫y3H%%%Sgk[B=NDF"8Qh&W9_u7='(LXe)41 CQ(/pƢپ?%#o܂Z022n]CW5߼q!UO~d0#LŻGqC\n?-- |{/>gQ9qJK?bzN09}G^|ˠ2rF îdS@G^'s#p374V.X qS8+;;ȧ6^=H5F? 8l4Ю:|R7!8iaDZ=:}pʄ7s`@='F]Gl3M[ ]غ4Pzj;dj8ddd !t.yhڌ"Pe;<~NV#0{$ 0焗[DǏˋusAxWn~]]χy>fd2o*̞ %-|2oD &V^F7:Ԓ݆ CaakAKG{mg22 F4DdCÐA1~~ʪ0| HCJQG=D&ы=p_;[E|e-hkbռ=8qG/S7K)N)ҁ)\smeȞoB!:bsІ|YJ!2WQjny1]Ķ2F`~/.. fN_Z2M!4K#ZbrhT`Su.ka-o X+Cf_ش!$,i\xЅ35k [qo^ܯyu(G5C O: `Ӭ F`~sCꍍ|i/7 G9W'5 rGnBA.pXR%۶Uc!n&B^hn\m+0kNؚlO_m;`*R[\ z~Jl:[Gsi\ bo)ku?\{ #Qi7Q g,Yw,÷GJ~}58g~\.Wt\_ͫkݺPH$X<׮o; f⧅+5X=>тKOPt][ ̼LF`@@`BZG >WS`k;kqen,-,&?ӇU+ES<]oo"!47A:}n"rjH"RkE4}}RJ^t eH4RQT%<}SP=!޸،BTvIc}q CJf9j{1yTɁ\{ULGt ~ٕϯE[tB? #0M@`B7S!o@/64'Oᨩ=#@JhF`>Ԇ[Y?="F`?ok>#0'A@`B#԰=?@2F`>;z.zV݇Nigw3 p U,2$PCOWV#Oi=?|mݨ+EVi|`>N\DǫdҔwv#&zǣχ_w-|&999(*%)&&7LzV5 <^kZJ_@``9^ $6]I}3ys7>?>cQ֋'ySvw!#*哿hGE='T"kP\9Kp+d8.Ywg3c"0"ؿ/S?ּխfesH\8ݞISGrJՊu]KQKI¹t\Z+Wr5*GuA{ p]YGNq;72yiE5ܨJt+p+ c&eH o= E07F |WWky5 cbN\aBF >+sq9GuuM~nƦݸqQI18l\LC46Ҧyƈ?ͽǏG" .g*,/gPcm`+\O d11kMpT,cgR^gh̺S%}yXy IK6NJk[O)aI 9?Beyhr6ڸQU mT&QP:gGDj=ۏ;@ADhiBW>ax^fةA(C$ڐyt<0.qHY<bƱ<ߗ϶޼3o}..c{~* Bgb螢d*hXK걏7.Ks$9ҖcT|ȏX! 0cHTz&?# nl(0F@z݌G\׃z~?pHZ wSGg҄n8{o?j V t SQJV9к27X] ?R*pB,6 £\o^C&](A1z84cv+hCq*,8醢h;ߣ} uH,%'6!&دKߋ=bS`B <ƈy`Ňߌ0UK;$cu 0z|x(1nO<;\_qύz΢[Ǐt{xF9QQQys<_L;C~zP׋-< EHRr `E5kx!ɋ~#VsL3ɻnb2u%I4y>h3Btݚt8Xx@ `ÌTF'd&Pt]` I1BOAa޿ 9}ۅ)a_c^*?\0=y=#i>C/Ah~Xj`Imo"Q1Y^!Vߥڡ{&Akѽxf ~lTz=+{aWv~@L^8'HΝnq'򭭭7;P__-HvḞVm_C\Q!l//Y=INv2_o 0vH]Û(c\H[jUwG8 fmǑkxX auUb=~Q>8%q!a2%VK9B8 ƐչC[?XSNnp| 7nF ;,ׂk?C=r條A!ڥZ"^}0?]#d_h8_:lXϭ ݏ߯soN/^i#>D'5M)^dov4Ui\ $_Cnꎝk:bSؼ;vu=if9/ůӧcVC!Fkw5gf؈#^q溼b@79,r~cYgޝ+R+Ï{sWUm\M.pQ-~ ސ J8|ޜpi q!}hz| 6lѩKChjq7Hmz.7NBD wkb_8/(-?Q{7n_+Tpm7U. ' 'sol{>Xz~N)ӧ$vvW.s6eo\|޻Iً Qvuo!11lmm{ځ,de碬fhz_K J (hMOdTtw8WõjCd塤nqk5 rPTӓc|v>Úvq[*JZhȾ yr v4uhO_}qmɭD7?؍t+nIw[\BQ.w$õjݻ~tF =9!!|1=Y,7'7>4L?,o⺑:ǭF F7Z?9OoS8 =?MmxsSK08<̽r /Ox)VrG1_qԵ vհ& =~Ts{χxzn1v m}Y[_7~#sc^FNd~Wz~?ھNu1 ~Y'1u.##|:&s{ؕ0#0F@`BUBwcfF`>L tv!#0" 0gd<`F L[I>!"r|gS)~Ú0#V&{]kcב -EvVAepw/}g>/fB*ΝKs,#K{GO7Ű]~ou ^~4Ȕ=n#`q7} *{Qp\F`>Wӏz5 y"#:ފ{mFxX##8>wR τotȏ^2솟?ߤNck%`)|O e#0J@`Bnn)66gb3>7gXYk1lmɧ>RR;~yZ?2E 3m~ek!L{D堭 ۄwA|2-Ipжm'mאSO mU=䮤.$6!:Ad oĆ\8ZܳQ!kܸs yC0Ns.\i7D%%p>8畅!brm D!/Iuo?yCvݩpQ0-,j< 9بc?N6;`F& 045MJXS^wڡ9Gcl} / Bծރ@ZIwJW\?J&SG AX%4tI6̛}#[)\SZNe۾ B+_ q.lX{ul_NBJ *g 'OOx-ř7%c!}d7&!AGq7 xJU^, [Ulu%ȘNl {8.5pX fe\؅_I>?745zn7Y?Nҽ| XF L>/y6 rmwu-΍"'CZ { a솂A8De5VcC]/U7b㒟>t H={e樇ctazRGCz5>PݧSg_X s;mUօBWX{;á@2&Y:J%T߅(z!_NF`>+fE