From user-return-17448-apmail-couchdb-user-archive=couchdb.apache.org@couchdb.apache.org Fri Aug 12 15:58:19 2011 Return-Path: X-Original-To: apmail-couchdb-user-archive@www.apache.org Delivered-To: apmail-couchdb-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 70FAB81D1 for ; Fri, 12 Aug 2011 15:58:19 +0000 (UTC) Received: (qmail 22285 invoked by uid 500); 12 Aug 2011 15:58:17 -0000 Delivered-To: apmail-couchdb-user-archive@couchdb.apache.org Received: (qmail 22191 invoked by uid 500); 12 Aug 2011 15:58:17 -0000 Mailing-List: contact user-help@couchdb.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user@couchdb.apache.org Delivered-To: mailing list user@couchdb.apache.org Received: (qmail 22180 invoked by uid 99); 12 Aug 2011 15:58:16 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 12 Aug 2011 15:58:16 +0000 X-ASF-Spam-Status: No, hits=1.8 required=5.0 tests=LONGWORDS,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: domain of simon@struktur.de designates 213.61.168.242 as permitted sender) Received: from [213.61.168.242] (HELO hugin.struktur.de) (213.61.168.242) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 12 Aug 2011 15:58:09 +0000 Received: from zarafa1.struktur.de (zarafa1.struktur.de [10.2.0.71]) by hugin.struktur.de (Postfix) with ESMTP id DBFAA4080CA for ; Fri, 12 Aug 2011 15:57:48 +0000 (UTC) Received: from [10.1.1.201] (redemption.intranet.struktur.de [10.1.1.201]) by zarafa1.struktur.de (Postfix) with ESMTPS id 7268C1604B8 for ; Fri, 12 Aug 2011 17:59:58 +0200 (CEST) Subject: Re: Compact not completing From: Simon Eisenmann To: user@couchdb.apache.org In-Reply-To: References: <1312821086.28552.374.camel@redemption.intranet.struktur.de> <23F087AD-2BB7-444B-A392-DA4DD502960B@apache.org> <1312883349.28552.391.camel@redemption.intranet.struktur.de> <2084656C-6545-4856-B941-E2D41956D8CE@apache.org> <1313078897.28552.590.camel@redemption.intranet.struktur.de> <15B4B79E-5C7D-4447-A620-F4D1A663E180@apache.org> <1313143248.9784.11.camel@redemption.intranet.struktur.de> Content-Type: multipart/signed; micalg="sha1"; protocol="application/x-pkcs7-signature"; boundary="=-UeDVzgL8WjeeXX06UAUo" Organization: struktur AG Date: Fri, 12 Aug 2011 17:57:47 +0200 Message-ID: <1313164667.22165.28.camel@redemption.intranet.struktur.de> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 X-Virus-Checked: Checked by ClamAV on apache.org --=-UeDVzgL8WjeeXX06UAUo Content-Type: multipart/mixed; boundary="=-RTSX164Rwahd9nOP83iD" --=-RTSX164Rwahd9nOP83iD Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Woot! The script works and i was able to free around 100GB of space. If perfectly finds the broken docs, recreates them empty and deletes them again. Afterwards the databases become compactable again. Thanks alot Adam for your support. Attached is the final version of the repair script, which might be of help for anybody which has this problem Best regards Simon Am Freitag, den 12.08.2011, 10:56 -0400 schrieb Adam Kocoloski: > Hi Simon, progress! Yes, go ahead and re-create and delete documents wit= h those IDs and see if you can successfully compact. Regards, >=20 > Adam >=20 > On Aug 12, 2011, at 6:00 AM, Simon Eisenmann wrote: >=20 > > Hi Adam, > >=20 > > all right, looks like i am able to find the trouble makers when also > > looking at the deleted documents: > >=20 > > ~# python repaircompact.py http://localhost:5984/gangstercluster_1 > > Changes feed is > > http://localhost:5984/gangstercluster_1/_changes?since=3D0. > > Fetched feed into /tmp/tmpLjRkZY. > > Not found error: missing!=3Ddeleted > > (/gangstercluster_1/alive_1dcc4efdb2a411e0acd3003048679e10) > > Not found error: missing!=3Ddeleted > > (/gangstercluster_1/alive_1dcc523bb2a411e0acd4003048679e10) > > Not found error: missing!=3Ddeleted > > (/gangstercluster_1/alive_41ed63c1b2a411e0acd4003048679e10) > > Not found error: missing!=3Ddeleted > > (/gangstercluster_1/alive_41ed678bb2a411e0acd5003048679e10) > > Processed 8225 entries (last sequence: 5972567) > > Document count: 8222 (count: 74, deleted: 8148) > > Document commited sequence is now: 5972569 > >=20 > >=20 > > Though its hard to say if the number of changes feed rows matches the > > number of the database infos as its constantly changing. Though its ver= y > > close so probably it would match if nothing changes. > >=20 > > So now that i have found the missing documents. Should i just create an > > empty document with that ID, and delete it again? > >=20 > > Thank you and best regards > > Simon > >=20 > > ps: updated script attached > >=20 > >=20 > > Am Donnerstag, den 11.08.2011, 12:30 -0400 schrieb Adam Kocoloski: > >> Hi Simon, I wouldn't skip the deleted documents, a deleted doc could j= ust as easily be the one missing in the ID index. When you lookup a delete= d document you should see "reason":"deleted" instead of the "reason":"missi= ng" that you get if the ID is not in the index at all. Then again, if you = see that only ever see deleted docs after retrieving the full _changes then= a deleted doc is probably not the source of your troubles. > >>=20 > >> Can you confirm that the number of rows in the changes feed is equal t= o doc_count + doc_del_count from db.info()? Best, > >>=20 > >> Adam > >>=20 > >> On Aug 11, 2011, at 12:08 PM, Simon Eisenmann wrote: > >>=20 > >>> Hi Adam, > >>>=20 > >>> i wrote a short python script, which loads the complete changes feed = and > >>> requests all of the documents not marked "deleted" using HTTP HEAD > >>> requests. Though i only find documents which have been deleted after = i > >>> have retrieved the complete changes view (takes a while for large > >>> databases), and never the same. > >>>=20 > >>> So again no luck here in finding the problems. > >>>=20 > >>> Any more suggestions? Is there a way to rebuild the complete database > >>> file (maybe offline?). > >>>=20 > >>> Thank you and best regards > >>> Simon > >>>=20 > >>>=20 > >>> ps: The script i have been using is attached. > >>>=20 > >>>=20 > >>>=20 > >>> Am Dienstag, den 09.08.2011, 16:10 -0400 schrieb Adam Kocoloski: > >>>> Hi Simon, CouchDB 1.1.0 includes a recent optimization to _changes?i= nclude_docs=3Dtrue which allows it to skip a lookup in the id tree and inst= ead load the document body from the pointer in the sequence tree. In that = case you wouldn't notice any missing entry in the id tree. You would notic= e it, however, if you did direct lookups for each document. Apologies for t= he outdated instructions. Can you try looking up the documents in a separa= te request and see if the results change? > >>>>=20 > >>>> Adam > >>>>=20 > >>>> On Aug 9, 2011, at 5:49 AM, Simon Eisenmann wrote: > >>>>=20 > >>>>> Hi Adam, > >>>>>=20 > >>>>> i just checked the whole _changes feed (since=3D0) and could not fi= nd any > >>>>> document "missing" when using "include_docs=3Dtrue". > >>>>>=20 > >>>>> The database in itself has only around 30 documents, so should be q= uite > >>>>> small. Though there are lots of creations and deletions happening a= ll > >>>>> the time. Thus it its daily purged and compacted.=20 > >>>>>=20 > >>>>> So - the changes feed is of no help. Any other idea? > >>>>>=20 > >>>>> Thank you and best regards > >>>>> Simon > >>>>>=20 > >>>>> Am Montag, den 08.08.2011, 13:25 -0400 schrieb Adam Kocoloski: > >>>>>> Hi Simon, I think my amended instructions to Mike are still a sens= ible way to debug/workaround the problem. Reiterating (96282148 was the la= st seq Mike observed in the Futon status for the compaction): > >>>>>>=20 > >>>>>>> 1) What you really want are the last 1000 Ids in the seq_tree pri= or to the compactor crash. So maybe something like > >>>>>>>=20 > >>>>>>> GET /iris/_changes?descending=3Dtrue&limit=3D1000&since=3D9628214= 8 > >>>>>>=20 > >>>>>>> 2) Figure out which of those entries are missing from the id tree= , e.g. lookup the document and see if the response is {"not_found":"missing= "}. You could also try using include_docs=3Dtrue on the _changes feed to a= ccomplish the same. > >>>>>>=20 > >>>>>>> 3) Once you've identified the problematic IDs, try creating them = again. You might end up introducing duplicates in the _changes feed, but i= f you do there's a procedure to fix that. > >>>>>>=20 > >>>>>> Regards, Adam > >>>>>>=20 > >>>>>> On Aug 8, 2011, at 12:31 PM, Simon Eisenmann wrote: > >>>>>>=20 > >>>>>>> Hi Guys, > >>>>>>>=20 > >>>>>>> i have a couple of CouchDB instances which started to be come > >>>>>>> unpackable. It shows this error: > >>>>>>>=20 > >>>>>>> [Mon, 08 Aug 2011 16:16:27 GMT] [info] [<0.10808.123>] Starting > >>>>>>> compaction for db "database1" > >>>>>>> [Mon, 08 Aug 2011 16:16:45 GMT] [error] [<0.10808.123>] ** Generi= c > >>>>>>> server <0.10808.123> terminating=20 > >>>>>>> ** Last message in was {'EXIT',<0.30396.143>, > >>>>>>> {function_clause, > >>>>>>> [{couch_db_updater,'-copy_docs/4-fun-2-', > >>>>>>> [not_found, > >>>>>>> {db,<0.10807.123>,<0.10808.123>,nil, > >>>>>>> <<"1312767347007568">>,<0.10805.123>, > >>>>>>> <0.10809.123>, > >>>>>>> {db_header,5,6340261,0, > >>>>>>> {7198006895,{65952,10145}}, > >>>>>>> {7198010315,76813}, > >>>>>>> {7198051016,[]}, > >>>>>>> 364,7050915618,nil,1000}, > >>>>>>> 6340261, > >>>>>>> {btree,<0.10805.123>, > >>>>>>> {7198006895,{65952,10145}}, > >>>>>>> #Fun, > >>>>>>> #Fun, > >>>>>>> #Fun, > >>>>>>> #Fun}, > >>>>>>> {btree,<0.10805.123>, > >>>>>>> {7198010315,76813}, > >>>>>>> #Fun, > >>>>>>> #Fun, > >>>>>>> #Fun, > >>>>>>> #Fun}, > >>>>>>> {btree,<0.10805.123>, > >>>>>>> {7198051016,[]}, > >>>>>>> #Fun, > >>>>>>> #Fun, > >>>>>>> #Fun,nil}, > >>>>>>> 6340261,<<"spreedcom_accounts_1">>, > >>>>>>> "/var/lib/couchdb/database1.couch",[], > >>>>>>> [],nil, > >>>>>>> {user_ctx,null,[],undefined}, > >>>>>>> nil,1000, > >>>>>>> [before_header,after_header,on_file_open= ], > >>>>>>> false}, > >>>>>>> <0.30397.143>]}, > >>>>>>> {lists,map,2}, > >>>>>>> {lists,map,2}, > >>>>>>> {couch_db_updater,copy_docs,4}, > >>>>>>> {couch_db_updater,'-copy_compact/3-fun-0-',= 6}, > >>>>>>> {couch_btree,stream_kv_node2,8}, > >>>>>>> {couch_btree,stream_kp_node,7}, > >>>>>>> {couch_btree,fold,4}]}} > >>>>>>>=20 > >>>>>>>=20 > >>>>>>> ... lots of more similar errors following. > >>>>>>>=20 > >>>>>>> In this mailing list i have found a similar issue from the beginn= ing of > >>>>>>> this year (Fri, 31 Dec 2010 12:38:18), though without a solution. > >>>>>>>=20 > >>>>>>> This database got purged a lot and has constant changes. So prett= y > >>>>>>> similar from the older topic. So i assume there is something wron= g in > >>>>>>> the database file related to previous purges. So looks like some = bug > >>>>>>> here. > >>>>>>>=20 > >>>>>>> So - any hints how to fix this? The database is getting pretty la= rge and > >>>>>>> has to be packed from time to time. > >>>>>>>=20 > >>>>>>> CouchDB is running with Version 1.1.0 on Linux 64bit. The databas= e has > >>>>>>> initially been created with CouchDB 1.0.1 - though the issue appe= ared a > >>>>>>> couple of weeks ago (packing has been working with 1.1.0 before. > >>>>>>>=20 > >>>>>>>=20 > >>>>>>> Thank you and best regards > >>>>>>> Simon > >>>>>>>=20 > >>>>>>>=20 > >>>>>>> --=20 > >>>>>>> Simon Eisenmann > >>>>>>>=20 > >>>>>>> [ mailto:simon@struktur.de ] > >>>>>>>=20 > >>>>>>> [ struktur AG | Kronenstra=C3=9Fe 22a | D-70173 Stuttgart ] > >>>>>>> [ T. +49.711.896656.0 | F.+49.711.89665610 ] > >>>>>>> [ http://www.struktur.de | mailto:info@struktur.de ] > >>>>>>=20 > >>>>>=20 > >>>>> --=20 > >>>>> Simon Eisenmann > >>>>>=20 > >>>>> [ mailto:simon@struktur.de ] > >>>>>=20 > >>>>> [ struktur AG | Kronenstra=C3=9Fe 22a | D-70173 Stuttgart ] > >>>>> [ T. +49.711.896656.68 | F.+49.711.89665610 ] > >>>>> [ http://www.struktur.de | mailto:info@struktur.de ] > >>>>=20 > >>>=20 > >>> --=20 > >>> Simon Eisenmann > >>>=20 > >>> [ mailto:simon@struktur.de ] > >>>=20 > >>> [ struktur AG | Kronenstra=C3=9Fe 22a | D-70173 Stuttgart ] > >>> [ T. +49.711.896656.68 | F.+49.711.89665610 ] > >>> [ http://www.struktur.de | mailto:info@struktur.de ] > >>> > >>=20 > >=20 > > --=20 > > Simon Eisenmann > >=20 > > [ mailto:simon@struktur.de ] > >=20 > > [ struktur AG | Kronenstra=C3=9Fe 22a | D-70173 Stuttgart ] > > [ T. +49.711.896656.68 | F.+49.711.89665610 ] > > [ http://www.struktur.de | mailto:info@struktur.de ] > > >=20 --=20 Simon Eisenmann [ mailto:simon@struktur.de ] [ struktur AG | Kronenstra=C3=9Fe 22a | D-70173 Stuttgart ] [ T. +49.711.896656.68 | F.+49.711.89665610 ] [ http://www.struktur.de | mailto:info@struktur.de ] --=-RTSX164Rwahd9nOP83iD Content-Disposition: attachment; filename="repaircompact.py" Content-Transfer-Encoding: base64 Content-Type: text/x-python; name="repaircompact.py"; charset="UTF-8" IyEvdXNyL2Jpbi9weXRob24NCiIiIg0KU2ltcGxlIHNjcmlwdCB0byBsb2FkIGFsbCBkb2N1bWVu dHMgcmV0dXJuZWQgYnkgYSBDb3VjaERCIF9jaGFuZ2VzIGZlZWQgd2l0aCANCihzaW5jZT0wKSB0 byBmaW5kIGlmIHNvbWUgb2YgdGhlIGRvY3VtZW50cyBhcmUgbWlzc2luZyAoY2hlY2tzIEhUVFAg c3RhdHVzKS4NCg0KVGhpcyBzY3JpcHQgY2FuIGhlbHAgd2hlbiB5b3UgY2Fubm90IGNvbXBhY3Qg eW91ciBDb3VjaERCIGRhdGFiYXNlIGFueSBtb3JlDQpiZWNhdXNlIG9mIG1pc3NpbmcgZG9jdW1l bnRzIHdoaWNoIHNvbWVob3cgZ290IGxvc3QuIFRoaXMgc2NyaXB0IGZpbmRzIGFsbCB0aGVzZQ0K bWlzc2luZyBkb2N1bWVudHMgaW4gYSBnaXZlbiBkYXRhYmFzZSwgY3JlYXRlcyB0aGVtIGVtcHR5 IGFuZCBpbW1lZGlhdGVseSANCmRlbGV0ZXMgdGhlIGRvY3VtZW50IGFnYWluLiBUaGlzIGJyaW5n cyBiYWNrIHRoZSByZWZlcmVuY2UgaW4gdGhlIElEIHRhYmxlIGFuZA0KdGh1cyB0aGUgZGF0YWJh c2UgY2FuIGJlIGNvbXByZXNzZWQgYWdhaW4uIA0KDQpCaWcgdGhhbmtzIHRvIEFkYW0gS29jb2xv c2tpIG9mIHRoZSBDb3VjaERCIFVzZXIgTWFpbGxpbmdsaXN0IGZvciB0aGUgdGVjaG5pY2FsDQpp bnNpZGUgdG8gZ2V0IHRoaXMgc2NyaXB0IGRvbmUuDQoNCihjKTIwMTEgU2ltb24gRWlzZW5tYW5u IC0gbWFpbHRvOnNpbW9uQHN0cnVrdHVyLmRlDQoiIiINCg0KaW1wb3J0IHN5cw0KaW1wb3J0IGNq c29uDQppbXBvcnQgdXJsbGliDQppbXBvcnQgdGVtcGZpbGUNCmltcG9ydCB1cmxwYXJzZQ0KaW1w b3J0IGh0dHBsaWINCmltcG9ydCB1cmxsaWINCg0KY2xhc3MgUmVwYWlyZXIob2JqZWN0KToNCg0K ICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhYmFzZV91cmwsIHNpbmNlPTAsIGJhdGNoc2l6ZT0x MDAwKToNCg0KICAgICAgICBpZiBkYXRhYmFzZV91cmwuZW5kc3dpdGgoIi8iKToNCiAgICAgICAg ICAgIGRhdGFiYXNlX3VybCA9IGRhdGFiYXNlX3VybFs6LTFdDQogICAgDQogICAgICAgIHNlbGYu c2luY2UgPSBzaW5jZQ0KICAgICAgICBzZWxmLmRhdGFiYXNlX3VybCA9IGRhdGFiYXNlX3VybA0K ICAgICAgICBzZWxmLmRhdGFiYXNlX3VybF9wYXJ0cyA9IHVybHBhcnNlLnVybHBhcnNlKHNlbGYu ZGF0YWJhc2VfdXJsKQ0KICAgICAgICBzZWxmLmRhdGFiYXNlX2hvc3QsIHNlbGYuZGF0YWJhc2Vf cG9ydCA9IHNlbGYuZGF0YWJhc2VfdXJsX3BhcnRzWzFdLnNwbGl0KCI6IiwgMSkNCiAgICAgICAg c2VsZi5iYXRjaHNpemUgPSBiYXRjaHNpemUNCiAgICAgICAgDQogICAgZGVmIHJlcGFpcihzZWxm KToNCg0KICAgICAgICB1cmwgPSAiJXMvX2NoYW5nZXM/c2luY2U9JXMiICUgKHNlbGYuZGF0YWJh c2VfdXJsLCBzZWxmLnNpbmNlKQ0KICAgICAgICBwcmludCAiQ2hhbmdlcyBmZWVkIGlzICVzLiIg JSB1cmwNCiAgICAgICAgDQogICAgICAgIGNoYW5nZXMsIGhlYWRlcnMgPSB1cmxsaWIudXJscmV0 cmlldmUodXJsLCB0ZW1wZmlsZS5ta3RlbXAoKSkNCiAgICAgICAgcHJpbnQgIkZldGNoZWQgZmVl ZCBpbnRvICVzLiIgJSBjaGFuZ2VzDQoNCiAgICAgICAgIyBMb2FkIGFuZCBwcmludCBzdGF0cy4N CiAgICAgICAgY29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oc2VsZi5kYXRhYmFzZV9ob3N0 LCBpbnQoc2VsZi5kYXRhYmFzZV9wb3J0KSkNCiAgICAgICAgY29ubi5yZXF1ZXN0KCJHRVQiLCAi JXMvIiAlIHNlbGYuZGF0YWJhc2VfdXJsX3BhcnRzWzJdKQ0KICAgICAgICByZXMgPSBjb25uLmdl dHJlc3BvbnNlKCkNCiAgICAgICAgaW5mbyA9IGNqc29uLmRlY29kZShyZXMucmVhZCgpKQ0KICAg ICAgICBjb25uLmNsb3NlKCkNCg0KICAgICAgICBmcCA9IGZpbGUoY2hhbmdlcywgInJiIikNCiAg ICAgICAgZnAucmVhZGxpbmUoKQ0KICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKS5zdHJpcCgp DQogICAgICAgIA0KICAgICAgICBjb3VudCA9IDANCiAgICAgICAgYnVmID0gW10NCiAgICAgICAg ZmFpbGVkID0ge30NCiAgICAgICAgc2VxID0gTm9uZQ0KICAgICAgICANCiAgICAgICAgd2hpbGUg bGluZToNCg0KICAgICAgICAgICAgaWYgbGluZS5lbmRzd2l0aCgiLCIpOg0KICAgICAgICAgICAg ICAgIGxpbmUgPSBsaW5lWzotMV0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIGlmIGxp bmUuc3RyaXAoKSA9PSAiXSI6DQogICAgICAgICAgICAgICAgYnJlYWsNCg0KICAgICAgICAgICAg YnVmLmFwcGVuZChjanNvbi5kZWNvZGUobGluZSkpDQogICAgICAgICAgICAgICAgDQogICAgICAg ICAgICBpZiBsZW4oYnVmKSA+PSBzZWxmLmJhdGNoc2l6ZToNCiAgICAgICAgICAgICAgICBjb3Vu dCwgc2VxID0gc2VsZi5fY2hlY2soYnVmLCBjb3VudD1jb3VudCwgZmFpbGVkPWZhaWxlZCkNCiAg ICAgICAgICAgICAgICBidWYgPSBbXQ0KDQogICAgICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUo KS5zdHJpcCgpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIGZwLmNsb3Nl KCkNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIGlmIGxlbihidWYpOg0KICAgICAgICAg ICAgY291bnQsIHNlcSA9IHNlbGYuX2NoZWNrKGJ1ZiwgY291bnQ9Y291bnQsIGZhaWxlZD1mYWls ZWQpDQogICAgICAgICAgICBidWYgPSBbXQ0KDQogICAgICAgIHByaW50ICJQcm9jZXNzZWQgJWQg ZW50cmllcyAobGFzdCBzZXF1ZW5jZTogJXMpIiAlIChjb3VudCwgc2VxKQ0KICAgICAgICBwcmlu dCAiRG9jdW1lbnQgY291bnQ6ICVkIChjb3VudDogJWQsIGRlbGV0ZWQ6ICVkKSIgJSAoaW5mb1si ZG9jX2NvdW50Il0raW5mb1siZG9jX2RlbF9jb3VudCJdLCBpbmZvWyJkb2NfY291bnQiXSwgaW5m b1siZG9jX2RlbF9jb3VudCJdKQ0KICAgICAgICBwcmludCAiRG9jdW1lbnQgY29tbWl0ZWQgc2Vx dWVuY2UgaXMgbm93OiAlZCIgJSBpbmZvWyJjb21taXR0ZWRfdXBkYXRlX3NlcSJdDQoNCiAgICBk ZWYgX2NoZWNrKHNlbGYsIHJlc3VsdHMsIGNvdW50PTAsIGZhaWxlZD1Ob25lKToNCg0KICAgICAg ICBpZiBmYWlsZWQgaXMgTm9uZToNCiAgICAgICAgICAgIGZhaWxlZCA9IHt9DQoNCiAgICAgICAg c2VxID0gTm9uZQ0KDQogICAgICAgIGNvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKHNlbGYu ZGF0YWJhc2VfaG9zdCwgaW50KHNlbGYuZGF0YWJhc2VfcG9ydCkpDQogICAgICAgIA0KICAgICAg ICBmb3IgYyBpbiByZXN1bHRzOg0KICAgICAgICAgICAgc2VxID0gYy5nZXQoInNlcSIsIDApDQog ICAgICAgICAgICBkZWxldGVkID0gYy5nZXQoImRlbGV0ZWQiLCBOb25lKQ0KICAgICAgICAgICAg aWYgVHJ1ZToNCiAgICAgICAgICAgICAgICBpID0gYy5nZXQoImlkIikNCiAgICAgICAgICAgICAg ICBxdW90ZWRfaSA9IHVybGxpYi5xdW90ZV9wbHVzKGkpDQogICAgICAgICAgICAgICAgaWYgcXVv dGVkX2kuc3RhcnRzd2l0aCgiX2Rlc2lnbiUyRiIpOg0KICAgICAgICAgICAgICAgICAgICAjIEZJ WE1FKGxvbmdzbGVlcCkgd2FhaCB3aGF0IGEgY2hlYXAgaGFjaw0KICAgICAgICAgICAgICAgICAg ICBxdW90ZWRfaSA9ICJfZGVzaWduLyVzIiAlIHF1b3RlZF9pWzEwOl0NCiAgICAgICAgICAgICAg ICBwYXRoID0gIiVzLyVzIiAlIChzZWxmLmRhdGFiYXNlX3VybF9wYXJ0c1syXSwgcXVvdGVkX2kp DQogICAgICAgICAgICAgICAgY29ubi5yZXF1ZXN0KCJHRVQiLCBwYXRoKQ0KICAgICAgICAgICAg ICAgIHJlcyA9IGNvbm4uZ2V0cmVzcG9uc2UoKQ0KICAgICAgICAgICAgICAgIGRhdGEgPSByZXMu cmVhZCgpDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgcmVzLnN0YXR1cyA9 PSA0MDQ6DQogICAgICAgICAgICAgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgaXQgc2F5cyByZWFz b249PSJkZWxldGVkIi4NCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGNqc29uLmRlY29kZShk YXRhKQ0KICAgICAgICAgICAgICAgICAgICBpZiBkYXRhLmdldCgicmVhc29uIiwgTm9uZSkgIT0g ImRlbGV0ZWQiOg0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAg IHByaW50ICJOb3QgZm91bmQgZXJyb3I6ICVzIT1kZWxldGVkICglcykiICUgKGRhdGEuZ2V0KCJy ZWFzb24iKSwgcGF0aCkNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAg ICAgICAgICAgIyBSZWNyZWF0ZSB0aGUgbWlzc2luZyBkb2N1bWVudC4NCiAgICAgICAgICAgICAg ICAgICAgICAgIGNvbm4ucmVxdWVzdCgiUFVUIiwgcGF0aCwgInt9IiwgaGVhZGVycz17IkNvbnRl bnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiwgIkNvbnRlbnQtTGVuZ3RoIjogIjIifSkNCiAg ICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IGNvbm4uZ2V0cmVzcG9uc2UoKQ0KICAgICAgICAg ICAgICAgICAgICAgICAgZGF0YSA9IGNqc29uLmRlY29kZShyZXMucmVhZCgpKQ0KICAgICAgICAg ICAgICAgICAgICAgICAgYXNzZXJ0IHJlcy5zdGF0dXMgPT0gMjAxLCAiRmFpbGVkIHRvIFBVVCBu ZXcgZG9jdW1lbnQuICglcikgKCVyKSIgJSAocmVzLnN0YXR1cywgZGF0YSkNCiAgICAgICAgICAg ICAgICAgICAgICAgIHJldiA9IGRhdGEuZ2V0KCJyZXYiLCBOb25lKQ0KICAgICAgICAgICAgICAg ICAgICAgICAgYXNzZXJ0IHJldiBpcyBub3QgTm9uZSwgIlBVVCByZXN1bHQgaGFzIG5vIHJldi4g KCVyKSIgJSBkYXRhDQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAg ICAgICAgICMgRGVsZXRlIGl0IGFnYWluLg0KICAgICAgICAgICAgICAgICAgICAgICAgY29ubi5y ZXF1ZXN0KCJERUxFVEUiLCBwYXRoLCBoZWFkZXJzPXsiSWYtTWF0Y2giOiAiJXMiICUgcmV2fSkN CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IGNvbm4uZ2V0cmVzcG9uc2UoKQ0KICAgICAg ICAgICAgICAgICAgICAgICAgcmVzLnJlYWQoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgYXNz ZXJ0IHJlcy5zdGF0dXMgPT0gMjAwLCAiRmFpbGVkIHRvIERFTEVURSBuZXcgZG9jdW1lbnQuIg0K ICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCAr IDENCiAgICAgICAgDQogICAgICAgIGNvbm4uY2xvc2UoKQ0KICAgICAgICANCiAgICAgICAgcmV0 dXJuIGNvdW50LCBzZXENCg0KDQppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOg0KICAgIGFyZ3Mg PSBzeXMuYXJndlsxOl07DQogICAgaWYgbm90IGxlbihhcmdzKSA9PSAxOg0KICAgICAgICBwcmlu dCAiVXNhZ2U6ICVzIGRhdGFiYXNlX3VybCIgJSBzeXMuYXJndlswXQ0KICAgICAgICBzeXMuZXhp dCgxKQ0KDQogICAgcmVwYWlyZXIgPSBSZXBhaXJlcihhcmdzWzBdKQ0KICAgIHJlcGFpcmVyLnJl cGFpcigpDQogDQogICAgDQo= --=-RTSX164Rwahd9nOP83iD-- --=-UeDVzgL8WjeeXX06UAUo Content-Type: application/x-pkcs7-signature; name="smime.p7s" Content-Disposition: attachment; filename="smime.p7s" Content-Transfer-Encoding: base64 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 AAA= --=-UeDVzgL8WjeeXX06UAUo--