Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » EMF » [Teneo] Possible inconsistency using IdBags
[Teneo] Possible inconsistency using IdBags [message #425933] Fri, 12 December 2008 12:50 Go to next message
Bjoern Sundin is currently offline Bjoern SundinFriend
Messages: 47
Registered: July 2009
Member
Hello Martin,

I have encountered a problem concerning lists in my application. After
extensive debugging I have found out that this problem is connected with the
use of IdBags.

I use Eclipse 3.4, Teneo 1.0.1 and Hibernate 3.3.1 (also tested with 3.2.6)

The problem is the following:
When adding objects to a list, one part of the logic first makes
list.clear() and then adds all the newly submitted objects. The newly
submitted objects could possibly partly contain the once removed in
list.clear().
This is no problem unless the list being modified is the one having the last
rows in the database table! In this case only the new objects get added to
the list. The ones removed and then readded do not get persisted to the
database again. They are visible to the GUI (model), however, but only until
the application restarts.

The situation as an example:
Object Library has a unique ordered non-containment list referencing object
Book (Books are contained in object Publisher).

In the database there is a table Library _ Books with three columns:
Library id | Book id | ID

To start the following ids are in the table:
1|11|1
1|12|2
1|13|3
2|11|4
2|13|5

- I edit the list for the Library with id 2 in the GUI. I want to add a Book
reference with id 12.

- The logic makes list.clear() and thus removes all the Book references (11
and 13) for the Library with id 2.

- Then it adds the Book references 11, 12 and 13

- The transaction gets committed.

- The Model (EObjects) shows the following two lists:
1{11, 12, 13}
2{11, 12, 13}

- In the database I have the following:
1|11|1
1|12|2
1|13|3
2|12|4

- The expected result in the database would be
1|11|1
1|12|2
1|13|3
2|11|4
2|12|5
2|13|6

I'm able to resolve this behaviour by setting the
PersistenceOptions.MAP_ALL_LISTS_AS_IDBAG to false and recreate the
database. But I think it might be important to know about the impact of this
problem when using IdBags as it (for me) unexpectedly removed entries from
the database.

Greetings
Bjoern
Re: [Teneo] Possible inconsistency using IdBags [message #425961 is a reply to message #425933] Sat, 13 December 2008 23:20 Go to previous messageGo to next message
Martin Taal is currently offline Martin TaalFriend
Messages: 5468
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------090104000706060409060204
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi Bjoern,
I tried to replicate this in a test but I was not able to (with me it works fine). Also in my case I
change the list which is last in the database. I have attached the test I used, it uses the Teneo
test framework but I am sure you can read through it. In addition I attached the ecore model I used
to test. Can you check if you see any differences?

Otherwise if you have a test case for me then I can try it out.

gr. Martin

Bjoern Sundin wrote:
> Hello Martin,
>
> I have encountered a problem concerning lists in my application. After
> extensive debugging I have found out that this problem is connected with the
> use of IdBags.
>
> I use Eclipse 3.4, Teneo 1.0.1 and Hibernate 3.3.1 (also tested with 3.2.6)
>
> The problem is the following:
> When adding objects to a list, one part of the logic first makes
> list.clear() and then adds all the newly submitted objects. The newly
> submitted objects could possibly partly contain the once removed in
> list.clear().
> This is no problem unless the list being modified is the one having the last
> rows in the database table! In this case only the new objects get added to
> the list. The ones removed and then readded do not get persisted to the
> database again. They are visible to the GUI (model), however, but only until
> the application restarts.
>
> The situation as an example:
> Object Library has a unique ordered non-containment list referencing object
> Book (Books are contained in object Publisher).
>
> In the database there is a table Library _ Books with three columns:
> Library id | Book id | ID
>
> To start the following ids are in the table:
> 1|11|1
> 1|12|2
> 1|13|3
> 2|11|4
> 2|13|5
>
> - I edit the list for the Library with id 2 in the GUI. I want to add a Book
> reference with id 12.
>
> - The logic makes list.clear() and thus removes all the Book references (11
> and 13) for the Library with id 2.
>
> - Then it adds the Book references 11, 12 and 13
>
> - The transaction gets committed.
>
> - The Model (EObjects) shows the following two lists:
> 1{11, 12, 13}
> 2{11, 12, 13}
>
> - In the database I have the following:
> 1|11|1
> 1|12|2
> 1|13|3
> 2|12|4
>
> - The expected result in the database would be
> 1|11|1
> 1|12|2
> 1|13|3
> 2|11|4
> 2|12|5
> 2|13|6
>
> I'm able to resolve this behaviour by setting the
> PersistenceOptions.MAP_ALL_LISTS_AS_IDBAG to false and recreate the
> database. But I think it might be important to know about the impact of this
> problem when using IdBags as it (for me) unexpectedly removed entries from
> the database.
>
> Greetings
> Bjoern
>
>


--

With Regards, Martin Taal

Springsite/Elver.org
Office: Hardwareweg 4, 3821 BV Amersfoort
Postal: Nassaulaan 7, 3941 EC Doorn
The Netherlands
Cell: +31 (0)6 288 48 943
Tel: +31 (0)84 420 2397
Fax: +31 (0)84 225 9307
Mail: mtaal@springsite.com - mtaal@elver.org
Web: www.springsite.com - www.elver.org

--------------090104000706060409060204
Content-Type: text/x-java;
name="ListAsIdBagAction.java"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="ListAsIdBagAction.java"

/**
* <copyright>
*
* Copyright (c) 2005, 2006, 2007, 2008 Springsite BV (The Netherlands) and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Martin Taal
* </copyright>
*
* $Id: LibraryListAsBagAction.java,v 1.3 2008/02/28 07:08:15 mtaal Exp $
*/

package org.eclipse.emf.teneo.test.emf.sample;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import org.eclipse.emf.teneo.PersistenceOptions;
import org.eclipse.emf.teneo.samples.issues.bz237790.Bz237790Factor y;
import org.eclipse.emf.teneo.samples.issues.bz237790.Bz237790Packag e;
import org.eclipse.emf.teneo.samples.issues.bz237790.Many;
import org.eclipse.emf.teneo.samples.issues.bz237790.One;
import org.eclipse.emf.teneo.test.AbstractTestAction;
import org.eclipse.emf.teneo.test.stores.TestStore;

/**
* @author <a href="mailto:mtaal@elver.org">Martin Taal</a>
* @version $Revision: 1.3 $
*/
public class ListAsIdBagAction extends AbstractTestAction {

private final Bz237790Factory factory = Bz237790Factory.eINSTANCE;

public ListAsIdBagAction() {
super(Bz237790Package.eINSTANCE);
}

@Override
public Properties getExtraConfigurationProperties() {
final Properties props = new Properties();
props.setProperty(PersistenceOptions.MAP_ALL_LISTS_AS_IDBAG, "true");
return props;
}

@Override
public void doAction(TestStore store) {
store.disableDrop();
{
store.beginTransaction();
addDataSet(store, 1);
addDataSet(store, 2);
store.commitTransaction();
}

// read the writers and add the second book to the second writer
{
store.beginTransaction();
final List<One> os = store.getObjects(One.class);
One o1 = null;
One o2 = null;
for (One o : os) {
if (o.getManies().size() == 2) {
o1 = o;
} else {
o2 = o;
}
}
final List<Many> reserve = new ArrayList<Many>(o1.getManies());
o1.getManies().clear();
reserve.add(1, o2.getManies().get(1));
o1.getManies().addAll(reserve);
store.commitTransaction();
}

{
store.beginTransaction();
final List<One> os = store.getObjects(One.class);
for (One o : os) {
assertEquals(3, o.getManies().size());
}
store.commitTransaction();
}
}

private void addDataSet(TestStore store, int index) {
{
final One one = factory.createOne();
store.store(one);
int num = 3;
if (index == 2) {
num = 2;
}
for (int i = 0; i < num; i++) {
final Many many = factory.createMany();
many.setName("" + index);
one.getManies().add(many);
store.store(many);
}
}

}
}

--------------090104000706060409060204
Content-Type: text/xml;
name="bz237790.ecore"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="bz237790.ecore"

<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="bz237790"
nsURI="http://www.eclipse.org/emf/teneo/samples/issues/bz225296" nsPrefix="bz237790">
<eClassifiers xsi:type="ecore:EClass" name="One">
<eStructuralFeatures xsi:type="ecore:EReference" name="manies" upperBound="-1"
eType="#//Many" resolveProxies="false"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Many">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
<eAnnotations source="teneo.jpa">
<details key="value" value="@Column(name=&quot;myname&quot;)"/>
</eAnnotations>
</eStructuralFeatures>
</eClassifiers>
</ecore:EPackage>

--------------090104000706060409060204--
Re: [Teneo] Possible inconsistency using IdBags [message #425979 is a reply to message #425961] Mon, 15 December 2008 10:13 Go to previous messageGo to next message
Bjoern Sundin is currently offline Bjoern SundinFriend
Messages: 47
Registered: July 2009
Member
Hi Martin,

I extracted the concerned (simplified) objects from my project and packed
them into another simpler plugin application. See attached zip.

When you run the Activator the first time it will create the DB and the
initial model. The second time it will remove the "operands" and add them
again together with a new "operand reference".

I attach two screenshots showing the database table after the first run and
after the second run. As you can see after the first run there are 4
"operands" in the table. After the second run I would expect the same
"operands" there plus the additional one but there is only the additional
one! I can reproduce this behaviour also omitting adding the additional
"operand". Then after the second run the table will be empty.

Greetings
Bjoern


"Martin Taal" <mtaal@elver.org> schrieb im Newsbeitrag
news:gi1g0c$o45$1@build.eclipse.org...
> Hi Bjoern,
> I tried to replicate this in a test but I was not able to (with me it
> works fine). Also in my case I
> change the list which is last in the database. I have attached the test I
> used, it uses the Teneo
> test framework but I am sure you can read through it. In addition I
> attached the ecore model I used
> to test. Can you check if you see any differences?
>
> Otherwise if you have a test case for me then I can try it out.
>
> gr. Martin
>
> Bjoern Sundin wrote:
>> Hello Martin,
>>
>> I have encountered a problem concerning lists in my application. After
>> extensive debugging I have found out that this problem is connected with
>> the
>> use of IdBags.
>>
>> I use Eclipse 3.4, Teneo 1.0.1 and Hibernate 3.3.1 (also tested with
>> 3.2.6)
>>
>> The problem is the following:
>> When adding objects to a list, one part of the logic first makes
>> list.clear() and then adds all the newly submitted objects. The newly
>> submitted objects could possibly partly contain the once removed in
>> list.clear().
>> This is no problem unless the list being modified is the one having the
>> last
>> rows in the database table! In this case only the new objects get added
>> to
>> the list. The ones removed and then readded do not get persisted to the
>> database again. They are visible to the GUI (model), however, but only
>> until
>> the application restarts.
>>
>> The situation as an example:
>> Object Library has a unique ordered non-containment list referencing
>> object
>> Book (Books are contained in object Publisher).
>>
>> In the database there is a table Library _ Books with three columns:
>> Library id | Book id | ID
>>
>> To start the following ids are in the table:
>> 1|11|1
>> 1|12|2
>> 1|13|3
>> 2|11|4
>> 2|13|5
>>
>> - I edit the list for the Library with id 2 in the GUI. I want to add a
>> Book
>> reference with id 12.
>>
>> - The logic makes list.clear() and thus removes all the Book references
>> (11
>> and 13) for the Library with id 2.
>>
>> - Then it adds the Book references 11, 12 and 13
>>
>> - The transaction gets committed.
>>
>> - The Model (EObjects) shows the following two lists:
>> 1{11, 12, 13}
>> 2{11, 12, 13}
>>
>> - In the database I have the following:
>> 1|11|1
>> 1|12|2
>> 1|13|3
>> 2|12|4
>>
>> - The expected result in the database would be
>> 1|11|1
>> 1|12|2
>> 1|13|3
>> 2|11|4
>> 2|12|5
>> 2|13|6
>>
>> I'm able to resolve this behaviour by setting the
>> PersistenceOptions.MAP_ALL_LISTS_AS_IDBAG to false and recreate the
>> database. But I think it might be important to know about the impact of
>> this
>> problem when using IdBags as it (for me) unexpectedly removed entries
>> from
>> the database.
>>
>> Greetings
>> Bjoern
>>
>>
>
>
> --
>
> With Regards, Martin Taal
>
> Springsite/Elver.org
> Office: Hardwareweg 4, 3821 BV Amersfoort
> Postal: Nassaulaan 7, 3941 EC Doorn
> The Netherlands
> Cell: +31 (0)6 288 48 943
> Tel: +31 (0)84 420 2397
> Fax: +31 (0)84 225 9307
> Mail: mtaal@springsite.com - mtaal@elver.org
> Web: www.springsite.com - www.elver.org
>


------------------------------------------------------------ --------------------


> /**
> * <copyright>
> *
> * Copyright (c) 2005, 2006, 2007, 2008 Springsite BV (The Netherlands) and
> others
> * All rights reserved. This program and the accompanying materials
> * are made available under the terms of the Eclipse Public License v1.0
> * which accompanies this distribution, and is available at
> * http://www.eclipse.org/legal/epl-v10.html
> *
> * Contributors:
> * Martin Taal
> * </copyright>
> *
> * $Id: LibraryListAsBagAction.java,v 1.3 2008/02/28 07:08:15 mtaal Exp $
> */
>
> package org.eclipse.emf.teneo.test.emf.sample;
>
> import java.util.ArrayList;
> import java.util.List;
> import java.util.Properties;
>
> import org.eclipse.emf.teneo.PersistenceOptions;
> import org.eclipse.emf.teneo.samples.issues.bz237790.Bz237790Factor y;
> import org.eclipse.emf.teneo.samples.issues.bz237790.Bz237790Packag e;
> import org.eclipse.emf.teneo.samples.issues.bz237790.Many;
> import org.eclipse.emf.teneo.samples.issues.bz237790.One;
> import org.eclipse.emf.teneo.test.AbstractTestAction;
> import org.eclipse.emf.teneo.test.stores.TestStore;
>
> /**
> * @author <a href="mailto:mtaal@elver.org">Martin Taal</a>
> * @version $Revision: 1.3 $
> */
> public class ListAsIdBagAction extends AbstractTestAction {
>
> private final Bz237790Factory factory = Bz237790Factory.eINSTANCE;
>
> public ListAsIdBagAction() {
> super(Bz237790Package.eINSTANCE);
> }
>
> @Override
> public Properties getExtraConfigurationProperties() {
> final Properties props = new Properties();
> props.setProperty(PersistenceOptions.MAP_ALL_LISTS_AS_IDBAG, "true");
> return props;
> }
>
> @Override
> public void doAction(TestStore store) {
> store.disableDrop();
> {
> store.beginTransaction();
> addDataSet(store, 1);
> addDataSet(store, 2);
> store.commitTransaction();
> }
>
> // read the writers and add the second book to the second writer
> {
> store.beginTransaction();
> final List<One> os = store.getObjects(One.class);
> One o1 = null;
> One o2 = null;
> for (One o : os) {
> if (o.getManies().size() == 2) {
> o1 = o;
> } else {
> o2 = o;
> }
> }
> final List<Many> reserve = new ArrayList<Many>(o1.getManies());
> o1.getManies().clear();
> reserve.add(1, o2.getManies().get(1));
> o1.getManies().addAll(reserve);
> store.commitTransaction();
> }
>
> {
> store.beginTransaction();
> final List<One> os = store.getObjects(One.class);
> for (One o : os) {
> assertEquals(3, o.getManies().size());
> }
> store.commitTransaction();
> }
> }
>
> private void addDataSet(TestStore store, int index) {
> {
> final One one = factory.createOne();
> store.store(one);
> int num = 3;
> if (index == 2) {
> num = 2;
> }
> for (int i = 0; i < num; i++) {
> final Many many = factory.createMany();
> many.setName("" + index);
> one.getManies().add(many);
> store.store(many);
> }
> }
>
> }
> }
>


------------------------------------------------------------ --------------------


> <?xml version="1.0" encoding="UTF-8"?>
> <ecore:EPackage xmi:version="2.0"
> xmlns:xmi="http://www.omg.org/XMI"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="bz237790"
> nsURI="http://www.eclipse.org/emf/teneo/samples/issues/bz225296"
> nsPrefix="bz237790">
> <eClassifiers xsi:type="ecore:EClass" name="One">
> <eStructuralFeatures xsi:type="ecore:EReference" name="manies"
> upperBound="-1"
> eType="#//Many" resolveProxies="false"/>
> </eClassifiers>
> <eClassifiers xsi:type="ecore:EClass" name="Many">
> <eStructuralFeatures xsi:type="ecore:EAttribute" name="name"
> eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
> <eAnnotations source="teneo.jpa">
> <details key="value" value="@Column(name=&quot;myname&quot;)"/>
> </eAnnotations>
> </eStructuralFeatures>
> </eClassifiers>
> </ecore:EPackage>
>




Re: [Teneo] Possible inconsistency using IdBags [message #426082 is a reply to message #425979] Mon, 15 December 2008 20:09 Go to previous messageGo to next message
Martin Taal is currently offline Martin TaalFriend
Messages: 5468
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------050309000902070705090809
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi Bjoern,
I used your project but I am afraid that with me it worked fine. See the before and after jpg's. Two
things I changed:
- I changed the Activator to work from a main method, which was easier to run (see the attached file)
- I use mysql

I am using Hibernate 3.2.6 which you also tried I think.

I am a bit at a loss why it fails with you and not with me...

Can you check the hibernate log4j output specifically at the point that the collection is cleared
and then saved?

gr. Martin

Bjoern Sundin wrote:
> Hi Martin,
>
> I extracted the concerned (simplified) objects from my project and packed
> them into another simpler plugin application. See attached zip.
>
> When you run the Activator the first time it will create the DB and the
> initial model. The second time it will remove the "operands" and add them
> again together with a new "operand reference".
>
> I attach two screenshots showing the database table after the first run and
> after the second run. As you can see after the first run there are 4
> "operands" in the table. After the second run I would expect the same
> "operands" there plus the additional one but there is only the additional
> one! I can reproduce this behaviour also omitting adding the additional
> "operand". Then after the second run the table will be empty.
>
> Greetings
> Bjoern
>
>
> "Martin Taal" <mtaal@elver.org> schrieb im Newsbeitrag
> news:gi1g0c$o45$1@build.eclipse.org...
>> Hi Bjoern,
>> I tried to replicate this in a test but I was not able to (with me it
>> works fine). Also in my case I
>> change the list which is last in the database. I have attached the test I
>> used, it uses the Teneo
>> test framework but I am sure you can read through it. In addition I
>> attached the ecore model I used
>> to test. Can you check if you see any differences?
>>
>> Otherwise if you have a test case for me then I can try it out.
>>
>> gr. Martin
>>
>> Bjoern Sundin wrote:
>>> Hello Martin,
>>>
>>> I have encountered a problem concerning lists in my application. After
>>> extensive debugging I have found out that this problem is connected with
>>> the
>>> use of IdBags.
>>>
>>> I use Eclipse 3.4, Teneo 1.0.1 and Hibernate 3.3.1 (also tested with
>>> 3.2.6)
>>>
>>> The problem is the following:
>>> When adding objects to a list, one part of the logic first makes
>>> list.clear() and then adds all the newly submitted objects. The newly
>>> submitted objects could possibly partly contain the once removed in
>>> list.clear().
>>> This is no problem unless the list being modified is the one having the
>>> last
>>> rows in the database table! In this case only the new objects get added
>>> to
>>> the list. The ones removed and then readded do not get persisted to the
>>> database again. They are visible to the GUI (model), however, but only
>>> until
>>> the application restarts.
>>>
>>> The situation as an example:
>>> Object Library has a unique ordered non-containment list referencing
>>> object
>>> Book (Books are contained in object Publisher).
>>>
>>> In the database there is a table Library _ Books with three columns:
>>> Library id | Book id | ID
>>>
>>> To start the following ids are in the table:
>>> 1|11|1
>>> 1|12|2
>>> 1|13|3
>>> 2|11|4
>>> 2|13|5
>>>
>>> - I edit the list for the Library with id 2 in the GUI. I want to add a
>>> Book
>>> reference with id 12.
>>>
>>> - The logic makes list.clear() and thus removes all the Book references
>>> (11
>>> and 13) for the Library with id 2.
>>>
>>> - Then it adds the Book references 11, 12 and 13
>>>
>>> - The transaction gets committed.
>>>
>>> - The Model (EObjects) shows the following two lists:
>>> 1{11, 12, 13}
>>> 2{11, 12, 13}
>>>
>>> - In the database I have the following:
>>> 1|11|1
>>> 1|12|2
>>> 1|13|3
>>> 2|12|4
>>>
>>> - The expected result in the database would be
>>> 1|11|1
>>> 1|12|2
>>> 1|13|3
>>> 2|11|4
>>> 2|12|5
>>> 2|13|6
>>>
>>> I'm able to resolve this behaviour by setting the
>>> PersistenceOptions.MAP_ALL_LISTS_AS_IDBAG to false and recreate the
>>> database. But I think it might be important to know about the impact of
>>> this
>>> problem when using IdBags as it (for me) unexpectedly removed entries
>>> from
>>> the database.
>>>
>>> Greetings
>>> Bjoern
>>>
>>>
>>
>> --
>>
>> With Regards, Martin Taal
>>
>> Springsite/Elver.org
>> Office: Hardwareweg 4, 3821 BV Amersfoort
>> Postal: Nassaulaan 7, 3941 EC Doorn
>> The Netherlands
>> Cell: +31 (0)6 288 48 943
>> Tel: +31 (0)84 420 2397
>> Fax: +31 (0)84 225 9307
>> Mail: mtaal@springsite.com - mtaal@elver.org
>> Web: www.springsite.com - www.elver.org
>>
>
>
> ------------------------------------------------------------ --------------------
>
>
>> /**
>> * <copyright>
>> *
>> * Copyright (c) 2005, 2006, 2007, 2008 Springsite BV (The Netherlands) and
>> others
>> * All rights reserved. This program and the accompanying materials
>> * are made available under the terms of the Eclipse Public License v1.0
>> * which accompanies this distribution, and is available at
>> * http://www.eclipse.org/legal/epl-v10.html
>> *
>> * Contributors:
>> * Martin Taal
>> * </copyright>
>> *
>> * $Id: LibraryListAsBagAction.java,v 1.3 2008/02/28 07:08:15 mtaal Exp $
>> */
>>
>> package org.eclipse.emf.teneo.test.emf.sample;
>>
>> import java.util.ArrayList;
>> import java.util.List;
>> import java.util.Properties;
>>
>> import org.eclipse.emf.teneo.PersistenceOptions;
>> import org.eclipse.emf.teneo.samples.issues.bz237790.Bz237790Factor y;
>> import org.eclipse.emf.teneo.samples.issues.bz237790.Bz237790Packag e;
>> import org.eclipse.emf.teneo.samples.issues.bz237790.Many;
>> import org.eclipse.emf.teneo.samples.issues.bz237790.One;
>> import org.eclipse.emf.teneo.test.AbstractTestAction;
>> import org.eclipse.emf.teneo.test.stores.TestStore;
>>
>> /**
>> * @author <a href="mailto:mtaal@elver.org">Martin Taal</a>
>> * @version $Revision: 1.3 $
>> */
>> public class ListAsIdBagAction extends AbstractTestAction {
>>
>> private final Bz237790Factory factory = Bz237790Factory.eINSTANCE;
>>
>> public ListAsIdBagAction() {
>> super(Bz237790Package.eINSTANCE);
>> }
>>
>> @Override
>> public Properties getExtraConfigurationProperties() {
>> final Properties props = new Properties();
>> props.setProperty(PersistenceOptions.MAP_ALL_LISTS_AS_IDBAG, "true");
>> return props;
>> }
>>
>> @Override
>> public void doAction(TestStore store) {
>> store.disableDrop();
>> {
>> store.beginTransaction();
>> addDataSet(store, 1);
>> addDataSet(store, 2);
>> store.commitTransaction();
>> }
>>
>> // read the writers and add the second book to the second writer
>> {
>> store.beginTransaction();
>> final List<One> os = store.getObjects(One.class);
>> One o1 = null;
>> One o2 = null;
>> for (One o : os) {
>> if (o.getManies().size() == 2) {
>> o1 = o;
>> } else {
>> o2 = o;
>> }
>> }
>> final List<Many> reserve = new ArrayList<Many>(o1.getManies());
>> o1.getManies().clear();
>> reserve.add(1, o2.getManies().get(1));
>> o1.getManies().addAll(reserve);
>> store.commitTransaction();
>> }
>>
>> {
>> store.beginTransaction();
>> final List<One> os = store.getObjects(One.class);
>> for (One o : os) {
>> assertEquals(3, o.getManies().size());
>> }
>> store.commitTransaction();
>> }
>> }
>>
>> private void addDataSet(TestStore store, int index) {
>> {
>> final One one = factory.createOne();
>> store.store(one);
>> int num = 3;
>> if (index == 2) {
>> num = 2;
>> }
>> for (int i = 0; i < num; i++) {
>> final Many many = factory.createMany();
>> many.setName("" + index);
>> one.getManies().add(many);
>> store.store(many);
>> }
>> }
>>
>> }
>> }
>>
>
>
> ------------------------------------------------------------ --------------------
>
>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <ecore:EPackage xmi:version="2.0"
>> xmlns:xmi="http://www.omg.org/XMI"
>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>> xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="bz237790"
>> nsURI="http://www.eclipse.org/emf/teneo/samples/issues/bz225296"
>> nsPrefix="bz237790">
>> <eClassifiers xsi:type="ecore:EClass" name="One">
>> <eStructuralFeatures xsi:type="ecore:EReference" name="manies"
>> upperBound="-1"
>> eType="#//Many" resolveProxies="false"/>
>> </eClassifiers>
>> <eClassifiers xsi:type="ecore:EClass" name="Many">
>> <eStructuralFeatures xsi:type="ecore:EAttribute" name="name"
>> eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
>> <eAnnotations source="teneo.jpa">
>> <details key="value" value="@Column(name=&quot;myname&quot;)"/>
>> </eAnnotations>
>> </eStructuralFeatures>
>> </eClassifiers>
>> </ecore:EPackage>
>>
>
>


--

With Regards, Martin Taal

Springsite/Elver.org
Office: Hardwareweg 4, 3821 BV Amersfoort
Postal: Nassaulaan 7, 3941 EC Doorn
The Netherlands
Cell: +31 (0)6 288 48 943
Tel: +31 (0)84 420 2397
Fax: +31 (0)84 225 9307
Mail: mtaal@springsite.com - mtaal@elver.org
Web: www.springsite.com - www.elver.org

--------------050309000902070705090809
Content-Type: image/jpeg;
name="after.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="after.jpg"

/9j/4AAQSkZJRgABAQEAgQB+AAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAAD/ /gATQ3JlYXRl
ZCB3aXRoIEdJTVD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8S EhEPERETFhwX
ExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEU Hh4eHh4eHh4e
Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAAR CACxAhADASIA
AhEBAxEB/8QAHQABAAMBAQEBAQEAAAAAAAAAAAUGBwQIAwIJAf/EAFMQAAED AwICAwkKDAMG
BQUAAAECAwQABREGEhMhBxQxFRciMkFUk9LTCBY0UVVWdJSz0SMkNzhSV2F3 kpWy1HF2ljM2
QnWBkUNyc7S1NWKxtsP/xAAaAQEAAwEBAQAAAAAAAAAAAAAAAQMEAgUG/8QA NBEAAgEDAwIE
BAQFBQAAAAAAAAECAxEhBBIxQVEFExRhIjJxoUKB0fAGI2KRwVJyorHx/9oA DAMBAAIRAxEA
PwD1lp5nhXfUa+Bw+LckL3cHZxPxSOndnhI3+Ljdue8XbvG3hNTNQ2nmeFd9 Rr4HD4tyQvdw
dnE/FI6d2eEjf4uN257xdu8beE1M0BnXSk5q2PF4+kLBa7pJVeYLUlcl5SXE MqeipWlKRHdy
2pCnQtZ2lpGVgKIwLJa1XtnwGLRaWypbZmNpnrShhZTH3paIZ/CJCVPKCiEE qQgEALKm/tqu
MjqTb7MVKpCp0RC1oY3rKDIbSsHDTp27CoE7QAnOVtAcREvHYYjoKI7LbKSc lKEhIz8fKgM5
6V3o01x59i9uW9yxsuokKQACVuJaWE+EDuATtJGDnckZyCBhVgVqaTarbpXQ lvnw9R3Tdck3
CSpxooQ6NipqsjwUFKUp3jIIASN6iAfUl50zpudJcuV0t8ZwgbnlOkhtYSMZ cTnarkAMqHYA
OwCpuqPClPR6ytqakYyclZc/S797YssMo1Glo1LShdS6vv7fYqWqWHJ+u9P2 1c+fHhuQZzrz
UWU4xxSlUcJ3FBB5byRgjyjsJBqdjuV5kavQiXeYcS6pu7yHob96dC1xQ4tK UIhcPZjh7VJc
ByTzKuZFazSonQ3S3J9f0/f5nv6fxVUqPlSp3+G3Pdyd+M3uk112rODL9D9c ELRDz92u0pd6
tronF+c6sOfgQtKkgq8BQIwFJweZySedRunZ9nt3RdYILU19x9xbUaYF6gei ohvJZUSh10KU
pgeDgISBlW0YrYqVwtNbh/b6fp9zRLxxTbcoOzadlK3Dm1wuikkuLbV9FlnR 9cJdxvunHJkg
yFst3qOhwvKdKm0SWEo/CKSkrwkAbiASBk8zWp0pV1Gm6as3f/xI87xDWR1d RTjDalfF78yl
Lsu9hSlKtMApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUArKvdc/m46z +ho+2brVayr3
XP5uOs/oaPtm6A8iUpSgNBT+bkv/ADcn/wBmazlacOb0ZyPGA8tbLoTSlx1h 0ESLZbHorLzW
p+OpUhSkp2iKE48FJOcqHk+OuIdBerQMC42P07vs6prUPOST6Zv1T9j1PC/E 5+HTlOGdy2uL
+WSfKl39l3zfFnlLSgpOfL5atFnJ73WoeZ+HQP6ZFWwdBOqwrcLhYwf/AF3f Z1+u8Xq35Rsf
pnfZ1NCFSMFGfPt19/r3OPFa2lr6l1NLuUXZ2lb4f6U08xXEXZYxbBzvWNtG h7gmYw26WLUx
LjSGrS202FKU14skK3uq2rUFAgjOezArp6TYjxe1a/dLTEix25aTa5SI6UKe dLoC0hwDLmUF
xSgSdpSB4PZX+d4vVvyjY/TO+zp3i9W/KNj9M77OrrM84lJ0GA5ebvJj2165 SzfZKZ7TNobn
rDI2bEkKWktJOV+GkZz5RgZyotWk32Q1Iemw7eHXAgtsJedSnJ2gpK0gnsz4 X/etB7xerflG
x+md9nTvF6t+UbH6Z32dLMFM0U2wdVJS1bZN3aCXQ00iMlxw+CoJc4JJSopO FbCSDjGfLV3Y
srLEi6HgpmXnEVbbDGn2HHmmVJWV7oZUEJWCEBRG4pyP0sj594vVvyjY/TO+ zp3i9W/KNj9M
77OlmD7RIljfejx3YLkWL3WuCmIkhlIIfERgoQWyvH+07EFfPkknnXwft7Bd dLWnnvfE3b1q
jR5tmaipkr4yBuTGSVJWtLZc5YwcZwSK/wB7xerflGx+md9nTvF6t+UbH6Z3 2dLMEZbl346a
1TC7jsi4iTEdfiJtTW5tHDdC18PZ4AGUHIA2lWeWTVb0dfhp+5KlKiNy0qTt U26NyPLzKewn
4s9nOrv3i9W/KNj9M77OneL1b8o2P0zvs6WYKbpqe4/0hWueEIC3LgydrgDo GVgY8LPZ5M9n
L4s1OX6c33BXJdhW1L0u+S478hMBkLSyltkYThOEnwicgZzkg5JzLd4vVvyj Y/TO+zp3i9W/
KNj9M77OlmDrFpjnUIZuNit0a2pv0NmzLRFQkS2FPYI3Afh0FvCipW7njmM4 qEi3JhdshTTY
7JxjelQvgDZT1fCDwyMYJ5+OfD/+6pDvF6t+UbH6Z32dO8Xq35RsfpnfZ0sw VGDAtTfSWi2T
tqLYi6lhwLXhPDDuMKV5BjkT8VXOz2tx6bb/AHw6dtkS6KdnJZiqiNsIeZTE WpJUgAApSsJ2
uHmefhHGR8u8Xq35RsfpnfZ12Wbod1papxmR52n1OFl1nDjrxG1xtTauxsc8 LOP24pZgi4Fr
hquVhGpLcxCurrU0qiiIhribUZjFbI2Jype8AHbv2pBPPNfSazEiNXGU/YFt XGPZnFqNwsrU
RKldZYShxLAKkggKUM4AI7Qeefp3i9W/KNj9M77OneL1b8o2P0zvs6WYPnpe 0JnWIOXCOw+x
OgzJO5izMhDS0h0pBkgpU2sKQCG0gjBSMYNJyJVyvtmdm22M5bHLASy8IDaU LdRb1bhvCRuK
Vp8XJ2kcgMV9O8Xq35RsfpnfZ07xerflGx+md9nSzBnZs9zGcw3OUQTD2f7E 4wv/AA5ivhMh
yoZaEplTReaS83u/4kKGUq/wNaX3i9W/KNj9M77OneL1b8o2P0zvs6WYLv08 2i/3TW9uPR7D
l2/WzaHsagUgtwY0LcdzElam1pf3LwUMhKlIV+E8AA78b6T4cKBpTQEVjT92 sk1F0uHdVq6Z
XJfm8D8M+t8gCTvPMPJ8FQwBtxsTfZnRl01S5b0p7pXncR5xTi9k8oTknJwl McBI/YAAPJUZ
cehDpHu0qHIvmuReOpLUthE2apaUKUkpJH4EEcj5D5B8VSQY9p74A79Mlfbu VI1Hae+AO/TJ
X27lSNcknvfTzPCu+o18Dh8W5IXu4OzifikdO7PCRv8AFxu3PeLt3jbwmpmo bTzPCu+o18Dh
8W5IXu4OzifikdO7PCRv8XG7c94u3eNvCamaAqGsLxa4TpYvbd6lMGUhbDUC wP3JKFtBp1K1
BphzYpKylSSrHNOU80nEjb79HCG+L3WeTJKFRyq1v70oWGAA6EtjhK3PpJS4 EqCQtRAS2sp+
17EmC0qXDdkKW/LjtraQkkALcbaUvwWnFeCk7uYCfB8JSE7lpkYkbq4dJece U6vepS8ZzgDy
ADsAoCmdK8m8toitWtpmRHQy67MZcc2JOCgN5IBOSd+MjHIntSMYnYeky96M 0UlyFO7t3afc
HHo9pQwpxBW6AhEdvbk7dydw2YKlrPjZ57pqPQ3dibcVJvUqJEuikqmMtpG5 RDaWztV2AbUI
5EHnnyHA6bF0eaLsV2h3W06eiRJkKL1WO4jd4COeVYJwXCCQXCN5BIKiCRWb wqKpa6tqNVTu
rWjlP8/Zd+t+DPqNItyqUp/E+b8JYwj5akcvffF0/Gt1zYjRnYMxbzLrC3Eu bVx+ZCXEjOFY
SSDtyrtzyirZre9z7qhyLbFvwHLi7CEdFrlBaEIWtvjGTjg43JyU45A+NkEV crtZbfdJMSTL
be48NRUw6zJcZWnONwyhQJScDKTkHAyK5hpaypuTk9tmS0664p1xtqa8hla1 dqy0FhsqPaTt
yTz7aSp1NzcXi/6H0lHW6LyIwrQbko24XeT73fKzyrY5KJdNTalm6ZdbeuUW 13hMm3qXE7ly
I7scLlNoUncp3DyMnaVowkgKHLdymukKNIRbGlC8XI6lkM9XtrNukuR2nJAy eIWd5BQMgrLh
UAkf4ZmkaL06GJLLkWVIEltLbi5E595wISrclKFrWVIAUAobSMEA9or8TNE2 CXNZnPd1hKZj
CKh9u8y23C0FFW1Skugq5nOTknl8QqvyajTTz+b9/ual4noo1IuCcUm3iMc3 UcYa+G6d1fKf
N8lhYDgYbDykqdCQFqSMAnHMiv3X5aQG20tpKiEgJG5RUeXxk8z/AImv1W0+ abuxSlKEClKU
ApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQCsq91z+bjrP6Gj7ZutVrKvdc/ m46z+ho+2boD
yJSlKA9Ke5j/ACXXD/navsG6suvNQz9Ps2lFrtca5TLpcUQGm5ExUZtJU24v cpaW3D2NkYCf
LVa9zH+S64f87V9g3XR00RLZcG9Nxbvb5E+CzdhMksIs8qehxpDTiCkpYacA O51BAXtBwcHl
Xa4IPvqvVd8sVhfkzmrNDurdluVwTAQ49KQ4qOlBQUu7GhtG4bklIJ3DaeRN Sj2uNOxJzNun
T1NzFBkPFEZ1bLC3QNiXXUpKGirIwFqBOR8Yqp3bTEXVVnDej4SLRbo9ju1o bjTLbIt2x2Ul
koUlpxpJ4eUqJUB2nlk5x+JnRtP7s3M9Xj3O2Xd9qRIQ7f50MMqS022ocFkF t4fggQVbDzwc
gCpBqtUnWuqNW2K926HB0zZZ0S6TkwYb717dYc4hZW6S4gRlhKRwljkpRPg8 hk4u1Z50kXWG
vUWnmOr3srst4ROklnT9wkNrbMZ5GG3GWFoUrLyf+LAwoEgjFCCa9/Fmhzmb TfJLUO7ZaalN
x0vSI0Z53GxtUjhpQkqyNoXsJyMDmK6I+tdNSL/3DauKlTC+uMkmM6GVvIBK 2kvFPDU4kA5Q
FFQweXI1UrjpK+3Zq8xLc5ATp/U82Pcn35YeZmxRsZC2wwpvmohkYK1IKCog pO3Ffa36K1Cy
/brM87a+4Fuvrt3alIdcMt3c668llTezanC3cFwLO5KfFBJIA79HdIdvuOn7 C5dC93XuNvjy
32YFvkPtscXISVqQlYaSSFYK1DsPPlV5rJInR7qiDadPQ7f3LhXG3wIkR68R rrJacAaOVJMd
LfDko5q2hwjG48hWt0QFKUqQKUpQClKUApSlAKUpQClKUApSlAKUpQClKUB4 R098Ad+mSvt3
KkajtPfAHfpkr7dypGqjo976eZ4V31GvgcPi3JC93B2cT8Ujp3Z4SN/i43bn vF27xt4TUzUN
p5nhXfUa+Bw+LckL3cHZxPxSOndnhI3+Ljdue8XbvG3hNTNAQ2smePaGEcDj YuUBe3g8TG2W
yrdjhO4xjO7aNuN29rHFRM1DayZ49oYRwONi5QF7eDxMbZbKt2OE7jGM7to2 43b2scVEzQHw
nPqjx+IhsOKK0ISkq2jKlBPbg/H8VRcOPItcufMMaPi4zW3Xti0gpUUNMDxW klfJtJysqV5A
raEpTJ3Fp16NsZCCsONrAWogHasKxkA/F8VVix6F03YpnWtP6J0rYpC9iHJN uiNsuqbDiFlG
UNJJBKByzjIHxUBYr43dnrW83Y5kKFcDt4T0yIqS0nwhnc2lxsqyMgYWMEg8 8YOf6A1Jr6fb
rreb25aLtGt9ym21Nus1nWxKfWxJUwFpcelqQAdpUUkDAPjcsnQLRabVZ45j 2i2QreyrZluK
wlpJ2NoaRySAPBbbbQPiShIHIAVTZfRyp7RF202m8pBn3x+7FxyKVNEOTDJM d1sLBcbOeGob
k7hnszigIzUvSVJSqwqt1qvMSWnU4tN1tDjDKpSiqC+8hsELU3hR4Cw4lwJx 2qACq7Z+vFz3
dMOW3rVqLmpl2q8Q5rTYdZ2Q5DqmlkFSRzQ0sKQoggjBwTUTA6HZNtV1i0X+ 12qSnUDV7aRB
sSWYrakQlRuCGUu+IrduUd248xkE7hNxejdSkRHrpeUzZx1A5fLi6mJw25S1 RHIvCQjeS2gN
qQBlSz4HMknIA7tLdIdsv9xt8dq1XiFGuzC5Fomy2m0s3BtICipvatS05SQs BxKCpOSAcGrl
WbdG/RXF0XcYa4yNLuxYDJYivNacbYuJTt2jiykuELO3kSG0lXl7TnSaAUpS gFKUoBSlKAUp
SgFKUoBSlKAUpSgFKUoBSlKAUpSgFZV7rn83HWf0NH2zdarWVe65/Nx1n9DR 9s3QHkSlKUBu
XRJquBo7oSm3a5SrfFjq1FwS5NecabBMdJHhNtOHPLygD9ucA9Xf80d849H/ AM0lf2dVXSH5
LdK/vTtH9TVeketyvOXvSGulcgxjv+aO+cej/wCaSv7Onf8ANHfOPR/80lf2 dbP1uV5y96Q0
63K85e9IamzBjHf80d849H/zSV/Z07/mjvnHo/8Amkr+zrZ+tyvOnvSGuW73 sWm0zLrcJ7zM
OEwuRIcypWxtCSpRwMk4AJwATSzBkXf80d849H/zSV/Z07/mjvnHo/8Amkr+ zrXe7EozIrLQ
nutSWluiQlX4JvbtwlWTkFW7lgHxVZxyz1dblecvekNMgxjv+aO+cej/AOaS v7Onf80d849H
/wA0lf2dbP1uV5y96Q1zu3Wa3cY8QJnrS824syEq/BNbSnCVHdnKtxxgHxVZ xyyswZB3/NHf
OPR/80lf2dO/5o75x6P/AJpK/s61X3yH3z+97jTOtdS67v3fg9m/ZjOc7s/s xjy18dcXG4R9
FXyRHnSmXmrdIW24h5SVIUG1EEEHIIPlpkGYd/zR3zj0f/NJX9nTv+aO+cej /wCaSv7OtA6I
ZEhvoh0QhD7qUjTdtwAsgfBGqlffIffP73uNM611Lru/d+D2b9mM5zuz+zGP LTIMq7/mjvnH
o/8Amkr+zp3/ADR3zj0f/NJX9nWt3m/t2eD1243B5iPxmmd+Vq8N1xLaBgZP Na0j9mcnArs6
3K85e9IaZBjHf80d849H/wA0lf2dO/5o75x6P/mkr+zrZ+tyvOXvSGnW5XnL 3pDSzBjHf80d
849H/wA0lf2dO/5o75x6P/mkr+zrX7fdZstpxa0z4pQ840EvqwVBKikLGFHw VY3Dy4IyAeVf
ORf22LxEtDtweTNmMuvMNZWd6GigLOewYLiO0888s4NMgyTv+aO+cej/AOaS v7Onf80d849H
/wA0lf2dbBcLnMiQJEpHXZSmWlOBhheXHSATtSCQNxxgZIGT2iuPUepjYbA9 eprk4sMhBW22
rK/CUEgYKgO1Q8tMgyvv+aO+cej/AOaSv7Onf80d849H/wA0lf2dbP1uV5y9 6Q1n+iJ013ps
6SuJMkL4MSxtt7nSdiNkxW0c+Q3KUcDykny0yCsd/wA0d849H/zSV/Z07/mj vnHo/wDmkr+z
rSbtru0WuPdn5t3lJRZ3WWZwbZecU2t0ILaQlCSVlXER4oPb/jX607ri2X6Y 9Bt9zmpmsthx
yJLjvxH0oJwF8J5KV7c8t2MZpkGad/zR3zj0f/NJX9nUrpHpfsGp9SwLDabr pybMmvBtDMSd
KddI7VFKeqAHakFRyQAASSACRetcXG4R9FXyRHnSmXmrdIW24h5SVIUG1EEE HIIPlr59BLzv
ey0G1xV8P3t27wdxx8Db8lMg8T6e+AO/TJX27lSNR2nvgDv0yV9u5UjXBJ73 08zwrvqNfA4f
FuSF7uDs4n4pHTuzwkb/ABcbtz3i7d428JqZqG08zwrvqNfA4fFuSF7uDs4n 4pHTuzwkb/Fx
u3PeLt3jbwmpmgIbWTPHtDCOBxsXKAvbweJjbLZVuxwncYxndtG3G7e1jiom ahtZM8e0MI4H
GxcoC9vB4mNstlW7HCdxjGd20bcbt7WOKiZoBSlKAVGaldlM25pcNbyXTOiI UWklStipDaVg
4ac8EoKgTtAAyStofhUSdQ2smePaGEcDjYuUBe3g8TG2WyrdjhO4xjO7aNuN 29rHFQBM15Bv
nSHqy2vtMR39Z3h5bDshTdsW6+pppsoC3FgKBSkFxPhdnPnjlXqWPZri1wt+ rL09w9m7e1EH
E28HO7awPG4TmcY+EO424a4Xmzo+/wB+bp/km8/awq36KpGnGc5Rva2DJqI7 6kI35uQ8fpH1
sbkxCuMHpFswefMdL9yaejtB0NF3hlRX4xQkqCe3HPs51N++rVHzkvH15z1q tvuiv9jA/wA7
I/8AhHarmmpTrNknNW2c1CuS32jxFvpZKmQF7khaiB4xQSnPP9uK3060K0N6 gl0Mdem6c1FN
8C63zVttnuQn9TXVTjeMlE50jmAfKR8dfNV/1emCicdQXgR3HVNJX19zmtIS SMbs9ik/96sT
0xkakvU+HeVJWXmQlMO4NxEuo2HK96gQpIIA2AeX9lfHVEwPW24wrVdmUQ27 tIcWy3LSlKmV
hvaUoyN6dwUcJBx8XOiawtqK2nl7iu++rVHzkvH15z1qe+rVHzkvH15z1qu7 D8VcyDGVc1zn
Gb5D6ot64tvqW3vUFKQhIy0k+DlJJ8nLlUWqXGafhe+C4RZ4F4Q61tdDwajj O/IGdqSSjwDg
+CeQopxf4Q4yX4iAjal1M87w1aqujI2qVucnOgcgTjkTzOMD9pFfP31ao+cl 4+vOetVmZnKQ
llN8u8SZPBmFt5MpDuxpUZaQkrBIAUsjajORz5DNcsq7JeDsBye2uELCylLX FGzjJZbI5dm8
KGPj5YqU1f5Q07fMRMy/6vhuIbkagvCFLaQ6kdfcOULSFJPJXlBBr4++rVHz kvH15z1q69Zz
Zc5m2vquXWovU2EJbMsLKHEtJSvLecpO4HmQM/tquVZCMWrtIrnJp2TJj31a o+cl4+vOetT3
1ao+cl4+vOetUPSu9kexzvl3Jj31ao+cl4+vOetT31ao+cl4+vOetUPSmyPY b5dyY99WqPnJ
ePrznrU99WqPnJePrznrVD0psj2G+XcmPfVqj5yXj68561PfVqj5yXj68561 Q9KbI9hvl3Jj
31ao+cl4+vOetT31ao+cl4+vOetUPSmyPYb5dyY99WqPnJePrznrU99WqPnJ ePrznrVD0psj
2G+XcmPfVqj5yXj68561Nc3W6XP3OPSd3SuUybw4cXh9YfU5sy8c43E4zgf9 qh669Tfm49KP
0OH9say6yEVRk0v3c0aSUnVV3+7GS0pSvDPZNS0h+S3Sv707R/U1Wp9LMIy0 6fXOtkm62Bi5
Fd3hMR1SC41wHQ2VMpBU6hLpbJQAfIcHFZNp95yN0P6ckMxHpjrXSda1ojsl AceILRCElakp
Cj2DcpIyeZA51q3vh6Wv1H3H/Udv9pXSZDM6YgwYmpdMo1Bpm4yLCTfHYFtc t7khceKpyJwt
8YJUvZnJSjaSgKRkJ2+D959h1Aqy6S7uW1T1kYYnhcKbZX7sI5W+FRA7GaWF lSWPACvC2EEE
AkEXJ+d0mP3iJd3egm4qmxGXWGHffLAGxDpQVjHFwcltHMjIxyxk56TqTpXD qWj0I3HepJUB
74rf2DGf/E/aKm6BBaD0ls1YzMu0GReBb9OwkwJU+AtnDqZUtaQlLpUUOISW gColaQQSRuNU
z3vXe6Mz2YmkWIPdXSlyamwo2nn4baZhS0plt111RTIdSvdtdCR2KIJzy1P3 w9LX6j7j/qO3
+0p74elr9R9x/wBR2/2lLoFS1DaJUy1WwaCsUy0lOm7ww2hFtct5akr6rhOF oRsWspVtUcZI
JBOM1HXXTzE9m4M6S0pdrVYHkWlqVEVb3ohekJuLSlrS2oBRUhoK3ugYIwdy tuRfvfD0tfqP
uP8AqO3+0p74elr9R9x/1Hb/AGlLoHToa0JsmrtUw4Fs7nWda4r0Vppjhxys tEOlsABOcpTu
x5e3maiOmG2aguF0jq08xKMoadvDLTzOU7HV9V2JC+xC1bVbSSOYJ8hr83yV 0oXiMiPL6FdQ
NIQveDD1lGirzgjmpl9KiOfYTjs+IUscrpQs8ZceJ0K6gdQte8mZrKNKXnAH JTz6lAcuwHHb
8ZpdA+HR7arTF6Tn5em9MXCy2g2BtpRdtzsRpT/GJICVpGV7cblY8LlzODV2 6QP9w9Qf8rk/
ZKqA98PS1+o+4/6jt/tK4dQXHpau1huFr7ytxZ65Fdj8T3w29WzekpzjijOM 9mRS6B9LXGu0
z3M1niWFTibm9ouGiLw17FlZgt4CVf8ACo9gPkODVcg2+Hb9QX64aO0LcGoA 0mptEN23uw2p
UjiKJa2rSCVlONygMq5cyRUzpGd0qWTR9hsTPQ1c5YtdqiQHHjfre3vcZYQ0 4Qninwd6FYOe
YwcDOBKe+Hpa/Ufcf9R2/wBpS6BmD+mZL8bUUVvS7b1mLdompjRNLvwWFuNT VGRw47pWpTnB
5KKQCsYGD5ZbpYgd0bdJY0/o1phuNYguyvjS8p2TxcukNMbC31JaCEHKwCSs ciBg3n3w9LX6
j7j/AKjt/tKe+Hpa/Ufcf9R2/wBpS6Bnd6iife9eNtaeuErVT8qCm0zmoS1i LJ6jFO7igYj7
VEKUVFO5PLwsYEtq+zSntR6gK7BcpWqJF1iuaeurcRxbcaMEschIA2MpSpLx WglJXk8lbhVi
gzukyDNuE2L0E3Ft+4vJflL98sA8RaW0Ng4LuB4DaBgYHLPaSa7PfD0tfqPu P+o7f7Sl0CsW
XSfdLWNsTftPuSbe3M1K6tEuKVMHizmVNFYUNpCk7lJzyONw7M1zWiwMtSej +4am0xJnNwYk
+CpT1pcluR18drqu9IQpaQEoXhZGE5zkZ53D3w9LX6j7j/qO3+0r/DqDpaII PQhcufxajt4/
/pS6Fia6T40iZ0aaoiRGHZEh+zS22mmkFS3FqZWAlIHMkkgACso1rp9T8XUf dHTN1uOoX5sJ
dolsQHXeHESiOChLqRtbSlSX97ZIKsk4O4VYLXE6RrdPamx+hrV63W87UyOk BD7ZyCObbklS
VdvlB+PtFT3vh6Wv1H3H/Udv9pS6Be6z3Qf5bOk76PY/spdff3w9LX6j7j/q O3+0qvafT0qW
rW2qtQudEFzcevzdvSzFF7t4DaYyH0uEr43MkvN4G3yq7MDJtA+et7bc+r9I j6LVcXkPXizv
sBmI46p9tsRC4ptKQSvbsVnaD4p+KrBFee1T0nWW+W+1XSHbbRAltvy58FyI p9bxaCWkNupS
4QOGVElIAITgknl9ffD0tfqPuP8AqO3+0p74elr9R9x/1Hb/AGlLoWJ/pA/3 D1B/yuT9kqv3
0E/k30H/AJbt3/s26p+oLj0tXaw3C195W4s9ciux+J74berZvSU5xxRnGezI qY6GldIFqb0p
pm9dGs+22+3WiNCk3V26w1pStmIlBIabcUopLidoxzwQSBzANoHkLT3wB36Z K+3cqRqO098A
d+mSvt3Kka4JPe+nmeFd9Rr4HD4tyQvdwdnE/FI6d2eEjf4uN257xdu8beE1 M1DaeZ4V31Gv
gcPi3JC93B2cT8Ujp3Z4SN/i43bnvF27xt4TUzQENrJnj2hhHA42LlAXt4PE xtlsq3Y4TuMY
zu2jbjdvaxxUTNQ2smePaGEcDjYuUBe3g8TG2WyrdjhO4xjO7aNuN29rHFRM 0ApSlAKhtZM8
e0MI4HGxcoC9vB4mNstlW7HCdxjGd20bcbt7WOKiZqG1kzx7QwjgcbFygL28 HiY2y2VbscJ3
GMZ3bRtxu3tY4qAJmvPN06ArldeH3Ua0zO4WeH1lKnNmcZxuaOM4H/YVtsfU tuf4WyNehxdm
3fZpaMb+DjduaG34Q3nONu13OOC7sznp7tk++aktNti6s1Pp5mNp283QmyXF UVT7rC4SW0uY
BCkgOr5dvPkRzzp01XZLa3ZP2uVVaMalm+hUYPud34EpEuDA0nFkIzsdZZKF pyMHBDWRyJH/
AFqU7zWqPP7P6Zz2dfqw6On6P6UNOvN9Iuv72w5qJ21uRLxelSI7jRs78ncp G0AqDiRg9gA7
M861HVOo7pbtTWfT9osse4SrnGlSA5ImmO2yGCyDuIbWTnjeQHBA5YJI2xqV Z1PLoSTw30jw
m3y+yKHpafMrmWd5rVHn9n9M57Onea1R5/Z/TOezq+xdfzbtGsbWntPty7pc 4T0xyPLndXaj
IZWltwKcShZUriLCUgJ54JJSKh7p0kT75pi5uaXsLrio1jVNnuOzeA7EUsPJ DbYCVBx1KmXD
4yE8hhXOtcNL4jJ2aSzZ3ccZaznGU0u/S5z6agQELoi1dDmMzI1ys6H2HEuN q4jh2qScg4Le
DzFfJXQ3qlSipU+zkk5P4Vz2dWGd0qMWCBbraruZJmx7HGuE1VyvKIa3AtBw lnelRedOxRIO
0DKcq8KtOtM6Pc7VEuUQqMeWwh9oqGCULSFDI8nI1Rqoa3SxU6kbJ8PGf8ru rkx0tGWEYf3m
tUef2f0zns6d5rVHn9n9M57Ot5pWL19Y69FSMG7zWqPP7P6Zz2dO81qjz+z+ mc9nW80p6+sP
RUjBu81qjz+z+mc9nTvNao8/s/pnPZ1vNKevrD0VIwbvNao8/s/pnPZ07zWq PP7P6Zz2dbzS
nr6w9FSMG7zWqPP7P6Zz2dO81qjz+z+mc9nW80p6+sPRUjBu81qjz+z+mc9n TvNao8/s/pnP
Z1vNKevrD0VIwbvNao8/s/pnPZ07zWqPP7P6Zz2dbzSnr6w9FSMG7zWqPP7P 6Zz2dO81qjz+
z+mc9nW80p6+sPRUjBu81qjz+z+mc9nUP0u6Mumkfc49I3dJ+G71uHH4fV1q VjY9zzuSP0hX
pGsq91z+bjrP6Gj7Zuq6mrqVIuMuDunpacJbkeRKUpWY0GpaQ/JbpX96do/q arcp+k9K6o6b
9Qe+bTVlvfVtN2jq/dGC1I4W6Tct23ek7c7U5x24HxVhukPyW6V/enaP6mq9 JX7Rb8/VT+o7
ZrDUFglyYLEKQiA3DW26hlby2yRIjukKBkOeKQCCOXKgKxf9EaL01rzo7nac 0hp+zS3NQPsr
fgW1mO4pBtU8lBUhIJTlKTjsyB8VaLPQ67JDTD5jvLivJbdCQrhqJRhWDyOD zwarUTQsvu/a
Lvd9d6mvfciSuVGjTGoCGuKph1jcrgRm1nCHnMDdjJBOcVY7kpCZTaVy+qb4 7qEvApBQSUYI
3AjI7eYI5dhoCsdD9wvUy236Nfbw7d5FuvsqC3KdYaaUptGzaClpKU+U+TNX eqVoHTMLSMi5
Op1vdbwm4yFynm7guHtDyyNzieCy2QTgDGSn4gKtndCB57G9Kn76A6aVzd0I Hnsb0qfvp3Qg
eexvSp++gOmlc3dCB57G9Kn76d0IHnsb0qfvoDppXN3QgeexvSp++ndCB57G 9Kn76AofTBM1
Baej+TfdP3960vQJRWtLcZl0SAqSE7VcRKtowT4uDz7RWi1SNbaegaz00uyS tVT7PFckOKeE
ByMFPAOlSQovNOYAIBG3B/aRVktL0eFbmIsi/G5OtJ2qlSVsh10/GoNpQjP/ AJUgfsoCTpXN
3QgeexvSp++ndCB57G9Kn76A6aVzd0IHnsb0qfvp3QgeexvSp++gOmlc3dCB 57G9Kn76d0IH
nsb0qfvoDppXN3QgeexvSp++ndCB57G9Kn76A6agtZLujdnuC7IFG6JtUswt qUqPH2p4eArk
fCxyPKpTuhA89jelT99cN2XGmAsouhiJejPMiUw6kLaUdnNJII3DtGQf8DQF R6IrzcXpk2y6
kumqnb83FYkuQ77FgtbGzuSXGFREJStBUCDuUpQ2p5Jzz0WqhpXTtqsl5l3y XqidfrtJYRGV
MuUhjchlCioNoSyhtCRuUSSE5JxknAqzd0IHnsb0qfvoDppXN3QgeexvSp++ umgP5vae+AO/
TJX27lSNR2nvgDv0yV9u5UjQHvfTzPCu+o18Dh8W5IXu4OzifikdO7PCRv8A Fxu3PeLt3jbw
mpmobTzPCu+o18Dh8W5IXu4OzifikdO7PCRv8XG7c94u3eNvCamaAhtZM8e0 MI4HGxcoC9vB
4mNstlW7HCdxjGd20bcbt7WOKiZqG1kzx7QwjgcbFygL28HiY2y2VbscJ3GM Z3bRtxu3tY4q
JmgFKUoBUNrJnj2hhHA42LlAXt4PExtlsq3Y4TuMYzu2jbjdvaxxUTNQ2sme PaGEcDjYuUBe
3g8TG2WyrdjhO4xjO7aNuN29rHFQBM1QOk/TuqrnfYNz0zFssrbZLnapDdxu DsXZ1pUVSXEl
DLu7b1dWUkJ8Yc6v9UbpT6S4HR+/bmJWm9T316cxIkBuyQUyVMtMFoOOOArS UpBeR4XMc+eO
We6dOVSSjFZIbsRkWw6+uOtrPc73aNM2+BDva7q6qHen5TpzbXYYbShURsHw nAoqKhgAjBq9
S7LFk6kt9+cceEmBGkRmkJI2FLymioqGM5HBTjBHae3ligaQ6aYGodXQNNua C1/Yn5z647cm
8WhMaOl1LC3+GpXEJCi2gkJwSRz7OdajVs4VdNOzw7fZ3T/yLqRTu97b2Ils btl5vFrl21Eh
pmdGW0Xi0+sLcbUFtqQpJUEkeDkbRgg5z8HujKyJtyrfbbjd7THetqbZLTEe RmUwN5HEU4hR
35ccO9JSo7zknli8Uq9eJ6tfjff73z3y212buiNkexVHtDx0PxpNpvt5sslq CzAdehqZJkst
Z4YcS60tORuVhSQk+EeeOVWhlHCZQ3vW5sSE7lnKlYHaf21+647zdINng9eu L/Aj8ZpnfsUr
w3XEtoGEgnmtaR+zOTgVROtW1LjF/E+mMv27v2X9iUkjspXOiUpVzchdUkpQ hlDokkJ4SypS
hsBzncNuTyxhSeZ546Koaa5JFKUqAKUpQClKUApSlAKUpQClKUApSlAKyr3X P5uOs/oaPtm6
1Wsq91z+bjrP6Gj7ZugPIlKUoDUtIfkt0r+9O0f1NVv11a1BfOlO7WSHrO9W GBb7Jb5SGrdH
hK4jr781K1KMiO6fFjtgAEDt+OsB0h+S3Sv707R/U1XoW8W3WkDpFuOo9OWr T9ziXC0QoS0T
7u9DcaXHelrJARGeCkqElPlBBSeVAcU+JqTTWsNGoXr7UF5iXW7uwpUWfGt4 bUgW+W+CCzGb
WFBbCDyVjGQQc1eJ63m5Icjsh95MV5TbRXt3qBRhOfJk8s1TXrfr6+ar0tMv dk0zbIFmuTs5
1cO+Py3XN0KTHCEoVEaHjSASSrsSeRq6TC8mYgx0IW8IzxbStZSlSsowCQCQ M+XB/wADQEH0
cannaottydudnatMy33J63vMNTOsp3N7fCC9iO3d2Y/6mrRVE6KLPrCyyL+N S2+wx2blc3rk
0q33N2SpKnNuW1BcdsYAT4wJz8Qq90ApSlAKUpQClKUBWL3cNTwYrfvb07Bu 5LshT6pd06ml
sJcOACGnCpSsnHIAY5kZrv0RqCNqvSFp1LEYeYYucRuS207jegLSDg45HHxj ke0VVOkuzazv
9uhWvTrVoes7smQbyxLuT0J2U2Fnaylxtl3CFHO/kCQNoIBNXawoktWaI1Mg woD7bSUKjQnS
6wzgYCUKKEEpAxjwE/4UB20pSgFKUoBSlKAUpSgFRGpbtCsMSTfLk6WoVvt8 mVIWBkpbbCFK
OPLyBqXqva7sLGqbDc9NSXVMs3W1S4a3EjJQHEpRuA8pGc/9KAjOjLWsjWIm OriWOO0wE/g4
N8ROfZUrP4OQhCAGXBjxQpYznnyq6VnfR/pDUFv1VHvt9YsUHqNiRZo8e0uO OJfSlaV8Ve9t
GzG0BLY3bdy/COa0SgFKUoD+b2nvgDv0yV9u5UjUdp74A79MlfbuVI0B7308 zwrvqNfA4fFu
SF7uDs4n4pHTuzwkb/Fxu3PeLt3jbwmpmobTzPCu+o18Dh8W5IXu4Ozifikd O7PCRv8AFxu3
PeLt3jbwmpmgIbWTPHtDCOBxsXKAvbweJjbLZVuxwncYxndtG3G7e1jiomah tZM8e0MI4HGx
coC9vB4mNstlW7HCdxjGd20bcbt7WOKiZoBSlKAVDayZ49oYRwONi5QF7eDx MbZbKt2OE7jG
M7to243b2scVEzUNrJnj2hhHA42LlAXt4PExtlsq3Y4TuMYzu2jbjdvaxxUA I9muLXC36svT
3D2bt7UQcTbwc7trA8bhOZxj4Q7jbhrhUzpR/wB+Yn+SdQ/a22tMqG1PpPSu qOr++bTVlvfV
t3V+6MFqRwt2N23ek7c7U5x24HxUBTNRflE03/nZf/69Jr79J0CJI1bZZWo7 DMvumW4UpC4z
EByaluWpTRbcWyhKifADqUrwQkk9mc1P2To90DY7ozdLJofTNsnsbuFKh2ph l1vckpO1aUgj
KSQcHsJFWatWj1L01XzF2a5s8q2H0ZEluVjztBt7Ue7CHrPTN2vMxGjIrbLK Yi5rrCzJmcJC
tgUUuhG1PFOAkpVlYzz7tT6c1E/LgI1ejriTpuHFaknT8m7mPOSFiStvq7iS w6VFCg6RzwMK
G0g7e3a4Ld7fvSGMT34zcVx3erwmm1LUhOM4GC4s5xnnz7BXZXuT/iOfmb4R tj+zxfbe6jn6
3XJV5OLMyO16dkQhru/y9OLv97baZTAclxi2uZi1sNr4eclG9W9KthySCkk4 qoSNMSZEbUUV
vS7b1mLdnmpjRNLvwY63GpqlSOHGdK1Kd4PJRSAVjAwfL6LpVVH+Ia1N325+ Hr/p22+ny9Lc
vnFpdJMxjV9oflXCa9YLBcG7Cq02dLkSPAcjKditz31yI6GylJCuEebeAopV jHhDPMxphq5X
yE3A0xNi6PXqhh5iA9AcjtoSm3yEvOFhSQWmVOFtOFJSFKzy8PnuFK4h49Vh BwjHpa932Sv/
ALsYfu11wdJNlR6L7e7aoN7t3UnIUJi9SRAYLZQhDCtqhwx2bNylYxy8gq3U pXj6iu69V1Jc
ssSsrClKVSSKUpQClKUApSlAKUpQClKUArKvdc/m46z+ho+2brVayr3XP5uO s/oaPtm6A8iU
pSgNS0h+S3Sv707R/U1Xou96m1V7+JmmdM6cstw6lbYs6RIuN5dh/CHZKEoS lEZ3OOrKJJI8
Ycq86aQ/JbpX96do/qareLlemNNdMN7nXO26gciTtP2tmO/AsUyc2pbUi4Fx BVHaWEqAdbOF
YOFCgO1OqNaQNS6ftmo9LafixL1OchIkQL+9JcaWmK/IBLa4jQKSI6k+NkFQ 5GrRdlx2n0yJ
S3EMsRnnVqQpQISkoJ8XmeXkqiXfUkTVGttCM2i16m/Er29KkuzNOT4bTTXc 2a3uU4+yhAyt
1tIGckqGK0CY6liYh5YWUtxnlEIQVqIBQeSUgkn9gBJoCJ0hetP6strtxsUy c/HZkLjOF0SW
FIcRjckodCVDGR5MVM9SZ/Tk/WXPWrPuhC5plSNVsqtd+hKkX2VPZNws0qGl xlzYEqSp5tIJ
OD4Odw8orSqA5upM/pyfrLnrU6kz+nJ+suetXTSgObqTP6cn6y561OpM/pyf rLnrV00oDm6k
z+nJ+suetTqTP6cn6y561dNKAqt5vdk05EbdupvJDzzwQIUSZLOErOSpLCVl I5jmQP8A81K2
V603q0RbtapzkuDLaS6w+3KcKVoIyCOdVzX0y1IsSbbdo+r1Mynn1Jd08xNU 6hSXDhKlxRuR
ndy3YScHPZXb0QQrnbujHT8C8Q0wprENLa2AhCC2BnaFJR4IXt27tvLdnFAW LqTP6cn6y561
OpM/pyfrLnrV00oDm6kz+nJ+suetTqTP6cn6y561dNKA5upM/pyfrLnrU6kz +nJ+suetXTSg
ObqTP6cn6y561OpM/pyfrLnrV00oDm6kz+nJ+suetXFdOrQcyH+uqZjxn3lh njPOkJ2EhKUZ
Ws4HJKQST2AmpauZz/6ox/6Ln9SKArWl9WaX1JeJNntr1+bnxY6JLzE6BPhK S0tSkpV+HQjI
JSoDGfFPxGrL1Jn9OT9Zc9aqj0WwZr0rUerbrDkRJl8uSgyzIbLbjUOPlmOk pPNO4JW7g+V4
1d6A5upM/pyfrLnrV00pQH83tPfAHfpkr7dypGo7T3wB36ZK+3cqRoD3vp5n hXfUa+Bw+Lck
L3cHZxPxSOndnhI3+Ljdue8XbvG3hNTNQ2nmeFd9Rr4HD4tyQvdwdnE/FI6d 2eEjf4uN257x
du8beE1M0BDayZ49oYRwONi5QF7eDxMbZbKt2OE7jGM7to243b2scVEzUNrJ nj2hhHA42LlA
Xt4PExtlsq3Y4TuMYzu2jbjdvaxxUTNAKUpQCobWTPHtDCOBxsXKAvbweJjb LZVuxwncYxnd
tG3G7e1jiomaUBDR9S25/hbI16HF2bd9mloxv4ON25obfhDec427Xc44LuzO enu2T75qS022
LqzU+nmY2nbzdCbJcVRVPusLhJbS5gEKSA6vl28+RHPOv1QOk/TuqrnfYNz0 zFssrbZLnapD
dxuDsXZ1pUVSXElDLu7b1dWUkJ8Yc67p1JUpKUXkNXKPYdHT9H9KGnXm+kXX 97Yc1E7a3Il4
vSpEdxo2d+TuUjaAVBxIwewAdmedalqjUdxg36Dp+xWdi6XSVGelqTImGMy0 y2pCSSsIWSoq
cSEpCefMkgCqxFsOvrjraz3O92jTNvgQ72u6uqh3p+U6c212GG0oVEbB8JwK KioYAIwatup9
Ls3q4Q7mzdblZ7lEbcZbmQFNhwtObSttQcQtJSShB5pyCkEEVso14Va6lqcq z72vZ2vts7X7
ZOWrL4SrwOki5Xl7Zp/SqZQRZm7o91q4cBSCp15pTAAbWC4FMKAOQk88lOBn mv8A0xWqIqOb
ai1vIXaGLuvuldkQVrZeClNoZSpKuK6Qknb4KRlOVc6/SOjQt6reZt8+8Way t6di2xt+HJbL
j+HpKnkL4iVnJC0K4gAVlR2qB3VY5Gh4TcmPIsV2umnXGoTUBXc4slLsdrPC QpLzbg8HcrCg
ArCiM1685eDwqYjdWxmXt8zV/wDisPkr/mWOOx64n324XfuVZIxtVtQ0szJN w4SnuLDbko2o
4ZA/2iUqKlAAeEN3NIqt46U7rOs1yj2EafN3gS7WS7AvSZsVbMmWlop4gZyl fIpUkoykLCkk
kAVfJGi7TJt2pIEp6Y+zqIATtzg3co7cfwSAMeC2k888yfJyqOk9HECYq4PX C/XybKmxo0cy
HFsJUyI7xeZU2lDSUBQWc80kHAyDVenr+FRnulDjZj4nxt3XzZ3+K/C4ss4N T7nHe9YyLFqG
U1NtLjt1NutyW4ke5KXHcfkynmUITuQkJ8IZU7tyU48HwRn/ACR0hXaPOasj 2mGO7yrs1blx
0XImOEuxnX0PJdLQUUYaUkgoChhWAcDdLXLQVuuin37lc7pKmPRIsYyytpt1 Cozy3mnk7EJS
lwLXnkNvIDb25QNBW2POj3GTc7pcLk1ck3JyZJW3xH3Ex3GEpUEISgIShxWE oSnnz8pzyqvh
mxucbyt/VzZW6/Lfd78dL2m0yS0bfXb9AlLkwkwpkKa7ClMoe4qEuNntQvak qSQUkEpB58xU
PqrWdxtt3uUCzafRdhaICJ9yWubwClCy5tQ0NiuI4Q0s4JQns8LnXZwXNKrl m06fvd87pzXZ
r5juxQGVqCQR+Fdb5HHLG7sOT2Vw3PSLGqlO3aQvUOmZFwidRuMRp+OFSWEq XtQ4U8VI8deF
NqSsBZGR2DPShpFWdSaXlvhX4eL3Se61r297XdiXutZckdI6TJAbvt0iafbf sFj6u5KmqnbH
VsOx2nyttrhnJQh3JSVJ5AYJJwPjqXpdtlm1HcbcUWpUa1SWo00vXZDMtSlh CiWIxSS6lIcT
klSckKCQoiv9jdG4m6h1SJ8m5QLHPmRQiDGeaDE2O1EjoCVgpUtCQtC0kJKC oDBynFWZ/SKB
fZV1tt/vNpE11D02LEUyWZLiUpRuIcbUpBKUJSShSchIzz51tk/CKcknG/wr rLlqDy1fPz8K
12r+3P8AMZGQNaXeZbb5dRZLXDt9smSoTb828cEOrYkForUeEQ22QFEqJJBG Np5KqLt3Sm5c
osdu2Wi23G4O30WZSYd4S9E3KiqkB1D4b8JG1IBGwKB3ciQAbJJ0Pa39OyLJ 1qc229dF3VLy
VILjUhUkyQU5SUkJcPIKSoYGDntr4QNAW6NdRdXrrdps3uqm6rdkON+G8mKq MAQlCQEcNXYA
OYHk5VTCr4XtqOUM52/N7Wvnrm+U19CWp4ONOvZrsOLFj2FpzUEi7vWkQlTi mOlxpCnFuF/h
k8Php3A8PcSoDbVetevbpZbBcJ11htCQ/qeVBJuVzLUOClKSrw5GxexvKcJ8 AAlSeSc1c5Gh
7a5vdYnXGJL7qrurMtlbfEYeWgtrCdyCkoKCpJSpKvGPlwR84GhxbrU9Ctmq b/DdkTnZz8tK
o7jrrjvjhQcZUjbnmAEjHkwOVdQr+GqLSgstXvu9+qvZcWw5XvfAamWKyy3J 1pizXUxkrfaS
siNI47XMZ8BzA3p+I4GfirrqN0vZIWnLBDsluDnVYiNiC4rcpWSSST8ZJJ5A DnyAFSVeFW2e
ZLy/lu7fTp3/AOyxXtkUpSqyRSlKAVlXuufzcdZ/Q0fbN1qtZV7rn83HWf0N H2zdAeRKUpQG
paQ/JbpX96do/qar0xqHXWn7HfFWSYm9SJ6IzcpbVusc2dw2nFOJQpRjtLCd ymnAASD4JrzP
pD8lulf3p2j+pqvRdo/Lfqj/AC3Zv/c3SgPvbOkPTc+8wLQhvUEWXcHVMxRP 07cIbbq0trdK
A48yhG7Y2tWCckJOKsEoPG4xwytCFcFzJWgqGMo8gIqsdIf+93Rx/mR7/wCJ uNWW4R2ZckRZ
CA4y9FebcST4ySUAj/saA+uyf5zG+rq9emyf5zG+rq9eqD0DW+Babdqu22uK zEhx9UTUMstJ
CUoT4HICtHoDm2T/ADmN9XV69Nk/zmN9XV69dNKA5tk/zmN9XV69Nk/zmN9X V69dNKA5tk/z
mN9XV69Nk/zmN9XV69dNKAjoCJvAVtkRwOM72sE896s/8VdGyf5zG+rq9esp 6drvjTa9MyI1
4TbJzM5+4SodtkSEqbbUrbGKmUK2cRZG4qwOGhYz4QNXLoamMz+iXSchgPhH ciMjDzC2lZQ2
lJ8FYBxlJwcYIwRkEEgWTZP85jfV1evTZP8AOY31dXr100oDm2T/ADmN9XV6 9Nk/zmN9XV69
dNKA5tk/zmN9XV69Nk/zmN9XV69dNKA5tk/zmN9XV69Nk/zmN9XV69dNKA5t k/zmN9XV69fB
xMvr7A47HE4TnhcE4xlHLG7t/bmpCql0sS2oGhdRTH5kyE2zYZ61SYadz7ID Y8NsZGVjtHMc
wOY7aAsmyf5zG+rq9emyf5zG+rq9esa6DrebH0hPW1+zWawvSdNRZCYdkk8e LJCXCFSXVbU4
eJUkDkrIyeIvHLbqA5tk/wA5jfV1evXTSlAfze098Ad+mSvt3KkajtPfAHfp kr7dypGgPe+n
meFd9Rr4HD4tyQvdwdnE/FI6d2eEjf4uN257xdu8beE1M1DaeZ4V31GvgcPi 3JC93B2cT8Uj
p3Z4SN/i43bnvF27xt4TUzQEFqrhzoaYTbRfcZnw3lpUwVJSG32nScllxO4J TkYAOcYW2rDi
ZiLJakpWWivwFbVBaFIIOAewgHsIqgdKembrqaImHbdQ3WzLZvEGYoR4ra23 0NPxXSoqWw6d
6AysoAISV4CwpPKrJbbdNcCVC/XdAZUhK3FsMIVMKQwS44FM8irhLQdgQMOu YAIQpAH21Vf2
LKy21ubM2SlfVkOHCTtxkk+XG5PIczn4skV/RfSjprUVvflOyEW7gTnYalPL /BKUhCVlaXMA
bNqgNyto3BQGcAmG6VZkGfLn2+42R6XKhNqatzCWy4ZXEQ2pS0px+kCgYBwU L55OBnzHRBr6
/QLVpG/qj2fTqo4enuw30LU2CTmMjPPic+aiFIGSdyyNqs3hVSOs11aFSptp wXbr245vwlho
z6iGpoyU1mL4S56Zf3PR/WY/WxD47XWS3xAzvG8ozjdt7cZIGaj3tSadZcjN vX+1Nrl/Bkqm
Ngvc9vgDPhcwRy8tVzpZTcYka23ixlCbsl425ncrG5MocP8A67XA05/g2f8A GorW2mtQmxy9
N2OLKXak2RMOGmN1QBxwJWkpfU+CoJ8QjhjOSo5BxUVK04tpK9v3+p9Jo/DN PWhTnUqKKlfl
pWs7Pn6xa75V1a5fJ1+scCaIM6826LKUjeGHpSEOFPx7Sc4/bX7k3i0Rbkzb JN1gsTn+bMZy
QhLrn/lQTk/9BWYaxhXG3WW/RJdoTM7qXGE+icX2iELxHQGlJKt+8KQdu1JB 3DmOdSV50rdn
dQXxt1u9SYF3mMyUuQXISUICENpAcLyeKkpU3kFBPIjABznl6ipdpR/ef059 zRHwjSbYylVS
TT6rLWzj6bn8Ly9vKvi+t3i0OXZdobusFdxQncuImQgvJHxlGdwH/Su6s5ga fvSJNvtTlo4a
YV+fua7vxmyl1ta3VgABXE4ig4EKBSBgHmRgVo1X0pyknuVjytfpqNCUVSnu v7p9eccX5s8r
qKUpVpgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFZV7rn83HWf0NH 2zdarWVe65/N
x1n9DR9s3QHkSlKUBqWkPyW6V/enaP6mq9Pak0RovUs5E7UekNP3mW20GUPz 7azIcSgEkICl
pJCcqUcdmSfjrzDpD8lulf3p2j+pqtyn6T0rqjpv1B75tNWW99W03aOr90YL UjhbpNy3bd6T
tztTnHbgfFQFmsnR7oGx3Rm6WTQ+mbZPY3cKVDtTDLre5JSdq0pBGUkg4PYS Kl7klDkptl2J
1tp2O6hxohJCkkoBBCiAR5MftrO7/ojRemtedHc7TmkNP2aW5qB9lb8C2sx3 FINqnkoKkJBK
cpScdmQPirRZ6HXZIaYfMd5cV5LboSFcNRKMKweRweeDQEPprS2ltMvuyNN6 FtdleeSEOuW+
DGjqcSDkBRQQSM+Q1O9Ze+T5P8TfrVUeh+4XqZbb9Gvt4du8i3X2VBblOsNN KU2jZtBS0lKf
KfJmrvQHN1l75Pk/xN+tTrL3yfJ/ib9aumlAc3WXvk+T/E361OsvfJ8n+Jv1 q6aUBzdZe+T5
P8TfrU6y98nyf4m/WrppQEXGXxoLzD1tdfacW8laFcMpUCtWUkFXPtwfJX3i ERIrUWLaXI8d
lCW2mmg0lDaAMBKQFYAAGABWcdJuqr7b9Qae0lp5N2TIu3dCU67a40d2UG2H EDY31khlGS6C
VLyMIwAVKFXfo/u8e+6Ntt0jT5U9DrWFPymUtPKWlRQsOISAlKwpKgoAAZBx QEp1l75Pk/xN
+tTrL3yfJ/ib9aumlAc3WXvk+T/E361OsvfJ8n+Jv1q6aUBzdZe+T5P8TfrU 6y98nyf4m/Wr
ppQHN1l75Pk/xN+tTrL3yfJ/ib9aumlAc3WXvk+T/E361c8hxTktoOQXVhTL qFNK2HIJRnPh
Yx5KkarPSPcrtZ9L3e7WGF166w7RLfhx9pVxXUpSUp2jmrmByHM9goD76dsN h04Hxp7R8Kzi
QoKeEGJHY4pHYVbCMnme2pbrL3yfJ/ib9asw6K9bm5dIEjS7GsxrOEuyt3JN w4DKCw8HeG4z
llCU9ikK2EFaOYUTkY1igObrL3yfJ/ib9aumlKA/m9p74A79MlfbuVI1Hae+ AO/TJX27lSNA
e99PM8K76jXwOHxbkhe7g7OJ+KR07s8JG/xcbtz3i7d428JqTnS4sCE/OnSW YsWO2p1995YQ
20hIypSlHkEgAkk8gBWcaKc1q/f9RJ1Tpex22DGu0dNveiSluKSC1DOxrdFa 4rRUt4l0qyF7
m9pCQqpnpEiagvXRDrC2v2yK3cpljlR40eHKVIDji4mCnKm0HPFUtA5c0pSr wSooSBa3LhAb
fiR3JsZD0zPVW1OpCn8J3HYM5VhPM4zy5101jbWprHq3WOgTpq7sTVWmJMlX JTH4Q29JicMB
5P8A4a96wNisKOFcuRqlxNT3iJpC72+x3td+uDDcBVyv1v1PJnxiwqSlEhZC kr6i9s3qKW0q
2JyoeIBQHpggHGR2dlK8+WqTcrlJslvia0bkWOdqlllIsuq5Fycbb7ny1usL mKShwpUptCgn
Kik5IKcJxv0KO3EhsxWlOqbZbS2guuqdWQBgblrJUo8ualEk9pJNAfORAgyJ sabIhRnpUXd1
d5bSVLZ3DCtiiMpyAM47cV00pUWOnJtJN8HA9ZLM9dkXd60QHLi2AES1RkF5 IHZheNw/7130
pRJLgmVSc7bne2EKUpUnApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUA pSlAKyr3XP5u
Os/oaPtm61Wsq91z+bjrP6Gj7ZugPIlKUoDUtIfkt0r+9O0f1NV6Sv2i35+q n9R2zWGoLBLk
wWIUhEBuGtt1DK3ltkiRHdIUDIc8UgEEcuVebdIfkt0r+9O0f1NV6+oCmRNC y+79ou9313qa
99yJK5UaNMagIa4qmHWNyuBGbWcIecwN2MkE5xVjuSkJlNpXL6pvjuoS8CkF BJRgjcCMjt5g
jl2GpClAUrQOmYWkZFydTre63hNxkLlPN3BcPaHlkbnE8FlsgnAGMlPxAVbO 6EDz2N6VP310
0oDm7oQPPY3pU/fTuhA89jelT99dNKA5u6EDz2N6VP307oQPPY3pU/fXTSgO buhA89jelT99
O6EDz2N6VP3100oCm36xWq/Lgzxf5Nmuluek9UnQXmQ6hDqiFow6haFJUEoO Ck80pIwRmpXS
cGw6Z09EsdrmNiLFSQlTsgLWtSlFS1qUTzUpSlKJ+Mmp2lAc3dCB57G9Kn76 d0IHnsb0qfvr
ppQHN3QgeexvSp++ndCB57G9Kn766aUBzd0IHnsb0qfvp3QgeexvSp++umlA c3dCB57G9Kn7
6d0IHnsb0qfvrppQHN3QgeexvSp++uSe/FfdSlNwSwlyO80H2nEgoUdnNJOR uHaMg/4VKUoC
paVsNpslzl3eTqWZfLtKaQwudcX2S4llBJS2lLSEISnKlE4SCSeZOBiyd0IH nsb0qfvrppQH
N3QgeexvSp++umlKA/m9p74A79MlfbuVI1Hae+AO/TJX27lSNAf0GRbrehaV ogxUqScpUGUg
g/H2V1UpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUp QClKUApSlAKU
pQCsq91z+bjrP6Gj7ZutVrKvdc/m46z+ho+2boDyJSlKA1LSH5LdK/vTtH9T Vevq8g6Q/Jbp
X96do/qar19QClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlA KUpQClKUB/N7
T3wB36ZK+3cqRqO098Ad+mSvt3KkaA/ohSlKAUpSgFKUoBSlKAUpSgFKUoBS lKAUpSgFKUoB
SlKAUpSgFKUoBSlKAUpSgFKUoBSlKAVlXuufzcdZ/Q0fbN0pQHkSlKUBqWkP yW6V/enaP6mq
9fUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClKUApSlAKUpQClK UB/N7T3wB36Z
K+3cqRpSgP/Z
--------------050309000902070705090809
Content-Type: image/jpeg;
name="before.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="before.jpg"

/9j/4AAQSkZJRgABAQEAgQB+AAD/4QAWRXhpZgAATU0AKgAAAAgAAAAAAAD/ /gATQ3JlYXRl
ZCB3aXRoIEdJTVD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8S EhEPERETFhwX
ExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEU Hh4eHh4eHh4e
Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAAR CADkAhcDASIA
AhEBAxEB/8QAHQABAAIDAQEBAQAAAAAAAAAAAAUGBAcIAwIBCf/EAFkQAAED AwIDAgMQDQkI
AgIDAAECAwQABREGEgcTIRQxFSJBFjI3UVJTVFZ0lJWhs9HS0wgXGCM2VWF1 kZKytPAzOGZx
d5Ok1OMlNDVCc3ax4SRigbUmcoL/xAAaAQEAAwEBAQAAAAAAAAAAAAAAAQIE AwUG/8QAMxEA
AgECBAIHCQACAwAAAAAAAAERAgMEEiExQWEFE1GRoeHwFBUiQlJicYGxI9Ey ovH/2gAMAwEA
AhEDEQA/AOy6hob27XF0j8/dstsNfK52du52UN2zmnbnbjdykbtuN7u3a1M1 DQ3t2uLpH5+7
ZbYa+Vzs7dzsobtnNO3O3G7lI3bcb3du1oCZqE1mpEDTd3vSHQxIiW911Lq3 tjaeWhSklYLr
SCkHJO5xsYzlaR4wm6pnFXVdn0rpe7z9Q3Zi3W1qCokc8syJKyh08mOsOtnn FLatgSoKz1BG
MgC2RojMda1t8wqWAFKW6pZwM4HjE+mf01Daj0lbb5N7ZIdlMPKZSw6WHAkO tpKiEnIPdvX3
Y88c56Y84GsdPOW8XVzVNgetLrZXHuDUptMd3YHlOhK95SrYlhxRwegQsnok 4/OIt0uVrs8d
VsjOSHJEkMuJbO1YRsWolKj0SfFHU+TOMEgjJjlZ6ip36c1K1iJId12lnU/r cz7bpnT1uatr
cKywGvBSVpgL5CSuPv8A5QoWfGBX/wAxzlXUnNSL8eO+tlb7DTqmF8xpS0Al teCncnPccKUM
jyEjy1z9pfiZedPwr/dbq+wm1NSGkQrdKcJfZbb3Jcx5QVgthIBKU7c7TuJO 1m9aPS9JaSvl
us/Pc1KI5ZjuSeWGObHU+CpQSchITg4HpkZ7jqporWEt4iunLTUtPX7UDBV1 YqvJb/56ypiN
5lv8Mskm02qTEkRJFthPRpKy4+y4wlSHVHGVKSRhR6DqfSrzj2Oyx4saJHtF vajxXQ9HaRGQ
lDLgzhaABhKup6jr1NU+6cSo1tucmHJZtaRAdaYnpN1Sl/mLShSuQ0UAupTv HjHYTg4BIxUh
C1jNeltqesjbNuXeHrSmQJm5zmIcWhK+XsA2Eox57IJ7iBk8Festxx/B7VXR nSVFtVNNUvVf
EtdOGurj9wSt/wBNwrlZ3rbHbjwkvzWZjxbYGHVoeQ6oqAxkq2YKj6eeuMVl xLHZYcAwIlot
8eIXQ8WGoyEt8wKCgvaBjcCkHPfkA+SqxprUOoVWG83G6sWnbEuEtllxy48p ASiQtG1ai0Ah
KUjG7xirHUZNYcfWCr/KsoivMMrY1CIcrsE/tEd5JhuuDa4kJ3p6p6EDCk93 QGq9balVRqzr
7Bj4rtur4aG22mmpha9vBJdnLUvUi3W+S6p2RBivOLDYUtxpKiQ2vegEkf8A Krxh6R6jrR63
W94SUvQYrglY7QFtJPOwMDfkeNgADrWTStOVHiK7Wtm/X/i7iOn2KyXCczPn 2a3S5bGOU+/G
QtxvByNqiMjr6VSNKUSS2FVyutJVNtLbkKUpUlBSlKAUpSgFKUoBSlKAUpSg FKUoBSlKAUpS
gK7xP9DXVH5nl/IrrgDTH4NWv3Gz+wK7/wCJ/oa6o/M8v5FdcAaY/Bq1+42f 2BQG4rppzhhp
62WE6gf1guddLRHuKuw9mU0nmAggb8HvSenXpjqaj8cFfV8Qf1Ifz1+cahlv RAyR/wDxGD3f
1uVrlK1NkpWc+kc1nvYhWalnWj4nr9HdEV9I2q3YqTuUx8HFraU9nD3Wmmup sfHBX1fEH9SH
89McFfV8Qf1Ifz1Qojq40hqQgNqW2sLAcbStBIOeqVAgj8hBB8tXq8TJE+z6 XitWq2KduzKx
IEO0xW3nVCU4gbFJbBSdqUjpj8vlrunK1PKrSpqapc8/Xr8H3jgr6viD+pD+ emOCvq+IP6kP
56zbFp23QLtbrkwXmGJDNyjSGRPYmqRshqO5K2sJyQs+KQCCPKDUfpu3W5qf bbxahLajzIdz
ZUxJcS4tC2oq8kKSlIKSHE/8owQR1qSp944K+r4g/qQ/npjgr6viD+pD+esa 6aRtUC0uJenI
bnt29uYHl3KPscWpCXOSGP5UHarAVnqR53BzVTh22RKhSJbTkNLccZWHZjTa z0z4qFKCl/8A
+QaAuuOCvq+IP6kP56Y4K+r4g/qQ/nqD0bZ7XdWJXai5ImpcbRHhNzmoinQr duUFuJUFEEJG
wYJ3dKl4ujbWi2wzcpXZJM1h14OPXGOymLtWtCUrZX98cJKOpTtxnpkgigPX HBX1fEH9SH89
McFfV8Qf1Ifz1kT9Pw7g0i7T1FbUe3WuOhhM9iIVqXFCtxceykABHcASc+QA moe8WHTtjjGV
Kky7qzJlusRDCktISlCEtqKlr2rClffANqcDxT16igJDHBX1fEH9SH89McFf V8Qf1Ifz1Dal
btDWkNNqj295qc/DcW4+HkbV4kOpJUkIBUenQ7ugwOuM1+WBemE6ampuaM3L pyCEkp7+m7rn
9THTGc91ATWOCvq+IP6kP56Y4K+r4g/qQ/nqM4ZyY0J+9TXW5nPj2xxxl2LJ DLjZ3JSSlRQr
CsKwCO7r356ZLun7G7dY0VTl0U4bWm7TX1PIUSns3PW2hOzqonGFk9MnIOMk DKxwV9XxB/Uh
/PTHBX1fEH9SH89YsbTmnn7au+Zujdv8GuyUx+chTwdbkNtFG/YAUkODxtow fIcdfydp3Txb
fagrugkKtIujCnnUFDadoUWlAJBWcbvHBT5PFoDLxwV9XxB/Uh/PTHBX1fEH 9SH89VjTNthS
2LncLkZColujJeW1HWEOOlTiG0pCiCEjK8k4Pd3danZem7BCtEy8veFH4obh OxWEPIQva+Hd
yVqKCMpLfRQT1HkGegGVjgr6viD+pD+emOCvq+IP6kP568kaMtzDt0kyX3H4 kZcZMdozmIa1
B9ovJKnHcpBSnoQAST6QBrDvtgsFptD0lEmVcnXLg9EiqjyG+VtS00tKlEJV uILuCEnBx0Ix
1AkccFfV8Qf1Ifz0xwV9XxB/Uh/PWXZtI2pm62uU/BfbLF6iRJcORcY0guBx Sh46EJy3gowU
LByCRkYNVuWzDc0/f5Nu7bEjszoqOzOPpcSskP8AjKIQnu29MAY3HvoCZxwV 9XxB/Uh/PWTb
bfwjuc1uDbY3EmbKczy2I7EVxxeAScJTknABP9QrWtX77H30W7R/0pf7q7QF l8wejfahxj+C
Wfmqo8So3D7TNguiY1t17Fv7MBUmJFu7TDCD54JWsAbyjKFdw8YpIyOpFz4i 8QtUaX1tc9Jw
9R26RCnOMLcvkqIojSIfVtSiSG2+UsK72eYpBBP30lGFHU/2RLTkfiTrRh2U 9LcbscNC33gk
LdIjuArUEBKcnvO0AdegA6VLQI+lKVAFKUoD+iFQ0N7dri6R+fu2W2Gvlc7O 3c7KG7ZzTtzt
xu5SN23G93btamahob27XF0j8/dstsNfK52du52UN2zmnbnbjdykbtuN7u3a 0BM1W+IMSG5p
TULl1DL1pdtLzVwjuKDfNYDbm9IdU62lvKVKG5S0gd5UkdRZKidSdom2y42i El9El+GtCX0K
KQyVpUlKsodbc6EE+ItCunRSTggDMix30SXZEh5txS0IQAhsoACSo+VR9VVe 1XY7/Nuyplpu
DCG3YiYymn84aIUolaBgglQWM938mnv8ljiyi884yuO8wttKVEOFJyFEgY2k +pNRms9QxtN2
puZJKUh54MIWvziFFKjlWOuMJPd5cDoMkZMdRZrsVdc4p3bmB16sLrG4gpFt 4GaNZ8GOXFU6
5vRXVyJaX3csz3VHOXWznCUnuQkgEdF7+udiXW1x7jJtr763Uqt8rtTQQQAp fLW3hWR1GHFd
2OoFa40ZxbYnLvAusdaoFueZZaujDf3t/cFc0kd33valSlJ7w4MJ6ZNuvGtL ZCg6euMZuRcI
N8dSGHozDrn3pTKnUuBKEKKshIwnAOCT/wAprSrrrwtuuqerSimZhLkWwGbE XJwymqqdt3o5
8JMp7TSRd5Fwg3i523tbiXZceMWi0+tKQncd6FKSSlKQSgpzgeXrRGlremK1 GD0rY3dV3QHc
nPNU6p0p7vO7lkY78Y6+WvqXqywxLiIEiY4h/LaVnszpQypzGxLiwna2pWRg LIJyPTrBvOuL
RCtN3mxG5k1VtjvukIhPhl1TWQpCXuWUHxhgkE4wSe41xbsqW2j1aKOkrmWm mmrWI0/S1jXR
wm3sfT+jIbsedG8KXJEaVNE9DILRTGkB0Pb0ZbJOVjOFlSfyV9Q9GwmLh4Qd uNxlyjcU3FTj
y0eM6mOWAMJQAE7D3ADqB/VXo9fLtLtsabp+xiYlxKlOie85BLeMdAFtFRJy cHaB076kNM3Z
m/aet96jtONNTY6H0ocxuSFDODjp/wDkdKKm1VVC9epIuXsfbtOqpwm4e0y+ DW6nLx3idSRp
SlaDyRSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKArvE/wBDXVH5 nl/IrrgDTH4N
Wv3Gz+wK7/4n+hrqj8zy/kV1wBpj8GrX7jZ/YFAbj4r2G+3SJol+12a4zWU6 ThIU5HircSFZ
cJGUgjOCOn5RVHVozVak7Tpa+Y9wO/RrrHR34AaV/MkX5MVH3/Wlhsd4TZ5p ujs8x0yeTBtE
qYUtFSkhSuQ2sJyUqHXHdUVWqa18SmTvZxd6w6XaqdLTlNaOeDnlw7Jcbs5e b0bq5KcHTF8P
pf7Pd+jUk1aeIDSratqw35CrZ/uak25wFrxy537evjKJ6578d1dKzdSx4Vxh wpMC4NmbcEwI
zqm0hDi1R1P7x42dgCFJORncMYx1qcqbdqm3SqadkMVi7mLvVX7sZqnLhJa/ hJLwOXG/tmtO
Rlx7Hdo3ZVurYSxZQ0ltTiNiyEpbAyU9Pj768H4nEZ6WzJNgvDa2GXGGktWc ttoQ4lSVgIS2
EjIUrJxnrnvrqqqdF4laXk3ZNpaRqHtxShZZXpu4IUlC1FKVq3MDaklKhuOB 4p69DV8pnk0I
7A4hO2xNve03dHWUthpK3LLueSgdyA6W94SO4DdgDpUV5j9W+1a+e8Hfo12D UbqW8xbBavCM
xt5xrtDEfDQBVueeQ0k9SOgUsE/kz391Mok5is1r17aArsOmLkCVBYU9ZOcU KHcpJW2Sk/lG
K9WonEZuGYqtPXZ9slakmRZuctBWSVbFrbKkZJJO0jqc99dVUplEnK0eLxGY cUsafu7iVMNM
Kbes/NaUhpIS2ChbZSSkDoSM9/Xqa/Y8biKwl9CNOXJTb7nNU07Yw42leMbk IU2UoOABlIHc
PSrqilMok5Mcs2u3bO1aXdNXZcVlRU0FWglbeSSQlzZvCSSTtBxk91YPmP1b 7Vr57wd+jXYN
KZRJyNC07reGmQmNpu+NiSyWHf8AZzh3IJBI6p6dQOo61kt2viE3c49yRYr6 mXGaQy04Lavo
2hAbSkjZgjYNpyDkZznJrrClMok5UmQuIsvmh6wXgIdjdkU21aC22lreHNiU JQEoG9IV4oHX
PpmvHwVxA5m/wBfN3Y+xZ8GL/kdu3b5z0vL3/lrrGlMok5KtFj13aZK34OnL 0hTjZbcSu1rc
Q4g4ylSFIKVDIBwQe4VPRFa8btl2D2m729PnPxVAuWbmMcppLo2FtSNoA3I2 pCcDb5MCul6U
yiTlViJxHamzJhsN5fcmqCpKZFpLzbpHcShaCnpk46dPJisabZtezGEsP6dv XKTIXJShu1rQ
EuKSlJI2oGOiEjA6DHQV1nSmUSctyU8TZCVBdjvCCuSiUtTVn5alvIJKXFFL YJUConJ6nPWv
B2FxDcedd8zdzbLz7T7iWrIG0Kca3bFFKWwOm9WenXPXNdV0plEnJqbNrxO3 Gm7v4kvtg/2S
r+V6dfOd3TzvnfyVl6Wj690zqZOpYeirnOnNof2NPQ3mm1LdbWjJKWzgDfuw B1xjIzkdT0pl
EnN7WreLbMO4QmuDmnW4tyccdnspt0oIlLcGHFOp5eFlQ6KKs58ta04i2jWU iNqPU190f4Ci
qtLUVDMSI8iMwhltaEAb0JCBgoAH6PIK7brW/wBk76AurfcY+URRoHNVKUqh IpSlAf0QqGhv
btcXSPz92y2w18rnZ27nZQ3bOaduduN3KRu243u7drUzUNDe3a4ukfn7tlth r5XOzt3Oyhu2
c07c7cbuUjdtxvd27WgJmqxre32+VGkyL07cotsjspkOyoV4ct3KDYdKi462 62rYEqyQTt6Z
PcCLPUNrt7s+h79I5/Z+VbZC+bzuVy8NKO7fzWdmO/dzWsd+9HngBhW/TMTs Xg5Xh5mI00UN
rdvclUhRUHkr3Ph4uqwHjt3KO0hBTgoQU4GvX7n4TQx4DduEFLCXIimWyoiS eYhW4jO3CVIx
nGd6u/Hi3WvxakoQpa1BKUjKlE4AHp1mxeHeItO2qss8V5l7dSpqlqTn5ngp q+62+JDu2oIs
C3z33HrtEigpcjNlW5LTeMocUeoUo4CT1+++XbN200uLZdOQdMx4qG9PvtKi RZMhaUFpDC2Q
gubVqGEr7yFE7evfmpFm7tm+SmnJkQQExmVMObmxudKneYN3MJOEhroW0gZ6 KXkhuRuEpqDA
kTX0vKajtKdWGWVvOFKRk7UIBUs9OiUgk9wBNbK7tdeHt4ep/DQoXr9Irhms Ped6havfnMyv
F7FFuGiZz16ubyo7E2DdpCJMhtd6lxgyrloQpPLbGx4fewQTsPkPQCvyXo29 S37tHZMO0QJ8
SYw63HnvPtyFvJISssLQlDJBJUSgkkkipHT/ABK0tfb2uzW0agXNbdDTyHtO XBhLCygLAdW4
wlLeUkKG8jII9MVO6qvsTTloFznNvuMmVGi7WUgq3vvtsoPUgYCnEk9e4HGT 0rJ7NQesum8U
klOyhbvZJLSYmEuHCd9SuajtutbpZLdbURLIhjqm6MJujyOe2AAlCXQwSEq6 7xtBx0B6k1br
Ul9u2x25EWNEdQ2EqYjOFbTeOm1KilOQP/6j+qsTVV9iacs/hSc2+4z2mPG2 spBVuffQyg9S
BgKcST17gcZ7qlK6U28rmTJfxjvW1bypJNvSeP7ffvCSkUpSuhjFKUoBSlKA UpSgFKUoBSlK
AUpSgFKUoBSlKAUpSgFKUoCu8T/Q11R+Z5fyK64A0x+DVr9xs/sCu/8Aif6G uqPzPL+RXXAG
mPwatfuNn9gUB25o78ANK/mSL8mKp93sN6uHGOROg3e7WWKmwR2zJixmVoeW JD5LZU80sZAI
OE4OFDPkqw6fu0eBofSbL0a5uqNiiKzGtsiQnGzHVTaFAHp3Zz3emKhrxaOH d5uLtyu+gEXG
a9jmyZWj33XV4ASMqUwScAADPkAq62IIC7Wm9Oa+kyYsCUlKtXMSGnywothA sqm+bnGNgcwk
nu3dO/pUZwcsFwg32zvz0vQbxGiON3gJ03JYVNcKRuL81bqmpB5g3JUnJ9La CRWzoV5tEKGx
ChWm8xosdtLTLLOn5iENoSMJSlIawAAAAB3V7eaOF7Bv/wABTfqqaAmKpghX H7bd6msMOttO
6biMMSVNnlF4SJRKd2MEjckkd+CPTqb80cL2Df8A4Cm/VVWIWnuGUKYxNhcN 48aVHcS6y8zo
x5C21pOUqSoR8gggEEd1TINdRdP3tWnosfSdgvFo1M3p2Wxf5bsdcczJamkh I56gEvuqdClJ
dSVBIz1TnFSEuyoeXMXozSt1tNkItAfirtrsbmyUXFpalhpSQVKQ0Fb3QCCM eMrbkbc80cL2
Df8A4Cm/VU80cL2Df/gKb9VUaA1/oO3i28TJHYbIqY3JcmOy7pMsD0SZGKnN wQqWvxZSCTtS
E+dSlJyQK2xUP5o4XsG//AU36qnmjhewb/8AAU36qplAmKVD+aOF7Bv/AMBT fqqeaOF7Bv8A
8BTfqqSgTFKh/NHC9g3/AOApv1VPNHC9g3/4Cm/VUlAmKVD+aOF7Bv8A8BTf qqeaOF7Bv/wF
N+qpKBMUqH80cL2Df/gKb9VTzRwvYN/+Apv1VJQJilQ/mjhewb/8BTfqqeaO F7Bv/wABTfqq
SgTFKh/NHC9g3/4Cm/VU80cL2Df/AICm/VUlAmKVD+aOF7Bv/wABTfqqeaOF 7Bv/AMBTfqqS
gTFKh/NHC9g3/wCApv1VPNHC9g3/AOApv1VJQJitb/ZO+gLq33GPlEVcPNHC 9g3/AOApv1VU
D7Iu6sXDgXq9pmNc2yiAFkybbIjpxzUDopxCQT1HQHPf6Ro3oDnmlKVzJFKU oD+iFQ0N7dri
6R+fu2W2Gvlc7O3c7KG7ZzTtztxu5SN23G93btamahob27XF0j8/dstsNfK5 2du52UN2zmnb
nbjdykbtuN7u3a0BM1Da7e7Poe/SOf2flW2Qvm87lcvDSju381nZjv3c1rHf vR54TNQ2u3uz
6Hv0jn9n5VtkL5vO5XLw0o7t/NZ2Y793Nax370eeAEzWJev+Dzfc7n7JrLpQ FKlPakMya5J1
dpWRZ1Jf2QmLU4iVsKVctPPMtSSoEpyeV42DgJz0tEBu6okPqnzYT7Ks8lDE RTSkffHCNyi4
oK+9lpPQJ8ZC1dywhGbSgNYCPeLfK4uz2NPSLkuS825BiOIUhFw22yOgpQr/ AJgVJUg7fKCO
+tXztPXcWvVkG2aYlKs8pqxPpiWbTUq0NOvIuWX+Wy6sqDoaCSpwbOgST53d XSV+uLNnsc+7
yE7mYMZyS4Oa23lKElR8dxSUJ6DvWpKR3kgZNZtAaIdsbjls1QdJ6ZuVs04/ dbAuFA8GOxcv
tTW1S3kR1JSpCNnKyraAS2tXUZJxtL6avKOIbci8l2JqBrUMiUue1pWW47Ki F1zY0biHeRyC
ypKeWUjZgDZuTk9AUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSl KAUpSgK7xP8A
Q11R+Z5fyK64A0x+DVr9xs/sCu/+J/oa6o/M8v5FdcAaY/Bq1+42f2BQHQKd L2PV3ETRdq1D
FflwmeGrcpLLc1+OOamSyhKiWVoUcJcWME461a/tKcL/AGty/h64/wCYqN0b 6LOkP7LEfvka
srXV9vidQajjw9SpsDFgsTVzaSWGViWtZeyXC4knlJ5SUkIKVZUfGHSrLYgy PtKcL/a3L+Hr
j/mKfaU4X+1uX8PXH/MVWJmtNSqhaxvwvxhuWJMF+NZezskLLsRh0suFSOYd 7i1oSUqSQonq
egGdeNTa5l6u1C1Y49xKLJPYjsxG+wJivNltpxSpCnnA+CoLUElvCRgeeO4V OgJn7SnC/wBr
cv4euP8AmKfaU4X+1uX8PXH/ADFYEO93lOnL5fLpqe6jdfZVpt8aDDilSMTy wyE70eM4cbAp
atgCsqBI3VWnLjf7/d7TablebzBkWnWSYrb7jcHtQSu2OujmctLjJWCpSRtA BSrqnd3NAW5j
g9wmffkMMWR112MsIfQjUNwKmlFIUAoCR4pKVJOD5CD5a9vtKcL/AGty/h64 /wCYqLuV/vo1
pL02xeDb2pWombf4REdkutI8FokbU7kbC4tYwCtKsAkAdEgeNiv2qr3qW26e Gp3mGG3bww/c
I0VguTExnYyWljchSEqBdUlW1O0lKug6bWgJr7SnC/2ty/h64/5ivFjg9wmf fkMMWR112MsI
fQjUNwKmlFIUAoCR4pKVJOD5CD5as3DW6zb3oi23G5LQ5MWhbbziUbQ4pC1I KsDoM7c4HTrV
Oul/vrmup2nYl08GMy9RtQhNajtFxhsWtEgoTvSUqWtaSAVhWASAOgwhAy4v B7hNK5vZbI6/
yXC07y9Q3BWxY70nEjooeUHrVW4ocMNA2RjTKLbYZLKrnqi2W59fhu4KUGHZ CQ4E5fIBUkFO
cdAo4wcEXTgsXfBmokvzkT3UajmtqkJSE8wpUlOSE9Arp1xgZzgDury4292h f++LN+8ijSgD
7SnC/wBrcv4euP8AmK8YvB7hNK5vZbI6/wAlwtO8vUNwVsWO9JxI6KHlB61O cQbhc2Z2nLPb
biu1C8XFUZ6chtC1tJSw67tQHEqRvUWwkFSSMZ6ZxVG03dJcLT9ygNXq6yLp N1dNisPWmPFM
iUpCVKUPv45KDtbJUTgZSQAMgUhAsf2lOF/tbl/D1x/zFPtKcL/a3L+Hrj/m KqelJ961VrHS
MydfLjDlRmr5DcU03E3OhiXHR44CXEBSkgb9hxlGUFIzmXb1hdhryzqhzr1L sl0vUm2ES2IS
IuW0P5DGwiTuQtnBKwUqG7uymkIEr9pThf7W5fw9cf8AMV5S+DnCeHEely7E 9HjsNqcddd1D
cEobQkZKlEyMAAAkk1C6A1bqJ206GukzUKr+7qGI+ZcMMMoDammFub2+WgKB C0BtQUVDc4MB
PQVHS9Yanj6Kh3hWpG7q5ftK3C5LjGIxy4DrcYOpLYCcltKlctQd35JGSOoL QFvRwW4XLSFo
05JUlQyCL/cSCPfFfv2lOF/tbl/D1x/zFQt01BqplOrbyzqBxuNYZkFEeCmK zy3ULjRXHUuK
KN+CXVY2qSUk95GAJzQcGSjiXryUq9TltC5sZhqQzylboMchRIbC+nnRhWMJ 65OSUIGPJ4Pc
Joy2G5FkdZXIc5TCXNQ3BJdXtKtqcyOqtqVHA64ST5KO8HuEzMliK7ZHW35G 7ktK1DcAtzaM
q2jtGTgdTjuqd4hXOZbJmlzDSF9ovBadb5aVFxIiSV7QSDtJUhPUYPk7iQaN peZdrlqvhteb
rqQXJy8W6XOMXkNITGUphslLWxIVsTv2neVKyB1HUUhAsX2lOF/tbl/D1x/z FVDgzww0DqXh
vb79d7DJdmS5M/eU3u4ISlKJz7aEJAf7koQlIzknGSSSTW8a179jh6Cti90X H/8AYyqQpA+0
pwv9rcv4euP+Yp9pThf7W5fw9cf8xVI0dZrNfYHCWDfbXBucTwHcF8mYwl1v cOz4VtUCMjJ6
1euEhYZu2r7ZaHy9p6DdENW7DhcbZUY7anmm1EnxEuE+KOiSVAYxgIQKbxQ4 YaBsjGmUW2wy
WVXPVFstz6/DdwUoMOyEhwJy+QCpIKc46BRxg4IkOMWgtIaQ+x64hStO2cw3 5EBltx1ybIkr
2h5J2gvOLKQTgkJxnAznaMT/ABt7tC/98Wb95Fe/2SX83HXfuNr5ZNQ0Dl2l KVUkUpSgP6IV
DQ3t2uLpH5+7ZbYa+Vzs7dzsobtnNO3O3G7lI3bcb3du1qZqGhvbtcXSPz92 y2w18rnZ27nZ
Q3bOaduduN3KRu243u7drQEzUNrt7s+h79I5/Z+VbZC+bzuVy8NKO7fzWdmO /dzWsd+9HnhM
1Da7e7Poe/SOf2flW2Qvm87lcvDSju381nZjv3c1rHfvR54ATNKUoBSlKAht dvdn0PfpHP7P
yrbIXzedyuXhpR3b+azsx37ua1jv3o88Ei83Frm7NJ3p7l79ux2IOZt52Nu5 8ee5TeM4/wB4
aztw7ymu3uz6Hv0jn9n5VtkL5vO5XLw0o7t/NZ2Y793Nax370eeEzQGteOum rJrCRoTTeo4X
brVN1IsSGOatvfstk9xPjIIUMKQk9CO70q1U3wh4d6dj6f1JZtPdlusaTpaS 0/22Qva5Iubb
bytqllJ3J6YIwPJg1vnXunrrfF2GZZLvCtk+zXIzmlzICpbTm6M/HKFIS60f OyCQQrvSOhqp
o4d60fRb4dy1np96BFdtRcRH048064iBJTIbSFqmKCVKUnClbSMHoBWi3jMR boyUVtLsTcEO
lPVotmuLzdIEux2iyCGi4XmaqOh+Y2pxlhCGXHVqKEqSVnDeAkKT1Oc4FUjT N8udn03elPXG
2QrrI1VLj7hbpE5LygMkNR2VBxRITuxuO0BWScZrZl+sltvkZqPcmVuJZeD7 K2nlsuNOAEBS
HEEKScFQyCOhI7iaimtBaWZt7cFiA+w23NXPQ41OfQ8mQsFK3A6FhwFQUoK8 brk5zk16WExm
Et2FbuUueMJOYbe7f4UNRpPEpVTU3KKLYNU6r1Rq7Sjsa4xLcCxeGJ0dyBI5 by40lhsr5SnU
KQSk5SFglvcsHdnpLp17PRr232xMuFcbVPub1uBj2iW12daEOqH/AMtRLDyg WilSEhJBJxna
asTGgdLR2YbcWDJjdikvSWHGJ8htxLjyt7uVpWFKStQBUlRKTgZFfTOhdLs3 SPcm4D4fjTHJ
sdJmvlll9e/etDRXsSVcxecJAJUTWm7juja21kcRUkstPF1NS99Jp/EcVvVU 1riVTR2u9SSL
XpG76gbtDkXUkZxYZgMOJcjOIjrfB3KcUFpKW1jGElJKRlXfUXeNc6i8w6bj fINhmQNRaanX
CJEbZc+8bIvOSy8orIeQpBIUpIbwegHXItfC/h3bNJ2OydpjpdvMCAmMt1Mp 51hCykc1TKFn
a3vIySlKSry99Z0bh1o6M1LZatK+TKiPQlNLlvLQ1Hd/lGmUlZDCVdMhsJ7h 6QrrcxvRdvE1
OmhtJ6Qkph1RHxaRNOu7y6xLkqa2tysztaaniHUU2O1ZU2jT8qEypgx3C9Ib dYjuOAL5gSgp
5x2narPQEDGTL6Je1E/xE1qiXeIz9ri3FptmKYzm9sKhx1gIWXSlKfGJICPG UVK6ZwJ9/Slg
eiXSI7A3M3Vbbk1POWOapCENoOd2U4S0gdMd3pk59mNPWpjUb+oGGpDU+SgJ fKJbqWncJCQp
TQVy1KCQAFFO4AAZrDXjsK7VVFFEN0xML7Ofaq9d9V+FZU1T65krSlK8U6Cl KUApSlAKUpQC
lKUApSlAKUpQFd4n+hrqj8zy/kV1wBpj8GrX7jZ/YFd/8T/Q11R+Z5fyK64A 0x+DVr9xs/sC
gOgkap09pHiFpC66mu8S1wzwxbZS6+vG9ZmRiEJHepWAo4AJwknuBNSV34r8 Brw/GkXe/acu
D0VW6O5Khl1TKvTQVIJSeg7vSqT4ZejZov8AssH73Hq3aPt2qdUQLhd3uJWp rf8A7busVqND
i23lNNR577DaU8yItZwhpOSpRJOTUpwDVEPiBwKRqm6ahuGq9P3GZLnNy4rj 8AqchlMdpnCF
lJOTyt2Rjvx5MmTufFLgDdLkxcrnedMzp0fHIkyIPMdawcjapSCR169DW19F KvkDiLqHTlz1
Rc7/ABI1ots2OuexFQ40t56chwAx2WgUkR2/PAkEHr1qS1lebpp/T15vFps7 N2eiKLy2HZnZ
k8tLKVKVv2L9LuCTnNTmIg069xe4GP25+2vajsDkKStbj8ZcUlp1Slb1KUko wolRKiT3k576
w1cSfseVWx61quWlDAeWlbsY24cpxSQAlSkcvBIAABI6YrobTlx8Maett25P I7dEak8rdu2b
0BW3OBnGcZwKz6ZhBzjK4q8BZUKTClXzTb8WUUmQy5CKkPFKUpSVpKMKwlKQ M9wSB5BXtD4v
8DoQiCHqWwxhDaUzF5UVSOQ2opKkIwjxUkpTkDAO0ekK6IpTMIOZZ3GPQcdT bGmOJGj7Tb0I
6R3rI+8QsqJUQUOtgA57tvfk5OemSeLHBKXbnI951Npme5KKHJx8HqDUl1KU pCyhQV3BKQNx
UQABnpXSNKZhBzza+MnBK1RjFteqbHBYKt3KjR1Npz6eEoAz0H6KrfEzixw4 v72jmLVrC2PL
i6vtUt8qWW0tsokJK3FKWAAlIOSc9Bk9wNdVVjXX/hcv/or/AGTUZhBoO6cZ eCd1hqhXTVNk
nRVkFTMmOpxBIOQSlSCOh61hL4n/AGPy7X4LXd9LqgB0PdlMDLXMHQL2cvG7 8uM1uW5aqukD
iRaNMPWFnwddUPFi4id4+9psLUCzs7uuM7//AMVbanMIObHeJv2PrsWPEcuu llx4zxkMNKt+
UNOk5LiRy8JVnrkda+m+KPABu6G6t3jTCLgp0vGUmDh4uEEb9+zO7BIznPU1 0jSmYQcucP8A
iBwK0hZoEaNqvT7lyjwWoki5NwC09JCEgZUQkqx0HQqOKkY/E/7H6O5Pcj3f S7S7klSJykQN
plJVncHcN+ODk5Cs5zXSVKZhBzuvi/wOW1KZXqWwqblqSqSgxVEPFKUpSVjZ 4xCUJAz3BIHk
FYd24s8HXZi7xatW6Vi6g5YabuUm2LfWlvPVBKdiyMZ6bwM9evdXSlKZhBzV auMvDtboc1Lx
D0pdFMOJdhmNaH45Yc2qSV5W4712qIBG0gFQ65r1hcUuAUG4KuMK9aajTVKU tUhmDscKlZ3E
qCM5OTk+XNdIUpmEGhPt7cI/bxbv1XPo1UOCvFjhxpvhVZLXedYWyNNQ5PcW yFlakJXcJKk7
toOCUkKAPXCge4gnqqqxrK83TT+nrzeLTZ2bs9EUXlsOzOzJ5aWUqUrfsX6X cEnOaZiYNH3L
iN9jtc4UODcp+kpsWECIjEi2hxuODjIQlTZCc4HdjuFSsDjVwYt8NuHA1dZ4 kZobW2WWVoQg
ekEhGBW89OXHwxp623bk8jt0RqTyt27ZvQFbc4GcZxnArPpmIg5V4mcWOHF/ e0cxatYWx5cX
V9qlvlSy2ltlEhJW4pSwAEpByTnoMnuBqY4t670jrX7HHiN5lr5GunYocftH JChy973i5yB3
7FforpKtVfZc/wA3HWfuNHyzdRJJyJSlKgClKUB/RCoaG9u1xdI/P3bLbDXy udnbudlDds5p
25243cpG7bje7t2tTNQ0N7dri6R+fu2W2Gvlc7O3c7KG7ZzTtztxu5SN23G9 3btaAmahtdvd
n0PfpHP7PyrbIXzedyuXhpR3b+azsx37ua1jv3o88JmobXb3Z9D36Rz+z8q2 yF83ncrl4aUd
2/ms7Md+7mtY796PPACZpSlAKUpQENrt7s+h79I5/Z+VbZC+bzuVy8NKO7fz WdmO/dzWsd+9
HnhM1Da7e7Poe/SOf2flW2Qvm87lcvDSju381nZjv3c1rHfvR54JGmrc/wA3 fJvQ5u/dsvMt
GN/Ozt2ujb/vDmMY27WsY5LWwCH4qasvelIFnGnNK+ae63W5dhjwfCCIecR3 n1K5i0lPRLCu
hxnPfnoaHa+MHERyfazeeDfgu1TZNvbdneaaO9yG5shLDLnLSjcrKledGD06 4HWrbxeu1qsd
64fXS93OFbIDGpHObKmPpZab3Wq4JG5aiAMqIAye8gVrubrjRdzstjtdt1fp +bPdd0i03Fj3
Jlx1a27q2pxIQlRJUlPVQxkDqa0W71FNGV2032vNPhUl4ENczfF2utrtDCJF 2uUO3srUUIck
vpaSpQSVYBUQCdqVHHpJJ8leDmotPt2IX5d9tiLQRkTlS2xHIzj+Uzt7+nf3 1Fa6s0m73TST
jMRMhm3XxMyTuKcNoTFkJSvBPUhxbfdk5OfISKo/pi/w5rV1bspuDcDVsq6J t6HmkqfZdYW2
lxveoIC0rcKwFlP/ADHIOK3YbB4a5bpdVyKt90uL012bhavRTL0KOqpPYvsv U2m4lrjXSVqG
0sQJZCY0p2Y2lp4nuCFk4UT+Q1G2bW1mf0bC1Ne5sCxRpalISZkxCEBQWpIA WraCTtziqXp3
TGobNqFjU0jTSpjMhd0Pghl9grgdqdZWkgrWls7g0vftUcFzpuGTUda9E6tt Nm0XLbhXFl60
26ZDkwLS7CU8wp51CkqbMoFpSdqCk4KVYIx03Ct66MwGXL1qmd8y7K9OMaqn 4oa1Uab1z1dn
rQ3Uy62+yh5lxDjTiQpC0KylQPUEEd4r7qC4f2lNi0dbrUlqYylhsgNy3Glu oBUVbVFoBvpn
ACegAAHdU7Xz96imi5VTQ5Sbh9vM6rVClKVyJFKUoBSlKAUpSgFKUoBSlKAU pSgFKUoCu8T/
AENdUfmeX8iuuANMfg1a/cbP7Arv/if6GuqPzPL+RXXAGmPwatfuNn9gUB1P wy9GzRf9lg/e
49XTTkHiTpqNPtkHTukrhEcu9xmsSHtRSI7ikSZj0hIU2ISwlQDoScKUMjvq l8MvRs0X/ZYP
3uPV6tGqtfXxE2ZZNH6ZXAYuU2C0uZqR9l1zs0l2OVqQmEsJ3KaJACldCOtA ZujbXqrzcXzU
2poFlt/bbbAgx49uuTsz/d3Za1LUpbDWM9pSAAD509ay9bxL3cdLX+2afi2+ RNmpXGAnS1x2
kJWylJVuQ24SRnONvX0xXnpDUd/n6qu+nNR2K2WyXb4MOahcC6LmNuokLkoA JWwyUqSYyvIQ
Qoda99T3uyabgz7zfpMyPEbfCVKjtvukfeknzjIKj0BOceSgPXh3Dvdu0bbL ZqCNbo82FHbj
EQZa5DS0oQEhW5bbZBOM429PTNWCo+2iBcbdGuEN+S7GlNJeZXz3RuQoApOC cjII769+xM+r
k++XPpUBk0rG7Ez6uT75c+lTsTPq5Pvlz6VAZNKxuxM+rk++XPpU7Ez6uT75 c+lQGTWNdf8A
hcv/AKK/2TTsTPq5Pvlz6VY9yhtJt0lQXIyGVkZkLI7j5CaAqOtLRrabxG05 erPbNPPWyz8/
cZd2eZed5zYQrCExlpG3GR43jf8A1q/1T7nrDSFs1CmxT7lcY8svtx962ZfZ g65jltmRt5QW
rcnCSsEkgd5qz9iZ9XJ98ufSoDJpWN2Jn1cn3y59KnYmfVyffLn0qAyaVjdi Z9XJ98ufSp2J
n1cn3y59KgMmlY3YmfVyffLn0qdiZ9XJ98ufSoDJpWN2Jn1cn3y59KnYmfVy ffLn0qAyaq+t
4l7uOlr/AGzT8W3yJs1K4wE6WuO0hK2UpKtyG3CSM5xt6+mKn+xM+rk++XPp VB3+72fT7T0u
7O3ENrlJYaREZkyHXFcpKsBtkKWo4STnB7utAevDuHe7do22WzUEa3R5sKO3 GIgy1yGlpQgJ
Cty22yCcZxt6emasFQum59k1HZ2rvZZ78uG6VJS4H3UkKSopUlSVEKSpKgQU kAgggipHsTPq
5Pvlz6VAZNaq+y5/m46z9xo+WbrZzUVptYWlT5I9U+tQ/QTitY/Zc/zcdZ+4 0fLN0ByJSlKA
UpSgP6IVDQ3t2uLpH5+7ZbYa+Vzs7dzsobtnNO3O3G7lI3bcb3du1qZqGhvb tcXSPz92y2w1
8rnZ27nZQ3bOaduduN3KRu243u7drQEzUNrt7s+h79I5/Z+VbZC+bzuVy8NK O7fzWdmO/dzW
sd+9HnhM1Da7e7Poe/SOf2flW2Qvm87lcvDSju381nZjv3c1rHfvR54ATNKU oBSlKAhtdvdn
0PfpHP7PyrbIXzedyuXhpR3b+azsx37ua1jv3o88JmobXb3Z9D36Rz+z8q2y F83ncrl4aUd2
/ms7Md+7mtY796PPBIvNxa5uzSd6e5e/bsdiDmbedjbufHnuU3jOP94aztw7 ygJmla1466as
msJGhNN6jhdutU3UixIY5q29+y2T3E+MghQwpCT0I7vSrVTfCHh3p2Pp/Ulm 092W6xpOlpLT
/bZC9rki5ttvK2qWUncnpgjA8mDWi3Th3RNdTT5UprvzL+EOeB0/Sqzri9XS 3y7HaLKIaLhe
Zqozb8xtTjLCUMuPLWUJUkrOG8BIUnqc5wKqtu1rq656it2mowsUWcXbnHny nI7rrRVFVH2L
abDiThQf6pKiUnPjHb42mx0ZevUK4mkob1fBTr+Pha7Z4aoq60nBtCland4l 3iUxYoUKKzEu
MxqcuZITapVyabMSQI6ghmPhZC1nIUpQCU4zkkCpLSurdW6g1HGguwoFkjtW iNcJ6JkN7n71
SJDS0JClIKEqSxuSpScpyMpVnp1udC4m1Q7lyElM/ptfvVPaecSphXE3CNjU rSGpOId/k2C/
QYt0iPCVpm4XC33KHZ5kMNKZQg/e3HV7X8pcyl1tQ2kA7SCKm9VamuOk0Wm6 Xli2XibH09c5
ofZjLjq+99lKW07nF7QoqG9RznaCMYIPX3DiE6KW/iqmFrLhTxSjXTWHxUod ajalK1bqPWmt
NNrlWqeiwTrqpmC/EdYYdaYAemtxnG3ElxSsjmApWCM9cpGMG2aQu92k3u+2 O9KgvybW4yUS
IjCmUOtut7hlClrIUCFDzxBGD07qy3ejLtq07radPJ7r4df+yXby0ZKrTcFm pSlecXFKUoBS
lKAUpSgFKUoBSlKAUpSgK7xP9DXVH5nl/IrrgDTH4NWv3Gz+wK7/AOJ/oa6o /M8v5FdcAaY/
Bq1+42f2BQHU/DL0bNF/2WD97j1Z9B6tgaatVytF3tGrW5beoLw8Qzpa5SG1 IduUl1taXGmF
IUlSFpUCkkYNVjhl6Nmi/wCywfvcetjq4m6W7RJZZZ1NL7NJeiuuw9LXKQ1z WnFNuJS43HUh
W1aFJJSSMg0BhaHuKL5xT1Ne4dvvUeAuyWqKh242iTB5jrb9wUtKRIbQVbUu tkkAjxhUjxIm
Jh6G1QDFuEpyQw7HaagwXpTqnFxwlI2NJUrGT34wPKRWfpbWNj1LOmwbYbm3 LgtNPSGJ9plQ
XEodLgbWEyG0FSSWnBlORlJqSaTJMuYWXmUJ5wyFtFRzy0eUKFAQ3CqYmXw9 sY7JcYjkaC
Re: [Teneo] Possible inconsistency using IdBags [message #426099 is a reply to message #426082] Tue, 16 December 2008 10:45 Go to previous messageGo to next message
Bjoern Sundin is currently offline Bjoern SundinFriend
Messages: 47
Registered: July 2009
Member
Hi Martin,

You are right: I cannot reproduce this error with mysql.

I've tested with derby, mysql, hsqldb and oracle. Attached you will find the
logs from each test starting from the point where list.clear() was called.
It seems that this erroneous behaviour only occurs when using Derby
database. This is very unfortunate for me as I am using the Derby database
(version 10.4.2)!

AFAICS is the key to the problem on row 46 and 47 in the derby.log:

<quote>
[main] DEBUG org.hibernate.SQL - select max(ID) from "operation_operands"
[main] DEBUG org.hibernate.id.IncrementGenerator - first free id: 1
<unquote>

I put a breakpoint in the modified the IncrementGenerator getNext-method and
changed the value of next id from 1 to 5 (like in the other logs). After
this manipulation also the Derby database was consistent! See
derby-manipulated.log.

This doesn't really make sense to me, as it would mean that with the Derby
database the delete of rows got persisted to the database before the query
for max(ID) whereas for the other databases it's done afterwards. I guess
this is rather a Derby driver problem, but other user of the framework might
as well be affected and should beware of the consequences using the IDBAG
setting in combination with Derby!

Greetings
Bjoern

"Martin Taal" <mtaal@elver.org> schrieb im Newsbeitrag
news:gi6dh2$nfp$1@build.eclipse.org...
> Hi Bjoern,
> I used your project but I am afraid that with me it worked fine. See the
> before and after jpg's. Two
> things I changed:
> - I changed the Activator to work from a main method, which was easier to
> run (see the attached file)
> - I use mysql
>
> I am using Hibernate 3.2.6 which you also tried I think.
>
> I am a bit at a loss why it fails with you and not with me...
>
> Can you check the hibernate log4j output specifically at the point that
> the collection is cleared
> and then saved?
>
> gr. Martin
>
> Bjoern Sundin wrote:
>> Hi Martin,
>>
>> I extracted the concerned (simplified) objects from my project and packed
>> them into another simpler plugin application. See attached zip.
>>
>> When you run the Activator the first time it will create the DB and the
>> initial model. The second time it will remove the "operands" and add them
>> again together with a new "operand reference".
>>
>> I attach two screenshots showing the database table after the first run
>> and
>> after the second run. As you can see after the first run there are 4
>> "operands" in the table. After the second run I would expect the same
>> "operands" there plus the additional one but there is only the additional
>> one! I can reproduce this behaviour also omitting adding the additional
>> "operand". Then after the second run the table will be empty.
>>
>> Greetings
>> Bjoern
>>
>>
>> "Martin Taal" <mtaal@elver.org> schrieb im Newsbeitrag
>> news:gi1g0c$o45$1@build.eclipse.org...
>>> Hi Bjoern,
>>> I tried to replicate this in a test but I was not able to (with me it
>>> works fine). Also in my case I
>>> change the list which is last in the database. I have attached the test
>>> I
>>> used, it uses the Teneo
>>> test framework but I am sure you can read through it. In addition I
>>> attached the ecore model I used
>>> to test. Can you check if you see any differences?
>>>
>>> Otherwise if you have a test case for me then I can try it out.
>>>
>>> gr. Martin
>>>
>>> Bjoern Sundin wrote:
>>>> Hello Martin,
>>>>
>>>> I have encountered a problem concerning lists in my application. After
>>>> extensive debugging I have found out that this problem is connected
>>>> with
>>>> the
>>>> use of IdBags.
>>>>
>>>> I use Eclipse 3.4, Teneo 1.0.1 and Hibernate 3.3.1 (also tested with
>>>> 3.2.6)
>>>>
>>>> The problem is the following:
>>>> When adding objects to a list, one part of the logic first makes
>>>> list.clear() and then adds all the newly submitted objects. The newly
>>>> submitted objects could possibly partly contain the once removed in
>>>> list.clear().
>>>> This is no problem unless the list being modified is the one having the
>>>> last
>>>> rows in the database table! In this case only the new objects get added
>>>> to
>>>> the list. The ones removed and then readded do not get persisted to the
>>>> database again. They are visible to the GUI (model), however, but only
>>>> until
>>>> the application restarts.
>>>>
>>>> The situation as an example:
>>>> Object Library has a unique ordered non-containment list referencing
>>>> object
>>>> Book (Books are contained in object Publisher).
>>>>
>>>> In the database there is a table Library _ Books with three columns:
>>>> Library id | Book id | ID
>>>>
>>>> To start the following ids are in the table:
>>>> 1|11|1
>>>> 1|12|2
>>>> 1|13|3
>>>> 2|11|4
>>>> 2|13|5
>>>>
>>>> - I edit the list for the Library with id 2 in the GUI. I want to add a
>>>> Book
>>>> reference with id 12.
>>>>
>>>> - The logic makes list.clear() and thus removes all the Book references
>>>> (11
>>>> and 13) for the Library with id 2.
>>>>
>>>> - Then it adds the Book references 11, 12 and 13
>>>>
>>>> - The transaction gets committed.
>>>>
>>>> - The Model (EObjects) shows the following two lists:
>>>> 1{11, 12, 13}
>>>> 2{11, 12, 13}
>>>>
>>>> - In the database I have the following:
>>>> 1|11|1
>>>> 1|12|2
>>>> 1|13|3
>>>> 2|12|4
>>>>
>>>> - The expected result in the database would be
>>>> 1|11|1
>>>> 1|12|2
>>>> 1|13|3
>>>> 2|11|4
>>>> 2|12|5
>>>> 2|13|6
>>>>
>>>> I'm able to resolve this behaviour by setting the
>>>> PersistenceOptions.MAP_ALL_LISTS_AS_IDBAG to false and recreate the
>>>> database. But I think it might be important to know about the impact of
>>>> this
>>>> problem when using IdBags as it (for me) unexpectedly removed entries
>>>> from
>>>> the database.
>>>>
>>>> Greetings
>>>> Bjoern
>>>>
>>>>
>>>
>>> --
>>>
>>> With Regards, Martin Taal
>>>
>>> Springsite/Elver.org
>>> Office: Hardwareweg 4, 3821 BV Amersfoort
>>> Postal: Nassaulaan 7, 3941 EC Doorn
>>> The Netherlands
>>> Cell: +31 (0)6 288 48 943
>>> Tel: +31 (0)84 420 2397
>>> Fax: +31 (0)84 225 9307
>>> Mail: mtaal@springsite.com - mtaal@elver.org
>>> Web: www.springsite.com - www.elver.org
>>>
>>
>>
>> ------------------------------------------------------------ --------------------
>>
>>
>>> /**
>>> * <copyright>
>>> *
>>> * Copyright (c) 2005, 2006, 2007, 2008 Springsite BV (The Netherlands)
>>> and
>>> others
>>> * All rights reserved. This program and the accompanying materials
>>> * are made available under the terms of the Eclipse Public License v1.0
>>> * which accompanies this distribution, and is available at
>>> * http://www.eclipse.org/legal/epl-v10.html
>>> *
>>> * Contributors:
>>> * Martin Taal
>>> * </copyright>
>>> *
>>> * $Id: LibraryListAsBagAction.java,v 1.3 2008/02/28 07:08:15 mtaal Exp $
>>> */
>>>
>>> package org.eclipse.emf.teneo.test.emf.sample;
>>>
>>> import java.util.ArrayList;
>>> import java.util.List;
>>> import java.util.Properties;
>>>
>>> import org.eclipse.emf.teneo.PersistenceOptions;
>>> import org.eclipse.emf.teneo.samples.issues.bz237790.Bz237790Factor y;
>>> import org.eclipse.emf.teneo.samples.issues.bz237790.Bz237790Packag e;
>>> import org.eclipse.emf.teneo.samples.issues.bz237790.Many;
>>> import org.eclipse.emf.teneo.samples.issues.bz237790.One;
>>> import org.eclipse.emf.teneo.test.AbstractTestAction;
>>> import org.eclipse.emf.teneo.test.stores.TestStore;
>>>
>>> /**
>>> * @author <a href="mailto:mtaal@elver.org">Martin Taal</a>
>>> * @version $Revision: 1.3 $
>>> */
>>> public class ListAsIdBagAction extends AbstractTestAction {
>>>
>>> private final Bz237790Factory factory = Bz237790Factory.eINSTANCE;
>>>
>>> public ListAsIdBagAction() {
>>> super(Bz237790Package.eINSTANCE);
>>> }
>>>
>>> @Override
>>> public Properties getExtraConfigurationProperties() {
>>> final Properties props = new Properties();
>>> props.setProperty(PersistenceOptions.MAP_ALL_LISTS_AS_IDBAG, "true");
>>> return props;
>>> }
>>>
>>> @Override
>>> public void doAction(TestStore store) {
>>> store.disableDrop();
>>> {
>>> store.beginTransaction();
>>> addDataSet(store, 1);
>>> addDataSet(store, 2);
>>> store.commitTransaction();
>>> }
>>>
>>> // read the writers and add the second book to the second writer
>>> {
>>> store.beginTransaction();
>>> final List<One> os = store.getObjects(One.class);
>>> One o1 = null;
>>> One o2 = null;
>>> for (One o : os) {
>>> if (o.getManies().size() == 2) {
>>> o1 = o;
>>> } else {
>>> o2 = o;
>>> }
>>> }
>>> final List<Many> reserve = new ArrayList<Many>(o1.getManies());
>>> o1.getManies().clear();
>>> reserve.add(1, o2.getManies().get(1));
>>> o1.getManies().addAll(reserve);
>>> store.commitTransaction();
>>> }
>>>
>>> {
>>> store.beginTransaction();
>>> final List<One> os = store.getObjects(One.class);
>>> for (One o : os) {
>>> assertEquals(3, o.getManies().size());
>>> }
>>> store.commitTransaction();
>>> }
>>> }
>>>
>>> private void addDataSet(TestStore store, int index) {
>>> {
>>> final One one = factory.createOne();
>>> store.store(one);
>>> int num = 3;
>>> if (index == 2) {
>>> num = 2;
>>> }
>>> for (int i = 0; i < num; i++) {
>>> final Many many = factory.createMany();
>>> many.setName("" + index);
>>> one.getManies().add(many);
>>> store.store(many);
>>> }
>>> }
>>>
>>> }
>>> }
>>>
>>
>>
>> ------------------------------------------------------------ --------------------
>>
>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>> <ecore:EPackage xmi:version="2.0"
>>> xmlns:xmi="http://www.omg.org/XMI"
>>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>> xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="bz237790"
>>> nsURI="http://www.eclipse.org/emf/teneo/samples/issues/bz225296"
>>> nsPrefix="bz237790">
>>> <eClassifiers xsi:type="ecore:EClass" name="One">
>>> <eStructuralFeatures xsi:type="ecore:EReference" name="manies"
>>> upperBound="-1"
>>> eType="#//Many" resolveProxies="false"/>
>>> </eClassifiers>
>>> <eClassifiers xsi:type="ecore:EClass" name="Many">
>>> <eStructuralFeatures xsi:type="ecore:EAttribute" name="name"
>>> eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
>>> <eAnnotations source="teneo.jpa">
>>> <details key="value" value="@Column(name=&quot;myname&quot;)"/>
>>> </eAnnotations>
>>> </eStructuralFeatures>
>>> </eClassifiers>
>>> </ecore:EPackage>
>>>
>>
>>
>
>
> --
>
> With Regards, Martin Taal
>
> Springsite/Elver.org
> Office: Hardwareweg 4, 3821 BV Amersfoort
> Postal: Nassaulaan 7, 3941 EC Doorn
> The Netherlands
> Cell: +31 (0)6 288 48 943
> Tel: +31 (0)84 420 2397
> Fax: +31 (0)84 225 9307
> Mail: mtaal@springsite.com - mtaal@elver.org
> Web: www.springsite.com - www.elver.org
>


------------------------------------------------------------ --------------------


> package model;
>
> import java.util.ArrayList;
> import java.util.List;
> import java.util.Properties;
>
> import org.eclipse.emf.ecore.EPackage;
> import org.eclipse.emf.teneo.PersistenceOptions;
> import org.eclipse.emf.teneo.hibernate.HbDataStore;
> import org.eclipse.emf.teneo.hibernate.HbHelper;
> import org.hibernate.Query;
> import org.hibernate.Session;
> import org.hibernate.SessionFactory;
> import org.hibernate.Transaction;
> import org.hibernate.cfg.Environment;
>
> public class ActivatorMain {
>
> private static String dataStoreName = "ModelDS";
> private static HbDataStore dataStore;
>
> public static void main(String[] args) {
> activateDataStore();
> handleModel();
>
> deactivateDataStore();
> }
>
> private static void activateDataStore() {
>
> dataStore = HbHelper.INSTANCE.createRegisterDataStore(dataStoreName);
>
> // Configure the EPackages used by this DataStore.
> dataStore.setEPackages(new EPackage[] { ModelPackage.eINSTANCE });
>
> dataStore.setProperties(getProperties());
>
> // Initialize the DataStore. This sets up the Hibernate mapping and
> // creates the corresponding tables in the database.
> dataStore.initialize();
>
> }
>
> private static void deactivateDataStore() {
> if (dataStore != null) {
> dataStore.close();
> }
> }
>
> private static Properties getProperties() {
>
> Properties properties = new Properties();
>
> properties.setProperty(PersistenceOptions.ID_COLUMN_NAME, "id");
>
> properties.setProperty(PersistenceOptions.VERSION_COLUMN_NAM E,
> "version");
>
> properties.setProperty(PersistenceOptions.ALWAYS_VERSION, "false");
>
> properties
> .setProperty(PersistenceOptions.MAXIMUM_SQL_NAME_LENGTH, "63");
>
> properties.setProperty(PersistenceOptions.MAP_ALL_LISTS_AS_I DBAG,
> "true");
>
> properties.setProperty(
> PersistenceOptions.JOIN_TABLE_FOR_NON_CONTAINED_ASSOCIATIONS ,
> "true");
>
> properties.setProperty(PersistenceOptions.SET_FOREIGN_KEY_NA ME, "true");
>
> properties.setProperty(PersistenceOptions.ADD_INDEX_FOR_FORE IGN_KEY,
> "true");
>
> properties.setProperty(
> PersistenceOptions.CASCADE_POLICY_ON_CONTAINMENT,
> "MERGE,PERSIST,REFRESH,REMOVE");
>
> properties.setProperty("teneo.runtime.update_schema", "true");
>
> properties.setProperty("hibernate.hbm2ddl.auto", "update");
>
> // cache implementation
> properties.setProperty("hibernate.cache.provider_class",
> "org.hibernate.cache.EhCacheProvider");
>
> // enable the query cache
> properties.setProperty("hibernate.cache.use_query_cache", "false");
> properties.setProperty(Environment.DRIVER, "com.mysql.jdbc.Driver");
> properties.setProperty(Environment.USER, "root");
> properties.setProperty(Environment.URL,
> "jdbc:mysql://127.0.0.1:3306/test2");
> properties.setProperty(Environment.PASS, "root");
> properties.setProperty(Environment.DIALECT,
> org.hibernate.dialect.MySQLInnoDBDialect.class.getName());
>
> return properties;
>
> }
>
> private static void handleModel() {
>
> SessionFactory sessionFactory = dataStore.getSessionFactory();
>
> // Open a new Session and start Transaction.
> Session session = sessionFactory.openSession();
> Transaction transaction = session.beginTransaction();
> Query query = session.createQuery("FROM Node");
> List<?> entities = query.list();
> if (entities.isEmpty()) {
> Node node = ModelFactory.eINSTANCE.createNode();
> node.setName("Node 1");
> Operation operation = ModelFactory.eINSTANCE.createOperation();
> operation.setName("Operation");
> node.getOperations().add(operation);
> for (int i = 0; i < 10; i++) {
> Datapoint datapoint = ModelFactory.eINSTANCE.createDatapoint();
> datapoint.setName("Datapoint " + i);
> node.getDatapoints().add(datapoint);
> if (i < 4) {
> operation.getOperands().add(datapoint);
> }
> }
> session.save(node);
> } else {
> Node node = (Node) entities.get(0);
> List<Datapoint> operands = new ArrayList<Datapoint>(0);
> Operation operation = node.getOperations().get(0);
> for (Datapoint operand : operation.getOperands()) {
> operands.add(operand);
> }
> Datapoint anotherOperand = node.getDatapoints().get(5);
> operands.add(anotherOperand);
>
> operation.getOperands().clear();
> operation.getOperands().addAll(operands);
>
> }
> transaction.commit();
> session.close();
>
> }
>
> }
>




  • Attachment: logs.zip
    (Size: 6.01KB, Downloaded 120 times)
Re: [Teneo] Possible inconsistency using IdBags [message #426119 is a reply to message #426099] Tue, 16 December 2008 20:26 Go to previous messageGo to next message
Martin Taal is currently offline Martin TaalFriend
Messages: 5468
Registered: July 2009
Senior Member
Hi Bjorn,
Thanks for checking this, I will add this to the troubleshooting area of the docs.

gr. Martin

Bjoern Sundin wrote:
> Hi Martin,
>
> You are right: I cannot reproduce this error with mysql.
>
> I've tested with derby, mysql, hsqldb and oracle. Attached you will find the
> logs from each test starting from the point where list.clear() was called.
> It seems that this erroneous behaviour only occurs when using Derby
> database. This is very unfortunate for me as I am using the Derby database
> (version 10.4.2)!
>
> AFAICS is the key to the problem on row 46 and 47 in the derby.log:
>
> <quote>
> [main] DEBUG org.hibernate.SQL - select max(ID) from "operation_operands"
> [main] DEBUG org.hibernate.id.IncrementGenerator - first free id: 1
> <unquote>
>
> I put a breakpoint in the modified the IncrementGenerator getNext-method and
> changed the value of next id from 1 to 5 (like in the other logs). After
> this manipulation also the Derby database was consistent! See
> derby-manipulated.log.
>
> This doesn't really make sense to me, as it would mean that with the Derby
> database the delete of rows got persisted to the database before the query
> for max(ID) whereas for the other databases it's done afterwards. I guess
> this is rather a Derby driver problem, but other user of the framework might
> as well be affected and should beware of the consequences using the IDBAG
> setting in combination with Derby!
>
> Greetings
> Bjoern
>
> "Martin Taal" <mtaal@elver.org> schrieb im Newsbeitrag
> news:gi6dh2$nfp$1@build.eclipse.org...
>> Hi Bjoern,
>> I used your project but I am afraid that with me it worked fine. See the
>> before and after jpg's. Two
>> things I changed:
>> - I changed the Activator to work from a main method, which was easier to
>> run (see the attached file)
>> - I use mysql
>>
>> I am using Hibernate 3.2.6 which you also tried I think.
>>
>> I am a bit at a loss why it fails with you and not with me...
>>
>> Can you check the hibernate log4j output specifically at the point that
>> the collection is cleared
>> and then saved?
>>
>> gr. Martin
>>
>> Bjoern Sundin wrote:
>>> Hi Martin,
>>>
>>> I extracted the concerned (simplified) objects from my project and packed
>>> them into another simpler plugin application. See attached zip.
>>>
>>> When you run the Activator the first time it will create the DB and the
>>> initial model. The second time it will remove the "operands" and add them
>>> again together with a new "operand reference".
>>>
>>> I attach two screenshots showing the database table after the first run
>>> and
>>> after the second run. As you can see after the first run there are 4
>>> "operands" in the table. After the second run I would expect the same
>>> "operands" there plus the additional one but there is only the additional
>>> one! I can reproduce this behaviour also omitting adding the additional
>>> "operand". Then after the second run the table will be empty.
>>>
>>> Greetings
>>> Bjoern
>>>
>>>
>>> "Martin Taal" <mtaal@elver.org> schrieb im Newsbeitrag
>>> news:gi1g0c$o45$1@build.eclipse.org...
>>>> Hi Bjoern,
>>>> I tried to replicate this in a test but I was not able to (with me it
>>>> works fine). Also in my case I
>>>> change the list which is last in the database. I have attached the test
>>>> I
>>>> used, it uses the Teneo
>>>> test framework but I am sure you can read through it. In addition I
>>>> attached the ecore model I used
>>>> to test. Can you check if you see any differences?
>>>>
>>>> Otherwise if you have a test case for me then I can try it out.
>>>>
>>>> gr. Martin
>>>>
>>>> Bjoern Sundin wrote:
>>>>> Hello Martin,
>>>>>
>>>>> I have encountered a problem concerning lists in my application. After
>>>>> extensive debugging I have found out that this problem is connected
>>>>> with
>>>>> the
>>>>> use of IdBags.
>>>>>
>>>>> I use Eclipse 3.4, Teneo 1.0.1 and Hibernate 3.3.1 (also tested with
>>>>> 3.2.6)
>>>>>
>>>>> The problem is the following:
>>>>> When adding objects to a list, one part of the logic first makes
>>>>> list.clear() and then adds all the newly submitted objects. The newly
>>>>> submitted objects could possibly partly contain the once removed in
>>>>> list.clear().
>>>>> This is no problem unless the list being modified is the one having the
>>>>> last
>>>>> rows in the database table! In this case only the new objects get added
>>>>> to
>>>>> the list. The ones removed and then readded do not get persisted to the
>>>>> database again. They are visible to the GUI (model), however, but only
>>>>> until
>>>>> the application restarts.
>>>>>
>>>>> The situation as an example:
>>>>> Object Library has a unique ordered non-containment list referencing
>>>>> object
>>>>> Book (Books are contained in object Publisher).
>>>>>
>>>>> In the database there is a table Library _ Books with three columns:
>>>>> Library id | Book id | ID
>>>>>
>>>>> To start the following ids are in the table:
>>>>> 1|11|1
>>>>> 1|12|2
>>>>> 1|13|3
>>>>> 2|11|4
>>>>> 2|13|5
>>>>>
>>>>> - I edit the list for the Library with id 2 in the GUI. I want to add a
>>>>> Book
>>>>> reference with id 12.
>>>>>
>>>>> - The logic makes list.clear() and thus removes all the Book references
>>>>> (11
>>>>> and 13) for the Library with id 2.
>>>>>
>>>>> - Then it adds the Book references 11, 12 and 13
>>>>>
>>>>> - The transaction gets committed.
>>>>>
>>>>> - The Model (EObjects) shows the following two lists:
>>>>> 1{11, 12, 13}
>>>>> 2{11, 12, 13}
>>>>>
>>>>> - In the database I have the following:
>>>>> 1|11|1
>>>>> 1|12|2
>>>>> 1|13|3
>>>>> 2|12|4
>>>>>
>>>>> - The expected result in the database would be
>>>>> 1|11|1
>>>>> 1|12|2
>>>>> 1|13|3
>>>>> 2|11|4
>>>>> 2|12|5
>>>>> 2|13|6
>>>>>
>>>>> I'm able to resolve this behaviour by setting the
>>>>> PersistenceOptions.MAP_ALL_LISTS_AS_IDBAG to false and recreate the
>>>>> database. But I think it might be important to know about the impact of
>>>>> this
>>>>> problem when using IdBags as it (for me) unexpectedly removed entries
>>>>> from
>>>>> the database.
>>>>>
>>>>> Greetings
>>>>> Bjoern
>>>>>
>>>>>
>>>> --
>>>>
>>>> With Regards, Martin Taal
>>>>
>>>> Springsite/Elver.org
>>>> Office: Hardwareweg 4, 3821 BV Amersfoort
>>>> Postal: Nassaulaan 7, 3941 EC Doorn
>>>> The Netherlands
>>>> Cell: +31 (0)6 288 48 943
>>>> Tel: +31 (0)84 420 2397
>>>> Fax: +31 (0)84 225 9307
>>>> Mail: mtaal@springsite.com - mtaal@elver.org
>>>> Web: www.springsite.com - www.elver.org
>>>>
>>>
>>> ------------------------------------------------------------ --------------------
>>>
>>>
>>>> /**
>>>> * <copyright>
>>>> *
>>>> * Copyright (c) 2005, 2006, 2007, 2008 Springsite BV (The Netherlands)
>>>> and
>>>> others
>>>> * All rights reserved. This program and the accompanying materials
>>>> * are made available under the terms of the Eclipse Public License v1.0
>>>> * which accompanies this distribution, and is available at
>>>> * http://www.eclipse.org/legal/epl-v10.html
>>>> *
>>>> * Contributors:
>>>> * Martin Taal
>>>> * </copyright>
>>>> *
>>>> * $Id: LibraryListAsBagAction.java,v 1.3 2008/02/28 07:08:15 mtaal Exp $
>>>> */
>>>>
>>>> package org.eclipse.emf.teneo.test.emf.sample;
>>>>
>>>> import java.util.ArrayList;
>>>> import java.util.List;
>>>> import java.util.Properties;
>>>>
>>>> import org.eclipse.emf.teneo.PersistenceOptions;
>>>> import org.eclipse.emf.teneo.samples.issues.bz237790.Bz237790Factor y;
>>>> import org.eclipse.emf.teneo.samples.issues.bz237790.Bz237790Packag e;
>>>> import org.eclipse.emf.teneo.samples.issues.bz237790.Many;
>>>> import org.eclipse.emf.teneo.samples.issues.bz237790.One;
>>>> import org.eclipse.emf.teneo.test.AbstractTestAction;
>>>> import org.eclipse.emf.teneo.test.stores.TestStore;
>>>>
>>>> /**
>>>> * @author <a href="mailto:mtaal@elver.org">Martin Taal</a>
>>>> * @version $Revision: 1.3 $
>>>> */
>>>> public class ListAsIdBagAction extends AbstractTestAction {
>>>>
>>>> private final Bz237790Factory factory = Bz237790Factory.eINSTANCE;
>>>>
>>>> public ListAsIdBagAction() {
>>>> super(Bz237790Package.eINSTANCE);
>>>> }
>>>>
>>>> @Override
>>>> public Properties getExtraConfigurationProperties() {
>>>> final Properties props = new Properties();
>>>> props.setProperty(PersistenceOptions.MAP_ALL_LISTS_AS_IDBAG, "true");
>>>> return props;
>>>> }
>>>>
>>>> @Override
>>>> public void doAction(TestStore store) {
>>>> store.disableDrop();
>>>> {
>>>> store.beginTransaction();
>>>> addDataSet(store, 1);
>>>> addDataSet(store, 2);
>>>> store.commitTransaction();
>>>> }
>>>>
>>>> // read the writers and add the second book to the second writer
>>>> {
>>>> store.beginTransaction();
>>>> final List<One> os = store.getObjects(One.class);
>>>> One o1 = null;
>>>> One o2 = null;
>>>> for (One o : os) {
>>>> if (o.getManies().size() == 2) {
>>>> o1 = o;
>>>> } else {
>>>> o2 = o;
>>>> }
>>>> }
>>>> final List<Many> reserve = new ArrayList<Many>(o1.getManies());
>>>> o1.getManies().clear();
>>>> reserve.add(1, o2.getManies().get(1));
>>>> o1.getManies().addAll(reserve);
>>>> store.commitTransaction();
>>>> }
>>>>
>>>> {
>>>> store.beginTransaction();
>>>> final List<One> os = store.getObjects(One.class);
>>>> for (One o : os) {
>>>> assertEquals(3, o.getManies().size());
>>>> }
>>>> store.commitTransaction();
>>>> }
>>>> }
>>>>
>>>> private void addDataSet(TestStore store, int index) {
>>>> {
>>>> final One one = factory.createOne();
>>>> store.store(one);
>>>> int num = 3;
>>>> if (index == 2) {
>>>> num = 2;
>>>> }
>>>> for (int i = 0; i < num; i++) {
>>>> final Many many = factory.createMany();
>>>> many.setName("" + index);
>>>> one.getManies().add(many);
>>>> store.store(many);
>>>> }
>>>> }
>>>>
>>>> }
>>>> }
>>>>
>>>
>>> ------------------------------------------------------------ --------------------
>>>
>>>
>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>> <ecore:EPackage xmi:version="2.0"
>>>> xmlns:xmi="http://www.omg.org/XMI"
>>>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>>> xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="bz237790"
>>>> nsURI="http://www.eclipse.org/emf/teneo/samples/issues/bz225296"
>>>> nsPrefix="bz237790">
>>>> <eClassifiers xsi:type="ecore:EClass" name="One">
>>>> <eStructuralFeatures xsi:type="ecore:EReference" name="manies"
>>>> upperBound="-1"
>>>> eType="#//Many" resolveProxies="false"/>
>>>> </eClassifiers>
>>>> <eClassifiers xsi:type="ecore:EClass" name="Many">
>>>> <eStructuralFeatures xsi:type="ecore:EAttribute" name="name"
>>>> eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
>>>> <eAnnotations source="teneo.jpa">
>>>> <details key="value" value="@Column(name=&quot;myname&quot;)"/>
>>>> </eAnnotations>
>>>> </eStructuralFeatures>
>>>> </eClassifiers>
>>>> </ecore:EPackage>
>>>>
>>>
>>
>> --
>>
>> With Regards, Martin Taal
>>
>> Springsite/Elver.org
>> Office: Hardwareweg 4, 3821 BV Amersfoort
>> Postal: Nassaulaan 7, 3941 EC Doorn
>> The Netherlands
>> Cell: +31 (0)6 288 48 943
>> Tel: +31 (0)84 420 2397
>> Fax: +31 (0)84 225 9307
>> Mail: mtaal@springsite.com - mtaal@elver.org
>> Web: www.springsite.com - www.elver.org
>>
>
>
> ------------------------------------------------------------ --------------------
>
>
>> package model;
>>
>> import java.util.ArrayList;
>> import java.util.List;
>> import java.util.Properties;
>>
>> import org.eclipse.emf.ecore.EPackage;
>> import org.eclipse.emf.teneo.PersistenceOptions;
>> import org.eclipse.emf.teneo.hibernate.HbDataStore;
>> import org.eclipse.emf.teneo.hibernate.HbHelper;
>> import org.hibernate.Query;
>> import org.hibernate.Session;
>> import org.hibernate.SessionFactory;
>> import org.hibernate.Transaction;
>> import org.hibernate.cfg.Environment;
>>
>> public class ActivatorMain {
>>
>> private static String dataStoreName = "ModelDS";
>> private static HbDataStore dataStore;
>>
>> public static void main(String[] args) {
>> activateDataStore();
>> handleModel();
>>
>> deactivateDataStore();
>> }
>>
>> private static void activateDataStore() {
>>
>> dataStore = HbHelper.INSTANCE.createRegisterDataStore(dataStoreName);
>>
>> // Configure the EPackages used by this DataStore.
>> dataStore.setEPackages(new EPackage[] { ModelPackage.eINSTANCE });
>>
>> dataStore.setProperties(getProperties());
>>
>> // Initialize the DataStore. This sets up the Hibernate mapping and
>> // creates the corresponding tables in the database.
>> dataStore.initialize();
>>
>> }
>>
>> private static void deactivateDataStore() {
>> if (dataStore != null) {
>> dataStore.close();
>> }
>> }
>>
>> private static Properties getProperties() {
>>
>> Properties properties = new Properties();
>>
>> properties.setProperty(PersistenceOptions.ID_COLUMN_NAME, "id");
>>
>> properties.setProperty(PersistenceOptions.VERSION_COLUMN_NAM E,
>> "version");
>>
>> properties.setProperty(PersistenceOptions.ALWAYS_VERSION, "false");
>>
>> properties
>> .setProperty(PersistenceOptions.MAXIMUM_SQL_NAME_LENGTH, "63");
>>
>> properties.setProperty(PersistenceOptions.MAP_ALL_LISTS_AS_I DBAG,
>> "true");
>>
>> properties.setProperty(
>> PersistenceOptions.JOIN_TABLE_FOR_NON_CONTAINED_ASSOCIATIONS ,
>> "true");
>>
>> properties.setProperty(PersistenceOptions.SET_FOREIGN_KEY_NA ME, "true");
>>
>> properties.setProperty(PersistenceOptions.ADD_INDEX_FOR_FORE IGN_KEY,
>> "true");
>>
>> properties.setProperty(
>> PersistenceOptions.CASCADE_POLICY_ON_CONTAINMENT,
>> "MERGE,PERSIST,REFRESH,REMOVE");
>>
>> properties.setProperty("teneo.runtime.update_schema", "true");
>>
>> properties.setProperty("hibernate.hbm2ddl.auto", "update");
>>
>> // cache implementation
>> properties.setProperty("hibernate.cache.provider_class",
>> "org.hibernate.cache.EhCacheProvider");
>>
>> // enable the query cache
>> properties.setProperty("hibernate.cache.use_query_cache", "false");
>> properties.setProperty(Environment.DRIVER, "com.mysql.jdbc.Driver");
>> properties.setProperty(Environment.USER, "root");
>> properties.setProperty(Environment.URL,
>> "jdbc:mysql://127.0.0.1:3306/test2");
>> properties.setProperty(Environment.PASS, "root");
>> properties.setProperty(Environment.DIALECT,
>> org.hibernate.dialect.MySQLInnoDBDialect.class.getName());
>>
>> return properties;
>>
>> }
>>
>> private static void handleModel() {
>>
>> SessionFactory sessionFactory = dataStore.getSessionFactory();
>>
>> // Open a new Session and start Transaction.
>> Session session = sessionFactory.openSession();
>> Transaction transaction = session.beginTransaction();
>> Query query = session.createQuery("FROM Node");
>> List<?> entities = query.list();
>> if (entities.isEmpty()) {
>> Node node = ModelFactory.eINSTANCE.createNode();
>> node.setName("Node 1");
>> Operation operation = ModelFactory.eINSTANCE.createOperation();
>> operation.setName("Operation");
>> node.getOperations().add(operation);
>> for (int i = 0; i < 10; i++) {
>> Datapoint datapoint = ModelFactory.eINSTANCE.createDatapoint();
>> datapoint.setName("Datapoint " + i);
>> node.getDatapoints().add(datapoint);
>> if (i < 4) {
>> operation.getOperands().add(datapoint);
>> }
>> }
>> session.save(node);
>> } else {
>> Node node = (Node) entities.get(0);
>> List<Datapoint> operands = new ArrayList<Datapoint>(0);
>> Operation operation = node.getOperations().get(0);
>> for (Datapoint operand : operation.getOperands()) {
>> operands.add(operand);
>> }
>> Datapoint anotherOperand = node.getDatapoints().get(5);
>> operands.add(anotherOperand);
>>
>> operation.getOperands().clear();
>> operation.getOperands().addAll(operands);
>>
>> }
>> transaction.commit();
>> session.close();
>>
>> }
>>
>> }
>>
>
>
>
>


--

With Regards, Martin Taal

Springsite/Elver.org
Office: Hardwareweg 4, 3821 BV Amersfoort
Postal: Nassaulaan 7, 3941 EC Doorn
The Netherlands
Cell: +31 (0)6 288 48 943
Tel: +31 (0)84 420 2397
Fax: +31 (0)84 225 9307
Mail: mtaal@springsite.com - mtaal@elver.org
Web: www.springsite.com - www.elver.org
Re: [Teneo] Possible inconsistency using IdBags [message #426147 is a reply to message #426099] Wed, 17 December 2008 09:57 Go to previous message
Martin Taal is currently offline Martin TaalFriend
Messages: 5468
Registered: July 2009
Senior Member
Added here to the docs:
http://www.elver.org/hibernate/troubleshooting.html#derbyand idbag
and added references from other docs to this section.

gr. Martin

Bjoern Sundin wrote:
> Hi Martin,
>
> You are right: I cannot reproduce this error with mysql.
>
> I've tested with derby, mysql, hsqldb and oracle. Attached you will find the
> logs from each test starting from the point where list.clear() was called.
> It seems that this erroneous behaviour only occurs when using Derby
> database. This is very unfortunate for me as I am using the Derby database
> (version 10.4.2)!
>
> AFAICS is the key to the problem on row 46 and 47 in the derby.log:
>
> <quote>
> [main] DEBUG org.hibernate.SQL - select max(ID) from "operation_operands"
> [main] DEBUG org.hibernate.id.IncrementGenerator - first free id: 1
> <unquote>
>
> I put a breakpoint in the modified the IncrementGenerator getNext-method and
> changed the value of next id from 1 to 5 (like in the other logs). After
> this manipulation also the Derby database was consistent! See
> derby-manipulated.log.
>
> This doesn't really make sense to me, as it would mean that with the Derby
> database the delete of rows got persisted to the database before the query
> for max(ID) whereas for the other databases it's done afterwards. I guess
> this is rather a Derby driver problem, but other user of the framework might
> as well be affected and should beware of the consequences using the IDBAG
> setting in combination with Derby!
>
> Greetings
> Bjoern
>
> "Martin Taal" <mtaal@elver.org> schrieb im Newsbeitrag
> news:gi6dh2$nfp$1@build.eclipse.org...
>> Hi Bjoern,
>> I used your project but I am afraid that with me it worked fine. See the
>> before and after jpg's. Two
>> things I changed:
>> - I changed the Activator to work from a main method, which was easier to
>> run (see the attached file)
>> - I use mysql
>>
>> I am using Hibernate 3.2.6 which you also tried I think.
>>
>> I am a bit at a loss why it fails with you and not with me...
>>
>> Can you check the hibernate log4j output specifically at the point that
>> the collection is cleared
>> and then saved?
>>
>> gr. Martin
>>
>> Bjoern Sundin wrote:
>>> Hi Martin,
>>>
>>> I extracted the concerned (simplified) objects from my project and packed
>>> them into another simpler plugin application. See attached zip.
>>>
>>> When you run the Activator the first time it will create the DB and the
>>> initial model. The second time it will remove the "operands" and add them
>>> again together with a new "operand reference".
>>>
>>> I attach two screenshots showing the database table after the first run
>>> and
>>> after the second run. As you can see after the first run there are 4
>>> "operands" in the table. After the second run I would expect the same
>>> "operands" there plus the additional one but there is only the additional
>>> one! I can reproduce this behaviour also omitting adding the additional
>>> "operand". Then after the second run the table will be empty.
>>>
>>> Greetings
>>> Bjoern
>>>
>>>
>>> "Martin Taal" <mtaal@elver.org> schrieb im Newsbeitrag
>>> news:gi1g0c$o45$1@build.eclipse.org...
>>>> Hi Bjoern,
>>>> I tried to replicate this in a test but I was not able to (with me it
>>>> works fine). Also in my case I
>>>> change the list which is last in the database. I have attached the test
>>>> I
>>>> used, it uses the Teneo
>>>> test framework but I am sure you can read through it. In addition I
>>>> attached the ecore model I used
>>>> to test. Can you check if you see any differences?
>>>>
>>>> Otherwise if you have a test case for me then I can try it out.
>>>>
>>>> gr. Martin
>>>>
>>>> Bjoern Sundin wrote:
>>>>> Hello Martin,
>>>>>
>>>>> I have encountered a problem concerning lists in my application. After
>>>>> extensive debugging I have found out that this problem is connected
>>>>> with
>>>>> the
>>>>> use of IdBags.
>>>>>
>>>>> I use Eclipse 3.4, Teneo 1.0.1 and Hibernate 3.3.1 (also tested with
>>>>> 3.2.6)
>>>>>
>>>>> The problem is the following:
>>>>> When adding objects to a list, one part of the logic first makes
>>>>> list.clear() and then adds all the newly submitted objects. The newly
>>>>> submitted objects could possibly partly contain the once removed in
>>>>> list.clear().
>>>>> This is no problem unless the list being modified is the one having the
>>>>> last
>>>>> rows in the database table! In this case only the new objects get added
>>>>> to
>>>>> the list. The ones removed and then readded do not get persisted to the
>>>>> database again. They are visible to the GUI (model), however, but only
>>>>> until
>>>>> the application restarts.
>>>>>
>>>>> The situation as an example:
>>>>> Object Library has a unique ordered non-containment list referencing
>>>>> object
>>>>> Book (Books are contained in object Publisher).
>>>>>
>>>>> In the database there is a table Library _ Books with three columns:
>>>>> Library id | Book id | ID
>>>>>
>>>>> To start the following ids are in the table:
>>>>> 1|11|1
>>>>> 1|12|2
>>>>> 1|13|3
>>>>> 2|11|4
>>>>> 2|13|5
>>>>>
>>>>> - I edit the list for the Library with id 2 in the GUI. I want to add a
>>>>> Book
>>>>> reference with id 12.
>>>>>
>>>>> - The logic makes list.clear() and thus removes all the Book references
>>>>> (11
>>>>> and 13) for the Library with id 2.
>>>>>
>>>>> - Then it adds the Book references 11, 12 and 13
>>>>>
>>>>> - The transaction gets committed.
>>>>>
>>>>> - The Model (EObjects) shows the following two lists:
>>>>> 1{11, 12, 13}
>>>>> 2{11, 12, 13}
>>>>>
>>>>> - In the database I have the following:
>>>>> 1|11|1
>>>>> 1|12|2
>>>>> 1|13|3
>>>>> 2|12|4
>>>>>
>>>>> - The expected result in the database would be
>>>>> 1|11|1
>>>>> 1|12|2
>>>>> 1|13|3
>>>>> 2|11|4
>>>>> 2|12|5
>>>>> 2|13|6
>>>>>
>>>>> I'm able to resolve this behaviour by setting the
>>>>> PersistenceOptions.MAP_ALL_LISTS_AS_IDBAG to false and recreate the
>>>>> database. But I think it might be important to know about the impact of
>>>>> this
>>>>> problem when using IdBags as it (for me) unexpectedly removed entries
>>>>> from
>>>>> the database.
>>>>>
>>>>> Greetings
>>>>> Bjoern
>>>>>
>>>>>
>>>> --
>>>>
>>>> With Regards, Martin Taal
>>>>
>>>> Springsite/Elver.org
>>>> Office: Hardwareweg 4, 3821 BV Amersfoort
>>>> Postal: Nassaulaan 7, 3941 EC Doorn
>>>> The Netherlands
>>>> Cell: +31 (0)6 288 48 943
>>>> Tel: +31 (0)84 420 2397
>>>> Fax: +31 (0)84 225 9307
>>>> Mail: mtaal@springsite.com - mtaal@elver.org
>>>> Web: www.springsite.com - www.elver.org
>>>>
>>>
>>> ------------------------------------------------------------ --------------------
>>>
>>>
>>>> /**
>>>> * <copyright>
>>>> *
>>>> * Copyright (c) 2005, 2006, 2007, 2008 Springsite BV (The Netherlands)
>>>> and
>>>> others
>>>> * All rights reserved. This program and the accompanying materials
>>>> * are made available under the terms of the Eclipse Public License v1.0
>>>> * which accompanies this distribution, and is available at
>>>> * http://www.eclipse.org/legal/epl-v10.html
>>>> *
>>>> * Contributors:
>>>> * Martin Taal
>>>> * </copyright>
>>>> *
>>>> * $Id: LibraryListAsBagAction.java,v 1.3 2008/02/28 07:08:15 mtaal Exp $
>>>> */
>>>>
>>>> package org.eclipse.emf.teneo.test.emf.sample;
>>>>
>>>> import java.util.ArrayList;
>>>> import java.util.List;
>>>> import java.util.Properties;
>>>>
>>>> import org.eclipse.emf.teneo.PersistenceOptions;
>>>> import org.eclipse.emf.teneo.samples.issues.bz237790.Bz237790Factor y;
>>>> import org.eclipse.emf.teneo.samples.issues.bz237790.Bz237790Packag e;
>>>> import org.eclipse.emf.teneo.samples.issues.bz237790.Many;
>>>> import org.eclipse.emf.teneo.samples.issues.bz237790.One;
>>>> import org.eclipse.emf.teneo.test.AbstractTestAction;
>>>> import org.eclipse.emf.teneo.test.stores.TestStore;
>>>>
>>>> /**
>>>> * @author <a href="mailto:mtaal@elver.org">Martin Taal</a>
>>>> * @version $Revision: 1.3 $
>>>> */
>>>> public class ListAsIdBagAction extends AbstractTestAction {
>>>>
>>>> private final Bz237790Factory factory = Bz237790Factory.eINSTANCE;
>>>>
>>>> public ListAsIdBagAction() {
>>>> super(Bz237790Package.eINSTANCE);
>>>> }
>>>>
>>>> @Override
>>>> public Properties getExtraConfigurationProperties() {
>>>> final Properties props = new Properties();
>>>> props.setProperty(PersistenceOptions.MAP_ALL_LISTS_AS_IDBAG, "true");
>>>> return props;
>>>> }
>>>>
>>>> @Override
>>>> public void doAction(TestStore store) {
>>>> store.disableDrop();
>>>> {
>>>> store.beginTransaction();
>>>> addDataSet(store, 1);
>>>> addDataSet(store, 2);
>>>> store.commitTransaction();
>>>> }
>>>>
>>>> // read the writers and add the second book to the second writer
>>>> {
>>>> store.beginTransaction();
>>>> final List<One> os = store.getObjects(One.class);
>>>> One o1 = null;
>>>> One o2 = null;
>>>> for (One o : os) {
>>>> if (o.getManies().size() == 2) {
>>>> o1 = o;
>>>> } else {
>>>> o2 = o;
>>>> }
>>>> }
>>>> final List<Many> reserve = new ArrayList<Many>(o1.getManies());
>>>> o1.getManies().clear();
>>>> reserve.add(1, o2.getManies().get(1));
>>>> o1.getManies().addAll(reserve);
>>>> store.commitTransaction();
>>>> }
>>>>
>>>> {
>>>> store.beginTransaction();
>>>> final List<One> os = store.getObjects(One.class);
>>>> for (One o : os) {
>>>> assertEquals(3, o.getManies().size());
>>>> }
>>>> store.commitTransaction();
>>>> }
>>>> }
>>>>
>>>> private void addDataSet(TestStore store, int index) {
>>>> {
>>>> final One one = factory.createOne();
>>>> store.store(one);
>>>> int num = 3;
>>>> if (index == 2) {
>>>> num = 2;
>>>> }
>>>> for (int i = 0; i < num; i++) {
>>>> final Many many = factory.createMany();
>>>> many.setName("" + index);
>>>> one.getManies().add(many);
>>>> store.store(many);
>>>> }
>>>> }
>>>>
>>>> }
>>>> }
>>>>
>>>
>>> ------------------------------------------------------------ --------------------
>>>
>>>
>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>> <ecore:EPackage xmi:version="2.0"
>>>> xmlns:xmi="http://www.omg.org/XMI"
>>>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>>> xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="bz237790"
>>>> nsURI="http://www.eclipse.org/emf/teneo/samples/issues/bz225296"
>>>> nsPrefix="bz237790">
>>>> <eClassifiers xsi:type="ecore:EClass" name="One">
>>>> <eStructuralFeatures xsi:type="ecore:EReference" name="manies"
>>>> upperBound="-1"
>>>> eType="#//Many" resolveProxies="false"/>
>>>> </eClassifiers>
>>>> <eClassifiers xsi:type="ecore:EClass" name="Many">
>>>> <eStructuralFeatures xsi:type="ecore:EAttribute" name="name"
>>>> eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
>>>> <eAnnotations source="teneo.jpa">
>>>> <details key="value" value="@Column(name=&quot;myname&quot;)"/>
>>>> </eAnnotations>
>>>> </eStructuralFeatures>
>>>> </eClassifiers>
>>>> </ecore:EPackage>
>>>>
>>>
>>
>> --
>>
>> With Regards, Martin Taal
>>
>> Springsite/Elver.org
>> Office: Hardwareweg 4, 3821 BV Amersfoort
>> Postal: Nassaulaan 7, 3941 EC Doorn
>> The Netherlands
>> Cell: +31 (0)6 288 48 943
>> Tel: +31 (0)84 420 2397
>> Fax: +31 (0)84 225 9307
>> Mail: mtaal@springsite.com - mtaal@elver.org
>> Web: www.springsite.com - www.elver.org
>>
>
>
> ------------------------------------------------------------ --------------------
>
>
>> package model;
>>
>> import java.util.ArrayList;
>> import java.util.List;
>> import java.util.Properties;
>>
>> import org.eclipse.emf.ecore.EPackage;
>> import org.eclipse.emf.teneo.PersistenceOptions;
>> import org.eclipse.emf.teneo.hibernate.HbDataStore;
>> import org.eclipse.emf.teneo.hibernate.HbHelper;
>> import org.hibernate.Query;
>> import org.hibernate.Session;
>> import org.hibernate.SessionFactory;
>> import org.hibernate.Transaction;
>> import org.hibernate.cfg.Environment;
>>
>> public class ActivatorMain {
>>
>> private static String dataStoreName = "ModelDS";
>> private static HbDataStore dataStore;
>>
>> public static void main(String[] args) {
>> activateDataStore();
>> handleModel();
>>
>> deactivateDataStore();
>> }
>>
>> private static void activateDataStore() {
>>
>> dataStore = HbHelper.INSTANCE.createRegisterDataStore(dataStoreName);
>>
>> // Configure the EPackages used by this DataStore.
>> dataStore.setEPackages(new EPackage[] { ModelPackage.eINSTANCE });
>>
>> dataStore.setProperties(getProperties());
>>
>> // Initialize the DataStore. This sets up the Hibernate mapping and
>> // creates the corresponding tables in the database.
>> dataStore.initialize();
>>
>> }
>>
>> private static void deactivateDataStore() {
>> if (dataStore != null) {
>> dataStore.close();
>> }
>> }
>>
>> private static Properties getProperties() {
>>
>> Properties properties = new Properties();
>>
>> properties.setProperty(PersistenceOptions.ID_COLUMN_NAME, "id");
>>
>> properties.setProperty(PersistenceOptions.VERSION_COLUMN_NAM E,
>> "version");
>>
>> properties.setProperty(PersistenceOptions.ALWAYS_VERSION, "false");
>>
>> properties
>> .setProperty(PersistenceOptions.MAXIMUM_SQL_NAME_LENGTH, "63");
>>
>> properties.setProperty(PersistenceOptions.MAP_ALL_LISTS_AS_I DBAG,
>> "true");
>>
>> properties.setProperty(
>> PersistenceOptions.JOIN_TABLE_FOR_NON_CONTAINED_ASSOCIATIONS ,
>> "true");
>>
>> properties.setProperty(PersistenceOptions.SET_FOREIGN_KEY_NA ME, "true");
>>
>> properties.setProperty(PersistenceOptions.ADD_INDEX_FOR_FORE IGN_KEY,
>> "true");
>>
>> properties.setProperty(
>> PersistenceOptions.CASCADE_POLICY_ON_CONTAINMENT,
>> "MERGE,PERSIST,REFRESH,REMOVE");
>>
>> properties.setProperty("teneo.runtime.update_schema", "true");
>>
>> properties.setProperty("hibernate.hbm2ddl.auto", "update");
>>
>> // cache implementation
>> properties.setProperty("hibernate.cache.provider_class",
>> "org.hibernate.cache.EhCacheProvider");
>>
>> // enable the query cache
>> properties.setProperty("hibernate.cache.use_query_cache", "false");
>> properties.setProperty(Environment.DRIVER, "com.mysql.jdbc.Driver");
>> properties.setProperty(Environment.USER, "root");
>> properties.setProperty(Environment.URL,
>> "jdbc:mysql://127.0.0.1:3306/test2");
>> properties.setProperty(Environment.PASS, "root");
>> properties.setProperty(Environment.DIALECT,
>> org.hibernate.dialect.MySQLInnoDBDialect.class.getName());
>>
>> return properties;
>>
>> }
>>
>> private static void handleModel() {
>>
>> SessionFactory sessionFactory = dataStore.getSessionFactory();
>>
>> // Open a new Session and start Transaction.
>> Session session = sessionFactory.openSession();
>> Transaction transaction = session.beginTransaction();
>> Query query = session.createQuery("FROM Node");
>> List<?> entities = query.list();
>> if (entities.isEmpty()) {
>> Node node = ModelFactory.eINSTANCE.createNode();
>> node.setName("Node 1");
>> Operation operation = ModelFactory.eINSTANCE.createOperation();
>> operation.setName("Operation");
>> node.getOperations().add(operation);
>> for (int i = 0; i < 10; i++) {
>> Datapoint datapoint = ModelFactory.eINSTANCE.createDatapoint();
>> datapoint.setName("Datapoint " + i);
>> node.getDatapoints().add(datapoint);
>> if (i < 4) {
>> operation.getOperands().add(datapoint);
>> }
>> }
>> session.save(node);
>> } else {
>> Node node = (Node) entities.get(0);
>> List<Datapoint> operands = new ArrayList<Datapoint>(0);
>> Operation operation = node.getOperations().get(0);
>> for (Datapoint operand : operation.getOperands()) {
>> operands.add(operand);
>> }
>> Datapoint anotherOperand = node.getDatapoints().get(5);
>> operands.add(anotherOperand);
>>
>> operation.getOperands().clear();
>> operation.getOperands().addAll(operands);
>>
>> }
>> transaction.commit();
>> session.close();
>>
>> }
>>
>> }
>>
>
>
>
>


--

With Regards, Martin Taal

Springsite/Elver.org
Office: Hardwareweg 4, 3821 BV Amersfoort
Postal: Nassaulaan 7, 3941 EC Doorn
The Netherlands
Cell: +31 (0)6 288 48 943
Tel: +31 (0)84 420 2397
Fax: +31 (0)84 225 9307
Mail: mtaal@springsite.com - mtaal@elver.org
Web: www.springsite.com - www.elver.org
Previous Topic:[CDO]Advanced authentication manager
Next Topic:Fetch Eager and container
Goto Forum:
  


Current Time: Fri Apr 19 13:00:11 GMT 2024

Powered by FUDForum. Page generated in 0.03070 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top