LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQogKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCgovLyBNQVJLRVIodXBkYXRlX3ByZWNvbXAucHkpOiBhdXRvZ2VuIGluY2x1ZGUgc3RhdGVtZW50LCBkbyBub3QgcmVtb3ZlCiNpbmNsdWRlICJwcmVjb21waWxlZF90b29scy5oeHgiCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHRvb2xzL3N0cmVhbS5oeHg+CiNpbmNsdWRlIDx0b29scy9mc3lzLmh4eD4KCiNpbmNsdWRlICJ0b29scy9pcGFyc2VyLmh4eCIKI2luY2x1ZGUgInRvb2xzL2dlbmluZm8uaHh4IgoKCgovLwovLyBjbGFzcyBJbmZvcm1hdGlvblBhcnNlcgovLwoKI2RlZmluZSBjS2V5TGV2ZWxDaGFyICdcdCcKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSW5mb3JtYXRpb25QYXJzZXI6OkluZm9ybWF0aW9uUGFyc2VyKCBzYWxfQm9vbCBiUmVwbGFjZSApCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCQkJCTogYlJlY292ZXIoIHNhbF9GYWxzZSApLAoJCQkJc09sZExpbmUoICIiICksCgkJCQliUmVwbGFjZVZhcmlhYmxlcyggYlJlcGxhY2UgKSwKCQkJCW5MZXZlbCggMCApLAoJCQkJc1VQRCggIiIgKSwKCQkJCXNWZXJzaW9uKCAiIiApLAoJCQkJcEFjdFN0cmVhbSggTlVMTCApLAoJCQkJbkVycm9yQ29kZSggMCApLAoJCQkJbkVycm9yTGluZSggMCApLAoJCQkJc0Vycm9yVGV4dCggIiIgKSwKCQkJCW5BY3RMaW5lKCAwICkKewp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkluZm9ybWF0aW9uUGFyc2VyOjp+SW5mb3JtYXRpb25QYXJzZXIoKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpCeXRlU3RyaW5nICZJbmZvcm1hdGlvblBhcnNlcjo6UmVhZExpbmUoKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKCUJ5dGVTdHJpbmcgc0xpbmU7CgoJaWYgKCBiUmVjb3ZlciApIHsKCQliUmVjb3ZlciA9IHNhbF9GYWxzZTsKCX0KCWVsc2UgewoJCSBpZiAoICFwQWN0U3RyZWFtLT5Jc0VvZigpKSB7CgkJCXBBY3RTdHJlYW0tPlJlYWRMaW5lKCBzTGluZSApOwogICAgICAgICAgICB4dWJfU3RyTGVuIG5TdGFydCA9IDA7CiAgICAgICAgICAgIHh1Yl9TdHJMZW4gbkVuZCA9IHNMaW5lLkxlbigpOwogICAgICAgICAgICBzYWxfQm9vbCBiQ29weSA9IHNhbF9GYWxzZTsKICAgICAgICAgICAgd2hpbGUgKCBuU3RhcnQgPCBuRW5kICYmICggc0xpbmUuR2V0Q2hhciggblN0YXJ0ICkgPT0gJyAnIHx8IHNMaW5lLkdldENoYXIoIG5TdGFydCApID09IDB4MDkgKSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5TdGFydCsrOwogICAgICAgICAgICAgICAgYkNvcHkgPSBzYWxfVHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2hpbGUgKCBuU3RhcnQgPCBuRW5kICYmICggc0xpbmUuR2V0Q2hhciggbkVuZC0xICkgPT0gJyAnIHx8IHNMaW5lLkdldENoYXIoIG5FbmQtMSApID09IDB4MDkgKSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5FbmQtLTsKICAgICAgICAgICAgICAgIGJDb3B5ID0gc2FsX1RydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggYkNvcHkgKQogICAgICAgICAgICAgICAgc0xpbmUgPSBzTGluZS5Db3B5KCBuU3RhcnQsIG5FbmQgLSBuU3RhcnQgKTsKCgkJCWlmICgoIHNMaW5lLkdldENoYXIoIDAgKSA9PSAnIycgKSB8fCAoICFzTGluZS5MZW4oKSkpIHsKCQkJCWlmICggc0N1cnJlbnRDb21tZW50LkxlbigpKQoJCQkJCXNDdXJyZW50Q29tbWVudCArPSAiXG4iOwoJCQkJc0N1cnJlbnRDb21tZW50ICs9IHNMaW5lOwoJCQkJcmV0dXJuIFJlYWRMaW5lKCk7CgkJCX0KCQkJZWxzZSB7CgkJCQlpZiAoIGJSZXBsYWNlVmFyaWFibGVzICkgewoJCQkJCXNMaW5lLlNlYXJjaEFuZFJlcGxhY2VBbGwoICIlVVBEIiwgc1VQRCApOwoJCQkJCXNMaW5lLlNlYXJjaEFuZFJlcGxhY2VBbGwoICIlVkVSU0lPTiIsIHNWZXJzaW9uICk7CgkJCQl9CgkJCX0KCQl9CiAgICAgICAgZWxzZSB7CgkJCWlmICggbkxldmVsICkgewogICAgICAgICAgICAJc0xpbmUgPSAifSI7CgkgICAgICAgICAgICBmcHJpbnRmKCBzdGRvdXQsICJSZWFjaGVkIEVPRiBwYXJzaW5nICVzLiBTdXBseWluZyBleHRyYSAnfSdcbiIsQnl0ZVN0cmluZyggc1N0cmVhbU5hbWUsIGdzbF9nZXRTeXN0ZW1UZXh0RW5jb2RpbmcoKSkuR2V0QnVmZmVyKCkgKTsKCS8vCSAgICAgICAgbkVycm9yQ29kZSA9IElQX1VORVhQRUNURURfRU9GOwoJLy8JICAgICAgICBuRXJyb3JMaW5lID0gbkFjdExpbmU7CgkJCX0KCQkJZWxzZQoJCQkJc0xpbmUgPSAiIjsKICAgICAgICB9CgoJCXNPbGRMaW5lID0gc0xpbmU7CgkJbkFjdExpbmUrKzsKCX0KCglyZXR1cm4gc09sZExpbmU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR2VuZXJpY0luZm9ybWF0aW9uICpJbmZvcm1hdGlvblBhcnNlcjo6UmVhZEtleSgKCQkJCQkJCQkJR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqcEV4aXN0aW5nTGlzdCApCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewoJLy8gdGhpcyBtZXRob2QgaGFzIG5vIGVycm9yIGhhbmRsaW5nIHlldCwgYnV0IGl0IHdvcmtzIHZlcnkgZmFzdC4KCS8vIGl0IGlzIHVzZWQgdG8gY3JlYXRlIHdob2xlIGluZm9ybWF0aW9ucyBhbmQgc3ViIGluZm9ybWF0aW9ucyBpbgoJLy8gYSBzaW1wbGUgZGF0YSBmb3JtYXQgaW4gbWVtb3J5LCByZWFkZWQgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUgd2l0aAoJLy8gZm9sbG93aW5nIGZvcm1hdDoKCgkvKgoKCWtleSBbdmFsdWVdCgl7CgkJa2V5IFt2YWx1ZV0KCQlrZXkgW3ZhbHVlXQoJCXsKCQkJa2V5IFt2YWx1ZV0KCQkJLi4uCgkJCS4uLgoJCX0KCX0KCWtleSBbdmFsdWVdCgkuLi4KCS4uLgoKCSovCgoJR2VuZXJpY0luZm9ybWF0aW9uICpwSW5mbyA9IE5VTEw7CgoJQnl0ZVN0cmluZyBzTGluZSggUmVhZExpbmUoKSk7CglCeXRlU3RyaW5nIHNLZXk7CglCeXRlU3RyaW5nIHNWYWx1ZTsKCUJ5dGVTdHJpbmcgc0NvbW1lbnQoIHNDdXJyZW50Q29tbWVudCApOwoJc0N1cnJlbnRDb21tZW50ID0gIiI7CgoJLy8ga2V5IHNlcGFyYXRlZCBmcm9tIHZhbHVlIGJ5IHRhYj8KCXNhbF91SW50MTYgbldTUG9zID0gc0xpbmUuU2VhcmNoKCAnICcgKTsKCWlmICggc0xpbmUuU2VhcmNoKCAnXHQnICkgPCBuV1NQb3MgKSB7CgkJbldTUG9zID0gc0xpbmUuU2VhcmNoKCAnXHQnICk7CgkJc0xpbmUuU2VhcmNoQW5kUmVwbGFjZSggIlx0IiwgIiAiICk7Cgl9CgoJaWYgKCBzTGluZS5HZXRUb2tlbkNvdW50KCAnICcgKSA+IDEgKSB7CgkJc0tleSA9IHNMaW5lLkdldFRva2VuKCAwLCAnICcgKTsKCQlzVmFsdWUgPSBzTGluZS5Db3B5KCBzS2V5LkxlbigpICsgMSApOwoJCXdoaWxlICgoIHNWYWx1ZS5TZWFyY2goICcgJyApID09IDAgKSB8fCAoIHNWYWx1ZS5TZWFyY2goICdcdCcgKSA9PSAwICkpIHsKCQkJc1ZhbHVlLkVyYXNlKCAwLCAxICk7CgkJfQoJfQoJZWxzZQoJCXNLZXk9c0xpbmU7CgoJaWYgKCBiUmVwbGFjZVZhcmlhYmxlcyAmJiAhbkxldmVsICkgewoJCXNVUEQgPSBzS2V5LkNvcHkoIHNLZXkuTGVuKCkgLSAzICk7CgkJc1ZlcnNpb24gPSBzS2V5OwoJfQoKCWlmICggUmVhZExpbmUoKSA9PSAieyIgKSB7CgkJbkxldmVsKys7CgkJR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqcFN1Ykxpc3QgPSBuZXcgR2VuZXJpY0luZm9ybWF0aW9uTGlzdCgpOwoJCXdoaWxlICggUmVhZExpbmUoKSAhPSAifSIgKSB7CgkJCVJlY292ZXIoKTsKCQkJUmVhZEtleSggcFN1Ykxpc3QgKTsKCQl9CgkJbkxldmVsLS07CgkJcEluZm8gPSBuZXcgR2VuZXJpY0luZm9ybWF0aW9uKCBzS2V5LCBzVmFsdWUsCgkJCQkJCXBFeGlzdGluZ0xpc3QsIHBTdWJMaXN0ICk7CgkJcEluZm8tPlNldENvbW1lbnQoIHNDb21tZW50ICk7Cgl9CgllbHNlIHsKCQlSZWNvdmVyKCk7CiAgICAgICAgaWYgKCAhc0tleS5FcXVhbHMoICJ9IiApICYmICFzS2V5LkVxdWFscyggInsiICkgKQogICAgICAgIHsKCQkgICAgcEluZm8gPSBuZXcgR2VuZXJpY0luZm9ybWF0aW9uKCBzS2V5LCBzVmFsdWUsIHBFeGlzdGluZ0xpc3QgKTsKCQkgICAgcEluZm8tPlNldENvbW1lbnQoIHNDb21tZW50ICk7CiAgICAgICAgfQoJfQoKCXJldHVybiBwSW5mbzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEluZm9ybWF0aW9uUGFyc2VyOjpSZWNvdmVyKCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CgliUmVjb3ZlciA9IHNhbF9UcnVlOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnNhbF9Cb29sIEluZm9ybWF0aW9uUGFyc2VyOjpTYXZlKCBTdlN0cmVhbSAmck91dFN0cmVhbSwKCQkJICAgICAgY29uc3QgR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqcFNhdmVMaXN0LAoJCQkgICAgICBzYWxfdUludDE2IGxldmVsLCBzYWxfQm9vbCBiU3RyaXBwZWQgKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKCXNhbF91SW50MTYgaTsKCXNhbF91SW50UHRyIG5JbmZvTGlzdENvdW50OwoJQnl0ZVN0cmluZyBzVG1wU3RyOwoJR2VuZXJpY0luZm9ybWF0aW9uICpwR2VuZXJpY0luZm87CglHZW5lcmljSW5mb3JtYXRpb25MaXN0ICpwR2VuZXJpY0luZm9MaXN0OwoKIAlzdGF0aWMgQnl0ZVN0cmluZyBhS2V5TGV2ZWw7CiAgICBhS2V5TGV2ZWwuRXhwYW5kKCBsZXZlbCwgY0tleUxldmVsQ2hhciApOwoKCWZvciAoIG5JbmZvTGlzdENvdW50ID0gMDsgbkluZm9MaXN0Q291bnQgPCBwU2F2ZUxpc3QtPkNvdW50KCk7IG5JbmZvTGlzdENvdW50KyspIHsKCSAgICAvLyBLZXktVmFsdWUgUGFhcmUgc2NocmVpYmVuCiAgICAJcEdlbmVyaWNJbmZvID0gcFNhdmVMaXN0LT5HZXRPYmplY3QoIG5JbmZvTGlzdENvdW50ICk7CiAgICAJc1RtcFN0ciA9ICIiOwogICAgICAgIGlmICggIWJTdHJpcHBlZCAmJiBsZXZlbCApCiAgICAgICAgCXNUbXBTdHIuQXBwZW5kKCBhS2V5TGV2ZWwuR2V0QnVmZmVyKCksIGxldmVsICk7CgogICAgICAgIGlmICggIWJTdHJpcHBlZCApCgkJICAgIGZvciAoIGkgPSAwOyBpIDwgcEdlbmVyaWNJbmZvLT5HZXRDb21tZW50KCkuR2V0VG9rZW5Db3VudCggJ1xuJyApOyBpKysgKSB7CgkJCSAgICBzVG1wU3RyICs9IHBHZW5lcmljSW5mby0+R2V0Q29tbWVudCgpLkdldFRva2VuKCBpLCAnXG4nICk7CgkJCSAgICBzVG1wU3RyICs9ICJcbiI7CiAgICAgICAgICAgICAgICBpZiAoIGxldmVsICkKICAgICAgICAJICAgICAgICBzVG1wU3RyLkFwcGVuZCggYUtleUxldmVsLkdldEJ1ZmZlcigpLCBsZXZlbCApOwoJCSAgICB9CgogICAgCXNUbXBTdHIgKz0gcEdlbmVyaWNJbmZvLT5HZXRCdWZmZXIoKTsKICAgIAlzVG1wU3RyICs9ICcgJzsKICAgIAlzVG1wU3RyICs9IHBHZW5lcmljSW5mby0+R2V0VmFsdWUoKTsKICAgIAlpZiAoICFyT3V0U3RyZWFtLldyaXRlTGluZSggc1RtcFN0ciApICkKICAgICAgCQlyZXR1cm4gc2FsX0ZhbHNlOwoKICAgIAkvLyB3ZW5uIHZvcmhhbmRlbiwgYmVhcmJlaXRlIHJlY3Vyc2l2ZSBkaWUgU3VibGlzdGVuCiAgICAJaWYgKCggcEdlbmVyaWNJbmZvTGlzdCA9IHBHZW5lcmljSW5mby0+R2V0U3ViTGlzdCgpICkgIT0gTlVMTCApIHsKICAgICAgCQkvLyBvZWZmbmVuZGUgS2xhbW1lcgogICAgICAJCXNUbXBTdHIgPSAiIjsKICAgICAgICAgICAgaWYgKCAhYlN0cmlwcGVkICYmIGxldmVsICkKICAgICAgICAJICAgIHNUbXBTdHIuQXBwZW5kKCBhS2V5TGV2ZWwuR2V0QnVmZmVyKCksIGxldmVsICk7CiAgICAgIAkJc1RtcFN0ciArPSAneyc7CiAgICAgIAkJaWYgKCAhck91dFN0cmVhbS5Xcml0ZUxpbmUoIHNUbXBTdHIgKSApCgkJCQlyZXR1cm4gc2FsX0ZhbHNlOwogICAgICAJCS8vIHJlY3Vyc2l2IGRpZSBzdWJsaXN0IGFiYXJiZWl0ZW4KICAgICAgCQlpZiAoICFTYXZlKCByT3V0U3RyZWFtLCBwR2VuZXJpY0luZm9MaXN0LCBsZXZlbCsxLCBiU3RyaXBwZWQgKSApCiAgICAJCQlyZXR1cm4gc2FsX0ZhbHNlOwogICAgICAJCQkvLyBzY2hsaWVzc2VuZGUgS2xhbW1lcgogICAgICAJCXNUbXBTdHIgPSAiIjsKICAgICAgICAgICAgaWYgKCAhYlN0cmlwcGVkICYmIGxldmVsICkKICAgICAgICAJICAgIHNUbXBTdHIuQXBwZW5kKCBhS2V5TGV2ZWwuR2V0QnVmZmVyKCksIGxldmVsICk7CiAgICAgIAkJc1RtcFN0ciArPSAnfSc7CiAgICAgIAkJaWYgKCAhck91dFN0cmVhbS5Xcml0ZUxpbmUoIHNUbXBTdHIgKSApCgkJCQlyZXR1cm4gc2FsX0ZhbHNlOwogICAgCX0KICAJfQogIAlyZXR1cm4gc2FsX1RydWU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqSW5mb3JtYXRpb25QYXJzZXI6OkV4ZWN1dGUoCgkJCQkJCQkJU3ZTdHJlYW0gJnJTb3VyY2VTdHJlYW0sCgkJCQkJCQkJR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqcEV4aXN0aW5nTGlzdCApCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewoJR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqcExpc3Q7CglpZiAoIHBFeGlzdGluZ0xpc3QgKQoJCXBMaXN0ID0gcEV4aXN0aW5nTGlzdDsKCWVsc2UKCQlwTGlzdCA9IG5ldyBHZW5lcmljSW5mb3JtYXRpb25MaXN0KCk7CgoJcEFjdFN0cmVhbSA9ICZyU291cmNlU3RyZWFtOwoKCS8vIHJlYWQgYWxsIGluZm9zIG91dCBvZiBjdXJyZW50IGZpbGUKCXdoaWxlKCAhclNvdXJjZVN0cmVhbS5Jc0VvZigpKSB7CgkJbkxldmVsID0gMDsKCQlSZWFkS2V5KCBwTGlzdCApOwoJfQoKCXJldHVybiBwTGlzdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHZW5lcmljSW5mb3JtYXRpb25MaXN0ICpJbmZvcm1hdGlvblBhcnNlcjo6RXhlY3V0ZSggU3ZNZW1vcnlTdHJlYW0gJnJTb3VyY2VTdHJlYW0sCgkJCQkJCSAgICBHZW5lcmljSW5mb3JtYXRpb25MaXN0ICpwRXhpc3RpbmdMaXN0ICkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgCXNTdHJlYW1OYW1lID0gVW5pU3RyaW5nKCAiTWVtb3J5IiwgZ3NsX2dldFN5c3RlbVRleHRFbmNvZGluZygpKTsKICAJcmV0dXJuIEV4ZWN1dGUoIChTdlN0cmVhbSAmKXJTb3VyY2VTdHJlYW0sIHBFeGlzdGluZ0xpc3QgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHZW5lcmljSW5mb3JtYXRpb25MaXN0ICpJbmZvcm1hdGlvblBhcnNlcjo6RXhlY3V0ZSgKCQkJCQkJCQlTdkZpbGVTdHJlYW0gJnJTb3VyY2VTdHJlYW0sCgkJCQkJCQkJR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqcEV4aXN0aW5nTGlzdCApCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewoJaWYgKCAhclNvdXJjZVN0cmVhbS5Jc09wZW4oKSkKCQlyZXR1cm4gTlVMTDsKCXNTdHJlYW1OYW1lID0gclNvdXJjZVN0cmVhbS5HZXRGaWxlTmFtZSgpOwoJcmV0dXJuIEV4ZWN1dGUoIChTdlN0cmVhbSAmKXJTb3VyY2VTdHJlYW0sIHBFeGlzdGluZ0xpc3QgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHZW5lcmljSW5mb3JtYXRpb25MaXN0ICpJbmZvcm1hdGlvblBhcnNlcjo6RXhlY3V0ZSggVW5pU3RyaW5nICZyU291cmNlRmlsZSwKCQkJCQkJCQlHZW5lcmljSW5mb3JtYXRpb25MaXN0ICpwRXhpc3RpbmdMaXN0ICkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CglEaXJFbnRyeSBhRGlyRW50cnkoIHJTb3VyY2VGaWxlICk7CglpZiAoICFhRGlyRW50cnkuRXhpc3RzKCkpCgkJcmV0dXJuIE5VTEw7CgoJR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqcExpc3Q7CglpZiAoIHBFeGlzdGluZ0xpc3QgKQoJCXBMaXN0ID0gcEV4aXN0aW5nTGlzdDsKCWVsc2UKCQlwTGlzdCA9IG5ldyBHZW5lcmljSW5mb3JtYXRpb25MaXN0KCk7CgoJLy8gcmVzZXQgc3RhdHVzCgluRXJyb3JDb2RlID0gMDsKCW5FcnJvckxpbmUgPSAwOwoJbkFjdExpbmUgPSAwOwoKCVN2RmlsZVN0cmVhbSBhQWN0U3RyZWFtOwoJYUFjdFN0cmVhbS5PcGVuKCByU291cmNlRmlsZSwgU1RSRUFNX1JFQUQgKTsKCWlmKCBhQWN0U3RyZWFtLkdldEVycm9yKCkpCgkJcmV0dXJuIE5VTEw7CgoJcEFjdFN0cmVhbSA9ICZhQWN0U3RyZWFtOwoJaWYgKCAhRXhlY3V0ZSggYUFjdFN0cmVhbSwgcExpc3QgKSkgewoJCWRlbGV0ZSBwTGlzdDsKCQlwTGlzdCA9IE5VTEw7Cgl9CgoJLy8gY2xvc2UgdGhlIHN0cmVhbQoJYUFjdFN0cmVhbS5DbG9zZSgpOwogCXBBY3RTdHJlYW0gPSBOVUxMOwoKCWlmICggIW5FcnJvckNvZGUgKQoJCXJldHVybiBwTGlzdDsKCglyZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHZW5lcmljSW5mb3JtYXRpb25MaXN0ICpJbmZvcm1hdGlvblBhcnNlcjo6RXhlY3V0ZSggRGlyICZyRGlyLAoJCQkJCQkJCUdlbmVyaWNJbmZvcm1hdGlvbkxpc3QgKnBFeGlzdGluZ0xpc3QgKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKCUdlbmVyaWNJbmZvcm1hdGlvbkxpc3QgKnBMaXN0OwoKCWlmICggcEV4aXN0aW5nTGlzdCApCgkJcExpc3QgPSBwRXhpc3RpbmdMaXN0OwoJZWxzZQoJCXBMaXN0ID0gbmV3IEdlbmVyaWNJbmZvcm1hdGlvbkxpc3QoKTsKCglmb3IgKCBzYWxfdUludDE2IGkgPSAwOyBpIDwgckRpci5Db3VudCgpOyBpKysgKSB7CgoJCS8vIGV4ZWN1dGUgdGhpcyBkaXIKCQlVbmlTdHJpbmcgc05leHRGaWxlKCByRGlyW2ldLkdldEZ1bGwoKSk7CgkJR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqcFN1Ykxpc3QgPSBFeGVjdXRlKCBzTmV4dEZpbGUgKTsKCgkJaWYgKCAhcFN1Ykxpc3QgKSB7CgkJCS8vIGFueSBlcnJvcnMgPwoJCQlkZWxldGUgcExpc3Q7CgkJCXJldHVybiBOVUxMOwoJCX0KCgkJLy8gY3JlYXRlIG5ldyBpbmZvIGFuZCBpbnNlcnQgaXQgaW50byBsaXN0CgkJQnl0ZVN0cmluZyBzRmlsZUtleSggckRpcltpXS5HZXROYW1lKCksIFJUTF9URVhURU5DT0RJTkdfVVRGOCApOwoJCW5ldyBHZW5lcmljSW5mb3JtYXRpb24oCgkJCQkJCQkJCQkJc0ZpbGVLZXksCgkJCQkJCQkJCQkJQnl0ZVN0cmluZyggIiIgKSwKCQkJCQkJCQkJCQlwTGlzdCwgcFN1Ykxpc3QgKTsKCX0KCglyZXR1cm4gcExpc3Q7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc2FsX0Jvb2wgSW5mb3JtYXRpb25QYXJzZXI6OlNhdmUoIFN2RmlsZVN0cmVhbSAmclNvdXJjZVN0cmVhbSwKCQkJICAgICAgY29uc3QgR2VuZXJpY0luZm9ybWF0aW9uTGlzdCAqcFNhdmVMaXN0ICkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CglpZiAoICFyU291cmNlU3RyZWFtLklzT3BlbigpIHx8ICFTYXZlKCAoU3ZTdHJlYW0gJilyU291cmNlU3RyZWFtLCBwU2F2ZUxpc3QsIDAsIHNhbF9GYWxzZSApKQogICAgewogICAgICAgIHByaW50ZiggIkVSUk9SIHNhdmluZyBmaWxlIFwiJXNcIlxuIixCeXRlU3RyaW5nKCByU291cmNlU3RyZWFtLkdldEZpbGVOYW1lKCksIGdzbF9nZXRTeXN0ZW1UZXh0RW5jb2RpbmcoKSkuR2V0QnVmZmVyKCkgKTsKCQlyZXR1cm4gc2FsX0ZhbHNlOwogICAgfQoKCXJldHVybiBzYWxfVHJ1ZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzYWxfQm9vbCBJbmZvcm1hdGlvblBhcnNlcjo6U2F2ZSggU3ZNZW1vcnlTdHJlYW0gJnJTb3VyY2VTdHJlYW0sCgkJCSAgICAgIGNvbnN0IEdlbmVyaWNJbmZvcm1hdGlvbkxpc3QgKnBTYXZlTGlzdCApCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogICAgVGltZSBhOwogICAgc2FsX0Jvb2wgYlJldCA9IFNhdmUoIChTdlN0cmVhbSAmKXJTb3VyY2VTdHJlYW0sIHBTYXZlTGlzdCwgMCwgc2FsX1RydWUgKTsKICAgIFRpbWUgYjsKICAgIGIgPSBiIC0gYTsKICAgIHJldHVybiBiUmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnNhbF9Cb29sIEluZm9ybWF0aW9uUGFyc2VyOjpTYXZlKCBjb25zdCBVbmlTdHJpbmcgJnJTb3VyY2VGaWxlLAoJCQkgICAgICBjb25zdCBHZW5lcmljSW5mb3JtYXRpb25MaXN0ICpwU2F2ZUxpc3QgKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBTdkZpbGVTdHJlYW0gKnBPdXRGaWxlID0gbmV3IFN2RmlsZVN0cmVhbSggclNvdXJjZUZpbGUsIFNUUkVBTV9TVERfV1JJVEUgfCBTVFJFQU1fVFJVTkMgKTsKCiAgaWYgKCAhU2F2ZSggKnBPdXRGaWxlLCBwU2F2ZUxpc3QgKSkgewogICAgZGVsZXRlIHBPdXRGaWxlOwogICAgcmV0dXJuIHNhbF9GYWxzZTsKICB9CiAgZGVsZXRlIHBPdXRGaWxlOwogIHJldHVybiBzYWxfVHJ1ZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzYWxfdUludDE2IEluZm9ybWF0aW9uUGFyc2VyOjpHZXRFcnJvckNvZGUoKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKCXJldHVybiBuRXJyb3JDb2RlOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkJ5dGVTdHJpbmcgJkluZm9ybWF0aW9uUGFyc2VyOjpHZXRFcnJvclRleHQoKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICAvLwlzRXJyb3JUZXh0ID0gcEFjdFN0cmVhbS0+R2V0RmlsZU5hbWUoKTsKICAgIHNFcnJvclRleHQgPSBCeXRlU3RyaW5nKCBzU3RyZWFtTmFtZSwgZ3NsX2dldFN5c3RlbVRleHRFbmNvZGluZygpKTsKCXNFcnJvclRleHQgKz0gQnl0ZVN0cmluZyggIiAoIiApOwoJc0Vycm9yVGV4dCArPSBCeXRlU3RyaW5nOjpDcmVhdGVGcm9tSW50NjQobkVycm9yTGluZSk7CglzRXJyb3JUZXh0ICs9IEJ5dGVTdHJpbmcoICIpOiAiICk7CgoJc3dpdGNoICggbkVycm9yQ29kZSApIHsKCWNhc2UgSVBfTk9fRVJST1I6CgkJc0Vycm9yVGV4dCArPSBCeXRlU3RyaW5nKCAiS2VpbmUgRmVobGVyIGF1ZmdldGVyZXRlbiIgKTsKCQlicmVhazsKCWNhc2UgSVBfVU5FWFBFQ1RFRF9FT0Y6CgkJc0Vycm9yVGV4dCArPSBCeXRlU3RyaW5nKCAiVW5n/Gx0aWdlcyBEYXRlaWVuZGUhIiApOwoJCWJyZWFrOwoJfQoKCXJldHVybiBzRXJyb3JUZXh0Owp9Cg==