Date: Fri, 30 Jan 1998 18:17:48 -0600 (CST) From: Andrew Deren To: Jamie Love cc: DJGPP mailing list Subject: Re: encryption In-Reply-To: <199801302349.MAA13757@fep2-orange.clear.net.nz> Message-ID: MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-559023410-851401618-886205868=:25371" Precedence: bulk This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime AT docserver DOT cac DOT washington DOT edu for more info. ---559023410-851401618-886205868=:25371 Content-Type: TEXT/PLAIN; charset=US-ASCII Here is a little encryption program I've done a while ago as my class assignment. I don't know if it's usefull (it's pretty simple). ,,, (0 0) +-------------oOO----(_)-------------------+ | Andrew Deren | | aderen AT eecs DOT uic DOT edu | | www.eecs.uic.edu/~aderen/ader/main.html | +-------------------------oOO--------------+ || || ooO Ooo On Sun, 1 Feb 1998, Jamie Love wrote: > Hi, I wish to make a encryption program using djgpp and allegro. What I > wish to know is if djgpp has an encrypytion library yet. > > I'm looking for >64 bit encryption. (bit, if i can't get this, I'll settle > for 32bit) > > Barring a library, is there some source I could get? > > As a last resort, is there some docs around explaining the implementation > of an encryption system? > > One point to remember is that this system will need to be reasonable fast. > > Jamie Love > Part of the Silicon Wanderers > (http://www.geocities.com/SiliconValley/Horizon/4532) > e-mail me at jamie DOT love AT clear DOT net DOT nz > ICQ: 7493228 > ---559023410-851401618-886205868=:25371 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="encode14.cpp" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqDQogKiBUaGlzIGVuY29kZXMgb3IgZGVjb2RlcyBh IGZpbGUgdXNpbmcgTGV3aXMgQ2Fycm9sbCdzIHN5c3RlbQ0KICogZm9yIGRl Y29kaW5nIGFuZCBlbmNvZGluZy4NCiAqDQogKiBBdXRob3I6IEFuZHJldyBE ZXJlbg0KICogU3lzdGVtOiBDIG9uIFVJQyBuZXR3b3JrIGFuZCBCb3JsYW5k IEMrKyA1LjAgZm9yIERvcw0KICogRGF0ZSAgOiAxMC8yMC85Ng0KICogSW5w dXQgOiBJbnB1dCBGaWxlIC0gd2hlbiBlbmNvZGluZyB0aGlzIGlzIHRoZSB0 ZXh0IGZpbGUNCiAJCQkJCQkJCWFuZCB3aGVuIGRlY29pbmcgdGhpcyBpcyB0 aGUgZW5jb2RlZCBmaWxlDQogIAkJCSAgT3V0cHV0IEZpbGUgLSBmaWxlIHdo ZXJlIHRoZSBlbmNvZGVkIG9yIGRlY29kZWQgdGV4dCBpcw0KICAgICAgICAg ICAJCQkJCW91dHB1dC4NCiAgICAgICAgICAgRGVjb2RpbmcvRW5jb2Rpbmcg c3RyaW5nIC0gdGhpcyBpcyBhIHN0cmluZyB0aGF0IGlzIHVzZWQNCiAgICAg ICAgICAgCQkJCQl0byBlbmNvZGUgb3IgZGVjb2RlIGEgZmlsZS4NCiAqIE91 dHB1dDogVGhlIHJlc3VsdCBvZiBlbmNvZGluZyBvciBkZWNvZGluZyBpcyBv dXRwdXQgdG8gdGhlIG91dHB1dA0KIAkJICAgICBmaWxlLg0KICoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKiovDQoNCi8vIEluY2x1ZGUgdGhlIHByZWRlZmluZWQgaGVhZGVy IGZpbGVzDQojaW5jbHVkZSA8c3RkaW8uaD4NCiNpbmNsdWRlIDxzdHJpbmcu aD4NCiNpbmNsdWRlIDxzdGRsaWIuaD4NCiNpbmNsdWRlIDxjdHlwZS5oPg0K DQovLyBNYWNybyB0byBwcmludCBhbiBlcnJvciBtZXNzYWdlIHdoZW4gZXJy b3IgcmVhZGluZyBzdHJpbmcgZW5jb3V0ZXJlZA0KI2RlZmluZSBTVFJJTkdf SU5QVVRfRVJST1IgcHJpbnRmKCJFcnJvciBlbnRlcmluZyBzdHJpbmcuXG4i KQ0KDQovLyBjb25zdGFudCB0byBtYWtlIGxvb3AgZ28gZm9yZXZlcg0KI2Rl ZmluZSBJTkZJTklUWSAxDQoNCi8vIFRoaXMgZnVuY3Rpb24gZGVjb2RlcyBh IGxldHRlciB1c2luZyBkZWNvZGVfY2hhcg0KLy8gVXNlcyB0aGUgZm9ybXVs YSBsZXR0ZXItZGVjb2RlX2NoYXIgKyAzMiBpZiBpdCBpcyBncmVhdGVyIHRo YW4gMzENCi8vIG9yIGxldHRlciAtIGRlY29kZV9jaGFyICsgMTI3IGlmIG5v dCBncmVhdGVyIHRoYW4gMzENCi8vIHRoZSBjaGFyYWN0ZXJzIGFyZSBzaGlm dGVyIGJ5IG9uZSBmb3IgZWFjaCBkZWNvZGUgY2hhciAtIDMyDQovLyBhbmQg dGhlbiByb3RhdGVkIGlmIGxlc3MgdGhhbiAzMg0KaW50IGRlY29kZV9jaGFy KGludCBsZXR0ZXIsIGludCBkZWNvZGVfY2hhcikNCnsNCgkvLyBpZiBsZXR0 ZXIgPCAzMiBpdCBpcyBjb250cm9sIGNoYXJhY3Rlciwgc28gcmV0dXJuIGl0 IHVuY2hhbmdlZC4NCiAgIGlmIChsZXR0ZXIgPCAzMikgcmV0dXJuIGxldHRl cjsNCiAgIC8vIGlmIGxldHRlciAtIGRlY29kZSArIDMyIGlzIGdyZWF0ZXIg dGhhbiAzMSByZXR1cm4NCiAgIC8vIGxldHRlciAtIGRlY29kZSArIDMyDQog ICBlbHNlIGlmIChsZXR0ZXIgLSBkZWNvZGVfY2hhciArIDMyID49IDMyKSBy ZXR1cm4gKGxldHRlciAtIGRlY29kZV9jaGFyICsgMzIpOw0KICAgLy8gaWYg bm90IHJldHVybiBsZXR0ZXIgLSBkZWNvZGUgKyAxMjcNCiAgIGVsc2UgcmV0 dXJuIChsZXR0ZXIgLSBkZWNvZGVfY2hhciArIDEyNyk7DQp9DQoNCi8vIFRo aXMgZnVuY3Rpb24gZW5jb2RlcyBhIGxldHRlciB1c2luZyBlbmNvZGVfc3Ry aW5nDQovLyBVc2VzIHRoZSBmb3JtdWxhIGxldHRlciArIGVuY29kZV9jaGFy IC0gMzIgaWYgaXQgaXMgbGVzcyB0aGFuIDEyNw0KLy8gYW5kIGxldHRlciAr IGVuY29kZV9jaGFyIC0gMTI3IGlmIGl0IGlzIG5vdC4NCmludCBlbmNvZGVf Y2hhcihpbnQgbGV0dGVyLCBpbnQgZW5jb2RlX2NoYXIpDQp7DQoJLy8gaWYg bGV0dGVyIDwgMzIgaXQgaXMgY29udHJvbCBjaGFyYWN0ZXIsIHNvIHJldHVy biBpdCB1bmNoYW5nZWQNCiAgIGlmIChsZXR0ZXIgPCAzMikgcmV0dXJuIGxl dHRlcjsNCiAgIGVsc2UgaWYgKGxldHRlciArIGVuY29kZV9jaGFyIC0gMzIg PD0gMTI2KSByZXR1cm4gKGxldHRlciArIGVuY29kZV9jaGFyIC0zMik7DQog ICBlbHNlIHJldHVybiBsZXR0ZXIgKyBlbmNvZGVfY2hhciAtIDEyNzsNCn0N Cg0KLy8gR2V0cyB0aGUgaW5wdXQgZmlsZS4gSXQgYXNrcyBmb3IgdGhlIGZp bGUgbmFtZSBhbmQgaWYgY2FuIG9wZW4NCi8vIHRoZSBmaWxlIGl0IHJldHVy bnMgcG9pbnRlciB0byB0aGF0IGZpbGUgaWYgbm90IHByb2dyYW0gaXMgYWJv cnRlZA0KRklMRSogZ2V0X2lucHV0X2ZpbGUodm9pZCkNCnsNCgljaGFyIGZp bGVfbmFtZVs4MF07CQkJCQkgLy8gRmlsZSBuYW1lDQogICBGSUxFKiBpbnB1 dDsgICAgICAgIAkJCQkJIC8vIHBvaW50ZXIgdG8gdGhlIGZpbGUNCiAgIHBy aW50ZigiRW50ZXIgdGhlIGlucHV0IGZpbGU6ICAiKTsgLy8gYXNrIGZvciB0 aGUgZmlsZSBuYW1lDQogICBpZiAoZ2V0cyhmaWxlX25hbWUpID09IE5VTEwp IHsgICAgLy8gZ2V0IGZpbGUgbmFtZQ0KICAgICAgU1RSSU5HX0lOUFVUX0VS Uk9SOyAgICAgICAgICAgIC8vIGlmIGNhbid0IHJlYWQgZmlsZSBuYW1lIHBy aW50IGVycm9yDQogICAgICBleGl0KDEpOyAgICAgICAgICAgICAgICAgICAg ICAgLy8gYW5kIGV4aXQgcHJvZ3JhbQ0KCX0NCiAgIC8vIG9wZW4gZmlsZSBp biB0ZXh0IHJlYWQgbW9kZSBhbmQgcG9pbnQgdG8gaW5wdXQNCiAgIGlmICgo aW5wdXQgPSBmb3BlbihmaWxlX25hbWUsICJydCIpKSA9PSBOVUxMKSB7DQog ICAJLy8gaWYgZXJyb3Igb3BlbmluZyBmaWxlIHByaW50IGVycm9yIG1lc3Nh Z2UNCiAgIAlwcmludGYoIkVycm9yIE9wZW5pbmcgSW5wdXQgZmlsZS4gUHJv Z3JhbSBhYm9ydGVkLlxuIik7DQoJICAJZXhpdCgxKTsJCQkJCQkJCSAvLyBh bmQgZXhpdCBwcm9ncmFtDQoJfQ0KICAgcmV0dXJuIGlucHV0OyAgICAgICAg ICAJCQkJIC8vIHJldHVybiBwb2ludGVyIHRvIGZpbGUNCn0NCg0KLy8gR2V0 cyB0aGUgb3V0cHV0IGZpbGUuIEl0IGFza3MgZm9yIHRoZSBmaWxlIG5hbWUg YW5kIGlmIGNhbiBvcGVuDQovLyB0aGUgZmlsZSBpdCByZXR1cm5zIHBvaW50 ZXIgdG8gdGhhdCBmaWxlIGlmIG5vdCBwcm9ncmFtIGlzIGFib3J0ZWQNCkZJ TEUqIGdldF9vdXRwdXRfZmlsZSh2b2lkKQ0Kew0KCWNoYXIgZmlsZV9uYW1l WzgwXTsgICAgICAgICAgICAgICAvLyBGaWxlIG5hbWUNCiAgIEZJTEUqIG91 dHB1dDsgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludGVyIHRvIHRoZSBm aWxlDQogICBwcmludGYoIkVudGVyIHRoZSBvdXRwdXQgZmlsZTogIik7Ly8g YXNrIGZvciB0aGUgZmlsZSBuYW1lDQogICBpZiAoZ2V0cyhmaWxlX25hbWUp ID09IE5VTEwpIHsgICAgLy8gZ2V0IGZpbGUgbmFtZQ0KICAgCVNUUklOR19J TlBVVF9FUlJPUjsgICAgICAgICAgICAvLyBpZiBjYW4ndCByZWFkIGZpbGUg bmFtZSBwcmludCBlcnJvcg0KICAgCWV4aXQoMSk7ICAgICAgICAgICAgICAg ICAgICAgICAvLyBhbmQgZXhpdCBwcm9ncmFtDQogICB9DQogICAvLyBvcGVu IGZpbGUgaW4gdGV4dCB3cml0ZSBtb2RlIGFuZCBwb2ludCB0byBvdXRwdXQN CiAgIGlmICgob3V0cHV0ID0gZm9wZW4oZmlsZV9uYW1lLCAid3QiKSkgPT0g TlVMTCkgew0KICAgCS8vIGlmIGVycm9yIG9wZW5pbmcgZmlsZSBwcmludCBl cnJvciBtZXNzYWdlDQogICAJcHJpbnRmKCJFcnJvciBPcGVuaW5nIG91dHB1 dCBmaWxlLiBQcm9ncmFtIGFib3J0ZWQuXG4iKTsNCiAgICAgIGV4aXQoMSk7 ICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGV4aXQgcHJvZ3JhbQ0K CX0NCiAgIHJldHVybiBvdXRwdXQ7ICAgICAgICAgICAgICAgICAgICAgLy8g cmV0dXJuIHBvaW50ZXIgdG8gZmlsZQ0KfQ0KDQp2b2lkIG9wZXJhdGluZ19z eXN0ZW0odm9pZCkNCi8vIGxldHMgdXNlciB1c2Ugb3BlcmF0aW5nIHN5c3Rl bSBjb21tYW5kcywgc28gdG8gdmlldyB0aGUgZGlyZWN0b3J5IGxpc3QgDQov LyB0byBmaW5kIHRoZSBmaWxlLCB1c2VyIGRvZXMgbm90IGhhdmUgdG8gZXhp dCBwcm9ncmFtDQp7DQoJY2hhciBpbnB1dFsyNTZdOwkJLy8ga2VlcHMgdGhl IGlucHV0IGZyb20ga2V5Ym9hcmQNCglwcmludGYoIlR5cGUgeW91ciBjb21t YW5kOiBcbiIpOwkvLyBwcm9tcHQgZm9yIGlucHV0DQoJaWYgKGdldHMoaW5w dXQpID09IE5VTEwpIHsgICAgLy8gZ2V0IGZpbGUgbmFtZQ0KICAgCVNUUklO R19JTlBVVF9FUlJPUjsgICAgICAgICAgICAvLyBpZiBjYW4ndCByZWFkIGZp bGUgbmFtZSBwcmludCBlcnJvcg0KICAgCWV4aXQoMSk7ICAgICAgICAgICAg ICAgICAgICAgICAvLyBhbmQgZXhpdCBwcm9ncmFtDQogICB9DQoJc3lzdGVt KGlucHV0KTsJCQkJCQkJLy8gZXhlY3V0ZSB0aGUgY29tbWFuZA0KfQ0KDQoN CnZvaWQgdmlld19maWxlKHZvaWQpDQovLyBhbGxvd3MgdXNlciB0byB2aWV3 IHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIGZyb20NCi8vIGluc2lkZSB0aGUg cHJvZ3JhbQ0Kew0KCWNoYXIgZmlsZV9uYW1lWzgwXTsJLy8gbmFtZSBvZiB0 aGUgZmlsZQ0KCWNoYXIgY2hhcmFjdGVyOwkJLy8gc3RvcmVzIGEgY2hhcmFj dGVyIHJlYWQgZnJvbSBmaWxlDQoJRklMRSogZmlsZTsJCQkJLy8gcG9pbnRl ciB0byBmaWxlDQoJdW5zaWduZWQgbG9uZyBudW1fY2hhcnMgPSAwOy8vbnVt YmVyIG9mIGNoYXJhY3RlcnMgaW4gZmlsZQ0KCQ0KCXByaW50ZigiUGxlYXNl IGVudGVyIHRoZSBmaWxlIHRvIHZpZXc6ICIpOwkvLyBwcm9tcHQgZm9yIGZp bGUgbmFtZQ0KCWlmIChnZXRzKGZpbGVfbmFtZSkgPT0gTlVMTCkgewkJCQkv LyBzdG9yZSBpdCBpbnRvIGZpbGVfbmFtZQ0KCQlTVFJJTkdfSU5QVVRfRVJS T1I7CQkJLy8gaWYgZXJyb3IgZW50ZXJpbmcgZmlsZSBuYW1lDQoJCWV4aXQo MSk7CQkJCQkJCS8vIHByaW50IG1lc3NhZ2UgYW5kIGV4aXQNCgl9DQoJaWYg KChmaWxlID0gZm9wZW4oZmlsZV9uYW1lLCAicnQiKSkgPT0gTlVMTCkgewkv LyBvcGVuIHRoZSBmaWxlIGluIHJlYWQgbW9kZQ0KCQlwcmludGYoIkVycm9y IG9wZW5pbmcgZmlsZS5cbiIpOwkJCQkvLyBpZiBub3QgYWJsZSB0byBvcGVu IHByaW50IGVycm9yDQoJfQ0KCWVsc2Ugew0KCQlzeXN0ZW0oImNsZWFyIik7 CQkvLyBjbGVhciB0aGUgc2NyZWVuDQoJCS8vc3lzdGVtKCJjbHMiKTsJCS8v IHVzZWQgZm9yIE1TLURPUw0KCQlwcmludGYoIkNvbnRlbnQgb2YgdGhlIGZp bGU6IFxuIik7CQ0KCQl3aGlsZSAoKGNoYXJhY3RlciA9IGdldGMoZmlsZSkp ICE9IEVPRikgey8vIHJlYWQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgZmlsZQ0K CQkJCQkJCQkJCQkJCQkJLy8gaW50byBjaGFyYWN0ZXINCgkJCW51bV9jaGFy cysrOyAvLyBpbmNyZW1lbnQgbnVtYmVyIG9mIGNoYXJhY3RlcnMNCgkJCQ0K CQkJY2hhcmFjdGVyID0gcHV0YyhjaGFyYWN0ZXIsIHN0ZG91dCk7Ly8gYW5k IHByaW50IGl0IHRvIHNjcmVlbg0KCQl9DQoJCWZjbG9zZShmaWxlKTsJCS8v IGNsb3NlIHRoZSBmaWxlDQoJCXByaW50ZigiXG5cbiIpOwkvLyBnZXQgc29t ZSBzcGFjZXMNCgkJcHJpbnRmKCJOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBm aWxlOiAlbGRcblxuIiwgbnVtX2NoYXJzKTsNCgl9DQp9DQoNCi8vIGdldCB0 aGUgY2hvaWNlLg0KLy8gcmV0dXJucyAxIGlmIGZpbGUgaXMgdG8gYmUgZW5j b2RlZA0KLy8gYW5kIDIgaWYgZmlsZSBpcyB0byBiZSBkZWNvZGVkDQovLyBp ZiBhbnl0aGluZyBlbHNlIGVudGVyZWQgcHJvZ3JhbSBpcyBhYm9ydGVkDQpp bnQgZ2V0X2Nob2ljZSh2b2lkKQ0Kew0KCWNoYXIgY2hvaWNlWzI1XTsgICAg ICAgICAgICAgICAgICAgLy8ga2VlcHMgY2hvaWNlIGZyb20gdGhlIHVzZXIN CglkbyB7DQogICAJcHJpbnRmKCJcbiAqICogKiBFbnRlciBZb3VyIENob2lj ZSAqICogKlxuIik7IC8vIHByaW50IHRoZSBtZW51DQogICAJcHJpbnRmKCIg IDEuIFRvIEVuY29kZSBGaWxlLiBcbiIpOw0KICAgCXByaW50ZigiICAyLiBU byBEZWNvZGUgRmlsZS4gXG4iKTsNCiAgIAlwcmludGYoIiAgMy4gVG8gdXNl IG9wZXJhdGluZyBzeXN0ZW0gY29tbWFuZC5cbiIpOw0KICAgCXByaW50Zigi ICA0LiBUbyBWaWV3IGZpbGUuXG4iKTsNCiAgIAlwcmludGYoIiAgUS4gVG8g ZXhpdDogIik7DQogICAJaWYgKGdldHMoY2hvaWNlKSA9PSBOVUxMKSB7ICAg ICAgICAgLy8gcmVhZCB0aGUgc3RyaW5nDQogICAJCVNUUklOR19JTlBVVF9F UlJPUjsgICAgICAgICAgICAgIC8vIGlmIGVycm9yIHJlYWRpbmcgc3RyaW5n IHByaW50IG1lc3NhZ2UNCiAgIAkJZXhpdCgxKTsgICAgICAgICAgICAgICAg ICAgICAgICAgLy8gYW5kIGV4aXQgcHJvZ3JhbQ0KICAgCX0NCiAgIAlwcmlu dGYoIlxuIik7IAkJCQkJCQkJLy8gbWFrZSBzb21lIHNwYWNlDQogICAJDQog ICAJLy8gaWYgJzEnIGVudGVyZWQgcmV0dXJuIDENCiAgIAlpZiAoKGNob2lj ZVswXSA9PSAnMScpICYmIChjaG9pY2VbMV0gPT0gJ1wwJykpIHsNCiAgIAkJ cHJpbnRmKCJSZWFkeSB0byBFbmNvZGUgZmlsZS5cbiIpOw0KICAgCQlyZXR1 cm4gMTsNCiAgIAl9DQoJCS8vIGlmICcyJyBlbnRlcmVkIHJldHVybiAyDQog ICAJZWxzZSBpZiAoKGNob2ljZVswXSA9PSAnMicpICYmIChjaG9pY2VbMV0g PT0gJ1wwJykpIHsNCiAgIAkJcHJpbnRmKCJSZWFkeSB0byBEZWNvZGUgRmls ZS5cbiIpOw0KICAgCQlyZXR1cm4gMjsNCiAgIAl9DQogICAJDQogICAJLy8g YWxsb3cgdXNlciB0byB1c2Ugb3BlcmF0aW5nIHN5c3RlbSBjb21tYW5kcyBp ZiBjaG9pY2UgPSAzDQogICAJZWxzZSBpZiAoKGNob2ljZVswXSA9PSAnMycp ICYmIChjaG9pY2VbMV0gPT0gJ1wwJykpIG9wZXJhdGluZ19zeXN0ZW0oKTsN CiAgIAkNCiAgIAkvLyBwcmludCB0aGUgY29udGVudCBvZiB0aGUgc3BlY2lm aWVkIGZpbGUgdG8gc2NyZWVuIGlmIGNob2ljZSA9IDQNCiAgIAllbHNlIGlm ICgoY2hvaWNlWzBdID09ICc0JykgJiYgKGNob2ljZVsxXSA9PSAnXDAnKSkg dmlld19maWxlKCk7DQogICAJDQogICAJLy8gaWYgY2hvaWNlID0gcSBvciBR IGV4aXQgcHJvZ3JhbQ0KICAgCWVsc2UgaWYgKCh0b3VwcGVyKGNob2ljZVsw XSkgPT0gJ1EnKSAmJiAoY2hvaWNlWzFdID09ICdcMCcpKSB7DQogICAJCXBy aW50ZigiRXhpdGluZyBQcm9ncmFtLlxuIik7DQogICAgICAJZXhpdCgwKTsJ CQkvLyBhbmQgZXhpdC4NCiAgIAl9DQogICAJDQogICAJLy8gaWYgbm9uZSBv ZiB0aG9zZSBhYm92ZSBwcmludCBlcnJvcg0KICAgCWVsc2Ugew0KICAgCQlw cmludGYoIkVycm9yIGluIGlucHV0IHBsZWFzZSBzZWxlY3QgdGhlIG9wdGlv biBhZ2Fpbi5cbiIpOw0KICAgCX0NCiAgIAkNCiAgIC8vIHJlcGVhdCBmb3Jl dmVyIG9yIHVudGlsIG9uZSBvZiB0aGUgdmFsaWQgcmV0dXJuIHN0YXRlbWVu dHMgDQogICAvLyBpcyBleGVjdXRlZA0KICAgfSB3aGlsZSAoSU5GSU5JVFkp OyANCn0NCg0KLy8gIGdldHMgdGhlIGRlY29kZSAvIGVuY29kZSBzdHJpbmcN CmNoYXIgKmdldF9kZWNvZGVfc3RyaW5nKCkNCnsNCgljaGFyIHN0cmluZ1s4 MF07ICAgLy8ga2VlcHMgdGhlIHN0cmluZw0KICAgcHJpbnRmKCJcbkVudGVy IHRoZSBlbmNvZGUvZGVjb2RlIHN0cmluZzogIik7IC8vIHByb21wdCB0byBl bnRlciB0aGUgc3RyaW5nDQogICBpZiAoZ2V0cyhzdHJpbmcpID09IE5VTEwp IHsgIC8vIGlmIGNhbid0IHJlYWQgc3RyaW5nDQogICAJU1RSSU5HX0lOUFVU X0VSUk9SOwkJICAvLyBwcmludCBlcnJvciBtZXNzYWdlDQogICAJZXhpdCgx KTsgICAgICAgICAgICAgICAgICAvLyBhbmQgZXhpdCBwcm9ncmFtDQogICB9 DQogICByZXR1cm4gc3RyaW5nOyAgICAgICAgICAgICAgIC8vIHJldHVybiBz dHJpbmcNCn0NCg0KbWFpbigpDQp7DQogICBGSUxFKiBpbnB1dDsgICAgICAg ICAgICAgICAgIC8vIGlucHV0IGZpbGUNCiAgIEZJTEUqIG91dHB1dDsgICAg ICAgICAgICAgICAgLy8gb3V0cHV0IGZpbGUNCiAgIGludCAgIGNob2ljZTsg ICAgICAgICAgICAgICAgLy8gY2hvaWNlIHdoZXRoZXIgZGVjb2Rpbmcgb3Ig ZW5jb2RpbmcNCgljaGFyICBwYXNzd29yZFs4MF07ICAgICAgICAgIC8vIGRl Y29kaW5nL2VuY29kaW5nIHN0cmluZw0KICAgY2hhciAgY2hhcmFjdGVyOyAg ICAgICAgICAgICAvLyBjaGFyYWN0ZXIgcmVhZCBmcm9tIHRoZSBmaWxlDQog ICBpbnQgICBpbmRleCA9IDA7CQkJCSAgLy8ga2VlcHMgd2hpY2ggY2hhcmFj dGVyIGlzIGJlaW5nIHVzZWQgaW4NCiAgIAkJCQkJCQkJCSAgLy8gZW5jb2Rp bmcvZGVjb2Rpbmcgc3RyaW5nDQoJdW5zaWduZWQgbG9uZyAgbnVtX2NoYXJz ID0gMDsvLyBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhIGZpbGUNCg0KCXdo aWxlIChJTkZJTklUWSkgeyAvLyByZXBlYXQgbG9vcCBmb3JldmVyIG9yIHVu dGlsIHF1aXQgY29tbWFuZCBpcyBleGVjdXRlZA0KCQkvLyBjYWxsIGdldF9j aG9pY2UoKSBmdW5jdGlvbiBhbmQgc3RvcmUgb3V0cHV0IGludG8gY2hvaWNl DQoJCWNob2ljZSA9IGdldF9jaG9pY2UoKTsNCg0KICAgCS8vIGdldCBpbnB1 dCBmaWxlDQogICAJaW5wdXQgPSBnZXRfaW5wdXRfZmlsZSgpOw0KDQogICAJ Ly8gZ2V0IG91dHB1dCBmaWxlDQogICAJb3V0cHV0ID0gZ2V0X291dHB1dF9m aWxlKCk7DQoNCiAgIAkvLyBnZXQgZGVjb2RlL2VuY29kZSBzdHJpbmcgYW5k IGNvcHkgaXQgdG8gcGFzc3dvcmQNCiAgIAlzdHJjcHkocGFzc3dvcmQsIGdl dF9kZWNvZGVfc3RyaW5nKCkpOw0KCQkNCgkJaW5kZXggPSAwOw0KCQludW1f Y2hhcnMgPSAwOw0KCQkNCiAgIAkvLyByZWFkIGEgY2hhcmFjdGVyIGZyb20g dGhlIGZpbGUgdW50aWwgZW5kIG9mIGZpbGUgYXByb2FjaGVkDQogICAJd2hp bGUgKChjaGFyYWN0ZXIgPSBnZXRjKGlucHV0KSkgIT0gRU9GKSB7DQogICAJ CS8vIGluY3JlbWVudCBudW1iZXIgb2YgY2hhcmFjdGVycw0KICAgCQludW1f Y2hhcnMrKzsNCiAgIAkJLy8gaWYgY2hvaWNlIGlzIDEgZW5jb2RlIGNoYXJh Y3Rlcg0KICAgICAgCWlmIChjaG9pY2UgPT0gMSkgY2hhcmFjdGVyID0gZW5j b2RlX2NoYXIoY2hhcmFjdGVyLCBwYXNzd29yZFtpbmRleF0pOw0KICAgICAg CS8vIGVsc2UgZGVjb2RlIGNoYXJhY3Rlcg0KICAgICAgCWVsc2UgY2hhcmFj dGVyID0gZGVjb2RlX2NoYXIoY2hhcmFjdGVyLCBwYXNzd29yZFtpbmRleF0p Ow0KICAgICAgCS8vIGluY3JlbWVudCBpbmRleA0KCQkJaW5kZXgrKzsNCiAg ICAgIAkvLyBpZiBsYXN0IGxldHRlciBvZiBwYXNzd29yZCBhcHJvYWNoZWQg Z28gdG8gZmlyc3QgbGV0dGVyDQogICAgICAJaWYgKHBhc3N3b3JkW2luZGV4 XSA9PSAnXDAnKSBpbmRleCA9IDA7DQoNCgkJCS8vIHB1dCB0aGUgY2hhbmdl ZCBjaGFyYWN0ZXIgaW50byBvdXRwdXQgZmlsZQ0KICAgICAgCWlmICgoY2hh cmFjdGVyID0gcHV0YyhjaGFyYWN0ZXIsIG91dHB1dCkpID09IEVPRikgew0K ICAgICAgCQkvLyBpZiBjYW4ndCBwdXQgdG8gdGhlIGZpbGUgcHJpbnQgZXJy b3IgbWVzc2FnZQ0KICAgICAgCQlwcmludGYoIkVycm9yIHdyaXRpbmcgdG8g b3V0cHV0IGZpbGUuXG4iKTsNCiAgICAgICAgIAkvLyBhbmQgZXhpdCBwcm9n cmFtDQogICAgICAJCWV4aXQoMSk7DQogICAgICAJfQ0KICAgCX0gDQogICAJ cHJpbnRmKCJFeGVjdXRpb24gc3VjY2VzZnVsbC5cbiIpOwkvLyBwcmludCBm aW5hbCBtZXNzYWdlDQogICAJcHJpbnRmKCIlbHUgY2hhcmFjdGVycyBzdG9y ZWQgaW4gZmlsZS5cbiIsIG51bV9jaGFycyk7DQoNCiAgIAkvLyBjbG9zZSBm aWxlcw0KICAgCWZjbG9zZShpbnB1dCk7DQogICAJZmNsb3NlKG91dHB1dCk7 DQogICB9DQp9DQoNCg0KDQo= ---559023410-851401618-886205868=:25371--