LyogLSotIHRhYi13aWR0aDogODsgYy1iYXNpYy1vZmZzZXQ6IDQgLSotICovCi8qCiAqIE1NSU8gZnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCAxOTk4IEFuZHJldyBUYXlsb3IKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqIENvcHlyaWdodCAyMDAwIEVyaWMgUG91ZWNoCiAqLwoKLyogU3RpbGwgdG8gYmUgZG9uZToKICogCSsgY29ycmVjdCBoYW5kbGluZyBvZiBnbG9iYWwvbG9jYWwgSU9Qcm9jcwogKgkrIG1vZGUgb2YgbW1pbyBvYmplY3RzIGlzIG5vdCB1c2VkIChyZWFkIHZzIHdyaXRlIHZzIHJlYWR3cml0ZSkKICoJKyBvcHRpbWl6YXRpb24gb2YgaW50ZXJuYWwgYnVmZmVycyAoc2VnIC8gbGluKQogKgkrIGV2ZW4gaW4gMzIgYml0IG9ubHksIGEgc2VnIHB0ciBJTyBidWZmZXIgaXMgYWxsb2NhdGVkIChhZnRlciB0aGlzIGlzIAogKgkgIGZpeGVkLCB3ZSdsbCBoYXZlIGEgcHJvcGVyIDMyLzE2IHNlcGFyYXRpb24pCiAqCSsgdGhyZWFkIHNhZmVuZXNzCiAqCSsgcmVuYW1lIG9wZXJhdGlvbiBpcyBicm9rZW4KICovCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmUvd2luYmFzZTE2LmgiCiNpbmNsdWRlICJoZWFwLmgiCiNpbmNsdWRlICJzZWxlY3RvcnMuaCIKI2luY2x1ZGUgIm1tc3lzdGVtLmgiCiNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCiNpbmNsdWRlICJ3aW5lbW0uaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChtbWlvKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgIAltbWlvRG9zSU9Qcm9jICAgICAgICAgICAJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBMUkVTVUxUIENBTExCQUNLIG1taW9Eb3NJT1Byb2MoTFBNTUlPSU5GTyBscG1taW9pbmZvLCBVSU5UIHVNZXNzYWdlLCAKCQkJCSAgICAgIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMikgCnsKICAgIExSRVNVTFQJcmV0ID0gTU1TWVNFUlJfTk9FUlJPUjsKCiAgICBUUkFDRSgiKCVwLCAlWCwgJWxkLCAlbGQpO1xuIiwgbHBtbWlvaW5mbywgdU1lc3NhZ2UsIGxQYXJhbTEsIGxQYXJhbTIpOwogICAgCiAgICBzd2l0Y2ggKHVNZXNzYWdlKSB7CiAgICBjYXNlIE1NSU9NX09QRU46IAoJewoJICAgIC8qIFBhcmFtZXRlcnM6CgkgICAgICogbFBhcmFtMSA9IHN6RmlsZU5hbWUgcGFyYW1ldGVyIGZyb20gbW1pb09wZW4KCSAgICAgKiBsUGFyYW0yID0gcmVzZXJ2ZWQgKHdlIHVzZSBpdCBmb3IgMTYtYml0bmVzcykKCSAgICAgKiBSZXR1cm5zOiB6ZXJvIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb24gZXJyb3IKCSAgICAgKiBOT1RFOiBsRGlza09mZnNldCBhdXRvbWF0aWNhbGx5IHNldCB0byB6ZXJvCgkgICAgICovCgkgICAgT0ZTVFJVQ1Qgb2ZzOwoJICAgIExQQ1NUUiBzekZpbGVOYW1lID0gKExQQ1NUUilsUGFyYW0xOwoJICAgIAoJICAgIGlmIChscG1taW9pbmZvLT5kd0ZsYWdzICYgTU1JT19HRVRURU1QKSB7CgkJRklYTUUoIk1NSU9fR0VUVEVNUCBub3QgaW1wbGVtZW50ZWRcbiIpOwoJCXJldHVybiBNTUlPRVJSX0NBTk5PVE9QRU47CgkgICAgfQoJICAgIAoJICAgIC8qIGlmIGZpbGVuYW1lIE5VTEwsIGFzc3VtZSBvcGVuIGZpbGUgaGFuZGxlIGluIGFkd0luZm9bMF0gKi8KCSAgICBpZiAoIXN6RmlsZU5hbWUpIHsKCQlpZiAobFBhcmFtMikgCgkJICAgIGxwbW1pb2luZm8tPmFkd0luZm9bMF0gPSBEb3NGaWxlSGFuZGxlVG9XaW4zMkhhbmRsZShscG1taW9pbmZvLT5hZHdJbmZvWzBdKTsKCQlicmVhazsKCSAgICB9CgkgICAgCgkgICAgbHBtbWlvaW5mby0+YWR3SW5mb1swXSA9IChEV09SRClPcGVuRmlsZShzekZpbGVOYW1lLCAmb2ZzLCAKCQkJCQkJICAgICBscG1taW9pbmZvLT5kd0ZsYWdzKTsKCSAgICBpZiAobHBtbWlvaW5mby0+YWR3SW5mb1swXSA9PSAtMSkKCQlyZXQgPSBNTUlPRVJSX0NBTk5PVE9QRU47Cgl9CglicmVhazsKICAgIAogICAgY2FzZSBNTUlPTV9DTE9TRTogCgkvKiBQYXJhbWV0ZXJzOgoJICogbFBhcmFtMSA9IHdGbGFncyBwYXJhbWV0ZXIgZnJvbSBtbWlvQ2xvc2UKCSAqIGxQYXJhbTIgPSB1bnVzZWQKCSAqIFJldHVybnM6IHplcm8gb24gc3VjY2VzcywgZXJyb3IgY29kZSBvbiBlcnJvcgoJICovCglpZiAoIShsUGFyYW0xICYgTU1JT19GSE9QRU4pKQoJICAgIF9sY2xvc2UoKEhGSUxFKWxwbW1pb2luZm8tPmFkd0luZm9bMF0pOwoJYnJlYWs7CgkgICAgCiAgICBjYXNlIE1NSU9NX1JFQUQ6IAoJLyogUGFyYW1ldGVyczoKCSAqIGxQYXJhbTEgPSBodWdlIHBvaW50ZXIgdG8gcmVhZCBidWZmZXIKCSAqIGxQYXJhbTIgPSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAoJICogUmV0dXJuczogbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIDAgZm9yIEVPRiwgLTEgZm9yIGVycm9yIChlcnJvciBjb2RlCgkgKgkgICBpbiB3RXJyb3JSZXQpCgkgKi8KCXJldCA9IF9scmVhZCgoSEZJTEUpbHBtbWlvaW5mby0+YWR3SW5mb1swXSwgKEhQU1RSKWxQYXJhbTEsIChMT05HKWxQYXJhbTIpOwoJaWYgKHJldCAhPSAtMSkKCSAgICBscG1taW9pbmZvLT5sRGlza09mZnNldCArPSByZXQ7CgkKCWJyZWFrOwogICAgCiAgICBjYXNlIE1NSU9NX1dSSVRFOgogICAgY2FzZSBNTUlPTV9XUklURUZMVVNIOiAKCS8qIG5vIGludGVybmFsIGJ1ZmZlcmluZywgc28gV1JJVEVGTFVTSCBoYW5kbGVkIHNhbWUgYXMgV1JJVEUgKi8KCQoJLyogUGFyYW1ldGVyczoKCSAqIGxQYXJhbTEgPSBodWdlIHBvaW50ZXIgdG8gd3JpdGUgYnVmZmVyCgkgKiBsUGFyYW0yID0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCgkgKiBSZXR1cm5zOiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgLTEgZm9yIGVycm9yIChlcnJvciBjb2RlIGluCgkgKgkJd0Vycm9yUmV0KQoJICovCglyZXQgPSBfaHdyaXRlKChIRklMRSlscG1taW9pbmZvLT5hZHdJbmZvWzBdLCAoSFBTVFIpbFBhcmFtMSwgKExPTkcpbFBhcmFtMik7CglpZiAocmV0ICE9IC0xKQoJICAgIGxwbW1pb2luZm8tPmxEaXNrT2Zmc2V0ICs9IHJldDsKCWJyZWFrOwogICAgCiAgICBjYXNlIE1NSU9NX1NFRUs6IAoJLyogUGFyYW1ldGVyczoKCSAqIGxQYXJhbTEgPSBuZXcgcG9zaXRpb24KCSAqIGxQYXJhbTIgPSBmcm9tIHdoZW5jZSB0byBzZWVrIChTRUVLX1NFVCwgU0VFS19DVVIsIFNFRUtfRU5EKQoJICogUmV0dXJuczogbmV3IGZpbGUgcG9zdGlvbiwgLTEgb24gZXJyb3IKCSAqLwoJcmV0ID0gX2xsc2VlaygoSEZJTEUpbHBtbWlvaW5mby0+YWR3SW5mb1swXSwgKExPTkcpbFBhcmFtMSwgKExPTkcpbFBhcmFtMik7CglpZiAocmV0ICE9IC0xKQoJICAgIGxwbW1pb2luZm8tPmxEaXNrT2Zmc2V0ID0gcmV0OwoJcmV0dXJuIHJldDsKICAgIAogICAgY2FzZSBNTUlPTV9SRU5BTUU6IAoJLyogUGFyYW1ldGVyczoKCSAqIGxQYXJhbTEgPSBvbGQgbmFtZQoJICogbFBhcmFtMiA9IG5ldyBuYW1lCgkgKiBSZXR1cm5zOiB6ZXJvIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGZhaWx1cmUKCSAqLwoJIEZJWE1FKCJNTUlPTV9SRU5BTUUgaW5jb21wbGV0ZVxuIik7CiAJIGlmICghTW92ZUZpbGVBKChjb25zdCBjaGFyKilsUGFyYW0xLCAoY29uc3QgY2hhciopbFBhcmFtMikpCgkgICAgIHJldCA9IE1NSU9FUlJfRklMRU5PVEZPVU5EOwoJIGJyZWFrOwoKICAgIGRlZmF1bHQ6CglGSVhNRSgidW5leHBlY3RlZCBtZXNzYWdlICV1XG4iLCB1TWVzc2FnZSk7CglyZXR1cm4gMDsKICAgIH0KICAgIAogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICAgCW1taW9NZW1JT1Byb2MgICAgICAgICAgIAkJW2ludGVybmFsXQogKi8Kc3RhdGljIExSRVNVTFQgQ0FMTEJBQ0sgbW1pb01lbUlPUHJvYyhMUE1NSU9JTkZPIGxwbW1pb2luZm8sIFVJTlQgdU1lc3NhZ2UsIAoJCQkJICAgICAgTFBBUkFNIGxQYXJhbTEsIExQQVJBTSBsUGFyYW0yKSAKewogICAgVFJBQ0UoIiglcCwweCUwNHgsMHglMDhseCwweCUwOGx4KVxuIiwgbHBtbWlvaW5mbywgdU1lc3NhZ2UsIGxQYXJhbTEsIGxQYXJhbTIpOwoKICAgIHN3aXRjaCAodU1lc3NhZ2UpIHsKCQogICAgY2FzZSBNTUlPTV9PUEVOOiAKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gZmlsZW5hbWUgKG11c3QgYmUgTlVMTCkKCSAqIGxQYXJhbTIgPSByZXNlcnZlZCAod2UgdXNlIGl0IGZvciAxNi1iaXRuZXNzKQoJICogUmV0dXJuczogemVybyBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG9uIGVycm9yCgkgKiBOT1RFOiBsRGlza09mZnNldCBhdXRvbWF0aWNhbGx5IHNldCB0byB6ZXJvCgkgKi8KCS8qIEZJWE1FOiBpbyBwcm9jIHNob3VsZG4ndCBjaGFuZ2UgaXQgKi8KCWlmICghKGxwbW1pb2luZm8tPmR3RmxhZ3MgJiBNTUlPX0NSRUFURSkpCgkgICAgbHBtbWlvaW5mby0+cGNoRW5kUmVhZCA9IGxwbW1pb2luZm8tPnBjaEVuZFdyaXRlOwoJcmV0dXJuIDA7CgkKICAgIGNhc2UgTU1JT01fQ0xPU0U6IAoJLyogUGFyYW1ldGVyczoKCSAqIGxQYXJhbTEgPSB3RmxhZ3MgcGFyYW1ldGVyIGZyb20gbW1pb0Nsb3NlCgkgKiBsUGFyYW0yID0gdW51c2VkCgkgKiBSZXR1cm5zOiB6ZXJvIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb24gZXJyb3IKCSAqLwoJcmV0dXJuIDA7CgkKICAgIGNhc2UgTU1JT01fUkVBRDogCgkvKiBQYXJhbWV0ZXJzOgoJICogbFBhcmFtMSA9IGh1Z2UgcG9pbnRlciB0byByZWFkIGJ1ZmZlcgoJICogbFBhcmFtMiA9IG51bWJlciBvZiBieXRlcyB0byByZWFkCgkgKiBSZXR1cm5zOiBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgMCBmb3IgRU9GLCAtMSBmb3IgZXJyb3IgKGVycm9yIGNvZGUKCSAqCSAgIGluIHdFcnJvclJldCkKCSAqIE5PVEU6IGxEaXNrT2Zmc2V0IHNob3VsZCBiZSB1cGRhdGVkCgkgKi8KCUZJWE1FKCJNTUlPTV9SRUFEIG9uIG1lbW9yeSBmaWxlcyBzaG91bGQgbm90IG9jY3VyLCBidWZmZXIgbWF5IGJlIGxvc3QhXG4iKTsKCXJldHVybiAwOwogICAgCiAgICBjYXNlIE1NSU9NX1dSSVRFOgogICAgY2FzZSBNTUlPTV9XUklURUZMVVNIOiAKCS8qIG5vIGludGVybmFsIGJ1ZmZlcmluZywgc28gV1JJVEVGTFVTSCBoYW5kbGVkIHNhbWUgYXMgV1JJVEUgKi8KCQoJLyogUGFyYW1ldGVyczoKCSAqIGxQYXJhbTEgPSBodWdlIHBvaW50ZXIgdG8gd3JpdGUgYnVmZmVyCgkgKiBsUGFyYW0yID0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCgkgKiBSZXR1cm5zOiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgLTEgZm9yIGVycm9yIChlcnJvciBjb2RlIGluCgkgKgkJd0Vycm9yUmV0KQoJICogTk9URTogbERpc2tPZmZzZXQgc2hvdWxkIGJlIHVwZGF0ZWQKCSAqLwoJRklYTUUoIk1NSU9NX1dSSVRFIG9uIG1lbW9yeSBmaWxlcyBzaG91bGQgbm90IG9jY3VyLCBidWZmZXIgbWF5IGJlIGxvc3QhXG4iKTsKCXJldHVybiAwOwogICAgCiAgICBjYXNlIE1NSU9NX1NFRUs6IAoJLyogUGFyYW1ldGVyczoKCSAqIGxQYXJhbTEgPSBuZXcgcG9zaXRpb24KCSAqIGxQYXJhbTIgPSBmcm9tIHdoZW5jZSB0byBzZWVrIChTRUVLX1NFVCwgU0VFS19DVVIsIFNFRUtfRU5EKQoJICogUmV0dXJuczogbmV3IGZpbGUgcG9zdGlvbiwgLTEgb24gZXJyb3IKCSAqIE5PVEU6IGxEaXNrT2Zmc2V0IHNob3VsZCBiZSB1cGRhdGVkCgkgKi8KCUZJWE1FKCJNTUlPTV9TRUVLIG9uIG1lbW9yeSBmaWxlcyBzaG91bGQgbm90IG9jY3VyLCBidWZmZXIgbWF5IGJlIGxvc3QhXG4iKTsKCXJldHVybiAtMTsKICAgIAogICAgZGVmYXVsdDoKCUZJWE1FKCJ1bmV4cGVjdGVkIG1lc3NhZ2UgJXVcbiIsIHVNZXNzYWdlKTsKCXJldHVybiAwOwogICAgfQogICAgCiAgICByZXR1cm4gMDsKfQoKCmVudW0gbW1pb1Byb2NUeXBlIHtNTUlPX1BST0NfMTYsTU1JT19QUk9DXzMyQSxNTUlPX1BST0NfMzJXfTsKCnN0cnVjdCBJT1Byb2NMaXN0CnsKICAgIHN0cnVjdCBJT1Byb2NMaXN0KnBOZXh0OyAgICAgICAvKiBOZXh0IGl0ZW0gaW4gbGlua2VkIGxpc3QgKi8KICAgIEZPVVJDQyAgICAgICAgICAgIGZvdXJDQzsgICAgICAvKiBmb3VyLWNoYXJhY3RlciBjb2RlIGlkZW50aWZ5aW5nIElPUHJvYyAqLwogICAgTFBNTUlPUFJPQwkgICAgICBwSU9Qcm9jOyAgICAgLyogcG9pbnRlciB0byBJUHJvYyAqLwogICAgZW51bSBtbWlvUHJvY1R5cGUgdHlwZTsgICAgICAgIC8qIDE2LCAzMkEgb3IgMzJXICovCiAgICBpbnQJCSAgICAgIGNvdW50OwkgICAvKiBudW1iZXIgb2Ygb2JqZWN0cyBsaW5rZWQgdG8gaXQgKi8KfTsKCi8qIFRoaXMgYXJyYXkgd2lsbCBiZSB0aGUgZW50aXJlIGxpc3QgZm9yIG1vc3QgYXBwcyAqLwoKc3RhdGljIHN0cnVjdCBJT1Byb2NMaXN0IGRlZmF1bHRQcm9jc1tdID0gewogICAgeyZkZWZhdWx0UHJvY3NbMV0sIEZPVVJDQ19ET1MsIChMUE1NSU9QUk9DKW1taW9Eb3NJT1Byb2MsIE1NSU9fUFJPQ18zMkEsIDB9LAogICAge05VTEwsICAgICAgICAgICAgIEZPVVJDQ19NRU0sIChMUE1NSU9QUk9DKW1taW9NZW1JT1Byb2MsIE1NSU9fUFJPQ18zMkEsIDB9LAp9OwoKc3RhdGljIHN0cnVjdCBJT1Byb2NMaXN0KglwSU9Qcm9jTGlzdEFuY2hvciA9ICZkZWZhdWx0UHJvY3NbMF07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAJTU1JT19GaW5kUHJvY05vZGUgCQkJW0lOVEVSTkFMXQogKgogKiBGaW5kcyB0aGUgUHJvY0xpc3Qgbm9kZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBGT1VSQ0MgY29kZS4KICovCnN0YXRpYyBzdHJ1Y3QgSU9Qcm9jTGlzdCoJTU1JT19GaW5kUHJvY05vZGUoRk9VUkNDIGZjY0lPUHJvYykgCnsKICAgIHN0cnVjdCBJT1Byb2NMaXN0KglwTGlzdE5vZGU7CgogICAgZm9yIChwTGlzdE5vZGUgPSBwSU9Qcm9jTGlzdEFuY2hvcjsgcExpc3ROb2RlOyBwTGlzdE5vZGUgPSBwTGlzdE5vZGUtPnBOZXh0KSB7CglpZiAocExpc3ROb2RlLT5mb3VyQ0MgPT0gZmNjSU9Qcm9jKSB7CgkgICAgcmV0dXJuIHBMaXN0Tm9kZTsKCX0KICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAJTU1JT19JbnN0YWxsSU9Qcm9jIAkJCVtJTlRFUk5BTF0KICovCnN0YXRpYyBMUE1NSU9QUk9DIE1NSU9fSW5zdGFsbElPUHJvYyhGT1VSQ0MgZmNjSU9Qcm9jLCBMUE1NSU9QUk9DIHBJT1Byb2MsCgkJCQkgICAgIERXT1JEIGR3RmxhZ3MsIGVudW0gbW1pb1Byb2NUeXBlIHR5cGUpCnsKICAgIExQTU1JT1BST0MJICAgICAgICBscFByb2MgPSBOVUxMOwogICAgc3RydWN0IElPUHJvY0xpc3QqICBwTGlzdE5vZGU7CiAgICBzdHJ1Y3QgSU9Qcm9jTGlzdCoqIHBwTGlzdE5vZGU7CgogICAgVFJBQ0UoIiglbGQsICVwLCAlMDhsWCwgJWkpXG4iLCBmY2NJT1Byb2MsIHBJT1Byb2MsIGR3RmxhZ3MsIHR5cGUpOwoKICAgIGlmIChkd0ZsYWdzICYgTU1JT19HTE9CQUxQUk9DKQoJRklYTUUoIkdsb2JhbCBwcm9jZWR1cmVzIG5vdCBpbXBsZW1lbnRlZFxuIik7CgogICAgLyoganVzdCBoYW5kbGUgdGhlIGtub3duIHByb2NlZHVyZXMgZm9yIG5vdyAqLwogICAgc3dpdGNoIChkd0ZsYWdzICYgKE1NSU9fSU5TVEFMTFBST0N8TU1JT19SRU1PVkVQUk9DfE1NSU9fRklORFBST0MpKSB7CiAgICBjYXNlIE1NSU9fSU5TVEFMTFBST0M6CgkvKiBDcmVhdGUgbmV3IGVudHJ5IGZvciB0aGUgSU9Qcm9jIGxpc3QgKi8KCXBMaXN0Tm9kZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoKnBMaXN0Tm9kZSkpOwoJaWYgKHBMaXN0Tm9kZSkgewoJICAgIC8qIEZpbGwgaW4gdGhpcyBub2RlICovCgkgICAgcExpc3ROb2RlLT5mb3VyQ0MgPSBmY2NJT1Byb2M7CgkgICAgcExpc3ROb2RlLT5wSU9Qcm9jID0gcElPUHJvYzsKCSAgICBwTGlzdE5vZGUtPnR5cGUgPSB0eXBlOwoJICAgIHBMaXN0Tm9kZS0+Y291bnQgPSAwOwoKCSAgICAvKiBTdGljayBpdCBvbiB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCgkgICAgcExpc3ROb2RlLT5wTmV4dCA9IHBJT1Byb2NMaXN0QW5jaG9yOwoJICAgIHBJT1Byb2NMaXN0QW5jaG9yID0gcExpc3ROb2RlOwoJICAgIAoJICAgIC8qIFJldHVybiB0aGlzIElPUHJvYyAtIHRoYXQncyBob3cgdGhlIGNhbGxlciBrbm93cyB3ZSBzdWNjZWVkZWQgKi8KCSAgICBscFByb2MgPSBwSU9Qcm9jOwoJfSAKCWJyZWFrOwoJICAgICAgICAgIAogICAgY2FzZSBNTUlPX1JFTU9WRVBST0M6CgkvKiAKCSAqIFNlYXJjaCBmb3IgdGhlIG5vZGUgdGhhdCB3ZSdyZSB0cnlpbmcgdG8gcmVtb3ZlIC0gbm90ZQoJICogdGhhdCB0aGlzIG1ldGhvZCB3b24ndCBmaW5kIHRoZSBmaXJzdCBpdGVtIG9uIHRoZSBsaXN0LCBidXQKCSAqIHNpbmNlIHRoZSBmaXJzdCB0d28gaXRlbXMgb24gdGhpcyBsaXN0IGFyZSBvbmVzIHdlIHdvbid0CgkgKiBsZXQgdGhlIHVzZXIgZGVsZXRlIGFueXdheSwgdGhhdCdzIG9rYXkKCSAqLwkgICAgCglwcExpc3ROb2RlID0gJnBJT1Byb2NMaXN0QW5jaG9yOwoJd2hpbGUgKCgqcHBMaXN0Tm9kZSkgJiYgKCpwcExpc3ROb2RlKS0+Zm91ckNDICE9IGZjY0lPUHJvYykKCSAgICBwcExpc3ROb2RlID0gJigoKnBwTGlzdE5vZGUpLT5wTmV4dCk7CgoJaWYgKCpwcExpc3ROb2RlKSB7IC8qIGZvdW5kIGl0ICovCgkgICAgLyogRklYTUU6IHdoYXQgc2hvdWxkIGJlIGRvbmUgaWYgYW4gb3BlbiBtbWlvIG9iamVjdCB1c2VzIHRoaXMgcHJvYyA/CgkgICAgICogc2hhbGwgd2UgcmV0dXJuIGFuIGVycm9yLCBudWtlIHRoZSBtbWlvIG9iamVjdCA/CgkgICAgICovCgkgICAgaWYgKCgqcHBMaXN0Tm9kZSktPmNvdW50KSB7CgkJRVJSKCJDYW5ub3QgcmVtb3ZlIGEgbW1JT1Byb2Mgd2hpbGUgaW4gdXNlXG4iKTsKCQlicmVhazsKCSAgICB9CgkgICAgLyogcmVtb3ZlIGl0LCBidXQgb25seSBpZiBpdCBpc24ndCBidWlsdGluICovCgkgICAgaWYgKCgqcHBMaXN0Tm9kZSkgPj0gZGVmYXVsdFByb2NzICYmIAoJCSgqcHBMaXN0Tm9kZSkgPCBkZWZhdWx0UHJvY3MgKyBzaXplb2YoZGVmYXVsdFByb2NzKSkgewoJCVdBUk4oIlRyaWVkIHRvIHJlbW92ZSBidWlsdC1pbiBtbWlvIHByb2MuIFNraXBwaW5nXG4iKTsKCSAgICB9IGVsc2UgewoJCS8qIE9rYXksIG51a2UgaXQgKi8KCQlzdHJ1Y3QgSU9Qcm9jTGlzdCogIHB0bXBOb2RlID0gKnBwTGlzdE5vZGU7CgkJbHBQcm9jID0gKCpwcExpc3ROb2RlKS0+cElPUHJvYzsKCQkqcHBMaXN0Tm9kZSA9ICgqcHBMaXN0Tm9kZSktPnBOZXh0OwoJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHB0bXBOb2RlKTsKCSAgICB9Cgl9CglicmVhazsKCSAgICAKICAgIGNhc2UgTU1JT19GSU5EUFJPQzoKCWlmICgocExpc3ROb2RlID0gTU1JT19GaW5kUHJvY05vZGUoZmNjSU9Qcm9jKSkpIHsKCSAgICBscFByb2MgPSBwTGlzdE5vZGUtPnBJT1Byb2M7Cgl9CglicmVhazsKICAgIH0KICAgIAogICAgcmV0dXJuIGxwUHJvYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgCQlNTUlPX01hcDMyVG8xNgkJCVtJTlRFUk5BTF0KICovCnN0YXRpYyBMUkVTVUxUCU1NSU9fTWFwMzJUbzE2KERXT1JEIHdNc2csIExQQVJBTSogbHAxLCBMUEFSQU0qIGxwMikKewogICAgc3dpdGNoICh3TXNnKSB7CiAgICBjYXNlIE1NSU9NX09QRU46Cgl7CgkgICAgY2hhciAqbHAgPSBTRUdQVFJfU1RSRFVQKCAoTFBTVFIpKmxwMSApOwoJICAgIGlmICghbHApIHJldHVybiBNTVNZU0VSUl9OT01FTTsKCSAgICAqbHAxID0gU0VHUFRSX0dFVChscCk7Cgl9CglicmVhazsKICAgIGNhc2UgTU1JT01fQ0xPU0U6CiAgICBjYXNlIE1NSU9NX1NFRUs6CgkvKiBub3RoaW5nIHRvIGRvICovCglicmVhazsKICAgIGNhc2UgTU1JT01fUkVBRDoKICAgIGNhc2UgTU1JT01fV1JJVEU6CiAgICBjYXNlIE1NSU9NX1dSSVRFRkxVU0g6Cgl7CgkgICAgdm9pZCoJbHAgPSBTRUdQVFJfQUxMT0MoKmxwMik7CgkgICAgaWYgKCFscCkgcmV0dXJuIE1NU1lTRVJSX05PTUVNOwoJICAgCgkgICAgaWYgKHdNc2cgIT0gTU1JT01fUkVBRCkKCQltZW1jcHkobHAsICh2b2lkKikqbHAxLCAqbHAyKTsKCSAgICAqbHAxID0gU0VHUFRSX0dFVChscCk7Cgl9CglicmVhazsKICAgIGRlZmF1bHQ6CglUUkFDRSgiTm90IGEgbWFwcGFibGUgbWVzc2FnZSAoJWxkKVxuIiwgd01zZyk7CiAgICB9CiAgICByZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgCU1NSU9fVW5NYXAzMlRvMTYgCQkJW0lOVEVSTkFMXQogKi8Kc3RhdGljIExSRVNVTFQJTU1JT19Vbk1hcDMyVG8xNihEV09SRCB3TXNnLCBMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIsCgkJCQkgTFBBUkFNIGxwMSwgTFBBUkFNIGxwMikKewogICAgc3dpdGNoICh3TXNnKSB7CiAgICBjYXNlIE1NSU9NX09QRU46CglpZiAoIVNFR1BUUl9GUkVFKCh2b2lkKilscDEpKSB7CgkgICAgRklYTUUoImJhZCBmcmVlIGxpbmU9JWRcbiIsIF9fTElORV9fKTsKCX0gCglicmVhazsKICAgIGNhc2UgTU1JT01fQ0xPU0U6CiAgICBjYXNlIE1NSU9NX1NFRUs6CgkvKiBub3RoaW5nIHRvIGRvICovCglicmVhazsKICAgIGNhc2UgTU1JT01fUkVBRDoKCW1lbWNweSgodm9pZCopbFBhcmFtMSwgUFRSX1NFR19UT19MSU4obHAxKSwgbHAyKTsKCS8qIGZhbGwgdGhydSAqLwogICAgY2FzZSBNTUlPTV9XUklURToKICAgIGNhc2UgTU1JT01fV1JJVEVGTFVTSDoKCWlmICghU0VHUFRSX0ZSRUUoUFRSX1NFR19UT19MSU4obHAxKSkpIHsKCSAgICBGSVhNRSgiYmFkIGZyZWUgbGluZT0lZFxuIiwgX19MSU5FX18pOwoJfSAKCWJyZWFrOwogICAgZGVmYXVsdDoKCVRSQUNFKCJOb3QgYSBtYXBwYWJsZSBtZXNzYWdlICglbGQpXG4iLCB3TXNnKTsKICAgIH0KICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAJTU1JT19HZW5lcmF0ZUluZm9Gb3JJT1Byb2MgCQlbSU5URVJOQUxdCiAqLwpzdGF0aWMJU0VHUFRSCU1NSU9fR2VuZXJhdGVJbmZvRm9ySU9Qcm9jKGNvbnN0IFdJTkVfTU1JTyogd20pCnsKICAgIExQTU1JT0lORk8xNiBtbWlvSW5mbzE2ID0gU0VHUFRSX0FMTE9DKHNpemVvZihNTUlPSU5GTzE2KSk7CgogICAgbWVtc2V0KG1taW9JbmZvMTYsIDAsIHNpemVvZihNTUlPSU5GTzE2KSk7CgogICAgbW1pb0luZm8xNi0+bERpc2tPZmZzZXQgPSB3bS0+aW5mby5sRGlza09mZnNldDsKICAgIG1taW9JbmZvMTYtPmFkd0luZm9bMF0gID0gd20tPmluZm8uYWR3SW5mb1swXTsKICAgIG1taW9JbmZvMTYtPmFkd0luZm9bMV0gID0gd20tPmluZm8uYWR3SW5mb1sxXTsKICAgIG1taW9JbmZvMTYtPmFkd0luZm9bMl0gID0gd20tPmluZm8uYWR3SW5mb1syXTsKICAgIG1taW9JbmZvMTYtPmFkd0luZm9bM10gID0gd20tPmluZm8uYWR3SW5mb1szXTsKCiAgICByZXR1cm4gU0VHUFRSX0dFVChtbWlvSW5mbzE2KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgCU1NSU9fVXBkYXRlSW5mb0ZvcklPUHJvYwkJW0lOVEVSTkFMXQogKi8Kc3RhdGljCUxSRVNVTFQgTU1JT19VcGRhdGVJbmZvRm9ySU9Qcm9jKFdJTkVfTU1JTyogd20sIFNFR1BUUiBzZWdtbWlvSW5mbzE2KQp7CiAgICBNTUlPSU5GTzE2KiBtbWlvSW5mbzE2ID0gUFRSX1NFR19UT19MSU4oc2VnbW1pb0luZm8xNik7CgogICAgd20tPmluZm8ubERpc2tPZmZzZXQgPSBtbWlvSW5mbzE2LT5sRGlza09mZnNldDsKICAgIHdtLT5pbmZvLmFkd0luZm9bMF0gID0gbW1pb0luZm8xNi0+YWR3SW5mb1swXTsKICAgIHdtLT5pbmZvLmFkd0luZm9bMV0gID0gbW1pb0luZm8xNi0+YWR3SW5mb1sxXTsKICAgIHdtLT5pbmZvLmFkd0luZm9bMl0gID0gbW1pb0luZm8xNi0+YWR3SW5mb1syXTsKICAgIHdtLT5pbmZvLmFkd0luZm9bM10gID0gbW1pb0luZm8xNi0+YWR3SW5mb1szXTsKCiAgICBpZiAoIVNFR1BUUl9GUkVFKG1taW9JbmZvMTYpKSBGSVhNRSgiYmFkIGZyZWVcbiIpOwoKICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAJTU1JT19TZW5kTWVzc2FnZQkJCVtJTlRFUk5BTF0KICovCnN0YXRpYyBMUkVTVUxUCU1NSU9fU2VuZE1lc3NhZ2UoTFBXSU5FX01NSU8gd20sIERXT1JEIHdNc2csIExQQVJBTSBsUGFyYW0xLCAKCQkJCSBMUEFSQU0gbFBhcmFtMiwgZW51bSBtbWlvUHJvY1R5cGUgdHlwZSkKewogICAgTFJFU1VMVCAJCXJlc3VsdDsKICAgIFNFR1BUUgkJc2VnbW1pb0luZm8xNjsKICAgIExQQVJBTQkJbHAxID0gbFBhcmFtMSwgbHAyID0gbFBhcmFtMjsKCiAgICBpZiAoIXdtLT5pb1Byb2MgfHwgIXdtLT5pbmZvLnBJT1Byb2MpIHsKCUVSUigiYnJyclxuIik7CglyZXN1bHQgPSBNTVNZU0VSUl9JTlZBTFBBUkFNOwogICAgfQoKICAgIHN3aXRjaCAod20tPmlvUHJvYy0+dHlwZSkgewogICAgY2FzZSBNTUlPX1BST0NfMTY6CglzZWdtbWlvSW5mbzE2ID0gTU1JT19HZW5lcmF0ZUluZm9Gb3JJT1Byb2Mod20pOwoJaWYgKHdtLT5pb1Byb2MtPnR5cGUgIT0gdHlwZSkgewoJICAgIC8qIG1hcCAobFBhcmFtMSwgbFBhcmFtMikgaW50byAobHAxLCBscDIpIDMyPT4xNiAqLwoJICAgIGlmICgocmVzdWx0ID0gTU1JT19NYXAzMlRvMTYod01zZywgJmxwMSwgJmxwMikpICE9IE1NU1lTRVJSX05PRVJST1IpCgkJcmV0dXJuIHJlc3VsdDsKCX0KCS8qIEZJWE1FOiBpcyB3bS0+aW5mby5wSU9Qcm9jIGEgc2VnbWVudGVkIG9yIGEgbGluZWFyIGFkZHJlc3MgPwoJICogc291bmRzIHRvIG1lIGl0J3MgYSBzZWdtZW50ZWQgb25lLCBzaG91bGQgdXNlIGEgdGh1bmsgc29tZXdoZXJlCgkgKi8KCXJlc3VsdCA9ICgoTFBNTUlPUFJPQzE2KXdtLT5pbmZvLnBJT1Byb2MpKChMUFNUUilzZWdtbWlvSW5mbzE2LCAKCQkJCQkJICB3TXNnLCBscDEsIGxwMik7CgkKCWlmICh3bS0+aW9Qcm9jLT50eXBlICE9IHR5cGUpIHsKCSAgICBNTUlPX1VuTWFwMzJUbzE2KHdNc2csIGxQYXJhbTEsIGxQYXJhbTIsIGxwMSwgbHAyKTsKCX0KCU1NSU9fVXBkYXRlSW5mb0ZvcklPUHJvYyh3bSwgc2VnbW1pb0luZm8xNik7CglicmVhazsKICAgIGNhc2UgTU1JT19QUk9DXzMyQToKICAgIGNhc2UgTU1JT19QUk9DXzMyVzoKCWlmICh3bS0+aW9Qcm9jLT50eXBlICE9IHR5cGUpIHsKCSAgICAvKiBtYXAgKGxQYXJhbTEsIGxQYXJhbTIpIGludG8gKGxwMSwgbHAyKSAxNj0+MzIgKi8KCSAgICBXQVJOKCJOSVlcbiIpOwoJfQoJcmVzdWx0ID0gKHdtLT5pbmZvLnBJT1Byb2MpKChMUFNUUikmd20tPmluZm8sIHdNc2csIGxwMSwgbHAyKTsKCQojaWYgMAoJaWYgKHdtLT5pb1Byb2MtPnR5cGUgIT0gdHlwZSkgewoJICAgIC8qIHVubWFwIChsUGFyYW0xLCBsUGFyYW0yKSBpbnRvIChscDEsIGxwMikgMTY9PjMyICovCgl9CiNlbmRpZgoJYnJlYWs7CiAgICBkZWZhdWx0OiAgCglGSVhNRSgiSW50ZXJuYWwgZXJyb3JcbiIpOwoJcmVzdWx0ID0gTU1TWVNFUlJfRVJST1I7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgCQkJTU1JT19QYXJzZUV4dCAJCSAgICAgICAgW2ludGVybmFsXQogKgogKiBQYXJzZXMgYSBmaWxlbmFtZSBmb3IgdGhlIGV4dGVuc2lvbi4KICoKICogUkVUVVJOUwogKiAgVGhlIEZPVVJDQyBjb2RlIGZvciB0aGUgZXh0ZW5zaW9uIGlmIGZvdW5kLCBlbHNlIDAuCiAqLwpzdGF0aWMgRk9VUkNDIE1NSU9fUGFyc2VFeHQoTFBDU1RSIHN6RmlsZU5hbWUpCnsKICAgIC8qIEZpbGVuYW1lcyBhcmUgb2YgdGhlIGZvcm0gZmlsZS5leHQrQUJDCiAgICAgICBGSVhNRTogV2hhdCBpZiBhICcrJyBpcyBwYXJ0IG9mIHRoZSBmaWxlIG5hbWU/CiAgICAgICBGb3Igbm93LCB3ZSB0YWtlIHRoZSBsYXN0ICcrJyBwcmVzZW50ICovCiAgICAKICAgIEZPVVJDQyByZXQgPSAwOwogICAgCiAgICAvKiBOb3RlIHRoYXQgZXh0e1N0YXJ0LEVuZH0gcG9pbnQgdG8gdGhlIC4gYW5kICsgcmVzcGVjdGl2ZWx5ICovCiAgICBMUFNUUiBleHRFbmQ7CiAgICAKICAgIFRSQUNFKCIoJXMpXG4iLGRlYnVnc3RyX2Eoc3pGaWxlTmFtZSkpOwogICAgCiAgICBleHRFbmQgPSBzdHJyY2hyKHN6RmlsZU5hbWUsJysnKTsKICAgIGlmIChleHRFbmQpIHsKCS8qIE5lZWQgdG8gcGFyc2UgdG8gZmluZCB0aGUgZXh0ZW5zaW9uICovCglMUFNUUiBleHRTdGFydDsKCQoJZXh0U3RhcnQgPSBleHRFbmQ7Cgl3aGlsZSAoZXh0U3RhcnQgPiBzekZpbGVOYW1lICYmIGV4dFN0YXJ0WzBdICE9ICcuJykgewoJICAgIGV4dFN0YXJ0LS07Cgl9CgkKCWlmIChleHRTdGFydCA9PSBzekZpbGVOYW1lKSB7CgkgICAgRVJSKCIrIGJ1dCBubyAuIGluIHN6RmlsZU5hbWU6ICVzXG4iLCBkZWJ1Z3N0cl9hKHN6RmlsZU5hbWUpKTsKCX0gZWxzZSB7CgkgICAgQ0hBUiBleHRbNV07CgkgICAgCgkgICAgaWYgKGV4dEVuZCAtIGV4dFN0YXJ0IC0gMSA+IDQpCgkJV0FSTigiRXh0ZW5zaW9uIGxlbmd0aCA+IDRcbiIpOwoJICAgIGxzdHJjcHluQShleHQsZXh0U3RhcnQgKyAxLG1pbihleHRFbmQtZXh0U3RhcnQsNSkpOwoJICAgIFRSQUNFKCJHb3QgZXh0ZW5zaW9uOiAlc1xuIiwgZGVidWdzdHJfYShleHQpKTsKCSAgICAvKiBGT1VSQ0MgY29kZXMgaWRlbnRpZnlpbmcgZmlsZS1leHRlbnRpb25zIG11c3QgYmUgdXBwZXJjYXNlICovCgkgICAgcmV0ID0gbW1pb1N0cmluZ1RvRk9VUkNDQShleHQsIE1NSU9fVE9VUFBFUik7Cgl9CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJTU1JT19HZXQJCQlbaW50ZXJuYWxdCiAqCiAqIFJldGlyaWV2ZXMgZnJvbSBjdXJyZW50IHByb2Nlc3MgdGhlIG1taW8gb2JqZWN0CiAqLwpzdGF0aWMJTFBXSU5FX01NSU8JTU1JT19HZXQoTFBXSU5FX01NX0lEQVRBIGlEYXRhLCBITU1JTyBoKQp7CiAgICBMUFdJTkVfTU1JTwkJd20gPSBOVUxMOwoKICAgIGlmICghaURhdGEpIGlEYXRhID0gTVVMVElNRURJQV9HZXRJRGF0YSgpOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZpRGF0YS0+Y3MpOwogICAgZm9yICh3bSA9IGlEYXRhLT5scE1NSU87IHdtOyB3bSA9IHdtLT5scE5leHQpIHsKCWlmICh3bS0+aW5mby5obW1pbyA9PSBoKQoJICAgIGJyZWFrOwogICAgfQogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmlEYXRhLT5jcyk7CiAgICByZXR1cm4gd207Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQlNTUlPX0NyZWF0ZQkJCVtpbnRlcm5hbF0KICoKICogQ3JlYXRlcyBhbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBmb3IgYSBtbWlvIGluc3RhbmNlCiAqLwpzdGF0aWMJTFBXSU5FX01NSU8JCU1NSU9fQ3JlYXRlKHZvaWQpCnsKICAgIHN0YXRpYwlXT1JECU1NSU9fY291bnRlciA9IDA7CiAgICBMUFdJTkVfTU1JTwkJd207CiAgICBMUFdJTkVfTU1fSURBVEEJaURhdGEgPSBNVUxUSU1FRElBX0dldElEYXRhKCk7CgogICAgd20gPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKFdJTkVfTU1JTykpOwogICAgaWYgKHdtKSB7CglFbnRlckNyaXRpY2FsU2VjdGlvbigmaURhdGEtPmNzKTsKCXdoaWxlIChNTUlPX0dldChpRGF0YSwgKytNTUlPX2NvdW50ZXIpKTsKCXdtLT5pbmZvLmhtbWlvID0gTU1JT19jb3VudGVyOwoJd20tPmxwTmV4dCA9IGlEYXRhLT5scE1NSU87CglpRGF0YS0+bHBNTUlPID0gd207CglMZWF2ZUNyaXRpY2FsU2VjdGlvbigmaURhdGEtPmNzKTsKICAgIH0KICAgIHJldHVybiB3bTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCU1NSU9fRGVzdHJveQkJCVtpbnRlcm5hbF0KICotCiAqIERlc3Ryb3lzIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGZvciBhIG1taW8gaW5zdGFuY2UKICovCnN0YXRpYwlCT09MCQlNTUlPX0Rlc3Ryb3koTFBXSU5FX01NSU8gd20pCnsKICAgIExQV0lORV9NTV9JREFUQQlpRGF0YSA9IE1VTFRJTUVESUFfR2V0SURhdGEoKTsKICAgIExQV0lORV9NTUlPKgltOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZpRGF0YS0+Y3MpOwogICAgZm9yIChtID0gJihpRGF0YS0+bHBNTUlPKTsgKm0gJiYgKm0gIT0gd207IG0gPSAmKCptKS0+bHBOZXh0KTsKICAgIGlmICgqbSkgewoJKm0gPSAoKm0pLT5scE5leHQ7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB3bSk7Cgl3bSA9IE5VTEw7CiAgICB9CiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmaURhdGEtPmNzKTsKICAgIHJldHVybiB3bSA/IEZBTFNFIDogVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgCQlNTUlPX0ZsdXNoIAkJCVtJTlRFUk5BTF0KICovCnN0YXRpYwlMUkVTVUxUCU1NSU9fRmx1c2goV0lORV9NTUlPKiB3bSwgVUlOVCB1RmxhZ3MpCnsKICAgIGlmICh3bS0+aW5mby5jY2hCdWZmZXIgJiYgKHdtLT5pbmZvLmZjY0lPUHJvYyAhPSBGT1VSQ0NfTUVNKSkgewoJLyogbm90IHF1aXRlIHN1cmUgd2hhdCB0byBkbyBoZXJlLCBidXQgSSdsbCBndWVzcyAqLwoJaWYgKHdtLT5pbmZvLmR3RmxhZ3MgJiBNTUlPX0RJUlRZKSB7CgkgICAgTU1JT19TZW5kTWVzc2FnZSh3bSwgTU1JT01fU0VFSywgd20tPmluZm8ubEJ1Zk9mZnNldCwKCQkJICAgICBTRUVLX1NFVCwgTU1JT19QUk9DXzMyQSk7CgkgICAgTU1JT19TZW5kTWVzc2FnZSh3bSwgTU1JT01fV1JJVEUsIChMUEFSQU0pd20tPmluZm8ucGNoQnVmZmVyLAoJCQkgICAgIHdtLT5pbmZvLnBjaE5leHQgLSB3bS0+aW5mby5wY2hCdWZmZXIsIE1NSU9fUFJPQ18zMkEpOwoJfQoJaWYgKHVGbGFncyAmIE1NSU9fRU1QVFlCVUYpCgkgICAgd20tPmluZm8ucGNoTmV4dCA9IHdtLT5pbmZvLnBjaEJ1ZmZlcjsKICAgIH0KICAgIHdtLT5pbmZvLmR3RmxhZ3MgJj0gfk1NSU9fRElSVFk7CgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgCQlNTUlPX0dyYWJOZXh0QnVmZmVyCQkJW0lOVEVSTkFMXQogKi8Kc3RhdGljIExPTkcJTU1JT19HcmFiTmV4dEJ1ZmZlcihMUFdJTkVfTU1JTyB3bSwgaW50IGZvcl9yZWFkKQp7CiAgICBMT05HCXNpemUgPSB3bS0+aW5mby5jY2hCdWZmZXI7CgogICAgVFJBQ0UoImJvPSVseCBkbz0lbHggb2Y9JWx4XG4iLCAKCSAgd20tPmluZm8ubEJ1Zk9mZnNldCwgd20tPmluZm8ubERpc2tPZmZzZXQsIAoJICBNTUlPX1NlbmRNZXNzYWdlKHdtLCBNTUlPTV9TRUVLLCAwLCBTRUVLX0NVUiwgTU1JT19QUk9DXzMyQSkpOwoJICAKICAgIHdtLT5pbmZvLmxCdWZPZmZzZXQgPSB3bS0+aW5mby5sRGlza09mZnNldDsKICAgIHdtLT5pbmZvLnBjaE5leHQgPSB3bS0+aW5mby5wY2hCdWZmZXI7CiAgICB3bS0+aW5mby5wY2hFbmRSZWFkID0gd20tPmluZm8ucGNoQnVmZmVyOwogICAgd20tPmluZm8ucGNoRW5kV3JpdGUgPSB3bS0+aW5mby5wY2hCdWZmZXIgKyB3bS0+aW5mby5jY2hCdWZmZXI7CgogICAgaWYgKGZvcl9yZWFkKSB7CglzaXplID0gTU1JT19TZW5kTWVzc2FnZSh3bSwgTU1JT01fUkVBRCwgKExQQVJBTSl3bS0+aW5mby5wY2hCdWZmZXIsCgkJCQlzaXplLCBNTUlPX1BST0NfMzJBKTsKCWlmIChzaXplID4gMCkKCSAgICB3bS0+aW5mby5wY2hFbmRSZWFkICs9IHNpemU7CiAgICB9CiAgICB3bS0+YkJ1ZmZlckxvYWRlZCA9IFRSVUU7CiAgICByZXR1cm4gc2l6ZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAJCU1NSU9fU2V0QnVmZmVyIAkJCQlbSU5URVJOQUxdCiAqLwpzdGF0aWMJVUlOVAlNTUlPX1NldEJ1ZmZlcihXSU5FX01NSU8qIHdtLCB2b2lkKiBwY2hCdWZmZXIsIExPTkcgY2NoQnVmZmVyLCAKCQkJICAgICAgIFVJTlQgdUZsYWdzLCBCT09MIGJGcm9tMzIpCnsKICAgIFRSQUNFKCIoJXAgJXAgJWxkICV1ICVkKVxuIiwgd20sIHBjaEJ1ZmZlciwgY2NoQnVmZmVyLCB1RmxhZ3MsIGJGcm9tMzIpOwoKICAgIGlmICh1RmxhZ3MpCQkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAgICBpZiAoY2NoQnVmZmVyID4gMHhGRkZGKQoJV0FSTigiVW50ZXN0ZWQgaGFuZGxpbmcgb2YgaHVnZSBtbWlvIGJ1ZmZlcnMgKCVsZCA+PSA2NGspXG4iLCBjY2hCdWZmZXIpOwoJCiAgICBpZiAoTU1JT19GbHVzaCh3bSwgTU1JT19FTVBUWUJVRikgIT0gMCkKCXJldHVybiBNTUlPRVJSX0NBTk5PVFdSSVRFOwogICAgCiAgICBpZiAoKCFjY2hCdWZmZXIgfHwgcGNoQnVmZmVyKSAmJiAod20tPmluZm8uZHdGbGFncyAmIE1NSU9fQUxMT0NCVUYpKSB7CglHbG9iYWxVbmxvY2sxNih3bS0+aE1lbSk7CglHbG9iYWxGcmVlMTYod20tPmhNZW0pOwoJd20tPmluZm8uZHdGbGFncyAmPSB+TU1JT19BTExPQ0JVRjsKICAgIH0KICAgIGlmIChwY2hCdWZmZXIpIHsKCWlmIChiRnJvbTMyKSB7CgkgICAgd20tPmluZm8ucGNoQnVmZmVyID0gcGNoQnVmZmVyOwoJICAgIHdtLT5idWZmZXIxNiA9IDA7Cgl9IGVsc2UgewoJICAgIHdtLT5pbmZvLnBjaEJ1ZmZlciA9IFBUUl9TRUdfVE9fTElOKHBjaEJ1ZmZlcik7CgkgICAgd20tPmJ1ZmZlcjE2ID0gKFNFR1BUUilwY2hCdWZmZXI7Cgl9Cgl3bS0+aE1lbSA9IDA7CiAgICB9IGVsc2UgaWYgKGNjaEJ1ZmZlciAmJiAod20tPmluZm8uZHdGbGFncyAmIE1NSU9fQUxMT0NCVUYpKSB7CglIR0xPQkFMMTYgaE5ld0J1ZjsKCUdsb2JhbFVubG9jazE2KHdtLT5oTWVtKTsKCWhOZXdCdWYgPSBHbG9iYWxSZUFsbG9jMTYod20tPmhNZW0sIGNjaEJ1ZmZlciwgMCk7CglpZiAoIWhOZXdCdWYpIHsKCSAgICAvKiBGSVhNRTogdGhpcyBhc3N1bWVzIHRoZSBtZW1vcnkgYmxvY2sgZGlkbid0IG1vdmUgKi8KCSAgICBHbG9iYWxMb2NrMTYod20tPmhNZW0pOwoJICAgIHJldHVybiBNTUlPRVJSX09VVE9GTUVNT1JZOwoJfQoJd20tPmhNZW0gPSBoTmV3QnVmOwogICAgfSBlbHNlIGlmIChjY2hCdWZmZXIpIHsKCWlmICghKHdtLT5oTWVtID0gR2xvYmFsQWxsb2MxNihHTUVNX01PVkVBQkxFLCBjY2hCdWZmZXIpKSkKCSAgICByZXR1cm4gTU1JT0VSUl9PVVRPRk1FTU9SWTsKCXdtLT5pbmZvLmR3RmxhZ3MgfD0gTU1JT19BTExPQ0JVRjsKICAgIH0gZWxzZSB7Cgl3bS0+aW5mby5wY2hCdWZmZXIgPSBOVUxMOwoJd20tPmhNZW0gPSAwOwoJd20tPmJ1ZmZlcjE2ID0gMDsKICAgIH0KCiAgICBpZiAod20tPmhNZW0pIHsKCXdtLT5idWZmZXIxNiA9IFdJTjE2X0dsb2JhbExvY2sxNih3bS0+aE1lbSk7Cgl3bS0+aW5mby5wY2hCdWZmZXIgPSAodm9pZCopUFRSX1NFR19UT19MSU4oKHZvaWQqKXdtLT5idWZmZXIxNik7CiAgICB9CgogICAgd20tPmluZm8uY2NoQnVmZmVyID0gY2NoQnVmZmVyOwogICAgd20tPmluZm8ucGNoTmV4dCA9IHdtLT5pbmZvLnBjaEJ1ZmZlcjsKICAgIHdtLT5pbmZvLnBjaEVuZFJlYWQgPSB3bS0+aW5mby5wY2hCdWZmZXI7CiAgICB3bS0+aW5mby5wY2hFbmRXcml0ZSA9IHdtLT5pbmZvLnBjaEJ1ZmZlciArIGNjaEJ1ZmZlcjsKICAgIHdtLT5pbmZvLmxCdWZPZmZzZXQgPSAwOwogICAgd20tPmJCdWZmZXJMb2FkZWQgPSBGQUxTRTsKCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCU1NSU9fT3BlbiAgICAgIAkJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgSE1NSU8gTU1JT19PcGVuKExQU1RSIHN6RmlsZU5hbWUsIE1NSU9JTkZPKiByZWZtbWluZm8sIAoJCSAgICAgICBEV09SRCBkd09wZW5GbGFncywgZW51bSBtbWlvUHJvY1R5cGUgdHlwZSkKewogICAgTFBXSU5FX01NSU8JCXdtOwoKICAgIFRSQUNFKCIoJyVzJywgJXAsICUwOGxYLCAlZCk7XG4iLCBzekZpbGVOYW1lLCByZWZtbWluZm8sIGR3T3BlbkZsYWdzLCB0eXBlKTsKICAgIAogICAgaWYgKGR3T3BlbkZsYWdzICYgKE1NSU9fUEFSU0V8TU1JT19FWElTVCkpIHsKCWNoYXIJYnVmZmVyW01BWF9QQVRIXTsKCQoJaWYgKEdldEZ1bGxQYXRoTmFtZUEoc3pGaWxlTmFtZSwgc2l6ZW9mKGJ1ZmZlciksIGJ1ZmZlciwgTlVMTCkgPj0gc2l6ZW9mKGJ1ZmZlcikpCgkgICAgcmV0dXJuIChITU1JTzE2KUZBTFNFOwoJaWYgKChkd09wZW5GbGFncyAmIE1NSU9fRVhJU1QpICYmIChHZXRGaWxlQXR0cmlidXRlc0EoYnVmZmVyKSA9PSAtMSkpCgkgICAgcmV0dXJuIChITU1JTylGQUxTRTsKCXN0cmNweShzekZpbGVOYW1lLCBidWZmZXIpOwoJcmV0dXJuIChITU1JTylUUlVFOwogICAgfQogICAgCiAgICBpZiAoKHdtID0gTU1JT19DcmVhdGUoKSkgPT0gTlVMTCkKCXJldHVybiAwOwoKICAgIC8qIElmIGJvdGggcGFyYW1zIGFyZSBOVUxMLCB0aGVuIHBhcnNlIHRoZSBmaWxlIG5hbWUgKi8KICAgIGlmIChyZWZtbWluZm8tPmZjY0lPUHJvYyA9PSAwICYmIHJlZm1taW5mby0+cElPUHJvYyA9PSBOVUxMKSB7Cgl3bS0+aW5mby5mY2NJT1Byb2MgPSBNTUlPX1BhcnNlRXh0KHN6RmlsZU5hbWUpOwoJLyogSGFuZGxlIGFueSB1bmhhbmRsZWQvZXJyb3IgY2FzZS4gQXNzdW1lIERPUyBmaWxlICovCglpZiAod20tPmluZm8uZmNjSU9Qcm9jID09IDApCgkgICAgd20tPmluZm8uZmNjSU9Qcm9jID0gRk9VUkNDX0RPUzsKCWlmICghKHdtLT5pb1Byb2MgPSBNTUlPX0ZpbmRQcm9jTm9kZSh3bS0+aW5mby5mY2NJT1Byb2MpKSkgZ290byBlcnJvcjI7Cgl3bS0+aW5mby5wSU9Qcm9jID0gd20tPmlvUHJvYy0+cElPUHJvYzsKCXdtLT5iVG1wSU9Qcm9jID0gRkFMU0U7CiAgICB9CiAgICAvKiBpZiBqdXN0IHRoZSBmb3VyIGNoYXJhY3RlciBjb2RlIGlzIHByZXNlbnQsIGxvb2sgdXAgSU8gcHJvYyAqLwogICAgZWxzZSBpZiAocmVmbW1pbmZvLT5wSU9Qcm9jID09IE5VTEwpIHsJCgl3bS0+aW5mby5mY2NJT1Byb2MgPSByZWZtbWluZm8tPmZjY0lPUHJvYzsKCWlmICghKHdtLT5pb1Byb2MgPSBNTUlPX0ZpbmRQcm9jTm9kZSh3bS0+aW5mby5mY2NJT1Byb2MpKSkgZ290byBlcnJvcjI7Cgl3bS0+aW5mby5wSU9Qcm9jID0gd20tPmlvUHJvYy0+cElPUHJvYzsKCXdtLT5iVG1wSU9Qcm9jID0gRkFMU0U7CiAgICB9IAogICAgLyogaWYgSU8gcHJvYyBzcGVjaWZpZWQsIHVzZSBpdCBhbmQgc3BlY2lmaWVkIGZvdXIgY2hhcmFjdGVyIGNvZGUgKi8KICAgIGVsc2UgewoJd20tPmluZm8uZmNjSU9Qcm9jID0gcmVmbW1pbmZvLT5mY2NJT1Byb2M7Cgl3bS0+aW5mby5wSU9Qcm9jID0gcmVmbW1pbmZvLT5wSU9Qcm9jOwoJTU1JT19JbnN0YWxsSU9Qcm9jKHdtLT5pbmZvLmZjY0lPUHJvYywgd20tPmluZm8ucElPUHJvYywgCgkJCSAgIE1NSU9fSU5TVEFMTFBST0MsIHR5cGUpOwoJaWYgKCEod20tPmlvUHJvYyA9IE1NSU9fRmluZFByb2NOb2RlKHdtLT5pbmZvLmZjY0lPUHJvYykpKSBnb3RvIGVycm9yMjsKCWFzc2VydCh3bS0+aW9Qcm9jLT5wSU9Qcm9jID09IHJlZm1taW5mby0+cElPUHJvYyk7Cgl3bS0+aW5mby5wSU9Qcm9jID0gd20tPmlvUHJvYy0+cElPUHJvYzsKCXdtLT5iVG1wSU9Qcm9jID0gVFJVRTsKICAgIH0KICAgIAogICAgd20tPmJCdWZmZXJMb2FkZWQgPSBGQUxTRTsKICAgIHdtLT5pb1Byb2MtPmNvdW50Kys7CgogICAgaWYgKGR3T3BlbkZsYWdzICYgTU1JT19BTExPQ0JVRikgewoJaWYgKChyZWZtbWluZm8tPndFcnJvclJldCA9IG1taW9TZXRCdWZmZXIod20tPmluZm8uaG1taW8sIE5VTEwsIAoJCQkJCQkgIE1NSU9fREVGQVVMVEJVRkZFUiwgMCkpKQoJICAgIGdvdG8gZXJyb3IxOwogICAgfSBlbHNlIGlmICh3bS0+aW5mby5mY2NJT1Byb2MgPT0gRk9VUkNDX01FTSkgewoJcmVmbW1pbmZvLT53RXJyb3JSZXQgPSBNTUlPX1NldEJ1ZmZlcih3bSwgcmVmbW1pbmZvLT5wY2hCdWZmZXIsIAoJCQkJCSAgICAgIHJlZm1taW5mby0+Y2NoQnVmZmVyLCAwLCAKCQkJCQkgICAgICB0eXBlICE9IE1NSU9fUFJPQ18xNik7CglpZiAocmVmbW1pbmZvLT53RXJyb3JSZXQgIT0gTU1TWVNFUlJfTk9FUlJPUikKCSAgICBnb3RvIGVycm9yMTsKCXdtLT5iQnVmZmVyTG9hZGVkID0gVFJVRTsKICAgIH0gLyogZWxzZSA9PiB1bmJ1ZmZlcmVkLCB3bS0+aW5mby5wY2hCdWZmZXIgPT0gTlVMTCAqLwogICAgCiAgICAvKiBzZWUgbW1pb0Rvc0lPUHJvYyBmb3IgdGhhdCBvbmUgKi8KICAgIHdtLT5pbmZvLmFkd0luZm9bMF0gPSByZWZtbWluZm8tPmFkd0luZm9bMF07CiAgICB3bS0+aW5mby5kd0ZsYWdzID0gZHdPcGVuRmxhZ3M7CiAgICAKICAgIC8qIGNhbGwgSU8gcHJvYyB0byBhY3R1YWxseSBvcGVuIGZpbGUgKi8KICAgIHJlZm1taW5mby0+d0Vycm9yUmV0ID0gTU1JT19TZW5kTWVzc2FnZSh3bSwgTU1JT01fT1BFTiwgKExQQVJBTSlzekZpbGVOYW1lLCAKCQkJCQkgICAgdHlwZSA9PSBNTUlPX1BST0NfMTYsIE1NSU9fUFJPQ18zMkEpOwoKICAgIGlmIChyZWZtbWluZm8tPndFcnJvclJldCA9PSAwKQoJcmV0dXJuIHdtLT5pbmZvLmhtbWlvOwogZXJyb3IxOgogICAgaWYgKHdtLT5pb1Byb2MpIHdtLT5pb1Byb2MtPmNvdW50LS07CiBlcnJvcjI6CiAgICBNTUlPX0Rlc3Ryb3kod20pOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb09wZW5XICAgICAgIAkJW1dJTk1NLjEyM10KICovCkhNTUlPIFdJTkFQSSBtbWlvT3BlblcoTFBXU1RSIHN6RmlsZU5hbWUsIE1NSU9JTkZPKiBscG1taW9pbmZvLAoJCSAgICAgICBEV09SRCBkd09wZW5GbGFncykKewogICAgSE1NSU8gCXJldDsKICAgIExQU1RSCXN6Rm4gPSBIRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3pGaWxlTmFtZSk7CgogICAgaWYgKGxwbW1pb2luZm8pIHsKCXJldCA9IE1NSU9fT3BlbihzekZuLCBscG1taW9pbmZvLCBkd09wZW5GbGFncywgTU1JT19QUk9DXzMyVyk7CiAgICB9IGVsc2UgewoJTU1JT0lORk8JbW1pb2luZm87CgkKCW1taW9pbmZvLmZjY0lPUHJvYyA9IDA7CgltbWlvaW5mby5wSU9Qcm9jID0gTlVMTDsKCW1taW9pbmZvLnBjaEJ1ZmZlciA9IE5VTEw7CgltbWlvaW5mby5jY2hCdWZmZXIgPSAwOwoJCglyZXQgPSBNTUlPX09wZW4oc3pGbiwgJm1taW9pbmZvLCBkd09wZW5GbGFncywgTU1JT19QUk9DXzMyVyk7CiAgICB9CgogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3pGbik7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9PcGVuQSAgICAgICAJCVtXSU5NTS4xMjJdCiAqLwpITU1JTyBXSU5BUEkgbW1pb09wZW5BKExQU1RSIHN6RmlsZU5hbWUsIE1NSU9JTkZPKiBscG1taW9pbmZvLCAKCQkgICAgICAgRFdPUkQgZHdPcGVuRmxhZ3MpCnsKICAgIEhNTUlPIAlyZXQ7CiAgICAKICAgIGlmIChscG1taW9pbmZvKSB7CglyZXQgPSBNTUlPX09wZW4oc3pGaWxlTmFtZSwgbHBtbWlvaW5mbywgZHdPcGVuRmxhZ3MsIE1NSU9fUFJPQ18zMkEpOwogICAgfSBlbHNlIHsKCU1NSU9JTkZPCW1taW9pbmZvOwoJCgltbWlvaW5mby5mY2NJT1Byb2MgPSAwOwoJbW1pb2luZm8ucElPUHJvYyA9IE5VTEw7CgltbWlvaW5mby5wY2hCdWZmZXIgPSBOVUxMOwoJbW1pb2luZm8uY2NoQnVmZmVyID0gMDsKCQoJcmV0ID0gTU1JT19PcGVuKHN6RmlsZU5hbWUsICZtbWlvaW5mbywgZHdPcGVuRmxhZ3MsIE1NSU9fUFJPQ18zMkEpOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvT3BlbiAgICAgICAJCVtNTVNZU1RFTS4xMjEwXQogKi8KSE1NSU8xNiBXSU5BUEkgbW1pb09wZW4xNihMUFNUUiBzekZpbGVOYW1lLCBNTUlPSU5GTzE2KiBscG1taW9pbmZvMTYsIAoJCQkgIERXT1JEIGR3T3BlbkZsYWdzKQp7CiAgICBITU1JTyAJcmV0OwogICAgTU1JT0lORk8JbW1pbzsKICAgIAogICAgaWYgKGxwbW1pb2luZm8xNikgewoJTU1JT0lORk8JbW1pb2luZm87CiAgICAgICAKCW1lbXNldCgmbW1pb2luZm8sIDAsIHNpemVvZihtbWlvaW5mbykpOwoKCW1taW9pbmZvLmR3RmxhZ3MgICAgID0gbHBtbWlvaW5mbzE2LT5kd0ZsYWdzOyAKCW1taW9pbmZvLmZjY0lPUHJvYyAgID0gbHBtbWlvaW5mbzE2LT5mY2NJT1Byb2M7IAoJbW1pb2luZm8ucElPUHJvYyAgICAgPSAoTFBNTUlPUFJPQylscG1taW9pbmZvMTYtPnBJT1Byb2M7IAoJbW1pb2luZm8uY2NoQnVmZmVyICAgPSBscG1taW9pbmZvMTYtPmNjaEJ1ZmZlcjsgCgltbWlvaW5mby5wY2hCdWZmZXIgICA9IGxwbW1pb2luZm8xNi0+cGNoQnVmZmVyOwoJbW1pb2luZm8uYWR3SW5mb1swXSAgPSBscG1taW9pbmZvMTYtPmFkd0luZm9bMF07IAoJbW1pb2luZm8uYWR3SW5mb1sxXSAgPSBscG1taW9pbmZvMTYtPmFkd0luZm9bMV07IAoJbW1pb2luZm8uYWR3SW5mb1syXSAgPSBscG1taW9pbmZvMTYtPmFkd0luZm9bMl07IAoJbW1pb2luZm8uYWR3SW5mb1szXSAgPSBscG1taW9pbmZvMTYtPmFkd0luZm9bM107IAoJCglyZXQgPSBNTUlPX09wZW4oc3pGaWxlTmFtZSwgJm1taW9pbmZvLCBkd09wZW5GbGFncywgTU1JT19QUk9DXzE2KTsKCgltbWlvR2V0SW5mbzE2KG1taW9pbmZvLmhtbWlvLCBscG1taW9pbmZvMTYsIDApOwoJbHBtbWlvaW5mbzE2LT53RXJyb3JSZXQgPSByZXQ7CiAgICB9IGVsc2UgewoJbW1pby5mY2NJT1Byb2MgPSAwOwoJbW1pby5wSU9Qcm9jID0gTlVMTDsKCW1taW8ucGNoQnVmZmVyID0gTlVMTDsKCW1taW8uY2NoQnVmZmVyID0gMDsKCXJldCA9IE1NSU9fT3BlbihzekZpbGVOYW1lLCAmbW1pbywgZHdPcGVuRmxhZ3MsIEZBTFNFKTsKICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCiAgICAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvQ2xvc2UgICAgICAJCVtXSU5NTS4xMTRdCiAqLwpNTVJFU1VMVCBXSU5BUEkgbW1pb0Nsb3NlKEhNTUlPIGhtbWlvLCBVSU5UIHVGbGFncykKewogICAgTFBXSU5FX01NSU8Jd207CiAgICBNTVJFU1VMVCAJcmVzdWx0OwogICAgCiAgICBUUkFDRSgiKCUwNFgsICUwNFgpO1xuIiwgaG1taW8sIHVGbGFncyk7CiAgICAKICAgIGlmICgod20gPSBNTUlPX0dldChOVUxMLCBobW1pbykpID09IE5VTEwpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAgICAKICAgIGlmICgocmVzdWx0ID0gTU1JT19GbHVzaCh3bSwgTU1JT19FTVBUWUJVRikpICE9IDApCglyZXR1cm4gcmVzdWx0OwogICAgCiAgICByZXN1bHQgPSBNTUlPX1NlbmRNZXNzYWdlKHdtLCBNTUlPTV9DTE9TRSwgdUZsYWdzLCAwLCBNTUlPX1BST0NfMzJBKTsKICAgIAogICAgbW1pb1NldEJ1ZmZlcihobW1pbywgTlVMTCwgMCwgMCk7CiAgICAKICAgIHdtLT5pb1Byb2MtPmNvdW50LS07CgogICAgaWYgKHdtLT5iVG1wSU9Qcm9jKQoJTU1JT19JbnN0YWxsSU9Qcm9jKHdtLT5pbmZvLmZjY0lPUHJvYywgTlVMTCwgCgkJCSAgIE1NSU9fUkVNT1ZFUFJPQywgd20tPmlvUHJvYy0+dHlwZSk7CgogICAgTU1JT19EZXN0cm95KHdtKTsKCiAgICByZXR1cm4gcmVzdWx0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9DbG9zZSAgICAgIAkJW01NU1lTVEVNLjEyMTFdCiAqLwpNTVJFU1VMVDE2IFdJTkFQSSBtbWlvQ2xvc2UxNihITU1JTzE2IGhtbWlvLCBVSU5UMTYgdUZsYWdzKQp7CiAgICByZXR1cm4gbW1pb0Nsb3NlKGhtbWlvLCB1RmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9SZWFkCSAgICAgICAJW1dJTk1NLjEyNF0KICovCkxPTkcgV0lOQVBJIG1taW9SZWFkKEhNTUlPIGhtbWlvLCBIUFNUUiBwY2gsIExPTkcgY2NoKQp7CiAgICBMUFdJTkVfTU1JTwl3bTsKICAgIExPTkcgCWNvdW50OwogICAgCiAgICBUUkFDRSgiKCUwNFgsICVwLCAlbGQpO1xuIiwgaG1taW8sIHBjaCwgY2NoKTsKICAgIAogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiAtMTsKCiAgICAvKiB1bmJ1ZmZlcmVkIGNhc2UgZmlyc3QgKi8KICAgIGlmICghd20tPmluZm8ucGNoQnVmZmVyKQoJcmV0dXJuIE1NSU9fU2VuZE1lc3NhZ2Uod20sIE1NSU9NX1JFQUQsIChMUEFSQU0pcGNoLCBjY2gsIE1NSU9fUFJPQ18zMkEpOwoKICAgIC8qIGZpcnN0IHRyeSBmcm9tIGN1cnJlbnQgYnVmZmVyICovCiAgICBpZiAod20tPmluZm8ucGNoTmV4dCAhPSB3bS0+aW5mby5wY2hFbmRSZWFkKSB7Cgljb3VudCA9IHdtLT5pbmZvLnBjaEVuZFJlYWQgLSB3bS0+aW5mby5wY2hOZXh0OwoJaWYgKGNvdW50ID4gY2NoIHx8IGNvdW50IDwgMCkgY291bnQgPSBjY2g7CgltZW1jcHkocGNoLCB3bS0+aW5mby5wY2hOZXh0LCBjb3VudCk7Cgl3bS0+aW5mby5wY2hOZXh0ICs9IGNvdW50OwoJcGNoICs9IGNvdW50OwoJY2NoIC09IGNvdW50OwogICAgfSBlbHNlCgljb3VudCA9IDA7CiAgICAKICAgIGlmIChjY2ggJiYgKHdtLT5pbmZvLmZjY0lPUHJvYyAhPSBGT1VSQ0NfTUVNKSkgewoJYXNzZXJ0KHdtLT5pbmZvLmNjaEJ1ZmZlcik7CgoJd2hpbGUgKGNjaCkgewoJICAgIExPTkcgc2l6ZTsKCgkgICAgc2l6ZSA9IE1NSU9fR3JhYk5leHRCdWZmZXIod20sIFRSVUUpOwoJICAgIGlmIChzaXplIDw9IDApIGJyZWFrOwoJICAgIGlmIChzaXplID4gY2NoKSBzaXplID0gY2NoOwoJICAgIG1lbWNweShwY2gsIHdtLT5pbmZvLnBjaEJ1ZmZlciwgc2l6ZSk7CgkgICAgd20tPmluZm8ucGNoTmV4dCArPSBzaXplOwoJICAgIHBjaCArPSBzaXplOwoJICAgIGNjaCAtPSBzaXplOwoJICAgIGNvdW50ICs9IHNpemU7Cgl9CiAgICB9CiAgICAKICAgIFRSQUNFKCJjb3VudD0lbGRcbiIsIGNvdW50KTsKICAgIHJldHVybiBjb3VudDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvUmVhZAkgICAgICAgCVtNTVNZU1RFTS4xMjEyXQogKi8KTE9ORyBXSU5BUEkgbW1pb1JlYWQxNihITU1JTzE2IGhtbWlvLCBIUFNUUiBwY2gsIExPTkcgY2NoKQp7CiAgICByZXR1cm4gbW1pb1JlYWQoaG1taW8sIHBjaCwgY2NoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvV3JpdGUgICAgICAJCVtXSU5NTS4xMzNdCiAqLwpMT05HIFdJTkFQSSBtbWlvV3JpdGUoSE1NSU8gaG1taW8sIEhQQ1NUUiBwY2gsIExPTkcgY2NoKQp7CiAgICBMUFdJTkVfTU1JTwl3bTsKICAgIExPTkcgY291bnQsYnl0ZXNXPTA7CgogICAgVFJBQ0UoIiglMDRYLCAlcCwgJWxkKTtcbiIsIGhtbWlvLCBwY2gsIGNjaCk7CgogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiAtMTsKICAgIAogICAgaWYgKHdtLT5pbmZvLmNjaEJ1ZmZlcikgewoJY291bnQgPSAwOwoJd2hpbGUgKGNjaCkgewoJICAgIGlmICh3bS0+aW5mby5wY2hOZXh0ICE9IHdtLT5pbmZvLnBjaEVuZFdyaXRlKSB7CgkJY291bnQgPSB3bS0+aW5mby5wY2hFbmRXcml0ZSAtIHdtLT5pbmZvLnBjaE5leHQ7CgkJaWYgKGNvdW50ID4gY2NoIHx8IGNvdW50IDwgMCkgY291bnQgPSBjY2g7CgkJbWVtY3B5KHdtLT5pbmZvLnBjaE5leHQsIHBjaCwgY291bnQpOwoJCXdtLT5pbmZvLnBjaE5leHQgKz0gY291bnQ7CgkJcGNoICs9IGNvdW50OwogICAgICAgICAgICAgICAgY2NoIC09IGNvdW50OwogICAgICAgICAgICAgICAgYnl0ZXNXKz1jb3VudDsgICAgICAgICAgICAgICAgCgkJd20tPmluZm8uZHdGbGFncyB8PSBNTUlPX0RJUlRZOwoJICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CgkJaWYgKHdtLT5pbmZvLmZjY0lPUHJvYyA9PSBGT1VSQ0NfTUVNKSB7CgkJICAgIGlmICh3bS0+aW5mby5hZHdJbmZvWzBdKSB7CgkJCS8qIGZyb20gd2hlcmUgd291bGQgd2UgZ2V0IHRoZSBtZW1vcnkgaGFuZGxlPyAqLwogICAgICAgICAgICAgICAgICAgICAgICBGSVhNRSgibWVtb3J5IGZpbGUgZXhwYW5zaW9uIG5vdCBpbXBsZW1lbnRlZCFcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCQkgICAgfSBlbHNlIGJyZWFrOwoJCX0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHdtLT5pbmZvLnBjaE5leHQgPT0gd20tPmluZm8ucGNoRW5kV3JpdGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE1NSU9fRmx1c2god20sIE1NSU9fRU1QVFlCVUYpOwogICAgICAgICAgICAgICAgTU1JT19HcmFiTmV4dEJ1ZmZlcih3bSwgRkFMU0UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgYnJlYWs7Cgl9CiAgICB9IGVsc2UgewoJYnl0ZXNXID0gTU1JT19TZW5kTWVzc2FnZSh3bSwgTU1JT01fV1JJVEUsIChMUEFSQU0pcGNoLCBjY2gsIE1NSU9fUFJPQ18zMkEpOwoJd20tPmluZm8ubEJ1Zk9mZnNldCA9IHdtLT5pbmZvLmxEaXNrT2Zmc2V0OwogICAgfQogICAgCiAgICBUUkFDRSgiYnl0ZXMgd3JpdHRlbj0lbGRcbiIsIGJ5dGVzVyk7CiAgICByZXR1cm4gYnl0ZXNXOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9Xcml0ZSAgICAgIAkJW01NU1lTVEVNLjEyMTNdCiAqLwpMT05HIFdJTkFQSSBtbWlvV3JpdGUxNihITU1JTzE2IGhtbWlvLCBIUENTVFIgcGNoLCBMT05HIGNjaCkKewogICAgcmV0dXJuIG1taW9Xcml0ZShobW1pbyxwY2gsY2NoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvU2VlayAgICAgICAJCVtNTVNZU1RFTS4xMjE0XQogKi8KTE9ORyBXSU5BUEkgbW1pb1NlZWsoSE1NSU8gaG1taW8sIExPTkcgbE9mZnNldCwgSU5UIGlPcmlnaW4pCnsKICAgIExQV0lORV9NTUlPCXdtOwogICAgTE9ORyAJb2Zmc2V0OwoKICAgIFRSQUNFKCIoJTA0WCwgJTA4bFgsICVkKTtcbiIsIGhtbWlvLCBsT2Zmc2V0LCBpT3JpZ2luKTsKICAgIAogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKCiAgICAvKiBub3QgYnVmZmVyZWQsIGRpcmVjdCBzZWVrIG9uIGZpbGUgKi8KICAgIGlmICghd20tPmluZm8ucGNoQnVmZmVyKQoJcmV0dXJuIE1NSU9fU2VuZE1lc3NhZ2Uod20sIE1NSU9NX1NFRUssIGxPZmZzZXQsIGlPcmlnaW4sIE1NSU9fUFJPQ18zMkEpOwoKICAgIHN3aXRjaCAoaU9yaWdpbikgewogICAgY2FzZSBTRUVLX1NFVDogCglvZmZzZXQgPSBsT2Zmc2V0OwoJYnJlYWs7CiAgICBjYXNlIFNFRUtfQ1VSOiAKCW9mZnNldCA9IHdtLT5pbmZvLmxCdWZPZmZzZXQgKyAod20tPmluZm8ucGNoTmV4dCAtIHdtLT5pbmZvLnBjaEJ1ZmZlcikgKyBsT2Zmc2V0OwoJYnJlYWs7CiAgICBjYXNlIFNFRUtfRU5EOiAKCWlmICh3bS0+aW5mby5mY2NJT1Byb2MgPT0gRk9VUkNDX01FTSkgewoJICAgIG9mZnNldCA9IHdtLT5pbmZvLmNjaEJ1ZmZlcjsKCX0gZWxzZSB7CgkgICAgYXNzZXJ0KE1NSU9fU2VuZE1lc3NhZ2Uod20sIE1NSU9NX1NFRUssIDAsIFNFRUtfQ1VSLCBNTUlPX1BST0NfMzJBKSA9PSB3bS0+aW5mby5sRGlza09mZnNldCk7CgkgICAgb2Zmc2V0ID0gTU1JT19TZW5kTWVzc2FnZSh3bSwgTU1JT01fU0VFSywgMCwgU0VFS19FTkQsIE1NSU9fUFJPQ18zMkEpOwoJICAgIE1NSU9fU2VuZE1lc3NhZ2Uod20sIE1NSU9NX1NFRUssIHdtLT5pbmZvLmxEaXNrT2Zmc2V0LCBTRUVLX1NFVCwgTU1JT19QUk9DXzMyQSk7Cgl9CglvZmZzZXQgLT0gbE9mZnNldDsKCWJyZWFrOwogICAgZGVmYXVsdDoKCXJldHVybiAtMTsKICAgIH0KCiAgICAvKiBzdGF5IGluIHNhbWUgYnVmZmVyID8gKi8KICAgIC8qIHNvbWUgbWVtb3J5IG1hcHBlZCBidWZmZXJzIGFyZSBkZWZpbmVkIHdpdGggLTEgYXMgYSBzaXplICovCiAgICBpZiAoKHdtLT5pbmZvLmNjaEJ1ZmZlciA+IDApICYmCgkoKG9mZnNldCA8IHdtLT5pbmZvLmxCdWZPZmZzZXQpIHx8CgkgKG9mZnNldCA+PSB3bS0+aW5mby5sQnVmT2Zmc2V0ICsgd20tPmluZm8uY2NoQnVmZmVyKSB8fAoJICF3bS0+YkJ1ZmZlckxvYWRlZCkpIHsKCgkvKiBjb25kaXRpb24gdG8gY2hhbmdlIGJ1ZmZlciAqLwoJaWYgKCh3bS0+aW5mby5mY2NJT1Byb2MgPT0gRk9VUkNDX01FTSkgfHwgCgkgICAgTU1JT19GbHVzaCh3bSwgTU1JT19FTVBUWUJVRikgfHwKCSAgICAvKiB0aGlzIGFsc28gc2V0cyB0aGUgd20tPmluZm8ubERpc2tPZmZzZXQgZmllbGQgKi8KCSAgICBNTUlPX1NlbmRNZXNzYWdlKHdtLCBNTUlPTV9TRUVLLCAKCQkJICAgICAob2Zmc2V0IC8gd20tPmluZm8uY2NoQnVmZmVyKSAqIHdtLT5pbmZvLmNjaEJ1ZmZlciwKCQkJICAgICBTRUVLX1NFVCwgTU1JT19QUk9DXzMyQSkgPT0gLTEpCgkgICAgcmV0dXJuIC0xOwoJTU1JT19HcmFiTmV4dEJ1ZmZlcih3bSwgVFJVRSk7CiAgICB9CgogICAgd20tPmluZm8ucGNoTmV4dCA9IHdtLT5pbmZvLnBjaEJ1ZmZlciArIChvZmZzZXQgLSB3bS0+aW5mby5sQnVmT2Zmc2V0KTsKCiAgICBUUkFDRSgiPT4gJWxkXG4iLCBvZmZzZXQpOwogICAgcmV0dXJuIG9mZnNldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvU2VlayAgICAgICAJCVtNTVNZU1RFTS4xMjE0XQogKi8KTE9ORyBXSU5BUEkgbW1pb1NlZWsxNihITU1JTzE2IGhtbWlvLCBMT05HIGxPZmZzZXQsIElOVDE2IGlPcmlnaW4pCnsKICAgIHJldHVybiBtbWlvU2VlayhobW1pbywgbE9mZnNldCwgaU9yaWdpbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0dldEluZm8JICAgICAgIAlbTU1TWVNURU0uMTIxNV0KICovClVJTlQxNiBXSU5BUEkgbW1pb0dldEluZm8xNihITU1JTzE2IGhtbWlvLCBNTUlPSU5GTzE2KiBscG1taW9pbmZvLCBVSU5UMTYgdUZsYWdzKQp7CiAgICBMUFdJTkVfTU1JTwl3bTsKCiAgICBUUkFDRSgibW1pb0dldEluZm9cbiIpOwoKICAgIGlmICgod20gPSBNTUlPX0dldChOVUxMLCBobW1pbykpID09IE5VTEwpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CgogICAgaWYgKCF3bS0+YnVmZmVyMTYpCglyZXR1cm4gTU1TWVNFUlJfRVJST1I7CgogICAgbHBtbWlvaW5mby0+ZHdGbGFncyAgICAgPSB3bS0+aW5mby5kd0ZsYWdzOyAKICAgIGxwbW1pb2luZm8tPmZjY0lPUHJvYyAgID0gd20tPmluZm8uZmNjSU9Qcm9jOyAKICAgIGxwbW1pb2luZm8tPnBJT1Byb2MgICAgID0gKExQTU1JT1BST0MxNil3bS0+aW5mby5wSU9Qcm9jOyAKICAgIGxwbW1pb2luZm8tPndFcnJvclJldCAgID0gd20tPmluZm8ud0Vycm9yUmV0OyAKICAgIGxwbW1pb2luZm8tPmhUYXNrICAgICAgID0gd20tPmluZm8uaFRhc2s7IAogICAgbHBtbWlvaW5mby0+Y2NoQnVmZmVyICAgPSB3bS0+aW5mby5jY2hCdWZmZXI7IAogICAgbHBtbWlvaW5mby0+cGNoQnVmZmVyICAgPSAodm9pZCopd20tPmJ1ZmZlcjE2OwogICAgbHBtbWlvaW5mby0+cGNoTmV4dCAgICAgPSAodm9pZCopKHdtLT5idWZmZXIxNiArICh3bS0+aW5mby5wY2hOZXh0IC0gd20tPmluZm8ucGNoQnVmZmVyKSk7CiAgICBscG1taW9pbmZvLT5wY2hFbmRSZWFkICA9ICh2b2lkKikod20tPmJ1ZmZlcjE2ICsgKHdtLT5pbmZvLnBjaEVuZFJlYWQgLSB3bS0+aW5mby5wY2hCdWZmZXIpKTsKICAgIGxwbW1pb2luZm8tPnBjaEVuZFdyaXRlID0gKHZvaWQqKSh3bS0+YnVmZmVyMTYgKyAod20tPmluZm8ucGNoRW5kV3JpdGUgLSB3bS0+aW5mby5wY2hCdWZmZXIpKTsgCiAgICBscG1taW9pbmZvLT5sQnVmT2Zmc2V0ICA9IHdtLT5pbmZvLmxCdWZPZmZzZXQ7IAogICAgbHBtbWlvaW5mby0+bERpc2tPZmZzZXQgPSB3bS0+aW5mby5sRGlza09mZnNldDsgCiAgICBscG1taW9pbmZvLT5hZHdJbmZvWzBdICA9IHdtLT5pbmZvLmFkd0luZm9bMF07IAogICAgbHBtbWlvaW5mby0+YWR3SW5mb1sxXSAgPSB3bS0+aW5mby5hZHdJbmZvWzFdOyAKICAgIGxwbW1pb2luZm8tPmFkd0luZm9bMl0gID0gd20tPmluZm8uYWR3SW5mb1syXTsgCiAgICBscG1taW9pbmZvLT5hZHdJbmZvWzNdICA9IHdtLT5pbmZvLmFkd0luZm9bM107IAogICAgbHBtbWlvaW5mby0+ZHdSZXNlcnZlZDEgPSAwOwogICAgbHBtbWlvaW5mby0+ZHdSZXNlcnZlZDIgPSAwOwogICAgbHBtbWlvaW5mby0+aG1taW8gPSB3bS0+aW5mby5obW1pbzsgCgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0dldEluZm8JICAgICAgIAlbV0lOTU0uMTE4XQogKi8KVUlOVCBXSU5BUEkgbW1pb0dldEluZm8oSE1NSU8gaG1taW8sIE1NSU9JTkZPKiBscG1taW9pbmZvLCBVSU5UIHVGbGFncykKewogICAgTFBXSU5FX01NSU8JCXdtOwogICAgCiAgICBUUkFDRSgiKDB4JTA0eCwlcCwweCUwOHgpXG4iLGhtbWlvLGxwbW1pb2luZm8sdUZsYWdzKTsKCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwoKICAgIG1lbWNweShscG1taW9pbmZvLCAmd20tPmluZm8sIHNpemVvZihNTUlPSU5GTykpOwoKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9TZXRJbmZvMTYgIAkJW01NU1lTVEVNLjEyMTZdCiAqLwpVSU5UMTYgV0lOQVBJIG1taW9TZXRJbmZvMTYoSE1NSU8xNiBobW1pbywgY29uc3QgTU1JT0lORk8xNiogbHBtbWlvaW5mbywgVUlOVDE2IHVGbGFncykKewogICAgTFBXSU5FX01NSU8JCXdtOwoKICAgIFRSQUNFKCJtbWlvU2V0SW5mb1xuIik7CgogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKCiAgICAvKiBjaGVjayBpZiBzZWcgYW5kIGxpbiBidWZmZXJzIGFyZSB0aGUgc2FtZSAqLwogICAgaWYgKHdtLT5pbmZvLmNjaEJ1ZmZlciAhPSBscG1taW9pbmZvLT5jY2hCdWZmZXIgfHwKCXdtLT5pbmZvLnBjaEJ1ZmZlciAhPSBQVFJfU0VHX1RPX0xJTigodm9pZCopd20tPmJ1ZmZlcjE2KSkKCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwoJCiAgICAvKiBjaGVjayBwb2ludGVycyBjb2hlcmVuY2UgKi8KICAgIGlmIChscG1taW9pbmZvLT5wY2hOZXh0IDwgbHBtbWlvaW5mby0+cGNoQnVmZmVyIHx8IAoJbHBtbWlvaW5mby0+cGNoTmV4dCA+IGxwbW1pb2luZm8tPnBjaEJ1ZmZlciArIGxwbW1pb2luZm8tPmNjaEJ1ZmZlciB8fAoJbHBtbWlvaW5mby0+cGNoRW5kUmVhZCA8IGxwbW1pb2luZm8tPnBjaEJ1ZmZlciB8fCAKCWxwbW1pb2luZm8tPnBjaEVuZFJlYWQgPiBscG1taW9pbmZvLT5wY2hCdWZmZXIgKyBscG1taW9pbmZvLT5jY2hCdWZmZXIgfHwKCWxwbW1pb2luZm8tPnBjaEVuZFdyaXRlIDwgbHBtbWlvaW5mby0+cGNoQnVmZmVyIHx8IAoJbHBtbWlvaW5mby0+cGNoRW5kV3JpdGUgPiBscG1taW9pbmZvLT5wY2hCdWZmZXIgKyBscG1taW9pbmZvLT5jY2hCdWZmZXIpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKCiAgICB3bS0+aW5mby5wY2hOZXh0ICAgICA9IHdtLT5pbmZvLnBjaEJ1ZmZlciArIChscG1taW9pbmZvLT5wY2hOZXh0ICAgICAtIGxwbW1pb2luZm8tPnBjaEJ1ZmZlcik7CiAgICB3bS0+aW5mby5wY2hFbmRSZWFkICA9IHdtLT5pbmZvLnBjaEJ1ZmZlciArIChscG1taW9pbmZvLT5wY2hFbmRSZWFkICAtIGxwbW1pb2luZm8tPnBjaEJ1ZmZlcik7CiAgICB3bS0+aW5mby5wY2hFbmRXcml0ZSA9IHdtLT5pbmZvLnBjaEJ1ZmZlciArIChscG1taW9pbmZvLT5wY2hFbmRXcml0ZSAtIGxwbW1pb2luZm8tPnBjaEJ1ZmZlcik7CgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1NldEluZm8gICAgCQlbV0lOTU0uMTMwXQogKi8KVUlOVCBXSU5BUEkgbW1pb1NldEluZm8oSE1NSU8gaG1taW8sIGNvbnN0IE1NSU9JTkZPKiBscG1taW9pbmZvLCBVSU5UIHVGbGFncykKewogICAgTFBXSU5FX01NSU8JCXdtOwoKICAgIFRSQUNFKCJtbWlvU2V0SW5mb1xuIik7CgogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKICAgIAogICAgLyogY2hlY2sgcG9pbnRlcnMgY29oZXJlbmNlICovCiAgICBpZiAobHBtbWlvaW5mby0+cGNoTmV4dCA8IHdtLT5pbmZvLnBjaEJ1ZmZlciB8fCAKCWxwbW1pb2luZm8tPnBjaE5leHQgPiB3bS0+aW5mby5wY2hCdWZmZXIgKyB3bS0+aW5mby5jY2hCdWZmZXIgfHwKCWxwbW1pb2luZm8tPnBjaEVuZFJlYWQgPCB3bS0+aW5mby5wY2hCdWZmZXIgfHwgCglscG1taW9pbmZvLT5wY2hFbmRSZWFkID4gd20tPmluZm8ucGNoQnVmZmVyICsgd20tPmluZm8uY2NoQnVmZmVyIHx8CglscG1taW9pbmZvLT5wY2hFbmRXcml0ZSA8IHdtLT5pbmZvLnBjaEJ1ZmZlciB8fCAKCWxwbW1pb2luZm8tPnBjaEVuZFdyaXRlID4gd20tPmluZm8ucGNoQnVmZmVyICsgd20tPmluZm8uY2NoQnVmZmVyKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CgogICAgd20tPmluZm8ucGNoTmV4dCA9IGxwbW1pb2luZm8tPnBjaE5leHQ7CiAgICB3bS0+aW5mby5wY2hFbmRSZWFkID0gbHBtbWlvaW5mby0+cGNoRW5kUmVhZDsKCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogCQkJCW1taW9TZXRCdWZmZXIJCVtXSU5NTS4xMjldCiovClVJTlQgV0lOQVBJIG1taW9TZXRCdWZmZXIoSE1NSU8gaG1taW8sIExQU1RSIHBjaEJ1ZmZlciwgTE9ORyBjY2hCdWZmZXIsIFVJTlQgdUZsYWdzKQp7CiAgICBMUFdJTkVfTU1JTwkJd207CgogICAgVFJBQ0UoIihobW1pbz0lMDR4LCBwY2hCdWY9JXAsIGNjaEJ1Zj0lbGQsIHVGbGFncz0lIzA4eClcbiIsCgkgIGhtbWlvLCBwY2hCdWZmZXIsIGNjaEJ1ZmZlciwgdUZsYWdzKTsKICAgIAogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKCiAgICByZXR1cm4gTU1JT19TZXRCdWZmZXIod20sIHBjaEJ1ZmZlciwgY2NoQnVmZmVyLCB1RmxhZ3MsIFRSVUUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9TZXRCdWZmZXIJCVtNTVNZU1RFTS4xMjE3XQogKi8KVUlOVDE2IFdJTkFQSSBtbWlvU2V0QnVmZmVyMTYoSE1NSU8xNiBobW1pbywgTFBTVFIgc2VncGNoQnVmZmVyLCAKCQkJICAgICAgTE9ORyBjY2hCdWZmZXIsIFVJTlQxNiB1RmxhZ3MpCnsKICAgIExQV0lORV9NTUlPCQl3bTsKCiAgICBUUkFDRSgiKGhtbWlvPSUwNHgsIHNlZ3BjaEJ1Zj0lcCwgY2NoQnVmPSVsZCwgdUZsYWdzPSUjMDh4KVxuIiwKCSAgaG1taW8sIHNlZ3BjaEJ1ZmZlciwgY2NoQnVmZmVyLCB1RmxhZ3MpOwogICAgCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwoKICAgIHJldHVybiBNTUlPX1NldEJ1ZmZlcih3bSwgc2VncGNoQnVmZmVyLCBjY2hCdWZmZXIsIHVGbGFncywgRkFMU0UpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9GbHVzaCAgICAgIAkJW1dJTk1NLjExN10KICovClVJTlQgV0lOQVBJIG1taW9GbHVzaChITU1JTyBobW1pbywgVUlOVCB1RmxhZ3MpCnsKICAgIExQV0lORV9NTUlPCQl3bTsKCiAgICBUUkFDRSgiKCUwNFgsICUwNFgpXG4iLCBobW1pbywgdUZsYWdzKTsKCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogICAgICAgCiAgICByZXR1cm4gTU1JT19GbHVzaCh3bSwgdUZsYWdzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvRmx1c2ggICAgICAJCVtNTVNZU1RFTS4xMjE4XQogKi8KVUlOVDE2IFdJTkFQSSBtbWlvRmx1c2gxNihITU1JTzE2IGhtbWlvLCBVSU5UMTYgdUZsYWdzKQp7CiAgICByZXR1cm4gbW1pb0ZsdXNoKGhtbWlvLCB1RmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9BZHZhbmNlICAgIAkJW01NU1lTVEVNLjEyMTldCiAqLwpVSU5UIFdJTkFQSSBtbWlvQWR2YW5jZShITU1JTyBobW1pbywgTU1JT0lORk8qIGxwbW1pb2luZm8sIFVJTlQgdUZsYWdzKQp7CiAgICBMUFdJTkVfTU1JTwkJd207CiAgICAKICAgIFRSQUNFKCJobW1pbz0lMDRYLCBscG1taW9pbmZvPSVwLCB1RmxhZ3M9JTA0WFxuIiwgaG1taW8sIGxwbW1pb2luZm8sIHVGbGFncyk7CgogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKCiAgICBpZiAoIXdtLT5pbmZvLmNjaEJ1ZmZlcikKCXJldHVybiBNTUlPRVJSX1VOQlVGRkVSRUQ7CgogICAgaWYgKHVGbGFncyAhPSBNTUlPX1JFQUQgJiYgdUZsYWdzICE9IE1NSU9fV1JJVEUpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKCiAgICBpZiAoTU1JT19GbHVzaCh3bSwgTU1JT19FTVBUWUJVRikpCglyZXR1cm4gTU1JT0VSUl9DQU5OT1RXUklURTsKCiAgICBNTUlPX0dyYWJOZXh0QnVmZmVyKHdtLCB1RmxhZ3MgPT0gTU1JT19SRUFEKTsKCiAgICBscG1taW9pbmZvLT5wY2hOZXh0ID0gbHBtbWlvaW5mby0+cGNoQnVmZmVyOwogICAgbHBtbWlvaW5mby0+cGNoRW5kUmVhZCAgPSBscG1taW9pbmZvLT5wY2hCdWZmZXIgKyAKCSh3bS0+aW5mby5wY2hFbmRSZWFkIC0gd20tPmluZm8ucGNoQnVmZmVyKTsKICAgIGxwbW1pb2luZm8tPnBjaEVuZFdyaXRlID0gbHBtbWlvaW5mby0+cGNoQnVmZmVyICsgCgkod20tPmluZm8ucGNoRW5kV3JpdGUgLSB3bS0+aW5mby5wY2hCdWZmZXIpOwogICAgbHBtbWlvaW5mby0+bERpc2tPZmZzZXQgPSB3bS0+aW5mby5sRGlza09mZnNldDsKICAgIGxwbW1pb2luZm8tPmxCdWZPZmZzZXQgPSB3bS0+aW5mby5sQnVmT2Zmc2V0OwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0FkdmFuY2UgICAgCQlbTU1TWVNURU0uMTIxOV0KICovClVJTlQxNiBXSU5BUEkgbW1pb0FkdmFuY2UxNihITU1JTzE2IGhtbWlvLCBNTUlPSU5GTzE2KiBscG1taW9pbmZvLCBVSU5UMTYgdUZsYWdzKQp7CiAgICBMUFdJTkVfTU1JTwkJd207CgogICAgVFJBQ0UoIm1taW9BZHZhbmNlXG4iKTsKCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwoKICAgIGlmICghd20tPmluZm8uY2NoQnVmZmVyKQoJcmV0dXJuIE1NSU9FUlJfVU5CVUZGRVJFRDsKCiAgICBpZiAodUZsYWdzICE9IE1NSU9fUkVBRCAmJiB1RmxhZ3MgIT0gTU1JT19XUklURSkKCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwoKICAgIGlmIChNTUlPX0ZsdXNoKHdtLCBNTUlPX0VNUFRZQlVGKSkKCXJldHVybiBNTUlPRVJSX0NBTk5PVFdSSVRFOwoKICAgIE1NSU9fR3JhYk5leHRCdWZmZXIod20sIHVGbGFncyA9PSBNTUlPX1JFQUQpOwoJCiAgICBscG1taW9pbmZvLT5wY2hOZXh0ID0gbHBtbWlvaW5mby0+cGNoQnVmZmVyOwogICAgbHBtbWlvaW5mby0+cGNoRW5kUmVhZCAgPSBscG1taW9pbmZvLT5wY2hCdWZmZXIgKyAKCSh3bS0+aW5mby5wY2hFbmRSZWFkIC0gd20tPmluZm8ucGNoQnVmZmVyKTsKICAgIGxwbW1pb2luZm8tPnBjaEVuZFdyaXRlID0gbHBtbWlvaW5mby0+cGNoQnVmZmVyICsgCgkod20tPmluZm8ucGNoRW5kV3JpdGUgLSB3bS0+aW5mby5wY2hCdWZmZXIpOwogICAgbHBtbWlvaW5mby0+bERpc2tPZmZzZXQgPSB3bS0+aW5mby5sRGlza09mZnNldDsKICAgIGxwbW1pb2luZm8tPmxCdWZPZmZzZXQgPSB3bS0+aW5mby5sQnVmT2Zmc2V0OwoKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9TdHJpbmdUb0ZPVVJDQ0EJW1dJTk1NLjEzMV0KICovCkZPVVJDQyBXSU5BUEkgbW1pb1N0cmluZ1RvRk9VUkNDQShMUENTVFIgc3osIFVJTlQgdUZsYWdzKQp7CiAgICBDSEFSIGNjWzRdOwogICAgaW50IGkgPSAwOwogICAgCiAgICBmb3IgKGkgPSAwOyBpIDwgNCAmJiBzeltpXTsgaSsrKSB7CglpZiAodUZsYWdzICYgTU1JT19UT1VQUEVSKSB7CgkgICAgY2NbaV0gPSB0b3VwcGVyKHN6W2ldKTsKCX0gZWxzZSB7CgkgICAgY2NbaV0gPSBzeltpXTsKCX0KICAgIH0KICAgIAogICAgLyogUGFkIHdpdGggc3BhY2VzICovCiAgICB3aGlsZSAoaSA8IDQpIHsKCWNjW2ldID0gJyAnOwoJaSsrOwogICAgfQogICAgCiAgICBUUkFDRSgiR290ICVjJWMlYyVjXG4iLGNjWzBdLGNjWzFdLGNjWzJdLGNjWzNdKTsKICAgIHJldHVybiBtbWlvRk9VUkNDKGNjWzBdLGNjWzFdLGNjWzJdLGNjWzNdKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvU3RyaW5nVG9GT1VSQ0NXCVtXSU5NTS4xMzJdCiAqLwpGT1VSQ0MgV0lOQVBJIG1taW9TdHJpbmdUb0ZPVVJDQ1coTFBDV1NUUiBzeiwgVUlOVCB1RmxhZ3MpCnsKICAgIExQU1RSCXN6QSA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsc3opOwogICAgRk9VUkNDCXJldCA9IG1taW9TdHJpbmdUb0ZPVVJDQ0Eoc3pBLHVGbGFncyk7CiAgICAKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxzekEpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvU3RyaW5nVG9GT1VSQ0MJW01NU1lTVEVNLjEyMjBdCiAqLwpGT1VSQ0MgV0lOQVBJIG1taW9TdHJpbmdUb0ZPVVJDQzE2KExQQ1NUUiBzeiwgVUlOVDE2IHVGbGFncykKewogICAgcmV0dXJuIG1taW9TdHJpbmdUb0ZPVVJDQ0Eoc3osIHVGbGFncyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgbW1pb0luc3RhbGxJT1Byb2MxNiAgICBbTU1TWVNURU0uMTIyMV0KICovCkxQTU1JT1BST0MxNiBXSU5BUEkgbW1pb0luc3RhbGxJT1Byb2MxNihGT1VSQ0MgZmNjSU9Qcm9jLCBMUE1NSU9QUk9DMTYgcElPUHJvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpCnsKICAgIHJldHVybiAoTFBNTUlPUFJPQzE2KU1NSU9fSW5zdGFsbElPUHJvYyhmY2NJT1Byb2MsIChMUE1NSU9QUk9DKXBJT1Byb2MsIAoJCQkJCSAgICBkd0ZsYWdzLCBNTUlPX1BST0NfMTYpOyAKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvSW5zdGFsbElPUHJvY0EJICAgW1dJTk1NLjEyMF0KICovCkxQTU1JT1BST0MgV0lOQVBJIG1taW9JbnN0YWxsSU9Qcm9jQShGT1VSQ0MgZmNjSU9Qcm9jLCAKCQkJCSAgICAgTFBNTUlPUFJPQyBwSU9Qcm9jLCBEV09SRCBkd0ZsYWdzKQp7CiAgICByZXR1cm4gTU1JT19JbnN0YWxsSU9Qcm9jKGZjY0lPUHJvYywgcElPUHJvYywgZHdGbGFncywgTU1JT19QUk9DXzMyQSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0luc3RhbGxJT1Byb2NXCSAgIFtXSU5NTS5dCiAqLwpMUE1NSU9QUk9DIFdJTkFQSSBtbWlvSW5zdGFsbElPUHJvY1coRk9VUkNDIGZjY0lPUHJvYywgCgkJCQkgICAgIExQTU1JT1BST0MgcElPUHJvYywgRFdPUkQgZHdGbGFncykKewogICAgcmV0dXJuIE1NSU9fSW5zdGFsbElPUHJvYyhmY2NJT1Byb2MsIHBJT1Byb2MsIGR3RmxhZ3MsIE1NSU9fUFJPQ18zMlcpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9TZW5kTWVzc2FnZTE2CVtNTVNZU1RFTS4xMjIyXQogKi8KTFJFU1VMVCBXSU5BUEkgbW1pb1NlbmRNZXNzYWdlMTYoSE1NSU8xNiBobW1pbywgVUlOVDE2IHVNZXNzYWdlLAoJCQkJIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMikKewogICAgTFBXSU5FX01NSU8JCXdtOwogICAgCiAgICBUUkFDRSgiKCUwNFgsICV1LCAlbGQsICVsZClcbiIsIGhtbWlvLCB1TWVzc2FnZSwgbFBhcmFtMSwgbFBhcmFtMik7CgogICAgaWYgKHVNZXNzYWdlIDwgTU1JT01fVVNFUikKCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogICAgCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogICAgCiAgICByZXR1cm4gTU1JT19TZW5kTWVzc2FnZSh3bSwgdU1lc3NhZ2UsIGxQYXJhbTEsIGxQYXJhbTIsIE1NSU9fUFJPQ18xNik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1NlbmRNZXNzYWdlCQlbV0lOTU0uXQogKi8KTFJFU1VMVCBXSU5BUEkgbW1pb1NlbmRNZXNzYWdlKEhNTUlPIGhtbWlvLCBVSU5UIHVNZXNzYWdlLAoJCQkgICAgICAgTFBBUkFNIGxQYXJhbTEsIExQQVJBTSBsUGFyYW0yKQp7CiAgICBMUFdJTkVfTU1JTwkJd207CiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJXUsICVsZCwgJWxkKVxuIiwgaG1taW8sIHVNZXNzYWdlLCBsUGFyYW0xLCBsUGFyYW0yKTsKCiAgICBpZiAodU1lc3NhZ2UgPCBNTUlPTV9VU0VSKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAgICAKICAgIGlmICgod20gPSBNTUlPX0dldChOVUxMLCBobW1pbykpID09IE5VTEwpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAgICAKICAgIHJldHVybiBNTUlPX1NlbmRNZXNzYWdlKHdtLCB1TWVzc2FnZSwgbFBhcmFtMSwgbFBhcmFtMiwgTU1JT19QUk9DXzMyQSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0Rlc2NlbmQJICAgICAgIAlbTU1TWVNURU0uMTIyM10KICovClVJTlQgV0lOQVBJIG1taW9EZXNjZW5kKEhNTUlPIGhtbWlvLCBMUE1NQ0tJTkZPIGxwY2ssCgkJCWNvbnN0IE1NQ0tJTkZPKiBscGNrUGFyZW50LCBVSU5UIHVGbGFncykKewogICAgRFdPUkQJCWR3T2xkUG9zOwogICAgRk9VUkNDCQlzcmNoQ2tJZDsKICAgIEZPVVJDQwkJc3JjaFR5cGU7CiAgICAKICAgIAogICAgVFJBQ0UoIiglMDRYLCAlcCwgJXAsICUwNFgpO1xuIiwgaG1taW8sIGxwY2ssIGxwY2tQYXJlbnQsIHVGbGFncyk7CiAgICAKICAgIGlmIChscGNrID09IE5VTEwpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKICAgIAogICAgZHdPbGRQb3MgPSBtbWlvU2VlayhobW1pbywgMCwgU0VFS19DVVIpOwogICAgVFJBQ0UoImR3T2xkUG9zPSVsZFxuIiwgZHdPbGRQb3MpOwogICAgCiAgICBpZiAobHBja1BhcmVudCAhPSBOVUxMKSB7CglUUkFDRSgic2VlayBpbnNpZGUgcGFyZW50IGF0ICVsZCAhXG4iLCBscGNrUGFyZW50LT5kd0RhdGFPZmZzZXQpOwoJLyogRVBQOiB3YXMgZHdPbGRQb3MgPSBtbWlvU2VlayhobW1pbyxscGNrUGFyZW50LT5kd0RhdGFPZmZzZXQsU0VFS19TRVQpOyAqLwoJaWYgKGR3T2xkUG9zIDwgbHBja1BhcmVudC0+ZHdEYXRhT2Zmc2V0IHx8IAoJICAgIGR3T2xkUG9zID49IGxwY2tQYXJlbnQtPmR3RGF0YU9mZnNldCArIGxwY2tQYXJlbnQtPmNrc2l6ZSkgewoJICAgIFdBUk4oIm91dHNpZGUgcGFyZW50IGNodW5rXG4iKTsKCSAgICByZXR1cm4gTU1JT0VSUl9DSFVOS05PVEZPVU5EOwoJfQogICAgfQogICAgCiAgICAvKiBUaGUgU0RLIGRvY3Ugc2F5cyAnY2tpZCcgaXMgdXNlZCBmb3IgYWxsIGNhc2VzLiBSZWFsIFdvcmxkCiAgICAgKiBleGFtcGxlcyBkaXNhZ3JlZSAtTWFyY3VzLDk5MDIxNi4gCiAgICAgKi8KICAgIAogICAgc3JjaFR5cGUgPSAwOwogICAgLyogZmluZF9jaHVuayBsb29rcyBmb3IgJ2NraWQnICovCiAgICBpZiAodUZsYWdzICYgTU1JT19GSU5EQ0hVTkspCglzcmNoQ2tJZCA9IGxwY2stPmNraWQ7CiAgICAvKiBmaW5kX3JpZmYgYW5kIGZpbmRfbGlzdCBsb29rIGZvciAnZmNjVHlwZScgKi8KICAgIGlmICh1RmxhZ3MgJiBNTUlPX0ZJTkRMSVNUKSB7CglzcmNoQ2tJZCA9IEZPVVJDQ19MSVNUOwoJc3JjaFR5cGUgPSBscGNrLT5mY2NUeXBlOwogICAgfQogICAgaWYgKHVGbGFncyAmIE1NSU9fRklORFJJRkYpIHsKCXNyY2hDa0lkID0gRk9VUkNDX1JJRkY7CglzcmNoVHlwZSA9IGxwY2stPmZjY1R5cGU7CiAgICB9CiAgICAKICAgIGlmICh1RmxhZ3MgJiAoTU1JT19GSU5EQ0hVTkt8TU1JT19GSU5ETElTVHxNTUlPX0ZJTkRSSUZGKSkgewoJVFJBQ0UoInNlYXJjaGluZyBmb3IgJS40cy4lLjRzXG4iLCAKCSAgICAgIChMUFNUUikmc3JjaENrSWQsCgkgICAgICBzcmNoVHlwZT8oTFBTVFIpJnNyY2hUeXBlOiJhbnkgIik7CgkKCXdoaWxlIChUUlVFKSB7CgkgICAgTE9ORyBpeDsKCSAgICAKCSAgICBpeCA9IG1taW9SZWFkKGhtbWlvLCAoTFBTVFIpbHBjaywgMyAqIHNpemVvZihEV09SRCkpOwoJICAgIGlmIChpeCA8IDIqc2l6ZW9mKERXT1JEKSkgewoJCW1taW9TZWVrKGhtbWlvLCBkd09sZFBvcywgU0VFS19TRVQpOwoJCVdBUk4oInJldHVybiBDaHVua05vdEZvdW5kXG4iKTsKCQlyZXR1cm4gTU1JT0VSUl9DSFVOS05PVEZPVU5EOwoJICAgIH0KCSAgICBscGNrLT5kd0RhdGFPZmZzZXQgPSBkd09sZFBvcyArIDIgKiBzaXplb2YoRFdPUkQpOwoJICAgIGlmIChpeCA8IGxwY2stPmR3RGF0YU9mZnNldCAtIGR3T2xkUG9zKSB7CgkJbW1pb1NlZWsoaG1taW8sIGR3T2xkUG9zLCBTRUVLX1NFVCk7CgkJV0FSTigicmV0dXJuIENodW5rTm90Rm91bmRcbiIpOwoJCXJldHVybiBNTUlPRVJSX0NIVU5LTk9URk9VTkQ7CgkgICAgfQoJICAgIFRSQUNFKCJja2lkPSUuNHMgZmNjPSUuNHMgY2tzaXplPSUwOGxYICFcbiIsCgkJICAoTFBTVFIpJmxwY2stPmNraWQsIAoJCSAgc3JjaFR5cGU/KExQU1RSKSZscGNrLT5mY2NUeXBlOiI8bmE+IiwKCQkgIGxwY2stPmNrc2l6ZSk7CgkgICAgaWYgKChzcmNoQ2tJZCA9PSBscGNrLT5ja2lkKSAmJgoJCSghc3JjaFR5cGUgfHwgKHNyY2hUeXBlID09IGxwY2stPmZjY1R5cGUpKQoJCSkKCQlicmVhazsKCSAgICAKCSAgICBkd09sZFBvcyA9IGxwY2stPmR3RGF0YU9mZnNldCArICgobHBjay0+Y2tzaXplICsgMSkgJiB+MSk7CgkgICAgbW1pb1NlZWsoaG1taW8sIGR3T2xkUG9zLCBTRUVLX1NFVCk7Cgl9CiAgICB9IGVsc2UgewoJLyogRklYTUU6IHVudmVyaWZpZWQsIGRvZXMgaXQgZG8gdGhpcz8gKi8KCS8qIE5COiBUaGlzIHBhcnQgaXMgdXNlZCBieSBXQVZFX21jaU9wZW4sIGFtb25nIG90aGVycyAqLwoJaWYgKG1taW9SZWFkKGhtbWlvLCAoTFBTVFIpbHBjaywgMyAqIHNpemVvZihEV09SRCkpIDwgMyAqIHNpemVvZihEV09SRCkpIHsKCSAgICBtbWlvU2VlayhobW1pbywgZHdPbGRQb3MsIFNFRUtfU0VUKTsKCSAgICBXQVJOKCJyZXR1cm4gQ2h1bmtOb3RGb3VuZCAybmRcbiIpOwoJICAgIHJldHVybiBNTUlPRVJSX0NIVU5LTk9URk9VTkQ7Cgl9CglscGNrLT5kd0RhdGFPZmZzZXQgPSBkd09sZFBvcyArIDIgKiBzaXplb2YoRFdPUkQpOwogICAgfQogICAgbHBjay0+ZHdGbGFncyA9IDA7CiAgICAvKiBJZiB3ZSB3ZXJlIGxvb2tpbmcgZm9yIFJJRkYvTElTVCBjaHVua3MsIHRoZSBmaW5hbCBmaWxlIHBvc2l0aW9uCiAgICAgKiBpcyBhZnRlciB0aGUgY2h1bmtpZC4gSWYgd2Ugd2VyZSBqdXN0IGxvb2tpbmcgZm9yIHRoZSBjaHVuawogICAgICogaXQgaXMgYWZ0ZXIgdGhlIGNrc2l6ZS4gU28gYWRkIDQgaW4gUklGRi9MSVNUIGNhc2UuCiAgICAgKi8KICAgIGlmIChscGNrLT5ja2lkID09IEZPVVJDQ19SSUZGIHx8IGxwY2stPmNraWQgPT0gRk9VUkNDX0xJU1QpCgltbWlvU2VlayhobW1pbywgbHBjay0+ZHdEYXRhT2Zmc2V0ICsgc2l6ZW9mKERXT1JEKSwgU0VFS19TRVQpOwogICAgZWxzZQoJbW1pb1NlZWsoaG1taW8sIGxwY2stPmR3RGF0YU9mZnNldCwgU0VFS19TRVQpOwogICAgVFJBQ0UoImxwY2s6IGNraWQ9JS40cywgY2tzaXplPSVsZCwgZHdEYXRhT2Zmc2V0PSVsZCBmY2NUeXBlPSUwOGxYICglLjRzKSFcbiIsIAoJICAoTFBTVFIpJmxwY2stPmNraWQsIGxwY2stPmNrc2l6ZSwgbHBjay0+ZHdEYXRhT2Zmc2V0LCAKCSAgbHBjay0+ZmNjVHlwZSwgc3JjaFR5cGU/KExQU1RSKSZscGNrLT5mY2NUeXBlOiIiKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9EZXNjZW5kMTYJICAgICAgIAlbTU1TWVNURU0uMTIyM10KICovClVJTlQxNiBXSU5BUEkgbW1pb0Rlc2NlbmQxNihITU1JTzE2IGhtbWlvLCBMUE1NQ0tJTkZPIGxwY2ssCgkJCSAgICBjb25zdCBNTUNLSU5GTyogbHBja1BhcmVudCwgVUlOVDE2IHVGbGFncykKewogICAgcmV0dXJuIG1taW9EZXNjZW5kKGhtbWlvLCBscGNrLCBscGNrUGFyZW50LCB1RmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9Bc2NlbmQgICAgIAkJW1dJTk1NLjExM10KICovClVJTlQgV0lOQVBJIG1taW9Bc2NlbmQoSE1NSU8gaG1taW8sIExQTU1DS0lORk8gbHBjaywgVUlOVCB1RmxhZ3MpCnsKICAgIFRSQUNFKCIoJTA0WCwgJXAsICUwNFgpO1xuIiwgaG1taW8sIGxwY2ssIHVGbGFncyk7CiAgICAKICAgIGlmIChscGNrLT5kd0ZsYWdzICYgTU1JT19ESVJUWSkgewoJRFdPUkQJZHdPbGRQb3MsIGR3TmV3U2l6ZSwgZHdTaXplUG9zOwoJCglUUkFDRSgiY2h1bmsgaXMgbWFya2VkIE1NSU9fRElSVFksIGNvcnJlY3RpbmcgY2h1bmsgc2l6ZVxuIik7Cglkd09sZFBvcyA9IG1taW9TZWVrKGhtbWlvLCAwLCBTRUVLX0NVUik7CglUUkFDRSgiZHdPbGRQb3M9JWxkIGxwY2stPmR3RGF0YU9mZnNldCA9ICVsZFxuIiwgZHdPbGRQb3MsIGxwY2stPmR3RGF0YU9mZnNldCk7Cglkd05ld1NpemUgPSBkd09sZFBvcyAtIGxwY2stPmR3RGF0YU9mZnNldDsKCWlmIChkd05ld1NpemUgIT0gbHBjay0+Y2tzaXplKSB7CgkgICAgVFJBQ0UoImR3TmV3U2l6ZT0lbGRcbiIsIGR3TmV3U2l6ZSk7CgkgICAgbHBjay0+Y2tzaXplID0gZHdOZXdTaXplOwoJICAgIAoJICAgIGR3U2l6ZVBvcyA9IGxwY2stPmR3RGF0YU9mZnNldCAtIHNpemVvZihEV09SRCk7CgkgICAgVFJBQ0UoImR3U2l6ZVBvcz0lbGRcbiIsIGR3U2l6ZVBvcyk7CgkgICAgCgkgICAgbW1pb1NlZWsoaG1taW8sIGR3U2l6ZVBvcywgU0VFS19TRVQpOwoJICAgIG1taW9Xcml0ZShobW1pbywgKExQU1RSKSZkd05ld1NpemUsIHNpemVvZihEV09SRCkpOwoJfQogICAgfQogICAgCiAgICBtbWlvU2VlayhobW1pbywgbHBjay0+ZHdEYXRhT2Zmc2V0ICsgKChscGNrLT5ja3NpemUgKyAxKSAmIH4xKSwgU0VFS19TRVQpOwogICAgCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvQXNjZW5kICAgICAJCVtNTVNZU1RFTS4xMjI0XQogKi8KVUlOVDE2IFdJTkFQSSBtbWlvQXNjZW5kMTYoSE1NSU8xNiBobW1pbywgTU1DS0lORk8qIGxwY2ssIFVJTlQxNiB1RmxhZ3MpCnsKICAgIHJldHVybiBtbWlvQXNjZW5kKGhtbWlvLGxwY2ssdUZsYWdzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvQ3JlYXRlQ2h1bmsJCVtNTVNZU1RFTS4xMjI1XQogKi8KVUlOVDE2IFdJTkFQSSBtbWlvQ3JlYXRlQ2h1bmsxNihITU1JTzE2IGhtbWlvLCBNTUNLSU5GTyogbHBjaywgVUlOVDE2IHVGbGFncykKewogICAgRFdPUkQJZHdPbGRQb3M7CiAgICBMT05HIAlzaXplOwogICAgTE9ORyAJaXg7CiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJXAsICUwNFgpO1xuIiwgaG1taW8sIGxwY2ssIHVGbGFncyk7CiAgICAKICAgIGR3T2xkUG9zID0gbW1pb1NlZWsoaG1taW8sIDAsIFNFRUtfQ1VSKTsKICAgIFRSQUNFKCJkd09sZFBvcz0lbGRcbiIsIGR3T2xkUG9zKTsKICAgIAogICAgaWYgKHVGbGFncyA9PSBNTUlPX0NSRUFURUxJU1QpCglscGNrLT5ja2lkID0gRk9VUkNDX0xJU1Q7CiAgICBlbHNlIGlmICh1RmxhZ3MgPT0gTU1JT19DUkVBVEVSSUZGKQoJbHBjay0+Y2tpZCA9IEZPVVJDQ19SSUZGOwogICAgCiAgICBUUkFDRSgiY2tpZD0lMDhsWFxuIiwgbHBjay0+Y2tpZCk7CiAgICAKICAgIHNpemUgPSAyICogc2l6ZW9mKERXT1JEKTsKICAgIGxwY2stPmR3RGF0YU9mZnNldCA9IGR3T2xkUG9zICsgc2l6ZTsKICAgIAogICAgaWYgKGxwY2stPmNraWQgPT0gRk9VUkNDX1JJRkYgfHwgbHBjay0+Y2tpZCA9PSBGT1VSQ0NfTElTVCkgCglzaXplICs9IHNpemVvZihEV09SRCk7CiAgICBscGNrLT5kd0ZsYWdzID0gTU1JT19ESVJUWTsKICAgIAogICAgaXggPSBtbWlvV3JpdGUoaG1taW8sIChMUFNUUilscGNrLCBzaXplKTsKICAgIFRSQUNFKCJhZnRlciBtbWlvV3JpdGUgaXggPSAlbGQgcmVxID0gJWxkLCBlcnJubyA9ICVkXG4iLGl4LCBzaXplLCBlcnJubyk7CiAgICBpZiAoaXggPCBzaXplKSB7CgltbWlvU2VlayhobW1pbywgZHdPbGRQb3MsIFNFRUtfU0VUKTsKCVdBUk4oInJldHVybiBDYW5ub3RXcml0ZVxuIik7CglyZXR1cm4gTU1JT0VSUl9DQU5OT1RXUklURTsKICAgIH0KICAgIAogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQltbWlvQ3JlYXRlQ2h1bmsJCQkJW1dJTk1NLjExNV0KICovClVJTlQgV0lOQVBJIG1taW9DcmVhdGVDaHVuayhITU1JTyBobW1pbywgTU1DS0lORk8qIGxwY2ssIFVJTlQgdUZsYWdzKQp7CiAgICByZXR1cm4gbW1pb0NyZWF0ZUNodW5rMTYoaG1taW8sIGxwY2ssIHVGbGFncyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1JlbmFtZSAgICAgCQlbTU1TWVNURU0uMTIyNl0KICovClVJTlQxNiBXSU5BUEkgbW1pb1JlbmFtZTE2KExQQ1NUUiBzekZpbGVOYW1lLCBMUENTVFIgc3pOZXdGaWxlTmFtZSwKCQkJICAgTU1JT0lORk8xNiogbHBtbWlvaW5mbywgRFdPUkQgZHdSZW5hbWVGbGFncykKewogICAgVUlOVDE2IAkJcmVzdWx0ID0gTU1TWVNFUlJfRVJST1I7CiAgICBMUE1NSU9QUk9DMTYJaW9Qcm9jOwoKICAgIFRSQUNFKCIoJyVzJywgJyVzJywgJXAsICUwOGxYKTtcbiIsCgkgIHN6RmlsZU5hbWUsIHN6TmV3RmlsZU5hbWUsIGxwbW1pb2luZm8sIGR3UmVuYW1lRmxhZ3MpOwogICAgCiAgICAvKiBJZiBib3RoIHBhcmFtcyBhcmUgTlVMTCwgdGhlbiBwYXJzZSB0aGUgZmlsZSBuYW1lICovCiAgICBpZiAobHBtbWlvaW5mbyAmJiBscG1taW9pbmZvLT5mY2NJT1Byb2MgPT0gMCAmJiBscG1taW9pbmZvLT5wSU9Qcm9jID09IE5VTEwpCglscG1taW9pbmZvLT5mY2NJT1Byb2MgPSBNTUlPX1BhcnNlRXh0KHN6RmlsZU5hbWUpOwoKICAgIC8qIEhhbmRsZSBhbnkgdW5oYW5kbGVkL2Vycm9yIGNhc2UgZnJvbSBhYm92ZS4gQXNzdW1lIERPUyBmaWxlICovCiAgICBpZiAoIWxwbW1pb2luZm8gfHwgKGxwbW1pb2luZm8tPmZjY0lPUHJvYyA9PSAwICYmIGxwbW1pb2luZm8tPnBJT1Byb2MgPT0gTlVMTCkpCglpb1Byb2MgPSAoTFBNTUlPUFJPQzE2KW1taW9Eb3NJT1Byb2M7CiAgICAvKiBpZiBqdXN0IHRoZSBmb3VyIGNoYXJhY3RlciBjb2RlIGlzIHByZXNlbnQsIGxvb2sgdXAgSU8gcHJvYyAqLwogICAgZWxzZSBpZiAobHBtbWlvaW5mby0+cElPUHJvYyA9PSBOVUxMKQoJaW9Qcm9jID0gbW1pb0luc3RhbGxJT1Byb2MxNihscG1taW9pbmZvLT5mY2NJT1Byb2MsIE5VTEwsIE1NSU9fRklORFBST0MpOwogICAgZWxzZQogCWlvUHJvYyA9IGxwbW1pb2luZm8tPnBJT1Byb2M7CgogICAgLyogRklYTUU6IGlvUHJvYyBpcyBsaWtlbHkgYSBzZWdtZW50ZWQgYWRkcmVzcywgdGh1cyBuZWVkaW5nIGEKICAgICAqIHRodW5rIHNvbWV3aGVyZS4gVGhlIG1haW4gaXNzdWUgaXMgdGhhdCBXaW5lJ3MgY3VycmVudCB0aHVua2luZwogICAgICogMzIgdG8gMTYgb25seSBzdXBwb3J0cyBwYXNjYWwgY2FsbGluZyBjb252ZW50aW9uCiAgICAgKi8KICAgIGlmIChpb1Byb2MpIAoJcmVzdWx0ID0gKGlvUHJvYykoMCwgTU1JT01fUkVOQU1FLCAKCQkJICAoTFBBUkFNKXN6RmlsZU5hbWUsIChMUEFSQU0pc3pOZXdGaWxlTmFtZSk7CiAgICAKICAgIHJldHVybiByZXN1bHQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1JlbmFtZUEgICAgCQkJW1dJTk1NLjEyNV0KICovClVJTlQgV0lOQVBJIG1taW9SZW5hbWVBKExQQ1NUUiBzekZpbGVOYW1lLCBMUENTVFIgc3pOZXdGaWxlTmFtZSwKCQkJTU1JT0lORk8qIGxwbW1pb2luZm8sIERXT1JEIGR3UmVuYW1lRmxhZ3MpCnsKICAgIFVJTlQJcmVzdWx0ID0gTU1TWVNFUlJfRVJST1I7CiAgICBMUE1NSU9QUk9DCWlvUHJvYzsKCiAgICBUUkFDRSgiKCclcycsICclcycsICVwLCAlMDhsWCk7XG4iLAoJICBzekZpbGVOYW1lLCBzek5ld0ZpbGVOYW1lLCBscG1taW9pbmZvLCBkd1JlbmFtZUZsYWdzKTsKCiAgICAvKiBJZiBib3RoIHBhcmFtcyBhcmUgTlVMTCwgdGhlbiBwYXJzZSB0aGUgZmlsZSBuYW1lICovCiAgICBpZiAobHBtbWlvaW5mbyAmJiBscG1taW9pbmZvLT5mY2NJT1Byb2MgPT0gMCAmJiBscG1taW9pbmZvLT5wSU9Qcm9jID09IE5VTEwpCglscG1taW9pbmZvLT5mY2NJT1Byb2MgPSBNTUlPX1BhcnNlRXh0KHN6RmlsZU5hbWUpOwoKICAgIC8qIEhhbmRsZSBhbnkgdW5oYW5kbGVkL2Vycm9yIGNhc2UgZnJvbSBhYm92ZS4gQXNzdW1lIERPUyBmaWxlICovCiAgICBpZiAoIWxwbW1pb2luZm8gfHwgKGxwbW1pb2luZm8tPmZjY0lPUHJvYyA9PSAwICYmIGxwbW1pb2luZm8tPnBJT1Byb2MgPT0gTlVMTCkpCglpb1Byb2MgPSAoTFBNTUlPUFJPQyltbWlvRG9zSU9Qcm9jOwogICAgLyogaWYganVzdCB0aGUgZm91ciBjaGFyYWN0ZXIgY29kZSBpcyBwcmVzZW50LCBsb29rIHVwIElPIHByb2MgKi8KICAgIGVsc2UgaWYgKGxwbW1pb2luZm8tPnBJT1Byb2MgPT0gTlVMTCkKCWlvUHJvYyA9IE1NSU9fSW5zdGFsbElPUHJvYyhscG1taW9pbmZvLT5mY2NJT1Byb2MsIE5VTEwsIAoJCQkJICAgIE1NSU9fRklORFBST0MsIE1NSU9fUFJPQ18zMkEpOwogICAgZWxzZSAvKiB1c2UgcmVsZXZhbnQgaW9Qcm9jICovCiAJaW9Qcm9jID0gbHBtbWlvaW5mby0+cElPUHJvYzsKCiAgICBpZiAoaW9Qcm9jKSAKCXJlc3VsdCA9IChpb1Byb2MpKDAsIE1NSU9NX1JFTkFNRSwgCgkJCSAgKExQQVJBTSlzekZpbGVOYW1lLCAoTFBBUkFNKXN6TmV3RmlsZU5hbWUpOwogICAgCiAgICByZXR1cm4gcmVzdWx0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9SZW5hbWVXICAgIAkJCVtXSU5NTS4xMjZdCiAqLwpVSU5UIFdJTkFQSSBtbWlvUmVuYW1lVyhMUENXU1RSIHN6RmlsZU5hbWUsIExQQ1dTVFIgc3pOZXdGaWxlTmFtZSwKCQkJTU1JT0lORk8qIGxwbW1pb2luZm8sIERXT1JEIGR3UmVuYW1lRmxhZ3MpCnsKICAgIExQU1RSCXN6Rm4gPSBIRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3pGaWxlTmFtZSk7CiAgICBMUFNUUglzem5GbiA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzek5ld0ZpbGVOYW1lKTsKICAgIFVJTlQJcmV0ID0gbW1pb1JlbmFtZUEoc3pGbiwgc3puRm4sIGxwbW1pb2luZm8sIGR3UmVuYW1lRmxhZ3MpOwogICAgCiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc3pGbik7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc3puRm4pOwogICAgcmV0dXJuIHJldDsKfQo=