LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAib3B0aW9ucy5oIgojaW5jbHVkZSAid2ludmVyLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKI2luY2x1ZGUgImNydGRsbC5oIgojaW5jbHVkZSAibWFpbi5oIgoKREVDTEFSRV9ERUJVR19DSEFOTkVMKGZpbGUpCkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChvbGUpCkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChzdHJpbmcpCkRFQ0xBUkVfREVCVUdfQ0hBTk5FTCh3aW4zMikKCnN0cnVjdCBOTFNfbGFuZ2xvY2FsZSB7Cgljb25zdCBpbnQgbGFuZzsKCXN0cnVjdCBOTFNfbG9jYWxldmFyIHsKCQljb25zdCBpbnQJdHlwZTsKCQljb25zdCBjaGFyCSp2YWw7Cgl9IGxvY3ZhcnNbMTUwXTsKfTsKCiNkZWZpbmUgTEFOR19CRUdJTihsLHMpCXsJTUFLRUxBTkdJRChsLHMpLCB7CgojZGVmaW5lIExPQ1ZBTCh0eXBlLHZhbHVlKQkJCQkJe3R5cGUsdmFsdWV9LAoKI2RlZmluZSBMQU5HX0VORAkJCQkJIH19LAoKc3RhdGljIGNvbnN0IHN0cnVjdCBOTFNfbGFuZ2xvY2FsZSBsYW5nbG9jYWxlc1tdID0gewovKiBhZGQgbGFuZ3VhZ2VzIGluIG51bWVyaWNhbCBvcmRlciBvZiBtYWluIGxhbmd1YWdlIChsYXN0IHR3byBkaWdpdHMpCiAqIGl0IGlzIG11Y2ggZWFzaWVyIHRvIGZpbmQgdGhlIG1pc3NpbmcgaG9sZXMgdGhhdCB3YXkgKi8KCkxBTkdfQkVHSU4gKExBTkdfQ0FUQUxBTiwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwMyovCiNpbmNsdWRlICJubHMvY2F0Lm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfQ1pFQ0gsIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MDUqLwojaW5jbHVkZSAibmxzL2N6ZS5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0RBTklTSCwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwNiovCiNpbmNsdWRlICJubHMvZGFuLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfR0VSTUFOLCBTVUJMQU5HX0dFUk1BTikJCS8qMHgwNDA3Ki8KI2luY2x1ZGUgIm5scy9kZXUubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU5fU1dJU1MpCQkvKjB4MDgwNyovCiNpbmNsdWRlICJubHMvZGVzLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19HRVJNQU4sIFNVQkxBTkdfR0VSTUFOX0FVU1RSSUFOKQkvKjB4MEMwNyovCiNpbmNsdWRlICJubHMvZGVhLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19HRVJNQU4sIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkcpCS8qMHgxMDA3Ki8KI2luY2x1ZGUgIm5scy9kZWwubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTikJLyoweDE0MDcqLwojaW5jbHVkZSAibmxzL2RlYy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUykJCS8qMHgwNDA5Ki8KI2luY2x1ZGUgIm5scy9lbnUubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VSykJCS8qMHgwODA5Ki8KI2luY2x1ZGUgIm5scy9lbmcubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9BVVMpCQkvKjB4MEMwOSovCiNpbmNsdWRlICJubHMvZW5hLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfQ0FOKQkJLyoweDEwMDkqLwojaW5jbHVkZSAibmxzL2VuYy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX05aKQkJLyoweDE0MDkqLwojaW5jbHVkZSAibmxzL2Vuei5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0VJUkUpCQkvKjB4MTgwOSovCiNpbmNsdWRlICJubHMvaXJsLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfU0FGUklDQSkJLyoweDFDMDkqLwojaW5jbHVkZSAibmxzL2Vucy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0pBTUFJQ0EpCS8qMHgyMDA5Ki8KI2luY2x1ZGUgIm5scy9lbmoubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9DQVJSSUJFQU4pCS8qMHgyNDA5Ki8KI2luY2x1ZGUgIm5scy9lbmIubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9CRUxJWkUpCS8qMHgyODA5Ki8KI2luY2x1ZGUgIm5scy9lbmwubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9UUklOSURBRCkgICAgCS8qMHgyQzA5Ki8KI2luY2x1ZGUgIm5scy9lbnQubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0gpCQkvKjB4MDQwYSovCiNpbmNsdWRlICJubHMvZXNwLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfTUVYSUNBTikJLyoweDA4MGEqLwojaW5jbHVkZSAibmxzL2VzbS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX01PREVSTikJLyoweDBDMGEqLwojaW5jbHVkZSAibmxzL2Vzbi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0dVQVRFTUFMQSkJLyoweDEwMGEqLwojaW5jbHVkZSAibmxzL2VzZy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0NPU1RBUklDQSkJLyoweDE0MGEqLwojaW5jbHVkZSAibmxzL2VzYy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1BBTkFNQSkJLyoweDE4MGEqLwojaW5jbHVkZSAibmxzL2VzYS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0RPTUlOSUNBTikJLyoweDFDMEEqLwojaW5jbHVkZSAibmxzL2VzZC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1ZFTkVaVUVMQSkJLyoweDIwMGEqLwojaW5jbHVkZSAibmxzL2Vzdi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0NPTE9NQklBKQkvKjB4MjQwYSovCiNpbmNsdWRlICJubHMvZXNvLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfUEVSVSkJCS8qMHgyODBhKi8KI2luY2x1ZGUgIm5scy9lc3IubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9BUkdFTlRJTkEpCS8qMHgyYzBhKi8KI2luY2x1ZGUgIm5scy9lc3MubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9FQ1VBRE9SKQkvKjB4MzAwYSovCiNpbmNsdWRlICJubHMvZXNmLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfQ0hJTEUpCS8qMHgzNDBhKi8KI2luY2x1ZGUgIm5scy9lc2wubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZKQkvKjB4MzgwYSovCiNpbmNsdWRlICJubHMvZXN5Lm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfUEFSQUdVQVkpCS8qMHgzYzBhKi8KI2luY2x1ZGUgIm5scy9lc3oubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9CT0xJVklBKQkvKjB4NDAwYSovCiNpbmNsdWRlICJubHMvZXNiLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfRUxfU0FMVkFET1IpCS8qMHg0NDBhKi8KI2luY2x1ZGUgIm5scy9lc2UubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9IT05EVVJBUykJLyoweDQ4MGEqLwojaW5jbHVkZSAibmxzL2VzaC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX05JQ0FSQUdVQSkJLyoweDRjMGEqLwojaW5jbHVkZSAibmxzL2VzaS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1BVRVJUT19SSUNPKQkvKjB4NTAwYSovCiNpbmNsdWRlICJubHMvZXN1Lm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfRklOTklTSCwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwQiovCiNpbmNsdWRlICJubHMvZmluLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSCkJCS8qMHgwNDBDKi8KI2luY2x1ZGUgIm5scy9mcmEubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0ZSRU5DSCwgU1VCTEFOR19GUkVOQ0hfQkVMR0lBTikJLyoweDA4MEMqLwojaW5jbHVkZSAibmxzL2ZyYi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSF9DQU5BRElBTikJLyoweDBDMEMqLwojaW5jbHVkZSAibmxzL2ZyYy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSF9TV0lTUykJCS8qMHgxMDBDKi8KI2luY2x1ZGUgIm5scy9mcnMubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0ZSRU5DSCwgU1VCTEFOR19GUkVOQ0hfTFVYRU1CT1VSRykJLyoweDE0MEMqLwojaW5jbHVkZSAibmxzL2ZybC5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0hVTkdBUklBTiwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwZSovCiNpbmNsdWRlICJubHMvaHVuLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfSVRBTElBTiwgU1VCTEFOR19JVEFMSUFOKQkJLyoweDA0MTAqLwojaW5jbHVkZSAibmxzL2l0YS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfSVRBTElBTiwgU1VCTEFOR19JVEFMSUFOX1NXSVNTKQkvKjB4MDgxMCovCiNpbmNsdWRlICJubHMvaXRzLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfS09SRUFOLCBTVUJMQU5HX0tPUkVBTikJLyoweDA0MTIqLwojaW5jbHVkZSAibmxzL2tvci5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0RVVENILCBTVUJMQU5HX0RVVENIKQkJLyoweDA0MTMqLwojaW5jbHVkZSAibmxzL25sZC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRFVUQ0gsIFNVQkxBTkdfRFVUQ0hfQkVMR0lBTikJLyoweDA4MTMqLwojaW5jbHVkZSAibmxzL25sYi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRFVUQ0gsIFNVQkxBTkdfRFVUQ0hfU1VSSU5BTSkJLyoweDBDMTMqLwojaW5jbHVkZSAibmxzL25scy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX05PUldFR0lBTiwgU1VCTEFOR19OT1JXRUdJQU5fQk9LTUFMKQkvKjB4MDQxNCovCiNpbmNsdWRlICJubHMvbm9yLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19OT1JXRUdJQU4sIFNVQkxBTkdfTk9SV0VHSUFOX05ZTk9SU0spCS8qMHgwODE0Ki8KI2luY2x1ZGUgIm5scy9ub24ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19QT0xJU0gsIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MTUqLwojaW5jbHVkZSAibmxzL3Bsay5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1BPUlRVR1VFU0UgLFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4pCS8qMHgwNDE2Ki8KI2luY2x1ZGUgIm5scy9wdGIubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1BPUlRVR1VFU0UgLFNVQkxBTkdfUE9SVFVHVUVTRSkJCS8qMHgwODE2Ki8KI2luY2x1ZGUgIm5scy9wdGcubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19SVVNTSUFOLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHg0MTkqLwojaW5jbHVkZSAibmxzL3J1cy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1NMT1ZBSywgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQxYiovCiNpbmNsdWRlICJubHMvc2t5Lm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfU1dFRElTSCwgU1VCTEFOR19TV0VESVNIKQkJLyoweDA0MWQqLwojaW5jbHVkZSAibmxzL3N2ZS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1dFRElTSCwgU1VCTEFOR19TV0VESVNIX0ZJTkxBTkQpCS8qMHgwODFkKi8KI2luY2x1ZGUgIm5scy9zdmYubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19USEFJLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHg0MWUqLwojaW5jbHVkZSAibmxzL3RoYS5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0VTUEVSQU5UTywgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQ4ZiovCiNpbmNsdWRlICJubHMvZXNwZXJhbnRvLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfV0FMT04sIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0OTAqLwojaW5jbHVkZSAibmxzL3dhbC5ubHMiCkxBTkdfRU5ECgkgICAgfTsKCgovKiBMb2NhbGUgbmFtZSB0byBpZCBtYXAuIHVzZWQgYnkgRW51bVN5c3RlbUxvY2FsZXMsIEdldExvY2FsSW5mb0EgCiAqIE1VU1QgY29udGFpbiBhbGwgI2RlZmluZXMgZnJvbSB3aW5ubHMuaAogKiBsYXN0IGVudHJ5IGhhcyBOVUxMIG5hbWUsIDAgaWQuCiAqLyAKI2RlZmluZSBMT0NBTEVfRU5UUlkoeCkJeyN4LExPQ0FMRV8jI3h9CnN0YXRpYyBzdHJ1Y3QgdGFnTE9DQUxFX05BTUUySUQgewoJY2hhcgkqbmFtZTsKCURXT1JECWlkOwp9IGxvY2FsZV9uYW1lMmlkW109IHsKCUxPQ0FMRV9FTlRSWShJTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0VOR0xBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTEFOR05BTUUpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoSUNPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTRU5HQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkNUUllOQU1FKSwKCUxPQ0FMRV9FTlRSWShTTkFUSVZFQ1RSWU5BTUUpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRBTlNJQ09ERVBBR0UpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUTUFDQ09ERVBBR0UpLAoJTE9DQUxFX0VOVFJZKFNMSVNUKSwKCUxPQ0FMRV9FTlRSWShJTUVBU1VSRSksCglMT0NBTEVfRU5UUlkoU0RFQ0lNQUwpLAoJTE9DQUxFX0VOVFJZKFNUSE9VU0FORCksCglMT0NBTEVfRU5UUlkoU0dST1VQSU5HKSwKCUxPQ0FMRV9FTlRSWShJRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElORUdOVU1CRVIpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVESUdJVFMpLAoJTE9DQUxFX0VOVFJZKFNDVVJSRU5DWSksCglMT0NBTEVfRU5UUlkoU0lOVExTWU1CT0wpLAoJTE9DQUxFX0VOVFJZKFNNT05ERUNJTUFMU0VQKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhPVVNBTkRTRVApLAoJTE9DQUxFX0VOVFJZKFNNT05HUk9VUElORyksCglMT0NBTEVfRU5UUlkoSUNVUlJESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElJTlRMQ1VSUkRJR0lUUyksCglMT0NBTEVfRU5UUlkoSUNVUlJFTkNZKSwKCUxPQ0FMRV9FTlRSWShJTkVHQ1VSUiksCglMT0NBTEVfRU5UUlkoU0RBVEUpLAoJTE9DQUxFX0VOVFJZKFNUSU1FKSwKCUxPQ0FMRV9FTlRSWShTU0hPUlREQVRFKSwKCUxPQ0FMRV9FTlRSWShTTE9OR0RBVEUpLAoJTE9DQUxFX0VOVFJZKFNUSU1FRk9STUFUKSwKCUxPQ0FMRV9FTlRSWShJREFURSksCglMT0NBTEVfRU5UUlkoSUxEQVRFKSwKCUxPQ0FMRV9FTlRSWShJVElNRSksCglMT0NBTEVfRU5UUlkoSVRJTUVNQVJLUE9TTiksCglMT0NBTEVfRU5UUlkoSUNFTlRVUlkpLAoJTE9DQUxFX0VOVFJZKElUTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElEQVlMWkVSTyksCglMT0NBTEVfRU5UUlkoSU1PTkxaRVJPKSwKCUxPQ0FMRV9FTlRSWShTMTE1OSksCglMT0NBTEVfRU5UUlkoUzIzNTkpLAoJTE9DQUxFX0VOVFJZKElDQUxFTkRBUlRZUEUpLAoJTE9DQUxFX0VOVFJZKElPUFRJT05BTENBTEVOREFSKSwKCUxPQ0FMRV9FTlRSWShJRklSU1REQVlPRldFRUspLAoJTE9DQUxFX0VOVFJZKElGSVJTVFdFRUtPRllFQVIpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMSksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNCksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNyksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTgpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU5KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTApLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEyKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FOCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTkpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTExKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMyksCglMT0NBTEVfRU5UUlkoU1BPU0lUSVZFU0lHTiksCglMT0NBTEVfRU5UUlkoU05FR0FUSVZFU0lHTiksCglMT0NBTEVfRU5UUlkoSVBPU1NJR05QT1NOKSwKCUxPQ0FMRV9FTlRSWShJTkVHU0lHTlBPU04pLAoJTE9DQUxFX0VOVFJZKElQT1NTWU1QUkVDRURFUyksCglMT0NBTEVfRU5UUlkoSVBPU1NFUEJZU1BBQ0UpLAoJTE9DQUxFX0VOVFJZKElORUdTWU1QUkVDRURFUyksCglMT0NBTEVfRU5UUlkoSU5FR1NFUEJZU1BBQ0UpLAoJTE9DQUxFX0VOVFJZKEZPTlRTSUdOQVRVUkUpLAoJTE9DQUxFX0VOVFJZKFNJU082MzlMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoU0lTTzMxNjZDVFJZTkFNRSksCgl7TlVMTCwwfSwKfTsKCmNvbnN0IHN0cnVjdCBtYXBfbGNpZDJzdHIgewoJTENJRAkJbGFuZ2lkOwoJY29uc3QgY2hhcgkqbGFuZ25hbWU7Cn0gbGFuZ3VhZ2VzW109ewoJezB4MDQwMSwiQXJhYmljIChTYXVkaSBBcmFiaWEpIn0sCgl7MHgwODAxLCJBcmFiaWMgKElyYXEpIn0sCgl7MHgwYzAxLCJBcmFiaWMgKEVneXB0KSJ9LAoJezB4MTAwMSwiQXJhYmljIChMaWJ5YSkifSwKCXsweDE0MDEsIkFyYWJpYyAoQWxnZXJpYSkifSwKCXsweDE4MDEsIkFyYWJpYyAoTW9yb2NjbykifSwKCXsweDFjMDEsIkFyYWJpYyAoVHVuaXNpYSkifSwKCXsweDIwMDEsIkFyYWJpYyAoT21hbikifSwKCXsweDI0MDEsIkFyYWJpYyAoWWVtZW4pIn0sCgl7MHgyODAxLCJBcmFiaWMgKFN5cmlhKSJ9LAoJezB4MmMwMSwiQXJhYmljIChKb3JkYW4pIn0sCgl7MHgzMDAxLCJBcmFiaWMgKExlYmFub24pIn0sCgl7MHgzNDAxLCJBcmFiaWMgKEt1d2FpdCkifSwKCXsweDM4MDEsIkFyYWJpYyAoVW5pdGVkIEFyYWIgRW1pcmF0ZXMpIn0sCgl7MHgzYzAxLCJBcmFiaWMgKEJhaHJhaW4pIn0sCgl7MHg0MDAxLCJBcmFiaWMgKFFhdGFyKSJ9LAoJezB4MDQwMiwiQnVsZ2FyaWFuIn0sCgl7MHgwNDAzLCJDYXRhbGFuIn0sCgl7MHgwNDA0LCJDaGluZXNlIChUYWl3YW4pIn0sCgl7MHgwODA0LCJDaGluZXNlIChQZW9wbGUncyBSZXB1YmxpYyBvZiBDaGluYSkifSwKCXsweDBjMDQsIkNoaW5lc2UgKEhvbmcgS29uZykifSwKCXsweDEwMDQsIkNoaW5lc2UgKFNpbmdhcG9yZSkifSwKCXsweDE0MDQsIkNoaW5lc2UgKE1hY2F1KSJ9LAoJezB4MDQwNSwiQ3plY2gifSwKCXsweDA0MDYsIkRhbmlzaCJ9LAoJezB4MDQwNywiR2VybWFuIChHZXJtYW55KSJ9LAoJezB4MDgwNywiR2VybWFuIChTd2l0emVybGFuZCkifSwKCXsweDBjMDcsIkdlcm1hbiAoQXVzdHJpYSkifSwKCXsweDEwMDcsIkdlcm1hbiAoTHV4ZW1ib3VyZykifSwKCXsweDE0MDcsIkdlcm1hbiAoTGllY2h0ZW5zdGVpbikifSwKCXsweDA0MDgsIkdyZWVrIn0sCgl7MHgwNDA5LCJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSJ9LAoJezB4MDgwOSwiRW5nbGlzaCAoVW5pdGVkIEtpbmdkb20pIn0sCgl7MHgwYzA5LCJFbmdsaXNoIChBdXN0cmFsaWEpIn0sCgl7MHgxMDA5LCJFbmdsaXNoIChDYW5hZGEpIn0sCgl7MHgxNDA5LCJFbmdsaXNoIChOZXcgWmVhbGFuZCkifSwKCXsweDE4MDksIkVuZ2xpc2ggKElyZWxhbmQpIn0sCgl7MHgxYzA5LCJFbmdsaXNoIChTb3V0aCBBZnJpY2EpIn0sCgl7MHgyMDA5LCJFbmdsaXNoIChKYW1haWNhKSJ9LAoJezB4MjQwOSwiRW5nbGlzaCAoQ2FyaWJiZWFuKSJ9LAoJezB4MjgwOSwiRW5nbGlzaCAoQmVsaXplKSJ9LAoJezB4MmMwOSwiRW5nbGlzaCAoVHJpbmlkYWQpIn0sCgl7MHgzMDA5LCJFbmdsaXNoIChaaW1iYWJ3ZSkifSwKCXsweDM0MDksIkVuZ2xpc2ggKFBoaWxpcHBpbmVzKSJ9LAoJezB4MDQwYSwiU3BhbmlzaCAoU3BhaW4sIHRyYWRpdGlvbmFsIHNvcnRpbmcpIn0sCgl7MHgwODBhLCJTcGFuaXNoIChNZXhpY28pIn0sCgl7MHgwYzBhLCJTcGFuaXNoIChTcGFpbiwgaW50ZXJuYXRpb25hbCBzb3J0aW5nKSJ9LAoJezB4MTAwYSwiU3BhbmlzaCAoR3VhdGVtYWxhKSJ9LAoJezB4MTQwYSwiU3BhbmlzaCAoQ29zdGEgUmljYSkifSwKCXsweDE4MGEsIlNwYW5pc2ggKFBhbmFtYSkifSwKCXsweDFjMGEsIlNwYW5pc2ggKERvbWluaWNhbiBSZXB1YmxpYykifSwKCXsweDIwMGEsIlNwYW5pc2ggKFZlbmV6dWVsYSkifSwKCXsweDI0MGEsIlNwYW5pc2ggKENvbG9tYmlhKSJ9LAoJezB4MjgwYSwiU3BhbmlzaCAoUGVydSkifSwKCXsweDJjMGEsIlNwYW5pc2ggKEFyZ2VudGluYSkifSwKCXsweDMwMGEsIlNwYW5pc2ggKEVjdWFkb3IpIn0sCgl7MHgzNDBhLCJTcGFuaXNoIChDaGlsZSkifSwKCXsweDM4MGEsIlNwYW5pc2ggKFVydWd1YXkpIn0sCgl7MHgzYzBhLCJTcGFuaXNoIChQYXJhZ3VheSkifSwKCXsweDQwMGEsIlNwYW5pc2ggKEJvbGl2aWEpIn0sCgl7MHg0NDBhLCJTcGFuaXNoIChFbCBTYWx2YWRvcikifSwKCXsweDQ4MGEsIlNwYW5pc2ggKEhvbmR1cmFzKSJ9LAoJezB4NGMwYSwiU3BhbmlzaCAoTmljYXJhZ3VhKSJ9LAoJezB4NTAwYSwiU3BhbmlzaCAoUHVlcnRvIFJpY28pIn0sCgl7MHgwNDBiLCJGaW5uaXNoIn0sCgl7MHgwNDBjLCJGcmVuY2ggKEZyYW5jZSkifSwKCXsweDA4MGMsIkZyZW5jaCAoQmVsZ2l1bSkifSwKCXsweDBjMGMsIkZyZW5jaCAoQ2FuYWRhKSJ9LAoJezB4MTAwYywiRnJlbmNoIChTd2l0emVybGFuZCkifSwKCXsweDE0MGMsIkZyZW5jaCAoTHV4ZW1ib3VyZykifSwKCXsweDE4MGMsIkZyZW5jaCAoTW9uYWNvKSJ9LAoJezB4MDQwZCwiSGVicmV3In0sCgl7MHgwNDBlLCJIdW5nYXJpYW4ifSwKCXsweDA0MGYsIkljZWxhbmRpYyJ9LAoJezB4MDQxMCwiSXRhbGlhbiAoSXRhbHkpIn0sCgl7MHgwODEwLCJJdGFsaWFuIChTd2l0emVybGFuZCkifSwKCXsweDA0MTEsIkphcGFuZXNlIn0sCgl7MHgwNDEyLCJLb3JlYW4gKFdhbnN1bmcpIn0sCgl7MHgwODEyLCJLb3JlYW4gKEpvaGFiKSJ9LAoJezB4MDQxMywiRHV0Y2ggKE5ldGhlcmxhbmRzKSJ9LAoJezB4MDgxMywiRHV0Y2ggKEJlbGdpdW0pIn0sCgl7MHgwNDE0LCJOb3J3ZWdpYW4gKEJva21hbCkifSwKCXsweDA4MTQsIk5vcndlZ2lhbiAoTnlub3JzaykifSwKCXsweDA0MTUsIlBvbGlzaCJ9LAoJezB4MDQxNiwiUG9ydHVndWVzZSAoQnJhemlsKSJ9LAoJezB4MDgxNiwiUG9ydHVndWVzZSAoUG9ydHVnYWwpIn0sCgl7MHgwNDE3LCJSaGFldG8gUm9tYW5pYyJ9LAoJezB4MDQxOCwiUm9tYW5pYW4ifSwKCXsweDA4MTgsIk1vbGRhdmlhbiJ9LAoJezB4MDQxOSwiUnVzc2lhbiAoUnVzc2lhKSJ9LAoJezB4MDgxOSwiUnVzc2lhbiAoTW9sZGF2aWEpIn0sCgl7MHgwNDFhLCJDcm9hdGlhbiJ9LAoJezB4MDgxYSwiU2VyYmlhbiAobGF0aW4pIn0sCgl7MHgwYzFhLCJTZXJiaWFuIChjeXJpbGxpYykifSwKCXsweDA0MWIsIlNsb3ZhayJ9LAoJezB4MDQxYywiQWxiYW5pYW4ifSwKCXsweDA0MWQsIlN3ZWRpc2ggKFN3ZWRlbikifSwKCXsweDA4MWQsIlN3ZWRpc2ggKEZpbmxhbmQpIn0sCgl7MHgwNDFlLCJUaGFpIn0sCgl7MHgwNDFmLCJUdXJraXNoIn0sCgl7MHgwNDIwLCJVcmR1In0sCgl7MHgwNDIxLCJJbmRvbmVzaWFuIn0sCgl7MHgwNDIyLCJVa3JhaW5pYW4ifSwKCXsweDA0MjMsIkJlbGFydXNpYW4ifSwKCXsweDA0MjQsIlNsb3ZlbmUifSwKCXsweDA0MjUsIkVzdG9uaWFuIn0sCgl7MHgwNDI2LCJMYXR2aWFuIn0sCgl7MHgwNDI3LCJMaXRodWFuaWFuIChtb2Rlcm4pIn0sCgl7MHgwODI3LCJMaXRodWFuaWFuIChjbGFzc2ljKSJ9LAoJezB4MDQyOCwiTWFvcmkifSwKCXsweDA0MjksIkZhcnNpIn0sCgl7MHgwNDJhLCJWaWV0bmFtZXNlIn0sCgl7MHgwNDJiLCJBcm1lbmlhbiJ9LAoJezB4MDQyYywiQXplcmkgKGxhdGluKSJ9LAoJezB4MDgyYywiQXplcmkgKGN5cmlsbGljKSJ9LAoJezB4MDQyZCwiQmFzcXVlIn0sCgl7MHgwNDJlLCJTb3JiaWFuIn0sCgl7MHgwNDJmLCJNYWNlZG9uaWFuIn0sCgl7MHgwNDMwLCJTdXR1In0sCgl7MHgwNDMxLCJUc29uZ2EifSwKCXsweDA0MzIsIlRzd2FuYSJ9LAoJezB4MDQzMywiVmVuZGEifSwKCXsweDA0MzQsIlhob3NhIn0sCgl7MHgwNDM1LCJadWx1In0sCgl7MHgwNDM2LCJBZnJpa2FhbnMifSwKCXsweDA0MzcsIkdlb3JnaWFuIn0sCgl7MHgwNDM4LCJGYWVyb2VzZSJ9LAoJezB4MDQzOSwiSGluZGkifSwKCXsweDA0M2EsIk1hbHRlc2UifSwKCXsweDA0M2IsIlNhYW1pIn0sCgl7MHgwNDNjLCJJcmlzaCBnYWVsaWMifSwKCXsweDA4M2MsIlNjb3R0aXNoIGdhZWxpYyJ9LAoJezB4MDQzZSwiTWFsYXkgKE1hbGF5c2lhKSJ9LAoJezB4MDgzZSwiTWFsYXkgKEJydW5laSBEYXJ1c3NhbGFtKSJ9LAoJezB4MDQzZiwiS2F6YWsifSwKCXsweDA0NDEsIlN3YWhpbGkifSwKCXsweDA0NDMsIlV6YmVrIChsYXRpbikifSwKCXsweDA4NDMsIlV6YmVrIChjeXJpbGxpYykifSwKCXsweDA0NDQsIlRhdGFyIn0sCgl7MHgwNDQ1LCJCZW5nYWxpIn0sCgl7MHgwNDQ2LCJQdW5qYWJpIn0sCgl7MHgwNDQ3LCJHdWphcmF0aSJ9LAoJezB4MDQ0OCwiT3JpeWEifSwKCXsweDA0NDksIlRhbWlsIn0sCgl7MHgwNDRhLCJUZWx1Z3UifSwKCXsweDA0NGIsIkthbm5hZGEifSwKCXsweDA0NGMsIk1hbGF5YWxhbSJ9LAoJezB4MDQ0ZCwiQXNzYW1lc2UifSwKCXsweDA0NGUsIk1hcmF0aGkifSwKCXsweDA0NGYsIlNhbnNrcml0In0sCgl7MHgwNDU3LCJLb25rYW5pIn0sCgl7MHgwNDhmLCJFc3BlcmFudG8ifSwgLyogTm9uIG9mZmljaWFsICovCgl7MHgwNDkwLCJXYWxvbiJ9LCAvKiBOb24gb2ZmaWNpYWwgKi8KCXsweDAwMDAsIlVua25vd24ifQogICAgfSwgbGFuZ3VhZ2VzX2RlW109ewoJezB4MDQwMSwiQXJhYmljIn0sCgl7MHgwNDAyLCJCdWxnYXJpc2NoIn0sCgl7MHgwNDAzLCJLYXRhbGFuaXNjaCJ9LAoJezB4MDQwNCwiVHJhZGl0aW9uYWxlcyBDaGluZXNpc2NoIn0sCgl7MHgwNDA1LCJUc2NoZWNpc2NoIn0sCgl7MHgwNDA2LCJE5G5pc2NoIn0sCgl7MHgwNDA3LCJEZXV0c2NoIn0sCgl7MHgwNDA4LCJHcmllY2hpc2NoIn0sCgl7MHgwNDA5LCJBbWVyaWthbmlzY2hlcyBFbmdsaXNjaCJ9LAoJezB4MDQwQSwiS2FzdGlsaXNjaGVzIFNwYW5pc2NoIn0sCgl7MHgwNDBCLCJGaW5uaXNjaCJ9LAoJezB4MDQwQywiRnJhbnp2c2lzY2gifSwKCXsweDA0MEQsIkhlYnJkaXNjaCJ9LAoJezB4MDQwRSwiVW5nYXJpc2NoIn0sCgl7MHgwNDBGLCJJc2xkbmRpc2NoIn0sCgl7MHgwNDEwLCJJdGFsaWVuaXNjaCJ9LAoJezB4MDQxMSwiSmFwYW5pc2NoIn0sCgl7MHgwNDEyLCJLb3JlYW5pc2NoIn0sCgl7MHgwNDEzLCJOaWVkZXJsZG5kaXNjaCJ9LAoJezB4MDQxNCwiTm9yd2VnaXNjaC1Cb2ttYWwifSwKCXsweDA0MTUsIlBvbG5pc2NoIn0sCgl7MHgwNDE2LCJCcmFzaWxpYW5pc2NoZXMgUG9ydHVnaWVzaXNjaCJ9LAoJezB4MDQxNywiUmR0b3JvbWFuaXNjaCJ9LAoJezB4MDQxOCwiUnVtZG5pc2NoIn0sCgl7MHgwNDE5LCJSdXNzaXNjaCJ9LAoJezB4MDQxQSwiS3JvYXRvc2VyYmlzY2ggKGxhdGVpbmlzY2gpIn0sCgl7MHgwNDFCLCJTbG93ZW5pc2NoIn0sCgl7MHgwNDFDLCJBbGJhbmlzY2gifSwKCXsweDA0MUQsIlNjaHdlZGlzY2gifSwKCXsweDA0MUUsIlRoYWkifSwKCXsweDA0MUYsIlT8cmtpc2NoIn0sCgl7MHgwNDIwLCJVcmR1In0sCgl7MHgwNDIxLCJCYWhhc2EifSwKCXsweDA4MDQsIlZlcmVpbmZhY2h0ZXMgQ2hpbmVzaXNjaCJ9LAoJezB4MDgwNywiU2Nod2VpemVyZGV1dHNjaCJ9LAoJezB4MDgwOSwiQnJpdGlzY2hlcyBFbmdsaXNjaCJ9LAoJezB4MDgwQSwiTWV4aWthbmlzY2hlcyBTcGFuaXNjaCJ9LAoJezB4MDgwQywiQmVsZ2lzY2hlcyBGcmFuenZzaXNjaCJ9LAoJezB4MDgxMCwiU2Nod2VpemVyaXNjaGVzIEl0YWxpZW5pc2NoIn0sCgl7MHgwODEzLCJCZWxnaXNjaGVzIE5pZWRlcmxkbmRpc2NoIn0sCgl7MHgwODE0LCJOb3Jnd2VnaXNjaC1OeW5vcnNrIn0sCgl7MHgwODE2LCJQb3J0dWdpZXNpc2NoIn0sCgl7MHgwODFBLCJTZXJib2tyYXRpc2NoIChreXJpbGxpc2NoKSJ9LAoJezB4MEMxQywiS2FuYWRpc2NoZXMgRnJhbnp2c2lzY2gifSwKCXsweDEwMEMsIlNjaHdlaXplcmlzY2hlcyBGcmFuenZzaXNjaCJ9LAoJezB4MDAwMCwiVW5iZWthbm50In0sCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldFVzZXJEZWZhdWx0TENJRCAgICAgICAoT0xFMk5MUy4xKQogKi8KTENJRCBXSU5BUEkgR2V0VXNlckRlZmF1bHRMQ0lEKCkKewoJcmV0dXJuIE1BS0VMQ0lEKCBHZXRVc2VyRGVmYXVsdExhbmdJRCgpICwgU09SVF9ERUZBVUxUICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldFN5c3RlbURlZmF1bHRMQ0lEICAgICAgIChPTEUyTkxTLjIpCiAqLwpMQ0lEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpCnsKCXJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0VXNlckRlZmF1bHRMYW5nSUQgICAgICAgKE9MRTJOTFMuMykKICovCkxBTkdJRCBXSU5BUEkgR2V0VXNlckRlZmF1bHRMYW5nSUQoKQp7CgkvKiBjYWNoaW5nIHJlc3VsdCwgaWYgZGVmaW5lZCBmcm9tIGVudmlyb25tZW50LCB3aGljaCBzaG91bGQgKD8pIG5vdCBjaGFuZ2UgZHVyaW5nIGEgV0lORSBzZXNzaW9uICovCglzdGF0aWMJTEFOR0lECXVzZXJMQ0lEID0gMDsKCWlmIChPcHRpb25zLmxhbmd1YWdlKSB7CgkJcmV0dXJuIExhbmd1YWdlc1tPcHRpb25zLmxhbmd1YWdlXS5sYW5naWQ7Cgl9CgoJaWYgKHVzZXJMQ0lEID09IDApIHsKCQljaGFyICpidWY9TlVMTDsKCQljaGFyICpsYW5nLCpjb3VudHJ5LCpjaGFyc2V0LCpkaWFsZWN0LCpuZXh0OwoJCWludCAJcmV0PTA7CgkJCgkJYnVmPWdldGVudigiTEFOR1VBR0UiKTsKCQlpZiAoIWJ1ZikgYnVmPWdldGVudigiTEFORyIpOwoJCWlmICghYnVmKSBidWY9Z2V0ZW52KCJMQ19BTEwiKTsKCQlpZiAoIWJ1ZikgYnVmPWdldGVudigiTENfTUVTU0FHRVMiKTsKCQlpZiAoIWJ1ZikgYnVmPWdldGVudigiTENfQ1RZUEUiKTsKCQlpZiAoIWJ1ZikgcmV0dXJuIHVzZXJMQ0lEID0gTUFLRUxBTkdJRCggTEFOR19FTkdMSVNILCBTVUJMQU5HX0RFRkFVTFQgKTsKCQkKCQlpZiAoIXN0cmNtcChidWYsIlBPU0lYIikgfHwgIXN0cmNtcChidWYsIkMiKSkgewoJCQlyZXR1cm4gTUFLRUxBTkdJRCggTEFOR19FTkdMSVNILCBTVUJMQU5HX0RFRkFVTFQgKTsKCQl9CgkJCgkJbGFuZz1idWY7CgkJCgkJZG8gewoJCQluZXh0PXN0cmNocihsYW5nLCc6Jyk7IGlmIChuZXh0KSAqbmV4dCsrPSdcMCc7CgkJCWRpYWxlY3Q9c3RyY2hyKGxhbmcsJ0AnKTsgaWYgKGRpYWxlY3QpICpkaWFsZWN0Kys9J1wwJzsKCQkJY2hhcnNldD1zdHJjaHIobGFuZywnLicpOyBpZiAoY2hhcnNldCkgKmNoYXJzZXQrKz0nXDAnOwoJCQljb3VudHJ5PXN0cmNocihsYW5nLCdfJyk7IGlmIChjb3VudHJ5KSAqY291bnRyeSsrPSdcMCc7CgkJCQoJCQlyZXQ9TUFJTl9HZXRMYW5ndWFnZUlEKGxhbmcsIGNvdW50cnksIGNoYXJzZXQsIGRpYWxlY3QpOwoJCQkKCQkJbGFuZz1uZXh0OwoJCQkKCQl9IHdoaWxlIChsYW5nICYmICFyZXQpOwoJCQoJCS8qIEZJWE1FIDogYXJlIHN0cmluZ3MgcmV0dXJuZWQgYnkgZ2V0ZW52KCkgdG8gYmUgZnJlZSgpJ2VkID8gKi8KCQl1c2VyTENJRCA9IChMQU5HSUQpcmV0OwoJfQoJcmV0dXJuIHVzZXJMQ0lEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEICAgICAoT0xFMk5MUy40KQogKi8KTEFOR0lEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEKCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldExvY2FsZUluZm8xNglbT0xFMk5MUy41XQogKiBJcyB0aGUgbGFzdCBwYXJhbWV0ZXIgcmVhbGx5IFdPUkQgZm9yIFdpbjE2PwogKi8KSU5UMTYgV0lOQVBJIEdldExvY2FsZUluZm8xNihMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFNUUiBidWYsSU5UMTYgbGVuKQp7CglyZXR1cm4gR2V0TG9jYWxlSW5mb0EobGNpZCxMQ1R5cGUsYnVmLGxlbik7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb252ZXJ0RGVmYXVsdExvY2FsZTMyIFtLRVJORUwzMi4xNDddCiAqLwpMQ0lEIFdJTkFQSSBDb252ZXJ0RGVmYXVsdExvY2FsZTMyIChMQ0lEIGxjaWQpCnsJc3dpdGNoIChsY2lkKQoJeyAgY2FzZSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQ6CgkgICAgIHJldHVybiBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJICAgY2FzZSBMT0NBTEVfVVNFUl9ERUZBVUxUOgoJICAgICByZXR1cm4gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CgkgICBjYXNlIDA6CgkgICAgIHJldHVybiBNQUtFTENJRCAoTEFOR19ORVVUUkFMLCBTVUJMQU5HX05FVVRSQUwpOwoJfSAgCglyZXR1cm4gTUFLRUxBTkdJRCggUFJJTUFSWUxBTkdJRChsY2lkKSwgU1VCTEFOR19ORVVUUkFMKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEdldExvY2FsZUluZm8zMkEgW0tFUk5FTDMyLjM0Ml0KICoKICogTk9URVMgCiAqICBMQU5HX05FVVRSQUwgaXMgZXF1YWwgdG8gTE9DQUxFX1NZU1RFTV9ERUZBVUxUCiAqCiAqICBNUyBvbmxpbmUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCB0aGUgc3RyaW5nIHJldHVybmVkIGlzIE5VTEwgdGVybWluYXRlZAogKiAgZXhjZXB0IGZvciBMT0NBTEVfRk9OVFNJR05BVFVSRSAgd2hpY2ggIndpbGwgcmV0dXJuIGEgbm9uLU5VTEwKICogIHRlcm1pbmF0ZWQgc3RyaW5nIi4KICovCklOVCBXSU5BUEkgR2V0TG9jYWxlSW5mb0EoTENJRCBsY2lkLExDVFlQRSBMQ1R5cGUsTFBTVFIgYnVmLElOVCBsZW4pCnsKICBMUENTVFIgIHJldFN0cmluZzsKCWludAlmb3VuZCxpOwoJaW50CWxhbmc9MDsKCiAgVFJBQ0VfKG9sZSkoIihsY2lkPTB4JWx4LGxjdHlwZT0weCVseCwlcCwleClcbiIsbGNpZCxMQ1R5cGUsYnVmLGxlbik7CgogIGlmIChsZW4gJiYgKCEgYnVmKSApIHsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAobGNpZCA9PTAgfHwgbGNpZCA9PSBMQU5HX1NZU1RFTV9ERUZBVUxUIHx8IChMQ1R5cGUgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpICkJLyogMHgwMCwgMHg0MDAgKi8KCXsKICAgICAgICAgICAgbGNpZCA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7Cgl9IAoJZWxzZSBpZiAobGNpZCA9PSBMQU5HX1VTRVJfREVGQVVMVCkgLyoweDgwMCovCgl7CiAgICAgICAgICAgIGxjaWQgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCX0KCUxDVHlwZSAmPSB+KExPQ0FMRV9OT1VTRVJPVkVSUklERXxMT0NBTEVfVVNFX0NQX0FDUCk7CgoJLyogQXMgYW4gb3B0aW9uLCB3ZSBjb3VsZCBvYnRhaW4gdGhlIHZhbHVlIGZyb20gd2luLmluaS4KCSAgIFRoaXMgd291bGQgbm90IG1hdGNoIHRoZSBXaW5lIGNvbXBpbGUtdGltZSBvcHRpb24uCgkgICBBbHNvLCBub3QgYWxsIGlkZW50aWZpZXJzIGFyZSBhdmFpbGFibGUgZnJvbSB3aW4uaW5pICovCglyZXRTdHJpbmc9MDsKCS8qIElmIHdlIGFyZSB0aHJvdWdoIGFsbCBvZiB0aGlzLCByZXRMZW4gc2hvdWxkIG5vdCBiZSB6ZXJvIGFueW1vcmUuCgkgICBJZiBpdCBpcywgdGhlIHZhbHVlIGlzIG5vdCBzdXBwb3J0ZWQgKi8KCWk9MDsKCXdoaWxlIChsb2NhbGVfbmFtZTJpZFtpXS5uYW1lIT1OVUxMKSB7CgkJaWYgKExDVHlwZSA9PSBsb2NhbGVfbmFtZTJpZFtpXS5pZCkgewoJCQlyZXRTdHJpbmcgPSBsb2NhbGVfbmFtZTJpZFtpXS5uYW1lOwoJCQlicmVhazsKCQl9CgkJaSsrOwoJfQoJaWYgKCFyZXRTdHJpbmcpIHsKICAgICAgRklYTUVfKG9sZSkoIlVua293biBMQyB0eXBlICVsWFxuIixMQ1R5cGUpOwoJCXJldHVybiAwOwoJfQoKICAgIGZvdW5kPTA7bGFuZz1sY2lkOwogICAgZm9yIChpPTA7KGk8MyAmJiAhZm91bmQpO2krKykgewogICAgICBpbnQgajsKCiAgICAgIGZvciAoaj0wO2o8c2l6ZW9mKGxhbmdsb2NhbGVzKS9zaXplb2YobGFuZ2xvY2FsZXNbMF0pO2orKykgewoJaWYgKGxhbmdsb2NhbGVzW2pdLmxhbmcgPT0gbGFuZykgewoJICBpbnQgazsKCgkgIGZvciAoaz0wO2s8c2l6ZW9mKGxhbmdsb2NhbGVzW2pdLmxvY3ZhcnMpL3NpemVvZihsYW5nbG9jYWxlc1tqXS5sb2N2YXJzWzBdKSAmJiAobGFuZ2xvY2FsZXNbal0ubG9jdmFyc1trXS50eXBlKTtrKyspIHsKCSAgICBpZiAobGFuZ2xvY2FsZXNbal0ubG9jdmFyc1trXS50eXBlID09IExDVHlwZSkgewoJICAgICAgZm91bmQgPSAxOwoJICAgICAgcmV0U3RyaW5nID0gbGFuZ2xvY2FsZXNbal0ubG9jdmFyc1trXS52YWw7CgkgIGJyZWFrOwoJICAgIH0KCSAgfQogICAgICAgICAgaWYgKGZvdW5kKQoJICAgIGJyZWFrOwoJfQogICAgICB9CgkgIC8qIGxhbmd1YWdlIG5vdCBmb3VuZCwgdHJ5IHdpdGhvdXQgYSBzdWJsYW5ndWFnZSovCgkgIGlmIChpPT0xKSBsYW5nPU1BS0VMQU5HSUQoIFBSSU1BUllMQU5HSUQobGFuZyksIFNVQkxBTkdfREVGQVVMVCk7CgkgIC8qIG1hc2sgdGhlIExDIFZhbHVlICovCgkgIGlmIChpPT0yKSBMQ1R5cGUgJj0gMHhmZmY7CiAgICB9CgogICAgaWYoIWZvdW5kKSB7CiAgICAgIEVSUl8ob2xlKSgiJyVzJyBub3Qgc3VwcG9ydGVkIGZvciB5b3VyIGxhbmd1YWdlICglMDRYKS5cbiIsCgkJCXJldFN0cmluZywoV09SRClsY2lkKTsKCQlTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJCXJldHVybiAwOwkJCQoJfQogICAgLyogYSBGT05UU0lHTkFUVVJFIGlzIG5vdCBhIHN0cmluZywganVzdCA2IERXT1JEcyAgKi8KICAgIGlmIChMQ1R5cGUgPT0gTE9DQUxFX0ZPTlRTSUdOQVRVUkUpIHsKICAgICAgICBpZiAobGVuKQogICAgICAgICAgICBtZW1jcHkoYnVmLCByZXRTdHJpbmcsIChsZW48PXNpemVvZihGT05UU0lHTkFUVVJFKSk/bGVuOnNpemVvZihGT05UU0lHTkFUVVJFKSk7CiAgICAgICAgcmV0dXJuIHNpemVvZihGT05UU0lHTkFUVVJFKTsKICAgIH0KICAgIC8qIGlmIGxlbj0wIHJldHVybiBvbmx5IHRoZSBsZW5ndGgsIGRvbid0IHRvdWNoIHRoZSBidWZmZXIqLwogICAgaWYgKGxlbikgbHN0cmNweW5BKGJ1ZixyZXRTdHJpbmcsbGVuKTsKICAgIHJldHVybiBzdHJsZW4ocmV0U3RyaW5nKSsxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRMb2NhbGVJbmZvMzJXCVtLRVJORUwzMi4zNDNdCiAqCiAqIE5PVEVTCiAqICBNUyBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0IGxlbiAic3BlY2lmaWVzIHRoZSBzaXplLCBpbiBieXRlcyAoQU5TSSB2ZXJzaW9uKQogKiAgb3IgY2hhcmFjdGVycyAoVW5pY29kZSB2ZXJzaW9uKSwgb2YiIHdidWYuIFRodXMgdGhlIG51bWJlciByZXR1cm5lZCBpcwogKiAgdGhlIHNhbWUgYmV0d2VlbiBHZXRMb2NhbGVJbmZvMzJXIGFuZCBHZXRMb2NhbGVJbmZvMzJBLgogKi8KSU5UIFdJTkFQSSBHZXRMb2NhbGVJbmZvVyhMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFdTVFIgd2J1ZixJTlQgbGVuKQp7CVdPUkQgd2xlbjsKCUxQU1RSIGFidWY7CgkKCWlmIChsZW4gJiYgKCEgd2J1ZikgKQoJeyBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgIHJldHVybiAwOwoJfQoKCWFidWYgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4pOwoJd2xlbiA9IEdldExvY2FsZUluZm9BKGxjaWQsIExDVHlwZSwgYWJ1ZiwgbGVuKTsKCglpZiAod2xlbiAmJiBsZW4pCS8qIGlmIGxlbj0wIHJldHVybiBvbmx5IHRoZSBsZW5ndGgqLwoJICBsc3RyY3B5bkF0b1cod2J1ZixhYnVmLGxlbik7CgoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGFidWYpOwoJcmV0dXJuIHdsZW47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldExvY2FsZUluZm9BCVtLRVJORUwzMi42NTZdCiAqLwpCT09MMTYgV0lOQVBJIFNldExvY2FsZUluZm9BKERXT1JEIGxjaWQsIERXT1JEIGxjdHlwZSwgTFBDU1RSIGRhdGEpCnsKICAgIEZJWE1FXyhvbGUpKCIoJWxkLCVsZCwlcyk6IHN0dWJcbiIsbGNpZCxsY3R5cGUsZGF0YSk7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSXNWYWxpZExvY2FsZQlbS0VSTkVMMzIuNDg5XQogKi8KQk9PTCBXSU5BUEkgSXNWYWxpZExvY2FsZShMQ0lEIGxjaWQsRFdPUkQgZmxhZ3MpCnsKCS8qIHdlIHN1cHBvcnQgQU5ZIGxhbmd1YWdlLiBXZWxsLCBhdCBsZWFzdCBzYXkgdGhhdC4uLiovCglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bVN5c3RlbUxvY2FsZXMzMlcJW0tFUk5FTDMyLjIwOV0KICovCkJPT0wgV0lOQVBJIEVudW1TeXN0ZW1Mb2NhbGVzVyggTE9DQUxFX0VOVU1QUk9DVyBscGZuTG9jYWxlRW51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MgKQp7CglpbnQJaTsKCUJPT0wJcmV0OwoJV0NIQVIJYnVmZmVyWzIwMF07CglIS0VZCXhoa2V5OwoKCVRSQUNFXyh3aW4zMikoIiglcCwlMDhseClcbiIsbHBmbkxvY2FsZUVudW0sZmxhZ3MgKTsKCS8qIHNlZSBpZiB3ZSBjYW4gcmV1c2UgdGhlIFdpbjk1IHJlZ2lzdHJ5IGVudHJpZXMuLi4uICovCglpZiAoRVJST1JfU1VDQ0VTUz09UmVnT3BlbktleUEoSEtFWV9MT0NBTF9NQUNISU5FLCJTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcIiwmeGhrZXkpKSB7CgkJaT0wOwoJCXdoaWxlICgxKSB7CgkJCWlmIChFUlJPUl9TVUNDRVNTIT1SZWdFbnVtS2V5Vyh4aGtleSxpLGJ1ZmZlcixzaXplb2YoYnVmZmVyKSkpCgkJCQlicmVhazsKICAgICAgICAgICAgCQlpZiAoIWxwZm5Mb2NhbGVFbnVtKGJ1ZmZlcikpCgkJCQlicmVhazsKCQkJaSsrOwoJCX0KCQlSZWdDbG9zZUtleSh4aGtleSk7CgkJcmV0dXJuIFRSVUU7Cgl9CgoJaT0wOwoJd2hpbGUgKGxhbmd1YWdlc1tpXS5sYW5naWQhPTApCiAgICAgICAgewogICAgICAgICAgICBMUFdTVFIgY3A7CgkgICAgY2hhciAgIHhidWZmZXJbMTBdOwogIAkKCSAgICBzcHJpbnRmKHhidWZmZXIsIiUwOGx4IiwoRFdPUkQpbGFuZ3VhZ2VzW2ldLmxhbmdpZCk7CgoJICAgIGNwID0gSEVBUF9zdHJkdXBBdG9XKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB4YnVmZmVyICk7CiAgICAgICAgICAgIHJldCA9IGxwZm5Mb2NhbGVFbnVtKGNwKTsKICAgICAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGNwICk7CiAgICAgICAgICAgIGlmICghcmV0KSBicmVhazsKICAgICAgICAgICAgaSsrOwoJfQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1TeXN0ZW1Mb2NhbGVzMzJBCVtLRVJORUwzMi4yMDhdCiAqLwpCT09MIFdJTkFQSSBFbnVtU3lzdGVtTG9jYWxlc0EoTE9DQUxFX0VOVU1QUk9DQSBscGZuTG9jYWxlRW51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBmbGFncykKewoJaW50CWk7CglDSEFSCWJ1ZmZlclsyMDBdOwoJSEtFWQl4aGtleTsKCglUUkFDRV8od2luMzIpKCIoJXAsJTA4bHgpXG4iLAoJCWxwZm5Mb2NhbGVFbnVtLGZsYWdzCgkpOwoJaWYgKEVSUk9SX1NVQ0NFU1M9PVJlZ09wZW5LZXlBKEhLRVlfTE9DQUxfTUFDSElORSwiU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCIsJnhoa2V5KSkgewoJCWk9MDsKCQl3aGlsZSAoMSkgewoJCQlpZiAoRVJST1JfU1VDQ0VTUyE9UmVnRW51bUtleUEoeGhrZXksaSxidWZmZXIsc2l6ZW9mKGJ1ZmZlcikpKQoJCQkJYnJlYWs7CiAgICAgICAgICAgIAkJaWYgKCFscGZuTG9jYWxlRW51bShidWZmZXIpKQoJCQkJYnJlYWs7CgkJCWkrKzsKCQl9CgkJUmVnQ2xvc2VLZXkoeGhrZXkpOwoJCXJldHVybiBUUlVFOwoJfQoJaT0wOwoJd2hpbGUgKGxhbmd1YWdlc1tpXS5sYW5naWQhPTApIHsKCQlzcHJpbnRmKGJ1ZmZlciwiJTA4bHgiLChEV09SRClsYW5ndWFnZXNbaV0ubGFuZ2lkKTsKCQlpZiAoIWxwZm5Mb2NhbGVFbnVtKGJ1ZmZlcikpCgkJCWJyZWFrOwoJCWkrKzsKCX0KCXJldHVybiBUUlVFOwp9CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBDVF9DVHlwZTJfTFVUW10gPSB7CiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDQgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA1ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA4ICovCiAgQzJfU0VHTUVOVFNFUEFSQVRPUiwgLyogICAtICAgOSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDExICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE0ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxOCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTkgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjUgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjggKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI5ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAzMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMzEgKi8KICBDMl9XSElURVNQQUNFLCAvKiAgIC0gIDMyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAhIC0gIDMzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAjIC0gIDM1ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogJCAtICAzNiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICUgLSAgMzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogJiAtICAzOCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogJyAtICAzOSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKCAtICA0MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKSAtICA0MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKiAtICA0MiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICsgLSAgNDMgKi8KICBDMl9DT01NT05TRVBBUkFUT1IsIC8qICwgLSAgNDQgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAtIC0gIDQ1ICovCiAgQzJfRVVST1BFU0VQQVJBVE9SLCAvKiAuIC0gIDQ2ICovCiAgQzJfRVVST1BFU0VQQVJBVE9SLCAvKiAvIC0gIDQ3ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAwIC0gIDQ4ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAxIC0gIDQ5ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAyIC0gIDUwICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAzIC0gIDUxICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA0IC0gIDUyICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA1IC0gIDUzICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA2IC0gIDU0ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA3IC0gIDU1ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA4IC0gIDU2ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA5IC0gIDU3ICovCiAgQzJfQ09NTU9OU0VQQVJBVE9SLCAvKiA6IC0gIDU4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA7IC0gIDU5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA8IC0gIDYwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA9IC0gIDYxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA+IC0gIDYyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA/IC0gIDYzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEAgLSAgNjQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQSAtICA2NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBCIC0gIDY2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEMgLSAgNjcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRCAtICA2OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBFIC0gIDY5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEYgLSAgNzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRyAtICA3MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBIIC0gIDcyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEkgLSAgNzMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSiAtICA3NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBLIC0gIDc1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEwgLSAgNzYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTSAtICA3NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBOIC0gIDc4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIE8gLSAgNzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUCAtICA4MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBRIC0gIDgxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFIgLSAgODIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUyAtICA4MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBUIC0gIDg0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFUgLSAgODUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogViAtICA4NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBXIC0gIDg3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFggLSAgODggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogWSAtICA4OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBaIC0gIDkwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBbIC0gIDkxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBcIC0gIDkyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBdIC0gIDkzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBeIC0gIDk0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBfIC0gIDk1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBgIC0gIDk2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGEgLSAgOTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogYiAtICA5OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBjIC0gIDk5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGQgLSAxMDAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZSAtIDEwMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBmIC0gMTAyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGcgLSAxMDMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogaCAtIDEwNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBpIC0gMTA1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGogLSAxMDYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogayAtIDEwNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBsIC0gMTA4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIG0gLSAxMDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbiAtIDExMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBvIC0gMTExICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHAgLSAxMTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogcSAtIDExMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiByIC0gMTE0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHMgLSAxMTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdCAtIDExNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB1IC0gMTE3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHYgLSAxMTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdyAtIDExOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB4IC0gMTIwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHkgLSAxMjEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogeiAtIDEyMiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogeyAtIDEyMyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfCAtIDEyNCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfSAtIDEyNSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfiAtIDEyNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIH8gLSAxMjcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCAIC0gMTI4ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyoggSAtIDEyOSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoggiAtIDEzMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCDIC0gMTMxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCEIC0gMTMyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCFIC0gMTMzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCGIC0gMTM0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCHIC0gMTM1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIggLSAxMzYgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCJIC0gMTM3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIogLSAxMzggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIsgLSAxMzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogjCAtIDE0MCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qII0gLSAxNDEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCOIC0gMTQyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogjyAtIDE0MyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIJAgLSAxNDQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJEgLSAxNDUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJIgLSAxNDYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJMgLSAxNDcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJQgLSAxNDggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJUgLSAxNDkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJYgLSAxNTAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJcgLSAxNTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogmCAtIDE1MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogmSAtIDE1MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCaIC0gMTU0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCbIC0gMTU1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJwgLSAxNTYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCdIC0gMTU3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogniAtIDE1OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCfIC0gMTU5ICovCiAgQzJfV0hJVEVTUEFDRSwgLyogoCAtIDE2MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogoSAtIDE2MSAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKIgLSAxNjIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCjIC0gMTYzICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogpCAtIDE2NCAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKUgLSAxNjUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKYgLSAxNjYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKcgLSAxNjcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKggLSAxNjggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKkgLSAxNjkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKogLSAxNzAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKsgLSAxNzEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKwgLSAxNzIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK0gLSAxNzMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK4gLSAxNzQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK8gLSAxNzUgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCwIC0gMTc2ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogsSAtIDE3NyAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogsiAtIDE3OCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogsyAtIDE3OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtCAtIDE4MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtSAtIDE4MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtiAtIDE4MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtyAtIDE4MyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguCAtIDE4NCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyoguSAtIDE4NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguiAtIDE4NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguyAtIDE4NyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvCAtIDE4OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvSAtIDE4OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogviAtIDE5MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvyAtIDE5MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDAIC0gMTkyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMEgLSAxOTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwiAtIDE5NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDDIC0gMTk1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMQgLSAxOTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxSAtIDE5NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDGIC0gMTk4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMcgLSAxOTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyCAtIDIwMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDJIC0gMjAxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMogLSAyMDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyyAtIDIwMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDMIC0gMjA0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIM0gLSAyMDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogziAtIDIwNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDPIC0gMjA3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINAgLSAyMDggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0SAtIDIwOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDSIC0gMjEwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINMgLSAyMTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog1CAtIDIxMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDVIC0gMjEzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINYgLSAyMTQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qINcgLSAyMTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2CAtIDIxNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDZIC0gMjE3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINogLSAyMTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2yAtIDIxOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDcIC0gMjIwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIN0gLSAyMjEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3iAtIDIyMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDfIC0gMjIzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOAgLSAyMjQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4SAtIDIyNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDiIC0gMjI2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOMgLSAyMjcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5CAtIDIyOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDlIC0gMjI5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOYgLSAyMzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5yAtIDIzMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDoIC0gMjMyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOkgLSAyMzMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6iAtIDIzNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDrIC0gMjM1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOwgLSAyMzYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7SAtIDIzNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDuIC0gMjM4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIO8gLSAyMzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8CAtIDI0MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDxIC0gMjQxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPIgLSAyNDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8yAtIDI0MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD0IC0gMjQ0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPUgLSAyNDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog9iAtIDI0NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyog9yAtIDI0NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD4IC0gMjQ4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPkgLSAyNDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+iAtIDI1MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD7IC0gMjUxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPwgLSAyNTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog/SAtIDI1MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD+IC0gMjU0ICovCiAgQzJfTEVGVFRPUklHSFQgLyog/yAtIDI1NSAqLwp9OwoKY29uc3QgV09SRCBPTEUyTkxTX0NUX0NUeXBlM19MVVRbXSA9IHsgCiAgMHgwMDAwLCAvKiAgIC0gICAwICovCiAgMHgwMDAwLCAvKiAgIC0gICAxICovCiAgMHgwMDAwLCAvKiAgIC0gICAyICovCiAgMHgwMDAwLCAvKiAgIC0gICAzICovCiAgMHgwMDAwLCAvKiAgIC0gICA0ICovCiAgMHgwMDAwLCAvKiAgIC0gICA1ICovCiAgMHgwMDAwLCAvKiAgIC0gICA2ICovCiAgMHgwMDAwLCAvKiAgIC0gICA3ICovCiAgMHgwMDAwLCAvKiAgIC0gICA4ICovCiAgMHgwMDA4LCAvKiAgIC0gICA5ICovCiAgMHgwMDA4LCAvKiAgIC0gIDEwICovCiAgMHgwMDA4LCAvKiAgIC0gIDExICovCiAgMHgwMDA4LCAvKiAgIC0gIDEyICovCiAgMHgwMDA4LCAvKiAgIC0gIDEzICovCiAgMHgwMDAwLCAvKiAgIC0gIDE0ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE1ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE2ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE3ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE4ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE5ICovCiAgMHgwMDAwLCAvKiAgIC0gIDIwICovCiAgMHgwMDAwLCAvKiAgIC0gIDIxICovCiAgMHgwMDAwLCAvKiAgIC0gIDIyICovCiAgMHgwMDAwLCAvKiAgIC0gIDIzICovCiAgMHgwMDAwLCAvKiAgIC0gIDI0ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI1ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI2ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI3ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI4ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI5ICovCiAgMHgwMDAwLCAvKiAgIC0gIDMwICovCiAgMHgwMDAwLCAvKiAgIC0gIDMxICovCiAgMHgwMDQ4LCAvKiAgIC0gIDMyICovCiAgMHgwMDQ4LCAvKiAhIC0gIDMzICovCiAgMHgwNDQ4LCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICAweDAwNDgsIC8qICMgLSAgMzUgKi8KICAweDA0NDgsIC8qICQgLSAgMzYgKi8KICAweDAwNDgsIC8qICUgLSAgMzcgKi8KICAweDAwNDgsIC8qICYgLSAgMzggKi8KICAweDA0NDAsIC8qICcgLSAgMzkgKi8KICAweDAwNDgsIC8qICggLSAgNDAgKi8KICAweDAwNDgsIC8qICkgLSAgNDEgKi8KICAweDAwNDgsIC8qICogLSAgNDIgKi8KICAweDAwNDgsIC8qICsgLSAgNDMgKi8KICAweDAwNDgsIC8qICwgLSAgNDQgKi8KICAweDA0NDAsIC8qIC0gLSAgNDUgKi8KICAweDAwNDgsIC8qIC4gLSAgNDYgKi8KICAweDA0NDgsIC8qIC8gLSAgNDcgKi8KICAweDAwNDAsIC8qIDAgLSAgNDggKi8KICAweDAwNDAsIC8qIDEgLSAgNDkgKi8KICAweDAwNDAsIC8qIDIgLSAgNTAgKi8KICAweDAwNDAsIC8qIDMgLSAgNTEgKi8KICAweDAwNDAsIC8qIDQgLSAgNTIgKi8KICAweDAwNDAsIC8qIDUgLSAgNTMgKi8KICAweDAwNDAsIC8qIDYgLSAgNTQgKi8KICAweDAwNDAsIC8qIDcgLSAgNTUgKi8KICAweDAwNDAsIC8qIDggLSAgNTYgKi8KICAweDAwNDAsIC8qIDkgLSAgNTcgKi8KICAweDAwNDgsIC8qIDogLSAgNTggKi8KICAweDAwNDgsIC8qIDsgLSAgNTkgKi8KICAweDAwNDgsIC8qIDwgLSAgNjAgKi8KICAweDA0NDgsIC8qID0gLSAgNjEgKi8KICAweDAwNDgsIC8qID4gLSAgNjIgKi8KICAweDAwNDgsIC8qID8gLSAgNjMgKi8KICAweDA0NDgsIC8qIEAgLSAgNjQgKi8KICAweDgwNDAsIC8qIEEgLSAgNjUgKi8KICAweDgwNDAsIC8qIEIgLSAgNjYgKi8KICAweDgwNDAsIC8qIEMgLSAgNjcgKi8KICAweDgwNDAsIC8qIEQgLSAgNjggKi8KICAweDgwNDAsIC8qIEUgLSAgNjkgKi8KICAweDgwNDAsIC8qIEYgLSAgNzAgKi8KICAweDgwNDAsIC8qIEcgLSAgNzEgKi8KICAweDgwNDAsIC8qIEggLSAgNzIgKi8KICAweDgwNDAsIC8qIEkgLSAgNzMgKi8KICAweDgwNDAsIC8qIEogLSAgNzQgKi8KICAweDgwNDAsIC8qIEsgLSAgNzUgKi8KICAweDgwNDAsIC8qIEwgLSAgNzYgKi8KICAweDgwNDAsIC8qIE0gLSAgNzcgKi8KICAweDgwNDAsIC8qIE4gLSAgNzggKi8KICAweDgwNDAsIC8qIE8gLSAgNzkgKi8KICAweDgwNDAsIC8qIFAgLSAgODAgKi8KICAweDgwNDAsIC8qIFEgLSAgODEgKi8KICAweDgwNDAsIC8qIFIgLSAgODIgKi8KICAweDgwNDAsIC8qIFMgLSAgODMgKi8KICAweDgwNDAsIC8qIFQgLSAgODQgKi8KICAweDgwNDAsIC8qIFUgLSAgODUgKi8KICAweDgwNDAsIC8qIFYgLSAgODYgKi8KICAweDgwNDAsIC8qIFcgLSAgODcgKi8KICAweDgwNDAsIC8qIFggLSAgODggKi8KICAweDgwNDAsIC8qIFkgLSAgODkgKi8KICAweDgwNDAsIC8qIFogLSAgOTAgKi8KICAweDAwNDgsIC8qIFsgLSAgOTEgKi8KICAweDA0NDgsIC8qIFwgLSAgOTIgKi8KICAweDAwNDgsIC8qIF0gLSAgOTMgKi8KICAweDA0NDgsIC8qIF4gLSAgOTQgKi8KICAweDA0NDgsIC8qIF8gLSAgOTUgKi8KICAweDA0NDgsIC8qIGAgLSAgOTYgKi8KICAweDgwNDAsIC8qIGEgLSAgOTcgKi8KICAweDgwNDAsIC8qIGIgLSAgOTggKi8KICAweDgwNDAsIC8qIGMgLSAgOTkgKi8KICAweDgwNDAsIC8qIGQgLSAxMDAgKi8KICAweDgwNDAsIC8qIGUgLSAxMDEgKi8KICAweDgwNDAsIC8qIGYgLSAxMDIgKi8KICAweDgwNDAsIC8qIGcgLSAxMDMgKi8KICAweDgwNDAsIC8qIGggLSAxMDQgKi8KICAweDgwNDAsIC8qIGkgLSAxMDUgKi8KICAweDgwNDAsIC8qIGogLSAxMDYgKi8KICAweDgwNDAsIC8qIGsgLSAxMDcgKi8KICAweDgwNDAsIC8qIGwgLSAxMDggKi8KICAweDgwNDAsIC8qIG0gLSAxMDkgKi8KICAweDgwNDAsIC8qIG4gLSAxMTAgKi8KICAweDgwNDAsIC8qIG8gLSAxMTEgKi8KICAweDgwNDAsIC8qIHAgLSAxMTIgKi8KICAweDgwNDAsIC8qIHEgLSAxMTMgKi8KICAweDgwNDAsIC8qIHIgLSAxMTQgKi8KICAweDgwNDAsIC8qIHMgLSAxMTUgKi8KICAweDgwNDAsIC8qIHQgLSAxMTYgKi8KICAweDgwNDAsIC8qIHUgLSAxMTcgKi8KICAweDgwNDAsIC8qIHYgLSAxMTggKi8KICAweDgwNDAsIC8qIHcgLSAxMTkgKi8KICAweDgwNDAsIC8qIHggLSAxMjAgKi8KICAweDgwNDAsIC8qIHkgLSAxMjEgKi8KICAweDgwNDAsIC8qIHogLSAxMjIgKi8KICAweDAwNDgsIC8qIHsgLSAxMjMgKi8KICAweDAwNDgsIC8qIHwgLSAxMjQgKi8KICAweDAwNDgsIC8qIH0gLSAxMjUgKi8KICAweDA0NDgsIC8qIH4gLSAxMjYgKi8KICAweDAwMDAsIC8qIH8gLSAxMjcgKi8KICAweDAwMDAsIC8qIIAgLSAxMjggKi8KICAweDAwMDAsIC8qIIEgLSAxMjkgKi8KICAweDAwMDgsIC8qIIIgLSAxMzAgKi8KICAweDgwMDAsIC8qIIMgLSAxMzEgKi8KICAweDAwMDgsIC8qIIQgLSAxMzIgKi8KICAweDAwMDgsIC8qIIUgLSAxMzMgKi8KICAweDAwMDgsIC8qIIYgLSAxMzQgKi8KICAweDAwMDgsIC8qIIcgLSAxMzUgKi8KICAweDAwMDEsIC8qIIggLSAxMzYgKi8KICAweDAwMDgsIC8qIIkgLSAxMzcgKi8KICAweDgwMDMsIC8qIIogLSAxMzggKi8KICAweDAwMDgsIC8qIIsgLSAxMzkgKi8KICAweDgwMDAsIC8qIIwgLSAxNDAgKi8KICAweDAwMDAsIC8qII0gLSAxNDEgKi8KICAweDAwMDAsIC8qII4gLSAxNDIgKi8KICAweDAwMDAsIC8qII8gLSAxNDMgKi8KICAweDAwMDAsIC8qIJAgLSAxNDQgKi8KICAweDAwODgsIC8qIJEgLSAxNDUgKi8KICAweDAwODgsIC8qIJIgLSAxNDYgKi8KICAweDAwODgsIC8qIJMgLSAxNDcgKi8KICAweDAwODgsIC8qIJQgLSAxNDggKi8KICAweDAwMDgsIC8qIJUgLSAxNDkgKi8KICAweDA0MDAsIC8qIJYgLSAxNTAgKi8KICAweDA0MDAsIC8qIJcgLSAxNTEgKi8KICAweDA0MDgsIC8qIJggLSAxNTIgKi8KICAweDAwMDAsIC8qIJkgLSAxNTMgKi8KICAweDgwMDMsIC8qIJogLSAxNTQgKi8KICAweDAwMDgsIC8qIJsgLSAxNTUgKi8KICAweDgwMDAsIC8qIJwgLSAxNTYgKi8KICAweDAwMDAsIC8qIJ0gLSAxNTcgKi8KICAweDAwMDAsIC8qIJ4gLSAxNTggKi8KICAweDgwMDMsIC8qIJ8gLSAxNTkgKi8KICAweDAwMDgsIC8qIKAgLSAxNjAgKi8KICAweDAwMDgsIC8qIKEgLSAxNjEgKi8KICAweDAwNDgsIC8qIKIgLSAxNjIgKi8KICAweDAwNDgsIC8qIKMgLSAxNjMgKi8KICAweDAwMDgsIC8qIKQgLSAxNjQgKi8KICAweDAwNDgsIC8qIKUgLSAxNjUgKi8KICAweDAwNDgsIC8qIKYgLSAxNjYgKi8KICAweDAwMDgsIC8qIKcgLSAxNjcgKi8KICAweDA0MDgsIC8qIKggLSAxNjggKi8KICAweDAwMDgsIC8qIKkgLSAxNjkgKi8KICAweDA0MDAsIC8qIKogLSAxNzAgKi8KICAweDAwMDgsIC8qIKsgLSAxNzEgKi8KICAweDAwNDgsIC8qIKwgLSAxNzIgKi8KICAweDA0MDgsIC8qIK0gLSAxNzMgKi8KICAweDAwMDgsIC8qIK4gLSAxNzQgKi8KICAweDA0NDgsIC8qIK8gLSAxNzUgKi8KICAweDAwMDgsIC8qILAgLSAxNzYgKi8KICAweDAwMDgsIC8qILEgLSAxNzcgKi8KICAweDAwMDAsIC8qILIgLSAxNzggKi8KICAweDAwMDAsIC8qILMgLSAxNzkgKi8KICAweDA0MDgsIC8qILQgLSAxODAgKi8KICAweDAwMDgsIC8qILUgLSAxODEgKi8KICAweDAwMDgsIC8qILYgLSAxODIgKi8KICAweDAwMDgsIC8qILcgLSAxODMgKi8KICAweDA0MDgsIC8qILggLSAxODQgKi8KICAweDAwMDAsIC8qILkgLSAxODUgKi8KICAweDA0MDAsIC8qILogLSAxODYgKi8KICAweDAwMDgsIC8qILsgLSAxODcgKi8KICAweDAwMDAsIC8qILwgLSAxODggKi8KICAweDAwMDAsIC8qIL0gLSAxODkgKi8KICAweDAwMDAsIC8qIL4gLSAxOTAgKi8KICAweDAwMDgsIC8qIL8gLSAxOTEgKi8KICAweDgwMDMsIC8qIMAgLSAxOTIgKi8KICAweDgwMDMsIC8qIMEgLSAxOTMgKi8KICAweDgwMDMsIC8qIMIgLSAxOTQgKi8KICAweDgwMDMsIC8qIMMgLSAxOTUgKi8KICAweDgwMDMsIC8qIMQgLSAxOTYgKi8KICAweDgwMDMsIC8qIMUgLSAxOTcgKi8KICAweDgwMDAsIC8qIMYgLSAxOTggKi8KICAweDgwMDMsIC8qIMcgLSAxOTkgKi8KICAweDgwMDMsIC8qIMggLSAyMDAgKi8KICAweDgwMDMsIC8qIMkgLSAyMDEgKi8KICAweDgwMDMsIC8qIMogLSAyMDIgKi8KICAweDgwMDMsIC8qIMsgLSAyMDMgKi8KICAweDgwMDMsIC8qIMwgLSAyMDQgKi8KICAweDgwMDMsIC8qIM0gLSAyMDUgKi8KICAweDgwMDMsIC8qIM4gLSAyMDYgKi8KICAweDgwMDMsIC8qIM8gLSAyMDcgKi8KICAweDgwMDAsIC8qINAgLSAyMDggKi8KICAweDgwMDMsIC8qINEgLSAyMDkgKi8KICAweDgwMDMsIC8qINIgLSAyMTAgKi8KICAweDgwMDMsIC8qINMgLSAyMTEgKi8KICAweDgwMDMsIC8qINQgLSAyMTIgKi8KICAweDgwMDMsIC8qINUgLSAyMTMgKi8KICAweDgwMDMsIC8qINYgLSAyMTQgKi8KICAweDAwMDgsIC8qINcgLSAyMTUgKi8KICAweDgwMDMsIC8qINggLSAyMTYgKi8KICAweDgwMDMsIC8qINkgLSAyMTcgKi8KICAweDgwMDMsIC8qINogLSAyMTggKi8KICAweDgwMDMsIC8qINsgLSAyMTkgKi8KICAweDgwMDMsIC8qINwgLSAyMjAgKi8KICAweDgwMDMsIC8qIN0gLSAyMjEgKi8KICAweDgwMDAsIC8qIN4gLSAyMjIgKi8KICAweDgwMDAsIC8qIN8gLSAyMjMgKi8KICAweDgwMDMsIC8qIOAgLSAyMjQgKi8KICAweDgwMDMsIC8qIOEgLSAyMjUgKi8KICAweDgwMDMsIC8qIOIgLSAyMjYgKi8KICAweDgwMDMsIC8qIOMgLSAyMjcgKi8KICAweDgwMDMsIC8qIOQgLSAyMjggKi8KICAweDgwMDMsIC8qIOUgLSAyMjkgKi8KICAweDgwMDAsIC8qIOYgLSAyMzAgKi8KICAweDgwMDMsIC8qIOcgLSAyMzEgKi8KICAweDgwMDMsIC8qIOggLSAyMzIgKi8KICAweDgwMDMsIC8qIOkgLSAyMzMgKi8KICAweDgwMDMsIC8qIOogLSAyMzQgKi8KICAweDgwMDMsIC8qIOsgLSAyMzUgKi8KICAweDgwMDMsIC8qIOwgLSAyMzYgKi8KICAweDgwMDMsIC8qIO0gLSAyMzcgKi8KICAweDgwMDMsIC8qIO4gLSAyMzggKi8KICAweDgwMDMsIC8qIO8gLSAyMzkgKi8KICAweDgwMDAsIC8qIPAgLSAyNDAgKi8KICAweDgwMDMsIC8qIPEgLSAyNDEgKi8KICAweDgwMDMsIC8qIPIgLSAyNDIgKi8KICAweDgwMDMsIC8qIPMgLSAyNDMgKi8KICAweDgwMDMsIC8qIPQgLSAyNDQgKi8KICAweDgwMDMsIC8qIPUgLSAyNDUgKi8KICAweDgwMDMsIC8qIPYgLSAyNDYgKi8KICAweDAwMDgsIC8qIPcgLSAyNDcgKi8KICAweDgwMDMsIC8qIPggLSAyNDggKi8KICAweDgwMDMsIC8qIPkgLSAyNDkgKi8KICAweDgwMDMsIC8qIPogLSAyNTAgKi8KICAweDgwMDMsIC8qIPsgLSAyNTEgKi8KICAweDgwMDMsIC8qIPwgLSAyNTIgKi8KICAweDgwMDMsIC8qIP0gLSAyNTMgKi8KICAweDgwMDAsIC8qIP4gLSAyNTQgKi8KICAweDgwMDMgIC8qIP8gLSAyNTUgKi8KfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGUxNglbT0xFMk5MUy43XQogKi8KQk9PTDE2IFdJTkFQSSBHZXRTdHJpbmdUeXBlMTYoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKQp7CglyZXR1cm4gR2V0U3RyaW5nVHlwZUV4QShsb2NhbGUsZHdJbmZvVHlwZSxzcmMsY2NoU3JjLGNoYXJ0eXBlKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRTdHJpbmdUeXBlMzJBCVtLRVJORUwzMi4zOTZdCiAqLwpCT09MIFdJTkFQSSBHZXRTdHJpbmdUeXBlQShMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJcmV0dXJuIEdldFN0cmluZ1R5cGVFeEEobG9jYWxlLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGVFeDMyQQlbS0VSTkVMMzIuMzk3XQogKgogKiBGSVhNRTogSWdub3JlcyB0aGUgbG9jYWxlLgogKi8KQk9PTCBXSU5BUEkgR2V0U3RyaW5nVHlwZUV4QShMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKQp7CglpbnQJaTsKCQoJaWYgKChzcmM9PU5VTEwpIHx8IChjaGFydHlwZT09TlVMTCkgfHwgKHNyYz09KExQU1RSKWNoYXJ0eXBlKSkKCXsKCSAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCSAgcmV0dXJuIEZBTFNFOwoJfQoKCWlmIChjY2hTcmM9PS0xKQoJICBjY2hTcmM9bHN0cmxlbkEoc3JjKSsxOwoJICAKCXN3aXRjaCAoZHdJbmZvVHlwZSkgewoJY2FzZSBDVF9DVFlQRTE6CgkgIGZvciAoaT0wO2k8Y2NoU3JjO2krKykgCgkgIHsKCSAgICBjaGFydHlwZVtpXSA9IDA7CgkgICAgaWYgKGlzZGlnaXQoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0RJR0lUOwoJICAgIGlmIChpc2FscGhhKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9BTFBIQTsKCSAgICBpZiAoaXNsb3dlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfTE9XRVI7CgkgICAgaWYgKGlzdXBwZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1VQUEVSOwoJICAgIGlmIChpc3NwYWNlKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9TUEFDRTsKCSAgICBpZiAoaXNwdW5jdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfUFVOQ1Q7CgkgICAgaWYgKGlzY250cmwoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0NOVFJMOwovKiBGSVhNRTogaXNibGFuaygpIGlzIGEgR05VIGV4dGVuc2lvbiAqLwovKgkJaWYgKGlzYmxhbmsoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0JMQU5LOyAqLwoJICAgIGlmICgoc3JjW2ldID09ICcgJykgfHwgKHNyY1tpXSA9PSAnXHQnKSkgY2hhcnR5cGVbaV18PUMxX0JMQU5LOwoJICAgIC8qIEMxX1hESUdJVCAqLwoJfQoJcmV0dXJuIFRSVUU7CgoJY2FzZSBDVF9DVFlQRTI6CgkgIGZvciAoaT0wO2k8Y2NoU3JjO2krKykgCgkgIHsKCSAgICBjaGFydHlwZVtpXT0oV09SRClDVF9DVHlwZTJfTFVUW2ldOwoJICB9CgkgIHJldHVybiBUUlVFOwoKCWNhc2UgQ1RfQ1RZUEUzOgoJICBmb3IgKGk9MDtpPGNjaFNyYztpKyspIAoJICB7CgkgICAgY2hhcnR5cGVbaV09T0xFMk5MU19DVF9DVHlwZTNfTFVUW2ldOwoJICB9CgkgIHJldHVybiBUUlVFOwoKCWRlZmF1bHQ6CgkgIEVSUl8ob2xlKSgiVW5rbm93biBkd0luZm9UeXBlOiVsZFxuIixkd0luZm9UeXBlKTsKCSAgcmV0dXJuIEZBTFNFOwoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRTdHJpbmdUeXBlMzJXCVtLRVJORUwzMi4zOTldCiAqCiAqIE5PVEVTCiAqIFllcywgdGhpcyBpcyBtaXNzaW5nIExDSUQgbG9jYWxlLiBNUyBmYXVsdC4KICovCkJPT0wgV0lOQVBJIEdldFN0cmluZ1R5cGVXKERXT1JEIGR3SW5mb1R5cGUsTFBDV1NUUiBzcmMsSU5UIGNjaFNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV09SRCBjaGFydHlwZSkKewoJcmV0dXJuIEdldFN0cmluZ1R5cGVFeFcoMC8qZGVmYXVsdGxvY2FsZSovLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGVFeDMyVwlbS0VSTkVMMzIuMzk4XQogKgogKiBGSVhNRTogdW5pY29kZSBjaGFycyBhcmUgYXNzdW1lZCBjaGFycwogKi8KQk9PTCBXSU5BUEkgR2V0U3RyaW5nVHlwZUV4VyhMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1dTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJaW50CWk7CgoKCWlmIChjY2hTcmM9PS0xKQoJICBjY2hTcmM9bHN0cmxlblcoc3JjKSsxOwoJCglzd2l0Y2ggKGR3SW5mb1R5cGUpIHsKCWNhc2UgQ1RfQ1RZUEUyOgoJCUZJWE1FXyhvbGUpKCJDVF9DVFlQRTIgbm90IHN1cHBvcnRlZC5cbiIpOwoJCXJldHVybiBGQUxTRTsKCWNhc2UgQ1RfQ1RZUEUzOgoJCUZJWE1FXyhvbGUpKCJDVF9DVFlQRTMgbm90IHN1cHBvcnRlZC5cbiIpOwoJCXJldHVybiBGQUxTRTsKCWRlZmF1bHQ6YnJlYWs7Cgl9Cglmb3IgKGk9MDtpPGNjaFNyYztpKyspIHsKCQljaGFydHlwZVtpXSA9IDA7CgkJaWYgKGlzZGlnaXQoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0RJR0lUOwoJCWlmIChpc2FscGhhKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9BTFBIQTsKCQlpZiAoaXNsb3dlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfTE9XRVI7CgkJaWYgKGlzdXBwZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1VQUEVSOwoJCWlmIChpc3NwYWNlKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9TUEFDRTsKCQlpZiAoaXNwdW5jdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfUFVOQ1Q7CgkJaWYgKGlzY250cmwoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0NOVFJMOwovKiBGSVhNRTogaXNibGFuaygpIGlzIGEgR05VIGV4dGVuc2lvbiAqLwovKgkJaWYgKGlzYmxhbmsoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0JMQU5LOyAqLwogICAgICAgICAgICAgICAgaWYgKChzcmNbaV0gPT0gJyAnKSB8fCAoc3JjW2ldID09ICdcdCcpKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7CgkJLyogQzFfWERJR0lUICovCgl9CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFdJTkVfR2V0TGFuZ3VhZ2VOYW1lICAgW2ludGVybmFsXSAKICovCnN0YXRpYyBMUENTVFIgV0lORV9HZXRMYW5ndWFnZU5hbWUoIFVJTlQgbGFuZ2lkICkKewogICAgaW50IGk7CiAgICBmb3IgKCBpID0gMDsgbGFuZ3VhZ2VzW2ldLmxhbmdpZCAhPSAwOyBpKysgKQogICAgICAgIGlmICggbGFuZ2lkID09IGxhbmd1YWdlc1tpXS5sYW5naWQgKQogICAgICAgICAgICBicmVhazsKCiAgICByZXR1cm4gbGFuZ3VhZ2VzW2ldLmxhbmduYW1lOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFZlckxhbmd1YWdlTmFtZUEgICAgICAgICAgICAgIFtLRVJORUwzMi43MDldW1ZFUlNJT04uOV0KICovCkRXT1JEIFdJTkFQSSBWZXJMYW5ndWFnZU5hbWVBKCBVSU5UIHdMYW5nLCBMUFNUUiBzekxhbmcsIFVJTlQgblNpemUgKQp7CiAgICBjaGFyICAgIGJ1ZmZlcls4MF07CiAgICBMUENTVFIgIG5hbWU7CiAgICBEV09SRCAgIHJlc3VsdDsKCiAgICAvKgogICAgICogRmlyc3QsIGNoZWNrIFxTeXN0ZW1cQ3VycmVudENvbnRyb2xTZXRcY29udHJvbFxObHNcTG9jYWxlXDxsYW5naWQ+CiAgICAgKiBmcm9tIHRoZSByZWdpc3RyeS4KICAgICAqLwoKICAgIHNwcmludGYoIGJ1ZmZlciwKICAgICAgICAgICAgICJcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwlMDh4IiwKICAgICAgICAgICAgIHdMYW5nICk7CgogICAgcmVzdWx0ID0gUmVnUXVlcnlWYWx1ZUEoIEhLRVlfTE9DQUxfTUFDSElORSwgYnVmZmVyLCBzekxhbmcsIChMUERXT1JEKSZuU2l6ZSApOwogICAgaWYgKCByZXN1bHQgPT0gRVJST1JfU1VDQ0VTUyB8fCByZXN1bHQgPT0gRVJST1JfTU9SRV9EQVRBICkKICAgICAgICByZXR1cm4gblNpemU7CgogICAgLyoKICAgICAqIElmIHRoYXQgZmFpbHMsIHVzZSB0aGUgaW50ZXJuYWwgdGFibGUKICAgICAqLwoKICAgIG5hbWUgPSBXSU5FX0dldExhbmd1YWdlTmFtZSggd0xhbmcgKTsKICAgIGxzdHJjcHluQSggc3pMYW5nLCBuYW1lLCBuU2l6ZSApOwogICAgcmV0dXJuIGxzdHJsZW5BKCBuYW1lICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVmVyTGFuZ3VhZ2VOYW1lVyAgICAgICAgICAgICAgW0tFUk5FTDMyLjcxMF1bVkVSU0lPTi4xMF0KICovCkRXT1JEIFdJTkFQSSBWZXJMYW5ndWFnZU5hbWVXKCBVSU5UIHdMYW5nLCBMUFdTVFIgc3pMYW5nLCBVSU5UIG5TaXplICkKewogICAgY2hhciAgICBidWZmZXJbODBdOwogICAgTFBXU1RSICBrZXluYW1lOwogICAgTFBDU1RSICBuYW1lOwogICAgRFdPUkQgICByZXN1bHQ7CgogICAgLyoKICAgICAqIEZpcnN0LCBjaGVjayBcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XGNvbnRyb2xcTmxzXExvY2FsZVw8bGFuZ2lkPgogICAgICogZnJvbSB0aGUgcmVnaXN0cnkuCiAgICAgKi8KCiAgICBzcHJpbnRmKCBidWZmZXIsCiAgICAgICAgICAgICAiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcJTA4eCIsCiAgICAgICAgICAgICB3TGFuZyApOwoKICAgIGtleW5hbWUgPSBIRUFQX3N0cmR1cEF0b1coIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZmZlciApOwogICAgcmVzdWx0ID0gUmVnUXVlcnlWYWx1ZVcoIEhLRVlfTE9DQUxfTUFDSElORSwga2V5bmFtZSwgc3pMYW5nLCAoTFBEV09SRCkmblNpemUgKTsKICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBrZXluYW1lICk7CgogICAgaWYgKCByZXN1bHQgPT0gRVJST1JfU1VDQ0VTUyB8fCByZXN1bHQgPT0gRVJST1JfTU9SRV9EQVRBICkKICAgICAgICByZXR1cm4gblNpemU7CgogICAgLyoKICAgICAqIElmIHRoYXQgZmFpbHMsIHVzZSB0aGUgaW50ZXJuYWwgdGFibGUKICAgICAqLwoKICAgIG5hbWUgPSBXSU5FX0dldExhbmd1YWdlTmFtZSggd0xhbmcgKTsKICAgIGxzdHJjcHluQXRvVyggc3pMYW5nLCBuYW1lLCBuU2l6ZSApOwogICAgcmV0dXJuIGxzdHJsZW5BKCBuYW1lICk7Cn0KCiAKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgTENNX1VuaWNvZGVfTFVUW10gPSB7CiAgNiAgICAgICwgICAzLCAvKiAgIC0gICAxICovICAKICA2ICAgICAgLCAgIDQsIC8qICAgLSAgIDIgKi8gIAogIDYgICAgICAsICAgNSwgLyogICAtICAgMyAqLyAgCiAgNiAgICAgICwgICA2LCAvKiAgIC0gICA0ICovICAKICA2ICAgICAgLCAgIDcsIC8qICAgLSAgIDUgKi8gIAogIDYgICAgICAsICAgOCwgLyogICAtICAgNiAqLyAgCiAgNiAgICAgICwgICA5LCAvKiAgIC0gICA3ICovICAKICA2ICAgICAgLCAgMTAsIC8qICAgLSAgIDggKi8gIAogIDcgICAgICAsICAgNSwgLyogICAtICAgOSAqLyAgCiAgNyAgICAgICwgICA2LCAvKiAgIC0gIDEwICovICAKICA3ICAgICAgLCAgIDcsIC8qICAgLSAgMTEgKi8gIAogIDcgICAgICAsICAgOCwgLyogICAtICAxMiAqLyAgCiAgNyAgICAgICwgICA5LCAvKiAgIC0gIDEzICovICAKICA2ICAgICAgLCAgMTEsIC8qICAgLSAgMTQgKi8gIAogIDYgICAgICAsICAxMiwgLyogICAtICAxNSAqLyAgCiAgNiAgICAgICwgIDEzLCAvKiAgIC0gIDE2ICovICAKICA2ICAgICAgLCAgMTQsIC8qICAgLSAgMTcgKi8gIAogIDYgICAgICAsICAxNSwgLyogICAtICAxOCAqLyAgCiAgNiAgICAgICwgIDE2LCAvKiAgIC0gIDE5ICovICAKICA2ICAgICAgLCAgMTcsIC8qICAgLSAgMjAgKi8gIAogIDYgICAgICAsICAxOCwgLyogICAtICAyMSAqLyAgCiAgNiAgICAgICwgIDE5LCAvKiAgIC0gIDIyICovICAKICA2ICAgICAgLCAgMjAsIC8qICAgLSAgMjMgKi8gIAogIDYgICAgICAsICAyMSwgLyogICAtICAyNCAqLyAgCiAgNiAgICAgICwgIDIyLCAvKiAgIC0gIDI1ICovICAKICA2ICAgICAgLCAgMjMsIC8qICAgLSAgMjYgKi8gIAogIDYgICAgICAsICAyNCwgLyogICAtICAyNyAqLyAgCiAgNiAgICAgICwgIDI1LCAvKiAgIC0gIDI4ICovICAKICA2ICAgICAgLCAgMjYsIC8qICAgLSAgMjkgKi8gIAogIDYgICAgICAsICAyNywgLyogICAtICAzMCAqLyAgCiAgNiAgICAgICwgIDI4LCAvKiAgIC0gIDMxICovICAKICA3ICAgICAgLCAgIDIsIC8qICAgLSAgMzIgKi8KICA3ICAgICAgLCAgMjgsIC8qICEgLSAgMzMgKi8KICA3ICAgICAgLCAgMjksIC8qICIgLSAgMzQgKi8gLyogIiAqLwogIDcgICAgICAsICAzMSwgLyogIyAtICAzNSAqLwogIDcgICAgICAsICAzMywgLyogJCAtICAzNiAqLwogIDcgICAgICAsICAzNSwgLyogJSAtICAzNyAqLwogIDcgICAgICAsICAzNywgLyogJiAtICAzOCAqLwogIDYgICAgICAsIDEyOCwgLyogJyAtICAzOSAqLwogIDcgICAgICAsICAzOSwgLyogKCAtICA0MCAqLwogIDcgICAgICAsICA0MiwgLyogKSAtICA0MSAqLwogIDcgICAgICAsICA0NSwgLyogKiAtICA0MiAqLwogIDggICAgICAsICAgMywgLyogKyAtICA0MyAqLwogIDcgICAgICAsICA0NywgLyogLCAtICA0NCAqLwogIDYgICAgICAsIDEzMCwgLyogLSAtICA0NSAqLwogIDcgICAgICAsICA1MSwgLyogLiAtICA0NiAqLwogIDcgICAgICAsICA1MywgLyogLyAtICA0NyAqLwogMTIgICAgICAsICAgMywgLyogMCAtICA0OCAqLwogMTIgICAgICAsICAzMywgLyogMSAtICA0OSAqLwogMTIgICAgICAsICA1MSwgLyogMiAtICA1MCAqLwogMTIgICAgICAsICA3MCwgLyogMyAtICA1MSAqLwogMTIgICAgICAsICA4OCwgLyogNCAtICA1MiAqLwogMTIgICAgICAsIDEwNiwgLyogNSAtICA1MyAqLwogMTIgICAgICAsIDEyNSwgLyogNiAtICA1NCAqLwogMTIgICAgICAsIDE0NCwgLyogNyAtICA1NSAqLwogMTIgICAgICAsIDE2MiwgLyogOCAtICA1NiAqLwogMTIgICAgICAsIDE4MCwgLyogOSAtICA1NyAqLwogIDcgICAgICAsICA1NSwgLyogOiAtICA1OCAqLwogIDcgICAgICAsICA1OCwgLyogOyAtICA1OSAqLwogIDggICAgICAsICAxNCwgLyogPCAtICA2MCAqLwogIDggICAgICAsICAxOCwgLyogPSAtICA2MSAqLwogIDggICAgICAsICAyMCwgLyogPiAtICA2MiAqLwogIDcgICAgICAsICA2MCwgLyogPyAtICA2MyAqLwogIDcgICAgICAsICA2MiwgLyogQCAtICA2NCAqLwogMTQgICAgICAsICAgMiwgLyogQSAtICA2NSAqLwogMTQgICAgICAsICAgOSwgLyogQiAtICA2NiAqLwogMTQgICAgICAsICAxMCwgLyogQyAtICA2NyAqLwogMTQgICAgICAsICAyNiwgLyogRCAtICA2OCAqLwogMTQgICAgICAsICAzMywgLyogRSAtICA2OSAqLwogMTQgICAgICAsICAzNSwgLyogRiAtICA3MCAqLwogMTQgICAgICAsICAzNywgLyogRyAtICA3MSAqLwogMTQgICAgICAsICA0NCwgLyogSCAtICA3MiAqLwogMTQgICAgICAsICA1MCwgLyogSSAtICA3MyAqLwogMTQgICAgICAsICA1MywgLyogSiAtICA3NCAqLwogMTQgICAgICAsICA1NCwgLyogSyAtICA3NSAqLwogMTQgICAgICAsICA3MiwgLyogTCAtICA3NiAqLwogMTQgICAgICAsICA4MSwgLyogTSAtICA3NyAqLwogMTQgICAgICAsIDExMiwgLyogTiAtICA3OCAqLwogMTQgICAgICAsIDEyNCwgLyogTyAtICA3OSAqLwogMTQgICAgICAsIDEyNiwgLyogUCAtICA4MCAqLwogMTQgICAgICAsIDEzNywgLyogUSAtICA4MSAqLwogMTQgICAgICAsIDEzOCwgLyogUiAtICA4MiAqLwogMTQgICAgICAsIDE0NSwgLyogUyAtICA4MyAqLwogMTQgICAgICAsIDE1MywgLyogVCAtICA4NCAqLwogMTQgICAgICAsIDE1OSwgLyogVSAtICA4NSAqLwogMTQgICAgICAsIDE2MiwgLyogViAtICA4NiAqLwogMTQgICAgICAsIDE2NCwgLyogVyAtICA4NyAqLwogMTQgICAgICAsIDE2NiwgLyogWCAtICA4OCAqLwogMTQgICAgICAsIDE2NywgLyogWSAtICA4OSAqLwogMTQgICAgICAsIDE2OSwgLyogWiAtICA5MCAqLwogIDcgICAgICAsICA2MywgLyogWyAtICA5MSAqLwogIDcgICAgICAsICA2NSwgLyogXCAtICA5MiAqLwogIDcgICAgICAsICA2NiwgLyogXSAtICA5MyAqLwogIDcgICAgICAsICA2NywgLyogXiAtICA5NCAqLwogIDcgICAgICAsICA2OCwgLyogXyAtICA5NSAqLwogIDcgICAgICAsICA3MiwgLyogYCAtICA5NiAqLwogMTQgICAgICAsICAgMiwgLyogYSAtICA5NyAqLwogMTQgICAgICAsICAgOSwgLyogYiAtICA5OCAqLwogMTQgICAgICAsICAxMCwgLyogYyAtICA5OSAqLwogMTQgICAgICAsICAyNiwgLyogZCAtIDEwMCAqLwogMTQgICAgICAsICAzMywgLyogZSAtIDEwMSAqLwogMTQgICAgICAsICAzNSwgLyogZiAtIDEwMiAqLwogMTQgICAgICAsICAzNywgLyogZyAtIDEwMyAqLwogMTQgICAgICAsICA0NCwgLyogaCAtIDEwNCAqLwogMTQgICAgICAsICA1MCwgLyogaSAtIDEwNSAqLwogMTQgICAgICAsICA1MywgLyogaiAtIDEwNiAqLwogMTQgICAgICAsICA1NCwgLyogayAtIDEwNyAqLwogMTQgICAgICAsICA3MiwgLyogbCAtIDEwOCAqLwogMTQgICAgICAsICA4MSwgLyogbSAtIDEwOSAqLwogMTQgICAgICAsIDExMiwgLyogbiAtIDExMCAqLwogMTQgICAgICAsIDEyNCwgLyogbyAtIDExMSAqLwogMTQgICAgICAsIDEyNiwgLyogcCAtIDExMiAqLwogMTQgICAgICAsIDEzNywgLyogcSAtIDExMyAqLwogMTQgICAgICAsIDEzOCwgLyogciAtIDExNCAqLwogMTQgICAgICAsIDE0NSwgLyogcyAtIDExNSAqLwogMTQgICAgICAsIDE1MywgLyogdCAtIDExNiAqLwogMTQgICAgICAsIDE1OSwgLyogdSAtIDExNyAqLwogMTQgICAgICAsIDE2MiwgLyogdiAtIDExOCAqLwogMTQgICAgICAsIDE2NCwgLyogdyAtIDExOSAqLwogMTQgICAgICAsIDE2NiwgLyogeCAtIDEyMCAqLwogMTQgICAgICAsIDE2NywgLyogeSAtIDEyMSAqLwogMTQgICAgICAsIDE2OSwgLyogeiAtIDEyMiAqLwogIDcgICAgICAsICA3NCwgLyogeyAtIDEyMyAqLwogIDcgICAgICAsICA3NiwgLyogfCAtIDEyNCAqLwogIDcgICAgICAsICA3OCwgLyogfSAtIDEyNSAqLwogIDcgICAgICAsICA4MCwgLyogfiAtIDEyNiAqLwogIDYgICAgICAsICAyOSwgLyogfyAtIDEyNyAqLwogIDYgICAgICAsICAzMCwgLyoggCAtIDEyOCAqLwogIDYgICAgICAsICAzMSwgLyoggSAtIDEyOSAqLwogIDcgICAgICAsIDEyMywgLyoggiAtIDEzMCAqLwogMTQgICAgICAsICAzNSwgLyoggyAtIDEzMSAqLwogIDcgICAgICAsIDEyNywgLyoghCAtIDEzMiAqLwogMTAgICAgICAsICAyMSwgLyoghSAtIDEzMyAqLwogMTAgICAgICAsICAxNSwgLyoghiAtIDEzNCAqLwogMTAgICAgICAsICAxNiwgLyoghyAtIDEzNSAqLwogIDcgICAgICAsICA2NywgLyogiCAtIDEzNiAqLwogMTAgICAgICAsICAyMiwgLyogiSAtIDEzNyAqLwogMTQgICAgICAsIDE0NSwgLyogiiAtIDEzOCAqLwogIDcgICAgICAsIDEzNiwgLyogiyAtIDEzOSAqLwogMTQgKyAxNiAsIDEyNCwgLyogjCAtIDE0MCAqLwogIDYgICAgICAsICA0MywgLyogjSAtIDE0MSAqLwogIDYgICAgICAsICA0NCwgLyogjiAtIDE0MiAqLwogIDYgICAgICAsICA0NSwgLyogjyAtIDE0MyAqLwogIDYgICAgICAsICA0NiwgLyogkCAtIDE0NCAqLwogIDcgICAgICAsIDEyMSwgLyogkSAtIDE0NSAqLwogIDcgICAgICAsIDEyMiwgLyogkiAtIDE0NiAqLwogIDcgICAgICAsIDEyNSwgLyogkyAtIDE0NyAqLwogIDcgICAgICAsIDEyNiwgLyoglCAtIDE0OCAqLwogMTAgICAgICAsICAxNywgLyoglSAtIDE0OSAqLwogIDYgICAgICAsIDEzNywgLyogliAtIDE1MCAqLwogIDYgICAgICAsIDEzOSwgLyoglyAtIDE1MSAqLwogIDcgICAgICAsICA5MywgLyogmCAtIDE1MiAqLwogMTQgICAgICAsIDE1NiwgLyogmSAtIDE1MyAqLwogMTQgICAgICAsIDE0NSwgLyogmiAtIDE1NCAqLwogIDcgICAgICAsIDEzNywgLyogmyAtIDE1NSAqLwogMTQgKyAxNiAsIDEyNCwgLyognCAtIDE1NiAqLwogIDYgICAgICAsICA1OSwgLyognSAtIDE1NyAqLwogIDYgICAgICAsICA2MCwgLyogniAtIDE1OCAqLwogMTQgICAgICAsIDE2NywgLyognyAtIDE1OSAqLwogIDcgICAgICAsICAgNCwgLyogoCAtIDE2MCAqLwogIDcgICAgICAsICA4MSwgLyogoSAtIDE2MSAqLwogMTAgICAgICAsICAgMiwgLyogoiAtIDE2MiAqLwogMTAgICAgICAsICAgMywgLyogoyAtIDE2MyAqLwogMTAgICAgICAsICAgNCwgLyogpCAtIDE2NCAqLwogMTAgICAgICAsICAgNSwgLyogpSAtIDE2NSAqLwogIDcgICAgICAsICA4MiwgLyogpiAtIDE2NiAqLwogMTAgICAgICAsICAgNiwgLyogpyAtIDE2NyAqLwogIDcgICAgICAsICA4MywgLyogqCAtIDE2OCAqLwogMTAgICAgICAsICAgNywgLyogqSAtIDE2OSAqLwogMTQgICAgICAsICAgMiwgLyogqiAtIDE3MCAqLwogIDggICAgICAsICAyNCwgLyogqyAtIDE3MSAqLwogMTAgICAgICAsICAgOCwgLyogrCAtIDE3MiAqLwogIDYgICAgICAsIDEzMSwgLyogrSAtIDE3MyAqLwogMTAgICAgICAsICAgOSwgLyogriAtIDE3NCAqLwogIDcgICAgICAsICA4NCwgLyogryAtIDE3NSAqLwogMTAgICAgICAsICAxMCwgLyogsCAtIDE3NiAqLwogIDggICAgICAsICAyMywgLyogsSAtIDE3NyAqLwogMTIgICAgICAsICA1MSwgLyogsiAtIDE3OCAqLwogMTIgICAgICAsICA3MCwgLyogsyAtIDE3OSAqLwogIDcgICAgICAsICA4NSwgLyogtCAtIDE4MCAqLwogMTAgICAgICAsICAxMSwgLyogtSAtIDE4MSAqLwogMTAgICAgICAsICAxMiwgLyogtiAtIDE4MiAqLwogMTAgICAgICAsICAxMywgLyogtyAtIDE4MyAqLwogIDcgICAgICAsICA4NiwgLyoguCAtIDE4NCAqLwogMTIgICAgICAsICAzMywgLyoguSAtIDE4NSAqLwogMTQgICAgICAsIDEyNCwgLyoguiAtIDE4NiAqLwogIDggICAgICAsICAyNiwgLyoguyAtIDE4NyAqLwogMTIgICAgICAsICAyMSwgLyogvCAtIDE4OCAqLwogMTIgICAgICAsICAyNSwgLyogvSAtIDE4OSAqLwogMTIgICAgICAsICAyOSwgLyogviAtIDE5MCAqLwogIDcgICAgICAsICA4NywgLyogvyAtIDE5MSAqLwogMTQgICAgICAsICAgMiwgLyogwCAtIDE5MiAqLwogMTQgICAgICAsICAgMiwgLyogwSAtIDE5MyAqLwogMTQgICAgICAsICAgMiwgLyogwiAtIDE5NCAqLwogMTQgICAgICAsICAgMiwgLyogwyAtIDE5NSAqLwogMTQgICAgICAsICAgMiwgLyogxCAtIDE5NiAqLwogMTQgICAgICAsICAgMiwgLyogxSAtIDE5NyAqLwogMTQgKyAxNiAsICAgMiwgLyogxiAtIDE5OCAqLwogMTQgICAgICAsICAxMCwgLyogxyAtIDE5OSAqLwogMTQgICAgICAsICAzMywgLyogyCAtIDIwMCAqLwogMTQgICAgICAsICAzMywgLyogySAtIDIwMSAqLwogMTQgICAgICAsICAzMywgLyogyiAtIDIwMiAqLwogMTQgICAgICAsICAzMywgLyogyyAtIDIwMyAqLwogMTQgICAgICAsICA1MCwgLyogzCAtIDIwNCAqLwogMTQgICAgICAsICA1MCwgLyogzSAtIDIwNSAqLwogMTQgICAgICAsICA1MCwgLyogziAtIDIwNiAqLwogMTQgICAgICAsICA1MCwgLyogzyAtIDIwNyAqLwogMTQgICAgICAsICAyNiwgLyog0CAtIDIwOCAqLwogMTQgICAgICAsIDExMiwgLyog0SAtIDIwOSAqLwogMTQgICAgICAsIDEyNCwgLyog0iAtIDIxMCAqLwogMTQgICAgICAsIDEyNCwgLyog0yAtIDIxMSAqLwogMTQgICAgICAsIDEyNCwgLyog1CAtIDIxMiAqLwogMTQgICAgICAsIDEyNCwgLyog1SAtIDIxMyAqLwogMTQgICAgICAsIDEyNCwgLyog1iAtIDIxNCAqLwogIDggICAgICAsICAyOCwgLyog1yAtIDIxNSAqLwogMTQgICAgICAsIDEyNCwgLyog2CAtIDIxNiAqLwogMTQgICAgICAsIDE1OSwgLyog2SAtIDIxNyAqLwogMTQgICAgICAsIDE1OSwgLyog2iAtIDIxOCAqLwogMTQgICAgICAsIDE1OSwgLyog2yAtIDIxOSAqLwogMTQgICAgICAsIDE1OSwgLyog3CAtIDIyMCAqLwogMTQgICAgICAsIDE2NywgLyog3SAtIDIyMSAqLwogMTQgKyAzMiAsIDE1MywgLyog3iAtIDIyMiAqLwogMTQgKyA0OCAsIDE0NSwgLyog3yAtIDIyMyAqLwogMTQgICAgICAsICAgMiwgLyog4CAtIDIyNCAqLwogMTQgICAgICAsICAgMiwgLyog4SAtIDIyNSAqLwogMTQgICAgICAsICAgMiwgLyog4iAtIDIyNiAqLwogMTQgICAgICAsICAgMiwgLyog4yAtIDIyNyAqLwogMTQgICAgICAsICAgMiwgLyog5CAtIDIyOCAqLwogMTQgICAgICAsICAgMiwgLyog5SAtIDIyOSAqLwogMTQgKyAxNiAsICAgMiwgLyog5iAtIDIzMCAqLwogMTQgICAgICAsICAxMCwgLyog5yAtIDIzMSAqLwogMTQgICAgICAsICAzMywgLyog6CAtIDIzMiAqLwogMTQgICAgICAsICAzMywgLyog6SAtIDIzMyAqLwogMTQgICAgICAsICAzMywgLyog6iAtIDIzNCAqLwogMTQgICAgICAsICAzMywgLyog6yAtIDIzNSAqLwogMTQgICAgICAsICA1MCwgLyog7CAtIDIzNiAqLwogMTQgICAgICAsICA1MCwgLyog7SAtIDIzNyAqLwogMTQgICAgICAsICA1MCwgLyog7iAtIDIzOCAqLwogMTQgICAgICAsICA1MCwgLyog7yAtIDIzOSAqLwogMTQgICAgICAsICAyNiwgLyog8CAtIDI0MCAqLwogMTQgICAgICAsIDExMiwgLyog8SAtIDI0MSAqLwogMTQgICAgICAsIDEyNCwgLyog8iAtIDI0MiAqLwogMTQgICAgICAsIDEyNCwgLyog8yAtIDI0MyAqLwogMTQgICAgICAsIDEyNCwgLyog9CAtIDI0NCAqLwogMTQgICAgICAsIDEyNCwgLyog9SAtIDI0NSAqLwogMTQgICAgICAsIDEyNCwgLyog9iAtIDI0NiAqLwogIDggICAgICAsICAyOSwgLyog9yAtIDI0NyAqLwogMTQgICAgICAsIDEyNCwgLyog+CAtIDI0OCAqLwogMTQgICAgICAsIDE1OSwgLyog+SAtIDI0OSAqLwogMTQgICAgICAsIDE1OSwgLyog+iAtIDI1MCAqLwogMTQgICAgICAsIDE1OSwgLyog+yAtIDI1MSAqLwogMTQgICAgICAsIDE1OSwgLyog/CAtIDI1MiAqLwogMTQgICAgICAsIDE2NywgLyog/SAtIDI1MyAqLwogMTQgKyAzMiAsIDE1MywgLyog/iAtIDI1NCAqLwogMTQgICAgICAsIDE2NyAgLyog/yAtIDI1NSAqLyB9OwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgTENNX1VuaWNvZGVfTFVUXzJbXSA9IHsgMzMsIDQ0LCAxNDUgfTsKCiNkZWZpbmUgTENNX0RpYWNyaXRpY19TdGFydCAxMzEKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9EaWFjcml0aWNfTFVUW10gPSB7IAoxMjMsICAvKiCDIC0gMTMxICovCiAgMiwgIC8qIIQgLSAxMzIgKi8KICAyLCAgLyoghSAtIDEzMyAqLwogIDIsICAvKiCGIC0gMTM0ICovCiAgMiwgIC8qIIcgLSAxMzUgKi8KICAzLCAgLyogiCAtIDEzNiAqLwogIDIsICAvKiCJIC0gMTM3ICovCiAyMCwgIC8qIIogLSAxMzggKi8KICAyLCAgLyogiyAtIDEzOSAqLwogIDIsICAvKiCMIC0gMTQwICovCiAgMiwgIC8qII0gLSAxNDEgKi8KICAyLCAgLyogjiAtIDE0MiAqLwogIDIsICAvKiCPIC0gMTQzICovCiAgMiwgIC8qIJAgLSAxNDQgKi8KICAyLCAgLyogkSAtIDE0NSAqLwogIDIsICAvKiCSIC0gMTQ2ICovCiAgMiwgIC8qIJMgLSAxNDcgKi8KICAyLCAgLyoglCAtIDE0OCAqLwogIDIsICAvKiCVIC0gMTQ5ICovCiAgMiwgIC8qIJYgLSAxNTAgKi8KICAyLCAgLyoglyAtIDE1MSAqLwogIDIsICAvKiCYIC0gMTUyICovCiAgMiwgIC8qIJkgLSAxNTMgKi8KIDIwLCAgLyogmiAtIDE1NCAqLwogIDIsICAvKiCbIC0gMTU1ICovCiAgMiwgIC8qIJwgLSAxNTYgKi8KICAyLCAgLyognSAtIDE1NyAqLwogIDIsICAvKiCeIC0gMTU4ICovCiAxOSwgIC8qIJ8gLSAxNTkgKi8KICAyLCAgLyogoCAtIDE2MCAqLwogIDIsICAvKiChIC0gMTYxICovCiAgMiwgIC8qIKIgLSAxNjIgKi8KICAyLCAgLyogoyAtIDE2MyAqLwogIDIsICAvKiCkIC0gMTY0ICovCiAgMiwgIC8qIKUgLSAxNjUgKi8KICAyLCAgLyogpiAtIDE2NiAqLwogIDIsICAvKiCnIC0gMTY3ICovCiAgMiwgIC8qIKggLSAxNjggKi8KICAyLCAgLyogqSAtIDE2OSAqLwogIDMsICAvKiCqIC0gMTcwICovCiAgMiwgIC8qIKsgLSAxNzEgKi8KICAyLCAgLyogrCAtIDE3MiAqLwogIDIsICAvKiCtIC0gMTczICovCiAgMiwgIC8qIK4gLSAxNzQgKi8KICAyLCAgLyogryAtIDE3NSAqLwogIDIsICAvKiCwIC0gMTc2ICovCiAgMiwgIC8qILEgLSAxNzcgKi8KICAyLCAgLyogsiAtIDE3OCAqLwogIDIsICAvKiCzIC0gMTc5ICovCiAgMiwgIC8qILQgLSAxODAgKi8KICAyLCAgLyogtSAtIDE4MSAqLwogIDIsICAvKiC2IC0gMTgyICovCiAgMiwgIC8qILcgLSAxODMgKi8KICAyLCAgLyoguCAtIDE4NCAqLwogIDIsICAvKiC5IC0gMTg1ICovCiAgMywgIC8qILogLSAxODYgKi8KICAyLCAgLyoguyAtIDE4NyAqLwogIDIsICAvKiC8IC0gMTg4ICovCiAgMiwgIC8qIL0gLSAxODkgKi8KICAyLCAgLyogviAtIDE5MCAqLwogIDIsICAvKiC/IC0gMTkxICovCiAxNSwgIC8qIMAgLSAxOTIgKi8KIDE0LCAgLyogwSAtIDE5MyAqLwogMTgsICAvKiDCIC0gMTk0ICovCiAyNSwgIC8qIMMgLSAxOTUgKi8KIDE5LCAgLyogxCAtIDE5NiAqLwogMjYsICAvKiDFIC0gMTk3ICovCiAgMiwgIC8qIMYgLSAxOTggKi8KIDI4LCAgLyogxyAtIDE5OSAqLwogMTUsICAvKiDIIC0gMjAwICovCiAxNCwgIC8qIMkgLSAyMDEgKi8KIDE4LCAgLyogyiAtIDIwMiAqLwogMTksICAvKiDLIC0gMjAzICovCiAxNSwgIC8qIMwgLSAyMDQgKi8KIDE0LCAgLyogzSAtIDIwNSAqLwogMTgsICAvKiDOIC0gMjA2ICovCiAxOSwgIC8qIM8gLSAyMDcgKi8KMTA0LCAgLyog0CAtIDIwOCAqLwogMjUsICAvKiDRIC0gMjA5ICovCiAxNSwgIC8qINIgLSAyMTAgKi8KIDE0LCAgLyog0yAtIDIxMSAqLwogMTgsICAvKiDUIC0gMjEyICovCiAyNSwgIC8qINUgLSAyMTMgKi8KIDE5LCAgLyog1iAtIDIxNCAqLwogIDIsICAvKiDXIC0gMjE1ICovCiAzMywgIC8qINggLSAyMTYgKi8KIDE1LCAgLyog2SAtIDIxNyAqLwogMTQsICAvKiDaIC0gMjE4ICovCiAxOCwgIC8qINsgLSAyMTkgKi8KIDE5LCAgLyog3CAtIDIyMCAqLwogMTQsICAvKiDdIC0gMjIxICovCiAgMiwgIC8qIN4gLSAyMjIgKi8KICAyLCAgLyog3yAtIDIyMyAqLwogMTUsICAvKiDgIC0gMjI0ICovCiAxNCwgIC8qIOEgLSAyMjUgKi8KIDE4LCAgLyog4iAtIDIyNiAqLwogMjUsICAvKiDjIC0gMjI3ICovCiAxOSwgIC8qIOQgLSAyMjggKi8KIDI2LCAgLyog5SAtIDIyOSAqLwogIDIsICAvKiDmIC0gMjMwICovCiAyOCwgIC8qIOcgLSAyMzEgKi8KIDE1LCAgLyog6CAtIDIzMiAqLwogMTQsICAvKiDpIC0gMjMzICovCiAxOCwgIC8qIOogLSAyMzQgKi8KIDE5LCAgLyog6yAtIDIzNSAqLwogMTUsICAvKiDsIC0gMjM2ICovCiAxNCwgIC8qIO0gLSAyMzcgKi8KIDE4LCAgLyog7iAtIDIzOCAqLwogMTksICAvKiDvIC0gMjM5ICovCjEwNCwgIC8qIPAgLSAyNDAgKi8KIDI1LCAgLyog8SAtIDI0MSAqLwogMTUsICAvKiDyIC0gMjQyICovCiAxNCwgIC8qIPMgLSAyNDMgKi8KIDE4LCAgLyog9CAtIDI0NCAqLwogMjUsICAvKiD1IC0gMjQ1ICovCiAxOSwgIC8qIPYgLSAyNDYgKi8KICAyLCAgLyog9yAtIDI0NyAqLwogMzMsICAvKiD4IC0gMjQ4ICovCiAxNSwgIC8qIPkgLSAyNDkgKi8KIDE0LCAgLyog+iAtIDI1MCAqLwogMTgsICAvKiD7IC0gMjUxICovCiAxOSwgIC8qIPwgLSAyNTIgKi8KIDE0LCAgLyog/SAtIDI1MyAqLwogIDIsICAvKiD+IC0gMjU0ICovCiAxOSwgIC8qIP8gLSAyNTUgKi8KfSA7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9MRTJOTFNfaXNQdW5jdHVhdGlvbiBbSU5URVJOQUxdCiAqLwpzdGF0aWMgaW50IE9MRTJOTFNfaXNQdW5jdHVhdGlvbih1bnNpZ25lZCBjaGFyIGMpIAp7CiAgLyogInB1bmN0dWF0aW9uIGNoYXJhY3RlciIgaW4gdGhpcyBjb250ZXh0IGlzIGEgY2hhcmFjdGVyIHdoaWNoIGlzIAogICAgIGNvbnNpZGVyZWQgImxlc3MgaW1wb3J0YW50IiBkdXJpbmcgd29yZCBzb3J0IGNvbXBhcmlzb24uCiAgICAgU2VlIExDTWFwU3RyaW5nIGltcGxlbWVudGF0aW9uIGZvciB0aGUgcHJlY2lzZSBkZWZpbml0aW9uIAogICAgIG9mICJsZXNzIGltcG9ydGFudCIuICovCgogIHJldHVybiAoTENNX1VuaWNvZGVfTFVUWy0yKzIqY109PTYpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9MRTJOTFNfaXNOb25TcGFjaW5nIFtJTlRFUk5BTF0KICovCnN0YXRpYyBpbnQgT0xFMk5MU19pc05vblNwYWNpbmcodW5zaWduZWQgY2hhciBjKSAKewogIC8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBMQ01hcFN0cmluZzMyQS4gIENoYXJhY3RlcnMgCiAgICAgZm9yIHdoaWNoIGl0IHJldHVybnMgdHJ1ZSBhcmUgaWdub3JlZCB3aGVuIG1hcHBpbmcgYQogICAgIHN0cmluZyB3aXRoIE5PUk1fSUdOT1JFTk9OU1BBQ0UgKi8KICByZXR1cm4gKChjPT0xMzYpIHx8IChjPT0xNzApIHx8IChjPT0xODYpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEUyTkxTX2lzU3ltYm9sIFtJTlRFUk5BTF0KICovCnN0YXRpYyBpbnQgT0xFMk5MU19pc1N5bWJvbCh1bnNpZ25lZCBjaGFyIGMpIAp7CiAgLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IExDTWFwU3RyaW5nMzJBLiAgQ2hhcmFjdGVycyAKICAgICBmb3Igd2hpY2ggaXQgcmV0dXJucyB0cnVlIGFyZSBpZ25vcmVkIHdoZW4gbWFwcGluZyBhCiAgICAgc3RyaW5nIHdpdGggTk9STV9JR05PUkVTWU1CT0xTICovCiAgcmV0dXJuICggKGMhPTApICYmICFJc0NoYXJBbHBoYU51bWVyaWNBKGMpICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCWlkZW50aXR5CVtJbnRlcm5hbF0KICovCnN0YXRpYyBpbnQgaWRlbnRpdHkoaW50IGMpCnsKICByZXR1cm4gYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nMzJBICAgICAgICAgICAgICAgIFtLRVJORUwzMi40OTJdCiAqCiAqIENvbnZlcnQgYSBzdHJpbmcsIG9yIGdlbmVyYXRlIGEgc29ydCBrZXkgZnJvbSBpdC4KICoKICogSWYgKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSksIHRoZSBmdW5jdGlvbiB3aWxsIGdlbmVyYXRlCiAqIGEgc29ydCBrZXkgZm9yIHRoZSBzb3VyY2Ugc3RyaW5nLiAgRWxzZSwgaXQgd2lsbCBjb252ZXJ0IGl0CiAqIGFjY29yZGluZ2x5IHRvIHRoZSBmbGFncyBMQ01BUF9VUFBFUkNBU0UsIExDTUFQX0xPV0VSQ0FTRSwuLi4KICoKICogUkVUVVJOUwogKiAgICBFcnJvciA6IDAuCiAqICAgIFN1Y2Nlc3MgOiBsZW5ndGggb2YgdGhlIHJlc3VsdCBzdHJpbmcuCiAqCiAqIE5PVEVTCiAqICAgIElmIGNhbGxlZCB3aXRoIHNjcmxlbiA9IC0xLCB0aGUgZnVuY3Rpb24gd2lsbCBjb21wdXRlIHRoZSBsZW5ndGgKICogICAgICBvZiB0aGUgMC10ZXJtaW5hdGVkIHN0cmluZyBzdHJzcmMgYnkgaXRzZWxmLiAgICAgIAogKiAKICogICAgSWYgY2FsbGVkIHdpdGggZHN0bGVuID0gMCwgcmV0dXJucyB0aGUgYnVmZmVyIGxlbmd0aCB0aGF0IAogKiAgICAgIHdvdWxkIGJlIHJlcXVpcmVkLgogKgogKiAgICBOT1JNX0lHTk9SRVdJRFRIIG1lYW5zIHRvIGNvbXBhcmUgQVNDSUkgYW5kIHdpZGUgY2hhcmFjdGVycwogKiAgICBhcyBpZiB0aGV5IGFyZSBlcXVhbC4gIAogKiAgICBJbiB0aGUgb25seSBjb2RlIHBhZ2UgaW1wbGVtZW50ZWQgc28gZmFyLCB0aGVyZSBtYXkgbm90IGJlCiAqICAgIHdpZGUgY2hhcmFjdGVycyBpbiBzdHJpbmdzIHBhc3NlZCB0byBMQ01hcFN0cmluZzMyQSwKICogICAgc28gdGhlcmUgaXMgbm90aGluZyB0byBiZSBkb25lIGZvciB0aGlzIGZsYWcuCiAqLwpJTlQgV0lOQVBJIExDTWFwU3RyaW5nQSgKCUxDSUQgbGNpZCAvKiBsb2NhbGUgaWRlbnRpZmllciBjcmVhdGVkIHdpdGggTUFLRUxDSUQ7IAoJCSAgICAgTE9DQUxFX1NZU1RFTV9ERUZBVUxUIGFuZCBMT0NBTEVfVVNFUl9ERUZBVUxUIGFyZSAKICAgICAgICAgICAgICAgICAgICAgcHJlZGVmaW5lZCB2YWx1ZXMuICovLAoJRFdPUkQgbWFwZmxhZ3MgLyogZmxhZ3MgKi8sCglMUENTVFIgc3Jjc3RyICAvKiBzb3VyY2UgYnVmZmVyICovLAoJSU5UIHNyY2xlbiAgIC8qIHNvdXJjZSBsZW5ndGggKi8sCglMUFNUUiBkc3RzdHIgICAvKiBkZXN0aW5hdGlvbiBidWZmZXIgKi8sCglJTlQgZHN0bGVuICAgLyogZGVzdGluYXRpb24gYnVmZmVyIGxlbmd0aCAqLykgCnsKICBpbnQgaTsKCiAgVFJBQ0VfKHN0cmluZykoIigweCUwNGx4LDB4JTA4bHgsJXMsJWQsJXAsJWQpXG4iLAoJbGNpZCxtYXBmbGFncyxzcmNzdHIsc3JjbGVuLGRzdHN0cixkc3RsZW4pOwoKICBpZiAoICgoZHN0bGVuIT0wKSAmJiAoZHN0c3RyPT1OVUxMKSkgfHwgKHNyY3N0cj09TlVMTCkgKQogIHsKICAgIEVSUl8ob2xlKSgiKHNyYz0lcyxkZXN0PSVzKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwgc3Jjc3RyLCBkc3RzdHIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KICBpZiAoc3JjbGVuID09IC0xKSAKICAgIHNyY2xlbiA9IGxzdHJsZW5BKHNyY3N0cikgKyAxIDsgICAgLyogKGluY2x1ZGUgZmluYWwgJ1wwJykgKi8KCiNkZWZpbmUgTENNQVBTVFJJTkdBX1NVUFBPUlRFRF9GTEFHUyAoTENNQVBfVVBQRVJDQVNFICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExDTUFQX0xPV0VSQ0FTRSAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ01BUF9TT1JUS0VZICAgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVDQVNFICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFTk9OU1BBQ0UgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT1JUX1NUUklOR1NPUlQgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVXSURUSCkKCiAgaWYgKG1hcGZsYWdzICYgfkxDTUFQU1RSSU5HQV9TVVBQT1JURURfRkxBR1MpCiAgewogICAgRklYTUVfKHN0cmluZykoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCgkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAoJICBsY2lkLAoJICBtYXBmbGFncywKCSAgc3Jjc3RyLAoJICBzcmNsZW4sCgkgIGRzdHN0ciwKCSAgZHN0bGVuLAoJICBtYXBmbGFncyAmIH5MQ01BUFNUUklOR0FfU1VQUE9SVEVEX0ZMQUdTCiAgICAgKTsKICB9CgogIGlmICggIShtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICkKICB7CiAgICBpbnQgaSxqOwogICAgaW50ICgqZikoaW50KSA9IGlkZW50aXR5OyAKICAgIGludCBmbGFnX2lnbm9yZW5vbnNwYWNlID0gbWFwZmxhZ3MgJiBOT1JNX0lHTk9SRU5PTlNQQUNFOwogICAgaW50IGZsYWdfaWdub3Jlc3ltYm9scyA9IG1hcGZsYWdzICYgTk9STV9JR05PUkVTWU1CT0xTOwoKICAgIGlmIChmbGFnX2lnbm9yZW5vbnNwYWNlIHx8IGZsYWdfaWdub3Jlc3ltYm9scykKICAgIHsKICAgICAgLyogRm9yIHNvbWUgdmFsdWVzIG9mIG1hcGZsYWdzLCB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgCgkgc3RyaW5nIGlzIG5vdCBrbm93biBhdCB0aGlzIHBvaW50LiAgV2luZG93cyBkb2VzIG1hcCB0aGUgc3RyaW5nCgkgYW5kIGRvZXMgbm90IFNldExhc3RFcnJvciBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSIGluCgkgdGhlc2UgY2FzZXMuICovCiAgICAgIGlmIChkc3RsZW49PTApCiAgICAgIHsKCS8qIENvbXB1dGUgcmVxdWlyZWQgbGVuZ3RoICovCglmb3IgKGk9aj0wOyBpIDwgc3JjbGVuOyBpKyspCgl7CgkgIGlmICggIShmbGFnX2lnbm9yZW5vbnNwYWNlICYmIE9MRTJOTFNfaXNOb25TcGFjaW5nKHNyY3N0cltpXSkpCgkgICAgICAgJiYgIShmbGFnX2lnbm9yZXN5bWJvbHMgJiYgT0xFMk5MU19pc1N5bWJvbChzcmNzdHJbaV0pKSApCgkgICAgaisrOwoJfQoJcmV0dXJuIGo7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaWYgKGRzdGxlbj09MCkKCXJldHVybiBzcmNsZW47ICAKICAgICAgaWYgKGRzdGxlbjxzcmNsZW4pIAoJICAgewoJICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgICAgIHJldHVybiAwOwoJICAgfQogICAgfQogICAgaWYgKG1hcGZsYWdzICYgTENNQVBfVVBQRVJDQVNFKQogICAgICBmID0gdG91cHBlcjsKICAgIGVsc2UgaWYgKG1hcGZsYWdzICYgTENNQVBfTE9XRVJDQVNFKQogICAgICBmID0gdG9sb3dlcjsKICAgIC8qIEZJWE1FOiBOT1JNX0lHTk9SRU5PTlNQQUNFIHJlcXVpcmVzIGFub3RoZXIgY29udmVyc2lvbiAqLwogICAgZm9yIChpPWo9MDsgKGk8c3JjbGVuKSAmJiAoajxkc3RsZW4pIDsgaSsrKQogICAgewogICAgICBpZiAoICEoZmxhZ19pZ25vcmVub25zcGFjZSAmJiBPTEUyTkxTX2lzTm9uU3BhY2luZyhzcmNzdHJbaV0pKQoJICAgJiYgIShmbGFnX2lnbm9yZXN5bWJvbHMgJiYgT0xFMk5MU19pc1N5bWJvbChzcmNzdHJbaV0pKSApCiAgICAgIHsKCWRzdHN0cltqXSA9IChDSEFSKSBmKHNyY3N0cltpXSk7CglqKys7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBqOwogIH0KCiAgLyogZWxzZSAuLi4gKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgICovCiAgewogICAgaW50IHVuaWNvZGVfbGVuPTA7CiAgICBpbnQgY2FzZV9sZW49MDsKICAgIGludCBkaWFjcml0aWNfbGVuPTA7CiAgICBpbnQgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW49MDsKICAgIGNoYXIgKmNhc2VfY29tcG9uZW50OwogICAgY2hhciAqZGlhY3JpdGljX2NvbXBvbmVudDsKICAgIGNoYXIgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50OwogICAgaW50IHJvb20sY291bnQ7CiAgICBpbnQgZmxhZ19zdHJpbmdzb3J0ID0gbWFwZmxhZ3MgJiBTT1JUX1NUUklOR1NPUlQ7CgogICAgLyogY29tcHV0ZSBob3cgbXVjaCByb29tIHdlIHdpbGwgbmVlZCAqLwogICAgZm9yIChpPTA7aTxzcmNsZW47aSsrKQogICAgewogICAgICBpbnQgb2ZzOwogICAgICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9jaGFyID0gc3Jjc3RyW2ldOwogICAgICBpZiAoc291cmNlX2NoYXIhPSdcMCcpIAogICAgICB7CglpZiAoZmxhZ19zdHJpbmdzb3J0IHx8ICFPTEUyTkxTX2lzUHVuY3R1YXRpb24oc291cmNlX2NoYXIpKQoJewoJICB1bmljb2RlX2xlbisrOwoJICBpZiAoIExDTV9Vbmljb2RlX0xVVFstMisyKnNvdXJjZV9jaGFyXSAmIH4xNSApCgkgICAgdW5pY29kZV9sZW4rKzsgICAgICAgICAgICAgLyogZG91YmxlIGxldHRlciAqLwoJfQoJZWxzZQoJewoJICBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbisrOwoJfQkgIAogICAgICB9CgkgIAogICAgICBpZiAoaXN1cHBlcihzb3VyY2VfY2hhcikpCgljYXNlX2xlbj11bmljb2RlX2xlbjsgCgogICAgICBvZnMgPSBzb3VyY2VfY2hhciAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CiAgICAgIGlmICgob2ZzPj0wKSAmJiAoTENNX0RpYWNyaXRpY19MVVRbb2ZzXSE9MikpCglkaWFjcml0aWNfbGVuPXVuaWNvZGVfbGVuOwogICAgfQoKICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFQ0FTRSkKICAgICAgY2FzZV9sZW49MDsgICAgICAgICAgICAgICAgICAgCiAgICBpZiAobWFwZmxhZ3MgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQogICAgICBkaWFjcml0aWNfbGVuPTA7CgogICAgcm9vbSA9ICAyICogdW5pY29kZV9sZW4gICAgICAgICAgICAgIC8qICJ1bmljb2RlIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgZGlhY3JpdGljX2xlbiAgICAgICAgICAgICAgICAvKiAiZGlhY3JpdGljIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgY2FzZV9sZW4gICAgICAgICAgICAgICAgICAgICAvKiAiY2FzZSIgY29tcG9uZW50ICovCiAgICAgICsgICAgIDQgKiBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbiAgLyogcHVuY3R1YXRpb24gaW4gd29yZCBzb3J0IG1vZGUgKi8KICAgICAgKyAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3VyICdcMScgc2VwYXJhdG9ycyAqLwogICAgICArICAgICAxICA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlcm1pbmFsICdcMCcgKi8KICAgIGlmIChkc3RsZW49PTApCiAgICAgIHJldHVybiByb29tOyAgICAgIAogICAgZWxzZSBpZiAoZHN0bGVuPHJvb20pCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLypGSVhNRSB0aGUgUG9pbnRlcmNoZWNrIHNob3VsZCBub3QgYmUgbmVzc2VzYXJ5ICovCiAgICBpZiAoSXNCYWRXcml0ZVB0ciAoZHN0c3RyLHJvb20pKQogICAgeyBFUlJfKHN0cmluZykoImJhZCBkZXN0aW5hdGlvbiBidWZmZXIgKGRzdHN0cikgOiAlcCwlZFxuIixkc3RzdHIsZHN0bGVuKTsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKiBsb2NhdGUgZWFjaCBjb21wb25lbnQsIHdyaXRlIHNlcGFyYXRvcnMgKi8KICAgIGRpYWNyaXRpY19jb21wb25lbnQgPSBkc3RzdHIgKyAyKnVuaWNvZGVfbGVuIDsKICAgICpkaWFjcml0aWNfY29tcG9uZW50KysgPSAnXDEnOyAKICAgIGNhc2VfY29tcG9uZW50ID0gZGlhY3JpdGljX2NvbXBvbmVudCArIGRpYWNyaXRpY19sZW4gOwogICAgKmNhc2VfY29tcG9uZW50KysgPSAnXDEnOyAKICAgIGRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50ID0gY2FzZV9jb21wb25lbnQgKyBjYXNlX2xlbiA7CiAgICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICdcMSc7CiAgICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICdcMSc7CgogICAgLyogcmVhZCBzb3VyY2Ugc3RyaW5nIGNoYXIgYnkgY2hhciwgd3JpdGUgCiAgICAgICBjb3JyZXNwb25kaW5nIHdlaWdodCBpbiBlYWNoIGNvbXBvbmVudC4gKi8KICAgIGZvciAoaT0wLGNvdW50PTA7aTxzcmNsZW47aSsrKQogICAgewogICAgICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9jaGFyPXNyY3N0cltpXTsKICAgICAgaWYgKHNvdXJjZV9jaGFyIT0nXDAnKSAKICAgICAgewoJaW50IHR5cGUsbG9uZ2NvZGU7Cgl0eXBlID0gTENNX1VuaWNvZGVfTFVUWy0yKzIqc291cmNlX2NoYXJdOwoJbG9uZ2NvZGUgPSB0eXBlID4+IDQ7Cgl0eXBlICY9IDE1OwoJaWYgKCFmbGFnX3N0cmluZ3NvcnQgJiYgT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkgCgl7CgkgIFVJTlQxNiBlbmNyeXB0ZWRfbG9jYXRpb24gPSAoMTw8MTUpICsgNyArIDQqY291bnQ7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gKHVuc2lnbmVkIGNoYXIpIChlbmNyeXB0ZWRfbG9jYXRpb24+PjgpOwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZW5jcnlwdGVkX2xvY2F0aW9uJjI1NSk7CiAgICAgICAgICAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4gaXMgdXNlZCBoZXJlIGJlY2F1c2UgaXQgbGV0cyBzdHJpbmcgY29tcGFyaXNvbiBiZQoJCQljb21wYXRpYmxlIHdpdGggbnVtZXJpY2FsIGNvbXBhcmlzb24gKi8KCgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gdHlwZTsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07ICAKICAgICAgICAgICAgICAgICAgICAgLyogYXNzdW1wdGlvbiA6IGEgcHVuY3R1YXRpb24gY2hhcmFjdGVyIGlzIG5ldmVyIGEgCgkJCWRvdWJsZSBvciBhY2NlbnRlZCBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKCSAgZHN0c3RyWzIqY291bnQrMV0gPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07ICAKCSAgaWYgKGxvbmdjb2RlKQoJICB7CgkgICAgaWYgKGNvdW50PGNhc2VfbGVuKQoJICAgICAgY2FzZV9jb21wb25lbnRbY291bnRdID0gKCBpc3VwcGVyKHNvdXJjZV9jaGFyKSA/IDE4IDogMiApIDsKCSAgICBpZiAoY291bnQ8ZGlhY3JpdGljX2xlbikKCSAgICAgIGRpYWNyaXRpY19jb21wb25lbnRbY291bnRdID0gMjsgLyogYXNzdW1wdGlvbjogYSBkb3VibGUgbGV0dGVyCgkJCQkJCSBpcyBuZXZlciBhY2NlbnRlZCAqLwoJICAgIGNvdW50Kys7CgkgICAgCgkgICAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKCSAgICBkc3RzdHJbMipjb3VudCsxXSA9ICooTENNX1VuaWNvZGVfTFVUXzIgLSAxICsgbG9uZ2NvZGUpOyAKCSAgICAvKiAxNiBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDEgCgkgICAgICAgMzIgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAyIAoJICAgICAgIDQ4IGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMyAqLwoJICB9CgoJICBpZiAoY291bnQ8Y2FzZV9sZW4pCgkgICAgY2FzZV9jb21wb25lbnRbY291bnRdID0gKCBpc3VwcGVyKHNvdXJjZV9jaGFyKSA/IDE4IDogMiApIDsKCSAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCgkgIHsKCSAgICBpbnQgb2ZzID0gc291cmNlX2NoYXIgLSBMQ01fRGlhY3JpdGljX1N0YXJ0OwoJICAgIGRpYWNyaXRpY19jb21wb25lbnRbY291bnRdID0gKG9mcz49MCA/IExDTV9EaWFjcml0aWNfTFVUW29mc10gOiAyKTsKCSAgfQoJICBjb3VudCsrOwoJfQogICAgICB9CiAgICB9CiAgICBkc3RzdHJbcm9vbS0xXSA9ICdcMCc7CiAgICByZXR1cm4gcm9vbTsKICB9Cn0KCQkgICAgIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgTENNYXBTdHJpbmczMlcgICAgICAgICAgICAgICAgW0tFUk5FTDMyLjQ5M10KICoKICogQ29udmVydCBhIHN0cmluZywgb3IgZ2VuZXJhdGUgYSBzb3J0IGtleSBmcm9tIGl0LgogKgogKiBOT1RFCiAqCiAqIFNlZSBMQ01hcFN0cmluZzMyQSBmb3IgZG9jdW1lbnRhdGlvbgogKi8KSU5UIFdJTkFQSSBMQ01hcFN0cmluZ1coCglMQ0lEIGxjaWQsRFdPUkQgbWFwZmxhZ3MsTFBDV1NUUiBzcmNzdHIsSU5UIHNyY2xlbixMUFdTVFIgZHN0c3RyLAoJSU5UIGRzdGxlbikKewogIGludCBpOwogCiAgVFJBQ0VfKHN0cmluZykoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpXG4iLAoJbGNpZCxtYXBmbGFncyxzcmNzdHIsc3JjbGVuLGRzdHN0cixkc3RsZW4pOwoKICBpZiAoICgoZHN0bGVuIT0wKSAmJiAoZHN0c3RyPT1OVUxMKSkgfHwgKHNyY3N0cj09TlVMTCkgKQogIHsKICAgIEVSUl8ob2xlKSgiKHNyYz0lcCxkc3Q9JXApOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzcmNzdHIsIGRzdHN0cik7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQogIGlmIChzcmNsZW49PS0xKSAKICAgIHNyY2xlbiA9IGxzdHJsZW5XKHNyY3N0cikrMTsKICBpZiAobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSAKICB7CiAgICBGSVhNRV8oc3RyaW5nKSgiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZCk6ICIKCSAgInVuaW1wbGVtZW50ZWQgZmxhZ3M6IDB4JTA4bHhcbiIsCgkgIGxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuLG1hcGZsYWdzKTsKICAgIHJldHVybiAwOwogIH0KICBlbHNlCiAgewogICAgaW50ICgqZikoaW50KT1pZGVudGl0eTsgCgogICAgaWYgKGRzdGxlbj09MCkKICAgICAgcmV0dXJuIHNyY2xlbjsgIAogICAgaWYgKGRzdGxlbjxzcmNsZW4pIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmIChtYXBmbGFncyAmIExDTUFQX1VQUEVSQ0FTRSkKICAgICAgZiA9IHRvdXBwZXI7CiAgICBlbHNlIGlmIChtYXBmbGFncyAmIExDTUFQX0xPV0VSQ0FTRSkKICAgICAgZiA9IHRvbG93ZXI7CiAgICBmb3IgKGk9MDsgaSA8IHNyY2xlbjsgaSsrKQogICAgICBkc3RzdHJbaV0gPSAoV0NIQVIpIGYoc3Jjc3RyW2ldKTsKICAgIHJldHVybiBzcmNsZW47CiAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIENvbXBhcmVTdHJpbmcxNiAgICAgICAoT0xFMk5MUy44KQogKi8KVUlOVDE2IFdJTkFQSSBDb21wYXJlU3RyaW5nMTYoRFdPUkQgbGNpZCxEV09SRCBmZHdTdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHMxLERXT1JEIGwxLExQQ1NUUiBzMixEV09SRCBsMikKewoJcmV0dXJuIChVSU5UMTYpQ29tcGFyZVN0cmluZ0EobGNpZCxmZHdTdHlsZSxzMSxsMSxzMixsMik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNvbXBhcmVTdHJpbmczMkEJW0tFUk5FTDMyLjE0M10KICogQ29tcGFyZXMgdHdvIHN0cmluZ3MgdXNpbmcgbG9jYWxlCiAqCiAqIFJFVFVSTlMKICoKICogc3VjY2VzczogQ1NUUl9MRVNTX1RIQU4sIENTVFJfRVFVQUwsIENTVFJfR1JFQVRFUl9USEFOCiAqIGZhaWx1cmU6IDAKICoKICogTk9URVMKICoKICogRGVmYXVsdHMgdG8gYSB3b3JkIHNvcnQsIGJ1dCB1c2VzIGEgc3RyaW5nIHNvcnQgaWYKICogU09SVF9TVFJJTkdTT1JUIGlzIHNldC4KICogQ2FsbHMgU2V0TGFzdEVycm9yIGZvciBFUlJPUl9JTlZBTElEX0ZMQUdTLCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUi4KICogCiAqIEJVR1MKICoKICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSBsb2NhbGUKICoKICogRklYTUUKICogCiAqIFF1aXRlIGluZWZmaWNpZW50LgogKi8KVUlOVCBXSU5BUEkgQ29tcGFyZVN0cmluZ0EoCiAgICBEV09SRCBsY2lkLCAgICAgLyogbG9jYWxlIElEICovCiAgICBEV09SRCBmZHdTdHlsZSwgLyogY29tcGFyaXNvbi1zdHlsZSBvcHRpb25zICovCiAgICBMUENTVFIgczEsICAgICAgLyogZmlyc3Qgc3RyaW5nICovCiAgICBEV09SRCBsMSwgICAgICAgLyogbGVuZ3RoIG9mIGZpcnN0IHN0cmluZyAqLwogICAgTFBDU1RSIHMyLCAgICAgIC8qIHNlY29uZCBzdHJpbmcgKi8KICAgIERXT1JEIGwyKSAgICAgICAvKiBsZW5ndGggb2Ygc2Vjb25kIHN0cmluZyAqLwp7CiAgaW50IG1hcHN0cmluZ19mbGFnczsKICBpbnQgbGVuMSxsZW4yOwogIGludCByZXN1bHQ7CiAgTFBTVFIgc2sxLHNrMjsKICBUUkFDRV8ob2xlKSgiJXMgYW5kICVzXG4iLAoJZGVidWdzdHJfYSAoczEpLCBkZWJ1Z3N0cl9hIChzMikpOwoKICBpZiAoIChzMT09TlVMTCkgfHwgKHMyPT1OVUxMKSApCiAgeyAgICAKICAgIEVSUl8ob2xlKSgiKHMxPSVzLHMyPSVzKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwgczEsIHMyKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CgogIGlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQogICAgRklYTUVfKG9sZSkoIklHTk9SRVNZTUJPTFMgbm90IHN1cHBvcnRlZFxuIik7CiAgCQogIG1hcHN0cmluZ19mbGFncyA9IExDTUFQX1NPUlRLRVkgfCBmZHdTdHlsZSA7CiAgbGVuMSA9IExDTWFwU3RyaW5nQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMSxsMSxOVUxMLDApOwogIGxlbjIgPSBMQ01hcFN0cmluZ0EobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczIsbDIsTlVMTCwwKTsKCiAgaWYgKChsZW4xPT0wKXx8KGxlbjI9PTApKQogICAgcmV0dXJuIDA7ICAgICAvKiBzb21ldGhpbmcgd3JvbmcgaGFwcGVuZWQgKi8KCiAgc2sxID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuMSk7CiAgc2syID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuMik7CiAgaWYgKCAoIUxDTWFwU3RyaW5nQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMSxsMSxzazEsbGVuMSkpCgkgfHwgKCFMQ01hcFN0cmluZ0EobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczIsbDIsc2syLGxlbjIpKSApCiAgewogICAgRVJSXyhvbGUpKCJCdWcgaW4gTENtYXBTdHJpbmczMkEuXG4iKTsKICAgIHJlc3VsdCA9IDA7CiAgfQogIGVsc2UKICB7CiAgICAvKiBzdHJjbXAgZG9lc24ndCBuZWNlc3NhcmlseSByZXR1cm4gLTEsIDAsIG9yIDEgKi8KICAgIHJlc3VsdCA9IHN0cmNtcChzazEsc2syKTsKICB9CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHNrMSk7CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHNrMik7CgogIGlmIChyZXN1bHQgPCAwKQogICAgcmV0dXJuIDE7CiAgaWYgKHJlc3VsdCA9PSAwKQogICAgcmV0dXJuIDI7CgogIC8qIG11c3QgYmUgZ3JlYXRlciwgaWYgd2UgcmVhY2ggdGhpcyBwb2ludCAqLwogIHJldHVybiAzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDb21wYXJlU3RyaW5nMzJXCVtLRVJORUwzMi4xNDRdCiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaWdub3JlcyB0aGUgbG9jYWxlCiAqIEZJWE1FIDogIERvZXMgb25seSBzdHJpbmcgc29ydC4gIFNob3VsZAogKiBiZSByZWltcGxlbWVudGVkIHRoZSBzYW1lIHdheSBhcyBDb21wYXJlU3RyaW5nMzJBLgogKi8KVUlOVCBXSU5BUEkgQ29tcGFyZVN0cmluZ1coRFdPUkQgbGNpZCwgRFdPUkQgZmR3U3R5bGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBzMSwgRFdPUkQgbDEsIExQQ1dTVFIgczIsRFdPUkQgbDIpCnsKCWludCBsZW4scmV0OwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQoJCUZJWE1FXyhvbGUpKCJJR05PUkVOT05TUEFDRSBub3Qgc3VwcHJ0ZWRcbiIpOwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCgkJRklYTUVfKG9sZSkoIklHTk9SRVNZTUJPTFMgbm90IHN1cHBvcnRlZFxuIik7CgoJLyogSXMgc3RyY21wIGRlZmF1bHRpbmcgdG8gc3RyaW5nIHNvcnQgb3IgdG8gd29yZCBzb3J0Pz8gKi8KCS8qIEZJWE1FOiBIYW5kbGUgTk9STV9TVFJJTkdTT1JUICovCglsMSA9IChsMT09LTEpP2xzdHJsZW5XKHMxKTpsMTsKCWwyID0gKGwyPT0tMSk/bHN0cmxlblcoczIpOmwyOwoJbGVuID0gbDE8bDIgPyBsMTpsMjsKCXJldCA9IChmZHdTdHlsZSAmIE5PUk1fSUdOT1JFQ0FTRSkgPwoJCUNSVERMTF9fd2NzbmljbXAoczEsczIsbGVuKSA6IENSVERMTF93Y3NuY21wKHMxLHMyLGxlbik7CgkvKiBub3QgZXF1YWwsIHJldHVybiAxIG9yIDMgKi8KCWlmKHJldCE9MCkgcmV0dXJuIHJldCsyOwoJLyogc2FtZSBsZW4sIHJldHVybiAyICovCglpZihsMT09bDIpIHJldHVybiAyOwoJLyogdGhlIGxvbmdlciBvbmUgaXMgbGV4aWNhbGx5IGdyZWF0ZXIgKi8KCXJldHVybiAobDE8bDIpPyAxIDogMzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJT0xFX0dldEZvcm1hdEEJW0ludGVybmFsXQogKgogKiBGSVhNRQogKiAgICBJZiBkYXRlbGVuID09IDAsIGl0IHNob3VsZCByZXR1cm4gdGhlIHJlZ3VpcmVkIHN0cmluZyBsZW5ndGguCiAqCiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgc3R1ZmYgZm9yIEdldERhdGVGb3JtYXQoKSBhbmQgCiBHZXRUaW1lRm9ybWF0KCkuCgogIGQgICAgc2luZ2xlLWRpZ2l0IChubyBsZWFkaW5nIHplcm8pIGRheSAob2YgbW9udGgpCiAgZGQgICB0d28tZGlnaXQgZGF5IChvZiBtb250aCkKICBkZGQgIHNob3J0IGRheS1vZi13ZWVrIG5hbWUKICBkZGRkIGxvbmcgZGF5LW9mLXdlZWsgbmFtZQogIE0gICAgc2luZ2xlLWRpZ2l0IG1vbnRoCiAgTU0gICB0d28tZGlnaXQgbW9udGgKICBNTU0gIHNob3J0IG1vbnRoIG5hbWUKICBNTU1NIGZ1bGwgbW9udGggbmFtZQogIHkgICAgdHdvLWRpZ2l0IHllYXIsIG5vIGxlYWRpbmcgMAogIHl5ICAgdHdvLWRpZ2l0IHllYXIKICB5eXl5IGZvdXItZGlnaXQgeWVhcgogIGdnICAgZXJhIHN0cmluZwogIGggICAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIpCiAgaGggICBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIEggICAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDI0LWhvdXIpCiAgSEggICBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIG0gICAgbWludXRlcyB3aXRoIG5vIGxlYWRpbmcgemVybwogIG1tICAgbWludXRlcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIHMgICAgc2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybwogIHNzICAgc2Vjb25kcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIHQgICAgdGltZSBtYXJrZXIgKEEgb3IgUCkKICB0dCAgIHRpbWUgbWFya2VyIChBTSwgUE0pCiAgJycgICB1c2VkIHRvIHF1b3RlIGxpdGVyYWwgY2hhcmFjdGVycwogICcnICAgKHdpdGhpbiBhIHF1b3RlZCBzdHJpbmcpIGluZGljYXRlcyBhIGxpdGVyYWwgJwoKIFRoZXNlIGZ1bmN0aW9ucyBSRVFVSVJFIHZhbGlkIGxvY2FsZSwgZGF0ZSwgIGFuZCBmb3JtYXQuIAogKi8Kc3RhdGljIElOVCBPTEVfR2V0Rm9ybWF0QShMQ0lEIGxvY2FsZSwKCQkJICAgIERXT1JEIGZsYWdzLAoJCQkgICAgRFdPUkQgdGZsYWdzLAoJCQkgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgTFBDU1RSIF9mb3JtYXQsIAkvKmluKi8KCQkJICAgIExQU1RSIGRhdGUsCQkvKm91dCovCgkJCSAgICBJTlQgZGF0ZWxlbikKewogICBJTlQgaW5wb3MsIG91dHBvczsKICAgaW50IGNvdW50LCB0eXBlLCBpbnF1b3RlLCBPdmVyZmxvdzsKICAgY2hhciBidWZbNDBdOwogICBjaGFyIGZvcm1hdFs0MF07CiAgIGNoYXIgKiBwb3M7CiAgIGludCBidWZsZW47CgogICBjb25zdCBjaGFyICogX2RnZm10W10gPSB7ICIlZCIsICIlMDJkIiB9OwogICBjb25zdCBjaGFyICoqIGRnZm10ID0gX2RnZm10IC0gMTsgCgogICAvKiByZXBvcnQsIGZvciBkZWJ1Z2dpbmcgKi8KICAgVFJBQ0VfKG9sZSkoIigweCVseCwweCVseCwgMHglbHgsIHRpbWUoZD0lZCxoPSVkLG09JWQscz0lZCksIGZtdD0lcCBcJyVzXCcgLCAlcCwgbGVuPSVkKVxuIiwKICAgCSBsb2NhbGUsIGZsYWdzLCB0ZmxhZ3MsCgkgeHRpbWUtPndEYXksIHh0aW1lLT53SG91ciwgeHRpbWUtPndNaW51dGUsIHh0aW1lLT53U2Vjb25kLAoJIF9mb3JtYXQsIF9mb3JtYXQsIGRhdGUsIGRhdGVsZW4pOwogIAogICBpZihkYXRlbGVuID09IDApIHsKICAgICBGSVhNRV8ob2xlKSgiZGF0ZWxlbiA9IDAsIHJldHVybmluZyAyNTVcbiIpOwogICAgIHJldHVybiAyNTU7CiAgIH0KCiAgIC8qIGluaXRhbGl6ZSBzdGF0ZSB2YXJpYWJsZXMgYW5kIG91dHB1dCBidWZmZXIgKi8KICAgaW5wb3MgPSBvdXRwb3MgPSAwOwogICBjb3VudCA9IDA7IGlucXVvdGUgPSAwOyBPdmVyZmxvdyA9IDA7CiAgIHR5cGUgPSAnXDAnOwogICBkYXRlWzBdID0gYnVmWzBdID0gJ1wwJzsKICAgICAgCiAgIHN0cmNweShmb3JtYXQsX2Zvcm1hdCk7CgogICAvKiBhbHRlciB0aGUgZm9ybWF0c3RyaW5nLCB3aGlsZSBpdCB3b3JrcyBmb3IgYWxsIGxhbmd1YWdlcyBub3cgaW4gd2luZQogICBpdHMgcG9zc2libGUgdGhhdCBpdCBmYWlscyB3aGVuIHRoZSB0aW1lIGxvb2tzIGxpa2Ugc3M6bW06aGggYXMgZXhhbXBsZSovICAgCiAgIGlmICh0ZmxhZ3MgJiAoVElNRV9OT01JTlVURVNPUlNFQ09ORFMpKQogICB7IGlmICgocG9zID0gc3Ryc3RyICggZm9ybWF0LCAiOm1tIikpKQogICAgIHsgbWVtY3B5ICggcG9zLCBwb3MrMywgc3RybGVuKGZvcm1hdCktKHBvcy1mb3JtYXQpLTIgKTsKICAgICB9CiAgIH0KICAgaWYgKHRmbGFncyAmIChUSU1FX05PU0VDT05EUykpCiAgIHsgaWYgKChwb3MgPSBzdHJzdHIgKCBmb3JtYXQsICI6c3MiKSkpCiAgICAgeyBtZW1jcHkgKCBwb3MsIHBvcyszLCBzdHJsZW4oZm9ybWF0KS0ocG9zLWZvcm1hdCktMiApOwogICAgIH0KICAgfQogICAKICAgZm9yIChpbnBvcyA9IDA7OyBpbnBvcysrKSB7CiAgICAgIC8qIFRSQUNFKG9sZSwgIlNUQVRFIGlucG9zPSUyZCBvdXRwb3M9JTJkIGNvdW50PSVkIGlucXVvdGU9JWQgdHlwZT0lYyBidWYsZGF0ZSA9ICVjLCVjXG4iLCBpbnBvcywgb3V0cG9zLCBjb3VudCwgaW5xdW90ZSwgdHlwZSwgYnVmW2lucG9zXSwgZGF0ZVtvdXRwb3NdKTsgKi8KICAgICAgaWYgKGlucXVvdGUpIHsKCSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgICAgaWYgKGZvcm1hdFtpbnBvcysxXSA9PSAnXCcnKSB7CgkgICAgICAgaW5wb3MgKz0gMTsKCSAgICAgICBkYXRlW291dHBvcysrXSA9ICdcJyc7CgkgICAgfSBlbHNlIHsKCSAgICAgICBpbnF1b3RlID0gMDsKCSAgICAgICBjb250aW51ZTsgLyogd2UgZGlkIG5vdGhpbmcgdG8gdGhlIG91dHB1dCAqLwoJICAgIH0KCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wwJykgewoJICAgIGRhdGVbb3V0cG9zKytdID0gJ1wwJzsKCSAgICBpZiAob3V0cG9zID4gZGF0ZWxlbikgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOwoJIH0gZWxzZSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwoJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSB7CgkgICAgICAgT3ZlcmZsb3cgPSAxOwoJICAgICAgIGRhdGVbb3V0cG9zLTFdID0gJ1wwJzsgLyogdGhpcyBpcyB0aGUgbGFzdCBwbGFjZSB3aGVyZQoJCQkJCSBpdCdzIHNhZmUgdG8gd3JpdGUgKi8KCSAgICAgICBicmVhazsKCSAgICB9CgkgfQogICAgICB9IGVsc2UgaWYgKCAgKGNvdW50ICYmIChmb3JtYXRbaW5wb3NdICE9IHR5cGUpKQoJCSAgIHx8IGNvdW50ID09IDQKCQkgICB8fCAoY291bnQgPT0gMiAmJiBzdHJjaHIoImdoSG1zdCIsIHR5cGUpKSApCiAgICAgICB7CgkgICAgaWYgICAgICAgICAodHlwZSA9PSAnZCcpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCQkgIEdldExvY2FsZUluZm9BKGxvY2FsZSwKCQkJCSAgIExPQ0FMRV9TREFZTkFNRTEKCQkJCSAgICsgeHRpbWUtPndEYXlPZldlZWsgLSAxLAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkJCSAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgCgkJCQkJICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTEgCgkJCQkJICAgICsgeHRpbWUtPndEYXlPZldlZWsgLSAxLAoJCQkJCSAgICBidWYsIHNpemVvZihidWYpKTsKCQkgICAgICB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndEYXkpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ00nKSB7CgkgICAgICAgaWYgKGNvdW50ID09IDMpIHsKCQkgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgCgkJCQkgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEKCQkJCSAgICsgeHRpbWUtPndNb250aCAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDQpIHsKCQkgIEdldExvY2FsZUluZm9BKGxvY2FsZSwKCQkJCSAgIExPQ0FMRV9TTU9OVEhOQU1FMQoJCQkJICAgKyB4dGltZS0+d01vbnRoIC0gMSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJCSB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndNb250aCk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAneScpIHsKCSAgICAgICBpZiAoY291bnQgPT0gNCkgewoJCSAgICAgIHNwcmludGYoYnVmLCAiJWQiLCB4dGltZS0+d1llYXIpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJCSAgc3RyY3B5KGJ1ZiwgInl5eSIpOwoJCSAgV0FSTl8ob2xlKSgidW5rbm93biBmb3JtYXQsIGM9JWMsIG49JWRcbiIsICB0eXBlLCBjb3VudCk7CgkJIH0gZWxzZSB7CgkJICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d1llYXIgJSAxMDApOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ2cnKSB7CgkgICAgICAgaWYgICAgICAgIChjb3VudCA9PSAyKSB7CgkJICBGSVhNRV8ob2xlKSgiTE9DQUxFX0lDQUxFTkRBUlRZUEUgdW5pbXAuXG4iKTsKCQkgIHN0cmNweShidWYsICJBRCIpOwoJICAgIH0gZWxzZSB7CgkJICBzdHJjcHkoYnVmLCAiZyIpOwoJCSAgV0FSTl8ob2xlKSgidW5rbm93biBmb3JtYXQsIGM9JWMsIG49JWRcbiIsIHR5cGUsIGNvdW50KTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdoJykgewoJICAgICAgIC8qIGdpdmVzIHVzIGhvdXJzIDE6MDAgLS0gMTI6MDAgKi8KCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCAoeHRpbWUtPndIb3VyLTEpJTEyICsxKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ0gnKSB7CgkgICAgICAgLyogMjQtaG91ciB0aW1lICovCgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndIb3VyKTsKCSAgICB9IGVsc2UgaWYgKCB0eXBlID09ICdtJykgewoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53TWludXRlKTsKCSAgICB9IGVsc2UgaWYgKCB0eXBlID09ICdzJykgewoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53U2Vjb25kKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3QnKSB7CgkgICAgICAgaWYgICAgICAgIChjb3VudCA9PSAxKSB7CgkJICBzcHJpbnRmKGJ1ZiwgIiVjIiwgKHh0aW1lLT53SG91ciA8IDEyKSA/ICdBJyA6ICdQJyk7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAyKSB7CgkJICAvKiBzcHJpbnRmKGJ1ZiwgIiVzIiwgKHh0aW1lLT53SG91ciA8IDEyKSA/ICJBTSIgOiAiUE0iKTsgKi8KCQkgIEdldExvY2FsZUluZm9BKGxvY2FsZSwKCQkJCSAgICh4dGltZS0+d0hvdXI8MTIpIAoJCQkJICAgPyBMT0NBTEVfUzExNTkgOiBMT0NBTEVfUzIzNTksCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9CgkgICAgfTsKCgkgICAgLyogd2UgbmVlZCB0byBjaGVjayB0aGUgbmV4dCBjaGFyIGluIHRoZSBmb3JtYXQgc3RyaW5nIAoJICAgICAgIGFnYWluLCBubyBtYXR0ZXIgd2hhdCBoYXBwZW5lZCAqLwoJICAgIGlucG9zLS07CgkgICAgCgkgICAgLyogYWRkIHRoZSBjb250ZW50cyBvZiBidWYgdG8gdGhlIG91dHB1dCAqLwoJICAgIGJ1ZmxlbiA9IHN0cmxlbihidWYpOwoJICAgIGlmIChvdXRwb3MgKyBidWZsZW4gPCBkYXRlbGVuKSB7CgkgICAgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsgLyogZm9yIHN0cmNhdCB0byBob29rIG9udG8gKi8KCQkgc3RyY2F0KGRhdGUsIGJ1Zik7CgkgICAgICAgb3V0cG9zICs9IGJ1ZmxlbjsKCSAgICB9IGVsc2UgewoJICAgICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CgkgICAgICAgc3RybmNhdChkYXRlLCBidWYsIGRhdGVsZW4gLSBvdXRwb3MpOwoJCSBkYXRlW2RhdGVsZW4gLSAxXSA9ICdcMCc7CgkJIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKCSAgICAgICBXQVJOXyhvbGUpKCJpbnN1ZmZpY2llbnQgYnVmZmVyXG4iKTsKCQkgcmV0dXJuIDA7CgkgICAgfQoKCSAgICAvKiByZXNldCB0aGUgdmFyaWFibGVzIHdlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGlzIGl0ZW0gKi8KCSAgICBjb3VudCA9IDA7CgkgICAgdHlwZSA9ICdcMCc7CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcMCcpIHsKCSAgICAvKiB3ZSBjYW4ndCBjaGVjayBmb3IgdGhpcyBhdCB0aGUgbG9vcC1oZWFkLCBiZWNhdXNlCgkgICAgICAgdGhhdCBicmVha3MgdGhlIHByaW50aW5nIG9mIHRoZSBsYXN0IGZvcm1hdC1pdGVtICovCgkgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKCSAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChjb3VudCkgewoJICAgIC8qIGNvbnRpbnVpbmcgYSBjb2RlIGZvciBhbiBpdGVtICovCgkgICAgY291bnQgKz0xOwoJICAgIGNvbnRpbnVlOwoJIH0gZWxzZSBpZiAoc3RyY2hyKCJoSG1zdHlNZGciLCBmb3JtYXRbaW5wb3NdKSkgewoJICAgIHR5cGUgPSBmb3JtYXRbaW5wb3NdOwoJICAgIGNvdW50ID0gMTsKCSAgICBjb250aW51ZTsKCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wnJykgewoJICAgIGlucXVvdGUgPSAxOwoJICAgIGNvbnRpbnVlOwogICAgICAgfSBlbHNlIHsKCSAgICBkYXRlW291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CgkgfQogICAgICAvKiBub3cgZGVhbCB3aXRoIGEgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93ICovCiAgICAgIGlmIChvdXRwb3MgPj0gZGF0ZWxlbikgewogICAgICAgZGF0ZVtkYXRlbGVuIC0gMV0gPSAnXDAnOwogICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgfQogICAKICAgaWYgKE92ZXJmbG93KSB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgfTsKCiAgIC8qIGZpbmlzaCBpdCBvZmYgd2l0aCBhIHN0cmluZyB0ZXJtaW5hdG9yICovCiAgIG91dHBvcysrOwogICAvKiBzYW5pdHkgY2hlY2sgKi8KICAgaWYgKG91dHBvcyA+IGRhdGVsZW4tMSkgb3V0cG9zID0gZGF0ZWxlbi0xOwogICBkYXRlW291dHBvc10gPSAnXDAnOwogICAKICAgVFJBQ0VfKG9sZSkoIk9MRV9HZXRGb3JtYXRBIHJldHVybnMgc3RyaW5nICclcycsIGxlbiAlZFxuIiwKCSAgICAgICBkYXRlLCBvdXRwb3MpOwogICByZXR1cm4gb3V0cG9zOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9MRV9HZXRGb3JtYXRXIFtJTlRFUk5BTF0KICovCnN0YXRpYyBJTlQgT0xFX0dldEZvcm1hdFcoTENJRCBsb2NhbGUsIERXT1JEIGZsYWdzLCBEV09SRCB0ZmxhZ3MsCgkJCSAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICBMUENXU1RSIGZvcm1hdCwKCQkJICAgIExQV1NUUiBvdXRwdXQsIElOVCBvdXRsZW4pCnsKICAgSU5UICAgaW5wb3MsIG91dHBvczsKICAgaW50ICAgICBjb3VudCwgdHlwZT0wLCBpbnF1b3RlOwogICBpbnQgICAgIE92ZXJmbG93OyAvKiBsb29wIGNoZWNrICovCiAgIFdDSEFSICAgYnVmWzQwXTsKICAgaW50ICAgICBidWZsZW49MDsKICAgV0NIQVIgICBhcmcwW10gPSB7MH0sIGFyZzFbXSA9IHsnJScsJ2QnLDB9OwogICBXQ0hBUiAgIGFyZzJbXSA9IHsnJScsJzAnLCcyJywnZCcsMH07CiAgIFdDSEFSICAqYXJnYXJyWzNdOwogICBpbnQgICAgIGRhdGV2YXJzPTAsIHRpbWV2YXJzPTA7CgogICBhcmdhcnJbMF0gPSBhcmcwOwogICBhcmdhcnJbMV0gPSBhcmcxOwogICBhcmdhcnJbMl0gPSBhcmcyOwoKICAgLyogbWFrZSBhIGRlYnVnIHJlcG9ydCAqLwogICBUUkFDRV8ob2xlKSgiYXJnczogMHglbHgsIDB4JWx4LCAweCVseCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10OiVzIChhdCAlcCksICIKICAgCSAgICAgICIlcCB3aXRoIG1heCBsZW4gJWRcbiIsCgkgbG9jYWxlLCBmbGFncywgdGZsYWdzLAoJIHh0aW1lLT53RGF5LCB4dGltZS0+d0hvdXIsIHh0aW1lLT53TWludXRlLCB4dGltZS0+d1NlY29uZCwKCSBkZWJ1Z3N0cl93KGZvcm1hdCksIGZvcm1hdCwgb3V0cHV0LCBvdXRsZW4pOwogICAKICAgaWYob3V0bGVuID09IDApIHsKICAgICBGSVhNRV8ob2xlKSgib3V0bGVuID0gMCwgcmV0dXJuaW5nIDI1NVxuIik7CiAgICAgcmV0dXJuIDI1NTsKICAgfQoKICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSB2YXJpYWJsZXMgKi8KICAgaW5wb3MgPSBvdXRwb3MgPSAwOwogICBjb3VudCA9IDA7CiAgIGlucXVvdGUgPSBPdmVyZmxvdyA9IDA7CiAgIC8qIHRoaXMgaXMgcmVhbGx5IGp1c3QgYSBzYW5pdHkgY2hlY2sgKi8KICAgb3V0cHV0WzBdID0gYnVmWzBdID0gMDsKICAgCiAgIC8qIHRoaXMgbG9vcCBpcyB0aGUgY29yZSBvZiB0aGUgZnVuY3Rpb24gKi8KICAgZm9yIChpbnBvcyA9IDA7IC8qIHdlIGhhdmUgc2V2ZXJhbCBicmVhayBwb2ludHMgKi8gOyBpbnBvcysrKSB7CiAgICAgIGlmIChpbnF1b3RlKSB7CgkgaWYgKGZvcm1hdFtpbnBvc10gPT0gKFdDSEFSKSAnXCcnKSB7CgkgICAgaWYgKGZvcm1hdFtpbnBvcysxXSA9PSAnXCcnKSB7CgkgICAgICAgaW5wb3MrKzsKCSAgICAgICBvdXRwdXRbb3V0cG9zKytdID0gJ1wnJzsKCSAgICB9IGVsc2UgewoJICAgICAgIGlucXVvdGUgPSAwOwoJICAgICAgIGNvbnRpbnVlOwoJICAgIH0KCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gMCkgewoJICAgIG91dHB1dFtvdXRwb3MrK10gPSAwOwoJICAgIGlmIChvdXRwb3MgPiBvdXRsZW4pIE92ZXJmbG93ID0gMTsKCSAgICBicmVhazsgIC8qICBub3JtYWwgZXhpdCAod2l0aGluIGEgcXVvdGUpICovCgkgfSBlbHNlIHsKCSAgICBvdXRwdXRbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsgLyogY29weSBpbnB1dCAqLwoJICAgIGlmIChvdXRwb3MgPiBvdXRsZW4pIHsKCSAgICAgICBPdmVyZmxvdyA9IDE7CgkgICAgICAgb3V0cHV0W291dHBvcy0xXSA9IDA7IAoJICAgICAgIGJyZWFrOwoJICAgIH0KCSB9CiAgICAgIH0gZWxzZSBpZiAoICAoY291bnQgJiYgKGZvcm1hdFtpbnBvc10gIT0gdHlwZSkpCgkJICAgfHwgKCAoY291bnQ9PTQgJiYgdHlwZSA9PSd5JykgfHwKCQkJKGNvdW50PT00ICYmIHR5cGUgPT0nTScpIHx8CgkJCShjb3VudD09NCAmJiB0eXBlID09J2QnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdnJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0naCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J0gnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdtJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0ncycpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J3QnKSApICApIHsKCSBpZiAgICAgICAgKHR5cGUgPT0gJ2QnKSB7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLAoJCQkgICAgIExPQ0FMRV9TREFZTkFNRTEgKyB4dGltZS0+d0RheU9mV2VlayAtMSwKCQkJICAgICBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsCgkJCQlMT0NBTEVfU0FCQlJFVkRBWU5BTUUxICsKCQkJCXh0aW1lLT53RGF5T2ZXZWVrIC0xLAoJCQkJYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgeHRpbWUtPndEYXkgKTsKCSAgICB9OwoJIH0gZWxzZSBpZiAodHlwZSA9PSAnTScpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsICBMT0NBTEVfU01PTlRITkFNRTEgKwoJCQkJeHRpbWUtPndNb250aCAtMSwgYnVmLAoJCQkJc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgeHRpbWUtPndNb250aCk7CgkgICAgfQoJIH0gZWxzZSBpZiAodHlwZSA9PSAneScpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCSAgICAgICB3c25wcmludGZXKGJ1ZiwgNiwgYXJnYXJyWzFdIC8qICIlZCIgKi8sCgkJCSB4dGltZS0+d1llYXIpOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJ5eXkiLCA1KTsKCSAgICB9IGVsc2UgewoJICAgICAgIHdzbnByaW50ZlcoYnVmLCA2LCBhcmdhcnJbY291bnRdLAoJCQkgICAgeHRpbWUtPndZZWFyICUgMTAwKTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICdnJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJICAgICAgIEZJWE1FXyhvbGUpKCJMT0NBTEVfSUNBTEVOREFSVFlQRSB1bmltcGxlbWVudGVkXG4iKTsKCSAgICAgICBsc3RyY3B5bkF0b1coYnVmLCAiQUQiLCA1KTsKCSAgICB9IGVsc2UgewoJICAgICAgIC8qIFdpbiBBUEkgc2V6IHdlIGNvcHkgaXQgdmVyYmF0aW0gKi8KCSAgICAgICBsc3RyY3B5bkF0b1coYnVmLCAiZyIsIDUpOwoJICAgIH0KCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ2gnKSB7CgkgICAgLyogaG91cnMgMTowMC0xMjowMCAtLS0gaXMgdGhpcyByaWdodD8gKi8KCSAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgCgkJCSAoeHRpbWUtPndIb3VyLTEpJTEyICsxKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ0gnKSB7CgkgICAgd3NucHJpbnRmVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sIAoJCQkgeHRpbWUtPndIb3VyKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ20nICkgewoJICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLAoJCQkgeHRpbWUtPndNaW51dGUpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAncycgKSB7CgkgICAgd3NucHJpbnRmVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sCgkJCSB4dGltZS0+d1NlY29uZCk7CgkgfSBlbHNlIGlmICh0eXBlID09ICd0JykgewoJICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwgKHh0aW1lLT53SG91ciA8IDEyKSA/CgkJCSAgICAgTE9DQUxFX1MxMTU5IDogTE9DQUxFX1MyMzU5LAoJCQkgICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikgKTsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDEpIHsKCSAgICAgICBidWZbMV0gPSAwOwoJICAgIH0KfQoKCSAvKiBubyBtYXR0ZXIgd2hhdCBoYXBwZW5lZCwgIHdlIG5lZWQgdG8gY2hlY2sgdGhpcyBuZXh0IAoJICAgIGNoYXJhY3RlciB0aGUgbmV4dCB0aW1lIHdlIGxvb3AgdGhyb3VnaCAqLwoJIGlucG9zLS07CgoJIC8qIGNhdCBidWYgb250byB0aGUgb3V0cHV0ICovCgkgb3V0bGVuID0gbHN0cmxlblcoYnVmKTsKCSBpZiAob3V0cG9zICsgYnVmbGVuIDwgb3V0bGVuKSB7CiAgICAgICAgICAgIGxzdHJjcHlXKCBvdXRwdXQgKyBvdXRwb3MsIGJ1ZiApOwoJICAgIG91dHBvcyArPSBidWZsZW47CgkgfSBlbHNlIHsKICAgICAgICAgICAgbHN0cmNweW5XKCBvdXRwdXQgKyBvdXRwb3MsIGJ1Ziwgb3V0bGVuIC0gb3V0cG9zICk7CgkgICAgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOyAvKiBBYm5vcm1hbCBleGl0ICovCgkgfQoKCSAvKiByZXNldCB0aGUgdmFyaWFibGVzIHdlIHVzZWQgdGhpcyB0aW1lICovCgkgY291bnQgPSAwOwoJIHR5cGUgPSAnXDAnOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gMCkgewoJIC8qIHdlIGNhbid0IGNoZWNrIGZvciB0aGlzIGF0IHRoZSBiZWdpbm5pbmcsICBiZWNhdXNlIHRoYXQgCgkgd291bGQga2VlcCB1cyBmcm9tIHByaW50aW5nIGEgZm9ybWF0IHNwZWMgdGhhdCBlbmRlZCB0aGUgCgkgc3RyaW5nICovCgkgb3V0cHV0W291dHBvc10gPSAwOwoJIGJyZWFrOyAgLyogIE5PUk1BTCBFWElUICAqLwogICAgICB9IGVsc2UgaWYgKGNvdW50KSB7CgkgLyogaG93IHdlIGtlZXAgdHJhY2sgb2YgdGhlIG1pZGRsZSBvZiBhIGZvcm1hdCBzcGVjICovCgkgY291bnQrKzsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmICggKGRhdGV2YXJzICYmIChmb3JtYXRbaW5wb3NdPT0nZCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdNJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3knIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nZycpICApIHx8CgkJICAodGltZXZhcnMgJiYgKGZvcm1hdFtpbnBvc109PSdIJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J2gnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nbScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdzJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3QnKSApICAgICkgewoJIHR5cGUgPSBmb3JtYXRbaW5wb3NdOwoJIGNvdW50ID0gMTsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSBpbnF1b3RlID0gMTsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIHsKCSAvKiB1bnF1b3RlZCBsaXRlcmFscyAqLwoJIG91dHB1dFtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwogICAgICB9CiAgIH0KCiAgIGlmIChPdmVyZmxvdykgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIFdBUk5fKG9sZSkoIiBidWZmZXIgb3ZlcmZsb3dcbiIpOwogICB9OwoKICAgLyogZmluYWwgc3RyaW5nIHRlcm1pbmF0b3IgYW5kIHNhbml0eSBjaGVjayAqLwogICBvdXRwb3MrKzsKICAgaWYgKG91dHBvcyA+IG91dGxlbi0xKSBvdXRwb3MgPSBvdXRsZW4tMTsKICAgb3V0cHV0W291dHBvc10gPSAnMCc7CgogICBUUkFDRV8ob2xlKSgiIHJldHVybmluZyAlc1xuIiwgZGVidWdzdHJfdyhvdXRwdXQpKTsKCQogICByZXR1cm4gKCFPdmVyZmxvdykgPyBvdXRsZW4gOiAwOwogICAKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldERhdGVGb3JtYXQzMkEJW0tFUk5FTDMyLjMxMF0KICogTWFrZXMgYW4gQVNDSUkgc3RyaW5nIG9mIHRoZSBkYXRlCiAqCiAqIFRoaXMgZnVuY3Rpb24gdXNlcyBmb3JtYXQgdG8gZm9ybWF0IHRoZSBkYXRlLCAgb3IsICBpZiBmb3JtYXQKICogaXMgTlVMTCwgdXNlcyB0aGUgZGVmYXVsdCBmb3IgdGhlIGxvY2FsZS4gIGZvcm1hdCBpcyBhIHN0cmluZwogKiBvZiBsaXRlcmFsIGZpZWxkcyBhbmQgY2hhcmFjdGVycyBhcyBmb2xsb3dzOgogKgogKiAtIGQgICAgc2luZ2xlLWRpZ2l0IChubyBsZWFkaW5nIHplcm8pIGRheSAob2YgbW9udGgpCiAqIC0gZGQgICB0d28tZGlnaXQgZGF5IChvZiBtb250aCkKICogLSBkZGQgIHNob3J0IGRheS1vZi13ZWVrIG5hbWUKICogLSBkZGRkIGxvbmcgZGF5LW9mLXdlZWsgbmFtZQogKiAtIE0gICAgc2luZ2xlLWRpZ2l0IG1vbnRoCiAqIC0gTU0gICB0d28tZGlnaXQgbW9udGgKICogLSBNTU0gIHNob3J0IG1vbnRoIG5hbWUKICogLSBNTU1NIGZ1bGwgbW9udGggbmFtZQogKiAtIHkgICAgdHdvLWRpZ2l0IHllYXIsIG5vIGxlYWRpbmcgMAogKiAtIHl5ICAgdHdvLWRpZ2l0IHllYXIKICogLSB5eXl5IGZvdXItZGlnaXQgeWVhcgogKiAtIGdnICAgZXJhIHN0cmluZwogKgogKi8KSU5UIFdJTkFQSSBHZXREYXRlRm9ybWF0QShMQ0lEIGxvY2FsZSxEV09SRCBmbGFncywKCQkJICAgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgICBMUENTVFIgZm9ybWF0LCBMUFNUUiBkYXRlLElOVCBkYXRlbGVuKSAKewogICAKICBjaGFyIGZvcm1hdF9idWZbNDBdOwogIExQQ1NUUiB0aGlzZm9ybWF0OwogIFNZU1RFTVRJTUUgdDsKICBMUFNZU1RFTVRJTUUgdGhpc3RpbWU7CiAgTENJRCB0aGlzbG9jYWxlOwogIElOVCByZXQ7CgogIFRSQUNFXyhvbGUpKCIoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIiwKCSAgICAgIGxvY2FsZSxmbGFncyx4dGltZSxmb3JtYXQsZGF0ZSxkYXRlbGVuKTsKICAKICBpZiAoIWxvY2FsZSkgewogICAgIGxvY2FsZSA9IExPQ0FMRV9TWVNURU1fREVGQVVMVDsKICAgICB9OwogIAogIGlmIChsb2NhbGUgPT0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUKSB7CiAgICAgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CiAgfSBlbHNlIGlmIChsb2NhbGUgPT0gTE9DQUxFX1VTRVJfREVGQVVMVCkgewogICAgIHRoaXNsb2NhbGUgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKICB9IGVsc2UgewogICAgIHRoaXNsb2NhbGUgPSBsb2NhbGU7CiAgIH07CgogIGlmICh4dGltZSA9PSBOVUxMKSB7CiAgICAgR2V0U3lzdGVtVGltZSgmdCk7CiAgICAgdGhpc3RpbWUgPSAmdDsKICB9IGVsc2UgewogICAgIHRoaXN0aW1lID0geHRpbWU7CiAgfTsKCiAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CiAgICAgR2V0TG9jYWxlSW5mb0EodGhpc2xvY2FsZSwgKChmbGFncyZEQVRFX0xPTkdEQVRFKSAKCQkJCSAgID8gTE9DQUxFX1NMT05HREFURQoJCQkJICAgOiBMT0NBTEVfU1NIT1JUREFURSksCgkJICAgICAgZm9ybWF0X2J1Ziwgc2l6ZW9mKGZvcm1hdF9idWYpKTsKICAgICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICB9IGVsc2UgewogICAgIHRoaXNmb3JtYXQgPSBmb3JtYXQ7CiAgfTsKCiAgCiAgcmV0ID0gT0xFX0dldEZvcm1hdEEodGhpc2xvY2FsZSwgZmxhZ3MsIDAsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LCAKCQkgICAgICAgZGF0ZSwgZGF0ZWxlbik7CiAgCgogICBUUkFDRV8ob2xlKSgKCSAgICAgICAiR2V0RGF0ZUZvcm1hdDMyQSgpIHJldHVybmluZyAlZCwgd2l0aCBkYXRhPSVzXG4iLAoJICAgICAgIHJldCwgZGF0ZSk7CiAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0RGF0ZUZvcm1hdDMyVwlbS0VSTkVMMzIuMzExXQogKiBNYWtlcyBhIFVuaWNvZGUgc3RyaW5nIG9mIHRoZSBkYXRlCiAqCiAqIEFjdHMgdGhlIHNhbWUgYXMgR2V0RGF0ZUZvcm1hdDMyQSgpLCAgZXhjZXB0IHRoYXQgaXQncyBVbmljb2RlLgogKiBBY2NlcHRzICYgcmV0dXJucyBzaXplcyBhcyBjb3VudHMgb2YgVW5pY29kZSBjaGFyYWN0ZXJzLgogKgogKi8KSU5UIFdJTkFQSSBHZXREYXRlRm9ybWF0VyhMQ0lEIGxvY2FsZSxEV09SRCBmbGFncywKCQkJICAgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgICBMUENXU1RSIGZvcm1hdCwKCQkJICAgICAgTFBXU1RSIGRhdGUsIElOVCBkYXRlbGVuKQp7CiAgIHVuc2lnbmVkIHNob3J0IGRhdGVhcnJbXSA9IHsnMScsJzknLCc5JywnNCcsJy0nLCcxJywnLScsJzEnLDB9OwoKICAgRklYTUVfKG9sZSkoIlNUVUIgKHNob3VsZCBjYWxsIE9MRV9HZXRGb3JtYXRXKVxuIik7ICAgCiAgIGxzdHJjcHluVyhkYXRlLCBkYXRlYXJyLCBkYXRlbGVuKTsKICAgcmV0dXJuICggIGRhdGVsZW4gPCA5KSA/IGRhdGVsZW4gOiA5OwogICAKICAgCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzMzJBCShLRVJORUwzMi4xOTgpCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNBKAogIERBVEVGTVRfRU5VTVBST0NBIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgIERXT1JEIGR3RmxhZ3MpCnsKICBGSVhNRV8ob2xlKSgiT25seSBVUyBFbmdsaXNoIHN1cHBvcnRlZFxuIik7CgogIGlmKCFscERhdGVGbXRFbnVtUHJvYykKICAgIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTS9kL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNL2QveXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU0vZGQveXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NL2RkL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5L01NL2RkIikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC1NTU0teXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCwgTU1NTSBkZCwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NTU0gZGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLCBkZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQgTU1NTSwgeXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUVfKG9sZSkoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzMzJXCShLRVJORUwzMi4xOTkpCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNXKAogIERBVEVGTVRfRU5VTVBST0NXIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FXyhvbGUpKCIoJXAsICVsZCwgJWxkKTogc3R1YlxuIiwgbHBEYXRlRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzMzJBCShLRVJORUwzMi4yMTApCiAqLwpCT09MIFdJTkFQSSBFbnVtVGltZUZvcm1hdHNBKAogIFRJTUVGTVRfRU5VTVBST0NBIGxwVGltZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FXyhvbGUpKCJPbmx5IFVTIEVuZ2xpc2ggc3VwcG9ydGVkXG4iKTsKCiAgaWYoIWxwVGltZUZtdEVudW1Qcm9jKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogIGlmKGR3RmxhZ3MpCiAgICB7CiAgICAgIEZJWE1FXyhvbGUpKCJVbmtub3duIHRpbWUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCiAgICB9CiAgCiAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaGg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CgogIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1UaW1lRm9ybWF0czMyVwkoS0VSTkVMMzIuMjExKQogKi8KQk9PTCBXSU5BUEkgRW51bVRpbWVGb3JtYXRzVygKICBUSU1FRk1UX0VOVU1QUk9DVyBscFRpbWVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCnsKICBGSVhNRV8ob2xlKSgiKCVwLCVsZCwlbGQpOiBzdHViXG4iLCBscFRpbWVGbXRFbnVtUHJvYywgTG9jYWxlLCBkd0ZsYWdzKTsKICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXROdW1iZXJGb3JtYXQzMkEJKEtFUk5FTDMyLjM1NSkKICovCklOVCBXSU5BUEkgR2V0TnVtYmVyRm9ybWF0QShMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1NUUiBscHZhbHVlLCAgIGNvbnN0IE5VTUJFUkZNVEEgKiBscEZvcm1hdCwKCQkJICAgICAgIExQU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoTnVtYmVyKQp7CiBGSVhNRV8oZmlsZSkoIiVzOiBzdHViLCBubyByZWZvcm1hdGluZyBkb25lXG4iLGxwdmFsdWUpOwoKIGxzdHJjcHluQSggbHBOdW1iZXJTdHIsIGxwdmFsdWUsIGNjaE51bWJlciApOwogcmV0dXJuIGNjaE51bWJlcj8gbHN0cmxlbkEoIGxwTnVtYmVyU3RyICkgOiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0MzJXCShLRVJORUwzMi54eHgpCiAqLwpJTlQgV0lOQVBJIEdldE51bWJlckZvcm1hdFcoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENXU1RSIGxwdmFsdWUsICBjb25zdCBOVU1CRVJGTVRXICogbHBGb3JtYXQsCgkJCSAgICAgICBMUFdTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hOdW1iZXIpCnsKIEZJWE1FXyhmaWxlKSgiJXM6IHN0dWIsIG5vIHJlZm9ybWF0aW5nIGRvbmVcbiIsZGVidWdzdHJfdyhscHZhbHVlKSk7CgogbHN0cmNweW5XKCBscE51bWJlclN0ciwgbHB2YWx1ZSwgY2NoTnVtYmVyICk7CiByZXR1cm4gY2NoTnVtYmVyPyBsc3RybGVuVyggbHBOdW1iZXJTdHIgKSA6IDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJT0xFMk5MU19DaGVja0xvY2FsZQlbaW50ZXJuXQogKi8gCnN0YXRpYyBMQ0lEIE9MRTJOTFNfQ2hlY2tMb2NhbGUgKExDSUQgbG9jYWxlKQp7CglpZiAoIWxvY2FsZSkgCgl7IGxvY2FsZSA9IExPQ0FMRV9TWVNURU1fREVGQVVMVDsKCX0KICAKCWlmIChsb2NhbGUgPT0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUKSAKICAJeyByZXR1cm4gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKCX0gCgllbHNlIGlmIChsb2NhbGUgPT0gTE9DQUxFX1VTRVJfREVGQVVMVCkgCgl7IHJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCX0KCWVsc2UKCXsgcmV0dXJuIGxvY2FsZTsKCX0KfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0MzJBCVtLRVJORUwzMi40MjJdCiAqIE1ha2VzIGFuIEFTQ0lJIHN0cmluZyBvZiB0aGUgdGltZQogKgogKiBGb3JtYXRzIGRhdGUgYWNjb3JkaW5nIHRvIGZvcm1hdCwgIG9yIGxvY2FsZSBkZWZhdWx0IGlmIGZvcm1hdCBpcwogKiBOVUxMLiBUaGUgZm9ybWF0IGNvbnNpc3RzIG9mIGxpdGVyYWwgY2hhcmFjdGVycyBhbmQgZmllbGRzIGFzIGZvbGxvd3M6CiAqCiAqIGggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgxMi1ob3VyKQogKiBoaCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBIICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICogSEggaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogbSAgbWludXRlcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBtbSBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHMgIHNlY29uZHMgd2l0aCBubyBsZWFkaW5nIHplcm8KICogc3Mgc2Vjb25kcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiB0ICB0aW1lIG1hcmtlciAoQSBvciBQKQogKiB0dCB0aW1lIG1hcmtlciAoQU0sIFBNKQogKgogKi8KSU5UIFdJTkFQSSAKR2V0VGltZUZvcm1hdEEoTENJRCBsb2NhbGUsICAgICAgICAvKiBpbiAgKi8KCQkgRFdPUkQgZmxhZ3MsICAgICAgICAvKiBpbiAgKi8KCQkgTFBTWVNURU1USU1FIHh0aW1lLCAvKiBpbiAgKi8gCgkJIExQQ1NUUiBmb3JtYXQsICAgICAgLyogaW4gICovCgkJIExQU1RSIHRpbWVzdHIsICAgICAgLyogb3V0ICovCgkJIElOVCB0aW1lbGVuICAgICAgIC8qIGluICAqLykgCnsgY2hhciBmb3JtYXRfYnVmWzQwXTsKICBMUENTVFIgdGhpc2Zvcm1hdDsKICBTWVNURU1USU1FIHQ7CiAgTFBTWVNURU1USU1FIHRoaXN0aW1lOwogIExDSUQgdGhpc2xvY2FsZT0wOwogIERXT1JEIHRoaXNmbGFncz1MT0NBTEVfU1RJTUVGT1JNQVQ7IC8qIHN0YW5kYXJ0IHRpbWVmb3JtYXQgKi8KICBJTlQgcmV0OwogICAgCiAgVFJBQ0VfKG9sZSkoIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIixsb2NhbGUsZmxhZ3MseHRpbWUsZm9ybWF0LHRpbWVzdHIsdGltZWxlbik7CgogIHRoaXNsb2NhbGUgPSBPTEUyTkxTX0NoZWNrTG9jYWxlICggbG9jYWxlICk7CgogIGlmICggZmxhZ3MgJiAoVElNRV9OT1RJTUVNQVJLRVIgfCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUICkpCiAgeyBGSVhNRV8ob2xlKSgiVElNRV9OT1RJTUVNQVJLRVIgb3IgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCBub3QgaW1wbGVtZW50ZWRcbiIpOwogIH0KICAKICBmbGFncyAmPSAoVElNRV9OT1NFQ09ORFMgfCBUSU1FX05PTUlOVVRFU09SU0VDT05EUyk7IC8qIG1hc2sgZm9yIE9MRV9HZXRGb3JtYXRBKi8KCiAgaWYgKGZvcm1hdCA9PSBOVUxMKSAKICB7IGlmIChmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkgIC8qdXNlIHN5c3RlbSBkZWZhdWx0Ki8KICAgIHsgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CiAgICB9CiAgICBHZXRMb2NhbGVJbmZvQSh0aGlzbG9jYWxlLCB0aGlzZmxhZ3MsIGZvcm1hdF9idWYsIHNpemVvZihmb3JtYXRfYnVmKSk7CiAgICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICB9CiAgZWxzZSAKICB7IHRoaXNmb3JtYXQgPSBmb3JtYXQ7CiAgfQogIAogIGlmICh4dGltZSA9PSBOVUxMKSAvKiBOVUxMIG1lYW5zIHVzZSB0aGUgY3VycmVudCBsb2NhbCB0aW1lKi8KICB7IEdldExvY2FsVGltZSgmdCk7CiAgICB0aGlzdGltZSA9ICZ0OwogIH0gCiAgZWxzZQogIHsgdGhpc3RpbWUgPSB4dGltZTsKICB9CiAgcmV0ID0gT0xFX0dldEZvcm1hdEEodGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmbGFncywgdGhpc3RpbWUsIHRoaXNmb3JtYXQsCiAgCQkJIHRpbWVzdHIsIHRpbWVsZW4pOwogIHJldHVybiByZXQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0MzJXCVtLRVJORUwzMi40MjNdCiAqIE1ha2VzIGEgVW5pY29kZSBzdHJpbmcgb2YgdGhlIHRpbWUKICovCklOVCBXSU5BUEkgCkdldFRpbWVGb3JtYXRXKExDSUQgbG9jYWxlLCAgICAgICAgLyogaW4gICovCgkJIERXT1JEIGZsYWdzLCAgICAgICAgLyogaW4gICovCgkJIExQU1lTVEVNVElNRSB4dGltZSwgLyogaW4gICovIAoJCSBMUENXU1RSIGZvcm1hdCwgICAgIC8qIGluICAqLwoJCSBMUFdTVFIgdGltZXN0ciwgICAgIC8qIG91dCAqLwoJCSBJTlQgdGltZWxlbiAgICAgICAvKiBpbiAgKi8pIAp7CVdDSEFSIGZvcm1hdF9idWZbNDBdOwoJTFBDV1NUUiB0aGlzZm9ybWF0OwoJU1lTVEVNVElNRSB0OwoJTFBTWVNURU1USU1FIHRoaXN0aW1lOwoJTENJRCB0aGlzbG9jYWxlPTA7CglEV09SRCB0aGlzZmxhZ3M9TE9DQUxFX1NUSU1FRk9STUFUOyAvKiBzdGFuZGFydCB0aW1lZm9ybWF0ICovCglJTlQgcmV0OwoJICAgIAoJVFJBQ0VfKG9sZSkoIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIixsb2NhbGUsZmxhZ3MsCgl4dGltZSxkZWJ1Z3N0cl93KGZvcm1hdCksdGltZXN0cix0aW1lbGVuKTsKCgl0aGlzbG9jYWxlID0gT0xFMk5MU19DaGVja0xvY2FsZSAoIGxvY2FsZSApOwoKCWlmICggZmxhZ3MgJiAoVElNRV9OT1RJTUVNQVJLRVIgfCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUICkpCgl7IEZJWE1FXyhvbGUpKCJUSU1FX05PVElNRU1BUktFUiBvciBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUIG5vdCBpbXBsZW1lbnRlZFxuIik7Cgl9CiAgCglmbGFncyAmPSAoVElNRV9OT1NFQ09ORFMgfCBUSU1FX05PTUlOVVRFU09SU0VDT05EUyk7IC8qIG1hc2sgZm9yIE9MRV9HZXRGb3JtYXRBKi8KCglpZiAoZm9ybWF0ID09IE5VTEwpIAoJeyBpZiAoZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpICAvKnVzZSBzeXN0ZW0gZGVmYXVsdCovCgkgIHsgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CgkgIH0KCSAgR2V0TG9jYWxlSW5mb1codGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmb3JtYXRfYnVmLCA0MCk7CgkgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwoJfQkgIAoJZWxzZSAKCXsgdGhpc2Zvcm1hdCA9IGZvcm1hdDsKCX0KIAoJaWYgKHh0aW1lID09IE5VTEwpIC8qIE5VTEwgbWVhbnMgdXNlIHRoZSBjdXJyZW50IGxvY2FsIHRpbWUqLwoJeyBHZXRTeXN0ZW1UaW1lKCZ0KTsKCSAgdGhpc3RpbWUgPSAmdDsKCX0gCgllbHNlCgl7IHRoaXN0aW1lID0geHRpbWU7Cgl9CgoJcmV0ID0gT0xFX0dldEZvcm1hdFcodGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmbGFncywgdGhpc3RpbWUsIHRoaXNmb3JtYXQsCiAgCQkJIHRpbWVzdHIsIHRpbWVsZW4pOwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bUNhbGVuZGFySW5mb0EJW0tFUk5FTDMyLjE5Nl0KICovCkJPT0wgV0lOQVBJIEVudW1DYWxlbmRhckluZm9BKAoJQ0FMSU5GT19FTlVNUFJPQ0EgY2FsaW5mb3Byb2MsTENJRCBsb2NhbGUsQ0FMSUQgY2FsZW5kYXIsQ0FMVFlQRSBjYWx0eXBlCikgewoJRklYTUVfKG9sZSkoIiglcCwweCUwNGx4LDB4JTA4bHgsMHglMDhseCksc3R1YiFcbiIsY2FsaW5mb3Byb2MsbG9jYWxlLGNhbGVuZGFyLGNhbHR5cGUpOwoJcmV0dXJuIEZBTFNFOwp9Cg==