Return-Path: Received: from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 11289C002D for ; Sat, 20 Aug 2022 10:04:58 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id C2A498339C for ; Sat, 20 Aug 2022 10:04:57 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org C2A498339C X-Virus-Scanned: amavisd-new at osuosl.org X-Spam-Flag: NO X-Spam-Score: -1.697 X-Spam-Level: X-Spam-Status: No, score=-1.697 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, HTML_MESSAGE=0.001, SPF_HELO_NONE=0.001, SPF_NONE=0.001] autolearn=no autolearn_force=no Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id UtkzFCYQwYVk for ; Sat, 20 Aug 2022 10:04:56 +0000 (UTC) X-Greylist: delayed 00:11:54 by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 76CE283366 Received: from subsea-epitome.host4coins.net (subsea-epitome.host4coins.net [185.150.162.112]) by smtp1.osuosl.org (Postfix) with ESMTPS id 76CE283366 for ; Sat, 20 Aug 2022 10:04:56 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by subsea-epitome.host4coins.net (Postfix) with ESMTP id 924138429F; Sat, 20 Aug 2022 10:04:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d= towardsliberty.com; h=content-transfer-encoding:content-type :content-type:mime-version:references:in-reply-to:message-id :subject:subject:from:from:date:date; s=default; t=1660989853; x=1662804254; bh=NGj8JsERbZPwKjWoxyo80JgC/w5D39NjTwACyUzq//E=; b= u5+CUx19ZYbCL1Y0XO7wgHMbdHJdCA8OLRLPSrwR5tYiYrrHoLmtw7cdS1+Ae3E1 9ATZVwS7WVHKFHrzr90XKOsDThOcvmkNyp23FFzUQBRLKoHeifM9jD12QWSvBr2Z Gcjmpfn/qrlkJLesC6AmrwIdqtF+gYY6AAoO1ogYE8Y= X-Virus-Scanned: Debian amavisd-new at subsea-epitome.host4coins.net Received: from subsea-epitome.host4coins.net ([127.0.0.1]) by localhost (subsea-epitome.host4coins.net [127.0.0.1]) (amavisd-new, port 10026) with LMTP id pK-pcYCieLsG; Sat, 20 Aug 2022 10:04:13 +0000 (UTC) Received: from [10.108.129.84] (unknown [169.150.201.36]) (Authenticated sender: max@towardsliberty.com) by subsea-epitome.host4coins.net (Postfix) with ESMTPSA id 3B3D48428F; Sat, 20 Aug 2022 10:04:13 +0000 (UTC) Date: Sat, 20 Aug 2022 12:04:11 +0200 From: Max Hillebrand To: alicexbt , Bitcoin Protocol Discussion , alicexbt via bitcoin-dev Message-ID: <11A4C398-8CEA-4FDF-B450-55649E6CA1FF@pretty.Easy.privacy> In-Reply-To: <7gXWd6OVJjiW7aCeon8q-xlWfCMJkIEVCaeokjSVI16OvQPkPmEsSeGY0cGu4yVveimNUYsyG18Ro7JgUutfqXv5wKMMgJZD2c8ftAMFcbQ=@protonmail.com> References: <7gXWd6OVJjiW7aCeon8q-xlWfCMJkIEVCaeokjSVI16OvQPkPmEsSeGY0cGu4yVveimNUYsyG18Ro7JgUutfqXv5wKMMgJZD2c8ftAMFcbQ=@protonmail.com> X-ENCSTATUS: unencrypted X-pEp-Version: 2.1 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=----DJJBL2OJFDADD56QWMK33HK5RZHUTI Content-Transfer-Encoding: 7bit X-Mailman-Approved-At: Sat, 20 Aug 2022 14:14:43 +0000 Subject: Re: [bitcoin-dev] joinstr: coinjoin implementation using nostr X-BeenThere: bitcoin-dev@lists.linuxfoundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Bitcoin Protocol Discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 20 Aug 2022 10:04:58 -0000 ------DJJBL2OJFDADD56QWMK33HK5RZHUTI Content-Type: multipart/alternative; boundary=----I5M59DQ5AJF229Q08IG2C1TH9EP6IZ Content-Transfer-Encoding: 7bit ------I5M59DQ5AJF229Q08IG2C1TH9EP6IZ Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Great to see an implementation of the idea=2E Maybe I misunderstand, but isn't there a vulnerability of denial of servic= e here? A user who registers one input will receive the round secret identifier, a= nd this is all the information required for output registration=2E However,= that malicious user can now register multiple outputs, providing the same = secret, and nobody can link the malicious outputs to any specific input=2E = Therefor there cannot be a blame round where the malicious input is removed= , and thus there can be a ongoing free denial of service attack without att= ribution or defense=2E Skol Max ------I5M59DQ5AJF229Q08IG2C1TH9EP6IZ Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable Great to see an implementation of the idea=2E
<= br>Maybe I misunderstand, but isn't there a vulnerability of denial of serv= ice here?

A user who registers one input will receive the round secr= et identifier, and this is all the information required for output registra= tion=2E However, that malicious user can now register multiple outputs, pro= viding the same secret, and nobody can link the malicious outputs to any sp= ecific input=2E Therefor there cannot be a blame round where the malicious = input is removed, and thus there can be a ongoing free denial of service at= tack without attribution or defense=2E

Skol
Max


On August 20, 2022 10:20:00 AM GMT+02:00, alicexbt via= bitcoin-dev <bitcoin-dev@lists=2Elinuxfoundation=2Eorg> wrote:
Hi Bitcoin Developers,

I have wr= itten a python script as proof of concept for the [coinjoin implementation]= [1] using [nostr][2]=2E I used a lot of Python scripts created by others in= school, so it feels nice to offer something that could be useful to others= =2E

The implementation uses Bitcoin Core wallet and RPCs: `listunspe= nt`, `getnewaddress`, `scantxoutset`, `createpsbt`, `combinepsbt`, `finaliz= epsbt` and `sendrawtransaction`=2E It requires python-nostr library because= nostr is used for coordination between peers=2E Nostr is a decentralized n= etwork based on cryptographic keypairs=2E It is not peer-to-peer however si= mple and scalable=2E

Every step is published as an event using a nos= tr relay and 5 peers coordinate to create, sign and broadcast a coinjoin tr= ansaction=2E I need to write a NIP that would be an alternative to blind s= ignatures=2E Relay will share a random secret with clients for one round wh= ich should be present in output registration request although never gets pu= blished=2E If someone tries to register an output without registering any i= nputs, request would not have the number initially shared with inputs so re= quest would get rejected or published as unverified=2E Relay would not be a= ble to link inputs and outputs as the number is same for all inputs in a ro= und and they get registered at different times with new keys and IP address= =2E Clients can use multiple relays at the same time to avoid trusting one = relay=2E This would result in different shared secret number but same proce= ss=2E If a relay tries to cheat, users will not sign the transaction and av= oid using it in future=2E

Usage:

1)Run `python coinjoin=2Epy= ` and enter descriptor for one of the inputs=2E
2)Script will check inp= uts for this round in every 30 seconds and register a new adddress for outp= ut once 5 inputs are registered=2E
3)Similar check happens every 30 sec= onds for outputs=2E Last peer should create a PSBT=2E
4)Unsigned PSBT w= ill be printed and signed by wallet with `walletprocesspsbt` RPC=2E
5)S= cript will check signed PSBTs and last peer to sign should finalize coinjoi= n transaction once 5 signed PSBTs are received=2E
6)Coinjoin transactio= n will be broadcasted and txid will printed=2E

Example:

```List of utxos in wallet:

wpkh([53830dca/84'/1'/0'/0/0]02449be5fb74= 725255eeeb50eba930fa87705f21e99d13cd710cf2c1f21153c808)#x2hyyeg5

Ent= er descriptor for the input registration: wpkh([53830dca/84'/1'/0'/0/0]0244= 9be5fb74725255eeeb50eba930fa87705f21e99d13cd710cf2c1f21153c808)#x2hyyeg5
event id: bcbbe62d75d99fed73f1e50ac58a38d1840b658951893e63c0322b378d7= d56f0

```
```
tb1qhxrp4zl54ul0twtyz0gury5399q7z0kvqqrl6m regis= tered for output

event id: 9449c9065bef356d21507a98f88b028b17fc1c49e= b195c8d4420604fcaaef041
```
```
Unsigned PSBT: cHNidP8BAP1yAQIAAAA= FtMaoJYcXvOG5L3Yaz3YyS7gIt4h5/zzOrRRS3hrVvwoAAAAAAP////+o83geaSm4L76KToIUl5= MiZqLAUbIDJLq6DWrjP/3b8AEAAAAA/////zEF3CXIvVHpIa7No1s1yg+KtyOfXTRSyWnOdXMfz= cDwAQAAAAD/////wMa4XAgnU+39Ien+KG9rYtv8bLMNYakmZyY/QFfwLRcAAAAAAP/////5M42I= D6uLmQTb2tnFHnN7UMpnDD25uN8ZX7A+GNSM3QEAAAAA/////wV4xwEAAAAAABYAFLmGGov0rz7= 1uWQT0cGSkSlB4T7MeMcBAAAAAAAWABSc0/FM6Hdbdxh10IJkYOklVFWqjnjHAQAAAAAAFgAUPS= ZKe/w6PT6qIF+WhL4wHaFymjd4xwEAAAAAABYAFMx0rxYlpPWB3NFry4Ctk2eVi/UNeMcBAAAAA= AAWABSzc4xK0VTfvjK0MHXrAUFLYgYnOgAAAAAAAAAAAAAAAAAAAA=3D=3D

event id= : 976744b38fa9343fb79e1b5215512ead6ee08e5890d79a201fc5b872f6de4eba
``````
Signed PSBT: cHNidP8BAP1yAQIAAAAFtMaoJYcXvOG5L3Yaz3YyS7gIt4h5/zzOr= RRS3hrVvwoAAAAAAP////+o83geaSm4L76KToIUl5MiZqLAUbIDJLq6DWrjP/3b8AEAAAAA////= /zEF3CXIvVHpIa7No1s1yg+KtyOfXTRSyWnOdXMfzcDwAQAAAAD/////wMa4XAgnU+39Ien+KG9= rYtv8bLMNYakmZyY/QFfwLRcAAAAAAP/////5M42ID6uLmQTb2tnFHnN7UMpnDD25uN8ZX7A+GN= SM3QEAAAAA/////wV4xwEAAAAAABYAFLmGGov0rz71uWQT0cGSkSlB4T7MeMcBAAAAAAAWABSc0= /FM6Hdbdxh10IJkYOklVFWqjnjHAQAAAAAAFgAUPSZKe/w6PT6qIF+WhL4wHaFymjd4xwEAAAAA= ABYAFMx0rxYlpPWB3NFry4Ctk2eVi/UNeMcBAAAAAAAWABSzc4xK0VTfvjK0MHXrAUFLYgYnOgA= AAAAAAQBxAgAAAAG+qpMXZCy6tBuUlgo8JD0GVXKp60FkhwDeg2sF1fkFkwMAAAAA/f///wLo9w= EAAAAAABYAFFfLA5xarC/w/SxeMDQ5tuXrYJLUWwMAAAAAAAAWABRfPf//hwMjHB4OKj87cU19X= OSh7yOWAQABAR/o9wEAAAAAABYAFFfLA5xarC/w/SxeMDQ5tuXrYJLUAQhrAkcwRAIgOIhLoC53= 48U8YkEr4GU1K4yWskIOEXgW4Wsk/W2cR7ICIEJXqtOuDJ5CkwrSuwJLWtzab4dslbN3KuL/pyo= oMnOCASECRJvl+3RyUlXu61DrqTD6h3BfIemdE81xDPLB8hFTyAgAAAAAACICA77Cnd6o3kr0yc= +91eabpOn5igs/MUMbudNYSS6oyMWMGFODDcpUAACAAQAAgAAAAIAAAAAAFAAAAAAAAAAA
<= br>event id: 5846b6e6902f3c5a43496d7d9785ed62444aa74963f03c33d637d8b09ee7a1= 39
```
```
Coinjoin tx: 75e490b10b15a6a0422f25ff66ad98ef70390c8fec= aac02712705dce8cc3564b

event id: 9b5d4bf279b59e2b6e539e683fba83da72d= ce2b640360aa95db1b1400be93190
```

There are lot of things that co= uld be improved and a few suggestions are in the gist that described the [i= dea][3]=2E I would love read to any opinions about this experiment and will= start working on creating an Android app for joinstr next week=2E

C= redits:

- fiatjaf (Nostr)
- Andrew Chow (PSBT)
- Jeff Thibault= (python-nostr)
- Existing coinjoin implmentations

[1]: https://github=2Ecom/1440000= bytes/joinstr
[2]: https://github=2Ecom/nostr-protocol/nostr
[3]: https= ://gist=2Egithub=2Ecom/1440000bytes/1c305097b070c8374cc3b91f50314a45
/dev/fd0

Sent with Proton Mail secure email=2E
bitcoin-dev m= ailing list
bitcoin-dev@lists=2Elinuxfoundation=2Eorg
https://lis= ts=2Elinuxfoundation=2Eorg/mailman/listinfo/bitcoin-dev
------I5M59DQ5AJF229Q08IG2C1TH9EP6IZ-- ------DJJBL2OJFDADD56QWMK33HK5RZHUTI Content-Type: application/pgp-keys; name="sender_key.asc" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="sender_key.asc"; size=3910 LS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCgp4c0JOQkdFaFh1c0JDQURuS2g1 ODgyVFhoWU5xK1F1NnhWWlhlTXpxUVdCc29hV0hOZytIYm1KUmVTOFpEdG9mCkh4Z2Y1ZWlvdWwx cDRaTnFET2VjRzJ4RURFeTJoZTV5bGhNNTV5UEZ4cHJmcldJK2dsQ2Q1TDZOWGFFemh4VGoKcWhN dkRTZ3kzUTNyRVR2MGI5WDRHbGdjWXBrODJHZUYrLy9FQnh5Vlczd0tQMWg0bkw1NDRkWlhZc2sr NTBWMApzcFA4RnI2VkpNckE4ZkQ0Rk5ZeGZTUjcrMExRVTNlQ3RGVXdWcUFaZmNnZXpZbkp6WFVw bWk5RTNDMmhTTEUxClBiZWx0U3VxVG9mVnJDNlVtZWMyVnVtRSt5ajBuYlgvWWV0VnNCV0EybTlI Y3BqRGVTdkxRODBvZ3lPU3l0UkkKTGsyMk5nTURPSkN5WEVWZkFtQUlxZjJPZlRKSHVaaTZobjk1 QUJFQkFBSEN3TThFSHdFS0FJTUZnbUVoWHVzRgppUVdmcGdBREN3a0hDUkNNelhXc3gvMC9QRWNV QUFBQUFBQWVBQ0J6WVd4MFFHNXZkR0YwYVc5dWN5NXpaWEYxCmIybGhMWEJuY0M1dmNtYzJNdjlG SWtJQzNVWVYvSytLNi94SGk3WFdiaWdrbmljbHJ0SWVkNkUzQXdNVkNnZ0MKbXdFQ0hnRVdJUVJt MytQRWVINFRKSis2SkFTTXpYV3N4LzAvUEFBQTAxWUgvM3NxUzhIN0Evdk1JMm5JWGl6cApKMUE5 c3piQjgvdEMyajhZWG9WOGVVRUZWVzNkR2Vya3A3NTlFMm5wQkIrOGZmS2JHSmVvaUo3cHlaMG9r S05ZCmN3ZVN5WjNVcUZvRnc4T3V1VDVEbDRaalZzVGp3aTMwYVR6bnpmK2FIdjNtdnFKV3JtQU8w MXI5M040YXlnSkkKUm5LVE9jdU1ObHdLdS9tdk1rV1VjN01JRHlFWDIzbExGL1E0RjQ0NU9Tc2pq VG0wWmZGQ3NoYkFMRWVlR0ViNQpXRjEyandVVHFDVmtIOXFKank5bFFWSWxUZlVXTUhrRWxsSWlm MzFmZUZWZjMyWE1YQjlkYm1TOXlSZ1RsWFZZCkVOMjhzU2RLMCtDV0dFVFJURVhFbEdnUkdZSGMr WjR2REw5aTBPd2xvZVdnSGZ1YXpvWHB6L05ZVGJZbkJaUkQKNkdqTkowMWhlQ0JJYVd4c1pXSnlZ VzVrSUR4dFlYaEFkRzkzWVhKa2MyeHBZbVZ5ZEhrdVkyOXRQc0xBMGdRVApBUW9BaGdXQ1lTRmU2 d1dKQlorbUFBTUxDUWNKRUl6TmRhekgvVDg4UnhRQUFBQUFBQjRBSUhOaGJIUkFibTkwCllYUnBi MjV6TG5ObGNYVnZhV0V0Y0dkd0xtOXlaNGJTNjdiR05OZHVWMWkzUkNKZ0ZxbUMzYm1ENHF2OU1n bWQKNzZpVTZjNXNBeFVLQ0FLWkFRS2JBUUllQVJZaEJHYmY0OFI0ZmhNa243b2tCSXpOZGF6SC9U ODhBQUM2clFmKwpQUWVmTEs5L2V0M2JlL3g3Z0w5QzZWRXgzTGR3UWlDOXZGVFBReXduQ2l3Zmln VTAvVmVqU3hWTHhpcU9sRGpaCldvTzZMa1I5LzhuNkt6OVVIekMwMkExeGVIK1dXWU9jaUhmNkhm dVJIZ3pMSkdzcWlOQ3kybklCNWFEckJOdjcKTlZBQVdmcW9acnlBbFFnY28zM0RBYUZJd0xVWjd2 T3lWNGJLTWdPY1ZUT2N0dngxSHlZVGpTL1lnWVFaVDRQeAp2UDJVRWlCYjkvcjlCbFFBckY5SVZB WXc3V1JqZ1pqY3BuNXBuejY1bm94dWduSEJLeU8xdHl2Y1JGdWdQZXE0CkJLNXNFNFRaRHByMUI0 dnRSY1czeWoxMWhHRXFaN21JWnRmZzNRMittKzVqKzlYVWhQb2doQjI3M3RFMmM0NkYKNDFpZE1s blB4QnZBU2NFUVc3eHVMYzdBVFFSaElWN3JBUWdBckhSM2d3ZjhCTFBVU3M5cGJHaE45aWxHV3k1 cQphZ0tPZnZOM2I0QTU1UnNOYUhlbCtEeVlFWUhpRVhLTWFBOXRWZ2RTMkwxRHFQRUljMGl4NG5B QkJHeG82YThYCi9MQVdzQklOZzFLYlNaeXhZd0hFUHY5eHNKVGV0UWhuWjVNMTRZZmRxVlZTODdZ ZW9JVmFrQWNmejNWRnpGYWwKcUdjeUlLV25hbGJGelJIYkRoNnkyUkpaSnJiOGRJZS9GYmd4NUI3 NlNHNkhhNFdPK2luVlpQM3NIOVRhN0VORQpkeDYvVzNsM01pN2l1dExGeGcwOUpHcFM1NVF5Njha MTkrUDVCQlFKVzk3VmJsSkFDUm0vRkxTOVQ4NitIWHZmCm1qR20zUEFIUWxkY20xQzZ3b091U3dK eE50dnF6WDAwUW5oQVkvT3JzYUtGWnZWZDRNMEFUZjNDWndBUkFRQUIKd3NKQ0JCZ0JDZ0gyQllK aElWN3JCWWtGbjZZQUNSQ016WFdzeC8wL1BFY1VBQUFBQUFBZUFDQnpZV3gwUUc1dgpkR0YwYVc5 dWN5NXpaWEYxYjJsaExYQm5jQzV2Y21jcW1UZ01DanBjZ1IwMlZTR2FDUWZoRnh6RmpiQVRsUUVZ ClNhNDVYd1oyUWdLYkFzQzhvQVFaQVFvQWJ3V0NZU0ZlNndrUUVsQXRpMWdzeEZOSEZBQUFBQUFB SGdBZ2MyRnMKZEVCdWIzUmhkR2x2Ym5NdWMyVnhkVzlwWVMxd1ozQXViM0pua1VVWGROSnlMUWRt cGliR0tPbFZTT1A4Y1BtVgpsdmtHQVQ5NnhyR0RtMjBXSVFTVG5YOStqMnNuYVQxQkFmY1NVQzJM V0N6RVV3QUFZL2NILzBiYzVXZjEzQkZyClBOeHNuV3EzTUtJenB4VXd6akIzNHh4RTJnakh1Qk9C TG16ZkhOV2Rwc3FZckY2TzlXNzgxVWhpd1Ayc0VuMEUKZytrcDBuOW9wUUEramtuVWwzaUpTY0Qy S0I2Unk5dDdlVE1mZUZoY01GemdlbTc2azFSOWRkd3p3QjdoUHQ5cAoyMDNoZDJ5QXpFTzFVZ2s3 OE1LZll4dVJJUWVlVVJTTHB0MGhvZGp2NUhsZ3hQVEZ5blJlaEtTc1Z0eDlOSWUxCm9ydHhTcGZX YlVtdUthTFlNdG5TTmNQWTMxKzFFbENIYlJWcm0zakxoMFRWeThQZi9yTG9ubUoxZnNYdFJlS2gK SkpBTFd0ejRuYmt6QkFITDA3djB5TmoyUW5HeEg3ZU1XdHVWOWo1M0NIVnJkS1d0c0pHdGlNMFcx dUIvYklvTQpUZC9HbnFWNksvMFdJUVJtMytQRWVINFRKSis2SkFTTXpYV3N4LzAvUEFBQWZsY0gv UmpOU1ZTTm5aKytIeUJaCnJScTh4NVgrbkIwOGJIQ2hIOEExaUFlMlowaTE2S0J1cVVqekIrWHlx eFdxcCtGdmE2eExEcm4zQWY5Uk5pNE4Kb1R1dys2MjZMbkY2S3VmUmNtRjNhMkxYVHJ5NUtVQTRT bSsvUmxyQnZWblRldzZremc4NFQyV3IzMm1MbXdtUwp3eVdwY3h6UEZWekpuSlVzVURqY0ZGc2lR ZFpJUjFQYVNaTENsMGJ0WG9oNDJDbG9ZeXVxaGpVdzZRWEsrNnV0CmdhVUdnUjBKdytBV2l0N3Vj dVIrZlhORy91WDR4VWtMcHFxWmlKT05rVHhFeVBEd2NzVXFQS3ZJVUpCTGNYSlQKSHlNUEVqUTFp UDNnelBwenFzMWhhUktTYWhyMmZwU3FLSnZ2RWgwckhQby95UzhFK0pray92QldUSlEzbmlsRQpN bVR0VE4zT3dFMEVZU0ZlNndFSUFOZzdjL241VEdXOVdka0VuREhEc211UEVwN2MrYlp6TWlxZnhX V1hocWxrClp0SVJxTXBzWi9oajhlSlBMMjV0QnVaaVR0R2t5L3p2Q1RReFh0SFRuckxLYVhXcDhE ZHhqc0RHRVJkeFlBRkkKM1haNEQ0QURqYlBReXZKRVorbktZblFKem1oUGE2bHI1ZGxDbTJaZlNy eTMxUUo4c25JL001UmRvTG56L05ibgp5cEpvOTNBQzB0M2YxNUpOTStwOEdhamFmaG4xUUtPOStT MzFEQXhWVjd1b1lwVTRKNjI4bDFvbXQ4blpyS1FQCmJTQWVRblZzWkE0c3hnbEZqN2VVQ3ZnRUQv NFBWVmFZMTVtbGlEcmxhT21HNXpDWHArUzdOZWF4Z2dmRDgrYjUKY01lUEx0dU8yRXFmeFhHZjBp UWlueTRXNnJaVEVrTitUN0NLZDRFODR4Y0FFUUVBQWNMQXhBUVlBUW9BZUFXQwpZU0ZlNndXSkJa K21BQWtRak0xMXJNZjlQenhIRkFBQUFBQUFIZ0FnYzJGc2RFQnViM1JoZEdsdmJuTXVjMlZ4CmRX OXBZUzF3WjNBdWIzSm4zZjI1RUc3UkpwMGpjeVoyeUZLcDRFdWFYSERGK3AwMmxSbzEvRWV2Mks4 Q213d1cKSVFSbTMrUEVlSDRUSkorNkpBU016WFdzeC8wL1BBQUFNMDRIL2pXNFZDQkExUk4yTHEv YUwxc2VjekdkcElxegpuQWlzTE12NXUzYko2YzlKajMyak5RRG5XbjFqNXNoWk4xWURiKzgwZjhk RnZkWTgreWUyVnBKTWpacW5ZMThGCmJFaUlEcjl2am5wQ2wvS3ZaWnlia1AzanIrN2tWeEJxZldO NitpYjN0UFhBWDBld2lWY055Q1NrY3BEcTk5SWwKdHhVZzN2RUc1Z29LcE10Y3J4N09JNkhKenkr bHlTOUl6U0xFRktGYWVydTF2aDFJRElWSzFaNGxuNndDNE1qVwpwb0lYSTZmcXd4amUxaGE5UDNk ekJFL3gyUXdueGt3Tjl1NEZld2pPazF2aTJaRTJVOFdybG4ycXcwVW41dlBFCmg2OXVoek9oU1Uy UnV2V20vR2pEajB2eStCRG1tbjRBUXl0MmdCT3dmMXFRZUREbkthM1h0V3ExWG5vPQo9c2ZGRwot LS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCg== ------DJJBL2OJFDADD56QWMK33HK5RZHUTI--