LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENPUFlSSUdIVDogCiAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDAxLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZAogKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJsb2N0ZXN0LmgiCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjc3RyaW5nLmg+CgojaW5jbHVkZSAidW5pY29kZS9kZWNpbWZtdC5oIgovLyNpbmNsdWRlICJ1bmljb2RlL2RhdGVmbXQuaCIKI2luY2x1ZGUgInVuaWNvZGUvc21wZHRmbXQuaCIKCmNvbnN0IGNoYXIqIHJhd0RhdGFbMjddWzddID0gewoKICAgICAgICAvLyBsYW5ndWFnZSBjb2RlCiAgICAgICAgeyAgICJlbiIsICAgImZyIiwgICAiaHIiLCAgICJlbCIsICAgIm5vIiwgICAiaXQiLCAgICJ4eCIgICAgfSwKICAgICAgICAvLyBjb3VudHJ5IGNvZGUKICAgICAgICB7ICAgIlVTIiwgICAiRlIiLCAgICJIUiIsICAgIkdSIiwgICAiTk8iLCAgICIiLCAgICAgIllZIiAgICB9LAogICAgICAgIC8vIHZhcmlhbnQgY29kZQogICAgICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOWSIsICAgIiIsICAgICAiIiAgICB9LAogICAgICAgIC8vIGZ1bGwgbmFtZQogICAgICAgIHsgICAiZW5fVVMiLCAgICAiZnJfRlIiLCAgICAiaHJfSFIiLCAgICAiZWxfR1IiLCAgICAibm9fTk9fTlkiLCAiaXQiLCAgICJ4eF9ZWSIgIH0sCiAgICAgICAgLy8gSVNPLTMgbGFuZ3VhZ2UKICAgICAgICB7ICAgImVuZyIsICAiZnJhIiwgICJocnYiLCAgImVsbCIsICAibm9yIiwgICJpdGEiLCAgIiIgICB9LAogICAgICAgIC8vIElTTy0zIGNvdW50cnkKICAgICAgICB7ICAgIlVTQSIsICAiRlJBIiwgICJIUlYiLCAgIkdSQyIsICAiTk9SIiwgICIiLCAgICAgIiIgICB9LAogICAgICAgIC8vIExDSUQgKG5vdCBjdXJyZW50bHkgcHVibGljKQogICAgICAgIHsgICAiNDA5IiwgIjQwYyIsICI0MWEiLCAiNDA4IiwgIjgxNCIsICIiLCAgICAgIiIgIH0sCgogICAgICAgIC8vIGRpc3BsYXkgbGFuZ2FnZSAoRW5nbGlzaCkKICAgICAgICB7ICAgIkVuZ2xpc2giLCAgIkZyZW5jaCIsICAgIkNyb2F0aWFuIiwgIkdyZWVrIiwgICAgIk5vcndlZ2lhbiIsICAgICJJdGFsaWFuIiwgICJ4eCIgfSwKICAgICAgICAvLyBkaXNwbGF5IGNvdW50cnkgKEVuZ2xpc2gpCiAgICAgICAgeyAgICJVbml0ZWQgU3RhdGVzIiwgICAgIkZyYW5jZSIsICAgIkNyb2F0aWEiLCAgIkdyZWVjZSIsICAgIk5vcndheSIsICAgIiIsICAgICAiWVkiIH0sCiAgICAgICAgLy8gZGlzcGxheSB2YXJpYW50IChFbmdsaXNoKQogICAgICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOeW5vcnNrIiwgICAiIiwgICAgICIifSwKICAgICAgICAvL3sgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOWSIsICAgIiIsICAgICAiIn0sCiAgICAgICAgLy8gZGlzcGxheSBuYW1lIChFbmdsaXNoKQogICAgICAgIC8vIFVwZGF0ZWQgbm9fTk9fTlkgRW5nbGlzaCBkaXNwbGF5IG5hbWUgZm9yIG5ldyBwYXR0ZXJuLWJhc2VkIGFsZ29yaXRobQogICAgICAgIC8vIChwYXJ0IG9mIEV1cm8gc3VwcG9ydCkuCiAgICAgICAgeyAgICJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSIsICJGcmVuY2ggKEZyYW5jZSkiLCAiQ3JvYXRpYW4gKENyb2F0aWEpIiwgIkdyZWVrIChHcmVlY2UpIiwgIk5vcndlZ2lhbiAoTm9yd2F5LCBOeW5vcnNrKSIsICJJdGFsaWFuIiwgInh4IChZWSkiIH0sCiAgICAgICAgLy97ICAgIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIiwgIkZyZW5jaCAoRnJhbmNlKSIsICJDcm9hdGlhbiAoQ3JvYXRpYSkiLCAiR3JlZWsgKEdyZWVjZSkiLCAiTm9yd2VnaWFuIChOb3J3YXksTlkpIiwgIkl0YWxpYW4iLCAieHggKFlZKSIgfSwKCiAgICAgICAgLy8gZGlzcGxheSBsYW5nYWdlIChGcmVuY2gpCiAgICAgICAgeyAgICJhbmdsYWlzIiwgICJmcmFuXFx1MDBFN2FpcyIsICAgImNyb2F0ZSIsICJncmVjIiwgICAgIm5vcnZcXHUwMEU5Z2llbiIsICAgICJpdGFsaWVuIiwgInh4IiB9LAogICAgICAgIC8vIGRpc3BsYXkgY291bnRyeSAoRnJlbmNoKQogICAgICAgIHsgICAiXFx1MDBDOXRhdHMtVW5pcyIsICAgICJGcmFuY2UiLCAgICJDcm9hdGllIiwgICJHclxcdTAwRThjZSIsICAgIk5vcnZcXHUwMEU4Z2UiLCAiIiwgICAgICJZWSIgfSwKICAgICAgICAvLyBkaXNwbGF5IHZhcmlhbnQgKEZyZW5jaCkKICAgICAgICB7ICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiTnlub3JzayIsICAgICAiIiwgICAgICIiIH0sCiAgICAgICAgLy8gZGlzcGxheSBuYW1lIChGcmVuY2gpCiAgICAgICAgLy97ICAgImFuZ2xhaXMgKMl0YXRzLVVuaXMpIiwgImZyYW7nYWlzIChGcmFuY2UpIiwgImNyb2F0ZSAoQ3JvYXRpZSkiLCAiZ3JlYyAoR3LoY2UpIiwgIm5vcnbpZ2llbiAoTm9yduhnZSxOeW5vcnNrKSIsICJpdGFsaWVuIiwgInh4IChZWSkiIH0sCiAgICAgICAgeyAgICJhbmdsYWlzIChcXHUwMEM5dGF0cy1VbmlzKSIsICJmcmFuXFx1MDBFN2FpcyAoRnJhbmNlKSIsICJjcm9hdGUgKENyb2F0aWUpIiwgImdyZWMgKEdyXFx1MDBFOGNlKSIsICJub3J2XFx1MDBFOWdpZW4gKE5vcnZcXHUwMEU4Z2UsIE55bm9yc2spIiwgIml0YWxpZW4iLCAieHggKFlZKSIgfSwgLy8gU1RJTEwgbm90IHJpZ2h0CgogICAgICAgIC8vIGRpc3BsYXkgbGFuZ2FnZSAoQ3JvYXRpYW4pCiAgICAgICAgeyAgICIiLCAgIiIsICJocnZhdHNraSIsICIiLCAgICAiIiwgIiIsICJ4eCIgfSwKICAgICAgICAvLyBkaXNwbGF5IGNvdW50cnkgKENyb2F0aWFuKQogICAgICAgIHsgICAiIiwgICAgIiIsICAgIkhydmF0c2thIiwgICIiLCAgICIiLCAiIiwgIllZIiB9LAogICAgICAgIC8vIGRpc3BsYXkgdmFyaWFudCAoQ3JvYXRpYW4pCiAgICAgICAgeyAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICIiLCAiIn0sCiAgICAgICAgLy8gZGlzcGxheSBuYW1lIChDcm9hdGlhbikKICAgICAgICB7ICAgIiIsICIiLCAiaHJ2YXRza2kgKEhydmF0c2thKSIsICIiLCAiIiwgICIiLCAieHggKFlZKSIgfSwKCiAgICAgICAgLy8gZGlzcGxheSBsYW5nYWdlIChHcmVlaylbYWN0dWFsIHZhbHVlcyBsaXN0ZWQgYmVsb3ddCiAgICAgICAgeyAgICJcXHUwMzkxXFx1MDNiM1xcdTAzYjNcXHUwM2JiXFx1MDNiOVxcdTAzYmFcXHUwM2FjIiwgIlxcdTAzOTNcXHUwM2IxXFx1MDNiYlxcdTAzYmJcXHUwM2I5XFx1MDNiYVxcdTAzYWMiLCAiXFx1MDM5YVxcdTAzYzFcXHUwM2JmXFx1MDNiMVxcdTAzYzRcXHUwM2I5XFx1MDNiYVxcdTAzYWMiLCAiIiwgICAgIlxcdTAzOWRcXHUwM2JmXFx1MDNjMVxcdTAzYjJcXHUwM2I3XFx1MDNiM1xcdTAzYjlcXHUwM2JhXFx1MDNhYyIsICIiLCAiIiB9LAogICAgICAgIC8vIGRpc3BsYXkgY291bnRyeSAoR3JlZWspW2FjdHVhbCB2YWx1ZXMgbGlzdGVkIGJlbG93XQogICAgICAgIHsgICAiXFx1MDM5N1xcdTAzYmRcXHUwM2M5XFx1MDNiY1xcdTAzYWRcXHUwM2JkXFx1MDNiNVxcdTAzYzIgXFx1MDNhMFxcdTAzYmZcXHUwM2JiXFx1MDNiOVxcdTAzYzRcXHUwM2I1XFx1MDNhZlxcdTAzYjVcXHUwM2MyIFxcdTAzOTFcXHUwM2JjXFx1MDNiNVxcdTAzYzFcXHUwM2I5XFx1MDNiYVxcdTAzYWVcXHUwM2MyIiwgIlxcdTAzOTNcXHUwM2IxXFx1MDNiYlxcdTAzYmJcXHUwM2FmXFx1MDNiMSIsICJcXHUwMzlhXFx1MDNjMVxcdTAzYmZcXHUwM2IxXFx1MDNjNFxcdTAzYWZcXHUwM2IxIiwgIiIsICAgICJcXHUwMzlkXFx1MDNiZlxcdTAzYzFcXHUwM2IyXFx1MDNiN1xcdTAzYjNcXHUwM2FmXFx1MDNiMSIsICIiLCAiIiB9LAogICAgICAgIC8vIGRpc3BsYXkgdmFyaWFudCAoR3JlZWspCiAgICAgICAgeyAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICIiLCAiIiB9LAogICAgICAgIC8vIGRpc3BsYXkgbmFtZSAoR3JlZWspW2FjdHVhbCB2YWx1ZXMgbGlzdGVkIGJlbG93XQogICAgICAgIHsgICAiXFx1MDM5MVxcdTAzYjNcXHUwM2IzXFx1MDNiYlxcdTAzYjlcXHUwM2JhXFx1MDNhYyAoXFx1MDM5N1xcdTAzYmRcXHUwM2M5XFx1MDNiY1xcdTAzYWRcXHUwM2JkXFx1MDNiNVxcdTAzYzIgXFx1MDNhMFxcdTAzYmZcXHUwM2JiXFx1MDNiOVxcdTAzYzRcXHUwM2I1XFx1MDNhZlxcdTAzYjVcXHUwM2MyIFxcdTAzOTFcXHUwM2JjXFx1MDNiNVxcdTAzYzFcXHUwM2I5XFx1MDNiYVxcdTAzYWVcXHUwM2MyKSIsICJcXHUwMzkzXFx1MDNiMVxcdTAzYmJcXHUwM2JiXFx1MDNiOVxcdTAzYmFcXHUwM2FjIChcXHUwMzkzXFx1MDNiMVxcdTAzYmJcXHUwM2JiXFx1MDNhZlxcdTAzYjEpIiwgIlxcdTAzOWFcXHUwM2MxXFx1MDNiZlxcdTAzYjFcXHUwM2M0XFx1MDNiOVxcdTAzYmFcXHUwM2FjIChcXHUwMzlhXFx1MDNjMVxcdTAzYmZcXHUwM2IxXFx1MDNjNFxcdTAzYWZcXHUwM2IxKSIsICIiLCAgICAiXFx1MDM5ZFxcdTAzYmZcXHUwM2MxXFx1MDNiMlxcdTAzYjdcXHUwM2IzXFx1MDNiOVxcdTAzYmFcXHUwM2FjIChcXHUwMzlkXFx1MDNiZlxcdTAzYzFcXHUwM2IyXFx1MDNiN1xcdTAzYjNcXHUwM2FmXFx1MDNiMSwgTnlub3JzaykiLCAiIiwgIiIgfSwKCiAgICAgICAgLy8gZGlzcGxheSBsYW5nYWdlICg8cm9vdD4pCiAgICAgICAgeyAgICJFbmdsaXNoIiwgICJGcmVuY2giLCAgICJDcm9hdGlhbiIsICJHcmVlayIsICAgICJOb3J3ZWdpYW4iLCAgICAiSXRhbGlhbiIsICAieHgiIH0sCiAgICAgICAgLy8gZGlzcGxheSBjb3VudHJ5ICg8cm9vdD4pCiAgICAgICAgeyAgICJVbml0ZWQgU3RhdGVzIiwgICAgIkZyYW5jZSIsICAgIkNyb2F0aWEiLCAgIkdyZWVjZSIsICAgIk5vcndheSIsICAgIiIsICAgICAiWVkiIH0sCiAgICAgICAgLy8gZGlzcGxheSB2YXJpYW50ICg8cm9vdD4pCiAgICAgICAgeyAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIk55bm9yc2siLCAgICIiLCAgICAgIiJ9LAogICAgICAgIC8vIGRpc3BsYXkgbmFtZSAoPHJvb3Q+KQogICAgICAgIC8veyAgICJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSIsICJGcmVuY2ggKEZyYW5jZSkiLCAiQ3JvYXRpYW4gKENyb2F0aWEpIiwgIkdyZWVrIChHcmVlY2UpIiwgIk5vcndlZ2lhbiAoTm9yd2F5LE55bm9yc2spIiwgIkl0YWxpYW4iLCAieHggKFlZKSIgfSwKICAgICAgICB7ICAgIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIiwgIkZyZW5jaCAoRnJhbmNlKSIsICJDcm9hdGlhbiAoQ3JvYXRpYSkiLCAiR3JlZWsgKEdyZWVjZSkiLCAiTm9yd2VnaWFuIChOb3J3YXksTlkpIiwgIkl0YWxpYW4iLCAieHggKFlZKSIgfQp9OwoKLy8gKiB0ZXN0IG1hY3JvcwovKgogVXNhZ2U6CiAgICB0ZXN0X2NvbXBhcmUoICAgIEZ1bmN0aW9uIHRvIGJlIHBlcmZvcm1lZCwKICAgICAgICAgICAgICAgICAgICAgICBUZXN0IG9mIHRoZSBmdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCByZXN1bHQgb2YgdGhlIHRlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRhYmxlIHJlc3VsdAogICAgICAgICAgICAgICAgICApCgogICBFeGFtcGxlOgogICAgICAgdGVzdF9jb21wYXJlKGk9MyxpLDMsIHNvbWVOdW1iZXJGb3JtYXR0ZXIoaSkpOwogICAgICAgdGVzdF9jb21wYXJlKDAsMSsxLDIsc29tZU51bWJlckZvcm1hdHRlcigxKzEpKTsgCgogICBOb3RlIHRoYXQgaW4gdGhlIHNlY29uZCBleGFtcGxlIHRoZSBleHByZXNzaW9uIGlzIDAsIGJlY2F1c2UgdGhlIGZjbiBwcm9kdWNlcyBpdCdzIG93biByZXN1bHQuCgogICBNYWNybyBpcyB1Z2x5IGJ1dCBtYWtlcyB0aGUgdGVzdHMgcHJldHR5LgoqLwoKI2RlZmluZSB0ZXN0X2NvbXBhcmUoZXhwcmVzc2lvbix0ZXN0LGV4cGVjdGVkLHByaW50YWJsZVJlc3VsdCkgXAogICAgeyBcCiAgICAgICAgZXhwcmVzc2lvbjsgXAogICAgICAgIFwKICAgICAgICBpZigodGVzdCkgIT0gKGV4cGVjdGVkKSkgXAogICAgICAgICAgICBlcnJsbigiRkFJTDogIiArIFVuaWNvZGVTdHJpbmcoI2V4cHJlc3Npb24pICsgIjsgLT4gIiArIHByaW50YWJsZVJlc3VsdCArICJcbiIgKyBcCiAgICAgICAgICAgICAgICAgICAgIiAgICgiICsgVW5pY29kZVN0cmluZygjdGVzdCkgKyAiICE9ICIgKyBVbmljb2RlU3RyaW5nKCNleHBlY3RlZCkgKyAiKSIgKTsgXAogICAgICAgIGVsc2UgXAogICAgICAgICAgICBsb2dsbihVbmljb2RlU3RyaW5nKCNleHByZXNzaW9uKSArICIgLT4gIiArIHByaW50YWJsZVJlc3VsdCArICIgKCIgKyBVbmljb2RlU3RyaW5nKCN0ZXN0KSArICIpIik7IFwKICAgIH0KCgoKCi8qCiBVc2FnZToKICAgIHRlc3RfYXNzZXJ0X3ByaW50KCAgICBUZXN0IChzaG91bGQgYmUgVFJVRSksICBwcmludGFibGUgICkKCiAgIEV4YW1wbGU6CiAgICAgICB0ZXN0X2Fzc2VydChpPT0zLCB0b1N0cmluZyhpKSk7CgogICB0aGUgbWFjcm8gaXMgdWdseSBidXQgbWFrZXMgdGhlIHRlc3RzIHByZXR0eS4KKi8KCiNkZWZpbmUgdGVzdF9hc3NlcnRfcHJpbnQodGVzdCxwcmludCkgXAogICAgeyBcCiAgICAgICAgaWYoISh0ZXN0KSkgXAogICAgICAgICAgICBlcnJsbigiRkFJTDogIiArIFVuaWNvZGVTdHJpbmcoI3Rlc3QpICsgIiB3YXMgbm90IHRydWUuIiArICItPiAiICsgVW5pY29kZVN0cmluZyhwcmludCkgKTsgXAogICAgICAgIGVsc2UgXAogICAgICAgICAgICBsb2dsbigiUEFTUzogYXNzZXJ0ZWQgIiArIFVuaWNvZGVTdHJpbmcoI3Rlc3QpICsgIi0+ICIgKyBVbmljb2RlU3RyaW5nKHByaW50KSk7IFwKICAgIH0KCgojZGVmaW5lIHRlc3RfZHVtcExvY2FsZShsKSB7IFVuaWNvZGVTdHJpbmcgcyhsLmdldE5hbWUoKSwiIik7IGxvZ2xuKCNsICsgVW5pY29kZVN0cmluZygiID0gIikgKyBzKTsgfQoKTG9jYWxlVGVzdDo6TG9jYWxlVGVzdCgpCjogZGF0YVRhYmxlKE5VTEwpCnsKICAgIHNldFVwRGF0YVRhYmxlKCk7Cn0KCkxvY2FsZVRlc3Q6On5Mb2NhbGVUZXN0KCkKewogICAgaWYgKGRhdGFUYWJsZSAhPSAwKSB7CiAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMjc7IGkrKykgewogICAgICAgICAgICBkZWxldGUgW11kYXRhVGFibGVbaV07CiAgICAgICAgfQogICAgICAgIGRlbGV0ZSBbXWRhdGFUYWJsZTsKICAgICAgICBkYXRhVGFibGUgPSAwOwogICAgfQp9CgojZGVmaW5lIENBU0UoaWQsdGVzdCkgY2FzZSBpZDogbmFtZSA9ICN0ZXN0OyBpZiAoZXhlYykgeyBsb2dsbigjdGVzdCAiLS0tIik7IGxvZ2xuKChVbmljb2RlU3RyaW5nKSIiKTsgdGVzdCgpOyB9IGJyZWFrOwoKdm9pZCBMb2NhbGVUZXN0OjpydW5JbmRleGVkVGVzdCggaW50MzJfdCBpbmRleCwgVUJvb2wgZXhlYywgY29uc3QgY2hhciogJm5hbWUsIGNoYXIqIC8qcGFyKi8gKQp7CiAgICBpZiAoZXhlYykgbG9nbG4oIlRlc3RTdWl0ZSBMb2NhbGVUZXN0OiAiKTsKICAgIHN3aXRjaCAoaW5kZXgpIHsKICAgICAgICBjYXNlIDA6IG5hbWUgPSAiVGVzdEJhc2ljR2V0dGVycyI7IGlmIChleGVjKSBUZXN0QmFzaWNHZXR0ZXJzKCk7IGJyZWFrOwogICAgICAgIGNhc2UgMTogbmFtZSA9ICJUZXN0U2ltcGxlUmVzb3VyY2VJbmZvIjsgaWYgKGV4ZWMpIFRlc3RTaW1wbGVSZXNvdXJjZUluZm8oKTsgYnJlYWs7CiAgICAgICAgY2FzZSAyOiBuYW1lID0gIlRlc3REaXNwbGF5TmFtZXMiOyBpZiAoZXhlYykgVGVzdERpc3BsYXlOYW1lcygpOyBicmVhazsKICAgICAgICBjYXNlIDM6IG5hbWUgPSAiVGVzdFNpbXBsZU9iamVjdFN0dWZmIjsgaWYgKGV4ZWMpIFRlc3RTaW1wbGVPYmplY3RTdHVmZigpOyBicmVhazsKICAgICAgICBjYXNlIDQ6IG5hbWUgPSAiVGVzdFBPU0lYUGFyc2luZyI7IGlmIChleGVjKSBUZXN0UE9TSVhQYXJzaW5nKCk7IGJyZWFrOwogICAgICAgIGNhc2UgNTogbmFtZSA9ICJUZXN0R2V0QXZhaWxhYmxlTG9jYWxlcyI7IGlmIChleGVjKSBUZXN0R2V0QXZhaWxhYmxlTG9jYWxlcygpOyBicmVhazsKICAgICAgICBjYXNlIDY6IG5hbWUgPSAiVGVzdERhdGFEaXJlY3RvcnkiOyBpZiAoZXhlYykgVGVzdERhdGFEaXJlY3RvcnkoKTsgYnJlYWs7CgogICAgICAgIENBU0UoNywgVGVzdElTTzNGYWxsYmFjaykKICAgICAgICBDQVNFKDgsIFRlc3RHZXRMYW5nc0FuZENvdW50cmllcykKICAgICAgICBDQVNFKDksIFRlc3Q0MTI2ODgwKQogICAgICAgIENBU0UoMTAsIFRlc3RCdWc0MTM1MzE2KQogICAgICAgIENBU0UoMTEsIFRlc3RTaW1wbGVEaXNwbGF5TmFtZXMpCiAgICAgICAgQ0FTRSgxMiwgVGVzdFVuaW5zdGFsbGVkSVNPM05hbWVzKQogICAgICAgIENBU0UoMTMsIFRlc3RBdHlwaWNhbExvY2FsZXMpCiNpZiAhVUNPTkZJR19OT19GT1JNQVRUSU5HCiAgICAgICAgQ0FTRSgxNCwgVGVzdFRoYWlDdXJyZW5jeUZvcm1hdCkKICAgICAgICBDQVNFKDE1LCBUZXN0RXVyb1N1cHBvcnQpCiNlbmRpZgogICAgICAgIENBU0UoMTYsIFRlc3RUb1N0cmluZykKI2lmICFVQ09ORklHX05PX0ZPUk1BVFRJTkcKICAgICAgICBDQVNFKDE3LCBUZXN0NDEzOTk0MCkKICAgICAgICBDQVNFKDE4LCBUZXN0NDE0Mzk1MSkKI2VuZGlmCiAgICAgICAgQ0FTRSgxOSwgVGVzdDQxNDczMTUpCiAgICAgICAgQ0FTRSgyMCwgVGVzdDQxNDczMTcpCiAgICAgICAgQ0FTRSgyMSwgVGVzdDQxNDc1NTIpCiAgICAgICAgQ0FTRSgyMiwgVGVzdFZhcmlhbnRQYXJzaW5nKQojaWYgIVVDT05GSUdfTk9fRk9STUFUVElORwogICAgICAgIENBU0UoMjMsIFRlc3Q0MTA1ODI4KQojZW5kaWYKICAgICAgICBDQVNFKDI0LCBUZXN0U2V0SXNCb2d1cykKICAgICAgICBDQVNFKDI1LCBUZXN0UGFyYWxsZWxBUElWYWx1ZXMpCiAgICAgICAgLy8ga2VlcCB0aGUgbGFzdCBpbmRleCBpbiBzeW5jIHdpdGggdGhlIGNvbmRpdGlvbiBpbiBkZWZhdWx0OgoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBpZihpbmRleCA8PSAyNSkgeyAvLyBrZWVwIHRoaXMgaW4gc3luYyB3aXRoIHRoZSBsYXN0IGluZGV4IQogICAgICAgICAgICAgICAgbmFtZSA9ICJzd2l0Y2hlZCBvZmYiOyAvLyBVQ09ORklHX05PX0ZPUk1BVFRJTkcKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5hbWUgPSAiIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsgLy9uZWVkZWQgdG8gZW5kIGxvb3AKICAgIH0KfQoKdm9pZCBMb2NhbGVUZXN0OjpUZXN0QmFzaWNHZXR0ZXJzKCkgewogICAgVW5pY29kZVN0cmluZyAgIHRlbXA7CgogICAgaW50MzJfdCBpOwogICAgZm9yIChpID0gMDsgaSA8PSBNQVhfTE9DQUxFUzsgaSsrKSB7CiAgICAgICAgTG9jYWxlIHRlc3RMb2NhbGUocmF3RGF0YVtMQU5HXVtpXSwgcmF3RGF0YVtDVFJZXVtpXSwgcmF3RGF0YVtWQVJdW2ldKTsKICAgICAgICBsb2dsbigiVGVzdGluZyAiICsgKFVuaWNvZGVTdHJpbmcpdGVzdExvY2FsZS5nZXROYW1lKCkgKyAiLi4uIik7CgogICAgICAgIGlmICggKHRlbXA9dGVzdExvY2FsZS5nZXRMYW5ndWFnZSgpKSAhPSAoZGF0YVRhYmxlW0xBTkddW2ldKSkKICAgICAgICAgICAgZXJybG4oIiAgTGFuZ3VhZ2UgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW0xBTkddW2ldKTsKICAgICAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0Q291bnRyeSgpKSAhPSAoZGF0YVRhYmxlW0NUUlldW2ldKSkKICAgICAgICAgICAgZXJybG4oIiAgQ291bnRyeSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbQ1RSWV1baV0pOwogICAgICAgIGlmICggKHRlbXA9dGVzdExvY2FsZS5nZXRWYXJpYW50KCkpICE9IChkYXRhVGFibGVbVkFSXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIFZhcmlhbnQgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW1ZBUl1baV0pOwogICAgICAgIGlmICggKHRlbXA9dGVzdExvY2FsZS5nZXROYW1lKCkpICE9IChkYXRhVGFibGVbTkFNRV1baV0pKQogICAgICAgICAgICBlcnJsbigiICBMb2NhbGUgbmFtZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW05BTUVdW2ldKTsKICAgIH0KCiAgICBsb2dsbigiU2FtZSB0aGluZyB3aXRob3V0IHZhcmlhbnQgY29kZXMuLi4iKTsKICAgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xPQ0FMRVM7IGkrKykgewogICAgICAgIExvY2FsZSB0ZXN0TG9jYWxlKHJhd0RhdGFbTEFOR11baV0sIHJhd0RhdGFbQ1RSWV1baV0pOwogICAgICAgIGxvZ2xuKCJUZXN0aW5nICIgKyAodGVtcD10ZXN0TG9jYWxlLmdldE5hbWUoKSkgKyAiLi4uIik7CgogICAgICAgIGlmICggKHRlbXA9dGVzdExvY2FsZS5nZXRMYW5ndWFnZSgpKSAhPSAoZGF0YVRhYmxlW0xBTkddW2ldKSkKICAgICAgICAgICAgZXJybG4oIiAgTGFuZ3VhZ2UgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW0xBTkddW2ldKTsKICAgICAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0Q291bnRyeSgpKSAhPSAoZGF0YVRhYmxlW0NUUlldW2ldKSkKICAgICAgICAgICAgZXJybG4oIiAgQ291bnRyeSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbQ1RSWV1baV0pOwogICAgICAgIGlmICh0ZXN0TG9jYWxlLmdldFZhcmlhbnQoKVswXSAhPSAwKQogICAgICAgICAgICBlcnJsbigiICBWYXJpYW50IGNvZGUgbWlzbWF0Y2g6IHNvbWV0aGluZyB2ZXJzdXMgXCJcIiIpOwogICAgfQoKICAgIC8qdGVzdHMgZm9yIHRoZSBkZXByYWN0ZWQgQVBJKi8KI2lmZGVmIElDVV9MT0NJRF9VU0VfREVQUkVDQVRFUwogICAgZm9yIChpID0gMDsgaSA8PSBNQVhfTE9DQUxFUzsgaSsrKSB7CiAgICAgICAgTG9jYWxlIHRlc3RMb2NhbGUoKFVuaWNvZGVTdHJpbmcpcmF3RGF0YVtMQU5HXVtpXSwgKFVuaWNvZGVTdHJpbmcpcmF3RGF0YVtDVFJZXVtpXSwgKFVuaWNvZGVTdHJpbmcpcmF3RGF0YVtWQVJdW2ldKTsKICAgICAgICBsb2dsbigiVGVzdGluZyAiICsgKFVuaWNvZGVTdHJpbmcpdGVzdExvY2FsZS5nZXROYW1lKCkgKyAiLi4uIik7CgogICAgICAgIGlmICggdGVzdExvY2FsZS5nZXRMYW5ndWFnZSh0ZW1wKSAhPSAoVW5pY29kZVN0cmluZykoZGF0YVRhYmxlW0xBTkddW2ldKSkKICAgICAgICAgICAgZXJybG4oIiAgTGFuZ3VhZ2UgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW0xBTkddW2ldKTsKICAgICAgICBpZiAoIHRlc3RMb2NhbGUuZ2V0Q291bnRyeSh0ZW1wKSAhPSAoVW5pY29kZVN0cmluZykoZGF0YVRhYmxlW0NUUlldW2ldKSkKICAgICAgICAgICAgZXJybG4oIiAgQ291bnRyeSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbQ1RSWV1baV0pOwogICAgICAgIGlmICggdGVzdExvY2FsZS5nZXRWYXJpYW50KHRlbXApICE9IChVbmljb2RlU3RyaW5nKShkYXRhVGFibGVbVkFSXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIFZhcmlhbnQgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW1ZBUl1baV0pOwogICAgICAgIGlmICggdGVzdExvY2FsZS5nZXROYW1lKHRlbXApICE9IChVbmljb2RlU3RyaW5nKShkYXRhVGFibGVbTkFNRV1baV0pKQogICAgICAgICAgICBlcnJsbigiICBMb2NhbGUgbmFtZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW05BTUVdW2ldKTsKICAgIH0KICAgIGxvZ2xuKCJTYW1lIHRoaW5nIHdpdGhvdXQgdmFyaWFudCBjb2Rlcy4uLiIpOwogICAgZm9yIChpID0gMDsgaSA8PSBNQVhfTE9DQUxFUzsgaSsrKSB7CiAgICAgICAgTG9jYWxlIHRlc3RMb2NhbGUoKFVuaWNvZGVTdHJpbmcpcmF3RGF0YVtMQU5HXVtpXSwgKFVuaWNvZGVTdHJpbmcpcmF3RGF0YVtDVFJZXVtpXSk7CiAgICAgICAgbG9nbG4oIlRlc3RpbmcgIiArICh0ZXN0TG9jYWxlLmdldE5hbWUodGVtcCkpICsgIi4uLiIpOwoKICAgICAgICBpZiAoIHRlc3RMb2NhbGUuZ2V0TGFuZ3VhZ2UodGVtcCkgIT0gKFVuaWNvZGVTdHJpbmcpKGRhdGFUYWJsZVtMQU5HXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIExhbmd1YWdlIGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtMQU5HXVtpXSk7CiAgICAgICAgaWYgKCB0ZXN0TG9jYWxlLmdldENvdW50cnkodGVtcCkgIT0gKFVuaWNvZGVTdHJpbmcpKGRhdGFUYWJsZVtDVFJZXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIENvdW50cnkgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW0NUUlldW2ldKTsKICAgICAgICBpZiAodGVzdExvY2FsZS5nZXRWYXJpYW50KHRlbXApLmxlbmd0aCgpICE9IDAgKQogICAgICAgICAgICBlcnJsbigiICBWYXJpYW50IGNvZGUgbWlzbWF0Y2g6IHNvbWV0aGluZyB2ZXJzdXMgXCJcIiIpOwogICAgfQoKI2VuZGlmCgogICAgbG9nbG4oIlRlc3RpbmcgbG9uZyBsYW5ndWFnZSBuYW1lcyBhbmQgZ2V0dGVycyIpOwogICAgTG9jYWxlICB0ZXN0OCA9IExvY2FsZTo6Y3JlYXRlRnJvbU5hbWUoIngta2xpbmdvbi16eC51dGYzMmJlQHNwZWNpYWwiKTsKCiAgICB0ZW1wID0gdGVzdDguZ2V0TGFuZ3VhZ2UoKTsKICAgIGlmICh0ZW1wICE9IFVuaWNvZGVTdHJpbmcoIngta2xpbmdvbiIpICkKICAgICAgZXJybG4oIiAgTGFuZ3VhZ2UgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiICB2ZXJzdXMgXCJ4LWtsaW5nb25cIiIpOwoKICAgIHRlbXAgPSB0ZXN0OC5nZXRDb3VudHJ5KCk7CiAgICBpZiAodGVtcCAhPSBVbmljb2RlU3RyaW5nKCJaWCIpICkKICAgICAgZXJybG4oIiAgQ291bnRyeSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgIHZlcnN1cyBcIlpYXCIiKTsKCiAgICB0ZW1wID0gdGVzdDguZ2V0VmFyaWFudCgpOwogICAgaWYgKHRlbXAgIT0gVW5pY29kZVN0cmluZygiU1BFQ0lBTCIpICkKICAgICAgZXJybG4oIiAgVmFyaWFudCBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgIHZlcnN1cyBcIlNQRUNJQUxcIiIpOwoKICAgIGlmIChMb2NhbGU6OmdldERlZmF1bHQoKSAhPSBMb2NhbGU6OmNyZWF0ZUZyb21OYW1lKE5VTEwpKQogICAgICBlcnJsbigiTG9jYWxlOjpnZXREZWZhdWx0KCkgPT0gTG9jYWxlOjpjcmVhdGVGcm9tTmFtZShOVUxMKSIpOwoKICAgIC8qLS0tLS0tLS0tLSovCiAgICAvLyBOT1RFOiBUaGVyZSB1c2VkIHRvIGJlIGEgc3BlY2lhbCB0ZXN0IGZvciBsb2NhbGUgbmFtZXMgdGhhdCBoYWQgbGFuZ3VhZ2Ugb3IKICAgIC8vIGNvdW50cnkgY29kZXMgdGhhdCB3ZXJlIGxvbmdlciB0aGFuIHR3byBsZXR0ZXJzLiAgVGhlIG5ldyB2ZXJzaW9uIG9mIExvY2FsZQogICAgLy8gZG9lc24ndCBzdXBwb3J0IGFueXRoaW5nIHRoYXQgaXNuJ3QgYW4gb2ZmaWNpYWxseSByZWNvZ25pemVkIGxhbmd1YWdlIG9yCiAgICAvLyBjb3VudHJ5IGNvZGUsIHNvIHdlIG5vIGxvbmdlciBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KfQoKdm9pZCBMb2NhbGVUZXN0OjpUZXN0UGFyYWxsZWxBUElWYWx1ZXMoKSB7CiAgICBsb2dsbigiVGVzdCBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBDIGFuZCBDKysgQVBJIik7CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0Q2hpbmVzZSgpLmdldE5hbWUoKSwgVUxPQ19DSElORVNFKSAhPSAwKSB7CiAgICAgICAgZXJybG4oIkRpZmZlcmVuY2VzIGZvciBVTE9DX0NISU5FU0UgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0RW5nbGlzaCgpLmdldE5hbWUoKSwgVUxPQ19FTkdMSVNIKSAhPSAwKSB7CiAgICAgICAgZXJybG4oIkRpZmZlcmVuY2VzIGZvciBVTE9DX0VOR0xJU0ggTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0RnJlbmNoKCkuZ2V0TmFtZSgpLCBVTE9DX0ZSRU5DSCkgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19GUkVOQ0ggTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0R2VybWFuKCkuZ2V0TmFtZSgpLCBVTE9DX0dFUk1BTikgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19HRVJNQU4gTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0SXRhbGlhbigpLmdldE5hbWUoKSwgVUxPQ19JVEFMSUFOKSAhPSAwKSB7CiAgICAgICAgZXJybG4oIkRpZmZlcmVuY2VzIGZvciBVTE9DX0lUQUxJQU4gTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0SmFwYW5lc2UoKS5nZXROYW1lKCksIFVMT0NfSkFQQU5FU0UpICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfSkFQQU5FU0UgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0S29yZWFuKCkuZ2V0TmFtZSgpLCBVTE9DX0tPUkVBTikgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19LT1JFQU4gTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0U2ltcGxpZmllZENoaW5lc2UoKS5nZXROYW1lKCksIFVMT0NfU0lNUExJRklFRF9DSElORVNFKSAhPSAwKSB7CiAgICAgICAgZXJybG4oIkRpZmZlcmVuY2VzIGZvciBVTE9DX1NJTVBMSUZJRURfQ0hJTkVTRSBMb2NhbGUiKTsKICAgIH0KICAgIGlmIChzdHJjbXAoTG9jYWxlOjpnZXRUcmFkaXRpb25hbENoaW5lc2UoKS5nZXROYW1lKCksIFVMT0NfVFJBRElUSU9OQUxfQ0hJTkVTRSkgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19UUkFESVRJT05BTF9DSElORVNFIExvY2FsZSIpOwogICAgfQoKCiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0Q2FuYWRhKCkuZ2V0TmFtZSgpLCBVTE9DX0NBTkFEQSkgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19DQU5BREEgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0Q2FuYWRhRnJlbmNoKCkuZ2V0TmFtZSgpLCBVTE9DX0NBTkFEQV9GUkVOQ0gpICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfQ0FOQURBX0ZSRU5DSCBMb2NhbGUiKTsKICAgIH0KICAgIGlmIChzdHJjbXAoTG9jYWxlOjpnZXRDaGluYSgpLmdldE5hbWUoKSwgVUxPQ19DSElOQSkgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19DSElOQSBMb2NhbGUiKTsKICAgIH0KICAgIGlmIChzdHJjbXAoTG9jYWxlOjpnZXRQUkMoKS5nZXROYW1lKCksIFVMT0NfUFJDKSAhPSAwKSB7CiAgICAgICAgZXJybG4oIkRpZmZlcmVuY2VzIGZvciBVTE9DX1BSQyBMb2NhbGUiKTsKICAgIH0KICAgIGlmIChzdHJjbXAoTG9jYWxlOjpnZXRGcmFuY2UoKS5nZXROYW1lKCksIFVMT0NfRlJBTkNFKSAhPSAwKSB7CiAgICAgICAgZXJybG4oIkRpZmZlcmVuY2VzIGZvciBVTE9DX0ZSQU5DRSBMb2NhbGUiKTsKICAgIH0KICAgIGlmIChzdHJjbXAoTG9jYWxlOjpnZXRHZXJtYW55KCkuZ2V0TmFtZSgpLCBVTE9DX0dFUk1BTlkpICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfR0VSTUFOWSBMb2NhbGUiKTsKICAgIH0KICAgIGlmIChzdHJjbXAoTG9jYWxlOjpnZXRJdGFseSgpLmdldE5hbWUoKSwgVUxPQ19JVEFMWSkgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19JVEFMWSBMb2NhbGUiKTsKICAgIH0KICAgIGlmIChzdHJjbXAoTG9jYWxlOjpnZXRKYXBhbigpLmdldE5hbWUoKSwgVUxPQ19KQVBBTikgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19KQVBBTiBMb2NhbGUiKTsKICAgIH0KICAgIGlmIChzdHJjbXAoTG9jYWxlOjpnZXRLb3JlYSgpLmdldE5hbWUoKSwgVUxPQ19LT1JFQSkgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19LT1JFQSBMb2NhbGUiKTsKICAgIH0KICAgIGlmIChzdHJjbXAoTG9jYWxlOjpnZXRUYWl3YW4oKS5nZXROYW1lKCksIFVMT0NfVEFJV0FOKSAhPSAwKSB7CiAgICAgICAgZXJybG4oIkRpZmZlcmVuY2VzIGZvciBVTE9DX1RBSVdBTiBMb2NhbGUiKTsKICAgIH0KICAgIGlmIChzdHJjbXAoTG9jYWxlOjpnZXRVSygpLmdldE5hbWUoKSwgVUxPQ19VSykgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19VSyBMb2NhbGUiKTsKICAgIH0KICAgIGlmIChzdHJjbXAoTG9jYWxlOjpnZXRVUygpLmdldE5hbWUoKSwgVUxPQ19VUykgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19VUyBMb2NhbGUiKTsKICAgIH0KfQoKCnZvaWQgTG9jYWxlVGVzdDo6VGVzdFNpbXBsZVJlc291cmNlSW5mbygpIHsKICBVbmljb2RlU3RyaW5nICAgdGVtcDsKICBjaGFyICAgICAgICAgICAgdGVtcDJbMjBdOwogIFVFcnJvckNvZGUgZXJyID0gVV9aRVJPX0VSUk9SOwogIGludDMyX3QgaSA9IDA7CgogIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xPQ0FMRVM7IGkrKykgewogICAgTG9jYWxlIHRlc3RMb2NhbGUocmF3RGF0YVtMQU5HXVtpXSwgcmF3RGF0YVtDVFJZXVtpXSwgcmF3RGF0YVtWQVJdW2ldKTsKICAgIGxvZ2xuKCJUZXN0aW5nICIgKyAodGVtcD10ZXN0TG9jYWxlLmdldE5hbWUoKSkgKyAiLi4uIik7CiAgICAKICAgIGlmICggKHRlbXA9dGVzdExvY2FsZS5nZXRJU08zTGFuZ3VhZ2UoKSkgIT0gKGRhdGFUYWJsZVtMQU5HM11baV0pKQogICAgICBlcnJsbigiICBJU08tMyBsYW5ndWFnZSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcAogICAgICAgICsgIiB2ZXJzdXMgIiArIGRhdGFUYWJsZVtMQU5HM11baV0pOwogICAgaWYgKCAodGVtcD10ZXN0TG9jYWxlLmdldElTTzNDb3VudHJ5KCkpICE9IChkYXRhVGFibGVbQ1RSWTNdW2ldKSkKICAgICAgZXJybG4oIiAgSVNPLTMgY291bnRyeSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcAogICAgICAgICsgIiB2ZXJzdXMgIiArIGRhdGFUYWJsZVtDVFJZM11baV0pOwogICAgCiAgICBzcHJpbnRmKHRlbXAyLCAiJXgiLCB0ZXN0TG9jYWxlLmdldExDSUQoKSk7CiAgICBpZiAoVW5pY29kZVN0cmluZyh0ZW1wMikgIT0gZGF0YVRhYmxlW0xDSURdW2ldKQogICAgICBlcnJsbigoVW5pY29kZVN0cmluZykiICBMQ0lEIG1pc21hdGNoOiAiICsgdGVtcDIgKyAiIHZlcnN1cyAiCiAgICAgICAgKyBkYXRhVGFibGVbTENJRF1baV0pOwoKICAgIGlmKFVfRkFJTFVSRShlcnIpKQogICAgICB7CiAgICAgICAgZXJybG4oKFVuaWNvZGVTdHJpbmcpIlNvbWUgZXJyb3Igb24gbnVtYmVyICIgKyBpICsgdV9lcnJvck5hbWUoZXJyKSk7CiAgICAgIH0KICAgIGVyciA9IFVfWkVST19FUlJPUjsKICB9CgogIC8qdGVzdHMgZm9yIHRoZSBkZXByZWNhdGVkIEFQSSovCiNpZmRlZiBJQ1VfTE9DSURfVVNFX0RFUFJFQ0FURVMKICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT0NBTEVTOyBpKyspIHsKICAgIExvY2FsZSB0ZXN0TG9jYWxlKChVbmljb2RlU3RyaW5nKXJhd0RhdGFbTEFOR11baV0sIChVbmljb2RlU3RyaW5nKXJhd0RhdGFbQ1RSWV1baV0sIChVbmljb2RlU3RyaW5nKXJhd0RhdGFbVkFSXVtpXSk7CiAgICBsb2dsbigiVGVzdGluZyAiICsgKHRlc3RMb2NhbGUuZ2V0TmFtZSh0ZW1wKSkgKyAiLi4uIik7CiAgICAKICAgIGlmICggdGVzdExvY2FsZS5nZXRJU08zTGFuZ3VhZ2UodGVtcCwgZXJyKSAhPSAoVW5pY29kZVN0cmluZykoZGF0YVRhYmxlW0xBTkczXVtpXSkpCiAgICAgIGVycmxuKCIgIElTTy0zIGxhbmd1YWdlIGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wCiAgICAgICAgKyAiIHZlcnN1cyAiICsgZGF0YVRhYmxlW0xBTkczXVtpXSk7CiAgICBpZiAoIHRlc3RMb2NhbGUuZ2V0SVNPM0NvdW50cnkodGVtcCwgZXJyKSAhPSAoVW5pY29kZVN0cmluZykoZGF0YVRhYmxlW0NUUlkzXVtpXSkpCiAgICAgIGVycmxuKCIgIElTTy0zIGNvdW50cnkgY29kZSBtaXNtYXRjaDogIiArIHRlbXAKICAgICAgICArICIgdmVyc3VzICIgKyBkYXRhVGFibGVbQ1RSWTNdW2ldKTsKICAgIAogICAgaWYoVV9GQUlMVVJFKGVycikpCiAgICAgIHsKICAgICAgICBlcnJsbigoVW5pY29kZVN0cmluZykiU29tZSBlcnJvciBvbiBudW1iZXIgIiArIGkgKyB1X2Vycm9yTmFtZShlcnIpKTsKICAgICAgfQogICAgZXJyID0gVV9aRVJPX0VSUk9SOwogICB9CiNlbmRpZgoKICAgTG9jYWxlIGxvY2FsZSgiZW4iKTsKICAgaWYoc3RyY21wKGxvY2FsZS5nZXROYW1lKCksICJlbiIpICE9IDB8fAogICAgICAgc3RyY21wKGxvY2FsZS5nZXRMYW5ndWFnZSgpLCAiZW4iKSAhPSAwKSB7CiAgICAgICBlcnJsbigiY29uc3RydWN0aW9uIG9mIExvY2FsZShlbikgZmFpbGVkXG4iKTsKICAgfQogICAvKi0tLS0tKi8KCn0KCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3REaXNwbGF5TmFtZXMoKSAKewogICAgTG9jYWxlICBzYXZlRGVmYXVsdCA9IExvY2FsZTo6Z2V0RGVmYXVsdCgpOwogICAgTG9jYWxlICBlbXB0eSgiIiwgIiIpOwogICAgTG9jYWxlICBlbmdsaXNoKCJlbiIsICJVUyIpOwogICAgTG9jYWxlICBmcmVuY2goImZyIiwgIkZSIik7CiAgICBMb2NhbGUgIGNyb2F0aWFuKCJociIsICJIUiIpOwogICAgTG9jYWxlICBncmVlaygiZWwiLCAiR1IiKTsKICAgIFVFcnJvckNvZGUgZXJyID0gVV9aRVJPX0VSUk9SOwoKICAgIExvY2FsZTo6c2V0RGVmYXVsdChlbmdsaXNoLCBlcnIpOwogICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgZXJybG4oIkxvY2FsZTo6c2V0RGVmYXVsdCByZXR1cm5lZCBlcnJvciBjb2RlICIgKyAoaW50KWVycik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxvZ2xuKCJXaXRoIGRlZmF1bHQgPSBlbl9VUy4uLiIpOwogICAgbG9nbG4oIiAgSW4gZGVmYXVsdCBsb2NhbGUuLi4iKTsKICAgIGRvVGVzdERpc3BsYXlOYW1lcyhlbXB0eSwgRExBTkdfRU4sIEZBTFNFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGVuX1VTLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZW5nbGlzaCwgRExBTkdfRU4sIEZBTFNFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGZyX0ZSLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZnJlbmNoLCBETEFOR19GUiwgRkFMU0UpOwogICAgbG9nbG4oIiAgSW4gbG9jYWxlID0gaHJfSFIuLi4iKTsKICAgIGRvVGVzdERpc3BsYXlOYW1lcyhjcm9hdGlhbiwgRExBTkdfSFIsIEZBTFNFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGVsX0dSLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZ3JlZWssIERMQU5HX0VMLCBGQUxTRSk7CgogICAgTG9jYWxlOjpzZXREZWZhdWx0KGZyZW5jaCwgZXJyKTsKICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgIGVycmxuKCJMb2NhbGU6OnNldERlZmF1bHQgcmV0dXJuZWQgZXJyb3IgY29kZSAiICsgKGludCllcnIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsb2dsbigiV2l0aCBkZWZhdWx0ID0gZnJfRlIuLi4iKTsKICAgIGxvZ2xuKCIgIEluIGRlZmF1bHQgbG9jYWxlLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZW1wdHksIERMQU5HX0ZSLCBUUlVFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGVuX1VTLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZW5nbGlzaCwgRExBTkdfRU4sIFRSVUUpOwogICAgbG9nbG4oIiAgSW4gbG9jYWxlID0gZnJfRlIuLi4iKTsKICAgIGRvVGVzdERpc3BsYXlOYW1lcyhmcmVuY2gsIERMQU5HX0ZSLCBUUlVFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGhyX0hSLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoY3JvYXRpYW4sIERMQU5HX0hSLCBUUlVFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGVsX0dSLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZ3JlZWssIERMQU5HX0VMLCBUUlVFKTsKCiAgICBMb2NhbGU6OnNldERlZmF1bHQoc2F2ZURlZmF1bHQsIGVycik7CiAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICBlcnJsbigiTG9jYWxlOjpzZXREZWZhdWx0IHJldHVybmVkIGVycm9yIGNvZGUgIiArIChpbnQpZXJyKTsKICAgICAgICByZXR1cm47CiAgICB9Cn0KCi8qCiBVc2FnZToKICAgIHRlc3RfYXNzZXJ0KCAgICBUZXN0IChzaG91bGQgYmUgVFJVRSkgICkKCiAgIEV4YW1wbGU6CiAgICAgICB0ZXN0X2Fzc2VydChpPT0zKTsKCiAgIHRoZSBtYWNybyBpcyB1Z2x5IGJ1dCBtYWtlcyB0aGUgdGVzdHMgcHJldHR5LgoqLwoKI2RlZmluZSB0ZXN0X2Fzc2VydCh0ZXN0KSBcCiAgICB7IFwKICAgICAgICBpZighKHRlc3QpKSBcCiAgICAgICAgICAgIGVycmxuKCJGQUlMOiAiICsgVW5pY29kZVN0cmluZygjdGVzdCkgKyAiIHdhcyBub3QgdHJ1ZS4gIiArIFVuaWNvZGVTdHJpbmcoX19GSUxFX18gIiBsaW5lICIpICsgX19MSU5FX18gKTsgXAogICAgICAgIGVsc2UgXAogICAgICAgICAgICBsb2dsbigiUEFTUzogYXNzZXJ0ZWQgIiArIFVuaWNvZGVTdHJpbmcoI3Rlc3QpICk7IFwKICAgIH0KCnZvaWQgTG9jYWxlVGVzdDo6VGVzdFNpbXBsZU9iamVjdFN0dWZmKCkgewogICAgTG9jYWxlICB0ZXN0MSgiYWEiLCAiQUEiKTsKICAgIExvY2FsZSAgdGVzdDIoImFhIiwgIkFBIik7CiAgICBMb2NhbGUgIHRlc3QzKHRlc3QxKTsKICAgIExvY2FsZSAgdGVzdDQoInp6IiwgIlpaIik7CiAgICBMb2NhbGUgIHRlc3Q1KCJhYSIsICJBQSIsICIiKTsgCiAgICBMb2NhbGUgIHRlc3Q2KCJhYSIsICJBQSIsICJBTlRBUkVTIik7IAogICAgTG9jYWxlICB0ZXN0NygiYWEiLCAiQUEiLCAiSlVQSVRFUiIpOwogICAgTG9jYWxlICB0ZXN0OCA9IExvY2FsZTo6Y3JlYXRlRnJvbU5hbWUoImFhLWFhLnV0ZjhAanVwaXRlciIpOwoKICAgIC8vIG5vdyBsaXN0IHRoZW0gYWxsIGZvciBkZWJ1Z2dpbmcgdXNhZ2UuCiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDEpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3QyKTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0Myk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDQpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q1KTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0Nik7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDcpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q4KTsKCiAgICAvLyBNYWtlIHN1cmUgdGhpbmdzIGNvbXBhcmUgdG8gdGhlbXNlbHZlcyEKICAgIHRlc3RfYXNzZXJ0KHRlc3QxID09IHRlc3QxKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3QyID09IHRlc3QyKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3QzID09IHRlc3QzKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q0ID09IHRlc3Q0KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q1ID09IHRlc3Q1KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ID09IHRlc3Q2KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q3ID09IHRlc3Q3KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q4ID09IHRlc3Q4KTsKCiAgICAvLyBtYWtlIHN1cmUgdGhpbmdzIGFyZSBub3QgZXF1YWwgdG8gdGhlbXNlbHZlcy4KICAgIHRlc3RfYXNzZXJ0KCEodGVzdDEgIT0gdGVzdDEpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDIgIT0gdGVzdDIpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDMgIT0gdGVzdDMpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDQgIT0gdGVzdDQpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDUgIT0gdGVzdDUpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDYgIT0gdGVzdDYpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDcgIT0gdGVzdDcpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDggIT0gdGVzdDgpKTsKCiAgICAvLyBtYWtlIHN1cmUgdGhpbmdzIHRoYXQgYXJlIGVxdWFsIHRvIGVhY2ggb3RoZXIgZG9uJ3Qgc2hvdyB1cCBhcyB1bmVxdWFsLgogICAgdGVzdF9hc3NlcnQoISh0ZXN0MSAhPSB0ZXN0MikpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0MiAhPSB0ZXN0MSkpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0MSAhPSB0ZXN0MykpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0MiAhPSB0ZXN0MykpOwogICAgdGVzdF9hc3NlcnQodGVzdDUgPT0gdGVzdDEpOwogICAgdGVzdF9hc3NlcnQodGVzdDYgIT0gdGVzdDIpOwogICAgdGVzdF9hc3NlcnQodGVzdDYgIT0gdGVzdDUpOwoKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ICE9IHRlc3Q3KTsKCiAgICAvLyB0ZXN0IGZvciB0aGluZ3MgdGhhdCBzaG91bGRuJ3QgY29tcGFyZSBlcXVhbC4KICAgIHRlc3RfYXNzZXJ0KCEodGVzdDEgPT0gdGVzdDQpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDIgPT0gdGVzdDQpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDMgPT0gdGVzdDQpKTsKCiAgICB0ZXN0X2Fzc2VydCh0ZXN0NyA9PSB0ZXN0OCk7CgogICAgLy8gdGVzdCBmb3IgaGFzaCBjb2RlcyB0byBiZSB0aGUgc2FtZS4KICAgIGludDMyX3QgaGFzaDEgPSB0ZXN0MS5oYXNoQ29kZSgpOwogICAgaW50MzJfdCBoYXNoMiA9IHRlc3QyLmhhc2hDb2RlKCk7CiAgICBpbnQzMl90IGhhc2gzID0gdGVzdDMuaGFzaENvZGUoKTsKCiAgICB0ZXN0X2Fzc2VydChoYXNoMSA9PSBoYXNoMik7CiAgICB0ZXN0X2Fzc2VydChoYXNoMSA9PSBoYXNoMyk7CiAgICB0ZXN0X2Fzc2VydChoYXNoMiA9PSBoYXNoMyk7CgogICAgLy8gdGVzdCB0aGF0IHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yIHdvcmtzLgogICAgdGVzdDQgPSB0ZXN0MTsKICAgIGxvZ2xuKCJ0ZXN0ND10ZXN0MTsiKTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0NCk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NCA9PSB0ZXN0NCk7CgogICAgdGVzdF9hc3NlcnQoISh0ZXN0MSAhPSB0ZXN0NCkpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0MiAhPSB0ZXN0NCkpOwogICAgdGVzdF9hc3NlcnQoISh0ZXN0MyAhPSB0ZXN0NCkpOwogICAgdGVzdF9hc3NlcnQodGVzdDEgPT0gdGVzdDQpOwogICAgdGVzdF9hc3NlcnQodGVzdDQgPT0gdGVzdDEpOwogICAgCiAgICAvLyB0ZXN0IGFzc2lnbm1lbnRzIHdpdGggYSB2YXJpYW50CiAgICBsb2dsbigidGVzdDcgPSB0ZXN0NiIpOwogICAgdGVzdDcgPSB0ZXN0NjsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0Nyk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NyA9PSB0ZXN0Nyk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NyA9PSB0ZXN0Nik7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NyAhPSB0ZXN0NSk7CgogICAgbG9nbG4oInRlc3Q2ID0gdGVzdDEiKTsKICAgIHRlc3Q2PXRlc3QxOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q2KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ICE9IHRlc3Q3KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ID09IHRlc3QxKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ID09IHRlc3Q2KTsKfQoKLy8gQSBjbGFzcyB3aGljaCBleHBvc2VzIGNvbnN0cnVjdG9ycyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB0aGUgUE9TSVggcGFyc2luZyBjb2RlLgpjbGFzcyBQT1NJWExvY2FsZSA6IHB1YmxpYyBMb2NhbGUKewpwdWJsaWM6CiAgICBQT1NJWExvY2FsZShjb25zdCBVbmljb2RlU3RyaW5nJiBsKQogICAgICAgIDpMb2NhbGUoKQogICAgewogICAgICBjaGFyICpjaDsKICAgICAgY2ggPSBuZXcgY2hhcltsLmxlbmd0aCgpICsgMV07CiAgICAgIGNoW2wuZXh0cmFjdCgwLCAweDdmZmZmZmZmLCBjaCwgIiIpXSA9IDA7CiAgICAgIHNldEZyb21QT1NJWElEKGNoKTsKICAgICAgZGVsZXRlIFtdIGNoOwogICAgfQogICAgUE9TSVhMb2NhbGUoY29uc3QgY2hhciAqbCkKICAgICAgICA6TG9jYWxlKCkKICAgIHsKICAgICAgICBzZXRGcm9tUE9TSVhJRChsKTsKICAgIH0KfTsKCnZvaWQgTG9jYWxlVGVzdDo6VGVzdFBPU0lYUGFyc2luZygpCnsKICAgIFBPU0lYTG9jYWxlICB0ZXN0MSgiYWJfQUIiKTsKICAgIFBPU0lYTG9jYWxlICB0ZXN0MihVbmljb2RlU3RyaW5nKCJhYl9BQiIpKTsKICAgIExvY2FsZSAgdGVzdDMoImFiIiwiQUIiKTsKCiAgICBQT1NJWExvY2FsZSB0ZXN0NCgiYWJfQUJfQW50YXJlcyIpOwogICAgUE9TSVhMb2NhbGUgdGVzdDUoVW5pY29kZVN0cmluZygiYWJfQUJfQW50YXJlcyIpKTsKICAgIExvY2FsZSAgdGVzdDYoImFiIiwgIkFCIiwgIkFudGFyZXMiKTsgCgogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3QxKTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0Mik7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDMpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q0KTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0NSk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDYpOwoKICAgIHRlc3RfYXNzZXJ0KHRlc3QxID09IHRlc3QxKTsKCiAgICB0ZXN0X2Fzc2VydCh0ZXN0MSA9PSB0ZXN0Mik7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0MiA9PSB0ZXN0Myk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0MyA9PSB0ZXN0MSk7CgogICAgdGVzdF9hc3NlcnQodGVzdDQgPT0gdGVzdDUpOwogICAgdGVzdF9hc3NlcnQodGVzdDUgPT0gdGVzdDYpOwogICAgdGVzdF9hc3NlcnQodGVzdDYgPT0gdGVzdDQpOwoKICAgIHRlc3RfYXNzZXJ0KHRlc3QxICE9IHRlc3Q0KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q1ICE9IHRlc3QzKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q1ICE9IHRlc3QyKTsKCiAgICBpbnQzMl90IGhhc2gxID0gdGVzdDEuaGFzaENvZGUoKTsKICAgIGludDMyX3QgaGFzaDIgPSB0ZXN0Mi5oYXNoQ29kZSgpOwogICAgaW50MzJfdCBoYXNoMyA9IHRlc3QzLmhhc2hDb2RlKCk7CgogICAgdGVzdF9hc3NlcnQoaGFzaDEgPT0gaGFzaDIpOwogICAgdGVzdF9hc3NlcnQoaGFzaDIgPT0gaGFzaDMpOwogICAgdGVzdF9hc3NlcnQoaGFzaDMgPT0gaGFzaDEpOwp9Cgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RHZXRBdmFpbGFibGVMb2NhbGVzKCkKewogICAgaW50MzJfdCBsb2NDb3VudCA9IDA7CiAgICBjb25zdCBMb2NhbGUqIGxvY0xpc3QgPSBMb2NhbGU6OmdldEF2YWlsYWJsZUxvY2FsZXMobG9jQ291bnQpOwoKICAgIGlmIChsb2NDb3VudCA9PSAwKQogICAgICAgIGVycmxuKCJnZXRBdmFpbGFibGVMb2NhbGVzKCkgcmV0dXJuZWQgYW4gZW1wdHkgbGlzdCEiKTsKICAgIGVsc2UgewogICAgICAgIGxvZ2xuKFVuaWNvZGVTdHJpbmcoIk51bWJlciBvZiBsb2NhbGVzIHJldHVybmVkID0gIikgKyBsb2NDb3VudCk7CiAgICAgICAgVW5pY29kZVN0cmluZyB0ZW1wOwogICAgICAgIGZvcihpbnQzMl90IGkgPSAwOyBpIDwgbG9jQ291bnQ7ICsraSkKICAgICAgICAgICAgbG9nbG4obG9jTGlzdFtpXS5nZXROYW1lKCkpOwogICAgfQogICAgLy8gSSBoYXZlIG5vIGlkZWEgaG93IHRvIHRlc3QgdGhpcyBmdW5jdGlvbi4uLgp9CgovLyBUaGlzIHRlc3QgaXNuJ3QgYXBwbGljYWJsZSBhbnltb3JlIC0gZ2V0SVNPM0xhbmd1YWdlIGlzCi8vIGluZGVwZW5kZW50IG9mIHRoZSBkYXRhIGRpcmVjdG9yeQp2b2lkIExvY2FsZVRlc3Q6OlRlc3REYXRhRGlyZWN0b3J5KCkKewovKgogICAgY2hhciAgICAgICAgICAgIG9sZERpcmVjdG9yeVs4MF07CiAgICBjb25zdCBjaGFyKiAgICAgdGVtcDsKICAgIFVFcnJvckNvZGUgICAgICAgZXJyID0gVV9aRVJPX0VSUk9SOwogICAgVW5pY29kZVN0cmluZyAgIHRlc3RWYWx1ZTsKCiAgICB0ZW1wID0gTG9jYWxlOjpnZXREYXRhRGlyZWN0b3J5KCk7CiAgICBzdHJjcHkob2xkRGlyZWN0b3J5LCB0ZW1wKTsKICAgIGxvZ2xuKFVuaWNvZGVTdHJpbmcoIm9sZERpcmVjdG9yeSA9ICIpICsgb2xkRGlyZWN0b3J5KTsKCiAgICBMb2NhbGUgIHRlc3QoTG9jYWxlOjpVUyk7CiAgICB0ZXN0LmdldElTTzNMYW5ndWFnZSh0ZXN0VmFsdWUpOwogICAgbG9nbG4oImZpcnN0IGZldGNoIG9mIGxhbmd1YWdlIHJldHJpZXZlZCAiICsgdGVzdFZhbHVlKTsKICAgIGlmICh0ZXN0VmFsdWUgIT0gImVuZyIpCiAgICAgICAgZXJybG4oIkluaXRpYWwgY2hlY2sgb2YgSVNPMyBsYW5ndWFnZSBmYWlsZWQ6IGV4cGVjdGVkIFwiZW5nXCIsIGdvdCBcIiIgKyB0ZXN0VmFsdWUgKyAiXCIiKTsKCiAgICB7CiAgICAgICAgY2hhciAqcGF0aDsKICAgICAgICBwYXRoPUludGxUZXN0OjpnZXRUZXN0RGlyZWN0b3J5KCk7CiAgICAgICAgTG9jYWxlOjpzZXREYXRhRGlyZWN0b3J5KCBwYXRoICk7CiAgICB9CgogICAgdGVzdC5nZXRJU08zTGFuZ3VhZ2UodGVzdFZhbHVlKTsKICAgIGxvZ2xuKCJzZWNvbmQgZmV0Y2ggb2YgbGFuZ3VhZ2UgcmV0cmlldmVkICIgKyB0ZXN0VmFsdWUpOwogICAgaWYgKHRlc3RWYWx1ZSAhPSAieHh4IikKICAgICAgICBlcnJsbigic2V0RGF0YURpcmVjdG9yeSgpIGZhaWxlZDogZXhwZWN0ZWQgXCJ4eHhcIiwgZ290IFwiIiArIHRlc3RWYWx1ZSArICJcIiIpOwogICAgCiAgICBMb2NhbGU6OnNldERhdGFEaXJlY3Rvcnkob2xkRGlyZWN0b3J5KTsKICAgIHRlc3QuZ2V0SVNPM0xhbmd1YWdlKHRlc3RWYWx1ZSk7CiAgICBsb2dsbigidGhpcmQgZmV0Y2ggb2YgbGFuZ3VhZ2UgcmV0cmlldmVkICIgKyB0ZXN0VmFsdWUpOwogICAgaWYgKHRlc3RWYWx1ZSAhPSAiZW5nIikKICAgICAgICBlcnJsbigiZ2V0L3NldERhdGFEaXJlY3RvcnkoKSBmYWlsZWQ6IGV4cGVjdGVkIFwiZW5nXCIsIGdvdCBcIiIgKyB0ZXN0VmFsdWUgKyAiXCIiKTsKKi8KfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKdm9pZCBMb2NhbGVUZXN0Ojpkb1Rlc3REaXNwbGF5TmFtZXMoTG9jYWxlJiBpbkxvY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb21wYXJlSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVCb29sIGRlZmF1bHRJc0ZyZW5jaCkgewogICAgVW5pY29kZVN0cmluZyAgIHRlbXA7CiAgICAKICAgIGlmIChkZWZhdWx0SXNGcmVuY2ggJiYgKHRlbXA9TG9jYWxlOjpnZXREZWZhdWx0KCkuZ2V0TGFuZ3VhZ2UoKSkgIT0gImZyIikKICAgICAgICBlcnJsbigiRGVmYXVsdCBsb2NhbGUgc2hvdWxkIGJlIEZyZW5jaCwgYnV0IGl0J3MgcmVhbGx5ICIgKyB0ZW1wKTsKICAgIGVsc2UgaWYgKCFkZWZhdWx0SXNGcmVuY2ggJiYgKHRlbXA9TG9jYWxlOjpnZXREZWZhdWx0KCkuZ2V0TGFuZ3VhZ2UoKSkgIT0gImVuIikKICAgICAgICBlcnJsbigiRGVmYXVsdCBsb2NhbGUgc2hvdWxkIGJlIEVuZ2xpc2gsIGJ1dCBpdCdzIHJlYWxseSAiICsgdGVtcCk7CgogICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDw9IE1BWF9MT0NBTEVTOyBpKyspIHsKICAgICAgICBMb2NhbGUgdGVzdExvY2FsZShyYXdEYXRhW0xBTkddW2ldLCByYXdEYXRhW0NUUlldW2ldLCByYXdEYXRhW1ZBUl1baV0pOwogICAgICAgIGxvZ2xuKCIgIFRlc3RpbmcgIiArICh0ZW1wPXRlc3RMb2NhbGUuZ2V0TmFtZSgpKSArICIuLi4iKTsKCiAgICAgICAgVW5pY29kZVN0cmluZyAgdGVzdExhbmc7CiAgICAgICAgVW5pY29kZVN0cmluZyAgdGVzdEN0cnk7CiAgICAgICAgVW5pY29kZVN0cmluZyAgdGVzdFZhcjsKICAgICAgICBVbmljb2RlU3RyaW5nICB0ZXN0TmFtZTsKCiAgICAgICAgaWYgKGluTG9jYWxlID09IExvY2FsZSgiIiwgIiIsICIiKSkgewogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlMYW5ndWFnZSh0ZXN0TGFuZyk7CiAgICAgICAgICAgIHRlc3RMb2NhbGUuZ2V0RGlzcGxheUNvdW50cnkodGVzdEN0cnkpOwogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlWYXJpYW50KHRlc3RWYXIpOwogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlOYW1lKHRlc3ROYW1lKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRlc3RMb2NhbGUuZ2V0RGlzcGxheUxhbmd1YWdlKGluTG9jYWxlLCB0ZXN0TGFuZyk7CiAgICAgICAgICAgIHRlc3RMb2NhbGUuZ2V0RGlzcGxheUNvdW50cnkoaW5Mb2NhbGUsIHRlc3RDdHJ5KTsKICAgICAgICAgICAgdGVzdExvY2FsZS5nZXREaXNwbGF5VmFyaWFudChpbkxvY2FsZSwgdGVzdFZhcik7CiAgICAgICAgICAgIHRlc3RMb2NhbGUuZ2V0RGlzcGxheU5hbWUoaW5Mb2NhbGUsIHRlc3ROYW1lKTsKICAgICAgICB9CgogICAgICAgIFVuaWNvZGVTdHJpbmcgIGV4cGVjdGVkTGFuZzsKICAgICAgICBVbmljb2RlU3RyaW5nICBleHBlY3RlZEN0cnk7CiAgICAgICAgVW5pY29kZVN0cmluZyAgZXhwZWN0ZWRWYXI7CiAgICAgICAgVW5pY29kZVN0cmluZyAgZXhwZWN0ZWROYW1lOwoKICAgICAgICBleHBlY3RlZExhbmcgPSBkYXRhVGFibGVbY29tcGFyZUluZGV4XVtpXTsKICAgICAgICBpZiAoZXhwZWN0ZWRMYW5nLmxlbmd0aCgpID09IDAgJiYgZGVmYXVsdElzRnJlbmNoKQogICAgICAgICAgICBleHBlY3RlZExhbmcgPSBkYXRhVGFibGVbRExBTkdfRlJdW2ldOwogICAgICAgIGlmIChleHBlY3RlZExhbmcubGVuZ3RoKCkgPT0gMCkKICAgICAgICAgICAgZXhwZWN0ZWRMYW5nID0gZGF0YVRhYmxlW0RMQU5HX0VOXVtpXTsKCiAgICAgICAgZXhwZWN0ZWRDdHJ5ID0gZGF0YVRhYmxlW2NvbXBhcmVJbmRleCArIDFdW2ldOwogICAgICAgIGlmICgoZXhwZWN0ZWRDdHJ5Lmxlbmd0aCgpID09IDApICYmIGRlZmF1bHRJc0ZyZW5jaCkKICAgICAgICAgICAgZXhwZWN0ZWRDdHJ5ID0gZGF0YVRhYmxlW0RDVFJZX0ZSXVtpXTsKICAgICAgICBpZiAoZXhwZWN0ZWRDdHJ5Lmxlbmd0aCgpID09IDApCiAgICAgICAgICAgIGV4cGVjdGVkQ3RyeSA9IGRhdGFUYWJsZVtEQ1RSWV9FTl1baV07CgogICAgICAgIGV4cGVjdGVkVmFyID0gZGF0YVRhYmxlW2NvbXBhcmVJbmRleCArIDJdW2ldOwogICAgICAgIGlmIChleHBlY3RlZFZhci5sZW5ndGgoKSA9PSAwICYmIGRlZmF1bHRJc0ZyZW5jaCkKICAgICAgICAgICAgZXhwZWN0ZWRWYXIgPSBkYXRhVGFibGVbRFZBUl9GUl1baV07CiAgICAgICAgaWYgKGV4cGVjdGVkVmFyLmxlbmd0aCgpID09IDApCiAgICAgICAgICAgIGV4cGVjdGVkVmFyID0gZGF0YVRhYmxlW0RWQVJfRU5dW2ldOwoKICAgICAgICBleHBlY3RlZE5hbWUgPSBkYXRhVGFibGVbY29tcGFyZUluZGV4ICsgM11baV07CiAgICAgICAgaWYgKGV4cGVjdGVkTmFtZS5sZW5ndGgoKSA9PSAwICYmIGRlZmF1bHRJc0ZyZW5jaCkKICAgICAgICAgICAgZXhwZWN0ZWROYW1lID0gZGF0YVRhYmxlW0ROQU1FX0ZSXVtpXTsKICAgICAgICBpZiAoZXhwZWN0ZWROYW1lLmxlbmd0aCgpID09IDApCiAgICAgICAgICAgIGV4cGVjdGVkTmFtZSA9IGRhdGFUYWJsZVtETkFNRV9FTl1baV07CgogICAgICAgIGlmICh0ZXN0TGFuZyAhPSBleHBlY3RlZExhbmcpCiAgICAgICAgICAgIGVycmxuKCJEaXNwbGF5IGxhbmd1YWdlICgiICsgVW5pY29kZVN0cmluZyhpbkxvY2FsZS5nZXROYW1lKCkpICsgIikgbWlzbWF0Y2g6ICIgKyB0ZXN0TGFuZyArICIgdmVyc3VzICIgKyBleHBlY3RlZExhbmcpOwogICAgICAgIGlmICh0ZXN0Q3RyeSAhPSBleHBlY3RlZEN0cnkpCiAgICAgICAgICAgIGVycmxuKCJEaXNwbGF5IGNvdW50cnkgKCIgKyBVbmljb2RlU3RyaW5nKGluTG9jYWxlLmdldE5hbWUoKSkgKyAiKSBtaXNtYXRjaDogIiArIHRlc3RDdHJ5ICsgIiB2ZXJzdXMgIiArIGV4cGVjdGVkQ3RyeSArIChkZWZhdWx0SXNGcmVuY2g/VW5pY29kZVN0cmluZygiRnJlbmNoIik6VW5pY29kZVN0cmluZygiXyIpKSApOwogICAgICAgIGlmICh0ZXN0VmFyICE9IGV4cGVjdGVkVmFyKQogICAgICAgICAgICBlcnJsbigiRGlzcGxheSB2YXJpYW50ICgiICsgVW5pY29kZVN0cmluZyhpbkxvY2FsZS5nZXROYW1lKCkpICsgIikgbWlzbWF0Y2g6ICIgKyB0ZXN0VmFyICsgIiB2ZXJzdXMgIiArIGV4cGVjdGVkVmFyKTsKICAgICAgICBpZiAodGVzdE5hbWUgIT0gZXhwZWN0ZWROYW1lKQogICAgICAgICAgICBlcnJsbigiRGlzcGxheSBuYW1lICgiICsgVW5pY29kZVN0cmluZyhpbkxvY2FsZS5nZXROYW1lKCkpICsgIikgbWlzbWF0Y2g6ICIgKyB0ZXN0TmFtZSArICIgdmVyc3VzICIgKyBleHBlY3RlZE5hbWUpOwogICAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyB0YWJsZSBvZiB2YWxpZCBkYXRhCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKVUNoYXIgZ3JlZWtEaXNwbGF5TGFuZ3VhZ2VbXSA9IHsgMHgwM2I1LCAweDAzYmIsIDB4MDNiYiwgMHgwM2I3LCAweDAzYmQsIDB4MDNiOSwgMHgwM2JhLCAweDAzYWMsIDAgfTsKVUNoYXIgZ3JlZWtEaXNwbGF5Q291bnRyeVtdID0geyAweDAzOTUsIDB4MDNiYiwgMHgwM2JiLCAweDAzYWMsIDB4MDNiNCwgMHgwM2IxLCAwIH07ClVDaGFyIGdyZWVrRGlzcGxheU5hbWVbXSA9IHsgMHgwM2I1LCAweDAzYmIsIDB4MDNiYiwgMHgwM2I3LCAweDAzYmQsIDB4MDNiOSwgMHgwM2JhLAogICAgMHgwM2FjLCAweDIwLCAweDI4LCAweDAzOTUsIDB4MDNiYiwgMHgwM2JiLCAweDAzYWMsIDB4MDNiNCwgMHgwM2IxLCAweDI5LCAwIH07CiAgICAKdm9pZCBMb2NhbGVUZXN0OjpzZXRVcERhdGFUYWJsZSgpCnsKICAgIGlmIChkYXRhVGFibGUgPT0gMCkgewogICAgICAgIGRhdGFUYWJsZSA9IG5ldyBVbmljb2RlU3RyaW5nKlsyN107CgogICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDI3OyBpKyspIHsKICAgICAgICAgICAgZGF0YVRhYmxlW2ldID0gbmV3IFVuaWNvZGVTdHJpbmdbN107CiAgICAgICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IDc7IGorKykgewogICAgICAgICAgICAgICAgZGF0YVRhYmxlW2ldW2pdID0gQ2hhcnNUb1VuaWNvZGVTdHJpbmcocmF3RGF0YVtpXVtqXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZGF0YVRhYmxlW0RMQU5HX0VMXVtHUkVFS10gPSBncmVla0Rpc3BsYXlMYW5ndWFnZTsKICAgICAgICBkYXRhVGFibGVbRENUUllfRUxdW0dSRUVLXSA9IGdyZWVrRGlzcGxheUNvdW50cnk7CiAgICAgICAgZGF0YVRhYmxlW0ROQU1FX0VMXVtHUkVFS10gPSBncmVla0Rpc3BsYXlOYW1lOwogICAgfQp9CgovLyA9PT09PT09PT09PT09PT09PT09PQoKCi8qKgogKiBAYnVnIDQwMTE3NTYgNDAxMTM4MAogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdElTTzNGYWxsYmFjaygpIAp7CiAgICBMb2NhbGUgdGVzdCgieHgiLCAiWVkiKTsKCiAgICBjb25zdCBjaGFyICogcmVzdWx0OwoKICAgIHJlc3VsdCA9IHRlc3QuZ2V0SVNPM0xhbmd1YWdlKCk7CgogICAgLy8gQ29uZm9ybSB0byBDIEFQSSB1c2FnZSAKCiAgICBpZiAoIXJlc3VsdCB8fCAocmVzdWx0WzBdICE9IDApKQogICAgICAgIGVycmxuKCJnZXRJU08zTGFuZ3VhZ2UoKSBvbiB4eF9ZWSByZXR1cm5lZCAiICsgVW5pY29kZVN0cmluZyhyZXN1bHQpICsgIiBpbnN0ZWFkIG9mIFwiXCIiKTsKCiAgICByZXN1bHQgPSB0ZXN0LmdldElTTzNDb3VudHJ5KCk7CgogICAgaWYgKCFyZXN1bHQgfHwgKHJlc3VsdFswXSAhPSAwKSkKICAgICAgICBlcnJsbigiZ2V0SVNPM0NvdW50cnkoKSBvbiB4eF9ZWSByZXR1cm5lZCAiICsgVW5pY29kZVN0cmluZyhyZXN1bHQpICsgIiBpbnN0ZWFkIG9mIFwiXCIiKTsKfQoKLyoqCiAqIEBidWcgNDEwNjE1NSA0MTE4NTg3CiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0R2V0TGFuZ3NBbmRDb3VudHJpZXMoKSAKewogICAgLy8gSXQgZGlkbid0IHNlZW0gcmlnaHQgdG8ganVzdCBkbyBhbiBleGhhdXN0aXZlIHRlc3Qgb2YgZXZlcnl0aGluZyBoZXJlLCBzbyBJIGNoZWNrCiAgICAvLyBmb3IgdGhlIGZvbGxvd2luZyB0aGluZ3M6CiAgICAvLyAxKSBEb2VzIGVhY2ggbGlzdCBoYXZlIHRoZSByaWdodCB0b3RhbCBudW1iZXIgb2YgZW50cmllcz8KICAgIC8vIDIpIERvZXMgZWFjaCBsaXN0IGNvbnRhaW4gY2VydGFpbiBsYW5ndWFnZSBhbmQgY291bnRyeSBjb2RlcyB3ZSB0aGluayBhcmUgaW1wb3J0YW50CiAgICAvLyAgICAgKHRoZSBHNyBjb3VudHJpZXMsIHBsdXMgYSBjb3VwbGUgb3RoZXJzKT8KICAgIC8vIDMpIERvZXMgZWFjaCBsaXN0IGhhdmUgZXZlcnkgZW50cnkgZm9ybWF0dGVkIGNvcnJlY3RseT8gKGkuZS4sIHR3byBjaGFyYWN0ZXJzLAogICAgLy8gICAgIGFsbCBsb3dlciBjYXNlIGZvciB0aGUgbGFuZ3VhZ2UgY29kZXMsIGFsbCB1cHBlciBjYXNlIGZvciB0aGUgY291bnRyeSBjb2RlcykKICAgIC8vIDQpIElzIGVhY2ggbGlzdCBpbiBzb3J0ZWQgb3JkZXI/CiAgICBpbnQzMl90IHRlc3RDb3VudCA9IDA7CiAgICBjb25zdCBjaGFyICogY29uc3QgKiB0ZXN0ID0gTG9jYWxlOjpnZXRJU09MYW5ndWFnZXMoKTsKICAgIGNvbnN0IGNoYXIgc3BvdENoZWNrMVsgXVs0XSA9IHsgImVuIiwgImVzIiwgImZyIiwgImRlIiwgIml0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYSIsICJrbyIsICJ6aCIsICJ0aCIsICJoZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiLCAiaXUiLCAidWciLCAieWkiLCAiemEiIH07CgogICAgaW50MzJfdCBpOwogICAgCiAgICBmb3IodGVzdENvdW50ID0gMDt0ZXN0W3Rlc3RDb3VudF07dGVzdENvdW50KyspCiAgICAgIDsKCiAgICBpZiAodGVzdENvdW50ICE9IDQzNykKICAgICAgICBlcnJsbigiRXhwZWN0ZWQgZ2V0SVNPTGFuZ3VhZ2VzKCkgdG8gcmV0dXJuIDQzNyBsYW5ndWFnZXM7IGl0IHJldHVybmVkICVkIiwgdGVzdENvdW50KTsKICAgIGVsc2UgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSB7CiAgICAgICAgICAgIGludDMyX3QgajsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHRlc3RDb3VudDsgaisrKQogICAgICAgICAgICAgIGlmICh1cHJ2X3N0cmNtcCh0ZXN0W2pdLHNwb3RDaGVjazFbaV0pPT0gMCkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgaWYgKGogPT0gdGVzdENvdW50IHx8ICh1cHJ2X3N0cmNtcCh0ZXN0W2pdLHNwb3RDaGVjazFbaV0pIT0wKSkKICAgICAgICAgICAgICAgIGVycmxuKCJDb3VsZG4ndCBmaW5kICIgKyAoVW5pY29kZVN0cmluZylzcG90Q2hlY2sxW2ldICsgIiBpbiBsYW5ndWFnZSBsaXN0LiIpOwogICAgICAgIH0KICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCB0ZXN0Q291bnQ7IGkrKykgewogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVzdGVlKHRlc3RbaV0sIiIpOwogICAgICAgIFVuaWNvZGVTdHJpbmcgbGModGVzdFtpXSwiIik7CiAgICAgICAgaWYgKHRlc3RlZSAhPSBsYy50b0xvd2VyKCkpCiAgICAgICAgICAgIGVycmxuKGxjICsgIiBpcyBub3QgYWxsIGxvd2VyIGNhc2UuIik7CiAgICAgICAgaWYgKCAodGVzdGVlLmxlbmd0aCgpICE9IDIpICYmICh0ZXN0ZWUubGVuZ3RoKCkgIT0gMykpCiAgICAgICAgICAgIGVycmxuKHRlc3RlZSArICIgaXMgbm90IHR3byBvciB0aHJlZSBjaGFyYWN0ZXJzIGxvbmcuIik7CiAgICAgICAgaWYgKGkgPiAwICYmIHRlc3RlZS5jb21wYXJlKHRlc3RbaSAtIDFdKSA8PSAwKQogICAgICAgICAgICBlcnJsbih0ZXN0ZWUgKyAiIGFwcGVhcnMgaW4gYW4gb3V0LW9mLW9yZGVyIHBvc2l0aW9uIGluIHRoZSBsaXN0LiIpOwogICAgfQoKICAgIHRlc3QgPSBMb2NhbGU6OmdldElTT0NvdW50cmllcygpOwogICAgVW5pY29kZVN0cmluZyBzcG90Q2hlY2syIFtdID0geyAiVVMiLCAiQ0EiLCAiR0IiLCAiRlIiLCAiREUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklUIiwgIkpQIiwgIktSIiwgIkNOIiwgIlRXIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSCIgfTsKICAgIGludDMyX3Qgc3BvdDJMZW4gPSAxMTsKICAgIGZvcih0ZXN0Q291bnQ9MDt0ZXN0W3Rlc3RDb3VudF07dGVzdENvdW50KyspCiAgICAgIDsKCiAgICBpZiAodGVzdENvdW50ICE9IDIzOSkKICAgICAgICBlcnJsbigiRXhwZWN0ZWQgZ2V0SVNPTGFuZ3VhZ2VzIHRvIHJldHVybiAyMzggbGFuZ3VhZ2VzOyBpdCByZXR1cm5lZCIgKyB0ZXN0Q291bnQpOwogICAgZWxzZSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHNwb3QyTGVuOyBpKyspIHsKICAgICAgICAgICAgaW50MzJfdCBqOwogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGVzdENvdW50OyBqKyspCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyB0ZXN0ZWUodGVzdFtqXSwiIik7CgogICAgICAgICAgICAgICAgaWYgKHRlc3RlZSA9PSBzcG90Q2hlY2syW2ldKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgdGVzdGVlKHRlc3Rbal0sIiIpOwogICAgICAgICAgICBpZiAoaiA9PSB0ZXN0Q291bnQgfHwgdGVzdGVlICE9IHNwb3RDaGVjazJbaV0pCiAgICAgICAgICAgICAgICBlcnJsbigiQ291bGRuJ3QgZmluZCAiICsgc3BvdENoZWNrMltpXSArICIgaW4gY291bnRyeSBsaXN0LiIpOwogICAgICAgIH0KICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCB0ZXN0Q291bnQ7IGkrKykgewogICAgICBVbmljb2RlU3RyaW5nIHRlc3RlZSh0ZXN0W2ldLCIiKTsKICAgICAgICBVbmljb2RlU3RyaW5nIHVjKHRlc3RbaV0sIiIpOwogICAgICAgIGlmICh0ZXN0ZWUgIT0gdWMudG9VcHBlcigpKQogICAgICAgICAgICBlcnJsbih0ZXN0ZWUgKyAiIGlzIG5vdCBhbGwgdXBwZXIgY2FzZS4iKTsKICAgICAgICBpZiAodGVzdGVlLmxlbmd0aCgpICE9IDIpCiAgICAgICAgICAgIGVycmxuKHRlc3RlZSArICIgaXMgbm90IHR3byBjaGFyYWN0ZXJzIGxvbmcuIik7CiAgICAgICAgaWYgKGkgPiAwICYmIHRlc3RlZS5jb21wYXJlKHRlc3RbaSAtIDFdKSA8PSAwKQogICAgICAgICAgICBlcnJsbih0ZXN0ZWUgKyAiIGFwcGVhcnMgaW4gYW4gb3V0LW9mLW9yZGVyIHBvc2l0aW9uIGluIHRoZSBsaXN0LiIpOwogICAgfQp9CgovKioKICogQGJ1ZyA0MTI2ODgwCiAqLwovLyBzaW5jZSB0aGlzIHJldHVybnMgY29uc3QgVW5pY29kZVN0cmluZyogaW4gQysrLCBpcyB0aGlzIHRlc3QgYXBwbGljYWJsZT8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdDQxMjY4ODAoKSAKewojaWZkZWYgSUNVX0xPQ0lEX1VTRV9ERVBSRUNBVEVTCiAgICAKICAgIGNvbnN0IFVuaWNvZGVTdHJpbmcgKnRlc3Q7CiAgICBpbnQzMl90IHRlc3RDb3VudD0wOwoKICAgIC8qdGVzdCA9IExvY2FsZTo6Z2V0SVNPQ291bnRyaWVzKHRlc3RDb3VudCk7CiAgICB0ZXN0WzBdID0gIlNVQ0tFUiEhISI7CiAgICB0ZXN0ID0gTG9jYWxlOjpnZXRJU09Db3VudHJpZXModGVzdENvdW50KTsKICAgIGlmICh0ZXN0WzBdID09ICJTVUNLRVIhISEiKQogICAgICAgIGVycmxuKCJDaGFuZ2VkIGludGVybmFsIGNvdW50cnkgY29kZSBsaXN0ISIpOwoKICAgIHRlc3QgPSBMb2NhbGU6OmdldElTT0xhbmd1YWdlcyh0ZXN0Q291bnQpOwogICAgdGVzdFswXSA9ICJIQUhBSEFIQSEhISI7CiAgICB0ZXN0ID0gTG9jYWxlOjpnZXRJU09MYW5ndWFnZXModGVzdENvdW50KTsKICAgIGlmICh0ZXN0WzBdID09ICJIQUhBSEFIQSEhISIpIC8vIEZpeGVkIHR5cG8KICAgICAgICBlcnJsbigiQ2hhbmdlcyBpbnRlcm5hbCBsYW5ndWFnZSBjb2RlIGxpc3QhIik7CiAgICAgKi8gICAKICAgIC8qdGVzdHMgZm9yIGRlcHJlY2F0ZWQgQVBJKi8KICAgIHRlc3Q9TG9jYWxlOjpnZXRJU09Db3VudHJpZXModGVzdENvdW50KTsKICAgIGlmKHRlc3RDb3VudCAhPSAyMzkpewogICAgICAgIGVycmxuKChVbmljb2RlU3RyaW5nKSJUaGVyZSBpcyBhbiBlcnJvciBpbiBnZXRJU09Db3VudHJpZXMgIiArIHRlc3RDb3VudCk7CiAgICB9CiAgICB0ZXN0PUxvY2FsZTo6Z2V0SVNPTGFuZ3VhZ2VzKHRlc3RDb3VudCk7CiAgICBpZih0ZXN0Q291bnQgIT0gNDM3KXsKICAgICAgICBlcnJsbigoVW5pY29kZVN0cmluZykiVGhlcmUgaXMgYW4gZXJyb3IgaW4gZ2V0SVNPTGFuZ3VhZ2VzICIgKyB0ZXN0Q291bnQpOwogICAgfQovKi0tLS0tLS0tLS0qLwojZWxzZQogICAgbG9nbG4oIlNraXBwaW5nIFRlc3Q0MTI2ODgwIGZvciBkZXByZWNhdGVkIEFQSSIpOwojZW5kaWYgICAgICAgIAp9CgovKioKICogQGJ1ZyA0MTM1MzE2CiAqLwovLyBub3QgYXBwbGljYWJsZSBpbiBDKysgLSBjb25zdCBMb2NhbGUqCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RCdWc0MTM1MzE2KCkgCnsKLyoKICAgIExvY2FsZVtdIGxvY2FsZXMxID0gTG9jYWxlLmdldEF2YWlsYWJsZUxvY2FsZXMoKTsKICAgIExvY2FsZVtdIGxvY2FsZXMyID0gTG9jYWxlLmdldEF2YWlsYWJsZUxvY2FsZXMoKTsKICAgIGlmIChsb2NhbGVzMSA9PSBsb2NhbGVzMikKICAgICAgICBlcnJsbigiTG9jYWxlLmdldEF2YWlsYWJsZUxvY2FsZXMoKSBkb2Vzbid0IGNsb25lIGl0cyBpbnRlcm5hbCBzdG9yYWdlISIpOwoqLwp9CgovKioKICogQGJ1ZyA0MTA3OTUzCiAqLwovKgp0ZXN0IGNvbW1lbnRlZCBvdXQgcGVuZGluZyBBUEktY2hhbmdlIGFwcHJvdmFsCnB1YmxpYyB2b2lkIFRlc3RHZXRMYW5ndWFnZXNGb3JDb3VudHJ5KCkgewogICAgVW5pY29kZVN0cmluZ1tdIGxhbmd1YWdlcyA9IExvY2FsZS5nZXRMYW5ndWFnZXNGb3JDb3VudHJ5KCJVUyIpOwoKICAgIGlmICghc2VhcmNoU3RyaW5nQXJyYXlGb3IoImVuIiwgbGFuZ3VhZ2VzKSkKICAgICAgICBlcnJsbigiRGlkbid0IGdldCBlbiBhcyBhIGxhbmd1YWdlIGZvciBVUyIpOwoKICAgIGxhbmd1YWdlcyA9IExvY2FsZS5nZXRMYW5ndWFnZXNGb3JDb3VudHJ5KCJGUiIpOwogICAgaWYgKCFzZWFyY2hTdHJpbmdBcnJheUZvcigiZnIiLCBsYW5ndWFnZXMpKQogICAgICAgIGVycmxuKCJEaWRuJ3QgZ2V0IGZyIGFzIGEgbGFuZ3VhZ2UgZm9yIEZSIik7CgogICAgbGFuZ3VhZ2VzID0gTG9jYWxlLmdldExhbmd1YWdlc0ZvckNvdW50cnkoIkNIIik7CiAgICBpZiAoIXNlYXJjaFN0cmluZ0FycmF5Rm9yKCJmciIsIGxhbmd1YWdlcykpCiAgICAgICAgZXJybG4oIkRpZG4ndCBnZXQgZnIgYXMgYSBsYW5ndWFnZSBmb3IgQ0giKTsKICAgIGlmICghc2VhcmNoU3RyaW5nQXJyYXlGb3IoIml0IiwgbGFuZ3VhZ2VzKSkKICAgICAgICBlcnJsbigiRGlkbid0IGdldCBpdCBhcyBhIGxhbmd1YWdlIGZvciBDSCIpOwogICAgaWYgKCFzZWFyY2hTdHJpbmdBcnJheUZvcigiZGUiLCBsYW5ndWFnZXMpKQogICAgICAgIGVycmxuKCJEaWRuJ3QgZ2V0IGRlIGFzIGEgbGFuZ3VhZ2UgZm9yIENIIik7CgogICAgbGFuZ3VhZ2VzID0gTG9jYWxlLmdldExhbmd1YWdlc0ZvckNvdW50cnkoIkpQIik7CiAgICBpZiAoIXNlYXJjaFN0cmluZ0FycmF5Rm9yKCJqYSIsIGxhbmd1YWdlcykpCiAgICAgICAgZXJybG4oIkRpZG4ndCBnZXQgamEgYXMgYSBsYW5ndWFnZSBmb3IgSlAiKTsKfQoqLwoKLyoKcHJpdmF0ZSBVQm9vbCBzZWFyY2hTdHJpbmdBcnJheUZvcihVbmljb2RlU3RyaW5nIHMsIFVuaWNvZGVTdHJpbmdbXSBhcnJheSkgewogICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCiAgICAgICAgaWYgKHMuZXF1YWxzKGFycmF5W2ldKSkKICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gRkFMU0U7Cn0KKi8KCi8qKgogKiBAYnVnIDQxMTA2MTMKICovCi8vIG5vdCBhcHBsaWNhYmxlIGluIEMrKwogLyoKdm9pZCAKTG9jYWxlVGVzdDo6VGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgT3B0aW9uYWxEYXRhRXhjZXB0aW9uLAogICAgICAgICAgICAgICAgSU9FeGNlcHRpb24sIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbgp7CiAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3N0cmVhbTsKICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvYnN0cmVhbTsKICAgIGJ5dGVbXSBieXRlcyA9IG51bGw7CgogICAgb2JzdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICBvc3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvYnN0cmVhbSk7CgogICAgTG9jYWxlIHRlc3QxID0gbmV3IExvY2FsZSgiemgiLCAiVFciLCAiIik7CiAgICBpbnQzMl90IGR1bW15ID0gdGVzdDEuaGFzaENvZGUoKTsgICAvLyBmaWxsIGluIHRoZSBjYWNoZWQgaGFzaC1jb2RlIHZhbHVlCiAgICBvc3RyZWFtLndyaXRlT2JqZWN0KHRlc3QxKTsKCiAgICBieXRlcyA9IG9ic3RyZWFtLnRvQnl0ZUFycmF5KCk7CgogICAgT2JqZWN0SW5wdXRTdHJlYW0gaXN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpKTsKCiAgICBMb2NhbGUgdGVzdDIgPSAoTG9jYWxlKShpc3RyZWFtLnJlYWRPYmplY3QoKSk7CgogICAgaWYgKCF0ZXN0MS5lcXVhbHModGVzdDIpIHx8IHRlc3QxLmhhc2hDb2RlKCkgIT0gdGVzdDIuaGFzaENvZGUoKSkKICAgICAgICBlcnJsbigiTG9jYWxlIGZhaWxlZCB0byBkZXNlcmlhbGl6ZSBjb3JyZWN0bHkuIik7Cn0KKi8KCi8qKgogKiBAYnVnIDQxMTg1ODcKICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RTaW1wbGVEaXNwbGF5TmFtZXMoKSAKewogICAgLy8gVGhpcyB0ZXN0IGlzIGRpZmZlcmVudCBmcm9tIFRlc3REaXNwbGF5TmFtZXMgYmVjYXVzZSBUZXN0RGlzcGxheU5hbWVzIGNoZWNrcwogICAgLy8gZmFsbGJhY2sgYmVoYXZpb3IsIGNvbWJpbmF0aW9uIG9mIGxhbmd1YWdlIGFuZCBjb3VudHJ5IG5hbWVzIHRvIGZvcm0gbG9jYWxlCiAgICAvLyBuYW1lcywgYW5kIG90aGVyIHN0dWZmIGxpa2UgdGhhdC4gIFRoaXMgdGVzdCBqdXN0IGNoZWNrcyBzcGVjaWZpYyBsYW5ndWFnZQogICAgLy8gYW5kIGNvdW50cnkgY29kZXMgdG8gbWFrZSBzdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3QgbmFtZXMgZm9yIHRoZW0uCiAgICBjaGFyIGxhbmd1YWdlQ29kZXNbXSBbNF0gPSB7ICJoZSIsICJpZCIsICJpdSIsICJ1ZyIsICJ5aSIsICJ6YSIgfTsKICAgIFVuaWNvZGVTdHJpbmcgbGFuZ3VhZ2VOYW1lcyBbXSA9IHsgIkhlYnJldyIsICJJbmRvbmVzaWFuIiwgIkludWtpdHV0IiwgIlVpZ2h1ciIsICJZaWRkaXNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaaHVhbmciIH07CgogICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNjsgaSsrKSB7CiAgICAgICAgVW5pY29kZVN0cmluZyB0ZXN0OwogICAgICAgIExvY2FsZSBsKGxhbmd1YWdlQ29kZXNbaV0sICIiLCAiIik7CiAgICAgICAgbC5nZXREaXNwbGF5TGFuZ3VhZ2UoTG9jYWxlOjpnZXRVUygpLCB0ZXN0KTsKICAgICAgICBpZiAodGVzdCAhPSBsYW5ndWFnZU5hbWVzW2ldKQogICAgICAgICAgICBlcnJsbigiR290IHdyb25nIGRpc3BsYXkgbmFtZSBmb3IgIiArIFVuaWNvZGVTdHJpbmcobGFuZ3VhZ2VDb2Rlc1tpXSkgKyAiOiBFeHBlY3RlZCBcIiIgKwogICAgICAgICAgICAgICAgICBsYW5ndWFnZU5hbWVzW2ldICsgIlwiLCBnb3QgXCIiICsgdGVzdCArICJcIi4iKTsKICAgIH0KfQoKLyoqCiAqIEBidWcgNDExODU5NQogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdFVuaW5zdGFsbGVkSVNPM05hbWVzKCkgCnsKICAgIC8vIFRoaXMgdGVzdCBjaGVja3MgdG8gbWFrZSBzdXJlIGdldElTTzNMYW5ndWFnZSBhbmQgZ2V0SVNPM0NvdW50cnkgd29yayByaWdodAogICAgLy8gZXZlbiBmb3IgbG9jYWxlcyB0aGF0IGFyZSBub3QgaW5zdGFsbGVkLgogICAgY29uc3QgY2hhciBpc28yTGFuZ3VhZ2VzIFtdWzRdID0geyAgICAgImFtIiwgImJhIiwgImZ5IiwgIm1yIiwgInJuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3MiLCAidHciLCAienUiIH07CiAgICBjb25zdCBjaGFyIGlzbzNMYW5ndWFnZXMgW11bNV0gPSB7ICAgICAiYW1oIiwgImJhayIsICJmcnkiLCAibWFyIiwgInJ1biIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNzdyIsICJ0d2kiLCAienVsIiB9OwoKICAgIGludDMyX3QgaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgIFVFcnJvckNvZGUgZXJyID0gVV9aRVJPX0VSUk9SOwoKICAgICAgVW5pY29kZVN0cmluZyB0ZXN0OwogICAgICAgIExvY2FsZSBsKGlzbzJMYW5ndWFnZXNbaV0sICIiLCAiIik7CiAgICAgICAgdGVzdCA9IGwuZ2V0SVNPM0xhbmd1YWdlKCk7CiAgICAgICAgaWYoKHRlc3QgIT0gaXNvM0xhbmd1YWdlc1tpXSkgfHwgVV9GQUlMVVJFKGVycikpCiAgICAgICAgICAgIGVycmxuKCJHb3Qgd3JvbmcgSVNPMyBjb2RlIGZvciAiICsgVW5pY29kZVN0cmluZyhpc28yTGFuZ3VhZ2VzW2ldKSArICI6IEV4cGVjdGVkIFwiIiArCiAgICAgICAgICAgICAgICAgICAgaXNvM0xhbmd1YWdlc1tpXSArICJcIiwgZ290IFwiIiArIHRlc3QgKyAiXCIuIiArIFVuaWNvZGVTdHJpbmcodV9lcnJvck5hbWUoZXJyKSkpOwogICAgfQoKICAgIGNoYXIgaXNvMkNvdW50cmllcyBbXVs0XSA9IHsgICAgICJBRiIsICJCVyIsICJLWiIsICJNTyIsICJNTiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNCIiwgIlRDIiwgIlpXIiB9OwogICAgY2hhciBpc28zQ291bnRyaWVzIFtdWzRdID0geyAgICAgIkFGRyIsICJCV0EiLCAiS0FaIiwgIk1BQyIsICJNTkciLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTTEIiLCAiVENBIiwgIlpXRSIgfTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgIFVFcnJvckNvZGUgZXJyID0gVV9aRVJPX0VSUk9SOwogICAgICAgIExvY2FsZSBsKCIiLCBpc28yQ291bnRyaWVzW2ldLCAiIik7CiAgICAgICAgVW5pY29kZVN0cmluZyB0ZXN0KGwuZ2V0SVNPM0NvdW50cnkoKSwgIiIpOwogICAgICAgIGlmICh0ZXN0ICE9IGlzbzNDb3VudHJpZXNbaV0pCiAgICAgICAgICAgIGVycmxuKCJHb3Qgd3JvbmcgSVNPMyBjb2RlIGZvciAiICsgVW5pY29kZVN0cmluZyhpc28yQ291bnRyaWVzW2ldKSArICI6IEV4cGVjdGVkIFwiIiArCiAgICAgICAgICAgICAgICAgICAgVW5pY29kZVN0cmluZyhpc28zQ291bnRyaWVzW2ldKSArICJcIiwgZ290IFwiIiArIHRlc3QgKyAiXCIuIiArIHVfZXJyb3JOYW1lKGVycikpOwogICAgfQp9CgovKioKICogQGJ1ZyA0MDkyNDc1CiAqIEkgY291bGQgbm90IHJlcHJvZHVjZSB0aGlzIGJ1Zy4gIEknbSBwcmV0dHkgY29udmluY2VkIGl0IHdhcyBmaXhlZCB3aXRoIHRoZQogKiBiaWcgbG9jYWxlLWRhdGEgcmVvcmcgb2YgMTAvMjgvOTcuICBUaGUgbG9va3VwIGxvZ2ljIGZvciBsYW5ndWFnZSBhbmQgY291bnRyeQogKiBkaXNwbGF5IG5hbWVzIHdhcyBhbHNvIGNoYW5nZWQgYXQgdGhhdCB0aW1lIGluIHRoYXQgY2hlY2staW4uICAgIC0tcnRnIDMvMjAvOTgKICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RBdHlwaWNhbExvY2FsZXMoKSAKewogICAgTG9jYWxlIGxvY2FsZXNUb1Rlc3QgW10gPSB7IExvY2FsZSgiZGUiLCAiQ0EiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgiamEiLCAiWkEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUoInJ1IiwgIk1YIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCJlbiIsICJGUiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgiZXMiLCAiREUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUoIiIsICJIUiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgiIiwgIlNFIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCIiLCAiRE8iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUoIiIsICJCRSIpIH07CgogICAgVW5pY29kZVN0cmluZyBlbmdsaXNoRGlzcGxheU5hbWVzIFtdID0geyAiR2VybWFuIChDYW5hZGEpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKYXBhbmVzZSAoU291dGggQWZyaWNhKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVzc2lhbiAoTWV4aWNvKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCAoRnJhbmNlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3BhbmlzaCAoR2VybWFueSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyb2F0aWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN3ZWRlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9taW5pY2FuIFJlcHVibGljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCZWxnaXVtIiB9OwogICAgVW5pY29kZVN0cmluZyBmcmVuY2hEaXNwbGF5TmFtZXMgW109IHsgImFsbGVtYW5kIChDYW5hZGEpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphcG9uYWlzIChBZnJpcXVlIGR1IFN1ZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVzc2UgKE1leGlxdWUpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmdsYWlzIChGcmFuY2UpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlc3BhZ25vbCAoQWxsZW1hZ25lKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDcm9hdGllIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb1VuaWNvZGVTdHJpbmcoIlN1XFx1MDBFOGRlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzVG9Vbmljb2RlU3RyaW5nKCJSXFx1MDBFOXB1YmxpcXVlIERvbWluaWNhaW5lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCZWxnaXF1ZSIgfTsKICAgIFVuaWNvZGVTdHJpbmcgc3BhbmlzaERpc3BsYXlOYW1lcyBbXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzVG9Vbmljb2RlU3RyaW5nKCJhbGVtXFx1MDBFMW4gKENhbmFkXFx1MDBFMSkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzVG9Vbmljb2RlU3RyaW5nKCJqYXBvblxcdTAwRTlzIChTdWRcXHUwMEUxZnJpY2EpIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc1RvVW5pY29kZVN0cmluZygicnVzbyAoTVxcdTAwRTl4aWNvKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb1VuaWNvZGVTdHJpbmcoImluZ2xcXHUwMEU5cyAoRnJhbmNpYSkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzVG9Vbmljb2RlU3RyaW5nKCJlc3BhXFx1MDBGMW9sIChBbGVtYW5pYSkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDcm9hY2lhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWVjaWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb1VuaWNvZGVTdHJpbmcoIlJlcFxcdTAwRkFibGljYSBEb21pbmljYW5hIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc1RvVW5pY29kZVN0cmluZygiQlxcdTAwRTlsZ2ljYSIpIH07CiAgICBVbmljb2RlU3RyaW5nIGFyYWJpY0Rpc3BsYXlOYW1lcyBbXSA9IHsgIkdlcm1hbiAoQ2FuYWRhKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmFwYW5lc2UgKFNvdXRoIEFmcmljYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJ1c3NpYW4gKE1leGljbykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuZ2xpc2ggKEZyYW5jZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNwYW5pc2ggKEdlcm1hbnkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDcm9hdGlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTd2VkZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvbWluaWNhbiBSZXB1YmxpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmVsZ2l1bSIgfTsKCgogICAgaW50MzJfdCBpOwogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAgICBMb2NhbGU6OnNldERlZmF1bHQoTG9jYWxlOjpnZXRVUygpLCBzdGF0dXMpOwogICAgZm9yIChpID0gMDsgaSA8IDk7ICsraSkgewogICAgICAgIFVuaWNvZGVTdHJpbmcgbmFtZTsKICAgICAgICBsb2NhbGVzVG9UZXN0W2ldLmdldERpc3BsYXlOYW1lKExvY2FsZTo6Z2V0VVMoKSwgbmFtZSk7CiAgICAgICAgbG9nbG4obmFtZSk7CiAgICAgICAgaWYgKG5hbWUgIT0gZW5nbGlzaERpc3BsYXlOYW1lc1tpXSkKICAgICAgICB7CiAgICAgICAgICAgIGVycmxuKCJMb29rdXAgaW4gRW5nbGlzaCBmYWlsZWQ6IGV4cGVjdGVkIFwiIiArIGVuZ2xpc2hEaXNwbGF5TmFtZXNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIsIGdvdCBcIiIgKyBuYW1lICsgIlwiIik7CiAgICAgICAgICAgIGxvZ2xuKCJMb2NhbGUgbmFtZSB3YXMtPiAiICsgKG5hbWU9bG9jYWxlc1RvVGVzdFtpXS5nZXROYW1lKCkpKTsKICAgICAgICB9CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykgewogICAgICAgIFVuaWNvZGVTdHJpbmcgbmFtZTsKICAgICAgICBsb2NhbGVzVG9UZXN0W2ldLmdldERpc3BsYXlOYW1lKExvY2FsZSgiZXMiLCAiRVMiKSwgbmFtZSk7CiAgICAgICAgbG9nbG4obmFtZSk7CiAgICAgICAgaWYgKG5hbWUgIT0gc3BhbmlzaERpc3BsYXlOYW1lc1tpXSkKICAgICAgICAgICAgZXJybG4oIkxvb2t1cCBpbiBTcGFuaXNoIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgc3BhbmlzaERpc3BsYXlOYW1lc1tpXQogICAgICAgICAgICAgICAgICAgICAgICArICJcIiwgZ290IFwiIiArIG5hbWUgKyAiXCIiKTsKICAgIH0KCiAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CiAgICAgICAgVW5pY29kZVN0cmluZyBuYW1lOwogICAgICAgIGxvY2FsZXNUb1Rlc3RbaV0uZ2V0RGlzcGxheU5hbWUoTG9jYWxlOjpnZXRGcmFuY2UoKSwgbmFtZSk7CiAgICAgICAgbG9nbG4obmFtZSk7CiAgICAgICAgaWYgKG5hbWUgIT0gZnJlbmNoRGlzcGxheU5hbWVzW2ldKQogICAgICAgICAgICBlcnJsbigiTG9va3VwIGluIEZyZW5jaCBmYWlsZWQ6IGV4cGVjdGVkIFwiIiArIGZyZW5jaERpc3BsYXlOYW1lc1tpXQogICAgICAgICAgICAgICAgICAgICAgICArICJcIiwgZ290IFwiIiArIG5hbWUgKyAiXCIiKTsKICAgIH0KCiAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CiAgICAgICAgVW5pY29kZVN0cmluZyBuYW1lOwogICAgICAgIGxvY2FsZXNUb1Rlc3RbaV0uZ2V0RGlzcGxheU5hbWUoTG9jYWxlKCJhciIsICJFUyIpLCBuYW1lKTsKICAgICAgICBsb2dsbihuYW1lICsgIiBMb2NhbGUgZmFsbGJhY2sgdG8gYXIsIGFuZCBkYXRhIGZhbGxiYWNrIHRvIHJvb3QiKTsKICAgICAgICBpZiAobmFtZSAhPSBhcmFiaWNEaXNwbGF5TmFtZXNbaV0pCiAgICAgICAgICAgIGVycmxuKCJMb29rdXAgaW4gQXJhYmljIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgYXJhYmljRGlzcGxheU5hbWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiLCBnb3QgXCIiICsgbmFtZSArICJcIiIpOwogICAgICAgIGxvY2FsZXNUb1Rlc3RbaV0uZ2V0RGlzcGxheU5hbWUoTG9jYWxlKCJhciIsICJFRyIpLCBuYW1lKTsKICAgICAgICBsb2dsbihuYW1lICsgIiBEYXRhIGZhbGxiYWNrIHRvIHJvb3QiKTsKICAgICAgICBpZiAobmFtZSAhPSBhcmFiaWNEaXNwbGF5TmFtZXNbaV0pCiAgICAgICAgICAgIGVycmxuKCJMb29rdXAgaW4gQXJhYmljIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgYXJhYmljRGlzcGxheU5hbWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiLCBnb3QgXCIiICsgbmFtZSArICJcIiIpOwogICAgfQp9CgojaWYgIVVDT05GSUdfTk9fRk9STUFUVElORwoKLyoqCiAqIEBidWcgNDEzNTc1MgogKiBUaGlzIHdvdWxkIGJlIGJldHRlciB0ZXN0ZWQgYnkgdGhlIExvY2FsZURhdGFUZXN0LiAgV2lsbCBtb3ZlIGl0IHdoZW4gSQogKiBnZXQgdGhlIExvY2FsZURhdGFUZXN0IHdvcmtpbmcgYWdhaW4uCiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0VGhhaUN1cnJlbmN5Rm9ybWF0KCkgCnsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgRGVjaW1hbEZvcm1hdCAqdGhhaUN1cnJlbmN5ID0gKERlY2ltYWxGb3JtYXQqKU51bWJlckZvcm1hdDo6Y3JlYXRlQ3VycmVuY3lJbnN0YW5jZSgKICAgICAgICAgICAgICAgICAgICBMb2NhbGUoInRoIiwgIlRIIiksIHN0YXR1cyk7CiAgICBVQ2hhciBwb3NQcmVmaXggPSAweDBlM2Y7CiAgICBVbmljb2RlU3RyaW5nIHRlbXA7CgogICAgaWYoVV9GQUlMVVJFKHN0YXR1cykgfHwgIXRoYWlDdXJyZW5jeSkKICAgIHsKICAgICAgICBlcnJsbigiQ291bGRuJ3QgZ2V0IHRoX1RIIGN1cnJlbmN5IC0+ICIgKyBVbmljb2RlU3RyaW5nKHVfZXJyb3JOYW1lKHN0YXR1cykpKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhhaUN1cnJlbmN5LT5nZXRQb3NpdGl2ZVByZWZpeCh0ZW1wKSAhPSBVbmljb2RlU3RyaW5nKCZwb3NQcmVmaXgsIDEsIDEpKQogICAgICAgIGVycmxuKCJUaGFpIGN1cnJlbmN5IHByZWZpeCB3cm9uZzogZXhwZWN0ZWQgMHgwZTNmLCBnb3QgXCIiICsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhaUN1cnJlbmN5LT5nZXRQb3NpdGl2ZVByZWZpeCh0ZW1wKSArICJcIiIpOwogICAgaWYgKHRoYWlDdXJyZW5jeS0+Z2V0UG9zaXRpdmVTdWZmaXgodGVtcCkgIT0gIiIpCiAgICAgICAgZXJybG4oIlRoYWkgY3VycmVuY3kgc3VmZml4IHdyb25nOiBleHBlY3RlZCBcIlwiLCBnb3QgXCIiICsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhaUN1cnJlbmN5LT5nZXRQb3NpdGl2ZVN1ZmZpeCh0ZW1wKSArICJcIiIpOwoKICAgIGRlbGV0ZSB0aGFpQ3VycmVuY3k7Cn0KCi8qKgogKiBAYnVnIDQxMjIzNzEKICogQ29uZmlybSB0aGF0IEV1cm8gc3VwcG9ydCB3b3Jrcy4gIFRoaXMgdGVzdCBpcyBwcmV0dHkgcnVkaW1lbnRhcnk7IGFsbCBpdCBkb2VzCiAqIGlzIGNoZWNrIHRoYXQgYW55IGxvY2FsZXMgd2l0aCB0aGUgRVVSTyB2YXJpYW50IGZvcm1hdCBhIG51bWJlciB1c2luZyB0aGUKICogRXVybyBjdXJyZW5jeSBzeW1ib2wuCiAqCiAqIEFTU1VNRTogQWxsIGxvY2FsZXMgZW5jb2RlIHRoZSBFdXJvIGNoYXJhY3RlciAiXHUyMEFDIi4KICogSWYgdGhpcyBpcyBjaGFuZ2VkIHRvIHVzZSB0aGUgc2luZ2xlLWNoYXJhY3RlciBFdXJvIHN5bWJvbCwgdGhpcwogKiB0ZXN0IG11c3QgYmUgdXBkYXRlZC4KICoKICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RFdXJvU3VwcG9ydCgpIAp7CiAgICBVQ2hhciBldXJvID0gMHgyMGFjOwogICAgY29uc3QgVW5pY29kZVN0cmluZyBFVVJPX0NVUlJFTkNZKCZldXJvLCAxLCAxKTsgLy8gTG9vayBmb3IgdGhpcyBVbmljb2RlU3RyaW5nIGluIGZvcm1hdHRlZCBFdXJvIGN1cnJlbmN5CiAgICBjb25zdCBjaGFyKiBsb2NhbGVBcnJbXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYV9FUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVfQVQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlX0RFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZV9MVSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWxfR1IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuX0JFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbl9JRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXNfRVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImV1X0VTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaV9GSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJfQkUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyX0ZSIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcl9MVSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2FfSUUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImdsX0VTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdF9JVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmxfQkUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5sX05MIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdF9QVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICBjb25zdCBjaGFyKiogbG9jYWxlcyA9IGxvY2FsZUFycjsKCiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKCiAgICBVbmljb2RlU3RyaW5nIHRlbXA7CgogICAgZm9yICg7KmxvY2FsZXMhPU5VTEw7bG9jYWxlcysrKSB7CiAgICAgICAgTG9jYWxlIGxvYyAoKmxvY2FsZXMpOwogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKICAgICAgICAgICAgTnVtYmVyRm9ybWF0ICpuZiA9IE51bWJlckZvcm1hdDo6Y3JlYXRlQ3VycmVuY3lJbnN0YW5jZShsb2MsIHN0YXR1cyk7CiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgcG9zOwogICAgICAgICAgICBuZi0+Zm9ybWF0KDI3MTgyOC4xODI4NDUsIHBvcyk7CiAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgbmVnOwogICAgICAgICAgICBuZi0+Zm9ybWF0KC0yNzE4MjguMTgyODQ1LCBuZWcpOwogICAgICAgICAgICBpZiAocG9zLmluZGV4T2YoRVVST19DVVJSRU5DWSkgPj0gMCAmJgogICAgICAgICAgICAgICAgbmVnLmluZGV4T2YoRVVST19DVVJSRU5DWSkgPj0gMCkgewogICAgICAgICAgICAgICAgbG9nbG4oIk9rOiAiICsgKHRlbXA9bG9jLmdldE5hbWUoKSkgKwogICAgICAgICAgICAgICAgICAgICAgIjogIiArIHBvcyArICIgLyAiICsgbmVnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGVycmxuKCJGYWlsOiAiICsgKHRlbXA9bG9jLmdldE5hbWUoKSkgKwogICAgICAgICAgICAgICAgICAgICAgIiBmb3JtYXRzIHdpdGhvdXQgIiArIEVVUk9fQ1VSUkVOQ1kgKwogICAgICAgICAgICAgICAgICAgICAgIjogIiArIHBvcyArICIgLyAiICsgbmVnICsKICAgICAgICAgICAgICAgICAgICAgICJcbioqKiBUSElTIEZBSUxVUkUgTUFZIE9OTFkgTUVBTiBUSEFUIExPQ0FMRSBEQVRBIEhBUyBDSEFOR0VEICoqKiIpOwogICAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgICAgIGRlbGV0ZSBuZjsKICAgIH0KfQoKI2VuZGlmCgovKioKICogQGJ1ZyA0MTM5NTA0CiAqIHRvU3RyaW5nKCkgZG9lc24ndCB3b3JrIHdpdGggbGFuZ3VhZ2VfVkFSSUFOVC4KICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RUb1N0cmluZygpIHsKICAgIExvY2FsZSBEQVRBIFtdID0gewogICAgICAgIExvY2FsZSgieHgiLCAiIiwgIiIpLAogICAgICAgIExvY2FsZSgiIiwgIllZIiwgIiIpLAogICAgICAgIExvY2FsZSgiIiwgIiIsICJaWiIpLAogICAgICAgIExvY2FsZSgieHgiLCAiWVkiLCAiIiksCiAgICAgICAgTG9jYWxlKCJ4eCIsICIiLCAiWloiKSwKICAgICAgICBMb2NhbGUoIiIsICJZWSIsICJaWiIpLAogICAgICAgIExvY2FsZSgieHgiLCAiWVkiLCAiWloiKSwKICAgIH07CgogICAgY29uc3QgY2hhciBEQVRBX1MgW11bMjBdID0gewogICAgICAgICJ4eCIsCiAgICAgICAgIl9ZWSIsCiAgICAgICAgIl9fWloiLAogICAgICAgICJ4eF9ZWSIsCiAgICAgICAgInh4X19aWiIsCiAgICAgICAgIl9ZWV9aWiIsCiAgICAgICAgInh4X1lZX1paIiwKICAgIH07CiAgICAKICAgIGZvciAoaW50MzJfdCBpPTA7IGkgPCA3OyArK2kpIHsKICAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICAgbmFtZSA9IERBVEFbaV0uZ2V0TmFtZSgpOwoKICAgICAgaWYgKHN0cmNtcChuYW1lLCBEQVRBX1NbaV0pICE9IDApCiAgICAgICAgewogICAgICAgICAgICBlcnJsbigiRmFpbDogTG9jYWxlLmdldE5hbWUoKSwgZ290OiIgKyBVbmljb2RlU3RyaW5nKG5hbWUpICsgIiwgZXhwZWN0ZWQ6ICIgKyBEQVRBX1NbaV0pOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvZ2xuKCJQYXNzOiBMb2NhbGUuZ2V0TmFtZSgpLCBnb3Q6IiArIFVuaWNvZGVTdHJpbmcobmFtZSkgKTsKICAgIH0KfQoKI2lmICFVQ09ORklHX05PX0ZPUk1BVFRJTkcKCi8qKgogKiBAYnVnIDQxMzk5NDAKICogQ291bGRuJ3QgcmVwcm9kdWNlIHRoaXMgYnVnIC0tIHByb2JhYmx5IHdhcyBmaXhlZCBlYXJsaWVyLgogKgogKiBPUklHSU5BTCBCVUcgUkVQT1JUOgogKiAtLSBiYXNpY2FsbHksIGh1bmdhcmlhbiBmb3IgbW9uZGF5IHNob3VsZG4ndCBoYXZlIGFuIFx1MDBmNCAKICogKG8gY2lyY3VtZmxleClpbiBpdCBpbnN0ZWFkIGl0IHNob3VsZCBiZSBhbiBvIHdpdGggMiBpbmNsaW5lZCAKICogKHJpZ2h0KSBsaW5lcyBvdmVyIGl0Li4KICoKICogWW91IG1heSB3b25kZXIgLS0gd2h5IGRvIGFsbCB0aGlzIC0tIHdoeSBub3QganVzdCBhZGQgYSBsaW5lIHRvCiAqIExvY2FsZURhdGE/ICBXZWxsLCBJIGNvdWxkIHNlZSBieSBpbnNwZWN0aW9uIHRoYXQgdGhlIGxvY2FsZSBmaWxlIGhhZCB0aGUKICogcmlnaHQgY2hhcmFjdGVyIGluIGl0LCBzbyBJIHdhbnRlZCB0byBjaGVjayB0aGUgcmVzdCBvZiB0aGUgcGlwZWxpbmUgLS0gYQogKiB2ZXJ5IHJlbW90ZSBwb3NzaWJpbGl0eSwgYnV0IEkgd2FudGVkIHRvIGJlIHN1cmUuICBUaGUgb3RoZXIgcG9zc2liaWxpdHkKICogaXMgdGhhdCBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgZm9udCBtYXBwaW5nIHN1YnN5c3RlbSwgYnV0IHdlIGNhbid0CiAqIHRlc3QgdGhhdCBoZXJlLgogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdDQxMzk5NDAoKSAKewogICAgTG9jYWxlIG15bG9jYWxlKCJodSIsICIiLCAiIik7ICAgICAgIAogICAgVURhdGUgbXlkYXRlID0gZGF0ZSg5OCwzLDEzKTsgLy8gQSBNb25kYXkKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgU2ltcGxlRGF0ZUZvcm1hdCBkZl9mdWxsKCJFRUVFIiwgbXlsb2NhbGUsIHN0YXR1cyk7CiAgICBVbmljb2RlU3RyaW5nIHN0cjsKICAgIEZpZWxkUG9zaXRpb24gcG9zKEZpZWxkUG9zaXRpb246OkRPTlRfQ0FSRSk7CiAgICBkZl9mdWxsLmZvcm1hdChteWRhdGUsIHN0ciwgcG9zKTsKICAgIC8vIE1ha2Ugc3VyZSB0aGF0IG8gY2lyY3VtZmxleCAoXHUwMEY0KSBpcyBOT1QgdGhlcmUsIGFuZAogICAgLy8gbyBkb3VibGUgYWN1dGUgKFx1MDE1MSkgSVMuCiAgICBVQ2hhciBvY2YgPSAweDAwZjQ7CiAgICBVQ2hhciBvZGEgPSAweDAxNTE7CiAgICBpZiAoc3RyLmluZGV4T2Yob2RhKSA8IDAgfHwgc3RyLmluZGV4T2Yob2NmKSA+PSAwKQogICAgICAgIGVycmxuKCJGYWlsOiBNb25kYXkgaW4gSHVuZ2FyaWFuIGlzIHdyb25nIik7Cn0KClVEYXRlCkxvY2FsZVRlc3Q6OmRhdGUoaW50MzJfdCB5LCBpbnQzMl90IG0sIGludDMyX3QgZCwgaW50MzJfdCBociwgaW50MzJfdCBtaW4sIGludDMyX3Qgc2VjKQp7CiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgIENhbGVuZGFyICpjYWwgPSBDYWxlbmRhcjo6Y3JlYXRlSW5zdGFuY2Uoc3RhdHVzKTsKICAgIGlmIChjYWwgPT0gMCkgCiAgICAgICAgcmV0dXJuIDAuMDsKICAgIGNhbC0+Y2xlYXIoKTsKICAgIGNhbC0+c2V0KDE5MDAgKyB5LCBtLCBkLCBociwgbWluLCBzZWMpOyAvLyBBZGQgMTkwMCB0byBmb2xsb3cgamF2YS51dGlsLkRhdGUgcHJvdG9jb2wKICAgIFVEYXRlIGR0ID0gY2FsLT5nZXRUaW1lKHN0YXR1cyk7CiAgICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpCiAgICAgICAgcmV0dXJuIDAuMDsKICAgIAogICAgZGVsZXRlIGNhbDsKICAgIHJldHVybiBkdDsKfQoKLyoqCiAqIEBidWcgNDE0Mzk1MQogKiBSdXNzaWFuIGZpcnN0IGRheSBvZiB3ZWVrIHNob3VsZCBiZSBNb25kYXkuIENvbmZpcm1lZC4KICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3Q0MTQzOTUxKCkgCnsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgQ2FsZW5kYXIgKmNhbCA9IENhbGVuZGFyOjpjcmVhdGVJbnN0YW5jZShMb2NhbGUoInJ1IiwgIiIsICIiKSwgc3RhdHVzKTsKICAgIGlmIChjYWwtPmdldEZpcnN0RGF5T2ZXZWVrKCkgIT0gQ2FsZW5kYXI6Ok1PTkRBWSkgewogICAgICAgIGVycmxuKCJGYWlsOiBGaXJzdCBkYXkgb2Ygd2VlayBpbiBSdXNzaWEgc2hvdWxkIGJlIE1vbmRheSIpOwogICAgfQogICAgZGVsZXRlIGNhbDsKfQoKI2VuZGlmCgovKioKICogQGJ1ZyA0MTQ3MzE1CiAqIGphdmEudXRpbC5Mb2NhbGUuZ2V0SVNPM0NvdW50cnkoKSB3b3JrcyB3cm9uZyBmb3Igbm9uIElTTy0zMTY2IGNvZGVzLgogKiBTaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciB1bmtub3duIGxvY2FsZXMKICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3Q0MTQ3MzE1KCkgCnsKICBVbmljb2RlU3RyaW5nIHRlbXA7CiAgICAvLyBUcnkgd2l0aCBjb2RlcyB0aGF0IGFyZSB0aGUgd3JvbmcgbGVuZ3RoIGJ1dCBoYXBwZW4gdG8gbWF0Y2ggdGV4dAogICAgLy8gYXQgYSB2YWxpZCBvZmZzZXQgaW4gdGhlIG1hcHBpbmcgdGFibGUKICAgIExvY2FsZSBsb2NhbGUoImFhYSIsICJDQ0MiKTsKICAgIAogICAgY29uc3QgY2hhciAqcmVzdWx0ID0gbG9jYWxlLmdldElTTzNDb3VudHJ5KCk7CgogICAgLy8gQ2hhbmdlIHRvIGNvbmZvcm0gdG8gQyBhcGkgdXNhZ2UKICAgIGlmKChyZXN1bHQ9PU5VTEwpfHwocmVzdWx0WzBdICE9IDApKQogICAgICBlcnJsbigiRVJST1I6IGdldElTTzNDb3VudHJ5KCkgcmV0dXJuczogIiArIFVuaWNvZGVTdHJpbmcocmVzdWx0LCIiKSArIAogICAgICAgICAgICAgICAgIiBmb3IgbG9jYWxlICciICsgKHRlbXA9bG9jYWxlLmdldE5hbWUoKSkgKyAiJyByYXRoZXIgdGhhbiBleGNlcHRpb24iICk7Cn0KCi8qKgogKiBAYnVnIDQxNDczMTcKICogamF2YS51dGlsLkxvY2FsZS5nZXRJU08zTGFuZ3VhZ2UoKSB3b3JrcyB3cm9uZyBmb3Igbm9uIElTTy0zMTY2IGNvZGVzLgogKiBTaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciB1bmtub3duIGxvY2FsZXMKICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3Q0MTQ3MzE3KCkgCnsKICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKICAgIC8vIFRyeSB3aXRoIGNvZGVzIHRoYXQgYXJlIHRoZSB3cm9uZyBsZW5ndGggYnV0IGhhcHBlbiB0byBtYXRjaCB0ZXh0CiAgICAvLyBhdCBhIHZhbGlkIG9mZnNldCBpbiB0aGUgbWFwcGluZyB0YWJsZQogICAgTG9jYWxlIGxvY2FsZSgiYWFhIiwgIkNDQyIpOwogICAgCiAgICBjb25zdCBjaGFyICpyZXN1bHQgPSBsb2NhbGUuZ2V0SVNPM0xhbmd1YWdlKCk7CgogICAgLy8gQ2hhbmdlIHRvIGNvbmZvcm0gdG8gQyBhcGkgdXNhZ2UKICAgIGlmKChyZXN1bHQ9PU5VTEwpfHwocmVzdWx0WzBdICE9IDApKQogICAgICBlcnJsbigiRVJST1I6IGdldElTTzNMYW5ndWFnZSgpIHJldHVybnM6ICIgKyBVbmljb2RlU3RyaW5nKHJlc3VsdCwiIikgKyAKICAgICAgICAgICAgICAgICIgZm9yIGxvY2FsZSAnIiArICh0ZW1wPWxvY2FsZS5nZXROYW1lKCkpICsgIicgcmF0aGVyIHRoYW4gZXhjZXB0aW9uIiApOwp9CgovKgogKiBAYnVnIDQxNDc1NTIKICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3Q0MTQ3NTUyKCkgCnsKICAgIExvY2FsZSBsb2NhbGVzIFtdID0geyAgICAgTG9jYWxlKCJubyIsICJOTyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgibm8iLCAiTk8iLCAiQiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgibm8iLCAiTk8iLCAiTlkiKSAKICAgIH07CiAgICAKICAgIFVuaWNvZGVTdHJpbmcgZWRuKCJOb3J3ZWdpYW4gKE5vcndheSwgQm9rbSIpOwogICAgZWRuICs9IChVQ2hhcjMyKTB4MDBlNTsKICAgIGVkbiArPSAibCkiOwogICAgVW5pY29kZVN0cmluZyBlbmdsaXNoRGlzcGxheU5hbWVzIFtdID0geyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vcndlZ2lhbiAoTm9yd2F5KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAiTm9yd2VnaWFuIChOb3J3YXksQikiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8iTm9yd2VnaWFuIChOb3J3YXksTlkpIiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3J3ZWdpYW4gKE5vcndheSwgTnlub3JzaykiIAogICAgfTsKICAgIFVuaWNvZGVTdHJpbmcgbmRuKCJub3JzayAoTm9yZ2UsIEJva20iKTsKICAgIG5kbiArPSAoVUNoYXIzMikweDAwZTU7CiAgICBuZG4gKz0gImwpIjsKICAgIFVuaWNvZGVTdHJpbmcgbm9yd2VnaWFuRGlzcGxheU5hbWVzIFtdID0geyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vcnNrIChOb3JnZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyJub3JzayAoTm9yZ2UsQikiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIm5vcnNrIChOb3JnZSxOWSkiIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vcnNrIChOb3JlZywgTnlub3JzaykiIAogICAgfTsKCiAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICAgICBMb2NhbGUgbG9jID0gbG9jYWxlc1tpXTsKICAgICAgICBVbmljb2RlU3RyaW5nIHRlbXA7CiAgICAgICAgaWYgKGxvYy5nZXREaXNwbGF5TmFtZSh0ZW1wKSAhPSBlbmdsaXNoRGlzcGxheU5hbWVzW2ldKQogICAgICAgICAgIGVycmxuKCJFbmdsaXNoIGRpc3BsYXktbmFtZSBtaXNtYXRjaDogZXhwZWN0ZWQgIiArCiAgICAgICAgICAgICAgICAgICBlbmdsaXNoRGlzcGxheU5hbWVzW2ldICsgIiwgZ290ICIgKyBsb2MuZ2V0RGlzcGxheU5hbWUodGVtcCkpOwogICAgICAgIGlmIChsb2MuZ2V0RGlzcGxheU5hbWUobG9jLCB0ZW1wKSAhPSBub3J3ZWdpYW5EaXNwbGF5TmFtZXNbaV0pCiAgICAgICAgICAgIGVycmxuKCJOb3J3ZWdpYW4gZGlzcGxheS1uYW1lIG1pc21hdGNoOiBleHBlY3RlZCAiICsKICAgICAgICAgICAgICAgICAgIG5vcndlZ2lhbkRpc3BsYXlOYW1lc1tpXSArICIsIGdvdCAiICsKICAgICAgICAgICAgICAgICAgIGxvYy5nZXREaXNwbGF5TmFtZShsb2MsIHRlbXApKTsKICAgIH0KfQoKdm9pZApMb2NhbGVUZXN0OjpUZXN0VmFyaWFudFBhcnNpbmcoKQp7CiAgICBMb2NhbGUgZW5fVVNfY3VzdG9tKCJlbiIsICJVUyIsICJEZSBBbnphX0N1cGVydGlub19DYWxpZm9ybmlhX1VuaXRlZCBTdGF0ZXNfRWFydGgiKTsKCiAgICBVbmljb2RlU3RyaW5nIGRpc3BOYW1lKCJFbmdsaXNoIChVbml0ZWQgU3RhdGVzLCBERSBBTlpBX0NVUEVSVElOT19DQUxJRk9STklBX1VOSVRFRCBTVEFURVNfRUFSVEgpIik7CiAgICBVbmljb2RlU3RyaW5nIGRpc3BWYXIoIkRFIEFOWkFfQ1VQRVJUSU5PX0NBTElGT1JOSUFfVU5JVEVEIFNUQVRFU19FQVJUSCIpOwogICAgCiAgICBVbmljb2RlU3RyaW5nIGdvdDsKICAgIAogICAgZW5fVVNfY3VzdG9tLmdldERpc3BsYXlWYXJpYW50KExvY2FsZTo6Z2V0VVMoKSwgZ290KTsKICAgIGlmKGdvdCAhPSBkaXNwVmFyKSB7CiAgICAgICAgZXJybG4oIkZBSUw6IGdldERpc3BsYXlWYXJpYW50KCkiKTsKICAgICAgICBlcnJsbigiV2FudGVkOiAiICsgZGlzcFZhcik7CiAgICAgICAgZXJybG4oIkdvdCAgIDogIiArIGdvdCk7CiAgICB9CgogICAgZW5fVVNfY3VzdG9tLmdldERpc3BsYXlOYW1lKExvY2FsZTo6Z2V0VVMoKSwgZ290KTsKICAgIGlmKGdvdCAhPSBkaXNwTmFtZSkgewogICAgICAgIGVycmxuKCJGQUlMOiBnZXREaXNwbGF5TmFtZSgpIik7CiAgICAgICAgZXJybG4oIldhbnRlZDogIiArIGRpc3BOYW1lKTsKICAgICAgICBlcnJsbigiR290ICAgOiAiICsgZ290KTsKICAgIH0KCiAgICBMb2NhbGUgc2hvcnRWYXJpYW50KCJmciIsICJGUiIsICJmb28iKTsKICAgIHNob3J0VmFyaWFudC5nZXREaXNwbGF5VmFyaWFudChnb3QpOwogICAgCiAgICBpZihnb3QgIT0gIkZPTyIpIHsKICAgICAgICBlcnJsbigiRkFJTDogZ2V0RGlzcGxheVZhcmlhbnQoKSIpOwogICAgICAgIGVycmxuKCJXYW50ZWQ6IGZvbyIpOwogICAgICAgIGVycmxuKCJHb3QgICA6ICIgKyBnb3QpOwogICAgfQoKICAgIExvY2FsZSBib2d1c1ZhcmlhbnQoImZyIiwgIkZSIiwgIl9mb28iKTsKICAgIGJvZ3VzVmFyaWFudC5nZXREaXNwbGF5VmFyaWFudChnb3QpOwogICAgCiAgICBpZihnb3QgIT0gIkZPTyIpIHsKICAgICAgICBlcnJsbigiRkFJTDogZ2V0RGlzcGxheVZhcmlhbnQoKSIpOwogICAgICAgIGVycmxuKCJXYW50ZWQ6IGZvbyIpOwogICAgICAgIGVycmxuKCJHb3QgICA6ICIgKyBnb3QpOwogICAgfQoKICAgIExvY2FsZSBib2d1c1ZhcmlhbnQyKCJmciIsICJGUiIsICJmb29fIik7CiAgICBib2d1c1ZhcmlhbnQyLmdldERpc3BsYXlWYXJpYW50KGdvdCk7CiAgICAKICAgIGlmKGdvdCAhPSAiRk9PIikgewogICAgICAgIGVycmxuKCJGQUlMOiBnZXREaXNwbGF5VmFyaWFudCgpIik7CiAgICAgICAgZXJybG4oIldhbnRlZDogZm9vIik7CiAgICAgICAgZXJybG4oIkdvdCAgIDogIiArIGdvdCk7CiAgICB9CgogICAgTG9jYWxlIGJvZ3VzVmFyaWFudDMoImZyIiwgIkZSIiwgIl9mb29fIik7CiAgICBib2d1c1ZhcmlhbnQzLmdldERpc3BsYXlWYXJpYW50KGdvdCk7CiAgICAKICAgIGlmKGdvdCAhPSAiRk9PIikgewogICAgICAgIGVycmxuKCJGQUlMOiBnZXREaXNwbGF5VmFyaWFudCgpIik7CiAgICAgICAgZXJybG4oIldhbnRlZDogZm9vIik7CiAgICAgICAgZXJybG4oIkdvdCAgIDogIiArIGdvdCk7CiAgICB9Cn0KCiNpZiAhVUNPTkZJR19OT19GT1JNQVRUSU5HCgovKioKICogQGJ1ZyA0MTA1ODI4CiAqIEN1cnJlbmN5IHN5bWJvbCBpbiB6aCBpcyB3cm9uZy4gIFdlIHdpbGwgdGVzdCB0aGlzIGF0IHRoZSBOdW1iZXJGb3JtYXQKICogZW5kIHRvIHRlc3QgdGhlIHdob2xlIHBpcGUuCiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0NDEwNTgyOCgpIAp7CiAgICBMb2NhbGUgTE9DIFtdID0geyBMb2NhbGU6OmdldENoaW5lc2UoKSwgIExvY2FsZSgiemgiLCAiQ04iLCAiIiksCiAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgiemgiLCAiVFciLCAiIiksIExvY2FsZSgiemgiLCAiSEsiLCAiIikgfTsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgTnVtYmVyRm9ybWF0ICpmbXQgPSBOdW1iZXJGb3JtYXQ6OmNyZWF0ZVBlcmNlbnRJbnN0YW5jZShMT0NbaV0sIHN0YXR1cyk7CiAgICAgICAgaWYoVV9GQUlMVVJFKHN0YXR1cykpIHsKICAgICAgICAgICAgZXJybG4oIkNvdWxkbid0IGNyZWF0ZSBOdW1iZXJGb3JtYXQiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBVbmljb2RlU3RyaW5nIHJlc3VsdDsKICAgICAgICBGaWVsZFBvc2l0aW9uIHBvcygwKTsKICAgICAgICBmbXQtPmZvcm1hdCgoaW50MzJfdCkxLCByZXN1bHQsIHBvcyk7CiAgICAgICAgVW5pY29kZVN0cmluZyB0ZW1wOwogICAgICAgIGlmKHJlc3VsdCAhPSAiMTAwJSIpIHsKICAgICAgICAgICAgZXJybG4oVW5pY29kZVN0cmluZygiUGVyY2VudCBmb3IgIikgKyBMT0NbaV0uZ2V0RGlzcGxheU5hbWUodGVtcCkgKyAiIHNob3VsZCBiZSAxMDAlLCBnb3QgIiArIHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIGRlbGV0ZSBmbXQ7CiAgICB9Cn0KCiNlbmRpZgoKLy8gVGVzdHMgc2V0Qm9ndXMgYW5kIGlzQm9ndXMgQVBJcyBmb3IgTG9jYWxlCi8vIEppdHRlcmJ1ZyAxNzM1CnZvaWQKTG9jYWxlVGVzdDo6VGVzdFNldElzQm9ndXMoKSB7CiAgTG9jYWxlIGwoImVuX1VTIik7CiAgbC5zZXRUb0JvZ3VzKCk7CiAgaWYobC5pc0JvZ3VzKCkgIT0gVFJVRSkgewogICAgZXJybG4oIkFmdGVyIHNldHRpbmcgYm9ndXMsIGRpZG4ndCByZXR1cm4gVFJVRSIpOwogIH0KICBsID0gImVuX1VTIjsgLy8gVGhpcyBzaG91bGQgcmVzZXQgYm9ndXMKICBpZihsLmlzQm9ndXMoKSAhPSBGQUxTRSkgewogICAgZXJybG4oIkFmdGVyIHJlc2V0dGluZyBib2d1cywgZGlkbid0IHJldHVybiBGQUxTRSIpOwogIH0KfQoK