LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENPUFlSSUdIVDogCiAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDAxLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZAogKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJsb2N0ZXN0LmgiCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjc3RyaW5nLmg+CgojaW5jbHVkZSAidW5pY29kZS9kZWNpbWZtdC5oIgovLyNpbmNsdWRlICJ1bmljb2RlL2RhdGVmbXQuaCIKI2luY2x1ZGUgInVuaWNvZGUvc21wZHRmbXQuaCIKCmNvbnN0IGNoYXIqIHJhd0RhdGFbMjddWzddID0gewoKICAgICAgICAvLyBsYW5ndWFnZSBjb2RlCiAgICAgICAgeyAgICJlbiIsICAgImZyIiwgICAiaHIiLCAgICJlbCIsICAgIm5vIiwgICAiaXQiLCAgICJ4eCIgICAgfSwKICAgICAgICAvLyBjb3VudHJ5IGNvZGUKICAgICAgICB7ICAgIlVTIiwgICAiRlIiLCAgICJIUiIsICAgIkdSIiwgICAiTk8iLCAgICIiLCAgICAgIllZIiAgICB9LAogICAgICAgIC8vIHZhcmlhbnQgY29kZQogICAgICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOWSIsICAgIiIsICAgICAiIiAgICB9LAogICAgICAgIC8vIGZ1bGwgbmFtZQogICAgICAgIHsgICAiZW5fVVMiLCAgICAiZnJfRlIiLCAgICAiaHJfSFIiLCAgICAiZWxfR1IiLCAgICAibm9fTk9fTlkiLCAiaXQiLCAgICJ4eF9ZWSIgIH0sCiAgICAgICAgLy8gSVNPLTMgbGFuZ3VhZ2UKICAgICAgICB7ICAgImVuZyIsICAiZnJhIiwgICJocnYiLCAgImVsbCIsICAibm9yIiwgICJpdGEiLCAgIiIgICB9LAogICAgICAgIC8vIElTTy0zIGNvdW50cnkKICAgICAgICB7ICAgIlVTQSIsICAiRlJBIiwgICJIUlYiLCAgIkdSQyIsICAiTk9SIiwgICIiLCAgICAgIiIgICB9LAogICAgICAgIC8vIExDSUQgKG5vdCBjdXJyZW50bHkgcHVibGljKQogICAgICAgIHsgICAiNDA5IiwgIjQwYyIsICI0MWEiLCAiNDA4IiwgIjgxNCIsICIiLCAgICAgIiIgIH0sCgogICAgICAgIC8vIGRpc3BsYXkgbGFuZ2FnZSAoRW5nbGlzaCkKICAgICAgICB7ICAgIkVuZ2xpc2giLCAgIkZyZW5jaCIsICAgIkNyb2F0aWFuIiwgIkdyZWVrIiwgICAgIk5vcndlZ2lhbiIsICAgICJJdGFsaWFuIiwgICJ4eCIgfSwKICAgICAgICAvLyBkaXNwbGF5IGNvdW50cnkgKEVuZ2xpc2gpCiAgICAgICAgeyAgICJVbml0ZWQgU3RhdGVzIiwgICAgIkZyYW5jZSIsICAgIkNyb2F0aWEiLCAgIkdyZWVjZSIsICAgIk5vcndheSIsICAgIiIsICAgICAiWVkiIH0sCiAgICAgICAgLy8gZGlzcGxheSB2YXJpYW50IChFbmdsaXNoKQogICAgICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOeW5vcnNrIiwgICAiIiwgICAgICIifSwKICAgICAgICAvL3sgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOWSIsICAgIiIsICAgICAiIn0sCiAgICAgICAgLy8gZGlzcGxheSBuYW1lIChFbmdsaXNoKQogICAgICAgIC8vIFVwZGF0ZWQgbm9fTk9fTlkgRW5nbGlzaCBkaXNwbGF5IG5hbWUgZm9yIG5ldyBwYXR0ZXJuLWJhc2VkIGFsZ29yaXRobQogICAgICAgIC8vIChwYXJ0IG9mIEV1cm8gc3VwcG9ydCkuCiAgICAgICAgeyAgICJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSIsICJGcmVuY2ggKEZyYW5jZSkiLCAiQ3JvYXRpYW4gKENyb2F0aWEpIiwgIkdyZWVrIChHcmVlY2UpIiwgIk5vcndlZ2lhbiAoTm9yd2F5LCBOeW5vcnNrKSIsICJJdGFsaWFuIiwgInh4IChZWSkiIH0sCiAgICAgICAgLy97ICAgIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIiwgIkZyZW5jaCAoRnJhbmNlKSIsICJDcm9hdGlhbiAoQ3JvYXRpYSkiLCAiR3JlZWsgKEdyZWVjZSkiLCAiTm9yd2VnaWFuIChOb3J3YXksTlkpIiwgIkl0YWxpYW4iLCAieHggKFlZKSIgfSwKCiAgICAgICAgLy8gZGlzcGxheSBsYW5nYWdlIChGcmVuY2gpCiAgICAgICAgeyAgICJhbmdsYWlzIiwgICJmcmFuXFx1MDBFN2FpcyIsICAgImNyb2F0ZSIsICJncmVjIiwgICAgIm5vcnZcXHUwMEU5Z2llbiIsICAgICJpdGFsaWVuIiwgInh4IiB9LAogICAgICAgIC8vIGRpc3BsYXkgY291bnRyeSAoRnJlbmNoKQogICAgICAgIHsgICAiXFx1MDBDOXRhdHMtVW5pcyIsICAgICJGcmFuY2UiLCAgICJDcm9hdGllIiwgICJHclxcdTAwRThjZSIsICAgIk5vcnZcXHUwMEU4Z2UiLCAiIiwgICAgICJZWSIgfSwKICAgICAgICAvLyBkaXNwbGF5IHZhcmlhbnQgKEZyZW5jaCkKICAgICAgICB7ICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiTnlub3JzayIsICAgICAiIiwgICAgICIiIH0sCiAgICAgICAgLy8gZGlzcGxheSBuYW1lIChGcmVuY2gpCiAgICAgICAgLy97ICAgImFuZ2xhaXMgKMl0YXRzLVVuaXMpIiwgImZyYW7nYWlzIChGcmFuY2UpIiwgImNyb2F0ZSAoQ3JvYXRpZSkiLCAiZ3JlYyAoR3LoY2UpIiwgIm5vcnbpZ2llbiAoTm9yduhnZSxOeW5vcnNrKSIsICJpdGFsaWVuIiwgInh4IChZWSkiIH0sCiAgICAgICAgeyAgICJhbmdsYWlzIChcXHUwMEM5dGF0cy1VbmlzKSIsICJmcmFuXFx1MDBFN2FpcyAoRnJhbmNlKSIsICJjcm9hdGUgKENyb2F0aWUpIiwgImdyZWMgKEdyXFx1MDBFOGNlKSIsICJub3J2XFx1MDBFOWdpZW4gKE5vcnZcXHUwMEU4Z2UsIE55bm9yc2spIiwgIml0YWxpZW4iLCAieHggKFlZKSIgfSwgLy8gU1RJTEwgbm90IHJpZ2h0CgogICAgICAgIC8vIGRpc3BsYXkgbGFuZ2FnZSAoQ3JvYXRpYW4pCiAgICAgICAgeyAgICIiLCAgIiIsICJocnZhdHNraSIsICIiLCAgICAiIiwgIiIsICJ4eCIgfSwKICAgICAgICAvLyBkaXNwbGF5IGNvdW50cnkgKENyb2F0aWFuKQogICAgICAgIHsgICAiIiwgICAgIiIsICAgIkhydmF0c2thIiwgICIiLCAgICIiLCAiIiwgIllZIiB9LAogICAgICAgIC8vIGRpc3BsYXkgdmFyaWFudCAoQ3JvYXRpYW4pCiAgICAgICAgeyAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICIiLCAiIn0sCiAgICAgICAgLy8gZGlzcGxheSBuYW1lIChDcm9hdGlhbikKICAgICAgICB7ICAgIiIsICIiLCAiaHJ2YXRza2kgKEhydmF0c2thKSIsICIiLCAiIiwgICIiLCAieHggKFlZKSIgfSwKCiAgICAgICAgLy8gZGlzcGxheSBsYW5nYWdlIChHcmVlaylbYWN0dWFsIHZhbHVlcyBsaXN0ZWQgYmVsb3ddCiAgICAgICAgeyAgICJcXHUwMzkxXFx1MDNiM1xcdTAzYjNcXHUwM2JiXFx1MDNiOVxcdTAzYmFcXHUwM2FjIiwgIlxcdTAzOTNcXHUwM2IxXFx1MDNiYlxcdTAzYmJcXHUwM2I5XFx1MDNiYVxcdTAzYWMiLCAiXFx1MDM5YVxcdTAzYzFcXHUwM2JmXFx1MDNiMVxcdTAzYzRcXHUwM2I5XFx1MDNiYVxcdTAzYWMiLCAiIiwgICAgIlxcdTAzOWRcXHUwM2JmXFx1MDNjMVxcdTAzYjJcXHUwM2I3XFx1MDNiM1xcdTAzYjlcXHUwM2JhXFx1MDNhYyIsICIiLCAiIiB9LAogICAgICAgIC8vIGRpc3BsYXkgY291bnRyeSAoR3JlZWspW2FjdHVhbCB2YWx1ZXMgbGlzdGVkIGJlbG93XQogICAgICAgIHsgICAiXFx1MDM5N1xcdTAzYmRcXHUwM2M5XFx1MDNiY1xcdTAzYWRcXHUwM2JkXFx1MDNiNVxcdTAzYzIgXFx1MDNhMFxcdTAzYmZcXHUwM2JiXFx1MDNiOVxcdTAzYzRcXHUwM2I1XFx1MDNhZlxcdTAzYjVcXHUwM2MyIFxcdTAzOTFcXHUwM2JjXFx1MDNiNVxcdTAzYzFcXHUwM2I5XFx1MDNiYVxcdTAzYWVcXHUwM2MyIiwgIlxcdTAzOTNcXHUwM2IxXFx1MDNiYlxcdTAzYmJcXHUwM2FmXFx1MDNiMSIsICJcXHUwMzlhXFx1MDNjMVxcdTAzYmZcXHUwM2IxXFx1MDNjNFxcdTAzYWZcXHUwM2IxIiwgIiIsICAgICJcXHUwMzlkXFx1MDNiZlxcdTAzYzFcXHUwM2IyXFx1MDNiN1xcdTAzYjNcXHUwM2FmXFx1MDNiMSIsICIiLCAiIiB9LAogICAgICAgIC8vIGRpc3BsYXkgdmFyaWFudCAoR3JlZWspCiAgICAgICAgeyAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICIiLCAiIiB9LAogICAgICAgIC8vIGRpc3BsYXkgbmFtZSAoR3JlZWspW2FjdHVhbCB2YWx1ZXMgbGlzdGVkIGJlbG93XQogICAgICAgIHsgICAiXFx1MDM5MVxcdTAzYjNcXHUwM2IzXFx1MDNiYlxcdTAzYjlcXHUwM2JhXFx1MDNhYyAoXFx1MDM5N1xcdTAzYmRcXHUwM2M5XFx1MDNiY1xcdTAzYWRcXHUwM2JkXFx1MDNiNVxcdTAzYzIgXFx1MDNhMFxcdTAzYmZcXHUwM2JiXFx1MDNiOVxcdTAzYzRcXHUwM2I1XFx1MDNhZlxcdTAzYjVcXHUwM2MyIFxcdTAzOTFcXHUwM2JjXFx1MDNiNVxcdTAzYzFcXHUwM2I5XFx1MDNiYVxcdTAzYWVcXHUwM2MyKSIsICJcXHUwMzkzXFx1MDNiMVxcdTAzYmJcXHUwM2JiXFx1MDNiOVxcdTAzYmFcXHUwM2FjIChcXHUwMzkzXFx1MDNiMVxcdTAzYmJcXHUwM2JiXFx1MDNhZlxcdTAzYjEpIiwgIlxcdTAzOWFcXHUwM2MxXFx1MDNiZlxcdTAzYjFcXHUwM2M0XFx1MDNiOVxcdTAzYmFcXHUwM2FjIChcXHUwMzlhXFx1MDNjMVxcdTAzYmZcXHUwM2IxXFx1MDNjNFxcdTAzYWZcXHUwM2IxKSIsICIiLCAgICAiXFx1MDM5ZFxcdTAzYmZcXHUwM2MxXFx1MDNiMlxcdTAzYjdcXHUwM2IzXFx1MDNiOVxcdTAzYmFcXHUwM2FjIChcXHUwMzlkXFx1MDNiZlxcdTAzYzFcXHUwM2IyXFx1MDNiN1xcdTAzYjNcXHUwM2FmXFx1MDNiMSwgTnlub3JzaykiLCAiIiwgIiIgfSwKCiAgICAgICAgLy8gZGlzcGxheSBsYW5nYWdlICg8cm9vdD4pCiAgICAgICAgeyAgICJFbmdsaXNoIiwgICJGcmVuY2giLCAgICJDcm9hdGlhbiIsICJHcmVlayIsICAgICJOb3J3ZWdpYW4iLCAgICAiSXRhbGlhbiIsICAieHgiIH0sCiAgICAgICAgLy8gZGlzcGxheSBjb3VudHJ5ICg8cm9vdD4pCiAgICAgICAgeyAgICJVbml0ZWQgU3RhdGVzIiwgICAgIkZyYW5jZSIsICAgIkNyb2F0aWEiLCAgIkdyZWVjZSIsICAgIk5vcndheSIsICAgIiIsICAgICAiWVkiIH0sCiAgICAgICAgLy8gZGlzcGxheSB2YXJpYW50ICg8cm9vdD4pCiAgICAgICAgeyAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIk55bm9yc2siLCAgICIiLCAgICAgIiJ9LAogICAgICAgIC8vIGRpc3BsYXkgbmFtZSAoPHJvb3Q+KQogICAgICAgIC8veyAgICJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSIsICJGcmVuY2ggKEZyYW5jZSkiLCAiQ3JvYXRpYW4gKENyb2F0aWEpIiwgIkdyZWVrIChHcmVlY2UpIiwgIk5vcndlZ2lhbiAoTm9yd2F5LE55bm9yc2spIiwgIkl0YWxpYW4iLCAieHggKFlZKSIgfSwKICAgICAgICB7ICAgIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIiwgIkZyZW5jaCAoRnJhbmNlKSIsICJDcm9hdGlhbiAoQ3JvYXRpYSkiLCAiR3JlZWsgKEdyZWVjZSkiLCAiTm9yd2VnaWFuIChOb3J3YXksTlkpIiwgIkl0YWxpYW4iLCAieHggKFlZKSIgfQp9OwoKLy8gKiB0ZXN0IG1hY3JvcwovKgogVXNhZ2U6CiAgICB0ZXN0X2NvbXBhcmUoICAgIEZ1bmN0aW9uIHRvIGJlIHBlcmZvcm1lZCwKICAgICAgICAgICAgICAgICAgICAgICBUZXN0IG9mIHRoZSBmdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCByZXN1bHQgb2YgdGhlIHRlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRhYmxlIHJlc3VsdAogICAgICAgICAgICAgICAgICApCgogICBFeGFtcGxlOgogICAgICAgdGVzdF9jb21wYXJlKGk9MyxpLDMsIHNvbWVOdW1iZXJGb3JtYXR0ZXIoaSkpOwogICAgICAgdGVzdF9jb21wYXJlKDAsMSsxLDIsc29tZU51bWJlckZvcm1hdHRlcigxKzEpKTsgCgogICBOb3RlIHRoYXQgaW4gdGhlIHNlY29uZCBleGFtcGxlIHRoZSBleHByZXNzaW9uIGlzIDAsIGJlY2F1c2UgdGhlIGZjbiBwcm9kdWNlcyBpdCdzIG93biByZXN1bHQuCgogICBNYWNybyBpcyB1Z2x5IGJ1dCBtYWtlcyB0aGUgdGVzdHMgcHJldHR5LgoqLwoKI2RlZmluZSB0ZXN0X2NvbXBhcmUoZXhwcmVzc2lvbix0ZXN0LGV4cGVjdGVkLHByaW50YWJsZVJlc3VsdCkgXAogICAgeyBcCiAgICAgICAgZXhwcmVzc2lvbjsgXAogICAgICAgIFwKICAgICAgICBpZigodGVzdCkgIT0gKGV4cGVjdGVkKSkgXAogICAgICAgICAgICBlcnJsbigiRkFJTDogIiArIFVuaWNvZGVTdHJpbmcoI2V4cHJlc3Npb24pICsgIjsgLT4gIiArIHByaW50YWJsZVJlc3VsdCArICJcbiIgKyBcCiAgICAgICAgICAgICAgICAgICAgIiAgICgiICsgVW5pY29kZVN0cmluZygjdGVzdCkgKyAiICE9ICIgKyBVbmljb2RlU3RyaW5nKCNleHBlY3RlZCkgKyAiKSIgKTsgXAogICAgICAgIGVsc2UgXAogICAgICAgICAgICBsb2dsbihVbmljb2RlU3RyaW5nKCNleHByZXNzaW9uKSArICIgLT4gIiArIHByaW50YWJsZVJlc3VsdCArICIgKCIgKyBVbmljb2RlU3RyaW5nKCN0ZXN0KSArICIpIik7IFwKICAgIH0KCgoKCi8qCiBVc2FnZToKICAgIHRlc3RfYXNzZXJ0X3ByaW50KCAgICBUZXN0IChzaG91bGQgYmUgVFJVRSksICBwcmludGFibGUgICkKCiAgIEV4YW1wbGU6CiAgICAgICB0ZXN0X2Fzc2VydChpPT0zLCB0b1N0cmluZyhpKSk7CgogICB0aGUgbWFjcm8gaXMgdWdseSBidXQgbWFrZXMgdGhlIHRlc3RzIHByZXR0eS4KKi8KCiNkZWZpbmUgdGVzdF9hc3NlcnRfcHJpbnQodGVzdCxwcmludCkgXAogICAgeyBcCiAgICAgICAgaWYoISh0ZXN0KSkgXAogICAgICAgICAgICBlcnJsbigiRkFJTDogIiArIFVuaWNvZGVTdHJpbmcoI3Rlc3QpICsgIiB3YXMgbm90IHRydWUuIiArICItPiAiICsgVW5pY29kZVN0cmluZyhwcmludCkgKTsgXAogICAgICAgIGVsc2UgXAogICAgICAgICAgICBsb2dsbigiUEFTUzogYXNzZXJ0ZWQgIiArIFVuaWNvZGVTdHJpbmcoI3Rlc3QpICsgIi0+ICIgKyBVbmljb2RlU3RyaW5nKHByaW50KSk7IFwKICAgIH0KCgojZGVmaW5lIHRlc3RfZHVtcExvY2FsZShsKSB7IFVuaWNvZGVTdHJpbmcgcyhsLmdldE5hbWUoKSwiIik7IGxvZ2xuKCNsICsgVW5pY29kZVN0cmluZygiID0gIikgKyBzKTsgfQoKTG9jYWxlVGVzdDo6TG9jYWxlVGVzdCgpCjogZGF0YVRhYmxlKE5VTEwpCnsKICAgIHNldFVwRGF0YVRhYmxlKCk7Cn0KCkxvY2FsZVRlc3Q6On5Mb2NhbGVUZXN0KCkKewogICAgaWYgKGRhdGFUYWJsZSAhPSAwKSB7CiAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMjc7IGkrKykgewogICAgICAgICAgICBkZWxldGUgW11kYXRhVGFibGVbaV07CiAgICAgICAgfQogICAgICAgIGRlbGV0ZSBbXWRhdGFUYWJsZTsKICAgICAgICBkYXRhVGFibGUgPSAwOwogICAgfQp9CgojZGVmaW5lIENBU0UoaWQsdGVzdCkgY2FzZSBpZDogbmFtZSA9ICN0ZXN0OyBpZiAoZXhlYykgeyBsb2dsbigjdGVzdCAiLS0tIik7IGxvZ2xuKChVbmljb2RlU3RyaW5nKSIiKTsgdGVzdCgpOyB9IGJyZWFrOwoKdm9pZCBMb2NhbGVUZXN0OjpydW5JbmRleGVkVGVzdCggaW50MzJfdCBpbmRleCwgVUJvb2wgZXhlYywgY29uc3QgY2hhciogJm5hbWUsIGNoYXIqIC8qcGFyKi8gKQp7CiAgICBpZiAoZXhlYykgbG9nbG4oIlRlc3RTdWl0ZSBMb2NhbGVUZXN0OiAiKTsKICAgIHN3aXRjaCAoaW5kZXgpIHsKICAgICAgICBjYXNlIDA6IG5hbWUgPSAiVGVzdEJhc2ljR2V0dGVycyI7IGlmIChleGVjKSBUZXN0QmFzaWNHZXR0ZXJzKCk7IGJyZWFrOwogICAgICAgIGNhc2UgMTogbmFtZSA9ICJUZXN0U2ltcGxlUmVzb3VyY2VJbmZvIjsgaWYgKGV4ZWMpIFRlc3RTaW1wbGVSZXNvdXJjZUluZm8oKTsgYnJlYWs7CiAgICAgICAgY2FzZSAyOiBuYW1lID0gIlRlc3REaXNwbGF5TmFtZXMiOyBpZiAoZXhlYykgVGVzdERpc3BsYXlOYW1lcygpOyBicmVhazsKICAgICAgICBjYXNlIDM6IG5hbWUgPSAiVGVzdFNpbXBsZU9iamVjdFN0dWZmIjsgaWYgKGV4ZWMpIFRlc3RTaW1wbGVPYmplY3RTdHVmZigpOyBicmVhazsKICAgICAgICBjYXNlIDQ6IG5hbWUgPSAiVGVzdFBPU0lYUGFyc2luZyI7IGlmIChleGVjKSBUZXN0UE9TSVhQYXJzaW5nKCk7IGJyZWFrOwogICAgICAgIGNhc2UgNTogbmFtZSA9ICJUZXN0R2V0QXZhaWxhYmxlTG9jYWxlcyI7IGlmIChleGVjKSBUZXN0R2V0QXZhaWxhYmxlTG9jYWxlcygpOyBicmVhazsKICAgICAgICBjYXNlIDY6IG5hbWUgPSAiVGVzdERhdGFEaXJlY3RvcnkiOyBpZiAoZXhlYykgVGVzdERhdGFEaXJlY3RvcnkoKTsgYnJlYWs7CgogICAgICAgIENBU0UoNywgVGVzdElTTzNGYWxsYmFjaykKICAgICAgICBDQVNFKDgsIFRlc3RHZXRMYW5nc0FuZENvdW50cmllcykKICAgICAgICBDQVNFKDksIFRlc3Q0MTI2ODgwKQogICAgICAgIENBU0UoMTAsIFRlc3RCdWc0MTM1MzE2KQogICAgICAgIENBU0UoMTEsIFRlc3RTaW1wbGVEaXNwbGF5TmFtZXMpCiAgICAgICAgQ0FTRSgxMiwgVGVzdFVuaW5zdGFsbGVkSVNPM05hbWVzKQogICAgICAgIENBU0UoMTMsIFRlc3RBdHlwaWNhbExvY2FsZXMpCiAgICAgICAgQ0FTRSgxNCwgVGVzdFRoYWlDdXJyZW5jeUZvcm1hdCkKICAgICAgICBDQVNFKDE1LCBUZXN0RXVyb1N1cHBvcnQpCiAgICAgICAgQ0FTRSgxNiwgVGVzdFRvU3RyaW5nKQogICAgICAgIENBU0UoMTcsIFRlc3Q0MTM5OTQwKQogICAgICAgIENBU0UoMTgsIFRlc3Q0MTQzOTUxKQogICAgICAgIENBU0UoMTksIFRlc3Q0MTQ3MzE1KQogICAgICAgIENBU0UoMjAsIFRlc3Q0MTQ3MzE3KQogICAgICAgIENBU0UoMjEsIFRlc3Q0MTQ3NTUyKQogICAgICAgIENBU0UoMjIsIFRlc3RWYXJpYW50UGFyc2luZykKICAgICAgICBDQVNFKDIzLCBUZXN0NDEwNTgyOCkKICAgICAgICBDQVNFKDI0LCBUZXN0U2V0SXNCb2d1cykKICAgICAgICBDQVNFKDI1LCBUZXN0UGFyYWxsZWxBUElWYWx1ZXMpCgogICAgICAgIGRlZmF1bHQ6IG5hbWUgPSAiIjsgYnJlYWs7IC8vbmVlZGVkIHRvIGVuZCBsb29wCiAgICB9Cn0KCnZvaWQgTG9jYWxlVGVzdDo6VGVzdEJhc2ljR2V0dGVycygpIHsKICAgIFVuaWNvZGVTdHJpbmcgICB0ZW1wOwoKICAgIGludDMyX3QgaTsKICAgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xPQ0FMRVM7IGkrKykgewogICAgICAgIExvY2FsZSB0ZXN0TG9jYWxlKHJhd0RhdGFbTEFOR11baV0sIHJhd0RhdGFbQ1RSWV1baV0sIHJhd0RhdGFbVkFSXVtpXSk7CiAgICAgICAgbG9nbG4oIlRlc3RpbmcgIiArIChVbmljb2RlU3RyaW5nKXRlc3RMb2NhbGUuZ2V0TmFtZSgpICsgIi4uLiIpOwoKICAgICAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0TGFuZ3VhZ2UoKSkgIT0gKGRhdGFUYWJsZVtMQU5HXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIExhbmd1YWdlIGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtMQU5HXVtpXSk7CiAgICAgICAgaWYgKCAodGVtcD10ZXN0TG9jYWxlLmdldENvdW50cnkoKSkgIT0gKGRhdGFUYWJsZVtDVFJZXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIENvdW50cnkgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW0NUUlldW2ldKTsKICAgICAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0VmFyaWFudCgpKSAhPSAoZGF0YVRhYmxlW1ZBUl1baV0pKQogICAgICAgICAgICBlcnJsbigiICBWYXJpYW50IGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtWQVJdW2ldKTsKICAgICAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0TmFtZSgpKSAhPSAoZGF0YVRhYmxlW05BTUVdW2ldKSkKICAgICAgICAgICAgZXJybG4oIiAgTG9jYWxlIG5hbWUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtOQU1FXVtpXSk7CiAgICB9CgogICAgbG9nbG4oIlNhbWUgdGhpbmcgd2l0aG91dCB2YXJpYW50IGNvZGVzLi4uIik7CiAgICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT0NBTEVTOyBpKyspIHsKICAgICAgICBMb2NhbGUgdGVzdExvY2FsZShyYXdEYXRhW0xBTkddW2ldLCByYXdEYXRhW0NUUlldW2ldKTsKICAgICAgICBsb2dsbigiVGVzdGluZyAiICsgKHRlbXA9dGVzdExvY2FsZS5nZXROYW1lKCkpICsgIi4uLiIpOwoKICAgICAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0TGFuZ3VhZ2UoKSkgIT0gKGRhdGFUYWJsZVtMQU5HXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIExhbmd1YWdlIGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtMQU5HXVtpXSk7CiAgICAgICAgaWYgKCAodGVtcD10ZXN0TG9jYWxlLmdldENvdW50cnkoKSkgIT0gKGRhdGFUYWJsZVtDVFJZXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIENvdW50cnkgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW0NUUlldW2ldKTsKICAgICAgICBpZiAodGVzdExvY2FsZS5nZXRWYXJpYW50KClbMF0gIT0gMCkKICAgICAgICAgICAgZXJybG4oIiAgVmFyaWFudCBjb2RlIG1pc21hdGNoOiBzb21ldGhpbmcgdmVyc3VzIFwiXCIiKTsKICAgIH0KCiAgICAvKnRlc3RzIGZvciB0aGUgZGVwcmFjdGVkIEFQSSovCiNpZmRlZiBJQ1VfTE9DSURfVVNFX0RFUFJFQ0FURVMKICAgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xPQ0FMRVM7IGkrKykgewogICAgICAgIExvY2FsZSB0ZXN0TG9jYWxlKChVbmljb2RlU3RyaW5nKXJhd0RhdGFbTEFOR11baV0sIChVbmljb2RlU3RyaW5nKXJhd0RhdGFbQ1RSWV1baV0sIChVbmljb2RlU3RyaW5nKXJhd0RhdGFbVkFSXVtpXSk7CiAgICAgICAgbG9nbG4oIlRlc3RpbmcgIiArIChVbmljb2RlU3RyaW5nKXRlc3RMb2NhbGUuZ2V0TmFtZSgpICsgIi4uLiIpOwoKICAgICAgICBpZiAoIHRlc3RMb2NhbGUuZ2V0TGFuZ3VhZ2UodGVtcCkgIT0gKFVuaWNvZGVTdHJpbmcpKGRhdGFUYWJsZVtMQU5HXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIExhbmd1YWdlIGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtMQU5HXVtpXSk7CiAgICAgICAgaWYgKCB0ZXN0TG9jYWxlLmdldENvdW50cnkodGVtcCkgIT0gKFVuaWNvZGVTdHJpbmcpKGRhdGFUYWJsZVtDVFJZXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIENvdW50cnkgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW0NUUlldW2ldKTsKICAgICAgICBpZiAoIHRlc3RMb2NhbGUuZ2V0VmFyaWFudCh0ZW1wKSAhPSAoVW5pY29kZVN0cmluZykoZGF0YVRhYmxlW1ZBUl1baV0pKQogICAgICAgICAgICBlcnJsbigiICBWYXJpYW50IGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtWQVJdW2ldKTsKICAgICAgICBpZiAoIHRlc3RMb2NhbGUuZ2V0TmFtZSh0ZW1wKSAhPSAoVW5pY29kZVN0cmluZykoZGF0YVRhYmxlW05BTUVdW2ldKSkKICAgICAgICAgICAgZXJybG4oIiAgTG9jYWxlIG5hbWUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtOQU1FXVtpXSk7CiAgICB9CiAgICBsb2dsbigiU2FtZSB0aGluZyB3aXRob3V0IHZhcmlhbnQgY29kZXMuLi4iKTsKICAgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xPQ0FMRVM7IGkrKykgewogICAgICAgIExvY2FsZSB0ZXN0TG9jYWxlKChVbmljb2RlU3RyaW5nKXJhd0RhdGFbTEFOR11baV0sIChVbmljb2RlU3RyaW5nKXJhd0RhdGFbQ1RSWV1baV0pOwogICAgICAgIGxvZ2xuKCJUZXN0aW5nICIgKyAodGVzdExvY2FsZS5nZXROYW1lKHRlbXApKSArICIuLi4iKTsKCiAgICAgICAgaWYgKCB0ZXN0TG9jYWxlLmdldExhbmd1YWdlKHRlbXApICE9IChVbmljb2RlU3RyaW5nKShkYXRhVGFibGVbTEFOR11baV0pKQogICAgICAgICAgICBlcnJsbigiICBMYW5ndWFnZSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbTEFOR11baV0pOwogICAgICAgIGlmICggdGVzdExvY2FsZS5nZXRDb3VudHJ5KHRlbXApICE9IChVbmljb2RlU3RyaW5nKShkYXRhVGFibGVbQ1RSWV1baV0pKQogICAgICAgICAgICBlcnJsbigiICBDb3VudHJ5IGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtDVFJZXVtpXSk7CiAgICAgICAgaWYgKHRlc3RMb2NhbGUuZ2V0VmFyaWFudCh0ZW1wKS5sZW5ndGgoKSAhPSAwICkKICAgICAgICAgICAgZXJybG4oIiAgVmFyaWFudCBjb2RlIG1pc21hdGNoOiBzb21ldGhpbmcgdmVyc3VzIFwiXCIiKTsKICAgIH0KCiNlbmRpZgoKICAgIGxvZ2xuKCJUZXN0aW5nIGxvbmcgbGFuZ3VhZ2UgbmFtZXMgYW5kIGdldHRlcnMiKTsKICAgIExvY2FsZSAgdGVzdDggPSBMb2NhbGU6OmNyZWF0ZUZyb21OYW1lKCJ4LWtsaW5nb24tengudXRmMzJiZUBzcGVjaWFsIik7CgogICAgdGVtcCA9IHRlc3Q4LmdldExhbmd1YWdlKCk7CiAgICBpZiAodGVtcCAhPSBVbmljb2RlU3RyaW5nKCJ4LWtsaW5nb24iKSApCiAgICAgIGVycmxuKCIgIExhbmd1YWdlIGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiAgdmVyc3VzIFwieC1rbGluZ29uXCIiKTsKCiAgICB0ZW1wID0gdGVzdDguZ2V0Q291bnRyeSgpOwogICAgaWYgKHRlbXAgIT0gVW5pY29kZVN0cmluZygiWlgiKSApCiAgICAgIGVycmxuKCIgIENvdW50cnkgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiICB2ZXJzdXMgXCJaWFwiIik7CgogICAgdGVtcCA9IHRlc3Q4LmdldFZhcmlhbnQoKTsKICAgIGlmICh0ZW1wICE9IFVuaWNvZGVTdHJpbmcoIlNQRUNJQUwiKSApCiAgICAgIGVycmxuKCIgIFZhcmlhbnQgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiICB2ZXJzdXMgXCJTUEVDSUFMXCIiKTsKCiAgICBpZiAoTG9jYWxlOjpnZXREZWZhdWx0KCkgIT0gTG9jYWxlOjpjcmVhdGVGcm9tTmFtZShOVUxMKSkKICAgICAgZXJybG4oIkxvY2FsZTo6Z2V0RGVmYXVsdCgpID09IExvY2FsZTo6Y3JlYXRlRnJvbU5hbWUoTlVMTCkiKTsKCiAgICAvKi0tLS0tLS0tLS0qLwogICAgLy8gTk9URTogVGhlcmUgdXNlZCB0byBiZSBhIHNwZWNpYWwgdGVzdCBmb3IgbG9jYWxlIG5hbWVzIHRoYXQgaGFkIGxhbmd1YWdlIG9yCiAgICAvLyBjb3VudHJ5IGNvZGVzIHRoYXQgd2VyZSBsb25nZXIgdGhhbiB0d28gbGV0dGVycy4gIFRoZSBuZXcgdmVyc2lvbiBvZiBMb2NhbGUKICAgIC8vIGRvZXNuJ3Qgc3VwcG9ydCBhbnl0aGluZyB0aGF0IGlzbid0IGFuIG9mZmljaWFsbHkgcmVjb2duaXplZCBsYW5ndWFnZSBvcgogICAgLy8gY291bnRyeSBjb2RlLCBzbyB3ZSBubyBsb25nZXIgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCn0KCnZvaWQgTG9jYWxlVGVzdDo6VGVzdFBhcmFsbGVsQVBJVmFsdWVzKCkgewogICAgbG9nbG4oIlRlc3Qgc3luY2hyb25pemF0aW9uIGJldHdlZW4gQyBhbmQgQysrIEFQSSIpOwogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldENoaW5lc2UoKS5nZXROYW1lKCksIFVMT0NfQ0hJTkVTRSkgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19DSElORVNFIExvY2FsZSIpOwogICAgfQogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldEVuZ2xpc2goKS5nZXROYW1lKCksIFVMT0NfRU5HTElTSCkgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19FTkdMSVNIIExvY2FsZSIpOwogICAgfQogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldEZyZW5jaCgpLmdldE5hbWUoKSwgVUxPQ19GUkVOQ0gpICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfRlJFTkNIIExvY2FsZSIpOwogICAgfQogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldEdlcm1hbigpLmdldE5hbWUoKSwgVUxPQ19HRVJNQU4pICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfR0VSTUFOIExvY2FsZSIpOwogICAgfQogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldEl0YWxpYW4oKS5nZXROYW1lKCksIFVMT0NfSVRBTElBTikgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19JVEFMSUFOIExvY2FsZSIpOwogICAgfQogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldEphcGFuZXNlKCkuZ2V0TmFtZSgpLCBVTE9DX0pBUEFORVNFKSAhPSAwKSB7CiAgICAgICAgZXJybG4oIkRpZmZlcmVuY2VzIGZvciBVTE9DX0pBUEFORVNFIExvY2FsZSIpOwogICAgfQogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldEtvcmVhbigpLmdldE5hbWUoKSwgVUxPQ19LT1JFQU4pICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfS09SRUFOIExvY2FsZSIpOwogICAgfQogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldFNpbXBsaWZpZWRDaGluZXNlKCkuZ2V0TmFtZSgpLCBVTE9DX1NJTVBMSUZJRURfQ0hJTkVTRSkgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19TSU1QTElGSUVEX0NISU5FU0UgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0VHJhZGl0aW9uYWxDaGluZXNlKCkuZ2V0TmFtZSgpLCBVTE9DX1RSQURJVElPTkFMX0NISU5FU0UpICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfVFJBRElUSU9OQUxfQ0hJTkVTRSBMb2NhbGUiKTsKICAgIH0KCgogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldENhbmFkYSgpLmdldE5hbWUoKSwgVUxPQ19DQU5BREEpICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfQ0FOQURBIExvY2FsZSIpOwogICAgfQogICAgaWYgKHN0cmNtcChMb2NhbGU6OmdldENhbmFkYUZyZW5jaCgpLmdldE5hbWUoKSwgVUxPQ19DQU5BREFfRlJFTkNIKSAhPSAwKSB7CiAgICAgICAgZXJybG4oIkRpZmZlcmVuY2VzIGZvciBVTE9DX0NBTkFEQV9GUkVOQ0ggTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0Q2hpbmEoKS5nZXROYW1lKCksIFVMT0NfQ0hJTkEpICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfQ0hJTkEgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0UFJDKCkuZ2V0TmFtZSgpLCBVTE9DX1BSQykgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19QUkMgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0RnJhbmNlKCkuZ2V0TmFtZSgpLCBVTE9DX0ZSQU5DRSkgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19GUkFOQ0UgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0R2VybWFueSgpLmdldE5hbWUoKSwgVUxPQ19HRVJNQU5ZKSAhPSAwKSB7CiAgICAgICAgZXJybG4oIkRpZmZlcmVuY2VzIGZvciBVTE9DX0dFUk1BTlkgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0SXRhbHkoKS5nZXROYW1lKCksIFVMT0NfSVRBTFkpICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfSVRBTFkgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0SmFwYW4oKS5nZXROYW1lKCksIFVMT0NfSkFQQU4pICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfSkFQQU4gTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0S29yZWEoKS5nZXROYW1lKCksIFVMT0NfS09SRUEpICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfS09SRUEgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0VGFpd2FuKCkuZ2V0TmFtZSgpLCBVTE9DX1RBSVdBTikgIT0gMCkgewogICAgICAgIGVycmxuKCJEaWZmZXJlbmNlcyBmb3IgVUxPQ19UQUlXQU4gTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0VUsoKS5nZXROYW1lKCksIFVMT0NfVUspICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfVUsgTG9jYWxlIik7CiAgICB9CiAgICBpZiAoc3RyY21wKExvY2FsZTo6Z2V0VVMoKS5nZXROYW1lKCksIFVMT0NfVVMpICE9IDApIHsKICAgICAgICBlcnJsbigiRGlmZmVyZW5jZXMgZm9yIFVMT0NfVVMgTG9jYWxlIik7CiAgICB9Cn0KCgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RTaW1wbGVSZXNvdXJjZUluZm8oKSB7CiAgVW5pY29kZVN0cmluZyAgIHRlbXA7CiAgY2hhciAgICAgICAgICAgIHRlbXAyWzIwXTsKICBVRXJyb3JDb2RlIGVyciA9IFVfWkVST19FUlJPUjsKICBpbnQzMl90IGkgPSAwOwoKICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT0NBTEVTOyBpKyspIHsKICAgIExvY2FsZSB0ZXN0TG9jYWxlKHJhd0RhdGFbTEFOR11baV0sIHJhd0RhdGFbQ1RSWV1baV0sIHJhd0RhdGFbVkFSXVtpXSk7CiAgICBsb2dsbigiVGVzdGluZyAiICsgKHRlbXA9dGVzdExvY2FsZS5nZXROYW1lKCkpICsgIi4uLiIpOwogICAgCiAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0SVNPM0xhbmd1YWdlKCkpICE9IChkYXRhVGFibGVbTEFORzNdW2ldKSkKICAgICAgZXJybG4oIiAgSVNPLTMgbGFuZ3VhZ2UgY29kZSBtaXNtYXRjaDogIiArIHRlbXAKICAgICAgICArICIgdmVyc3VzICIgKyBkYXRhVGFibGVbTEFORzNdW2ldKTsKICAgIGlmICggKHRlbXA9dGVzdExvY2FsZS5nZXRJU08zQ291bnRyeSgpKSAhPSAoZGF0YVRhYmxlW0NUUlkzXVtpXSkpCiAgICAgIGVycmxuKCIgIElTTy0zIGNvdW50cnkgY29kZSBtaXNtYXRjaDogIiArIHRlbXAKICAgICAgICArICIgdmVyc3VzICIgKyBkYXRhVGFibGVbQ1RSWTNdW2ldKTsKICAgIAogICAgc3ByaW50Zih0ZW1wMiwgIiV4IiwgdGVzdExvY2FsZS5nZXRMQ0lEKCkpOwogICAgaWYgKFVuaWNvZGVTdHJpbmcodGVtcDIpICE9IGRhdGFUYWJsZVtMQ0lEXVtpXSkKICAgICAgZXJybG4oKFVuaWNvZGVTdHJpbmcpIiAgTENJRCBtaXNtYXRjaDogIiArIHRlbXAyICsgIiB2ZXJzdXMgIgogICAgICAgICsgZGF0YVRhYmxlW0xDSURdW2ldKTsKCiAgICBpZihVX0ZBSUxVUkUoZXJyKSkKICAgICAgewogICAgICAgIGVycmxuKChVbmljb2RlU3RyaW5nKSJTb21lIGVycm9yIG9uIG51bWJlciAiICsgaSArIHVfZXJyb3JOYW1lKGVycikpOwogICAgICB9CiAgICBlcnIgPSBVX1pFUk9fRVJST1I7CiAgfQoKICAvKnRlc3RzIGZvciB0aGUgZGVwcmVjYXRlZCBBUEkqLwojaWZkZWYgSUNVX0xPQ0lEX1VTRV9ERVBSRUNBVEVTCiAgZm9yIChpID0gMDsgaSA8PSBNQVhfTE9DQUxFUzsgaSsrKSB7CiAgICBMb2NhbGUgdGVzdExvY2FsZSgoVW5pY29kZVN0cmluZylyYXdEYXRhW0xBTkddW2ldLCAoVW5pY29kZVN0cmluZylyYXdEYXRhW0NUUlldW2ldLCAoVW5pY29kZVN0cmluZylyYXdEYXRhW1ZBUl1baV0pOwogICAgbG9nbG4oIlRlc3RpbmcgIiArICh0ZXN0TG9jYWxlLmdldE5hbWUodGVtcCkpICsgIi4uLiIpOwogICAgCiAgICBpZiAoIHRlc3RMb2NhbGUuZ2V0SVNPM0xhbmd1YWdlKHRlbXAsIGVycikgIT0gKFVuaWNvZGVTdHJpbmcpKGRhdGFUYWJsZVtMQU5HM11baV0pKQogICAgICBlcnJsbigiICBJU08tMyBsYW5ndWFnZSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcAogICAgICAgICsgIiB2ZXJzdXMgIiArIGRhdGFUYWJsZVtMQU5HM11baV0pOwogICAgaWYgKCB0ZXN0TG9jYWxlLmdldElTTzNDb3VudHJ5KHRlbXAsIGVycikgIT0gKFVuaWNvZGVTdHJpbmcpKGRhdGFUYWJsZVtDVFJZM11baV0pKQogICAgICBlcnJsbigiICBJU08tMyBjb3VudHJ5IGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wCiAgICAgICAgKyAiIHZlcnN1cyAiICsgZGF0YVRhYmxlW0NUUlkzXVtpXSk7CiAgICAKICAgIGlmKFVfRkFJTFVSRShlcnIpKQogICAgICB7CiAgICAgICAgZXJybG4oKFVuaWNvZGVTdHJpbmcpIlNvbWUgZXJyb3Igb24gbnVtYmVyICIgKyBpICsgdV9lcnJvck5hbWUoZXJyKSk7CiAgICAgIH0KICAgIGVyciA9IFVfWkVST19FUlJPUjsKICAgfQojZW5kaWYKCiAgIExvY2FsZSBsb2NhbGUoImVuIik7CiAgIGlmKHN0cmNtcChsb2NhbGUuZ2V0TmFtZSgpLCAiZW4iKSAhPSAwfHwKICAgICAgIHN0cmNtcChsb2NhbGUuZ2V0TGFuZ3VhZ2UoKSwgImVuIikgIT0gMCkgewogICAgICAgZXJybG4oImNvbnN0cnVjdGlvbiBvZiBMb2NhbGUoZW4pIGZhaWxlZFxuIik7CiAgIH0KICAgLyotLS0tLSovCgp9Cgp2b2lkIApMb2NhbGVUZXN0OjpUZXN0RGlzcGxheU5hbWVzKCkgCnsKICAgIExvY2FsZSAgc2F2ZURlZmF1bHQgPSBMb2NhbGU6OmdldERlZmF1bHQoKTsKICAgIExvY2FsZSAgZW1wdHkoIiIsICIiKTsKICAgIExvY2FsZSAgZW5nbGlzaCgiZW4iLCAiVVMiKTsKICAgIExvY2FsZSAgZnJlbmNoKCJmciIsICJGUiIpOwogICAgTG9jYWxlICBjcm9hdGlhbigiaHIiLCAiSFIiKTsKICAgIExvY2FsZSAgZ3JlZWsoImVsIiwgIkdSIik7CiAgICBVRXJyb3JDb2RlIGVyciA9IFVfWkVST19FUlJPUjsKCiAgICBMb2NhbGU6OnNldERlZmF1bHQoZW5nbGlzaCwgZXJyKTsKICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgIGVycmxuKCJMb2NhbGU6OnNldERlZmF1bHQgcmV0dXJuZWQgZXJyb3IgY29kZSAiICsgKGludCllcnIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsb2dsbigiV2l0aCBkZWZhdWx0ID0gZW5fVVMuLi4iKTsKICAgIGxvZ2xuKCIgIEluIGRlZmF1bHQgbG9jYWxlLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZW1wdHksIERMQU5HX0VOLCBGQUxTRSk7CiAgICBsb2dsbigiICBJbiBsb2NhbGUgPSBlbl9VUy4uLiIpOwogICAgZG9UZXN0RGlzcGxheU5hbWVzKGVuZ2xpc2gsIERMQU5HX0VOLCBGQUxTRSk7CiAgICBsb2dsbigiICBJbiBsb2NhbGUgPSBmcl9GUi4uLiIpOwogICAgZG9UZXN0RGlzcGxheU5hbWVzKGZyZW5jaCwgRExBTkdfRlIsIEZBTFNFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGhyX0hSLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoY3JvYXRpYW4sIERMQU5HX0hSLCBGQUxTRSk7CiAgICBsb2dsbigiICBJbiBsb2NhbGUgPSBlbF9HUi4uLiIpOwogICAgZG9UZXN0RGlzcGxheU5hbWVzKGdyZWVrLCBETEFOR19FTCwgRkFMU0UpOwoKICAgIExvY2FsZTo6c2V0RGVmYXVsdChmcmVuY2gsIGVycik7CiAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICBlcnJsbigiTG9jYWxlOjpzZXREZWZhdWx0IHJldHVybmVkIGVycm9yIGNvZGUgIiArIChpbnQpZXJyKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbG9nbG4oIldpdGggZGVmYXVsdCA9IGZyX0ZSLi4uIik7CiAgICBsb2dsbigiICBJbiBkZWZhdWx0IGxvY2FsZS4uLiIpOwogICAgZG9UZXN0RGlzcGxheU5hbWVzKGVtcHR5LCBETEFOR19GUiwgVFJVRSk7CiAgICBsb2dsbigiICBJbiBsb2NhbGUgPSBlbl9VUy4uLiIpOwogICAgZG9UZXN0RGlzcGxheU5hbWVzKGVuZ2xpc2gsIERMQU5HX0VOLCBUUlVFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGZyX0ZSLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZnJlbmNoLCBETEFOR19GUiwgVFJVRSk7CiAgICBsb2dsbigiICBJbiBsb2NhbGUgPSBocl9IUi4uLiIpOwogICAgZG9UZXN0RGlzcGxheU5hbWVzKGNyb2F0aWFuLCBETEFOR19IUiwgVFJVRSk7CiAgICBsb2dsbigiICBJbiBsb2NhbGUgPSBlbF9HUi4uLiIpOwogICAgZG9UZXN0RGlzcGxheU5hbWVzKGdyZWVrLCBETEFOR19FTCwgVFJVRSk7CgogICAgTG9jYWxlOjpzZXREZWZhdWx0KHNhdmVEZWZhdWx0LCBlcnIpOwogICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgZXJybG4oIkxvY2FsZTo6c2V0RGVmYXVsdCByZXR1cm5lZCBlcnJvciBjb2RlICIgKyAoaW50KWVycik7CiAgICAgICAgcmV0dXJuOwogICAgfQp9CgovKgogVXNhZ2U6CiAgICB0ZXN0X2Fzc2VydCggICAgVGVzdCAoc2hvdWxkIGJlIFRSVUUpICApCgogICBFeGFtcGxlOgogICAgICAgdGVzdF9hc3NlcnQoaT09Myk7CgogICB0aGUgbWFjcm8gaXMgdWdseSBidXQgbWFrZXMgdGhlIHRlc3RzIHByZXR0eS4KKi8KCiNkZWZpbmUgdGVzdF9hc3NlcnQodGVzdCkgXAogICAgeyBcCiAgICAgICAgaWYoISh0ZXN0KSkgXAogICAgICAgICAgICBlcnJsbigiRkFJTDogIiArIFVuaWNvZGVTdHJpbmcoI3Rlc3QpICsgIiB3YXMgbm90IHRydWUuICIgKyBVbmljb2RlU3RyaW5nKF9fRklMRV9fICIgbGluZSAiKSArIF9fTElORV9fICk7IFwKICAgICAgICBlbHNlIFwKICAgICAgICAgICAgbG9nbG4oIlBBU1M6IGFzc2VydGVkICIgKyBVbmljb2RlU3RyaW5nKCN0ZXN0KSApOyBcCiAgICB9Cgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RTaW1wbGVPYmplY3RTdHVmZigpIHsKICAgIExvY2FsZSAgdGVzdDEoImFhIiwgIkFBIik7CiAgICBMb2NhbGUgIHRlc3QyKCJhYSIsICJBQSIpOwogICAgTG9jYWxlICB0ZXN0Myh0ZXN0MSk7CiAgICBMb2NhbGUgIHRlc3Q0KCJ6eiIsICJaWiIpOwogICAgTG9jYWxlICB0ZXN0NSgiYWEiLCAiQUEiLCAiIik7IAogICAgTG9jYWxlICB0ZXN0NigiYWEiLCAiQUEiLCAiQU5UQVJFUyIpOyAKICAgIExvY2FsZSAgdGVzdDcoImFhIiwgIkFBIiwgIkpVUElURVIiKTsKICAgIExvY2FsZSAgdGVzdDggPSBMb2NhbGU6OmNyZWF0ZUZyb21OYW1lKCJhYS1hYS51dGY4QGp1cGl0ZXIiKTsKCiAgICAvLyBub3cgbGlzdCB0aGVtIGFsbCBmb3IgZGVidWdnaW5nIHVzYWdlLgogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3QxKTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0Mik7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDMpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q0KTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0NSk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDYpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q3KTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0OCk7CgogICAgLy8gTWFrZSBzdXJlIHRoaW5ncyBjb21wYXJlIHRvIHRoZW1zZWx2ZXMhCiAgICB0ZXN0X2Fzc2VydCh0ZXN0MSA9PSB0ZXN0MSk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0MiA9PSB0ZXN0Mik7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0MyA9PSB0ZXN0Myk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NCA9PSB0ZXN0NCk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NSA9PSB0ZXN0NSk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiA9PSB0ZXN0Nik7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NyA9PSB0ZXN0Nyk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0OCA9PSB0ZXN0OCk7CgogICAgLy8gbWFrZSBzdXJlIHRoaW5ncyBhcmUgbm90IGVxdWFsIHRvIHRoZW1zZWx2ZXMuCiAgICB0ZXN0X2Fzc2VydCghKHRlc3QxICE9IHRlc3QxKSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QyICE9IHRlc3QyKSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QzICE9IHRlc3QzKSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3Q0ICE9IHRlc3Q0KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3Q1ICE9IHRlc3Q1KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3Q2ICE9IHRlc3Q2KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3Q3ICE9IHRlc3Q3KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3Q4ICE9IHRlc3Q4KSk7CgogICAgLy8gbWFrZSBzdXJlIHRoaW5ncyB0aGF0IGFyZSBlcXVhbCB0byBlYWNoIG90aGVyIGRvbid0IHNob3cgdXAgYXMgdW5lcXVhbC4KICAgIHRlc3RfYXNzZXJ0KCEodGVzdDEgIT0gdGVzdDIpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDIgIT0gdGVzdDEpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDEgIT0gdGVzdDMpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDIgIT0gdGVzdDMpKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q1ID09IHRlc3QxKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ICE9IHRlc3QyKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ICE9IHRlc3Q1KTsKCiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiAhPSB0ZXN0Nyk7CgogICAgLy8gdGVzdCBmb3IgdGhpbmdzIHRoYXQgc2hvdWxkbid0IGNvbXBhcmUgZXF1YWwuCiAgICB0ZXN0X2Fzc2VydCghKHRlc3QxID09IHRlc3Q0KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QyID09IHRlc3Q0KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QzID09IHRlc3Q0KSk7CgogICAgdGVzdF9hc3NlcnQodGVzdDcgPT0gdGVzdDgpOwoKICAgIC8vIHRlc3QgZm9yIGhhc2ggY29kZXMgdG8gYmUgdGhlIHNhbWUuCiAgICBpbnQzMl90IGhhc2gxID0gdGVzdDEuaGFzaENvZGUoKTsKICAgIGludDMyX3QgaGFzaDIgPSB0ZXN0Mi5oYXNoQ29kZSgpOwogICAgaW50MzJfdCBoYXNoMyA9IHRlc3QzLmhhc2hDb2RlKCk7CgogICAgdGVzdF9hc3NlcnQoaGFzaDEgPT0gaGFzaDIpOwogICAgdGVzdF9hc3NlcnQoaGFzaDEgPT0gaGFzaDMpOwogICAgdGVzdF9hc3NlcnQoaGFzaDIgPT0gaGFzaDMpOwoKICAgIC8vIHRlc3QgdGhhdCB0aGUgYXNzaWdubWVudCBvcGVyYXRvciB3b3Jrcy4KICAgIHRlc3Q0ID0gdGVzdDE7CiAgICBsb2dsbigidGVzdDQ9dGVzdDE7Iik7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDQpOwogICAgdGVzdF9hc3NlcnQodGVzdDQgPT0gdGVzdDQpOwoKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDEgIT0gdGVzdDQpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDIgIT0gdGVzdDQpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDMgIT0gdGVzdDQpKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3QxID09IHRlc3Q0KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q0ID09IHRlc3QxKTsKICAgIAogICAgLy8gdGVzdCBhc3NpZ25tZW50cyB3aXRoIGEgdmFyaWFudAogICAgbG9nbG4oInRlc3Q3ID0gdGVzdDYiKTsKICAgIHRlc3Q3ID0gdGVzdDY7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDcpOwogICAgdGVzdF9hc3NlcnQodGVzdDcgPT0gdGVzdDcpOwogICAgdGVzdF9hc3NlcnQodGVzdDcgPT0gdGVzdDYpOwogICAgdGVzdF9hc3NlcnQodGVzdDcgIT0gdGVzdDUpOwoKICAgIGxvZ2xuKCJ0ZXN0NiA9IHRlc3QxIik7CiAgICB0ZXN0Nj10ZXN0MTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0Nik7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiAhPSB0ZXN0Nyk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiA9PSB0ZXN0MSk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiA9PSB0ZXN0Nik7Cn0KCi8vIEEgY2xhc3Mgd2hpY2ggZXhwb3NlcyBjb25zdHJ1Y3RvcnMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdGhlIFBPU0lYIHBhcnNpbmcgY29kZS4KY2xhc3MgUE9TSVhMb2NhbGUgOiBwdWJsaWMgTG9jYWxlCnsKcHVibGljOgogICAgUE9TSVhMb2NhbGUoY29uc3QgVW5pY29kZVN0cmluZyYgbCkKICAgICAgICA6TG9jYWxlKCkKICAgIHsKICAgICAgY2hhciAqY2g7CiAgICAgIGNoID0gbmV3IGNoYXJbbC5sZW5ndGgoKSArIDFdOwogICAgICBjaFtsLmV4dHJhY3QoMCwgMHg3ZmZmZmZmZiwgY2gsICIiKV0gPSAwOwogICAgICBzZXRGcm9tUE9TSVhJRChjaCk7CiAgICAgIGRlbGV0ZSBbXSBjaDsKICAgIH0KICAgIFBPU0lYTG9jYWxlKGNvbnN0IGNoYXIgKmwpCiAgICAgICAgOkxvY2FsZSgpCiAgICB7CiAgICAgICAgc2V0RnJvbVBPU0lYSUQobCk7CiAgICB9Cn07Cgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RQT1NJWFBhcnNpbmcoKQp7CiAgICBQT1NJWExvY2FsZSAgdGVzdDEoImFiX0FCIik7CiAgICBQT1NJWExvY2FsZSAgdGVzdDIoVW5pY29kZVN0cmluZygiYWJfQUIiKSk7CiAgICBMb2NhbGUgIHRlc3QzKCJhYiIsIkFCIik7CgogICAgUE9TSVhMb2NhbGUgdGVzdDQoImFiX0FCX0FudGFyZXMiKTsKICAgIFBPU0lYTG9jYWxlIHRlc3Q1KFVuaWNvZGVTdHJpbmcoImFiX0FCX0FudGFyZXMiKSk7CiAgICBMb2NhbGUgIHRlc3Q2KCJhYiIsICJBQiIsICJBbnRhcmVzIik7IAoKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0MSk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDIpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3QzKTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0NCk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDUpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q2KTsKCiAgICB0ZXN0X2Fzc2VydCh0ZXN0MSA9PSB0ZXN0MSk7CgogICAgdGVzdF9hc3NlcnQodGVzdDEgPT0gdGVzdDIpOwogICAgdGVzdF9hc3NlcnQodGVzdDIgPT0gdGVzdDMpOwogICAgdGVzdF9hc3NlcnQodGVzdDMgPT0gdGVzdDEpOwoKICAgIHRlc3RfYXNzZXJ0KHRlc3Q0ID09IHRlc3Q1KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q1ID09IHRlc3Q2KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ID09IHRlc3Q0KTsKCiAgICB0ZXN0X2Fzc2VydCh0ZXN0MSAhPSB0ZXN0NCk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NSAhPSB0ZXN0Myk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NSAhPSB0ZXN0Mik7CgogICAgaW50MzJfdCBoYXNoMSA9IHRlc3QxLmhhc2hDb2RlKCk7CiAgICBpbnQzMl90IGhhc2gyID0gdGVzdDIuaGFzaENvZGUoKTsKICAgIGludDMyX3QgaGFzaDMgPSB0ZXN0My5oYXNoQ29kZSgpOwoKICAgIHRlc3RfYXNzZXJ0KGhhc2gxID09IGhhc2gyKTsKICAgIHRlc3RfYXNzZXJ0KGhhc2gyID09IGhhc2gzKTsKICAgIHRlc3RfYXNzZXJ0KGhhc2gzID09IGhhc2gxKTsKfQoKdm9pZCBMb2NhbGVUZXN0OjpUZXN0R2V0QXZhaWxhYmxlTG9jYWxlcygpCnsKICAgIGludDMyX3QgbG9jQ291bnQgPSAwOwogICAgY29uc3QgTG9jYWxlKiBsb2NMaXN0ID0gTG9jYWxlOjpnZXRBdmFpbGFibGVMb2NhbGVzKGxvY0NvdW50KTsKCiAgICBpZiAobG9jQ291bnQgPT0gMCkKICAgICAgICBlcnJsbigiZ2V0QXZhaWxhYmxlTG9jYWxlcygpIHJldHVybmVkIGFuIGVtcHR5IGxpc3QhIik7CiAgICBlbHNlIHsKICAgICAgICBsb2dsbihVbmljb2RlU3RyaW5nKCJOdW1iZXIgb2YgbG9jYWxlcyByZXR1cm5lZCA9ICIpICsgbG9jQ291bnQpOwogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGxvY0NvdW50OyArK2kpCiAgICAgICAgICAgIGxvZ2xuKGxvY0xpc3RbaV0uZ2V0TmFtZSgpKTsKICAgIH0KICAgIC8vIEkgaGF2ZSBubyBpZGVhIGhvdyB0byB0ZXN0IHRoaXMgZnVuY3Rpb24uLi4KfQoKLy8gVGhpcyB0ZXN0IGlzbid0IGFwcGxpY2FibGUgYW55bW9yZSAtIGdldElTTzNMYW5ndWFnZSBpcwovLyBpbmRlcGVuZGVudCBvZiB0aGUgZGF0YSBkaXJlY3RvcnkKdm9pZCBMb2NhbGVUZXN0OjpUZXN0RGF0YURpcmVjdG9yeSgpCnsKLyoKICAgIGNoYXIgICAgICAgICAgICBvbGREaXJlY3RvcnlbODBdOwogICAgY29uc3QgY2hhciogICAgIHRlbXA7CiAgICBVRXJyb3JDb2RlICAgICAgIGVyciA9IFVfWkVST19FUlJPUjsKICAgIFVuaWNvZGVTdHJpbmcgICB0ZXN0VmFsdWU7CgogICAgdGVtcCA9IExvY2FsZTo6Z2V0RGF0YURpcmVjdG9yeSgpOwogICAgc3RyY3B5KG9sZERpcmVjdG9yeSwgdGVtcCk7CiAgICBsb2dsbihVbmljb2RlU3RyaW5nKCJvbGREaXJlY3RvcnkgPSAiKSArIG9sZERpcmVjdG9yeSk7CgogICAgTG9jYWxlICB0ZXN0KExvY2FsZTo6VVMpOwogICAgdGVzdC5nZXRJU08zTGFuZ3VhZ2UodGVzdFZhbHVlKTsKICAgIGxvZ2xuKCJmaXJzdCBmZXRjaCBvZiBsYW5ndWFnZSByZXRyaWV2ZWQgIiArIHRlc3RWYWx1ZSk7CiAgICBpZiAodGVzdFZhbHVlICE9ICJlbmciKQogICAgICAgIGVycmxuKCJJbml0aWFsIGNoZWNrIG9mIElTTzMgbGFuZ3VhZ2UgZmFpbGVkOiBleHBlY3RlZCBcImVuZ1wiLCBnb3QgXCIiICsgdGVzdFZhbHVlICsgIlwiIik7CgogICAgewogICAgICAgIGNoYXIgKnBhdGg7CiAgICAgICAgcGF0aD1JbnRsVGVzdDo6Z2V0VGVzdERpcmVjdG9yeSgpOwogICAgICAgIExvY2FsZTo6c2V0RGF0YURpcmVjdG9yeSggcGF0aCApOwogICAgfQoKICAgIHRlc3QuZ2V0SVNPM0xhbmd1YWdlKHRlc3RWYWx1ZSk7CiAgICBsb2dsbigic2Vjb25kIGZldGNoIG9mIGxhbmd1YWdlIHJldHJpZXZlZCAiICsgdGVzdFZhbHVlKTsKICAgIGlmICh0ZXN0VmFsdWUgIT0gInh4eCIpCiAgICAgICAgZXJybG4oInNldERhdGFEaXJlY3RvcnkoKSBmYWlsZWQ6IGV4cGVjdGVkIFwieHh4XCIsIGdvdCBcIiIgKyB0ZXN0VmFsdWUgKyAiXCIiKTsKICAgIAogICAgTG9jYWxlOjpzZXREYXRhRGlyZWN0b3J5KG9sZERpcmVjdG9yeSk7CiAgICB0ZXN0LmdldElTTzNMYW5ndWFnZSh0ZXN0VmFsdWUpOwogICAgbG9nbG4oInRoaXJkIGZldGNoIG9mIGxhbmd1YWdlIHJldHJpZXZlZCAiICsgdGVzdFZhbHVlKTsKICAgIGlmICh0ZXN0VmFsdWUgIT0gImVuZyIpCiAgICAgICAgZXJybG4oImdldC9zZXREYXRhRGlyZWN0b3J5KCkgZmFpbGVkOiBleHBlY3RlZCBcImVuZ1wiLCBnb3QgXCIiICsgdGVzdFZhbHVlICsgIlwiIik7CiovCn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnZvaWQgTG9jYWxlVGVzdDo6ZG9UZXN0RGlzcGxheU5hbWVzKExvY2FsZSYgaW5Mb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29tcGFyZUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQm9vbCBkZWZhdWx0SXNGcmVuY2gpIHsKICAgIFVuaWNvZGVTdHJpbmcgICB0ZW1wOwogICAgCiAgICBpZiAoZGVmYXVsdElzRnJlbmNoICYmICh0ZW1wPUxvY2FsZTo6Z2V0RGVmYXVsdCgpLmdldExhbmd1YWdlKCkpICE9ICJmciIpCiAgICAgICAgZXJybG4oIkRlZmF1bHQgbG9jYWxlIHNob3VsZCBiZSBGcmVuY2gsIGJ1dCBpdCdzIHJlYWxseSAiICsgdGVtcCk7CiAgICBlbHNlIGlmICghZGVmYXVsdElzRnJlbmNoICYmICh0ZW1wPUxvY2FsZTo6Z2V0RGVmYXVsdCgpLmdldExhbmd1YWdlKCkpICE9ICJlbiIpCiAgICAgICAgZXJybG4oIkRlZmF1bHQgbG9jYWxlIHNob3VsZCBiZSBFbmdsaXNoLCBidXQgaXQncyByZWFsbHkgIiArIHRlbXApOwoKICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8PSBNQVhfTE9DQUxFUzsgaSsrKSB7CiAgICAgICAgTG9jYWxlIHRlc3RMb2NhbGUocmF3RGF0YVtMQU5HXVtpXSwgcmF3RGF0YVtDVFJZXVtpXSwgcmF3RGF0YVtWQVJdW2ldKTsKICAgICAgICBsb2dsbigiICBUZXN0aW5nICIgKyAodGVtcD10ZXN0TG9jYWxlLmdldE5hbWUoKSkgKyAiLi4uIik7CgogICAgICAgIFVuaWNvZGVTdHJpbmcgIHRlc3RMYW5nOwogICAgICAgIFVuaWNvZGVTdHJpbmcgIHRlc3RDdHJ5OwogICAgICAgIFVuaWNvZGVTdHJpbmcgIHRlc3RWYXI7CiAgICAgICAgVW5pY29kZVN0cmluZyAgdGVzdE5hbWU7CgogICAgICAgIGlmIChpbkxvY2FsZSA9PSBMb2NhbGUoIiIsICIiLCAiIikpIHsKICAgICAgICAgICAgdGVzdExvY2FsZS5nZXREaXNwbGF5TGFuZ3VhZ2UodGVzdExhbmcpOwogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlDb3VudHJ5KHRlc3RDdHJ5KTsKICAgICAgICAgICAgdGVzdExvY2FsZS5nZXREaXNwbGF5VmFyaWFudCh0ZXN0VmFyKTsKICAgICAgICAgICAgdGVzdExvY2FsZS5nZXREaXNwbGF5TmFtZSh0ZXN0TmFtZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlMYW5ndWFnZShpbkxvY2FsZSwgdGVzdExhbmcpOwogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlDb3VudHJ5KGluTG9jYWxlLCB0ZXN0Q3RyeSk7CiAgICAgICAgICAgIHRlc3RMb2NhbGUuZ2V0RGlzcGxheVZhcmlhbnQoaW5Mb2NhbGUsIHRlc3RWYXIpOwogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlOYW1lKGluTG9jYWxlLCB0ZXN0TmFtZSk7CiAgICAgICAgfQoKICAgICAgICBVbmljb2RlU3RyaW5nICBleHBlY3RlZExhbmc7CiAgICAgICAgVW5pY29kZVN0cmluZyAgZXhwZWN0ZWRDdHJ5OwogICAgICAgIFVuaWNvZGVTdHJpbmcgIGV4cGVjdGVkVmFyOwogICAgICAgIFVuaWNvZGVTdHJpbmcgIGV4cGVjdGVkTmFtZTsKCiAgICAgICAgZXhwZWN0ZWRMYW5nID0gZGF0YVRhYmxlW2NvbXBhcmVJbmRleF1baV07CiAgICAgICAgaWYgKGV4cGVjdGVkTGFuZy5sZW5ndGgoKSA9PSAwICYmIGRlZmF1bHRJc0ZyZW5jaCkKICAgICAgICAgICAgZXhwZWN0ZWRMYW5nID0gZGF0YVRhYmxlW0RMQU5HX0ZSXVtpXTsKICAgICAgICBpZiAoZXhwZWN0ZWRMYW5nLmxlbmd0aCgpID09IDApCiAgICAgICAgICAgIGV4cGVjdGVkTGFuZyA9IGRhdGFUYWJsZVtETEFOR19FTl1baV07CgogICAgICAgIGV4cGVjdGVkQ3RyeSA9IGRhdGFUYWJsZVtjb21wYXJlSW5kZXggKyAxXVtpXTsKICAgICAgICBpZiAoKGV4cGVjdGVkQ3RyeS5sZW5ndGgoKSA9PSAwKSAmJiBkZWZhdWx0SXNGcmVuY2gpCiAgICAgICAgICAgIGV4cGVjdGVkQ3RyeSA9IGRhdGFUYWJsZVtEQ1RSWV9GUl1baV07CiAgICAgICAgaWYgKGV4cGVjdGVkQ3RyeS5sZW5ndGgoKSA9PSAwKQogICAgICAgICAgICBleHBlY3RlZEN0cnkgPSBkYXRhVGFibGVbRENUUllfRU5dW2ldOwoKICAgICAgICBleHBlY3RlZFZhciA9IGRhdGFUYWJsZVtjb21wYXJlSW5kZXggKyAyXVtpXTsKICAgICAgICBpZiAoZXhwZWN0ZWRWYXIubGVuZ3RoKCkgPT0gMCAmJiBkZWZhdWx0SXNGcmVuY2gpCiAgICAgICAgICAgIGV4cGVjdGVkVmFyID0gZGF0YVRhYmxlW0RWQVJfRlJdW2ldOwogICAgICAgIGlmIChleHBlY3RlZFZhci5sZW5ndGgoKSA9PSAwKQogICAgICAgICAgICBleHBlY3RlZFZhciA9IGRhdGFUYWJsZVtEVkFSX0VOXVtpXTsKCiAgICAgICAgZXhwZWN0ZWROYW1lID0gZGF0YVRhYmxlW2NvbXBhcmVJbmRleCArIDNdW2ldOwogICAgICAgIGlmIChleHBlY3RlZE5hbWUubGVuZ3RoKCkgPT0gMCAmJiBkZWZhdWx0SXNGcmVuY2gpCiAgICAgICAgICAgIGV4cGVjdGVkTmFtZSA9IGRhdGFUYWJsZVtETkFNRV9GUl1baV07CiAgICAgICAgaWYgKGV4cGVjdGVkTmFtZS5sZW5ndGgoKSA9PSAwKQogICAgICAgICAgICBleHBlY3RlZE5hbWUgPSBkYXRhVGFibGVbRE5BTUVfRU5dW2ldOwoKICAgICAgICBpZiAodGVzdExhbmcgIT0gZXhwZWN0ZWRMYW5nKQogICAgICAgICAgICBlcnJsbigiRGlzcGxheSBsYW5ndWFnZSAoIiArIFVuaWNvZGVTdHJpbmcoaW5Mb2NhbGUuZ2V0TmFtZSgpKSArICIpIG1pc21hdGNoOiAiICsgdGVzdExhbmcgKyAiIHZlcnN1cyAiICsgZXhwZWN0ZWRMYW5nKTsKICAgICAgICBpZiAodGVzdEN0cnkgIT0gZXhwZWN0ZWRDdHJ5KQogICAgICAgICAgICBlcnJsbigiRGlzcGxheSBjb3VudHJ5ICgiICsgVW5pY29kZVN0cmluZyhpbkxvY2FsZS5nZXROYW1lKCkpICsgIikgbWlzbWF0Y2g6ICIgKyB0ZXN0Q3RyeSArICIgdmVyc3VzICIgKyBleHBlY3RlZEN0cnkgKyAoZGVmYXVsdElzRnJlbmNoP1VuaWNvZGVTdHJpbmcoIkZyZW5jaCIpOlVuaWNvZGVTdHJpbmcoIl8iKSkgKTsKICAgICAgICBpZiAodGVzdFZhciAhPSBleHBlY3RlZFZhcikKICAgICAgICAgICAgZXJybG4oIkRpc3BsYXkgdmFyaWFudCAoIiArIFVuaWNvZGVTdHJpbmcoaW5Mb2NhbGUuZ2V0TmFtZSgpKSArICIpIG1pc21hdGNoOiAiICsgdGVzdFZhciArICIgdmVyc3VzICIgKyBleHBlY3RlZFZhcik7CiAgICAgICAgaWYgKHRlc3ROYW1lICE9IGV4cGVjdGVkTmFtZSkKICAgICAgICAgICAgZXJybG4oIkRpc3BsYXkgbmFtZSAoIiArIFVuaWNvZGVTdHJpbmcoaW5Mb2NhbGUuZ2V0TmFtZSgpKSArICIpIG1pc21hdGNoOiAiICsgdGVzdE5hbWUgKyAiIHZlcnN1cyAiICsgZXhwZWN0ZWROYW1lKTsKICAgIH0KfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGFibGUgb2YgdmFsaWQgZGF0YQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKClVDaGFyIGdyZWVrRGlzcGxheUxhbmd1YWdlW10gPSB7IDB4MDNiNSwgMHgwM2JiLCAweDAzYmIsIDB4MDNiNywgMHgwM2JkLCAweDAzYjksIDB4MDNiYSwgMHgwM2FjLCAwIH07ClVDaGFyIGdyZWVrRGlzcGxheUNvdW50cnlbXSA9IHsgMHgwMzk1LCAweDAzYmIsIDB4MDNiYiwgMHgwM2FjLCAweDAzYjQsIDB4MDNiMSwgMCB9OwpVQ2hhciBncmVla0Rpc3BsYXlOYW1lW10gPSB7IDB4MDNiNSwgMHgwM2JiLCAweDAzYmIsIDB4MDNiNywgMHgwM2JkLCAweDAzYjksIDB4MDNiYSwKICAgIDB4MDNhYywgMHgyMCwgMHgyOCwgMHgwMzk1LCAweDAzYmIsIDB4MDNiYiwgMHgwM2FjLCAweDAzYjQsIDB4MDNiMSwgMHgyOSwgMCB9OwogICAgCnZvaWQgTG9jYWxlVGVzdDo6c2V0VXBEYXRhVGFibGUoKQp7CiAgICBpZiAoZGF0YVRhYmxlID09IDApIHsKICAgICAgICBkYXRhVGFibGUgPSBuZXcgVW5pY29kZVN0cmluZypbMjddOwoKICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAyNzsgaSsrKSB7CiAgICAgICAgICAgIGRhdGFUYWJsZVtpXSA9IG5ldyBVbmljb2RlU3RyaW5nWzddOwogICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCA3OyBqKyspIHsKICAgICAgICAgICAgICAgIGRhdGFUYWJsZVtpXVtqXSA9IENoYXJzVG9Vbmljb2RlU3RyaW5nKHJhd0RhdGFbaV1bal0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRhdGFUYWJsZVtETEFOR19FTF1bR1JFRUtdID0gZ3JlZWtEaXNwbGF5TGFuZ3VhZ2U7CiAgICAgICAgZGF0YVRhYmxlW0RDVFJZX0VMXVtHUkVFS10gPSBncmVla0Rpc3BsYXlDb3VudHJ5OwogICAgICAgIGRhdGFUYWJsZVtETkFNRV9FTF1bR1JFRUtdID0gZ3JlZWtEaXNwbGF5TmFtZTsKICAgIH0KfQoKLy8gPT09PT09PT09PT09PT09PT09PT0KCgovKioKICogQGJ1ZyA0MDExNzU2IDQwMTEzODAKICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RJU08zRmFsbGJhY2soKSAKewogICAgTG9jYWxlIHRlc3QoInh4IiwgIllZIik7CgogICAgY29uc3QgY2hhciAqIHJlc3VsdDsKCiAgICByZXN1bHQgPSB0ZXN0LmdldElTTzNMYW5ndWFnZSgpOwoKICAgIC8vIENvbmZvcm0gdG8gQyBBUEkgdXNhZ2UgCgogICAgaWYgKCFyZXN1bHQgfHwgKHJlc3VsdFswXSAhPSAwKSkKICAgICAgICBlcnJsbigiZ2V0SVNPM0xhbmd1YWdlKCkgb24geHhfWVkgcmV0dXJuZWQgIiArIFVuaWNvZGVTdHJpbmcocmVzdWx0KSArICIgaW5zdGVhZCBvZiBcIlwiIik7CgogICAgcmVzdWx0ID0gdGVzdC5nZXRJU08zQ291bnRyeSgpOwoKICAgIGlmICghcmVzdWx0IHx8IChyZXN1bHRbMF0gIT0gMCkpCiAgICAgICAgZXJybG4oImdldElTTzNDb3VudHJ5KCkgb24geHhfWVkgcmV0dXJuZWQgIiArIFVuaWNvZGVTdHJpbmcocmVzdWx0KSArICIgaW5zdGVhZCBvZiBcIlwiIik7Cn0KCi8qKgogKiBAYnVnIDQxMDYxNTUgNDExODU4NwogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdEdldExhbmdzQW5kQ291bnRyaWVzKCkgCnsKICAgIC8vIEl0IGRpZG4ndCBzZWVtIHJpZ2h0IHRvIGp1c3QgZG8gYW4gZXhoYXVzdGl2ZSB0ZXN0IG9mIGV2ZXJ5dGhpbmcgaGVyZSwgc28gSSBjaGVjawogICAgLy8gZm9yIHRoZSBmb2xsb3dpbmcgdGhpbmdzOgogICAgLy8gMSkgRG9lcyBlYWNoIGxpc3QgaGF2ZSB0aGUgcmlnaHQgdG90YWwgbnVtYmVyIG9mIGVudHJpZXM/CiAgICAvLyAyKSBEb2VzIGVhY2ggbGlzdCBjb250YWluIGNlcnRhaW4gbGFuZ3VhZ2UgYW5kIGNvdW50cnkgY29kZXMgd2UgdGhpbmsgYXJlIGltcG9ydGFudAogICAgLy8gICAgICh0aGUgRzcgY291bnRyaWVzLCBwbHVzIGEgY291cGxlIG90aGVycyk/CiAgICAvLyAzKSBEb2VzIGVhY2ggbGlzdCBoYXZlIGV2ZXJ5IGVudHJ5IGZvcm1hdHRlZCBjb3JyZWN0bHk/IChpLmUuLCB0d28gY2hhcmFjdGVycywKICAgIC8vICAgICBhbGwgbG93ZXIgY2FzZSBmb3IgdGhlIGxhbmd1YWdlIGNvZGVzLCBhbGwgdXBwZXIgY2FzZSBmb3IgdGhlIGNvdW50cnkgY29kZXMpCiAgICAvLyA0KSBJcyBlYWNoIGxpc3QgaW4gc29ydGVkIG9yZGVyPwogICAgaW50MzJfdCB0ZXN0Q291bnQgPSAwOwogICAgY29uc3QgY2hhciAqIGNvbnN0ICogdGVzdCA9IExvY2FsZTo6Z2V0SVNPTGFuZ3VhZ2VzKCk7CiAgICBjb25zdCBjaGFyIHNwb3RDaGVjazFbIF1bNF0gPSB7ICJlbiIsICJlcyIsICJmciIsICJkZSIsICJpdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamEiLCAia28iLCAiemgiLCAidGgiLCAiaGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIiwgIml1IiwgInVnIiwgInlpIiwgInphIiB9OwoKICAgIGludDMyX3QgaTsKICAgIAogICAgZm9yKHRlc3RDb3VudCA9IDA7dGVzdFt0ZXN0Q291bnRdO3Rlc3RDb3VudCsrKQogICAgICA7CgogICAgaWYgKHRlc3RDb3VudCAhPSA0MzcpCiAgICAgICAgZXJybG4oIkV4cGVjdGVkIGdldElTT0xhbmd1YWdlcygpIHRvIHJldHVybiA0MzcgbGFuZ3VhZ2VzOyBpdCByZXR1cm5lZCAlZCIsIHRlc3RDb3VudCk7CiAgICBlbHNlIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgewogICAgICAgICAgICBpbnQzMl90IGo7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0ZXN0Q291bnQ7IGorKykKICAgICAgICAgICAgICBpZiAodXBydl9zdHJjbXAodGVzdFtqXSxzcG90Q2hlY2sxW2ldKT09IDApCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGlmIChqID09IHRlc3RDb3VudCB8fCAodXBydl9zdHJjbXAodGVzdFtqXSxzcG90Q2hlY2sxW2ldKSE9MCkpCiAgICAgICAgICAgICAgICBlcnJsbigiQ291bGRuJ3QgZmluZCAiICsgKFVuaWNvZGVTdHJpbmcpc3BvdENoZWNrMVtpXSArICIgaW4gbGFuZ3VhZ2UgbGlzdC4iKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgdGVzdENvdW50OyBpKyspIHsKICAgICAgICBVbmljb2RlU3RyaW5nIHRlc3RlZSh0ZXN0W2ldLCIiKTsKICAgICAgICBVbmljb2RlU3RyaW5nIGxjKHRlc3RbaV0sIiIpOwogICAgICAgIGlmICh0ZXN0ZWUgIT0gbGMudG9Mb3dlcigpKQogICAgICAgICAgICBlcnJsbihsYyArICIgaXMgbm90IGFsbCBsb3dlciBjYXNlLiIpOwogICAgICAgIGlmICggKHRlc3RlZS5sZW5ndGgoKSAhPSAyKSAmJiAodGVzdGVlLmxlbmd0aCgpICE9IDMpKQogICAgICAgICAgICBlcnJsbih0ZXN0ZWUgKyAiIGlzIG5vdCB0d28gb3IgdGhyZWUgY2hhcmFjdGVycyBsb25nLiIpOwogICAgICAgIGlmIChpID4gMCAmJiB0ZXN0ZWUuY29tcGFyZSh0ZXN0W2kgLSAxXSkgPD0gMCkKICAgICAgICAgICAgZXJybG4odGVzdGVlICsgIiBhcHBlYXJzIGluIGFuIG91dC1vZi1vcmRlciBwb3NpdGlvbiBpbiB0aGUgbGlzdC4iKTsKICAgIH0KCiAgICB0ZXN0ID0gTG9jYWxlOjpnZXRJU09Db3VudHJpZXMoKTsKICAgIFVuaWNvZGVTdHJpbmcgc3BvdENoZWNrMiBbXSA9IHsgIlVTIiwgIkNBIiwgIkdCIiwgIkZSIiwgIkRFIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJVCIsICJKUCIsICJLUiIsICJDTiIsICJUVyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEgiIH07CiAgICBpbnQzMl90IHNwb3QyTGVuID0gMTE7CiAgICBmb3IodGVzdENvdW50PTA7dGVzdFt0ZXN0Q291bnRdO3Rlc3RDb3VudCsrKQogICAgICA7CgogICAgaWYgKHRlc3RDb3VudCAhPSAyMzkpCiAgICAgICAgZXJybG4oIkV4cGVjdGVkIGdldElTT0xhbmd1YWdlcyB0byByZXR1cm4gMjM4IGxhbmd1YWdlczsgaXQgcmV0dXJuZWQiICsgdGVzdENvdW50KTsKICAgIGVsc2UgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcG90MkxlbjsgaSsrKSB7CiAgICAgICAgICAgIGludDMyX3QgajsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHRlc3RDb3VudDsgaisrKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgdGVzdGVlKHRlc3Rbal0sIiIpOwoKICAgICAgICAgICAgICAgIGlmICh0ZXN0ZWUgPT0gc3BvdENoZWNrMltpXSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHRlc3RlZSh0ZXN0W2pdLCIiKTsKICAgICAgICAgICAgaWYgKGogPT0gdGVzdENvdW50IHx8IHRlc3RlZSAhPSBzcG90Q2hlY2syW2ldKQogICAgICAgICAgICAgICAgZXJybG4oIkNvdWxkbid0IGZpbmQgIiArIHNwb3RDaGVjazJbaV0gKyAiIGluIGNvdW50cnkgbGlzdC4iKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgdGVzdENvdW50OyBpKyspIHsKICAgICAgVW5pY29kZVN0cmluZyB0ZXN0ZWUodGVzdFtpXSwiIik7CiAgICAgICAgVW5pY29kZVN0cmluZyB1Yyh0ZXN0W2ldLCIiKTsKICAgICAgICBpZiAodGVzdGVlICE9IHVjLnRvVXBwZXIoKSkKICAgICAgICAgICAgZXJybG4odGVzdGVlICsgIiBpcyBub3QgYWxsIHVwcGVyIGNhc2UuIik7CiAgICAgICAgaWYgKHRlc3RlZS5sZW5ndGgoKSAhPSAyKQogICAgICAgICAgICBlcnJsbih0ZXN0ZWUgKyAiIGlzIG5vdCB0d28gY2hhcmFjdGVycyBsb25nLiIpOwogICAgICAgIGlmIChpID4gMCAmJiB0ZXN0ZWUuY29tcGFyZSh0ZXN0W2kgLSAxXSkgPD0gMCkKICAgICAgICAgICAgZXJybG4odGVzdGVlICsgIiBhcHBlYXJzIGluIGFuIG91dC1vZi1vcmRlciBwb3NpdGlvbiBpbiB0aGUgbGlzdC4iKTsKICAgIH0KfQoKLyoqCiAqIEBidWcgNDEyNjg4MAogKi8KLy8gc2luY2UgdGhpcyByZXR1cm5zIGNvbnN0IFVuaWNvZGVTdHJpbmcqIGluIEMrKywgaXMgdGhpcyB0ZXN0IGFwcGxpY2FibGU/CnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3Q0MTI2ODgwKCkgCnsKI2lmZGVmIElDVV9MT0NJRF9VU0VfREVQUkVDQVRFUwogICAgCiAgICBjb25zdCBVbmljb2RlU3RyaW5nICp0ZXN0OwogICAgaW50MzJfdCB0ZXN0Q291bnQ9MDsKCiAgICAvKnRlc3QgPSBMb2NhbGU6OmdldElTT0NvdW50cmllcyh0ZXN0Q291bnQpOwogICAgdGVzdFswXSA9ICJTVUNLRVIhISEiOwogICAgdGVzdCA9IExvY2FsZTo6Z2V0SVNPQ291bnRyaWVzKHRlc3RDb3VudCk7CiAgICBpZiAodGVzdFswXSA9PSAiU1VDS0VSISEhIikKICAgICAgICBlcnJsbigiQ2hhbmdlZCBpbnRlcm5hbCBjb3VudHJ5IGNvZGUgbGlzdCEiKTsKCiAgICB0ZXN0ID0gTG9jYWxlOjpnZXRJU09MYW5ndWFnZXModGVzdENvdW50KTsKICAgIHRlc3RbMF0gPSAiSEFIQUhBSEEhISEiOwogICAgdGVzdCA9IExvY2FsZTo6Z2V0SVNPTGFuZ3VhZ2VzKHRlc3RDb3VudCk7CiAgICBpZiAodGVzdFswXSA9PSAiSEFIQUhBSEEhISEiKSAvLyBGaXhlZCB0eXBvCiAgICAgICAgZXJybG4oIkNoYW5nZXMgaW50ZXJuYWwgbGFuZ3VhZ2UgY29kZSBsaXN0ISIpOwogICAgICovICAgCiAgICAvKnRlc3RzIGZvciBkZXByZWNhdGVkIEFQSSovCiAgICB0ZXN0PUxvY2FsZTo6Z2V0SVNPQ291bnRyaWVzKHRlc3RDb3VudCk7CiAgICBpZih0ZXN0Q291bnQgIT0gMjM5KXsKICAgICAgICBlcnJsbigoVW5pY29kZVN0cmluZykiVGhlcmUgaXMgYW4gZXJyb3IgaW4gZ2V0SVNPQ291bnRyaWVzICIgKyB0ZXN0Q291bnQpOwogICAgfQogICAgdGVzdD1Mb2NhbGU6OmdldElTT0xhbmd1YWdlcyh0ZXN0Q291bnQpOwogICAgaWYodGVzdENvdW50ICE9IDQzNyl7CiAgICAgICAgZXJybG4oKFVuaWNvZGVTdHJpbmcpIlRoZXJlIGlzIGFuIGVycm9yIGluIGdldElTT0xhbmd1YWdlcyAiICsgdGVzdENvdW50KTsKICAgIH0KLyotLS0tLS0tLS0tKi8KI2Vsc2UKICAgIGxvZ2xuKCJTa2lwcGluZyBUZXN0NDEyNjg4MCBmb3IgZGVwcmVjYXRlZCBBUEkiKTsKI2VuZGlmICAgICAgICAKfQoKLyoqCiAqIEBidWcgNDEzNTMxNgogKi8KLy8gbm90IGFwcGxpY2FibGUgaW4gQysrIC0gY29uc3QgTG9jYWxlKgp2b2lkIApMb2NhbGVUZXN0OjpUZXN0QnVnNDEzNTMxNigpIAp7Ci8qCiAgICBMb2NhbGVbXSBsb2NhbGVzMSA9IExvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCk7CiAgICBMb2NhbGVbXSBsb2NhbGVzMiA9IExvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCk7CiAgICBpZiAobG9jYWxlczEgPT0gbG9jYWxlczIpCiAgICAgICAgZXJybG4oIkxvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCkgZG9lc24ndCBjbG9uZSBpdHMgaW50ZXJuYWwgc3RvcmFnZSEiKTsKKi8KfQoKLyoqCiAqIEBidWcgNDEwNzk1MwogKi8KLyoKdGVzdCBjb21tZW50ZWQgb3V0IHBlbmRpbmcgQVBJLWNoYW5nZSBhcHByb3ZhbApwdWJsaWMgdm9pZCBUZXN0R2V0TGFuZ3VhZ2VzRm9yQ291bnRyeSgpIHsKICAgIFVuaWNvZGVTdHJpbmdbXSBsYW5ndWFnZXMgPSBMb2NhbGUuZ2V0TGFuZ3VhZ2VzRm9yQ291bnRyeSgiVVMiKTsKCiAgICBpZiAoIXNlYXJjaFN0cmluZ0FycmF5Rm9yKCJlbiIsIGxhbmd1YWdlcykpCiAgICAgICAgZXJybG4oIkRpZG4ndCBnZXQgZW4gYXMgYSBsYW5ndWFnZSBmb3IgVVMiKTsKCiAgICBsYW5ndWFnZXMgPSBMb2NhbGUuZ2V0TGFuZ3VhZ2VzRm9yQ291bnRyeSgiRlIiKTsKICAgIGlmICghc2VhcmNoU3RyaW5nQXJyYXlGb3IoImZyIiwgbGFuZ3VhZ2VzKSkKICAgICAgICBlcnJsbigiRGlkbid0IGdldCBmciBhcyBhIGxhbmd1YWdlIGZvciBGUiIpOwoKICAgIGxhbmd1YWdlcyA9IExvY2FsZS5nZXRMYW5ndWFnZXNGb3JDb3VudHJ5KCJDSCIpOwogICAgaWYgKCFzZWFyY2hTdHJpbmdBcnJheUZvcigiZnIiLCBsYW5ndWFnZXMpKQogICAgICAgIGVycmxuKCJEaWRuJ3QgZ2V0IGZyIGFzIGEgbGFuZ3VhZ2UgZm9yIENIIik7CiAgICBpZiAoIXNlYXJjaFN0cmluZ0FycmF5Rm9yKCJpdCIsIGxhbmd1YWdlcykpCiAgICAgICAgZXJybG4oIkRpZG4ndCBnZXQgaXQgYXMgYSBsYW5ndWFnZSBmb3IgQ0giKTsKICAgIGlmICghc2VhcmNoU3RyaW5nQXJyYXlGb3IoImRlIiwgbGFuZ3VhZ2VzKSkKICAgICAgICBlcnJsbigiRGlkbid0IGdldCBkZSBhcyBhIGxhbmd1YWdlIGZvciBDSCIpOwoKICAgIGxhbmd1YWdlcyA9IExvY2FsZS5nZXRMYW5ndWFnZXNGb3JDb3VudHJ5KCJKUCIpOwogICAgaWYgKCFzZWFyY2hTdHJpbmdBcnJheUZvcigiamEiLCBsYW5ndWFnZXMpKQogICAgICAgIGVycmxuKCJEaWRuJ3QgZ2V0IGphIGFzIGEgbGFuZ3VhZ2UgZm9yIEpQIik7Cn0KKi8KCi8qCnByaXZhdGUgVUJvb2wgc2VhcmNoU3RyaW5nQXJyYXlGb3IoVW5pY29kZVN0cmluZyBzLCBVbmljb2RlU3RyaW5nW10gYXJyYXkpIHsKICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKQogICAgICAgIGlmIChzLmVxdWFscyhhcnJheVtpXSkpCiAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgcmV0dXJuIEZBTFNFOwp9CiovCgovKioKICogQGJ1ZyA0MTEwNjEzCiAqLwovLyBub3QgYXBwbGljYWJsZSBpbiBDKysKIC8qCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIE9wdGlvbmFsRGF0YUV4Y2VwdGlvbiwKICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uLCBTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24KewogICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9zdHJlYW07CiAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb2JzdHJlYW07CiAgICBieXRlW10gYnl0ZXMgPSBudWxsOwoKICAgIG9ic3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgb3N0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob2JzdHJlYW0pOwoKICAgIExvY2FsZSB0ZXN0MSA9IG5ldyBMb2NhbGUoInpoIiwgIlRXIiwgIiIpOwogICAgaW50MzJfdCBkdW1teSA9IHRlc3QxLmhhc2hDb2RlKCk7ICAgLy8gZmlsbCBpbiB0aGUgY2FjaGVkIGhhc2gtY29kZSB2YWx1ZQogICAgb3N0cmVhbS53cml0ZU9iamVjdCh0ZXN0MSk7CgogICAgYnl0ZXMgPSBvYnN0cmVhbS50b0J5dGVBcnJheSgpOwoKICAgIE9iamVjdElucHV0U3RyZWFtIGlzdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKSk7CgogICAgTG9jYWxlIHRlc3QyID0gKExvY2FsZSkoaXN0cmVhbS5yZWFkT2JqZWN0KCkpOwoKICAgIGlmICghdGVzdDEuZXF1YWxzKHRlc3QyKSB8fCB0ZXN0MS5oYXNoQ29kZSgpICE9IHRlc3QyLmhhc2hDb2RlKCkpCiAgICAgICAgZXJybG4oIkxvY2FsZSBmYWlsZWQgdG8gZGVzZXJpYWxpemUgY29ycmVjdGx5LiIpOwp9CiovCgovKioKICogQGJ1ZyA0MTE4NTg3CiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0U2ltcGxlRGlzcGxheU5hbWVzKCkgCnsKICAgIC8vIFRoaXMgdGVzdCBpcyBkaWZmZXJlbnQgZnJvbSBUZXN0RGlzcGxheU5hbWVzIGJlY2F1c2UgVGVzdERpc3BsYXlOYW1lcyBjaGVja3MKICAgIC8vIGZhbGxiYWNrIGJlaGF2aW9yLCBjb21iaW5hdGlvbiBvZiBsYW5ndWFnZSBhbmQgY291bnRyeSBuYW1lcyB0byBmb3JtIGxvY2FsZQogICAgLy8gbmFtZXMsIGFuZCBvdGhlciBzdHVmZiBsaWtlIHRoYXQuICBUaGlzIHRlc3QganVzdCBjaGVja3Mgc3BlY2lmaWMgbGFuZ3VhZ2UKICAgIC8vIGFuZCBjb3VudHJ5IGNvZGVzIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IG5hbWVzIGZvciB0aGVtLgogICAgY2hhciBsYW5ndWFnZUNvZGVzW10gWzRdID0geyAiaGUiLCAiaWQiLCAiaXUiLCAidWciLCAieWkiLCAiemEiIH07CiAgICBVbmljb2RlU3RyaW5nIGxhbmd1YWdlTmFtZXMgW10gPSB7ICJIZWJyZXciLCAiSW5kb25lc2lhbiIsICJJbnVraXR1dCIsICJVaWdodXIiLCAiWWlkZGlzaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmh1YW5nIiB9OwoKICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDY7IGkrKykgewogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVzdDsKICAgICAgICBMb2NhbGUgbChsYW5ndWFnZUNvZGVzW2ldLCAiIiwgIiIpOwogICAgICAgIGwuZ2V0RGlzcGxheUxhbmd1YWdlKExvY2FsZTo6VVMsIHRlc3QpOwogICAgICAgIGlmICh0ZXN0ICE9IGxhbmd1YWdlTmFtZXNbaV0pCiAgICAgICAgICAgIGVycmxuKCJHb3Qgd3JvbmcgZGlzcGxheSBuYW1lIGZvciAiICsgVW5pY29kZVN0cmluZyhsYW5ndWFnZUNvZGVzW2ldKSArICI6IEV4cGVjdGVkIFwiIiArCiAgICAgICAgICAgICAgICAgIGxhbmd1YWdlTmFtZXNbaV0gKyAiXCIsIGdvdCBcIiIgKyB0ZXN0ICsgIlwiLiIpOwogICAgfQp9CgovKioKICogQGJ1ZyA0MTE4NTk1CiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0VW5pbnN0YWxsZWRJU08zTmFtZXMoKSAKewogICAgLy8gVGhpcyB0ZXN0IGNoZWNrcyB0byBtYWtlIHN1cmUgZ2V0SVNPM0xhbmd1YWdlIGFuZCBnZXRJU08zQ291bnRyeSB3b3JrIHJpZ2h0CiAgICAvLyBldmVuIGZvciBsb2NhbGVzIHRoYXQgYXJlIG5vdCBpbnN0YWxsZWQuCiAgICBjb25zdCBjaGFyIGlzbzJMYW5ndWFnZXMgW11bNF0gPSB7ICAgICAiYW0iLCAiYmEiLCAiZnkiLCAibXIiLCAicm4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcyIsICJ0dyIsICJ6dSIgfTsKICAgIGNvbnN0IGNoYXIgaXNvM0xhbmd1YWdlcyBbXVs1XSA9IHsgICAgICJhbWgiLCAiYmFrIiwgImZyeSIsICJtYXIiLCAicnVuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3N3IiwgInR3aSIsICJ6dWwiIH07CgogICAgaW50MzJfdCBpOwoKICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgVUVycm9yQ29kZSBlcnIgPSBVX1pFUk9fRVJST1I7CgogICAgICBVbmljb2RlU3RyaW5nIHRlc3Q7CiAgICAgICAgTG9jYWxlIGwoaXNvMkxhbmd1YWdlc1tpXSwgIiIsICIiKTsKICAgICAgICB0ZXN0ID0gbC5nZXRJU08zTGFuZ3VhZ2UoKTsKICAgICAgICBpZigodGVzdCAhPSBpc28zTGFuZ3VhZ2VzW2ldKSB8fCBVX0ZBSUxVUkUoZXJyKSkKICAgICAgICAgICAgZXJybG4oIkdvdCB3cm9uZyBJU08zIGNvZGUgZm9yICIgKyBVbmljb2RlU3RyaW5nKGlzbzJMYW5ndWFnZXNbaV0pICsgIjogRXhwZWN0ZWQgXCIiICsKICAgICAgICAgICAgICAgICAgICBpc28zTGFuZ3VhZ2VzW2ldICsgIlwiLCBnb3QgXCIiICsgdGVzdCArICJcIi4iICsgVW5pY29kZVN0cmluZyh1X2Vycm9yTmFtZShlcnIpKSk7CiAgICB9CgogICAgY2hhciBpc28yQ291bnRyaWVzIFtdWzRdID0geyAgICAgIkFGIiwgIkJXIiwgIktaIiwgIk1PIiwgIk1OIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0IiLCAiVEMiLCAiWlciIH07CiAgICBjaGFyIGlzbzNDb3VudHJpZXMgW11bNF0gPSB7ICAgICAiQUZHIiwgIkJXQSIsICJLQVoiLCAiTUFDIiwgIk1ORyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNMQiIsICJUQ0EiLCAiWldFIiB9OwoKICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgVUVycm9yQ29kZSBlcnIgPSBVX1pFUk9fRVJST1I7CiAgICAgICAgTG9jYWxlIGwoIiIsIGlzbzJDb3VudHJpZXNbaV0sICIiKTsKICAgICAgICBVbmljb2RlU3RyaW5nIHRlc3QobC5nZXRJU08zQ291bnRyeSgpLCAiIik7CiAgICAgICAgaWYgKHRlc3QgIT0gaXNvM0NvdW50cmllc1tpXSkKICAgICAgICAgICAgZXJybG4oIkdvdCB3cm9uZyBJU08zIGNvZGUgZm9yICIgKyBVbmljb2RlU3RyaW5nKGlzbzJDb3VudHJpZXNbaV0pICsgIjogRXhwZWN0ZWQgXCIiICsKICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nKGlzbzNDb3VudHJpZXNbaV0pICsgIlwiLCBnb3QgXCIiICsgdGVzdCArICJcIi4iICsgdV9lcnJvck5hbWUoZXJyKSk7CiAgICB9Cn0KCi8qKgogKiBAYnVnIDQwOTI0NzUKICogSSBjb3VsZCBub3QgcmVwcm9kdWNlIHRoaXMgYnVnLiAgSSdtIHByZXR0eSBjb252aW5jZWQgaXQgd2FzIGZpeGVkIHdpdGggdGhlCiAqIGJpZyBsb2NhbGUtZGF0YSByZW9yZyBvZiAxMC8yOC85Ny4gIFRoZSBsb29rdXAgbG9naWMgZm9yIGxhbmd1YWdlIGFuZCBjb3VudHJ5CiAqIGRpc3BsYXkgbmFtZXMgd2FzIGFsc28gY2hhbmdlZCBhdCB0aGF0IHRpbWUgaW4gdGhhdCBjaGVjay1pbi4gICAgLS1ydGcgMy8yMC85OAogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdEF0eXBpY2FsTG9jYWxlcygpIAp7CiAgICBMb2NhbGUgbG9jYWxlc1RvVGVzdCBbXSA9IHsgTG9jYWxlKCJkZSIsICJDQSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCJqYSIsICJaQSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgicnUiLCAiTVgiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUoImVuIiwgIkZSIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCJlcyIsICJERSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgiIiwgIkhSIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCIiLCAiU0UiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUoIiIsICJETyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgiIiwgIkJFIikgfTsKCiAgICBVbmljb2RlU3RyaW5nIGVuZ2xpc2hEaXNwbGF5TmFtZXMgW10gPSB7ICJHZXJtYW4gKENhbmFkYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkphcGFuZXNlIChTb3V0aCBBZnJpY2EpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSdXNzaWFuIChNZXhpY28pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIChGcmFuY2UpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTcGFuaXNoIChHZXJtYW55KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JvYXRpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3dlZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb21pbmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlbGdpdW0iIH07CiAgICBVbmljb2RlU3RyaW5nIGZyZW5jaERpc3BsYXlOYW1lcyBbXT0geyAiYWxsZW1hbmQgKENhbmFkYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamFwb25haXMgKEFmcmlxdWUgZHUgU3VkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydXNzZSAoTWV4aXF1ZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZ2xhaXMgKEZyYW5jZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVzcGFnbm9sIChBbGxlbWFnbmUpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyb2F0aWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc1RvVW5pY29kZVN0cmluZygiU3VcXHUwMEU4ZGUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb1VuaWNvZGVTdHJpbmcoIlJcXHUwMEU5cHVibGlxdWUgRG9taW5pY2FpbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlbGdpcXVlIiB9OwogICAgVW5pY29kZVN0cmluZyBzcGFuaXNoRGlzcGxheU5hbWVzIFtdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb1VuaWNvZGVTdHJpbmcoImFsZW1cXHUwMEUxbiAoQ2FuYWRcXHUwMEUxKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb1VuaWNvZGVTdHJpbmcoImphcG9uXFx1MDBFOXMgKFN1ZFxcdTAwRTFmcmljYSkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzVG9Vbmljb2RlU3RyaW5nKCJydXNvIChNXFx1MDBFOXhpY28pIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc1RvVW5pY29kZVN0cmluZygiaW5nbFxcdTAwRTlzIChGcmFuY2lhKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb1VuaWNvZGVTdHJpbmcoImVzcGFcXHUwMEYxb2wgKEFsZW1hbmlhKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyb2FjaWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1ZWNpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc1RvVW5pY29kZVN0cmluZygiUmVwXFx1MDBGQWJsaWNhIERvbWluaWNhbmEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzVG9Vbmljb2RlU3RyaW5nKCJCXFx1MDBFOWxnaWNhIikgfTsKICAgIFVuaWNvZGVTdHJpbmcgYXJhYmljRGlzcGxheU5hbWVzIFtdID0geyAiR2VybWFuIChDYW5hZGEpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKYXBhbmVzZSAoU291dGggQWZyaWNhKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVzc2lhbiAoTWV4aWNvKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCAoRnJhbmNlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3BhbmlzaCAoR2VybWFueSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyb2F0aWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN3ZWRlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9taW5pY2FuIFJlcHVibGljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCZWxnaXVtIiB9OwoKCiAgICBpbnQzMl90IGk7CiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgIExvY2FsZTo6c2V0RGVmYXVsdChMb2NhbGU6OmdldFVTKCksIHN0YXR1cyk7CiAgICBmb3IgKGkgPSAwOyBpIDwgOTsgKytpKSB7CiAgICAgICAgVW5pY29kZVN0cmluZyBuYW1lOwogICAgICAgIGxvY2FsZXNUb1Rlc3RbaV0uZ2V0RGlzcGxheU5hbWUoTG9jYWxlOjpnZXRVUygpLCBuYW1lKTsKICAgICAgICBsb2dsbihuYW1lKTsKICAgICAgICBpZiAobmFtZSAhPSBlbmdsaXNoRGlzcGxheU5hbWVzW2ldKQogICAgICAgIHsKICAgICAgICAgICAgZXJybG4oIkxvb2t1cCBpbiBFbmdsaXNoIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgZW5nbGlzaERpc3BsYXlOYW1lc1tpXQogICAgICAgICAgICAgICAgICAgICAgICArICJcIiwgZ290IFwiIiArIG5hbWUgKyAiXCIiKTsKICAgICAgICAgICAgbG9nbG4oIkxvY2FsZSBuYW1lIHdhcy0+ICIgKyAobmFtZT1sb2NhbGVzVG9UZXN0W2ldLmdldE5hbWUoKSkpOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CiAgICAgICAgVW5pY29kZVN0cmluZyBuYW1lOwogICAgICAgIGxvY2FsZXNUb1Rlc3RbaV0uZ2V0RGlzcGxheU5hbWUoTG9jYWxlKCJlcyIsICJFUyIpLCBuYW1lKTsKICAgICAgICBsb2dsbihuYW1lKTsKICAgICAgICBpZiAobmFtZSAhPSBzcGFuaXNoRGlzcGxheU5hbWVzW2ldKQogICAgICAgICAgICBlcnJsbigiTG9va3VwIGluIFNwYW5pc2ggZmFpbGVkOiBleHBlY3RlZCBcIiIgKyBzcGFuaXNoRGlzcGxheU5hbWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiLCBnb3QgXCIiICsgbmFtZSArICJcIiIpOwogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKICAgICAgICBVbmljb2RlU3RyaW5nIG5hbWU7CiAgICAgICAgbG9jYWxlc1RvVGVzdFtpXS5nZXREaXNwbGF5TmFtZShMb2NhbGU6OmdldEZyYW5jZSgpLCBuYW1lKTsKICAgICAgICBsb2dsbihuYW1lKTsKICAgICAgICBpZiAobmFtZSAhPSBmcmVuY2hEaXNwbGF5TmFtZXNbaV0pCiAgICAgICAgICAgIGVycmxuKCJMb29rdXAgaW4gRnJlbmNoIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgZnJlbmNoRGlzcGxheU5hbWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiLCBnb3QgXCIiICsgbmFtZSArICJcIiIpOwogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKICAgICAgICBVbmljb2RlU3RyaW5nIG5hbWU7CiAgICAgICAgbG9jYWxlc1RvVGVzdFtpXS5nZXREaXNwbGF5TmFtZShMb2NhbGUoImFyIiwgIkVTIiksIG5hbWUpOwogICAgICAgIGxvZ2xuKG5hbWUgKyAiIExvY2FsZSBmYWxsYmFjayB0byBhciwgYW5kIGRhdGEgZmFsbGJhY2sgdG8gcm9vdCIpOwogICAgICAgIGlmIChuYW1lICE9IGFyYWJpY0Rpc3BsYXlOYW1lc1tpXSkKICAgICAgICAgICAgZXJybG4oIkxvb2t1cCBpbiBBcmFiaWMgZmFpbGVkOiBleHBlY3RlZCBcIiIgKyBhcmFiaWNEaXNwbGF5TmFtZXNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIsIGdvdCBcIiIgKyBuYW1lICsgIlwiIik7CiAgICAgICAgbG9jYWxlc1RvVGVzdFtpXS5nZXREaXNwbGF5TmFtZShMb2NhbGUoImFyIiwgIkVHIiksIG5hbWUpOwogICAgICAgIGxvZ2xuKG5hbWUgKyAiIERhdGEgZmFsbGJhY2sgdG8gcm9vdCIpOwogICAgICAgIGlmIChuYW1lICE9IGFyYWJpY0Rpc3BsYXlOYW1lc1tpXSkKICAgICAgICAgICAgZXJybG4oIkxvb2t1cCBpbiBBcmFiaWMgZmFpbGVkOiBleHBlY3RlZCBcIiIgKyBhcmFiaWNEaXNwbGF5TmFtZXNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIsIGdvdCBcIiIgKyBuYW1lICsgIlwiIik7CiAgICB9Cn0KCi8qKgogKiBAYnVnIDQxMjYzNzEKICovCi8vIG5vdCBhcHBsaWNhYmxlIGluIEMrKywgc2V0RGVmYXVsdCgpIHRha2VzIGEgcmVmZXJlbmNlCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3ROdWxsRGVmYXVsdCgpIAp7Ci8qCiAgICAvLyB3aHkgb24gZWFydGggYW55b25lIHdvdWxkIGV2ZXIgdHJ5IHRvIGRvIHRoaXMgaXMgYmV5b25kIG1lLCBidXQgd2Ugc2hvdWxkCiAgICAvLyBkZWZpbml0ZWx5IG1ha2Ugc3VyZSB3ZSBkb24ndCBsZXQgdGhlbQogICAgVUJvb2wgZ290RXhjZXB0aW9uID0gRkFMU0U7CiAgICB0cnkgewogICAgICAgIExvY2FsZS5zZXREZWZhdWx0KG51bGwpOwogICAgfQogICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKICAgICAgICAvLyBhbGwgb3RoZXIgZXhjZXB0aW9uIHR5cGVzIHByb3BhZ2F0ZSB0aHJvdWdoIGhlcmUgYmFjayB0byB0aGUgdGVzdCBoYXJuZXNzCiAgICAgICAgZ290RXhjZXB0aW9uID0gVFJVRTsKICAgIH0KICAgIGlmIChMb2NhbGUuZ2V0RGVmYXVsdCgpID09IG51bGwpCiAgICAgICAgZXJybG4oIkxvY2FsZS5nZXREZWZhdWx0KCkgYWxsb3dlZCB1cyB0byBzZXQgZGVmYXVsdCB0byBOVUxMISIpOwogICAgaWYgKCFnb3RFeGNlcHRpb24pCiAgICAgICAgZXJybG4oIlRyeWluZyB0byBzZXQgZGVmYXVsdCBsb2NhbGUgdG8gTlVMTCBkaWRuJ3QgdGhyb3cgZXhjZXB0aW9uISIpOwoqLwp9CgovKioKICogQGJ1ZyA0MTM1NzUyCiAqIFRoaXMgd291bGQgYmUgYmV0dGVyIHRlc3RlZCBieSB0aGUgTG9jYWxlRGF0YVRlc3QuICBXaWxsIG1vdmUgaXQgd2hlbiBJCiAqIGdldCB0aGUgTG9jYWxlRGF0YVRlc3Qgd29ya2luZyBhZ2Fpbi4KICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RUaGFpQ3VycmVuY3lGb3JtYXQoKSAKewogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAgICBEZWNpbWFsRm9ybWF0ICp0aGFpQ3VycmVuY3kgPSAoRGVjaW1hbEZvcm1hdCopTnVtYmVyRm9ybWF0OjpjcmVhdGVDdXJyZW5jeUluc3RhbmNlKAogICAgICAgICAgICAgICAgICAgIExvY2FsZSgidGgiLCAiVEgiKSwgc3RhdHVzKTsKICAgIFVDaGFyIHBvc1ByZWZpeCA9IDB4MGUzZjsKICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKCiAgICBpZihVX0ZBSUxVUkUoc3RhdHVzKSB8fCAhdGhhaUN1cnJlbmN5KQogICAgewogICAgICAgIGVycmxuKCJDb3VsZG4ndCBnZXQgdGhfVEggY3VycmVuY3kgLT4gIiArIFVuaWNvZGVTdHJpbmcodV9lcnJvck5hbWUoc3RhdHVzKSkpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGFpQ3VycmVuY3ktPmdldFBvc2l0aXZlUHJlZml4KHRlbXApICE9IFVuaWNvZGVTdHJpbmcoJnBvc1ByZWZpeCwgMSwgMSkpCiAgICAgICAgZXJybG4oIlRoYWkgY3VycmVuY3kgcHJlZml4IHdyb25nOiBleHBlY3RlZCAweDBlM2YsIGdvdCBcIiIgKwogICAgICAgICAgICAgICAgICAgICAgICB0aGFpQ3VycmVuY3ktPmdldFBvc2l0aXZlUHJlZml4KHRlbXApICsgIlwiIik7CiAgICBpZiAodGhhaUN1cnJlbmN5LT5nZXRQb3NpdGl2ZVN1ZmZpeCh0ZW1wKSAhPSAiIikKICAgICAgICBlcnJsbigiVGhhaSBjdXJyZW5jeSBzdWZmaXggd3Jvbmc6IGV4cGVjdGVkIFwiXCIsIGdvdCBcIiIgKwogICAgICAgICAgICAgICAgICAgICAgICB0aGFpQ3VycmVuY3ktPmdldFBvc2l0aXZlU3VmZml4KHRlbXApICsgIlwiIik7CgogICAgZGVsZXRlIHRoYWlDdXJyZW5jeTsKfQoKLyoqCiAqIEBidWcgNDEyMjM3MQogKiBDb25maXJtIHRoYXQgRXVybyBzdXBwb3J0IHdvcmtzLiAgVGhpcyB0ZXN0IGlzIHByZXR0eSBydWRpbWVudGFyeTsgYWxsIGl0IGRvZXMKICogaXMgY2hlY2sgdGhhdCBhbnkgbG9jYWxlcyB3aXRoIHRoZSBFVVJPIHZhcmlhbnQgZm9ybWF0IGEgbnVtYmVyIHVzaW5nIHRoZQogKiBFdXJvIGN1cnJlbmN5IHN5bWJvbC4KICoKICogQVNTVU1FOiBBbGwgbG9jYWxlcyBlbmNvZGUgdGhlIEV1cm8gY2hhcmFjdGVyICJcdTIwQUMiLgogKiBJZiB0aGlzIGlzIGNoYW5nZWQgdG8gdXNlIHRoZSBzaW5nbGUtY2hhcmFjdGVyIEV1cm8gc3ltYm9sLCB0aGlzCiAqIHRlc3QgbXVzdCBiZSB1cGRhdGVkLgogKgogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdEV1cm9TdXBwb3J0KCkgCnsKICAgIFVDaGFyIGV1cm8gPSAweDIwYWM7CiAgICBjb25zdCBVbmljb2RlU3RyaW5nIEVVUk9fQ1VSUkVOQ1koJmV1cm8sIDEsIDEpOyAvLyBMb29rIGZvciB0aGlzIFVuaWNvZGVTdHJpbmcgaW4gZm9ybWF0dGVkIEV1cm8gY3VycmVuY3kKICAgIGNvbnN0IGNoYXIqIGxvY2FsZUFycltdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhX0VTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZV9BVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVfREUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlX0xVIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbF9HUiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5fQkUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuX0lFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlc19FUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXVfRVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpX0ZJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcl9CRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJfRlIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyX0xVIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnYV9JRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xfRVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0X0lUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubF9CRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmxfTkwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInB0X1BUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgIGNvbnN0IGNoYXIqKiBsb2NhbGVzID0gbG9jYWxlQXJyOwoKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwoKICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKCiAgICBmb3IgKDsqbG9jYWxlcyE9TlVMTDtsb2NhbGVzKyspIHsKICAgICAgICBMb2NhbGUgbG9jICgqbG9jYWxlcyk7CiAgICAgICAgVW5pY29kZVN0cmluZyB0ZW1wOwogICAgICAgICAgICBOdW1iZXJGb3JtYXQgKm5mID0gTnVtYmVyRm9ybWF0OjpjcmVhdGVDdXJyZW5jeUluc3RhbmNlKGxvYywgc3RhdHVzKTsKICAgICAgICAgICAgVW5pY29kZVN0cmluZyBwb3M7CiAgICAgICAgICAgIG5mLT5mb3JtYXQoMjcxODI4LjE4Mjg0NSwgcG9zKTsKICAgICAgICAgICAgVW5pY29kZVN0cmluZyBuZWc7CiAgICAgICAgICAgIG5mLT5mb3JtYXQoLTI3MTgyOC4xODI4NDUsIG5lZyk7CiAgICAgICAgICAgIGlmIChwb3MuaW5kZXhPZihFVVJPX0NVUlJFTkNZKSA+PSAwICYmCiAgICAgICAgICAgICAgICBuZWcuaW5kZXhPZihFVVJPX0NVUlJFTkNZKSA+PSAwKSB7CiAgICAgICAgICAgICAgICBsb2dsbigiT2s6ICIgKyAodGVtcD1sb2MuZ2V0TmFtZSgpKSArCiAgICAgICAgICAgICAgICAgICAgICAiOiAiICsgcG9zICsgIiAvICIgKyBuZWcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZXJybG4oIkZhaWw6ICIgKyAodGVtcD1sb2MuZ2V0TmFtZSgpKSArCiAgICAgICAgICAgICAgICAgICAgICAiIGZvcm1hdHMgd2l0aG91dCAiICsgRVVST19DVVJSRU5DWSArCiAgICAgICAgICAgICAgICAgICAgICAiOiAiICsgcG9zICsgIiAvICIgKyBuZWcgKwogICAgICAgICAgICAgICAgICAgICAgIlxuKioqIFRISVMgRkFJTFVSRSBNQVkgT05MWSBNRUFOIFRIQVQgTE9DQUxFIERBVEEgSEFTIENIQU5HRUQgKioqIik7CiAgICAgICAgICAgIH0KICAgICAgICAKICAgICAgICAgICAgZGVsZXRlIG5mOwogICAgfQp9CgovKioKICogQGJ1ZyA0MTM5NTA0CiAqIHRvU3RyaW5nKCkgZG9lc24ndCB3b3JrIHdpdGggbGFuZ3VhZ2VfVkFSSUFOVC4KICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RUb1N0cmluZygpIHsKICAgIExvY2FsZSBEQVRBIFtdID0gewogICAgICAgIExvY2FsZSgieHgiLCAiIiwgIiIpLAogICAgICAgIExvY2FsZSgiIiwgIllZIiwgIiIpLAogICAgICAgIExvY2FsZSgiIiwgIiIsICJaWiIpLAogICAgICAgIExvY2FsZSgieHgiLCAiWVkiLCAiIiksCiAgICAgICAgTG9jYWxlKCJ4eCIsICIiLCAiWloiKSwKICAgICAgICBMb2NhbGUoIiIsICJZWSIsICJaWiIpLAogICAgICAgIExvY2FsZSgieHgiLCAiWVkiLCAiWloiKSwKICAgIH07CgogICAgY29uc3QgY2hhciBEQVRBX1MgW11bMjBdID0gewogICAgICAgICJ4eCIsCiAgICAgICAgIl9ZWSIsCiAgICAgICAgIl9fWloiLAogICAgICAgICJ4eF9ZWSIsCiAgICAgICAgInh4X19aWiIsCiAgICAgICAgIl9ZWV9aWiIsCiAgICAgICAgInh4X1lZX1paIiwKICAgIH07CiAgICAKICAgIGZvciAoaW50MzJfdCBpPTA7IGkgPCA3OyArK2kpIHsKICAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICAgbmFtZSA9IERBVEFbaV0uZ2V0TmFtZSgpOwoKICAgICAgaWYgKHN0cmNtcChuYW1lLCBEQVRBX1NbaV0pICE9IDApCiAgICAgICAgewogICAgICAgICAgICBlcnJsbigiRmFpbDogTG9jYWxlLmdldE5hbWUoKSwgZ290OiIgKyBVbmljb2RlU3RyaW5nKG5hbWUpICsgIiwgZXhwZWN0ZWQ6ICIgKyBEQVRBX1NbaV0pOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvZ2xuKCJQYXNzOiBMb2NhbGUuZ2V0TmFtZSgpLCBnb3Q6IiArIFVuaWNvZGVTdHJpbmcobmFtZSkgKTsKICAgIH0KfQoKLyoqCiAqIEBidWcgNDEzOTk0MAogKiBDb3VsZG4ndCByZXByb2R1Y2UgdGhpcyBidWcgLS0gcHJvYmFibHkgd2FzIGZpeGVkIGVhcmxpZXIuCiAqCiAqIE9SSUdJTkFMIEJVRyBSRVBPUlQ6CiAqIC0tIGJhc2ljYWxseSwgaHVuZ2FyaWFuIGZvciBtb25kYXkgc2hvdWxkbid0IGhhdmUgYW4gXHUwMGY0IAogKiAobyBjaXJjdW1mbGV4KWluIGl0IGluc3RlYWQgaXQgc2hvdWxkIGJlIGFuIG8gd2l0aCAyIGluY2xpbmVkIAogKiAocmlnaHQpIGxpbmVzIG92ZXIgaXQuLgogKgogKiBZb3UgbWF5IHdvbmRlciAtLSB3aHkgZG8gYWxsIHRoaXMgLS0gd2h5IG5vdCBqdXN0IGFkZCBhIGxpbmUgdG8KICogTG9jYWxlRGF0YT8gIFdlbGwsIEkgY291bGQgc2VlIGJ5IGluc3BlY3Rpb24gdGhhdCB0aGUgbG9jYWxlIGZpbGUgaGFkIHRoZQogKiByaWdodCBjaGFyYWN0ZXIgaW4gaXQsIHNvIEkgd2FudGVkIHRvIGNoZWNrIHRoZSByZXN0IG9mIHRoZSBwaXBlbGluZSAtLSBhCiAqIHZlcnkgcmVtb3RlIHBvc3NpYmlsaXR5LCBidXQgSSB3YW50ZWQgdG8gYmUgc3VyZS4gIFRoZSBvdGhlciBwb3NzaWJpbGl0eQogKiBpcyB0aGF0IHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBmb250IG1hcHBpbmcgc3Vic3lzdGVtLCBidXQgd2UgY2FuJ3QKICogdGVzdCB0aGF0IGhlcmUuCiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0NDEzOTk0MCgpIAp7CiAgICBMb2NhbGUgbXlsb2NhbGUoImh1IiwgIiIsICIiKTsgICAgICAgCiAgICBVRGF0ZSBteWRhdGUgPSBkYXRlKDk4LDMsMTMpOyAvLyBBIE1vbmRheQogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAgICBTaW1wbGVEYXRlRm9ybWF0IGRmX2Z1bGwoIkVFRUUiLCBteWxvY2FsZSwgc3RhdHVzKTsKICAgIFVuaWNvZGVTdHJpbmcgc3RyOwogICAgRmllbGRQb3NpdGlvbiBwb3MoRmllbGRQb3NpdGlvbjo6RE9OVF9DQVJFKTsKICAgIGRmX2Z1bGwuZm9ybWF0KG15ZGF0ZSwgc3RyLCBwb3MpOwogICAgLy8gTWFrZSBzdXJlIHRoYXQgbyBjaXJjdW1mbGV4IChcdTAwRjQpIGlzIE5PVCB0aGVyZSwgYW5kCiAgICAvLyBvIGRvdWJsZSBhY3V0ZSAoXHUwMTUxKSBJUy4KICAgIFVDaGFyIG9jZiA9IDB4MDBmNDsKICAgIFVDaGFyIG9kYSA9IDB4MDE1MTsKICAgIGlmIChzdHIuaW5kZXhPZihvZGEpIDwgMCB8fCBzdHIuaW5kZXhPZihvY2YpID49IDApCiAgICAgICAgZXJybG4oIkZhaWw6IE1vbmRheSBpbiBIdW5nYXJpYW4gaXMgd3JvbmciKTsKfQoKVURhdGUKTG9jYWxlVGVzdDo6ZGF0ZShpbnQzMl90IHksIGludDMyX3QgbSwgaW50MzJfdCBkLCBpbnQzMl90IGhyLCBpbnQzMl90IG1pbiwgaW50MzJfdCBzZWMpCnsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgQ2FsZW5kYXIgKmNhbCA9IENhbGVuZGFyOjpjcmVhdGVJbnN0YW5jZShzdGF0dXMpOwogICAgaWYgKGNhbCA9PSAwKSAKICAgICAgICByZXR1cm4gMC4wOwogICAgY2FsLT5jbGVhcigpOwogICAgY2FsLT5zZXQoMTkwMCArIHksIG0sIGQsIGhyLCBtaW4sIHNlYyk7IC8vIEFkZCAxOTAwIHRvIGZvbGxvdyBqYXZhLnV0aWwuRGF0ZSBwcm90b2NvbAogICAgVURhdGUgZHQgPSBjYWwtPmdldFRpbWUoc3RhdHVzKTsKICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkKICAgICAgICByZXR1cm4gMC4wOwogICAgCiAgICBkZWxldGUgY2FsOwogICAgcmV0dXJuIGR0Owp9CgovKioKICogQGJ1ZyA0MTQzOTUxCiAqIFJ1c3NpYW4gZmlyc3QgZGF5IG9mIHdlZWsgc2hvdWxkIGJlIE1vbmRheS4gQ29uZmlybWVkLgogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdDQxNDM5NTEoKSAKewogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAgICBDYWxlbmRhciAqY2FsID0gQ2FsZW5kYXI6OmNyZWF0ZUluc3RhbmNlKExvY2FsZSgicnUiLCAiIiwgIiIpLCBzdGF0dXMpOwogICAgaWYgKGNhbC0+Z2V0Rmlyc3REYXlPZldlZWsoKSAhPSBDYWxlbmRhcjo6TU9OREFZKSB7CiAgICAgICAgZXJybG4oIkZhaWw6IEZpcnN0IGRheSBvZiB3ZWVrIGluIFJ1c3NpYSBzaG91bGQgYmUgTW9uZGF5Iik7CiAgICB9CiAgICBkZWxldGUgY2FsOwp9CgovKioKICogQGJ1ZyA0MTQ3MzE1CiAqIGphdmEudXRpbC5Mb2NhbGUuZ2V0SVNPM0NvdW50cnkoKSB3b3JrcyB3cm9uZyBmb3Igbm9uIElTTy0zMTY2IGNvZGVzLgogKiBTaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciB1bmtub3duIGxvY2FsZXMKICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3Q0MTQ3MzE1KCkgCnsKICBVbmljb2RlU3RyaW5nIHRlbXA7CiAgICAvLyBUcnkgd2l0aCBjb2RlcyB0aGF0IGFyZSB0aGUgd3JvbmcgbGVuZ3RoIGJ1dCBoYXBwZW4gdG8gbWF0Y2ggdGV4dAogICAgLy8gYXQgYSB2YWxpZCBvZmZzZXQgaW4gdGhlIG1hcHBpbmcgdGFibGUKICAgIExvY2FsZSBsb2NhbGUoImFhYSIsICJDQ0MiKTsKICAgIAogICAgY29uc3QgY2hhciAqcmVzdWx0ID0gbG9jYWxlLmdldElTTzNDb3VudHJ5KCk7CgogICAgLy8gQ2hhbmdlIHRvIGNvbmZvcm0gdG8gQyBhcGkgdXNhZ2UKICAgIGlmKChyZXN1bHQ9PU5VTEwpfHwocmVzdWx0WzBdICE9IDApKQogICAgICBlcnJsbigiRVJST1I6IGdldElTTzNDb3VudHJ5KCkgcmV0dXJuczogIiArIFVuaWNvZGVTdHJpbmcocmVzdWx0LCIiKSArIAogICAgICAgICAgICAgICAgIiBmb3IgbG9jYWxlICciICsgKHRlbXA9bG9jYWxlLmdldE5hbWUoKSkgKyAiJyByYXRoZXIgdGhhbiBleGNlcHRpb24iICk7Cn0KCi8qKgogKiBAYnVnIDQxNDczMTcKICogamF2YS51dGlsLkxvY2FsZS5nZXRJU08zTGFuZ3VhZ2UoKSB3b3JrcyB3cm9uZyBmb3Igbm9uIElTTy0zMTY2IGNvZGVzLgogKiBTaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciB1bmtub3duIGxvY2FsZXMKICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3Q0MTQ3MzE3KCkgCnsKICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKICAgIC8vIFRyeSB3aXRoIGNvZGVzIHRoYXQgYXJlIHRoZSB3cm9uZyBsZW5ndGggYnV0IGhhcHBlbiB0byBtYXRjaCB0ZXh0CiAgICAvLyBhdCBhIHZhbGlkIG9mZnNldCBpbiB0aGUgbWFwcGluZyB0YWJsZQogICAgTG9jYWxlIGxvY2FsZSgiYWFhIiwgIkNDQyIpOwogICAgCiAgICBjb25zdCBjaGFyICpyZXN1bHQgPSBsb2NhbGUuZ2V0SVNPM0xhbmd1YWdlKCk7CgogICAgLy8gQ2hhbmdlIHRvIGNvbmZvcm0gdG8gQyBhcGkgdXNhZ2UKICAgIGlmKChyZXN1bHQ9PU5VTEwpfHwocmVzdWx0WzBdICE9IDApKQogICAgICBlcnJsbigiRVJST1I6IGdldElTTzNMYW5ndWFnZSgpIHJldHVybnM6ICIgKyBVbmljb2RlU3RyaW5nKHJlc3VsdCwiIikgKyAKICAgICAgICAgICAgICAgICIgZm9yIGxvY2FsZSAnIiArICh0ZW1wPWxvY2FsZS5nZXROYW1lKCkpICsgIicgcmF0aGVyIHRoYW4gZXhjZXB0aW9uIiApOwp9CgovKgogKiBAYnVnIDQxNDc1NTIKICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3Q0MTQ3NTUyKCkgCnsKICAgIExvY2FsZSBsb2NhbGVzIFtdID0geyAgICAgTG9jYWxlKCJubyIsICJOTyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgibm8iLCAiTk8iLCAiQiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgibm8iLCAiTk8iLCAiTlkiKSAKICAgIH07CiAgICAKICAgIFVuaWNvZGVTdHJpbmcgZWRuKCJOb3J3ZWdpYW4gKE5vcndheSwgQm9rbSIpOwogICAgZWRuICs9IChVQ2hhcjMyKTB4MDBlNTsKICAgIGVkbiArPSAibCkiOwogICAgVW5pY29kZVN0cmluZyBlbmdsaXNoRGlzcGxheU5hbWVzIFtdID0geyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vcndlZ2lhbiAoTm9yd2F5KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAiTm9yd2VnaWFuIChOb3J3YXksQikiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8iTm9yd2VnaWFuIChOb3J3YXksTlkpIiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3J3ZWdpYW4gKE5vcndheSwgTnlub3JzaykiIAogICAgfTsKICAgIFVuaWNvZGVTdHJpbmcgbmRuKCJub3JzayAoTm9yZ2UsIEJva20iKTsKICAgIG5kbiArPSAoVUNoYXIzMikweDAwZTU7CiAgICBuZG4gKz0gImwpIjsKICAgIFVuaWNvZGVTdHJpbmcgbm9yd2VnaWFuRGlzcGxheU5hbWVzIFtdID0geyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vcnNrIChOb3JnZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyJub3JzayAoTm9yZ2UsQikiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIm5vcnNrIChOb3JnZSxOWSkiIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vcnNrIChOb3JlZywgTnlub3JzaykiIAogICAgfTsKCiAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICAgICBMb2NhbGUgbG9jID0gbG9jYWxlc1tpXTsKICAgICAgICBVbmljb2RlU3RyaW5nIHRlbXA7CiAgICAgICAgaWYgKGxvYy5nZXREaXNwbGF5TmFtZSh0ZW1wKSAhPSBlbmdsaXNoRGlzcGxheU5hbWVzW2ldKQogICAgICAgICAgIGVycmxuKCJFbmdsaXNoIGRpc3BsYXktbmFtZSBtaXNtYXRjaDogZXhwZWN0ZWQgIiArCiAgICAgICAgICAgICAgICAgICBlbmdsaXNoRGlzcGxheU5hbWVzW2ldICsgIiwgZ290ICIgKyBsb2MuZ2V0RGlzcGxheU5hbWUodGVtcCkpOwogICAgICAgIGlmIChsb2MuZ2V0RGlzcGxheU5hbWUobG9jLCB0ZW1wKSAhPSBub3J3ZWdpYW5EaXNwbGF5TmFtZXNbaV0pCiAgICAgICAgICAgIGVycmxuKCJOb3J3ZWdpYW4gZGlzcGxheS1uYW1lIG1pc21hdGNoOiBleHBlY3RlZCAiICsKICAgICAgICAgICAgICAgICAgIG5vcndlZ2lhbkRpc3BsYXlOYW1lc1tpXSArICIsIGdvdCAiICsKICAgICAgICAgICAgICAgICAgIGxvYy5nZXREaXNwbGF5TmFtZShsb2MsIHRlbXApKTsKICAgIH0KfQoKdm9pZApMb2NhbGVUZXN0OjpUZXN0VmFyaWFudFBhcnNpbmcoKQp7CiAgICBMb2NhbGUgZW5fVVNfY3VzdG9tKCJlbiIsICJVUyIsICJEZSBBbnphX0N1cGVydGlub19DYWxpZm9ybmlhX1VuaXRlZCBTdGF0ZXNfRWFydGgiKTsKCiAgICBVbmljb2RlU3RyaW5nIGRpc3BOYW1lKCJFbmdsaXNoIChVbml0ZWQgU3RhdGVzLCBERSBBTlpBX0NVUEVSVElOT19DQUxJRk9STklBX1VOSVRFRCBTVEFURVNfRUFSVEgpIik7CiAgICBVbmljb2RlU3RyaW5nIGRpc3BWYXIoIkRFIEFOWkFfQ1VQRVJUSU5PX0NBTElGT1JOSUFfVU5JVEVEIFNUQVRFU19FQVJUSCIpOwogICAgCiAgICBVbmljb2RlU3RyaW5nIGdvdDsKICAgIAogICAgZW5fVVNfY3VzdG9tLmdldERpc3BsYXlWYXJpYW50KExvY2FsZTo6Z2V0VVMoKSwgZ290KTsKICAgIGlmKGdvdCAhPSBkaXNwVmFyKSB7CiAgICAgICAgZXJybG4oIkZBSUw6IGdldERpc3BsYXlWYXJpYW50KCkiKTsKICAgICAgICBlcnJsbigiV2FudGVkOiAiICsgZGlzcFZhcik7CiAgICAgICAgZXJybG4oIkdvdCAgIDogIiArIGdvdCk7CiAgICB9CgogICAgZW5fVVNfY3VzdG9tLmdldERpc3BsYXlOYW1lKExvY2FsZTo6Z2V0VVMoKSwgZ290KTsKICAgIGlmKGdvdCAhPSBkaXNwTmFtZSkgewogICAgICAgIGVycmxuKCJGQUlMOiBnZXREaXNwbGF5TmFtZSgpIik7CiAgICAgICAgZXJybG4oIldhbnRlZDogIiArIGRpc3BOYW1lKTsKICAgICAgICBlcnJsbigiR290ICAgOiAiICsgZ290KTsKICAgIH0KCiAgICBMb2NhbGUgc2hvcnRWYXJpYW50KCJmciIsICJGUiIsICJmb28iKTsKICAgIHNob3J0VmFyaWFudC5nZXREaXNwbGF5VmFyaWFudChnb3QpOwogICAgCiAgICBpZihnb3QgIT0gIkZPTyIpIHsKICAgICAgICBlcnJsbigiRkFJTDogZ2V0RGlzcGxheVZhcmlhbnQoKSIpOwogICAgICAgIGVycmxuKCJXYW50ZWQ6IGZvbyIpOwogICAgICAgIGVycmxuKCJHb3QgICA6ICIgKyBnb3QpOwogICAgfQoKICAgIExvY2FsZSBib2d1c1ZhcmlhbnQoImZyIiwgIkZSIiwgIl9mb28iKTsKICAgIGJvZ3VzVmFyaWFudC5nZXREaXNwbGF5VmFyaWFudChnb3QpOwogICAgCiAgICBpZihnb3QgIT0gIkZPTyIpIHsKICAgICAgICBlcnJsbigiRkFJTDogZ2V0RGlzcGxheVZhcmlhbnQoKSIpOwogICAgICAgIGVycmxuKCJXYW50ZWQ6IGZvbyIpOwogICAgICAgIGVycmxuKCJHb3QgICA6ICIgKyBnb3QpOwogICAgfQoKICAgIExvY2FsZSBib2d1c1ZhcmlhbnQyKCJmciIsICJGUiIsICJmb29fIik7CiAgICBib2d1c1ZhcmlhbnQyLmdldERpc3BsYXlWYXJpYW50KGdvdCk7CiAgICAKICAgIGlmKGdvdCAhPSAiRk9PIikgewogICAgICAgIGVycmxuKCJGQUlMOiBnZXREaXNwbGF5VmFyaWFudCgpIik7CiAgICAgICAgZXJybG4oIldhbnRlZDogZm9vIik7CiAgICAgICAgZXJybG4oIkdvdCAgIDogIiArIGdvdCk7CiAgICB9CgogICAgTG9jYWxlIGJvZ3VzVmFyaWFudDMoImZyIiwgIkZSIiwgIl9mb29fIik7CiAgICBib2d1c1ZhcmlhbnQzLmdldERpc3BsYXlWYXJpYW50KGdvdCk7CiAgICAKICAgIGlmKGdvdCAhPSAiRk9PIikgewogICAgICAgIGVycmxuKCJGQUlMOiBnZXREaXNwbGF5VmFyaWFudCgpIik7CiAgICAgICAgZXJybG4oIldhbnRlZDogZm9vIik7CiAgICAgICAgZXJybG4oIkdvdCAgIDogIiArIGdvdCk7CiAgICB9Cn0KCi8qKgogKiBAYnVnIDQxMDU4MjgKICogQ3VycmVuY3kgc3ltYm9sIGluIHpoIGlzIHdyb25nLiAgV2Ugd2lsbCB0ZXN0IHRoaXMgYXQgdGhlIE51bWJlckZvcm1hdAogKiBlbmQgdG8gdGVzdCB0aGUgd2hvbGUgcGlwZS4KICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3Q0MTA1ODI4KCkgCnsKICAgIExvY2FsZSBMT0MgW10gPSB7IExvY2FsZTo6Z2V0Q2hpbmVzZSgpLCAgTG9jYWxlKCJ6aCIsICJDTiIsICIiKSwKICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCJ6aCIsICJUVyIsICIiKSwgTG9jYWxlKCJ6aCIsICJISyIsICIiKSB9OwogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICBOdW1iZXJGb3JtYXQgKmZtdCA9IE51bWJlckZvcm1hdDo6Y3JlYXRlUGVyY2VudEluc3RhbmNlKExPQ1tpXSwgc3RhdHVzKTsKICAgICAgICBpZihVX0ZBSUxVUkUoc3RhdHVzKSkgewogICAgICAgICAgICBlcnJsbigiQ291bGRuJ3QgY3JlYXRlIE51bWJlckZvcm1hdCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIFVuaWNvZGVTdHJpbmcgcmVzdWx0OwogICAgICAgIEZpZWxkUG9zaXRpb24gcG9zKDApOwogICAgICAgIGZtdC0+Zm9ybWF0KChpbnQzMl90KTEsIHJlc3VsdCwgcG9zKTsKICAgICAgICBVbmljb2RlU3RyaW5nIHRlbXA7CiAgICAgICAgaWYocmVzdWx0ICE9ICIxMDAlIikgewogICAgICAgICAgICBlcnJsbihVbmljb2RlU3RyaW5nKCJQZXJjZW50IGZvciAiKSArIExPQ1tpXS5nZXREaXNwbGF5TmFtZSh0ZW1wKSArICIgc2hvdWxkIGJlIDEwMCUsIGdvdCAiICsgcmVzdWx0KTsKICAgICAgICB9CiAgICAgICAgZGVsZXRlIGZtdDsKICAgIH0KfQoKLy8gVGVzdHMgc2V0Qm9ndXMgYW5kIGlzQm9ndXMgQVBJcyBmb3IgTG9jYWxlCi8vIEppdHRlcmJ1ZyAxNzM1CnZvaWQKTG9jYWxlVGVzdDo6VGVzdFNldElzQm9ndXMoKSB7CiAgTG9jYWxlIGwoImVuX1VTIik7CiAgbC5zZXRUb0JvZ3VzKCk7CiAgaWYobC5pc0JvZ3VzKCkgIT0gVFJVRSkgewogICAgZXJybG4oIkFmdGVyIHNldHRpbmcgYm9ndXMsIGRpZG4ndCByZXR1cm4gVFJVRSIpOwogIH0KICBsID0gImVuX1VTIjsgLy8gVGhpcyBzaG91bGQgcmVzZXQgYm9ndXMKICBpZihsLmlzQm9ndXMoKSAhPSBGQUxTRSkgewogICAgZXJybG4oIkFmdGVyIHJlc2V0dGluZyBib2d1cywgZGlkbid0IHJldHVybiBGQUxTRSIpOwogIH0KfQoK