LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAid2luZG93cy5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAib2xlLmgiCiNpbmNsdWRlICJvcHRpb25zLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgImRlYnVnLmgiCiNpbmNsdWRlICJtYWluLmgiCgpzdHJ1Y3QgTkxTX2xhbmdsb2NhbGUgewoJY29uc3QgaW50IGxhbmc7CglzdHJ1Y3QgTkxTX2xvY2FsZXZhciB7CgkJY29uc3QgaW50CXR5cGU7CgkJY29uc3QgY2hhcgkqdmFsOwoJfSBsb2N2YXJzWzE1MF07Cn07CgojZGVmaW5lIExBTkdfQkVHSU4obCxzKQl7CU1BS0VMQU5HSUQobCxzKSwgewoKI2RlZmluZSBMT0NWQUwodHlwZSx2YWx1ZSkJCQkJCXt0eXBlLHZhbHVlfSwKCiNkZWZpbmUgTEFOR19FTkQJCQkJCSB9fSwKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgTkxTX2xhbmdsb2NhbGUgbGFuZ2xvY2FsZXNbXSA9IHsKLyogYWRkIGxhbmd1YWdlcyBpbiBudW1lcmljYWwgb3JkZXIgb2YgbWFpbiBsYW5ndWFnZSAobGFzdCB0d28gZGlnaXRzKQogKiBpdCBpcyBtdWNoIGVhc2llciB0byBmaW5kIHRoZSBtaXNzaW5nIGhvbGVzIHRoYXQgd2F5ICovCgpMQU5HX0JFR0lOIChMQU5HX0NBVEFMQU4sIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MDMqLwojaW5jbHVkZSAibmxzL2NhdC5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0NaRUNILCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDA1Ki8KI2luY2x1ZGUgIm5scy9jemUubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19EQU5JU0gsIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MDYqLwojaW5jbHVkZSAibmxzL2Rhbi5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU4pCQkvKjB4MDQwNyovCiNpbmNsdWRlICJubHMvZGV1Lm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19HRVJNQU4sIFNVQkxBTkdfR0VSTUFOX1NXSVNTKQkJLyoweDA4MDcqLwojaW5jbHVkZSAibmxzL2Rlcy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfR0VSTUFOLCBTVUJMQU5HX0dFUk1BTl9BVVNUUklBTikJLyoweDBDMDcqLwojaW5jbHVkZSAibmxzL2RlYS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfR0VSTUFOLCBTVUJMQU5HX0dFUk1BTl9MVVhFTUJPVVJHKQkvKjB4MTAwNyovCiNpbmNsdWRlICJubHMvZGVsLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19HRVJNQU4sIFNVQkxBTkdfR0VSTUFOX0xJRUNIVEVOU1RFSU4pCS8qMHgxNDA3Ki8KI2luY2x1ZGUgIm5scy9kZWMubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMpCQkvKjB4MDQwOSovCiNpbmNsdWRlICJubHMvZW51Lm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVUspCQkvKjB4MDgwOSovCiNpbmNsdWRlICJubHMvZW5nLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfQVVTKQkJLyoweDBDMDkqLwojaW5jbHVkZSAibmxzL2VuYS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0NBTikJCS8qMHgxMDA5Ki8KI2luY2x1ZGUgIm5scy9lbmMubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9OWikJCS8qMHgxNDA5Ki8KI2luY2x1ZGUgIm5scy9lbnoubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9FSVJFKQkJLyoweDE4MDkqLwojaW5jbHVkZSAibmxzL2lybC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1NBRlJJQ0EpCS8qMHgxQzA5Ki8KI2luY2x1ZGUgIm5scy9lbnMubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9KQU1BSUNBKQkvKjB4MjAwOSovCiNpbmNsdWRlICJubHMvZW5qLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfQ0FSUklCRUFOKQkvKjB4MjQwOSovCiNpbmNsdWRlICJubHMvZW5iLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfQkVMSVpFKQkvKjB4MjgwOSovCiNpbmNsdWRlICJubHMvZW5sLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVFJJTklEQUQpICAgIAkvKjB4MkMwOSovCiNpbmNsdWRlICJubHMvZW50Lm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIKQkJLyoweDA0MGEqLwojaW5jbHVkZSAibmxzL2VzcC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX01FWElDQU4pCS8qMHgwODBhKi8KI2luY2x1ZGUgIm5scy9lc20ubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9NT0RFUk4pCS8qMHgwQzBhKi8KI2luY2x1ZGUgIm5scy9lc24ubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9HVUFURU1BTEEpCS8qMHgxMDBhKi8KI2luY2x1ZGUgIm5scy9lc2cubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9DT1NUQVJJQ0EpCS8qMHgxNDBhKi8KI2luY2x1ZGUgIm5scy9lc2MubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9QQU5BTUEpCS8qMHgxODBhKi8KI2luY2x1ZGUgIm5scy9lc2EubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9ET01JTklDQU4pCS8qMHgxQzBBKi8KI2luY2x1ZGUgIm5scy9lc2QubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9WRU5FWlVFTEEpCS8qMHgyMDBhKi8KI2luY2x1ZGUgIm5scy9lc3YubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9DT0xPTUJJQSkJLyoweDI0MGEqLwojaW5jbHVkZSAibmxzL2Vzby5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1BFUlUpCQkvKjB4MjgwYSovCiNpbmNsdWRlICJubHMvZXNyLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfQVJHRU5USU5BKQkvKjB4MmMwYSovCiNpbmNsdWRlICJubHMvZXNzLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfRUNVQURPUikJLyoweDMwMGEqLwojaW5jbHVkZSAibmxzL2VzZi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0NISUxFKQkvKjB4MzQwYSovCiNpbmNsdWRlICJubHMvZXNsLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfVVJVR1VBWSkJLyoweDM4MGEqLwojaW5jbHVkZSAibmxzL2VzeS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1BBUkFHVUFZKQkvKjB4M2MwYSovCiNpbmNsdWRlICJubHMvZXN6Lm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfQk9MSVZJQSkJLyoweDQwMGEqLwojaW5jbHVkZSAibmxzL2VzYi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0VMX1NBTFZBRE9SKQkvKjB4NDQwYSovCiNpbmNsdWRlICJubHMvZXNlLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfSE9ORFVSQVMpCS8qMHg0ODBhKi8KI2luY2x1ZGUgIm5scy9lc2gubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9OSUNBUkFHVUEpCS8qMHg0YzBhKi8KI2luY2x1ZGUgIm5scy9lc2kubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9QVUVSVE9fUklDTykJLyoweDUwMGEqLwojaW5jbHVkZSAibmxzL2VzdS5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0ZJTk5JU0gsIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MEIqLwojaW5jbHVkZSAibmxzL2Zpbi5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0ZSRU5DSCwgU1VCTEFOR19GUkVOQ0gpCQkvKjB4MDQwQyovCiNpbmNsdWRlICJubHMvZnJhLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19GUkVOQ0gsIFNVQkxBTkdfRlJFTkNIX0JFTEdJQU4pCS8qMHgwODBDKi8KI2luY2x1ZGUgIm5scy9mcmIubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0ZSRU5DSCwgU1VCTEFOR19GUkVOQ0hfQ0FOQURJQU4pCS8qMHgwQzBDKi8KI2luY2x1ZGUgIm5scy9mcmMubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0ZSRU5DSCwgU1VCTEFOR19GUkVOQ0hfU1dJU1MpCQkvKjB4MTAwQyovCiNpbmNsdWRlICJubHMvZnJzLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19GUkVOQ0gsIFNVQkxBTkdfRlJFTkNIX0xVWEVNQk9VUkcpCS8qMHgxNDBDKi8KI2luY2x1ZGUgIm5scy9mcmwubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19IVU5HQVJJQU4sIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MGUqLwojaW5jbHVkZSAibmxzL2h1bi5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0lUQUxJQU4sIFNVQkxBTkdfSVRBTElBTikJCS8qMHgwNDEwKi8KI2luY2x1ZGUgIm5scy9pdGEubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0lUQUxJQU4sIFNVQkxBTkdfSVRBTElBTl9TV0lTUykJLyoweDA4MTAqLwojaW5jbHVkZSAibmxzL2l0cy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0tPUkVBTiwgU1VCTEFOR19LT1JFQU4pCS8qMHgwNDEyKi8KI2luY2x1ZGUgIm5scy9rb3IubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19OT1JXRUdJQU4sIFNVQkxBTkdfTk9SV0VHSUFOX0JPS01BTCkJLyoweDA0MTQqLwojaW5jbHVkZSAibmxzL25vci5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfTk9SV0VHSUFOLCBTVUJMQU5HX05PUldFR0lBTl9OWU5PUlNLKQkvKjB4MDgxNCovCiNpbmNsdWRlICJubHMvbm9uLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfUE9MSVNILCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDE1Ki8KI2luY2x1ZGUgIm5scy9wbGsubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19QT1JUVUdVRVNFICxTVUJMQU5HX1BPUlRVR1VFU0VfQlJBWklMSUFOKQkvKjB4MDQxNiovCiNpbmNsdWRlICJubHMvcHRiLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19QT1JUVUdVRVNFICxTVUJMQU5HX1BPUlRVR1VFU0UpCQkvKjB4MDgxNiovCiNpbmNsdWRlICJubHMvcHRnLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfU0xPVkFLLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDFiKi8KI2luY2x1ZGUgIm5scy9za3kubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19TV0VESVNILCBTVUJMQU5HX1NXRURJU0gpCQkvKjB4MDQxZCovCiNpbmNsdWRlICJubHMvc3ZlLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TV0VESVNILCBTVUJMQU5HX1NXRURJU0hfRklOTEFORCkJLyoweDA4MWQqLwojaW5jbHVkZSAibmxzL3N2Zi5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1RIQUksIFNVQkxBTkdfREVGQVVMVCkJLyoweDQxZSovCiNpbmNsdWRlICJubHMvdGhhLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfRVNQRVJBTlRPLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHgwNDhmKi8KI2luY2x1ZGUgIm5scy9lc3BlcmFudG8ubmxzIgpMQU5HX0VORAoJICAgIH07CgoKLyogTG9jYWxlIG5hbWUgdG8gaWQgbWFwLiB1c2VkIGJ5IEVudW1TeXN0ZW1Mb2NhbGVzLCBHZXRMb2NhbEluZm9BIAogKiBNVVNUIGNvbnRhaW4gYWxsICNkZWZpbmVzIGZyb20gd2lubmxzLmgKICogbGFzdCBlbnRyeSBoYXMgTlVMTCBuYW1lLCAwIGlkLgogKi8gCiNkZWZpbmUgTE9DQUxFX0VOVFJZKHgpCXsjeCxMT0NBTEVfIyN4fQpzdGF0aWMgc3RydWN0IHRhZ0xPQ0FMRV9OQU1FMklEIHsKCWNoYXIJKm5hbWU7CglEV09SRAlpZDsKfSBsb2NhbGVfbmFtZTJpZFtdPSB7CglMT0NBTEVfRU5UUlkoSUxBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNFTkdMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkxBTkdOQU1FKSwKCUxPQ0FMRV9FTlRSWShTTkFUSVZFTEFOR05BTUUpLAoJTE9DQUxFX0VOVFJZKElDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0VOR0NPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZDVFJZTkFNRSksCglMT0NBTEVfRU5UUlkoU05BVElWRUNUUllOQU1FKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVExBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVENPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUQ09ERVBBR0UpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUQU5TSUNPREVQQUdFKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVE1BQ0NPREVQQUdFKSwKCUxPQ0FMRV9FTlRSWShTTElTVCksCglMT0NBTEVfRU5UUlkoSU1FQVNVUkUpLAoJTE9DQUxFX0VOVFJZKFNERUNJTUFMKSwKCUxPQ0FMRV9FTlRSWShTVEhPVVNBTkQpLAoJTE9DQUxFX0VOVFJZKFNHUk9VUElORyksCglMT0NBTEVfRU5UUlkoSURJR0lUUyksCglMT0NBTEVfRU5UUlkoSUxaRVJPKSwKCUxPQ0FMRV9FTlRSWShJTkVHTlVNQkVSKSwKCUxPQ0FMRV9FTlRSWShTTkFUSVZFRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShTQ1VSUkVOQ1kpLAoJTE9DQUxFX0VOVFJZKFNJTlRMU1lNQk9MKSwKCUxPQ0FMRV9FTlRSWShTTU9OREVDSU1BTFNFUCksCglMT0NBTEVfRU5UUlkoU01PTlRIT1VTQU5EU0VQKSwKCUxPQ0FMRV9FTlRSWShTTU9OR1JPVVBJTkcpLAoJTE9DQUxFX0VOVFJZKElDVVJSRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJSU5UTENVUlJESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElDVVJSRU5DWSksCglMT0NBTEVfRU5UUlkoSU5FR0NVUlIpLAoJTE9DQUxFX0VOVFJZKFNEQVRFKSwKCUxPQ0FMRV9FTlRSWShTVElNRSksCglMT0NBTEVfRU5UUlkoU1NIT1JUREFURSksCglMT0NBTEVfRU5UUlkoU0xPTkdEQVRFKSwKCUxPQ0FMRV9FTlRSWShTVElNRUZPUk1BVCksCglMT0NBTEVfRU5UUlkoSURBVEUpLAoJTE9DQUxFX0VOVFJZKElMREFURSksCglMT0NBTEVfRU5UUlkoSVRJTUUpLAoJTE9DQUxFX0VOVFJZKElUSU1FTUFSS1BPU04pLAoJTE9DQUxFX0VOVFJZKElDRU5UVVJZKSwKCUxPQ0FMRV9FTlRSWShJVExaRVJPKSwKCUxPQ0FMRV9FTlRSWShJREFZTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElNT05MWkVSTyksCglMT0NBTEVfRU5UUlkoUzExNTkpLAoJTE9DQUxFX0VOVFJZKFMyMzU5KSwKCUxPQ0FMRV9FTlRSWShJQ0FMRU5EQVJUWVBFKSwKCUxPQ0FMRV9FTlRSWShJT1BUSU9OQUxDQUxFTkRBUiksCglMT0NBTEVfRU5UUlkoSUZJUlNUREFZT0ZXRUVLKSwKCUxPQ0FMRV9FTlRSWShJRklSU1RXRUVLT0ZZRUFSKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMiksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNSksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNyksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMyksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNiksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU4KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FOSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEwKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTEpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMiksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEzKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTgpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU5KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTApLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEyKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTMpLAoJTE9DQUxFX0VOVFJZKFNQT1NJVElWRVNJR04pLAoJTE9DQUxFX0VOVFJZKFNORUdBVElWRVNJR04pLAoJTE9DQUxFX0VOVFJZKElQT1NTSUdOUE9TTiksCglMT0NBTEVfRU5UUlkoSU5FR1NJR05QT1NOKSwKCUxPQ0FMRV9FTlRSWShJUE9TU1lNUFJFQ0VERVMpLAoJTE9DQUxFX0VOVFJZKElQT1NTRVBCWVNQQUNFKSwKCUxPQ0FMRV9FTlRSWShJTkVHU1lNUFJFQ0VERVMpLAoJTE9DQUxFX0VOVFJZKElORUdTRVBCWVNQQUNFKSwKCUxPQ0FMRV9FTlRSWShGT05UU0lHTkFUVVJFKSwKCUxPQ0FMRV9FTlRSWShTSVNPNjM5TEFOR05BTUUpLAoJTE9DQUxFX0VOVFJZKFNJU08zMTY2Q1RSWU5BTUUpLAoJe05VTEwsMH0sCn07Cgpjb25zdCBzdHJ1Y3QgbWFwX2xjaWQyc3RyIHsKCUxDSUQJCWxhbmdpZDsKCWNvbnN0IGNoYXIJKmxhbmduYW1lOwp9IGxhbmd1YWdlc1tdPXsKCXsweDA0MDEsIkFyYWJpYyAoU2F1ZGkgQXJhYmlhKSJ9LAoJezB4MDgwMSwiQXJhYmljIChJcmFxKSJ9LAoJezB4MGMwMSwiQXJhYmljIChFZ3lwdCkifSwKCXsweDEwMDEsIkFyYWJpYyAoTGlieWEpIn0sCgl7MHgxNDAxLCJBcmFiaWMgKEFsZ2VyaWEpIn0sCgl7MHgxODAxLCJBcmFiaWMgKE1vcm9jY28pIn0sCgl7MHgxYzAxLCJBcmFiaWMgKFR1bmlzaWEpIn0sCgl7MHgyMDAxLCJBcmFiaWMgKE9tYW4pIn0sCgl7MHgyNDAxLCJBcmFiaWMgKFllbWVuKSJ9LAoJezB4MjgwMSwiQXJhYmljIChTeXJpYSkifSwKCXsweDJjMDEsIkFyYWJpYyAoSm9yZGFuKSJ9LAoJezB4MzAwMSwiQXJhYmljIChMZWJhbm9uKSJ9LAoJezB4MzQwMSwiQXJhYmljIChLdXdhaXQpIn0sCgl7MHgzODAxLCJBcmFiaWMgKFVuaXRlZCBBcmFiIEVtaXJhdGVzKSJ9LAoJezB4M2MwMSwiQXJhYmljIChCYWhyYWluKSJ9LAoJezB4NDAwMSwiQXJhYmljIChRYXRhcikifSwKCXsweDA0MDIsIkJ1bGdhcmlhbiJ9LAoJezB4MDQwMywiQ2F0YWxhbiJ9LAoJezB4MDQwNCwiQ2hpbmVzZSAoVGFpd2FuKSJ9LAoJezB4MDgwNCwiQ2hpbmVzZSAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YgQ2hpbmEpIn0sCgl7MHgwYzA0LCJDaGluZXNlIChIb25nIEtvbmcpIn0sCgl7MHgxMDA0LCJDaGluZXNlIChTaW5nYXBvcmUpIn0sCgl7MHgxNDA0LCJDaGluZXNlIChNYWNhdSkifSwKCXsweDA0MDUsIkN6ZWNoIn0sCgl7MHgwNDA2LCJEYW5pc2gifSwKCXsweDA0MDcsIkdlcm1hbiAoR2VybWFueSkifSwKCXsweDA4MDcsIkdlcm1hbiAoU3dpdHplcmxhbmQpIn0sCgl7MHgwYzA3LCJHZXJtYW4gKEF1c3RyaWEpIn0sCgl7MHgxMDA3LCJHZXJtYW4gKEx1eGVtYm91cmcpIn0sCgl7MHgxNDA3LCJHZXJtYW4gKExpZWNodGVuc3RlaW4pIn0sCgl7MHgwNDA4LCJHcmVlayJ9LAoJezB4MDQwOSwiRW5nbGlzaCAoVW5pdGVkIFN0YXRlcykifSwKCXsweDA4MDksIkVuZ2xpc2ggKFVuaXRlZCBLaW5nZG9tKSJ9LAoJezB4MGMwOSwiRW5nbGlzaCAoQXVzdHJhbGlhKSJ9LAoJezB4MTAwOSwiRW5nbGlzaCAoQ2FuYWRhKSJ9LAoJezB4MTQwOSwiRW5nbGlzaCAoTmV3IFplYWxhbmQpIn0sCgl7MHgxODA5LCJFbmdsaXNoIChJcmVsYW5kKSJ9LAoJezB4MWMwOSwiRW5nbGlzaCAoU291dGggQWZyaWNhKSJ9LAoJezB4MjAwOSwiRW5nbGlzaCAoSmFtYWljYSkifSwKCXsweDI0MDksIkVuZ2xpc2ggKENhcmliYmVhbikifSwKCXsweDI4MDksIkVuZ2xpc2ggKEJlbGl6ZSkifSwKCXsweDJjMDksIkVuZ2xpc2ggKFRyaW5pZGFkKSJ9LAoJezB4MzAwOSwiRW5nbGlzaCAoWmltYmFid2UpIn0sCgl7MHgzNDA5LCJFbmdsaXNoIChQaGlsaXBwaW5lcykifSwKCXsweDA0MGEsIlNwYW5pc2ggKFNwYWluLCB0cmFkaXRpb25hbCBzb3J0aW5nKSJ9LAoJezB4MDgwYSwiU3BhbmlzaCAoTWV4aWNvKSJ9LAoJezB4MGMwYSwiU3BhbmlzaCAoU3BhaW4sIGludGVybmF0aW9uYWwgc29ydGluZykifSwKCXsweDEwMGEsIlNwYW5pc2ggKEd1YXRlbWFsYSkifSwKCXsweDE0MGEsIlNwYW5pc2ggKENvc3RhIFJpY2EpIn0sCgl7MHgxODBhLCJTcGFuaXNoIChQYW5hbWEpIn0sCgl7MHgxYzBhLCJTcGFuaXNoIChEb21pbmljYW4gUmVwdWJsaWMpIn0sCgl7MHgyMDBhLCJTcGFuaXNoIChWZW5lenVlbGEpIn0sCgl7MHgyNDBhLCJTcGFuaXNoIChDb2xvbWJpYSkifSwKCXsweDI4MGEsIlNwYW5pc2ggKFBlcnUpIn0sCgl7MHgyYzBhLCJTcGFuaXNoIChBcmdlbnRpbmEpIn0sCgl7MHgzMDBhLCJTcGFuaXNoIChFY3VhZG9yKSJ9LAoJezB4MzQwYSwiU3BhbmlzaCAoQ2hpbGUpIn0sCgl7MHgzODBhLCJTcGFuaXNoIChVcnVndWF5KSJ9LAoJezB4M2MwYSwiU3BhbmlzaCAoUGFyYWd1YXkpIn0sCgl7MHg0MDBhLCJTcGFuaXNoIChCb2xpdmlhKSJ9LAoJezB4NDQwYSwiU3BhbmlzaCAoRWwgU2FsdmFkb3IpIn0sCgl7MHg0ODBhLCJTcGFuaXNoIChIb25kdXJhcykifSwKCXsweDRjMGEsIlNwYW5pc2ggKE5pY2FyYWd1YSkifSwKCXsweDUwMGEsIlNwYW5pc2ggKFB1ZXJ0byBSaWNvKSJ9LAoJezB4MDQwYiwiRmlubmlzaCJ9LAoJezB4MDQwYywiRnJlbmNoIChGcmFuY2UpIn0sCgl7MHgwODBjLCJGcmVuY2ggKEJlbGdpdW0pIn0sCgl7MHgwYzBjLCJGcmVuY2ggKENhbmFkYSkifSwKCXsweDEwMGMsIkZyZW5jaCAoU3dpdHplcmxhbmQpIn0sCgl7MHgxNDBjLCJGcmVuY2ggKEx1eGVtYm91cmcpIn0sCgl7MHgxODBjLCJGcmVuY2ggKE1vbmFjbykifSwKCXsweDA0MGQsIkhlYnJldyJ9LAoJezB4MDQwZSwiSHVuZ2FyaWFuIn0sCgl7MHgwNDBmLCJJY2VsYW5kaWMifSwKCXsweDA0MTAsIkl0YWxpYW4gKEl0YWx5KSJ9LAoJezB4MDgxMCwiSXRhbGlhbiAoU3dpdHplcmxhbmQpIn0sCgl7MHgwNDExLCJKYXBhbmVzZSJ9LAoJezB4MDQxMiwiS29yZWFuIChXYW5zdW5nKSJ9LAoJezB4MDgxMiwiS29yZWFuIChKb2hhYikifSwKCXsweDA0MTMsIkR1dGNoIChOZXRoZXJsYW5kcykifSwKCXsweDA4MTMsIkR1dGNoIChCZWxnaXVtKSJ9LAoJezB4MDQxNCwiTm9yd2VnaWFuIChCb2ttYWwpIn0sCgl7MHgwODE0LCJOb3J3ZWdpYW4gKE55bm9yc2spIn0sCgl7MHgwNDE1LCJQb2xpc2gifSwKCXsweDA0MTYsIlBvcnR1Z3Vlc2UgKEJyYXppbCkifSwKCXsweDA4MTYsIlBvcnR1Z3Vlc2UgKFBvcnR1Z2FsKSJ9LAoJezB4MDQxNywiUmhhZXRvIFJvbWFuaWMifSwKCXsweDA0MTgsIlJvbWFuaWFuIn0sCgl7MHgwODE4LCJNb2xkYXZpYW4ifSwKCXsweDA0MTksIlJ1c3NpYW4gKFJ1c3NpYSkifSwKCXsweDA4MTksIlJ1c3NpYW4gKE1vbGRhdmlhKSJ9LAoJezB4MDQxYSwiQ3JvYXRpYW4ifSwKCXsweDA4MWEsIlNlcmJpYW4gKGxhdGluKSJ9LAoJezB4MGMxYSwiU2VyYmlhbiAoY3lyaWxsaWMpIn0sCgl7MHgwNDFiLCJTbG92YWsifSwKCXsweDA0MWMsIkFsYmFuaWFuIn0sCgl7MHgwNDFkLCJTd2VkaXNoIChTd2VkZW4pIn0sCgl7MHgwODFkLCJTd2VkaXNoIChGaW5sYW5kKSJ9LAoJezB4MDQxZSwiVGhhaSJ9LAoJezB4MDQxZiwiVHVya2lzaCJ9LAoJezB4MDQyMCwiVXJkdSJ9LAoJezB4MDQyMSwiSW5kb25lc2lhbiJ9LAoJezB4MDQyMiwiVWtyYWluaWFuIn0sCgl7MHgwNDIzLCJCZWxhcnVzaWFuIn0sCgl7MHgwNDI0LCJTbG92ZW5lIn0sCgl7MHgwNDI1LCJFc3RvbmlhbiJ9LAoJezB4MDQyNiwiTGF0dmlhbiJ9LAoJezB4MDQyNywiTGl0aHVhbmlhbiAobW9kZXJuKSJ9LAoJezB4MDgyNywiTGl0aHVhbmlhbiAoY2xhc3NpYykifSwKCXsweDA0MjgsIk1hb3JpIn0sCgl7MHgwNDI5LCJGYXJzaSJ9LAoJezB4MDQyYSwiVmlldG5hbWVzZSJ9LAoJezB4MDQyYiwiQXJtZW5pYW4ifSwKCXsweDA0MmMsIkF6ZXJpIChsYXRpbikifSwKCXsweDA4MmMsIkF6ZXJpIChjeXJpbGxpYykifSwKCXsweDA0MmQsIkJhc3F1ZSJ9LAoJezB4MDQyZSwiU29yYmlhbiJ9LAoJezB4MDQyZiwiTWFjZWRvbmlhbiJ9LAoJezB4MDQzMCwiU3V0dSJ9LAoJezB4MDQzMSwiVHNvbmdhIn0sCgl7MHgwNDMyLCJUc3dhbmEifSwKCXsweDA0MzMsIlZlbmRhIn0sCgl7MHgwNDM0LCJYaG9zYSJ9LAoJezB4MDQzNSwiWnVsdSJ9LAoJezB4MDQzNiwiQWZyaWthYW5zIn0sCgl7MHgwNDM3LCJHZW9yZ2lhbiJ9LAoJezB4MDQzOCwiRmFlcm9lc2UifSwKCXsweDA0MzksIkhpbmRpIn0sCgl7MHgwNDNhLCJNYWx0ZXNlIn0sCgl7MHgwNDNiLCJTYWFtaSJ9LAoJezB4MDQzYywiSXJpc2ggZ2FlbGljIn0sCgl7MHgwODNjLCJTY290dGlzaCBnYWVsaWMifSwKCXsweDA0M2UsIk1hbGF5IChNYWxheXNpYSkifSwKCXsweDA4M2UsIk1hbGF5IChCcnVuZWkgRGFydXNzYWxhbSkifSwKCXsweDA0M2YsIkthemFrIn0sCgl7MHgwNDQxLCJTd2FoaWxpIn0sCgl7MHgwNDQzLCJVemJlayAobGF0aW4pIn0sCgl7MHgwODQzLCJVemJlayAoY3lyaWxsaWMpIn0sCgl7MHgwNDQ0LCJUYXRhciJ9LAoJezB4MDQ0NSwiQmVuZ2FsaSJ9LAoJezB4MDQ0NiwiUHVuamFiaSJ9LAoJezB4MDQ0NywiR3VqYXJhdGkifSwKCXsweDA0NDgsIk9yaXlhIn0sCgl7MHgwNDQ5LCJUYW1pbCJ9LAoJezB4MDQ0YSwiVGVsdWd1In0sCgl7MHgwNDRiLCJLYW5uYWRhIn0sCgl7MHgwNDRjLCJNYWxheWFsYW0ifSwKCXsweDA0NGQsIkFzc2FtZXNlIn0sCgl7MHgwNDRlLCJNYXJhdGhpIn0sCgl7MHgwNDRmLCJTYW5za3JpdCJ9LAoJezB4MDQ1NywiS29ua2FuaSJ9LAoJezB4MDQ4ZiwiRXNwZXJhbnRvIn0sIC8qIE5vbiBvZmZpY2lhbCAqLwoJezB4MDAwMCwiVW5rbm93biJ9CiAgICB9LCBsYW5ndWFnZXNfZGVbXT17Cgl7MHgwNDAxLCJBcmFiaWMifSwKCXsweDA0MDIsIkJ1bGdhcmlzY2gifSwKCXsweDA0MDMsIkthdGFsYW5pc2NoIn0sCgl7MHgwNDA0LCJUcmFkaXRpb25hbGVzIENoaW5lc2lzY2gifSwKCXsweDA0MDUsIlRzY2hlY2lzY2gifSwKCXsweDA0MDYsIkTkbmlzY2gifSwKCXsweDA0MDcsIkRldXRzY2gifSwKCXsweDA0MDgsIkdyaWVjaGlzY2gifSwKCXsweDA0MDksIkFtZXJpa2FuaXNjaGVzIEVuZ2xpc2NoIn0sCgl7MHgwNDBBLCJLYXN0aWxpc2NoZXMgU3BhbmlzY2gifSwKCXsweDA0MEIsIkZpbm5pc2NoIn0sCgl7MHgwNDBDLCJGcmFuenZzaXNjaCJ9LAoJezB4MDQwRCwiSGVicmRpc2NoIn0sCgl7MHgwNDBFLCJVbmdhcmlzY2gifSwKCXsweDA0MEYsIklzbGRuZGlzY2gifSwKCXsweDA0MTAsIkl0YWxpZW5pc2NoIn0sCgl7MHgwNDExLCJKYXBhbmlzY2gifSwKCXsweDA0MTIsIktvcmVhbmlzY2gifSwKCXsweDA0MTMsIk5pZWRlcmxkbmRpc2NoIn0sCgl7MHgwNDE0LCJOb3J3ZWdpc2NoLUJva21hbCJ9LAoJezB4MDQxNSwiUG9sbmlzY2gifSwKCXsweDA0MTYsIkJyYXNpbGlhbmlzY2hlcyBQb3J0dWdpZXNpc2NoIn0sCgl7MHgwNDE3LCJSZHRvcm9tYW5pc2NoIn0sCgl7MHgwNDE4LCJSdW1kbmlzY2gifSwKCXsweDA0MTksIlJ1c3Npc2NoIn0sCgl7MHgwNDFBLCJLcm9hdG9zZXJiaXNjaCAobGF0ZWluaXNjaCkifSwKCXsweDA0MUIsIlNsb3dlbmlzY2gifSwKCXsweDA0MUMsIkFsYmFuaXNjaCJ9LAoJezB4MDQxRCwiU2Nod2VkaXNjaCJ9LAoJezB4MDQxRSwiVGhhaSJ9LAoJezB4MDQxRiwiVPxya2lzY2gifSwKCXsweDA0MjAsIlVyZHUifSwKCXsweDA0MjEsIkJhaGFzYSJ9LAoJezB4MDgwNCwiVmVyZWluZmFjaHRlcyBDaGluZXNpc2NoIn0sCgl7MHgwODA3LCJTY2h3ZWl6ZXJkZXV0c2NoIn0sCgl7MHgwODA5LCJCcml0aXNjaGVzIEVuZ2xpc2NoIn0sCgl7MHgwODBBLCJNZXhpa2FuaXNjaGVzIFNwYW5pc2NoIn0sCgl7MHgwODBDLCJCZWxnaXNjaGVzIEZyYW56dnNpc2NoIn0sCgl7MHgwODEwLCJTY2h3ZWl6ZXJpc2NoZXMgSXRhbGllbmlzY2gifSwKCXsweDA4MTMsIkJlbGdpc2NoZXMgTmllZGVybGRuZGlzY2gifSwKCXsweDA4MTQsIk5vcmd3ZWdpc2NoLU55bm9yc2sifSwKCXsweDA4MTYsIlBvcnR1Z2llc2lzY2gifSwKCXsweDA4MUEsIlNlcmJva3JhdGlzY2ggKGt5cmlsbGlzY2gpIn0sCgl7MHgwQzFDLCJLYW5hZGlzY2hlcyBGcmFuenZzaXNjaCJ9LAoJezB4MTAwQywiU2Nod2VpemVyaXNjaGVzIEZyYW56dnNpc2NoIn0sCgl7MHgwMDAwLCJVbmJla2FubnQifSwKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgR2V0VXNlckRlZmF1bHRMQ0lEICAgICAgIChPTEUyTkxTLjEpCiAqLwpMQ0lEIFdJTkFQSSBHZXRVc2VyRGVmYXVsdExDSUQoKQp7CglyZXR1cm4gTUFLRUxDSUQoIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCkgLCBTT1JUX0RFRkFVTFQgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0U3lzdGVtRGVmYXVsdExDSUQgICAgICAgKE9MRTJOTFMuMikKICovCkxDSUQgV0lOQVBJIEdldFN5c3RlbURlZmF1bHRMQ0lEKCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TENJRCgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRVc2VyRGVmYXVsdExhbmdJRCAgICAgICAoT0xFMk5MUy4zKQogKi8KTEFOR0lEIFdJTkFQSSBHZXRVc2VyRGVmYXVsdExhbmdJRCgpCnsKCS8qIGNhY2hpbmcgcmVzdWx0LCBpZiBkZWZpbmVkIGZyb20gZW52aXJvbm1lbnQsIHdoaWNoIHNob3VsZCAoPykgbm90IGNoYW5nZSBkdXJpbmcgYSBXSU5FIHNlc3Npb24gKi8KCXN0YXRpYwlMQU5HSUQJdXNlckxDSUQgPSAwOwoJaWYgKE9wdGlvbnMubGFuZ3VhZ2UpIHsKCQlyZXR1cm4gTGFuZ3VhZ2VzW09wdGlvbnMubGFuZ3VhZ2VdLmxhbmdpZDsKCX0KCglpZiAodXNlckxDSUQgPT0gMCkgewoJCWNoYXIgKmJ1Zj1OVUxMOwoJCWNoYXIgKmxhbmcsKmNvdW50cnksKmNoYXJzZXQsKmRpYWxlY3QsKm5leHQ7CgkJaW50IAlyZXQ9MDsKCQkKCQlidWY9Z2V0ZW52KCJMQU5HVUFHRSIpOwoJCWlmICghYnVmKSBidWY9Z2V0ZW52KCJMQU5HIik7CgkJaWYgKCFidWYpIGJ1Zj1nZXRlbnYoIkxDX0FMTCIpOwoJCWlmICghYnVmKSBidWY9Z2V0ZW52KCJMQ19NRVNTQUdFUyIpOwoJCWlmICghYnVmKSBidWY9Z2V0ZW52KCJMQ19DVFlQRSIpOwoJCWlmICghYnVmKSByZXR1cm4gdXNlckxDSUQgPSBNQUtFTEFOR0lEKCBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfREVGQVVMVCApOwoJCQoJCWlmICghc3RyY21wKGJ1ZiwiUE9TSVgiKSB8fCAhc3RyY21wKGJ1ZiwiQyIpKSB7CgkJCXJldHVybiBNQUtFTEFOR0lEKCBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfREVGQVVMVCApOwoJCX0KCQkKCQlsYW5nPWJ1ZjsKCQkKCQlkbyB7CgkJCW5leHQ9c3RyY2hyKGxhbmcsJzonKTsgaWYgKG5leHQpICpuZXh0Kys9J1wwJzsKCQkJZGlhbGVjdD1zdHJjaHIobGFuZywnQCcpOyBpZiAoZGlhbGVjdCkgKmRpYWxlY3QrKz0nXDAnOwoJCQljaGFyc2V0PXN0cmNocihsYW5nLCcuJyk7IGlmIChjaGFyc2V0KSAqY2hhcnNldCsrPSdcMCc7CgkJCWNvdW50cnk9c3RyY2hyKGxhbmcsJ18nKTsgaWYgKGNvdW50cnkpICpjb3VudHJ5Kys9J1wwJzsKCQkJCgkJCXJldD1NQUlOX0dldExhbmd1YWdlSUQobGFuZywgY291bnRyeSwgY2hhcnNldCwgZGlhbGVjdCk7CgkJCQoJCQlsYW5nPW5leHQ7CgkJCQoJCX0gd2hpbGUgKGxhbmcgJiYgIXJldCk7CgkJCgkJLyogRklYTUUgOiBhcmUgc3RyaW5ncyByZXR1cm5lZCBieSBnZXRlbnYoKSB0byBiZSBmcmVlKCknZWQgPyAqLwoJCXVzZXJMQ0lEID0gKExBTkdJRClyZXQ7Cgl9CglyZXR1cm4gdXNlckxDSUQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldFN5c3RlbURlZmF1bHRMYW5nSUQgICAgIChPTEUyTkxTLjQpCiAqLwpMQU5HSUQgV0lOQVBJIEdldFN5c3RlbURlZmF1bHRMYW5nSUQoKQp7CglyZXR1cm4gR2V0VXNlckRlZmF1bHRMYW5nSUQoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0TG9jYWxlSW5mbzE2CVtPTEUyTkxTLjVdCiAqIElzIHRoZSBsYXN0IHBhcmFtZXRlciByZWFsbHkgV09SRCBmb3IgV2luMTY/CiAqLwpJTlQxNiBXSU5BUEkgR2V0TG9jYWxlSW5mbzE2KExDSUQgbGNpZCxMQ1RZUEUgTENUeXBlLExQU1RSIGJ1ZixJTlQxNiBsZW4pCnsKCXJldHVybiBHZXRMb2NhbGVJbmZvMzJBKGxjaWQsTENUeXBlLGJ1ZixsZW4pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEdldExvY2FsZUluZm8zMkEgW0tFUk5FTDMyLjM0Ml0KICoKICogTk9URVMgCiAqICBMQU5HX05FVVRSQUwgaXMgZXF1YWwgdG8gTE9DQUxFX1NZU1RFTV9ERUZBVUxUCiAqLwpJTlQzMiBXSU5BUEkgR2V0TG9jYWxlSW5mbzMyQShMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFNUUiBidWYsSU5UMzIgbGVuKQp7CiAgTFBDU1RSICByZXRTdHJpbmc7CglpbnQJZm91bmQsaTsKCWludAlsYW5nPTA7CgogIFRSQUNFKG9sZSwiKGxjaWQ9MHglbHgsbGN0eXBlPTB4JWx4LCVwLCV4KVxuIixsY2lkLExDVHlwZSxidWYsbGVuKTsKCiAgaWYgKGxlbiAmJiAoISBidWYpICkgewogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJCXJldHVybiAwOwoJfQoKCWlmIChsY2lkID09MCB8fCBsY2lkID09IExBTkdfU1lTVEVNX0RFRkFVTFQgfHwgKExDVHlwZSAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkgKQkvKiAweDAwLCAweDQwMCAqLwoJewogICAgICAgICAgICBsY2lkID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKCX0gCgllbHNlIGlmIChsY2lkID09IExBTkdfVVNFUl9ERUZBVUxUKSAvKjB4ODAwKi8KCXsKICAgICAgICAgICAgbGNpZCA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwoJfQoJTENUeXBlICY9IH4oTE9DQUxFX05PVVNFUk9WRVJSSURFfExPQ0FMRV9VU0VfQ1BfQUNQKTsKCgkvKiBBcyBhbiBvcHRpb24sIHdlIGNvdWxkIG9idGFpbiB0aGUgdmFsdWUgZnJvbSB3aW4uaW5pLgoJICAgVGhpcyB3b3VsZCBub3QgbWF0Y2ggdGhlIFdpbmUgY29tcGlsZS10aW1lIG9wdGlvbi4KCSAgIEFsc28sIG5vdCBhbGwgaWRlbnRpZmllcnMgYXJlIGF2YWlsYWJsZSBmcm9tIHdpbi5pbmkgKi8KCXJldFN0cmluZz0wOwoJLyogSWYgd2UgYXJlIHRocm91Z2ggYWxsIG9mIHRoaXMsIHJldExlbiBzaG91bGQgbm90IGJlIHplcm8gYW55bW9yZS4KCSAgIElmIGl0IGlzLCB0aGUgdmFsdWUgaXMgbm90IHN1cHBvcnRlZCAqLwoJaT0wOwoJd2hpbGUgKGxvY2FsZV9uYW1lMmlkW2ldLm5hbWUhPU5VTEwpIHsKCQlpZiAoTENUeXBlID09IGxvY2FsZV9uYW1lMmlkW2ldLmlkKSB7CgkJCXJldFN0cmluZyA9IGxvY2FsZV9uYW1lMmlkW2ldLm5hbWU7CgkJCWJyZWFrOwoJCX0KCQlpKys7Cgl9CglpZiAoIXJldFN0cmluZykgewogICAgICBGSVhNRShvbGUsIlVua293biBMQyB0eXBlICVsWFxuIixMQ1R5cGUpOwoJCXJldHVybiAwOwoJfQoKICAgIGZvdW5kPTA7bGFuZz1sY2lkOwogICAgZm9yIChpPTA7KGk8MyAmJiAhZm91bmQpO2krKykgewogICAgICBpbnQgajsKCiAgICAgIGZvciAoaj0wO2o8c2l6ZW9mKGxhbmdsb2NhbGVzKS9zaXplb2YobGFuZ2xvY2FsZXNbMF0pO2orKykgewoJaWYgKGxhbmdsb2NhbGVzW2pdLmxhbmcgPT0gbGFuZykgewoJICBpbnQgazsKCgkgIGZvciAoaz0wO2s8c2l6ZW9mKGxhbmdsb2NhbGVzW2pdLmxvY3ZhcnMpL3NpemVvZihsYW5nbG9jYWxlc1tqXS5sb2N2YXJzWzBdKSAmJiAobGFuZ2xvY2FsZXNbal0ubG9jdmFyc1trXS50eXBlKTtrKyspIHsKCSAgICBpZiAobGFuZ2xvY2FsZXNbal0ubG9jdmFyc1trXS50eXBlID09IExDVHlwZSkgewoJICAgICAgZm91bmQgPSAxOwoJICAgICAgcmV0U3RyaW5nID0gbGFuZ2xvY2FsZXNbal0ubG9jdmFyc1trXS52YWw7CgkgIGJyZWFrOwoJICAgIH0KCSAgfQogICAgICAgICAgaWYgKGZvdW5kKQoJICAgIGJyZWFrOwoJfQogICAgICB9CgkgIC8qIGxhbmd1YWdlIG5vdCBmb3VuZCwgdHJ5IHdpdGhvdXQgYSBzdWJsYW5ndWFnZSovCgkgIGlmIChpPT0xKSBsYW5nPU1BS0VMQU5HSUQoIFBSSU1BUllMQU5HSUQobGFuZyksIFNVQkxBTkdfREVGQVVMVCk7CgkgIC8qIG1hc2sgdGhlIExDIFZhbHVlICovCgkgIGlmIChpPT0yKSBMQ1R5cGUgJj0gMHhmZmY7CiAgICB9CgogICAgaWYoIWZvdW5kKSB7CiAgICAgIEVSUihvbGUsIiclcycgbm90IHN1cHBvcnRlZCBmb3IgeW91ciBsYW5ndWFnZSAoJTA0WCkuXG4iLAoJCQlyZXRTdHJpbmcsKFdPUkQpbGNpZCk7CgkJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCQlyZXR1cm4gMDsJCQkKCX0KCS8qIGlmIGxlbj0wIHJldHVybiBvbmx5IHRoZSBsZW5ndGgsIGRvbid0IHRvdWNoIHRoZSBidWZmZXIqLwoJaWYgKGxlbikKCQlsc3RyY3B5bjMyQShidWYscmV0U3RyaW5nLGxlbik7CgoJcmV0dXJuIHN0cmxlbihyZXRTdHJpbmcpKzE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldExvY2FsZUluZm8zMlcJW0tFUk5FTDMyLjM0M10KICoKICovCklOVDMyIFdJTkFQSSBHZXRMb2NhbGVJbmZvMzJXKExDSUQgbGNpZCxMQ1RZUEUgTENUeXBlLExQV1NUUiB3YnVmLElOVDMyIGxlbikKewlXT1JEIHdsZW47CglMUFNUUiBhYnVmOwoJCglpZiAobGVuICYmICghIHdidWYpICkKCXsgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICByZXR1cm4gMDsKCX0KCglhYnVmID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuKTsKCXdsZW4gPSAyICogR2V0TG9jYWxlSW5mbzMyQShsY2lkLCBMQ1R5cGUsIGFidWYsIGxlbik7CgoJaWYgKHdsZW4gJiYgbGVuKQkvKiBpZiBsZW49MCByZXR1cm4gb25seSB0aGUgbGVuZ3RoKi8KCSAgbHN0cmNweW5BdG9XKHdidWYsYWJ1ZixsZW4vMik7CgoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGFidWYpOwoJcmV0dXJuIHdsZW47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldExvY2FsZUluZm9BCVtLRVJORUwzMi42NTZdCiAqLwpCT09MMTYgV0lOQVBJIFNldExvY2FsZUluZm9BKERXT1JEIGxjaWQsIERXT1JEIGxjdHlwZSwgTFBDU1RSIGRhdGEpCnsKICAgIEZJWE1FKG9sZSwiKCVsZCwlbGQsJXMpOiBzdHViXG4iLGxjaWQsbGN0eXBlLGRhdGEpOwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlzVmFsaWRMb2NhbGUJW0tFUk5FTDMyLjQ4OV0KICovCkJPT0wzMiBXSU5BUEkgSXNWYWxpZExvY2FsZShMQ0lEIGxjaWQsRFdPUkQgZmxhZ3MpCnsKCS8qIHdlIHN1cHBvcnQgQU5ZIGxhbmd1YWdlLiBXZWxsLCBhdCBsZWFzdCBzYXkgdGhhdC4uLiovCglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bVN5c3RlbUxvY2FsZXMzMlcJW0tFUk5FTDMyLjIwOV0KICovCkJPT0wzMiBXSU5BUEkgRW51bVN5c3RlbUxvY2FsZXMzMlcoIExPQ0FMRV9FTlVNUFJPQzMyVyBscGZuTG9jYWxlRW51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MgKQp7CglpbnQJaTsKCUJPT0wzMglyZXQ7CglXQ0hBUglidWZmZXJbMjAwXTsKCUhLRVkJeGhrZXk7CgoJVFJBQ0Uod2luMzIsIiglcCwlMDhseClcbiIsbHBmbkxvY2FsZUVudW0sZmxhZ3MgKTsKCS8qIHNlZSBpZiB3ZSBjYW4gcmV1c2UgdGhlIFdpbjk1IHJlZ2lzdHJ5IGVudHJpZXMuLi4uICovCglpZiAoRVJST1JfU1VDQ0VTUz09UmVnT3BlbktleTMyQShIS0VZX0xPQ0FMX01BQ0hJTkUsIlN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwiLCZ4aGtleSkpIHsKCQlpPTA7CgkJd2hpbGUgKDEpIHsKCQkJaWYgKEVSUk9SX1NVQ0NFU1MhPVJlZ0VudW1LZXkzMlcoeGhrZXksaSxidWZmZXIsc2l6ZW9mKGJ1ZmZlcikpKQoJCQkJYnJlYWs7CiAgICAgICAgICAgIAkJaWYgKCFscGZuTG9jYWxlRW51bShidWZmZXIpKQoJCQkJYnJlYWs7CgkJCWkrKzsKCQl9CgkJUmVnQ2xvc2VLZXkoeGhrZXkpOwoJCXJldHVybiBUUlVFOwoJfQoKCWk9MDsKCXdoaWxlIChsYW5ndWFnZXNbaV0ubGFuZ2lkIT0wKQogICAgICAgIHsKICAgICAgICAgICAgTFBXU1RSIGNwOwoJICAgIGNoYXIgICB4YnVmZmVyWzEwXTsKICAJCgkgICAgc3ByaW50Zih4YnVmZmVyLCIlMDhseCIsKERXT1JEKWxhbmd1YWdlc1tpXS5sYW5naWQpOwoKCSAgICBjcCA9IEhFQVBfc3RyZHVwQXRvVyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgeGJ1ZmZlciApOwogICAgICAgICAgICByZXQgPSBscGZuTG9jYWxlRW51bShjcCk7CiAgICAgICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBjcCApOwogICAgICAgICAgICBpZiAoIXJldCkgYnJlYWs7CiAgICAgICAgICAgIGkrKzsKCX0KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFbnVtU3lzdGVtTG9jYWxlczMyQQlbS0VSTkVMMzIuMjA4XQogKi8KQk9PTDMyIFdJTkFQSSBFbnVtU3lzdGVtTG9jYWxlczMyQShMT0NBTEVfRU5VTVBST0MzMkEgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MpCnsKCWludAlpOwoJQ0hBUglidWZmZXJbMjAwXTsKCUhLRVkJeGhrZXk7CgoJVFJBQ0Uod2luMzIsIiglcCwlMDhseClcbiIsCgkJbHBmbkxvY2FsZUVudW0sZmxhZ3MKCSk7CglpZiAoRVJST1JfU1VDQ0VTUz09UmVnT3BlbktleTMyQShIS0VZX0xPQ0FMX01BQ0hJTkUsIlN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwiLCZ4aGtleSkpIHsKCQlpPTA7CgkJd2hpbGUgKDEpIHsKCQkJaWYgKEVSUk9SX1NVQ0NFU1MhPVJlZ0VudW1LZXkzMkEoeGhrZXksaSxidWZmZXIsc2l6ZW9mKGJ1ZmZlcikpKQoJCQkJYnJlYWs7CiAgICAgICAgICAgIAkJaWYgKCFscGZuTG9jYWxlRW51bShidWZmZXIpKQoJCQkJYnJlYWs7CgkJCWkrKzsKCQl9CgkJUmVnQ2xvc2VLZXkoeGhrZXkpOwoJCXJldHVybiBUUlVFOwoJfQoJaT0wOwoJd2hpbGUgKGxhbmd1YWdlc1tpXS5sYW5naWQhPTApIHsKCQlzcHJpbnRmKGJ1ZmZlciwiJTA4bHgiLChEV09SRClsYW5ndWFnZXNbaV0ubGFuZ2lkKTsKCQlpZiAoIWxwZm5Mb2NhbGVFbnVtKGJ1ZmZlcikpCgkJCWJyZWFrOwoJCWkrKzsKCX0KCXJldHVybiBUUlVFOwp9CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBDVF9DVHlwZTJfTFVUW10gPSB7CiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDQgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA1ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA4ICovCiAgQzJfU0VHTUVOVFNFUEFSQVRPUiwgLyogICAtICAgOSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDExICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE0ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxOCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTkgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjUgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjggKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI5ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAzMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMzEgKi8KICBDMl9XSElURVNQQUNFLCAvKiAgIC0gIDMyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAhIC0gIDMzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAjIC0gIDM1ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogJCAtICAzNiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICUgLSAgMzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogJiAtICAzOCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogJyAtICAzOSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKCAtICA0MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKSAtICA0MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKiAtICA0MiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICsgLSAgNDMgKi8KICBDMl9DT01NT05TRVBBUkFUT1IsIC8qICwgLSAgNDQgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAtIC0gIDQ1ICovCiAgQzJfRVVST1BFU0VQQVJBVE9SLCAvKiAuIC0gIDQ2ICovCiAgQzJfRVVST1BFU0VQQVJBVE9SLCAvKiAvIC0gIDQ3ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAwIC0gIDQ4ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAxIC0gIDQ5ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAyIC0gIDUwICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAzIC0gIDUxICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA0IC0gIDUyICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA1IC0gIDUzICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA2IC0gIDU0ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA3IC0gIDU1ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA4IC0gIDU2ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA5IC0gIDU3ICovCiAgQzJfQ09NTU9OU0VQQVJBVE9SLCAvKiA6IC0gIDU4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA7IC0gIDU5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA8IC0gIDYwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA9IC0gIDYxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA+IC0gIDYyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA/IC0gIDYzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEAgLSAgNjQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQSAtICA2NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBCIC0gIDY2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEMgLSAgNjcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRCAtICA2OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBFIC0gIDY5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEYgLSAgNzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRyAtICA3MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBIIC0gIDcyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEkgLSAgNzMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSiAtICA3NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBLIC0gIDc1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEwgLSAgNzYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTSAtICA3NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBOIC0gIDc4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIE8gLSAgNzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUCAtICA4MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBRIC0gIDgxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFIgLSAgODIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUyAtICA4MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBUIC0gIDg0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFUgLSAgODUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogViAtICA4NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBXIC0gIDg3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFggLSAgODggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogWSAtICA4OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBaIC0gIDkwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBbIC0gIDkxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBcIC0gIDkyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBdIC0gIDkzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBeIC0gIDk0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBfIC0gIDk1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBgIC0gIDk2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGEgLSAgOTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogYiAtICA5OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBjIC0gIDk5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGQgLSAxMDAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZSAtIDEwMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBmIC0gMTAyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGcgLSAxMDMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogaCAtIDEwNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBpIC0gMTA1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGogLSAxMDYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogayAtIDEwNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBsIC0gMTA4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIG0gLSAxMDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbiAtIDExMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBvIC0gMTExICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHAgLSAxMTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogcSAtIDExMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiByIC0gMTE0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHMgLSAxMTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdCAtIDExNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB1IC0gMTE3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHYgLSAxMTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdyAtIDExOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB4IC0gMTIwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHkgLSAxMjEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogeiAtIDEyMiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogeyAtIDEyMyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfCAtIDEyNCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfSAtIDEyNSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfiAtIDEyNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIH8gLSAxMjcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCAIC0gMTI4ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyoggSAtIDEyOSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoggiAtIDEzMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCDIC0gMTMxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCEIC0gMTMyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCFIC0gMTMzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCGIC0gMTM0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCHIC0gMTM1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIggLSAxMzYgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCJIC0gMTM3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIogLSAxMzggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIsgLSAxMzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogjCAtIDE0MCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qII0gLSAxNDEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCOIC0gMTQyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogjyAtIDE0MyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIJAgLSAxNDQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJEgLSAxNDUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJIgLSAxNDYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJMgLSAxNDcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJQgLSAxNDggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJUgLSAxNDkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJYgLSAxNTAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJcgLSAxNTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogmCAtIDE1MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogmSAtIDE1MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCaIC0gMTU0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCbIC0gMTU1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJwgLSAxNTYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCdIC0gMTU3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogniAtIDE1OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCfIC0gMTU5ICovCiAgQzJfV0hJVEVTUEFDRSwgLyogoCAtIDE2MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogoSAtIDE2MSAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKIgLSAxNjIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCjIC0gMTYzICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogpCAtIDE2NCAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKUgLSAxNjUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKYgLSAxNjYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKcgLSAxNjcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKggLSAxNjggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKkgLSAxNjkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKogLSAxNzAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKsgLSAxNzEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKwgLSAxNzIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK0gLSAxNzMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK4gLSAxNzQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK8gLSAxNzUgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCwIC0gMTc2ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogsSAtIDE3NyAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogsiAtIDE3OCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogsyAtIDE3OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtCAtIDE4MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtSAtIDE4MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtiAtIDE4MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtyAtIDE4MyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguCAtIDE4NCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyoguSAtIDE4NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguiAtIDE4NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguyAtIDE4NyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvCAtIDE4OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvSAtIDE4OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogviAtIDE5MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvyAtIDE5MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDAIC0gMTkyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMEgLSAxOTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwiAtIDE5NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDDIC0gMTk1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMQgLSAxOTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxSAtIDE5NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDGIC0gMTk4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMcgLSAxOTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyCAtIDIwMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDJIC0gMjAxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMogLSAyMDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyyAtIDIwMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDMIC0gMjA0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIM0gLSAyMDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogziAtIDIwNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDPIC0gMjA3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINAgLSAyMDggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0SAtIDIwOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDSIC0gMjEwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINMgLSAyMTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog1CAtIDIxMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDVIC0gMjEzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINYgLSAyMTQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qINcgLSAyMTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2CAtIDIxNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDZIC0gMjE3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINogLSAyMTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2yAtIDIxOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDcIC0gMjIwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIN0gLSAyMjEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3iAtIDIyMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDfIC0gMjIzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOAgLSAyMjQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4SAtIDIyNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDiIC0gMjI2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOMgLSAyMjcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5CAtIDIyOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDlIC0gMjI5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOYgLSAyMzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5yAtIDIzMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDoIC0gMjMyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOkgLSAyMzMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6iAtIDIzNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDrIC0gMjM1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOwgLSAyMzYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7SAtIDIzNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDuIC0gMjM4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIO8gLSAyMzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8CAtIDI0MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDxIC0gMjQxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPIgLSAyNDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8yAtIDI0MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD0IC0gMjQ0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPUgLSAyNDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog9iAtIDI0NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyog9yAtIDI0NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD4IC0gMjQ4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPkgLSAyNDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+iAtIDI1MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD7IC0gMjUxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPwgLSAyNTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog/SAtIDI1MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD+IC0gMjU0ICovCiAgQzJfTEVGVFRPUklHSFQgLyog/yAtIDI1NSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgQ1RfQ1R5cGUzX0xVVFtdID0geyAKICAweDAwMDAsIC8qICAgLSAgIDAgKi8KICAweDAwMDAsIC8qICAgLSAgIDEgKi8KICAweDAwMDAsIC8qICAgLSAgIDIgKi8KICAweDAwMDAsIC8qICAgLSAgIDMgKi8KICAweDAwMDAsIC8qICAgLSAgIDQgKi8KICAweDAwMDAsIC8qICAgLSAgIDUgKi8KICAweDAwMDAsIC8qICAgLSAgIDYgKi8KICAweDAwMDAsIC8qICAgLSAgIDcgKi8KICAweDAwMDAsIC8qICAgLSAgIDggKi8KICAweDAwMDgsIC8qICAgLSAgIDkgKi8KICAweDAwMDgsIC8qICAgLSAgMTAgKi8KICAweDAwMDgsIC8qICAgLSAgMTEgKi8KICAweDAwMDgsIC8qICAgLSAgMTIgKi8KICAweDAwMDgsIC8qICAgLSAgMTMgKi8KICAweDAwMDAsIC8qICAgLSAgMTQgKi8KICAweDAwMDAsIC8qICAgLSAgMTUgKi8KICAweDAwMDAsIC8qICAgLSAgMTYgKi8KICAweDAwMDAsIC8qICAgLSAgMTcgKi8KICAweDAwMDAsIC8qICAgLSAgMTggKi8KICAweDAwMDAsIC8qICAgLSAgMTkgKi8KICAweDAwMDAsIC8qICAgLSAgMjAgKi8KICAweDAwMDAsIC8qICAgLSAgMjEgKi8KICAweDAwMDAsIC8qICAgLSAgMjIgKi8KICAweDAwMDAsIC8qICAgLSAgMjMgKi8KICAweDAwMDAsIC8qICAgLSAgMjQgKi8KICAweDAwMDAsIC8qICAgLSAgMjUgKi8KICAweDAwMDAsIC8qICAgLSAgMjYgKi8KICAweDAwMDAsIC8qICAgLSAgMjcgKi8KICAweDAwMDAsIC8qICAgLSAgMjggKi8KICAweDAwMDAsIC8qICAgLSAgMjkgKi8KICAweDAwMDAsIC8qICAgLSAgMzAgKi8KICAweDAwMDAsIC8qICAgLSAgMzEgKi8KICAweDAwNDgsIC8qICAgLSAgMzIgKi8KICAweDAwNDgsIC8qICEgLSAgMzMgKi8KICAweDA0NDgsIC8qICIgLSAgMzQgKi8gLyogIiAqLwogIDB4MDA0OCwgLyogIyAtICAzNSAqLwogIDB4MDQ0OCwgLyogJCAtICAzNiAqLwogIDB4MDA0OCwgLyogJSAtICAzNyAqLwogIDB4MDA0OCwgLyogJiAtICAzOCAqLwogIDB4MDQ0MCwgLyogJyAtICAzOSAqLwogIDB4MDA0OCwgLyogKCAtICA0MCAqLwogIDB4MDA0OCwgLyogKSAtICA0MSAqLwogIDB4MDA0OCwgLyogKiAtICA0MiAqLwogIDB4MDA0OCwgLyogKyAtICA0MyAqLwogIDB4MDA0OCwgLyogLCAtICA0NCAqLwogIDB4MDQ0MCwgLyogLSAtICA0NSAqLwogIDB4MDA0OCwgLyogLiAtICA0NiAqLwogIDB4MDQ0OCwgLyogLyAtICA0NyAqLwogIDB4MDA0MCwgLyogMCAtICA0OCAqLwogIDB4MDA0MCwgLyogMSAtICA0OSAqLwogIDB4MDA0MCwgLyogMiAtICA1MCAqLwogIDB4MDA0MCwgLyogMyAtICA1MSAqLwogIDB4MDA0MCwgLyogNCAtICA1MiAqLwogIDB4MDA0MCwgLyogNSAtICA1MyAqLwogIDB4MDA0MCwgLyogNiAtICA1NCAqLwogIDB4MDA0MCwgLyogNyAtICA1NSAqLwogIDB4MDA0MCwgLyogOCAtICA1NiAqLwogIDB4MDA0MCwgLyogOSAtICA1NyAqLwogIDB4MDA0OCwgLyogOiAtICA1OCAqLwogIDB4MDA0OCwgLyogOyAtICA1OSAqLwogIDB4MDA0OCwgLyogPCAtICA2MCAqLwogIDB4MDQ0OCwgLyogPSAtICA2MSAqLwogIDB4MDA0OCwgLyogPiAtICA2MiAqLwogIDB4MDA0OCwgLyogPyAtICA2MyAqLwogIDB4MDQ0OCwgLyogQCAtICA2NCAqLwogIDB4ODA0MCwgLyogQSAtICA2NSAqLwogIDB4ODA0MCwgLyogQiAtICA2NiAqLwogIDB4ODA0MCwgLyogQyAtICA2NyAqLwogIDB4ODA0MCwgLyogRCAtICA2OCAqLwogIDB4ODA0MCwgLyogRSAtICA2OSAqLwogIDB4ODA0MCwgLyogRiAtICA3MCAqLwogIDB4ODA0MCwgLyogRyAtICA3MSAqLwogIDB4ODA0MCwgLyogSCAtICA3MiAqLwogIDB4ODA0MCwgLyogSSAtICA3MyAqLwogIDB4ODA0MCwgLyogSiAtICA3NCAqLwogIDB4ODA0MCwgLyogSyAtICA3NSAqLwogIDB4ODA0MCwgLyogTCAtICA3NiAqLwogIDB4ODA0MCwgLyogTSAtICA3NyAqLwogIDB4ODA0MCwgLyogTiAtICA3OCAqLwogIDB4ODA0MCwgLyogTyAtICA3OSAqLwogIDB4ODA0MCwgLyogUCAtICA4MCAqLwogIDB4ODA0MCwgLyogUSAtICA4MSAqLwogIDB4ODA0MCwgLyogUiAtICA4MiAqLwogIDB4ODA0MCwgLyogUyAtICA4MyAqLwogIDB4ODA0MCwgLyogVCAtICA4NCAqLwogIDB4ODA0MCwgLyogVSAtICA4NSAqLwogIDB4ODA0MCwgLyogViAtICA4NiAqLwogIDB4ODA0MCwgLyogVyAtICA4NyAqLwogIDB4ODA0MCwgLyogWCAtICA4OCAqLwogIDB4ODA0MCwgLyogWSAtICA4OSAqLwogIDB4ODA0MCwgLyogWiAtICA5MCAqLwogIDB4MDA0OCwgLyogWyAtICA5MSAqLwogIDB4MDQ0OCwgLyogXCAtICA5MiAqLwogIDB4MDA0OCwgLyogXSAtICA5MyAqLwogIDB4MDQ0OCwgLyogXiAtICA5NCAqLwogIDB4MDQ0OCwgLyogXyAtICA5NSAqLwogIDB4MDQ0OCwgLyogYCAtICA5NiAqLwogIDB4ODA0MCwgLyogYSAtICA5NyAqLwogIDB4ODA0MCwgLyogYiAtICA5OCAqLwogIDB4ODA0MCwgLyogYyAtICA5OSAqLwogIDB4ODA0MCwgLyogZCAtIDEwMCAqLwogIDB4ODA0MCwgLyogZSAtIDEwMSAqLwogIDB4ODA0MCwgLyogZiAtIDEwMiAqLwogIDB4ODA0MCwgLyogZyAtIDEwMyAqLwogIDB4ODA0MCwgLyogaCAtIDEwNCAqLwogIDB4ODA0MCwgLyogaSAtIDEwNSAqLwogIDB4ODA0MCwgLyogaiAtIDEwNiAqLwogIDB4ODA0MCwgLyogayAtIDEwNyAqLwogIDB4ODA0MCwgLyogbCAtIDEwOCAqLwogIDB4ODA0MCwgLyogbSAtIDEwOSAqLwogIDB4ODA0MCwgLyogbiAtIDExMCAqLwogIDB4ODA0MCwgLyogbyAtIDExMSAqLwogIDB4ODA0MCwgLyogcCAtIDExMiAqLwogIDB4ODA0MCwgLyogcSAtIDExMyAqLwogIDB4ODA0MCwgLyogciAtIDExNCAqLwogIDB4ODA0MCwgLyogcyAtIDExNSAqLwogIDB4ODA0MCwgLyogdCAtIDExNiAqLwogIDB4ODA0MCwgLyogdSAtIDExNyAqLwogIDB4ODA0MCwgLyogdiAtIDExOCAqLwogIDB4ODA0MCwgLyogdyAtIDExOSAqLwogIDB4ODA0MCwgLyogeCAtIDEyMCAqLwogIDB4ODA0MCwgLyogeSAtIDEyMSAqLwogIDB4ODA0MCwgLyogeiAtIDEyMiAqLwogIDB4MDA0OCwgLyogeyAtIDEyMyAqLwogIDB4MDA0OCwgLyogfCAtIDEyNCAqLwogIDB4MDA0OCwgLyogfSAtIDEyNSAqLwogIDB4MDQ0OCwgLyogfiAtIDEyNiAqLwogIDB4MDAwMCwgLyogfyAtIDEyNyAqLwogIDB4MDAwMCwgLyoggCAtIDEyOCAqLwogIDB4MDAwMCwgLyoggSAtIDEyOSAqLwogIDB4MDAwOCwgLyoggiAtIDEzMCAqLwogIDB4ODAwMCwgLyoggyAtIDEzMSAqLwogIDB4MDAwOCwgLyoghCAtIDEzMiAqLwogIDB4MDAwOCwgLyoghSAtIDEzMyAqLwogIDB4MDAwOCwgLyoghiAtIDEzNCAqLwogIDB4MDAwOCwgLyoghyAtIDEzNSAqLwogIDB4MDAwMSwgLyogiCAtIDEzNiAqLwogIDB4MDAwOCwgLyogiSAtIDEzNyAqLwogIDB4ODAwMywgLyogiiAtIDEzOCAqLwogIDB4MDAwOCwgLyogiyAtIDEzOSAqLwogIDB4ODAwMCwgLyogjCAtIDE0MCAqLwogIDB4MDAwMCwgLyogjSAtIDE0MSAqLwogIDB4MDAwMCwgLyogjiAtIDE0MiAqLwogIDB4MDAwMCwgLyogjyAtIDE0MyAqLwogIDB4MDAwMCwgLyogkCAtIDE0NCAqLwogIDB4MDA4OCwgLyogkSAtIDE0NSAqLwogIDB4MDA4OCwgLyogkiAtIDE0NiAqLwogIDB4MDA4OCwgLyogkyAtIDE0NyAqLwogIDB4MDA4OCwgLyoglCAtIDE0OCAqLwogIDB4MDAwOCwgLyoglSAtIDE0OSAqLwogIDB4MDQwMCwgLyogliAtIDE1MCAqLwogIDB4MDQwMCwgLyoglyAtIDE1MSAqLwogIDB4MDQwOCwgLyogmCAtIDE1MiAqLwogIDB4MDAwMCwgLyogmSAtIDE1MyAqLwogIDB4ODAwMywgLyogmiAtIDE1NCAqLwogIDB4MDAwOCwgLyogmyAtIDE1NSAqLwogIDB4ODAwMCwgLyognCAtIDE1NiAqLwogIDB4MDAwMCwgLyognSAtIDE1NyAqLwogIDB4MDAwMCwgLyogniAtIDE1OCAqLwogIDB4ODAwMywgLyognyAtIDE1OSAqLwogIDB4MDAwOCwgLyogoCAtIDE2MCAqLwogIDB4MDAwOCwgLyogoSAtIDE2MSAqLwogIDB4MDA0OCwgLyogoiAtIDE2MiAqLwogIDB4MDA0OCwgLyogoyAtIDE2MyAqLwogIDB4MDAwOCwgLyogpCAtIDE2NCAqLwogIDB4MDA0OCwgLyogpSAtIDE2NSAqLwogIDB4MDA0OCwgLyogpiAtIDE2NiAqLwogIDB4MDAwOCwgLyogpyAtIDE2NyAqLwogIDB4MDQwOCwgLyogqCAtIDE2OCAqLwogIDB4MDAwOCwgLyogqSAtIDE2OSAqLwogIDB4MDQwMCwgLyogqiAtIDE3MCAqLwogIDB4MDAwOCwgLyogqyAtIDE3MSAqLwogIDB4MDA0OCwgLyogrCAtIDE3MiAqLwogIDB4MDQwOCwgLyogrSAtIDE3MyAqLwogIDB4MDAwOCwgLyogriAtIDE3NCAqLwogIDB4MDQ0OCwgLyogryAtIDE3NSAqLwogIDB4MDAwOCwgLyogsCAtIDE3NiAqLwogIDB4MDAwOCwgLyogsSAtIDE3NyAqLwogIDB4MDAwMCwgLyogsiAtIDE3OCAqLwogIDB4MDAwMCwgLyogsyAtIDE3OSAqLwogIDB4MDQwOCwgLyogtCAtIDE4MCAqLwogIDB4MDAwOCwgLyogtSAtIDE4MSAqLwogIDB4MDAwOCwgLyogtiAtIDE4MiAqLwogIDB4MDAwOCwgLyogtyAtIDE4MyAqLwogIDB4MDQwOCwgLyoguCAtIDE4NCAqLwogIDB4MDAwMCwgLyoguSAtIDE4NSAqLwogIDB4MDQwMCwgLyoguiAtIDE4NiAqLwogIDB4MDAwOCwgLyoguyAtIDE4NyAqLwogIDB4MDAwMCwgLyogvCAtIDE4OCAqLwogIDB4MDAwMCwgLyogvSAtIDE4OSAqLwogIDB4MDAwMCwgLyogviAtIDE5MCAqLwogIDB4MDAwOCwgLyogvyAtIDE5MSAqLwogIDB4ODAwMywgLyogwCAtIDE5MiAqLwogIDB4ODAwMywgLyogwSAtIDE5MyAqLwogIDB4ODAwMywgLyogwiAtIDE5NCAqLwogIDB4ODAwMywgLyogwyAtIDE5NSAqLwogIDB4ODAwMywgLyogxCAtIDE5NiAqLwogIDB4ODAwMywgLyogxSAtIDE5NyAqLwogIDB4ODAwMCwgLyogxiAtIDE5OCAqLwogIDB4ODAwMywgLyogxyAtIDE5OSAqLwogIDB4ODAwMywgLyogyCAtIDIwMCAqLwogIDB4ODAwMywgLyogySAtIDIwMSAqLwogIDB4ODAwMywgLyogyiAtIDIwMiAqLwogIDB4ODAwMywgLyogyyAtIDIwMyAqLwogIDB4ODAwMywgLyogzCAtIDIwNCAqLwogIDB4ODAwMywgLyogzSAtIDIwNSAqLwogIDB4ODAwMywgLyogziAtIDIwNiAqLwogIDB4ODAwMywgLyogzyAtIDIwNyAqLwogIDB4ODAwMCwgLyog0CAtIDIwOCAqLwogIDB4ODAwMywgLyog0SAtIDIwOSAqLwogIDB4ODAwMywgLyog0iAtIDIxMCAqLwogIDB4ODAwMywgLyog0yAtIDIxMSAqLwogIDB4ODAwMywgLyog1CAtIDIxMiAqLwogIDB4ODAwMywgLyog1SAtIDIxMyAqLwogIDB4ODAwMywgLyog1iAtIDIxNCAqLwogIDB4MDAwOCwgLyog1yAtIDIxNSAqLwogIDB4ODAwMywgLyog2CAtIDIxNiAqLwogIDB4ODAwMywgLyog2SAtIDIxNyAqLwogIDB4ODAwMywgLyog2iAtIDIxOCAqLwogIDB4ODAwMywgLyog2yAtIDIxOSAqLwogIDB4ODAwMywgLyog3CAtIDIyMCAqLwogIDB4ODAwMywgLyog3SAtIDIyMSAqLwogIDB4ODAwMCwgLyog3iAtIDIyMiAqLwogIDB4ODAwMCwgLyog3yAtIDIyMyAqLwogIDB4ODAwMywgLyog4CAtIDIyNCAqLwogIDB4ODAwMywgLyog4SAtIDIyNSAqLwogIDB4ODAwMywgLyog4iAtIDIyNiAqLwogIDB4ODAwMywgLyog4yAtIDIyNyAqLwogIDB4ODAwMywgLyog5CAtIDIyOCAqLwogIDB4ODAwMywgLyog5SAtIDIyOSAqLwogIDB4ODAwMCwgLyog5iAtIDIzMCAqLwogIDB4ODAwMywgLyog5yAtIDIzMSAqLwogIDB4ODAwMywgLyog6CAtIDIzMiAqLwogIDB4ODAwMywgLyog6SAtIDIzMyAqLwogIDB4ODAwMywgLyog6iAtIDIzNCAqLwogIDB4ODAwMywgLyog6yAtIDIzNSAqLwogIDB4ODAwMywgLyog7CAtIDIzNiAqLwogIDB4ODAwMywgLyog7SAtIDIzNyAqLwogIDB4ODAwMywgLyog7iAtIDIzOCAqLwogIDB4ODAwMywgLyog7yAtIDIzOSAqLwogIDB4ODAwMCwgLyog8CAtIDI0MCAqLwogIDB4ODAwMywgLyog8SAtIDI0MSAqLwogIDB4ODAwMywgLyog8iAtIDI0MiAqLwogIDB4ODAwMywgLyog8yAtIDI0MyAqLwogIDB4ODAwMywgLyog9CAtIDI0NCAqLwogIDB4ODAwMywgLyog9SAtIDI0NSAqLwogIDB4ODAwMywgLyog9iAtIDI0NiAqLwogIDB4MDAwOCwgLyog9yAtIDI0NyAqLwogIDB4ODAwMywgLyog+CAtIDI0OCAqLwogIDB4ODAwMywgLyog+SAtIDI0OSAqLwogIDB4ODAwMywgLyog+iAtIDI1MCAqLwogIDB4ODAwMywgLyog+yAtIDI1MSAqLwogIDB4ODAwMywgLyog/CAtIDI1MiAqLwogIDB4ODAwMywgLyog/SAtIDI1MyAqLwogIDB4ODAwMCwgLyog/iAtIDI1NCAqLwogIDB4ODAwMyAgLyog/yAtIDI1NSAqLwp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U3RyaW5nVHlwZTE2CVtPTEUyTkxTLjddCiAqLwpCT09MMTYgV0lOQVBJIEdldFN0cmluZ1R5cGUxNihMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXgzMkEobG9jYWxlLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U3RyaW5nVHlwZTMyQQlbS0VSTkVMMzIuMzk2XQogKi8KQk9PTDMyIFdJTkFQSSBHZXRTdHJpbmdUeXBlMzJBKExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXgzMkEobG9jYWxlLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGVFeDMyQQlbS0VSTkVMMzIuMzk3XQogKgogKiBGSVhNRTogSWdub3JlcyB0aGUgbG9jYWxlLgogKi8KQk9PTDMyIFdJTkFQSSBHZXRTdHJpbmdUeXBlRXgzMkEoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKQp7CglpbnQJaTsKCQoJaWYgKChzcmM9PU5VTEwpIHx8IChjaGFydHlwZT09TlVMTCkgfHwgKHNyYz09KExQU1RSKWNoYXJ0eXBlKSkKCXsKCSAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCSAgcmV0dXJuIEZBTFNFOwoJfQoKCWlmIChjY2hTcmM9PS0xKQoJICBjY2hTcmM9bHN0cmxlbjMyQShzcmMpKzE7CgkgIAoJc3dpdGNoIChkd0luZm9UeXBlKSB7CgljYXNlIENUX0NUWVBFMToKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldID0gMDsKCSAgICBpZiAoaXNkaWdpdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfRElHSVQ7CgkgICAgaWYgKGlzYWxwaGEoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0FMUEhBOwoJICAgIGlmIChpc2xvd2VyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9MT1dFUjsKCSAgICBpZiAoaXN1cHBlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfVVBQRVI7CgkgICAgaWYgKGlzc3BhY2Uoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1NQQUNFOwoJICAgIGlmIChpc3B1bmN0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9QVU5DVDsKCSAgICBpZiAoaXNjbnRybChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQ05UUkw7Ci8qIEZJWE1FOiBpc2JsYW5rKCkgaXMgYSBHTlUgZXh0ZW5zaW9uICovCi8qCQlpZiAoaXNibGFuayhzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7ICovCgkgICAgaWYgKChzcmNbaV0gPT0gJyAnKSB8fCAoc3JjW2ldID09ICdcdCcpKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7CgkgICAgLyogQzFfWERJR0lUICovCgl9CglyZXR1cm4gVFJVRTsKCgljYXNlIENUX0NUWVBFMjoKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldPShXT1JEKUNUX0NUeXBlMl9MVVRbaV07CgkgIH0KCSAgcmV0dXJuIFRSVUU7CgoJY2FzZSBDVF9DVFlQRTM6CgkgIGZvciAoaT0wO2k8Y2NoU3JjO2krKykgCgkgIHsKCSAgICBjaGFydHlwZVtpXT1DVF9DVHlwZTNfTFVUW2ldOwoJICB9CgkgIHJldHVybiBUUlVFOwoKCWRlZmF1bHQ6CgkgIEVSUihvbGUsIlVua25vd24gZHdJbmZvVHlwZTolbGRcbiIsZHdJbmZvVHlwZSk7CgkgIHJldHVybiBGQUxTRTsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U3RyaW5nVHlwZTMyVwlbS0VSTkVMMzIuMzk5XQogKgogKiBOT1RFUwogKiBZZXMsIHRoaXMgaXMgbWlzc2luZyBMQ0lEIGxvY2FsZS4gTVMgZmF1bHQuCiAqLwpCT09MMzIgV0lOQVBJIEdldFN0cmluZ1R5cGUzMlcoRFdPUkQgZHdJbmZvVHlwZSxMUENXU1RSIHNyYyxJTlQzMiBjY2hTcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXgzMlcoMC8qZGVmYXVsdGxvY2FsZSovLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGVFeDMyVwlbS0VSTkVMMzIuMzk4XQogKgogKiBGSVhNRTogdW5pY29kZSBjaGFycyBhcmUgYXNzdW1lZCBjaGFycwogKi8KQk9PTDMyIFdJTkFQSSBHZXRTdHJpbmdUeXBlRXgzMlcoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENXU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJaW50CWk7CgoKCWlmIChjY2hTcmM9PS0xKQoJICBjY2hTcmM9bHN0cmxlbjMyVyhzcmMpKzE7CgkKCXN3aXRjaCAoZHdJbmZvVHlwZSkgewoJY2FzZSBDVF9DVFlQRTI6CgkJRklYTUUob2xlLCJDVF9DVFlQRTIgbm90IHN1cHBvcnRlZC5cbiIpOwoJCXJldHVybiBGQUxTRTsKCWNhc2UgQ1RfQ1RZUEUzOgoJCUZJWE1FKG9sZSwiQ1RfQ1RZUEUzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKCQlyZXR1cm4gRkFMU0U7CglkZWZhdWx0OmJyZWFrOwoJfQoJZm9yIChpPTA7aTxjY2hTcmM7aSsrKSB7CgkJY2hhcnR5cGVbaV0gPSAwOwoJCWlmIChpc2RpZ2l0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9ESUdJVDsKCQlpZiAoaXNhbHBoYShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQUxQSEE7CgkJaWYgKGlzbG93ZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0xPV0VSOwoJCWlmIChpc3VwcGVyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9VUFBFUjsKCQlpZiAoaXNzcGFjZShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfU1BBQ0U7CgkJaWYgKGlzcHVuY3Qoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1BVTkNUOwoJCWlmIChpc2NudHJsKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9DTlRSTDsKLyogRklYTUU6IGlzYmxhbmsoKSBpcyBhIEdOVSBleHRlbnNpb24gKi8KLyoJCWlmIChpc2JsYW5rKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9CTEFOSzsgKi8KICAgICAgICAgICAgICAgIGlmICgoc3JjW2ldID09ICcgJykgfHwgKHNyY1tpXSA9PSAnXHQnKSkgY2hhcnR5cGVbaV18PUMxX0JMQU5LOwoJCS8qIEMxX1hESUdJVCAqLwoJfQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBWZXJMYW5ndWFnZU5hbWUxNiAgIFtWRVIuMTBdIAogKi8KRFdPUkQgV0lOQVBJIFZlckxhbmd1YWdlTmFtZTE2KFVJTlQxNiBsYW5naWQsTFBTVFIgbGFuZ25hbWUsVUlOVDE2IGxhbmduYW1lbGVuKQp7CglpbnQJaTsKCURXT1JECXJlc3VsdDsKCWNoYXIJYnVmZmVyWzgwXTsKCglUUkFDRSh2ZXIsIiglZCwlcCwlZClcbiIsbGFuZ2lkLGxhbmduYW1lLGxhbmduYW1lbGVuKTsKCS8qIEZpcnN0LCBjaGVjayBcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XGNvbnRyb2xcTmxzXExvY2FsZVw8bGFuZ2lkPgoJICogZnJvbSB0aGUgcmVnaXN0cnkuIAoJICovCglzcHJpbnRmKGJ1ZmZlciwKCQkiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcJTA4eCIsCgkJbGFuZ2lkKTsKCXJlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWUxNihIS0VZX0xPQ0FMX01BQ0hJTkUsIGJ1ZmZlciwgbGFuZ25hbWUsCgkJCQkoTFBEV09SRCkmbGFuZ25hbWVsZW4pOwoJaWYgKHJlc3VsdCA9PSBFUlJPUl9TVUNDRVNTKSB7CgkJbGFuZ25hbWVbbGFuZ25hbWVsZW4tMV09J1wwJzsKCQlyZXR1cm4gbGFuZ25hbWVsZW47Cgl9CgkvKiBpZiB0aGF0IGZhaWxzLCB1c2UgdGhlIGludGVybmFsIHRhYmxlICovCglmb3IgKGk9MDtsYW5ndWFnZXNbaV0ubGFuZ2lkIT0wO2krKykKCQlpZiAobGFuZ2lkPT1sYW5ndWFnZXNbaV0ubGFuZ2lkKQoJCQlicmVhazsKCXN0cm5jcHkobGFuZ25hbWUsbGFuZ3VhZ2VzW2ldLmxhbmduYW1lLGxhbmduYW1lbGVuKTsKCWxhbmduYW1lW2xhbmduYW1lbGVuLTFdPSdcMCc7CglyZXR1cm4gc3RybGVuKGxhbmd1YWdlc1tpXS5sYW5nbmFtZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBWZXJMYW5ndWFnZU5hbWUzMkEJCQkJW1ZFUlNJT04uOV0gCiAqLwpEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lMzJBKFVJTlQzMiBsYW5naWQsTFBTVFIgbGFuZ25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGxhbmduYW1lbGVuKQp7CglyZXR1cm4gVmVyTGFuZ3VhZ2VOYW1lMTYobGFuZ2lkLGxhbmduYW1lLGxhbmduYW1lbGVuKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFZlckxhbmd1YWdlTmFtZTMyVwkJCQlbVkVSU0lPTi4xMF0gCiAqLwpEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lMzJXKFVJTlQzMiBsYW5naWQsTFBXU1RSIGxhbmduYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBsYW5nbmFtZWxlbikKewoJaW50CWk7CglMUFdTVFIJa2V5bmFtZTsKCURXT1JECXJlc3VsdDsKCWNoYXIJYnVmZmVyWzgwXTsKCgkvKiBGaXJzdCwgY2hlY2sgXFN5c3RlbVxDdXJyZW50Q29udHJvbFNldFxjb250cm9sXE5sc1xMb2NhbGVcPGxhbmdpZD4KCSAqIGZyb20gdGhlIHJlZ2lzdHJ5LiAKCSAqLwoJc3ByaW50ZihidWZmZXIsCgkJIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCUwOHgiLAoJCWxhbmdpZCk7CglrZXluYW1lID0gSEVBUF9zdHJkdXBBdG9XKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWZmZXIgKTsKCXJlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWUzMlcoSEtFWV9MT0NBTF9NQUNISU5FLCBrZXluYW1lLCBsYW5nbmFtZSwKCQkJCShMUERXT1JEKSZsYW5nbmFtZWxlbik7CglIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwga2V5bmFtZSApOwoJaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKSB7CgkJLyogaWYgdGhhdCBmYWlscywgdXNlIHRoZSBpbnRlcm5hbCB0YWJsZSAqLwoJCWZvciAoaT0wO2xhbmd1YWdlc1tpXS5sYW5naWQhPTA7aSsrKQoJCQlpZiAobGFuZ2lkPT1sYW5ndWFnZXNbaV0ubGFuZ2lkKQoJCQkJYnJlYWs7CiAgICAgICAgCWxzdHJjcHlBdG9XKCBsYW5nbmFtZSwgbGFuZ3VhZ2VzW2ldLmxhbmduYW1lICk7CgkJbGFuZ25hbWVsZW4gPSBzdHJsZW4obGFuZ3VhZ2VzW2ldLmxhbmduYW1lKTsKCSAJLyogc2FtZSBhcyBzdHJsZW5XKGxhbmduYW1lKTsgKi8KCX0KCXJldHVybiBsYW5nbmFtZWxlbjsKfQogCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVFtdID0gewogIDYgICAgICAsICAgMywgLyogICAtICAgMSAqLyAgCiAgNiAgICAgICwgICA0LCAvKiAgIC0gICAyICovICAKICA2ICAgICAgLCAgIDUsIC8qICAgLSAgIDMgKi8gIAogIDYgICAgICAsICAgNiwgLyogICAtICAgNCAqLyAgCiAgNiAgICAgICwgICA3LCAvKiAgIC0gICA1ICovICAKICA2ICAgICAgLCAgIDgsIC8qICAgLSAgIDYgKi8gIAogIDYgICAgICAsICAgOSwgLyogICAtICAgNyAqLyAgCiAgNiAgICAgICwgIDEwLCAvKiAgIC0gICA4ICovICAKICA3ICAgICAgLCAgIDUsIC8qICAgLSAgIDkgKi8gIAogIDcgICAgICAsICAgNiwgLyogICAtICAxMCAqLyAgCiAgNyAgICAgICwgICA3LCAvKiAgIC0gIDExICovICAKICA3ICAgICAgLCAgIDgsIC8qICAgLSAgMTIgKi8gIAogIDcgICAgICAsICAgOSwgLyogICAtICAxMyAqLyAgCiAgNiAgICAgICwgIDExLCAvKiAgIC0gIDE0ICovICAKICA2ICAgICAgLCAgMTIsIC8qICAgLSAgMTUgKi8gIAogIDYgICAgICAsICAxMywgLyogICAtICAxNiAqLyAgCiAgNiAgICAgICwgIDE0LCAvKiAgIC0gIDE3ICovICAKICA2ICAgICAgLCAgMTUsIC8qICAgLSAgMTggKi8gIAogIDYgICAgICAsICAxNiwgLyogICAtICAxOSAqLyAgCiAgNiAgICAgICwgIDE3LCAvKiAgIC0gIDIwICovICAKICA2ICAgICAgLCAgMTgsIC8qICAgLSAgMjEgKi8gIAogIDYgICAgICAsICAxOSwgLyogICAtICAyMiAqLyAgCiAgNiAgICAgICwgIDIwLCAvKiAgIC0gIDIzICovICAKICA2ICAgICAgLCAgMjEsIC8qICAgLSAgMjQgKi8gIAogIDYgICAgICAsICAyMiwgLyogICAtICAyNSAqLyAgCiAgNiAgICAgICwgIDIzLCAvKiAgIC0gIDI2ICovICAKICA2ICAgICAgLCAgMjQsIC8qICAgLSAgMjcgKi8gIAogIDYgICAgICAsICAyNSwgLyogICAtICAyOCAqLyAgCiAgNiAgICAgICwgIDI2LCAvKiAgIC0gIDI5ICovICAKICA2ICAgICAgLCAgMjcsIC8qICAgLSAgMzAgKi8gIAogIDYgICAgICAsICAyOCwgLyogICAtICAzMSAqLyAgCiAgNyAgICAgICwgICAyLCAvKiAgIC0gIDMyICovCiAgNyAgICAgICwgIDI4LCAvKiAhIC0gIDMzICovCiAgNyAgICAgICwgIDI5LCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICA3ICAgICAgLCAgMzEsIC8qICMgLSAgMzUgKi8KICA3ICAgICAgLCAgMzMsIC8qICQgLSAgMzYgKi8KICA3ICAgICAgLCAgMzUsIC8qICUgLSAgMzcgKi8KICA3ICAgICAgLCAgMzcsIC8qICYgLSAgMzggKi8KICA2ICAgICAgLCAxMjgsIC8qICcgLSAgMzkgKi8KICA3ICAgICAgLCAgMzksIC8qICggLSAgNDAgKi8KICA3ICAgICAgLCAgNDIsIC8qICkgLSAgNDEgKi8KICA3ICAgICAgLCAgNDUsIC8qICogLSAgNDIgKi8KICA4ICAgICAgLCAgIDMsIC8qICsgLSAgNDMgKi8KICA3ICAgICAgLCAgNDcsIC8qICwgLSAgNDQgKi8KICA2ICAgICAgLCAxMzAsIC8qIC0gLSAgNDUgKi8KICA3ICAgICAgLCAgNTEsIC8qIC4gLSAgNDYgKi8KICA3ICAgICAgLCAgNTMsIC8qIC8gLSAgNDcgKi8KIDEyICAgICAgLCAgIDMsIC8qIDAgLSAgNDggKi8KIDEyICAgICAgLCAgMzMsIC8qIDEgLSAgNDkgKi8KIDEyICAgICAgLCAgNTEsIC8qIDIgLSAgNTAgKi8KIDEyICAgICAgLCAgNzAsIC8qIDMgLSAgNTEgKi8KIDEyICAgICAgLCAgODgsIC8qIDQgLSAgNTIgKi8KIDEyICAgICAgLCAxMDYsIC8qIDUgLSAgNTMgKi8KIDEyICAgICAgLCAxMjUsIC8qIDYgLSAgNTQgKi8KIDEyICAgICAgLCAxNDQsIC8qIDcgLSAgNTUgKi8KIDEyICAgICAgLCAxNjIsIC8qIDggLSAgNTYgKi8KIDEyICAgICAgLCAxODAsIC8qIDkgLSAgNTcgKi8KICA3ICAgICAgLCAgNTUsIC8qIDogLSAgNTggKi8KICA3ICAgICAgLCAgNTgsIC8qIDsgLSAgNTkgKi8KICA4ICAgICAgLCAgMTQsIC8qIDwgLSAgNjAgKi8KICA4ICAgICAgLCAgMTgsIC8qID0gLSAgNjEgKi8KICA4ICAgICAgLCAgMjAsIC8qID4gLSAgNjIgKi8KICA3ICAgICAgLCAgNjAsIC8qID8gLSAgNjMgKi8KICA3ICAgICAgLCAgNjIsIC8qIEAgLSAgNjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIEEgLSAgNjUgKi8KIDE0ICAgICAgLCAgIDksIC8qIEIgLSAgNjYgKi8KIDE0ICAgICAgLCAgMTAsIC8qIEMgLSAgNjcgKi8KIDE0ICAgICAgLCAgMjYsIC8qIEQgLSAgNjggKi8KIDE0ICAgICAgLCAgMzMsIC8qIEUgLSAgNjkgKi8KIDE0ICAgICAgLCAgMzUsIC8qIEYgLSAgNzAgKi8KIDE0ICAgICAgLCAgMzcsIC8qIEcgLSAgNzEgKi8KIDE0ICAgICAgLCAgNDQsIC8qIEggLSAgNzIgKi8KIDE0ICAgICAgLCAgNTAsIC8qIEkgLSAgNzMgKi8KIDE0ICAgICAgLCAgNTMsIC8qIEogLSAgNzQgKi8KIDE0ICAgICAgLCAgNTQsIC8qIEsgLSAgNzUgKi8KIDE0ICAgICAgLCAgNzIsIC8qIEwgLSAgNzYgKi8KIDE0ICAgICAgLCAgODEsIC8qIE0gLSAgNzcgKi8KIDE0ICAgICAgLCAxMTIsIC8qIE4gLSAgNzggKi8KIDE0ICAgICAgLCAxMjQsIC8qIE8gLSAgNzkgKi8KIDE0ICAgICAgLCAxMjYsIC8qIFAgLSAgODAgKi8KIDE0ICAgICAgLCAxMzcsIC8qIFEgLSAgODEgKi8KIDE0ICAgICAgLCAxMzgsIC8qIFIgLSAgODIgKi8KIDE0ICAgICAgLCAxNDUsIC8qIFMgLSAgODMgKi8KIDE0ICAgICAgLCAxNTMsIC8qIFQgLSAgODQgKi8KIDE0ICAgICAgLCAxNTksIC8qIFUgLSAgODUgKi8KIDE0ICAgICAgLCAxNjIsIC8qIFYgLSAgODYgKi8KIDE0ICAgICAgLCAxNjQsIC8qIFcgLSAgODcgKi8KIDE0ICAgICAgLCAxNjYsIC8qIFggLSAgODggKi8KIDE0ICAgICAgLCAxNjcsIC8qIFkgLSAgODkgKi8KIDE0ICAgICAgLCAxNjksIC8qIFogLSAgOTAgKi8KICA3ICAgICAgLCAgNjMsIC8qIFsgLSAgOTEgKi8KICA3ICAgICAgLCAgNjUsIC8qIFwgLSAgOTIgKi8KICA3ICAgICAgLCAgNjYsIC8qIF0gLSAgOTMgKi8KICA3ICAgICAgLCAgNjcsIC8qIF4gLSAgOTQgKi8KICA3ICAgICAgLCAgNjgsIC8qIF8gLSAgOTUgKi8KICA3ICAgICAgLCAgNzIsIC8qIGAgLSAgOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIGEgLSAgOTcgKi8KIDE0ICAgICAgLCAgIDksIC8qIGIgLSAgOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIGMgLSAgOTkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIGQgLSAxMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIGUgLSAxMDEgKi8KIDE0ICAgICAgLCAgMzUsIC8qIGYgLSAxMDIgKi8KIDE0ICAgICAgLCAgMzcsIC8qIGcgLSAxMDMgKi8KIDE0ICAgICAgLCAgNDQsIC8qIGggLSAxMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIGkgLSAxMDUgKi8KIDE0ICAgICAgLCAgNTMsIC8qIGogLSAxMDYgKi8KIDE0ICAgICAgLCAgNTQsIC8qIGsgLSAxMDcgKi8KIDE0ICAgICAgLCAgNzIsIC8qIGwgLSAxMDggKi8KIDE0ICAgICAgLCAgODEsIC8qIG0gLSAxMDkgKi8KIDE0ICAgICAgLCAxMTIsIC8qIG4gLSAxMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qIG8gLSAxMTEgKi8KIDE0ICAgICAgLCAxMjYsIC8qIHAgLSAxMTIgKi8KIDE0ICAgICAgLCAxMzcsIC8qIHEgLSAxMTMgKi8KIDE0ICAgICAgLCAxMzgsIC8qIHIgLSAxMTQgKi8KIDE0ICAgICAgLCAxNDUsIC8qIHMgLSAxMTUgKi8KIDE0ICAgICAgLCAxNTMsIC8qIHQgLSAxMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qIHUgLSAxMTcgKi8KIDE0ICAgICAgLCAxNjIsIC8qIHYgLSAxMTggKi8KIDE0ICAgICAgLCAxNjQsIC8qIHcgLSAxMTkgKi8KIDE0ICAgICAgLCAxNjYsIC8qIHggLSAxMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIHkgLSAxMjEgKi8KIDE0ICAgICAgLCAxNjksIC8qIHogLSAxMjIgKi8KICA3ICAgICAgLCAgNzQsIC8qIHsgLSAxMjMgKi8KICA3ICAgICAgLCAgNzYsIC8qIHwgLSAxMjQgKi8KICA3ICAgICAgLCAgNzgsIC8qIH0gLSAxMjUgKi8KICA3ICAgICAgLCAgODAsIC8qIH4gLSAxMjYgKi8KICA2ICAgICAgLCAgMjksIC8qIH8gLSAxMjcgKi8KICA2ICAgICAgLCAgMzAsIC8qIIAgLSAxMjggKi8KICA2ICAgICAgLCAgMzEsIC8qIIEgLSAxMjkgKi8KICA3ICAgICAgLCAxMjMsIC8qIIIgLSAxMzAgKi8KIDE0ICAgICAgLCAgMzUsIC8qIIMgLSAxMzEgKi8KICA3ICAgICAgLCAxMjcsIC8qIIQgLSAxMzIgKi8KIDEwICAgICAgLCAgMjEsIC8qIIUgLSAxMzMgKi8KIDEwICAgICAgLCAgMTUsIC8qIIYgLSAxMzQgKi8KIDEwICAgICAgLCAgMTYsIC8qIIcgLSAxMzUgKi8KICA3ICAgICAgLCAgNjcsIC8qIIggLSAxMzYgKi8KIDEwICAgICAgLCAgMjIsIC8qIIkgLSAxMzcgKi8KIDE0ICAgICAgLCAxNDUsIC8qIIogLSAxMzggKi8KICA3ICAgICAgLCAxMzYsIC8qIIsgLSAxMzkgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIIwgLSAxNDAgKi8KICA2ICAgICAgLCAgNDMsIC8qII0gLSAxNDEgKi8KICA2ICAgICAgLCAgNDQsIC8qII4gLSAxNDIgKi8KICA2ICAgICAgLCAgNDUsIC8qII8gLSAxNDMgKi8KICA2ICAgICAgLCAgNDYsIC8qIJAgLSAxNDQgKi8KICA3ICAgICAgLCAxMjEsIC8qIJEgLSAxNDUgKi8KICA3ICAgICAgLCAxMjIsIC8qIJIgLSAxNDYgKi8KICA3ICAgICAgLCAxMjUsIC8qIJMgLSAxNDcgKi8KICA3ICAgICAgLCAxMjYsIC8qIJQgLSAxNDggKi8KIDEwICAgICAgLCAgMTcsIC8qIJUgLSAxNDkgKi8KICA2ICAgICAgLCAxMzcsIC8qIJYgLSAxNTAgKi8KICA2ICAgICAgLCAxMzksIC8qIJcgLSAxNTEgKi8KICA3ICAgICAgLCAgOTMsIC8qIJggLSAxNTIgKi8KIDE0ICAgICAgLCAxNTYsIC8qIJkgLSAxNTMgKi8KIDE0ICAgICAgLCAxNDUsIC8qIJogLSAxNTQgKi8KICA3ICAgICAgLCAxMzcsIC8qIJsgLSAxNTUgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIJwgLSAxNTYgKi8KICA2ICAgICAgLCAgNTksIC8qIJ0gLSAxNTcgKi8KICA2ICAgICAgLCAgNjAsIC8qIJ4gLSAxNTggKi8KIDE0ICAgICAgLCAxNjcsIC8qIJ8gLSAxNTkgKi8KICA3ICAgICAgLCAgIDQsIC8qIKAgLSAxNjAgKi8KICA3ICAgICAgLCAgODEsIC8qIKEgLSAxNjEgKi8KIDEwICAgICAgLCAgIDIsIC8qIKIgLSAxNjIgKi8KIDEwICAgICAgLCAgIDMsIC8qIKMgLSAxNjMgKi8KIDEwICAgICAgLCAgIDQsIC8qIKQgLSAxNjQgKi8KIDEwICAgICAgLCAgIDUsIC8qIKUgLSAxNjUgKi8KICA3ICAgICAgLCAgODIsIC8qIKYgLSAxNjYgKi8KIDEwICAgICAgLCAgIDYsIC8qIKcgLSAxNjcgKi8KICA3ICAgICAgLCAgODMsIC8qIKggLSAxNjggKi8KIDEwICAgICAgLCAgIDcsIC8qIKkgLSAxNjkgKi8KIDE0ICAgICAgLCAgIDIsIC8qIKogLSAxNzAgKi8KICA4ICAgICAgLCAgMjQsIC8qIKsgLSAxNzEgKi8KIDEwICAgICAgLCAgIDgsIC8qIKwgLSAxNzIgKi8KICA2ICAgICAgLCAxMzEsIC8qIK0gLSAxNzMgKi8KIDEwICAgICAgLCAgIDksIC8qIK4gLSAxNzQgKi8KICA3ICAgICAgLCAgODQsIC8qIK8gLSAxNzUgKi8KIDEwICAgICAgLCAgMTAsIC8qILAgLSAxNzYgKi8KICA4ICAgICAgLCAgMjMsIC8qILEgLSAxNzcgKi8KIDEyICAgICAgLCAgNTEsIC8qILIgLSAxNzggKi8KIDEyICAgICAgLCAgNzAsIC8qILMgLSAxNzkgKi8KICA3ICAgICAgLCAgODUsIC8qILQgLSAxODAgKi8KIDEwICAgICAgLCAgMTEsIC8qILUgLSAxODEgKi8KIDEwICAgICAgLCAgMTIsIC8qILYgLSAxODIgKi8KIDEwICAgICAgLCAgMTMsIC8qILcgLSAxODMgKi8KICA3ICAgICAgLCAgODYsIC8qILggLSAxODQgKi8KIDEyICAgICAgLCAgMzMsIC8qILkgLSAxODUgKi8KIDE0ICAgICAgLCAxMjQsIC8qILogLSAxODYgKi8KICA4ICAgICAgLCAgMjYsIC8qILsgLSAxODcgKi8KIDEyICAgICAgLCAgMjEsIC8qILwgLSAxODggKi8KIDEyICAgICAgLCAgMjUsIC8qIL0gLSAxODkgKi8KIDEyICAgICAgLCAgMjksIC8qIL4gLSAxOTAgKi8KICA3ICAgICAgLCAgODcsIC8qIL8gLSAxOTEgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMAgLSAxOTIgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMEgLSAxOTMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMIgLSAxOTQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMMgLSAxOTUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMQgLSAxOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMUgLSAxOTcgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIMYgLSAxOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIMcgLSAxOTkgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMggLSAyMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMkgLSAyMDEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMogLSAyMDIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMsgLSAyMDMgKi8KIDE0ICAgICAgLCAgNTAsIC8qIMwgLSAyMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM0gLSAyMDUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM4gLSAyMDYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM8gLSAyMDcgKi8KIDE0ICAgICAgLCAgMjYsIC8qINAgLSAyMDggKi8KIDE0ICAgICAgLCAxMTIsIC8qINEgLSAyMDkgKi8KIDE0ICAgICAgLCAxMjQsIC8qINIgLSAyMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qINMgLSAyMTEgKi8KIDE0ICAgICAgLCAxMjQsIC8qINQgLSAyMTIgKi8KIDE0ICAgICAgLCAxMjQsIC8qINUgLSAyMTMgKi8KIDE0ICAgICAgLCAxMjQsIC8qINYgLSAyMTQgKi8KICA4ICAgICAgLCAgMjgsIC8qINcgLSAyMTUgKi8KIDE0ICAgICAgLCAxMjQsIC8qINggLSAyMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qINkgLSAyMTcgKi8KIDE0ICAgICAgLCAxNTksIC8qINogLSAyMTggKi8KIDE0ICAgICAgLCAxNTksIC8qINsgLSAyMTkgKi8KIDE0ICAgICAgLCAxNTksIC8qINwgLSAyMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIN0gLSAyMjEgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIN4gLSAyMjIgKi8KIDE0ICsgNDggLCAxNDUsIC8qIN8gLSAyMjMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOAgLSAyMjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOEgLSAyMjUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOIgLSAyMjYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOMgLSAyMjcgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOQgLSAyMjggKi8KIDE0ICAgICAgLCAgIDIsIC8qIOUgLSAyMjkgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIOYgLSAyMzAgKi8KIDE0ICAgICAgLCAgMTAsIC8qIOcgLSAyMzEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOggLSAyMzIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOkgLSAyMzMgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOogLSAyMzQgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOsgLSAyMzUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIOwgLSAyMzYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO0gLSAyMzcgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO4gLSAyMzggKi8KIDE0ICAgICAgLCAgNTAsIC8qIO8gLSAyMzkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIPAgLSAyNDAgKi8KIDE0ICAgICAgLCAxMTIsIC8qIPEgLSAyNDEgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPIgLSAyNDIgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPMgLSAyNDMgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPQgLSAyNDQgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPUgLSAyNDUgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPYgLSAyNDYgKi8KICA4ICAgICAgLCAgMjksIC8qIPcgLSAyNDcgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPggLSAyNDggKi8KIDE0ICAgICAgLCAxNTksIC8qIPkgLSAyNDkgKi8KIDE0ICAgICAgLCAxNTksIC8qIPogLSAyNTAgKi8KIDE0ICAgICAgLCAxNTksIC8qIPsgLSAyNTEgKi8KIDE0ICAgICAgLCAxNTksIC8qIPwgLSAyNTIgKi8KIDE0ICAgICAgLCAxNjcsIC8qIP0gLSAyNTMgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIP4gLSAyNTQgKi8KIDE0ICAgICAgLCAxNjcgIC8qIP8gLSAyNTUgKi8gfTsKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVF8yW10gPSB7IDMzLCA0NCwgMTQ1IH07CgojZGVmaW5lIExDTV9EaWFjcml0aWNfU3RhcnQgMTMxCgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fRGlhY3JpdGljX0xVVFtdID0geyAKMTIzLCAgLyoggyAtIDEzMSAqLwogIDIsICAvKiCEIC0gMTMyICovCiAgMiwgIC8qIIUgLSAxMzMgKi8KICAyLCAgLyoghiAtIDEzNCAqLwogIDIsICAvKiCHIC0gMTM1ICovCiAgMywgIC8qIIggLSAxMzYgKi8KICAyLCAgLyogiSAtIDEzNyAqLwogMjAsICAvKiCKIC0gMTM4ICovCiAgMiwgIC8qIIsgLSAxMzkgKi8KICAyLCAgLyogjCAtIDE0MCAqLwogIDIsICAvKiCNIC0gMTQxICovCiAgMiwgIC8qII4gLSAxNDIgKi8KICAyLCAgLyogjyAtIDE0MyAqLwogIDIsICAvKiCQIC0gMTQ0ICovCiAgMiwgIC8qIJEgLSAxNDUgKi8KICAyLCAgLyogkiAtIDE0NiAqLwogIDIsICAvKiCTIC0gMTQ3ICovCiAgMiwgIC8qIJQgLSAxNDggKi8KICAyLCAgLyoglSAtIDE0OSAqLwogIDIsICAvKiCWIC0gMTUwICovCiAgMiwgIC8qIJcgLSAxNTEgKi8KICAyLCAgLyogmCAtIDE1MiAqLwogIDIsICAvKiCZIC0gMTUzICovCiAyMCwgIC8qIJogLSAxNTQgKi8KICAyLCAgLyogmyAtIDE1NSAqLwogIDIsICAvKiCcIC0gMTU2ICovCiAgMiwgIC8qIJ0gLSAxNTcgKi8KICAyLCAgLyogniAtIDE1OCAqLwogMTksICAvKiCfIC0gMTU5ICovCiAgMiwgIC8qIKAgLSAxNjAgKi8KICAyLCAgLyogoSAtIDE2MSAqLwogIDIsICAvKiCiIC0gMTYyICovCiAgMiwgIC8qIKMgLSAxNjMgKi8KICAyLCAgLyogpCAtIDE2NCAqLwogIDIsICAvKiClIC0gMTY1ICovCiAgMiwgIC8qIKYgLSAxNjYgKi8KICAyLCAgLyogpyAtIDE2NyAqLwogIDIsICAvKiCoIC0gMTY4ICovCiAgMiwgIC8qIKkgLSAxNjkgKi8KICAzLCAgLyogqiAtIDE3MCAqLwogIDIsICAvKiCrIC0gMTcxICovCiAgMiwgIC8qIKwgLSAxNzIgKi8KICAyLCAgLyogrSAtIDE3MyAqLwogIDIsICAvKiCuIC0gMTc0ICovCiAgMiwgIC8qIK8gLSAxNzUgKi8KICAyLCAgLyogsCAtIDE3NiAqLwogIDIsICAvKiCxIC0gMTc3ICovCiAgMiwgIC8qILIgLSAxNzggKi8KICAyLCAgLyogsyAtIDE3OSAqLwogIDIsICAvKiC0IC0gMTgwICovCiAgMiwgIC8qILUgLSAxODEgKi8KICAyLCAgLyogtiAtIDE4MiAqLwogIDIsICAvKiC3IC0gMTgzICovCiAgMiwgIC8qILggLSAxODQgKi8KICAyLCAgLyoguSAtIDE4NSAqLwogIDMsICAvKiC6IC0gMTg2ICovCiAgMiwgIC8qILsgLSAxODcgKi8KICAyLCAgLyogvCAtIDE4OCAqLwogIDIsICAvKiC9IC0gMTg5ICovCiAgMiwgIC8qIL4gLSAxOTAgKi8KICAyLCAgLyogvyAtIDE5MSAqLwogMTUsICAvKiDAIC0gMTkyICovCiAxNCwgIC8qIMEgLSAxOTMgKi8KIDE4LCAgLyogwiAtIDE5NCAqLwogMjUsICAvKiDDIC0gMTk1ICovCiAxOSwgIC8qIMQgLSAxOTYgKi8KIDI2LCAgLyogxSAtIDE5NyAqLwogIDIsICAvKiDGIC0gMTk4ICovCiAyOCwgIC8qIMcgLSAxOTkgKi8KIDE1LCAgLyogyCAtIDIwMCAqLwogMTQsICAvKiDJIC0gMjAxICovCiAxOCwgIC8qIMogLSAyMDIgKi8KIDE5LCAgLyogyyAtIDIwMyAqLwogMTUsICAvKiDMIC0gMjA0ICovCiAxNCwgIC8qIM0gLSAyMDUgKi8KIDE4LCAgLyogziAtIDIwNiAqLwogMTksICAvKiDPIC0gMjA3ICovCjEwNCwgIC8qINAgLSAyMDggKi8KIDI1LCAgLyog0SAtIDIwOSAqLwogMTUsICAvKiDSIC0gMjEwICovCiAxNCwgIC8qINMgLSAyMTEgKi8KIDE4LCAgLyog1CAtIDIxMiAqLwogMjUsICAvKiDVIC0gMjEzICovCiAxOSwgIC8qINYgLSAyMTQgKi8KICAyLCAgLyog1yAtIDIxNSAqLwogMzMsICAvKiDYIC0gMjE2ICovCiAxNSwgIC8qINkgLSAyMTcgKi8KIDE0LCAgLyog2iAtIDIxOCAqLwogMTgsICAvKiDbIC0gMjE5ICovCiAxOSwgIC8qINwgLSAyMjAgKi8KIDE0LCAgLyog3SAtIDIyMSAqLwogIDIsICAvKiDeIC0gMjIyICovCiAgMiwgIC8qIN8gLSAyMjMgKi8KIDE1LCAgLyog4CAtIDIyNCAqLwogMTQsICAvKiDhIC0gMjI1ICovCiAxOCwgIC8qIOIgLSAyMjYgKi8KIDI1LCAgLyog4yAtIDIyNyAqLwogMTksICAvKiDkIC0gMjI4ICovCiAyNiwgIC8qIOUgLSAyMjkgKi8KICAyLCAgLyog5iAtIDIzMCAqLwogMjgsICAvKiDnIC0gMjMxICovCiAxNSwgIC8qIOggLSAyMzIgKi8KIDE0LCAgLyog6SAtIDIzMyAqLwogMTgsICAvKiDqIC0gMjM0ICovCiAxOSwgIC8qIOsgLSAyMzUgKi8KIDE1LCAgLyog7CAtIDIzNiAqLwogMTQsICAvKiDtIC0gMjM3ICovCiAxOCwgIC8qIO4gLSAyMzggKi8KIDE5LCAgLyog7yAtIDIzOSAqLwoxMDQsICAvKiDwIC0gMjQwICovCiAyNSwgIC8qIPEgLSAyNDEgKi8KIDE1LCAgLyog8iAtIDI0MiAqLwogMTQsICAvKiDzIC0gMjQzICovCiAxOCwgIC8qIPQgLSAyNDQgKi8KIDI1LCAgLyog9SAtIDI0NSAqLwogMTksICAvKiD2IC0gMjQ2ICovCiAgMiwgIC8qIPcgLSAyNDcgKi8KIDMzLCAgLyog+CAtIDI0OCAqLwogMTUsICAvKiD5IC0gMjQ5ICovCiAxNCwgIC8qIPogLSAyNTAgKi8KIDE4LCAgLyog+yAtIDI1MSAqLwogMTksICAvKiD8IC0gMjUyICovCiAxNCwgIC8qIP0gLSAyNTMgKi8KICAyLCAgLyog/iAtIDI1NCAqLwogMTksICAvKiD/IC0gMjU1ICovCn0gOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEUyTkxTX2lzUHVuY3R1YXRpb24gW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzUHVuY3R1YXRpb24odW5zaWduZWQgY2hhciBjKSAKewogIC8qICJwdW5jdHVhdGlvbiBjaGFyYWN0ZXIiIGluIHRoaXMgY29udGV4dCBpcyBhIGNoYXJhY3RlciB3aGljaCBpcyAKICAgICBjb25zaWRlcmVkICJsZXNzIGltcG9ydGFudCIgZHVyaW5nIHdvcmQgc29ydCBjb21wYXJpc29uLgogICAgIFNlZSBMQ01hcFN0cmluZyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHByZWNpc2UgZGVmaW5pdGlvbiAKICAgICBvZiAibGVzcyBpbXBvcnRhbnQiLiAqLwoKICByZXR1cm4gKExDTV9Vbmljb2RlX0xVVFstMisyKmNdPT02KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJaWRlbnRpdHkJW0ludGVybmFsXQogKi8Kc3RhdGljIGludCBpZGVudGl0eShpbnQgYykKewogIHJldHVybiBjOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgTENNYXBTdHJpbmczMkEgICAgICAgICAgICAgICAgW0tFUk5FTDMyLjQ5Ml0KICoKICogQ29udmVydCBhIHN0cmluZywgb3IgZ2VuZXJhdGUgYSBzb3J0IGtleSBmcm9tIGl0LgogKgogKiBJZiAobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSwgdGhlIGZ1bmN0aW9uIHdpbGwgZ2VuZXJhdGUKICogYSBzb3J0IGtleSBmb3IgdGhlIHNvdXJjZSBzdHJpbmcuICBFbHNlLCBpdCB3aWxsIGNvbnZlcnQgaXQKICogYWNjb3JkaW5nbHkgdG8gdGhlIGZsYWdzIExDTUFQX1VQUEVSQ0FTRSwgTENNQVBfTE9XRVJDQVNFLC4uLgogKgogKiBSRVRVUk5TCiAqICAgIEVycm9yIDogMC4KICogICAgU3VjY2VzcyA6IGxlbmd0aCBvZiB0aGUgcmVzdWx0IHN0cmluZy4KICoKICogTk9URVMKICogICAgSWYgY2FsbGVkIHdpdGggc2NybGVuID0gLTEsIHRoZSBmdW5jdGlvbiB3aWxsIGNvbXB1dGUgdGhlIGxlbmd0aAogKiAgICAgIG9mIHRoZSAwLXRlcm1pbmF0ZWQgc3RyaW5nIHN0cnNyYyBieSBpdHNlbGYuICAgICAgCiAqIAogKiAgICBJZiBjYWxsZWQgd2l0aCBkc3RsZW4gPSAwLCByZXR1cm5zIHRoZSBidWZmZXIgbGVuZ3RoIHRoYXQgCiAqICAgICAgd291bGQgYmUgcmVxdWlyZWQuCiAqCiAqICAgIE5PUk1fSUdOT1JFV0lEVEggbWVhbnMgdG8gY29tcGFyZSBBU0NJSSBhbmQgVW5pY29kZSBjaGFyYWN0ZXJzCiAqICAgIGFzIGlmIHRoZXkgYXJlIGVxdWFsLiAgU2luY2UgV2luZSBzZXBhcmF0ZXMgQVNDSUkgYW5kIFVuaWNvZGUgaW50bwogKiAgICBzZXBhcmF0ZSBmdW5jdGlvbnMsIHdlIHNob3VsZG4ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGZvciB0aGlzIGZsYWcuCiAqICAgIEkgYWRkZWQgaXQgdG8gdGhlIGxpc3Qgb2YgZmxhZ3MgdGhhdCBkb24ndCBuZWVkIGEgZml4bWUgbWVzc2FnZQogKiAgICB0byBtYWtlIE1TIFdvcmQgOTUgbm90IHByaW50IHNldmVyYWwgdGhvdXNhbmQgZml4bWUgbWVzc2FnZXMgZm9yIAogKiAgICB0aGlzIGZ1bmN0aW9uLgogKi8KSU5UMzIgV0lOQVBJIExDTWFwU3RyaW5nMzJBKAoJTENJRCBsY2lkIC8qIGxvY2FsZSBpZGVudGlmaWVyIGNyZWF0ZWQgd2l0aCBNQUtFTENJRDsgCgkJICAgICBMT0NBTEVfU1lTVEVNX0RFRkFVTFQgYW5kIExPQ0FMRV9VU0VSX0RFRkFVTFQgYXJlIAogICAgICAgICAgICAgICAgICAgICBwcmVkZWZpbmVkIHZhbHVlcy4gKi8sCglEV09SRCBtYXBmbGFncyAvKiBmbGFncyAqLywKCUxQQ1NUUiBzcmNzdHIgIC8qIHNvdXJjZSBidWZmZXIgKi8sCglJTlQzMiBzcmNsZW4gICAvKiBzb3VyY2UgbGVuZ3RoICovLAoJTFBTVFIgZHN0c3RyICAgLyogZGVzdGluYXRpb24gYnVmZmVyICovLAoJSU5UMzIgZHN0bGVuICAgLyogZGVzdGluYXRpb24gYnVmZmVyIGxlbmd0aCAqLykgCnsKICBpbnQgaTsKCiAgVFJBQ0Uoc3RyaW5nLCIoMHglMDRseCwweCUwOGx4LCVzLCVkLCVwLCVkKVxuIiwKCWxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuKTsKCiAgaWYgKCAoKGRzdGxlbiE9MCkgJiYgKGRzdHN0cj09TlVMTCkpIHx8IChzcmNzdHI9PU5VTEwpICkKICB7CiAgICBFUlIob2xlLCAiKHNyYz0lcyxkZXN0PSVzKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwgc3Jjc3RyLCBkc3RzdHIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KICBpZiAoc3JjbGVuID09IC0xKSAKICAgIHNyY2xlbiA9IGxzdHJsZW4zMkEoc3Jjc3RyKSArIDEgOyAgICAvKiAoaW5jbHVkZSBmaW5hbCAnXDAnKSAqLwoKICBpZiAobWFwZmxhZ3MgJiB+ICggTENNQVBfVVBQRVJDQVNFIHwgTENNQVBfTE9XRVJDQVNFIHwgTENNQVBfU09SVEtFWSB8CgkJICAgICBOT1JNX0lHTk9SRUNBU0UgfCBOT1JNX0lHTk9SRU5PTlNQQUNFIHwgU09SVF9TVFJJTkdTT1JUIHwKCQkgICAgIE5PUk1fSUdOT1JFV0lEVEgpICkKICB7CiAgICBGSVhNRShzdHJpbmcsIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCgkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAoJICBsY2lkLAogIAkgIG1hcGZsYWdzJn4oTENNQVBfVVBQRVJDQVNFIHwgTENNQVBfTE9XRVJDQVNFIHwgTENNQVBfU09SVEtFWSB8CgkJICAgICBOT1JNX0lHTk9SRUNBU0UgfCBOT1JNX0lHTk9SRU5PTlNQQUNFIHwgU09SVF9TVFJJTkdTT1JUIHwKCQkgICAgIE5PUk1fSUdOT1JFV0lEVEgpLAoJICBzcmNzdHIsCgkgIHNyY2xlbiwKCSAgZHN0c3RyLAoJICBkc3RsZW4sCgkgIG1hcGZsYWdzCiAgICAgKTsKICB9CgogIGlmICggIShtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICkKICB7CiAgICBpbnQgKCpmKShpbnQpPWlkZW50aXR5OyAKCiAgICBpZiAoZHN0bGVuPT0wKQogICAgICByZXR1cm4gc3JjbGVuOyAgLyogZHN0bGVuPTAgbWVhbnMgImRvIG5vdGhpbmcgYnV0IHJldHVybiByZXF1aXJlZCBsZW5ndGgiICovCiAgICBpZiAoZHN0bGVuPHNyY2xlbikKICAgICAgc3JjbGVuPWRzdGxlbjsgIC8qIE5vLCB0aGlzIGNhc2UgaXMgbm90IGFuIGVycm9yIHVuZGVyIFdpbmRvd3MgOTUuCgkJICAgICAgICAgQW5kIG5vICdcMCcgZ2V0cyB3cml0dGVuLiAqLwogICAgaWYgKG1hcGZsYWdzICYgTENNQVBfVVBQRVJDQVNFKQogICAgICBmID0gdG91cHBlcjsKICAgIGVsc2UgaWYgKG1hcGZsYWdzICYgTENNQVBfTE9XRVJDQVNFKQogICAgICBmID0gdG9sb3dlcjsKICAgIGZvciAoaT0wOyBpIDwgc3JjbGVuOyBpKyspCiAgICAgIGRzdHN0cltpXSA9IChDSEFSKSBmKHNyY3N0cltpXSk7CiAgICByZXR1cm4gc3JjbGVuOwogIH0KCiAgLyogZWxzZSAuLi4gKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgICovCiAgewogICAgaW50IHVuaWNvZGVfbGVuPTA7CiAgICBpbnQgY2FzZV9sZW49MDsKICAgIGludCBkaWFjcml0aWNfbGVuPTA7CiAgICBpbnQgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW49MDsKICAgIGNoYXIgKmNhc2VfY29tcG9uZW50OwogICAgY2hhciAqZGlhY3JpdGljX2NvbXBvbmVudDsKICAgIGNoYXIgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50OwogICAgaW50IHJvb20sY291bnQ7CiAgICBpbnQgZmxhZ19zdHJpbmdzb3J0ID0gbWFwZmxhZ3MgJiBTT1JUX1NUUklOR1NPUlQ7CgogICAgLyogY29tcHV0ZSBob3cgbXVjaCByb29tIHdlIHdpbGwgbmVlZCAqLwogICAgZm9yIChpPTA7aTxzcmNsZW47aSsrKQogICAgewogICAgICBpbnQgb2ZzOwogICAgICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9jaGFyID0gc3Jjc3RyW2ldOwogICAgICBpZiAoc291cmNlX2NoYXIhPSdcMCcpIAogICAgICB7CglpZiAoZmxhZ19zdHJpbmdzb3J0IHx8ICFPTEUyTkxTX2lzUHVuY3R1YXRpb24oc291cmNlX2NoYXIpKQoJewoJICB1bmljb2RlX2xlbisrOwoJICBpZiAoIExDTV9Vbmljb2RlX0xVVFstMisyKnNvdXJjZV9jaGFyXSAmIH4xNSApCgkgICAgdW5pY29kZV9sZW4rKzsgICAgICAgICAgICAgLyogZG91YmxlIGxldHRlciAqLwoJfQoJZWxzZQoJewoJICBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbisrOwoJfQkgIAogICAgICB9CgkgIAogICAgICBpZiAoaXN1cHBlcihzb3VyY2VfY2hhcikpCgljYXNlX2xlbj11bmljb2RlX2xlbjsgCgogICAgICBvZnMgPSBzb3VyY2VfY2hhciAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CiAgICAgIGlmICgob2ZzPj0wKSAmJiAoTENNX0RpYWNyaXRpY19MVVRbb2ZzXSE9MikpCglkaWFjcml0aWNfbGVuPXVuaWNvZGVfbGVuOwogICAgfQoKICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFQ0FTRSkKICAgICAgY2FzZV9sZW49MDsgICAgICAgICAgICAgICAgICAgCiAgICBpZiAobWFwZmxhZ3MgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQogICAgICBkaWFjcml0aWNfbGVuPTA7CgogICAgcm9vbSA9ICAyICogdW5pY29kZV9sZW4gICAgICAgICAgICAgIC8qICJ1bmljb2RlIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgZGlhY3JpdGljX2xlbiAgICAgICAgICAgICAgICAvKiAiZGlhY3JpdGljIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgY2FzZV9sZW4gICAgICAgICAgICAgICAgICAgICAvKiAiY2FzZSIgY29tcG9uZW50ICovCiAgICAgICsgICAgIDQgKiBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbiAgLyogcHVuY3R1YXRpb24gaW4gd29yZCBzb3J0IG1vZGUgKi8KICAgICAgKyAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3VyICdcMScgc2VwYXJhdG9ycyAqLwogICAgICArICAgICAxICA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlcm1pbmFsICdcMCcgKi8KICAgIGlmIChkc3RsZW49PTApCiAgICAgIHJldHVybiByb29tOyAgICAgIAogICAgZWxzZSBpZiAoZHN0bGVuPHJvb20pCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLypGSVhNRSB0aGUgUG9pbnRlcmNoZWNrIHNob3VsZCBub3QgYmUgbmVzc2VzYXJ5ICovCiAgICBpZiAoSXNCYWRXcml0ZVB0cjMyIChkc3RzdHIscm9vbSkpCiAgICB7IEVSUiAoc3RyaW5nLCJiYWQgZGVzdGluYXRpb24gYnVmZmVyIChkc3RzdHIpIDogJXAsJWRcbiIsZHN0c3RyLGRzdGxlbik7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogbG9jYXRlIGVhY2ggY29tcG9uZW50LCB3cml0ZSBzZXBhcmF0b3JzICovCiAgICBkaWFjcml0aWNfY29tcG9uZW50ID0gZHN0c3RyICsgMip1bmljb2RlX2xlbiA7CiAgICAqZGlhY3JpdGljX2NvbXBvbmVudCsrID0gJ1wxJzsgCiAgICBjYXNlX2NvbXBvbmVudCA9IGRpYWNyaXRpY19jb21wb25lbnQgKyBkaWFjcml0aWNfbGVuIDsKICAgICpjYXNlX2NvbXBvbmVudCsrID0gJ1wxJzsgCiAgICBkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCA9IGNhc2VfY29tcG9uZW50ICsgY2FzZV9sZW4gOwogICAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAnXDEnOwogICAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAnXDEnOwoKICAgIC8qIHJlYWQgc291cmNlIHN0cmluZyBjaGFyIGJ5IGNoYXIsIHdyaXRlIAogICAgICAgY29ycmVzcG9uZGluZyB3ZWlnaHQgaW4gZWFjaCBjb21wb25lbnQuICovCiAgICBmb3IgKGk9MCxjb3VudD0wO2k8c3JjbGVuO2krKykKICAgIHsKICAgICAgdW5zaWduZWQgY2hhciBzb3VyY2VfY2hhcj1zcmNzdHJbaV07CiAgICAgIGlmIChzb3VyY2VfY2hhciE9J1wwJykgCiAgICAgIHsKCWludCB0eXBlLGxvbmdjb2RlOwoJdHlwZSA9IExDTV9Vbmljb2RlX0xVVFstMisyKnNvdXJjZV9jaGFyXTsKCWxvbmdjb2RlID0gdHlwZSA+PiA0OwoJdHlwZSAmPSAxNTsKCWlmICghZmxhZ19zdHJpbmdzb3J0ICYmIE9MRTJOTFNfaXNQdW5jdHVhdGlvbihzb3VyY2VfY2hhcikpIAoJewoJICBVSU5UMTYgZW5jcnlwdGVkX2xvY2F0aW9uID0gKDE8PDE1KSArIDcgKyA0KmNvdW50OwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZW5jcnlwdGVkX2xvY2F0aW9uPj44KTsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAodW5zaWduZWQgY2hhcikgKGVuY3J5cHRlZF9sb2NhdGlvbiYyNTUpOwogICAgICAgICAgICAgICAgICAgICAvKiBiaWctZW5kaWFuIGlzIHVzZWQgaGVyZSBiZWNhdXNlIGl0IGxldHMgc3RyaW5nIGNvbXBhcmlzb24gYmUKCQkJY29tcGF0aWJsZSB3aXRoIG51bWVyaWNhbCBjb21wYXJpc29uICovCgoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9IHR5cGU7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gTENNX1VuaWNvZGVfTFVUWy0xKzIqc291cmNlX2NoYXJdOyAgCiAgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtcHRpb24gOiBhIHB1bmN0dWF0aW9uIGNoYXJhY3RlciBpcyBuZXZlciBhIAoJCQlkb3VibGUgb3IgYWNjZW50ZWQgbGV0dGVyICovCgl9CgllbHNlCgl7CgkgIGRzdHN0clsyKmNvdW50XSA9IHR5cGU7CgkgIGRzdHN0clsyKmNvdW50KzFdID0gTENNX1VuaWNvZGVfTFVUWy0xKzIqc291cmNlX2NoYXJdOyAgCgkgIGlmIChsb25nY29kZSkKCSAgewoJICAgIGlmIChjb3VudDxjYXNlX2xlbikKCSAgICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzb3VyY2VfY2hhcikgPyAxOCA6IDIgKSA7CgkgICAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCgkgICAgICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IDI7IC8qIGFzc3VtcHRpb246IGEgZG91YmxlIGxldHRlcgoJCQkJCQkgaXMgbmV2ZXIgYWNjZW50ZWQgKi8KCSAgICBjb3VudCsrOwoJICAgIAoJICAgIGRzdHN0clsyKmNvdW50XSA9IHR5cGU7CgkgICAgZHN0c3RyWzIqY291bnQrMV0gPSAqKExDTV9Vbmljb2RlX0xVVF8yIC0gMSArIGxvbmdjb2RlKTsgCgkgICAgLyogMTYgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAxIAoJICAgICAgIDMyIGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMiAKCSAgICAgICA0OCBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDMgKi8KCSAgfQoKCSAgaWYgKGNvdW50PGNhc2VfbGVuKQoJICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzb3VyY2VfY2hhcikgPyAxOCA6IDIgKSA7CgkgIGlmIChjb3VudDxkaWFjcml0aWNfbGVuKQoJICB7CgkgICAgaW50IG9mcyA9IHNvdXJjZV9jaGFyIC0gTENNX0RpYWNyaXRpY19TdGFydDsKCSAgICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IChvZnM+PTAgPyBMQ01fRGlhY3JpdGljX0xVVFtvZnNdIDogMik7CgkgIH0KCSAgY291bnQrKzsKCX0KICAgICAgfQogICAgfQogICAgZHN0c3RyW3Jvb20tMV0gPSAnXDAnOwogICAgcmV0dXJuIHJvb207CiAgfQp9CgkJICAgICAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nMzJXICAgICAgICAgICAgICAgIFtLRVJORUwzMi40OTNdCiAqCiAqIENvbnZlcnQgYSBzdHJpbmcsIG9yIGdlbmVyYXRlIGEgc29ydCBrZXkgZnJvbSBpdC4KICoKICogTk9URQogKgogKiBTZWUgTENNYXBTdHJpbmczMkEgZm9yIGRvY3VtZW50YXRpb24KICovCklOVDMyIFdJTkFQSSBMQ01hcFN0cmluZzMyVygKCUxDSUQgbGNpZCxEV09SRCBtYXBmbGFncyxMUENXU1RSIHNyY3N0cixJTlQzMiBzcmNsZW4sTFBXU1RSIGRzdHN0ciwKCUlOVDMyIGRzdGxlbikKewogIGludCBpOwogCiAgVFJBQ0Uoc3RyaW5nLCIoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKVxuIiwKCWxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuKTsKCiAgaWYgKCAoKGRzdGxlbiE9MCkgJiYgKGRzdHN0cj09TlVMTCkpIHx8IChzcmNzdHI9PU5VTEwpICkKICB7CiAgICBFUlIob2xlLCAiKHNyYz0lcCxkc3Q9JXApOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzcmNzdHIsIGRzdHN0cik7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQogIGlmIChzcmNsZW49PS0xKSAKICAgIHNyY2xlbiA9IGxzdHJsZW4zMlcoc3Jjc3RyKSsxOwogIGlmIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpIAogIHsKICAgIEZJWE1FKHN0cmluZywiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZCk6ICIKCSAgInVuaW1wbGVtZW50ZWQgZmxhZ3M6IDB4JTA4bHhcbiIsCgkgIGxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuLG1hcGZsYWdzKTsKICAgIHJldHVybiAwOwogIH0KICBlbHNlCiAgewogICAgaW50ICgqZikoaW50KT1pZGVudGl0eTsgCgogICAgaWYgKGRzdGxlbj09MCkKICAgICAgcmV0dXJuIHNyY2xlbjsgIAogICAgaWYgKGRzdGxlbjxzcmNsZW4pCiAgICAgIHJldHVybiAwOyAgICAgICAKICAgIGlmIChtYXBmbGFncyAmIExDTUFQX1VQUEVSQ0FTRSkKICAgICAgZiA9IHRvdXBwZXI7CiAgICBlbHNlIGlmIChtYXBmbGFncyAmIExDTUFQX0xPV0VSQ0FTRSkKICAgICAgZiA9IHRvbG93ZXI7CiAgICBmb3IgKGk9MDsgaSA8IHNyY2xlbjsgaSsrKQogICAgICBkc3RzdHJbaV0gPSAoV0NIQVIpIGYoc3Jjc3RyW2ldKTsKICAgIHJldHVybiBzcmNsZW47CiAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIENvbXBhcmVTdHJpbmcxNiAgICAgICAoT0xFMk5MUy44KQogKi8KVUlOVDE2IFdJTkFQSSBDb21wYXJlU3RyaW5nMTYoRFdPUkQgbGNpZCxEV09SRCBmZHdTdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHMxLERXT1JEIGwxLExQQ1NUUiBzMixEV09SRCBsMikKewoJcmV0dXJuIChVSU5UMTYpQ29tcGFyZVN0cmluZzMyQShsY2lkLGZkd1N0eWxlLHMxLGwxLHMyLGwyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ29tcGFyZVN0cmluZzMyQQlbS0VSTkVMMzIuMTQzXQogKiBDb21wYXJlcyB0d28gc3RyaW5ncyB1c2luZyBsb2NhbGUKICoKICogUkVUVVJOUwogKgogKiBzdWNjZXNzOiBDU1RSX0xFU1NfVEhBTiwgQ1NUUl9FUVVBTCwgQ1NUUl9HUkVBVEVSX1RIQU4KICogZmFpbHVyZTogMAogKgogKiBOT1RFUwogKgogKiBEZWZhdWx0cyB0byBhIHdvcmQgc29ydCwgYnV0IHVzZXMgYSBzdHJpbmcgc29ydCBpZgogKiBTT1JUX1NUUklOR1NPUlQgaXMgc2V0LgogKiBDYWxscyBTZXRMYXN0RXJyb3IgZm9yIEVSUk9SX0lOVkFMSURfRkxBR1MsIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSLgogKiAKICogQlVHUwogKgogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKgogKiBGSVhNRQogKiAKICogUXVpdGUgaW5lZmZpY2llbnQuCiAqLwpVSU5UMzIgV0lOQVBJIENvbXBhcmVTdHJpbmczMkEoCiAgICBEV09SRCBsY2lkLCAgICAgLyogbG9jYWxlIElEICovCiAgICBEV09SRCBmZHdTdHlsZSwgLyogY29tcGFyaXNvbi1zdHlsZSBvcHRpb25zICovCiAgICBMUENTVFIgczEsICAgICAgLyogZmlyc3Qgc3RyaW5nICovCiAgICBEV09SRCBsMSwgICAgICAgLyogbGVuZ3RoIG9mIGZpcnN0IHN0cmluZyAqLwogICAgTFBDU1RSIHMyLCAgICAgIC8qIHNlY29uZCBzdHJpbmcgKi8KICAgIERXT1JEIGwyKSAgICAgICAvKiBsZW5ndGggb2Ygc2Vjb25kIHN0cmluZyAqLwp7CiAgaW50IG1hcHN0cmluZ19mbGFnczsKICBpbnQgbGVuMSxsZW4yOwogIGludCByZXN1bHQ7CiAgTFBTVFIgc2sxLHNrMjsKICBUUkFDRShvbGUsIiVzIGFuZCAlc1xuIiwKCWRlYnVnc3RyX2EgKHMxKSwgZGVidWdzdHJfYSAoczIpKTsKCiAgaWYgKCAoczE9PU5VTEwpIHx8IChzMj09TlVMTCkgKQogIHsgICAgCiAgICBFUlIob2xlLCAiKHMxPSVzLHMyPSVzKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwgczEsIHMyKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CgogIGlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQogICAgRklYTUUob2xlLCAiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKICAJCiAgbWFwc3RyaW5nX2ZsYWdzID0gTENNQVBfU09SVEtFWSB8IGZkd1N0eWxlIDsKICBsZW4xID0gTENNYXBTdHJpbmczMkEobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczEsbDEsTlVMTCwwKTsKICBsZW4yID0gTENNYXBTdHJpbmczMkEobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczIsbDIsTlVMTCwwKTsKCiAgaWYgKChsZW4xPT0wKXx8KGxlbjI9PTApKQogICAgcmV0dXJuIDA7ICAgICAvKiBzb21ldGhpbmcgd3JvbmcgaGFwcGVuZWQgKi8KCiAgc2sxID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuMSk7CiAgc2syID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuMik7CiAgaWYgKCAoIUxDTWFwU3RyaW5nMzJBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMxLGwxLHNrMSxsZW4xKSkKCSB8fCAoIUxDTWFwU3RyaW5nMzJBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMyLGwyLHNrMixsZW4yKSkgKQogIHsKICAgIEVSUihvbGUsIkJ1ZyBpbiBMQ21hcFN0cmluZzMyQS5cbiIpOwogICAgcmVzdWx0ID0gMDsKICB9CiAgZWxzZQogIHsKICAgIC8qIHN0cmNtcCBkb2Vzbid0IG5lY2Vzc2FyaWx5IHJldHVybiAtMSwgMCwgb3IgMSAqLwogICAgcmVzdWx0ID0gc3RyY21wKHNrMSxzazIpOwogIH0KICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc2sxKTsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc2syKTsKCiAgaWYgKHJlc3VsdCA8IDApCiAgICByZXR1cm4gMTsKICBpZiAocmVzdWx0ID09IDApCiAgICByZXR1cm4gMjsKCiAgLyogbXVzdCBiZSBncmVhdGVyLCBpZiB3ZSByZWFjaCB0aGlzIHBvaW50ICovCiAgcmV0dXJuIDM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNvbXBhcmVTdHJpbmczMlcJW0tFUk5FTDMyLjE0NF0KICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSBsb2NhbGUKICogRklYTUUgOiAgRG9lcyBvbmx5IHN0cmluZyBzb3J0LiAgU2hvdWxkCiAqIGJlIHJlaW1wbGVtZW50ZWQgdGhlIHNhbWUgd2F5IGFzIENvbXBhcmVTdHJpbmczMkEuCiAqLwpVSU5UMzIgV0lOQVBJIENvbXBhcmVTdHJpbmczMlcoRFdPUkQgbGNpZCwgRFdPUkQgZmR3U3R5bGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBzMSwgRFdPUkQgbDEsIExQQ1dTVFIgczIsRFdPUkQgbDIpCnsKCWludCBsZW4scmV0OwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQoJCUZJWE1FKG9sZSwiSUdOT1JFTk9OU1BBQ0Ugbm90IHN1cHBydGVkXG4iKTsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQoJCUZJWE1FKG9sZSwiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKCgkvKiBJcyBzdHJjbXAgZGVmYXVsdGluZyB0byBzdHJpbmcgc29ydCBvciB0byB3b3JkIHNvcnQ/PyAqLwoJLyogRklYTUU6IEhhbmRsZSBOT1JNX1NUUklOR1NPUlQgKi8KCWwxID0gKGwxPT0tMSk/bHN0cmxlbjMyVyhzMSk6bDE7CglsMiA9IChsMj09LTEpP2xzdHJsZW4zMlcoczIpOmwyOwoJbGVuID0gbDE8bDIgPyBsMTpsMjsKCXJldCA9IChmZHdTdHlsZSAmIE5PUk1fSUdOT1JFQ0FTRSkgPwoJCWxzdHJuY21waTMyVyhzMSxzMixsZW4pCTogbHN0cm5jbXAzMlcoczEsczIsbGVuKTsKCS8qIG5vdCBlcXVhbCwgcmV0dXJuIDEgb3IgMyAqLwoJaWYocmV0IT0wKSByZXR1cm4gcmV0KzI7CgkvKiBzYW1lIGxlbiwgcmV0dXJuIDIgKi8KCWlmKGwxPT1sMikgcmV0dXJuIDI7CgkvKiB0aGUgbG9uZ2VyIG9uZSBpcyBsZXhpY2FsbHkgZ3JlYXRlciAqLwoJcmV0dXJuIChsMTxsMik/IDEgOiAzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlPTEVfR2V0Rm9ybWF0QQlbSW50ZXJuYWxdCiAqCiAqIEZJWE1FCiAqICAgIElmIGRhdGVsZW4gPT0gMCwgaXQgc2hvdWxkIHJldHVybiB0aGUgcmVndWlyZWQgc3RyaW5nIGxlbmd0aC4KICoKIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBzdHVmZiBmb3IgR2V0RGF0ZUZvcm1hdCgpIGFuZCAKIEdldFRpbWVGb3JtYXQoKS4KCiAgZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAgTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICBNTSAgIHR3by1kaWdpdCBtb250aAogIE1NTSAgc2hvcnQgbW9udGggbmFtZQogIE1NTU0gZnVsbCBtb250aCBuYW1lCiAgeSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAgeXkgICB0d28tZGlnaXQgeWVhcgogIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAgZ2cgICBlcmEgc3RyaW5nCiAgaCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMTItaG91cikKICBoaCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgSCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICBISCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgbSAgICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgbW0gICBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgcyAgICBzZWNvbmRzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgc3MgICBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgdCAgICB0aW1lIG1hcmtlciAoQSBvciBQKQogIHR0ICAgdGltZSBtYXJrZXIgKEFNLCBQTSkKICAnJyAgIHVzZWQgdG8gcXVvdGUgbGl0ZXJhbCBjaGFyYWN0ZXJzCiAgJycgICAod2l0aGluIGEgcXVvdGVkIHN0cmluZykgaW5kaWNhdGVzIGEgbGl0ZXJhbCAnCgogVGhlc2UgZnVuY3Rpb25zIFJFUVVJUkUgdmFsaWQgbG9jYWxlLCBkYXRlLCAgYW5kIGZvcm1hdC4gCiAqLwpzdGF0aWMgSU5UMzIgT0xFX0dldEZvcm1hdEEoTENJRCBsb2NhbGUsCgkJCSAgICBEV09SRCBmbGFncywKCQkJICAgIERXT1JEIHRmbGFncywKCQkJICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgIExQQ1NUUiBfZm9ybWF0LCAJLyppbiovCgkJCSAgICBMUFNUUiBkYXRlLAkJLypvdXQqLwoJCQkgICAgSU5UMzIgZGF0ZWxlbikKewogICBJTlQzMiBpbnBvcywgb3V0cG9zOwogICBpbnQgY291bnQsIHR5cGUsIGlucXVvdGUsIE92ZXJmbG93OwogICBjaGFyIGJ1Zls0MF07CiAgIGNoYXIgZm9ybWF0WzQwXTsKICAgY2hhciAqIHBvczsKICAgaW50IGJ1ZmxlbjsKCiAgIGNvbnN0IGNoYXIgKiBfZGdmbXRbXSA9IHsgIiVkIiwgIiUwMmQiIH07CiAgIGNvbnN0IGNoYXIgKiogZGdmbXQgPSBfZGdmbXQgLSAxOyAKCiAgIC8qIHJlcG9ydCwgZm9yIGRlYnVnZ2luZyAqLwogICBUUkFDRShvbGUsICIoMHglbHgsMHglbHgsIDB4JWx4LCB0aW1lKGQ9JWQsaD0lZCxtPSVkLHM9JWQpLCBmbXQ9JXAgXCclc1wnICwgJXAsIGxlbj0lZClcbiIsCiAgIAkgbG9jYWxlLCBmbGFncywgdGZsYWdzLAoJIHh0aW1lLT53RGF5LCB4dGltZS0+d0hvdXIsIHh0aW1lLT53TWludXRlLCB4dGltZS0+d1NlY29uZCwKCSBfZm9ybWF0LCBfZm9ybWF0LCBkYXRlLCBkYXRlbGVuKTsKICAKICAgaWYoZGF0ZWxlbiA9PSAwKSB7CiAgICAgRklYTUUob2xlLCAiZGF0ZWxlbiA9IDAsIHJldHVybmluZyAyNTVcbiIpOwogICAgIHJldHVybiAyNTU7CiAgIH0KCiAgIC8qIGluaXRhbGl6ZSBzdGF0ZSB2YXJpYWJsZXMgYW5kIG91dHB1dCBidWZmZXIgKi8KICAgaW5wb3MgPSBvdXRwb3MgPSAwOwogICBjb3VudCA9IDA7IGlucXVvdGUgPSAwOyBPdmVyZmxvdyA9IDA7CiAgIHR5cGUgPSAnXDAnOwogICBkYXRlWzBdID0gYnVmWzBdID0gJ1wwJzsKICAgICAgCiAgIHN0cmNweShmb3JtYXQsX2Zvcm1hdCk7CgogICAvKiBhbHRlciB0aGUgZm9ybWF0c3RyaW5nLCB3aGlsZSBpdCB3b3JrcyBmb3IgYWxsIGxhbmd1YWdlcyBub3cgaW4gd2luZQogICBpdHMgcG9zc2libGUgdGhhdCBpdCBmYWlscyB3aGVuIHRoZSB0aW1lIGxvb2tzIGxpa2Ugc3M6bW06aGggYXMgZXhhbXBsZSovICAgCiAgIGlmICh0ZmxhZ3MgJiAoVElNRV9OT01JTlVURVNPUlNFQ09ORFMpKQogICB7IGlmICgocG9zID0gc3Ryc3RyICggZm9ybWF0LCAiOm1tIikpKQogICAgIHsgbWVtY3B5ICggcG9zLCBwb3MrMywgc3RybGVuKGZvcm1hdCktKHBvcy1mb3JtYXQpLTIgKTsKICAgICB9CiAgIH0KICAgaWYgKHRmbGFncyAmIChUSU1FX05PU0VDT05EUykpCiAgIHsgaWYgKChwb3MgPSBzdHJzdHIgKCBmb3JtYXQsICI6c3MiKSkpCiAgICAgeyBtZW1jcHkgKCBwb3MsIHBvcyszLCBzdHJsZW4oZm9ybWF0KS0ocG9zLWZvcm1hdCktMiApOwogICAgIH0KICAgfQogICAKICAgZm9yIChpbnBvcyA9IDA7OyBpbnBvcysrKSB7CiAgICAgIC8qIFRSQUNFKG9sZSwgIlNUQVRFIGlucG9zPSUyZCBvdXRwb3M9JTJkIGNvdW50PSVkIGlucXVvdGU9JWQgdHlwZT0lYyBidWYsZGF0ZSA9ICVjLCVjXG4iLCBpbnBvcywgb3V0cG9zLCBjb3VudCwgaW5xdW90ZSwgdHlwZSwgYnVmW2lucG9zXSwgZGF0ZVtvdXRwb3NdKTsgKi8KICAgICAgaWYgKGlucXVvdGUpIHsKCSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgICAgaWYgKGZvcm1hdFtpbnBvcysxXSA9PSAnXCcnKSB7CgkgICAgICAgaW5wb3MgKz0gMTsKCSAgICAgICBkYXRlW291dHBvcysrXSA9ICdcJyc7CgkgICAgfSBlbHNlIHsKCSAgICAgICBpbnF1b3RlID0gMDsKCSAgICAgICBjb250aW51ZTsgLyogd2UgZGlkIG5vdGhpbmcgdG8gdGhlIG91dHB1dCAqLwoJICAgIH0KCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wwJykgewoJICAgIGRhdGVbb3V0cG9zKytdID0gJ1wwJzsKCSAgICBpZiAob3V0cG9zID4gZGF0ZWxlbikgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOwoJIH0gZWxzZSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwoJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSB7CgkgICAgICAgT3ZlcmZsb3cgPSAxOwoJICAgICAgIGRhdGVbb3V0cG9zLTFdID0gJ1wwJzsgLyogdGhpcyBpcyB0aGUgbGFzdCBwbGFjZSB3aGVyZQoJCQkJCSBpdCdzIHNhZmUgdG8gd3JpdGUgKi8KCSAgICAgICBicmVhazsKCSAgICB9CgkgfQogICAgICB9IGVsc2UgaWYgKCAgKGNvdW50ICYmIChmb3JtYXRbaW5wb3NdICE9IHR5cGUpKQoJCSAgIHx8IGNvdW50ID09IDQKCQkgICB8fCAoY291bnQgPT0gMiAmJiBzdHJjaHIoImdoSG1zdCIsIHR5cGUpKSApCiAgICAgICB7CgkgICAgaWYgICAgICAgICAodHlwZSA9PSAnZCcpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCQkgIEdldExvY2FsZUluZm8zMkEobG9jYWxlLAoJCQkJICAgTE9DQUxFX1NEQVlOQU1FMQoJCQkJICAgKyB4dGltZS0+d0RheU9mV2VlayAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCQkJICAgR2V0TG9jYWxlSW5mbzMyQShsb2NhbGUsIAoJCQkJCSAgICBMT0NBTEVfU0FCQlJFVkRBWU5BTUUxIAoJCQkJCSAgICArIHh0aW1lLT53RGF5T2ZXZWVrIC0gMSwKCQkJCQkgICAgYnVmLCBzaXplb2YoYnVmKSk7CgkJICAgICAgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53RGF5KTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdNJykgewoJICAgICAgIGlmIChjb3VudCA9PSAzKSB7CgkJICBHZXRMb2NhbGVJbmZvMzJBKGxvY2FsZSwgCgkJCQkgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEKCQkJCSAgICsgeHRpbWUtPndNb250aCAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDQpIHsKCQkgIEdldExvY2FsZUluZm8zMkEobG9jYWxlLAoJCQkJICAgTE9DQUxFX1NNT05USE5BTUUxCgkJCQkgICArIHh0aW1lLT53TW9udGggLSAxLAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkJIH0gZWxzZSB7CgkJICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d01vbnRoKTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICd5JykgewoJICAgICAgIGlmIChjb3VudCA9PSA0KSB7CgkJICAgICAgc3ByaW50ZihidWYsICIlZCIsIHh0aW1lLT53WWVhcik7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkJICBzdHJjcHkoYnVmLCAieXl5Iik7CgkJICBXQVJOKG9sZSwgInVua25vd24gZm9ybWF0LCBjPSVjLCBuPSVkXG4iLCAgdHlwZSwgY291bnQpOwoJCSB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndZZWFyICUgMTAwKTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdnJykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJCSAgRklYTUUob2xlLCAiTE9DQUxFX0lDQUxFTkRBUlRZUEUgdW5pbXAuXG4iKTsKCQkgIHN0cmNweShidWYsICJBRCIpOwoJICAgIH0gZWxzZSB7CgkJICBzdHJjcHkoYnVmLCAiZyIpOwoJCSAgV0FSTihvbGUsICJ1bmtub3duIGZvcm1hdCwgYz0lYywgbj0lZFxuIiwgdHlwZSwgY291bnQpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ2gnKSB7CgkgICAgICAgLyogZ2l2ZXMgdXMgaG91cnMgMTowMCAtLSAxMjowMCAqLwoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sICh4dGltZS0+d0hvdXItMSklMTIgKzEpOwoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnSCcpIHsKCSAgICAgICAvKiAyNC1ob3VyIHRpbWUgKi8KCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d0hvdXIpOwoJICAgIH0gZWxzZSBpZiAoIHR5cGUgPT0gJ20nKSB7CgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndNaW51dGUpOwoJICAgIH0gZWxzZSBpZiAoIHR5cGUgPT0gJ3MnKSB7CgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndTZWNvbmQpOwoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAndCcpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDEpIHsKCQkgIHNwcmludGYoYnVmLCAiJWMiLCAoeHRpbWUtPndIb3VyIDwgMTIpID8gJ0EnIDogJ1AnKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDIpIHsKCQkgIC8qIHNwcmludGYoYnVmLCAiJXMiLCAoeHRpbWUtPndIb3VyIDwgMTIpID8gIkFNIiA6ICJQTSIpOyAqLwoJCSAgR2V0TG9jYWxlSW5mbzMyQShsb2NhbGUsCgkJCQkgICAoeHRpbWUtPndIb3VyPDEyKSAKCQkJCSAgID8gTE9DQUxFX1MxMTU5IDogTE9DQUxFX1MyMzU5LAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkgICAgICAgfQoJICAgIH07CgoJICAgIC8qIHdlIG5lZWQgdG8gY2hlY2sgdGhlIG5leHQgY2hhciBpbiB0aGUgZm9ybWF0IHN0cmluZyAKCSAgICAgICBhZ2Fpbiwgbm8gbWF0dGVyIHdoYXQgaGFwcGVuZWQgKi8KCSAgICBpbnBvcy0tOwoJICAgIAoJICAgIC8qIGFkZCB0aGUgY29udGVudHMgb2YgYnVmIHRvIHRoZSBvdXRwdXQgKi8KCSAgICBidWZsZW4gPSBzdHJsZW4oYnVmKTsKCSAgICBpZiAob3V0cG9zICsgYnVmbGVuIDwgZGF0ZWxlbikgewoJICAgICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7IC8qIGZvciBzdHJjYXQgdG8gaG9vayBvbnRvICovCgkJIHN0cmNhdChkYXRlLCBidWYpOwoJICAgICAgIG91dHBvcyArPSBidWZsZW47CgkgICAgfSBlbHNlIHsKCSAgICAgICBkYXRlW291dHBvc10gPSAnXDAnOwoJICAgICAgIHN0cm5jYXQoZGF0ZSwgYnVmLCBkYXRlbGVuIC0gb3V0cG9zKTsKCQkgZGF0ZVtkYXRlbGVuIC0gMV0gPSAnXDAnOwoJCSBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgICAgICAgV0FSTihvbGUsICJpbnN1ZmZpY2llbnQgYnVmZmVyXG4iKTsKCQkgcmV0dXJuIDA7CgkgICAgfQoKCSAgICAvKiByZXNldCB0aGUgdmFyaWFibGVzIHdlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGlzIGl0ZW0gKi8KCSAgICBjb3VudCA9IDA7CgkgICAgdHlwZSA9ICdcMCc7CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcMCcpIHsKCSAgICAvKiB3ZSBjYW4ndCBjaGVjayBmb3IgdGhpcyBhdCB0aGUgbG9vcC1oZWFkLCBiZWNhdXNlCgkgICAgICAgdGhhdCBicmVha3MgdGhlIHByaW50aW5nIG9mIHRoZSBsYXN0IGZvcm1hdC1pdGVtICovCgkgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKCSAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChjb3VudCkgewoJICAgIC8qIGNvbnRpbnVpbmcgYSBjb2RlIGZvciBhbiBpdGVtICovCgkgICAgY291bnQgKz0xOwoJICAgIGNvbnRpbnVlOwoJIH0gZWxzZSBpZiAoc3RyY2hyKCJoSG1zdHlNZGciLCBmb3JtYXRbaW5wb3NdKSkgewoJICAgIHR5cGUgPSBmb3JtYXRbaW5wb3NdOwoJICAgIGNvdW50ID0gMTsKCSAgICBjb250aW51ZTsKCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wnJykgewoJICAgIGlucXVvdGUgPSAxOwoJICAgIGNvbnRpbnVlOwogICAgICAgfSBlbHNlIHsKCSAgICBkYXRlW291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CgkgfQogICAgICAvKiBub3cgZGVhbCB3aXRoIGEgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93ICovCiAgICAgIGlmIChvdXRwb3MgPj0gZGF0ZWxlbikgewogICAgICAgZGF0ZVtkYXRlbGVuIC0gMV0gPSAnXDAnOwogICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgfQogICAKICAgaWYgKE92ZXJmbG93KSB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgfTsKCiAgIC8qIGZpbmlzaCBpdCBvZmYgd2l0aCBhIHN0cmluZyB0ZXJtaW5hdG9yICovCiAgIG91dHBvcysrOwogICAvKiBzYW5pdHkgY2hlY2sgKi8KICAgaWYgKG91dHBvcyA+IGRhdGVsZW4tMSkgb3V0cG9zID0gZGF0ZWxlbi0xOwogICBkYXRlW291dHBvc10gPSAnXDAnOwogICAKICAgVFJBQ0Uob2xlLCAiT0xFX0dldEZvcm1hdEEgcmV0dXJucyBzdHJpbmcgJyVzJywgbGVuICVkXG4iLAoJICAgICAgIGRhdGUsIG91dHBvcyk7CiAgIHJldHVybiBvdXRwb3M7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFX0dldEZvcm1hdFcgW0lOVEVSTkFMXQogKi8Kc3RhdGljIElOVDMyIE9MRV9HZXRGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBmbGFncywgRFdPUkQgdGZsYWdzLAoJCQkgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgTFBDV1NUUiBmb3JtYXQsCgkJCSAgICBMUFdTVFIgb3V0cHV0LCBJTlQzMiBvdXRsZW4pCnsKICAgSU5UMzIgICBpbnBvcywgb3V0cG9zOwogICBpbnQgICAgIGNvdW50LCB0eXBlPTAsIGlucXVvdGU7CiAgIGludCAgICAgT3ZlcmZsb3c7IC8qIGxvb3AgY2hlY2sgKi8KICAgV0NIQVIgICBidWZbNDBdOwogICBpbnQgICAgIGJ1Zmxlbj0wOwogICBXQ0hBUiAgIGFyZzBbXSA9IHswfSwgYXJnMVtdID0geyclJywnZCcsMH07CiAgIFdDSEFSICAgYXJnMltdID0geyclJywnMCcsJzInLCdkJywwfTsKICAgV0NIQVIgICphcmdhcnJbXSA9IHthcmcwLCBhcmcxLCBhcmcyfTsKICAgaW50ICAgICBkYXRldmFycz0wLCB0aW1ldmFycz0wOwoKICAgLyogbWFrZSBhIGRlYnVnIHJlcG9ydCAqLwogICBUUkFDRShvbGUsICJhcmdzOiAweCVseCwgMHglbHgsIDB4JWx4LCB0aW1lKGQ9JWQsaD0lZCxtPSVkLHM9JWQpLCBmbXQ6JXMgKGF0ICVwKSwKICAgCSAlcCB3aXRoIG1heCBsZW4gJWRcbiIsCgkgbG9jYWxlLCBmbGFncywgdGZsYWdzLAoJIHh0aW1lLT53RGF5LCB4dGltZS0+d0hvdXIsIHh0aW1lLT53TWludXRlLCB4dGltZS0+d1NlY29uZCwKCSBkZWJ1Z3N0cl93KGZvcm1hdCksIGZvcm1hdCwgb3V0cHV0LCBvdXRsZW4pOwogICAKICAgaWYob3V0bGVuID09IDApIHsKICAgICBGSVhNRShvbGUsICJvdXRsZW4gPSAwLCByZXR1cm5pbmcgMjU1XG4iKTsKICAgICByZXR1cm4gMjU1OwogICB9CgogICAvKiBpbml0aWFsaXplIHN0YXRlIHZhcmlhYmxlcyAqLwogICBpbnBvcyA9IG91dHBvcyA9IDA7CiAgIGNvdW50ID0gMDsKICAgaW5xdW90ZSA9IE92ZXJmbG93ID0gMDsKICAgLyogdGhpcyBpcyByZWFsbHkganVzdCBhIHNhbml0eSBjaGVjayAqLwogICBvdXRwdXRbMF0gPSBidWZbMF0gPSAwOwogICAKICAgLyogdGhpcyBsb29wIGlzIHRoZSBjb3JlIG9mIHRoZSBmdW5jdGlvbiAqLwogICBmb3IgKGlucG9zID0gMDsgLyogd2UgaGF2ZSBzZXZlcmFsIGJyZWFrIHBvaW50cyAqLyA7IGlucG9zKyspIHsKICAgICAgaWYgKGlucXVvdGUpIHsKCSBpZiAoZm9ybWF0W2lucG9zXSA9PSAoV0NIQVIpICdcJycpIHsKCSAgICBpZiAoZm9ybWF0W2lucG9zKzFdID09ICdcJycpIHsKCSAgICAgICBpbnBvcysrOwoJICAgICAgIG91dHB1dFtvdXRwb3MrK10gPSAnXCcnOwoJICAgIH0gZWxzZSB7CgkgICAgICAgaW5xdW90ZSA9IDA7CgkgICAgICAgY29udGludWU7CgkgICAgfQoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAwKSB7CgkgICAgb3V0cHV0W291dHBvcysrXSA9IDA7CgkgICAgaWYgKG91dHBvcyA+IG91dGxlbikgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOyAgLyogIG5vcm1hbCBleGl0ICh3aXRoaW4gYSBxdW90ZSkgKi8KCSB9IGVsc2UgewoJICAgIG91dHB1dFtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOyAvKiBjb3B5IGlucHV0ICovCgkgICAgaWYgKG91dHBvcyA+IG91dGxlbikgewoJICAgICAgIE92ZXJmbG93ID0gMTsKCSAgICAgICBvdXRwdXRbb3V0cG9zLTFdID0gMDsgCgkgICAgICAgYnJlYWs7CgkgICAgfQoJIH0KICAgICAgfSBlbHNlIGlmICggIChjb3VudCAmJiAoZm9ybWF0W2lucG9zXSAhPSB0eXBlKSkKCQkgICB8fCAoIChjb3VudD09NCAmJiB0eXBlID09J3knKSB8fAoJCQkoY291bnQ9PTQgJiYgdHlwZSA9PSdNJykgfHwKCQkJKGNvdW50PT00ICYmIHR5cGUgPT0nZCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J2cnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdoJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0nSCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J20nKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdzJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0ndCcpICkgICkgewoJIGlmICAgICAgICAodHlwZSA9PSAnZCcpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvMzJXKGxvY2FsZSwKCQkJICAgICBMT0NBTEVfU0RBWU5BTUUxICsgeHRpbWUtPndEYXlPZldlZWsgLTEsCgkJCSAgICAgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mbzMyVyhsb2NhbGUsCgkJCQlMT0NBTEVfU0FCQlJFVkRBWU5BTUUxICsKCQkJCXh0aW1lLT53RGF5T2ZXZWVrIC0xLAoJCQkJYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGYzMlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCB4dGltZS0+d0RheSApOwoJICAgIH07CgkgfSBlbHNlIGlmICh0eXBlID09ICdNJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIEdldExvY2FsZUluZm8zMlcobG9jYWxlLCAgTE9DQUxFX1NNT05USE5BTUUxICsKCQkJCXh0aW1lLT53TW9udGggLTEsIGJ1ZiwKCQkJCXNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvMzJXKGxvY2FsZSwgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGYzMlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCB4dGltZS0+d01vbnRoKTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICd5JykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIHdzbnByaW50ZjMyVyhidWYsIDYsIGFyZ2FyclsxXSAvKiAiJWQiICovLAoJCQkgeHRpbWUtPndZZWFyKTsKCSAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCSAgICAgICBsc3RyY3B5bkF0b1coYnVmLCAieXl5IiwgNSk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGYzMlcoYnVmLCA2LCBhcmdhcnJbY291bnRdLAoJCQkgICAgeHRpbWUtPndZZWFyICUgMTAwKTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICdnJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJICAgICAgIEZJWE1FKG9sZSwgIkxPQ0FMRV9JQ0FMRU5EQVJUWVBFIHVuaW1wbGVtZW50ZWRcbiIpOwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJBRCIsIDUpOwoJICAgIH0gZWxzZSB7CgkgICAgICAgLyogV2luIEFQSSBzZXogd2UgY29weSBpdCB2ZXJiYXRpbSAqLwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJnIiwgNSk7CgkgICAgfQoJIH0gZWxzZSBpZiAodHlwZSA9PSAnaCcpIHsKCSAgICAvKiBob3VycyAxOjAwLTEyOjAwIC0tLSBpcyB0aGlzIHJpZ2h0PyAqLwoJICAgIHdzbnByaW50ZjMyVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sIAoJCQkgKHh0aW1lLT53SG91ci0xKSUxMiArMSk7CgkgfSBlbHNlIGlmICh0eXBlID09ICdIJykgewoJICAgIHdzbnByaW50ZjMyVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sIAoJCQkgeHRpbWUtPndIb3VyKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ20nICkgewoJICAgIHdzbnByaW50ZjMyVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sCgkJCSB4dGltZS0+d01pbnV0ZSk7CgkgfSBlbHNlIGlmICh0eXBlID09ICdzJyApIHsKCSAgICB3c25wcmludGYzMlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLAoJCQkgeHRpbWUtPndTZWNvbmQpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAndCcpIHsKCSAgICBHZXRMb2NhbGVJbmZvMzJXKGxvY2FsZSwgKHh0aW1lLT53SG91ciA8IDEyKSA/CgkJCSAgICAgTE9DQUxFX1MxMTU5IDogTE9DQUxFX1MyMzU5LAoJCQkgICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikgKTsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDEpIHsKCSAgICAgICBidWZbMV0gPSAwOwoJICAgIH0KfQoKCSAvKiBubyBtYXR0ZXIgd2hhdCBoYXBwZW5lZCwgIHdlIG5lZWQgdG8gY2hlY2sgdGhpcyBuZXh0IAoJICAgIGNoYXJhY3RlciB0aGUgbmV4dCB0aW1lIHdlIGxvb3AgdGhyb3VnaCAqLwoJIGlucG9zLS07CgoJIC8qIGNhdCBidWYgb250byB0aGUgb3V0cHV0ICovCgkgb3V0bGVuID0gbHN0cmxlbjMyVyhidWYpOwoJIGlmIChvdXRwb3MgKyBidWZsZW4gPCBvdXRsZW4pIHsKCSAgICBvdXRwdXRbb3V0cG9zXSA9IDA7ICAvKiBhICJob29rIiBmb3Igc3RyY2F0ICovCgkgICAgbHN0cmNhdDMyVyhvdXRwdXQsIGJ1Zik7CgkgICAgb3V0cG9zICs9IGJ1ZmxlbjsKCSB9IGVsc2UgewoJICAgIG91dHB1dFtvdXRwb3NdID0gMDsKCSAgICBsc3RyY2F0bjMyVyhvdXRwdXQsIGJ1Ziwgb3V0bGVuIC0gb3V0cG9zKTsKCSAgICBvdXRwdXRbb3V0bGVuIC0gMV0gPSAwOwoJICAgIE92ZXJmbG93ID0gMTsKCSAgICBicmVhazsgLyogQWJub3JtYWwgZXhpdCAqLwoJIH0KCgkgLyogcmVzZXQgdGhlIHZhcmlhYmxlcyB3ZSB1c2VkIHRoaXMgdGltZSAqLwoJIGNvdW50ID0gMDsKCSB0eXBlID0gJ1wwJzsKICAgICAgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09IDApIHsKCSAvKiB3ZSBjYW4ndCBjaGVjayBmb3IgdGhpcyBhdCB0aGUgYmVnaW5uaW5nLCAgYmVjYXVzZSB0aGF0IAoJIHdvdWxkIGtlZXAgdXMgZnJvbSBwcmludGluZyBhIGZvcm1hdCBzcGVjIHRoYXQgZW5kZWQgdGhlIAoJIHN0cmluZyAqLwoJIG91dHB1dFtvdXRwb3NdID0gMDsKCSBicmVhazsgIC8qICBOT1JNQUwgRVhJVCAgKi8KICAgICAgfSBlbHNlIGlmIChjb3VudCkgewoJIC8qIGhvdyB3ZSBrZWVwIHRyYWNrIG9mIHRoZSBtaWRkbGUgb2YgYSBmb3JtYXQgc3BlYyAqLwoJIGNvdW50Kys7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoIChkYXRldmFycyAmJiAoZm9ybWF0W2lucG9zXT09J2QnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nTScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSd5JyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J2cnKSAgKSB8fAoJCSAgKHRpbWV2YXJzICYmIChmb3JtYXRbaW5wb3NdPT0nSCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdoJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J20nIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0ncycgfHwKCQkJCWZvcm1hdFtpbnBvc109PSd0JykgKSAgICApIHsKCSB0eXBlID0gZm9ybWF0W2lucG9zXTsKCSBjb3VudCA9IDE7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgaW5xdW90ZSA9IDE7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSB7CgkgLyogdW5xdW90ZWQgbGl0ZXJhbHMgKi8KCSBvdXRwdXRbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsKICAgICAgfQogICB9CgogICBpZiAoT3ZlcmZsb3cpIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICBXQVJOKG9sZSwgIiBidWZmZXIgb3ZlcmZsb3dcbiIpOwogICB9OwoKICAgLyogZmluYWwgc3RyaW5nIHRlcm1pbmF0b3IgYW5kIHNhbml0eSBjaGVjayAqLwogICBvdXRwb3MrKzsKICAgaWYgKG91dHBvcyA+IG91dGxlbi0xKSBvdXRwb3MgPSBvdXRsZW4tMTsKICAgb3V0cHV0W291dHBvc10gPSAnMCc7CgogICBUUkFDRShvbGUsICIgcmV0dXJuaW5nICVzXG4iLCBkZWJ1Z3N0cl93KG91dHB1dCkpOwoJCiAgIHJldHVybiAoIU92ZXJmbG93KSA/IG91dGxlbiA6IDA7CiAgIAp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0RGF0ZUZvcm1hdDMyQQlbS0VSTkVMMzIuMzEwXQogKiBNYWtlcyBhbiBBU0NJSSBzdHJpbmcgb2YgdGhlIGRhdGUKICoKICogVGhpcyBmdW5jdGlvbiB1c2VzIGZvcm1hdCB0byBmb3JtYXQgdGhlIGRhdGUsICBvciwgIGlmIGZvcm1hdAogKiBpcyBOVUxMLCB1c2VzIHRoZSBkZWZhdWx0IGZvciB0aGUgbG9jYWxlLiAgZm9ybWF0IGlzIGEgc3RyaW5nCiAqIG9mIGxpdGVyYWwgZmllbGRzIGFuZCBjaGFyYWN0ZXJzIGFzIGZvbGxvd3M6CiAqCiAqIC0gZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICogLSBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogKiAtIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogKiAtIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAqIC0gTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICogLSBNTSAgIHR3by1kaWdpdCBtb250aAogKiAtIE1NTSAgc2hvcnQgbW9udGggbmFtZQogKiAtIE1NTU0gZnVsbCBtb250aCBuYW1lCiAqIC0geSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAqIC0geXkgICB0d28tZGlnaXQgeWVhcgogKiAtIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAqIC0gZ2cgICBlcmEgc3RyaW5nCiAqCiAqLwpJTlQzMiBXSU5BUEkgR2V0RGF0ZUZvcm1hdDMyQShMQ0lEIGxvY2FsZSxEV09SRCBmbGFncywKCQkJICAgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgICBMUENTVFIgZm9ybWF0LCBMUFNUUiBkYXRlLElOVDMyIGRhdGVsZW4pIAp7CiAgIAogIGNoYXIgZm9ybWF0X2J1Zls0MF07CiAgTFBDU1RSIHRoaXNmb3JtYXQ7CiAgU1lTVEVNVElNRSB0OwogIExQU1lTVEVNVElNRSB0aGlzdGltZTsKICBMQ0lEIHRoaXNsb2NhbGU7CiAgSU5UMzIgcmV0OwoKICBUUkFDRShvbGUsIigweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLAoJICAgICAgbG9jYWxlLGZsYWdzLHh0aW1lLGZvcm1hdCxkYXRlLGRhdGVsZW4pOwogIAogIGlmICghbG9jYWxlKSB7CiAgICAgbG9jYWxlID0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUOwogICAgIH07CiAgCiAgaWYgKGxvY2FsZSA9PSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQpIHsKICAgICB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICB9IGVsc2UgaWYgKGxvY2FsZSA9PSBMT0NBTEVfVVNFUl9ERUZBVUxUKSB7CiAgICAgdGhpc2xvY2FsZSA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwogIH0gZWxzZSB7CiAgICAgdGhpc2xvY2FsZSA9IGxvY2FsZTsKICAgfTsKCiAgaWYgKHh0aW1lID09IE5VTEwpIHsKICAgICBHZXRTeXN0ZW1UaW1lKCZ0KTsKICAgICB0aGlzdGltZSA9ICZ0OwogIH0gZWxzZSB7CiAgICAgdGhpc3RpbWUgPSB4dGltZTsKICB9OwoKICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKICAgICBHZXRMb2NhbGVJbmZvMzJBKHRoaXNsb2NhbGUsICgoZmxhZ3MmREFURV9MT05HREFURSkgCgkJCQkgICA/IExPQ0FMRV9TTE9OR0RBVEUKCQkJCSAgIDogTE9DQUxFX1NTSE9SVERBVEUpLAoJCSAgICAgIGZvcm1hdF9idWYsIHNpemVvZihmb3JtYXRfYnVmKSk7CiAgICAgdGhpc2Zvcm1hdCA9IGZvcm1hdF9idWY7CiAgfSBlbHNlIHsKICAgICB0aGlzZm9ybWF0ID0gZm9ybWF0OwogIH07CgogIAogIHJldCA9IE9MRV9HZXRGb3JtYXRBKHRoaXNsb2NhbGUsIGZsYWdzLCAwLCB0aGlzdGltZSwgdGhpc2Zvcm1hdCwgCgkJICAgICAgIGRhdGUsIGRhdGVsZW4pOwogIAoKICAgVFJBQ0Uob2xlLCAKCSAgICAgICAiR2V0RGF0ZUZvcm1hdDMyQSgpIHJldHVybmluZyAlZCwgd2l0aCBkYXRhPSVzXG4iLAoJICAgICAgIHJldCwgZGF0ZSk7CiAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0RGF0ZUZvcm1hdDMyVwlbS0VSTkVMMzIuMzExXQogKiBNYWtlcyBhIFVuaWNvZGUgc3RyaW5nIG9mIHRoZSBkYXRlCiAqCiAqIEFjdHMgdGhlIHNhbWUgYXMgR2V0RGF0ZUZvcm1hdDMyQSgpLCAgZXhjZXB0IHRoYXQgaXQncyBVbmljb2RlLgogKiBBY2NlcHRzICYgcmV0dXJucyBzaXplcyBhcyBjb3VudHMgb2YgVW5pY29kZSBjaGFyYWN0ZXJzLgogKgogKi8KSU5UMzIgV0lOQVBJIEdldERhdGVGb3JtYXQzMlcoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCgkJCSAgICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgICAgTFBDV1NUUiBmb3JtYXQsCgkJCSAgICAgIExQV1NUUiBkYXRlLCBJTlQzMiBkYXRlbGVuKQp7CiAgIHVuc2lnbmVkIHNob3J0IGRhdGVhcnJbXSA9IHsnMScsJzknLCc5JywnNCcsJy0nLCcxJywnLScsJzEnLDB9OwoKICAgRklYTUUob2xlLCAiU1RVQiAoc2hvdWxkIGNhbGwgT0xFX0dldEZvcm1hdFcpXG4iKTsgICAKICAgbHN0cmNweW4zMlcoZGF0ZSwgZGF0ZWFyciwgZGF0ZWxlbik7CiAgIHJldHVybiAoICBkYXRlbGVuIDwgOSkgPyBkYXRlbGVuIDogOTsKICAgCiAgIAp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0czMyQQkoS0VSTkVMMzIuMTk4KQogKi8KQk9PTDMyIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHMzMkEoCiAgREFURUZNVF9FTlVNUFJPQzMyQSBscERhdGVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsICBEV09SRCBkd0ZsYWdzKQp7CiAgRklYTUUob2xlLCAiT25seSBVUyBFbmdsaXNoIHN1cHBvcnRlZFxuIik7CgogIGlmKCFscERhdGVGbXRFbnVtUHJvYykKICAgIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTS9kL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNL2QveXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU0vZGQveXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NL2RkL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5L01NL2RkIikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC1NTU0teXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCwgTU1NTSBkZCwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NTU0gZGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLCBkZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQgTU1NTSwgeXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUob2xlLCAiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtRGF0ZUZvcm1hdHMzMlcJKEtFUk5FTDMyLjE5OSkKICovCkJPT0wzMiBXSU5BUEkgRW51bURhdGVGb3JtYXRzMzJXKAogIERBVEVGTVRfRU5VTVBST0MzMlcgbHBEYXRlRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQp7CiAgRklYTUUob2xlLCAiKCVwLCAlbGQsICVsZCk6IHN0dWJcbiIsIGxwRGF0ZUZtdEVudW1Qcm9jLCBMb2NhbGUsIGR3RmxhZ3MpOwogIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1UaW1lRm9ybWF0czMyQQkoS0VSTkVMMzIuMjEwKQogKi8KQk9PTDMyIFdJTkFQSSBFbnVtVGltZUZvcm1hdHMzMkEoCiAgVElNRUZNVF9FTlVNUFJPQzMyQSBscFRpbWVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCnsKICBGSVhNRShvbGUsICJPbmx5IFVTIEVuZ2xpc2ggc3VwcG9ydGVkXG4iKTsKCiAgaWYoIWxwVGltZUZtdEVudW1Qcm9jKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogIGlmKGR3RmxhZ3MpCiAgICB7CiAgICAgIEZJWE1FKG9sZSwgIlVua25vd24gdGltZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKICAgIH0KICAKICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKCiAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzMzJXCShLRVJORUwzMi4yMTEpCiAqLwpCT09MMzIgV0lOQVBJIEVudW1UaW1lRm9ybWF0czMyVygKICBUSU1FRk1UX0VOVU1QUk9DMzJXIGxwVGltZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FKG9sZSwgIiglcCwlbGQsJWxkKTogc3R1YiIsIGxwVGltZUZtdEVudW1Qcm9jLCBMb2NhbGUsIGR3RmxhZ3MpOwogIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldE51bWJlckZvcm1hdDMyQQkoS0VSTkVMMzIuMzU1KQogKi8KSU5UMzIgV0lOQVBJIEdldE51bWJlckZvcm1hdDMyQShMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1NUUiBscHZhbHVlLCAgIGNvbnN0IE5VTUJFUkZNVDMyQSAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hOdW1iZXIpCnsKIEZJWE1FKGZpbGUsIiVzOiBzdHViLCBubyByZWZvcm1hdGluZyBkb25lXG4iLGxwdmFsdWUpOwoKIGxzdHJjcHluMzJBKCBscE51bWJlclN0ciwgbHB2YWx1ZSwgY2NoTnVtYmVyICk7CiByZXR1cm4gY2NoTnVtYmVyPyBsc3RybGVuMzJBKCBscE51bWJlclN0ciApIDogMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldE51bWJlckZvcm1hdDMyVwkoS0VSTkVMMzIueHh4KQogKi8KSU5UMzIgV0lOQVBJIEdldE51bWJlckZvcm1hdDMyVyhMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1dTVFIgbHB2YWx1ZSwgIGNvbnN0IE5VTUJFUkZNVDMyVyAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBXU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoTnVtYmVyKQp7CiBGSVhNRShmaWxlLCIlczogc3R1Yiwgbm8gcmVmb3JtYXRpbmcgZG9uZVxuIixkZWJ1Z3N0cl93KGxwdmFsdWUpKTsKCiBsc3RyY3B5bjMyVyggbHBOdW1iZXJTdHIsIGxwdmFsdWUsIGNjaE51bWJlciApOwogcmV0dXJuIGNjaE51bWJlcj8gbHN0cmxlbjMyVyggbHBOdW1iZXJTdHIgKSA6IDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJT0xFMk5MU19DaGVja0xvY2FsZQlbaW50ZXJuXQogKi8gCnN0YXRpYyBMQ0lEIE9MRTJOTFNfQ2hlY2tMb2NhbGUgKExDSUQgbG9jYWxlKQp7CglpZiAoIWxvY2FsZSkgCgl7IGxvY2FsZSA9IExPQ0FMRV9TWVNURU1fREVGQVVMVDsKCX0KICAKCWlmIChsb2NhbGUgPT0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUKSAKICAJeyByZXR1cm4gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKCX0gCgllbHNlIGlmIChsb2NhbGUgPT0gTE9DQUxFX1VTRVJfREVGQVVMVCkgCgl7IHJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCX0KCWVsc2UKCXsgcmV0dXJuIGxvY2FsZTsKCX0KfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0MzJBCVtLRVJORUwzMi40MjJdCiAqIE1ha2VzIGFuIEFTQ0lJIHN0cmluZyBvZiB0aGUgdGltZQogKgogKiBGb3JtYXRzIGRhdGUgYWNjb3JkaW5nIHRvIGZvcm1hdCwgIG9yIGxvY2FsZSBkZWZhdWx0IGlmIGZvcm1hdCBpcwogKiBOVUxMLiBUaGUgZm9ybWF0IGNvbnNpc3RzIG9mIGxpdGVyYWwgY2hhcmFjdGVycyBhbmQgZmllbGRzIGFzIGZvbGxvd3M6CiAqCiAqIGggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgxMi1ob3VyKQogKiBoaCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBIICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICogSEggaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogbSAgbWludXRlcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBtbSBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHMgIHNlY29uZHMgd2l0aCBubyBsZWFkaW5nIHplcm8KICogc3Mgc2Vjb25kcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiB0ICB0aW1lIG1hcmtlciAoQSBvciBQKQogKiB0dCB0aW1lIG1hcmtlciAoQU0sIFBNKQogKgogKi8KSU5UMzIgV0lOQVBJIApHZXRUaW1lRm9ybWF0MzJBKExDSUQgbG9jYWxlLCAgICAgICAgLyogaW4gICovCgkJIERXT1JEIGZsYWdzLCAgICAgICAgLyogaW4gICovCgkJIExQU1lTVEVNVElNRSB4dGltZSwgLyogaW4gICovIAoJCSBMUENTVFIgZm9ybWF0LCAgICAgIC8qIGluICAqLwoJCSBMUFNUUiB0aW1lc3RyLCAgICAgIC8qIG91dCAqLwoJCSBJTlQzMiB0aW1lbGVuICAgICAgIC8qIGluICAqLykgCnsgY2hhciBmb3JtYXRfYnVmWzQwXTsKICBMUENTVFIgdGhpc2Zvcm1hdDsKICBTWVNURU1USU1FIHQ7CiAgTFBTWVNURU1USU1FIHRoaXN0aW1lOwogIExDSUQgdGhpc2xvY2FsZT0wOwogIERXT1JEIHRoaXNmbGFncz1MT0NBTEVfU1RJTUVGT1JNQVQ7IC8qIHN0YW5kYXJ0IHRpbWVmb3JtYXQgKi8KICBJTlQzMiByZXQ7CiAgICAKICBUUkFDRShvbGUsIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIixsb2NhbGUsZmxhZ3MseHRpbWUsZm9ybWF0LHRpbWVzdHIsdGltZWxlbik7CgogIHRoaXNsb2NhbGUgPSBPTEUyTkxTX0NoZWNrTG9jYWxlICggbG9jYWxlICk7CgogIGlmICggZmxhZ3MgJiAoVElNRV9OT1RJTUVNQVJLRVIgfCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUICkpCiAgeyBGSVhNRShvbGUsIlRJTUVfTk9USU1FTUFSS0VSIG9yIFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQgbm90IGltcGxlbWVudGVkXG4iKTsKICB9CiAgCiAgZmxhZ3MgJj0gKFRJTUVfTk9TRUNPTkRTIHwgVElNRV9OT01JTlVURVNPUlNFQ09ORFMpOyAvKiBtYXNrIGZvciBPTEVfR2V0Rm9ybWF0QSovCgogIGlmIChmb3JtYXQgPT0gTlVMTCkgCiAgeyBpZiAoZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpICAvKnVzZSBzeXN0ZW0gZGVmYXVsdCovCiAgICB7IHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogICAgfQogICAgR2V0TG9jYWxlSW5mbzMyQSh0aGlzbG9jYWxlLCB0aGlzZmxhZ3MsIGZvcm1hdF9idWYsIHNpemVvZihmb3JtYXRfYnVmKSk7CiAgICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICB9CiAgZWxzZSAKICB7IHRoaXNmb3JtYXQgPSBmb3JtYXQ7CiAgfQogIAogIGlmICh4dGltZSA9PSBOVUxMKSAvKiBOVUxMIG1lYW5zIHVzZSB0aGUgY3VycmVudCBsb2NhbCB0aW1lKi8KICB7IEdldFN5c3RlbVRpbWUoJnQpOwogICAgdGhpc3RpbWUgPSAmdDsKICB9IAogIGVsc2UKICB7IHRoaXN0aW1lID0geHRpbWU7CiAgfQogIHJldCA9IE9MRV9HZXRGb3JtYXRBKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZmxhZ3MsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LAogIAkJCSB0aW1lc3RyLCB0aW1lbGVuKTsKICByZXR1cm4gcmV0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0VGltZUZvcm1hdDMyVwlbS0VSTkVMMzIuNDIzXQogKiBNYWtlcyBhIFVuaWNvZGUgc3RyaW5nIG9mIHRoZSB0aW1lCiAqLwpJTlQzMiBXSU5BUEkgCkdldFRpbWVGb3JtYXQzMlcoTENJRCBsb2NhbGUsICAgICAgICAvKiBpbiAgKi8KCQkgRFdPUkQgZmxhZ3MsICAgICAgICAvKiBpbiAgKi8KCQkgTFBTWVNURU1USU1FIHh0aW1lLCAvKiBpbiAgKi8gCgkJIExQQ1dTVFIgZm9ybWF0LCAgICAgLyogaW4gICovCgkJIExQV1NUUiB0aW1lc3RyLCAgICAgLyogb3V0ICovCgkJIElOVDMyIHRpbWVsZW4gICAgICAgLyogaW4gICovKSAKewlXQ0hBUiBmb3JtYXRfYnVmWzQwXTsKCUxQQ1dTVFIgdGhpc2Zvcm1hdDsKCVNZU1RFTVRJTUUgdDsKCUxQU1lTVEVNVElNRSB0aGlzdGltZTsKCUxDSUQgdGhpc2xvY2FsZT0wOwoJRFdPUkQgdGhpc2ZsYWdzPUxPQ0FMRV9TVElNRUZPUk1BVDsgLyogc3RhbmRhcnQgdGltZWZvcm1hdCAqLwoJSU5UMzIgcmV0OwoJICAgIAoJVFJBQ0Uob2xlLCJHZXRUaW1lRm9ybWF0KDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsbG9jYWxlLGZsYWdzLAoJeHRpbWUsZGVidWdzdHJfdyhmb3JtYXQpLHRpbWVzdHIsdGltZWxlbik7CgoJdGhpc2xvY2FsZSA9IE9MRTJOTFNfQ2hlY2tMb2NhbGUgKCBsb2NhbGUgKTsKCglpZiAoIGZsYWdzICYgKFRJTUVfTk9USU1FTUFSS0VSIHwgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCApKQoJeyBGSVhNRShvbGUsIlRJTUVfTk9USU1FTUFSS0VSIG9yIFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQgbm90IGltcGxlbWVudGVkXG4iKTsKCX0KICAKCWZsYWdzICY9IChUSU1FX05PU0VDT05EUyB8IFRJTUVfTk9NSU5VVEVTT1JTRUNPTkRTKTsgLyogbWFzayBmb3IgT0xFX0dldEZvcm1hdEEqLwoKCWlmIChmb3JtYXQgPT0gTlVMTCkgCgl7IGlmIChmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkgIC8qdXNlIHN5c3RlbSBkZWZhdWx0Ki8KCSAgeyB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKCSAgfQoJICBHZXRMb2NhbGVJbmZvMzJXKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZm9ybWF0X2J1ZiwgNDApOwoJICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKCX0JICAKCWVsc2UgCgl7IHRoaXNmb3JtYXQgPSBmb3JtYXQ7Cgl9CiAKCWlmICh4dGltZSA9PSBOVUxMKSAvKiBOVUxMIG1lYW5zIHVzZSB0aGUgY3VycmVudCBsb2NhbCB0aW1lKi8KCXsgR2V0U3lzdGVtVGltZSgmdCk7CgkgIHRoaXN0aW1lID0gJnQ7Cgl9IAoJZWxzZQoJeyB0aGlzdGltZSA9IHh0aW1lOwoJfQoKCXJldCA9IE9MRV9HZXRGb3JtYXRXKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZmxhZ3MsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LAogIAkJCSB0aW1lc3RyLCB0aW1lbGVuKTsKCXJldHVybiByZXQ7Cn0K