LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCk1hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCgpJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAptb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgClB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcyAKYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuIAoKVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWSAKRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKZGlzY2xhaW1lci4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpbmNsdWRlIDxjb25maWcuaD4KI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8bWFsbG9jLmg+CiNpbmNsdWRlIDxuZXQuaD4KI2luY2x1ZGUgPGNvbW1hbmQuaD4KCiNpbmNsdWRlICJtdlN5c0h3Q29uZmlnLmgiCiNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTU9OVF9FWFQpICYmIGRlZmluZWQgKE1WX0lOQ0xVREVfTU9OVF9GRlMpCgojaW5jbHVkZSAibXZUeXBlcy5oIgojaW5jbHVkZSAibm9yZmxhc2gvbXZGbGFzaC5oIgojaW5jbHVkZSAibXZDcHVJZi5oIgovKiNpbmNsdWRlICJtdl9tb24uaCIqLwojaW5jbHVkZSAibXZfZnMuaCIKCiNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQoKLyogI2RlZmluZSBERUJVRyAqLwojaWZkZWYgREVCVUcKI2RlZmluZSBEQih4KQl4CiNlbHNlCiNkZWZpbmUgREIoeCkKI2VuZGlmCgpzdGF0aWMgTVZfRkxBU0hfSU5GTyAqbXZGbGFzaEluZm87CgovKiBGaWxlIHN5c3RlbSBkYXRhIGJhc2UgdmFyaWFibGVzICovCi8qIEZBVCBzaWduYXR1cmUgKi8KY2hhciAgICAgICAgICAgICAgICBGQVRzaWduYXR1cmVbXSA9ICJGQVQwMjQxMzY3NjQwMDAiOwp1bnNpZ25lZCBpbnQgICAgICAgIGluaXRpYWxpemF0aW9uRmxhZzsKdW5zaWduZWQgaW50ICAgICAgICBtdkZTVGltZVN0YW1wOwp1bnNpZ25lZCBpbnQgICAgICAgIG9wZXJhdGlvbk1vZGU7CnVuc2lnbmVkIGludCAgICAgICAgbXZGU09mZnNldDsKdW5zaWduZWQgaW50ICAgICAgICBtdkZTVG9wT2Zmc2V0Owp1bnNpZ25lZCBpbnQgICAgICAgIG5leHRGcmVlQmxvY2s7CkZTX0ZJTEVfVEFCTEVfRU5UUlkgICAgbXZGU0VudHJpZXNbRlNfTUFYX05VTV9PRl9FTlRSSUVTXTsKRlNfRklMRV9DQUNIRV9CTE9DSyAgICBtdkZTQ2FjaGVCbG9ja3NbRlNfTlVNQkVSX09GX0JMT0NLU19GT1JfQ0FDSEVdOwoKLyogRnVuY3Rpb25zICovCmV4dGVybiB2b2lkIGRfaV9jYWNoZV9jbGVhbih1bnNpZ25lZCBpbnQgQWRkcmVzcywgdW5zaWduZWQgaW50IGJ5dGVDb3VudCk7CmV4dGVybiBpbnQgbG9hZF9uZXQoTVZfVTMyICpsb2FkbmV0X2FkZHIpOwpleHRlcm4gdW5zaWduZWQgaW50IFZJUlRVQUxfVE9fUEhZKHVuc2lnbmVkIGludCBhZGRyZXNzKTsgCmV4dGVybiB2b2lkIG12X2dvKHVuc2lnbmVkIGxvbmcgYWRkcixpbnQgYXJnYywgY2hhciAqYXJndltdKTsKZXh0ZXJuIE1WX0ZMQVNIX0lORk8qIGdldE12Rmxhc2hJbmZvKGludCBpbmRleCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG12RlNGb3JtYXQgLSBGb3JtYXRzIHRoZSBtdkZsYXNoIG12TWVtb3J5IGZvciBmaWxlIHN5c3RlbSB1c2FnZS4KKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgZnVuY3Rpb24gZm9ybWF0cyB0aGUgZmxhc2ggbWVtb3J5IGZvciBmaWxlIHN5c3RlbSB1c2FnZS4gSXQgCiogICAgICAgYWxsb2NhdGVzIDEwIGJsb2NrcyBmb3IgRkFUIGluIGEgZm9ybSBvZiBhIGxpbmtlZCBsaXN0IGFuZCB3cml0ZSB0aGUgCiogICAgICAgc2lnbmF0dXJlIChzaWduYXR1cmUgZGVmaW5kIGluIG12RlMuaCkgaW4gZWFjaCBGQVQgaGVhZGVyIGJsb2NrIAoqICAgICAgIHdpdGhpbiB0aGUgZmxhc2guIFRoZSBmb3JtYXQgc3RhcnRzIGZyb20gdGhlIJFvZmZzZXSSIHBhcmFtZXRlciB2YWx1ZSAKKiAgICAgICB3aXRoaW4gdGhlIGZsYXNoIGlmIHRoZSBvZmZzZXQgaXMgYWxpZ25lZCB3aXRoIG9uZSBvZiB0aGUgZmxhc2gncyAKKiAgICAgICBzZWN0b3JzIHN0YXJ0IGFkZHJlc3MsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGluY3JlbWVudGVkIHRvIHRoZSBuZWFyZXN0CiogICAgICAgc2VjdG9yIHN0YXJ0IGFkZHJlc3MgYW5kIHRoZW4gcGVyZm9ybSB0aGUgZm9ybWF0LlRoZSBmb3JtYXQgY2FuIGJlIAoqICAgICAgIGFjY29tcGxpc2hlZCBpbiAyIG1vZGVzIGFzIGRlc2NyaWJlZCBiZWxvdy4KKgoqIElOUFVUOgoqICAgICAgIG9mZnNldCAgLSBTdGFydGluZyAgcG9pbnQgb2YgdGhlIGZvcm1hdCB3aXRoaW4gdGhlIGZsYXNoLgoqCiogICAgICAgbW9kZSAtIERlZmluZXMgd2hldGhlciBhbiBlcmFzaW5nIGNvdW50ZXIgd2lsbCBiZSBlbmFibGVkIG9yIG5vdCAuIAoqICAgICAgICAgICAgICBXaGVuIGVyYXNpbmcgY291bnRlciBpcyBlbmFibGVkICwgdGhlIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgb25lCiogICAgICAgICAgICAgIGJsb2NrIGF0IHRoZSBlbmQgb2YgIGVhY2ggc2VjdG9yIHRvIGFjdCBhcyBhIGNvdW50ZXIgZm9yIHRoZSAKKiAgICAgICAgICAgICAgbnVtYmVyIG9mIGVyYXN1cmVzIG9mICB0aGF0IHNlY3RvciAuIFRoZSBwb3NzaWJsZSB2YWx1ZXMgOiAKKiAgICAgICAgICAgICAgLSBFTkFCTEVfRVJBU0lOR19DT1VOVEVSCiogICAgICAgICAgICAgIC0gTk9fRVJBU0lOR19DT1VOVEVSCiogT1VUUFVUOgoqICAgICAgIEluaXRpYWxpemVkIGZsYXNoIGZvciBmaWxlIHN5c3RlbSB1c2FnZS4KKgoqIFJFVFVSTjoKKiAgICAgICBUaGUgYWN0dWFsIG9mZnNldCAoYWZ0ZXIgYWxpZ25tZW50IHRvIHRoZSBuZWFyZXN0IHNlY3RvciBzdGFydCBhZGRyZXNzKSAKKiAgICAgICBvcjogCiogICAgICAgRkxBU0hfTUVNT1JZX05PVF9QUkVTRU5UIC0gaWYgbm8gZmxhc2ggbWVtb3J5IHByZXNlbnQgLiAKKiAgICAgICBWQUxJRF9GSUxFX1NZU19JTl9MT1dFUl9PRkZTRVQgLSBpZiBhIHZhbGlkIGZpbGUgc3lzdGVtIHJlc2lkaW5nIGluIGEgCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgb2Zmc2V0LgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnVuc2lnbmVkIGludCBtdkZTRm9ybWF0KHVuc2lnbmVkIGludCBvZmZzZXQsdW5zaWduZWQgaW50IG1vZGUpCnsKICAgIHVuc2lnbmVkIGludCBpLHNlY3RvclNpemUsdGVtcE9mZnNldCxsaW1pdCxwcmV2aW91c0NvdW50OwogICAgdW5zaWduZWQgaW50IGVyYXNpbmdDb3VudGVyV2FzRW5hYmxlZCA9IDAsc3RhdHVzOwoKICAgIERCKHByaW50Zigic3RhcnQgbXZGU0Zvcm1hdFxuIikpOwogICAgREIocHJpbnRmKCJGbGFzaCBiYXNlIGFkZHIgMHgleFxuIixtdkZsYXNoSW5mby0+YmFzZUFkZHIpKTsKCiAgICBpZihvZmZzZXQgIT0gbXZGbGFzaFNlY09mZnNHZXQobXZGbGFzaEluZm8sIG12Rmxhc2hJbldoaWNoU2VjKG12Rmxhc2hJbmZvLCBvZmZzZXQpKSkKICAgIHsKICAgICAgICBvZmZzZXQgPSBtdkZsYXNoU2VjT2Zmc0dldChtdkZsYXNoSW5mbywgbXZGbGFzaEluV2hpY2hTZWMobXZGbGFzaEluZm8sIG9mZnNldCkgKyAxKTsKICAgIH0KICAgIGlmKG9mZnNldCAhPSAweGZmZmZmZmZmKQogICAgewogICAgICAgIGlmKG1vZGUgPT0gRlNfRU5BQkxFX0VSQVNJTkdfQ09VTlRFUikKICAgICAgICB7CiAgICAgICAgICAgIHRlbXBPZmZzZXQgPSBtdkZTU2VhcmNoRm9yU2lnbmF0dXJlKCk7CiAgICAgICAgICAgIGlmKHRlbXBPZmZzZXQgIT0gRlNfTk9fVkFMSURfRkFUX1NUUklORykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYodGVtcE9mZnNldCA8IG9mZnNldCkgCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZTX1ZBTElEX0ZJTEVfU1lTX0lOX0xPV0VSX09GRlNFVDsKICAgICAgICAgICAgICAgIGlmKG12Rmxhc2gzMlJkKG12Rmxhc2hJbmZvLCB0ZW1wT2Zmc2V0ICsgRlNfRVJTQUlOR19DT1VOVEVSX0ZMQUdfT0ZGU0VUKSAKICAgICAgICAgICAgICAgICAgID09IEZTX0VOQUJMRV9FUkFTSU5HX0NPVU5URVIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJhc2luZ0NvdW50ZXJXYXNFbmFibGVkID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0ZW1wT2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgIC8qIEVyYXNlaW5nIHRoZSBzZWN0b3JzIGRlZGljYXRlZCBmb3IgdGhlIGZpbGUgc3lzdGVtICovCiAgICAgICAgd2hpbGUobXZGbGFzaEluV2hpY2hTZWMobXZGbGFzaEluZm8sIG9mZnNldCkgIT0gMHhmZmZmZmZmZikKICAgICAgICB7CiAgICAgICAgICAgIGlmKG1vZGUgPT0gRlNfTk9fRVJBU0lOR19DT1VOVEVSKQogICAgICAgICAgICB7CgkJREIocHJpbnRmKCJtdkZTRm9ybWF0IC0gbW9kZSA9IEZTX05PX0VSQVNJTkdfQ09VTlRFUlxuIikpOwogICAgICAgICAgICAgICAgaSA9IG12Rmxhc2hJbldoaWNoU2VjKG12Rmxhc2hJbmZvLCBvZmZzZXQpOwogICAgICAgICAgICAgICAgc2VjdG9yU2l6ZSA9IG12Rmxhc2hTZWNTaXplR2V0KG12Rmxhc2hJbmZvLCBpKTsKICAgICAgICAgICAgICAgIGxpbWl0ID0gb2Zmc2V0ICsgc2VjdG9yU2l6ZTsKICAgICAgICAgICAgICAgIGZvcig7IG9mZnNldCA8IGxpbWl0IDsgb2Zmc2V0Kz00KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKG12Rmxhc2gzMlJkKG12Rmxhc2hJbmZvLCBvZmZzZXQpICE9IDB4ZmZmZmZmZmYpCiAgICAgICAgICAgICAgICAgICAgewoJCQlEQihwcmludGYoIm12RlNGb3JtYXQgLSBFcmFzZSBmbGFzaCBzZWN0b3IgMHgleFxuIiwgbXZGbGFzaEluV2hpY2hTZWMobXZGbGFzaEluZm8sIG9mZnNldCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbXZGbGFzaFNlY0VyYXNlKG12Rmxhc2hJbmZvLCBtdkZsYXNoSW5XaGljaFNlYyhtdkZsYXNoSW5mbywgb2Zmc2V0KSk7CgkJCWlmIChzdGF0dXMgIT0gTVZfT0spCgkJCXsKCQkJCXByaW50ZigibXZGbGFzaFNlY0VyYXNlIC0gRkFJTCFcbiIpOwoJCQkJcmV0dXJuIHN0YXR1czsKCQkJfQoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNlY3RvclNpemU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSAvKiBtb2RlID09IEZTX0VOQUJMRV9FUkFTSU5HX0NPVU5URVIgKi8KICAgICAgICAgICAgewoJCURCKHByaW50ZigibXZGU0Zvcm1hdCAtIG1vZGUgPSBGU19FTkFCTEVfRVJBU0lOR19DT1VOVEVSXG4iKSk7CiAgICAgICAgICAgICAgICBpID0gbXZGbGFzaEluV2hpY2hTZWMobXZGbGFzaEluZm8sIG9mZnNldCk7CiAgICAgICAgICAgICAgICBzZWN0b3JTaXplID0gbXZGbGFzaFNlY1NpemVHZXQobXZGbGFzaEluZm8sIGkpOwogICAgICAgICAgICAgICAgbGltaXQgPSBvZmZzZXQgKyBzZWN0b3JTaXplIC0gRlNfQkxPQ0tfU0laRTsKICAgICAgICAgICAgICAgIHByZXZpb3VzQ291bnQgPSBtdkZsYXNoMzJSZChtdkZsYXNoSW5mbywgbGltaXQpOwogICAgICAgICAgICAgICAgZm9yKDsgb2Zmc2V0IDw9IChsaW1pdCArIDQpIDsgb2Zmc2V0Kz00KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKG12Rmxhc2gzMlJkKG12Rmxhc2hJbmZvLCBvZmZzZXQpICE9IDB4ZmZmZmZmZmYpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBtdkZsYXNoU2VjRXJhc2UobXZGbGFzaEluZm8sIG12Rmxhc2hJbldoaWNoU2VjKG12Rmxhc2hJbmZvLCBvZmZzZXQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXJhc2luZ0NvdW50ZXJXYXNFbmFibGVkKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgdGhlIGNvdW50ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12Rmxhc2gzMldyKG12Rmxhc2hJbmZvLCBsaW1pdCwgcHJldmlvdXNDb3VudCArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZGbGFzaDhXcihtdkZsYXNoSW5mbywgbGltaXQrRlNfQkxPQ0tfU1RBVFVTX0ZMQUdfT0ZGU0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfQkxPQ0tfVVNFRF9GT1JfRVJBU0lOR19DT1VOVEVSKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZighZXJhc2luZ0NvdW50ZXJXYXNFbmFibGVkKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGNvdW50ZXIgKi8KICAgICAgICAgICAgICAgICAgICBtdkZsYXNoMzJXcihtdkZsYXNoSW5mbywgbGltaXQsIDApOwogICAgICAgICAgICAgICAgICAgIG12Rmxhc2g4V3IobXZGbGFzaEluZm8sIGxpbWl0ICsgRlNfQkxPQ0tfU1RBVFVTX0ZMQUdfT0ZGU0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0JMT0NLX1VTRURfRk9SX0VSQVNJTkdfQ09VTlRFUik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvZmZzZXQgPSBsaW1pdCArIEZTX0JMT0NLX1NJWkU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyogRmlsbCB0aGUgRkFUJ3MgaGVhZGVyICovCiAgICAgICAgb2Zmc2V0ID0gdGVtcE9mZnNldDsKICAgICAgICAvKiBVcGRhdGUgdGhlIHN0YXR1cyBmbGFnICovCiAgICAgICAgbXZGbGFzaDhXcihtdkZsYXNoSW5mbywgb2Zmc2V0ICsgRlNfQkxPQ0tfU1RBVFVTX0ZMQUdfT0ZGU0VULEZTX0ZBVF9CTE9DSyk7CiAgICAgICAgLyogV3JpdGUgdGhlIEZBVCdzIHNpZ25hdHVyZSAqLwogICAgICAgIG12Rmxhc2hCbG9ja1dyKG12Rmxhc2hJbmZvLCBvZmZzZXQgKyBGU19TSUdOQVRVUkVfT0ZGU0VULCBGU19GQVRfU0lHTkFUVVJFX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgIChNVl9VOCAqKUZBVHNpZ25hdHVyZSk7CiAgICAgICAgLyogQ2hlY2sgaWYgd2Ugd2VyZSBhYmxlIHRvIGJ1cm4gdGhlIG12Rmxhc2ggKi8KICAgICAgICBmb3IoaSA9IDAgOyBpIDwgRlNfRkFUX1NJR05BVFVSRV9TSVpFIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYobXZGbGFzaDhSZChtdkZsYXNoSW5mbywgb2Zmc2V0ICsgRlNfU0lHTkFUVVJFX09GRlNFVCArIGkpICE9IEZBVHNpZ25hdHVyZVtpXSkgCiAgICAgICAgICAgICAgICByZXR1cm4gRlNfRkxBU0hfTUVNT1JZX05PVF9QUkVTRU5UOwogICAgICAgIH0KICAgICAgICBpZihtb2RlID09IEZTX0VOQUJMRV9FUkFTSU5HX0NPVU5URVIpCiAgICAgICAgewogICAgICAgICAgICBtdkZsYXNoMzJXcihtdkZsYXNoSW5mbywgb2Zmc2V0ICsgRlNfRVJTQUlOR19DT1VOVEVSX0ZMQUdfT0ZGU0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICBGU19FTkFCTEVfRVJBU0lOR19DT1VOVEVSKTsKICAgICAgICB9CiAgICAgICAgbXZGbGFzaDMyV3IobXZGbGFzaEluZm8sIG9mZnNldCwgb2Zmc2V0ICsgRlNfQkxPQ0tfU0laRSk7CiAgICAgICAgLyogQWxvY2F0ZSA5IG1vcmUgYmxvY2tzIGZvciB0aGUgRkFUICovCiAgICAgICAgZm9yKGkgPSAxIDsgaSA8IChGU19NQVhfTlVNX09GX0ZBVF9CTE9DS1MgLSAxKSA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIC8qIE5leHQgYmxvY2sgcG9pbnRlciAqLwogICAgICAgICAgICBtdkZsYXNoMzJXcihtdkZsYXNoSW5mbywgb2Zmc2V0KyhGU19CTE9DS19TSVpFKihpKSksb2Zmc2V0KwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGU19CTE9DS19TSVpFKihpKzEpKSk7CiAgICAgICAgICAgIC8qIEZsYWcgKi8KICAgICAgICAgICAgbXZGbGFzaDhXcihtdkZsYXNoSW5mbywgb2Zmc2V0KyhGU19CTE9DS19TSVpFKihpKSkgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19CTE9DS19TVEFUVVNfRkxBR19PRkZTRVQsIEZTX0ZBVF9CTE9DSyk7CiAgICAgICAgfQogICAgICAgIC8qIFRoZSBsYXN0IGJsb2NrJ3MgbmV4dCBwb2ludGVyIGlzIDB4ZmZmZmZmZmYgc2luY2UgaXQgaXMgdGhlIGxhc3QgKi8KICAgICAgICBtdkZsYXNoOFdyKG12Rmxhc2hJbmZvLCBvZmZzZXQgKyAoRlNfQkxPQ0tfU0laRSAqIGkpICsgCiAgICAgICAgICAgICAgICAgICAgICAgICBGU19CTE9DS19TVEFUVVNfRkxBR19PRkZTRVQsIEZTX0ZBVF9CTE9DSyk7CiAgICB9CiAgICByZXR1cm4gb2Zmc2V0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG12RlNJbml0IC0gSW5pdGlhbGl6ZXMgdGhlIGZsYXNoIHN5c3RlbSdzIGRhdGEgYmFzZSB2YXJpYWJsZXMuCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBmbGFzaCBzeXN0ZW0ncyBkYXRhYmFzZSB2YXJpYWJsZXMgcmVzaWRpbmcKKiAgICAgICBpbiB0aGUgc3lzdGVtcyBkeW5hbWljIG1lbW9yeSAoU0RSQU0pIC4gSXQgc2VhcmNoZXMgd2l0aGluIHRoZSBmbGFzaCAKKiAgICAgICBtZW1vcnkgZnJvbSB0aGUgYmVnaW5pbmcsIGZvciB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIHZhbGlkIHNpZ25hdHVyZS4KKiAgICAgICBJZiBmb3VuZCwgYSB2YWxpZCBmaWxlIHN5c3RlbSBpcyBhc3N1bWVkIHRvIGJlIGV4aXN0IHN0YXJ0aW5nIGZyb20gdGhlCiogICAgICAgc2VjdG9yIHRoZSBzaWduYXR1cmUgd2FzIGZvdW5kIGFuZCBhbGwgdGhlIGRhdGFiYXNlIHZhcmlhYmxlcyB3aWxsIHRoYW4gCiogICAgICAgYmUgaW5pdGlhbGl6ZWQgLG90aGVyd2lzZSBpdCByZXR1cm5zIE5PX1ZBTElEX0ZBVF9TVFJJTkcgb3IgCiogICAgICAgT0ZGU0VUX09VVF9PRl9SQU5HRSB0byBpbmRpY2F0ZSB0aGF0IG5vIHZhbGlkIGZpbGUgc3lzdGVtIHdhcyBmb3VuZCAKKiAgICAgICB3aXRoaW4gdGhlIGZsYXNoIC5JZiBhIHZhbGlkIGZpbGUgc3lzdGVtIHdhcyBmb3VuZCAsdGhlIGZ1bmN0aW9uIHJldHVybnMKKiAgICAgICB0aGUgbnVtYmVyIG9mICBmaWxlcyB3aXRoaW4gdGhlIGZsYXNoIC5UaGUgkW1vZGWSIHBhcmFtZXRlciBkZWxpdmVyZWQgdG8KKiAgICAgICB0aGUgZnVuY3Rpb24gaXMgZm9yIGZ1dHVyZSBuZWVkcyB0byBzdXBwb3J0IHR3byBjYWNoZSBtb2RlcyhjYWNoZSBtb2RlLAoqICAgICAgIG5vbiAtIGNhY2hlIG1vZGUpIGFuZCBjdXJyZW50bHkgdGhpcyBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIAoqICAgICAgIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uLiAKKiAgICAgIE5PVEUhISEhOgoqICAgICAgIEl0IGlzIGEgTVVTVCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGFueSBhdHRlbXB0IHRvIHVzZSBmaWxlLXN5c3RlbQoqICAgICAgIGRyaXZlci4gICAKKiBJTlBVVDoKKiAgICAgICBtb2RlIC0gRm9yIGZ1dHVyZSBuZWVkcyB0byBzdXBwb3J0IGNhY2hlIG9yIG5vbi1jYWNoZSBtb2RlcyAoY3VycmVudGx5IAoqICAgICAgICAgICAgICBub3QgaW1wbGVtZW50ZWQpLgoqICAgICAgIAoqIE9VVFBVVDoKKiAgICAgICBJbml0aWFsaXplZCBkYXRhIGJhc2UgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKgoqIFJFVFVSTjoKKiAgICAgICBOdW1iZXIgb2YgZmlsZXMgY3VycmVudGx5IG9uIHRoZSBzeXN0ZW0gb3I6CiogICAgICAgTk9fVkFMSURfRkFUX1NUUklORyAtIGlmIG5vIGZpbGUgc3lzdGVtIHdhcyBmb3VuZCAoVHJ5IHRvIHVzZSAKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgkWZpbGVTeXNGb3JtYXSSIGZ1bmN0aW9uIGluIHRoaXMgY2FzZSkuCiogICAgICAgT0ZGU0VUX09VVF9PRl9SQU5HRSAtIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBmaW5kaW5nIGEgc2lnbmF0dXJlIGZvdW5kIGlzCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU1RFTV9BTFJFQURZX0lOSVRJQUxJWkVELgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnVuc2lnbmVkIGludCBtdkZTSW5pdCh1bnNpZ25lZCBpbnQgbW9kZSkKewogICAgLyogSW5pdGlhbGx5IHdlIGFyZSBub3QgZ29pbmcgdG8gc3VwcG9ydCB0aGUgRlNfRU5BQkxFX0NBQ0hFIG1vZGUgKi8KICAgIHVuc2lnbmVkIGludCBvZmZzZXQgPSAwLGkgPSAwLG51bU9mRmlsZXMsbmV4dEJsb2NrT2Zmc2V0OwogICAgdW5zaWduZWQgaW50IGZpbGVFbnRyeU9mZnNldCx0ZW1wT2Zmc2V0OwoKICAgIC8qIHNldCB0aGUgZ2xvYmFsIGZsYXNoIGluZm8gc3RydWN0dXJlICovCgltdkZsYXNoSW5mbyA9IGdldE12Rmxhc2hJbmZvKE1BSU5fRkxBU0hfSU5ERVgpOwoKICAgIC8qIFNlZWsgZm9yIHRoZSBGQVQgc2lnbmF0dXJlICovICAgIAogICAgb2Zmc2V0ID0gbXZGU1NlYXJjaEZvclNpZ25hdHVyZSgpOwogICAgaWYob2Zmc2V0ID09IEZTX05PX1ZBTElEX0ZBVF9TVFJJTkcpICAgCiAgICAgICAgcmV0dXJuIEZTX05PX1ZBTElEX0ZBVF9TVFJJTkc7CiAgICBpZihvZmZzZXQgPj0gbXZGbGFzaFNpemVHZXQobXZGbGFzaEluZm8pKSAgICAgICAgCiAgICAgICAgcmV0dXJuIEZTX09GRlNFVF9PVVRfT0ZfUkFOR0U7CiAgICBtdkZTVG9wT2Zmc2V0ID0gbXZGbGFzaFNpemVHZXQobXZGbGFzaEluZm8pOwoKICAgIC8qIENoZWNrIGlmIHRoZSBzeXN0ZW0gaXMgYWxyZWFkeSBpbml0aWFsaXplZCAsIGlmIHNvIHdlIHdpbGwgbm90CiAgICAgICByZS1pbml0aWFsaXplICovCiAgICBpZihpbml0aWFsaXphdGlvbkZsYWcgPT0gRlNfRklMRV9TWVNURU1fSU5JVElBTElaRUQpCiAgICAgICAgcmV0dXJuIEZTX1NZU1RFTV9BTFJFQURZX0lOSVRJQUxJWkVEOwogICAgCiAgICAvKiBXZSBmb3VuZCB0aGUgRkFUJ3Mgc2lnbmF0dXJlLCBub3cgd2UgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWxlIHN5c3RlbQogICAgICAgZGF0YSBiYXNlIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIGZpbGVzICovCiAgICBtdkZTVGltZVN0YW1wICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIG9wZXJhdGlvbk1vZGUgICAgICAgPSBtb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgbXZGU09mZnNldCAgICAgICA9IG9mZnNldDsKICAgIG5leHRGcmVlQmxvY2sgICAgICAgPSAweGZmZmZmZmZmIC0gRlNfQkxPQ0tfU0laRTsKICAgIC8qIEluaXRpYWxpemUgdGhlIGZpbGVzIGVudHJpZXMgKi8KICAgIGZvcihpID0gMCA7IGkgPCBGU19NQVhfTlVNX09GX0VOVFJJRVMgOyBpKyspCiAgICB7CiAgICAgICAgbXZGU0VudHJpZXNbaV0uZmlsZVBvaW50ZXIgICAgICAgPSAwOwogICAgICAgIG12RlNFbnRyaWVzW2ldLnN0YXR1c0ZsYWcgICAgICAgID0gRlNfRlJFRV9FTlRSWTsKICAgICAgICBtdkZTRW50cmllc1tpXS5tb2RlWzBdICAgICAgICAgICA9ICdcMCc7CiAgICAgICAgbXZGU0VudHJpZXNbaV0ucG9pbnRlclRvRkFUICAgICAgPSAweGZmZmZmZmZmOwogICAgICAgIG12RlNFbnRyaWVzW2ldLkVPRnBvaW50ZXIgICAgICAgID0gMDsKICAgIH0KICAgIC8qIEluaXRpYWxpemUgdGhlIGNhY2hlIGJsb2NrcyAqLwogICAgZm9yKGkgPSAwIDsgaSA8IEZTX05VTUJFUl9PRl9CTE9DS1NfRk9SX0NBQ0hFIDsgaSsrKQogICAgewogICAgICAgIG12RlNDYWNoZUJsb2Nrc1tpXS5jdXJyZW50QmxvY2tBZGRyZXNzICAgPSAweGZmZmZmZmZmOwogICAgICAgIG12RlNDYWNoZUJsb2Nrc1tpXS5maWxlSGFuZGxlciAgICAgICAgICAgPSAwOwogICAgICAgIG12RlNDYWNoZUJsb2Nrc1tpXS51c2FnZUNvdW50ZXIgICAgICAgICAgPSAwOwogICAgICAgIG12RlNDYWNoZUJsb2Nrc1tpXS50aW1lU3RhbXAgICAgICAgICAgICAgPSAwOwogICAgfQogICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBmaWxlcyBjdXJyZW50bHkgb24gdGhlIHN5c3RlbSAqLwogICAgbnVtT2ZGaWxlcyAgICAgID0gMDsKICAgIG5leHRCbG9ja09mZnNldCA9IG12RlNPZmZzZXQ7CiAgICB3aGlsZShuZXh0QmxvY2tPZmZzZXQgIT0gMHhmZmZmZmZmZikKICAgIHsKICAgICAgICAvKiBTa2lwIHRoZSBibG9jaydzIGhlYWRlciAqLwogICAgICAgIGZpbGVFbnRyeU9mZnNldCA9IG5leHRCbG9ja09mZnNldCArIEZTX0ZBVF9IRUFERVJfU0laRTsKICAgICAgICBmb3IoaSA9IDAgOyBpIDwgMTUgOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpZihtdkZsYXNoOFJkKG12Rmxhc2hJbmZvLCBmaWxlRW50cnlPZmZzZXQgKyBGU19FTlRSWV9TVEFUVVNfRkxBR19PRkZTRVQpCiAgICAgICAgICAgICAgID09IEZTX0VOVFJZX0lOX1VTRSkgCiAgICAgICAgICAgICAgICBudW1PZkZpbGVzKys7CiAgICAgICAgICAgIC8qIElmIHdlIGhhdmUgZmlsZXMgd2hpY2ggd2VyZSBub3QgcHJvcGVybHkgY2xvc2VkIHdlIG5lZWQgdG8KICAgICAgICAgICAgICAgdG8gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc3lzdGVtICovCiAgICAgICAgICAgIGlmKG12Rmxhc2g4UmQobXZGbGFzaEluZm8sIGZpbGVFbnRyeU9mZnNldCArIEZTX0VOVFJZX1NUQVRVU19GTEFHX09GRlNFVCkKICAgICAgICAgICAgICAgPT0gRlNfRU5UUllfSU5fVVBEQVRFKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtdkZsYXNoOFdyKG12Rmxhc2hJbmZvLCBmaWxlRW50cnlPZmZzZXQgKyBGU19FTlRSWV9TVEFUVVNfRkxBR19PRkZTRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19GUkVFX0RJUlRZX0VOVFJZKTsKICAgICAgICAgICAgICAgIC8qIEZyZWUgdGhlIGZpbGUncyBkYXRhIGJsb2NrcyAqLwogICAgICAgICAgICAgICAgdGVtcE9mZnNldCA9IG12Rmxhc2gzMlJkKG12Rmxhc2hJbmZvLCBmaWxlRW50cnlPZmZzZXQpOwogICAgICAgICAgICAgICAgd2hpbGUodGVtcE9mZnNldCAhPSAweGZmZmZmZmZmKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRlbXBPZmZzZXQgPSB0ZW1wT2Zmc2V0ICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0s7CiAgICAgICAgICAgICAgICAgICAgbXZGbGFzaDhXcihtdkZsYXNoSW5mbywgdGVtcE9mZnNldCArIEZTX0JMT0NLX1NUQVRVU19GTEFHX09GRlNFVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19GUkVFX0RJUlRZX0JMT0NLKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wT2Zmc2V0ID0gbXZGbGFzaDMyUmQobXZGbGFzaEluZm8sIHRlbXBPZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIHBvaW50IHRvIHRoZSBuZXh0IGVudHJ5ICovCiAgICAgICAgICAgIGZpbGVFbnRyeU9mZnNldCArPSBGU19GQVRfRklMRV9FTlRSWV9TSVpFOyAKICAgICAgICB9CiAgICAgICAgbmV4dEJsb2NrT2Zmc2V0ID0gbXZGbGFzaDMyUmQobXZGbGFzaEluZm8sIG5leHRCbG9ja09mZnNldCk7CiAgICB9CiAgICBpbml0aWFsaXphdGlvbkZsYWcgPSBGU19GSUxFX1NZU1RFTV9JTklUSUFMSVpFRDsKICAgIHJldHVybiBudW1PZkZpbGVzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG12RlNEZWxldGUgLSBEZWxldGVzIGEgZmlsZSBmb3IgdGhlIGZpbGUgc3lzdGVtLgoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyBmdW5jdGlvbiBkZWxldGVzIGEgZmlsZSBpbiB0aGUgZmlsZS1zeXN0ZW0uIFRoZSBmdW5jdGlvbiBhY3R1YWxseSAKKiAgICAgICBtYXJrcyB0aGUgZmlsZSdzIGVudHJ5IHN0YXR1cyBmbGFnIGFzIEZSRUVfRElSVFlfRU5UUlkgYW5kIHRoZSBmaWxlJ3MgCiogICAgICAgc3RhdHVzIGZsYWcgb2YgZWFjaCBkYXRhIGJsb2NrIHdpdGggdGhlIHZhbHVlIEZSRUVfRElSVFlfQkxPQ0tzIHRvIAoqICAgICAgIGluZGljYXRlIHRoYXQgdGhpcyBlbnRlcnkgYW5kIGFsbCB0aGUgZmlsZZJzIGRhdGEgYmxvY2tzIGFyZSBubyBsb25nZXIgCiogICAgICAgYXNzb2NpYXRlZCBieSB0aGlzIGZpbGUuIElmIHRoZSBmaWxlIGhhcyB2YWxpZCBoYW5kbGVzIGFzc29jaWF0ZWQgd2l0aAoqICAgICAgIGl0IHRoZSBmaWxlIHdpbGwgbm90IGJlIGRlbGV0ZWQgLiAgCiogICAgICBOT1RFOgoqICAgICAgIFRoZSBmaWxlIHN5c3RlbSdzIGRhdGEgYmFzZSBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IJFmaWxlU3lzSW5pdJIgCiogICAgICAgZnVuY3Rpb24gYmVmb3JlIHVzaW5nIHRoaXMgZnVuY3Rpb24gLiAgICAgICAgIAoqCiogSU5QVVQ6CiogICAgICAgZmlsZU5hbWUgLSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlIG5hbWUuCioKKiBPVVRQVVQ6CiogICAgICAgT24gc3VjY2VzcyB0aGUgZmlsZSB3aWxsIGJlIGRlbGV0ZWQuLgoqCiogUkVUVVJOOgoqICAgICAgIE9uIHN1Y2Nlc3MgLSBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgRlNfRklMRV9ERUxFVEVELgoqICAgICAgIE9uIGZhaWx1cmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKiAgICAgICBGU19GSUxFX05PVF9GT1VORCAtIGlmIHRoZSBkYXRhIGJhc2Ugd2FzIGluaXRpYWxpemVkIG9yIGZpbGUgd2FzIG5vdAoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQuCiogICAgICAgRlNfRklMRV9JU19OT1RfQ0xPU0VEIC0gaWYgdGhlIGZpbGUgaGFzIHZhbGlkIGhhbmRsZXMgYXNzb2NpYXRlZCB3aXRoCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnVuc2lnbmVkIGludCBtdkZTRGVsZXRlKGNoYXIgKiBmaWxlTmFtZSkKewogICAgdW5zaWduZWQgaW50IGZpbGVPZmZzZXQsbnVtT2ZIYW5kbGVzLHRlbXBPZmZzZXQ7CgogICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgc3lzdGVtJ3MgZGF0YSBiYXNlIHdhcyBpbml0aWFsaXplZCAqLwogICAgaWYoaW5pdGlhbGl6YXRpb25GbGFnICE9IEZTX0ZJTEVfU1lTVEVNX0lOSVRJQUxJWkVEKQogICAgICAgIHJldHVybiBGU19GSUxFX05PVF9GT1VORDsKICAgIAogICAgaWYoKGZpbGVPZmZzZXQgPSBtdkZTRmlsZUZpbmQoZmlsZU5hbWUpKSA9PSBGU19GSUxFX05PVF9GT1VORCkgCiAgICAgICAgcmV0dXJuIEZTX0ZJTEVfTk9UX0ZPVU5EOwogICAgaWYoKG51bU9mSGFuZGxlcyA9IG12RlNOdW1PZkhhbmRsZXMoZmlsZU5hbWUpKSA9PSBGU19GSUxFX05PVF9GT1VORCkKICAgICAgICByZXR1cm4gRlNfRklMRV9OT1RfRk9VTkQ7CiAgICBpZihudW1PZkhhbmRsZXMgPiAwKSAKICAgICAgICByZXR1cm4gRlNfRklMRV9JU19OT1RfQ0xPU0VEOwogICAgCiAgICBtdkZsYXNoOFdyKG12Rmxhc2hJbmZvLCBmaWxlT2Zmc2V0ICsgRlNfRU5UUllfU1RBVFVTX0ZMQUdfT0ZGU0VULAogICAgICAgICAgICAgICAgICAgICBGU19GUkVFX0RJUlRZX0VOVFJZKTsKICAgIC8qIEZyZWUgdGhlIGZpbGUncyBkYXRhIGJsb2NrcyAqLwogICAgdGVtcE9mZnNldCA9IG12Rmxhc2gzMlJkKG12Rmxhc2hJbmZvLCBmaWxlT2Zmc2V0KTsKICAgIHdoaWxlKHRlbXBPZmZzZXQgIT0gMHhmZmZmZmZmZikKICAgIHsKICAgICAgICB0ZW1wT2Zmc2V0ID0gdGVtcE9mZnNldCAmIEZTX0JMT0NLX09GRlNFVF9NQVNLOwogICAgICAgIG12Rmxhc2g4V3IobXZGbGFzaEluZm8sIHRlbXBPZmZzZXQgKyBGU19CTE9DS19TVEFUVVNfRkxBR19PRkZTRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICBGU19GUkVFX0RJUlRZX0JMT0NLKTsKICAgICAgICB0ZW1wT2Zmc2V0ID0gbXZGbGFzaDMyUmQobXZGbGFzaEluZm8sIHRlbXBPZmZzZXQpOwogICAgfQogICAgcmV0dXJuIEZTX0ZJTEVfREVMRVRFRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBtdkZTRmlsZUZpbmQgLSBDaGVjayBpZiBhIGZpbGUgZXhpc3RzIGluIHRoZSBmaWxlIHN5c3RlbS4KKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBmaWxlIJFmaWxlTmFtZZIgZXhpc3RzIGluIHRoZSBmaWxlIHN5c3RlbS4KKiAgICAgICBUaGUgZnVuY3Rpb24gd2lsbCBzZWFyY2ggZm9yIHRoZSBmaWxlIHdpdGggdGhlIG1hdGNoaW5nIG5hbWUgYW5kIAoqICAgICAgIGV4dGVuc2lvbiBhbmQgaWYgZm91bmQgLCB0aGUgZmlsZSdzIGVudHJ5IG9mZnNldCBpbiB0aGUgRkFUIGlzIHJldHVybmVkLgoqICAgICAgTk9URToKKiAgICAgICBUaGUgZmlsZSBzeXN0ZW0ncyBkYXRhIGJhc2UgbXVzdCBiZSBpbml0aWFsaXplZCBieSCRZmlsZVN5c0luaXSSIAoqICAgICAgIGZ1bmN0aW9uIGJlZm9yZSB1c2luZyB0aGlzIGZ1bmN0aW9uIC4gIAoqICAgICAgIAoqIElOUFVUOgoqICAgICAgIGZpbGVOYW1lIC0gQSBzdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZSBuYW1lLgoqCiogT1VUUFVUOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk46CiogICAgICAgRklMRV9OT1RfRk9VTkQgb3IgdGhlIGZpbGUncyBlbnRlcnkgb2Zmc2V0IGluIHRoZSBGQVQuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdW5zaWduZWQgaW50IG12RlNGaWxlRmluZChjaGFyICogZmlsZU5hbWUpCnsKICAgIHVuc2lnbmVkIGludCAgICBuZXh0QmxvY2tPZmZzZXQsZmlsZUVudHJ5T2Zmc2V0LGluZGV4OwogICAgY2hhciAgIHRlbXBTdHJpbmdbMjBdOwogICAgCiAgICAvKiBDaGVjayBpZiB0aGUgZmlsZSBzeXN0ZW0ncyBkYXRhIGJhc2Ugd2FzIGluaXRpYWxpemVkICovCiAgICBpZihpbml0aWFsaXphdGlvbkZsYWcgIT0gRlNfRklMRV9TWVNURU1fSU5JVElBTElaRUQpCiAgICAgICAgcmV0dXJuIEZTX0ZJTEVfTk9UX0ZPVU5EOwogICAgbmV4dEJsb2NrT2Zmc2V0ID0gbXZGU09mZnNldDsKICAgIHdoaWxlKG5leHRCbG9ja09mZnNldCAhPSAweGZmZmZmZmZmKQogICAgewogICAgICAgIC8qIFNraXAgdGhlIGJsb2NrJ3MgaGVhZGVyICovCiAgICAgICAgZm9yKGZpbGVFbnRyeU9mZnNldCA9IG5leHRCbG9ja09mZnNldCArIEZTX0ZBVF9IRUFERVJfU0laRTsKICAgICAgICAgICAgZmlsZUVudHJ5T2Zmc2V0IDwgKG5leHRCbG9ja09mZnNldCArIEZTX0JMT0NLX1NJWkUpOwogICAgICAgICAgICBmaWxlRW50cnlPZmZzZXQgKz0gRlNfRkFUX0ZJTEVfRU5UUllfU0laRSkKICAgICAgICB7CiAgICAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgICAgaWYobXZGbGFzaDhSZChtdkZsYXNoSW5mbywgZmlsZUVudHJ5T2Zmc2V0ICsgRlNfRU5UUllfU1RBVFVTX0ZMQUdfT0ZGU0VUKQogICAgICAgICAgICAgICA9PSBGU19FTlRSWV9JTl9VU0UpIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSBmaWxlJ3MgbmFtZSAqLwogICAgICAgICAgICAgICAgbXZGU1JlYWRGaWxlTmFtZUZyb21GQVRlbnRyeShmaWxlRW50cnlPZmZzZXQsdGVtcFN0cmluZyk7CiAgICAgICAgICAgICAgICBpZihzdHJjbXAodGVtcFN0cmluZyxmaWxlTmFtZSkgPT0gMCkgcmV0dXJuIGZpbGVFbnRyeU9mZnNldDsKICAgICAgICAgICAgICAgIC8qIGVsc2UgLCB0cnkgdGhlIG5leHQgZW50cnkgKi8KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBuZXh0QmxvY2tPZmZzZXQgPSBtdkZsYXNoMzJSZChtdkZsYXNoSW5mbywgbmV4dEJsb2NrT2Zmc2V0KTsKICAgIH0KICAgIHJldHVybiBGU19GSUxFX05PVF9GT1VORDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBtdkZTTnVtT2ZIYW5kbGVzIC0gQ291bnRzIHRoZSBudW1iZXIgb2YgaGFuZGxlcyBjdXJyZW50bHkgcG9pbnRpbmcgdG8gYSBmaWxlLgoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyBmdW5jdGlvbiBjb3VudHMgdGhlIG51bWJlciBvZiBoYW5kbGVzIGN1cnJlbnRseSBhc3NvY2lhdGVkIHRvIHRoZSAKKiAgICAgICBmaWxlIJFmaWxlTmFtZZIuVGhlIGVudHJ5IHRhYmxlIGluIHRoZSBkeW5hbWljIGRhdGFiYXNlIGlzIGZvcm1lZCBmcm9tIAoqICAgICAgIGFuIGFycmF5IG9mICBGSUxFX1RBQkxFX0VOVFJZIChzdHJ1Y3R1cmUgZGVmaW5lZCBpbiBtdkZTLmgpIGFuZCB0aGUgCiogICAgICAgZmlsZSBoYW5kbGVyIGFjdHMgYXMgdGhlIGluZGV4IG9mIHRoYXQgYXJyYXkgLiBUaGUgZnVuY3Rpb24gY291bnRzIGVhY2ggCiogICAgICAgZW50cnkgd2l0aGluIHRoZSBhcnJheSB0aGF0IHBvaW50cyB0byB0aGUgZmlsZSCRZmlsZU5hbWWSIGFuZCByZXR1cm4gCiogICAgICAgdGhhdCB2YWx1ZS4KKiAgICAgIE5PVEU6CiogICAgICAgVGhlIGZpbGUgc3lzdGVtJ3MgZGF0YSBiYXNlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYnkgkWZpbGVTeXNJbml0kiAKKiAgICAgICBmdW5jdGlvbiBiZWZvcmUgdXNpbmcgdGhpcyBmdW5jdGlvbiAuICAKKiAgICAgICAKKiBJTlBVVDoKKiAgICAgICBmaWxlTmFtZSAtIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGZpbGUgbmFtZS4KKgoqIE9VVFBVVDoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOOgoqICAgICAgIG9uIHN1Y2Nlc3MgLCB0aGUgTnVtYmVyIG9mIGhhbmRsZXJzIGN1cnJlbnRseSBhc3NvY2lhdGVkIHRvIHRoZSBmaWxlIAoqICAgICAgIJFmaWxlTmFtZZIuCiogICAgICAgb24gZmFpbHVyZSAsIEZTX0ZJTEVfTk9UX0ZPVU5ELgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnVuc2lnbmVkIGludCBtdkZTTnVtT2ZIYW5kbGVzKGNoYXIgKiBmaWxlTmFtZSkKewogICAgdW5zaWduZWQgaW50ICAgIGZpbGVFbnRyeU9mZnNldCxpLG51bU9mSGFuZGxlczsKICAgIGlmKChmaWxlRW50cnlPZmZzZXQgPSBtdkZTRmlsZUZpbmQoZmlsZU5hbWUpKSA9PSAweGZmZmZmZmZmKQogICAgICAgIHJldHVybiBGU19GSUxFX05PVF9GT1VORDsKCiAgICBudW1PZkhhbmRsZXMgPSAwOwogICAgZm9yKGkgPSAwIDsgaSA8IEZTX01BWF9OVU1fT0ZfRU5UUklFUyA7IGkrKykKICAgIHsKICAgICAgICBpZihmaWxlRW50cnlPZmZzZXQgPT0gbXZGU0VudHJpZXNbaV0uZmlsZVBvaW50ZXIpIAogICAgICAgICAgICBudW1PZkhhbmRsZXMrKzsKICAgIH0KICAgIHJldHVybiBudW1PZkhhbmRsZXM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbXZGU1NlYXJjaEZvclNpZ25hdHVyZSAtIFNlYXJjaGVzIGZvciB0aGUgRkFUJ3Mgc2lnbmF0dXJlIHN0cmluZywgaWYgdGhlIAoqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXMgZm91bmQgd2UgYXJlIGFzc3VtaW5nIGEgdmFsaWQgZmlsZSBzeXN0ZW0uCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIHdpdGhpbiB0aGUgZmxhc2ggbWVtb3J5IGZyb20gdGhlIGJlZ2luaW5nIGZvciB0aGUKKiAgICAgICBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgdmFsaWQgc2lnbmF0dXJlIC5JZiBmb3VuZCAsIGl0IHJldHVybnMgdGhlIHNlY3RvciAKKiAgICAgICBvZmZzZXQgb24gd2hpY2ggdGhlIHNpZ25hdHVyZSBmaXJzdCBvY2N1cnJlZCAsIG90aGVyd2lzZSBpdCByZXR1cm5zIAoqICAgICAgIE5PX1ZBTElEX0ZBVF9TVFJJTkcgdG8gaW5kaWNhdGUgdGhlIGZsYXNoIGlzIG5vdCBmb3JtYXRlZCAsIGluIHRoYXQgY2FzZQoqICAgICAgIHlvdSBtaWdodCB3YW50IHRvIHVzZSBmaWxlU3lzZm9ybWF0IGZ1bmN0aW9uLiAKKgoqIElOUFVUOgoqICAgICAgIE5vbmUuCioKKiBPVVRQVVQ6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTjoKKiAgICAgICBUaGUgb2Zmc2V0IG9mIHRoZSBzZWN0b3IgaW4gd2hpY2ggdGhlIHNpZ25hdHVyZSB3YXMgZm91bmQsCiogICAgICAgb3RoZXJ3aXNlIEZTX05PX1ZBTElEX0ZBVF9TVFJJTkcgLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnVuc2lnbmVkIGludCBtdkZTU2VhcmNoRm9yU2lnbmF0dXJlKHZvaWQpCnsKICAgIHVuc2lnbmVkIGludCBvZmZzZXQgPSAwLGksc2VjdG9yTnVtYmVyOwogICAgCiAgICBzZWN0b3JOdW1iZXIgPSBtdkZsYXNoSW5XaGljaFNlYyhtdkZsYXNoSW5mbywgb2Zmc2V0KTsKICAgIHdoaWxlKChvZmZzZXQgPSBtdkZsYXNoU2VjT2Zmc0dldChtdkZsYXNoSW5mbywgc2VjdG9yTnVtYmVyKSkgIT0gMHhmZmZmZmZmZikKICAgIHsKICAgICAgICBmb3IoaSA9IDAgOyBpIDwgRlNfRkFUX1NJR05BVFVSRV9TSVpFIDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYobXZGbGFzaDhSZChtdkZsYXNoSW5mbywgb2Zmc2V0ICsgRlNfU0lHTkFUVVJFX09GRlNFVCArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSkgIT0gRkFUc2lnbmF0dXJlW2ldKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmKGkgPT0gRlNfRkFUX1NJR05BVFVSRV9TSVpFKSBicmVhazsKICAgICAgICBvZmZzZXQgKz0gbXZGbGFzaFNlY1NpemVHZXQobXZGbGFzaEluZm8sIHNlY3Rvck51bWJlcik7CiAgICAgICAgc2VjdG9yTnVtYmVyID0gbXZGbGFzaEluV2hpY2hTZWMobXZGbGFzaEluZm8sIG9mZnNldCk7CiAgICAgICAgaWYoc2VjdG9yTnVtYmVyID09IDB4ZmZmZmZmZmYpIHJldHVybiBGU19OT19WQUxJRF9GQVRfU1RSSU5HOwogICAgfQogICAgaWYob2Zmc2V0ID09IDB4ZmZmZmZmZmYpIHJldHVybiBGU19OT19WQUxJRF9GQVRfU1RSSU5HOwogICAgcmV0dXJuIG9mZnNldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBtdkZTT3BlbiAtIE9wZW5zIGEgZmlsZSBmb3IgcmVhZC93cml0ZS9hcHBlbmQuCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIGEgZmlsZSBmb3IgcmVhZGluZyAsIHdyaXRpbmcgb3IgYXBwZW5kaW5nIGRhdGEgLlRoZQoqICAgICAgIGZ1bmN0aW9uIHdpbGwgYWN0IGRpZmZlcmFudGx5IHVwb24gZWFjaCBtb2RlIGRlbGl2ZXJlZCBieSB0aGUgcGFyYW1ldGVyCiogICAgICAgkW1vZGWSLgoqICAgICAgTk9URToKKiAgICAgICBUaGUgZmlsZSBzeXN0ZW0ncyBkYXRhIGJhc2UgbXVzdCBiZSBpbml0aWFsaXplZCBieSCRZmlsZVN5c0luaXSSIAoqICAgICAgIGZ1bmN0aW9uIGJlZm9yZSB1c2luZyB0aGlzIGZ1bmN0aW9uIC4gICAKKgoqIElOUFVUOgoqICAgICAgIG1vZGUgLSBkZWZpbmVzIG9uIHdoaWNoIG1vZGUgdGhlIGZpbGUgd2lsbCBiZSBvcGVuIC5BbGwgcG9zc2libGUgdmFsdWVzCiogICAgICAgICAgICAgIGZvciCRbW9kZZIgcGFyYW1ldGVyIGFyZSBkZXNjcmliZWQgYmVsb3c6CioKkyAgICAgICAgICAgICAgInIiICAtIE9wZW5zIHRoZSBmaWxlIGZvciByZWFkaW5nIG9ubHkgLiBJZiB0aGUgZmlsZSBkb2VzIG5vdCAKKiAgICAgICAgICAgICAgICAgICAgIGV4aXN0IG9yIGNhbm5vdCBiZSBmb3VuZCAsIHRoZSBmdW5jdGlvbiBmYWlscyAuIEFmdGVyIHRoZSAKKiAgICAgICAgICAgICAgICAgICAgIGZpbGUgaGFzIGJlZW4gIGZvdW5kICwgdGhlIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBhbiBlbXB0eSAKKiAgICAgICAgICAgICAgICAgICAgIGVudHJ5IHdpdGhpbiB0aGUgZHluYW1pYyBkYXRhIGJhc2UgZW50cnkgdGFibGUgYW5kIGlmIGl0IAoqICAgICAgICAgICAgICAgICAgICAgZm91bmQgb25lICAsIGl0IGFzc29jaWF0ZXMgdGhlIGZpbGUgkWZpbGVOYW1lkiB0byB0aGF0IAoqICAgICAgICAgICAgICAgICAgICAgZW50cnkgYW5kIHJldHVybnMgdGhlIGhhbmRsZXIgb2YgdGhlIGZpbGUuCiogICAgICAgICAgICAgICJyKyIgLSBPcGVucyB0aGUgZmlsZSBmb3IgYm90aCByZWFkaW5nIGFuZCB3cml0aW5nLiBJZiB0aGUgZmlsZQoqICAgICAgICAgICAgICAgICAgICAgZG9lcyBub3QgZXhpc3Qgb3IgY2Fubm90IGJlIGZvdW5kICAsIHRoZSAgZnVuY3Rpb24gZmFpbHMuCiogICAgICAgICAgICAgICAgICAgICBBZnRlciB0aGUgZmlsZSBoYXMgYmVlbiAgZm91bmQgLCB0aGUgZnVuY3Rpb24gc2VhcmNoZXMgCiogICAgICAgICAgICAgICAgICAgICBmb3IgYW4gZW1wdHkgZW50cnkgIHdpdGhpbiB0aGUgZHluYW1pYyBkYXRhIGJhc2UgZW50cnkgCiogICAgICAgICAgICAgICAgICAgICB0YWJsZSBhbmQgaWYgIGZvdW5kICAsIGl0IGFzc29jaWF0ZXMgdGhlIGZpbGUgkWZpbGVOYW1lkiAKKiAgICAgICAgICAgICAgICAgICAgIHRvIHRoYXQgZW50cnkgYW5kIHJldHVybnMgdGhlIGhhbmRsZXIgb2YgdGhlIGZpbGUgLiBXaGVuIAoqICAgICAgICAgICAgICAgICAgICAgYSBmaWxlIGlzIG9wZW5lZCB3aXRoIHRoZSAgk3IrlCBhbGwgd3JpdGUgb3BlcmF0aW9ucyAKKiAgICAgICAgICAgICAgICAgICAgIG9jY3VyIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuIFRoZSBmaWxlIHBvaW50ZXIgY2FuIGJlIAoqICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdGlvbmVkIHVzaW5nIGZpbGVTeXNTZWVrIG9yIGZpbGVTeXNSZXdpbmQgLCBidXQgaXMgCiogICAgICAgICAgICAgICAgICAgICBhbHdheXMgbW92ZWQgYmFjayB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGJlZm9yZSBhbnkgd3JpdGUKKiAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBjYXJyaWVkIG91dC4gVGh1cyAsZXhpc3RpbmcgZGF0YSBjYW5ub3QgYmUgCiogICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdHRlbi4KKiAgICAgICAgICAgICAgInciIC0gIE9wZW5zIGFuIGVtcHR5ICBmaWxlIGZvciB3cml0aW5nIG9ubHkuIElmIHRoZSBmaWxlIGRvZXMgCiogICAgICAgICAgICAgICAgICAgICBub3QgZXhpc3QgdGhlIGZ1bmN0aW9uIHdpbGwgY3JlYXRlIGl0LCBvdGhlcndpc2UgaWYgdGhlIAoqICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gZmlsZSBleGlzdHMgdGhlIGZ1bmN0aW9uIHdpbGwgb3BlbiBpdCBidXQgaXRzIAoqICAgICAgICAgICAgICAgICAgICAgY29udGVudCAgd2lsbCBiZSAgZGVzdHJveWVkIC4gT24gYm90aCBjYXNlcyB0aGUgZnVuY3Rpb24KKiAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVzIGZvciBhbiBlbXB0eSBlbnRyeSB3aXRoaW4gdGhlIGR5bmFtaWMgZGF0YSBiYXNlCiogICAgICAgICAgICAgICAgICAgICBlbnRyeSB0YWJsZSBhbmQgaWYgIGZvdW5kICAsIGl0IGFzc29jaWF0ZXMgIHRoZSBmaWxlCiogICAgICAgICAgICAgICAgICAgICCRZmlsZU5hbWWSIHRvIHRoYXQgZW50cnkgYW5kIHJldHVybnMgdGhlIGhhbmRsZXIgb2YgdGhlCiogICAgICAgICAgICAgICAgICAgICBmaWxlIC4KKiAgICAgICAgICAgICAgIncrIiAtIE9wZW5zIGFuIGVtcHR5ICBmaWxlIGZvciBib3RoIHJlYWRpbmcgYW5kIHdyaXRpbmcgZGF0YS4gSWYKKiAgICAgICAgICAgICAgICAgICAgIHRoZSBnaXZlbiBmaWxlIGV4aXN0cywgaXRzIGNvbnRlbnRzIGlzIGRlc3Ryb3llZCAuIFdoZW4gYQoqICAgICAgICAgICAgICAgICAgICAgZmlsZSBpcyBvcGVuZWQgd2l0aCB0aGUgIncrIiBhY2Nlc3MgdHlwZSAsIGFsbCB3cml0ZSAKKiAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMgb2NjdXIgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gVGhlIGZpbGUgcG9pbnRlcgoqICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHJlcG9zaXRpb25lZCB1c2luZyBmaWxlU3lzU2VlayBvciBmaWxlU3lzUmV3aW5kICwgCiogICAgICAgICAgICAgICAgICAgICBidXQgaXMgYWx3YXlzIG1vdmVkIGJhY2sgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBiZWZvcmUgYW55CiogICAgICAgICAgICAgICAgICAgICB3cml0ZSBvcGVyYXRpb24gaXMgY2FycmllZCBvdXQuIFRodXMgLGV4aXN0aW5nIGRhdGEgY2Fubm90CiogICAgICAgICAgICAgICAgICAgICBiZSBvdmVyd3JpdHRlbi4KKiAgICAgICAgICAgICAgImErIiAtIE9wZW5zIGEgZmlsZSAgZm9yIHJlYWRpbmcgYW5kIGFwcGVuZGluZyBkYXRhLiBJZiB0aGUgZ2l2ZW4KKiAgICAgICAgICAgICAgICAgICAgIGZpbGUgZXhpc3RzICxpdHMgY29udGVudHMgaXMgZGVzdHJveWVkIC5UaGUgYXBwZW5kaW5nIAoqICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIGluY2x1ZGVzIHRoZSByZW1vdmFsIG9mIHRoZSBFT0YgbWFya2VyIGJlZm9yZSAKKiAgICAgICAgICAgICAgICAgICAgIG5ldyBkYXRhIGlzIHdyaXR0ZW4gdG8gdGhlIGZpbGUgYW5kIHRoZSBFT0YgbWFya2VyIGlzIAoqICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZWQgYWZ0ZXIgdGhlIHdyaXRpbmcgaGFzIGNvbXBsZXRlZCAgLiBXaGVuIGEgZmlsZSBpcwoqICAgICAgICAgICAgICAgICAgICAgb3BlbmVkIHdpdGggdGhlICJhKyIgYWNjZXNzIHR5cGUgLGFsbCB3cml0ZSBvcGVyYXRpb25zIAoqICAgICAgICAgICAgICAgICAgICAgb2NjdXIgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gVGhlIGZpbGUgcG9pbnRlciBjYW4gYmUgCiogICAgICAgICAgICAgICAgICAgICByZXBvc2l0aW9uZWQgdXNpbmcgZmlsZVN5c1NlZWsgb3IgZmlsZVN5c1Jld2luZCAsIGJ1dCBpcyAKKiAgICAgICAgICAgICAgICAgICAgIGFsd2F5cyBtb3ZlZCBiYWNrIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYmVmb3JlIGFueSB3cml0ZSAKKiAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBjYXJyaWVkIG91dCAuVGh1cyAsIGV4aXN0aW5nIGRhdGEgY2Fubm90IGJlIAoqICAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXR0ZW4uCiogICAgICAgZmlsZU5hbWUgLSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlIG5hbWUuIAoqCiogT1VUUFVUOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk46CiogICAgICAgRmlsZSBoYW5kbGVyIG9uIHN1Y2Nlc3Mgb3IgRklMRV9PUEVOX0VSUk9SIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIAoqICAgICAgIHJlYXNvbnM6CiogICAgICAgLSBGaWxlIHN5c3RlbSBub3QgaW5pdGlhbGl6ZWQuCiogICAgICAgLSBJbiBjYXNlcyBvZiAgdGhlIG1vZGVzICAiciIgb3IgInIrIiBhbmQgdGhlIGZpbGUgaXMgbm90IGZvdW5kLgoqICAgICAgIC0gTm8gZnJlZSBlbnRyaWVzIGluIHRoZSBmaWxlIHN5c3RlbSdzIGRhdGEgYmFzZS4KKiAgICAgICAtIEluIG1vZGVzICJ3IiBhbmQgdysiIGlmIHdlIHRyeSB0byBvcGVuIGEgZmlsZSB3aGljaCBhbHJlYWR5IGV4aXN0cyBpdCAKKiAgICAgICAgIG11c3QgYmUgZGVsZXRlZCBmaXJzdCAsIGFuIGVycm9yIGNhbiBvY2N1ciBhdCB0aGUgZGVsZXRlIGZ1bmN0aW9uLgoqICAgICAgIC0gTm8gbW9yZSBmcmVlIGVudHJpZXMgb24gdGhlIGZsYXNoIG1lbW9yeS4KKiAgICAgICAtIE5vdCBzdXBwb3J0ZWQgbW9kZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpGU19GSUxFX0hBTkRMRVIgbXZGU09wZW4oY2hhciAqIGZpbGVOYW1lLGNoYXIgKm1vZGUpCnsKICAgIHVuc2lnbmVkIGludCBmaWxlRkFUb2Zmc2V0LGZoOwoKICAgIC8qIENoZWNrIGlmIHRoZSBmaWxlIHN5c3RlbSdzIGRhdGEgYmFzZSB3YXMgaW5pdGlhbGl6ZWQgKi8KICAgIGlmKGluaXRpYWxpemF0aW9uRmxhZyAhPSBGU19GSUxFX1NZU1RFTV9JTklUSUFMSVpFRCkKICAgIHsKICAgICAgICByZXR1cm4gRlNfRklMRV9PUEVOX0VSUk9SOwogICAgfQogICAgLyogTW9kZSA9PSAiciIgb3IgInIrIiAtIHRoZSBmaWxlIG11c3QgZXhpc3QgKi8KICAgIGlmKChtb2RlWzBdID09ICdyJykgJiYgCiAgICAgICAobW9kZVsxXSA9PSAnXDAnfHwgKG1vZGVbMV0gPT0gJysnICYmIG1vZGVbMl0gPT0gJ1wwJykpKQogICAgewogICAgICAgIGZpbGVGQVRvZmZzZXQgPSBtdkZTRmlsZUZpbmQoZmlsZU5hbWUpOwogICAgICAgIGlmKGZpbGVGQVRvZmZzZXQgPT0gRlNfRklMRV9OT1RfRk9VTkQpCiAgICAgICAgICAgIHJldHVybiBGU19GSUxFX09QRU5fRVJST1I7CiAgICAgICAgZm9yKGZoID0gMCA7IGZoIDwgRlNfTUFYX05VTV9PRl9FTlRSSUVTIDsgZmgrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmKG12RlNFbnRyaWVzW2ZoXS5zdGF0dXNGbGFnID09IEZTX0ZSRUVfRU5UUlkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZoXS5zdGF0dXNGbGFnICAgID0gRlNfRU5UUllfSU5fVVNFOwogICAgICAgICAgICAgICAgbXZGU0VudHJpZXNbZmhdLmZpbGVQb2ludGVyICAgPSAwOwogICAgICAgICAgICAgICAgbXZGU0VudHJpZXNbZmhdLm1vZGVbMF0gICAgICAgPSBtb2RlWzBdOwogICAgICAgICAgICAgICAgbXZGU0VudHJpZXNbZmhdLm1vZGVbMV0gICAgICAgPSBtb2RlWzFdOwogICAgICAgICAgICAgICAgbXZGU0VudHJpZXNbZmhdLm1vZGVbMl0gICAgICAgPSBtb2RlWzJdOwogICAgICAgICAgICAgICAgbXZGU0VudHJpZXNbZmhdLnBvaW50ZXJUb0ZBVCAgPSBmaWxlRkFUb2Zmc2V0OwogICAgICAgICAgICAgICAgbXZGU0VudHJpZXNbZmhdLkVPRnBvaW50ZXIgICAgPSBtdkZTR2V0RU9Gb2Zmc2V0KGZpbGVOYW1lKTsKICAgICAgICAgICAgICAgIHJldHVybiBmaDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gRlNfRklMRV9PUEVOX0VSUk9SOwogICAgfQogICAgLyogTW9kZSA9PSAidyIgLCJ3KyIgb3IgImErIiAqLwogICAgaWYoKG1vZGVbMF0gPT0gJ3cnIHx8IG1vZGVbMF0gPT0gJ2EnKSAmJgogICAgICAgKG1vZGVbMV0gPT0gJ1wwJ3x8KG1vZGVbMV0gPT0gJysnICYmIG1vZGVbMl0gPT0gJ1wwJykpKQogICAgewogICAgICAgIC8qIENoZWNrIGlmIHRoZSBmaWxlIGV4aXN0cyBvbiB0aGUgc3lzdGVtICovCiAgICAgICAgZmlsZUZBVG9mZnNldCA9IG12RlNGaWxlRmluZChmaWxlTmFtZSk7CiAgICAgICAgaWYoZmlsZUZBVG9mZnNldCAhPSBGU19GSUxFX05PVF9GT1VORCkKICAgICAgICB7CiAgICAgICAgICAgIGlmKCBtb2RlWzBdICE9ICdhJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYobXZGU0RlbGV0ZShmaWxlTmFtZSkgIT0gRlNfRklMRV9ERUxFVEVEKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBGU19GSUxFX09QRU5fRVJST1I7CiAgICAgICAgICAgICAgICAvKiBHZXQgYSBmcmVlIGVudHJ5IG9uIHRoZSBGQVQgKi8KICAgICAgICAgICAgICAgIGZpbGVGQVRvZmZzZXQgPSBtdkZTR2V0RnJlZUVudHJ5KCk7CiAgICAgICAgICAgICAgICBpZihmaWxlRkFUb2Zmc2V0ID09IEZTX05PX0ZSRUVfRU5UUklFUykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRlNfRklMRV9PUEVOX0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8qIEdldCBhIGZyZWUgZW50cnkgb24gdGhlIEZBVCAqLwogICAgICAgICAgICBmaWxlRkFUb2Zmc2V0ID0gbXZGU0dldEZyZWVFbnRyeSgpOwogICAgICAgICAgICBpZihmaWxlRkFUb2Zmc2V0ID09IEZTX05PX0ZSRUVfRU5UUklFUykKICAgICAgICAgICAgICAgIHJldHVybiBGU19GSUxFX09QRU5fRVJST1I7CiAgICAgICAgfQogICAgICAgIC8qIFNlYXJjaCBmb3IgYSBmcmVlIGVudHJ5IG9uIHRoZSBmaWxlIHN5c3RlbSdzIGRhdGEgYmFzZSAqLwogICAgICAgIGZvcihmaCA9IDAgOyBmaCA8IEZTX01BWF9OVU1fT0ZfRU5UUklFUyA7IGZoKyspCiAgICAgICAgewogICAgICAgICAgICBpZihtdkZTRW50cmllc1tmaF0uc3RhdHVzRmxhZyA9PSBGU19GUkVFX0VOVFJZKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtdkZTRW50cmllc1tmaF0uc3RhdHVzRmxhZyAgPSBGU19FTlRSWV9JTl9VU0U7CiAgICAgICAgICAgICAgICBtdkZTRW50cmllc1tmaF0uZmlsZVBvaW50ZXIgPSAwOwogICAgICAgICAgICAgICAgbXZGU0VudHJpZXNbZmhdLm1vZGVbMF0gICAgID0gbW9kZVswXTsKICAgICAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZoXS5tb2RlWzFdICAgICA9IG1vZGVbMV07CiAgICAgICAgICAgICAgICBtdkZTRW50cmllc1tmaF0ubW9kZVsyXSAgICAgPSBtb2RlWzJdOwogICAgICAgICAgICAgICAgbXZGU0VudHJpZXNbZmhdLnBvaW50ZXJUb0ZBVD0gZmlsZUZBVG9mZnNldDsKICAgICAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZoXS5FT0Zwb2ludGVyICA9IG12RlNHZXRFT0ZvZmZzZXQoZmlsZU5hbWUpOwogICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBlbnRyeSBvbiB0aGUgRkFUICovCiAgICAgICAgICAgICAgICAvKiBXcml0ZSB0aGUgZmlsZSdzIG5hbWUgKi8KICAgICAgICAgICAgICAgIG12RlNXcml0ZUZpbGVOYW1lVG9GQVRlbnRyeShmaWxlRkFUb2Zmc2V0LGZpbGVOYW1lKTsKICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgc3RhdHVzIGZsYWcgKi8KICAgICAgICAgICAgICAgIG12Rmxhc2g4V3IobXZGbGFzaEluZm8sIGZpbGVGQVRvZmZzZXQgKyBGU19FTlRSWV9TVEFUVVNfRkxBR19PRkZTRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19FTlRSWV9JTl9VUERBVEUpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZoOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBGU19GSUxFX09QRU5fRVJST1I7CiAgICB9CiAgICByZXR1cm4gRlNfRklMRV9PUEVOX0VSUk9SOyAvKiBIYXMgbm8gbWVhbmluZywganVzdCBmb3IgdGhlIGNvbXBpbGVyICovCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbXZGU0Nsb3NlIC0gQ2xvc2VzIGEgZmlsZS4KKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgZnVuY3Rpb24gY2xvc2VzIGEgZmlsZSBieSByZW1vdmluZyB0aGUgZmlsZSdzIGVudHJ5IGZyb20gdGhlIGZpbGUgCiogICAgICAgc3lzdGVtJ3MgZGF0YSBiYXNlICwgIHVwZGF0aW5nICB0aGUgZmlsZSdzIEZBVCBlbnRyeSBhbmQgZGF0YSBibG9jaydzIAoqICAgICAgIHN0YXR1cyBmbGFncyBhbmQgb2Zmc2V0IC4gQWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uICwgdGhlIHZpcnR1YWwgRU9GCiogICAgICAgY2hhcmFjdGVyIGlzIGNyZWF0ZWQgYnkgdXBkYXRpbmcgdGhlIGxhc3QgYmxvY2uScyAgOSBiaXRzIG9mIHRoZSBuZXh0IAoqICAgICAgIGJsb2NrIHBvaW50ZXIgaWYgZGF0YSB3YXMgbm90IGFwcGVuZGVkIHRvIHRoYXQgYmxvY2sgLiBJZiBkYXRhIHdhcyAKKiAgICAgICBhcHBlbmRlZCAsIHRoZSBvZmZzZXQgZmllbGQgb2YgdGhlIGxhc3QgYmxvY2sgb2YgZGF0YSB3aWxsIGJlIHVwZGF0ZWQgCiogICAgICAgKGFzIGRlc2NyaWJlZCBhdCB0aGUgSW50cm9kdWN0aW9uICkuCioKKiBJTlBVVDoKKiAgICAgICBmaWxlTmFtZSAtIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGZpbGUgbmFtZS4KKgoqIE9VVFBVVDoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOOgoqICAgICAgIFRoZSByZXR1cm4gdmFsdWUgY2FuIGJlIGVpdGhlciBGU19GSUxFX0NMT1NFRCBvbiBzZWNjZXNzIG9yIAoqICAgICAgIEZJTEVfQ0xPU0VfRVJST1IgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczoKKiAgICAgICAtIElmIHRoZSBoYW5kbGVyIGlzIG91dCBvZiByYW5nZSAoYmlnZ2VyIG9yIGVxdWFsIHRvIE1BWF9OVU1fT0ZfRU5UUklFUwoqICAgICAgICAgZGVmaW5kIGluIG12RlMuaCkuCiogICAgICAgLSBJZiB0aGUgaGFuZGxlciBwb2ludHMgdG8gYW4gZW50cnkgd2l0aCBhIEZSRUVfRU5UUlkgc3RhdHVzLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnVuc2lnbmVkIGludCBtdkZTQ2xvc2UoRlNfRklMRV9IQU5ETEVSIGZpbGVIYW5kbGVyKQp7CiAgICB1bnNpZ25lZCBpbnQgRkFUZW50cnlPZmZzZXQsbmV4dEJsb2NrUG9pbnRlcixwcmV2QmxvY2tQb2ludGVyOwogICAgdW5zaWduZWQgaW50IG9mZnNldDsKCiAgICBpZihmaWxlSGFuZGxlciA+PSBGU19NQVhfTlVNX09GX0VOVFJJRVMpIAogICAgICAgIHJldHVybiBGU19GSUxFX0NMT1NFX0VSUk9SOwogICAgaWYobXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLnN0YXR1c0ZsYWcgPT0gRlNfRlJFRV9FTlRSWSkKICAgICAgICByZXR1cm4gRlNfRklMRV9DTE9TRV9FUlJPUjsKICAgIC8qIG1vZGUgPSAiciIgKi8KICAgIGlmKG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5tb2RlWzBdID09ICdyJyAmJgogICAgICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLm1vZGVbMV0gPT0gJ1wwJykKICAgIHsKICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uc3RhdHVzRmxhZyA9IEZTX0ZSRUVfRU5UUlk7CiAgICAgICAgcmV0dXJuIEZTX0ZJTEVfQ0xPU0VEOwogICAgfQogICAgLyogbW9kZSA9ICJyKyIsInciLCJ3KyIgb3IgImErIiAqLwogICAgRkFUZW50cnlPZmZzZXQgPSBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0ucG9pbnRlclRvRkFUOwogICAgLyogRW1wdHkgZmlsZSA9PiBuZXh0IGJsb2NrIHBvaW50ZXIgPT0gMHhGRkZGRkZGRiAqLwogICAgbmV4dEJsb2NrUG9pbnRlciA9IG12Rmxhc2gzMlJkKG12Rmxhc2hJbmZvLCBGQVRlbnRyeU9mZnNldCk7CiAgICBpZihuZXh0QmxvY2tQb2ludGVyID09IDB4ZmZmZmZmZmYpCiAgICB7CiAgICAgICAgaWYobXZGbGFzaDhSZChtdkZsYXNoSW5mbywgRkFUZW50cnlPZmZzZXQgKyBGU19FTlRSWV9TVEFUVVNfRkxBR19PRkZTRVQpID09IAogICAgICAgICAgIEZTX0VOVFJZX0lOX1VQREFURSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgZmlsZSdzIGVudHJ5IHN0YXR1cyBmbGFnICovCiAgICAgICAgICAgIG12Rmxhc2g4V3IobXZGbGFzaEluZm8sIEZBVGVudHJ5T2Zmc2V0ICsgRlNfRU5UUllfU1RBVFVTX0ZMQUdfT0ZGU0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0VOVFJZX0lOX1VTRSk7CiAgICAgICAgfQogICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5zdGF0dXNGbGFnID0gRlNfRlJFRV9FTlRSWTsKICAgICAgICByZXR1cm4gRlNfRklMRV9DTE9TRUQ7CiAgICB9CiAgICAvKiBzZWFyY2ggZm9yIHRoZSBsYXN0IGJsb2NrICovCiAgICBwcmV2QmxvY2tQb2ludGVyID0gRkFUZW50cnlPZmZzZXQ7CiAgICB3aGlsZShtdkZsYXNoMzJSZChtdkZsYXNoSW5mbywgbmV4dEJsb2NrUG9pbnRlciAmIAogICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0JMT0NLX09GRlNFVF9NQVNLKSAhPSAweGZmZmZmZmZmKQogICAgewogICAgICAgIHByZXZCbG9ja1BvaW50ZXIgPSBuZXh0QmxvY2tQb2ludGVyOwogICAgICAgIG5leHRCbG9ja1BvaW50ZXIgPSBtdkZsYXNoMzJSZChtdkZsYXNoSW5mbywgbmV4dEJsb2NrUG9pbnRlciAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfQkxPQ0tfT0ZGU0VUX01BU0spOwogICAgfQogICAgCiAgICBpZihtdkZsYXNoOFJkKG12Rmxhc2hJbmZvLCAobmV4dEJsb2NrUG9pbnRlciAmIEZTX0JMT0NLX09GRlNFVF9NQVNLKSAKICAgICAgICAgICAgICAgICAgICAgKyBGU19CTE9DS19TVEFUVVNfRkxBR19PRkZTRVQpID09IEZTX0JMT0NLX0lOX1VTRSkKICAgIHsKICAgICAgICAvKiBPbGQgYmxvY2ssIG5lZWQgdG8gdXNlIHRoZSBvZmZzZXQgZmllbGQgKi8KICAgICAgICBpZighKChtdkZsYXNoOFJkKG12Rmxhc2hJbmZvLCAobmV4dEJsb2NrUG9pbnRlciAmIEZTX0JMT0NLX09GRlNFVF9NQVNLKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRlNfQkxPQ0tfT0ZGU0VUX0ZMQUdfT0ZGU0VUKSA9PSBGU19GVUxMX0JMT0NLKSB8fAogICAgICAgICAgIChtdkZsYXNoMTZSZChtdkZsYXNoSW5mbywgKG5leHRCbG9ja1BvaW50ZXIgJiBGU19CTE9DS19PRkZTRVRfTUFTSykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRlNfQkxPQ0tfT0ZGU0VUX09GRlNFVCkgIT0gMHhmZmZmKSkpCiAgICAgICAgewogICAgICAgICAgICAvKiBGaWxlIHdhcyBtb2RpZmllZCAqLwogICAgICAgICAgICAvKiBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgb2Zmc2V0IGZpZWxkICovCiAgICAgICAgICAgIGlmKHByZXZCbG9ja1BvaW50ZXIgPT0gRkFUZW50cnlPZmZzZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9mZnNldCA9IG12Rmxhc2gzMlJkKG12Rmxhc2hJbmZvLCBwcmV2QmxvY2tQb2ludGVyKSAmIEZTX0JMT0NLX09GRlNFVDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9mZnNldCA9IG12Rmxhc2gzMlJkKG12Rmxhc2hJbmZvLCBwcmV2QmxvY2tQb2ludGVyICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19CTE9DS19PRkZTRVRfTUFTSykgJiBGU19CTE9DS19PRkZTRVQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2Zmc2V0ID0gKG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5FT0Zwb2ludGVyIAogICAgICAgICAgICAgICAgICAgICAgJiBGU19CTE9DS19PRkZTRVQpIC0gb2Zmc2V0OwogICAgICAgICAgICBtdkZsYXNoMTZXcihtdkZsYXNoSW5mbywgKG5leHRCbG9ja1BvaW50ZXIgJiBGU19CTE9DS19PRkZTRVRfTUFTSykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGU19CTE9DS19PRkZTRVRfT0ZGU0VULG9mZnNldCk7CiAgICAgICAgfQogICAgICAgIC8qIGVsc2UgLSBGaWxlIG5vdCBtb2RpZmllZCAqLwogICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5zdGF0dXNGbGFnID0gRlNfRlJFRV9FTlRSWTsKICAgICAgICByZXR1cm4gRlNfRklMRV9DTE9TRUQ7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLyogVXBkYXRlIHRoZSBibG9jaydzIHN0YXR1cyBmbGFnICovCiAgICAgICAgbXZGbGFzaDhXcihtdkZsYXNoSW5mbywgKG5leHRCbG9ja1BvaW50ZXIgJiBGU19CTE9DS19PRkZTRVRfTUFTSykgKyAKICAgICAgICAgICAgICAgICAgICAgICBGU19CTE9DS19TVEFUVVNfRkxBR19PRkZTRVQsRlNfQkxPQ0tfSU5fVVNFKTsKICAgICAgICAvKiBVcGRhdGUgdGhlIG9mZnNldCBhdCB0aGUgcHJldmlvdXMgYmxvY2sncyBuZXh0IGJsb2NrIHBvaW50ZXIgKi8KICAgICAgICBvZmZzZXQgPSBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uRU9GcG9pbnRlciAmIEZTX0JMT0NLX09GRlNFVDsKICAgICAgICBpZihwcmV2QmxvY2tQb2ludGVyICE9IEZBVGVudHJ5T2Zmc2V0KQogICAgICAgIHsKICAgICAgICAgICAgb2Zmc2V0ID0gKG12Rmxhc2gzMlJkKG12Rmxhc2hJbmZvLCBwcmV2QmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spIAogICAgICAgICAgICAgICAgICAgICAgJiBGU19CTE9DS19PRkZTRVRfTUFTSykgfCBvZmZzZXQ7CiAgICAgICAgICAgIG12Rmxhc2gzMldyKG12Rmxhc2hJbmZvLCBwcmV2QmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0ssb2Zmc2V0KTsKICAgICAgICB9IAogICAgICAgIGVsc2UgLyogcHJldkJsb2NrUG9pbnRlciA9PSBGQVRlbnRyeU9mZnNldCAqLwogICAgICAgIHsKICAgICAgICAgICAgb2Zmc2V0ID0gKG12Rmxhc2gzMlJkKG12Rmxhc2hJbmZvLCBwcmV2QmxvY2tQb2ludGVyKSAmIEZTX0JMT0NLX09GRlNFVF9NQVNLKSAKICAgICAgICAgICAgICAgICAgICAgIHwgb2Zmc2V0OwogICAgICAgICAgICBtdkZsYXNoMzJXcihtdkZsYXNoSW5mbywgcHJldkJsb2NrUG9pbnRlciwgb2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLnN0YXR1c0ZsYWcgPSBGU19GUkVFX0VOVFJZOwogICAgfQogICAgcmV0dXJuIEZTX0ZJTEVfQ0xPU0VEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG12RlNGaWxlU2l6ZSAtIENvdW50cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBmaWxlIGNvbnNpc3Qgb2YuCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIGZ1bmN0aW9uIGNvdW50cyBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIGZpbGUgY29uc2lzdCBvZi4KKiAgICAgICBJZiB0aGUgZmlsZSBoYW5kbGVyIGRlbGl2ZXJlZCB0byB0aGUgZnVuY3Rpb24gaXMgZXJyb25lb3VzIHRoZSBmdW5jdGlvbgoqICAgICAgIHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSAweEZGRkZGRkZGLiAKKgoqIElOUFVUOgoqICAgICAgIGZpbGVIYW5kbGVyIC0gVGhlIGZpbGUgaGFuZGxlciB0byBjb3VudCBpdHMgYnl0ZXMuCioKKiBPVVRQVVQ6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTjoKKiAgICAgICBUaGUgZmlsZSdzIG51bWJlciBvZiBieXRlcyBvZiB0aGUgb24gc3VjY2VzcyBvciAweEZGRkZGRkZGIG9uIGZhaWxpZXIuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdW5zaWduZWQgaW50IG12RlNGaWxlU2l6ZShGU19GSUxFX0hBTkRMRVIgZmlsZUhhbmRsZXIpCnsKICAgIHVuc2lnbmVkIGludCBudW1PZkJ5dGVzID0gMCxuZXh0QmxvY2tQb2ludGVyOwogICAgCiAgICBpZigoZmlsZUhhbmRsZXIgPj0gRlNfTUFYX05VTV9PRl9FTlRSSUVTKSB8fAogICAgICAgKG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5zdGF0dXNGbGFnID09IEZTX0ZSRUVfRU5UUlkpKQogICAgICAgIHJldHVybiAweGZmZmZmZmZmOwogICAgbmV4dEJsb2NrUG9pbnRlciA9IG12Rmxhc2gzMlJkKG12Rmxhc2hJbmZvLCBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0ucG9pbnRlclRvRkFUKTsKICAgIGlmKG5leHRCbG9ja1BvaW50ZXIgPT0gMHhmZmZmZmZmZikKICAgICAgICByZXR1cm4gMDsKICAgIHdoaWxlKG5leHRCbG9ja1BvaW50ZXIgIT0gMHhmZmZmZmZmZikKICAgIHsKICAgICAgICBpZigoKG5leHRCbG9ja1BvaW50ZXIgJiBGU19CTE9DS19PRkZTRVQpICsgMSkgIT0gRlNfQkxPQ0tfU0laRSkKICAgICAgICB7CiAgICAgICAgICAgIGlmKG12Rmxhc2g4UmQobXZGbGFzaEluZm8sIChuZXh0QmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfQkxPQ0tfT0ZGU0VUX0ZMQUdfT0ZGU0VUKSA9PSBGU19GVUxMX0JMT0NLKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBudW1PZkJ5dGVzICs9IChGU19CTE9DS19TSVpFIC0gRlNfQkxPQ0tfSEVBREVSX1NJWkUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYobXZGbGFzaDE2UmQobXZGbGFzaEluZm8sIChuZXh0QmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0JMT0NLX09GRlNFVF9PRkZTRVQpICE9IDB4ZmZmZikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBudW1PZkJ5dGVzICs9ICgobmV4dEJsb2NrUG9pbnRlciAmIEZTX0JMT0NLX09GRlNFVCkgKwogICAgICAgICAgICAgICAgICAgICAgICBtdkZsYXNoMTZSZChtdkZsYXNoSW5mbywgKG5leHRCbG9ja1BvaW50ZXIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfQkxPQ0tfT0ZGU0VUX01BU0spICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0JMT0NLX09GRlNFVF9PRkZTRVQpIC0gCiAgICAgICAgICAgICAgICAgICAgICAgIEZTX0JMT0NLX0hFQURFUl9TSVpFICsgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbnVtT2ZCeXRlcyArPSAoKG5leHRCbG9ja1BvaW50ZXIgJiBGU19CTE9DS19PRkZTRVQpIC0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfQkxPQ0tfSEVBREVSX1NJWkUgKyAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgaWYoKG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5FT0Zwb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spID09CiAgICAgICAgICAgICAgIChuZXh0QmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spKSAvKiBMYXN0IGJsb2NrICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG51bU9mQnl0ZXMgKz0gKChtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uRU9GcG9pbnRlciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgRlNfQkxPQ0tfT0ZGU0VUKS0gRlNfQkxPQ0tfSEVBREVSX1NJWkUgKyAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG51bU9mQnl0ZXMgKz0gKEZTX0JMT0NLX1NJWkUgLSBGU19CTE9DS19IRUFERVJfU0laRSk7IAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5leHRCbG9ja1BvaW50ZXIgPSBtdkZsYXNoMzJSZChtdkZsYXNoSW5mbywgbmV4dEJsb2NrUG9pbnRlciAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfQkxPQ0tfT0ZGU0VUX01BU0spOwogICAgfQogICAgaWYobnVtT2ZCeXRlcyA9PSAwKQogICAgICAgIHJldHVybiAwOwogICAgcmV0dXJuIG51bU9mQnl0ZXM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbXZGU0dldEVPRm9mZnNldCAtIEdldHMgdGhlIGZpbGUncyBFT0Ygb2Zmc2V0IGluIHRoZSBmbGFzaCBtZW1vcnkuCioKKiBERVNDUklQVElPTjoKKiAgICAgIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIHRoZSBmaWxlknMgRU9GIG9mZnNldCByZWxhdGl2ZWx5IHRvIHRoZSAKKiAgICAgIGJlZ2luaW5nIG9mIHRoZSBsYXN0IGJsb2NrIG9mZnNldCAuIFRoZSBFT0Ygb2Zmc2V0IGNvdWxkIGJlIGVpdGhlciB0aGUgOSAKKiAgICAgIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIG5leHQgYmxvY2sgcG9pbnRlciBvciAsIGlmIGRhdGEgd2FzIAoqICAgICAgYXBwZW5kZWQgdG8gbGFzdCBibG9jayAsIHRoZSBvZmZzZXQgZmllbGQgd2l0aGluIHRoYXQgYmxvY2sgLiAgCioKKiBJTlBVVDoKKiAgICAgIGZpbGVOYW1lIC0gVGhlIGZpbGUgbmFtZSB0byBnZXQgaXRzIEVPRiBvZmZzZXQgLgoqCiogT1VUUFVUOgoqICAgICAgTm9uZS4KKgoqIFJFVFVSTjoKKiAgICAgIFRoZSBmaWxlJ3MgRU9GIG9mZnNldCBvciBGSUxFX05PVF9GT1VORC4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp1bnNpZ25lZCBpbnQgbXZGU0dldEVPRm9mZnNldChjaGFyICogZmlsZU5hbWUpCnsKICAgIHVuc2lnbmVkIGludCBFT0ZvZmZzZXQgPSAwLGZpbGVGQVRvZmZzZXQsbmV4dEJsb2NrT2Zmc2V0OwogICAgCiAgICBmaWxlRkFUb2Zmc2V0ID0gbXZGU0ZpbGVGaW5kKGZpbGVOYW1lKTsKICAgIGlmKGZpbGVGQVRvZmZzZXQgPT0gRlNfRklMRV9OT1RfRk9VTkQpCiAgICAgICAgcmV0dXJuIEZTX0ZJTEVfTk9UX0ZPVU5EOwogICAgbmV4dEJsb2NrT2Zmc2V0ID0gbXZGbGFzaDMyUmQobXZGbGFzaEluZm8sIGZpbGVGQVRvZmZzZXQpOwogICAgaWYobmV4dEJsb2NrT2Zmc2V0ID09IDB4ZmZmZmZmZmYpCiAgICAgICAgcmV0dXJuIDA7CiAgICB3aGlsZShuZXh0QmxvY2tPZmZzZXQgIT0gMHhmZmZmZmZmZikKICAgIHsKICAgICAgICBFT0ZvZmZzZXQgPSBuZXh0QmxvY2tPZmZzZXQ7CiAgICAgICAgbmV4dEJsb2NrT2Zmc2V0ID0gbXZGbGFzaDMyUmQobXZGbGFzaEluZm8sIG5leHRCbG9ja09mZnNldCAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19CTE9DS19PRkZTRVRfTUFTSyk7CiAgICB9CiAgICBuZXh0QmxvY2tPZmZzZXQgPSBFT0ZvZmZzZXQgJiBGU19CTE9DS19PRkZTRVRfTUFTSzsKICAgIGlmKG12Rmxhc2g4UmQobXZGbGFzaEluZm8sIG5leHRCbG9ja09mZnNldCArIEZTX0JMT0NLX09GRlNFVF9GTEFHX09GRlNFVCkgPT0KICAgICAgIEZTX0ZVTExfQkxPQ0spCiAgICB7CiAgICAgICAgRU9Gb2Zmc2V0ID0gbmV4dEJsb2NrT2Zmc2V0ICsgKEZTX0JMT0NLX1NJWkUgLSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfQkxPQ0tfSEVBREVSX1NJWkUgLSAxKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZihtdkZsYXNoMTZSZChtdkZsYXNoSW5mbywgbmV4dEJsb2NrT2Zmc2V0ICsgRlNfQkxPQ0tfT0ZGU0VUX09GRlNFVCkgCiAgICAgICAgICAgIT0gMHhmZmZmKQogICAgICAgIHsKICAgICAgICAgICAgRU9Gb2Zmc2V0ID0gRU9Gb2Zmc2V0ICsgbXZGbGFzaDE2UmQobXZGbGFzaEluZm8sIG5leHRCbG9ja09mZnNldCArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19CTE9DS19PRkZTRVRfT0ZGU0VUKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEVPRm9mZnNldDsgLyogTm90IG5lY2Vzc2FyeSAtIGp1c3QgZm9yIHJlYWRhYmlsaXR5ICovICAKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gRU9Gb2Zmc2V0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG12RlNHZXRGcmVlQmxvY2tGb3JXcml0ZSAtIFJldHVybnMgdGhlIG9mZnNldCBvZiBhIGZyZWUgYmxvY2sgKGlmIGZvdW5kKS4KKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIGEgZnJlZSBibG9jayAgaW4gbW9yZSBlZmZpY2llbnQgd2F5IHRoYW4gIAoqICAgICAgIJFmaWxlU3lzR2V0RnJlZUJsb2NrkiAgZnVuY3Rpb24gYnkgIHNhdmluZyB0aGUgbGFzdCBmcmVlIGJsb2NrIG9mZnNldCAKKiAgICAgICB0aGF0IHdhcyBmb3VuZCBpbiB0aGUgcHJldmlvdXMgc2VhcmNoIGFuZCBzZWFyY2hlcyBmcm9tIHRoYXQgcG9pbnQuIEluIAoqICAgICAgIGNhc2UgaXQgY291bGRudCBmaW5kIGEgZnJlZSBibG9jayAsIGl0IHVzZXMgdGhlIGZ1bmN0aW9uIAoqICAgICAgIJFmaWxlU3lzR2V0RnJlZUJsb2Nrki4gIAoqICAgICAgTk9URToKKiAgICAgICBUaGUgZmlsZSBzeXN0ZW0ncyBkYXRhIGJhc2UgbXVzdCBiZSBpbml0aWFsaXplZCBieSCRZmlsZVN5c0luaXSSIAoqICAgICAgIGZ1bmN0aW9uIGJlZm9yZSB1c2luZyAgdGhpcyBmdW5jdGlvbiAuCiogICAgICAgSWYgZHVyaW5nIHRoZSBjb3B5aW5nIG9mIHRoZSBzZWN0b3IgY29udGFpbmluZyB0aGUgbW9zdCBmcmVlIGRpcnR5IGJsb2NrCiogICAgICAgdG8gdGhlIGR5bmFtaWMgbWVtb3J5IHRoZSBzeXN0ZW0gd2lsbCBsb29zZSBwb3dlciB0aGUgZmlsZSBzeXN0ZW0gd2lsbCAKKiAgICAgICBjcmFzaC4gIAoqICAKKiBJTlBVVDoKKiAgICAgICBOb25lLgoqCiogT1VUUFVUOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk46CiogICAgICAgT2Zmc2V0IHRvIGEgZnJlZSBibG9jayAsIEZTX05PX0ZSRUVfQkxPQ0tTIGlmIHRoZXJlIGFyZSBubyBtb3JlIGZyZWUKKiAgICAgICBibG9ja3Mgb3IgdGhlIGZpbGUgc3lzdGVtIHdhcyBub3QgaW5pdGlsaXplZCAodXNlIJFmaWxlU3lzSW5pdJIgYmVmb3JlIAoqICAgICAgIHVzaW5nIHRoaXMgZnVuY3Rpb24gaW4gdGhhdCBjYXNlKS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp1bnNpZ25lZCBpbnQgbXZGU0dldEZyZWVCbG9ja0ZvcldyaXRlKCkKewogICAgdW5zaWduZWQgY2hhciAgICAgICBzdGF0dXM7CgogICAgbmV4dEZyZWVCbG9jayArPSBGU19CTE9DS19TSVpFOwogICAgaWYoKG5leHRGcmVlQmxvY2sgPT0gMHhmZmZmZmZmZikgfHwgCiAgICAgICAoKG5leHRGcmVlQmxvY2sgIT0gMHhmZmZmZmZmZikgJiYgKG5leHRGcmVlQmxvY2sgPj0gbXZGU1RvcE9mZnNldCkpKQogICAgewogICAgICAgIG5leHRGcmVlQmxvY2sgPSBtdkZTR2V0RnJlZUJsb2NrKCk7CiAgICAgICAgcmV0dXJuIG5leHRGcmVlQmxvY2s7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgd2hpbGUoMSkKICAgICAgICB7CiAgICAgICAgICAgIHN0YXR1cyA9IG12Rmxhc2g4UmQobXZGbGFzaEluZm8sIG5leHRGcmVlQmxvY2sgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0JMT0NLX1NUQVRVU19GTEFHX09GRlNFVCk7CiAgICAgICAgICAgIGlmKHN0YXR1cyA9PSBGU19GUkVFX0JMT0NLKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRGcmVlQmxvY2s7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dEZyZWVCbG9jayArPSBGU19CTE9DS19TSVpFOwogICAgICAgICAgICBpZihuZXh0RnJlZUJsb2NrID49IG12RlNUb3BPZmZzZXQgfHwgc3RhdHVzID09IEZTX0ZSRUVfRElSVFlfQkxPQ0spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5leHRGcmVlQmxvY2sgPSBtdkZTR2V0RnJlZUJsb2NrKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dEZyZWVCbG9jazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBtdkZTR2V0RnJlZUJsb2NrIC0gUmV0dXJucyB0aGUgb2Zmc2V0IG9mIGEgZnJlZSBibG9jayAoaWYgZm91bmQpLgoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYSBmcmVlIGJsb2NrIGZyb20gdGhlIGJlZ2luaW5nIG9mIHRoZSBmaWxlIAoqICAgICAgIHN5c3RlbSAoIGZyb20gkWZpbGVTeXNPZmZzZXSSIHBhcmFtZXRlciBpbml0aWFsaXplZCBieSCRZmlsZVN5c0luaXSSIAoqICAgICAgIGZ1bmN0aW9uICkgdG8gdGhlIGxhc3Qgc2VjdG9yIGFuZCByZXR1cm4gaXRzIG9mZnNldCBpbiBjYXNlIGl0IGZvdW5kIAoqICAgICAgIG9uZSAuV2hpbGUgdGhlIGZ1bmN0aW9uIHBlcmZvcm0gdGhlIHNlYXJjaCBmb3IgYSBmcmVlIGJsb2NrIHdpdGhpbiBlYWNoCiogICAgICAgc2VjdG9yIGl0IGFsc28gc2VhcmNoZXMgZm9yIHRoZSBzZWN0b3IgY29udGFpbmluZyB0aGUgbW9zdCBmcmVlIGRpcnR5IAoqICAgICAgIGJsb2NrIGluIGNhc2UgYSBmcmVlIGJsb2NrIHdpbGwgbm90IGJlIGZvdW5kIC5JZiBpbmRlZWQgYSBmcmVlIGJsb2NrIHdhcwoqICAgICAgIG5vdCBmb3VuZCAsdGhlIGZ1bmN0aW9uIGVyYXNlcyB0aGF0IHNlY3RvciAoIHRoZSBvbmUgd2l0aCB0aGUgbW9zdCBmcmVlIAoqICAgICAgIGRpcnR5IGJsb2NrcyApIGFmdGVyIGNvcHlpbmcgaXQgdG8gYSB0ZW1wb3JhcnkgYnVmZmVyIGluIHRoZSBkeW5hbWljIAoqICAgICAgIG1lbW9yeSAoU0RSQU0pIGFuZCAgd3JpdGUgYmFjayBvbmx5IHRoZSB2YWxpZCBibG9ja3MgdG8gaXQgLkluIHRoYXQgd2F5CiogICAgICAgdGhlIGZ1bmN0aW9uIGZyZWUgYmxvY2tzIGZyb20gdGhlIHNlY3RvciBjb250YWluaW5nIHRoZSBtb3N0IGZyZWUgZGlydHkgCiogICAgICAgYmxvY2tzIGFuZCByZXR1cm4gdGhlIG5leHQgZnJlZSBibG9jayB3aXRoaW4gdGhhdCBzZWN0b3IuICAgCiogICAgICBOT1RFOgoqICAgICAgIFRoZSBmaWxlIHN5c3RlbSdzIGRhdGEgYmFzZSBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IJFmaWxlU3lzSW5pdJIgCiogICAgICAgZnVuY3Rpb24gYmVmb3JlIHVzaW5nICB0aGlzIGZ1bmN0aW9uIC4KKiAgICAgICBJZiBkdXJpbmcgdGhlIGNvcHlpbmcgb2YgdGhlIHNlY3RvciBjb250YWluaW5nIHRoZSBtb3N0IGZyZWUgZGlydHkgYmxvY2sKKiAgICAgICB0byB0aGUgZHluYW1pYyBtZW1vcnkgdGhlIHN5c3RlbSB3aWxsIGxvb3NlIHBvd2VyIHRoZSBmaWxlIHN5c3RlbSB3aWxsIAoqICAgICAgIGNyYXNoLgoqICAgCiogSU5QVVQ6CiogICAgICAgTm9uZS4KKgoqIE9VVFBVVDoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOOgoqICAgICAgIE9mZnNldCB0byBhIGZyZWUgYmxvY2sgLCBOT19GUkVFX0JMT0NLUyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBmcmVlIGJsb2NrcwoqICAgICAgIG9yIHRoZSBmaWxlIHN5c3RlbSB3YXMgbm90IGluaXRpbGl6ZWQgKHVzZSCRZmlsZVN5c0luaXSSIGJlZm9yZSB1c2luZyAKKiAgICAgICB0aGlzIGZ1bmN0aW9uIGluIHRoYXQgY2FzZSkuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdW5zaWduZWQgaW50IG12RlNHZXRGcmVlQmxvY2soKQp7CiAgICB1bnNpZ25lZCBpbnQgZnJlZUJsb2NrT2Zmc2V0LHNlY3RvclRvcE9mZnNldCxpOwogICAgdW5zaWduZWQgaW50IG1heEZyZWVEaXJ0eUJsb2NrcyA9IDAsc2VjdG9yTnVtYmVyLGxhc3RTZWN0b3I7CiAgICB1bnNpZ25lZCBpbnQgZGlydHlCbG9ja3NDb3VudGVyID0gMCxkaXJ0eUJsb2Nrc1NlY3RvcixibG9ja1NpemU7CiAgICB1bnNpZ25lZCBpbnQgc2VjdG9yQmFzZU9mZnNldCxwcmV2aW91c0NvdW50ZXIsY291bnRlck9mZnNldDsKICAgIGNoYXIgKiBybXdCbG9ja1BvaW50ZXIsKiB0ZW1wQmxvY2tQb2ludGVyOwoKICAgIC8qIENoZWNrIGlmIHRoZSBmaWxlIHN5c3RlbSdzIGRhdGEgYmFzZSB3YXMgaW5pdGlhbGl6ZWQgKi8KICAgIGlmKGluaXRpYWxpemF0aW9uRmxhZyAhPSBGU19GSUxFX1NZU1RFTV9JTklUSUFMSVpFRCkKICAgICAgICByZXR1cm4gRlNfTk9fRlJFRV9CTE9DS1M7CiAgICBmcmVlQmxvY2tPZmZzZXQgICAgID0gbXZGU09mZnNldCArIEZTX0JMT0NLX1NJWkU7CiAgICBzZWN0b3JOdW1iZXIgICAgICAgID0gbXZGbGFzaEluV2hpY2hTZWMobXZGbGFzaEluZm8sIGZyZWVCbG9ja09mZnNldCk7CiAgICBsYXN0U2VjdG9yICAgICAgICAgID0gbXZGbGFzaE51bU9mU2Vjc0dldChtdkZsYXNoSW5mbyk7CiAgICBkaXJ0eUJsb2Nrc1NlY3RvciAgID0gc2VjdG9yTnVtYmVyOwogICAgLyogU2VhcmNoIGZvciBhIGZyZWUgYmxvY2ssIHdoaWxlIGRvaW5nIHRoYXQgSSBhbSBzZWFyY2hpbmcgZm9yIHRoZSBzZWN0b3IKICAgICAgIHdpdGggdGhlIG1vc3QgZGlydHkgZnJlZSBibG9ja3MgaW4gY2FzZSBJIHdpbGwgbm90IGZpbmQgYSBmcmVlIGJsb2NrICovCiAgICBmb3IoaSA9IHNlY3Rvck51bWJlciA7IGkgPCBsYXN0U2VjdG9yIDsgaSsrKQogICAgewogICAgICAgIHNlY3RvclRvcE9mZnNldCA9IG12Rmxhc2hTZWNPZmZzR2V0KG12Rmxhc2hJbmZvLCBzZWN0b3JOdW1iZXIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICBtdkZsYXNoU2VjU2l6ZUdldChtdkZsYXNoSW5mbywgc2VjdG9yTnVtYmVyKSAtIDE7CiAgICAgICAgZGlydHlCbG9ja3NDb3VudGVyID0gMDsKICAgICAgICB3aGlsZShmcmVlQmxvY2tPZmZzZXQgPCBzZWN0b3JUb3BPZmZzZXQpCiAgICAgICAgewogICAgICAgICAgICBpZihtdkZsYXNoOFJkKG12Rmxhc2hJbmZvLCBmcmVlQmxvY2tPZmZzZXQgKyBGU19CTE9DS19TVEFUVVNfRkxBR19PRkZTRVQpCiAgICAgICAgICAgICAgID09IEZTX0ZSRUVfQkxPQ0spIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZUJsb2NrT2Zmc2V0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKG12Rmxhc2g4UmQobXZGbGFzaEluZm8sIGZyZWVCbG9ja09mZnNldCArIEZTX0JMT0NLX1NUQVRVU19GTEFHX09GRlNFVCkKICAgICAgICAgICAgICAgPT0gRlNfRlJFRV9ESVJUWV9CTE9DSykgZGlydHlCbG9ja3NDb3VudGVyKys7CiAgICAgICAgICAgIGZyZWVCbG9ja09mZnNldCArPSBGU19CTE9DS19TSVpFOyAgCiAgICAgICAgfQogICAgICAgIGlmKGRpcnR5QmxvY2tzQ291bnRlciA+IG1heEZyZWVEaXJ0eUJsb2NrcykKICAgICAgICB7CiAgICAgICAgICAgIG1heEZyZWVEaXJ0eUJsb2NrcyA9IGRpcnR5QmxvY2tzQ291bnRlcjsKICAgICAgICAgICAgZGlydHlCbG9ja3NTZWN0b3IgID0gc2VjdG9yTnVtYmVyOwogICAgICAgIH0KICAgICAgICBzZWN0b3JOdW1iZXIgPSBtdkZsYXNoSW5XaGljaFNlYyhtdkZsYXNoSW5mbywgZnJlZUJsb2NrT2Zmc2V0KTsKICAgIH0KICAgIC8qIFdlIGFyZSBoZXJlIHNpbmNlIHdlIGhhdmUnbnQgZm91bmQgYSBmcmVlIGJsb2NrICovCiAgICAvKiBMZXRzIGNoZWNrIGlmIHdlIGhhdmUgYSBmcmVlIGRpcnR5IGJsb2NrICovCiAgICBpZihtYXhGcmVlRGlydHlCbG9ja3MgPiAwKQogICAgewogICAgICAgIC8qIE5vdyB3ZSBuZWVkIHRvIHBlcmZvcm0gdGhlIHJlYWQgbW9kaWZ5IHdyaXRlIGRpc3BlbnNpbmcgdGhlIGZyZWUKICAgICAgICAgICBkaXJ0eSBibG9ja3MgKi8KICAgICAgICBibG9ja1NpemUgICAgICAgICAgID0gbXZGbGFzaFNlY1NpemVHZXQobXZGbGFzaEluZm8sIGRpcnR5QmxvY2tzU2VjdG9yKTsKICAgICAgICBzZWN0b3JCYXNlT2Zmc2V0ICAgID0gbXZGbGFzaFNlY09mZnNHZXQobXZGbGFzaEluZm8sIGRpcnR5QmxvY2tzU2VjdG9yKTsgCiAgICAgICAgcm13QmxvY2tQb2ludGVyICAgICA9IChjaGFyICopbWFsbG9jKGJsb2NrU2l6ZSk7CiAgICAgICAgaWYocm13QmxvY2tQb2ludGVyID09IE5VTEwpIHJldHVybiBGU19OT19GUkVFX0JMT0NLUzsKICAgICAgICAvKiBSZWFkIHRoZSBibG9jayAqLwogICAgICAgIGZvcihpID0gMCA7IGkgPCBibG9ja1NpemUgOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBybXdCbG9ja1BvaW50ZXJbaV0gPSBtdkZsYXNoOFJkKG12Rmxhc2hJbmZvLCBzZWN0b3JCYXNlT2Zmc2V0ICsgaSk7CiAgICAgICAgfQogICAgICAgIC8qIEVyYXNlIHRoZSBzZWN0b3IgKi8KICAgICAgICBpZihtdkZsYXNoMzJSZChtdkZsYXNoSW5mbywgbXZGU09mZnNldCArIEZTX0VSU0FJTkdfQ09VTlRFUl9GTEFHX09GRlNFVCkgCiAgICAgICAgICAgPT0gRlNfRU5BQkxFX0VSQVNJTkdfQ09VTlRFUikKICAgICAgICB7CiAgICAgICAgICAgIGNvdW50ZXJPZmZzZXQgICA9IHNlY3RvckJhc2VPZmZzZXQgKyBibG9ja1NpemUgLSBGU19CTE9DS19TSVpFOwogICAgICAgICAgICBwcmV2aW91c0NvdW50ZXIgPSBtdkZsYXNoMzJSZChtdkZsYXNoSW5mbywgY291bnRlck9mZnNldCk7CiAgICAgICAgICAgIG12Rmxhc2hTZWNFcmFzZShtdkZsYXNoSW5mbywgZGlydHlCbG9ja3NTZWN0b3IpOwogICAgICAgICAgICBtdkZsYXNoMzJXcihtdkZsYXNoSW5mbywgY291bnRlck9mZnNldCwgcHJldmlvdXNDb3VudGVyICsgMSk7CiAgICAgICAgICAgIG12Rmxhc2g4V3IobXZGbGFzaEluZm8sIGNvdW50ZXJPZmZzZXQgKyBGU19CTE9DS19TVEFUVVNfRkxBR19PRkZTRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0JMT0NLX1VTRURfRk9SX0VSQVNJTkdfQ09VTlRFUik7CiAgICAgICAgICAgIGJsb2NrU2l6ZSAtPSBGU19CTE9DS19TSVpFOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBtdkZsYXNoU2VjRXJhc2UobXZGbGFzaEluZm8sIGRpcnR5QmxvY2tzU2VjdG9yKTsKICAgICAgICB9CiAgICAgICAgLyogV3JpdGUgYmFjayBvbmx5IHRoZSB2YWxpZCBibG9ja3MgKi8KICAgICAgICBmb3IoaSA9IDAgOyBpIDwgYmxvY2tTaXplIDsgaSArPSBGU19CTE9DS19TSVpFKQogICAgICAgIHsKICAgICAgICAgICAgaWYocm13QmxvY2tQb2ludGVyW2kgKyBGU19CTE9DS19TVEFUVVNfRkxBR19PRkZTRVRdID09IAogICAgICAgICAgICAgICBGU19CTE9DS19JTl9VU0UgfHwgcm13QmxvY2tQb2ludGVyW2kgKyAKICAgICAgICAgICAgICAgRlNfQkxPQ0tfU1RBVFVTX0ZMQUdfT0ZGU0VUXSA9PSBGU19CTE9DS19JTl9VUERBVEUgfHwgCiAgICAgICAgICAgICAgIHJtd0Jsb2NrUG9pbnRlcltpICsgRlNfQkxPQ0tfU1RBVFVTX0ZMQUdfT0ZGU0VUXSA9PSBGU19GQVRfQkxPQ0spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRlbXBCbG9ja1BvaW50ZXIgPSBybXdCbG9ja1BvaW50ZXIgKyBpOwogICAgICAgICAgICAgICAgbXZGbGFzaEJsb2NrV3IobXZGbGFzaEluZm8sIHNlY3RvckJhc2VPZmZzZXQgKyBpLCBGU19CTE9DS19TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1WX1U4ICopdGVtcEJsb2NrUG9pbnRlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnJlZShybXdCbG9ja1BvaW50ZXIpOwogICAgICAgIGZvcihpID0gMCA7IGkgPCBibG9ja1NpemUgOyBpICs9IEZTX0JMT0NLX1NJWkUpCiAgICAgICAgewogICAgICAgICAgICBpZihtdkZsYXNoOFJkKG12Rmxhc2hJbmZvLCBzZWN0b3JCYXNlT2Zmc2V0ICsgaSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfQkxPQ0tfU1RBVFVTX0ZMQUdfT0ZGU0VUKQogICAgICAgICAgICAgICA9PSBGU19GUkVFX0JMT0NLKQogICAgICAgICAgICAgICAgcmV0dXJuIChzZWN0b3JCYXNlT2Zmc2V0ICsgaSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIEZTX05PX0ZSRUVfQkxPQ0tTOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG12RlNHZXRGcmVlRW50cnkgLSBGaW5kcyBhIGZyZWUgZW50cnkgaW4gdGhlIEZBVCBhbmQgcmV0dXJucyBpdHMgb2Zmc2V0LgoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyBmdW5jdGlvbiBmaW5kcyBhIGZyZWUgZW50cnkgaW4gdGhlIEZBVCBhbmQgcmV0dXJucyBpdHMgb2Zmc2V0LiAKKiAgICAgICBEdXJpbmcgdGhlIHNlYXJjaCBmb3IgYSBmcmVlIGVudHJ5ICB0aGUgZnVuY3Rpb24gYWxzbyBmaW5kcyB0aGUgc2VjdG9yIAoqICAgICAgIGNvbnRhaW5pbmcgdGhlIG1vc3QgZnJlZSBkaXJ0eSBlbnRyaWVzIC4gSWYgdGhlIGZ1Y3Rpb24gY2FudCBmaW5kIGFueSAKKiAgICAgICBmcmVlIGVudHJ5IHdpdGhpbiB0aGUgRkFUIGl0IGNvcGllcyB0aGUgc2VjdG9yIGNvbnRhaW5pbmcgdGhlIG1vc3QgZnJlZQoqICAgICAgIGRpcnR5IGVudHJpZXMgdG8gdGhlIGR5bmFtaWMgbWVtb3J5IChTRFJBTSksIGVyYXNlIHRoYXQgc2VjdG9yIGFuZCB3cml0ZQoqICAgICAgIGJhY2sgb25seSB0aGUgdmFsaWQgZW50cmllcy4gSW4gdGhhdCB3YXkgdGhlIGZ1bmN0aW9uICBmcmVlIHNwYWNlIGZvciAKKiAgICAgICBuZXcgZW50cmllcyBhbmQgcmV0dXJuIHRoZSBuZXh0IGZyZWUgZW50cnkgb2Zmc2V0LiAgICAgCiogICAgICBOT1RFOgoqICAgICAgIFRoZSBmaWxlIHN5c3RlbSdzIGRhdGEgYmFzZSBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IJFmaWxlU3lzSW5pdJIgCiogICAgICAgZnVuY3Rpb24gYmVmb3JlIHVzaW5nICB0aGlzIGZ1bmN0aW9uIC4gCiogICAgICAgSWYgZHVyaW5nIHRoZSBjb3B5aW5nIG9mIHRoZSBzZWN0b3IgY29udGFpbmluZyB0aGUgbW9zdCBmcmVlIGRpcnR5IAoqICAgICAgIGVucnRpZXMgdG8gdGhlIGR5bmFtaWMgbWVtb3J5IHRoZSBzeXN0ZW0gd2lsbCBsb29zZSBwb3dlciB0aGUgZmlsZQoqICAgICAgIHN5c3RlbSB3aWxsIGNyYXNoLiAgIAoqIAoqIElOUFVUOgoqICAgICAgIE5vbmUuCioKKiBPVVRQVVQ6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTjoKKiAgICAgICBPZmZzZXQgdG8gYSBmcmVlIGVudHJ5ICwgTk9fRlJFRV9FTlRSSUVTIGlmIHRoZXJlIGFyZSBubyBtb3JlIGZyZWUgCiogICAgICAgZW50cmllcyBpbiAgdGhlIGZpbGUgc3lzdGVtYHMgRkFUIG9yIHRoZSBmaWxlIHN5c3RlbSB3YXMgbm90IGluaXRpYWxpemVkCiogICAgICAgKHVzZSCRZmlsZVN5c0luaXSSIGJlZm9yZSB1c2luZyB0aGlzIGZ1bmN0aW9uIGluIHRoYXQgY2FzZSkuIAoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnVuc2lnbmVkIGludCBtdkZTR2V0RnJlZUVudHJ5KCkKewogICAgdW5zaWduZWQgaW50IG5leHRCbG9ja09mZnNldCxzZWN0b3JOdW1iZXIsaSxwcmV2aW91c1NlY3RvcjsKICAgIHVuc2lnbmVkIGludCBkaXJ0eUVudHJpZXNDb3VudGVyID0gMCxkaXJ0eUVudHJpZXNTZWN0b3IsYmxvY2tTaXplLGo7CiAgICB1bnNpZ25lZCBpbnQgbWF4RnJlZURpcnR5QmxvY2tzID0gMDsKICAgIHVuc2lnbmVkIGludCBzZWN0b3JCYXNlT2Zmc2V0LHByZXZpb3VzQ291bnRlcixjb3VudGVyT2Zmc2V0OwogICAgY2hhciAqIHJtd0Jsb2NrUG9pbnRlciwqIHRlbXBCbG9ja1BvaW50ZXI7CgogICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgc3lzdGVtJ3MgZGF0YSBiYXNlIHdhcyBpbml0aWFsaXplZCAqLwogICAgaWYoaW5pdGlhbGl6YXRpb25GbGFnICE9IEZTX0ZJTEVfU1lTVEVNX0lOSVRJQUxJWkVEKQogICAgICAgIHJldHVybiBGU19OT19GUkVFX0VOVFJJRVM7CiAgICAvKiBGaXJzdCBGQVQgYmxvY2sgKi8KICAgIG5leHRCbG9ja09mZnNldCAgICAgPSBtdkZTT2Zmc2V0OwogICAgc2VjdG9yTnVtYmVyICAgICAgICA9IG12Rmxhc2hJbldoaWNoU2VjKG12Rmxhc2hJbmZvLCBuZXh0QmxvY2tPZmZzZXQpOwogICAgZGlydHlFbnRyaWVzU2VjdG9yICA9IHNlY3Rvck51bWJlcjsKICAgIHByZXZpb3VzU2VjdG9yICAgICAgPSBzZWN0b3JOdW1iZXI7CiAgICB3aGlsZShuZXh0QmxvY2tPZmZzZXQgIT0gMHhmZmZmZmZmZikKICAgIHsKICAgICAgICBpZihwcmV2aW91c1NlY3RvciAhPSBzZWN0b3JOdW1iZXIpCiAgICAgICAgewogICAgICAgICAgICBpZihkaXJ0eUVudHJpZXNTZWN0b3IgPiBtYXhGcmVlRGlydHlCbG9ja3MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1heEZyZWVEaXJ0eUJsb2NrcyA9IGRpcnR5RW50cmllc1NlY3RvcjsKICAgICAgICAgICAgICAgIGRpcnR5RW50cmllc1NlY3RvciA9IHNlY3Rvck51bWJlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmV2aW91c1NlY3RvciAgICAgID0gc2VjdG9yTnVtYmVyOwogICAgICAgICAgICBkaXJ0eUVudHJpZXNTZWN0b3IgID0gMDsKICAgICAgICB9CiAgICAgICAgc2VjdG9yTnVtYmVyID0gbXZGbGFzaEluV2hpY2hTZWMobXZGbGFzaEluZm8sIG5leHRCbG9ja09mZnNldCk7CiAgICAgICAgZm9yKGkgPSAwIDsgaSA8IEZTX0JMT0NLX1NJWkUgOyBpICs9IEZTX0ZBVF9GSUxFX0VOVFJZX1NJWkUpCiAgICAgICAgewogICAgICAgICAgICBpZihtdkZsYXNoOFJkKG12Rmxhc2hJbmZvLCBuZXh0QmxvY2tPZmZzZXQgK2krIEZTX0VOVFJZX1NUQVRVU19GTEFHX09GRlNFVCkgCiAgICAgICAgICAgICAgID09IEZTX0ZSRUVfRU5UUlkpIAogICAgICAgICAgICAgICAgcmV0dXJuIChuZXh0QmxvY2tPZmZzZXQgKyBpKTsKICAgICAgICAgICAgaWYobXZGbGFzaDhSZChtdkZsYXNoSW5mbywgbmV4dEJsb2NrT2Zmc2V0ICtpKyBGU19FTlRSWV9TVEFUVVNfRkxBR19PRkZTRVQpIAogICAgICAgICAgICAgICA9PSBGU19GUkVFX0RJUlRZX0VOVFJZKQogICAgICAgICAgICAgICAgZGlydHlFbnRyaWVzQ291bnRlcisrOwogICAgICAgIH0KICAgICAgICBuZXh0QmxvY2tPZmZzZXQgPSBtdkZsYXNoMzJSZChtdkZsYXNoSW5mbywgbmV4dEJsb2NrT2Zmc2V0KTsKICAgIH0KICAgIC8qIE5vdyB3ZSBuZWVkIHRvIHBlcmZvcm0gdGhlIHJlYWQgbW9kaWZ5IHdyaXRlIGRpc3BlbnNpbmcgdGhlIGZyZWUKICAgICAgIGRpcnR5IGVudHJpZXMgYW5kIGJsb2NrcyAqLwogICAgYmxvY2tTaXplICAgICAgICAgICA9IG12Rmxhc2hTZWNTaXplR2V0KG12Rmxhc2hJbmZvLCBkaXJ0eUVudHJpZXNTZWN0b3IpOwogICAgc2VjdG9yQmFzZU9mZnNldCAgICA9IG12Rmxhc2hTZWNPZmZzR2V0KG12Rmxhc2hJbmZvLCBkaXJ0eUVudHJpZXNTZWN0b3IpOyAKICAgIHJtd0Jsb2NrUG9pbnRlciAgICAgPSAoY2hhciAqKW1hbGxvYyhibG9ja1NpemUpOwogICAgaWYocm13QmxvY2tQb2ludGVyID09IE5VTEwpIHJldHVybiBGU19OT19GUkVFX0VOVFJJRVM7CiAgICAvKiBSZWFkIHRoZSBibG9jayAqLwogICAgZm9yKGkgPSAwIDsgaSA8IGJsb2NrU2l6ZSA7IGkrKykKICAgIHsKICAgICAgICBybXdCbG9ja1BvaW50ZXJbaV0gPSBtdkZsYXNoOFJkKG12Rmxhc2hJbmZvLCBzZWN0b3JCYXNlT2Zmc2V0ICsgaSk7CiAgICB9CiAgICAvKiBFcmFzZSB0aGUgc2VjdG9yICovCiAgICBpZihtdkZsYXNoMzJSZChtdkZsYXNoSW5mbywgbXZGU09mZnNldCArIDIwKSA9PSBGU19FTkFCTEVfRVJBU0lOR19DT1VOVEVSKQogICAgewogICAgICAgIGNvdW50ZXJPZmZzZXQgICA9IHNlY3RvckJhc2VPZmZzZXQgKyBibG9ja1NpemUgLSBGU19CTE9DS19TSVpFOwogICAgICAgIHByZXZpb3VzQ291bnRlciA9IG12Rmxhc2gzMlJkKG12Rmxhc2hJbmZvLCBjb3VudGVyT2Zmc2V0KTsKICAgICAgICBtdkZsYXNoU2VjRXJhc2UobXZGbGFzaEluZm8sIGRpcnR5RW50cmllc1NlY3Rvcik7CiAgICAgICAgbXZGbGFzaDMyV3IobXZGbGFzaEluZm8sIGNvdW50ZXJPZmZzZXQscHJldmlvdXNDb3VudGVyICsgMSk7CiAgICAgICAgbXZGbGFzaDhXcihtdkZsYXNoSW5mbywgY291bnRlck9mZnNldCArIEZTX0JMT0NLX1NUQVRVU19GTEFHX09GRlNFVCwKICAgICAgICAgICAgICAgICAgICAgICBGU19CTE9DS19VU0VEX0ZPUl9FUkFTSU5HX0NPVU5URVIpOwogICAgICAgIGJsb2NrU2l6ZSAtPSBGU19CTE9DS19TSVpFOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIG12Rmxhc2hTZWNFcmFzZShtdkZsYXNoSW5mbywgZGlydHlFbnRyaWVzU2VjdG9yKTsKICAgIH0KICAgIC8qIFdyaXRlIGJhY2sgb25seSB0aGUgdmFsaWQgYmxvY2tzICovCiAgICBmb3IoaSA9IDAgOyBpIDwgYmxvY2tTaXplIDsgaSArPSBGU19CTE9DS19TSVpFKQogICAgewogICAgICAgIGlmKHJtd0Jsb2NrUG9pbnRlcltpICsgRlNfQkxPQ0tfU1RBVFVTX0ZMQUdfT0ZGU0VUXSA9PSAKICAgICAgICAgICBGU19CTE9DS19JTl9VU0UgfHwgcm13QmxvY2tQb2ludGVyW2kgKyBGU19CTE9DS19TVEFUVVNfRkxBR19PRkZTRVRdIAogICAgICAgICAgID09IEZTX0JMT0NLX0lOX1VQREFURSkKICAgICAgICB7CiAgICAgICAgICAgIHRlbXBCbG9ja1BvaW50ZXIgPSBybXdCbG9ja1BvaW50ZXIgKyBpOwogICAgICAgICAgICBtdkZsYXNoQmxvY2tXcihtdkZsYXNoSW5mbywgc2VjdG9yQmFzZU9mZnNldCArIGksIEZTX0JMT0NLX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNVl9VOCAqKXRlbXBCbG9ja1BvaW50ZXIpOwogICAgICAgIH0KICAgICAgICBpZihybXdCbG9ja1BvaW50ZXJbaSArIEZTX0JMT0NLX1NUQVRVU19GTEFHX09GRlNFVF0gPT0gRlNfRkFUX0JMT0NLKQogICAgICAgIHsKICAgICAgICAgICAgZm9yKGogPSBGU19GQVRfRklMRV9FTlRSWV9TSVpFIDsgaiA8IEZTX0JMT0NLX1NJWkUgOwogICAgICAgICAgICAgICAgais9IEZTX0ZBVF9GSUxFX0VOVFJZX1NJWkUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKHJtd0Jsb2NrUG9pbnRlcltqICsgRlNfRU5UUllfU1RBVFVTX0ZMQUdfT0ZGU0VUXSAKICAgICAgICAgICAgICAgICAgID09IEZTX0VOVFJZX0lOX1VTRSB8fAogICAgICAgICAgICAgICAgICAgcm13QmxvY2tQb2ludGVyW2ogKyBGU19FTlRSWV9TVEFUVVNfRkxBR19PRkZTRVRdIAogICAgICAgICAgICAgICAgICAgPT0gRlNfRU5UUllfSU5fVVBEQVRFKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRlbXBCbG9ja1BvaW50ZXIgPSBybXdCbG9ja1BvaW50ZXIgKyBqOwogICAgICAgICAgICAgICAgICAgIG12Rmxhc2hCbG9ja1dyKG12Rmxhc2hJbmZvLCBzZWN0b3JCYXNlT2Zmc2V0ICsgaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19GQVRfRklMRV9FTlRSWV9TSVpFLCAoTVZfVTggKil0ZW1wQmxvY2tQb2ludGVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZyZWUocm13QmxvY2tQb2ludGVyKTsKICAgIGZvcihpID0gMCA7IGkgPCBibG9ja1NpemUgOyBpICs9IEZTX0JMT0NLX1NJWkUpCiAgICB7CiAgICAgICAgaWYobXZGbGFzaDMyUmQobXZGbGFzaEluZm8sIHNlY3RvckJhc2VPZmZzZXQgKyBpICsgRlNfQkxPQ0tfU1RBVFVTX0ZMQUdfT0ZGU0VUKQogICAgICAgICAgID09IEZTX0ZBVF9CTE9DSykKICAgICAgICB7CiAgICAgICAgICAgIGZvcihqID0gaSArIEZTX0ZBVF9GSUxFX0VOVFJZX1NJWkUgOyBqIDwgKGkgKyBGU19CTE9DS19TSVpFKSA7CiAgICAgICAgICAgICAgICBqKz0gRlNfRkFUX0ZJTEVfRU5UUllfU0laRSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYobXZGbGFzaDMyUmQobXZGbGFzaEluZm8sIHNlY3RvckJhc2VPZmZzZXQgK2orCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19FTlRSWV9TVEFUVVNfRkxBR19PRkZTRVQpID09IEZTX0ZSRUVfRU5UUlkpCiAgICAgICAgICAgICAgICByZXR1cm4gKHNlY3RvckJhc2VPZmZzZXQgKyBqKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBGU19OT19GUkVFX0VOVFJJRVM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbXZGU1dyaXRlRmlsZU5hbWVUb0ZBVGVudHJ5IC0gV3JpdGUgdGhlIGZpbGUgbmFtZSB0byBhbiBlbnRyeSBpbiB0aGUgRkFUIC4KKgoqIERFU0NSSVBUSU9OOgoqICAgICAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIGZpbGUgbmFtZSB0byBhbiBlbnRyeSBpbiB0aGUgRkFULlRoZSBmdW5jdGlvbiAKKiAgICAgIGV4dGFyY3RzIHRoZSBmaWxlIG5hbWUgYW5kIGV4dGVudGlvbiBhbmQgd3JpdGUgaXQgdG8gdGhlIGVudHJ5IGF0IAoqICAgICAgkWVudHJ5T2Zmc2V0kiB3aXRoaW4gdGhlIEZBVC4KKgoqIElOUFVUOgoqICAgICAgZW50cnlPZmZzZXQgLSBQb2ludGVyIHRvIHRoZSBkZXNpcmVkIGVudHJ5IHRvIHdyaXRlIHRoZSBmaWxlIG5hbWUgYXQuCiogICAgICBmaWxlTmFtZSAtIFRoZSBmaWxlIG5hbWUgYW5kIGV4dGVudGlvbi4KKgoqIE9VVFBVVDoKKiAgICAgIE5vbmUuCioKKiBSRVRVUk46CiogICAgICAwIGZvciBpbnZhbGlkIGZpbGUgbmFtZSwgMSBmb3Igc3VjY2Vzcy4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp1bnNpZ25lZCBpbnQgbXZGU1dyaXRlRmlsZU5hbWVUb0ZBVGVudHJ5KHVuc2lnbmVkIGludCBlbnRyeU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogZmlsZU5hbWUpCnsKICAgIGNoYXIgICBuYW1lW0ZTX0ZJTEVfTkFNRV9MRU5HVEhdOwogICAgY2hhciAgIGV4dFtGU19GSUxFX0VYVF9MRU5HVEhdOwogICAgdW5zaWduZWQgaW50ICAgIGluZGV4LGV4dEluZGV4OwoKICAgIC8qIEV4dHJhY3QgdGhlIG5hbWUgKi8KICAgIGZvcihpbmRleCA9IDAgOyBpbmRleCA8IEZTX0ZJTEVfTkFNRV9MRU5HVEggOyBpbmRleCsrKQogICAgewogICAgICAgIGlmKGZpbGVOYW1lW2luZGV4XSA9PSAnLicgfHwgZmlsZU5hbWVbaW5kZXhdID09ICdcMCcpCiAgICAgICAgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgbmFtZVtpbmRleF0gPSBmaWxlTmFtZVtpbmRleF07CiAgICAgICAgfQogICAgfQogICAgLyogV3JpdGUgdGhlIG5hbWUgKi8KICAgIGlmKGluZGV4ICE9IDApCiAgICAgICAgbXZGbGFzaEJsb2NrV3IobXZGbGFzaEluZm8sIGVudHJ5T2Zmc2V0ICsgRlNfRklMRV9OQU1FX09GRlNFVCwgaW5kZXgsIChNVl9VOCAqKW5hbWUpOwogICAgaWYoaW5kZXggPT0gMCAmJiBmaWxlTmFtZVtpbmRleF0gPT0gJ1wwJykgLyogTm90IGEgdmFsaWQgbmFtZSAqLwogICAgICAgIHJldHVybiAwOwogICAgaWYoZmlsZU5hbWVbaW5kZXhdID09ICdcMCcpIC8qIE5vIGV4dGVuc2lvbiAqLwogICAgICAgIHJldHVybiAxOwogICAgLyogRXh0cmFjdCB0aGUgZXh0ZW5zaW9uICovCiAgICBpbmRleCsrOyAvKiBTa2lwIHRoZSBkb3QgKi8KICAgIGZvcihleHRJbmRleCA9IDAgOyBleHRJbmRleCA8IEZTX0ZJTEVfRVhUX0xFTkdUSCA7IGV4dEluZGV4KyspCiAgICB7CiAgICAgICAgaWYoZmlsZU5hbWVbaW5kZXggKyBleHRJbmRleF0gPT0gJ1wwJykKICAgICAgICB7CgkJLy8gcm9uZW4gZml4IGEgYnVnIC0tLT4gZXh0SW5kZXgrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGV4dFtleHRJbmRleF0gPSBmaWxlTmFtZVtpbmRleCArIGV4dEluZGV4XTsKICAgICAgICB9CiAgICB9CiAgICAvKiBXcml0ZSB0aGUgZXh0ZW5zaW9uICovCiAgICBpZihleHRJbmRleCAhPSAwKQogICAgICAgIG12Rmxhc2hCbG9ja1dyKG12Rmxhc2hJbmZvLCBlbnRyeU9mZnNldCArIEZTX0ZJTEVfRVhUX09GRlNFVCwgZXh0SW5kZXgsIChNVl9VOCAqKWV4dCk7CiAgICByZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBtdkZTUmVhZEZpbGVOYW1lRnJvbUZBVGVudHJ5IC0gUmVhZCB0aGUgZmlsZSBuYW1lIGZyb20gYW4gZW50cnkgaW4gdGhlIEZBVC4KKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGZpbGUgbmFtZSBmcm9tIGFuIGVudHJ5IGluIHRoZSBGQVQuIElmIHRoZSBnaXZlbgoqICAgICAgIGVudHJ5IGlzIG5vdCB1c2VkIGJ5IGFueSBmaWxlICwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDAgdG8gcmVtYXJrIGEgCiogICAgICAgZmFpbGllci4KKgoqIElOUFVUOgoqICAgICAgIGVudHJ5T2Zmc2V0IC0gUG9pbnRlciB0byB0aGUgZGVzaXJlZCBlbnRyeSB0byByZWFkIHRoZSBmaWxlIG5hbWUgZnJvbS4KKiAgICAgICBmaWxlTmFtZSAtIHBvaW50ZXIgdG8gYW4gZW1wdHkgYXJyYXkgdG8gYmUgZmlsbGVkIGJ5IHRoaXMgZnVuY3RvaW4gd2l0aAoqICAgICAgICAgICAgICAgICAgdGhlIGZpbGUgbmFtZSBhbmQgZXh0ZW50aW9uLiAKKiBPVVRQVVQ6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTjoKKiAgICAgICAwIGZvciBmYWlsdXJlLCAxIGZvciBzdWNjZXNzLgoqCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdW5zaWduZWQgaW50IG12RlNSZWFkRmlsZU5hbWVGcm9tRkFUZW50cnkodW5zaWduZWQgaW50IGVudHJ5T2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogZmlsZU5hbWUpCnsKICAgIHVuc2lnbmVkIGludCAgICBpbmRleCA9IDAsb2Zmc2V0OwogICAgdW5zaWduZWQgY2hhciAgIGM7CgogICAgaWYoIChtdkZsYXNoOFJkKG12Rmxhc2hJbmZvLCBlbnRyeU9mZnNldCArIEZTX0VOVFJZX1NUQVRVU19GTEFHX09GRlNFVCkgCiAgICAgICAgID09IEZTX0VOVFJZX0lOX1VTRSkgfHwgCiAgICAgICAgKG12Rmxhc2g4UmQobXZGbGFzaEluZm8sIGVudHJ5T2Zmc2V0ICsgRlNfRU5UUllfU1RBVFVTX0ZMQUdfT0ZGU0VUKSAKICAgICAgICA9PSBGU19FTlRSWV9JTl9VUERBVEUpICkKICAgIHsKICAgICAgICBmb3Iob2Zmc2V0ID0gMCA7IG9mZnNldCA8IEZTX0ZJTEVfTkFNRV9MRU5HVEggOyBvZmZzZXQrKykKICAgICAgICB7CiAgICAgICAgICAgIGMgPSBtdkZsYXNoOFJkKG12Rmxhc2hJbmZvLCBlbnRyeU9mZnNldCArIEZTX0ZJTEVfTkFNRV9PRkZTRVQgKyBvZmZzZXQpOwogICAgICAgICAgICBpZihjID09IDB4ZmYpIAogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGZpbGVOYW1lW2luZGV4KytdID0gYzsKICAgICAgICB9CiAgICAgICAgaWYobXZGbGFzaDhSZChtdkZsYXNoSW5mbywgZW50cnlPZmZzZXQgKyBGU19GSUxFX0VYVF9PRkZTRVQpICE9IDB4ZmYpCiAgICAgICAgewogICAgICAgICAgICBmaWxlTmFtZVtpbmRleCsrXSA9ICcuJzsKICAgICAgICAgICAgZm9yKG9mZnNldCA9IDAgOyBvZmZzZXQgPCBGU19GSUxFX0VYVF9MRU5HVEggOyBvZmZzZXQrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYyA9IG12Rmxhc2g4UmQobXZGbGFzaEluZm8sIGVudHJ5T2Zmc2V0ICsgRlNfRklMRV9FWFRfT0ZGU0VUICsgb2Zmc2V0KTsKICAgICAgICAgICAgICAgIGlmKGMgPT0gMHhmZikgYnJlYWs7CiAgICAgICAgICAgICAgICBmaWxlTmFtZVtpbmRleCsrXSA9IGM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZmlsZU5hbWVbaW5kZXgrK10gPSAnXDAnOwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbXZGU1dyaXRlIC0gV3JpdGVzIGEgYmxvY2sgb2YgZGF0YSB0byBhbiBvcGVuZWQgZmlsZS4KKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgZnVuY3Rpb24gd3JpdGVzIGEgYmxvY2sgb2YgZGF0YSB0byBhIGZpbGUgb3BlbmVkIGJ5IGFsbCBtb2RlcyAKKiAgICAgICBleGNlcHQgbW9kZSCTcpQgaW5kaWNhdGluZyB0aGUgZmlsZSBpcyBhIHJlYWQgb25seSBmaWxlLiBUaGUgZnVuY3Rpb24KKiAgICAgICB3aWxsIGFwcGVuZCB0aGUgZGF0YSB0byB0aGUgbGFzdCBibG9jayAoIGlmIHRoZSBvZmZzZXQgZmxhZyBpcyBub3Qgc2V0IAoqICAgICAgIHlldCApIG9yIHRvIGEgbmV3IGJsb2NrIGlmIHRoaXMgaXMgYSBuZXcgZmlsZSAsIHRoZSBmdW5jdGlvbiBhbHNvIHRha2VzCiogICAgICAgY2FyZSBvZiB1cGRhdGluZyB0aGUgRU9GIHBvaW50ZXIgLCB1cGRhdGluZyB0aGUgZmlsZSdzIGVudHJ5IGFuZCBkYXRhIAoqICAgICAgIGJsb2NrcyBzdGF0dXMgZmxhZ3MuIER1cmluZyB0aGUgd3JpdGUgYXR0ZW1wdCAgLCB0aGUgZnVuY3Rpb24gd2lsbAoqICAgICAgIHJldHVybiAwIHZhbHVlICBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgoqICAgICAgIC0gaWYgdGhlIGdpdmVuIGZpbGUgaGFuZGxlciBpcyBpbnZhbGlkICB0aGF0IGlzICwgZ3JhdGVyIG9yIGVxdWFsIHRvIAoqICAgICAgICAgTUFYX05VTV9PRl9FTlRSSUVTIChkZWZpbmVkIGluIG12RlMuaCkuCiogICAgICAgLSBpZiB0aGUgZW50cnkgb2YgdGhlIGZpbGUgaGFuZGxlciBob2xkcyB0aGUgc3RhdHVzIEZSRUVfRU5UUlkuCiogICAgICAgLSBpZiB0aGUgkW51bWJlck9mQnl0ZXOSIHBhcmFtZXRlciBpcyAwLgoqICAgICAgIC0gaWYgIHRoaXMgaXMgdGhlIGZpcnN0IHdyaXRlIGF0dGVtcHQgdG8gdGhlIGZpbGUgKCBuZXcgZmlsZSApICwgdGhlIAoqICAgICAgICAgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSBhIG5ldyBibG9jayAgIGZvciB0aGUgZGF0YSAsIGluIHRoaXMgY2FzZSBhIAoqICAgICAgICAgZmFpbGllciBjYW4gb2NjdXIgcmVzdWx0aW5nIGZyb20gbGFjayBvZiBmcmVlIGJsb2Nrcy4gSW4gYWxsIG90aGVyIAoqICAgICAgICAgY2FzZXMgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbi4KKiAgICAgICAgIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gcmV0dXJuZWQgYnkgdGhpcyAKKiAgICAgICAgIGZ1bmN0aW9uIG1heSBub3QgIGJlIGVxdWFsIHRvIHRoZSCRbnVtYmVyT2ZCeXRlc5IgcGFyYW1ldGVyICwgaW4gdGhhdAoqICAgICAgICAgY2FzZSBjb25zaWRlciB0aGUgd3JpdGUgYWN0aW9uIGFzIGEgZmF0YWwgZXJyb3IgYW5kIGRvIG5vdCB0cnkgdG8gCiogICAgICAgICByZS13cml0ZSB0aGUgZGF0YS4gICAgCioKKiBJTlBVVDoKKiAgICAgICBmaWxlSGFuZGxlciAtIFRoZSBmaWxlIGhhbmRsZXIgb2YgdGhlIGZpbGUgdG8gYmUgd3JpdHRlbi4KKiAgICAgICBudW1PZkJ5dGVzIC0gVGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuIGZyb20gdGhlIGRhdGEgYXJyYXkuCiogICAgICAgYmxvY2sgLSBUaGUgZGF0YSBhcnJheSB0byB3cml0ZSB0byB0aGUgZmlsZS4KKgoqIE9VVFBVVDoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOOgoqICAgICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuLCBpZiB0aGUgbnVtYmVyIG9mCiogICAgICAgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiBpcyBub3QgZXF1YWwgdG8gdGhlIG51bWJlck9mQnl0ZXMgY29uc2lkZXIgaXQgYXMgCiogICAgICAgYSBmYXRhbCBlcnJvciwgZG8gbm90IHRyeSB0byByZS13cml0ZSB0aGUgZGF0YS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp1bnNpZ25lZCBpbnQgbXZGU1dyaXRlKEZTX0ZJTEVfSEFORExFUiBmaWxlSGFuZGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtYmVyT2ZCeXRlcyxjaGFyICogYmxvY2spCnsKICAgIHVuc2lnbmVkIGludCByZW1haW5pbmdCeXRlcyxuZXh0QmxvY2tQb2ludGVyLG5ld0Jsb2NrUG9pbnRlcixibG9ja1NpemU7CiAgICB1bnNpZ25lZCBpbnQgZnJlZUJ5dGVzSW5CbG9jayx3cml0dGVuQnl0ZXMsYmxvY2tJbmRleCA9IDA7CiAgICB1bnNpZ25lZCBpbnQgdG90YWxXcml0dGVuQnl0ZXMgPSAwLG51bWJlck9mQmxvY2tzLGk7CgogICAgYmxvY2tTaXplID0gRlNfQkxPQ0tfU0laRSAtIEZTX0JMT0NLX0hFQURFUl9TSVpFOwogICAgaWYoKGZpbGVIYW5kbGVyID49IEZTX01BWF9OVU1fT0ZfRU5UUklFUykgfHwKICAgICAgIChtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uc3RhdHVzRmxhZyA9PSBGU19GUkVFX0VOVFJZKSB8fAogICAgICAgbnVtYmVyT2ZCeXRlcyA9PSAwKQogICAgICAgIHJldHVybiAwOwogICAgaWYobXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLm1vZGVbMF0gPT0gJ3InICYmCiAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0ubW9kZVsxXSA9PSAnXDAnKQogICAgICAgIHJldHVybiAwOyAvKiBGaWxlIHdhcyBvcGVuZWQgYXMgcmVhZCBvbmx5ICovCiAgICBuZXh0QmxvY2tQb2ludGVyID0gbXZGbGFzaDMyUmQobXZGbGFzaEluZm8sIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5wb2ludGVyVG9GQVQpOwogICAgcmVtYWluaW5nQnl0ZXMgPSBudW1iZXJPZkJ5dGVzOwogICAgaWYobmV4dEJsb2NrUG9pbnRlciA9PSAweGZmZmZmZmZmKQogICAgewogICAgICAgIC8qIE5ldyBmaWxlLCBubyBibG9ja3MgYWxsb2NhdGVkIHlldCAqLwogICAgICAgIG5ld0Jsb2NrUG9pbnRlciA9IG12RlNHZXRGcmVlQmxvY2soKTsKICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uYmxvY2tQb2ludGVyID0gbmV3QmxvY2tQb2ludGVyOwogICAgICAgIGlmKG5ld0Jsb2NrUG9pbnRlciA9PSBGU19OT19GUkVFX0JMT0NLUykKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgLyogVXBkYXRlIHRoZSBlbnRyeSdzIHN0YXR1cyBmbGFnIGFuZCBuZXh0IGJsb2NrIHBvaW50ZXIgKi8KICAgICAgICBtdkZsYXNoMzJXcihtdkZsYXNoSW5mbywgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLnBvaW50ZXJUb0ZBVCwKICAgICAgICAgICAgICAgICAgICAgICBuZXdCbG9ja1BvaW50ZXIgfCBGU19CTE9DS19PRkZTRVQpOwogICAgICAgIG12Rmxhc2g4V3IobXZGbGFzaEluZm8sIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5wb2ludGVyVG9GQVQgKyAKICAgICAgICAgICAgICAgICAgICAgICBGU19FTlRSWV9TVEFUVVNfRkxBR19PRkZTRVQsIEZTX0VOVFJZX0lOX1VTRSk7CiAgICAgICAgLyogU3RhcnQgd3JpdGluZyB0aGUgZGF0YSAqLwogICAgICAgIGlmKG51bWJlck9mQnl0ZXMgPD0gYmxvY2tTaXplKQogICAgICAgIHsKICAgICAgICAgICAgLyogT25seSBvbmUgYmxvY2sgbmVlZGVkICovCiAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgYmxvY2tzIHN0YXR1cyBmbGFnICovCiAgICAgICAgICAgIG12Rmxhc2g4V3IobXZGbGFzaEluZm8sIG5ld0Jsb2NrUG9pbnRlciArIEZTX0JMT0NLX1NUQVRVU19GTEFHX09GRlNFVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfQkxPQ0tfSU5fVVBEQVRFKTsKICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBFT0Zwb2ludGVyICovCiAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5FT0Zwb2ludGVyID0gbmV3QmxvY2tQb2ludGVyCiAgICAgICAgICAgICAgICArIG51bWJlck9mQnl0ZXMgKyBGU19CTE9DS19IRUFERVJfU0laRSAtIDE7CiAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgRmlsZSBwb2ludGVyICovCiAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5maWxlUG9pbnRlciA9IAogICAgICAgICAgICAgICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLkVPRnBvaW50ZXI7CiAgICAgICAgICAgIC8qIFdyaXRlIHRoZSBkYXRhICovCiAgICAgICAgICAgIHJldHVybiAKICAgICAgICAgICAgICAgIG12Rmxhc2hCbG9ja1dyKG12Rmxhc2hJbmZvLCBuZXdCbG9ja1BvaW50ZXIgKyBGU19CTE9DS19IRUFERVJfU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mQnl0ZXMsIChNVl9VOCAqKWJsb2NrKTsKICAgICAgICB9CiAgICAgICAgZWxzZSAvKiBNb3JlIHRoYW4gb25lIGJsb2NrIGlzIG5lZWRlZCAqLwogICAgICAgIHsKICAgICAgICAgICAgLyogSSB3aWxsIHRha2UgY2FyZSBvZiB0aGUgZmlyc3QgYmxvY2sgaW4gaGVyZSwgdGhlIHJlc3QgCiAgICAgICAgICAgICAgIHdpbGwgYmUgaGFuZGxlZCBsYXRlciBpbiB0aGUgZnVjdGlvbiAqLyAKICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBibG9jaydzIHN0YXR1cyBmbGFnICovCiAgICAgICAgICAgIG12Rmxhc2g4V3IobXZGbGFzaEluZm8sIG5ld0Jsb2NrUG9pbnRlciArIEZTX0JMT0NLX1NUQVRVU19GTEFHX09GRlNFVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfQkxPQ0tfSU5fVVNFKTsvKiBGdWxseSBleHBsb2l0ZWQgYmxvY2sgKi8KICAgICAgICAgICAgLyogV3JpdGUgdGhlIGRhdGEgKi8KICAgICAgICAgICAgd3JpdHRlbkJ5dGVzID0gbXZGbGFzaEJsb2NrV3IobXZGbGFzaEluZm8sIG5ld0Jsb2NrUG9pbnRlciArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19CTE9DS19IRUFERVJfU0laRSwgYmxvY2tTaXplLCAoTVZfVTggKilibG9jayk7CiAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgRU9GcG9pbnRlciAqLwogICAgICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uRU9GcG9pbnRlciA9IG5ld0Jsb2NrUG9pbnRlcgogICAgICAgICAgICAgICAgKyB3cml0dGVuQnl0ZXMgKyBGU19CTE9DS19IRUFERVJfU0laRSAtIDE7CiAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgRmlsZSBwb2ludGVyICovCiAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5maWxlUG9pbnRlciA9IAogICAgICAgICAgICAgICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLkVPRnBvaW50ZXI7CiAgICAgICAgICAgIGlmKHdyaXR0ZW5CeXRlcyAhPSBibG9ja1NpemUpCiAgICAgICAgICAgICAgICByZXR1cm4gd3JpdHRlbkJ5dGVzOyAvKiBXcml0ZSBvcGVyYXRpb24gZmFpbGVkICovCiAgICAgICAgICAgIHRvdGFsV3JpdHRlbkJ5dGVzICs9IHdyaXR0ZW5CeXRlczsKICAgICAgICAgICAgcmVtYWluaW5nQnl0ZXMgPSBudW1iZXJPZkJ5dGVzIC0gYmxvY2tTaXplOwogICAgICAgICAgICBuZXh0QmxvY2tQb2ludGVyID0gbmV3QmxvY2tQb2ludGVyOwogICAgICAgICAgICBibG9ja0luZGV4ICs9IGJsb2NrU2l6ZTsKICAgICAgICB9CiAgICB9CiAgICAvKiBTZWFyY2ggZm9yIHRoZSBsYXN0IGJsb2NrICovCiAgICB3aGlsZShtdkZsYXNoMzJSZChtdkZsYXNoSW5mbywgbmV4dEJsb2NrUG9pbnRlciAmIEZTX0JMT0NLX09GRlNFVF9NQVNLKSAhPSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmZmZmZikKICAgIHsKICAgICAgICBuZXh0QmxvY2tQb2ludGVyID0gbXZGbGFzaDMyUmQobXZGbGFzaEluZm8sIG5leHRCbG9ja1BvaW50ZXIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0JMT0NLX09GRlNFVF9NQVNLKTsKICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uYmxvY2tQb2ludGVyID0gbmV4dEJsb2NrUG9pbnRlcjsKICAgIH0KICAgIGZyZWVCeXRlc0luQmxvY2sgPSBGU19CTE9DS19TSVpFIC0gMSAtICAKICAgICAgICAgICAgICAgICAgICAgICAobXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLkVPRnBvaW50ZXIgJiBGU19CTE9DS19PRkZTRVQpOwogICAgaWYobXZGbGFzaDhSZChtdkZsYXNoSW5mbywgKG5leHRCbG9ja1BvaW50ZXIgJiBGU19CTE9DS19PRkZTRVRfTUFTSykKICAgICAgICAgICAgICAgICAgICAgKyBGU19CTE9DS19TVEFUVVNfRkxBR19PRkZTRVQpID09IEZTX0JMT0NLX0lOX1VTRSkKICAgIHsKICAgICAgICAvKiBXZSBjYW4gdXNlIHRoZSBvZmZzZXQgZmxhZyB0byBhcHBlbmQgZGF0YSwgb3IgdGhlIEZTX0ZVTExfQkxPQ0sKICAgICAgICAgICBmbGFnIGluIGNhc2UgdGhlIGJsb2NrIHdpbGwgYmUgZnVsbHkgZXhwbG9pdGVkICovCiAgICAgICAgaWYoZnJlZUJ5dGVzSW5CbG9jayAhPSAwKSAKICAgICAgICB7CiAgICAgICAgICAgIGlmKChyZW1haW5pbmdCeXRlcyA8IGZyZWVCeXRlc0luQmxvY2spICYmCiAgICAgICAgICAgICAgICBtdkZsYXNoMTZSZChtdkZsYXNoSW5mbywgKG5leHRCbG9ja1BvaW50ZXIgJiBGU19CTE9DS19PRkZTRVRfTUFTSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZTX0JMT0NLX09GRlNFVF9PRkZTRVQpID09IDB4ZmZmZikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgd3JpdHRlbkJ5dGVzID0gbXZGbGFzaEJsb2NrV3IobXZGbGFzaEluZm8sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLkVPRnBvaW50ZXIgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nQnl0ZXMsIChNVl9VOCAqKSZibG9ja1tibG9ja0luZGV4XSk7CiAgICAgICAgICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uRU9GcG9pbnRlciArPSB3cml0dGVuQnl0ZXM7CiAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIEZpbGUgcG9pbnRlciAqLwogICAgICAgICAgICAgICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLmZpbGVQb2ludGVyID0gCiAgICAgICAgICAgICAgICAgICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLkVPRnBvaW50ZXI7CiAgICAgICAgICAgICAgICBpZihyZW1haW5pbmdCeXRlcyA9PSBmcmVlQnl0ZXNJbkJsb2NrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG12Rmxhc2g4V3IobXZGbGFzaEluZm8sIChuZXh0QmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGU19CTE9DS19PRkZTRVRfRkxBR19PRkZTRVQsIEZTX0ZVTExfQkxPQ0spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogZWxzZSB0aGUgT0ZGU0VUIHdpbGwgYmUgdXBkYXRlZCBieSBtdkZTQ2xvc2UgKi8KICAgICAgICAgICAgICAgIHJldHVybiB3cml0dGVuQnl0ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihyZW1haW5pbmdCeXRlcyA+PSBmcmVlQnl0ZXNJbkJsb2NrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHdyaXR0ZW5CeXRlcyA9IG12Rmxhc2hCbG9ja1dyKG12Rmxhc2hJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5FT0Zwb2ludGVyICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlQnl0ZXNJbkJsb2NrLCAoTVZfVTggKikmYmxvY2tbYmxvY2tJbmRleF0pOwogICAgICAgICAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5FT0Zwb2ludGVyICs9IGZyZWVCeXRlc0luQmxvY2s7CiAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBGaWxlIHBvaW50ZXIgKi8KICAgICAgICAgICAgICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uZmlsZVBvaW50ZXIgPSAKICAgICAgICAgICAgICAgICAgICAgICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLkVPRnBvaW50ZXI7CiAgICAgICAgICAgICAgICAgICAgdG90YWxXcml0dGVuQnl0ZXMgKz0gd3JpdHRlbkJ5dGVzOwogICAgICAgICAgICAgICAgICAgIGlmKHdyaXR0ZW5CeXRlcyAhPSBmcmVlQnl0ZXNJbkJsb2NrKSAvKiBlcnJvciAqLwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG90YWxXcml0dGVuQnl0ZXM7CiAgICAgICAgICAgICAgICAgICAgbXZGbGFzaDhXcihtdkZsYXNoSW5mbywgKG5leHRCbG9ja1BvaW50ZXIgJiBGU19CTE9DS19PRkZTRVRfTUFTSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZTX0JMT0NLX09GRlNFVF9GTEFHX09GRlNFVCwgRlNfRlVMTF9CTE9DSyk7CiAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nQnl0ZXMgLT0gZnJlZUJ5dGVzSW5CbG9jazsKICAgICAgICAgICAgICAgICAgICBibG9ja0luZGV4ICs9IGZyZWVCeXRlc0luQmxvY2s7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIC8qIFRoZSBibG9jayBpcyBub3Qgc2VhbGVkIHlldCwgd2UgY2FuIHNpbXBseSBhcHBlbmQgdGhlIGRhdGEgKi8KICAgIHsKICAgICAgICBpZihyZW1haW5pbmdCeXRlcyA8PSBmcmVlQnl0ZXNJbkJsb2NrKQogICAgICAgIHsKICAgICAgICAgICAgd3JpdHRlbkJ5dGVzID0gbXZGbGFzaEJsb2NrV3IobXZGbGFzaEluZm8sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uRU9GcG9pbnRlciArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ0J5dGVzLCAoTVZfVTggKikmYmxvY2tbYmxvY2tJbmRleF0pOwogICAgICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uRU9GcG9pbnRlciArPSB3cml0dGVuQnl0ZXM7CiAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgRmlsZSBwb2ludGVyICovCiAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5maWxlUG9pbnRlciA9IAogICAgICAgICAgICAgICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLkVPRnBvaW50ZXI7CiAgICAgICAgICAgIGlmKHJlbWFpbmluZ0J5dGVzID09IGZyZWVCeXRlc0luQmxvY2spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG12Rmxhc2g4V3IobXZGbGFzaEluZm8sIChuZXh0QmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZTX0JMT0NLX1NUQVRVU19GTEFHX09GRlNFVCwgRlNfQkxPQ0tfSU5fVVNFKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gd3JpdHRlbkJ5dGVzOyAKICAgICAgICB9CiAgICAgICAgZWxzZSAvKiBNb3JlIGJsb2NrcyBhcmUgbmVlZGVkICovCiAgICAgICAgewogICAgICAgICAgICAvKiBGaWxsIHRoZSBjdXJyZW50IGJsb2NrICovCiAgICAgICAgICAgIHdyaXR0ZW5CeXRlcyA9IG12Rmxhc2hCbG9ja1dyKG12Rmxhc2hJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uRU9GcG9pbnRlciArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVCeXRlc0luQmxvY2ssIChNVl9VOCAqKSZibG9ja1tibG9ja0luZGV4XSk7CiAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5FT0Zwb2ludGVyICs9IHdyaXR0ZW5CeXRlczsKICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBGaWxlIHBvaW50ZXIgKi8KICAgICAgICAgICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLmZpbGVQb2ludGVyID0gCiAgICAgICAgICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uRU9GcG9pbnRlcjsKICAgICAgICAgICAgdG90YWxXcml0dGVuQnl0ZXMgKz0gd3JpdHRlbkJ5dGVzOwogICAgICAgICAgICBpZih3cml0dGVuQnl0ZXMgIT0gZnJlZUJ5dGVzSW5CbG9jaykgLyogZXJyb3IgKi8KICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbFdyaXR0ZW5CeXRlczsKICAgICAgICAgICAgbXZGbGFzaDhXcihtdkZsYXNoSW5mbywgKG5leHRCbG9ja1BvaW50ZXIgJiBGU19CTE9DS19PRkZTRVRfTUFTSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGU19CTE9DS19TVEFUVVNfRkxBR19PRkZTRVQsIEZTX0JMT0NLX0lOX1VTRSk7CiAgICAgICAgICAgIHJlbWFpbmluZ0J5dGVzIC09IGZyZWVCeXRlc0luQmxvY2s7CiAgICAgICAgICAgIGJsb2NrSW5kZXggKz0gZnJlZUJ5dGVzSW5CbG9jazsKICAgICAgICB9CiAgICB9CiAgICBudW1iZXJPZkJsb2NrcyA9IHJlbWFpbmluZ0J5dGVzIC8gYmxvY2tTaXplOwogICAgZm9yKGkgPSAwIDsgaSA8IG51bWJlck9mQmxvY2tzIDsgaSsrKQogICAgewogICAgICAgIC8qIEFsbCB0aGUgYmxvY2tzIGluIHRoaXMgbG9vcCB3aWxsIGJlIGZ1bGx5IGV4cGxvaXRlZCAqLwogICAgICAgIG5ld0Jsb2NrUG9pbnRlciA9IG12RlNHZXRGcmVlQmxvY2tGb3JXcml0ZSgpOwogICAgICAgIGlmKG5ld0Jsb2NrUG9pbnRlciA9PSBGU19OT19GUkVFX0JMT0NLUykKICAgICAgICAgICAgcmV0dXJuIHRvdGFsV3JpdHRlbkJ5dGVzOwogICAgICAgIC8qIFVwZGF0ZSB0aGUgbmV4dEJsb2NrUG9pbnRlciAqLwogICAgICAgIG12Rmxhc2gzMldyKG12Rmxhc2hJbmZvLCBuZXh0QmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0ssCiAgICAgICAgICAgICAgICAgICAgICAgbmV3QmxvY2tQb2ludGVyIHwgRlNfQkxPQ0tfT0ZGU0VUKTsKICAgICAgICAvKiBVcGRhdGUgdGhlIHN0YXR1cyBmbGFnICovCiAgICAgICAgbXZGbGFzaDhXcihtdkZsYXNoSW5mbywgKG5ld0Jsb2NrUG9pbnRlciAmIEZTX0JMT0NLX09GRlNFVF9NQVNLKSArIAogICAgICAgICAgICAgICAgICAgICAgIEZTX0JMT0NLX1NUQVRVU19GTEFHX09GRlNFVCwgRlNfQkxPQ0tfSU5fVVNFKTsKICAgICAgICAvKiBXcml0ZSBUaGUgRGF0YSAqLwogICAgICAgIHdyaXR0ZW5CeXRlcyA9IG12Rmxhc2hCbG9ja1dyKG12Rmxhc2hJbmZvLCAobmV3QmxvY2tQb2ludGVyICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfQkxPQ0tfT0ZGU0VUX01BU0spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGU19CTE9DS19IRUFERVJfU0laRSwgYmxvY2tTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNVl9VOCAqKSZibG9ja1tibG9ja0luZGV4XSk7CiAgICAgICAgYmxvY2tJbmRleCArPSBibG9ja1NpemU7CiAgICAgICAgdG90YWxXcml0dGVuQnl0ZXMgKz0gd3JpdHRlbkJ5dGVzOwogICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgRU9GcG9pbnRlciBpcyBzZXQgZm9yIGVycm9yIGhhbmRsaW5nICovCiAgICAgICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLkVPRnBvaW50ZXIgPSAobmV3QmxvY2tQb2ludGVyIAogICAgICAgICAgICAmIEZTX0JMT0NLX09GRlNFVF9NQVNLKSArIEZTX0JMT0NLX0hFQURFUl9TSVpFICsgd3JpdHRlbkJ5dGVzIC0gMTsKICAgICAgICAvKiBVcGRhdGUgdGhlIEZpbGUgcG9pbnRlciAqLwogICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5maWxlUG9pbnRlciA9IAogICAgICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uRU9GcG9pbnRlcjsKICAgICAgICBpZih3cml0dGVuQnl0ZXMgIT0gYmxvY2tTaXplKS8qIEVycm9yICovCiAgICAgICAgICAgIHJldHVybiB0b3RhbFdyaXR0ZW5CeXRlczsKICAgICAgICByZW1haW5pbmdCeXRlcyAtPSBibG9ja1NpemU7CiAgICAgICAgbmV4dEJsb2NrUG9pbnRlciA9IG5ld0Jsb2NrUG9pbnRlcjsKICAgIH0KICAgIGlmKHJlbWFpbmluZ0J5dGVzID09IDApCiAgICAgICAgcmV0dXJuIHRvdGFsV3JpdHRlbkJ5dGVzOwogICAgLyogQWxsb2NhdGUgYSBuZXcgYmxvY2sgZm9yIHRoZSByZW1haW5pbmcgYnl0ZXMgKi8KICAgIG5ld0Jsb2NrUG9pbnRlciA9IG12RlNHZXRGcmVlQmxvY2tGb3JXcml0ZSgpOwogICAgaWYobmV3QmxvY2tQb2ludGVyID09IEZTX05PX0ZSRUVfQkxPQ0tTKQogICAgICAgIHJldHVybiB0b3RhbFdyaXR0ZW5CeXRlczsKICAgIC8qIFVwZGF0ZSB0aGUgbmV4dEJsb2NrUG9pbnRlciAqLwogICAgbXZGbGFzaDMyV3IobXZGbGFzaEluZm8sIG5leHRCbG9ja1BvaW50ZXIgJiBGU19CTE9DS19PRkZTRVRfTUFTSywKICAgICAgICAgICAgICAgICAgIG5ld0Jsb2NrUG9pbnRlciB8IEZTX0JMT0NLX09GRlNFVCk7CiAgICAvKiBVcGRhdGUgdGhlIHN0YXR1cyBmbGFnICovCiAgICBtdkZsYXNoOFdyKG12Rmxhc2hJbmZvLCAobmV3QmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spICsgCiAgICAgICAgICAgICAgICAgICBGU19CTE9DS19TVEFUVVNfRkxBR19PRkZTRVQsIEZTX0JMT0NLX0lOX1VQREFURSk7CiAgICAvKiBXcml0ZSBUaGUgRGF0YSAqLwogICAgd3JpdHRlbkJ5dGVzID0gbXZGbGFzaEJsb2NrV3IobXZGbGFzaEluZm8sIChuZXdCbG9ja1BvaW50ZXIgJiBGU19CTE9DS19PRkZTRVRfTUFTSykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZTX0JMT0NLX0hFQURFUl9TSVpFLCByZW1haW5pbmdCeXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTVZfVTggKikmYmxvY2tbYmxvY2tJbmRleF0pOwogICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLkVPRnBvaW50ZXIgPSAobmV3QmxvY2tQb2ludGVyIAogICAgICAgICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spICsgRlNfQkxPQ0tfSEVBREVSX1NJWkUgKyB3cml0dGVuQnl0ZXMgLSAxOwogICAgLyogVXBkYXRlIHRoZSBGaWxlIHBvaW50ZXIgKi8KICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5maWxlUG9pbnRlciA9IAogICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5FT0Zwb2ludGVyOwogICAgdG90YWxXcml0dGVuQnl0ZXMgKz0gd3JpdHRlbkJ5dGVzOwogICAgcmV0dXJuIHRvdGFsV3JpdHRlbkJ5dGVzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG12RlNHZXROdW1PZlZhbGlkQnl0ZXMgLSBSZXR1cm4gdGhlIG51bWJlciBvZiB2YWxpZCBieXRlcyBmcm9tIAoqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja09mZnNldFBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2suCioKKiBERVNDUklQVElPTjoKKiAgICAgICBOb25lLgoqCiogSU5QVVQ6CiogICAgICAgYmxvY2tQb2ludGVyIC0gVGhlIG9mZnNldCBvZiB0aGUgYmxvY2sgdG8gcmVhZCBpdHMgdmFsaWQgYnl0ZXMuCiogICAgICAgYmxvY2tPZmZzZXRQb2ludGVyIC0gVGhlIG9mZnNldCB3aXRoaW4gdGhlIGJsb2NrIHRvIHJlYWQgdGhlIHZhbGlkIAoqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzIGZyb20uCiogICAgICAgRU9GcG9pbnRlciAtIFRoZSBFT0Ygb2Zmc2V0LgoqIE9VVFBVVDoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOOgoqICAgICAgIE51bWJlciBvZiB2YWxpZCBieXRlcy4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp1bnNpZ25lZCBpbnQgbXZGU0dldE51bU9mVmFsaWRCeXRlcyh1bnNpZ25lZCBpbnQgYmxvY2tQb2ludGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYmxvY2tPZmZzZXRQb2ludGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRU9GcG9pbnRlcikKewogICAgaWYoKGJsb2NrT2Zmc2V0UG9pbnRlciAmIEZTX0JMT0NLX09GRlNFVF9NQVNLKSA9PQogICAgICAgKEVPRnBvaW50ZXIgJiBGU19CTE9DS19PRkZTRVRfTUFTSykpCiAgICB7CiAgICAgICAgLyogVGhpcyBpcyB0aGUgbGFzdCBibG9jayAqLwogICAgICAgIGlmKEVPRnBvaW50ZXIgPiBibG9ja09mZnNldFBvaW50ZXIpCiAgICAgICAgICAgIHJldHVybiAoRU9GcG9pbnRlciAtIGJsb2NrT2Zmc2V0UG9pbnRlcik7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZigobXZGbGFzaDhSZChtdkZsYXNoSW5mbywgKGJsb2NrT2Zmc2V0UG9pbnRlciAmIEZTX0JMT0NLX09GRlNFVF9NQVNLKSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19CTE9DS19PRkZTRVRfRkxBR19PRkZTRVQpID09IEZTX0ZVTExfQkxPQ0spIAogICAgICAgICAgIHx8ICgoYmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUKSA9PSBGU19CTE9DS19PRkZTRVQpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIChGU19CTE9DS19TSVpFIC0gMSAtIChibG9ja09mZnNldFBvaW50ZXIgJiBGU19CTE9DS19PRkZTRVQpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSAvKiBvZmZzZXQgZmllbGQgaXMgdXNlZCAqLwogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICgoYmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUKSArIG12Rmxhc2gxNlJkKG12Rmxhc2hJbmZvLAogICAgICAgICAgICAgICAgKGJsb2NrUG9pbnRlciAmIEZTX0JMT0NLX09GRlNFVF9NQVNLKSArIEZTX0JMT0NLX09GRlNFVF9PRkZTRVQpIAogICAgICAgICAgICAgICAgLSAoYmxvY2tPZmZzZXRQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUKSk7CiAgICAgICAgfQogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG12RlNSZWFkIC0gUmVhZCBhIGJsb2NrIG9mIGRhdGEgaW50byBibG9jayBmcm9tIGEgZmlsZS4KKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgZnVuY3Rpb24gcmVhZHMgYSBibG9jayBvZiBkYXRhIGZyb20gYSBmaWxlIG9wZW5lZCBieSBhbGwgbW9kZXMgCiogICAgICAgZXhjZXB0IJMgdyCUIG1vZGUgLCAgaW50byBhIGdpdmVuIGJsb2NrICAokWJsb2NrkiBwYXJhbWV0ZXIgKSAuV2hpbGUgdGhlCiogICAgICAgZmlsZSBpcyBvcGVuZWQgLCB0aGUgZnVuY3Rpb24gd2lsbCBzdGFydCByZWFkaW5nIHRoZSBmaWxlIGZyb20gdGhlIAoqICAgICAgIGJlZ2luaW5nIGlmIGl0cyB0aGUgZmlyc3QgcmVhZCBhdHRlbXB0IGFmdGVyIG9wZW5pbmcgdGhlIGZpbGUgb3IgZnJvbSAKKiAgICAgICB0aGUgbGFzdCBwb2ludCB3aXRoaW4gdGhlIGJsb2NrICBvZiBkYXRhIHdlcmUgdGhlIHByZXZpb3VzIHJlYWQgYWN0aW9uIAoqICAgICAgIGVuZGVkIC5UaGUgcmVhZCBhY3Rpb24gd2lsbCBub3QgZXhjZWVkIHRoZSBFT0YgcG9pbnRlciBpZiB0aGUgCiogICAgICAgkW51bWJlck9mQnl0ZXOSIHBhcmFtZXRlciBpcyBsYXJnZXIgdGhhbiB0aGUgd2hvbGUgZmlsZSBvciB0aGUgbnVtYmVyIG9mCiogICAgICAgYnl0ZXMgbGVmdCBmcm9tIHRoZSBwcmV2aW91cyByZWFkIGFjdGlvbiAuIER1cmluZyB0aGUgcmVhZCBhdHRlbXB0ICwgdGhlCiogICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4gZXJyb3IgY29kZSBvciAwIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6CioKKiAgICAgICAtIGlmIHRoZSBnaXZlbiBmaWxlIGhhbmRsZXIgaXMgaW52YWxpZCAgdGhhdCBpcyAsIGdyYXRlciBvciBlcXVhbCB0byAKKiAgICAgICAgIE1BWF9OVU1fT0ZfRU5UUklFUyAgIChkZWZpbmVkIGluIGZpbGVTeXMuaCkuCiogICAgICAgLSBpZiB0aGUgZW50cnkgb2YgdGhlIGZpbGUgaGFuZGxlciB3aXRoaW4gdGhlIGR5bmFtaWMgZGF0YWJhc2UgaG9sZHMgdGhlCiogICAgICAgICBzdGF0dXMgRlJFRV9FTlRSWSAuCiogICAgICAgLSBpZiB0aGUgbW9kZSBvZiB0aGUgb3BlbmVkIGZpbGUgaXMgd3JpdGUgb25seSAtIJMgd5QgLgoqICAgICAgIC0gaWYgdGhlIEVPRiBwb2ludGVyIGlzIGVxdWFsIHRvIHRoZSBmaWxlIHBvaW50ZXIgdGhhdCBpbmRpY2F0ZXMgdGhlIAoqICAgICAgICAgY3VycnVlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBmaWxlLgoqICAgICAgIC0gaWYgdGhlIJFuZXh0QmxvY2tQb2ludGVykiBmaWVsZCB3aXRoaW4gdGhlIGVudHJ5IGluIHRoZSBGQVQgaXMgZXF1YWwgCiogICAgICAgICB0byAweEZGRkZGRkZGIGluZGljYXRpbmcgdGhlIGZpbGUgaXMgZW1wdHkuICAKKiAgICAgICAgIEluIGEgc3VjY2Vzc2Z1bGwgcmVhZCBvcGVyYXRpb24gdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YKKiAgICAgICAgIGJ5dGVzIHJlYWQgLCBpZiB0aGlzIHZhbHVlIGlzIG5vdCBlcXVhbCB0byB0aGUgkW51bWJlck9mQnl0ZXOSIAoqICAgICAgICAgcGFyYW1ldGVyIGRlbGl2ZXJlZCAgdG8gdGhlIGZ1bmN0aW9uICwgdGhlIHJlYWQgYWN0aW9uIHJlYWNoZWQgRU9GLiAgIAoqCiogSU5QVVQ6CiogICAgICAgZmlsZUhhbmRsZXIgLSBUaGUgZmlsZSBoYW5kbGVyIG9mIHRoZSBmaWxlIHRvIGJlIHJlYWQuCiogICAgICAgbnVtT2ZCeXRlcyAtIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZCBmcm9tIHRoZSBmaWxlIHRvIHRoZSBkYXRhIAoqICAgICAgICAgICAgICAgICAgICBhcnJheS4KKiAgICAgICBibG9jayAtIFRoZSBkYXRhIGFycmF5IHRvIGhvbGQgdGhlIHJlYWQgZGF0YSBmcm9tIHRoZSBmaWxlLgoqCiogT1VUUFVUOgoqICAgICAgIGJsb2NrIGZpbGxlZCB3aXRoIGRhdGEgZnJvbSB0aGUgZmlsZS4KKgoqIFJFVFVSTjoKKiAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgLiBJZiB0aGlzIHZhbHVlIGlzIG5vdCBlcXVhbCB0byB0aGUgCiogICAgICAgkW51bWJlck9mQnl0ZXOSIHBhcmFtZXRlciBkZWxpdmVyZWQgIHRvIHRoZSBmdW5jdGlvbiAsIHRoZSByZWFkIGFjdGlvbgoqICAgICAgIHJlYWNoZWQgRU9GLlRoZSBmdW5jdGlvbiBjYW4gYWxzbyByZXR1cm4gdGhlIGZvbGxvd2luZyB2YWx1ZXMgaW4gY2FzZSBvZgoqICAgICAgIGFuIGVycm9yIDoKKiAgICAgICAtIEZJTEVfUkVBRF9FUlJPUiBpZiB0aGUgZmlsZUhhbmRsZXIgaXMgbGFyZ2VyIG9yIGVxdWFsIHRvIAoqICAgICAgICAgTUFYX05VTV9PRl9FTlRSSUVTIGRlZmluZWQgaW4gZmlsZVN5cy5oIG9yIGlmIHRoZSBzdGF0dXMgZmxhZyBvZiB0aGUgCiogICAgICAgICBmaWxlIGVudHJ5IGluIHRoZSBkeW5hbWljIGRhdGFiYXNlIGhvbGRzIHRoZSB2YWx1ZSBGUkVFX0VOVFJZLgoqICAgICAgIC0gMCBpZiB0aGUgZmlsZSB3YXMgb3BlbmVkIGFzIHdyaXRlIG9ubHkgLCB0aGUgRU9GIHBvaW50ZXIgaXMgZXF1YWwgdG8gCiogICAgICAgICB0aGUgZmlsZSBwb2ludGVyIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgbG9hY3Rpb24gd2l0aGluIHRoZSBmaWxlIG9yIAoqICAgICAgICAgdGhlIJFuZXh0QmxvY2tQb2ludGVykiBmaWVsZCB3aXRoaW4gdGhlIGZpbGUgZW50cnkgaW4gdGhlIGZsYXNoIGlzIAoqICAgICAgICAgZXF1YWwgdG8gMHhGRkZGRkZGRiAoZW1wdHkgZmlsZSkuICAKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp1bnNpZ25lZCBpbnQgbXZGU1JlYWQoRlNfRklMRV9IQU5ETEVSIGZpbGVIYW5kbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bWJlck9mQnl0ZXMsY2hhciAqIGJsb2NrKQp7CiAgICB1bnNpZ25lZCBpbnQgYmxvY2tJbmRleCA9IDAsbmV4dEJsb2NrUG9pbnRlcixFT0Zwb2ludGVyOwogICAgdW5zaWduZWQgaW50IHJlbWFpbmluZ0J5dGVzLGZyZWVCeXRlc0luQmxvY2ssYnl0ZXNSZWFkOwogICAgdW5zaWduZWQgaW50IHRvdGFsQnl0ZXNSZWFkID0gMCxibG9ja1NpemU7CgogICAgaWYoKGZpbGVIYW5kbGVyID49IEZTX01BWF9OVU1fT0ZfRU5UUklFUykgfHwKICAgICAgIChtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uc3RhdHVzRmxhZyA9PSBGU19GUkVFX0VOVFJZKSB8fAogICAgICAgbnVtYmVyT2ZCeXRlcyA9PSAwKQogICAgICAgIHJldHVybiBGU19GSUxFX1JFQURfRVJST1I7CiAgICBpZihtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0ubW9kZVswXSA9PSAndycgJiYKICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5tb2RlWzFdID09ICdcMCcpCiAgICAgICAgcmV0dXJuIDA7IC8qIEZpbGUgd2FzIG9wZW5lZCBhcyB3cml0ZSBvbmx5ICovCiAgICBpZihtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uRU9GcG9pbnRlciA9PQogICAgICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLmZpbGVQb2ludGVyKQogICAgICAgIHJldHVybiAwOwogICAgYmxvY2tTaXplICAgPSBGU19CTE9DS19TSVpFIC0gRlNfQkxPQ0tfSEVBREVSX1NJWkU7CiAgICBFT0Zwb2ludGVyICA9IG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5FT0Zwb2ludGVyOwogICAgcmVtYWluaW5nQnl0ZXMgPSAgbnVtYmVyT2ZCeXRlczsKICAgIG5leHRCbG9ja1BvaW50ZXIgPSBtdkZsYXNoMzJSZChtdkZsYXNoSW5mbywgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLnBvaW50ZXJUb0ZBVCk7CiAgICBpZihuZXh0QmxvY2tQb2ludGVyID09IDB4ZmZmZmZmZmYpCiAgICAgICAgcmV0dXJuIDA7IC8qIEFuIGVtcHR5IGZpbGUgKi8KICAgIGlmKG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5maWxlUG9pbnRlciA9PSAwKQogICAgewogICAgICAgIC8qIFJlYWQgb25lIGJ5dGUgYW5kIHNldCB0aGUgZmlsZVBvaW50ZXIgdG8gdGhlIGZpcnN0IGJsb2NrICovCiAgICAgICAgYmxvY2tbYmxvY2tJbmRleF0gPSBtdkZsYXNoOFJkKG12Rmxhc2hJbmZvLCAobmV4dEJsb2NrUG9pbnRlciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIEZTX0JMT0NLX09GRlNFVF9NQVNLKSArIEZTX0JMT0NLX0hFQURFUl9TSVpFKTsKICAgICAgICByZW1haW5pbmdCeXRlcy0tOwogICAgICAgIHRvdGFsQnl0ZXNSZWFkKys7CiAgICAgICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLmZpbGVQb2ludGVyID0gKG5leHRCbG9ja1BvaW50ZXIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0JMT0NLX0hFQURFUl9TSVpFOwogICAgICAgIGJsb2NrSW5kZXgrKzsKICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uYmxvY2tQb2ludGVyPSBuZXh0QmxvY2tQb2ludGVyOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8qIHVwZGF0ZSB0aGUgYmxvY2sncyBmaWxlIHBvaW50ZXIgKi8KICAgICAgICBuZXh0QmxvY2tQb2ludGVyID0gbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLmJsb2NrUG9pbnRlcjsKICAgIH0KICAgIHdoaWxlKDEpCiAgICB7CiAgICAgICAgaWYoKG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5maWxlUG9pbnRlciAmIEZTX0JMT0NLX09GRlNFVF9NQVNLKSAhPQogICAgICAgICAgIChuZXh0QmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spKQogICAgICAgIHsgICAvKiBGb3J3YXJkIHRoZSBmaWxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgKi8KICAgICAgICAgICAgYmxvY2tbYmxvY2tJbmRleF0gPSBtdkZsYXNoOFJkKG12Rmxhc2hJbmZvLCAobmV4dEJsb2NrUG9pbnRlciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBGU19CTE9DS19PRkZTRVRfTUFTSykgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfQkxPQ0tfSEVBREVSX1NJWkUpOwogICAgICAgICAgICByZW1haW5pbmdCeXRlcy0tOwogICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCsrOwogICAgICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uZmlsZVBvaW50ZXIgPSAobmV4dEJsb2NrUG9pbnRlciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19CTE9DS19IRUFERVJfU0laRTsKICAgICAgICAgICAgYmxvY2tJbmRleCsrOwogICAgICAgIH0KICAgICAgICBmcmVlQnl0ZXNJbkJsb2NrID0gbXZGU0dldE51bU9mVmFsaWRCeXRlcyhuZXh0QmxvY2tQb2ludGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5maWxlUG9pbnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFT0Zwb2ludGVyKTsKICAgICAgICBpZihmcmVlQnl0ZXNJbkJsb2NrIDw9IHJlbWFpbmluZ0J5dGVzKQogICAgICAgIHsKICAgICAgICAgICAgYnl0ZXNSZWFkID0gbXZGbGFzaEJsb2NrUmQobXZGbGFzaEluZm8sIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5maWxlUG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArMSxmcmVlQnl0ZXNJbkJsb2NrLCAoTVZfVTggKikmYmxvY2tbYmxvY2tJbmRleF0pOwogICAgICAgICAgICByZW1haW5pbmdCeXRlcyAtPSBieXRlc1JlYWQ7CiAgICAgICAgICAgIHRvdGFsQnl0ZXNSZWFkICs9IGJ5dGVzUmVhZDsgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5maWxlUG9pbnRlciArPSBieXRlc1JlYWQ7CiAgICAgICAgICAgIGJsb2NrSW5kZXggKz0gYnl0ZXNSZWFkOwogICAgICAgICAgICBpZihieXRlc1JlYWQgIT0gZnJlZUJ5dGVzSW5CbG9jaykgLyogRmF0YWwgZXJyb3IgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRvdGFsQnl0ZXNSZWFkOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGJ5dGVzUmVhZCA9IG12Rmxhc2hCbG9ja1JkKG12Rmxhc2hJbmZvLCBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uZmlsZVBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKzEscmVtYWluaW5nQnl0ZXMsKE1WX1U4ICopJmJsb2NrW2Jsb2NrSW5kZXhdKTsKICAgICAgICAgICAgdG90YWxCeXRlc1JlYWQgKz0gYnl0ZXNSZWFkOyAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLmZpbGVQb2ludGVyICs9IGJ5dGVzUmVhZDsKICAgICAgICAgICAgYmxvY2tJbmRleCArPSBieXRlc1JlYWQ7CiAgICAgICAgICAgIGlmKGJ5dGVzUmVhZCAhPSByZW1haW5pbmdCeXRlcykgLyogRmF0YWwgZXJyb3IgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRvdGFsQnl0ZXNSZWFkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbWFpbmluZ0J5dGVzIC09IGJ5dGVzUmVhZDsKICAgICAgICB9CiAgICAgICAgaWYoKChuZXh0QmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spID09IAogICAgICAgICAgIChFT0Zwb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spKSB8fCByZW1haW5pbmdCeXRlcyA9PSAwKQogICAgICAgIHsgICAvKiBMYXN0IHZhbGlkIGJsb2NrICovCiAgICAgICAgICAgIHJldHVybiB0b3RhbEJ5dGVzUmVhZDsKICAgICAgICB9CiAgICAgICAgbmV4dEJsb2NrUG9pbnRlciA9IG12Rmxhc2gzMlJkKG12Rmxhc2hJbmZvLCBuZXh0QmxvY2tQb2ludGVyICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19CTE9DS19PRkZTRVRfTUFTSyk7CiAgICAgICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLmJsb2NrUG9pbnRlciA9IG5leHRCbG9ja1BvaW50ZXI7CiAgICB9CiAgICByZXR1cm4gdG90YWxCeXRlc1JlYWQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbXZGU1Jld2luZCAtIFNldCB0aGUgZmlsZSBwb2ludGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIGZ1bmN0aW9uIHNldCB0aGUgZmlsZSBwb2ludGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGdpdmVuIGZpbGUuCioKKiBJTlBVVDoKKiAgICAgICBmaWxlSGFuZGxlciAtIFRoZSBmaWxlIGhhbmRsZXIgb2YgdGhlIGZpbGUgdG8gcmV3aW5kIGl0cyBwb2ludGVyLgoqCiogT1VUUFVUOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk46CiogICAgICAgMCBvbiBzdWNjZXMgb3RoZXJ3aXNlIDB4ZmZmZmZmZmYuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdW5zaWduZWQgaW50IG12RlNSZXdpbmQoRlNfRklMRV9IQU5ETEVSIGZpbGVIYW5kbGVyKQp7CiAgICBpZigoZmlsZUhhbmRsZXIgPj0gRlNfTUFYX05VTV9PRl9FTlRSSUVTKSB8fAogICAgICAgKG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5zdGF0dXNGbGFnID09IEZTX0ZSRUVfRU5UUlkpKQogICAgICAgIHJldHVybiAweGZmZmZmZmZmOwogICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLmZpbGVQb2ludGVyID0gMDsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG12RlNTZWVrIC0gTW92ZSB0aGUgZmlsZSBwb2ludGVyIGZyb20gdGhlIG9yaWdpbiBzcGVjaWZpZWQuCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIGZ1bmN0aW9uIG1vdmWScyB0aGUgZmlsZS1wb2ludGVyIGFzc29jaWF0ZWQgd2l0aCCRZmlsZWhhbmRsZXKSIHRvIGEKKiAgICAgICBuZXcgbG9jYXRpb24gdGhhdCBpcyCRb2Zmc2V0kiBieXRlcyBmcm9tIJFvcmlnaW6SLlRoZSBhcmd1bWVudCCRb3JpZ2lukiAKKiAgICAgICBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyAsIGRlZmluZWQgaW4gbXZGUy5oIDoKKiAgICAgICAKKiAgICAgICAgU0VFS19DVVIgLSBDdXJyZW50IHBvc2l0aW9uIG9mIGZpbGUgcG9pbnRlci4KKiAgICAgICAgU0VFS19FTkQgLSBFbmQgb2YgZmlsZS4KKiAgICAgICAgU0VFS19TRVQgLSBCZWdpbm5pbmcgb2YgZmlsZS4gCioKKiAgICAgICBUaGUgkW9mZnNldJIgYXJndW1lbnQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gbW92ZSByZWxhdGl2ZWx5IAoqICAgICAgIHRvIJFvcmlnaW6SLgoqCiogSU5QVVQ6CiogICAgICAgZmlsZUhhbmRsZXIgLSBUaGUgZmlsZS1oYW5kbGVyIG9mIHRoZSBmaWxlIHRvIHJlcG9zaXRpb24gaXRzIAoqICAgICAgICAgICAgICAgICAgICAgZmlsZS1wb2ludGVyLgoqICAgICAgIE9mZnNldCAtIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gbW92ZSB0aGUgZmlsZSBwb2ludGVyIGZyb20gkW9yaWdpbpIuCiogICAgICAgT3JpZ2luIC0gVGhlIHJlbGF0aXZlIHBvaW50IHdpdGhpbiB0aGUgZmlsZSB0byBtb3ZlIHRoZSBmaWxlLXBvaW50ZXIgCiogICAgICAgICAgICAgICAgkW9mZnNldJIgYnl0ZXMgIGZyb20gaXQuTXVzdCBiZSBvbmUgb2YgdGhlIHRocmVlIHZhbHVlcyAKKiAgICAgICAgICAgICAgICAgZGVzY3JpYmVkIGFib3ZlLiAgICAgIAoqCiogT1VUUFVUOgoqICAgICAgIEZpbGUtcG9pbnRlciBsb2NhdGVkIG9uIGl0cyBuZXcgcGxhY2UgKCBvbiBzdWNjZXNzICkuCioKKiBSRVRVUk46CiogICAgICAgdHJ1ZSBvbiBzdWNjZXMsIDB4ZmZmZmZmZmYgb3RoZXJ3aXNlLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnVuc2lnbmVkIGludCBtdkZTU2VlayhGU19GSUxFX0hBTkRMRVIgZmlsZUhhbmRsZXIsaW50IG9mZnNldCxpbnQgb3JpZ2luKQp7CiAgICB1bnNpZ25lZCBpbnQgICAgbmV4dEJsb2NrUG9pbnRlcixmaWxlU2l6ZTsKICAgIHVuc2lnbmVkIGludCAgICB2YWxpZEJ5dGVzLHRlbXA7CiAgICBpbnQgICAgICAgICAgICAgdGVtcFNpemUgPSAwLHRlbXBPZmZzZXQgPSAwOwoKICAgIGlmKChmaWxlSGFuZGxlciA+PSBGU19NQVhfTlVNX09GX0VOVFJJRVMpIHx8CiAgICAgICAobXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLnN0YXR1c0ZsYWcgPT0gRlNfRlJFRV9FTlRSWSkpCiAgICAgICAgcmV0dXJuIDB4ZmZmZmZmZmY7CiAgICBmaWxlU2l6ZSA9IG12RlNGaWxlU2l6ZShmaWxlSGFuZGxlcik7CiAgICBpZihmaWxlU2l6ZSA9PSAweGZmZmZmZmZmIHx8IGZpbGVTaXplID09IDApCiAgICAgICAgcmV0dXJuIDB4ZmZmZmZmZmY7CiAgICBuZXh0QmxvY2tQb2ludGVyID0gbXZGbGFzaDMyUmQobXZGbGFzaEluZm8sIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5wb2ludGVyVG9GQVQpOwogICAgc3dpdGNoKG9yaWdpbikKICAgIHsKICAgIGNhc2UgRlNfU0VFS19FTkQ6CiAgICAgICAgaWYob2Zmc2V0IDw9IDApCiAgICAgICAgICAgIHJldHVybiAxLyp0cnVlKi87CiAgICAgICAgaWYoKHVuc2lnbmVkIGludClvZmZzZXQgPj0gZmlsZVNpemUpCiAgICAgICAgewogICAgICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uZmlsZVBvaW50ZXIgPSAwOwogICAgICAgICAgICByZXR1cm4gMS8qdHJ1ZSovOwogICAgICAgIH0KICAgICAgICBvZmZzZXQgPSBmaWxlU2l6ZSAtIG9mZnNldDsKICAgICAgICBicmVhazsKICAgIGNhc2UgRlNfU0VFS19TRVQ6CiAgICAgICAgaWYob2Zmc2V0IDw9IDApCiAgICAgICAgewogICAgICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uZmlsZVBvaW50ZXIgPSAwOwogICAgICAgICAgICByZXR1cm4gMS8qdHJ1ZSovOwogICAgICAgIH0KICAgICAgICBpZigodW5zaWduZWQgaW50KW9mZnNldCA+PSBmaWxlU2l6ZSkKICAgICAgICB7CiAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5maWxlUG9pbnRlciA9CiAgICAgICAgICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uRU9GcG9pbnRlcjsKICAgICAgICAgICAgcmV0dXJuIDEvKnRydWUqLzsKICAgICAgICB9CiAgICAgICAgd2hpbGUodGVtcE9mZnNldCA8IG9mZnNldCkKICAgICAgICB7CiAgICAgICAgICAgIHZhbGlkQnl0ZXMgPSBtdkZTR2V0TnVtT2ZWYWxpZEJ5dGVzKG5leHRCbG9ja1BvaW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dEJsb2NrUG9pbnRlciAmIEZTX0JMT0NLX09GRlNFVF9NQVNLKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZTX0JMT0NLX0hFQURFUl9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5FT0Zwb2ludGVyKTsKICAgICAgICAgICAgaWYoKHRlbXBPZmZzZXQgKyAoaW50KXZhbGlkQnl0ZXMpID49IG9mZnNldCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB0ZW1wT2Zmc2V0ICs9IHZhbGlkQnl0ZXM7CiAgICAgICAgICAgIG5leHRCbG9ja1BvaW50ZXIgPSBtdkZsYXNoMzJSZChtdkZsYXNoSW5mbywgbmV4dEJsb2NrUG9pbnRlciAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBGU19CTE9DS19PRkZTRVRfTUFTSyk7CiAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5ibG9ja1BvaW50ZXIgPSBuZXh0QmxvY2tQb2ludGVyOwogICAgICAgIH0KICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uZmlsZVBvaW50ZXIgPSAKICAgICAgICAgICAgKG5leHRCbG9ja1BvaW50ZXIgJiBGU19CTE9DS19PRkZTRVRfTUFTSykgKwogICAgICAgICAgICAob2Zmc2V0IC0gdGVtcE9mZnNldCkgKyBGU19CTE9DS19IRUFERVJfU0laRSAtIDE7CiAgICAgICAgcmV0dXJuIDEvKnRydWUqLzsKICAgIGNhc2UgRlNfU0VFS19DVVI6IC8qIEluIHRoaXMgY2FzZSBvZmZzZXQgY2FuIGJlIG5lZ2F0aXZlICovCiAgICAgICAgaWYob2Zmc2V0ID09IDApCiAgICAgICAgICAgIHJldHVybiAxLyp0cnVlKi87CiAgICAgICAgLyogdGVtcFNpemUgPSBTaXplIGluIGJ5dGVzIHVwLXRvIGZpbGVQb2ludGVyICovCiAgICAgICAgdGVtcCA9IG5leHRCbG9ja1BvaW50ZXI7CiAgICAgICAgbmV4dEJsb2NrUG9pbnRlciA9IAogICAgICAgICAgICBtdkZsYXNoMzJSZChtdkZsYXNoSW5mbywgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLnBvaW50ZXJUb0ZBVCk7CiAgICAgICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLmJsb2NrUG9pbnRlciA9IG5leHRCbG9ja1BvaW50ZXI7CiAgICAgICAgd2hpbGUobmV4dEJsb2NrUG9pbnRlciAhPSAweGZmZmZmZmZmKQogICAgICAgIHsKICAgICAgICAgICAgaWYobXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLmZpbGVQb2ludGVyID09IDApCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgaWYoKG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5maWxlUG9pbnRlciAmIEZTX0JMT0NLX09GRlNFVF9NQVNLKSA9PQogICAgICAgICAgICAgICAobmV4dEJsb2NrUG9pbnRlciAmIEZTX0JMT0NLX09GRlNFVF9NQVNLKSkgLyogTGFzdCBibG9jayBmb3IgdXMqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0ZW1wU2l6ZSArPSAobXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLmZpbGVQb2ludGVyIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBGU19CTE9DS19PRkZTRVQpIC0gRlNfQkxPQ0tfSEVBREVSX1NJWkUgKyAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoKChuZXh0QmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUKSArIDEpICE9IEZTX0JMT0NLX1NJWkUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKG12Rmxhc2g4UmQobXZGbGFzaEluZm8sIChuZXh0QmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0JMT0NLX09GRlNFVF9GTEFHX09GRlNFVCkgPT0gRlNfRlVMTF9CTE9DSykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wU2l6ZSArPSAoRlNfQkxPQ0tfU0laRSAtIEZTX0JMT0NLX0hFQURFUl9TSVpFKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZihtdkZsYXNoMTZSZChtdkZsYXNoSW5mbywgKG5leHRCbG9ja1BvaW50ZXIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19CTE9DS19PRkZTRVRfTUFTSykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0JMT0NLX09GRlNFVF9PRkZTRVQpICE9IDB4ZmZmZikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBTaXplICs9ICgobmV4dEJsb2NrUG9pbnRlciAmIEZTX0JMT0NLX09GRlNFVCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZGbGFzaDE2UmQobXZGbGFzaEluZm8sIChuZXh0QmxvY2tQb2ludGVyICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19CTE9DS19PRkZTRVRfTUFTSykgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0JMT0NLX09GRlNFVF9PRkZTRVQpIC0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19CTE9DS19IRUFERVJfU0laRSArIDEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wU2l6ZSArPSAoKG5leHRCbG9ja1BvaW50ZXIgJiBGU19CTE9DS19PRkZTRVQpIC0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0JMT0NLX0hFQURFUl9TSVpFICsgMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRlbXBTaXplICs9IChGU19CTE9DS19TSVpFIC0gRlNfQkxPQ0tfSEVBREVSX1NJWkUpOyAKICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0QmxvY2tQb2ludGVyID0gbXZGbGFzaDMyUmQobXZGbGFzaEluZm8sIG5leHRCbG9ja1BvaW50ZXIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19CTE9DS19PRkZTRVRfTUFTSyk7CiAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5ibG9ja1BvaW50ZXIgPSBuZXh0QmxvY2tQb2ludGVyOwogICAgICAgIH0KICAgICAgICBuZXh0QmxvY2tQb2ludGVyID0gdGVtcDsKICAgICAgICBvZmZzZXQgPSB0ZW1wU2l6ZSArIG9mZnNldDsKICAgICAgICBpZihvZmZzZXQgPj0gKGludClmaWxlU2l6ZSkKICAgICAgICB7CiAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5maWxlUG9pbnRlciA9CiAgICAgICAgICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uRU9GcG9pbnRlcjsKICAgICAgICAgICAgcmV0dXJuIDEvKnRydWUqLzsKICAgICAgICB9CiAgICAgICAgaWYob2Zmc2V0IDw9IChpbnQpMCkKICAgICAgICB7CiAgICAgICAgICAgIG12RlNFbnRyaWVzW2ZpbGVIYW5kbGVyXS5maWxlUG9pbnRlciA9IDA7CiAgICAgICAgICAgIHJldHVybiAxLyp0cnVlKi87CiAgICAgICAgfQogICAgICAgIHdoaWxlKHRlbXBPZmZzZXQgPCBvZmZzZXQpCiAgICAgICAgewogICAgICAgICAgICB2YWxpZEJ5dGVzID0gbXZGU0dldE51bU9mVmFsaWRCeXRlcyhuZXh0QmxvY2tQb2ludGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5leHRCbG9ja1BvaW50ZXIgJiBGU19CTE9DS19PRkZTRVRfTUFTSykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGU19CTE9DS19IRUFERVJfU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uRU9GcG9pbnRlcik7CiAgICAgICAgICAgIGlmKCh0ZW1wT2Zmc2V0ICsgKGludCl2YWxpZEJ5dGVzKSA+PSBvZmZzZXQpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgdGVtcE9mZnNldCArPSB2YWxpZEJ5dGVzOwogICAgICAgICAgICBuZXh0QmxvY2tQb2ludGVyID0gbXZGbGFzaDMyUmQobXZGbGFzaEluZm8sIG5leHRCbG9ja1BvaW50ZXIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spOwogICAgICAgICAgICBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0uYmxvY2tQb2ludGVyID0gbmV4dEJsb2NrUG9pbnRlcjsKICAgICAgICB9CiAgICAgICAgbXZGU0VudHJpZXNbZmlsZUhhbmRsZXJdLmZpbGVQb2ludGVyID0gCiAgICAgICAgICAgIChuZXh0QmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spICsKICAgICAgICAgICAgKG9mZnNldCAtIHRlbXBPZmZzZXQpICsgRlNfQkxPQ0tfSEVBREVSX1NJWkUgLSAxOwogICAgICAgIHJldHVybiAxLyp0cnVlKi87CiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAweGZmZmZmZmZmOwogICAgfQogICAgcmV0dXJuIDB4ZmZmZmZmZmY7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbXZGU1JlYWRFcmFzaW5nQ291bnRlciAtIFJlYWRzIHRoZSB2YWx1ZSBvZiB0aGUgZXJhc2luZyBjb3VudGVyIChpZiAKKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQpLgoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgdmFsdWUgb2YgdGhlIGVyYXNpbmcgY291bnRlciAoIGlmIGltcGxlbWVudGVkICkKKiAgICAgICBvZiB0aGUgZ2l2ZW4gc2VjdG9yIC5UaGUgZXJhc2luZyBjb3VudGVyIGlzIGVuYWJsZWQgYnkgdGhlIGZ1bmN0aW9uIAoqICAgICAgIJFmaWxlU3lzRm9ybWF0kiAgKGJ5IHRoZSCRbW9kZZIgcGFyYW1ldGVyKSAuIEl0IGlzICBpbXBsaW1lbnRlZCBieSAKKiAgICAgICBhbGxvY2F0aW5nIG9uZSBibG9jayBhdCB0aGUgZW5kIG9mIGVhY2ggc2VjdG9yIGFuZCBpdCBoZWxwcyBtb25pdG9yaW5nIAoqICAgICAgIHRoZSBudW1iZXIgb2YgZXJhc3VyZXMgb2YgdGhlIHNlY3RvciB0aGUgY291bnRlciBpcyBhdCAuCiogICAgICBOT1RFOgoqICAgICAgIGhlIGZpbGUgc3lzdGVtJ3MgZGF0YSBiYXNlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYnkgkWZpbGVTeXNJbml0kiBmdW5jdGlvbgoqICAgICAgIGJlZm9yZSB1c2luZyAgdGhpcyBmdW5jdGlvbiAuICAgICAgICAgICAKKgoqIElOUFVUOgoqICAgICAgIHNlY3Rvck51bWJlciAtIFRoZSBzZWN0b3IgbnVtYmVyIHRvIHJlYWQgaXRzIGVyYXNpbmcgY291bnRlciAKKiAgICAgICAgICAgICAgICAgICAgICAoaWYgaW1wbGVtZW50ZWQpLiAKKgoqIE9VVFBVVDoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOOgoqICAgICAgIFRoZSB2bGF1ZSBvZiB0aGUgZXJhc2luZyBjb3VudGVyLCAweGZmZmZmZmZmIGluIGNhc2UgdGhlIGVyYXNpbmcKKiAgICAgICBjb3VudGVyIHdhcyBub3QgaW1wbGVtZW50ZWQgb3IgdGhlIHNlY3RvciBudW1iZXIgaXMgbm90IHZhbGlkLiAKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp1bnNpZ25lZCBpbnQgbXZGU1JlYWRFcmFzaW5nQ291bnRlcih1bnNpZ25lZCBpbnQgc2VjdG9yTnVtYmVyKQp7CiAgICB1bnNpZ25lZCBpbnQgY291bnRlclZhbHVlLHNlY3RvckJhc2VBZGRyLHNlY3RvclNpemU7CiAgICAKICAgIGlmKGluaXRpYWxpemF0aW9uRmxhZyAhPSBGU19GSUxFX1NZU1RFTV9JTklUSUFMSVpFRCkKICAgICAgICByZXR1cm4gMHhmZmZmZmZmZjsKICAgIGlmKG12Rmxhc2gzMlJkKG12Rmxhc2hJbmZvLCBtdkZTT2Zmc2V0ICsgRlNfRVJTQUlOR19DT1VOVEVSX0ZMQUdfT0ZGU0VUKSAhPQogICAgICAgRlNfRU5BQkxFX0VSQVNJTkdfQ09VTlRFUikKICAgICAgICByZXR1cm4gMHhmZmZmZmZmZjsKICAgIGlmKChzZWN0b3JCYXNlQWRkciA9IG12Rmxhc2hTZWNPZmZzR2V0KG12Rmxhc2hJbmZvLCBzZWN0b3JOdW1iZXIpKSA9PSAweGZmZmZmZmZmKQogICAgICAgIHJldHVybiAweGZmZmZmZmZmOwogICAgaWYoc2VjdG9yQmFzZUFkZHIgPCBtdkZTT2Zmc2V0KQogICAgICAgIHJldHVybiAweGZmZmZmZmZmOwogICAgc2VjdG9yU2l6ZSA9IG12Rmxhc2hTZWNTaXplR2V0KG12Rmxhc2hJbmZvLCBzZWN0b3JOdW1iZXIpOwogICAgY291bnRlclZhbHVlID0gbXZGbGFzaDMyUmQobXZGbGFzaEluZm8sIHNlY3RvckJhc2VBZGRyICsgc2VjdG9yU2l6ZSAtIEZTX0JMT0NLX1NJWkUpOwogICAgcmV0dXJuIGNvdW50ZXJWYWx1ZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBtdkZTR2V0RnJlZVNpemUgLSBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJlZSBieXRlcyBpbiB0aGUgZmlsZSBzeXN0ZW0uCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBmcmVlIGJ5dGVzIGluIHRoZSBlbnRpcmUgZmlsZSAKKiAgICAgICBzeXN0ZW0uIEl0IGNvdW50cyB0aGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGFuZCBkaXJ0eSBibG9ja3MgKCBibG9ja3MgCiogICAgICAgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHVzZSBieSBhbnkgZmlsZSApIGZyb20gdGhlIGJlZ2luaW5nIG9mIHRoZSAKKiAgICAgICBmaWxlLXN5c3RlbSB0byB0aGUgZW5kICwgYW5kIHJldHVybiB0aGF0IHZhbHVlIG11bHRpcGx5IGJ5IGJsb2NrIHNpemUgCiogICAgICAgKGluIGJ5dGVzKS4gICAgICAgICAKKiAgICAgIE5PVEU6CiogICAgICAgVGhlIGZpbGUgc3lzdGVtJ3MgZGF0YSBiYXNlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYnkgkWZpbGVTeXNJbml0kiAKKiAgICAgICBmdW5jdGlvbiBiZWZvcmUgdXNpbmcgIHRoaXMgZnVuY3Rpb24gLiAgCiogSU5QVVQ6CiogICAgICAgTm9uZS4KKgoqIE9VVFBVVDoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOOgoqICAgICAgIE51bWJlciBvZiBmcmVlIGJ5dGVzIGluIHRoZSBlbnRpcmUgZmlsZS1zeXN0ZW0gb24gc3VjY2VzcywgMHhGRkZGRkZGRiAKKiAgICAgICBvdGhlcndpc2UuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdW5zaWduZWQgaW50IG12RlNHZXRGcmVlU2l6ZSgpCnsKICAgIHVuc2lnbmVkIGludCBmcmVlQmxvY2tPZmZzZXQsc2VjdG9yVG9wT2Zmc2V0LGk7CiAgICB1bnNpZ25lZCBpbnQgc2VjdG9yTnVtYmVyLGxhc3RTZWN0b3I7CiAgICB1bnNpZ25lZCBpbnQgZGlydHlCbG9ja3NDb3VudGVyID0gMCxkaXJ0eUJsb2Nrc1NlY3RvcjsKICAgIHVuc2lnbmVkIGludCBmcmVlQmxvY2tzQ291bnRlciA9IDA7CgogICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgc3lzdGVtJ3MgZGF0YSBiYXNlIHdhcyBpbml0aWFsaXplZCAqLwogICAgaWYoaW5pdGlhbGl6YXRpb25GbGFnICE9IEZTX0ZJTEVfU1lTVEVNX0lOSVRJQUxJWkVEKQogICAgICAgIHJldHVybiAweGZmZmZmZmZmOwogICAgZnJlZUJsb2NrT2Zmc2V0ICAgICA9IG12RlNPZmZzZXQgKyBGU19CTE9DS19TSVpFOwogICAgc2VjdG9yTnVtYmVyICAgICAgICA9IG12Rmxhc2hJbldoaWNoU2VjKG12Rmxhc2hJbmZvLCBmcmVlQmxvY2tPZmZzZXQpOwogICAgbGFzdFNlY3RvciAgICAgICAgICA9IG12Rmxhc2hOdW1PZlNlY3NHZXQobXZGbGFzaEluZm8pOwogICAgZGlydHlCbG9ja3NTZWN0b3IgICA9IHNlY3Rvck51bWJlcjsKICAgIGZvcihpID0gc2VjdG9yTnVtYmVyIDsgaSA8IGxhc3RTZWN0b3IgOyBpKyspCiAgICB7CiAgICAgICAgc2VjdG9yVG9wT2Zmc2V0ID0gbXZGbGFzaFNlY09mZnNHZXQobXZGbGFzaEluZm8sIHNlY3Rvck51bWJlcikgKwogICAgICAgICAgICAgICAgICAgICAgICAgIG12Rmxhc2hTZWNTaXplR2V0KG12Rmxhc2hJbmZvLCBzZWN0b3JOdW1iZXIpIC0gMTsKICAgICAgICB3aGlsZShmcmVlQmxvY2tPZmZzZXQgPCBzZWN0b3JUb3BPZmZzZXQpCiAgICAgICAgewogICAgICAgICAgICBpZihtdkZsYXNoOFJkKG12Rmxhc2hJbmZvLCBmcmVlQmxvY2tPZmZzZXQgKyBGU19CTE9DS19TVEFUVVNfRkxBR19PRkZTRVQpCiAgICAgICAgICAgICAgID09IEZTX0ZSRUVfQkxPQ0spIGZyZWVCbG9ja3NDb3VudGVyKys7CiAgICAgICAgICAgIGlmKG12Rmxhc2g4UmQobXZGbGFzaEluZm8sIGZyZWVCbG9ja09mZnNldCArIEZTX0JMT0NLX1NUQVRVU19GTEFHX09GRlNFVCkKICAgICAgICAgICAgICAgPT0gRlNfRlJFRV9ESVJUWV9CTE9DSykgZGlydHlCbG9ja3NDb3VudGVyKys7CiAgICAgICAgICAgIGZyZWVCbG9ja09mZnNldCArPSBGU19CTE9DS19TSVpFOyAgCiAgICAgICAgfQogICAgICAgIHNlY3Rvck51bWJlciA9IG12Rmxhc2hJbldoaWNoU2VjKG12Rmxhc2hJbmZvLCBmcmVlQmxvY2tPZmZzZXQpOwogICAgfQogICAgcmV0dXJuIChmcmVlQmxvY2tzQ291bnRlciArIGRpcnR5QmxvY2tzQ291bnRlcikgKiAKICAgICAgICAgICAoRlNfQkxPQ0tfU0laRSAtIEZTX0JMT0NLX0hFQURFUl9TSVpFKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogYXNrIHRoZSB1c2VyIHRvIGdpdmUgYSBmaWxlIG5hbWUgYW5kIGNoY2sgaWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdC4qLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCk1WX1ZPSUQgZ2V0X2ZpbGVuYW1lKE1WXzggKmZpbGVOYW1lLCBNVl9CT09MIGV4ZVR5cGUpCnsKICAgIGludCBpOwogICAgZXh0ZXJuIE1WXzggY29uc29sZV9idWZmZXJbXTsKCiAgICB3aGlsZSgxKQogICAgewogICAgICAgIGkgPSAwOwogICAgICAgIHByaW50ZigiRW50ZXIgbmFtZSAmIGV4dGVuc2lvbiBmb3IgdGhlIGZpbGUgKG1heGltdW0gJWQgY2hhcmFjdGVycyBmb3IgdGhlIG5hbWUpXG4iLAogICAgICAgICAgICAgICBGU19GSUxFX05BTUVfTEVOR1RIKTsKCXJlYWRsaW5lKCIgIyAiKTsKCglzdHJjcHkoZmlsZU5hbWUsIGNvbnNvbGVfYnVmZmVyKTsKICAgICAgICB3aGlsZSggaSA8IEZTX0ZJTEVfTkFNRV9MRU5HVEggJiYKICAgICAgICAgICAgICBmaWxlTmFtZVtpXSAhPSAnXDAnICYmIGZpbGVOYW1lW2ldICE9ICcgJykgaSsrOwoJZmlsZU5hbWVbaV0gPSAnXDAnOwogICAgICAgIGlmKGkgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHN0cmNweShmaWxlTmFtZSwiTm9OYW1lIik7CiAgICAgICAgICAgIGkgPSA2OwogICAgICAgICAgICBmaWxlTmFtZVtpXSA9ICdcMCc7CiAgICAgICAgfQoJLyogaWYgZXhlIGZpbGUgdHlwZSAqLwoJaWYoZXhlVHlwZSA9PSBNVl9UUlVFKXsKCQlpID0gMDsKCQl3aGlsZShmaWxlTmFtZVtpXSAhPSAnLicgJiYgaSA8IEZTX0ZJTEVfTkFNRV9MRU5HVEggJiYKICAgICAgICAgICAgICAJCWZpbGVOYW1lW2ldICE9ICdcMCcpIGkrKzsKCQlmaWxlTmFtZVtpXSA9ICcuJzsKCSAgICAgICAgZmlsZU5hbWVbaSsxXSA9ICdlJzsKCSAgICAgICAgZmlsZU5hbWVbaSsyXSA9ICd4JzsKCSAgICAgICAgZmlsZU5hbWVbaSszXSA9ICdlJzsKCSAgICAgICAgZmlsZU5hbWVbaSs0XSA9ICdcMCc7Cgl9CgogICAgICAgIGlmIChtdkZTRmlsZUZpbmQoZmlsZU5hbWUpICE9IEZTX0ZJTEVfTk9UX0ZPVU5EKQogICAgICAgIHsKICAgICAgICAgICAgcHJpbnRmKCJGaWxlIGFscmVhZHkgZXhpc3RzLCBvdmVyd3JpdGU/IChZL04pXG4iKTsKCSAgICByZWFkbGluZSgiID8gIik7CiAgICAgICAgICAgIGlmKHN0cmNtcChjb25zb2xlX2J1ZmZlciwiTiIpID09IDAgfHwgc3RyY21wKGNvbnNvbGVfYnVmZmVyLCJubyIpID09IDAgfHwKICAgICAgICAgICAgICAgc3RyY21wKGNvbnNvbGVfYnVmZmVyLCJuIikgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZihtdkZTRGVsZXRlKGZpbGVOYW1lKSAhPSBGU19GSUxFX0RFTEVURUQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJGaWxlIGNvdWxkIG5vdCBiZSBkZWxldGVkIVxuIik7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIGxvYWQgYSBmaWxlIHRvIHRoZSBmbGFzaCBGUyB1c2luZyB0aGUgdGZ0cC4gKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKdGZ0cGZzX2NtZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIE1WXzggKmFyZ3ZbXSkKewogICAgICAgIGludCAgIAlmaWxlc2l6ZTsKCU1WXzgJZmlsZU5hbWVbQ0ZHX0NCU0laRV07CglNVl9VMzIgICAgc3RhdHVzOwkKCUZTX0ZJTEVfSEFORExFUiAgICBmaWxlSGFuZGxlcjsKCiAgICAJaWYoIWVuYU1vbkV4dCgpKXsKCQlwcmludGYoIlRoaXMgY29tbWFuZCBjYW4gYmUgdXNlZCBvbmx5IGlmIGVuYU1vbkV4dCBpcyBzZXQhXG4iKTsKCQlyZXR1cm4gMDt9CgogICAgICAgIGxvYWRfYWRkciA9IDB4NDAwMDAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIGlmKGFyZ2MgPT0gMikgewogICAgICAgICAgICAgICAgY29weV9maWxlbmFtZSAoQm9vdEZpbGUsIGFyZ3ZbMV0sIHNpemVvZihCb290RmlsZSkpOwogCiAgICAgICAgfWVsc2V7IHByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAKICAgIAlzdGF0dXMgPSBtdkZTSW5pdChGU19OT19DQUNIRSk7CiAgICAJaWYoc3RhdHVzID09IEZTX05PX1ZBTElEX0ZBVF9TVFJJTkcpCiAgICAJewogICAgICAgIAlwcmludGYoIkVSUk9SOiBGU19OT19WQUxJRF9GQVRfU1RSSU5HXG4iKTsKICAgICAgICAJcmV0dXJuIDA7CiAgICAJfQogICAgCWlmKHN0YXR1cyA9PSBGU19PRkZTRVRfT1VUX09GX1JBTkdFKQogICAgCXsKICAgICAgICAJcHJpbnRmKCJFUlJPUjogRlNfT0ZGU0VUX09VVF9PRl9SQU5HRVxuIik7CiAgICAgICAgCXJldHVybiAwOwogICAgCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogICAgICAgIGlmICgoZmlsZXNpemUgPSBOZXRMb29wKFRGVFApKSA8IDApCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAogICAgICAgIC8qIGRvbmUgaWYgbm8gZmlsZSB3YXMgbG9hZGVkIChubyBlcnJvcnMgdGhvdWdoKSAqLwogICAgICAgIGlmIChmaWxlc2l6ZSA8PSAwKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CgoJLyogZ2V0IGEgZmlsZSBuYW1lIGZyb20gdGhlIHVzZXIgKi8KCWdldF9maWxlbmFtZShmaWxlTmFtZSxNVl9GQUxTRSk7CgogICAgIAlmaWxlSGFuZGxlciA9IG12RlNPcGVuKGZpbGVOYW1lLCJ3Iik7CiAgICAJaWYoZmlsZUhhbmRsZXIgPT0gRlNfRklMRV9PUEVOX0VSUk9SKQogICAgCXsKICAgICAgICAJcHJpbnRmKCJFUlJPUjogQ2FuJ3Qgb3BlbiBmaWxlIVxuIik7CiAgICAgICAgCXJldHVybiAwOwogICAgCX0KICAgIAlpZihtdkZTV3JpdGUoZmlsZUhhbmRsZXIsZmlsZXNpemUsKE1WXzggKilsb2FkX2FkZHIpICE9IGZpbGVzaXplKQogICAgCXsKICAgICAgICAJcHJpbnRmKCJFUlJPUjogV3JpdGluZyBkYXRhIHRvIGZpbGUuXG4iKTsKICAgICAgICAJcmV0dXJuIDA7CiAgICAJfQogICAgCXByaW50ZigiRmlsZSBsb2FkZWQgdG8gZmlsZSBzeXN0ZW0gc3VjY2Vzc2Z1bGx5Li4uXG4iKTsKICAgIAltdkZTQ2xvc2UoZmlsZUhhbmRsZXIpOwoKCXJldHVybiAxOwp9CgpVX0JPT1RfQ01EKAoJRlN0ZnRwLCAgICAgIDIsICAgICAxLCAgICAgIHRmdHBmc19jbWQsCgkiRlN0ZnRwCS0gdGZ0cCBhIGZpbGUgdG8gdGhlIEZsYXNoIE1WIEZTXG4iLAoJIiBmaWxlbmFtZS5cbiIKCSJcdERvd25sb2FkIGEgZmlsZSB0aHJvdWdoIHRoZSBuZXR3b3JrIGludGVyZmFjZSB0byB0aGUgRFJBTSgweDQwMDAwMCkgdXNpbmdcbiIKCSJcdHRmdHAsIGFuZCBjb3B5IHRoZSBmaWxlIHRvIHRoZSBNViBGbGFzaCBGUy5cbiIKCSJcdChUaGlzIGNvbW1hbmQgY2FuIGJlIHVzZWQgb25seSBpZiBlbmFNb25FeHQgaXMgc2V0ISlcbiIKKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogbG9hZCBhIGZpbGUgdG8gdGhlIGZsYXNoIEZTIHVzaW5nIHRoZSB0ZnRwLiAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludAp0ZnRwZWZzX2NtZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogICAgICAgIGludCAgICAgZmlsZXNpemU7CiAgICAgICAgY2hhciAgICBmaWxlTmFtZVtDRkdfQ0JTSVpFXSxjOwogICAgICAgIHVuc2lnbmVkIGludCAgICBzdGF0dXMsIGVudHJ5QWRkcmVzczsKICAgICAgICBGU19GSUxFX0hBTkRMRVIgICAgZmlsZUhhbmRsZXI7CiAgICAgICAgdW5zaWduZWQgY2hhciAgIGFkZHJlc3NCdWZmZXJbOF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgaWYoIWVuYU1vbkV4dCgpKXsKICAgICAgICAgICAgICAgIHByaW50ZigiVGhpcyBjb21tYW5kIGNhbiBiZSB1c2VkIG9ubHkgaWYgZW5hTW9uRXh0IGlzIHNldCFcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIGlmKGFyZ2MgPT0gMykgewogICAgICAgICAgICAgICAgZW50cnlBZGRyZXNzID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpOwogICAgICAgICAgICAgICAgbG9hZF9hZGRyID0gZW50cnlBZGRyZXNzOwogICAgICAgICAgICAgICAgY29weV9maWxlbmFtZSAoQm9vdEZpbGUsIGFyZ3ZbMl0sIHNpemVvZihCb290RmlsZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgcHJpbnRmICgiVXNhZ2U6XG4lcyAlZFxuIiwgY21kdHAtPnVzYWdlLGFyZ2MpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIHN0YXR1cyA9IG12RlNJbml0KEZTX05PX0NBQ0hFKTsKICAgICAgICBpZihzdGF0dXMgPT0gRlNfTk9fVkFMSURfRkFUX1NUUklORykKICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SOiBGU19OT19WQUxJRF9GQVRfU1RSSU5HXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZihzdGF0dXMgPT0gRlNfT0ZGU0VUX09VVF9PRl9SQU5HRSkKICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SOiBGU19PRkZTRVRfT1VUX09GX1JBTkdFXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KIAogICAgICAgIGlmICgoZmlsZXNpemUgPSBOZXRMb29wKFRGVFApKSA8IDApCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAKICAgICAgICAvKiBkb25lIGlmIG5vIGZpbGUgd2FzIGxvYWRlZCAobm8gZXJyb3JzIHRob3VnaCkgKi8KICAgICAgICBpZiAoZmlsZXNpemUgPD0gMCkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogCiAgICAgICAgLyogZ2V0IGEgZmlsZSBuYW1lIGZyb20gdGhlIHVzZXIgKi8KICAgICAgICBnZXRfZmlsZW5hbWUoZmlsZU5hbWUsTVZfVFJVRSk7CiAKICAgICAgICBmaWxlSGFuZGxlciA9IG12RlNPcGVuKGZpbGVOYW1lLCJ3Iik7CiAgICAgICAgaWYoZmlsZUhhbmRsZXIgPT0gRlNfRklMRV9PUEVOX0VSUk9SKQogICAgICAgIHsKICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1I6IENhbid0IG9wZW4gZmlsZSFcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogCiAgICAgICAgLyogU2V0IHRoZSBlbnRyeSBhZGRyZXNzIGZvciB0aGUgZmlsZSAqLwogICAgICAgIGMgPSAoZW50cnlBZGRyZXNzID4+IDI4KSAmIDB4MGY7CiAgICAgICAgaWYoYyA8IDEwKQogICAgICAgICAgICAgICAgYWRkcmVzc0J1ZmZlclswXSA9IGMgKyAnMCc7CiAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgYWRkcmVzc0J1ZmZlclswXSA9IGMgKyAnQScgLSAxMDsKICAgICAgICBjID0gKGVudHJ5QWRkcmVzcyA+PiAyNCkgJiAweDBmOwogICAgICAgIGlmKGMgPCAxMCkKICAgICAgICAgICAgICAgIGFkZHJlc3NCdWZmZXJbMV0gPSBjICsgJzAnOwogICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGFkZHJlc3NCdWZmZXJbMV0gPSBjICsgJ0EnIC0gMTA7CiAgICAgICAgYyA9IChlbnRyeUFkZHJlc3MgPj4gMjApICYgMHgwZjsKICAgICAgICBpZihjIDwgMTApCiAgICAgICAgICAgICAgICBhZGRyZXNzQnVmZmVyWzJdID0gYyArICcwJzsKICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBhZGRyZXNzQnVmZmVyWzJdID0gYyArICdBJyAtIDEwOwogICAgICAgIGMgPSAoZW50cnlBZGRyZXNzID4+IDE2KSAmIDB4MGY7CiAgICAgICAgaWYoYyA8IDEwKQogICAgICAgICAgICAgICAgYWRkcmVzc0J1ZmZlclszXSA9IGMgKyAnMCc7CiAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgYWRkcmVzc0J1ZmZlclszXSA9IGMgKyAnQScgLSAxMDsKICAgICAgICBjID0gKGVudHJ5QWRkcmVzcyA+PiAxMikgJiAweDBmOwogICAgICAgIGlmKGMgPCAxMCkKICAgICAgICAgICAgICAgIGFkZHJlc3NCdWZmZXJbNF0gPSBjICsgJzAnOwogICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGFkZHJlc3NCdWZmZXJbNF0gPSBjICsgJ0EnIC0gMTA7CiAgICAgICAgYyA9IChlbnRyeUFkZHJlc3MgPj4gOCkgJiAweDBmOwogICAgICAgIGlmKGMgPCAxMCkKICAgICAgICAgICAgICAgIGFkZHJlc3NCdWZmZXJbNV0gPSBjICsgJzAnOwogICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGFkZHJlc3NCdWZmZXJbNV0gPSBjICsgJ0EnIC0gMTA7CiAgICAgICAgYyA9IChlbnRyeUFkZHJlc3MgPj4gNCkgJiAweDBmOwogICAgICAgIGlmKGMgPCAxMCkKICAgICAgICAgICAgICAgIGFkZHJlc3NCdWZmZXJbNl0gPSBjICsgJzAnOwogICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGFkZHJlc3NCdWZmZXJbNl0gPSBjICsgJ0EnIC0gMTA7CiAgICAgICAgYyA9IChlbnRyeUFkZHJlc3MpICYgMHgwZjsKICAgICAgICBpZihjIDwgMTApCiAgICAgICAgICAgICAgICBhZGRyZXNzQnVmZmVyWzddID0gYyArICcwJzsKICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBhZGRyZXNzQnVmZmVyWzddID0gYyArICdBJyAtIDEwOwogIAogICAgICAgIGlmKG12RlNXcml0ZShmaWxlSGFuZGxlciw4LChjaGFyICopYWRkcmVzc0J1ZmZlcikhPSA4KQogICAgICAgIHsKICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1I6IFdyaXRpbmcgZGF0YSB0byBmaWxlLlxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAKICAgICAgICBpZihtdkZTV3JpdGUoZmlsZUhhbmRsZXIsZmlsZXNpemUsKGNoYXIgKilsb2FkX2FkZHIpICE9IGZpbGVzaXplKQogICAgICAgIHsKICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1I6IFdyaXRpbmcgZGF0YSB0byBmaWxlLlxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCJGaWxlIGxvYWRlZCB0byBmaWxlIHN5c3RlbSBzdWNjZXNzZnVsbHkuLi5cbiIpOwogICAgICAgIG12RlNDbG9zZShmaWxlSGFuZGxlcik7CiAKICAgICAgICByZXR1cm4gMTsKfQogClVfQk9PVF9DTUQoCiAgICAgICAgRlN0ZnRwZSwgICAgICAzLCAgICAgMSwgICAgICB0ZnRwZWZzX2NtZCwKICAgICAgICAiRlN0ZnRwZSAtIHRmdHAgYW4gZXhlIGZpbGUgdG8gdGhlIEZsYXNoIE1WIEZTXG4iLAogICAgICAgICIgZW50cnlfYWRkcmVzcyBmaWxlbmFtZS5cbiIKICAgICAgICAiXHREb3dubG9hZCBhIGZpbGUgdGhyb3VnaCB0aGUgbmV0d29yayBpbnRlcmZhY2UgdG8gZW50cnlfYWRkcmVzcyB1c2luZ1xuIgogICAgICAgICJcdHRmdHAsIGFuZCBjb3B5IHRoZSBmaWxlIHRvIHRoZSBNViBGbGFzaCBGUy5cbiIKICAgICAgICAiXHQoVGhpcyBjb21tYW5kIGNhbiBiZSB1c2VkIG9ubHkgaWYgZW5hTW9uRXh0IGlzIHNldCEpXG4iCik7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIGxvYWQgYSBmaWxlIHRvIHRoZSBmbGFzaCBGUyB1c2luZyB0aGUgbG9hZG5ldC4gKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaWYgMAppbnQKbG9hZGZzX2NtZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIE1WXzggKmFyZ3ZbXSkKewogICAgICAgIGludCAgIAlmaWxlc2l6ZTsKCU1WXzgJZmlsZU5hbWVbQ0ZHX0NCU0laRV07CglNVl9VMzIgICAgc3RhdHVzLGFkZHIgPSAweDIwMDAwOwkKCUZTX0ZJTEVfSEFORExFUiAgICBmaWxlSGFuZGxlcjsKCiAgICAJaWYoIWVuYU1vbkV4dCgpKXsKCQlwcmludGYoIlRoaXMgY29tbWFuZCBjYW4gYmUgdXNlZCBvbmx5IGlmIGVuYU1vbkV4dCBpcyBzZXQhXG4iKTsKCQlyZXR1cm4gMDt9CgogICAgCXN0YXR1cyA9IG12RlNJbml0KEZTX05PX0NBQ0hFKTsKICAgIAlpZihzdGF0dXMgPT0gRlNfTk9fVkFMSURfRkFUX1NUUklORykKICAgIAl7CiAgICAgICAgCXByaW50ZigiRVJST1I6IEZTX05PX1ZBTElEX0ZBVF9TVFJJTkdcbiIpOwogICAgICAgIAlyZXR1cm4gMDsKICAgIAl9CiAgICAJaWYoc3RhdHVzID09IEZTX09GRlNFVF9PVVRfT0ZfUkFOR0UpCiAgICAJewogICAgICAgIAlwcmludGYoIkVSUk9SOiBGU19PRkZTRVRfT1VUX09GX1JBTkdFXG4iKTsKICAgICAgICAJcmV0dXJuIDA7CiAgICAJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCglmaWxlc2l6ZSA9IGxvYWRfbmV0KCZhZGRyKTsKICAgIAlwcmludGYoIlxuRmlsZSBsb2FkZWQgc3VjY2Vzc2Z1bGx5Li4uXG4iKTsKICAgIAlwcmludGYoIkZpbGUgc2l6ZTogJWQgYnl0ZXMuXG4iLGZpbGVzaXplKTsKCiAKICAgICAgICAvKiBkb25lIGlmIG5vIGZpbGUgd2FzIGxvYWRlZCAobm8gZXJyb3JzIHRob3VnaCkgKi8KICAgICAgICBpZiAoZmlsZXNpemUgPD0gMCkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogCgkvKiBnZXQgYSBmaWxlIG5hbWUgZnJvbSB0aGUgdXNlciAqLwoJZ2V0X2ZpbGVuYW1lKGZpbGVOYW1lLCBNVl9GQUxTRSk7CgoJZmlsZUhhbmRsZXIgPSBtdkZTT3BlbihmaWxlTmFtZSwidyIpOwogICAgCWlmKGZpbGVIYW5kbGVyID09IEZTX0ZJTEVfT1BFTl9FUlJPUikKICAgIAl7CiAgICAgICAgCXByaW50ZigiRVJST1I6IENhbid0IG9wZW4gZmlsZSFcbiIpOwogICAgICAgIAlyZXR1cm4gMDsKICAgIAl9CiAgICAJaWYobXZGU1dyaXRlKGZpbGVIYW5kbGVyLGZpbGVzaXplLChNVl84ICopYWRkcikgIT0gZmlsZXNpemUpCiAgICAJewogICAgICAgIAlwcmludGYoIkVSUk9SOiBXcml0aW5nIGRhdGEgdG8gZmlsZS5cbiIpOwogICAgICAgIAlyZXR1cm4gMDsKICAgIAl9CiAgICAJcHJpbnRmKCJGaWxlIGxvYWRlZCB0byBmaWxlIHN5c3RlbSBzdWNjZXNzZnVsbHkuLi5cbiIpOwogICAgCW12RlNDbG9zZShmaWxlSGFuZGxlcik7CgoJcmV0dXJuIDE7Cn0KClVfQk9PVF9DTUQoCglGU2xmLCAgICAgIDEsICAgICAxLCAgICAgIGxvYWRmc19jbWQsCgkiRlNsZgktIExvYWQgYSBmaWxlIHRvIHRoZSBGbGFzaCBNViBGU1xuIiwKCSIgXG4iCgkiXHRMb2FkIFMtUmVjb3JkIGZpbGUgdmlhIHRoZSBmaXJzdCBhdmFpbGFibGUgZXRoZXJuZXQgcG9ydCwgdG8gdGhlIERSQU1cbiIKCSJcdCgweDIwMDAwMCkgYW5kIGNvcHkgaXQgdG8gdGhlIE1WIEZsYXNoIEZTLlxuIgoJIlx0KFRoaXMgY29tbWFuZCBjYW4gYmUgdXNlZCBvbmx5IGlmIGVuYU1vbkV4dCBpcyBzZXQhKVxuIgopOwojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBsb2FkIGFuIGV4ZSBmaWxlIHRvIHRoZSBmbGFzaCBGUyB1c2luZyB0aGUgbG9hZG5ldC4gKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpZiAwCmludApsb2FkZXhlZnNfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgTVZfOCAqYXJndltdKQp7CiAgICAgICAgaW50ICAgCWZpbGVzaXplOwoJTVZfOAlmaWxlTmFtZVtDRkdfQ0JTSVpFXSxjOwoJTVZfVTMyICAgIHN0YXR1cyxlbnRyeUFkZHJlc3MgPSAweDA7CQoJRlNfRklMRV9IQU5ETEVSICAgIGZpbGVIYW5kbGVyOwogICAgCU1WX1U4ICAgYWRkcmVzc0J1ZmZlcls4XTsKCiAgICAJaWYoIWVuYU1vbkV4dCgpKXsKCQlwcmludGYoIlRoaXMgY29tbWFuZCBjYW4gYmUgdXNlZCBvbmx5IGlmIGVuYU1vbkV4dCBpcyBzZXQhXG4iKTsKCQlyZXR1cm4gMDt9CgogICAgCXN0YXR1cyA9IG12RlNJbml0KEZTX05PX0NBQ0hFKTsKICAgIAlpZihzdGF0dXMgPT0gRlNfTk9fVkFMSURfRkFUX1NUUklORykKICAgIAl7CiAgICAgICAgCXByaW50ZigiRVJST1I6IEZTX05PX1ZBTElEX0ZBVF9TVFJJTkdcbiIpOwogICAgICAgIAlyZXR1cm4gMDsKICAgIAl9CiAgICAJaWYoc3RhdHVzID09IEZTX09GRlNFVF9PVVRfT0ZfUkFOR0UpCiAgICAJewogICAgICAgIAlwcmludGYoIkVSUk9SOiBGU19PRkZTRVRfT1VUX09GX1JBTkdFXG4iKTsKICAgICAgICAJcmV0dXJuIDA7CiAgICAJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCglmaWxlc2l6ZSA9IGxvYWRfbmV0KCZlbnRyeUFkZHJlc3MpOwogICAgCXByaW50ZigiXG5GaWxlIGxvYWRlZCBzdWNjZXNzZnVsbHkuLi5cbiIpOwogICAgCXByaW50ZigiRmlsZSBzaXplOiAlZCBieXRlcy5cbiIsZmlsZXNpemUpOwoKIAogICAgICAgIC8qIGRvbmUgaWYgbm8gZmlsZSB3YXMgbG9hZGVkIChubyBlcnJvcnMgdGhvdWdoKSAqLwogICAgICAgIGlmIChmaWxlc2l6ZSA8PSAwKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKCS8qIGdldCBhIGZpbGUgbmFtZSBmcm9tIHRoZSB1c2VyICovCglnZXRfZmlsZW5hbWUoZmlsZU5hbWUsIE1WX1RSVUUpOwoKICAgIAlmaWxlSGFuZGxlciA9IG12RlNPcGVuKGZpbGVOYW1lLCJ3Iik7CiAgICAJaWYoZmlsZUhhbmRsZXIgPT0gRlNfRklMRV9PUEVOX0VSUk9SKQogICAgCXsKICAgICAgICAJcHJpbnRmKCJFUlJPUjogQ2FuJ3Qgb3BlbiBmaWxlIVxuIik7CiAgICAgICAgCXJldHVybiAwOwogICAgCX0KICAgIAkvKiBTZXQgdGhlIGVudHJ5IGFkZHJlc3MgZm9yIHRoZSBmaWxlICovCiAgICAJYyA9IChlbnRyeUFkZHJlc3MgPj4gMjgpICYgMHgwZjsKICAgIAlpZihjIDwgMTApCiAgICAgICAgCWFkZHJlc3NCdWZmZXJbMF0gPSBjICsgJzAnOwogICAgCWVsc2UKICAgICAgICAJYWRkcmVzc0J1ZmZlclswXSA9IGMgKyAnQScgLSAxMDsKICAgIAljID0gKGVudHJ5QWRkcmVzcyA+PiAyNCkgJiAweDBmOwogICAgCWlmKGMgPCAxMCkKICAgICAgICAJYWRkcmVzc0J1ZmZlclsxXSA9IGMgKyAnMCc7CiAgIAllbHNlCiAgICAgICAgCWFkZHJlc3NCdWZmZXJbMV0gPSBjICsgJ0EnIC0gMTA7CiAgICAJYyA9IChlbnRyeUFkZHJlc3MgPj4gMjApICYgMHgwZjsKICAgIAlpZihjIDwgMTApCiAgICAgICAgCWFkZHJlc3NCdWZmZXJbMl0gPSBjICsgJzAnOwogICAgCWVsc2UKICAgICAgICAJYWRkcmVzc0J1ZmZlclsyXSA9IGMgKyAnQScgLSAxMDsKICAgIAljID0gKGVudHJ5QWRkcmVzcyA+PiAxNikgJiAweDBmOwogICAgCWlmKGMgPCAxMCkKICAgICAgICAJYWRkcmVzc0J1ZmZlclszXSA9IGMgKyAnMCc7CiAgICAJZWxzZQogICAgICAgIAlhZGRyZXNzQnVmZmVyWzNdID0gYyArICdBJyAtIDEwOwogICAgCWMgPSAoZW50cnlBZGRyZXNzID4+IDEyKSAmIDB4MGY7CiAgICAJaWYoYyA8IDEwKQogICAgICAgIAlhZGRyZXNzQnVmZmVyWzRdID0gYyArICcwJzsKICAgIAllbHNlCiAgICAgICAgCWFkZHJlc3NCdWZmZXJbNF0gPSBjICsgJ0EnIC0gMTA7CiAgICAJYyA9IChlbnRyeUFkZHJlc3MgPj4gOCkgJiAweDBmOwogICAgCWlmKGMgPCAxMCkKICAgICAgICAJYWRkcmVzc0J1ZmZlcls1XSA9IGMgKyAnMCc7CiAgICAJZWxzZQogICAgICAgIAlhZGRyZXNzQnVmZmVyWzVdID0gYyArICdBJyAtIDEwOwogICAgCWMgPSAoZW50cnlBZGRyZXNzID4+IDQpICYgMHgwZjsKICAgIAlpZihjIDwgMTApCiAgICAgICAgCWFkZHJlc3NCdWZmZXJbNl0gPSBjICsgJzAnOwogICAgCWVsc2UKICAgICAgICAJYWRkcmVzc0J1ZmZlcls2XSA9IGMgKyAnQScgLSAxMDsKICAgIAljID0gKGVudHJ5QWRkcmVzcykgJiAweDBmOwogICAgCWlmKGMgPCAxMCkKICAgICAgICAJYWRkcmVzc0J1ZmZlcls3XSA9IGMgKyAnMCc7CiAgICAJZWxzZQogICAgICAgIAlhZGRyZXNzQnVmZmVyWzddID0gYyArICdBJyAtIDEwOwogCiAgICAJaWYobXZGU1dyaXRlKGZpbGVIYW5kbGVyLDgsKE1WXzggKilhZGRyZXNzQnVmZmVyKSE9IDgpCiAgICAJewogICAgICAgCQlwcmludGYoIkVSUk9SOiBXcml0aW5nIGRhdGEgdG8gZmlsZS5cbiIpOwogICAgICAgIAlyZXR1cm4gMDsKICAgIAl9CiAgICAgCiAgICAJaWYobXZGU1dyaXRlKGZpbGVIYW5kbGVyLGZpbGVzaXplLChNVl84ICopZW50cnlBZGRyZXNzKSE9IGZpbGVzaXplKQogICAgCXsKICAgICAgICAJcHJpbnRmKCJFUlJPUjogV3JpdGluZyBkYXRhIHRvIGZpbGUuXG4iKTsKICAgICAgICAJcmV0dXJuIDA7CiAgICAJfQogICAgCXByaW50ZigiRmlsZSBsb2FkZWQgdG8gZmlsZSBzeXN0ZW0gc3VjY2Vzc2Z1bGx5Li4uXG4iKTsKICAgIAltdkZTQ2xvc2UoZmlsZUhhbmRsZXIpOwogICAgCXJldHVybiAxOwp9CgpVX0JPT1RfQ01EKAoJRlNsZWYsICAgICAgMSwgICAgIDEsICAgICAgbG9hZGV4ZWZzX2NtZCwKCSJGU2xlZgktIExvYWQgYW4gZXhlIGZpbGUgdG8gdGhlIEZsYXNoIE1WIEZTXG4iLAoJIiBcbiIKCSJcdExvYWQgUy1SZWNvcmQgIEVYRSBmaWxlIHZpYSB0aGUgZmlyc3QgYXZhaWxhYmxlIGV0aGVybmV0IHBvcnQgdG8gdGhlIERSQU1cbiIKCSJcdCgweDIwMDAwMCkgYW5kIGNvcHkgaXQgdG8gdGhlIE1WIEZsYXNoIEZTLlxuIgoJIlx0QWZ0ZXIgbG9hZCBpcyBjb21wbGV0ZSB0aGUgRVhFIGZpbGUgY2FuIGJlIHJ1biBieSB1c2luZzogRlNydW4gZmlsZW5hbWUuXG4iCgkiXHQoVGhpcyBjb21tYW5kIGNhbiBiZSB1c2VkIG9ubHkgaWYgZW5hTW9uRXh0IGlzIHNldCEpXG4iCik7CiNlbmRpZgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBMb2FkIEV4ZSBmaWxlIGZyb20gdGhlIEZsYXNoIEZTLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpNVl9VMzIgbG9hZEV4ZShNVl84ICogZm5hbWUpCnsKICAgIHJlZ2lzdGVyIE1WX1UzMiBieXRlQ291bnQ7CiAgICByZWdpc3RlciBNVl9VMzIgZW50cnlBZGRyZXNzID0gMHhmZmZmZmZmZjsKICAgIE1WXzggICAgICAgICAgICBhZGRyZXNzQnVmZmVyWzldOwogICAgRlNfRklMRV9IQU5ETEVSIGZpbGVIYW5kbGVyOwogICAgTVZfVTMyICAgICAgICAgIG5leHRCbG9ja1BvaW50ZXIsIHNvdXJjZUFkZHJlc3MsIGRlc3RBZGRyZXNzLCBzdGF0dXM7CiAgICBNVl9VMzIgICAgICAgICAgbXZGbGFzaEJhc2VBZGRyZXNzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgbXZGbGFzaEJhc2VBZGRyZXNzID0gTVZfQk9BUkRfRkxBU0hfQkFTRV9BRFJTOwoKICAgIHN0YXR1cyA9IG12RlNJbml0KEZTX05PX0NBQ0hFKTsKICAgIGlmKHN0YXR1cyA9PSBGU19OT19WQUxJRF9GQVRfU1RSSU5HKQogICAgewogICAgICAgIHByaW50ZigiRVJST1I6IEZTX05PX1ZBTElEX0ZBVF9TVFJJTkdcbiIpOwogICAgICAgIHJldHVybiBlbnRyeUFkZHJlc3M7CiAgICB9CiAgICBpZihzdGF0dXMgPT0gRlNfT0ZGU0VUX09VVF9PRl9SQU5HRSkKICAgIHsKICAgICAgICBwcmludGYoIkVSUk9SOiBGU19PRkZTRVRfT1VUX09GX1JBTkdFXG4iKTsKICAgICAgICByZXR1cm4gZW50cnlBZGRyZXNzOwogICAgfQogICAgaWYoKGZpbGVIYW5kbGVyID0gbXZGU09wZW4oZm5hbWUsInIiKSkgPT0gRlNfRklMRV9PUEVOX0VSUk9SKQogICAgewoJcHJpbnRmKCJFUlJPUiBpbiBmaWxlIG9wZW5cbiIpOwogICAgICAgIHJldHVybiBlbnRyeUFkZHJlc3M7CiAgICB9CgogICAgLyogRXh0cmFjdCB0aGUgZmlsZSdzIGVudHJ5IGFkZHJlc3MgKi8KICAgIG12RlNSZWFkKGZpbGVIYW5kbGVyLDgsYWRkcmVzc0J1ZmZlcik7CglhZGRyZXNzQnVmZmVyWzhdPSdcMCc7CiAgICBlbnRyeUFkZHJlc3MgPSBzaW1wbGVfc3RydG91bChhZGRyZXNzQnVmZmVyLCBOVUxMLCAxNik7CiAgICBkZWJ1ZygiZW50cnlBZGRyZXNzID0gJXggXG4iLGVudHJ5QWRkcmVzcyk7CgogICAgbmV4dEJsb2NrUG9pbnRlciA9IG12Rmxhc2gzMlJkKG12Rmxhc2hJbmZvLCBtdkZTRW50cmllc1tmaWxlSGFuZGxlcl0ucG9pbnRlclRvRkFUKTsKICAgIC8qIFRoZSBGaXJzdCBibG9jayBjb250YWluIHRoZSBhZGRyZXNzLCB0aHVzIHRyZWF0ZWQgZGlmZmVyZW50bHkgKi8KICAgIGJ5dGVDb3VudCA9IEZTX0JMT0NLX1NJWkUgLSBGU19CTE9DS19IRUFERVJfU0laRSAtIDggLyogQWRkcmVzcyBzaXplICovIDsKICAgIGRlc3RBZGRyZXNzID0gZW50cnlBZGRyZXNzOwogICAgc291cmNlQWRkcmVzcyA9IChuZXh0QmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spICsgbXZGbGFzaEJhc2VBZGRyZXNzCiAgICAgICAgICAgICAgICAgICAgKyBGU19CTE9DS19IRUFERVJfU0laRSArIDgvKiBBZGRyZXNzIHNpemUgKi87CgogICAgLyogRmx1c2ggdGhlIGJsb2NrIGZyb20gdGhlIGNhY2hlIGJlZm9yZSBleGVjdXRpbmcgaXQgKi8KICAgIGRlYnVnKCJtZW1jcHkgdHJhbnNmZXIgc3JjICV4IGRzdCAleCBieXRlY250ICV4XG4iLFwKCQkJCXNvdXJjZUFkZHJlc3MsZGVzdEFkZHJlc3MsYnl0ZUNvdW50KTsKICAgIG1lbWNweSgodm9pZCAqKWRlc3RBZGRyZXNzLCAodm9pZCAqKXNvdXJjZUFkZHJlc3MsIGJ5dGVDb3VudCk7CiAgICBkZXN0QWRkcmVzcyArPSBieXRlQ291bnQ7CiAgICAgCiAgICBuZXh0QmxvY2tQb2ludGVyID0gbXZGbGFzaDMyUmQobXZGbGFzaEluZm8sIG5leHRCbG9ja1BvaW50ZXIgJiBGU19CTE9DS19PRkZTRVRfTUFTSyk7CiAgICBieXRlQ291bnQgPSBGU19CTE9DS19TSVpFIC0gRlNfQkxPQ0tfSEVBREVSX1NJWkU7CiAgICAgCiAgICB3aGlsZShuZXh0QmxvY2tQb2ludGVyICE9IDB4ZmZmZmZmZmYpCiAgICB7CiAgICAgICAgc291cmNlQWRkcmVzcyA9IChuZXh0QmxvY2tQb2ludGVyICYgRlNfQkxPQ0tfT0ZGU0VUX01BU0spICsgbXZGbGFzaEJhc2VBZGRyZXNzCiAgICAgICAgICAgICAgICAgICAgICAgICsgRlNfQkxPQ0tfSEVBREVSX1NJWkU7CgoJbWVtY3B5KChNVl9VMzIqKWRlc3RBZGRyZXNzLChNVl9VMzIqKXNvdXJjZUFkZHJlc3MsYnl0ZUNvdW50KTsKCiAgICAgICAgZGVzdEFkZHJlc3MgKz0gYnl0ZUNvdW50OwogICAgICAgIG5leHRCbG9ja1BvaW50ZXIgPSBtdkZsYXNoMzJSZChtdkZsYXNoSW5mbywgbmV4dEJsb2NrUG9pbnRlciAmIEZTX0JMT0NLX09GRlNFVF9NQVNLKTsKICAgIH0KICAgIG12RlNDbG9zZShmaWxlSGFuZGxlcik7CiAgICByZXR1cm4gZW50cnlBZGRyZXNzOwp9CgppbnQgcnVuZXhlRlNfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgTVZfOCAqYXJndltdKQp7CglNVl84IGZpbGVOYW1lW0NGR19DQlNJWkVdOwoJTVZfVTMyIGksZW50cnlBZGRyZXNzOwkKCiAgICAJaWYoIWVuYU1vbkV4dCgpKXsKCQlwcmludGYoIlRoaXMgY29tbWFuZCBjYW4gYmUgdXNlZCBvbmx5IGlmIGVuYU1vbkV4dCBpcyBzZXQhXG4iKTsKCQlyZXR1cm4gMDt9CgogICAgICAgIGlmKGFyZ2MgPj0gMikgewogICAgICAgICAgICAgICAgY29weV9maWxlbmFtZShmaWxlTmFtZSwgYXJndlsxXSwgc2l6ZW9mKGZpbGVOYW1lKSk7CiAKICAgICAgICB9ZWxzZXsgcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCQoJZm9yKGkgPSAwIDsgaSA8IEZTX0ZJTEVfTkFNRV9MRU5HVEg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoZmlsZU5hbWVbaV0gPT0gJy4nKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgaWYoZmlsZU5hbWVbaV0gPT0gJ1wwJykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZVtpXSAgICA9ICcuJzsKICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZVtpKzFdICA9ICdlJzsKICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZVtpKzJdICA9ICd4JzsKICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZVtpKzNdICA9ICdlJzsKICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZVtpKzRdICA9IDA7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCWlmKChlbnRyeUFkZHJlc3MgPSBsb2FkRXhlKGZpbGVOYW1lKSkgPT0gMHhmZmZmZmZmZikKICAgICAgICB7CiAgICAgICAgCXByaW50ZiAoIiVzOiBDb21tYW5kIG5vdCBmb3VuZC5cbiIsIGZpbGVOYW1lKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBtdl9nbyhlbnRyeUFkZHJlc3MsIC0tYXJnYywgJmFyZ3ZbMV0pOwogICAgICAgIHJldHVybiAxOwp9CgpVX0JPT1RfQ01EKAoJRlNydW4sICAgICAgQ0ZHX01BWEFSR1MsICAgICAxLCAgICAgIHJ1bmV4ZUZTX2NtZCwKCSJGU3J1bgktIExvYWQgYW4gZXhlIGZpbGUgZnJvbSB0aGUgRmxhc2ggTVYgRlMgYW5kIHJ1biBpdFxuIiwKCSIgZmlsZW5hbWVcbiIKCSJcdExvYWQgYW4gZXhlIGZpbGUgJ2ZpbGVuYW1lJyBmcm9tIHRoZSBGbGFzaCBNViBGUyBhbmQgcnVuIGl0LlxuIgoJIlx0KFRoaXMgY29tbWFuZCBjYW4gYmUgdXNlZCBvbmx5IGlmIGVuYU1vbkV4dCBpcyBzZXQhKVxuIgopOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBGdW5jdGlvbmFsaXR5LSBUaGUgY29tbWFuZHMgYWxsb3dzIHRoZSB1c2VyIHRvIHZpZXcgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZQoqICAgICAgICAgICAgICAgIGxvY2F0ZWQgaW4gdGhlIGZpbGUgc3lzdGVtLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHR5cGVfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgTVZfOCAqYXJndltdKQp7CiAgICBNVl84IGZpbGVOYW1lWzEyOF09e30scmVhZEJ1ZmZlclsxMDFdLGtleTsKICAgIEZTX0ZJTEVfSEFORExFUiAgICBmaWxlSGFuZGxlcjsKICAgIE1WX1UzMiByZWFkQ291bnQ9MCwgbmV3TGluZUNvdW50PTAsIGZsYWdtLHJlYWRDb3VudHRtcCwgbGluZUNvdW50PTAsaTsKCiAgICBpZighZW5hTW9uRXh0KCkpewoJcHJpbnRmKCJUaGlzIGNvbW1hbmQgY2FuIGJlIHVzZWQgb25seSBpZiBlbmFNb25FeHQgaXMgc2V0IVxuIik7CglyZXR1cm4gMDt9CiAgIAogICAgaWYoYXJnYyA9PSAyKSB7CiAgICAgICAgIGNvcHlfZmlsZW5hbWUoZmlsZU5hbWUsIGFyZ3ZbMV0sIHNpemVvZihmaWxlTmFtZSkpOwogICAgfWVsc2V7IHByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CiAgICAgICAgIHJldHVybiAwOwogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgZmlsZUhhbmRsZXIgPSBtdkZTT3BlbihmaWxlTmFtZSwiciIpOwogICAgaWYoZmlsZUhhbmRsZXIgIT0gRlNfRklMRV9PUEVOX0VSUk9SKQogICAgewogICAgICAgIHdoaWxlKHJlYWRDb3VudCA8IG12RlNGaWxlU2l6ZShmaWxlSGFuZGxlcikpCiAgICAgICAgewogICAgICAgICAgICByZWFkQ291bnR0bXAgPSBtdkZTUmVhZChmaWxlSGFuZGxlciwxMDAscmVhZEJ1ZmZlcik7CgkgICAgcmVhZEJ1ZmZlclsxMDBdID0gJ1wwJzsKICAgICAgICAgICAgaWYocmVhZENvdW50dG1wIDwgMTAwKQogICAgICAgICAgICAgICAgcmVhZEJ1ZmZlcltyZWFkQ291bnR0bXBdID0gJ1wwJzsKICAgICAgICAgICAgcmVhZENvdW50ICs9IHJlYWRDb3VudHRtcDsKICAgICAgICAgICAgbGluZUNvdW50ICs9IHJlYWRDb3VudHRtcDsKICAgICAgICAgICAgZm9yKGkgPSAwIDsgaSA8PSByZWFkQ291bnR0bXAgOyBpKyspCiAgICAgICAgICAgICAgICBpZihyZWFkQnVmZmVyW2ldID09ICdcbicpCiAgICAgICAgICAgICAgICAgICAgbmV3TGluZUNvdW50Kys7CiAgICAgICAgICAgIHByaW50ZigiJXMiLHJlYWRCdWZmZXIpOwogICAgICAgICAgICBpZihuZXdMaW5lQ291bnQgPj0gMjAgfHwgbGluZUNvdW50ID4gMTYwMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmxhZ20gPSAwOwogICAgICAgICAgICAgICAgd2hpbGUoMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBrZXkgPSBnZXRjKCk7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGtleSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnICc6CiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdtID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGluZUNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgbGluZUNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAneCc6CiAgICAgICAgICAgICAgICAgICAgICAgIG12RlNDbG9zZShmaWxlSGFuZGxlcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmKGZsYWdtID09IDEpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgbXZGU0Nsb3NlKGZpbGVIYW5kbGVyKTsKICAgIHByaW50ZigiXG4iKTsKICAgIHJldHVybiAxOwp9CiAKVV9CT09UX0NNRCgKCUZTdHlwZSwgICAgICBDRkdfTUFYQVJHUywgICAgIDEsICAgICAgdHlwZV9jbWQsCgkiRlN0eXBlCS0gY2F0IGZpbGUgZnJvbSB0aGUgRmxhc2ggTVYgRlNcbiIsCgkiIGZpbGVuYW1lIFxuIgoJIlx0RGlzcGxheSBhbiBhc2NpaSBmaWxlICdmaWxlbmFtZScgZm91bmQgb24gdGhlIE1WIEZsYXNoIEZTLlxuIgoJIlx0KFRoaXMgY29tbWFuZCBjYW4gYmUgdXNlZCBvbmx5IGlmIGVuYU1vbkV4dCBpcyBzZXQhKVxuIgopOwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogRnVuY3Rpb25hbGl0eS0gRm9ybWF0cyB0aGUgbXZGbGFzaCBtdk1lbW9yeSBhdCBhIGdpdmVuIG9mZnNldAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgICAgCmludCBmb3JtYXRfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgTVZfOCAqYXJndltdKQp7CiAgICBNVl9VMzIgICAgb2Zmc2V0ID0wLHJlc3VsdDsKICAgIGV4dGVybiBNVl84IGNvbnNvbGVfYnVmZmVyW107CgogICAgaWYoIWVuYU1vbkV4dCgpKXsKCXByaW50ZigiVGhpcyBjb21tYW5kIGNhbiBiZSB1c2VkIG9ubHkgaWYgZW5hTW9uRXh0IGlzIHNldCFcbiIpOwoJcmV0dXJuIDA7fQoKICAgIGlmKGFyZ2MgPT0gMikgewoJb2Zmc2V0ID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpOyAKICAgIH1lbHNleyBwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHByaW50ZigiXGFcYVxhVGhpcyBhY3Rpb24gd2lsbCBlcmFzZSB0aGUgRkxBU0ggTWVtb3J5ISEhXG4iKTsKICAgIHByaW50ZigiQXJlIHlvdSBzdXJlICh5L24pICIpOwogICAgcmVhZGxpbmUoIiA/ICIpOwoKICAgIGlmKHN0cmNtcChjb25zb2xlX2J1ZmZlciwieSIpID09IDAgfHwgc3RyY21wKGNvbnNvbGVfYnVmZmVyLCJ5ZXMiKSA9PSAwIHx8IHN0cmNtcChjb25zb2xlX2J1ZmZlciwiWSIpID09IDApCiAgICB7CiAgICAgICAgaWYob2Zmc2V0ID09IDB4ZmZmZmZmZmYpCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIkJhZCBvZmZzZXQhXG4iKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gbXZGU0Zvcm1hdChvZmZzZXQsRlNfTk9fRVJBU0lOR19DT1VOVEVSKTsKICAgICAgICBpZihyZXN1bHQgPT0gRlNfVkFMSURfRklMRV9TWVNfSU5fTE9XRVJfT0ZGU0VUKQogICAgICAgIHsKICAgICAgICAgICAgcHJpbnRmKCJFUlJPUjogRlNfVkFMSURfRklMRV9TWVNfSU5fTE9XRVJfT0ZGU0VUXG4iKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmKHJlc3VsdCA9PSBGU19GTEFTSF9NRU1PUllfTk9UX1BSRVNFTlQpCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIkVSUk9SOiBGU19GTEFTSF9NRU1PUllfTk9UX1BSRVNFTlRcbiIpOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCJGbGFzaCBNZW1vcnkgZm9ybWF0ZWQgc3VjY2Vzc2Z1bGx5LCBhY3R1YWwgb2Zmc2V0IGlzOiAleFxuIgogICAgICAgICAgICAgICAscmVzdWx0KTsKICAgIH0KICAgIHJldHVybiAxOwp9CgpVX0JPT1RfQ01EKAoJRlNmb3JtYXQsICAgICAgMiwgICAgIDEsICAgICAgZm9ybWF0X2NtZCwKCSJGU2Zvcm1hdC0gZm9ybWF0IHRoZSBGbGFzaCBNViBGU1xuIiwKCSIgYWRkcmVzcyBcbiIKCSJcdEluaXRpYWxpemUgdGhlIE1WIEZsYXNoIEZTIHN0YXJ0aW5nIGF0IG9mZnNldCAnYWRkcmVzcycgaW4gdGhlIEZsYXNoLlxuIgoJIlx0KFRoaXMgY29tbWFuZCBjYW4gYmUgdXNlZCBvbmx5IGlmIGVuYU1vbkV4dCBpcyBzZXQhKVxuIgopOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBGdW5jdGlvbmFsaXR5LSBEaXNwbGF5IHRoZSBsaXN0IG9mIGZpbGVzIGN1cnJlbnRseSBvbiB0aGUgc3lzdGVtIChmaWxlIG5hbWUgKyBzaXplKQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IGRpcl9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBNVl84ICphcmd2W10pCnsKICAgIE1WX1UzMiAgICBmaWxlRW50cnlPZmZzZXQsbmV4dEJsb2NrT2Zmc2V0LG12RlNPZmZzZXQ7CiAgICBNVl9VMzIgICAgc3RhdHVzLGksaixzcGFjZXMgPSAyMDsKICAgIEZTX0ZJTEVfSEFORExFUiAgICBmaWxlSGFuZGxlcjsKICAgIE1WXzggICAgICAgICAgICBmaWxlTmFtZVsyMF07CgogICAgaWYoIWVuYU1vbkV4dCgpKXsKCXByaW50ZigiVGhpcyBjb21tYW5kIGNhbiBiZSB1c2VkIG9ubHkgaWYgZW5hTW9uRXh0IGlzIHNldCFcbiIpOwoJcmV0dXJuIDA7fQoKICAgIHN0YXR1cyA9IG12RlNJbml0KEZTX05PX0NBQ0hFKTsKICAgIGlmKHN0YXR1cyA9PSBGU19OT19WQUxJRF9GQVRfU1RSSU5HKQogICAgewogICAgICAgIHByaW50ZigiRVJST1I6IEZTX05PX1ZBTElEX0ZBVF9TVFJJTkdcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYoc3RhdHVzID09IEZTX09GRlNFVF9PVVRfT0ZfUkFOR0UpCiAgICB7CiAgICAgICAgcHJpbnRmKCJFUlJPUjogRlNfT0ZGU0VUX09VVF9PRl9SQU5HRVxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZihzdGF0dXMgIT0gRlNfU1lTVEVNX0FMUkVBRFlfSU5JVElBTElaRUQpCiAgICB7CiAgICAgICAgcHJpbnRmKCJOdW1iZXIgb2YgZmlsZXMgaW4gc3lzdGVtOiAlZFxuIixzdGF0dXMpOwogICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIG12RlNPZmZzZXQgPSBtdkZTU2VhcmNoRm9yU2lnbmF0dXJlKCk7CiAgICBuZXh0QmxvY2tPZmZzZXQgPSBtdkZTT2Zmc2V0OwogICAgd2hpbGUobmV4dEJsb2NrT2Zmc2V0ICE9IDB4ZmZmZmZmZmYpCiAgICB7CiAgICAgICAgLyogU2tpcCB0aGUgYmxvY2sncyBoZWFkZXIgKi8KICAgICAgICBmaWxlRW50cnlPZmZzZXQgPSBuZXh0QmxvY2tPZmZzZXQgKyBGU19GQVRfSEVBREVSX1NJWkU7CiAgICAgICAgZm9yKGkgPSAwIDsgaSA8IDE1IDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYobXZGbGFzaDhSZChtdkZsYXNoSW5mbywgZmlsZUVudHJ5T2Zmc2V0ICsgRlNfRU5UUllfU1RBVFVTX0ZMQUdfT0ZGU0VUKQogICAgICAgICAgICAgICA9PSBGU19FTlRSWV9JTl9VU0UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG12RlNSZWFkRmlsZU5hbWVGcm9tRkFUZW50cnkoZmlsZUVudHJ5T2Zmc2V0LGZpbGVOYW1lKTsKICAgICAgICAgICAgICAgIGZpbGVIYW5kbGVyID0gbXZGU09wZW4oZmlsZU5hbWUsInIiKTsKICAgICAgICAgICAgICAgIHByaW50ZigiJXMiLGZpbGVOYW1lKTsKICAgICAgICAgICAgICAgIHNwYWNlcyA9IDIyIC0gc3RybGVuKGZpbGVOYW1lKTsKICAgICAgICAgICAgICAgIGZvcihqID0gMCA7IGogPCBzcGFjZXMgOyBqKyspCiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIik7CiAgICAgICAgICAgICAgICBwcmludGYoInNpemU6ICVkIGJ5dGVzXG4iLG12RlNGaWxlU2l6ZShmaWxlSGFuZGxlcikpOwogICAgICAgICAgICAgICAgbXZGU0Nsb3NlKGZpbGVIYW5kbGVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBwb2ludCB0byB0aGUgbmV4dCBlbnRyeSAqLwogICAgICAgICAgICBmaWxlRW50cnlPZmZzZXQgKz0gRlNfRkFUX0ZJTEVfRU5UUllfU0laRTsKICAgICAgICB9CiAgICAgICAgbmV4dEJsb2NrT2Zmc2V0ID0gbXZGbGFzaDMyUmQobXZGbGFzaEluZm8sIG5leHRCbG9ja09mZnNldCk7CiAgICB9CiAgICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICVkIGZyZWUgYnl0ZXNcbiIsCiAgICAgICAgICAgbXZGU0dldEZyZWVTaXplKCkpOwogICAgcmV0dXJuIDE7Cn0KCgpVX0JPT1RfQ01EKAoJRlNkaXIsICAgICAgMSwgICAgIDEsICAgICAgZGlyX2NtZCwKCSJGU2RpcgktIGxzIHRoZSBGbGFzaCBNViBGU1xuIiwKCSIgXG4iCgkiXHREaXNwbGF5IHRoZSBNViBGbGFzaCBGUyBjb250ZW50cy5cbiIKCSJcdChUaGlzIGNvbW1hbmQgY2FuIGJlIHVzZWQgb25seSBpZiBlbmFNb25FeHQgaXMgc2V0ISlcbiIKKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBGdW5jdGlvbmFsaXR5LSBEZWxldGVzIGEgZmlsZSBmcm9tIHRoZSBzeXN0ZW0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBkZWxfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgTVZfOCAqYXJndltdKQp7CiAgICBNVl9VMzIgc3RhdHVzOwogICAgTVZfOCAgICAgICAgICAgIGNtZFszMF07CgogICAgaWYoIWVuYU1vbkV4dCgpKXsKCXByaW50ZigiVGhpcyBjb21tYW5kIGNhbiBiZSB1c2VkIG9ubHkgaWYgZW5hTW9uRXh0IGlzIHNldCFcbiIpOwoJcmV0dXJuIDA7fQoKICAgIGlmKGFyZ2MgPT0gMikgewogICAgCWNvcHlfZmlsZW5hbWUgKGNtZCwgYXJndlsxXSwgc2l6ZW9mKGNtZCkpOwogICAgfWVsc2V7IHByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CiAgICAJcmV0dXJuIDA7CiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIHN0YXR1cyA9IG12RlNJbml0KEZTX05PX0NBQ0hFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgaWYoc3RhdHVzID09IEZTX05PX1ZBTElEX0ZBVF9TVFJJTkcpCiAgICB7CiAgICAgICAgcHJpbnRmKCJFUlJPUjogRlNfTk9fVkFMSURfRkFUX1NUUklOR1xuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZihzdGF0dXMgPT0gRlNfT0ZGU0VUX09VVF9PRl9SQU5HRSkKICAgIHsKICAgICAgICBwcmludGYoIkVSUk9SOiBGU19PRkZTRVRfT1VUX09GX1JBTkdFXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmKG12RlNGaWxlRmluZChjbWQpICE9IEZTX0ZJTEVfTk9UX0ZPVU5EKQogICAgewogICAgICAgIGlmKG12RlNEZWxldGUoY21kKSA9PSBGU19GSUxFX0RFTEVURUQpCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIkZpbGUgZGVsZXRlZFxuIik7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHByaW50ZigiJXM6Tm8gc3VjaCBmaWxlXG4iLGNtZCk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKVV9CT09UX0NNRCgKCUZTZGVsLCAgICAgIDIsICAgICAxLCAgICAgIGRlbF9jbWQsCgkiRlNkZWwJLSBkZWwgYSBmaWxlIGZyb20gdGhlIEZsYXNoIE1WIEZTXG4iLAoJIiBmaWxlbmFtZSBcbiIKCSJcdERlbGV0ZSBhIGZpbGUgJ2ZpbGVuYW1lJyBmcm9tIHRoZSBNViBGbGFzaCBGUy5cbiIKCSJcdChUaGlzIGNvbW1hbmQgY2FuIGJlIHVzZWQgb25seSBpZiBlbmFNb25FeHQgaXMgc2V0ISlcbiIKKTsKCgojZW5kaWYgLyogQ09ORklHX0NNRF9CU1AgKi8KCiNlbmRpZiAvKiBNVl9JTkNfQk9BUkRfTk9SX0ZMQVNIICovCg==