Return-Path: X-Original-To: apmail-cassandra-user-archive@www.apache.org Delivered-To: apmail-cassandra-user-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id DF526106DD for ; Thu, 27 Mar 2014 16:25:35 +0000 (UTC) Received: (qmail 68068 invoked by uid 500); 27 Mar 2014 16:25:32 -0000 Delivered-To: apmail-cassandra-user-archive@cassandra.apache.org Received: (qmail 67360 invoked by uid 500); 27 Mar 2014 16:25:29 -0000 Mailing-List: contact user-help@cassandra.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user@cassandra.apache.org Delivered-To: mailing list user@cassandra.apache.org Received: (qmail 67053 invoked by uid 99); 27 Mar 2014 16:25:25 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 27 Mar 2014 16:25:25 +0000 X-ASF-Spam-Status: No, hits=2.2 required=5.0 tests=HTML_MESSAGE,RCVD_IN_DNSWL_NONE,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: domain of SRS0=NFKgEa=Y4=basetechnology.com=jack@yourhostingaccount.com designates 65.254.253.234 as permitted sender) Received: from [65.254.253.234] (HELO mailout08.yourhostingaccount.com) (65.254.253.234) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 27 Mar 2014 16:25:19 +0000 Received: from mailscan13.yourhostingaccount.com ([10.1.15.13] helo=mailscan13.yourhostingaccount.com) by mailout08.yourhostingaccount.com with esmtp (Exim) id 1WTD6u-0004xj-0w for user@cassandra.apache.org; Thu, 27 Mar 2014 12:24:56 -0400 Received: from impout02.yourhostingaccount.com ([10.1.55.2] helo=impout02.yourhostingaccount.com) by mailscan13.yourhostingaccount.com with esmtp (Exim) id 1WTD6r-0006BK-KD for user@cassandra.apache.org; Thu, 27 Mar 2014 12:24:53 -0400 Received: from walauthsmtp16.yourhostingaccount.com ([10.1.18.16]) by impout02.yourhostingaccount.com with NO UCE id igQt1n0030LoD9W01gQtj3; Thu, 27 Mar 2014 12:24:53 -0400 X-Authority-Analysis: v=2.0 cv=Y4J6Q2iN c=1 sm=1 a=8ePG324nFYoaEbjKt8ueIw==:17 a=aQzbgH187woA:10 a=tOk4EGMek2kA:10 a=3jZET7lWBKwA:10 a=jvYhGVW7AAAA:8 a=mV9VRH-2AAAA:8 a=jrtqUpk2AAAA:8 a=j_jZMAXlAAAA:8 a=-4zaHxcyB9nog93RSEIA:9 a=QEXdDO2ut3YA:10 a=-beSG2EzipkA:10 a=C3KqUEkgqI4A:10 a=8QfLA-HpyU0A:10 a=U2jqEXb1hakA:10 a=JTfqHPRTY4wA:10 a=TpbLyN2ZYpgA:10 a=jMKU2nqSz5sA:10 a=I_aoKCpCFDZFdngq:21 a=YBZ1oGJujLgeHDSa:21 a=SSmOFEACAAAA:8 a=yMhMjlubAAAA:8 a=LQnfYkhc_bblUluzN2UA:9 a=gKO2Hq4RSVkA:10 a=UiCQ7L4-1S4A:10 a=hTZeC7Yk6K0A:10 a=frz4AuCg-hUA:10 a=kGGkqyZSVZcA:10 a=d9SaukGd3JQr_pbv:21 a=C5LowFZjYeReTPlX:21 a=RqOAJGx8AAAA:8 a=0bwPlpDAAAAA:8 a=e8h0XIup4VsFo9DG0JsA:9 a=KQqxNPgzF0kA:10 a=dPikgtiYlNKqqgaJ:18 a=ltXMujfcukYoTVgNOHxvog==:117 X-EN-OrigOutIP: 10.1.18.16 X-EN-IMPSID: igQt1n0030LoD9W01gQtj3 Received: from 207-237-112-149.c3-0.nyr-ubr1.nyr.ny.cable.rcn.com ([207.237.112.149]:56282 helo=JackKrupansky14) by walauthsmtp16.yourhostingaccount.com with esmtpa (Exim) id 1WTD6r-00045H-Db for user@cassandra.apache.org; Thu, 27 Mar 2014 12:24:53 -0400 Message-ID: <8164D78F6CD644979BCD4D302853162C@JackKrupansky14> From: "Jack Krupansky" To: References: <60b0e5260e144e59b8413e96588da7b0@BN1PR07MB069.namprd07.prod.outlook.com> In-Reply-To: <60b0e5260e144e59b8413e96588da7b0@BN1PR07MB069.namprd07.prod.outlook.com> Subject: Re: Question about how compaction and partition keys interact Date: Thu, 27 Mar 2014 12:24:54 -0400 MIME-Version: 1.0 Content-Type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_000_0204_01CF49B7.8ECB3A80" X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3522.110 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3522.110 X-EN-UserInfo: e0a4b55451ed9f27313ebf02e3d4348d:931c98230c6409dcc37fa7e93b490c27 X-EN-AuthUser: jack@basetechnology.com Sender: "Jack Krupansky" X-EN-OrigIP: 207.237.112.149 X-EN-OrigHost: 207-237-112-149.c3-0.nyr-ubr1.nyr.ny.cable.rcn.com X-Virus-Checked: Checked by ClamAV on apache.org This is a multi-part message in MIME format. ------=_NextPart_000_0204_01CF49B7.8ECB3A80 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0205_01CF49B7.8ECB3A80" ------=_NextPart_001_0205_01CF49B7.8ECB3A80 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable If the number of types and dates per customer are reasonable modest = (dozens? hundreds?) it may not matter much at all. What are the numbers = here, average/maximum types per customer and dates per customer? In = fact, depending on the numbers, maybe the partition key should only be = the customer. I mean, Cassandra is good for reasonably wide partitions, = and exploding the number of partitions might not be playing to = Cassandra=E2=80=99s strengths in any meaningful way. IT might be = different if you were talking about many thousands of types or dates per = customer, but... are you? But ultimately it does come down to how you will be accessing the data = =E2=80=93 query, view, update. -- Jack Krupansky From: Donald Smith=20 Sent: Wednesday, March 26, 2014 1:22 PM To: mailto:user@cassandra.apache.org=20 Subject: Question about how compaction and partition keys interact In CQL we need to decide between using ((customer_id,type),date) as the = CQL primary key for a reporting table, versus ((customer_id,date),type). =20 We store reports for every day. If we use (customer_id,type) as the = partition key (physical key), then we have a WIDE ROW where each date's = data is stored in a different column. Over time, as new reports are = added for different dates, the row will get wider and wider, and I = thought that might cause more work for compaction. =20 So, would a partition key of (customer_id,date) yield better compaction = behavior? =20 =20 Again, if we use (customer_id,type) as the partition key, then over = time, as new columns are added to that row for different dates, = I=E2=80=99d think that compaction would have to merge new data for a = given physical row from multiple sstables. That would make compaction = expensive. But if we use (customer_id,date) as the partition key, then = new data will be added to new physical rows, and so compaction would = have less work to do???? =20 My question is really about how compaction interacts with partition = keys. Someone on the Cassandra irc channel, = http://webchat.freenode.net/?channels=3D#cassandra, said that when = partition keys overlap between sstables, there=E2=80=99s only = =E2=80=9Cslightly=E2=80=9D more work to do than when they don=E2=80=99t, = for merging sstables in compaction. So he thought the first form, = ((customer_id,type),date), would be better. =20 One advantage of the first form, ((customer_id,type),date) , is that we = can get all report data for all dates for a given customer and type in a = single wide row -- and we do have a (uncommon) use case for such = reports.=20 =20 If we used a primary key of ((customer_id,type,date)), then the rows = would be un-wide; that wouldn=E2=80=99t take advantage of clustering = columns and (like the second form) wouldn=E2=80=99t support the = (uncommon) use case mentioned in the previous paragraph. =20 Thanks, Don =20 Donald A. Smith | Senior Software Engineer=20 P: 425.201.3900 x 3866 C: (206) 819-5965 F: (646) 443-2333 donalds@AudienceScience.com =20 ------=_NextPart_001_0205_01CF49B7.8ECB3A80 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable
If the number of types and dates per customer are reasonable modest = (dozens? hundreds?) it may not matter much at all. What are the numbers = here,=20 average/maximum types per customer and dates per customer? In fact, = depending on=20 the numbers, maybe the partition key should only be the customer. I = mean,=20 Cassandra is good for reasonably wide partitions, and exploding the = number of=20 partitions might not be playing to Cassandra=E2=80=99s strengths in any = meaningful way.=20 IT might be different if you were talking about many thousands of types = or dates=20 per customer, but... are you?
 
But ultimately it does come down to how you will be accessing the = data =E2=80=93=20 query, view, update.
 
-- Jack=20 Krupansky
 
From: Donald Smith
Sent: Wednesday, March 26, 2014 1:22 PM
Subject: Question about how compaction and partition keys=20 interact
 

In CQL we need to decide between using=20 ((customer_id,type),date) as the CQL primary key for a reporting = table,=20 versus ((customer_id,date),type).

 

We store reports for every day.  If we use=20 (customer_id,type) as the partition key (physical key), then we=20 have  a WIDE ROW where each date's data is stored in a different = column.=20 Over time, as new reports are added for different dates, the row will = get wider=20 and wider, and I thought that might cause more work for=20 compaction.

 

So, would a partition key of = (customer_id,date) yield=20 better compaction behavior? 

 

Again, if we use (customer_id,type) as the = partition=20 key, then over time, as new columns are added to that row for different = dates,=20 I=E2=80=99d think that compaction would have to merge new data for a = given physical row=20 from multiple sstables. That would make compaction expensive.  But = if we=20 use (customer_id,date) as the partition key, then new data will = be added=20 to new physical rows, and so compaction would have less work to=20 do????

 

My question is really about how compaction = interacts with=20 partition keys.  Someone on the Cassandra irc channel, http://webcha= t.freenode.net/?channels=3D#cassandra,=20 said that when partition keys overlap between sstables, there=E2=80=99s = only =E2=80=9Cslightly=E2=80=9D=20 more work to do than when they don=E2=80=99t, for merging sstables in = compaction. =20 So he thought the first form, ((customer_id,type),date), would be = better.

 

One advantage of the first form, = ((customer_id,type),date)=20 , is that we can get all report data for all dates for a given = customer and=20 type in a single wide row  -- and we do have a (uncommon) use case = for such=20 reports.

 

If we used a primary key of = ((customer_id,type,date)),=20 then the rows would be un-wide; that wouldn=E2=80=99t take advantage of = clustering=20 columns and (like the second form) wouldn=E2=80=99t support the = (uncommon) use case=20 mentioned in the previous paragraph.

 

Thanks, Don

 

Donald=20 A. Smith=20 |=20 Senior Software Engineer=20
P: 425.201.3900 x 3866
C: (206) 819-5965
F: (646) = 443-2333
donalds@AudienceScience.com


3DAudienceScience=20

 

------=_NextPart_001_0205_01CF49B7.8ECB3A80-- ------=_NextPart_000_0204_01CF49B7.8ECB3A80 Content-Type: image/jpeg; name="image001.jpg" Content-Transfer-Encoding: base64 Content-ID: <706215324A6B41F6B6F2A2AA24115C2D@JackKrupansky14> /9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABQAAD/4QN1aHR0cDov L25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENl aGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4 OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAxNCA3OS4xNTE0ODEsIDIwMTMvMDMvMTMtMTI6 MDk6MTUgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5 OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHht bG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0i aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6eG1w PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9 InhtcC5kaWQ6RkVBMzYwMkM0MjIwNjgxMTgyMkFBQzA1RDA3ODc2NUQiIHhtcE1NOkRvY3VtZW50 SUQ9InhtcC5kaWQ6MzFGNjRFRkIwNUQ0MTFFM0ExMTk5MzFCRDBBMDUyMDQiIHhtcE1NOkluc3Rh bmNlSUQ9InhtcC5paWQ6MzFGNjRFRkEwNUQ0MTFFM0ExMTk5MzFCRDBBMDUyMDQiIHhtcDpDcmVh dG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSI+IDx4bXBNTTpEZXJpdmVk RnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmZhMDkyMjA5LTU4YTAtM2U0OC1hZWUwLTVj NDA1MDQ1OTk0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo2Q0VBQUFDNkFERUUxMUUyOTRF NTlBN0Q5RDJDQUI1NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0 YT4gPD94cGFja2V0IGVuZD0iciI/Pv/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5vAhAAAG1udHJS R0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAABAAD21gAB AAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA EWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIY AAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1ZWQA AANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJU UkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAx OTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIu MQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAA AAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAk oAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVD IGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNl IC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNl IC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2lu ZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcg Q29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAA AAAAE6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAA AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAF AAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAA lQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQEr ATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoC AwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMW AyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEE fgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYn BjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8I MghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqB CpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYN QA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBD EGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QT xRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJ F64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib 2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBs IJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgl lyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysC KzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsx EjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdg N5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+ YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWa Rd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpN k03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXC Vg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxe vV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fp aD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx 8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwh fIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteH O4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6 kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCe rp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sC q3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4 WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XI xkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bU SdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb 42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/y jPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23////uACZBZG9i ZQBkwAAAAAEDABUEAwYKDQAAFMAAAButAAAfwgAAI8z/2wCEAAICAgICAgICAgIDAgICAwQDAgID BAUEBAQEBAUGBQUFBQUFBgYHBwgHBwYJCQoKCQkMDAwMDAwMDAwMDAwMDAwBAwMDBQQFCQYGCQ0L CQsNDw4ODg4PDwwMDAwMDw8MDAwMDAwPDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/CABEI ACMBBAMBEQACEQEDEQH/xADlAAEAAwEBAQEAAAAAAAAAAAAABQYHBAMIAgEBAQEBAQAAAAAAAAAA AAAAAAUEBgMQAAEEAgICAAcBAQAAAAAAAAUAAgMEEwYBFBUWEFBgIzUHFzA2EQABAwIDBAQJBgkN AAAAAAACAQMEABESEwUhMUEUUZEiomFxgTLSI9MGNhChsVIVNUJygrJzk7MkFjBQ0WKSwjNDYzSE tHUSAAIBBAEEAwAAAAAAAAAAAAAyAfAhgTMSUGARQVGxIhMBAAIBBAIBAgYDAQAAAAAAAQARIfAx QWFRgXEQ8SBQYJHB0TChseH/2gAMAwEAAhEDEQAAAfv0rJIksRJUieO8hDnJUshFECehynQSRlRt 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 ------=_NextPart_000_0204_01CF49B7.8ECB3A80--