cGFja2FnZSBjb20uaWJtLmljdS5kZXYudGVzdC5ub3JtYWxpemVyOwoKaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CgovKioKICogSW50ZWdlciBoYXNoIHRhYmxlLiBVc2VzIEphdmEgSGFzaHRhYmxlIGZvciBub3cuCiAqIEBhdXRob3IgTWFyayBEYXZpcwogKi8KIApwdWJsaWMgY2xhc3MgSW50SGFzaHRhYmxlIHsKICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIkNvcHlyaWdodCCpIDE5OTgtMTk5OSBVbmljb2RlLCBJbmMuIjsKICAgIAogICAgcHVibGljIEludEhhc2h0YWJsZSAoaW50IGRlZmF1bHRWYWx1ZSkgewogICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwogICAgfQogICAgCiAgICBwdWJsaWMgdm9pZCBwdXQoaW50IGtleSwgaW50IHZhbHVlKSB7CiAgICAgICAgaWYgKHZhbHVlID09IGRlZmF1bHRWYWx1ZSkgewogICAgICAgICAgICB0YWJsZS5yZW1vdmUobmV3IEludGVnZXIoa2V5KSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGFibGUucHV0KG5ldyBJbnRlZ2VyKGtleSksIG5ldyBJbnRlZ2VyKHZhbHVlKSk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBwdWJsaWMgaW50IGdldChpbnQga2V5KSB7CiAgICAgICAgT2JqZWN0IHZhbHVlID0gdGFibGUuZ2V0KG5ldyBJbnRlZ2VyKGtleSkpOwogICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gZGVmYXVsdFZhbHVlOwogICAgICAgIHJldHVybiAoKEludGVnZXIpdmFsdWUpLmludFZhbHVlKCk7CiAgICB9CiAgICAKICAgIHByaXZhdGUgaW50IGRlZmF1bHRWYWx1ZTsKICAgIHByaXZhdGUgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwp9