LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqICAgICAgQ29weXJpZ2h0IDIwMDAgIEp1bGlvIEPpc2FyIEfhenF1ZXoKICovCgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bG9jYWxlLmg+CiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAib3B0aW9ucy5oIgojaW5jbHVkZSAid2ludmVyLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKI2luY2x1ZGUgImNydGRsbC5oIgojaW5jbHVkZSAibWFpbi5oIgoKREVGQVVMVF9ERUJVR19DSEFOTkVMKG9sZSk7CkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChzdHJpbmcpOwpERUNMQVJFX0RFQlVHX0NIQU5ORUwod2luMzIpOwoKc3RydWN0IE5MU19sYW5nbG9jYWxlIHsKCWNvbnN0IGludCBsYW5nOwoJc3RydWN0IE5MU19sb2NhbGV2YXIgewoJCWNvbnN0IGludAl0eXBlOwoJCWNvbnN0IGNoYXIJKnZhbDsKCX0gbG9jdmFyc1sxMjBdOwp9OwoKI2RlZmluZSBMQU5HX0JFR0lOKGwscykJewlNQUtFTEFOR0lEKGwscyksIHsKCiNkZWZpbmUgTE9DVkFMKHR5cGUsdmFsdWUpCQkJCQl7dHlwZSx2YWx1ZX0sCgojZGVmaW5lIExBTkdfRU5ECQkJCQkgfX0sCgpzdGF0aWMgY29uc3Qgc3RydWN0IE5MU19sYW5nbG9jYWxlIGxhbmdsb2NhbGVzW10gPSB7Ci8qIGFkZCBsYW5ndWFnZXMgaW4gbnVtZXJpY2FsIG9yZGVyIG9mIG1haW4gbGFuZ3VhZ2UgKGxhc3QgdHdvIGRpZ2l0cykKICogaXQgaXMgbXVjaCBlYXNpZXIgdG8gZmluZCB0aGUgbWlzc2luZyBob2xlcyB0aGF0IHdheSAqLwoKTEFOR19CRUdJTiAoTEFOR19DQVRBTEFOLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDAzKi8KI2luY2x1ZGUgIm5scy9jYXQubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19DWkVDSCwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwNSovCiNpbmNsdWRlICJubHMvY3plLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfREFOSVNILCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDA2Ki8KI2luY2x1ZGUgIm5scy9kYW4ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19HRVJNQU4sIFNVQkxBTkdfR0VSTUFOKQkJLyoweDA0MDcqLwojaW5jbHVkZSAibmxzL2RldS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfR0VSTUFOLCBTVUJMQU5HX0dFUk1BTl9TV0lTUykJCS8qMHgwODA3Ki8KI2luY2x1ZGUgIm5scy9kZXMubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU5fQVVTVFJJQU4pCS8qMHgwQzA3Ki8KI2luY2x1ZGUgIm5scy9kZWEubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU5fTFVYRU1CT1VSRykJLyoweDEwMDcqLwojaW5jbHVkZSAibmxzL2RlbC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfR0VSTUFOLCBTVUJMQU5HX0dFUk1BTl9MSUVDSFRFTlNURUlOKQkvKjB4MTQwNyovCiNpbmNsdWRlICJubHMvZGVjLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTKQkJLyoweDA0MDkqLwojaW5jbHVkZSAibmxzL2VudS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VLKQkJLyoweDA4MDkqLwojaW5jbHVkZSAibmxzL2VuZy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0FVUykJCS8qMHgwQzA5Ki8KI2luY2x1ZGUgIm5scy9lbmEubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9DQU4pCQkvKjB4MTAwOSovCiNpbmNsdWRlICJubHMvZW5jLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfTlopCQkvKjB4MTQwOSovCiNpbmNsdWRlICJubHMvZW56Lm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfRUlSRSkJCS8qMHgxODA5Ki8KI2luY2x1ZGUgIm5scy9lbmkubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9TQUZSSUNBKQkvKjB4MUMwOSovCiNpbmNsdWRlICJubHMvZW5zLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfSkFNQUlDQSkJLyoweDIwMDkqLwojaW5jbHVkZSAibmxzL2Vuai5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0NBUlJJQkVBTikJLyoweDI0MDkqLwojaW5jbHVkZSAibmxzL2VuYi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0JFTElaRSkJLyoweDI4MDkqLwojaW5jbHVkZSAibmxzL2VubC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1RSSU5JREFEKSAgICAJLyoweDJDMDkqLwojaW5jbHVkZSAibmxzL2VudC5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSCkJCS8qMHgwNDBhKi8KI2luY2x1ZGUgIm5scy9lc3AubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9NRVhJQ0FOKQkvKjB4MDgwYSovCiNpbmNsdWRlICJubHMvZXNtLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfTU9ERVJOKQkvKjB4MEMwYSovCiNpbmNsdWRlICJubHMvZXNuLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfR1VBVEVNQUxBKQkvKjB4MTAwYSovCiNpbmNsdWRlICJubHMvZXNnLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfQ09TVEFSSUNBKQkvKjB4MTQwYSovCiNpbmNsdWRlICJubHMvZXNjLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfUEFOQU1BKQkvKjB4MTgwYSovCiNpbmNsdWRlICJubHMvZXNhLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfRE9NSU5JQ0FOKQkvKjB4MUMwQSovCiNpbmNsdWRlICJubHMvZXNkLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfVkVORVpVRUxBKQkvKjB4MjAwYSovCiNpbmNsdWRlICJubHMvZXN2Lm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfQ09MT01CSUEpCS8qMHgyNDBhKi8KI2luY2x1ZGUgIm5scy9lc28ubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9QRVJVKQkJLyoweDI4MGEqLwojaW5jbHVkZSAibmxzL2Vzci5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0FSR0VOVElOQSkJLyoweDJjMGEqLwojaW5jbHVkZSAibmxzL2Vzcy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0VDVUFET1IpCS8qMHgzMDBhKi8KI2luY2x1ZGUgIm5scy9lc2YubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9DSElMRSkJLyoweDM0MGEqLwojaW5jbHVkZSAibmxzL2VzbC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1VSVUdVQVkpCS8qMHgzODBhKi8KI2luY2x1ZGUgIm5scy9lc3kubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9QQVJBR1VBWSkJLyoweDNjMGEqLwojaW5jbHVkZSAibmxzL2Vzei5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0JPTElWSUEpCS8qMHg0MDBhKi8KI2luY2x1ZGUgIm5scy9lc2IubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9FTF9TQUxWQURPUikJLyoweDQ0MGEqLwojaW5jbHVkZSAibmxzL2VzZS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0hPTkRVUkFTKQkvKjB4NDgwYSovCiNpbmNsdWRlICJubHMvZXNoLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfTklDQVJBR1VBKQkvKjB4NGMwYSovCiNpbmNsdWRlICJubHMvZXNpLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfUFVFUlRPX1JJQ08pCS8qMHg1MDBhKi8KI2luY2x1ZGUgIm5scy9lc3UubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19GSU5OSVNILCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDBCKi8KI2luY2x1ZGUgIm5scy9maW4ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19GUkVOQ0gsIFNVQkxBTkdfRlJFTkNIKQkJLyoweDA0MEMqLwojaW5jbHVkZSAibmxzL2ZyYS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSF9CRUxHSUFOKQkvKjB4MDgwQyovCiNpbmNsdWRlICJubHMvZnJiLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19GUkVOQ0gsIFNVQkxBTkdfRlJFTkNIX0NBTkFESUFOKQkvKjB4MEMwQyovCiNpbmNsdWRlICJubHMvZnJjLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19GUkVOQ0gsIFNVQkxBTkdfRlJFTkNIX1NXSVNTKQkJLyoweDEwMEMqLwojaW5jbHVkZSAibmxzL2Zycy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSF9MVVhFTUJPVVJHKQkvKjB4MTQwQyovCiNpbmNsdWRlICJubHMvZnJsLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfSFVOR0FSSUFOLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDBlKi8KI2luY2x1ZGUgIm5scy9odW4ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19JVEFMSUFOLCBTVUJMQU5HX0lUQUxJQU4pCQkvKjB4MDQxMCovCiNpbmNsdWRlICJubHMvaXRhLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19JVEFMSUFOLCBTVUJMQU5HX0lUQUxJQU5fU1dJU1MpCS8qMHgwODEwKi8KI2luY2x1ZGUgIm5scy9pdHMubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19KQVBBTkVTRSwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQxMSovCiNpbmNsdWRlICJubHMvanBuLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfS09SRUFOLCBTVUJMQU5HX0tPUkVBTikJLyoweDA0MTIqLwojaW5jbHVkZSAibmxzL2tvci5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0RVVENILCBTVUJMQU5HX0RVVENIKQkJLyoweDA0MTMqLwojaW5jbHVkZSAibmxzL25sZC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRFVUQ0gsIFNVQkxBTkdfRFVUQ0hfQkVMR0lBTikJLyoweDA4MTMqLwojaW5jbHVkZSAibmxzL25sYi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRFVUQ0gsIFNVQkxBTkdfRFVUQ0hfU1VSSU5BTSkJLyoweDBDMTMqLwojaW5jbHVkZSAibmxzL25scy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX05PUldFR0lBTiwgU1VCTEFOR19OT1JXRUdJQU5fQk9LTUFMKQkvKjB4MDQxNCovCiNpbmNsdWRlICJubHMvbm9yLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19OT1JXRUdJQU4sIFNVQkxBTkdfTk9SV0VHSUFOX05ZTk9SU0spCS8qMHgwODE0Ki8KI2luY2x1ZGUgIm5scy9ub24ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19QT0xJU0gsIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MTUqLwojaW5jbHVkZSAibmxzL3Bsay5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1BPUlRVR1VFU0UgLFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4pCS8qMHgwNDE2Ki8KI2luY2x1ZGUgIm5scy9wdGIubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1BPUlRVR1VFU0UgLFNVQkxBTkdfUE9SVFVHVUVTRSkJCS8qMHgwODE2Ki8KI2luY2x1ZGUgIm5scy9wdGcubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19SVVNTSUFOLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHg0MTkqLwojaW5jbHVkZSAibmxzL3J1cy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0NST0FUSUFOLCBTVUJMQU5HX0NST0FUSUFOKQkvKjB4NDFhKi8KI2luY2x1ZGUgIm5scy9ocnYubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19TTE9WQUssIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MWIqLwojaW5jbHVkZSAibmxzL3NreS5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1NXRURJU0gsIFNVQkxBTkdfU1dFRElTSCkJCS8qMHgwNDFkKi8KI2luY2x1ZGUgIm5scy9zdmUubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NXRURJU0gsIFNVQkxBTkdfU1dFRElTSF9GSU5MQU5EKQkvKjB4MDgxZCovCiNpbmNsdWRlICJubHMvc3ZmLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfVEhBSSwgU1VCTEFOR19ERUZBVUxUKQkvKjB4NDFlKi8KI2luY2x1ZGUgIm5scy90aGEubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dBRUxJQywgU1VCTEFOR19ERUZBVUxUKSAvKiAweDA0M2MgKi8KI2luY2x1ZGUgIm5scy9nYWUubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19HQUVMSUMsIFNVQkxBTkdfR0FFTElDX1NDT1RUSVNIKQojaW5jbHVkZSAibmxzL2dkaC5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0dBRUxJQywgU1VCTEFOR19HQUVMSUNfTUFOWCkKI2luY2x1ZGUgIm5scy9nZHYubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19FU1BFUkFOVE8sIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0OGYqLwojaW5jbHVkZSAibmxzL2VzcGVyYW50by5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1dBTE9OLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDkwKi8KI2luY2x1ZGUgIm5scy93YWwubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19DT1JOSVNILCBTVUJMQU5HX0RFRkFVTFQpIC8qIDB4MDQ5MSAgKi8KI2luY2x1ZGUgIm5scy9jb3IubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19XRUxTSCwgU1VCTEFOR19ERUZBVUxUKSAvKiAweDA0OTIgKi8KI2luY2x1ZGUgIm5scy9jeW0ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19CUkVUT04sIFNVQkxBTkdfREVGQVVMVCkgLyogMHgweDkzICAqLwojaW5jbHVkZSAibmxzL2JyZi5ubHMiCkxBTkdfRU5ECgoJICAgIH07CgoKLyogTG9jYWxlIG5hbWUgdG8gaWQgbWFwLiB1c2VkIGJ5IEVudW1TeXN0ZW1Mb2NhbGVzLCBHZXRMb2NhbGVJbmZvQSAKICogTVVTVCBjb250YWluIGFsbCAjZGVmaW5lcyBmcm9tIHdpbm5scy5oCiAqIGxhc3QgZW50cnkgaGFzIE5VTEwgbmFtZSwgMCBpZC4KICovIAojZGVmaW5lIExPQ0FMRV9FTlRSWSh4KQl7I3gsTE9DQUxFXyMjeH0Kc3RhdGljIGNvbnN0IHN0cnVjdCB0YWdMT0NBTEVfTkFNRTJJRCB7CiAgICBjb25zdCBjaGFyCSpuYW1lOwoJRFdPUkQJaWQ7Cn0gbG9jYWxlX25hbWUyaWRbXT0gewoJTE9DQUxFX0VOVFJZKElMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0xBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTRU5HTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoU05BVElWRUxBTkdOQU1FKSwKCUxPQ0FMRV9FTlRSWShJQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0NPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNFTkdDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWQ1RSWU5BTUUpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVDVFJZTkFNRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVENPREVQQUdFKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVEFOU0lDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRNQUNDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoU0xJU1QpLAoJTE9DQUxFX0VOVFJZKElNRUFTVVJFKSwKCUxPQ0FMRV9FTlRSWShTREVDSU1BTCksCglMT0NBTEVfRU5UUlkoU1RIT1VTQU5EKSwKCUxPQ0FMRV9FTlRSWShTR1JPVVBJTkcpLAoJTE9DQUxFX0VOVFJZKElESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElMWkVSTyksCglMT0NBTEVfRU5UUlkoSU5FR05VTUJFUiksCglMT0NBTEVfRU5UUlkoU05BVElWRURJR0lUUyksCglMT0NBTEVfRU5UUlkoU0NVUlJFTkNZKSwKCUxPQ0FMRV9FTlRSWShTSU5UTFNZTUJPTCksCglMT0NBTEVfRU5UUlkoU01PTkRFQ0lNQUxTRVApLAoJTE9DQUxFX0VOVFJZKFNNT05USE9VU0FORFNFUCksCglMT0NBTEVfRU5UUlkoU01PTkdST1VQSU5HKSwKCUxPQ0FMRV9FTlRSWShJQ1VSUkRJR0lUUyksCglMT0NBTEVfRU5UUlkoSUlOVExDVVJSRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJQ1VSUkVOQ1kpLAoJTE9DQUxFX0VOVFJZKElORUdDVVJSKSwKCUxPQ0FMRV9FTlRSWShTREFURSksCglMT0NBTEVfRU5UUlkoU1RJTUUpLAoJTE9DQUxFX0VOVFJZKFNTSE9SVERBVEUpLAoJTE9DQUxFX0VOVFJZKFNMT05HREFURSksCglMT0NBTEVfRU5UUlkoU1RJTUVGT1JNQVQpLAoJTE9DQUxFX0VOVFJZKElEQVRFKSwKCUxPQ0FMRV9FTlRSWShJTERBVEUpLAoJTE9DQUxFX0VOVFJZKElUSU1FKSwKCUxPQ0FMRV9FTlRSWShJVElNRU1BUktQT1NOKSwKCUxPQ0FMRV9FTlRSWShJQ0VOVFVSWSksCglMT0NBTEVfRU5UUlkoSVRMWkVSTyksCglMT0NBTEVfRU5UUlkoSURBWUxaRVJPKSwKCUxPQ0FMRV9FTlRSWShJTU9OTFpFUk8pLAoJTE9DQUxFX0VOVFJZKFMxMTU5KSwKCUxPQ0FMRV9FTlRSWShTMjM1OSksCglMT0NBTEVfRU5UUlkoSUNBTEVOREFSVFlQRSksCglMT0NBTEVfRU5UUlkoSU9QVElPTkFMQ0FMRU5EQVIpLAoJTE9DQUxFX0VOVFJZKElGSVJTVERBWU9GV0VFSyksCglMT0NBTEVfRU5UUlkoSUZJUlNUV0VFS09GWUVBUiksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMyksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNiksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMiksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FOCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTkpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTExKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTIpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU4KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FOSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEwKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEzKSwKCUxPQ0FMRV9FTlRSWShTUE9TSVRJVkVTSUdOKSwKCUxPQ0FMRV9FTlRSWShTTkVHQVRJVkVTSUdOKSwKCUxPQ0FMRV9FTlRSWShJUE9TU0lHTlBPU04pLAoJTE9DQUxFX0VOVFJZKElORUdTSUdOUE9TTiksCglMT0NBTEVfRU5UUlkoSVBPU1NZTVBSRUNFREVTKSwKCUxPQ0FMRV9FTlRSWShJUE9TU0VQQllTUEFDRSksCglMT0NBTEVfRU5UUlkoSU5FR1NZTVBSRUNFREVTKSwKCUxPQ0FMRV9FTlRSWShJTkVHU0VQQllTUEFDRSksCglMT0NBTEVfRU5UUlkoRk9OVFNJR05BVFVSRSksCglMT0NBTEVfRU5UUlkoU0lTTzYzOUxBTkdOQU1FKSwKCUxPQ0FMRV9FTlRSWShTSVNPMzE2NkNUUllOQU1FKSwKCXtOVUxMLDB9LAp9OwoKY29uc3Qgc3RydWN0IG1hcF9sY2lkMnN0ciB7CglMQ0lECQlsYW5naWQ7Cgljb25zdCBjaGFyCSpsYW5nbmFtZTsKfSBsYW5ndWFnZXNbXT17Cgl7MHgwNDAxLCJBcmFiaWMgKFNhdWRpIEFyYWJpYSkifSwKCXsweDA4MDEsIkFyYWJpYyAoSXJhcSkifSwKCXsweDBjMDEsIkFyYWJpYyAoRWd5cHQpIn0sCgl7MHgxMDAxLCJBcmFiaWMgKExpYnlhKSJ9LAoJezB4MTQwMSwiQXJhYmljIChBbGdlcmlhKSJ9LAoJezB4MTgwMSwiQXJhYmljIChNb3JvY2NvKSJ9LAoJezB4MWMwMSwiQXJhYmljIChUdW5pc2lhKSJ9LAoJezB4MjAwMSwiQXJhYmljIChPbWFuKSJ9LAoJezB4MjQwMSwiQXJhYmljIChZZW1lbikifSwKCXsweDI4MDEsIkFyYWJpYyAoU3lyaWEpIn0sCgl7MHgyYzAxLCJBcmFiaWMgKEpvcmRhbikifSwKCXsweDMwMDEsIkFyYWJpYyAoTGViYW5vbikifSwKCXsweDM0MDEsIkFyYWJpYyAoS3V3YWl0KSJ9LAoJezB4MzgwMSwiQXJhYmljIChVbml0ZWQgQXJhYiBFbWlyYXRlcykifSwKCXsweDNjMDEsIkFyYWJpYyAoQmFocmFpbikifSwKCXsweDQwMDEsIkFyYWJpYyAoUWF0YXIpIn0sCgl7MHgwNDAyLCJCdWxnYXJpYW4ifSwKCXsweDA0MDMsIkNhdGFsYW4ifSwKCXsweDA0MDQsIkNoaW5lc2UgKFRhaXdhbikifSwKCXsweDA4MDQsIkNoaW5lc2UgKFBlb3BsZSdzIFJlcHVibGljIG9mIENoaW5hKSJ9LAoJezB4MGMwNCwiQ2hpbmVzZSAoSG9uZyBLb25nKSJ9LAoJezB4MTAwNCwiQ2hpbmVzZSAoU2luZ2Fwb3JlKSJ9LAoJezB4MTQwNCwiQ2hpbmVzZSAoTWFjYXUpIn0sCgl7MHgwNDA1LCJDemVjaCJ9LAoJezB4MDQwNiwiRGFuaXNoIn0sCgl7MHgwNDA3LCJHZXJtYW4gKEdlcm1hbnkpIn0sCgl7MHgwODA3LCJHZXJtYW4gKFN3aXR6ZXJsYW5kKSJ9LAoJezB4MGMwNywiR2VybWFuIChBdXN0cmlhKSJ9LAoJezB4MTAwNywiR2VybWFuIChMdXhlbWJvdXJnKSJ9LAoJezB4MTQwNywiR2VybWFuIChMaWVjaHRlbnN0ZWluKSJ9LAoJezB4MDQwOCwiR3JlZWsifSwKCXsweDA0MDksIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIn0sCgl7MHgwODA5LCJFbmdsaXNoIChVbml0ZWQgS2luZ2RvbSkifSwKCXsweDBjMDksIkVuZ2xpc2ggKEF1c3RyYWxpYW4pIn0sCgl7MHgxMDA5LCJFbmdsaXNoIChDYW5hZGlhbikifSwKCXsweDE0MDksIkVuZ2xpc2ggKE5ldyBaZWFsYW5kKSJ9LAoJezB4MTgwOSwiRW5nbGlzaCAoSXJlbGFuZCkifSwKCXsweDFjMDksIkVuZ2xpc2ggKFNvdXRoIEFmcmljYSkifSwKCXsweDIwMDksIkVuZ2xpc2ggKEphbWFpY2EpIn0sCgl7MHgyNDA5LCJFbmdsaXNoIChDYXJpYmJlYW4pIn0sCgl7MHgyODA5LCJFbmdsaXNoIChCZWxpemUpIn0sCgl7MHgyYzA5LCJFbmdsaXNoIChUcmluaWRhZCAmIFRvYmFnbykifSwKCXsweDMwMDksIkVuZ2xpc2ggKFppbWJhYndlKSJ9LAoJezB4MzQwOSwiRW5nbGlzaCAoUGhpbGlwcGluZXMpIn0sCgl7MHgwNDBhLCJTcGFuaXNoIChTcGFpbiwgdHJhZGl0aW9uYWwgc29ydGluZykifSwKCXsweDA4MGEsIlNwYW5pc2ggKE1leGljbykifSwKCXsweDBjMGEsIlNwYW5pc2ggKFNwYWluLCBpbnRlcm5hdGlvbmFsIHNvcnRpbmcpIn0sCgl7MHgxMDBhLCJTcGFuaXNoIChHdWF0ZW1hbGEpIn0sCgl7MHgxNDBhLCJTcGFuaXNoIChDb3N0YSBSaWNhKSJ9LAoJezB4MTgwYSwiU3BhbmlzaCAoUGFuYW1hKSJ9LAoJezB4MWMwYSwiU3BhbmlzaCAoRG9taW5pY2FuIFJlcHVibGljKSJ9LAoJezB4MjAwYSwiU3BhbmlzaCAoVmVuZXp1ZWxhKSJ9LAoJezB4MjQwYSwiU3BhbmlzaCAoQ29sb21iaWEpIn0sCgl7MHgyODBhLCJTcGFuaXNoIChQZXJ1KSJ9LAoJezB4MmMwYSwiU3BhbmlzaCAoQXJnZW50aW5hKSJ9LAoJezB4MzAwYSwiU3BhbmlzaCAoRWN1YWRvcikifSwKCXsweDM0MGEsIlNwYW5pc2ggKENoaWxlKSJ9LAoJezB4MzgwYSwiU3BhbmlzaCAoVXJ1Z3VheSkifSwKCXsweDNjMGEsIlNwYW5pc2ggKFBhcmFndWF5KSJ9LAoJezB4NDAwYSwiU3BhbmlzaCAoQm9saXZpYSkifSwKCXsweDQ0MGEsIlNwYW5pc2ggKEVsIFNhbHZhZG9yKSJ9LAoJezB4NDgwYSwiU3BhbmlzaCAoSG9uZHVyYXMpIn0sCgl7MHg0YzBhLCJTcGFuaXNoIChOaWNhcmFndWEpIn0sCgl7MHg1MDBhLCJTcGFuaXNoIChQdWVydG8gUmljbykifSwKCXsweDA0MGIsIkZpbm5pc2gifSwKCXsweDA0MGMsIkZyZW5jaCAoRnJhbmNlKSJ9LAoJezB4MDgwYywiRnJlbmNoIChCZWxnaXVtKSJ9LAoJezB4MGMwYywiRnJlbmNoIChDYW5hZGEpIn0sCgl7MHgxMDBjLCJGcmVuY2ggKFN3aXR6ZXJsYW5kKSJ9LAoJezB4MTQwYywiRnJlbmNoIChMdXhlbWJvdXJnKSJ9LAoJezB4MTgwYywiRnJlbmNoIChNb25hY28pIn0sCgl7MHgwNDBkLCJIZWJyZXcifSwKCXsweDA0MGUsIkh1bmdhcmlhbiJ9LAoJezB4MDQwZiwiSWNlbGFuZGljIn0sCgl7MHgwNDEwLCJJdGFsaWFuIChJdGFseSkifSwKCXsweDA4MTAsIkl0YWxpYW4gKFN3aXR6ZXJsYW5kKSJ9LAoJezB4MDQxMSwiSmFwYW5lc2UifSwKCXsweDA0MTIsIktvcmVhbiAoV2Fuc3VuZykifSwKCXsweDA4MTIsIktvcmVhbiAoSm9oYWIpIn0sCgl7MHgwNDEzLCJEdXRjaCAoTmV0aGVybGFuZHMpIn0sCgl7MHgwODEzLCJEdXRjaCAoQmVsZ2l1bSkifSwKCXsweDA0MTQsIk5vcndlZ2lhbiAoQm9rbWFsKSJ9LAoJezB4MDgxNCwiTm9yd2VnaWFuIChOeW5vcnNrKSJ9LAoJezB4MDQxNSwiUG9saXNoIn0sCgl7MHgwNDE2LCJQb3J0dWd1ZXNlIChCcmF6aWwpIn0sCgl7MHgwODE2LCJQb3J0dWd1ZXNlIChQb3J0dWdhbCkifSwKCXsweDA0MTcsIlJoYWV0byBSb21hbmljIn0sCgl7MHgwNDE4LCJSb21hbmlhbiJ9LAoJezB4MDgxOCwiTW9sZGF2aWFuIn0sCgl7MHgwNDE5LCJSdXNzaWFuIChSdXNzaWEpIn0sCgl7MHgwODE5LCJSdXNzaWFuIChNb2xkYXZpYSkifSwKCXsweDA0MWEsIkNyb2F0aWFuIn0sCgl7MHgwODFhLCJTZXJiaWFuIChsYXRpbikifSwKCXsweDBjMWEsIlNlcmJpYW4gKGN5cmlsbGljKSJ9LAoJezB4MDQxYiwiU2xvdmFrIn0sCgl7MHgwNDFjLCJBbGJhbmlhbiJ9LAoJezB4MDQxZCwiU3dlZGlzaCAoU3dlZGVuKSJ9LAoJezB4MDgxZCwiU3dlZGlzaCAoRmlubGFuZCkifSwKCXsweDA0MWUsIlRoYWkifSwKCXsweDA0MWYsIlR1cmtpc2gifSwKCXsweDA0MjAsIlVyZHUifSwKCXsweDA0MjEsIkluZG9uZXNpYW4ifSwKCXsweDA0MjIsIlVrcmFpbmlhbiJ9LAoJezB4MDQyMywiQmVsYXJ1c2lhbiJ9LAoJezB4MDQyNCwiU2xvdmVuZSJ9LAoJezB4MDQyNSwiRXN0b25pYW4ifSwKCXsweDA0MjYsIkxhdHZpYW4ifSwKCXsweDA0MjcsIkxpdGh1YW5pYW4gKG1vZGVybikifSwKCXsweDA4MjcsIkxpdGh1YW5pYW4gKGNsYXNzaWMpIn0sCgl7MHgwNDI4LCJNYW9yaSJ9LAoJezB4MDQyOSwiRmFyc2kifSwKCXsweDA0MmEsIlZpZXRuYW1lc2UifSwKCXsweDA0MmIsIkFybWVuaWFuIn0sCgl7MHgwNDJjLCJBemVyaSAobGF0aW4pIn0sCgl7MHgwODJjLCJBemVyaSAoY3lyaWxsaWMpIn0sCgl7MHgwNDJkLCJCYXNxdWUifSwKCXsweDA0MmUsIlNvcmJpYW4ifSwKCXsweDA0MmYsIk1hY2Vkb25pYW4ifSwKCXsweDA0MzAsIlN1dHUifSwKCXsweDA0MzEsIlRzb25nYSJ9LAoJezB4MDQzMiwiVHN3YW5hIn0sCgl7MHgwNDMzLCJWZW5kYSJ9LAoJezB4MDQzNCwiWGhvc2EifSwKCXsweDA0MzUsIlp1bHUifSwKCXsweDA0MzYsIkFmcmlrYWFucyJ9LAoJezB4MDQzNywiR2VvcmdpYW4ifSwKCXsweDA0MzgsIkZhZXJvZXNlIn0sCgl7MHgwNDM5LCJIaW5kaSJ9LAoJezB4MDQzYSwiTWFsdGVzZSJ9LAoJezB4MDQzYiwiU2FhbWkifSwKCXsweDA0M2MsIklyaXNoIGdhZWxpYyJ9LAoJezB4MDgzYywiU2NvdHRpc2ggZ2FlbGljIn0sCgl7MHgwYzNjLCJNYW54IEdhZWxpYyJ9LAoJezB4MDQzZSwiTWFsYXkgKE1hbGF5c2lhKSJ9LAoJezB4MDgzZSwiTWFsYXkgKEJydW5laSBEYXJ1c3NhbGFtKSJ9LAoJezB4MDQzZiwiS2F6YWsifSwKCXsweDA0NDEsIlN3YWhpbGkifSwKCXsweDA0NDMsIlV6YmVrIChsYXRpbikifSwKCXsweDA4NDMsIlV6YmVrIChjeXJpbGxpYykifSwKCXsweDA0NDQsIlRhdGFyIn0sCgl7MHgwNDQ1LCJCZW5nYWxpIn0sCgl7MHgwNDQ2LCJQdW5qYWJpIn0sCgl7MHgwNDQ3LCJHdWphcmF0aSJ9LAoJezB4MDQ0OCwiT3JpeWEifSwKCXsweDA0NDksIlRhbWlsIn0sCgl7MHgwNDRhLCJUZWx1Z3UifSwKCXsweDA0NGIsIkthbm5hZGEifSwKCXsweDA0NGMsIk1hbGF5YWxhbSJ9LAoJezB4MDQ0ZCwiQXNzYW1lc2UifSwKCXsweDA0NGUsIk1hcmF0aGkifSwKCXsweDA0NGYsIlNhbnNrcml0In0sCgl7MHgwNDU3LCJLb25rYW5pIn0sCgl7MHgwNDhmLCJFc3BlcmFudG8ifSwgLyogTm9uIG9mZmljaWFsICovCgl7MHgwNDkwLCJXYWxvbiJ9LCAvKiBOb24gb2ZmaWNpYWwgKi8KCXsweDA0OTEsIkNvcm5pc2gifSwJLyogTm90IG9mZmljaWFsICovCgl7MHgwNDkyLCJXZWxzaCJ9LAkvKiBOb3Qgb2ZmaWNpYWwgKi8KCXsweDA0OTMsIkJyZXRvbiJ9LAkvKiBOb3Qgb2ZmaWNpYWwgKi8KCXsweDAwMDAsIlVua25vd24ifQogICAgfSwgbGFuZ3VhZ2VzX2RlW109ewoJezB4MDQwMSwiQXJhYmljIn0sCgl7MHgwNDAyLCJCdWxnYXJpc2NoIn0sCgl7MHgwNDAzLCJLYXRhbGFuaXNjaCJ9LAoJezB4MDQwNCwiVHJhZGl0aW9uYWxlcyBDaGluZXNpc2NoIn0sCgl7MHgwNDA1LCJUc2NoZWNpc2NoIn0sCgl7MHgwNDA2LCJE5G5pc2NoIn0sCgl7MHgwNDA3LCJEZXV0c2NoIn0sCgl7MHgwNDA4LCJHcmllY2hpc2NoIn0sCgl7MHgwNDA5LCJBbWVyaWthbmlzY2hlcyBFbmdsaXNjaCJ9LAoJezB4MDQwQSwiS2FzdGlsaXNjaGVzIFNwYW5pc2NoIn0sCgl7MHgwNDBCLCJGaW5uaXNjaCJ9LAoJezB4MDQwQywiRnJhbnp2c2lzY2gifSwKCXsweDA0MEQsIkhlYnJkaXNjaCJ9LAoJezB4MDQwRSwiVW5nYXJpc2NoIn0sCgl7MHgwNDBGLCJJc2xkbmRpc2NoIn0sCgl7MHgwNDEwLCJJdGFsaWVuaXNjaCJ9LAoJezB4MDQxMSwiSmFwYW5pc2NoIn0sCgl7MHgwNDEyLCJLb3JlYW5pc2NoIn0sCgl7MHgwNDEzLCJOaWVkZXJsZG5kaXNjaCJ9LAoJezB4MDQxNCwiTm9yd2VnaXNjaC1Cb2ttYWwifSwKCXsweDA0MTUsIlBvbG5pc2NoIn0sCgl7MHgwNDE2LCJCcmFzaWxpYW5pc2NoZXMgUG9ydHVnaWVzaXNjaCJ9LAoJezB4MDQxNywiUmR0b3JvbWFuaXNjaCJ9LAoJezB4MDQxOCwiUnVtZG5pc2NoIn0sCgl7MHgwNDE5LCJSdXNzaXNjaCJ9LAoJezB4MDQxQSwiS3JvYXRvc2VyYmlzY2ggKGxhdGVpbmlzY2gpIn0sCgl7MHgwNDFCLCJTbG93ZW5pc2NoIn0sCgl7MHgwNDFDLCJBbGJhbmlzY2gifSwKCXsweDA0MUQsIlNjaHdlZGlzY2gifSwKCXsweDA0MUUsIlRoYWkifSwKCXsweDA0MUYsIlT8cmtpc2NoIn0sCgl7MHgwNDIwLCJVcmR1In0sCgl7MHgwNDIxLCJCYWhhc2EifSwKCXsweDA4MDQsIlZlcmVpbmZhY2h0ZXMgQ2hpbmVzaXNjaCJ9LAoJezB4MDgwNywiU2Nod2VpemVyZGV1dHNjaCJ9LAoJezB4MDgwOSwiQnJpdGlzY2hlcyBFbmdsaXNjaCJ9LAoJezB4MDgwQSwiTWV4aWthbmlzY2hlcyBTcGFuaXNjaCJ9LAoJezB4MDgwQywiQmVsZ2lzY2hlcyBGcmFuenZzaXNjaCJ9LAoJezB4MDgxMCwiU2Nod2VpemVyaXNjaGVzIEl0YWxpZW5pc2NoIn0sCgl7MHgwODEzLCJCZWxnaXNjaGVzIE5pZWRlcmxkbmRpc2NoIn0sCgl7MHgwODE0LCJOb3Jnd2VnaXNjaC1OeW5vcnNrIn0sCgl7MHgwODE2LCJQb3J0dWdpZXNpc2NoIn0sCgl7MHgwODFBLCJTZXJib2tyYXRpc2NoIChreXJpbGxpc2NoKSJ9LAoJezB4MEMxQywiS2FuYWRpc2NoZXMgRnJhbnp2c2lzY2gifSwKCXsweDEwMEMsIlNjaHdlaXplcmlzY2hlcyBGcmFuenZzaXNjaCJ9LAoJezB4MDAwMCwiVW5iZWthbm50In0sCn07CgpzdGF0aWMgY2hhciAqR2V0TG9jYWxlU3Via2V5TmFtZSggRFdPUkQgbGN0eXBlICk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldFVzZXJEZWZhdWx0TENJRCAgICAgICBbS0VSTkVMMzIuNDI1XSBbT0xFMk5MUy4xXQogKi8KTENJRCBXSU5BUEkgR2V0VXNlckRlZmF1bHRMQ0lEKCkKewoJcmV0dXJuIE1BS0VMQ0lEKCBHZXRVc2VyRGVmYXVsdExhbmdJRCgpICwgU09SVF9ERUZBVUxUICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldFN5c3RlbURlZmF1bHRMQ0lEICAgICAgIFtLRVJORUwzMi40MDBdIFtPTEUyTkxTLjJdCiAqLwpMQ0lEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpCnsKCXJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0VXNlckRlZmF1bHRMYW5nSUQgICAgICAgW0tFUk5FTDMyLjQyNl0gW09MRTJOTFMuM10KICovCkxBTkdJRCBXSU5BUEkgR2V0VXNlckRlZmF1bHRMYW5nSUQoKQp7CgkvKiBjYWNoaW5nIHJlc3VsdCwgaWYgZGVmaW5lZCBmcm9tIGVudmlyb25tZW50LCB3aGljaCBzaG91bGQgKD8pIG5vdCBjaGFuZ2UgZHVyaW5nIGEgV0lORSBzZXNzaW9uICovCglzdGF0aWMJTEFOR0lECXVzZXJMQ0lEID0gMDsKCWlmIChPcHRpb25zLmxhbmd1YWdlKSB7CgkJcmV0dXJuIExhbmd1YWdlc1tPcHRpb25zLmxhbmd1YWdlXS5sYW5naWQ7Cgl9CgoJaWYgKHVzZXJMQ0lEID09IDApIHsKCQljaGFyICpidWY9TlVMTDsKCQljaGFyICpsYW5nLCpjb3VudHJ5LCpjaGFyc2V0LCpkaWFsZWN0LCpuZXh0OwoJCWludCAJcmV0PTA7CgkJCgkJYnVmPWdldGVudigiTEFOR1VBR0UiKTsKCQlpZiAoIWJ1ZikgYnVmPWdldGVudigiTEFORyIpOwoJCWlmICghYnVmKSBidWY9Z2V0ZW52KCJMQ19BTEwiKTsKCQlpZiAoIWJ1ZikgYnVmPWdldGVudigiTENfTUVTU0FHRVMiKTsKCQlpZiAoIWJ1ZikgYnVmPWdldGVudigiTENfQ1RZUEUiKTsKCQlpZiAoIWJ1ZikgcmV0dXJuIHVzZXJMQ0lEID0gTUFLRUxBTkdJRCggTEFOR19FTkdMSVNILCBTVUJMQU5HX0RFRkFVTFQgKTsKCQkKCQlpZiAoIXN0cmNtcChidWYsIlBPU0lYIikgfHwgIXN0cmNtcChidWYsIkMiKSkgewoJCQlyZXR1cm4gTUFLRUxBTkdJRCggTEFOR19FTkdMSVNILCBTVUJMQU5HX0RFRkFVTFQgKTsKCQl9CgkJCgkJbGFuZz1idWY7CgkJCgkJZG8gewoJCQluZXh0PXN0cmNocihsYW5nLCc6Jyk7IGlmIChuZXh0KSAqbmV4dCsrPSdcMCc7CgkJCWRpYWxlY3Q9c3RyY2hyKGxhbmcsJ0AnKTsgaWYgKGRpYWxlY3QpICpkaWFsZWN0Kys9J1wwJzsKCQkJY2hhcnNldD1zdHJjaHIobGFuZywnLicpOyBpZiAoY2hhcnNldCkgKmNoYXJzZXQrKz0nXDAnOwoJCQljb3VudHJ5PXN0cmNocihsYW5nLCdfJyk7IGlmIChjb3VudHJ5KSAqY291bnRyeSsrPSdcMCc7CgkJCQoJCQlyZXQ9TUFJTl9HZXRMYW5ndWFnZUlEKGxhbmcsIGNvdW50cnksIGNoYXJzZXQsIGRpYWxlY3QpOwoJCQkKCQkJbGFuZz1uZXh0OwoJCQkKCQl9IHdoaWxlIChsYW5nICYmICFyZXQpOwoJCQoJCS8qIEZJWE1FIDogYXJlIHN0cmluZ3MgcmV0dXJuZWQgYnkgZ2V0ZW52KCkgdG8gYmUgZnJlZSgpJ2VkID8gKi8KCQl1c2VyTENJRCA9IChMQU5HSUQpcmV0OwoJfQoJcmV0dXJuIHVzZXJMQ0lEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEICAgICBbS0VSTkVMMzIuNDAxXSBbT0xFMk5MUy40XQogKi8KTEFOR0lEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEKCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29udmVydERlZmF1bHRMb2NhbGUzMiBbS0VSTkVMMzIuMTQ3XQogKi8KTENJRCBXSU5BUEkgQ29udmVydERlZmF1bHRMb2NhbGUzMiAoTENJRCBsY2lkKQp7CXN3aXRjaCAobGNpZCkKCXsgIGNhc2UgTE9DQUxFX1NZU1RFTV9ERUZBVUxUOgoJICAgICByZXR1cm4gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKCSAgIGNhc2UgTE9DQUxFX1VTRVJfREVGQVVMVDoKCSAgICAgcmV0dXJuIEdldFVzZXJEZWZhdWx0TENJRCgpOwoJICAgY2FzZSAwOgoJICAgICByZXR1cm4gTUFLRUxDSUQgKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ORVVUUkFMKTsKCX0gIAoJcmV0dXJuIE1BS0VMQU5HSUQoIFBSSU1BUllMQU5HSUQobGNpZCksIFNVQkxBTkdfTkVVVFJBTCk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBHZXRMb2NhbGVJbmZvQSBbS0VSTkVMMzIuMzQyXQogKgogKiBOT1RFUyAKICogIExBTkdfTkVVVFJBTCBpcyBlcXVhbCB0byBMT0NBTEVfU1lTVEVNX0RFRkFVTFQKICoKICogIE1TIG9ubGluZSBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0IHRoZSBzdHJpbmcgcmV0dXJuZWQgaXMgTlVMTCB0ZXJtaW5hdGVkCiAqICBleGNlcHQgZm9yIExPQ0FMRV9GT05UU0lHTkFUVVJFICB3aGljaCAid2lsbCByZXR1cm4gYSBub24tTlVMTAogKiAgdGVybWluYXRlZCBzdHJpbmciLgogKi8KSU5UIFdJTkFQSSBHZXRMb2NhbGVJbmZvQShMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFNUUiBidWYsSU5UIGxlbikKewogIExQQ1NUUiAgcmV0U3RyaW5nOwoJaW50CWZvdW5kLGk7CglpbnQJbGFuZz0wOwogICAgY2hhciAgICAqcGFjS2V5OwogICAgY2hhciAgICBhY0J1ZmZlclsxMjhdOwogICAgRFdPUkQgICBkd0J1ZmZlclNpemU9MTI4OwoKICBUUkFDRSgiKGxjaWQ9MHglbHgsbGN0eXBlPTB4JWx4LCVwLCV4KVxuIixsY2lkLExDVHlwZSxidWYsbGVuKTsKCiAgaWYgKGxlbiAmJiAoISBidWYpICkgewogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJCXJldHVybiAwOwoJfQoKCWlmIChsY2lkID09MCB8fCBsY2lkID09IExBTkdfU1lTVEVNX0RFRkFVTFQgfHwgKExDVHlwZSAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkgKQkvKiAweDAwLCAweDQwMCAqLwoJewogICAgICAgICAgICBsY2lkID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKCX0gCgllbHNlIGlmIChsY2lkID09IExBTkdfVVNFUl9ERUZBVUxUKSAvKjB4ODAwKi8KCXsKICAgICAgICAgICAgbGNpZCA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwoJfQoJTENUeXBlICY9IH4oTE9DQUxFX05PVVNFUk9WRVJSSURFfExPQ0FMRV9VU0VfQ1BfQUNQKTsKCgkvKiBBcyBhbiBvcHRpb24sIHdlIGNvdWxkIG9idGFpbiB0aGUgdmFsdWUgZnJvbSB3aW4uaW5pLgoJICAgVGhpcyB3b3VsZCBub3QgbWF0Y2ggdGhlIFdpbmUgY29tcGlsZS10aW1lIG9wdGlvbi4KCSAgIEFsc28sIG5vdCBhbGwgaWRlbnRpZmllcnMgYXJlIGF2YWlsYWJsZSBmcm9tIHdpbi5pbmkgKi8KCXJldFN0cmluZz0wOwoJLyogSWYgd2UgYXJlIHRocm91Z2ggYWxsIG9mIHRoaXMsIHJldExlbiBzaG91bGQgbm90IGJlIHplcm8gYW55bW9yZS4KCSAgIElmIGl0IGlzLCB0aGUgdmFsdWUgaXMgbm90IHN1cHBvcnRlZCAqLwoJaT0wOwoJd2hpbGUgKGxvY2FsZV9uYW1lMmlkW2ldLm5hbWUhPU5VTEwpIHsKCQlpZiAoTENUeXBlID09IGxvY2FsZV9uYW1lMmlkW2ldLmlkKSB7CgkJCXJldFN0cmluZyA9IGxvY2FsZV9uYW1lMmlkW2ldLm5hbWU7CgkJCWJyZWFrOwoJCX0KCQlpKys7Cgl9CglpZiAoIXJldFN0cmluZykgewogICAgICBGSVhNRSgiVW5rb3duIExDIHR5cGUgJWxYXG4iLExDVHlwZSk7CgkJcmV0dXJuIDA7Cgl9CgogICAgZm91bmQ9MDsKCiAgICAvKiBGaXJzdCwgY2hlY2sgaWYgaXQncyBpbiB0aGUgcmVnaXN0cnkuICovCgogICAgaWYgKCAocGFjS2V5ID0gR2V0TG9jYWxlU3Via2V5TmFtZShMQ1R5cGUpKSApCiAgICB7CiAgICAgICAgY2hhciAgICBhY1JlYWxLZXlbMTI4XTsKICAgICAgICBIS0VZICAgIGhLZXk7CgogICAgICAgIHNwcmludGYoIGFjUmVhbEtleSwgIkNvbnRyb2wgUGFuZWxcXEludGVybmF0aW9uYWxcXCVzIiwgcGFjS2V5ICk7CgogICAgICAgIGlmICggUmVnT3BlbktleUV4QSggSEtFWV9DVVJSRU5UX1VTRVIsIGFjUmVhbEtleSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBLRVlfUkVBRCwgJmhLZXkpID09IEVSUk9SX1NVQ0NFU1MgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCBSZWdRdWVyeVZhbHVlRXhBKCBoS2V5LCBOVUxMLCBOVUxMLCBOVUxMLCAoTFBCWVRFKWFjQnVmZmVyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHdCdWZmZXJTaXplICkgPT0gRVJST1JfU1VDQ0VTUyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldFN0cmluZyA9IGFjQnVmZmVyOwogICAgICAgICAgICAgICAgZm91bmQgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFJlZ0Nsb3NlS2V5KGhLZXkpOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBJZiBub3QgaW4gdGhlIHJlZ2lzdHJ5LCBnZXQgaXQgZnJvbSB0aGUgTkxTIGVudHJpZXMuICovCgogICAgbGFuZz1sY2lkOwogICAgZm9yIChpPTA7KGk8MyAmJiAhZm91bmQpO2krKykgewogICAgICBpbnQgajsKCiAgICAgIGZvciAoaj0wO2o8c2l6ZW9mKGxhbmdsb2NhbGVzKS9zaXplb2YobGFuZ2xvY2FsZXNbMF0pO2orKykgewoJaWYgKGxhbmdsb2NhbGVzW2pdLmxhbmcgPT0gbGFuZykgewoJICBpbnQgazsKCgkgIGZvciAoaz0wO2s8c2l6ZW9mKGxhbmdsb2NhbGVzW2pdLmxvY3ZhcnMpL3NpemVvZihsYW5nbG9jYWxlc1tqXS5sb2N2YXJzWzBdKSAmJiAobGFuZ2xvY2FsZXNbal0ubG9jdmFyc1trXS50eXBlKTtrKyspIHsKCSAgICBpZiAobGFuZ2xvY2FsZXNbal0ubG9jdmFyc1trXS50eXBlID09IExDVHlwZSkgewoJICAgICAgZm91bmQgPSAxOwoJICAgICAgcmV0U3RyaW5nID0gbGFuZ2xvY2FsZXNbal0ubG9jdmFyc1trXS52YWw7CgkgIGJyZWFrOwoJICAgIH0KCSAgfQogICAgICAgICAgaWYgKGZvdW5kKQoJICAgIGJyZWFrOwoJfQogICAgICB9CgkgIC8qIGxhbmd1YWdlIG5vdCBmb3VuZCwgdHJ5IHdpdGhvdXQgYSBzdWJsYW5ndWFnZSovCgkgIGlmIChpPT0xKSBsYW5nPU1BS0VMQU5HSUQoIFBSSU1BUllMQU5HSUQobGFuZyksIFNVQkxBTkdfREVGQVVMVCk7CgkgIC8qIG1hc2sgdGhlIExDIFZhbHVlICovCgkgIGlmIChpPT0yKSBMQ1R5cGUgJj0gMHhmZmY7CiAgICB9CgogICAgaWYoIWZvdW5kKSB7CiAgICAgIEVSUigiJyVzJyBub3Qgc3VwcG9ydGVkIGZvciB5b3VyIGxhbmd1YWdlICglMDRYKS5cbiIsCgkJCXJldFN0cmluZywoV09SRClsY2lkKTsKCQlTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJCXJldHVybiAwOwkJCQoJfQogICAgLyogYSBGT05UU0lHTkFUVVJFIGlzIG5vdCBhIHN0cmluZywganVzdCA2IERXT1JEcyAgKi8KICAgIGlmIChMQ1R5cGUgPT0gTE9DQUxFX0ZPTlRTSUdOQVRVUkUpIHsKICAgICAgICBpZiAobGVuKQogICAgICAgICAgICBtZW1jcHkoYnVmLCByZXRTdHJpbmcsIChsZW48PXNpemVvZihGT05UU0lHTkFUVVJFKSk/bGVuOnNpemVvZihGT05UU0lHTkFUVVJFKSk7CiAgICAgICAgcmV0dXJuIHNpemVvZihGT05UU0lHTkFUVVJFKTsKICAgIH0KICAgIC8qIGlmIGxlbj0wIHJldHVybiBvbmx5IHRoZSBsZW5ndGgsIGRvbid0IHRvdWNoIHRoZSBidWZmZXIqLwogICAgaWYgKGxlbikgbHN0cmNweW5BKGJ1ZixyZXRTdHJpbmcsbGVuKTsKICAgIHJldHVybiBzdHJsZW4ocmV0U3RyaW5nKSsxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRMb2NhbGVJbmZvVwlbS0VSTkVMMzIuMzQzXQogKgogKiBOT1RFUwogKiAgTVMgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCBsZW4gInNwZWNpZmllcyB0aGUgc2l6ZSwgaW4gYnl0ZXMgKEFOU0kgdmVyc2lvbikKICogIG9yIGNoYXJhY3RlcnMgKFVuaWNvZGUgdmVyc2lvbiksIG9mIiB3YnVmLiBUaHVzIHRoZSBudW1iZXIgcmV0dXJuZWQgaXMKICogIHRoZSBzYW1lIGJldHdlZW4gR2V0TG9jYWxlSW5mb1cgYW5kIEdldExvY2FsZUluZm9BLgogKi8KSU5UIFdJTkFQSSBHZXRMb2NhbGVJbmZvVyhMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFdTVFIgd2J1ZixJTlQgbGVuKQp7CVdPUkQgd2xlbjsKCUxQU1RSIGFidWY7CgkKCWlmIChsZW4gJiYgKCEgd2J1ZikgKQoJeyBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgIHJldHVybiAwOwoJfQoKCWFidWYgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4pOwoJd2xlbiA9IEdldExvY2FsZUluZm9BKGxjaWQsIExDVHlwZSwgYWJ1ZiwgbGVuKTsKCglpZiAod2xlbiAmJiBsZW4pCS8qIGlmIGxlbj0wIHJldHVybiBvbmx5IHRoZSBsZW5ndGgqLwoJICBsc3RyY3B5bkF0b1cod2J1ZixhYnVmLGxlbik7CgoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGFidWYpOwoJcmV0dXJuIHdsZW47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICoJCUdldExvY2FsZVN1YmtleU5hbWUgW2hlbHBlciBmdW5jdGlvbl0KICoKICogICAgICAgICAgLSBGb3IgdXNlIHdpdGggdGhlIHJlZ2lzdHJ5LgogKiAgICAgICAgICAtIEdldHMgdGhlIHJlZ2lzdHJ5IHN1YmtleSBuYW1lIGZvciBhIGdpdmVuIGxjdHlwZS4KICovCnN0YXRpYyBjaGFyICpHZXRMb2NhbGVTdWJrZXlOYW1lKCBEV09SRCBsY3R5cGUgKQp7CiAgICBjaGFyICAgICpwYWNLZXk9TlVMTDsKCiAgICBzd2l0Y2ggKCBsY3R5cGUgKQogICAgewogICAgLyogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIGJ5IFNldExvY2FsZUluZm8gYW5kIEdldExvY2FsZUluZm8sIGFuZAogICAgICogdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSByZWdpc3RyeSwgY29uZmlybWVkIHVuZGVyIFdpbmRvd3MsCiAgICAgKiBmb3IgdGhlIG9uZXMgdGhhdCBhY3R1YWxseSBhc3NpZ24gcGFjS2V5LiBDYXNlcyB0aGF0IGFyZW4ndCBmaW5pc2hlZAogICAgICogaGF2ZSBub3QgYmVlbiBjb25maXJtZWQsIHNvIHRoYXQgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGV5IGNhbiBiZQogICAgICogYWRkZWQuCiAgICAgKi8KICAgIGNhc2UgTE9DQUxFX1NEQVRFIDogICAgICAgIC8qIFRoZSBkYXRlIHNlcGFyYXRvci4gKi8KICAgICAgICBwYWNLZXkgPSAic0RhdGUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSUNVUlJESUdJVFM6CiAgICAgICAgcGFjS2V5ID0gImlDdXJyRGlnaXRzIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NERUNJTUFMIDoKICAgICAgICBwYWNLZXkgPSAic0RlY2ltYWwiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSUNVUlJFTkNZOgogICAgICAgIHBhY0tleSA9ICJpQ3VycmVuY3kiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0dST1VQSU5HIDoKICAgICAgICBwYWNLZXkgPSAic0dyb3VwaW5nIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lESUdJVFM6CiAgICAgICAgcGFjS2V5ID0gImlEaWdpdHMiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0xJU1QgOgogICAgICAgIHBhY0tleSA9ICJzTGlzdCI7CiAgICAgICAgYnJlYWs7CiAgICAvKiBjYXNlIExPQ0FMRV9JQ0FMRU5EQVJUWVBFOiAqLwogICAgLyogY2FzZSBMT0NBTEVfSUZJUlNUREFZT0ZXRUVLOiAqLwogICAgLyogY2FzZSBMT0NBTEVfSUZJUlNUV0VFS09GWUVBUjogKi8KICAgIC8qIGNhc2UgTE9DQUxFX1NZRUFSTU9OVEggOiAqLwogICAgLyogY2FzZSBMT0NBTEVfU1BPU0lUSVZFU0lHTiA6ICovCiAgICAvKiBjYXNlIExPQ0FMRV9JUEFQRVJTSVpFOiAqLwogICAgLyogICAgIGJyZWFrOyAqLwogICAgY2FzZSBMT0NBTEVfU0xPTkdEQVRFIDoKICAgICAgICBwYWNLZXkgPSAic0xvbmdEYXRlIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NNT05ERUNJTUFMU0VQIDoKICAgICAgICBwYWNLZXkgPSAic01vbkRlY2ltYWxTZXAiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU01PTkdST1VQSU5HOgogICAgICAgIHBhY0tleSA9ICJzTW9uR3JvdXBpbmciOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSU1FQVNVUkU6CiAgICAgICAgcGFjS2V5ID0gImlNZWFzdXJlIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NNT05USE9VU0FORFNFUCA6CiAgICAgICAgcGFjS2V5ID0gInNNb25UaG91c2FuZFNlcCI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JTkVHQ1VSUjoKICAgICAgICBwYWNLZXkgPSAiaU5lZ0N1cnIiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU05FR0FUSVZFU0lHTiA6CiAgICAgICAgcGFjS2V5ID0gInNOZWdhdGl2ZVNpZ24iOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSU5FR05VTUJFUjoKICAgICAgICBwYWNLZXkgPSAiaU5lZ051bWJlciI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TU0hPUlREQVRFIDoKICAgICAgICBwYWNLZXkgPSAic1Nob3J0RGF0ZSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JTERBVEU6ICAgICAgICAvKiBMb25nIERhdGUgZm9ybWF0IG9yZGVyaW5nIHNwZWNpZmllci4gKi8KICAgICAgICBwYWNLZXkgPSAiaUxEYXRlIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lMWkVSTzoKICAgICAgICBwYWNLZXkgPSAiaUxaZXJvIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lUTFpFUk86CiAgICAgICAgcGFjS2V5ID0gImlUTFplcm8iOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSVRJTUU6ICAgICAgICAvKiBUaW1lIGZvcm1hdCBzcGVjaWZpZXIuICovCiAgICAgICAgcGFjS2V5ID0gImlUaW1lIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NUSE9VU0FORCA6CiAgICAgICAgcGFjS2V5ID0gInNUaG91c2FuZCI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TMTE1OTogICAgICAgIC8qIEFNICovCiAgICAgICAgcGFjS2V5ID0gInMxMTU5IjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NUSU1FOgogICAgICAgIHBhY0tleSA9ICJzVGltZSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TMjM1OTogICAgICAgIC8qIFBNICovCiAgICAgICAgcGFjS2V5ID0gInMyMzU5IjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NUSU1FRk9STUFUIDoKICAgICAgICBwYWNLZXkgPSAic1RpbWVGb3JtYXQiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0NVUlJFTkNZOgogICAgICAgIHBhY0tleSA9ICJzQ3VycmVuY3kiOwogICAgICAgIGJyZWFrOwoKICAgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIG5vdCBsaXN0ZWQgdW5kZXIgTVNETiBhcyBzdXBwb3J0ZWQsIAogICAgICogYnV0IHNlZW0gdG8gYmUgdXNlZCBhbmQgYWxzbyBzdG9yZWQgaW4gdGhlIHJlZ2lzdHJ5LgogICAgICovCgogICAgY2FzZSBMT0NBTEVfSURBVEU6CiAgICAgICAgcGFjS2V5ID0gImlEYXRlIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NDT1VOVFJZOgogICAgICAgIHBhY0tleSA9ICJzQ291bnRyeSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JQ09VTlRSWToKICAgICAgICBwYWNLZXkgPSAiaUNvdW50cnkiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0xBTkdVQUdFOgogICAgICAgIHBhY0tleSA9ICJzTGFuZ3VhZ2UiOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuKCBwYWNLZXkgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU2V0TG9jYWxlSW5mb0EJW0tFUk5FTDMyLjY1Nl0KICovCkJPT0wxNiBXSU5BUEkgU2V0TG9jYWxlSW5mb0EoRFdPUkQgbGNpZCwgRFdPUkQgbGN0eXBlLCBMUENTVFIgZGF0YSkKewogICAgSEtFWSAgICBoS2V5OwogICAgY2hhciAgICAqcGFjS2V5OwogICAgY2hhciAgICBhY1JlYWxLZXlbMTI4XTsKCiAgICBpZiAoIChwYWNLZXkgPSBHZXRMb2NhbGVTdWJrZXlOYW1lKGxjdHlwZSkpICkKICAgIHsKICAgICAgICBzcHJpbnRmKCBhY1JlYWxLZXksICJDb250cm9sIFBhbmVsXFxJbnRlcm5hdGlvbmFsXFwlcyIsIHBhY0tleSApOwogICAgICAgIGlmICggUmVnQ3JlYXRlS2V5QSggSEtFWV9DVVJSRU5UX1VTRVIsIGFjUmVhbEtleSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEtleSApID09IEVSUk9SX1NVQ0NFU1MgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCBSZWdTZXRWYWx1ZUV4QSggaEtleSwgTlVMTCwgMCwgUkVHX1NaLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgc3RybGVuKGRhdGEpKzEgKSAhPSBFUlJPUl9TVUNDRVNTICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRVJSKCJTZXRMb2NhbGVJbmZvQTogJXMgZGlkIG5vdCB3b3JrXG4iLCBwYWNLZXkgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBSZWdDbG9zZUtleSggaEtleSApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgIEZJWE1FKCIoJWxkLCVsZCwlcyk6IHN0dWJcbiIsbGNpZCxsY3R5cGUsZGF0YSk7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSXNWYWxpZExvY2FsZQlbS0VSTkVMMzIuNDg5XQogKi8KQk9PTCBXSU5BUEkgSXNWYWxpZExvY2FsZShMQ0lEIGxjaWQsRFdPUkQgZmxhZ3MpCnsKCS8qIHdlIHN1cHBvcnQgQU5ZIGxhbmd1YWdlLiBXZWxsLCBhdCBsZWFzdCBzYXkgdGhhdC4uLiovCglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bVN5c3RlbUxvY2FsZXNXCVtLRVJORUwzMi4yMDldCiAqLwpCT09MIFdJTkFQSSBFbnVtU3lzdGVtTG9jYWxlc1coIExPQ0FMRV9FTlVNUFJPQ1cgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzICkKewoJaW50CWk7CglCT09MCXJldDsKCVdDSEFSCWJ1ZmZlclsyMDBdOwoJSEtFWQl4aGtleTsKCglUUkFDRV8od2luMzIpKCIoJXAsJTA4bHgpXG4iLGxwZm5Mb2NhbGVFbnVtLGZsYWdzICk7CgkvKiBzZWUgaWYgd2UgY2FuIHJldXNlIHRoZSBXaW45NSByZWdpc3RyeSBlbnRyaWVzLi4uLiAqLwoJaWYgKEVSUk9SX1NVQ0NFU1M9PVJlZ09wZW5LZXlBKEhLRVlfTE9DQUxfTUFDSElORSwiU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCIsJnhoa2V5KSkgewoJCWk9MDsKCQl3aGlsZSAoMSkgewoJCQlpZiAoRVJST1JfU1VDQ0VTUyE9UmVnRW51bUtleVcoeGhrZXksaSxidWZmZXIsc2l6ZW9mKGJ1ZmZlcikpKQoJCQkJYnJlYWs7CiAgICAgICAgICAgIAkJaWYgKCFscGZuTG9jYWxlRW51bShidWZmZXIpKQoJCQkJYnJlYWs7CgkJCWkrKzsKCQl9CgkJUmVnQ2xvc2VLZXkoeGhrZXkpOwoJCXJldHVybiBUUlVFOwoJfQoKCWk9MDsKCXdoaWxlIChsYW5ndWFnZXNbaV0ubGFuZ2lkIT0wKQogICAgICAgIHsKICAgICAgICAgICAgTFBXU1RSIGNwOwoJICAgIGNoYXIgICB4YnVmZmVyWzEwXTsKICAJCgkgICAgc3ByaW50Zih4YnVmZmVyLCIlMDhseCIsKERXT1JEKWxhbmd1YWdlc1tpXS5sYW5naWQpOwoKCSAgICBjcCA9IEhFQVBfc3RyZHVwQXRvVyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgeGJ1ZmZlciApOwogICAgICAgICAgICByZXQgPSBscGZuTG9jYWxlRW51bShjcCk7CiAgICAgICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBjcCApOwogICAgICAgICAgICBpZiAoIXJldCkgYnJlYWs7CiAgICAgICAgICAgIGkrKzsKCX0KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFbnVtU3lzdGVtTG9jYWxlc0EJW0tFUk5FTDMyLjIwOF0KICovCkJPT0wgV0lOQVBJIEVudW1TeXN0ZW1Mb2NhbGVzQShMT0NBTEVfRU5VTVBST0NBIGxwZm5Mb2NhbGVFbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzKQp7CglpbnQJaTsKCUNIQVIJYnVmZmVyWzIwMF07CglIS0VZCXhoa2V5OwoKCVRSQUNFXyh3aW4zMikoIiglcCwlMDhseClcbiIsCgkJbHBmbkxvY2FsZUVudW0sZmxhZ3MKCSk7CgoJaWYgKCBFUlJPUl9TVUNDRVNTPT1SZWdPcGVuS2V5QShIS0VZX0xPQ0FMX01BQ0hJTkUsCiAgICAgICAgICAgICAgICAgICAgIlN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXENvbnRyb2xcXE5sc1xcTG9jYWxlXFwiLAogICAgICAgICAgICAgICAgICAgICZ4aGtleSkpIHsKICAgICAgICAgICAgaT0wOwogICAgICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICAgICAgRFdPUkQgc2l6ZT1zaXplb2YoYnVmZmVyKTsKICAgICAgICAgICAgICAgIGlmIChFUlJPUl9TVUNDRVNTIT1SZWdFbnVtVmFsdWVBKHhoa2V5LGksYnVmZmVyLCZzaXplLE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLE5VTEwpKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgaWYgKHNpemUgJiYgIWxwZm5Mb2NhbGVFbnVtKGJ1ZmZlcikpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgUmVnQ2xvc2VLZXkoeGhrZXkpOwogICAgICAgICAgICByZXR1cm4gVFJVRTsKCX0KCWk9MDsKCXdoaWxlIChsYW5ndWFnZXNbaV0ubGFuZ2lkIT0wKSB7CgkJc3ByaW50ZihidWZmZXIsIiUwOGx4IiwoRFdPUkQpbGFuZ3VhZ2VzW2ldLmxhbmdpZCk7CgkJaWYgKCFscGZuTG9jYWxlRW51bShidWZmZXIpKQoJCQlicmVhazsKCQlpKys7Cgl9CglyZXR1cm4gVFJVRTsKfQoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgQ1RfQ1R5cGUyX0xVVFtdID0gewogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAxICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA0ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgOCAqLwogIEMyX1NFR01FTlRTRVBBUkFUT1IsIC8qICAgLSAgIDkgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDEwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDEzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTUgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTggKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE5ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjQgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI1ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI4ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyOSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMzAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDMxICovCiAgQzJfV0hJVEVTUEFDRSwgLyogICAtICAzMiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogISAtICAzMyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogIiAtICAzNCAqLyAvKiAiICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogIyAtICAzNSAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICQgLSAgMzYgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAlIC0gIDM3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qICYgLSAgMzggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICcgLSAgMzkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICggLSAgNDAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICkgLSAgNDEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICogLSAgNDIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiArIC0gIDQzICovCiAgQzJfQ09NTU9OU0VQQVJBVE9SLCAvKiAsIC0gIDQ0ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogLSAtICA0NSAqLwogIEMyX0VVUk9QRVNFUEFSQVRPUiwgLyogLiAtICA0NiAqLwogIEMyX0VVUk9QRVNFUEFSQVRPUiwgLyogLyAtICA0NyAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogMCAtICA0OCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogMSAtICA0OSAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogMiAtICA1MCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogMyAtICA1MSAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogNCAtICA1MiAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogNSAtICA1MyAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogNiAtICA1NCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogNyAtICA1NSAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogOCAtICA1NiAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogOSAtICA1NyAqLwogIEMyX0NPTU1PTlNFUEFSQVRPUiwgLyogOiAtICA1OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogOyAtICA1OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogPCAtICA2MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogPSAtICA2MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogPiAtICA2MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogPyAtICA2MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBAIC0gIDY0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEEgLSAgNjUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQiAtICA2NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBDIC0gIDY3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEQgLSAgNjggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRSAtICA2OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBGIC0gIDcwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEcgLSAgNzEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSCAtICA3MiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBJIC0gIDczICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEogLSAgNzQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSyAtICA3NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBMIC0gIDc2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIE0gLSAgNzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTiAtICA3OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBPIC0gIDc5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFAgLSAgODAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUSAtICA4MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBSIC0gIDgyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFMgLSAgODMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogVCAtICA4NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBVIC0gIDg1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFYgLSAgODYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogVyAtICA4NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBYIC0gIDg4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFkgLSAgODkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogWiAtICA5MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogWyAtICA5MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogXCAtICA5MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogXSAtICA5MyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogXiAtICA5NCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogXyAtICA5NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogYCAtICA5NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBhIC0gIDk3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGIgLSAgOTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogYyAtICA5OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBkIC0gMTAwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGUgLSAxMDEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZiAtIDEwMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBnIC0gMTAzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGggLSAxMDQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogaSAtIDEwNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBqIC0gMTA2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGsgLSAxMDcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbCAtIDEwOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBtIC0gMTA5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIG4gLSAxMTAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbyAtIDExMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBwIC0gMTEyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHEgLSAxMTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogciAtIDExNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBzIC0gMTE1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHQgLSAxMTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdSAtIDExNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB2IC0gMTE4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHcgLSAxMTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogeCAtIDEyMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB5IC0gMTIxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHogLSAxMjIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIHsgLSAxMjMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIHwgLSAxMjQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIH0gLSAxMjUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIH4gLSAxMjYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiB/IC0gMTI3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyoggCAtIDEyOCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIIEgLSAxMjkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIIgLSAxMzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyoggyAtIDEzMSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoghCAtIDEzMiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoghSAtIDEzMyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoghiAtIDEzNCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoghyAtIDEzNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCIIC0gMTM2ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogiSAtIDEzNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCKIC0gMTM4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCLIC0gMTM5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIwgLSAxNDAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCNIC0gMTQxICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogjiAtIDE0MiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qII8gLSAxNDMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCQIC0gMTQ0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCRIC0gMTQ1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCSIC0gMTQ2ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCTIC0gMTQ3ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCUIC0gMTQ4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCVIC0gMTQ5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCWIC0gMTUwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCXIC0gMTUxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJggLSAxNTIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJkgLSAxNTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogmiAtIDE1NCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogmyAtIDE1NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCcIC0gMTU2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyognSAtIDE1NyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIJ4gLSAxNTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyognyAtIDE1OSAqLwogIEMyX1dISVRFU1BBQ0UsIC8qIKAgLSAxNjAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKEgLSAxNjEgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCiIC0gMTYyICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogoyAtIDE2MyAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKQgLSAxNjQgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiClIC0gMTY1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCmIC0gMTY2ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCnIC0gMTY3ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCoIC0gMTY4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCpIC0gMTY5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCqIC0gMTcwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCrIC0gMTcxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCsIC0gMTcyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCtIC0gMTczICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCuIC0gMTc0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCvIC0gMTc1ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogsCAtIDE3NiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qILEgLSAxNzcgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qILIgLSAxNzggKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qILMgLSAxNzkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILQgLSAxODAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILUgLSAxODEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILYgLSAxODIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILcgLSAxODMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILggLSAxODQgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qILkgLSAxODUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILogLSAxODYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILsgLSAxODcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILwgLSAxODggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIL0gLSAxODkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIL4gLSAxOTAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIL8gLSAxOTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwCAtIDE5MiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDBIC0gMTkzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMIgLSAxOTQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwyAtIDE5NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDEIC0gMTk2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMUgLSAxOTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxiAtIDE5OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDHIC0gMTk5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMggLSAyMDAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogySAtIDIwMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDKIC0gMjAyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMsgLSAyMDMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogzCAtIDIwNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDNIC0gMjA1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIM4gLSAyMDYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogzyAtIDIwNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDQIC0gMjA4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINEgLSAyMDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0iAtIDIxMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDTIC0gMjExICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINQgLSAyMTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog1SAtIDIxMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDWIC0gMjE0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiDXIC0gMjE1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINggLSAyMTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2SAtIDIxNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDaIC0gMjE4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINsgLSAyMTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3CAtIDIyMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDdIC0gMjIxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIN4gLSAyMjIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3yAtIDIyMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDgIC0gMjI0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOEgLSAyMjUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4iAtIDIyNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDjIC0gMjI3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOQgLSAyMjggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5SAtIDIyOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDmIC0gMjMwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOcgLSAyMzEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6CAtIDIzMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDpIC0gMjMzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOogLSAyMzQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6yAtIDIzNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDsIC0gMjM2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIO0gLSAyMzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7iAtIDIzOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDvIC0gMjM5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPAgLSAyNDAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8SAtIDI0MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDyIC0gMjQyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPMgLSAyNDMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog9CAtIDI0NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD1IC0gMjQ1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPYgLSAyNDYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIPcgLSAyNDcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+CAtIDI0OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD5IC0gMjQ5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPogLSAyNTAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+yAtIDI1MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD8IC0gMjUyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIP0gLSAyNTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog/iAtIDI1NCAqLwogIEMyX0xFRlRUT1JJR0hUIC8qIP8gLSAyNTUgKi8KfTsKCmNvbnN0IFdPUkQgT0xFMk5MU19DVF9DVHlwZTNfTFVUW10gPSB7IAogIDB4MDAwMCwgLyogICAtICAgMCAqLwogIDB4MDAwMCwgLyogICAtICAgMSAqLwogIDB4MDAwMCwgLyogICAtICAgMiAqLwogIDB4MDAwMCwgLyogICAtICAgMyAqLwogIDB4MDAwMCwgLyogICAtICAgNCAqLwogIDB4MDAwMCwgLyogICAtICAgNSAqLwogIDB4MDAwMCwgLyogICAtICAgNiAqLwogIDB4MDAwMCwgLyogICAtICAgNyAqLwogIDB4MDAwMCwgLyogICAtICAgOCAqLwogIDB4MDAwOCwgLyogICAtICAgOSAqLwogIDB4MDAwOCwgLyogICAtICAxMCAqLwogIDB4MDAwOCwgLyogICAtICAxMSAqLwogIDB4MDAwOCwgLyogICAtICAxMiAqLwogIDB4MDAwOCwgLyogICAtICAxMyAqLwogIDB4MDAwMCwgLyogICAtICAxNCAqLwogIDB4MDAwMCwgLyogICAtICAxNSAqLwogIDB4MDAwMCwgLyogICAtICAxNiAqLwogIDB4MDAwMCwgLyogICAtICAxNyAqLwogIDB4MDAwMCwgLyogICAtICAxOCAqLwogIDB4MDAwMCwgLyogICAtICAxOSAqLwogIDB4MDAwMCwgLyogICAtICAyMCAqLwogIDB4MDAwMCwgLyogICAtICAyMSAqLwogIDB4MDAwMCwgLyogICAtICAyMiAqLwogIDB4MDAwMCwgLyogICAtICAyMyAqLwogIDB4MDAwMCwgLyogICAtICAyNCAqLwogIDB4MDAwMCwgLyogICAtICAyNSAqLwogIDB4MDAwMCwgLyogICAtICAyNiAqLwogIDB4MDAwMCwgLyogICAtICAyNyAqLwogIDB4MDAwMCwgLyogICAtICAyOCAqLwogIDB4MDAwMCwgLyogICAtICAyOSAqLwogIDB4MDAwMCwgLyogICAtICAzMCAqLwogIDB4MDAwMCwgLyogICAtICAzMSAqLwogIDB4MDA0OCwgLyogICAtICAzMiAqLwogIDB4MDA0OCwgLyogISAtICAzMyAqLwogIDB4MDQ0OCwgLyogIiAtICAzNCAqLyAvKiAiICovCiAgMHgwMDQ4LCAvKiAjIC0gIDM1ICovCiAgMHgwNDQ4LCAvKiAkIC0gIDM2ICovCiAgMHgwMDQ4LCAvKiAlIC0gIDM3ICovCiAgMHgwMDQ4LCAvKiAmIC0gIDM4ICovCiAgMHgwNDQwLCAvKiAnIC0gIDM5ICovCiAgMHgwMDQ4LCAvKiAoIC0gIDQwICovCiAgMHgwMDQ4LCAvKiApIC0gIDQxICovCiAgMHgwMDQ4LCAvKiAqIC0gIDQyICovCiAgMHgwMDQ4LCAvKiArIC0gIDQzICovCiAgMHgwMDQ4LCAvKiAsIC0gIDQ0ICovCiAgMHgwNDQwLCAvKiAtIC0gIDQ1ICovCiAgMHgwMDQ4LCAvKiAuIC0gIDQ2ICovCiAgMHgwNDQ4LCAvKiAvIC0gIDQ3ICovCiAgMHgwMDQwLCAvKiAwIC0gIDQ4ICovCiAgMHgwMDQwLCAvKiAxIC0gIDQ5ICovCiAgMHgwMDQwLCAvKiAyIC0gIDUwICovCiAgMHgwMDQwLCAvKiAzIC0gIDUxICovCiAgMHgwMDQwLCAvKiA0IC0gIDUyICovCiAgMHgwMDQwLCAvKiA1IC0gIDUzICovCiAgMHgwMDQwLCAvKiA2IC0gIDU0ICovCiAgMHgwMDQwLCAvKiA3IC0gIDU1ICovCiAgMHgwMDQwLCAvKiA4IC0gIDU2ICovCiAgMHgwMDQwLCAvKiA5IC0gIDU3ICovCiAgMHgwMDQ4LCAvKiA6IC0gIDU4ICovCiAgMHgwMDQ4LCAvKiA7IC0gIDU5ICovCiAgMHgwMDQ4LCAvKiA8IC0gIDYwICovCiAgMHgwNDQ4LCAvKiA9IC0gIDYxICovCiAgMHgwMDQ4LCAvKiA+IC0gIDYyICovCiAgMHgwMDQ4LCAvKiA/IC0gIDYzICovCiAgMHgwNDQ4LCAvKiBAIC0gIDY0ICovCiAgMHg4MDQwLCAvKiBBIC0gIDY1ICovCiAgMHg4MDQwLCAvKiBCIC0gIDY2ICovCiAgMHg4MDQwLCAvKiBDIC0gIDY3ICovCiAgMHg4MDQwLCAvKiBEIC0gIDY4ICovCiAgMHg4MDQwLCAvKiBFIC0gIDY5ICovCiAgMHg4MDQwLCAvKiBGIC0gIDcwICovCiAgMHg4MDQwLCAvKiBHIC0gIDcxICovCiAgMHg4MDQwLCAvKiBIIC0gIDcyICovCiAgMHg4MDQwLCAvKiBJIC0gIDczICovCiAgMHg4MDQwLCAvKiBKIC0gIDc0ICovCiAgMHg4MDQwLCAvKiBLIC0gIDc1ICovCiAgMHg4MDQwLCAvKiBMIC0gIDc2ICovCiAgMHg4MDQwLCAvKiBNIC0gIDc3ICovCiAgMHg4MDQwLCAvKiBOIC0gIDc4ICovCiAgMHg4MDQwLCAvKiBPIC0gIDc5ICovCiAgMHg4MDQwLCAvKiBQIC0gIDgwICovCiAgMHg4MDQwLCAvKiBRIC0gIDgxICovCiAgMHg4MDQwLCAvKiBSIC0gIDgyICovCiAgMHg4MDQwLCAvKiBTIC0gIDgzICovCiAgMHg4MDQwLCAvKiBUIC0gIDg0ICovCiAgMHg4MDQwLCAvKiBVIC0gIDg1ICovCiAgMHg4MDQwLCAvKiBWIC0gIDg2ICovCiAgMHg4MDQwLCAvKiBXIC0gIDg3ICovCiAgMHg4MDQwLCAvKiBYIC0gIDg4ICovCiAgMHg4MDQwLCAvKiBZIC0gIDg5ICovCiAgMHg4MDQwLCAvKiBaIC0gIDkwICovCiAgMHgwMDQ4LCAvKiBbIC0gIDkxICovCiAgMHgwNDQ4LCAvKiBcIC0gIDkyICovCiAgMHgwMDQ4LCAvKiBdIC0gIDkzICovCiAgMHgwNDQ4LCAvKiBeIC0gIDk0ICovCiAgMHgwNDQ4LCAvKiBfIC0gIDk1ICovCiAgMHgwNDQ4LCAvKiBgIC0gIDk2ICovCiAgMHg4MDQwLCAvKiBhIC0gIDk3ICovCiAgMHg4MDQwLCAvKiBiIC0gIDk4ICovCiAgMHg4MDQwLCAvKiBjIC0gIDk5ICovCiAgMHg4MDQwLCAvKiBkIC0gMTAwICovCiAgMHg4MDQwLCAvKiBlIC0gMTAxICovCiAgMHg4MDQwLCAvKiBmIC0gMTAyICovCiAgMHg4MDQwLCAvKiBnIC0gMTAzICovCiAgMHg4MDQwLCAvKiBoIC0gMTA0ICovCiAgMHg4MDQwLCAvKiBpIC0gMTA1ICovCiAgMHg4MDQwLCAvKiBqIC0gMTA2ICovCiAgMHg4MDQwLCAvKiBrIC0gMTA3ICovCiAgMHg4MDQwLCAvKiBsIC0gMTA4ICovCiAgMHg4MDQwLCAvKiBtIC0gMTA5ICovCiAgMHg4MDQwLCAvKiBuIC0gMTEwICovCiAgMHg4MDQwLCAvKiBvIC0gMTExICovCiAgMHg4MDQwLCAvKiBwIC0gMTEyICovCiAgMHg4MDQwLCAvKiBxIC0gMTEzICovCiAgMHg4MDQwLCAvKiByIC0gMTE0ICovCiAgMHg4MDQwLCAvKiBzIC0gMTE1ICovCiAgMHg4MDQwLCAvKiB0IC0gMTE2ICovCiAgMHg4MDQwLCAvKiB1IC0gMTE3ICovCiAgMHg4MDQwLCAvKiB2IC0gMTE4ICovCiAgMHg4MDQwLCAvKiB3IC0gMTE5ICovCiAgMHg4MDQwLCAvKiB4IC0gMTIwICovCiAgMHg4MDQwLCAvKiB5IC0gMTIxICovCiAgMHg4MDQwLCAvKiB6IC0gMTIyICovCiAgMHgwMDQ4LCAvKiB7IC0gMTIzICovCiAgMHgwMDQ4LCAvKiB8IC0gMTI0ICovCiAgMHgwMDQ4LCAvKiB9IC0gMTI1ICovCiAgMHgwNDQ4LCAvKiB+IC0gMTI2ICovCiAgMHgwMDAwLCAvKiB/IC0gMTI3ICovCiAgMHgwMDAwLCAvKiCAIC0gMTI4ICovCiAgMHgwMDAwLCAvKiCBIC0gMTI5ICovCiAgMHgwMDA4LCAvKiCCIC0gMTMwICovCiAgMHg4MDAwLCAvKiCDIC0gMTMxICovCiAgMHgwMDA4LCAvKiCEIC0gMTMyICovCiAgMHgwMDA4LCAvKiCFIC0gMTMzICovCiAgMHgwMDA4LCAvKiCGIC0gMTM0ICovCiAgMHgwMDA4LCAvKiCHIC0gMTM1ICovCiAgMHgwMDAxLCAvKiCIIC0gMTM2ICovCiAgMHgwMDA4LCAvKiCJIC0gMTM3ICovCiAgMHg4MDAzLCAvKiCKIC0gMTM4ICovCiAgMHgwMDA4LCAvKiCLIC0gMTM5ICovCiAgMHg4MDAwLCAvKiCMIC0gMTQwICovCiAgMHgwMDAwLCAvKiCNIC0gMTQxICovCiAgMHgwMDAwLCAvKiCOIC0gMTQyICovCiAgMHgwMDAwLCAvKiCPIC0gMTQzICovCiAgMHgwMDAwLCAvKiCQIC0gMTQ0ICovCiAgMHgwMDg4LCAvKiCRIC0gMTQ1ICovCiAgMHgwMDg4LCAvKiCSIC0gMTQ2ICovCiAgMHgwMDg4LCAvKiCTIC0gMTQ3ICovCiAgMHgwMDg4LCAvKiCUIC0gMTQ4ICovCiAgMHgwMDA4LCAvKiCVIC0gMTQ5ICovCiAgMHgwNDAwLCAvKiCWIC0gMTUwICovCiAgMHgwNDAwLCAvKiCXIC0gMTUxICovCiAgMHgwNDA4LCAvKiCYIC0gMTUyICovCiAgMHgwMDAwLCAvKiCZIC0gMTUzICovCiAgMHg4MDAzLCAvKiCaIC0gMTU0ICovCiAgMHgwMDA4LCAvKiCbIC0gMTU1ICovCiAgMHg4MDAwLCAvKiCcIC0gMTU2ICovCiAgMHgwMDAwLCAvKiCdIC0gMTU3ICovCiAgMHgwMDAwLCAvKiCeIC0gMTU4ICovCiAgMHg4MDAzLCAvKiCfIC0gMTU5ICovCiAgMHgwMDA4LCAvKiCgIC0gMTYwICovCiAgMHgwMDA4LCAvKiChIC0gMTYxICovCiAgMHgwMDQ4LCAvKiCiIC0gMTYyICovCiAgMHgwMDQ4LCAvKiCjIC0gMTYzICovCiAgMHgwMDA4LCAvKiCkIC0gMTY0ICovCiAgMHgwMDQ4LCAvKiClIC0gMTY1ICovCiAgMHgwMDQ4LCAvKiCmIC0gMTY2ICovCiAgMHgwMDA4LCAvKiCnIC0gMTY3ICovCiAgMHgwNDA4LCAvKiCoIC0gMTY4ICovCiAgMHgwMDA4LCAvKiCpIC0gMTY5ICovCiAgMHgwNDAwLCAvKiCqIC0gMTcwICovCiAgMHgwMDA4LCAvKiCrIC0gMTcxICovCiAgMHgwMDQ4LCAvKiCsIC0gMTcyICovCiAgMHgwNDA4LCAvKiCtIC0gMTczICovCiAgMHgwMDA4LCAvKiCuIC0gMTc0ICovCiAgMHgwNDQ4LCAvKiCvIC0gMTc1ICovCiAgMHgwMDA4LCAvKiCwIC0gMTc2ICovCiAgMHgwMDA4LCAvKiCxIC0gMTc3ICovCiAgMHgwMDAwLCAvKiCyIC0gMTc4ICovCiAgMHgwMDAwLCAvKiCzIC0gMTc5ICovCiAgMHgwNDA4LCAvKiC0IC0gMTgwICovCiAgMHgwMDA4LCAvKiC1IC0gMTgxICovCiAgMHgwMDA4LCAvKiC2IC0gMTgyICovCiAgMHgwMDA4LCAvKiC3IC0gMTgzICovCiAgMHgwNDA4LCAvKiC4IC0gMTg0ICovCiAgMHgwMDAwLCAvKiC5IC0gMTg1ICovCiAgMHgwNDAwLCAvKiC6IC0gMTg2ICovCiAgMHgwMDA4LCAvKiC7IC0gMTg3ICovCiAgMHgwMDAwLCAvKiC8IC0gMTg4ICovCiAgMHgwMDAwLCAvKiC9IC0gMTg5ICovCiAgMHgwMDAwLCAvKiC+IC0gMTkwICovCiAgMHgwMDA4LCAvKiC/IC0gMTkxICovCiAgMHg4MDAzLCAvKiDAIC0gMTkyICovCiAgMHg4MDAzLCAvKiDBIC0gMTkzICovCiAgMHg4MDAzLCAvKiDCIC0gMTk0ICovCiAgMHg4MDAzLCAvKiDDIC0gMTk1ICovCiAgMHg4MDAzLCAvKiDEIC0gMTk2ICovCiAgMHg4MDAzLCAvKiDFIC0gMTk3ICovCiAgMHg4MDAwLCAvKiDGIC0gMTk4ICovCiAgMHg4MDAzLCAvKiDHIC0gMTk5ICovCiAgMHg4MDAzLCAvKiDIIC0gMjAwICovCiAgMHg4MDAzLCAvKiDJIC0gMjAxICovCiAgMHg4MDAzLCAvKiDKIC0gMjAyICovCiAgMHg4MDAzLCAvKiDLIC0gMjAzICovCiAgMHg4MDAzLCAvKiDMIC0gMjA0ICovCiAgMHg4MDAzLCAvKiDNIC0gMjA1ICovCiAgMHg4MDAzLCAvKiDOIC0gMjA2ICovCiAgMHg4MDAzLCAvKiDPIC0gMjA3ICovCiAgMHg4MDAwLCAvKiDQIC0gMjA4ICovCiAgMHg4MDAzLCAvKiDRIC0gMjA5ICovCiAgMHg4MDAzLCAvKiDSIC0gMjEwICovCiAgMHg4MDAzLCAvKiDTIC0gMjExICovCiAgMHg4MDAzLCAvKiDUIC0gMjEyICovCiAgMHg4MDAzLCAvKiDVIC0gMjEzICovCiAgMHg4MDAzLCAvKiDWIC0gMjE0ICovCiAgMHgwMDA4LCAvKiDXIC0gMjE1ICovCiAgMHg4MDAzLCAvKiDYIC0gMjE2ICovCiAgMHg4MDAzLCAvKiDZIC0gMjE3ICovCiAgMHg4MDAzLCAvKiDaIC0gMjE4ICovCiAgMHg4MDAzLCAvKiDbIC0gMjE5ICovCiAgMHg4MDAzLCAvKiDcIC0gMjIwICovCiAgMHg4MDAzLCAvKiDdIC0gMjIxICovCiAgMHg4MDAwLCAvKiDeIC0gMjIyICovCiAgMHg4MDAwLCAvKiDfIC0gMjIzICovCiAgMHg4MDAzLCAvKiDgIC0gMjI0ICovCiAgMHg4MDAzLCAvKiDhIC0gMjI1ICovCiAgMHg4MDAzLCAvKiDiIC0gMjI2ICovCiAgMHg4MDAzLCAvKiDjIC0gMjI3ICovCiAgMHg4MDAzLCAvKiDkIC0gMjI4ICovCiAgMHg4MDAzLCAvKiDlIC0gMjI5ICovCiAgMHg4MDAwLCAvKiDmIC0gMjMwICovCiAgMHg4MDAzLCAvKiDnIC0gMjMxICovCiAgMHg4MDAzLCAvKiDoIC0gMjMyICovCiAgMHg4MDAzLCAvKiDpIC0gMjMzICovCiAgMHg4MDAzLCAvKiDqIC0gMjM0ICovCiAgMHg4MDAzLCAvKiDrIC0gMjM1ICovCiAgMHg4MDAzLCAvKiDsIC0gMjM2ICovCiAgMHg4MDAzLCAvKiDtIC0gMjM3ICovCiAgMHg4MDAzLCAvKiDuIC0gMjM4ICovCiAgMHg4MDAzLCAvKiDvIC0gMjM5ICovCiAgMHg4MDAwLCAvKiDwIC0gMjQwICovCiAgMHg4MDAzLCAvKiDxIC0gMjQxICovCiAgMHg4MDAzLCAvKiDyIC0gMjQyICovCiAgMHg4MDAzLCAvKiDzIC0gMjQzICovCiAgMHg4MDAzLCAvKiD0IC0gMjQ0ICovCiAgMHg4MDAzLCAvKiD1IC0gMjQ1ICovCiAgMHg4MDAzLCAvKiD2IC0gMjQ2ICovCiAgMHgwMDA4LCAvKiD3IC0gMjQ3ICovCiAgMHg4MDAzLCAvKiD4IC0gMjQ4ICovCiAgMHg4MDAzLCAvKiD5IC0gMjQ5ICovCiAgMHg4MDAzLCAvKiD6IC0gMjUwICovCiAgMHg4MDAzLCAvKiD7IC0gMjUxICovCiAgMHg4MDAzLCAvKiD8IC0gMjUyICovCiAgMHg4MDAzLCAvKiD9IC0gMjUzICovCiAgMHg4MDAwLCAvKiD+IC0gMjU0ICovCiAgMHg4MDAzICAvKiD/IC0gMjU1ICovCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRTdHJpbmdUeXBlQQlbS0VSTkVMMzIuMzk2XQogKi8KQk9PTCBXSU5BUEkgR2V0U3RyaW5nVHlwZUEoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXhBKGxvY2FsZSxkd0luZm9UeXBlLHNyYyxjY2hTcmMsY2hhcnR5cGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRTdHJpbmdUeXBlRXhBCVtLRVJORUwzMi4zOTddCiAqCiAqIEZJWE1FOiBJZ25vcmVzIHRoZSBsb2NhbGUuCiAqLwpCT09MIFdJTkFQSSBHZXRTdHJpbmdUeXBlRXhBKExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCWludAlpOwoJCglpZiAoKHNyYz09TlVMTCkgfHwgKGNoYXJ0eXBlPT1OVUxMKSB8fCAoc3JjPT0oTFBTVFIpY2hhcnR5cGUpKQoJewoJICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJICByZXR1cm4gRkFMU0U7Cgl9CgoJaWYgKGNjaFNyYz09LTEpCgkgIGNjaFNyYz1sc3RybGVuQShzcmMpKzE7CgkgIAoJc3dpdGNoIChkd0luZm9UeXBlKSB7CgljYXNlIENUX0NUWVBFMToKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldID0gMDsKCSAgICBpZiAoaXNkaWdpdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfRElHSVQ7CgkgICAgaWYgKGlzYWxwaGEoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0FMUEhBOwoJICAgIGlmIChpc2xvd2VyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9MT1dFUjsKCSAgICBpZiAoaXN1cHBlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfVVBQRVI7CgkgICAgaWYgKGlzc3BhY2Uoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1NQQUNFOwoJICAgIGlmIChpc3B1bmN0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9QVU5DVDsKCSAgICBpZiAoaXNjbnRybChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQ05UUkw7Ci8qIEZJWE1FOiBpc2JsYW5rKCkgaXMgYSBHTlUgZXh0ZW5zaW9uICovCi8qCQlpZiAoaXNibGFuayhzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7ICovCgkgICAgaWYgKChzcmNbaV0gPT0gJyAnKSB8fCAoc3JjW2ldID09ICdcdCcpKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7CgkgICAgLyogQzFfWERJR0lUICovCgl9CglyZXR1cm4gVFJVRTsKCgljYXNlIENUX0NUWVBFMjoKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldPShXT1JEKUNUX0NUeXBlMl9MVVRbaV07CgkgIH0KCSAgcmV0dXJuIFRSVUU7CgoJY2FzZSBDVF9DVFlQRTM6CgkgIGZvciAoaT0wO2k8Y2NoU3JjO2krKykgCgkgIHsKCSAgICBjaGFydHlwZVtpXT1PTEUyTkxTX0NUX0NUeXBlM19MVVRbaV07CgkgIH0KCSAgcmV0dXJuIFRSVUU7CgoJZGVmYXVsdDoKCSAgRVJSKCJVbmtub3duIGR3SW5mb1R5cGU6JWxkXG4iLGR3SW5mb1R5cGUpOwoJICByZXR1cm4gRkFMU0U7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGVXCVtLRVJORUwzMi4zOTldCiAqCiAqIE5PVEVTCiAqIFllcywgdGhpcyBpcyBtaXNzaW5nIExDSUQgbG9jYWxlLiBNUyBmYXVsdC4KICovCkJPT0wgV0lOQVBJIEdldFN0cmluZ1R5cGVXKERXT1JEIGR3SW5mb1R5cGUsTFBDV1NUUiBzcmMsSU5UIGNjaFNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV09SRCBjaGFydHlwZSkKewoJcmV0dXJuIEdldFN0cmluZ1R5cGVFeFcoMC8qZGVmYXVsdGxvY2FsZSovLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGVFeFcJW0tFUk5FTDMyLjM5OF0KICoKICogRklYTUU6IHVuaWNvZGUgY2hhcnMgYXJlIGFzc3VtZWQgY2hhcnMKICovCkJPT0wgV0lOQVBJIEdldFN0cmluZ1R5cGVFeFcoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENXU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCWludAlpOwoKCglpZiAoY2NoU3JjPT0tMSkKCSAgY2NoU3JjPWxzdHJsZW5XKHNyYykrMTsKCQoJc3dpdGNoIChkd0luZm9UeXBlKSB7CgljYXNlIENUX0NUWVBFMjoKCQlGSVhNRSgiQ1RfQ1RZUEUyIG5vdCBzdXBwb3J0ZWQuXG4iKTsKCQlyZXR1cm4gRkFMU0U7CgljYXNlIENUX0NUWVBFMzoKCQlGSVhNRSgiQ1RfQ1RZUEUzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKCQlyZXR1cm4gRkFMU0U7CglkZWZhdWx0OmJyZWFrOwoJfQoJZm9yIChpPTA7aTxjY2hTcmM7aSsrKSB7CgkJY2hhcnR5cGVbaV0gPSAwOwoJCWlmIChpc2RpZ2l0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9ESUdJVDsKCQlpZiAoaXNhbHBoYShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQUxQSEE7CgkJaWYgKGlzbG93ZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0xPV0VSOwoJCWlmIChpc3VwcGVyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9VUFBFUjsKCQlpZiAoaXNzcGFjZShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfU1BBQ0U7CgkJaWYgKGlzcHVuY3Qoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1BVTkNUOwoJCWlmIChpc2NudHJsKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9DTlRSTDsKLyogRklYTUU6IGlzYmxhbmsoKSBpcyBhIEdOVSBleHRlbnNpb24gKi8KLyoJCWlmIChpc2JsYW5rKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9CTEFOSzsgKi8KICAgICAgICAgICAgICAgIGlmICgoc3JjW2ldID09ICcgJykgfHwgKHNyY1tpXSA9PSAnXHQnKSkgY2hhcnR5cGVbaV18PUMxX0JMQU5LOwoJCS8qIEMxX1hESUdJVCAqLwoJfQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBXSU5FX0dldExhbmd1YWdlTmFtZSAgIFtpbnRlcm5hbF0gCiAqLwpzdGF0aWMgTFBDU1RSIFdJTkVfR2V0TGFuZ3VhZ2VOYW1lKCBVSU5UIGxhbmdpZCApCnsKICAgIGludCBpOwogICAgZm9yICggaSA9IDA7IGxhbmd1YWdlc1tpXS5sYW5naWQgIT0gMDsgaSsrICkKICAgICAgICBpZiAoIGxhbmdpZCA9PSBsYW5ndWFnZXNbaV0ubGFuZ2lkICkKICAgICAgICAgICAgYnJlYWs7CgogICAgcmV0dXJuIGxhbmd1YWdlc1tpXS5sYW5nbmFtZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBWZXJMYW5ndWFnZU5hbWVBICAgICAgICAgICAgICBbS0VSTkVMMzIuNzA5XVtWRVJTSU9OLjldCiAqLwpEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lQSggVUlOVCB3TGFuZywgTFBTVFIgc3pMYW5nLCBVSU5UIG5TaXplICkKewogICAgY2hhciAgICBidWZmZXJbODBdOwogICAgTFBDU1RSICBuYW1lOwogICAgRFdPUkQgICByZXN1bHQ7CgogICAgLyoKICAgICAqIEZpcnN0LCBjaGVjayBcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XGNvbnRyb2xcTmxzXExvY2FsZVw8bGFuZ2lkPgogICAgICogZnJvbSB0aGUgcmVnaXN0cnkuCiAgICAgKi8KCiAgICBzcHJpbnRmKCBidWZmZXIsCiAgICAgICAgICAgICAiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcJTA4eCIsCiAgICAgICAgICAgICB3TGFuZyApOwoKICAgIHJlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWVBKCBIS0VZX0xPQ0FMX01BQ0hJTkUsIGJ1ZmZlciwgc3pMYW5nLCAoTFBEV09SRCkmblNpemUgKTsKICAgIGlmICggcmVzdWx0ID09IEVSUk9SX1NVQ0NFU1MgfHwgcmVzdWx0ID09IEVSUk9SX01PUkVfREFUQSApCiAgICAgICAgcmV0dXJuIG5TaXplOwoKICAgIC8qCiAgICAgKiBJZiB0aGF0IGZhaWxzLCB1c2UgdGhlIGludGVybmFsIHRhYmxlCiAgICAgKi8KCiAgICBuYW1lID0gV0lORV9HZXRMYW5ndWFnZU5hbWUoIHdMYW5nICk7CiAgICBsc3RyY3B5bkEoIHN6TGFuZywgbmFtZSwgblNpemUgKTsKICAgIHJldHVybiBsc3RybGVuQSggbmFtZSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFZlckxhbmd1YWdlTmFtZVcgICAgICAgICAgICAgIFtLRVJORUwzMi43MTBdW1ZFUlNJT04uMTBdCiAqLwpEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lVyggVUlOVCB3TGFuZywgTFBXU1RSIHN6TGFuZywgVUlOVCBuU2l6ZSApCnsKICAgIGNoYXIgICAgYnVmZmVyWzgwXTsKICAgIExQV1NUUiAga2V5bmFtZTsKICAgIExQQ1NUUiAgbmFtZTsKICAgIERXT1JEICAgcmVzdWx0OwoKICAgIC8qCiAgICAgKiBGaXJzdCwgY2hlY2sgXFN5c3RlbVxDdXJyZW50Q29udHJvbFNldFxjb250cm9sXE5sc1xMb2NhbGVcPGxhbmdpZD4KICAgICAqIGZyb20gdGhlIHJlZ2lzdHJ5LgogICAgICovCgogICAgc3ByaW50ZiggYnVmZmVyLAogICAgICAgICAgICAgIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCUwOHgiLAogICAgICAgICAgICAgd0xhbmcgKTsKCiAgICBrZXluYW1lID0gSEVBUF9zdHJkdXBBdG9XKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWZmZXIgKTsKICAgIHJlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWVXKCBIS0VZX0xPQ0FMX01BQ0hJTkUsIGtleW5hbWUsIHN6TGFuZywgKExQRFdPUkQpJm5TaXplICk7CiAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwga2V5bmFtZSApOwoKICAgIGlmICggcmVzdWx0ID09IEVSUk9SX1NVQ0NFU1MgfHwgcmVzdWx0ID09IEVSUk9SX01PUkVfREFUQSApCiAgICAgICAgcmV0dXJuIG5TaXplOwoKICAgIC8qCiAgICAgKiBJZiB0aGF0IGZhaWxzLCB1c2UgdGhlIGludGVybmFsIHRhYmxlCiAgICAgKi8KCiAgICBuYW1lID0gV0lORV9HZXRMYW5ndWFnZU5hbWUoIHdMYW5nICk7CiAgICBsc3RyY3B5bkF0b1coIHN6TGFuZywgbmFtZSwgblNpemUgKTsKICAgIHJldHVybiBsc3RybGVuQSggbmFtZSApOwp9CgogCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVFtdID0gewogIDYgICAgICAsICAgMywgLyogICAtICAgMSAqLyAgCiAgNiAgICAgICwgICA0LCAvKiAgIC0gICAyICovICAKICA2ICAgICAgLCAgIDUsIC8qICAgLSAgIDMgKi8gIAogIDYgICAgICAsICAgNiwgLyogICAtICAgNCAqLyAgCiAgNiAgICAgICwgICA3LCAvKiAgIC0gICA1ICovICAKICA2ICAgICAgLCAgIDgsIC8qICAgLSAgIDYgKi8gIAogIDYgICAgICAsICAgOSwgLyogICAtICAgNyAqLyAgCiAgNiAgICAgICwgIDEwLCAvKiAgIC0gICA4ICovICAKICA3ICAgICAgLCAgIDUsIC8qICAgLSAgIDkgKi8gIAogIDcgICAgICAsICAgNiwgLyogICAtICAxMCAqLyAgCiAgNyAgICAgICwgICA3LCAvKiAgIC0gIDExICovICAKICA3ICAgICAgLCAgIDgsIC8qICAgLSAgMTIgKi8gIAogIDcgICAgICAsICAgOSwgLyogICAtICAxMyAqLyAgCiAgNiAgICAgICwgIDExLCAvKiAgIC0gIDE0ICovICAKICA2ICAgICAgLCAgMTIsIC8qICAgLSAgMTUgKi8gIAogIDYgICAgICAsICAxMywgLyogICAtICAxNiAqLyAgCiAgNiAgICAgICwgIDE0LCAvKiAgIC0gIDE3ICovICAKICA2ICAgICAgLCAgMTUsIC8qICAgLSAgMTggKi8gIAogIDYgICAgICAsICAxNiwgLyogICAtICAxOSAqLyAgCiAgNiAgICAgICwgIDE3LCAvKiAgIC0gIDIwICovICAKICA2ICAgICAgLCAgMTgsIC8qICAgLSAgMjEgKi8gIAogIDYgICAgICAsICAxOSwgLyogICAtICAyMiAqLyAgCiAgNiAgICAgICwgIDIwLCAvKiAgIC0gIDIzICovICAKICA2ICAgICAgLCAgMjEsIC8qICAgLSAgMjQgKi8gIAogIDYgICAgICAsICAyMiwgLyogICAtICAyNSAqLyAgCiAgNiAgICAgICwgIDIzLCAvKiAgIC0gIDI2ICovICAKICA2ICAgICAgLCAgMjQsIC8qICAgLSAgMjcgKi8gIAogIDYgICAgICAsICAyNSwgLyogICAtICAyOCAqLyAgCiAgNiAgICAgICwgIDI2LCAvKiAgIC0gIDI5ICovICAKICA2ICAgICAgLCAgMjcsIC8qICAgLSAgMzAgKi8gIAogIDYgICAgICAsICAyOCwgLyogICAtICAzMSAqLyAgCiAgNyAgICAgICwgICAyLCAvKiAgIC0gIDMyICovCiAgNyAgICAgICwgIDI4LCAvKiAhIC0gIDMzICovCiAgNyAgICAgICwgIDI5LCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICA3ICAgICAgLCAgMzEsIC8qICMgLSAgMzUgKi8KICA3ICAgICAgLCAgMzMsIC8qICQgLSAgMzYgKi8KICA3ICAgICAgLCAgMzUsIC8qICUgLSAgMzcgKi8KICA3ICAgICAgLCAgMzcsIC8qICYgLSAgMzggKi8KICA2ICAgICAgLCAxMjgsIC8qICcgLSAgMzkgKi8KICA3ICAgICAgLCAgMzksIC8qICggLSAgNDAgKi8KICA3ICAgICAgLCAgNDIsIC8qICkgLSAgNDEgKi8KICA3ICAgICAgLCAgNDUsIC8qICogLSAgNDIgKi8KICA4ICAgICAgLCAgIDMsIC8qICsgLSAgNDMgKi8KICA3ICAgICAgLCAgNDcsIC8qICwgLSAgNDQgKi8KICA2ICAgICAgLCAxMzAsIC8qIC0gLSAgNDUgKi8KICA3ICAgICAgLCAgNTEsIC8qIC4gLSAgNDYgKi8KICA3ICAgICAgLCAgNTMsIC8qIC8gLSAgNDcgKi8KIDEyICAgICAgLCAgIDMsIC8qIDAgLSAgNDggKi8KIDEyICAgICAgLCAgMzMsIC8qIDEgLSAgNDkgKi8KIDEyICAgICAgLCAgNTEsIC8qIDIgLSAgNTAgKi8KIDEyICAgICAgLCAgNzAsIC8qIDMgLSAgNTEgKi8KIDEyICAgICAgLCAgODgsIC8qIDQgLSAgNTIgKi8KIDEyICAgICAgLCAxMDYsIC8qIDUgLSAgNTMgKi8KIDEyICAgICAgLCAxMjUsIC8qIDYgLSAgNTQgKi8KIDEyICAgICAgLCAxNDQsIC8qIDcgLSAgNTUgKi8KIDEyICAgICAgLCAxNjIsIC8qIDggLSAgNTYgKi8KIDEyICAgICAgLCAxODAsIC8qIDkgLSAgNTcgKi8KICA3ICAgICAgLCAgNTUsIC8qIDogLSAgNTggKi8KICA3ICAgICAgLCAgNTgsIC8qIDsgLSAgNTkgKi8KICA4ICAgICAgLCAgMTQsIC8qIDwgLSAgNjAgKi8KICA4ICAgICAgLCAgMTgsIC8qID0gLSAgNjEgKi8KICA4ICAgICAgLCAgMjAsIC8qID4gLSAgNjIgKi8KICA3ICAgICAgLCAgNjAsIC8qID8gLSAgNjMgKi8KICA3ICAgICAgLCAgNjIsIC8qIEAgLSAgNjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIEEgLSAgNjUgKi8KIDE0ICAgICAgLCAgIDksIC8qIEIgLSAgNjYgKi8KIDE0ICAgICAgLCAgMTAsIC8qIEMgLSAgNjcgKi8KIDE0ICAgICAgLCAgMjYsIC8qIEQgLSAgNjggKi8KIDE0ICAgICAgLCAgMzMsIC8qIEUgLSAgNjkgKi8KIDE0ICAgICAgLCAgMzUsIC8qIEYgLSAgNzAgKi8KIDE0ICAgICAgLCAgMzcsIC8qIEcgLSAgNzEgKi8KIDE0ICAgICAgLCAgNDQsIC8qIEggLSAgNzIgKi8KIDE0ICAgICAgLCAgNTAsIC8qIEkgLSAgNzMgKi8KIDE0ICAgICAgLCAgNTMsIC8qIEogLSAgNzQgKi8KIDE0ICAgICAgLCAgNTQsIC8qIEsgLSAgNzUgKi8KIDE0ICAgICAgLCAgNzIsIC8qIEwgLSAgNzYgKi8KIDE0ICAgICAgLCAgODEsIC8qIE0gLSAgNzcgKi8KIDE0ICAgICAgLCAxMTIsIC8qIE4gLSAgNzggKi8KIDE0ICAgICAgLCAxMjQsIC8qIE8gLSAgNzkgKi8KIDE0ICAgICAgLCAxMjYsIC8qIFAgLSAgODAgKi8KIDE0ICAgICAgLCAxMzcsIC8qIFEgLSAgODEgKi8KIDE0ICAgICAgLCAxMzgsIC8qIFIgLSAgODIgKi8KIDE0ICAgICAgLCAxNDUsIC8qIFMgLSAgODMgKi8KIDE0ICAgICAgLCAxNTMsIC8qIFQgLSAgODQgKi8KIDE0ICAgICAgLCAxNTksIC8qIFUgLSAgODUgKi8KIDE0ICAgICAgLCAxNjIsIC8qIFYgLSAgODYgKi8KIDE0ICAgICAgLCAxNjQsIC8qIFcgLSAgODcgKi8KIDE0ICAgICAgLCAxNjYsIC8qIFggLSAgODggKi8KIDE0ICAgICAgLCAxNjcsIC8qIFkgLSAgODkgKi8KIDE0ICAgICAgLCAxNjksIC8qIFogLSAgOTAgKi8KICA3ICAgICAgLCAgNjMsIC8qIFsgLSAgOTEgKi8KICA3ICAgICAgLCAgNjUsIC8qIFwgLSAgOTIgKi8KICA3ICAgICAgLCAgNjYsIC8qIF0gLSAgOTMgKi8KICA3ICAgICAgLCAgNjcsIC8qIF4gLSAgOTQgKi8KICA3ICAgICAgLCAgNjgsIC8qIF8gLSAgOTUgKi8KICA3ICAgICAgLCAgNzIsIC8qIGAgLSAgOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIGEgLSAgOTcgKi8KIDE0ICAgICAgLCAgIDksIC8qIGIgLSAgOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIGMgLSAgOTkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIGQgLSAxMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIGUgLSAxMDEgKi8KIDE0ICAgICAgLCAgMzUsIC8qIGYgLSAxMDIgKi8KIDE0ICAgICAgLCAgMzcsIC8qIGcgLSAxMDMgKi8KIDE0ICAgICAgLCAgNDQsIC8qIGggLSAxMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIGkgLSAxMDUgKi8KIDE0ICAgICAgLCAgNTMsIC8qIGogLSAxMDYgKi8KIDE0ICAgICAgLCAgNTQsIC8qIGsgLSAxMDcgKi8KIDE0ICAgICAgLCAgNzIsIC8qIGwgLSAxMDggKi8KIDE0ICAgICAgLCAgODEsIC8qIG0gLSAxMDkgKi8KIDE0ICAgICAgLCAxMTIsIC8qIG4gLSAxMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qIG8gLSAxMTEgKi8KIDE0ICAgICAgLCAxMjYsIC8qIHAgLSAxMTIgKi8KIDE0ICAgICAgLCAxMzcsIC8qIHEgLSAxMTMgKi8KIDE0ICAgICAgLCAxMzgsIC8qIHIgLSAxMTQgKi8KIDE0ICAgICAgLCAxNDUsIC8qIHMgLSAxMTUgKi8KIDE0ICAgICAgLCAxNTMsIC8qIHQgLSAxMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qIHUgLSAxMTcgKi8KIDE0ICAgICAgLCAxNjIsIC8qIHYgLSAxMTggKi8KIDE0ICAgICAgLCAxNjQsIC8qIHcgLSAxMTkgKi8KIDE0ICAgICAgLCAxNjYsIC8qIHggLSAxMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIHkgLSAxMjEgKi8KIDE0ICAgICAgLCAxNjksIC8qIHogLSAxMjIgKi8KICA3ICAgICAgLCAgNzQsIC8qIHsgLSAxMjMgKi8KICA3ICAgICAgLCAgNzYsIC8qIHwgLSAxMjQgKi8KICA3ICAgICAgLCAgNzgsIC8qIH0gLSAxMjUgKi8KICA3ICAgICAgLCAgODAsIC8qIH4gLSAxMjYgKi8KICA2ICAgICAgLCAgMjksIC8qIH8gLSAxMjcgKi8KICA2ICAgICAgLCAgMzAsIC8qIIAgLSAxMjggKi8KICA2ICAgICAgLCAgMzEsIC8qIIEgLSAxMjkgKi8KICA3ICAgICAgLCAxMjMsIC8qIIIgLSAxMzAgKi8KIDE0ICAgICAgLCAgMzUsIC8qIIMgLSAxMzEgKi8KICA3ICAgICAgLCAxMjcsIC8qIIQgLSAxMzIgKi8KIDEwICAgICAgLCAgMjEsIC8qIIUgLSAxMzMgKi8KIDEwICAgICAgLCAgMTUsIC8qIIYgLSAxMzQgKi8KIDEwICAgICAgLCAgMTYsIC8qIIcgLSAxMzUgKi8KICA3ICAgICAgLCAgNjcsIC8qIIggLSAxMzYgKi8KIDEwICAgICAgLCAgMjIsIC8qIIkgLSAxMzcgKi8KIDE0ICAgICAgLCAxNDUsIC8qIIogLSAxMzggKi8KICA3ICAgICAgLCAxMzYsIC8qIIsgLSAxMzkgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIIwgLSAxNDAgKi8KICA2ICAgICAgLCAgNDMsIC8qII0gLSAxNDEgKi8KICA2ICAgICAgLCAgNDQsIC8qII4gLSAxNDIgKi8KICA2ICAgICAgLCAgNDUsIC8qII8gLSAxNDMgKi8KICA2ICAgICAgLCAgNDYsIC8qIJAgLSAxNDQgKi8KICA3ICAgICAgLCAxMjEsIC8qIJEgLSAxNDUgKi8KICA3ICAgICAgLCAxMjIsIC8qIJIgLSAxNDYgKi8KICA3ICAgICAgLCAxMjUsIC8qIJMgLSAxNDcgKi8KICA3ICAgICAgLCAxMjYsIC8qIJQgLSAxNDggKi8KIDEwICAgICAgLCAgMTcsIC8qIJUgLSAxNDkgKi8KICA2ICAgICAgLCAxMzcsIC8qIJYgLSAxNTAgKi8KICA2ICAgICAgLCAxMzksIC8qIJcgLSAxNTEgKi8KICA3ICAgICAgLCAgOTMsIC8qIJggLSAxNTIgKi8KIDE0ICAgICAgLCAxNTYsIC8qIJkgLSAxNTMgKi8KIDE0ICAgICAgLCAxNDUsIC8qIJogLSAxNTQgKi8KICA3ICAgICAgLCAxMzcsIC8qIJsgLSAxNTUgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIJwgLSAxNTYgKi8KICA2ICAgICAgLCAgNTksIC8qIJ0gLSAxNTcgKi8KICA2ICAgICAgLCAgNjAsIC8qIJ4gLSAxNTggKi8KIDE0ICAgICAgLCAxNjcsIC8qIJ8gLSAxNTkgKi8KICA3ICAgICAgLCAgIDQsIC8qIKAgLSAxNjAgKi8KICA3ICAgICAgLCAgODEsIC8qIKEgLSAxNjEgKi8KIDEwICAgICAgLCAgIDIsIC8qIKIgLSAxNjIgKi8KIDEwICAgICAgLCAgIDMsIC8qIKMgLSAxNjMgKi8KIDEwICAgICAgLCAgIDQsIC8qIKQgLSAxNjQgKi8KIDEwICAgICAgLCAgIDUsIC8qIKUgLSAxNjUgKi8KICA3ICAgICAgLCAgODIsIC8qIKYgLSAxNjYgKi8KIDEwICAgICAgLCAgIDYsIC8qIKcgLSAxNjcgKi8KICA3ICAgICAgLCAgODMsIC8qIKggLSAxNjggKi8KIDEwICAgICAgLCAgIDcsIC8qIKkgLSAxNjkgKi8KIDE0ICAgICAgLCAgIDIsIC8qIKogLSAxNzAgKi8KICA4ICAgICAgLCAgMjQsIC8qIKsgLSAxNzEgKi8KIDEwICAgICAgLCAgIDgsIC8qIKwgLSAxNzIgKi8KICA2ICAgICAgLCAxMzEsIC8qIK0gLSAxNzMgKi8KIDEwICAgICAgLCAgIDksIC8qIK4gLSAxNzQgKi8KICA3ICAgICAgLCAgODQsIC8qIK8gLSAxNzUgKi8KIDEwICAgICAgLCAgMTAsIC8qILAgLSAxNzYgKi8KICA4ICAgICAgLCAgMjMsIC8qILEgLSAxNzcgKi8KIDEyICAgICAgLCAgNTEsIC8qILIgLSAxNzggKi8KIDEyICAgICAgLCAgNzAsIC8qILMgLSAxNzkgKi8KICA3ICAgICAgLCAgODUsIC8qILQgLSAxODAgKi8KIDEwICAgICAgLCAgMTEsIC8qILUgLSAxODEgKi8KIDEwICAgICAgLCAgMTIsIC8qILYgLSAxODIgKi8KIDEwICAgICAgLCAgMTMsIC8qILcgLSAxODMgKi8KICA3ICAgICAgLCAgODYsIC8qILggLSAxODQgKi8KIDEyICAgICAgLCAgMzMsIC8qILkgLSAxODUgKi8KIDE0ICAgICAgLCAxMjQsIC8qILogLSAxODYgKi8KICA4ICAgICAgLCAgMjYsIC8qILsgLSAxODcgKi8KIDEyICAgICAgLCAgMjEsIC8qILwgLSAxODggKi8KIDEyICAgICAgLCAgMjUsIC8qIL0gLSAxODkgKi8KIDEyICAgICAgLCAgMjksIC8qIL4gLSAxOTAgKi8KICA3ICAgICAgLCAgODcsIC8qIL8gLSAxOTEgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMAgLSAxOTIgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMEgLSAxOTMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMIgLSAxOTQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMMgLSAxOTUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMQgLSAxOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMUgLSAxOTcgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIMYgLSAxOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIMcgLSAxOTkgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMggLSAyMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMkgLSAyMDEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMogLSAyMDIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMsgLSAyMDMgKi8KIDE0ICAgICAgLCAgNTAsIC8qIMwgLSAyMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM0gLSAyMDUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM4gLSAyMDYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM8gLSAyMDcgKi8KIDE0ICAgICAgLCAgMjYsIC8qINAgLSAyMDggKi8KIDE0ICAgICAgLCAxMTIsIC8qINEgLSAyMDkgKi8KIDE0ICAgICAgLCAxMjQsIC8qINIgLSAyMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qINMgLSAyMTEgKi8KIDE0ICAgICAgLCAxMjQsIC8qINQgLSAyMTIgKi8KIDE0ICAgICAgLCAxMjQsIC8qINUgLSAyMTMgKi8KIDE0ICAgICAgLCAxMjQsIC8qINYgLSAyMTQgKi8KICA4ICAgICAgLCAgMjgsIC8qINcgLSAyMTUgKi8KIDE0ICAgICAgLCAxMjQsIC8qINggLSAyMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qINkgLSAyMTcgKi8KIDE0ICAgICAgLCAxNTksIC8qINogLSAyMTggKi8KIDE0ICAgICAgLCAxNTksIC8qINsgLSAyMTkgKi8KIDE0ICAgICAgLCAxNTksIC8qINwgLSAyMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIN0gLSAyMjEgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIN4gLSAyMjIgKi8KIDE0ICsgNDggLCAxNDUsIC8qIN8gLSAyMjMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOAgLSAyMjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOEgLSAyMjUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOIgLSAyMjYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOMgLSAyMjcgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOQgLSAyMjggKi8KIDE0ICAgICAgLCAgIDIsIC8qIOUgLSAyMjkgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIOYgLSAyMzAgKi8KIDE0ICAgICAgLCAgMTAsIC8qIOcgLSAyMzEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOggLSAyMzIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOkgLSAyMzMgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOogLSAyMzQgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOsgLSAyMzUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIOwgLSAyMzYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO0gLSAyMzcgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO4gLSAyMzggKi8KIDE0ICAgICAgLCAgNTAsIC8qIO8gLSAyMzkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIPAgLSAyNDAgKi8KIDE0ICAgICAgLCAxMTIsIC8qIPEgLSAyNDEgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPIgLSAyNDIgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPMgLSAyNDMgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPQgLSAyNDQgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPUgLSAyNDUgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPYgLSAyNDYgKi8KICA4ICAgICAgLCAgMjksIC8qIPcgLSAyNDcgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPggLSAyNDggKi8KIDE0ICAgICAgLCAxNTksIC8qIPkgLSAyNDkgKi8KIDE0ICAgICAgLCAxNTksIC8qIPogLSAyNTAgKi8KIDE0ICAgICAgLCAxNTksIC8qIPsgLSAyNTEgKi8KIDE0ICAgICAgLCAxNTksIC8qIPwgLSAyNTIgKi8KIDE0ICAgICAgLCAxNjcsIC8qIP0gLSAyNTMgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIP4gLSAyNTQgKi8KIDE0ICAgICAgLCAxNjcgIC8qIP8gLSAyNTUgKi8gfTsKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVF8yW10gPSB7IDMzLCA0NCwgMTQ1IH07CgojZGVmaW5lIExDTV9EaWFjcml0aWNfU3RhcnQgMTMxCgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fRGlhY3JpdGljX0xVVFtdID0geyAKMTIzLCAgLyoggyAtIDEzMSAqLwogIDIsICAvKiCEIC0gMTMyICovCiAgMiwgIC8qIIUgLSAxMzMgKi8KICAyLCAgLyoghiAtIDEzNCAqLwogIDIsICAvKiCHIC0gMTM1ICovCiAgMywgIC8qIIggLSAxMzYgKi8KICAyLCAgLyogiSAtIDEzNyAqLwogMjAsICAvKiCKIC0gMTM4ICovCiAgMiwgIC8qIIsgLSAxMzkgKi8KICAyLCAgLyogjCAtIDE0MCAqLwogIDIsICAvKiCNIC0gMTQxICovCiAgMiwgIC8qII4gLSAxNDIgKi8KICAyLCAgLyogjyAtIDE0MyAqLwogIDIsICAvKiCQIC0gMTQ0ICovCiAgMiwgIC8qIJEgLSAxNDUgKi8KICAyLCAgLyogkiAtIDE0NiAqLwogIDIsICAvKiCTIC0gMTQ3ICovCiAgMiwgIC8qIJQgLSAxNDggKi8KICAyLCAgLyoglSAtIDE0OSAqLwogIDIsICAvKiCWIC0gMTUwICovCiAgMiwgIC8qIJcgLSAxNTEgKi8KICAyLCAgLyogmCAtIDE1MiAqLwogIDIsICAvKiCZIC0gMTUzICovCiAyMCwgIC8qIJogLSAxNTQgKi8KICAyLCAgLyogmyAtIDE1NSAqLwogIDIsICAvKiCcIC0gMTU2ICovCiAgMiwgIC8qIJ0gLSAxNTcgKi8KICAyLCAgLyogniAtIDE1OCAqLwogMTksICAvKiCfIC0gMTU5ICovCiAgMiwgIC8qIKAgLSAxNjAgKi8KICAyLCAgLyogoSAtIDE2MSAqLwogIDIsICAvKiCiIC0gMTYyICovCiAgMiwgIC8qIKMgLSAxNjMgKi8KICAyLCAgLyogpCAtIDE2NCAqLwogIDIsICAvKiClIC0gMTY1ICovCiAgMiwgIC8qIKYgLSAxNjYgKi8KICAyLCAgLyogpyAtIDE2NyAqLwogIDIsICAvKiCoIC0gMTY4ICovCiAgMiwgIC8qIKkgLSAxNjkgKi8KICAzLCAgLyogqiAtIDE3MCAqLwogIDIsICAvKiCrIC0gMTcxICovCiAgMiwgIC8qIKwgLSAxNzIgKi8KICAyLCAgLyogrSAtIDE3MyAqLwogIDIsICAvKiCuIC0gMTc0ICovCiAgMiwgIC8qIK8gLSAxNzUgKi8KICAyLCAgLyogsCAtIDE3NiAqLwogIDIsICAvKiCxIC0gMTc3ICovCiAgMiwgIC8qILIgLSAxNzggKi8KICAyLCAgLyogsyAtIDE3OSAqLwogIDIsICAvKiC0IC0gMTgwICovCiAgMiwgIC8qILUgLSAxODEgKi8KICAyLCAgLyogtiAtIDE4MiAqLwogIDIsICAvKiC3IC0gMTgzICovCiAgMiwgIC8qILggLSAxODQgKi8KICAyLCAgLyoguSAtIDE4NSAqLwogIDMsICAvKiC6IC0gMTg2ICovCiAgMiwgIC8qILsgLSAxODcgKi8KICAyLCAgLyogvCAtIDE4OCAqLwogIDIsICAvKiC9IC0gMTg5ICovCiAgMiwgIC8qIL4gLSAxOTAgKi8KICAyLCAgLyogvyAtIDE5MSAqLwogMTUsICAvKiDAIC0gMTkyICovCiAxNCwgIC8qIMEgLSAxOTMgKi8KIDE4LCAgLyogwiAtIDE5NCAqLwogMjUsICAvKiDDIC0gMTk1ICovCiAxOSwgIC8qIMQgLSAxOTYgKi8KIDI2LCAgLyogxSAtIDE5NyAqLwogIDIsICAvKiDGIC0gMTk4ICovCiAyOCwgIC8qIMcgLSAxOTkgKi8KIDE1LCAgLyogyCAtIDIwMCAqLwogMTQsICAvKiDJIC0gMjAxICovCiAxOCwgIC8qIMogLSAyMDIgKi8KIDE5LCAgLyogyyAtIDIwMyAqLwogMTUsICAvKiDMIC0gMjA0ICovCiAxNCwgIC8qIM0gLSAyMDUgKi8KIDE4LCAgLyogziAtIDIwNiAqLwogMTksICAvKiDPIC0gMjA3ICovCjEwNCwgIC8qINAgLSAyMDggKi8KIDI1LCAgLyog0SAtIDIwOSAqLwogMTUsICAvKiDSIC0gMjEwICovCiAxNCwgIC8qINMgLSAyMTEgKi8KIDE4LCAgLyog1CAtIDIxMiAqLwogMjUsICAvKiDVIC0gMjEzICovCiAxOSwgIC8qINYgLSAyMTQgKi8KICAyLCAgLyog1yAtIDIxNSAqLwogMzMsICAvKiDYIC0gMjE2ICovCiAxNSwgIC8qINkgLSAyMTcgKi8KIDE0LCAgLyog2iAtIDIxOCAqLwogMTgsICAvKiDbIC0gMjE5ICovCiAxOSwgIC8qINwgLSAyMjAgKi8KIDE0LCAgLyog3SAtIDIyMSAqLwogIDIsICAvKiDeIC0gMjIyICovCiAgMiwgIC8qIN8gLSAyMjMgKi8KIDE1LCAgLyog4CAtIDIyNCAqLwogMTQsICAvKiDhIC0gMjI1ICovCiAxOCwgIC8qIOIgLSAyMjYgKi8KIDI1LCAgLyog4yAtIDIyNyAqLwogMTksICAvKiDkIC0gMjI4ICovCiAyNiwgIC8qIOUgLSAyMjkgKi8KICAyLCAgLyog5iAtIDIzMCAqLwogMjgsICAvKiDnIC0gMjMxICovCiAxNSwgIC8qIOggLSAyMzIgKi8KIDE0LCAgLyog6SAtIDIzMyAqLwogMTgsICAvKiDqIC0gMjM0ICovCiAxOSwgIC8qIOsgLSAyMzUgKi8KIDE1LCAgLyog7CAtIDIzNiAqLwogMTQsICAvKiDtIC0gMjM3ICovCiAxOCwgIC8qIO4gLSAyMzggKi8KIDE5LCAgLyog7yAtIDIzOSAqLwoxMDQsICAvKiDwIC0gMjQwICovCiAyNSwgIC8qIPEgLSAyNDEgKi8KIDE1LCAgLyog8iAtIDI0MiAqLwogMTQsICAvKiDzIC0gMjQzICovCiAxOCwgIC8qIPQgLSAyNDQgKi8KIDI1LCAgLyog9SAtIDI0NSAqLwogMTksICAvKiD2IC0gMjQ2ICovCiAgMiwgIC8qIPcgLSAyNDcgKi8KIDMzLCAgLyog+CAtIDI0OCAqLwogMTUsICAvKiD5IC0gMjQ5ICovCiAxNCwgIC8qIPogLSAyNTAgKi8KIDE4LCAgLyog+yAtIDI1MSAqLwogMTksICAvKiD8IC0gMjUyICovCiAxNCwgIC8qIP0gLSAyNTMgKi8KICAyLCAgLyog/iAtIDI1NCAqLwogMTksICAvKiD/IC0gMjU1ICovCn0gOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEUyTkxTX2lzUHVuY3R1YXRpb24gW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzUHVuY3R1YXRpb24odW5zaWduZWQgY2hhciBjKSAKewogIC8qICJwdW5jdHVhdGlvbiBjaGFyYWN0ZXIiIGluIHRoaXMgY29udGV4dCBpcyBhIGNoYXJhY3RlciB3aGljaCBpcyAKICAgICBjb25zaWRlcmVkICJsZXNzIGltcG9ydGFudCIgZHVyaW5nIHdvcmQgc29ydCBjb21wYXJpc29uLgogICAgIFNlZSBMQ01hcFN0cmluZyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHByZWNpc2UgZGVmaW5pdGlvbiAKICAgICBvZiAibGVzcyBpbXBvcnRhbnQiLiAqLwoKICByZXR1cm4gKExDTV9Vbmljb2RlX0xVVFstMisyKmNdPT02KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEUyTkxTX2lzTm9uU3BhY2luZyBbSU5URVJOQUxdCiAqLwpzdGF0aWMgaW50IE9MRTJOTFNfaXNOb25TcGFjaW5nKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmdBLiAgQ2hhcmFjdGVycyAKICAgICBmb3Igd2hpY2ggaXQgcmV0dXJucyB0cnVlIGFyZSBpZ25vcmVkIHdoZW4gbWFwcGluZyBhCiAgICAgc3RyaW5nIHdpdGggTk9STV9JR05PUkVOT05TUEFDRSAqLwogIHJldHVybiAoKGM9PTEzNikgfHwgKGM9PTE3MCkgfHwgKGM9PTE4NikpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9MRTJOTFNfaXNTeW1ib2wgW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzU3ltYm9sKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmdBLiAgQ2hhcmFjdGVycyAKICAgICBmb3Igd2hpY2ggaXQgcmV0dXJucyB0cnVlIGFyZSBpZ25vcmVkIHdoZW4gbWFwcGluZyBhCiAgICAgc3RyaW5nIHdpdGggTk9STV9JR05PUkVTWU1CT0xTICovCiAgcmV0dXJuICggKGMhPTApICYmICFJc0NoYXJBbHBoYU51bWVyaWNBKGMpICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCWlkZW50aXR5CVtJbnRlcm5hbF0KICovCnN0YXRpYyBpbnQgaWRlbnRpdHkoaW50IGMpCnsKICByZXR1cm4gYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nQSAgICAgICAgICAgICAgICBbS0VSTkVMMzIuNDkyXQogKgogKiBDb252ZXJ0IGEgc3RyaW5nLCBvciBnZW5lcmF0ZSBhIHNvcnQga2V5IGZyb20gaXQuCiAqCiAqIElmIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpLCB0aGUgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZQogKiBhIHNvcnQga2V5IGZvciB0aGUgc291cmNlIHN0cmluZy4gIEVsc2UsIGl0IHdpbGwgY29udmVydCBpdAogKiBhY2NvcmRpbmdseSB0byB0aGUgZmxhZ3MgTENNQVBfVVBQRVJDQVNFLCBMQ01BUF9MT1dFUkNBU0UsLi4uCiAqCiAqIFJFVFVSTlMKICogICAgRXJyb3IgOiAwLgogKiAgICBTdWNjZXNzIDogbGVuZ3RoIG9mIHRoZSByZXN1bHQgc3RyaW5nLgogKgogKiBOT1RFUwogKiAgICBJZiBjYWxsZWQgd2l0aCBzY3JsZW4gPSAtMSwgdGhlIGZ1bmN0aW9uIHdpbGwgY29tcHV0ZSB0aGUgbGVuZ3RoCiAqICAgICAgb2YgdGhlIDAtdGVybWluYXRlZCBzdHJpbmcgc3Ryc3JjIGJ5IGl0c2VsZi4gICAgICAKICogCiAqICAgIElmIGNhbGxlZCB3aXRoIGRzdGxlbiA9IDAsIHJldHVybnMgdGhlIGJ1ZmZlciBsZW5ndGggdGhhdCAKICogICAgICB3b3VsZCBiZSByZXF1aXJlZC4KICoKICogICAgTk9STV9JR05PUkVXSURUSCBtZWFucyB0byBjb21wYXJlIEFTQ0lJIGFuZCB3aWRlIGNoYXJhY3RlcnMKICogICAgYXMgaWYgdGhleSBhcmUgZXF1YWwuICAKICogICAgSW4gdGhlIG9ubHkgY29kZSBwYWdlIGltcGxlbWVudGVkIHNvIGZhciwgdGhlcmUgbWF5IG5vdCBiZQogKiAgICB3aWRlIGNoYXJhY3RlcnMgaW4gc3RyaW5ncyBwYXNzZWQgdG8gTENNYXBTdHJpbmdBLAogKiAgICBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIGRvbmUgZm9yIHRoaXMgZmxhZy4KICovCklOVCBXSU5BUEkgTENNYXBTdHJpbmdBKAoJTENJRCBsY2lkIC8qIGxvY2FsZSBpZGVudGlmaWVyIGNyZWF0ZWQgd2l0aCBNQUtFTENJRDsgCgkJICAgICBMT0NBTEVfU1lTVEVNX0RFRkFVTFQgYW5kIExPQ0FMRV9VU0VSX0RFRkFVTFQgYXJlIAogICAgICAgICAgICAgICAgICAgICBwcmVkZWZpbmVkIHZhbHVlcy4gKi8sCglEV09SRCBtYXBmbGFncyAvKiBmbGFncyAqLywKCUxQQ1NUUiBzcmNzdHIgIC8qIHNvdXJjZSBidWZmZXIgKi8sCglJTlQgc3JjbGVuICAgLyogc291cmNlIGxlbmd0aCAqLywKCUxQU1RSIGRzdHN0ciAgIC8qIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLywKCUlOVCBkc3RsZW4gICAvKiBkZXN0aW5hdGlvbiBidWZmZXIgbGVuZ3RoICovKSAKewogIGludCBpOwoKICBUUkFDRV8oc3RyaW5nKSgiKDB4JTA0bHgsMHglMDhseCwlcywlZCwlcCwlZClcbiIsCglsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbik7CgogIGlmICggKChkc3RsZW4hPTApICYmIChkc3RzdHI9PU5VTEwpKSB8fCAoc3Jjc3RyPT1OVUxMKSApCiAgewogICAgRVJSKCIoc3JjPSVzLGRlc3Q9JXMpOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzcmNzdHIsIGRzdHN0cik7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQogIGlmIChzcmNsZW4gPT0gLTEpIAogICAgc3JjbGVuID0gbHN0cmxlbkEoc3Jjc3RyKSArIDEgOyAgICAvKiAoaW5jbHVkZSBmaW5hbCAnXDAnKSAqLwoKI2RlZmluZSBMQ01BUFNUUklOR0FfU1VQUE9SVEVEX0ZMQUdTIChMQ01BUF9VUFBFUkNBU0UgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTENNQVBfTE9XRVJDQVNFICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExDTUFQX1NPUlRLRVkgICAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRUNBU0UgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVOT05TUEFDRSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPUlRfU1RSSU5HU09SVCAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRVdJRFRIICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVLQU5BVFlQRSkKICAvKiBGSVhNRTogYXMgbG9uZyBhcyB3ZSBkb24ndCBzdXBwb3J0IEthbmFrYW5hIG5vciBIaXJpZ2FuYSAKICAgKiBjaGFyYWN0ZXJzLCB3ZSBjYW4gc3VwcG9ydCBOT1JNX0lHTk9SRUtBTkFUWVBFCiAgICovCiAgaWYgKG1hcGZsYWdzICYgfkxDTUFQU1RSSU5HQV9TVVBQT1JURURfRkxBR1MpCiAgewogICAgRklYTUVfKHN0cmluZykoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCgkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAoJICBsY2lkLAoJICBtYXBmbGFncywKCSAgc3Jjc3RyLAoJICBzcmNsZW4sCgkgIGRzdHN0ciwKCSAgZHN0bGVuLAoJICBtYXBmbGFncyAmIH5MQ01BUFNUUklOR0FfU1VQUE9SVEVEX0ZMQUdTCiAgICAgKTsKICB9CgogIGlmICggIShtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICkKICB7CiAgICBpbnQgaSxqOwogICAgaW50ICgqZikoaW50KSA9IGlkZW50aXR5OyAKICAgIGludCBmbGFnX2lnbm9yZW5vbnNwYWNlID0gbWFwZmxhZ3MgJiBOT1JNX0lHTk9SRU5PTlNQQUNFOwogICAgaW50IGZsYWdfaWdub3Jlc3ltYm9scyA9IG1hcGZsYWdzICYgTk9STV9JR05PUkVTWU1CT0xTOwoKICAgIGlmIChmbGFnX2lnbm9yZW5vbnNwYWNlIHx8IGZsYWdfaWdub3Jlc3ltYm9scykKICAgIHsKICAgICAgLyogRm9yIHNvbWUgdmFsdWVzIG9mIG1hcGZsYWdzLCB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgCgkgc3RyaW5nIGlzIG5vdCBrbm93biBhdCB0aGlzIHBvaW50LiAgV2luZG93cyBkb2VzIG1hcCB0aGUgc3RyaW5nCgkgYW5kIGRvZXMgbm90IFNldExhc3RFcnJvciBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSIGluCgkgdGhlc2UgY2FzZXMuICovCiAgICAgIGlmIChkc3RsZW49PTApCiAgICAgIHsKCS8qIENvbXB1dGUgcmVxdWlyZWQgbGVuZ3RoICovCglmb3IgKGk9aj0wOyBpIDwgc3JjbGVuOyBpKyspCgl7CgkgIGlmICggIShmbGFnX2lnbm9yZW5vbnNwYWNlICYmIE9MRTJOTFNfaXNOb25TcGFjaW5nKHNyY3N0cltpXSkpCgkgICAgICAgJiYgIShmbGFnX2lnbm9yZXN5bWJvbHMgJiYgT0xFMk5MU19pc1N5bWJvbChzcmNzdHJbaV0pKSApCgkgICAgaisrOwoJfQoJcmV0dXJuIGo7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaWYgKGRzdGxlbj09MCkKCXJldHVybiBzcmNsZW47ICAKICAgICAgaWYgKGRzdGxlbjxzcmNsZW4pIAoJICAgewoJICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgICAgIHJldHVybiAwOwoJICAgfQogICAgfQogICAgaWYgKG1hcGZsYWdzICYgTENNQVBfVVBQRVJDQVNFKQogICAgICBmID0gdG91cHBlcjsKICAgIGVsc2UgaWYgKG1hcGZsYWdzICYgTENNQVBfTE9XRVJDQVNFKQogICAgICBmID0gdG9sb3dlcjsKICAgIC8qIEZJWE1FOiBOT1JNX0lHTk9SRU5PTlNQQUNFIHJlcXVpcmVzIGFub3RoZXIgY29udmVyc2lvbiAqLwogICAgZm9yIChpPWo9MDsgKGk8c3JjbGVuKSAmJiAoajxkc3RsZW4pIDsgaSsrKQogICAgewogICAgICBpZiAoICEoZmxhZ19pZ25vcmVub25zcGFjZSAmJiBPTEUyTkxTX2lzTm9uU3BhY2luZyhzcmNzdHJbaV0pKQoJICAgJiYgIShmbGFnX2lnbm9yZXN5bWJvbHMgJiYgT0xFMk5MU19pc1N5bWJvbChzcmNzdHJbaV0pKSApCiAgICAgIHsKCWRzdHN0cltqXSA9IChDSEFSKSBmKHNyY3N0cltpXSk7CglqKys7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBqOwogIH0KCiAgLyogRklYTUU6IFRoaXMgZnVuY3Rpb24gY29tcGxldGVseSBpZ25vcmVzIHRoZSAibGNpZCIgcGFyYW1ldGVyLiAqLwogIC8qIGVsc2UgLi4uIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICAqLwogIHsKICAgIGludCB1bmljb2RlX2xlbj0wOwogICAgaW50IGNhc2VfbGVuPTA7CiAgICBpbnQgZGlhY3JpdGljX2xlbj0wOwogICAgaW50IGRlbGF5ZWRfcHVuY3R1YXRpb25fbGVuPTA7CiAgICBjaGFyICpjYXNlX2NvbXBvbmVudDsKICAgIGNoYXIgKmRpYWNyaXRpY19jb21wb25lbnQ7CiAgICBjaGFyICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudDsKICAgIGludCByb29tLGNvdW50OwogICAgaW50IGZsYWdfc3RyaW5nc29ydCA9IG1hcGZsYWdzICYgU09SVF9TVFJJTkdTT1JUOwoKICAgIC8qIGNvbXB1dGUgaG93IG11Y2ggcm9vbSB3ZSB3aWxsIG5lZWQgKi8KICAgIGZvciAoaT0wO2k8c3JjbGVuO2krKykKICAgIHsKICAgICAgaW50IG9mczsKICAgICAgdW5zaWduZWQgY2hhciBzb3VyY2VfY2hhciA9IHNyY3N0cltpXTsKICAgICAgaWYgKHNvdXJjZV9jaGFyIT0nXDAnKSAKICAgICAgewoJaWYgKGZsYWdfc3RyaW5nc29ydCB8fCAhT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkKCXsKCSAgdW5pY29kZV9sZW4rKzsKCSAgaWYgKCBMQ01fVW5pY29kZV9MVVRbLTIrMipzb3VyY2VfY2hhcl0gJiB+MTUgKQoJICAgIHVuaWNvZGVfbGVuKys7ICAgICAgICAgICAgIC8qIGRvdWJsZSBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW4rKzsKCX0JICAKICAgICAgfQoJICAKICAgICAgaWYgKGlzdXBwZXIoc291cmNlX2NoYXIpKQoJY2FzZV9sZW49dW5pY29kZV9sZW47IAoKICAgICAgb2ZzID0gc291cmNlX2NoYXIgLSBMQ01fRGlhY3JpdGljX1N0YXJ0OwogICAgICBpZiAoKG9mcz49MCkgJiYgKExDTV9EaWFjcml0aWNfTFVUW29mc10hPTIpKQoJZGlhY3JpdGljX2xlbj11bmljb2RlX2xlbjsKICAgIH0KCiAgICBpZiAobWFwZmxhZ3MgJiBOT1JNX0lHTk9SRUNBU0UpCiAgICAgIGNhc2VfbGVuPTA7ICAgICAgICAgICAgICAgICAgIAogICAgaWYgKG1hcGZsYWdzICYgTk9STV9JR05PUkVOT05TUEFDRSkKICAgICAgZGlhY3JpdGljX2xlbj0wOwoKICAgIHJvb20gPSAgMiAqIHVuaWNvZGVfbGVuICAgICAgICAgICAgICAvKiAidW5pY29kZSIgY29tcG9uZW50ICovCiAgICAgICsgICAgIGRpYWNyaXRpY19sZW4gICAgICAgICAgICAgICAgLyogImRpYWNyaXRpYyIgY29tcG9uZW50ICovCiAgICAgICsgICAgIGNhc2VfbGVuICAgICAgICAgICAgICAgICAgICAgLyogImNhc2UiIGNvbXBvbmVudCAqLwogICAgICArICAgICA0ICogZGVsYXllZF9wdW5jdHVhdGlvbl9sZW4gIC8qIHB1bmN0dWF0aW9uIGluIHdvcmQgc29ydCBtb2RlICovCiAgICAgICsgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm91ciAnXDEnIHNlcGFyYXRvcnMgKi8KICAgICAgKyAgICAgMSAgOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXJtaW5hbCAnXDAnICovCiAgICBpZiAoZHN0bGVuPT0wKQogICAgICByZXR1cm4gcm9vbTsgICAgICAKICAgIGVsc2UgaWYgKGRzdGxlbjxyb29tKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qRklYTUUgdGhlIFBvaW50ZXJjaGVjayBzaG91bGQgbm90IGJlIG5lc3Nlc2FyeSAqLwogICAgaWYgKElzQmFkV3JpdGVQdHIgKGRzdHN0cixyb29tKSkKICAgIHsgRVJSXyhzdHJpbmcpKCJiYWQgZGVzdGluYXRpb24gYnVmZmVyIChkc3RzdHIpIDogJXAsJWRcbiIsZHN0c3RyLGRzdGxlbik7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogbG9jYXRlIGVhY2ggY29tcG9uZW50LCB3cml0ZSBzZXBhcmF0b3JzICovCiAgICBkaWFjcml0aWNfY29tcG9uZW50ID0gZHN0c3RyICsgMip1bmljb2RlX2xlbiA7CiAgICAqZGlhY3JpdGljX2NvbXBvbmVudCsrID0gJ1wxJzsgCiAgICBjYXNlX2NvbXBvbmVudCA9IGRpYWNyaXRpY19jb21wb25lbnQgKyBkaWFjcml0aWNfbGVuIDsKICAgICpjYXNlX2NvbXBvbmVudCsrID0gJ1wxJzsgCiAgICBkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCA9IGNhc2VfY29tcG9uZW50ICsgY2FzZV9sZW4gOwogICAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAnXDEnOwogICAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAnXDEnOwoKICAgIC8qIHJlYWQgc291cmNlIHN0cmluZyBjaGFyIGJ5IGNoYXIsIHdyaXRlIAogICAgICAgY29ycmVzcG9uZGluZyB3ZWlnaHQgaW4gZWFjaCBjb21wb25lbnQuICovCiAgICBmb3IgKGk9MCxjb3VudD0wO2k8c3JjbGVuO2krKykKICAgIHsKICAgICAgdW5zaWduZWQgY2hhciBzb3VyY2VfY2hhcj1zcmNzdHJbaV07CiAgICAgIGlmIChzb3VyY2VfY2hhciE9J1wwJykgCiAgICAgIHsKCWludCB0eXBlLGxvbmdjb2RlOwoJdHlwZSA9IExDTV9Vbmljb2RlX0xVVFstMisyKnNvdXJjZV9jaGFyXTsKCWxvbmdjb2RlID0gdHlwZSA+PiA0OwoJdHlwZSAmPSAxNTsKCWlmICghZmxhZ19zdHJpbmdzb3J0ICYmIE9MRTJOTFNfaXNQdW5jdHVhdGlvbihzb3VyY2VfY2hhcikpIAoJewoJICBVSU5UMTYgZW5jcnlwdGVkX2xvY2F0aW9uID0gKDE8PDE1KSArIDcgKyA0KmNvdW50OwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZW5jcnlwdGVkX2xvY2F0aW9uPj44KTsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAodW5zaWduZWQgY2hhcikgKGVuY3J5cHRlZF9sb2NhdGlvbiYyNTUpOwogICAgICAgICAgICAgICAgICAgICAvKiBiaWctZW5kaWFuIGlzIHVzZWQgaGVyZSBiZWNhdXNlIGl0IGxldHMgc3RyaW5nIGNvbXBhcmlzb24gYmUKCQkJY29tcGF0aWJsZSB3aXRoIG51bWVyaWNhbCBjb21wYXJpc29uICovCgoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9IHR5cGU7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gTENNX1VuaWNvZGVfTFVUWy0xKzIqc291cmNlX2NoYXJdOyAgCiAgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtcHRpb24gOiBhIHB1bmN0dWF0aW9uIGNoYXJhY3RlciBpcyBuZXZlciBhIAoJCQlkb3VibGUgb3IgYWNjZW50ZWQgbGV0dGVyICovCgl9CgllbHNlCgl7CgkgIGRzdHN0clsyKmNvdW50XSA9IHR5cGU7CgkgIGRzdHN0clsyKmNvdW50KzFdID0gTENNX1VuaWNvZGVfTFVUWy0xKzIqc291cmNlX2NoYXJdOyAgCgkgIGlmIChsb25nY29kZSkKCSAgewoJICAgIGlmIChjb3VudDxjYXNlX2xlbikKCSAgICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzb3VyY2VfY2hhcikgPyAxOCA6IDIgKSA7CgkgICAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCgkgICAgICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IDI7IC8qIGFzc3VtcHRpb246IGEgZG91YmxlIGxldHRlcgoJCQkJCQkgaXMgbmV2ZXIgYWNjZW50ZWQgKi8KCSAgICBjb3VudCsrOwoJICAgIAoJICAgIGRzdHN0clsyKmNvdW50XSA9IHR5cGU7CgkgICAgZHN0c3RyWzIqY291bnQrMV0gPSAqKExDTV9Vbmljb2RlX0xVVF8yIC0gMSArIGxvbmdjb2RlKTsgCgkgICAgLyogMTYgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAxIAoJICAgICAgIDMyIGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMiAKCSAgICAgICA0OCBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDMgKi8KCSAgfQoKCSAgaWYgKGNvdW50PGNhc2VfbGVuKQoJICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzb3VyY2VfY2hhcikgPyAxOCA6IDIgKSA7CgkgIGlmIChjb3VudDxkaWFjcml0aWNfbGVuKQoJICB7CgkgICAgaW50IG9mcyA9IHNvdXJjZV9jaGFyIC0gTENNX0RpYWNyaXRpY19TdGFydDsKCSAgICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IChvZnM+PTAgPyBMQ01fRGlhY3JpdGljX0xVVFtvZnNdIDogMik7CgkgIH0KCSAgY291bnQrKzsKCX0KICAgICAgfQogICAgfQogICAgZHN0c3RyW3Jvb20tMV0gPSAnXDAnOwogICAgcmV0dXJuIHJvb207CiAgfQp9CgkJICAgICAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nVyAgICAgICAgICAgICAgICBbS0VSTkVMMzIuNDkzXQogKgogKiBDb252ZXJ0IGEgc3RyaW5nLCBvciBnZW5lcmF0ZSBhIHNvcnQga2V5IGZyb20gaXQuCiAqCiAqIE5PVEUKICoKICogU2VlIExDTWFwU3RyaW5nQSBmb3IgZG9jdW1lbnRhdGlvbgogKi8KSU5UIFdJTkFQSSBMQ01hcFN0cmluZ1coCglMQ0lEIGxjaWQsRFdPUkQgbWFwZmxhZ3MsTFBDV1NUUiBzcmNzdHIsSU5UIHNyY2xlbixMUFdTVFIgZHN0c3RyLAoJSU5UIGRzdGxlbikKewogIGludCBpOwogCiAgVFJBQ0VfKHN0cmluZykoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpXG4iLAogICAgICAgICAgICAgICAgIGxjaWQsIG1hcGZsYWdzLCBzcmNzdHIsIHNyY2xlbiwgZHN0c3RyLCBkc3RsZW4pOwogIAogIGlmICggKChkc3RsZW4hPTApICYmIChkc3RzdHI9PU5VTEwpKSB8fCAoc3Jjc3RyPT1OVUxMKSApCiAgewogICAgRVJSKCIoc3JjPSVwLGRzdD0lcCk6IEludmFsaWQgTlVMTCBzdHJpbmdcbiIsIHNyY3N0ciwgZHN0c3RyKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CiAgaWYgKHNyY2xlbj09LTEpIAogICAgc3JjbGVuID0gbHN0cmxlblcoc3Jjc3RyKSsxOwoKICAvKiBGSVhNRTogQm90aCB0aGlzIGZ1bmN0aW9uIGFuZCBpdCdzIGNvbXBhbmlvbiBMQ01hcFN0cmluZ0EoKQogICAqIGNvbXBsZXRlbHkgaWdub3JlIHRoZSAibGNpZCIgcGFyYW1ldGVyLiAgSW4gcGxhY2Ugb2YgdGhlICJsY2lkIgogICAqIHBhcmFtZXRlciB0aGUgYXBwbGljYXRpb24gbXVzdCBzZXQgdGhlICJMQ19DT0xMQVRFIiBvciAiTENfQUxMIgogICAqIGVudmlyb25tZW50IHZhcmlhYmxlIHByaW9yIHRvIGludm9raW5nIHRoaXMgZnVuY3Rpb24uICAqLwogIGlmIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpIAogIHsKICAgICAgLyogUG9zc2libGUgdmFsdWVzIG9mIExDX0NPTExBVEUuICovCiAgICAgIGNoYXIgKmxjX2NvbGxhdGVfZGVmYXVsdCA9IDA7IC8qIHZhbHVlIHByaW9yIHRvIHRoaXMgZnVuY3Rpb24gKi8KICAgICAgY2hhciAqbGNfY29sbGF0ZV9lbnYgPSAwOyAgICAgLyogdmFsdWUgcmV0cmlldmVkIGZyb20gdGhlIGVudmlyb25tZW50ICovCgogICAgICAvKiBHZW5lcmFsIHB1cnBvc2UgaW5kZXggaW50byBzdHJpbmdzIG9mIGFueSB0eXBlLiAqLwogICAgICBpbnQgc3RyX2lkeCA9IDA7CgogICAgICAvKiBMZW5ndGhzIG9mIHZhcmlvdXMgc3RyaW5ncyB3aGVyZSB0aGUgbGVuZ3RoIGlzIG1lYXN1cmVkIGluCiAgICAgICAqIHdpZGUgY2hhcmFjdGVycyBmb3Igd2lkZSBjaGFyYWN0ZXIgc3RyaW5ncyBhbmQgaW4gYnl0ZXMgZm9yCiAgICAgICAqIG5hdGl2ZSBzdHJpbmdzLiAgVGhlIGxlbmd0aHMgaW5jbHVkZSB0aGUgTlVMTCB0ZXJtaW5hdG9yLiAgKi8KICAgICAgc2l6ZV90IHJldHVybmVkX2xlbiAgICA9IDA7CiAgICAgIHNpemVfdCBzcmNfbmF0aXZlX2xlbiAgPSAwOwogICAgICBzaXplX3QgZHN0X25hdGl2ZV9sZW4gID0gMDsKICAgICAgc2l6ZV90IGRzdHN0cl9saWJjX2xlbiA9IDA7CgogICAgICAvKiBOYXRpdmUgKGNoYXJhY3RlciBzZXQgZGV0ZXJtaW5lZCBieSBsb2NhbGUpIHZlcnNpb25zIG9mIHRoZQogICAgICAgKiBzdHJpbmdzIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gc3RyaW5ncy4gICovCiAgICAgIExQU1RSIHNyY19uYXRpdmUgPSAwOwogICAgICBMUFNUUiBkc3RfbmF0aXZlID0gMDsKCiAgICAgIC8qIFZlcnNpb24gb2YgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gc3RyaW5ncyB1c2luZyB0aGUKICAgICAgICogIndjaGFyX3QiIFVuaWNvZGUgZGF0YSB0eXBlIG5lZWRlZCBieSB2YXJpb3VzIGxpYmMgZnVuY3Rpb25zLiAgKi8KICAgICAgd2NoYXJfdCAqc3Jjc3RyX2xpYmMgPSAwOwogICAgICB3Y2hhcl90ICpkc3RzdHJfbGliYyA9IDA7CgogICAgICBpZighKHNyY3N0cl9saWJjID0gKHdjaGFyX3QgKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjbGVuICogc2l6ZW9mKHdjaGFyX3QpKSkpCiAgICAgIHsKICAgICAgICAgIEVSUigiVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBzcmNzdHJfbGliY1xuIiwKICAgICAgICAgICAgICBzcmNsZW4gKiBzaXplb2Yod2NoYXJfdCkpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvKiBDb252ZXJ0IHNvdXJjZSBzdHJpbmcgdG8gYSBsaWJjIFVuaWNvZGUgc3RyaW5nLiAqLwogICAgICBmb3Ioc3RyX2lkeCA9IDA7IHN0cl9pZHggPCBzcmNsZW47IHN0cl9pZHgrKykKICAgICAgewogICAgICAgICAgc3Jjc3RyX2xpYmNbc3RyX2lkeF0gPSBzcmNzdHJbc3RyX2lkeF07CiAgICAgIH0KCiAgICAgIC8qIHNyY19uYXRpdmUgc2hvdWxkIGNvbnRhaW4gYXQgbW9zdCAzIGJ5dGVzIGZvciBlYWNoCiAgICAgICAqIG11bHRpYnl0ZSBjaGFyYWN0ZXJzIGluIHRoZSBvcmlnaW5hbCBzcmNzdHIgc3RyaW5nLiAgKi8KICAgICAgc3JjX25hdGl2ZV9sZW4gPSAzICogc3JjbGVuOwogICAgICBpZighKHNyY19uYXRpdmUgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19uYXRpdmVfbGVuKSkpCiAgICAgIHsKICAgICAgICAgIEVSUigiVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBzcmNfbmF0aXZlXG4iLCBzcmNfbmF0aXZlX2xlbik7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvKiBGSVhNRTogUHJpb3IgdG8gdG8gc2V0dGluZyB0aGUgTENfQ09MTEFURSBsb2NhbGUgY2F0ZWdvcnkgdGhlCiAgICAgICAqIGN1cnJlbnQgdmFsdWUgaXMgYmFja2VkIHVwIHNvIGl0IGNhbiBiZSByZXN0b3JlZCBhZnRlciB0aGUKICAgICAgICogbGFzdCBMQ19DT0xMQVRFIHNlbnNpdGl2ZSBmdW5jdGlvbiByZXR1cm5zLgogICAgICAgKiAKICAgICAgICogRXZlbiB0aG91Z2ggdGhlIGxvY2FsZSBpcyBhZGp1c3RlZCBmb3IgYSBtaW5pbXVtIGFtb3VudCBvZgogICAgICAgKiB0aW1lIGEgcmFjZSBjb25kaXRpb24gZXhpc3RzIHdoZXJlIG90aGVyIHRocmVhZHMgbWF5IGJlCiAgICAgICAqIGFmZmVjdGVkIGlmIHRoZXkgaW52b2tlIExDX0NPTExBVEUgc2Vuc2l0aXZlIGZ1bmN0aW9ucy4gIE9uZQogICAgICAgKiBwb3NzaWJsZSBzb2x1dGlvbiBpcyB0byB3cmFwIGFsbCBMQ19DT0xMQVRFIHNlbnNpdGl2ZSBXaW5lCiAgICAgICAqIGZ1bmN0aW9ucywgbGlrZSBMQ01hcFN0cmluZ1coKSwgaW4gYSBtdXRleC4KICAgICAgICoKICAgICAgICogQW5vdGhlciBlbmhhbmNlbWVudCB0byB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHRvIHNldCB0aGUKICAgICAgICogTENfQ09MTEFURSBsb2NhbGUgY2F0ZWdvcnkgYXMgYSBmdW5jdGlvbiBvZiB0aGUgImxjaWQiCiAgICAgICAqIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSAiTENfQ09MTEFURSIgZW52aXJvbm1lbnQgdmFyaWFibGUuICovCiAgICAgIGlmKCEobGNfY29sbGF0ZV9kZWZhdWx0ID0gc2V0bG9jYWxlKExDX0NPTExBVEUsIE5VTEwpKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gcXVlcnkgdGhlIExDX0NPTExBVEUgY2F0YWdvcnlcbiIpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICBpZighKGxjX2NvbGxhdGVfZW52ID0gc2V0bG9jYWxlKExDX0NPTExBVEUsICIiKSkpCiAgICAgIHsKICAgICAgICAgIEVSUigiVW5hYmxlIHRvIGluaGVyaXQgdGhlIExDX0NPTExBVEUgbG9jYWxlIGNhdGVnb3J5IGZyb20gdGhlICIKICAgICAgICAgICAgICAiZW52aXJvbm1lbnQuICBUaGUgXCJMQ19DT0xMQVRFXCIgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgIgogICAgICAgICAgICAgICJcIiVzXCIuXG4iLCBnZXRlbnYoIkxDX0NPTExBVEUiKSA/CiAgICAgICAgICAgICAgZ2V0ZW52KCJMQ19DT0xMQVRFIikgOiAiPHVuc2V0PiIpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICBUUkFDRV8oc3RyaW5nKSgibGNfY29sbGF0ZV9kZWZhdWx0ID0gJXNcbiIsIGxjX2NvbGxhdGVfZGVmYXVsdCk7CiAgICAgIFRSQUNFXyhzdHJpbmcpKCJsY19jb2xsYXRlX2VudiA9ICVzXG4iLCBsY19jb2xsYXRlX2Vudik7CgogICAgICAvKiBDb252ZXJ0IHRoZSBsaWJjIFVuaWNvZGUgc3RyaW5nIHRvIGEgbmF0aXZlIG11bHRpYnl0ZSBjaGFyYWN0ZXIKICAgICAgICogc3RyaW5nLiAqLwogICAgICByZXR1cm5lZF9sZW4gPSB3Y3N0b21icyhzcmNfbmF0aXZlLCBzcmNzdHJfbGliYywgc3JjX25hdGl2ZV9sZW4pICsgMTsKICAgICAgaWYocmV0dXJuZWRfbGVuID09IDApCiAgICAgIHsKICAgICAgICAgIExQU1RSIHNyY3N0cl9hc2NpaSA9IChMUFNUUilIRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwKCQkJCQkgICAwLCBzcmNzdHIpOwogICAgICAgICAgRVJSKCJ3Y3N0b21icyBmYWlsZWQuICBUaGUgc3RyaW5nIHNwZWNpZmllZCAoJXMpIG1heSBjb250YWlucyBhbiAiCiAgICAgICAgICAgICAgImludmFsaWQgY2hhcmFjdGVyLlxuIiwgc3Jjc3RyX2FzY2lpKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICBpZihzcmNzdHJfYXNjaWkpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9hc2NpaSk7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIGVsc2UgaWYocmV0dXJuZWRfbGVuID4gc3JjX25hdGl2ZV9sZW4pCiAgICAgIHsKICAgICAgICAgIHNyY19uYXRpdmVbc3JjX25hdGl2ZV9sZW4gLSAxXSA9IDA7CiAgICAgICAgICBFUlIoIndjc3RvbWJzIHJldHVybmVkIGEgc3RyaW5nICglcykgdGhhdCB3YXMgbG9uZ2VyICglZCBieXRlcykgIiAKICAgICAgICAgICAgICAidGhhbiBleHBlY3RlZCAoJWQgYnl0ZXMpLlxuIiwgc3JjX25hdGl2ZSwgcmV0dXJuZWRfbGVuLAogICAgICAgICAgICAgIGRzdF9uYXRpdmVfbGVuKTsKCiAgICAgICAgICAvKiBTaW5jZSB0aGlzIGlzIGFuIGludGVybmFsIGVycm9yIEknbSBub3Qgc3VyZSB3aGF0IHRoZSBjb3JyZWN0CiAgICAgICAgICAgKiBlcnJvciBjb2RlIGlzLiAgKi8KICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CgogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgc2V0bG9jYWxlKExDX0NPTExBVEUsIGxjX2NvbGxhdGVfZGVmYXVsdCk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBzcmNfbmF0aXZlX2xlbiA9IHJldHVybmVkX2xlbjsKCiAgICAgIFRSQUNFXyhzdHJpbmcpKCJzcmNfbmF0aXZlID0gJXMgIHNyY19uYXRpdmVfbGVuID0gJWRcbiIsCiAgICAgICAgICAgICBzcmNfbmF0aXZlLCBzcmNfbmF0aXZlX2xlbik7CgogICAgICAvKiBkc3RfbmF0aXZlIHNlZW1zIHRvIGNvbnRhaW4gYXQgbW9zdCA0IGJ5dGVzIGZvciBlYWNoIGJ5dGUgaW4KICAgICAgICogdGhlIG9yaWdpbmFsIHNyY19uYXRpdmUgc3RyaW5nLiAgQ2hhbmdlIGlmIG5lZWQgYmUgc2luY2UgdGhpcwogICAgICAgKiBpc24ndCBkb2N1bWVudGVkIGJ5IHRoZSBzdHJ4ZnJtKCkgbWFuIHBhZ2UuICovCiAgICAgIGRzdF9uYXRpdmVfbGVuID0gNCAqIHNyY19uYXRpdmVfbGVuOwogICAgICBpZighKGRzdF9uYXRpdmUgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdF9uYXRpdmVfbGVuKSkpCiAgICAgIHsKICAgICAgICAgIEVSUigiVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBkc3RfbmF0aXZlXG4iLCBkc3RfbmF0aXZlX2xlbik7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgc2V0bG9jYWxlKExDX0NPTExBVEUsIGxjX2NvbGxhdGVfZGVmYXVsdCk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICAgICAgLyogVGhlIGFjdHVhbCB0cmFuc2xhdGlvbiBpcyBkb25lIGJ5IHRoZSBmb2xsb3dpbmcgY2FsbCB0bwogICAgICAgKiBzdHJ4ZnJtKCkuICBUaGUgc3Vycm91bmRpbmcgY29kZSBjb3VsZCBoYXZlIGJlZW4gc2ltcGxpZmllZAogICAgICAgKiBieSBjYWxsaW5nIHdjc3hmcm0oKSBpbnN0ZWFkIGV4Y2VwdCB0aGF0IHdjc3hmcm0oKSBpcyBub3QKICAgICAgICogYXZhaWxhYmxlIG9uIG9sZGVyIExpbnV4IHN5c3RlbXMgKFJlZEhhdCA0LjEgd2l0aAogICAgICAgKiBsaWJjLTUuMy4xMi0xNykuCiAgICAgICAqCiAgICAgICAqIEFsc28sIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHRyYW5zbGF0aW9uIGNvdWxkIGJlIGRvbmUgYnkKICAgICAgICogdmFyaW91cyB0YWJsZXMgYXMgaXQgaXMgZG9uZSBpbiBMQ01hcFN0cmluZ0EoKS4gIEhvd2V2ZXIsIEknbQogICAgICAgKiBub3Qgc3VyZSB3aGF0IHRob3NlIHRhYmxlcyBhcmUuICovCiAgICAgIHJldHVybmVkX2xlbiA9IHN0cnhmcm0oZHN0X25hdGl2ZSwgc3JjX25hdGl2ZSwgZHN0X25hdGl2ZV9sZW4pICsgMTsKICAgICAgCiAgICAgIGlmKHJldHVybmVkX2xlbiA+IGRzdF9uYXRpdmVfbGVuKQogICAgICB7CiAgICAgICAgICBkc3RfbmF0aXZlW2RzdF9uYXRpdmVfbGVuIC0gMV0gPSAwOwogICAgICAgICAgRVJSKCJzdHJ4ZnJtIHJldHVybmVkIGEgc3RyaW5nICglcykgdGhhdCB3YXMgbG9uZ2VyICglZCBieXRlcykgIiAKICAgICAgICAgICAgICAidGhhbiBleHBlY3RlZCAoJWQgYnl0ZXMpLlxuIiwgZHN0X25hdGl2ZSwgcmV0dXJuZWRfbGVuLAogICAgICAgICAgICAgIGRzdF9uYXRpdmVfbGVuKTsKCiAgICAgICAgICAvKiBTaW5jZSB0aGlzIGlzIGFuIGludGVybmFsIGVycm9yIEknbSBub3Qgc3VyZSB3aGF0IHRoZSBjb3JyZWN0CiAgICAgICAgICAgKiBlcnJvciBjb2RlIGlzLiAgKi8KICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CgogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgaWYoZHN0X25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIGRzdF9uYXRpdmVfbGVuID0gcmV0dXJuZWRfbGVuOwogICAgICAKICAgICAgVFJBQ0VfKHN0cmluZykoImRzdF9uYXRpdmUgPSAlcyAgZHN0X25hdGl2ZV9sZW4gPSAlZFxuIiwKICAgICAgICAgICAgIGRzdF9uYXRpdmUsIGRzdF9uYXRpdmVfbGVuKTsKCiAgICAgIGRzdHN0cl9saWJjX2xlbiA9IGRzdF9uYXRpdmVfbGVuOwogICAgICBpZighKGRzdHN0cl9saWJjID0gKHdjaGFyX3QgKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0c3RyX2xpYmNfbGVuICogc2l6ZW9mKHdjaGFyX3QpKSkpCiAgICAgIHsKICAgICAgICAgIEVSUigiVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBkc3RzdHJfbGliY1xuIiwKICAgICAgICAgICAgICBkc3RzdHJfbGliY19sZW4gKiBzaXplb2Yod2NoYXJfdCkpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIGlmKGRzdF9uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdF9uYXRpdmUpOwogICAgICAgICAgc2V0bG9jYWxlKExDX0NPTExBVEUsIGxjX2NvbGxhdGVfZGVmYXVsdCk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICAgICAgLyogQ29udmVydCB0aGUgbmF0aXZlIG11bHRpYnl0ZSBzdHJpbmcgdG8gYSBsaWJjIFVuaWNvZGUgc3RyaW5nLiAqLwogICAgICByZXR1cm5lZF9sZW4gPSBtYnN0b3djcyhkc3RzdHJfbGliYywgZHN0X25hdGl2ZSwgZHN0X25hdGl2ZV9sZW4pICsgMTsKCiAgICAgIC8qIFJlc3RvcmUgTENfQ09MTEFURSBub3cgdGhhdCB0aGUgbGFzdCBMQ19DT0xMQVRFIHNlbnNpdGl2ZQogICAgICAgKiBmdW5jdGlvbiBoYXMgcmV0dXJuZWQuICovCiAgICAgIHNldGxvY2FsZShMQ19DT0xMQVRFLCBsY19jb2xsYXRlX2RlZmF1bHQpOyAKCiAgICAgIGlmKHJldHVybmVkX2xlbiA9PSAwKQogICAgICB7CiAgICAgICAgICBFUlIoIm1ic3Rvd2NzIGZhaWxlZC4gIFRoZSBuYXRpdmUgdmVyc2lvbiBvZiB0aGUgdHJhbnNsYXRlZCBzdHJpbmcgIgogICAgICAgICAgICAgICIoJXMpIG1heSBjb250YWluIGFuIGludmFsaWQgY2hhcmFjdGVyLlxuIiwgZHN0X25hdGl2ZSk7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgaWYoZHN0X25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZSk7CiAgICAgICAgICBpZihkc3RzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0c3RyX2xpYmMpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgaWYoZHN0bGVuKQogICAgICB7CiAgICAgICAgICBpZihyZXR1cm5lZF9sZW4gPiBkc3RsZW4pCiAgICAgICAgICB7CiAgICAgICAgICAgICAgRVJSKCJtYnN0b3djcyByZXR1cm5lZCBhIHN0cmluZyB0aGF0IHdhcyBsb25nZXIgKCVkIGNoYXJzKSAiIAogICAgICAgICAgICAgICAgICAidGhhbiB0aGUgYnVmZmVyIHByb3ZpZGVkICglZCBjaGFycykuXG4iLCByZXR1cm5lZF9sZW4sCiAgICAgICAgICAgICAgICAgIGRzdGxlbik7CiAgICAgICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICAgICAgaWYoZHN0X25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZSk7CiAgICAgICAgICAgICAgaWYoZHN0c3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdHN0cl9saWJjKTsKICAgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgCiAgICAgICAgICB9CiAgICAgICAgICBkc3RsZW4gPSByZXR1cm5lZF9sZW47CgogICAgICAgICAgLyogQ29udmVydCBhIGxpYmMgVW5pY29kZSBzdHJpbmcgdG8gdGhlIGRlc3RpbmF0aW9uIHN0cmluZy4gKi8KICAgICAgICAgIGZvcihzdHJfaWR4ID0gMDsgc3RyX2lkeCA8IGRzdGxlbjsgc3RyX2lkeCsrKQogICAgICAgICAgewogICAgICAgICAgICAgIGRzdHN0cltzdHJfaWR4XSA9IGRzdHN0cl9saWJjW3N0cl9pZHhdOwogICAgICAgICAgfQogICAgICAgICAgVFJBQ0VfKHN0cmluZykoIjFzdCA0IGludCBzaXplZCBjaHVua3Mgb2YgZHN0c3RyID0gJXggJXggJXggJXhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAqKCgoaW50ICopZHN0c3RyKSArIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgKigoKGludCAqKWRzdHN0cikgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICooKChpbnQgKilkc3RzdHIpICsgMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAqKCgoaW50ICopZHN0c3RyKSArIDMpKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgIGRzdGxlbiA9IHJldHVybmVkX2xlbjsKICAgICAgfQogICAgICBUUkFDRV8oc3RyaW5nKSgiZHN0bGVuIChyZXR1cm4pID0gJWRcbiIsIGRzdGxlbik7CiAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgaWYoZHN0c3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdHN0cl9saWJjKTsKICAgICAgcmV0dXJuIGRzdGxlbjsKICB9CiAgZWxzZQogIHsKICAgIGludCAoKmYpKGludCk9aWRlbnRpdHk7IAoKICAgIGlmIChkc3RsZW49PTApCiAgICAgICAgcmV0dXJuIHNyY2xlbjsgIAogICAgaWYgKGRzdGxlbjxzcmNsZW4pIAogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAobWFwZmxhZ3MgJiBMQ01BUF9VUFBFUkNBU0UpCiAgICAgIGYgPSB0b3VwcGVyOwogICAgZWxzZSBpZiAobWFwZmxhZ3MgJiBMQ01BUF9MT1dFUkNBU0UpCiAgICAgIGYgPSB0b2xvd2VyOwogICAgZm9yIChpPTA7IGkgPCBzcmNsZW47IGkrKykKICAgICAgZHN0c3RyW2ldID0gKFdDSEFSKSBmKHNyY3N0cltpXSk7CiAgICByZXR1cm4gc3JjbGVuOwogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgT0xFMk5MU19Fc3RpbWF0ZU1hcHBpbmdMZW5ndGgKICoKICogRXN0aW1hdGVzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZXF1aXJlZCB0byBob2xkIHRoZSBzdHJpbmcKICogY29tcHV0ZWQgYnkgTENNYXBTdHJpbmdBLgogKgogKiBUaGUgc2l6ZSBpcyBhbHdheXMgb3Zlci1lc3RpbWF0ZWQsIHdpdGggYSBmaXhlZCBsaW1pdCBvbiB0aGUKICogYW1vdW50IG9mIGVzdGltYXRpb24gZXJyb3IuCiAqCiAqIE5vdGUgdGhhdCBsZW4gPT0gLTEgaXMgbm90IHBlcm1pdHRlZC4KICovCnN0YXRpYyBpbmxpbmUgaW50IE9MRTJOTFNfRXN0aW1hdGVNYXBwaW5nTGVuZ3RoKExDSUQgbGNpZCwgRFdPUkQgZHdNYXBGbGFncywKCQkJCQkJTFBDU1RSIHN0ciwgRFdPUkQgbGVuKQp7CiAgICAvKiBFc3RpbWF0ZSBvbmx5IGZvciBzbWFsbCBzdHJpbmdzIHRvIGtlZXAgdGhlIGVzdGltYXRpb24gZXJyb3IgZnJvbQogICAgICogYmVjb21pbmcgdG9vIGxhcmdlLiAqLwogICAgaWYgKGxlbiA8IDEyOCkgcmV0dXJuIGxlbiAqIDggKyA1OwogICAgZWxzZSByZXR1cm4gTENNYXBTdHJpbmdBKGxjaWQsIGR3TWFwRmxhZ3MsIHN0ciwgbGVuLCBOVUxMLCAwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ29tcGFyZVN0cmluZ0EJW0tFUk5FTDMyLjE0M10KICogQ29tcGFyZXMgdHdvIHN0cmluZ3MgdXNpbmcgbG9jYWxlCiAqCiAqIFJFVFVSTlMKICoKICogc3VjY2VzczogQ1NUUl9MRVNTX1RIQU4sIENTVFJfRVFVQUwsIENTVFJfR1JFQVRFUl9USEFOCiAqIGZhaWx1cmU6IDAKICoKICogTk9URVMKICoKICogRGVmYXVsdHMgdG8gYSB3b3JkIHNvcnQsIGJ1dCB1c2VzIGEgc3RyaW5nIHNvcnQgaWYKICogU09SVF9TVFJJTkdTT1JUIGlzIHNldC4KICogQ2FsbHMgU2V0TGFzdEVycm9yIGZvciBFUlJPUl9JTlZBTElEX0ZMQUdTLCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUi4KICogCiAqIEJVR1MKICoKICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSBsb2NhbGUKICoKICogRklYTUUKICogCiAqIFF1aXRlIGluZWZmaWNpZW50LgogKi8KVUlOVCBXSU5BUEkgQ29tcGFyZVN0cmluZ0EoCiAgICBEV09SRCBsY2lkLCAgICAgLyogbG9jYWxlIElEICovCiAgICBEV09SRCBmZHdTdHlsZSwgLyogY29tcGFyaXNvbi1zdHlsZSBvcHRpb25zICovCiAgICBMUENTVFIgczEsICAgICAgLyogZmlyc3Qgc3RyaW5nICovCiAgICBEV09SRCBsMSwgICAgICAgLyogbGVuZ3RoIG9mIGZpcnN0IHN0cmluZyAqLwogICAgTFBDU1RSIHMyLCAgICAgIC8qIHNlY29uZCBzdHJpbmcgKi8KICAgIERXT1JEIGwyKSAgICAgICAvKiBsZW5ndGggb2Ygc2Vjb25kIHN0cmluZyAqLwp7CiAgaW50IG1hcHN0cmluZ19mbGFnczsKICBpbnQgbGVuMSxsZW4yOwogIGludCByZXN1bHQ7CiAgTFBTVFIgc2sxLHNrMjsKICBUUkFDRSgiJXMgYW5kICVzXG4iLAoJZGVidWdzdHJfYSAoczEpLCBkZWJ1Z3N0cl9hIChzMikpOwoKICBpZiAoIChzMT09TlVMTCkgfHwgKHMyPT1OVUxMKSApCiAgeyAgICAKICAgIEVSUigiKHMxPSVzLHMyPSVzKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwgczEsIHMyKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CgogIGlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQogICAgRklYTUUoIklHTk9SRVNZTUJPTFMgbm90IHN1cHBvcnRlZFxuIik7CgogIGlmIChsMSA9PSAtMSkgbDEgPSBsc3RybGVuQShzMSk7CiAgaWYgKGwyID09IC0xKSBsMiA9IGxzdHJsZW5BKHMyKTsKICAJCiAgbWFwc3RyaW5nX2ZsYWdzID0gTENNQVBfU09SVEtFWSB8IGZkd1N0eWxlIDsKICBsZW4xID0gT0xFMk5MU19Fc3RpbWF0ZU1hcHBpbmdMZW5ndGgobGNpZCwgbWFwc3RyaW5nX2ZsYWdzLCBzMSwgbDEpOwogIGxlbjIgPSBPTEUyTkxTX0VzdGltYXRlTWFwcGluZ0xlbmd0aChsY2lkLCBtYXBzdHJpbmdfZmxhZ3MsIHMyLCBsMik7CgogIGlmICgobGVuMT09MCl8fChsZW4yPT0wKSkKICAgIHJldHVybiAwOyAgICAgLyogc29tZXRoaW5nIHdyb25nIGhhcHBlbmVkICovCgogIHNrMSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbGVuMSArIGxlbjIpOwogIHNrMiA9IHNrMSArIGxlbjE7CiAgaWYgKCAoIUxDTWFwU3RyaW5nQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMSxsMSxzazEsbGVuMSkpCgkgfHwgKCFMQ01hcFN0cmluZ0EobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczIsbDIsc2syLGxlbjIpKSApCiAgewogICAgRVJSKCJCdWcgaW4gTENtYXBTdHJpbmdBLlxuIik7CiAgICByZXN1bHQgPSAwOwogIH0KICBlbHNlCiAgewogICAgLyogc3RyY21wIGRvZXNuJ3QgbmVjZXNzYXJpbHkgcmV0dXJuIC0xLCAwLCBvciAxICovCiAgICByZXN1bHQgPSBzdHJjbXAoc2sxLHNrMik7CiAgfQogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxzazEpOwoKICBpZiAocmVzdWx0IDwgMCkKICAgIHJldHVybiAxOwogIGlmIChyZXN1bHQgPT0gMCkKICAgIHJldHVybiAyOwoKICAvKiBtdXN0IGJlIGdyZWF0ZXIsIGlmIHdlIHJlYWNoIHRoaXMgcG9pbnQgKi8KICByZXR1cm4gMzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ29tcGFyZVN0cmluZ1cJW0tFUk5FTDMyLjE0NF0KICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSBsb2NhbGUKICogRklYTUUgOiAgRG9lcyBvbmx5IHN0cmluZyBzb3J0LiAgU2hvdWxkCiAqIGJlIHJlaW1wbGVtZW50ZWQgdGhlIHNhbWUgd2F5IGFzIENvbXBhcmVTdHJpbmdBLgogKi8KVUlOVCBXSU5BUEkgQ29tcGFyZVN0cmluZ1coRFdPUkQgbGNpZCwgRFdPUkQgZmR3U3R5bGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBzMSwgRFdPUkQgbDEsIExQQ1dTVFIgczIsRFdPUkQgbDIpCnsKCWludCBsZW4scmV0OwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQoJCUZJWE1FKCJJR05PUkVOT05TUEFDRSBub3Qgc3VwcHJ0ZWRcbiIpOwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCgkJRklYTUUoIklHTk9SRVNZTUJPTFMgbm90IHN1cHBvcnRlZFxuIik7CgoJLyogSXMgc3RyY21wIGRlZmF1bHRpbmcgdG8gc3RyaW5nIHNvcnQgb3IgdG8gd29yZCBzb3J0Pz8gKi8KCS8qIEZJWE1FOiBIYW5kbGUgTk9STV9TVFJJTkdTT1JUICovCglsMSA9IChsMT09LTEpP2xzdHJsZW5XKHMxKTpsMTsKCWwyID0gKGwyPT0tMSk/bHN0cmxlblcoczIpOmwyOwoJbGVuID0gbDE8bDIgPyBsMTpsMjsKCXJldCA9IChmZHdTdHlsZSAmIE5PUk1fSUdOT1JFQ0FTRSkgPwoJCUNSVERMTF9fd2NzbmljbXAoczEsczIsbGVuKSA6IENSVERMTF93Y3NuY21wKHMxLHMyLGxlbik7CgkvKiBub3QgZXF1YWwsIHJldHVybiAxIG9yIDMgKi8KCWlmKHJldCE9MCkgcmV0dXJuIHJldCsyOwoJLyogc2FtZSBsZW4sIHJldHVybiAyICovCglpZihsMT09bDIpIHJldHVybiAyOwoJLyogdGhlIGxvbmdlciBvbmUgaXMgbGV4aWNhbGx5IGdyZWF0ZXIgKi8KCXJldHVybiAobDE8bDIpPyAxIDogMzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJT0xFX0dldEZvcm1hdEEJW0ludGVybmFsXQogKgogKiBGSVhNRQogKiAgICBJZiBkYXRlbGVuID09IDAsIGl0IHNob3VsZCByZXR1cm4gdGhlIHJlZ3VpcmVkIHN0cmluZyBsZW5ndGguCiAqCiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgc3R1ZmYgZm9yIEdldERhdGVGb3JtYXQoKSBhbmQgCiBHZXRUaW1lRm9ybWF0KCkuCgogIGQgICAgc2luZ2xlLWRpZ2l0IChubyBsZWFkaW5nIHplcm8pIGRheSAob2YgbW9udGgpCiAgZGQgICB0d28tZGlnaXQgZGF5IChvZiBtb250aCkKICBkZGQgIHNob3J0IGRheS1vZi13ZWVrIG5hbWUKICBkZGRkIGxvbmcgZGF5LW9mLXdlZWsgbmFtZQogIE0gICAgc2luZ2xlLWRpZ2l0IG1vbnRoCiAgTU0gICB0d28tZGlnaXQgbW9udGgKICBNTU0gIHNob3J0IG1vbnRoIG5hbWUKICBNTU1NIGZ1bGwgbW9udGggbmFtZQogIHkgICAgdHdvLWRpZ2l0IHllYXIsIG5vIGxlYWRpbmcgMAogIHl5ICAgdHdvLWRpZ2l0IHllYXIKICB5eXl5IGZvdXItZGlnaXQgeWVhcgogIGdnICAgZXJhIHN0cmluZwogIGggICAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIpCiAgaGggICBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIEggICAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDI0LWhvdXIpCiAgSEggICBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIG0gICAgbWludXRlcyB3aXRoIG5vIGxlYWRpbmcgemVybwogIG1tICAgbWludXRlcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIHMgICAgc2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybwogIHNzICAgc2Vjb25kcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIHQgICAgdGltZSBtYXJrZXIgKEEgb3IgUCkKICB0dCAgIHRpbWUgbWFya2VyIChBTSwgUE0pCiAgJycgICB1c2VkIHRvIHF1b3RlIGxpdGVyYWwgY2hhcmFjdGVycwogICcnICAgKHdpdGhpbiBhIHF1b3RlZCBzdHJpbmcpIGluZGljYXRlcyBhIGxpdGVyYWwgJwoKIFRoZXNlIGZ1bmN0aW9ucyBSRVFVSVJFIHZhbGlkIGxvY2FsZSwgZGF0ZSwgIGFuZCBmb3JtYXQuIAogKi8Kc3RhdGljIElOVCBPTEVfR2V0Rm9ybWF0QShMQ0lEIGxvY2FsZSwKCQkJICAgIERXT1JEIGZsYWdzLAoJCQkgICAgRFdPUkQgdGZsYWdzLAoJCQkgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgTFBDU1RSIF9mb3JtYXQsIAkvKmluKi8KCQkJICAgIExQU1RSIGRhdGUsCQkvKm91dCovCgkJCSAgICBJTlQgZGF0ZWxlbikKewogICBJTlQgaW5wb3MsIG91dHBvczsKICAgaW50IGNvdW50LCB0eXBlLCBpbnF1b3RlLCBPdmVyZmxvdzsKICAgY2hhciBidWZbNDBdOwogICBjaGFyIGZvcm1hdFs0MF07CiAgIGNoYXIgKiBwb3M7CiAgIGludCBidWZsZW47CgogICBjb25zdCBjaGFyICogX2RnZm10W10gPSB7ICIlZCIsICIlMDJkIiB9OwogICBjb25zdCBjaGFyICoqIGRnZm10ID0gX2RnZm10IC0gMTsgCgogICAvKiByZXBvcnQsIGZvciBkZWJ1Z2dpbmcgKi8KICAgVFJBQ0UoIigweCVseCwweCVseCwgMHglbHgsIHRpbWUoZD0lZCxoPSVkLG09JWQscz0lZCksIGZtdD0lcCBcJyVzXCcgLCAlcCwgbGVuPSVkKVxuIiwKICAgCSBsb2NhbGUsIGZsYWdzLCB0ZmxhZ3MsCgkgeHRpbWUtPndEYXksIHh0aW1lLT53SG91ciwgeHRpbWUtPndNaW51dGUsIHh0aW1lLT53U2Vjb25kLAoJIF9mb3JtYXQsIF9mb3JtYXQsIGRhdGUsIGRhdGVsZW4pOwogIAogICBpZihkYXRlbGVuID09IDApIHsKICAgICBGSVhNRSgiZGF0ZWxlbiA9IDAsIHJldHVybmluZyAyNTVcbiIpOwogICAgIHJldHVybiAyNTU7CiAgIH0KCiAgIC8qIGluaXRhbGl6ZSBzdGF0ZSB2YXJpYWJsZXMgYW5kIG91dHB1dCBidWZmZXIgKi8KICAgaW5wb3MgPSBvdXRwb3MgPSAwOwogICBjb3VudCA9IDA7IGlucXVvdGUgPSAwOyBPdmVyZmxvdyA9IDA7CiAgIHR5cGUgPSAnXDAnOwogICBkYXRlWzBdID0gYnVmWzBdID0gJ1wwJzsKICAgICAgCiAgIHN0cmNweShmb3JtYXQsX2Zvcm1hdCk7CgogICAvKiBhbHRlciB0aGUgZm9ybWF0c3RyaW5nLCB3aGlsZSBpdCB3b3JrcyBmb3IgYWxsIGxhbmd1YWdlcyBub3cgaW4gd2luZQogICBpdHMgcG9zc2libGUgdGhhdCBpdCBmYWlscyB3aGVuIHRoZSB0aW1lIGxvb2tzIGxpa2Ugc3M6bW06aGggYXMgZXhhbXBsZSovICAgCiAgIGlmICh0ZmxhZ3MgJiAoVElNRV9OT01JTlVURVNPUlNFQ09ORFMpKQogICB7IGlmICgocG9zID0gc3Ryc3RyICggZm9ybWF0LCAiOm1tIikpKQogICAgIHsgbWVtY3B5ICggcG9zLCBwb3MrMywgc3RybGVuKGZvcm1hdCktKHBvcy1mb3JtYXQpLTIgKTsKICAgICB9CiAgIH0KICAgaWYgKHRmbGFncyAmIChUSU1FX05PU0VDT05EUykpCiAgIHsgaWYgKChwb3MgPSBzdHJzdHIgKCBmb3JtYXQsICI6c3MiKSkpCiAgICAgeyBtZW1jcHkgKCBwb3MsIHBvcyszLCBzdHJsZW4oZm9ybWF0KS0ocG9zLWZvcm1hdCktMiApOwogICAgIH0KICAgfQogICAKICAgZm9yIChpbnBvcyA9IDA7OyBpbnBvcysrKSB7CiAgICAgIC8qIFRSQUNFKG9sZSwgIlNUQVRFIGlucG9zPSUyZCBvdXRwb3M9JTJkIGNvdW50PSVkIGlucXVvdGU9JWQgdHlwZT0lYyBidWYsZGF0ZSA9ICVjLCVjXG4iLCBpbnBvcywgb3V0cG9zLCBjb3VudCwgaW5xdW90ZSwgdHlwZSwgYnVmW2lucG9zXSwgZGF0ZVtvdXRwb3NdKTsgKi8KICAgICAgaWYgKGlucXVvdGUpIHsKCSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgICAgaWYgKGZvcm1hdFtpbnBvcysxXSA9PSAnXCcnKSB7CgkgICAgICAgaW5wb3MgKz0gMTsKCSAgICAgICBkYXRlW291dHBvcysrXSA9ICdcJyc7CgkgICAgfSBlbHNlIHsKCSAgICAgICBpbnF1b3RlID0gMDsKCSAgICAgICBjb250aW51ZTsgLyogd2UgZGlkIG5vdGhpbmcgdG8gdGhlIG91dHB1dCAqLwoJICAgIH0KCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wwJykgewoJICAgIGRhdGVbb3V0cG9zKytdID0gJ1wwJzsKCSAgICBpZiAob3V0cG9zID4gZGF0ZWxlbikgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOwoJIH0gZWxzZSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwoJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSB7CgkgICAgICAgT3ZlcmZsb3cgPSAxOwoJICAgICAgIGRhdGVbb3V0cG9zLTFdID0gJ1wwJzsgLyogdGhpcyBpcyB0aGUgbGFzdCBwbGFjZSB3aGVyZQoJCQkJCSBpdCdzIHNhZmUgdG8gd3JpdGUgKi8KCSAgICAgICBicmVhazsKCSAgICB9CgkgfQogICAgICB9IGVsc2UgaWYgKCAgKGNvdW50ICYmIChmb3JtYXRbaW5wb3NdICE9IHR5cGUpKQoJCSAgIHx8IGNvdW50ID09IDQKCQkgICB8fCAoY291bnQgPT0gMiAmJiBzdHJjaHIoImdoSG1zdCIsIHR5cGUpKSApCiAgICAgICB7CgkgICAgaWYgICAgICAgICAodHlwZSA9PSAnZCcpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCQkgIEdldExvY2FsZUluZm9BKGxvY2FsZSwKCQkJCSAgIExPQ0FMRV9TREFZTkFNRTEKCQkJCSAgICsgeHRpbWUtPndEYXlPZldlZWsgLSAxLAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkJCSAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgCgkJCQkJICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTEgCgkJCQkJICAgICsgeHRpbWUtPndEYXlPZldlZWsgLSAxLAoJCQkJCSAgICBidWYsIHNpemVvZihidWYpKTsKCQkgICAgICB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndEYXkpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ00nKSB7CgkgICAgICAgaWYgKGNvdW50ID09IDMpIHsKCQkgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgCgkJCQkgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEKCQkJCSAgICsgeHRpbWUtPndNb250aCAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDQpIHsKCQkgIEdldExvY2FsZUluZm9BKGxvY2FsZSwKCQkJCSAgIExPQ0FMRV9TTU9OVEhOQU1FMQoJCQkJICAgKyB4dGltZS0+d01vbnRoIC0gMSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJCSB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndNb250aCk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAneScpIHsKCSAgICAgICBpZiAoY291bnQgPT0gNCkgewoJCSAgICAgIHNwcmludGYoYnVmLCAiJWQiLCB4dGltZS0+d1llYXIpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJCSAgc3RyY3B5KGJ1ZiwgInl5eSIpOwoJCSAgV0FSTigidW5rbm93biBmb3JtYXQsIGM9JWMsIG49JWRcbiIsICB0eXBlLCBjb3VudCk7CgkJIH0gZWxzZSB7CgkJICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d1llYXIgJSAxMDApOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ2cnKSB7CgkgICAgICAgaWYgICAgICAgIChjb3VudCA9PSAyKSB7CgkJICBGSVhNRSgiTE9DQUxFX0lDQUxFTkRBUlRZUEUgdW5pbXAuXG4iKTsKCQkgIHN0cmNweShidWYsICJBRCIpOwoJICAgIH0gZWxzZSB7CgkJICBzdHJjcHkoYnVmLCAiZyIpOwoJCSAgV0FSTigidW5rbm93biBmb3JtYXQsIGM9JWMsIG49JWRcbiIsIHR5cGUsIGNvdW50KTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdoJykgewoJICAgICAgIC8qIGdpdmVzIHVzIGhvdXJzIDE6MDAgLS0gMTI6MDAgKi8KCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCAoeHRpbWUtPndIb3VyLTEpJTEyICsxKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ0gnKSB7CgkgICAgICAgLyogMjQtaG91ciB0aW1lICovCgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndIb3VyKTsKCSAgICB9IGVsc2UgaWYgKCB0eXBlID09ICdtJykgewoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53TWludXRlKTsKCSAgICB9IGVsc2UgaWYgKCB0eXBlID09ICdzJykgewoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53U2Vjb25kKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3QnKSB7CgkgICAgICAgaWYgICAgICAgIChjb3VudCA9PSAxKSB7CgkJICBzcHJpbnRmKGJ1ZiwgIiVjIiwgKHh0aW1lLT53SG91ciA8IDEyKSA/ICdBJyA6ICdQJyk7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAyKSB7CgkJICAvKiBzcHJpbnRmKGJ1ZiwgIiVzIiwgKHh0aW1lLT53SG91ciA8IDEyKSA/ICJBTSIgOiAiUE0iKTsgKi8KCQkgIEdldExvY2FsZUluZm9BKGxvY2FsZSwKCQkJCSAgICh4dGltZS0+d0hvdXI8MTIpIAoJCQkJICAgPyBMT0NBTEVfUzExNTkgOiBMT0NBTEVfUzIzNTksCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9CgkgICAgfTsKCgkgICAgLyogd2UgbmVlZCB0byBjaGVjayB0aGUgbmV4dCBjaGFyIGluIHRoZSBmb3JtYXQgc3RyaW5nIAoJICAgICAgIGFnYWluLCBubyBtYXR0ZXIgd2hhdCBoYXBwZW5lZCAqLwoJICAgIGlucG9zLS07CgkgICAgCgkgICAgLyogYWRkIHRoZSBjb250ZW50cyBvZiBidWYgdG8gdGhlIG91dHB1dCAqLwoJICAgIGJ1ZmxlbiA9IHN0cmxlbihidWYpOwoJICAgIGlmIChvdXRwb3MgKyBidWZsZW4gPCBkYXRlbGVuKSB7CgkgICAgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsgLyogZm9yIHN0cmNhdCB0byBob29rIG9udG8gKi8KCQkgc3RyY2F0KGRhdGUsIGJ1Zik7CgkgICAgICAgb3V0cG9zICs9IGJ1ZmxlbjsKCSAgICB9IGVsc2UgewoJICAgICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CgkgICAgICAgc3RybmNhdChkYXRlLCBidWYsIGRhdGVsZW4gLSBvdXRwb3MpOwoJCSBkYXRlW2RhdGVsZW4gLSAxXSA9ICdcMCc7CgkJIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKCSAgICAgICBXQVJOKCJpbnN1ZmZpY2llbnQgYnVmZmVyXG4iKTsKCQkgcmV0dXJuIDA7CgkgICAgfQoKCSAgICAvKiByZXNldCB0aGUgdmFyaWFibGVzIHdlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGlzIGl0ZW0gKi8KCSAgICBjb3VudCA9IDA7CgkgICAgdHlwZSA9ICdcMCc7CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcMCcpIHsKCSAgICAvKiB3ZSBjYW4ndCBjaGVjayBmb3IgdGhpcyBhdCB0aGUgbG9vcC1oZWFkLCBiZWNhdXNlCgkgICAgICAgdGhhdCBicmVha3MgdGhlIHByaW50aW5nIG9mIHRoZSBsYXN0IGZvcm1hdC1pdGVtICovCgkgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKCSAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChjb3VudCkgewoJICAgIC8qIGNvbnRpbnVpbmcgYSBjb2RlIGZvciBhbiBpdGVtICovCgkgICAgY291bnQgKz0xOwoJICAgIGNvbnRpbnVlOwoJIH0gZWxzZSBpZiAoc3RyY2hyKCJoSG1zdHlNZGciLCBmb3JtYXRbaW5wb3NdKSkgewoJICAgIHR5cGUgPSBmb3JtYXRbaW5wb3NdOwoJICAgIGNvdW50ID0gMTsKCSAgICBjb250aW51ZTsKCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wnJykgewoJICAgIGlucXVvdGUgPSAxOwoJICAgIGNvbnRpbnVlOwogICAgICAgfSBlbHNlIHsKCSAgICBkYXRlW291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CgkgfQogICAgICAvKiBub3cgZGVhbCB3aXRoIGEgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93ICovCiAgICAgIGlmIChvdXRwb3MgPj0gZGF0ZWxlbikgewogICAgICAgZGF0ZVtkYXRlbGVuIC0gMV0gPSAnXDAnOwogICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgfQogICAKICAgaWYgKE92ZXJmbG93KSB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgfTsKCiAgIC8qIGZpbmlzaCBpdCBvZmYgd2l0aCBhIHN0cmluZyB0ZXJtaW5hdG9yICovCiAgIG91dHBvcysrOwogICAvKiBzYW5pdHkgY2hlY2sgKi8KICAgaWYgKG91dHBvcyA+IGRhdGVsZW4tMSkgb3V0cG9zID0gZGF0ZWxlbi0xOwogICBkYXRlW291dHBvc10gPSAnXDAnOwogICAKICAgVFJBQ0UoIk9MRV9HZXRGb3JtYXRBIHJldHVybnMgc3RyaW5nICclcycsIGxlbiAlZFxuIiwKCSAgICAgICBkYXRlLCBvdXRwb3MpOwogICByZXR1cm4gb3V0cG9zOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9MRV9HZXRGb3JtYXRXIFtJTlRFUk5BTF0KICovCnN0YXRpYyBJTlQgT0xFX0dldEZvcm1hdFcoTENJRCBsb2NhbGUsIERXT1JEIGZsYWdzLCBEV09SRCB0ZmxhZ3MsCgkJCSAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICBMUENXU1RSIGZvcm1hdCwKCQkJICAgIExQV1NUUiBvdXRwdXQsIElOVCBvdXRsZW4pCnsKICAgSU5UICAgaW5wb3MsIG91dHBvczsKICAgaW50ICAgICBjb3VudCwgdHlwZT0wLCBpbnF1b3RlOwogICBpbnQgICAgIE92ZXJmbG93OyAvKiBsb29wIGNoZWNrICovCiAgIFdDSEFSICAgYnVmWzQwXTsKICAgaW50ICAgICBidWZsZW49MDsKICAgV0NIQVIgICBhcmcwW10gPSB7MH0sIGFyZzFbXSA9IHsnJScsJ2QnLDB9OwogICBXQ0hBUiAgIGFyZzJbXSA9IHsnJScsJzAnLCcyJywnZCcsMH07CiAgIFdDSEFSICAqYXJnYXJyWzNdOwogICBpbnQgICAgIGRhdGV2YXJzPTAsIHRpbWV2YXJzPTA7CgogICBhcmdhcnJbMF0gPSBhcmcwOwogICBhcmdhcnJbMV0gPSBhcmcxOwogICBhcmdhcnJbMl0gPSBhcmcyOwoKICAgLyogbWFrZSBhIGRlYnVnIHJlcG9ydCAqLwogICBUUkFDRSgiYXJnczogMHglbHgsIDB4JWx4LCAweCVseCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10OiVzIChhdCAlcCksICIKICAgCSAgICAgICIlcCB3aXRoIG1heCBsZW4gJWRcbiIsCgkgbG9jYWxlLCBmbGFncywgdGZsYWdzLAoJIHh0aW1lLT53RGF5LCB4dGltZS0+d0hvdXIsIHh0aW1lLT53TWludXRlLCB4dGltZS0+d1NlY29uZCwKCSBkZWJ1Z3N0cl93KGZvcm1hdCksIGZvcm1hdCwgb3V0cHV0LCBvdXRsZW4pOwogICAKICAgaWYob3V0bGVuID09IDApIHsKICAgICBGSVhNRSgib3V0bGVuID0gMCwgcmV0dXJuaW5nIDI1NVxuIik7CiAgICAgcmV0dXJuIDI1NTsKICAgfQoKICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSB2YXJpYWJsZXMgKi8KICAgaW5wb3MgPSBvdXRwb3MgPSAwOwogICBjb3VudCA9IDA7CiAgIGlucXVvdGUgPSBPdmVyZmxvdyA9IDA7CiAgIC8qIHRoaXMgaXMgcmVhbGx5IGp1c3QgYSBzYW5pdHkgY2hlY2sgKi8KICAgb3V0cHV0WzBdID0gYnVmWzBdID0gMDsKICAgCiAgIC8qIHRoaXMgbG9vcCBpcyB0aGUgY29yZSBvZiB0aGUgZnVuY3Rpb24gKi8KICAgZm9yIChpbnBvcyA9IDA7IC8qIHdlIGhhdmUgc2V2ZXJhbCBicmVhayBwb2ludHMgKi8gOyBpbnBvcysrKSB7CiAgICAgIGlmIChpbnF1b3RlKSB7CgkgaWYgKGZvcm1hdFtpbnBvc10gPT0gKFdDSEFSKSAnXCcnKSB7CgkgICAgaWYgKGZvcm1hdFtpbnBvcysxXSA9PSAnXCcnKSB7CgkgICAgICAgaW5wb3MrKzsKCSAgICAgICBvdXRwdXRbb3V0cG9zKytdID0gJ1wnJzsKCSAgICB9IGVsc2UgewoJICAgICAgIGlucXVvdGUgPSAwOwoJICAgICAgIGNvbnRpbnVlOwoJICAgIH0KCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gMCkgewoJICAgIG91dHB1dFtvdXRwb3MrK10gPSAwOwoJICAgIGlmIChvdXRwb3MgPiBvdXRsZW4pIE92ZXJmbG93ID0gMTsKCSAgICBicmVhazsgIC8qICBub3JtYWwgZXhpdCAod2l0aGluIGEgcXVvdGUpICovCgkgfSBlbHNlIHsKCSAgICBvdXRwdXRbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsgLyogY29weSBpbnB1dCAqLwoJICAgIGlmIChvdXRwb3MgPiBvdXRsZW4pIHsKCSAgICAgICBPdmVyZmxvdyA9IDE7CgkgICAgICAgb3V0cHV0W291dHBvcy0xXSA9IDA7IAoJICAgICAgIGJyZWFrOwoJICAgIH0KCSB9CiAgICAgIH0gZWxzZSBpZiAoICAoY291bnQgJiYgKGZvcm1hdFtpbnBvc10gIT0gdHlwZSkpCgkJICAgfHwgKCAoY291bnQ9PTQgJiYgdHlwZSA9PSd5JykgfHwKCQkJKGNvdW50PT00ICYmIHR5cGUgPT0nTScpIHx8CgkJCShjb3VudD09NCAmJiB0eXBlID09J2QnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdnJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0naCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J0gnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdtJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0ncycpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J3QnKSApICApIHsKCSBpZiAgICAgICAgKHR5cGUgPT0gJ2QnKSB7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLAoJCQkgICAgIExPQ0FMRV9TREFZTkFNRTEgKyB4dGltZS0+d0RheU9mV2VlayAtMSwKCQkJICAgICBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsCgkJCQlMT0NBTEVfU0FCQlJFVkRBWU5BTUUxICsKCQkJCXh0aW1lLT53RGF5T2ZXZWVrIC0xLAoJCQkJYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgeHRpbWUtPndEYXkgKTsKCSAgICB9OwoJIH0gZWxzZSBpZiAodHlwZSA9PSAnTScpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsICBMT0NBTEVfU01PTlRITkFNRTEgKwoJCQkJeHRpbWUtPndNb250aCAtMSwgYnVmLAoJCQkJc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgeHRpbWUtPndNb250aCk7CgkgICAgfQoJIH0gZWxzZSBpZiAodHlwZSA9PSAneScpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCSAgICAgICB3c25wcmludGZXKGJ1ZiwgNiwgYXJnYXJyWzFdIC8qICIlZCIgKi8sCgkJCSB4dGltZS0+d1llYXIpOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJ5eXkiLCA1KTsKCSAgICB9IGVsc2UgewoJICAgICAgIHdzbnByaW50ZlcoYnVmLCA2LCBhcmdhcnJbY291bnRdLAoJCQkgICAgeHRpbWUtPndZZWFyICUgMTAwKTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICdnJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJICAgICAgIEZJWE1FKCJMT0NBTEVfSUNBTEVOREFSVFlQRSB1bmltcGxlbWVudGVkXG4iKTsKCSAgICAgICBsc3RyY3B5bkF0b1coYnVmLCAiQUQiLCA1KTsKCSAgICB9IGVsc2UgewoJICAgICAgIC8qIFdpbiBBUEkgc2V6IHdlIGNvcHkgaXQgdmVyYmF0aW0gKi8KCSAgICAgICBsc3RyY3B5bkF0b1coYnVmLCAiZyIsIDUpOwoJICAgIH0KCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ2gnKSB7CgkgICAgLyogaG91cnMgMTowMC0xMjowMCAtLS0gaXMgdGhpcyByaWdodD8gKi8KCSAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgCgkJCSAoeHRpbWUtPndIb3VyLTEpJTEyICsxKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ0gnKSB7CgkgICAgd3NucHJpbnRmVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sIAoJCQkgeHRpbWUtPndIb3VyKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ20nICkgewoJICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLAoJCQkgeHRpbWUtPndNaW51dGUpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAncycgKSB7CgkgICAgd3NucHJpbnRmVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sCgkJCSB4dGltZS0+d1NlY29uZCk7CgkgfSBlbHNlIGlmICh0eXBlID09ICd0JykgewoJICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwgKHh0aW1lLT53SG91ciA8IDEyKSA/CgkJCSAgICAgTE9DQUxFX1MxMTU5IDogTE9DQUxFX1MyMzU5LAoJCQkgICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikgKTsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDEpIHsKCSAgICAgICBidWZbMV0gPSAwOwoJICAgIH0KfQoKCSAvKiBubyBtYXR0ZXIgd2hhdCBoYXBwZW5lZCwgIHdlIG5lZWQgdG8gY2hlY2sgdGhpcyBuZXh0IAoJICAgIGNoYXJhY3RlciB0aGUgbmV4dCB0aW1lIHdlIGxvb3AgdGhyb3VnaCAqLwoJIGlucG9zLS07CgoJIC8qIGNhdCBidWYgb250byB0aGUgb3V0cHV0ICovCgkgb3V0bGVuID0gbHN0cmxlblcoYnVmKTsKCSBpZiAob3V0cG9zICsgYnVmbGVuIDwgb3V0bGVuKSB7CiAgICAgICAgICAgIGxzdHJjcHlXKCBvdXRwdXQgKyBvdXRwb3MsIGJ1ZiApOwoJICAgIG91dHBvcyArPSBidWZsZW47CgkgfSBlbHNlIHsKICAgICAgICAgICAgbHN0cmNweW5XKCBvdXRwdXQgKyBvdXRwb3MsIGJ1Ziwgb3V0bGVuIC0gb3V0cG9zICk7CgkgICAgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOyAvKiBBYm5vcm1hbCBleGl0ICovCgkgfQoKCSAvKiByZXNldCB0aGUgdmFyaWFibGVzIHdlIHVzZWQgdGhpcyB0aW1lICovCgkgY291bnQgPSAwOwoJIHR5cGUgPSAnXDAnOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gMCkgewoJIC8qIHdlIGNhbid0IGNoZWNrIGZvciB0aGlzIGF0IHRoZSBiZWdpbm5pbmcsICBiZWNhdXNlIHRoYXQgCgkgd291bGQga2VlcCB1cyBmcm9tIHByaW50aW5nIGEgZm9ybWF0IHNwZWMgdGhhdCBlbmRlZCB0aGUgCgkgc3RyaW5nICovCgkgb3V0cHV0W291dHBvc10gPSAwOwoJIGJyZWFrOyAgLyogIE5PUk1BTCBFWElUICAqLwogICAgICB9IGVsc2UgaWYgKGNvdW50KSB7CgkgLyogaG93IHdlIGtlZXAgdHJhY2sgb2YgdGhlIG1pZGRsZSBvZiBhIGZvcm1hdCBzcGVjICovCgkgY291bnQrKzsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmICggKGRhdGV2YXJzICYmIChmb3JtYXRbaW5wb3NdPT0nZCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdNJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3knIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nZycpICApIHx8CgkJICAodGltZXZhcnMgJiYgKGZvcm1hdFtpbnBvc109PSdIJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J2gnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nbScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdzJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3QnKSApICAgICkgewoJIHR5cGUgPSBmb3JtYXRbaW5wb3NdOwoJIGNvdW50ID0gMTsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSBpbnF1b3RlID0gMTsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIHsKCSAvKiB1bnF1b3RlZCBsaXRlcmFscyAqLwoJIG91dHB1dFtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwogICAgICB9CiAgIH0KCiAgIGlmIChPdmVyZmxvdykgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIFdBUk4oIiBidWZmZXIgb3ZlcmZsb3dcbiIpOwogICB9OwoKICAgLyogZmluYWwgc3RyaW5nIHRlcm1pbmF0b3IgYW5kIHNhbml0eSBjaGVjayAqLwogICBvdXRwb3MrKzsKICAgaWYgKG91dHBvcyA+IG91dGxlbi0xKSBvdXRwb3MgPSBvdXRsZW4tMTsKICAgb3V0cHV0W291dHBvc10gPSAnMCc7CgogICBUUkFDRSgiIHJldHVybmluZyAlc1xuIiwgZGVidWdzdHJfdyhvdXRwdXQpKTsKCQogICByZXR1cm4gKCFPdmVyZmxvdykgPyBvdXRsZW4gOiAwOwogICAKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldERhdGVGb3JtYXRBCVtLRVJORUwzMi4zMTBdCiAqIE1ha2VzIGFuIEFTQ0lJIHN0cmluZyBvZiB0aGUgZGF0ZQogKgogKiBUaGlzIGZ1bmN0aW9uIHVzZXMgZm9ybWF0IHRvIGZvcm1hdCB0aGUgZGF0ZSwgIG9yLCAgaWYgZm9ybWF0CiAqIGlzIE5VTEwsIHVzZXMgdGhlIGRlZmF1bHQgZm9yIHRoZSBsb2NhbGUuICBmb3JtYXQgaXMgYSBzdHJpbmcKICogb2YgbGl0ZXJhbCBmaWVsZHMgYW5kIGNoYXJhY3RlcnMgYXMgZm9sbG93czoKICoKICogLSBkICAgIHNpbmdsZS1kaWdpdCAobm8gbGVhZGluZyB6ZXJvKSBkYXkgKG9mIG1vbnRoKQogKiAtIGRkICAgdHdvLWRpZ2l0IGRheSAob2YgbW9udGgpCiAqIC0gZGRkICBzaG9ydCBkYXktb2Ytd2VlayBuYW1lCiAqIC0gZGRkZCBsb25nIGRheS1vZi13ZWVrIG5hbWUKICogLSBNICAgIHNpbmdsZS1kaWdpdCBtb250aAogKiAtIE1NICAgdHdvLWRpZ2l0IG1vbnRoCiAqIC0gTU1NICBzaG9ydCBtb250aCBuYW1lCiAqIC0gTU1NTSBmdWxsIG1vbnRoIG5hbWUKICogLSB5ICAgIHR3by1kaWdpdCB5ZWFyLCBubyBsZWFkaW5nIDAKICogLSB5eSAgIHR3by1kaWdpdCB5ZWFyCiAqIC0geXl5eSBmb3VyLWRpZ2l0IHllYXIKICogLSBnZyAgIGVyYSBzdHJpbmcKICoKICovCklOVCBXSU5BUEkgR2V0RGF0ZUZvcm1hdEEoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCgkJCSAgICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgICAgTFBDU1RSIGZvcm1hdCwgTFBTVFIgZGF0ZSxJTlQgZGF0ZWxlbikgCnsKICAgCiAgY2hhciBmb3JtYXRfYnVmWzQwXTsKICBMUENTVFIgdGhpc2Zvcm1hdDsKICBTWVNURU1USU1FIHQ7CiAgTFBTWVNURU1USU1FIHRoaXN0aW1lOwogIExDSUQgdGhpc2xvY2FsZTsKICBJTlQgcmV0OwoKICBUUkFDRSgiKDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsCgkgICAgICBsb2NhbGUsZmxhZ3MseHRpbWUsZm9ybWF0LGRhdGUsZGF0ZWxlbik7CiAgCiAgaWYgKCFsb2NhbGUpIHsKICAgICBsb2NhbGUgPSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQ7CiAgICAgfTsKICAKICBpZiAobG9jYWxlID09IExPQ0FMRV9TWVNURU1fREVGQVVMVCkgewogICAgIHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogIH0gZWxzZSBpZiAobG9jYWxlID09IExPQ0FMRV9VU0VSX0RFRkFVTFQpIHsKICAgICB0aGlzbG9jYWxlID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CiAgfSBlbHNlIHsKICAgICB0aGlzbG9jYWxlID0gbG9jYWxlOwogICB9OwoKICBpZiAoeHRpbWUgPT0gTlVMTCkgewogICAgIEdldFN5c3RlbVRpbWUoJnQpOwogICAgIHRoaXN0aW1lID0gJnQ7CiAgfSBlbHNlIHsKICAgICB0aGlzdGltZSA9IHh0aW1lOwogIH07CgogIGlmIChmb3JtYXQgPT0gTlVMTCkgewogICAgIEdldExvY2FsZUluZm9BKHRoaXNsb2NhbGUsICgoZmxhZ3MmREFURV9MT05HREFURSkgCgkJCQkgICA/IExPQ0FMRV9TTE9OR0RBVEUKCQkJCSAgIDogTE9DQUxFX1NTSE9SVERBVEUpLAoJCSAgICAgIGZvcm1hdF9idWYsIHNpemVvZihmb3JtYXRfYnVmKSk7CiAgICAgdGhpc2Zvcm1hdCA9IGZvcm1hdF9idWY7CiAgfSBlbHNlIHsKICAgICB0aGlzZm9ybWF0ID0gZm9ybWF0OwogIH07CgogIAogIHJldCA9IE9MRV9HZXRGb3JtYXRBKHRoaXNsb2NhbGUsIGZsYWdzLCAwLCB0aGlzdGltZSwgdGhpc2Zvcm1hdCwgCgkJICAgICAgIGRhdGUsIGRhdGVsZW4pOwogIAoKICAgVFJBQ0UoCgkgICAgICAgIkdldERhdGVGb3JtYXRBKCkgcmV0dXJuaW5nICVkLCB3aXRoIGRhdGE9JXNcbiIsCgkgICAgICAgcmV0LCBkYXRlKTsKICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXREYXRlRm9ybWF0VwlbS0VSTkVMMzIuMzExXQogKiBNYWtlcyBhIFVuaWNvZGUgc3RyaW5nIG9mIHRoZSBkYXRlCiAqCiAqIEFjdHMgdGhlIHNhbWUgYXMgR2V0RGF0ZUZvcm1hdEEoKSwgIGV4Y2VwdCB0aGF0IGl0J3MgVW5pY29kZS4KICogQWNjZXB0cyAmIHJldHVybnMgc2l6ZXMgYXMgY291bnRzIG9mIFVuaWNvZGUgY2hhcmFjdGVycy4KICoKICovCklOVCBXSU5BUEkgR2V0RGF0ZUZvcm1hdFcoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCgkJCSAgICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgICAgTFBDV1NUUiBmb3JtYXQsCgkJCSAgICAgIExQV1NUUiBkYXRlLCBJTlQgZGF0ZWxlbikKewogICB1bnNpZ25lZCBzaG9ydCBkYXRlYXJyW10gPSB7JzEnLCc5JywnOScsJzQnLCctJywnMScsJy0nLCcxJywwfTsKCiAgIEZJWE1FKCJTVFVCIChzaG91bGQgY2FsbCBPTEVfR2V0Rm9ybWF0VylcbiIpOyAgIAogICBsc3RyY3B5blcoZGF0ZSwgZGF0ZWFyciwgZGF0ZWxlbik7CiAgIHJldHVybiAoICBkYXRlbGVuIDwgOSkgPyBkYXRlbGVuIDogOTsKICAgCiAgIAp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0c0EJKEtFUk5FTDMyLjE5OCkKICovCkJPT0wgV0lOQVBJIEVudW1EYXRlRm9ybWF0c0EoCiAgREFURUZNVF9FTlVNUFJPQ0EgbHBEYXRlRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCAgRFdPUkQgZHdGbGFncykKewogIExDSUQgTG9jID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7IAogIGlmKCFscERhdGVGbXRFbnVtUHJvYykKICAgIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICBzd2l0Y2goIExvYyApCiB7CgogICBjYXNlIDB4MDAwMDA0MDc6ICAvKiAoTG9jLCJkZV9ERSIpICovCiAgIHsKICAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC5NTS55eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NLnl5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTU0ueXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTS55eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLGQuIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuIE1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgICB9CiAgIH0gICAgICAgCgogICBjYXNlIDB4MDAwMDA0MGM6ICAvKiAoTG9jLCJmcl9GUiIpICovCiAgIHsKICAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQuTU0ueXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLU1NLXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQgZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTSB5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgICB9CiAgIH0KCiAgIGNhc2UgMHgwMDAwMGMwYzogIC8qIChMb2MsImZyX0NBIikgKi8KICAgewogICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5LU1NLWRkIikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC1NTS15eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXkgTU0gZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgIH0KICAgfQoKICAgY2FzZSAweDAwMDAwODA5OiAgLyogKExvYywiZW5fVUsiKSAqLyAKICB7ICAgIAogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDBjMDk6ICAvKiAoTG9jLCJlbl9BVSIpICovICAgCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDEwMDk6ICAvKiAoTG9jLCJlbl9DQSIpICovIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eS1NTS1kZCIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTS9kZC95eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLU1NTS15eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NTU0gZCwgeXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAxNDA5OiAgLyogKExvYywiZW5fTloiKSAqLyAKICB7ICAgIAogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTU0ueXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLCBkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAxODA5OiAgLyogKExvYywiZW5fSUUiKSAqLyAgIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk0ueXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMWMwOTogIC8qIChMb2MsImVuX1pBIikgKi8gICAKICB7ICAgIAogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXkvTU0vZGQiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDIwMDk6ICAvKiAoTG9jLCJlbl9KTSIpICovICAKICB7ICAgIAogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLE1NTU0gZGQseXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NTU0gZGQseXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsZGQgTU1NTSx5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQgTU1NTSx5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDI4MDk6ICAvKiAoTG9jLCJlbl9CWiIpICovCiAgIGNhc2UgMHgwMDAwMmMwOTogIC8qIChMb2MsImVuX1RUIikgKi8gIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsZGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBkZWZhdWx0OiAgLyogZGVmYXVsdCB0byBVUyBFbmdsaXNoICJlbl9VUyIgKi8KICB7CiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNL2QveXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk0vZC95eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTS9kZC95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU0vZGQveXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXkvTU0vZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLU1NTS15eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLCBNTU1NIGRkLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU1NTSBkZCwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsIGRkIE1NTU0sIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CiB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzVwkoS0VSTkVMMzIuMTk5KQogKi8KQk9PTCBXSU5BUEkgRW51bURhdGVGb3JtYXRzVygKICBEQVRFRk1UX0VOVU1QUk9DVyBscERhdGVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCnsKICBGSVhNRSgiKCVwLCAlbGQsICVsZCk6IHN0dWJcbiIsIGxwRGF0ZUZtdEVudW1Qcm9jLCBMb2NhbGUsIGR3RmxhZ3MpOwogIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1UaW1lRm9ybWF0c0EJKEtFUk5FTDMyLjIxMCkKICovCkJPT0wgV0lOQVBJIEVudW1UaW1lRm9ybWF0c0EoCiAgVElNRUZNVF9FTlVNUFJPQ0EgbHBUaW1lRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQp7CiAgTENJRCBMb2MgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsgCiAgaWYoIWxwVGltZUZtdEVudW1Qcm9jKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgaWYoZHdGbGFncykKICAgIHsKICAgICAgRklYTUUoIlVua25vd24gdGltZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKICAgIH0KCiAgc3dpdGNoKCBMb2MgKQogewogICBjYXNlIDB4MDAwMDA0MDc6ICAvKiAoTG9jLCJkZV9ERSIpICovCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEgubW0iKSkgcmV0dXJuIFRSVUU7IAogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSC5tbSIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSC5tbSdVaHInIikpIHJldHVybiBUUlVFOwogICAgcmV0dXJuIFRSVUU7CiAgIH0gICAgICAgCgogICBjYXNlIDB4MDAwMDA0MGM6ICAvKiAoTG9jLCJmcl9GUiIpICovCiAgIGNhc2UgMHgwMDAwMGMwYzogIC8qIChMb2MsImZyX0NBIikgKi8KICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEgubW0iKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIJ2gnbW0iKSkgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gVFJVRTsKICAgfQoKICAgY2FzZSAweDAwMDAwODA5OiAgLyogKExvYywiZW5fVUsiKSAqLwogICBjYXNlIDB4MDAwMDBjMDk6ICAvKiAoTG9jLCJlbl9BVSIpICovIAogICBjYXNlIDB4MDAwMDE0MDk6ICAvKiAoTG9jLCJlbl9OWiIpICovCiAgIGNhc2UgMHgwMDAwMTgwOTogIC8qIChMb2MsImVuX0lFIikgKi8gCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gVFJVRTsKICAgfQoKICAgY2FzZSAweDAwMDAxYzA5OiAgLyogKExvYywiZW5fWkEiKSAqLyAgIAogICBjYXNlIDB4MDAwMDI4MDk6ICAvKiAoTG9jLCJlbl9CWiIpICovCiAgIGNhc2UgMHgwMDAwMmMwOTogIC8qIChMb2MsImVuX1RUIikgKi8gCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaGg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7IAogICAgcmV0dXJuIFRSVUU7ICAKICAgfQoKICAgZGVmYXVsdDogIC8qIGRlZmF1bHQgdG8gVVMgc3R5bGUgImVuX1VTIiAqLyAgIAogICB7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImhoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9CiB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzVwkoS0VSTkVMMzIuMjExKQogKi8KQk9PTCBXSU5BUEkgRW51bVRpbWVGb3JtYXRzVygKICBUSU1FRk1UX0VOVU1QUk9DVyBscFRpbWVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCnsKICBGSVhNRSgiKCVwLCVsZCwlbGQpOiBzdHViXG4iLCBscFRpbWVGbXRFbnVtUHJvYywgTG9jYWxlLCBkd0ZsYWdzKTsKICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQganVzdCBsb2NhbGx5ICEKICogIERlc2NyaXB0aW9uOiBJbnZlcnRzIGEgc3RyaW5nLgogKi8gCnN0YXRpYyB2b2lkIE9MRV9JbnZlcnRTdHJpbmcoY2hhciogc3RyaW5nKQp7ICAgIAogICAgY2hhciAgICBzVG1wQXJyYXlbMTI4XTsKICAgIElOVCAgICAgY291bnRlciwgaSA9IDA7CgogICAgZm9yIChjb3VudGVyID0gc3RybGVuKHN0cmluZyk7IGNvdW50ZXIgPiAwOyBjb3VudGVyLS0pCiAgICB7CiAgICAgICAgbWVtY3B5KHNUbXBBcnJheSArIGksIHN0cmluZyArIGNvdW50ZXItMSwgMSk7CiAgICAgICAgaSsrOwogICAgfQogICAgbWVtY3B5KHNUbXBBcnJheSArIGksICJcMCIsIDEpOwogICAgc3RyY3B5KHN0cmluZywgc1RtcEFycmF5KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGp1c3QgbG9jYWxseSAhCiAqICBEZXNjcmlwdGlvbjogVGVzdCBpZiB0aGUgZ2l2ZW4gc3RyaW5nIChwc051bWJlcikgaXMgdmFsaWQgb3Igbm90LgogKiAgICAgICAgICAgICAgIFRoZSB2YWxpZCBjaGFyYWN0ZXJzIGFyZSB0aGUgZm9sbG93aW5nOgogKiAgICAgICAgICAgICAgIC0gQ2hhcmFjdGVycyAnMCcgdGhyb3VnaCAnOScuIAogKiAgICAgICAgICAgICAgIC0gT25lIGRlY2ltYWwgcG9pbnQgKGRvdCkgaWYgdGhlIG51bWJlciBpcyBhIGZsb2F0aW5nLXBvaW50IHZhbHVlLiAKICogICAgICAgICAgICAgICAtIEEgbWludXMgc2lnbiBpbiB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGlmIHRoZSBudW1iZXIgaXMgCiAqICAgICAgICAgICAgICAgICBhIG5lZ2F0aXZlIHZhbHVlLgogKiAgICAgICAgICAgICAgSWYgdGhlIGZ1bmN0aW9uIHN1Y2NlZWRzLCBwc0JlZm9yZS9wc0FmdGVyIHdpbGwgcG9pbnQgdG8gdGhlIHN0cmluZwogKiAgICAgICAgICAgICAgb24gdGhlIHJpZ2h0L2xlZnQgb2YgdGhlIGRlY2ltYWwgc3ltYm9sLiBwYk5lZ2F0aXZlIGluZGljYXRlcyBpZiB0aGUgCiAqICAgICAgICAgICAgICBudW1iZXIgaXMgbmVnYXRpdmUuCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXROdW1iZXJDb21wb25lbnRzKGNoYXIqIHBJbnB1dCwgY2hhciogcHNCZWZvcmUsIGNoYXIqIHBzQWZ0ZXIsIEJPT0wqIHBiTmVnYXRpdmUpCnsKY2hhcglzTnVtYmVyU2V0W10gPSAiMDEyMzQ1Njc4OSI7CkJPT0wJYkluRGVjaW1hbCA9IEZBTFNFOwoKCS8qIFRlc3QgaWYgd2UgZG8gaGF2ZSBhIG1pbnVzIHNpZ24gKi8KCWlmICggKnBJbnB1dCA9PSAnLScgKQoJewoJCSpwYk5lZ2F0aXZlID0gVFJVRTsKCQlwSW5wdXQrKzsgLyogSnVtcCB0byB0aGUgbmV4dCBjaGFyYWN0ZXIuICovCgl9CgkKCXdoaWxlKCpwSW5wdXQgIT0gJ1wwJykKCXsKCQkvKiBEbyB3ZSBoYXZlIGEgdmFsaWQgbnVtZXJpYyBjaGFyYWN0ZXIgKi8KCQlpZiAoIHN0cmNocihzTnVtYmVyU2V0LCAqcElucHV0KSAhPSBOVUxMICkKCQl7CgkJCWlmIChiSW5EZWNpbWFsID09IFRSVUUpCiAgICAgICAgICAgICAgICAqcHNBZnRlcisrID0gKnBJbnB1dDsKCQkJZWxzZQogICAgICAgICAgICAgICAgKnBzQmVmb3JlKysgPSAqcElucHV0OwoJCX0KCQllbHNlCgkJewoJCQkvKiBJcyB0aGlzIGEgZGVjaW1hbCBwb2ludCAoZG90KSAqLwoJCQlpZiAoICpwSW5wdXQgPT0gJy4nICkKCQkJewoJCQkJLyogSXMgaXQgdGhlIGZpcnN0IHRpbWUgd2UgZmluZCBpdCAqLwoJCQkJaWYgKChiSW5EZWNpbWFsID09IEZBTFNFKSkKCQkJCQliSW5EZWNpbWFsID0gVFJVRTsKCQkJCWVsc2UKCQkJCQlyZXR1cm4gLTE7IC8qIEVSUk9SOiBJbnZhbGlkIHBhcmFtZXRlciAqLwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJLyogSXQncyBuZWl0aGVyIGEgbnVtZXJpYyBjaGFyYWN0ZXIsIG5vciBhIGRlY2ltYWwgcG9pbnQuCgkJCQkgKiBUaHVzLCByZXR1cm4gYW4gZXJyb3IuCiAgICAgICAgICAgICAgICAgKi8KCQkJCXJldHVybiAtMTsKCQkJfQoJCX0KICAgICAgICBwSW5wdXQrKzsKCX0KCQoJLyogQWRkIGFuIEVuZCBvZiBMaW5lIGNoYXJhY3RlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcnMgKi8KCSpwc0JlZm9yZSA9ICdcMCc7CgkqcHNBZnRlciA9ICdcMCc7CgoJcmV0dXJuIDA7IAp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBqdXN0IGxvY2FsbHkgIQogKiAgRGVzY3JpcHRpb246IEEgbnVtYmVyIGNvdWxkIGJlIGZvcm1hdHRlZCB1c2luZyBkaWZmZXJlbnQgbnVtYmVycyAKICogICAgICAgICAgICAgICBvZiAiZGlnaXRzIGluIGdyb3VwIiAoZXhhbXBsZTogNDszOzI7MCkuCiAqICAgICAgICAgICAgICAgVGhlIGZpcnN0IHBhcmFtZXRlciBvZiB0aGlzIGZ1bmN0aW9uIGlzIGFuIGFycmF5CiAqICAgICAgICAgICAgICAgY29udGFpbmluZyB0aGUgcnVsZSB0byBiZSB1c2VkLiBJdCdzIGZvcm1hdCBpcyB0aGUgZm9sbG93aW5nOgogKiAgICAgICAgICAgICAgIHxOREd8REcxfERHMnwuLi58MHwKICogICAgICAgICAgICAgICB3aGVyZSBOREcgaXMgdGhlIG51bWJlciBvZiB1c2VkICJkaWdpdHMgaW4gZ3JvdXAiIGFuZCBERzEsIERHMiwKICogICAgICAgICAgICAgICBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgImRpZ2l0cyBpbiBncm91cCIuCiAqICAgICAgICAgICAgICAgVGh1cywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBncm91cGluZyB2YWx1ZSBpbiB0aGUgYXJyYXkKICogICAgICAgICAgICAgICBwb2ludGVkIGJ5IHRoZSBzZWNvbmQgcGFyYW1ldGVyLgogKi8Kc3RhdGljIElOVCBPTEVfR2V0R3JvdXBpbmcoY2hhciogc1J1bGUsIElOVCBpbmRleCkKewogICAgY2hhciAgICBzRGF0YVsyXSwgc1J1bGVTaXplWzJdOwogICAgSU5UICAgICBuRGF0YSwgblJ1bGVTaXplOwoKICAgIG1lbWNweShzUnVsZVNpemUsIHNSdWxlLCAxKTsKICAgIG1lbWNweShzUnVsZVNpemUrMSwgIlwwIiwgMSk7CiAgICBuUnVsZVNpemUgPSBhdG9pKHNSdWxlU2l6ZSk7CgogICAgaWYgKGluZGV4ID4gMCAmJiBpbmRleCA8IG5SdWxlU2l6ZSkKICAgIHsKICAgICAgICBtZW1jcHkoc0RhdGEsIHNSdWxlK2luZGV4LCAxKTsKICAgICAgICBtZW1jcHkoc0RhdGErMSwgIlwwIiwgMSk7CiAgICAgICAgbkRhdGEgPSBhdG9pKHNEYXRhKTsgICAgICAgICAgICAKICAgIH0KICAgICAgICAKICAgIGVsc2UKICAgIHsKICAgICAgICBtZW1jcHkoc0RhdGEsIHNSdWxlK25SdWxlU2l6ZS0xLCAxKTsKICAgICAgICBtZW1jcHkoc0RhdGErMSwgIlwwIiwgMSk7CiAgICAgICAgbkRhdGEgPSBhdG9pKHNEYXRhKTsgICAgICAgICAgICAKICAgIH0KICAgIAogICAgcmV0dXJuIG5EYXRhOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldE51bWJlckZvcm1hdEEJKEtFUk5FTDMyLjM1NSkKICovCklOVCBXSU5BUEkgR2V0TnVtYmVyRm9ybWF0QShMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1NUUiBscHZhbHVlLCAgIGNvbnN0IE5VTUJFUkZNVEEgKiBscEZvcm1hdCwKCQkJICAgICAgIExQU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoTnVtYmVyKQp7CiAgICBjaGFyICAgc051bWJlckRpZ2l0c1szXSwgc0RlY2ltYWxTeW1ib2xbNV0sIHNEaWdpdHNJbkdyb3VwWzExXSwgc0RpZ2l0R3JvdXBTeW1ib2xbNV0sIHNJTFplcm9bMl07CiAgICBJTlQgICAgbk51bWJlckRpZ2l0cywgbk51bWJlckRlY2ltYWwsIGksIGosIG5Db3VudGVyLCBuU3RlcCwgblJ1bGVJbmRleCwgbkdyb3VwaW5nLCBuRGlnaXRzLCByZXRWYWwsIG5MWjsKICAgIGNoYXIgICBzTnVtYmVyWzEyOF0sIHNEZXN0aW5hdGlvblsxMjhdLCBzRGlnaXRzQWZ0ZXJEZWNpbWFsWzEwXSwgc0RpZ2l0c0JlZm9yZURlY2ltYWxbMTI4XTsKICAgIGNoYXIgICBzUnVsZVsxMF0sIHNTZW1pQ29sdW1uW109IjsiLCBzQnVmZmVyWzVdLCBzTmVnTnVtYmVyWzJdOyAgICAKICAgIGNoYXIgICAqcFN0ciA9IE5VTEwsICpwVG1wU3RyID0gTlVMTDsKICAgIExDSUQgICBzeXN0ZW1EZWZhdWx0TENJRDsKICAgIEJPT0wgICBiTmVnYXRpdmUgPSBGQUxTRTsKICAgIGVudW0gICBPcGVyYXRpb25zIAogICAgewogICAgICAgIFVTRV9QQVJBTUVURVIsCiAgICAgICAgVVNFX0xPQ0FMRUlORk8sCiAgICAgICAgVVNFX1NZU1RFTURFRkFVTFQsCiAgICAgICAgUkVUVVJOX0VSUk9SCiAgICB9IHVzZWRfb3BlcmF0aW9uOwoKICAgIHN0cm5jcHkoc051bWJlciwgbHB2YWx1ZSwgMTI4KTsKICAgIHNOdW1iZXJbMTI3XSA9ICdcMCc7CgogICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBpbnB1dCBzdHJpbmcsIGdldCB0aGUgbnVtYmVyCiAgICAgKiBvZiBkaWdpdHMgYmVmb3JlIGFuZCBhZnRlciB0aGUgZGVjaW1hbCBzeW1ib2wsIGFuZCBjaGVjawogICAgICogaWYgdGhpcyBpcyBhIG5lZ2F0aXZlIG51bWJlci4KICAgICAqLwogICAgaWYgKCBPTEVfR2V0TnVtYmVyQ29tcG9uZW50cyhzTnVtYmVyLCBzRGlnaXRzQmVmb3JlRGVjaW1hbCwgc0RpZ2l0c0FmdGVyRGVjaW1hbCwgJmJOZWdhdGl2ZSkgIT0gLTEpCiAgICB7CiAgICAgICAgbk51bWJlckRlY2ltYWwgPSBzdHJsZW4oc0RpZ2l0c0JlZm9yZURlY2ltYWwpOwogICAgICAgIG5EaWdpdHMgPSBzdHJsZW4oc0RpZ2l0c0FmdGVyRGVjaW1hbCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKiBXaGljaCBzb3VyY2Ugd2lsbCB3ZSB1c2UgdG8gZm9ybWF0IHRoZSBzdHJpbmcgKi8KICAgIHVzZWRfb3BlcmF0aW9uID0gUkVUVVJOX0VSUk9SOwogICAgaWYgKGxwRm9ybWF0ICE9IE5VTEwpCiAgICB7CiAgICAgICAgaWYgKGR3ZmxhZ3MgPT0gMCkKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfUEFSQU1FVEVSOyAKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAoZHdmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfTE9DQUxFSU5GTzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX1NZU1RFTURFRkFVTFQ7CiAgICB9CgogICAgLyogTG9hZCB0aGUgZmllbGRzIHdlIG5lZWQgKi8KICAgIHN3aXRjaCh1c2VkX29wZXJhdGlvbikKICAgIHsKICAgIGNhc2UgVVNFX0xPQ0FMRUlORk86CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSURJR0lUUywgc051bWJlckRpZ2l0cywgc2l6ZW9mKHNOdW1iZXJEaWdpdHMpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9TREVDSU1BTCwgc0RlY2ltYWxTeW1ib2wsIHNpemVvZihzRGVjaW1hbFN5bWJvbCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX1NHUk9VUElORywgc0RpZ2l0c0luR3JvdXAsIHNpemVvZihzRGlnaXRzSW5Hcm91cCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX1NUSE9VU0FORCwgc0RpZ2l0R3JvdXBTeW1ib2wsIHNpemVvZihzRGlnaXRHcm91cFN5bWJvbCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lMWkVSTywgc0lMWmVybywgc2l6ZW9mKHNJTFplcm8pKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9JTkVHTlVNQkVSLCBzTmVnTnVtYmVyLCBzaXplb2Yoc05lZ051bWJlcikpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBVU0VfUEFSQU1FVEVSOgogICAgICAgIHNwcmludGYoc051bWJlckRpZ2l0cywgIiVkIixscEZvcm1hdC0+TnVtRGlnaXRzKTsKICAgICAgICBzdHJjcHkoc0RlY2ltYWxTeW1ib2wsIGxwRm9ybWF0LT5scERlY2ltYWxTZXApOwogICAgICAgIHNwcmludGYoc0RpZ2l0c0luR3JvdXAsICIlZDswIixscEZvcm1hdC0+R3JvdXBpbmcpOwogICAgICAgIHN0cmNweShzRGlnaXRHcm91cFN5bWJvbCwgbHBGb3JtYXQtPmxwVGhvdXNhbmRTZXApOwogICAgICAgIHNwcmludGYoc0lMWmVybywgIiVkIixscEZvcm1hdC0+TGVhZGluZ1plcm8pOwogICAgICAgIHNwcmludGYoc05lZ051bWJlciwgIiVkIixscEZvcm1hdC0+TmVnYXRpdmVPcmRlcik7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFVTRV9TWVNURU1ERUZBVUxUOgogICAgICAgIHN5c3RlbURlZmF1bHRMQ0lEID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lESUdJVFMsIHNOdW1iZXJEaWdpdHMsIHNpemVvZihzTnVtYmVyRGlnaXRzKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9TREVDSU1BTCwgc0RlY2ltYWxTeW1ib2wsIHNpemVvZihzRGVjaW1hbFN5bWJvbCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfU0dST1VQSU5HLCBzRGlnaXRzSW5Hcm91cCwgc2l6ZW9mKHNEaWdpdHNJbkdyb3VwKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9TVEhPVVNBTkQsIHNEaWdpdEdyb3VwU3ltYm9sLCBzaXplb2Yoc0RpZ2l0R3JvdXBTeW1ib2wpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lMWkVSTywgc0lMWmVybywgc2l6ZW9mKHNJTFplcm8pKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lORUdOVU1CRVIsIHNOZWdOdW1iZXIsIHNpemVvZihzTmVnTnVtYmVyKSk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgbk51bWJlckRpZ2l0cyA9IGF0b2koc051bWJlckRpZ2l0cyk7CiAgICAKICAgIC8qIFJlbW92ZSB0aGUgIjsiICovCiAgICBpPTA7CiAgICBqID0gMTsKICAgIGZvciAobkNvdW50ZXI9MDsgbkNvdW50ZXI8c3RybGVuKHNEaWdpdHNJbkdyb3VwKTsgbkNvdW50ZXIrKykKICAgIHsKICAgICAgICBpZiAoIG1lbWNtcChzRGlnaXRzSW5Hcm91cCArIG5Db3VudGVyLCBzU2VtaUNvbHVtbiwgMSkgIT0gMCApCiAgICAgICAgewogICAgICAgICAgICBtZW1jcHkoc1J1bGUgKyBqLCBzRGlnaXRzSW5Hcm91cCArIG5Db3VudGVyLCAxKTsKICAgICAgICAgICAgaSsrOwogICAgICAgICAgICBqKys7CiAgICAgICAgfQogICAgfQogICAgc3ByaW50ZihzQnVmZmVyLCAiJWQiLCBpKTsKICAgIG1lbWNweShzUnVsZSwgc0J1ZmZlciwgMSk7IC8qIE51bWJlciBvZiBkaWdpdHMgaW4gdGhlIGdyb3VwcyAoIHVzZWQgYnkgT0xFX0dldEdyb3VwaW5nKCkgKSAqLwogICAgbWVtY3B5KHNSdWxlICsgaiwgIlwwIiwgMSk7CiAgICAKICAgIC8qIEZpcnN0LCBmb3JtYXQgdGhlIGRpZ2l0cyBiZWZvcmUgdGhlIGRlY2ltYWwuICovCiAgICBpZiAoKG5OdW1iZXJEZWNpbWFsPjApICYmIChhdG9pKHNEaWdpdHNCZWZvcmVEZWNpbWFsKSAhPSAwKSkgCiAgICB7CiAgICAgICAgLyogV29ya2luZyBvbiBhbiBpbnZlcnRlZCBzdHJpbmcgaXMgZWFzaWVyICEgKi8KICAgICAgICBPTEVfSW52ZXJ0U3RyaW5nKHNEaWdpdHNCZWZvcmVEZWNpbWFsKTsKCiAgICAgICAgblN0ZXAgPSBuQ291bnRlciA9IGkgPSBqID0gMDsKICAgICAgICBuUnVsZUluZGV4ID0gMTsKICAgICAgICBuR3JvdXBpbmcgPSBPTEVfR2V0R3JvdXBpbmcoc1J1bGUsIG5SdWxlSW5kZXgpOwogICAgICAgIAogICAgICAgIC8qIEhlcmUsIHdlIHdpbGwgbG9vcCB1bnRpbCB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCiAgICAgICAgICogQW4gaW50ZXJuYWwgY291bnRlciAoaikgaXMgdXNlZCBpbiBvcmRlciB0byBrbm93IHdoZW4gdG8gCiAgICAgICAgICogaW5zZXJ0IHRoZSAiZGlnaXQgZ3JvdXAgc3ltYm9sIi4KICAgICAgICAgKi8KICAgICAgICB3aGlsZSAobk51bWJlckRlY2ltYWwgPiAwKQogICAgICAgIHsKICAgICAgICAgICAgaSA9IG5Db3VudGVyICsgblN0ZXA7CiAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24gKyBpLCBzRGlnaXRzQmVmb3JlRGVjaW1hbCArIG5Db3VudGVyLCAxKTsKICAgICAgICAgICAgbkNvdW50ZXIrKzsKICAgICAgICAgICAgaisrOwogICAgICAgICAgICBpZiAoaiA+PSBuR3JvdXBpbmcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGogPSAwOwogICAgICAgICAgICAgICAgaWYgKG5SdWxlSW5kZXggPCBzUnVsZVswXSkKICAgICAgICAgICAgICAgICAgICBuUnVsZUluZGV4Kys7CiAgICAgICAgICAgICAgICBuR3JvdXBpbmcgPSBPTEVfR2V0R3JvdXBpbmcoc1J1bGUsIG5SdWxlSW5kZXgpOwogICAgICAgICAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbiArIGkrMSwgc0RpZ2l0R3JvdXBTeW1ib2wsIHN0cmxlbihzRGlnaXRHcm91cFN5bWJvbCkpOwogICAgICAgICAgICAgICAgblN0ZXArPSBzdHJsZW4oc0RpZ2l0R3JvdXBTeW1ib2wpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBuTnVtYmVyRGVjaW1hbC0tOwogICAgICAgIH0KCiAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbiArIGkrMSwgIlwwIiwgMSk7CiAgICAgICAgLyogR2V0IHRoZSBzdHJpbmcgaW4gdGhlIHJpZ2h0IG9yZGVyICEgKi8KICAgICAgICBPTEVfSW52ZXJ0U3RyaW5nKHNEZXN0aW5hdGlvbik7CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAgbkxaID0gYXRvaShzSUxaZXJvKTsKICAgICAgICBpZiAobkxaICE9IDApCiAgICAgICAgeyAgICAgICAgCiAgICAgICAgICAgIC8qIFVzZSAwLnh4eCBpbnN0ZWFkIG9mIC54eHggKi8KICAgICAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbiwgIjAiLCAxKTsKICAgICAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbisxLCAiXDAiLCAxKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uLCAiXDAiLCAxKTsKCiAgICAgfQoKICAgIC8qIFNlY29uZCwgZm9ybWF0IHRoZSBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwuICovCiAgICBqID0gMDsKICAgIG5Db3VudGVyID0gbk51bWJlckRpZ2l0czsKICAgIGlmICggKG5EaWdpdHM+MCkgJiYgKHBTdHIgPSBzdHJzdHIgKHNOdW1iZXIsICIuIikpICkKICAgIHsKICAgICAgICBpID0gc3RybGVuKHNOdW1iZXIpIC0gc3RybGVuKHBTdHIpICsgMTsgICAgICAgIAogICAgICAgIHN0cm5jcHkgKCBzRGlnaXRzQWZ0ZXJEZWNpbWFsLCBzTnVtYmVyICsgaSwgbk51bWJlckRpZ2l0cyk7CiAgICAgICAgaiA9IHN0cmxlbihzRGlnaXRzQWZ0ZXJEZWNpbWFsKTsKICAgICAgICBpZiAoaiA8IG5OdW1iZXJEaWdpdHMpCiAgICAgICAgICAgIG5Db3VudGVyID0gbk51bWJlckRpZ2l0cy1qOyAgICAgICAgICAgIAogICAgfQogICAgZm9yIChpPTA7aTxuQ291bnRlcjtpKyspCiAgICAgICAgIG1lbWNweShzRGlnaXRzQWZ0ZXJEZWNpbWFsK2kraiwgIjAiLCAxKTsgICAgCiAgICBtZW1jcHkoc0RpZ2l0c0FmdGVyRGVjaW1hbCArIG5OdW1iZXJEaWdpdHMsICJcMCIsIDEpOyAgICAKCiAgICBpID0gc3RybGVuKHNEZXN0aW5hdGlvbik7CiAgICBqID0gc3RybGVuKHNEaWdpdHNBZnRlckRlY2ltYWwpOwogICAgLyogRmluYWxseSwgY29uc3RydWN0IHRoZSByZXN1bHRpbmcgZm9ybWF0dGVkIHN0cmluZy4gKi8KICAgICAgICAKICAgIGZvciAobkNvdW50ZXI9MDsgbkNvdW50ZXI8aTsgbkNvdW50ZXIrKykKICAgICAgICBtZW1jcHkoc051bWJlciArIG5Db3VudGVyLCBzRGVzdGluYXRpb24gKyBuQ291bnRlciwgMSk7CiAgICAgICAKICAgIG1lbWNweShzTnVtYmVyICsgbkNvdW50ZXIsIHNEZWNpbWFsU3ltYm9sLCBzdHJsZW4oc0RlY2ltYWxTeW1ib2wpKTsKCiAgICBmb3IgKGk9MDsgaTxqOyBpKyspCiAgICAgICAgbWVtY3B5KHNOdW1iZXIgKyBuQ291bnRlcitpK3N0cmxlbihzRGVjaW1hbFN5bWJvbCksIHNEaWdpdHNBZnRlckRlY2ltYWwgKyBpLCAxKTsKICAgIG1lbWNweShzTnVtYmVyICsgbkNvdW50ZXIraStzdHJsZW4oc0RlY2ltYWxTeW1ib2wpLCAiXDAiLCAxKTsKICAgICAgICAKICAgIC8qIElzIGl0IGEgbmVnYXRpdmUgbnVtYmVyICovCiAgICBpZiAoYk5lZ2F0aXZlID09IFRSVUUpCiAgICB7CiAgICAgICAgaSA9IGF0b2koc05lZ051bWJlcik7CiAgICAgICAgcFN0ciA9IHNEZXN0aW5hdGlvbjsKICAgICAgICBwVG1wU3RyID0gc051bWJlcjsKICAgICAgICBzd2l0Y2ggKGkpCiAgICAgICAgeyAgICAgICAgICAKICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICpwU3RyKysgPSAnKCc7CiAgICAgICAgICAgIHdoaWxlICgqc051bWJlciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICAqcFN0cisrID0gJyknOyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgYnJlYWs7ICAKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICpwU3RyKysgPSAnLSc7CiAgICAgICAgICAgIHdoaWxlICgqcFRtcFN0ciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICpwU3RyKysgPSAnLSc7CiAgICAgICAgICAgICpwU3RyKysgPSAnICc7CiAgICAgICAgICAgIHdoaWxlICgqcFRtcFN0ciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIHdoaWxlICgqcFRtcFN0ciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICAqcFN0cisrID0gJy0nOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgIHdoaWxlICgqcFRtcFN0ciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICAqcFN0cisrID0gJyAnOwogICAgICAgICAgICAqcFN0cisrID0gJy0nOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgICAgIHN0cmNweShzRGVzdGluYXRpb24sIHNOdW1iZXIpOwoKICAgIC8qIElmIGNjaE51bWJlciBpcyB6ZXJvLCB0aGVuIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBvciBjaGFyYWN0ZXJzIAogICAgICogcmVxdWlyZWQgdG8gaG9sZCB0aGUgZm9ybWF0dGVkIG51bWJlciBzdHJpbmcKICAgICAqLwogICAgaWYgKGNjaE51bWJlcj09MCkKICAgICAgICByZXRWYWwgPSBzdHJsZW4oc0Rlc3RpbmF0aW9uKSArIDE7CiAgICBlbHNlICAgICAgICAgICAKICAgIHsKICAgICAgICBzdHJuY3B5IChscE51bWJlclN0ciwgc0Rlc3RpbmF0aW9uLCBjY2hOdW1iZXItMSk7CiAgICAgICAgKihscE51bWJlclN0citjY2hOdW1iZXItMSkgPSAnXDAnOyAgIC8qIGVuc3VyZSB3ZSBnb3QgYSBOVUxMIGF0IHRoZSBlbmQgKi8KICAgICAgICByZXRWYWwgPSBzdHJsZW4obHBOdW1iZXJTdHIpOwogICAgfQogICAgICAgICAgCiAgICByZXR1cm4gcmV0VmFsOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldE51bWJlckZvcm1hdFcJKEtFUk5FTDMyLnh4eCkKICovCklOVCBXSU5BUEkgR2V0TnVtYmVyRm9ybWF0VyhMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1dTVFIgbHB2YWx1ZSwgIGNvbnN0IE5VTUJFUkZNVFcgKiBscEZvcm1hdCwKCQkJICAgICAgIExQV1NUUiBscE51bWJlclN0ciwgaW50IGNjaE51bWJlcikKewogRklYTUUoIiVzOiBzdHViLCBubyByZWZvcm1hdGluZyBkb25lXG4iLGRlYnVnc3RyX3cobHB2YWx1ZSkpOwoKIGxzdHJjcHluVyggbHBOdW1iZXJTdHIsIGxwdmFsdWUsIGNjaE51bWJlciApOwogcmV0dXJuIGNjaE51bWJlcj8gbHN0cmxlblcoIGxwTnVtYmVyU3RyICkgOiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldEN1cnJlbmN5Rm9ybWF0QQkoS0VSTkVMMzIuMzAyKQogKi8KSU5UIFdJTkFQSSBHZXRDdXJyZW5jeUZvcm1hdEEoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENTVFIgbHB2YWx1ZSwgICBjb25zdCBDVVJSRU5DWUZNVEEgKiBscEZvcm1hdCwKCQkJICAgICAgIExQU1RSIGxwQ3VycmVuY3lTdHIsIGludCBjY2hDdXJyZW5jeSkKewogICAgVUlOVCAgIG5Qb3NPcmRlciwgbk5lZ09yZGVyOwogICAgSU5UICAgIHJldFZhbDsKICAgIGNoYXIgICBzRGVzdGluYXRpb25bMTI4XSwgc05lZ09yZGVyWzhdLCBzUG9zT3JkZXJbOF0sIHNDdXJyZW5jeVN5bWJvbFs4XTsKICAgIGNoYXIgICAqcERlc3RpbmF0aW9uID0gc0Rlc3RpbmF0aW9uOwogICAgY2hhciAgIHNOdW1iZXJGb3JtYXRlZFsxMjhdOwogICAgY2hhciAgICpwTnVtYmVyRm9ybWF0ZWQgPSBzTnVtYmVyRm9ybWF0ZWQ7CiAgICBMQ0lEICAgc3lzdGVtRGVmYXVsdExDSUQ7CiAgICBCT09MICAgYklzUG9zaXRpdmUgPSBGQUxTRSwgYlZhbGlkRm9ybWF0ID0gRkFMU0U7CiAgICBlbnVtICAgT3BlcmF0aW9ucyAKICAgIHsKICAgICAgICBVU0VfUEFSQU1FVEVSLAogICAgICAgIFVTRV9MT0NBTEVJTkZPLAogICAgICAgIFVTRV9TWVNURU1ERUZBVUxULAogICAgICAgIFJFVFVSTl9FUlJPUgogICAgfSB1c2VkX29wZXJhdGlvbjsKCiAgICBOVU1CRVJGTVRBICBudW1iZXJGbXQ7CgogICAgLyogV2hpY2ggc291cmNlIHdpbGwgd2UgdXNlIHRvIGZvcm1hdCB0aGUgc3RyaW5nICovCiAgICB1c2VkX29wZXJhdGlvbiA9IFJFVFVSTl9FUlJPUjsKICAgIGlmIChscEZvcm1hdCAhPSBOVUxMKQogICAgewogICAgICAgIGlmIChkd2ZsYWdzID09IDApCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX1BBUkFNRVRFUjsgCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKGR3ZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX0xPQ0FMRUlORk87CiAgICAgICAgZWxzZQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9TWVNURU1ERUZBVUxUOwogICAgfQoKICAgIC8qIExvYWQgdGhlIGZpZWxkcyB3ZSBuZWVkICovCiAgICBzd2l0Y2godXNlZF9vcGVyYXRpb24pCiAgICB7CiAgICBjYXNlIFVTRV9MT0NBTEVJTkZPOiAgICAgICAgCiAgICAgICAgLyogU3BlY2lmaWMgdG8gQ1VSUkVOQ1lGTVRBKi8KICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9JTkVHQ1VSUiwgc05lZ09yZGVyLCBzaXplb2Yoc05lZ09yZGVyKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSUNVUlJFTkNZLCBzUG9zT3JkZXIsIHNpemVvZihzUG9zT3JkZXIpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9TQ1VSUkVOQ1ksIHNDdXJyZW5jeVN5bWJvbCwgc2l6ZW9mKHNDdXJyZW5jeVN5bWJvbCkpOwogICAgICAgIAogICAgICAgIG5Qb3NPcmRlciA9IGF0b2koc1Bvc09yZGVyKTsKICAgICAgICBuTmVnT3JkZXIgPSBhdG9pKHNOZWdPcmRlcik7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFVTRV9QQVJBTUVURVI6ICAgICAgICAKICAgICAgICAvKiBTcGVjaWZpYyB0byBDVVJSRU5DWUZNVEEqLwogICAgICAgIG5OZWdPcmRlciA9IGxwRm9ybWF0LT5OZWdhdGl2ZU9yZGVyOwogICAgICAgIG5Qb3NPcmRlciA9IGxwRm9ybWF0LT5Qb3NpdGl2ZU9yZGVyOwogICAgICAgIHN0cmNweShzQ3VycmVuY3lTeW1ib2wsIGxwRm9ybWF0LT5scEN1cnJlbmN5U3ltYm9sKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVVNFX1NZU1RFTURFRkFVTFQ6CiAgICAgICAgc3lzdGVtRGVmYXVsdExDSUQgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOyAgICAgICAgCiAgICAgICAgLyogU3BlY2lmaWMgdG8gQ1VSUkVOQ1lGTVRBKi8KICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lORUdDVVJSLCBzTmVnT3JkZXIsIHNpemVvZihzTmVnT3JkZXIpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lDVVJSRU5DWSwgc1Bvc09yZGVyLCBzaXplb2Yoc1Bvc09yZGVyKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9TQ1VSUkVOQ1ksIHNDdXJyZW5jeVN5bWJvbCwgc2l6ZW9mKHNDdXJyZW5jeVN5bWJvbCkpOwogICAgICAgIAogICAgICAgIG5Qb3NPcmRlciA9IGF0b2koc1Bvc09yZGVyKTsKICAgICAgICBuTmVnT3JkZXIgPSBhdG9pKHNOZWdPcmRlcik7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAKICAgIC8qIENvbnN0cnVjdCBhIHRlbXBvcmFyeSBudW1iZXIgZm9ybWF0IHN0cnVjdHVyZSAqLwogICAgaWYgKGxwRm9ybWF0ICE9IE5VTEwpCiAgICB7CiAgICAgICAgbnVtYmVyRm10Lk51bURpZ2l0cyAgICAgPSBscEZvcm1hdC0+TnVtRGlnaXRzOwogICAgICAgIG51bWJlckZtdC5MZWFkaW5nWmVybyAgID0gbHBGb3JtYXQtPkxlYWRpbmdaZXJvOwogICAgICAgIG51bWJlckZtdC5Hcm91cGluZyAgICAgID0gbHBGb3JtYXQtPkdyb3VwaW5nOwogICAgICAgIG51bWJlckZtdC5OZWdhdGl2ZU9yZGVyID0gMDsKICAgICAgICBudW1iZXJGbXQubHBEZWNpbWFsU2VwID0gbHBGb3JtYXQtPmxwRGVjaW1hbFNlcDsKICAgICAgICBudW1iZXJGbXQubHBUaG91c2FuZFNlcCA9IGxwRm9ybWF0LT5scFRob3VzYW5kU2VwOwogICAgICAgIGJWYWxpZEZvcm1hdCA9IFRSVUU7CiAgICB9CgogICAgLyogTWFrZSBhIGNhbGwgdG8gR2V0TnVtYmVyRm9ybWF0QSgpICovCiAgICBpZiAoKmxwdmFsdWUgPT0gJy0nKQogICAgewogICAgICAgIGJJc1Bvc2l0aXZlID0gRkFMU0U7CiAgICAgICAgcmV0VmFsID0gR2V0TnVtYmVyRm9ybWF0QShsb2NhbGUsMCxscHZhbHVlKzEsKGJWYWxpZEZvcm1hdCk/Jm51bWJlckZtdDpOVUxMLHBOdW1iZXJGb3JtYXRlZCwxMjgpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGJJc1Bvc2l0aXZlID0gVFJVRTsKICAgICAgICByZXRWYWwgPSBHZXROdW1iZXJGb3JtYXRBKGxvY2FsZSwwLGxwdmFsdWUsKGJWYWxpZEZvcm1hdCk/Jm51bWJlckZtdDpOVUxMLHBOdW1iZXJGb3JtYXRlZCwxMjgpOwogICAgfQogICAgICAgIAogICAgaWYgKHJldFZhbCA9PSAwKQogICAgICAgIHJldHVybiAwOwoKICAgIC8qIGNvbnN0cnVjdCB0aGUgZm9ybWF0dGVkIHN0cmluZyAqLwogICAgaWYgKGJJc1Bvc2l0aXZlKQogICAgewogICAgICAgIHN3aXRjaCAoblBvc09yZGVyKQogICAgICAgIHsKICAgICAgICBjYXNlIDA6ICAgLyogUHJlZml4LCBubyBzZXBhcmF0aW9uICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOiAgIC8qIFN1ZmZpeCwgbm8gc2VwYXJhdGlvbiAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjogICAvKiBQcmVmaXgsIDEgY2hhciBzZXBhcmF0aW9uICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzogICAvKiBTdWZmaXgsIDEgY2hhciBzZXBhcmF0aW9uICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgIC8qIG5lZ2F0aXZlIG51bWJlciAqLwogICAgewogICAgICAgIHN3aXRjaCAobk5lZ09yZGVyKQogICAgICAgIHsKICAgICAgICBjYXNlIDA6ICAgLyogZm9ybWF0OiAoJDEuMSkgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICIoIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTogICAvKiBmb3JtYXQ6IC0kMS4xICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjogICAvKiBmb3JtYXQ6ICQtMS4xICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzogICAvKiBmb3JtYXQ6ICQxLjEtICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDogICAvKiBmb3JtYXQ6ICgxLjEkKSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIigiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIikiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA1OiAgIC8qIGZvcm1hdDogLTEuMSQgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2OiAgIC8qIGZvcm1hdDogMS4xLSQgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA3OiAgIC8qIGZvcm1hdDogMS4xJC0gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA4OiAgIC8qIGZvcm1hdDogLTEuMSAkICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDk6ICAgLyogZm9ybWF0OiAtJCAxLjEgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTA6ICAgLyogZm9ybWF0OiAxLjEgJC0gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTE6ICAgLyogZm9ybWF0OiAkIDEuMS0gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTI6ICAgLyogZm9ybWF0OiAkIC0xLjEgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTM6ICAgLyogZm9ybWF0OiAxLjEtICQgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTQ6ICAgLyogZm9ybWF0OiAoJCAxLjEpICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiKCIpOyAKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTU6ICAgLyogZm9ybWF0OiAoMS4xICQpICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiKCIpOyAKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoY2NoQ3VycmVuY3kgPT0gMCkKICAgICAgICByZXR1cm4gc3RybGVuKHBEZXN0aW5hdGlvbikgKyAxOwoKICAgIGVsc2UKICAgIHsKICAgICAgICBzdHJuY3B5IChscEN1cnJlbmN5U3RyLCBwRGVzdGluYXRpb24sIGNjaEN1cnJlbmN5LTEpOwogICAgICAgICoobHBDdXJyZW5jeVN0citjY2hDdXJyZW5jeS0xKSA9ICdcMCc7ICAgLyogZW5zdXJlIHdlIGdvdCBhIE5VTEwgYXQgdGhlIGVuZCAqLwogICAgICAgIHJldHVybiAgc3RybGVuKGxwQ3VycmVuY3lTdHIpOwogICAgfSAgICAKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRDdXJyZW5jeUZvcm1hdFcJKEtFUk5FTDMyLjMwMykKICovCklOVCBXSU5BUEkgR2V0Q3VycmVuY3lGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDV1NUUiBscHZhbHVlLCAgIGNvbnN0IENVUlJFTkNZRk1UVyAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBXU1RSIGxwQ3VycmVuY3lTdHIsIGludCBjY2hDdXJyZW5jeSkKewogICAgRklYTUUoIlRoaXMgQVBJIGZ1bmN0aW9uIGlzIE5PVCBpbXBsZW1lbnRlZCAhXG4iKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlPTEUyTkxTX0NoZWNrTG9jYWxlCVtpbnRlcm5dCiAqLyAKc3RhdGljIExDSUQgT0xFMk5MU19DaGVja0xvY2FsZSAoTENJRCBsb2NhbGUpCnsKCWlmICghbG9jYWxlKSAKCXsgbG9jYWxlID0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUOwoJfQogIAoJaWYgKGxvY2FsZSA9PSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQpIAogIAl7IHJldHVybiBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJfSAKCWVsc2UgaWYgKGxvY2FsZSA9PSBMT0NBTEVfVVNFUl9ERUZBVUxUKSAKCXsgcmV0dXJuIEdldFVzZXJEZWZhdWx0TENJRCgpOwoJfQoJZWxzZQoJeyByZXR1cm4gbG9jYWxlOwoJfQp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFRpbWVGb3JtYXRBCVtLRVJORUwzMi40MjJdCiAqIE1ha2VzIGFuIEFTQ0lJIHN0cmluZyBvZiB0aGUgdGltZQogKgogKiBGb3JtYXRzIGRhdGUgYWNjb3JkaW5nIHRvIGZvcm1hdCwgIG9yIGxvY2FsZSBkZWZhdWx0IGlmIGZvcm1hdCBpcwogKiBOVUxMLiBUaGUgZm9ybWF0IGNvbnNpc3RzIG9mIGxpdGVyYWwgY2hhcmFjdGVycyBhbmQgZmllbGRzIGFzIGZvbGxvd3M6CiAqCiAqIGggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgxMi1ob3VyKQogKiBoaCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBIICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICogSEggaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogbSAgbWludXRlcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBtbSBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHMgIHNlY29uZHMgd2l0aCBubyBsZWFkaW5nIHplcm8KICogc3Mgc2Vjb25kcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiB0ICB0aW1lIG1hcmtlciAoQSBvciBQKQogKiB0dCB0aW1lIG1hcmtlciAoQU0sIFBNKQogKgogKi8KSU5UIFdJTkFQSSAKR2V0VGltZUZvcm1hdEEoTENJRCBsb2NhbGUsICAgICAgICAvKiBpbiAgKi8KCQkgRFdPUkQgZmxhZ3MsICAgICAgICAvKiBpbiAgKi8KCQkgTFBTWVNURU1USU1FIHh0aW1lLCAvKiBpbiAgKi8gCgkJIExQQ1NUUiBmb3JtYXQsICAgICAgLyogaW4gICovCgkJIExQU1RSIHRpbWVzdHIsICAgICAgLyogb3V0ICovCgkJIElOVCB0aW1lbGVuICAgICAgIC8qIGluICAqLykgCnsgY2hhciBmb3JtYXRfYnVmWzQwXTsKICBMUENTVFIgdGhpc2Zvcm1hdDsKICBTWVNURU1USU1FIHQ7CiAgTFBTWVNURU1USU1FIHRoaXN0aW1lOwogIExDSUQgdGhpc2xvY2FsZT0wOwogIERXT1JEIHRoaXNmbGFncz1MT0NBTEVfU1RJTUVGT1JNQVQ7IC8qIHN0YW5kYXJ0IHRpbWVmb3JtYXQgKi8KICBJTlQgcmV0OwogICAgCiAgVFJBQ0UoIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIixsb2NhbGUsZmxhZ3MseHRpbWUsZm9ybWF0LHRpbWVzdHIsdGltZWxlbik7CgogIHRoaXNsb2NhbGUgPSBPTEUyTkxTX0NoZWNrTG9jYWxlICggbG9jYWxlICk7CgogIGlmICggZmxhZ3MgJiAoVElNRV9OT1RJTUVNQVJLRVIgfCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUICkpCiAgeyBGSVhNRSgiVElNRV9OT1RJTUVNQVJLRVIgb3IgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCBub3QgaW1wbGVtZW50ZWRcbiIpOwogIH0KICAKICBmbGFncyAmPSAoVElNRV9OT1NFQ09ORFMgfCBUSU1FX05PTUlOVVRFU09SU0VDT05EUyk7IC8qIG1hc2sgZm9yIE9MRV9HZXRGb3JtYXRBKi8KCiAgaWYgKGZvcm1hdCA9PSBOVUxMKSAKICB7IGlmIChmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkgIC8qdXNlIHN5c3RlbSBkZWZhdWx0Ki8KICAgIHsgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CiAgICB9CiAgICBHZXRMb2NhbGVJbmZvQSh0aGlzbG9jYWxlLCB0aGlzZmxhZ3MsIGZvcm1hdF9idWYsIHNpemVvZihmb3JtYXRfYnVmKSk7CiAgICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICB9CiAgZWxzZSAKICB7IHRoaXNmb3JtYXQgPSBmb3JtYXQ7CiAgfQogIAogIGlmICh4dGltZSA9PSBOVUxMKSAvKiBOVUxMIG1lYW5zIHVzZSB0aGUgY3VycmVudCBsb2NhbCB0aW1lKi8KICB7IEdldExvY2FsVGltZSgmdCk7CiAgICB0aGlzdGltZSA9ICZ0OwogIH0gCiAgZWxzZQogIHsgdGhpc3RpbWUgPSB4dGltZTsKICB9CiAgcmV0ID0gT0xFX0dldEZvcm1hdEEodGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmbGFncywgdGhpc3RpbWUsIHRoaXNmb3JtYXQsCiAgCQkJIHRpbWVzdHIsIHRpbWVsZW4pOwogIHJldHVybiByZXQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0VwlbS0VSTkVMMzIuNDIzXQogKiBNYWtlcyBhIFVuaWNvZGUgc3RyaW5nIG9mIHRoZSB0aW1lCiAqLwpJTlQgV0lOQVBJIApHZXRUaW1lRm9ybWF0VyhMQ0lEIGxvY2FsZSwgICAgICAgIC8qIGluICAqLwoJCSBEV09SRCBmbGFncywgICAgICAgIC8qIGluICAqLwoJCSBMUFNZU1RFTVRJTUUgeHRpbWUsIC8qIGluICAqLyAKCQkgTFBDV1NUUiBmb3JtYXQsICAgICAvKiBpbiAgKi8KCQkgTFBXU1RSIHRpbWVzdHIsICAgICAvKiBvdXQgKi8KCQkgSU5UIHRpbWVsZW4gICAgICAgLyogaW4gICovKSAKewlXQ0hBUiBmb3JtYXRfYnVmWzQwXTsKCUxQQ1dTVFIgdGhpc2Zvcm1hdDsKCVNZU1RFTVRJTUUgdDsKCUxQU1lTVEVNVElNRSB0aGlzdGltZTsKCUxDSUQgdGhpc2xvY2FsZT0wOwoJRFdPUkQgdGhpc2ZsYWdzPUxPQ0FMRV9TVElNRUZPUk1BVDsgLyogc3RhbmRhcnQgdGltZWZvcm1hdCAqLwoJSU5UIHJldDsKCSAgICAKCVRSQUNFKCJHZXRUaW1lRm9ybWF0KDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsbG9jYWxlLGZsYWdzLAoJeHRpbWUsZGVidWdzdHJfdyhmb3JtYXQpLHRpbWVzdHIsdGltZWxlbik7CgoJdGhpc2xvY2FsZSA9IE9MRTJOTFNfQ2hlY2tMb2NhbGUgKCBsb2NhbGUgKTsKCglpZiAoIGZsYWdzICYgKFRJTUVfTk9USU1FTUFSS0VSIHwgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCApKQoJeyBGSVhNRSgiVElNRV9OT1RJTUVNQVJLRVIgb3IgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCBub3QgaW1wbGVtZW50ZWRcbiIpOwoJfQogIAoJZmxhZ3MgJj0gKFRJTUVfTk9TRUNPTkRTIHwgVElNRV9OT01JTlVURVNPUlNFQ09ORFMpOyAvKiBtYXNrIGZvciBPTEVfR2V0Rm9ybWF0QSovCgoJaWYgKGZvcm1hdCA9PSBOVUxMKSAKCXsgaWYgKGZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSAgLyp1c2Ugc3lzdGVtIGRlZmF1bHQqLwoJICB7IHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJICB9CgkgIEdldExvY2FsZUluZm9XKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZm9ybWF0X2J1ZiwgNDApOwoJICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKCX0JICAKCWVsc2UgCgl7IHRoaXNmb3JtYXQgPSBmb3JtYXQ7Cgl9CiAKCWlmICh4dGltZSA9PSBOVUxMKSAvKiBOVUxMIG1lYW5zIHVzZSB0aGUgY3VycmVudCBsb2NhbCB0aW1lKi8KCXsgR2V0U3lzdGVtVGltZSgmdCk7CgkgIHRoaXN0aW1lID0gJnQ7Cgl9IAoJZWxzZQoJeyB0aGlzdGltZSA9IHh0aW1lOwoJfQoKCXJldCA9IE9MRV9HZXRGb3JtYXRXKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZmxhZ3MsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LAogIAkJCSB0aW1lc3RyLCB0aW1lbGVuKTsKCXJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1DYWxlbmRhckluZm9BCVtLRVJORUwzMi4xOTZdCiAqLwpCT09MIFdJTkFQSSBFbnVtQ2FsZW5kYXJJbmZvQSgKCUNBTElORk9fRU5VTVBST0NBIGNhbGluZm9wcm9jLExDSUQgbG9jYWxlLENBTElEIGNhbGVuZGFyLENBTFRZUEUgY2FsdHlwZQopIHsKCUZJWE1FKCIoJXAsMHglMDRseCwweCUwOGx4LDB4JTA4bHgpLHN0dWIhXG4iLGNhbGluZm9wcm9jLGxvY2FsZSxjYWxlbmRhcixjYWx0eXBlKTsKCXJldHVybiBGQUxTRTsKfQo=