LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiBDT1BZUklHSFQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgIChDKSBDb3B5cmlnaHQgVGFsaWdlbnQsIEluYy4sICAxOTk2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgIChDKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiwgIDE5OTkgICAgICAgICAgICAgICAgICAgICoKKiAgIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvZ3JhbS1Qcm9wZXJ0eSBvZiBJQk0gLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICoKKiAgIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uLCBvciBkaXNjbG9zdXJlICAgICAgICAgICAgICoKKiAgIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIEZpbGUgQ0xPQ1RTVC5DCioKKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKiAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgCiogICAgIE1hZGh1IEthdHJhZ2FkZGEgICAgICAgICAgICBQb3J0ZWQgZm9yIENBUEkKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCiNpbmNsdWRlICJ1dHlwZXMuaCIKI2luY2x1ZGUgInV0eXBlcy5oIgojaW5jbHVkZSAiY2xvY3RzdC5oIgojaW5jbHVkZSAidWxvYy5oIgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAidXN0cmluZy5oIgojaW5jbHVkZSAiY2ludGx0c3QuaCIKCnZvaWQgUHJpbnREYXRhVGFibGUoKTsKCnN0YXRpYyBjaGFyKiByYXdEYXRhMlsyM11bNV07CgpzdGF0aWMgVUNoYXIqKiogZGF0YVRhYmxlPTA7CmVudW0gewogICAgRU5HTElTSCA9IDAsCiAgICBGUkVOQ0ggPSAxLAogICAgQ1JPQVRJQU4gPSAyLAogICAgR1JFRUtTID0gMywKICAgIE5PUldFR0lBTiA9IDQsCiAgICBNQVhfTE9DQUxFUyA9IDQKfTsKCmVudW0gewogICAgTEFORyA9IDAsCiAgICBDVFJZID0gMSwKICAgIFZBUiA9IDIsCiAgICBOQU1FID0gMywKICAgIExBTkczID0gNCwKICAgIENUUlkzID0gNSwKICAgIExDSUQgPSA2LAogICAgRExBTkdfRU4gPSA3LAogICAgRENUUllfRU4gPSA4LAogICAgRFZBUl9FTiA9IDksCiAgICBETkFNRV9FTiA9IDEwLAogICAgRExBTkdfRlIgPSAxMSwKICAgIERDVFJZX0ZSID0gMTIsCiAgICBEVkFSX0ZSID0gMTMsCiAgICBETkFNRV9GUiA9IDE0LAogICAgRExBTkdfSFIgPSAxNSwKICAgIERDVFJZX0hSID0gMTYsCiAgICBEVkFSX0hSID0gMTcsCiAgICBETkFNRV9IUiA9IDE4LAogICAgRExBTkdfRUwgPSAxOSwKICAgIERDVFJZX0VMID0gMjAsCiAgICBEVkFSX0VMID0gMjEsCiAgICBETkFNRV9FTCA9IDIyCn07CgoKdm9pZCBhZGRMb2NhbGVUZXN0KFRlc3ROb2RlKiogcm9vdCkKewogICAgc2V0VXBEYXRhVGFibGUoKTsKICAgIAogICAgYWRkVGVzdChyb290LCAmVGVzdEJhc2ljR2V0dGVycywgInRzdXRpbC9jbG9jdHN0L1Rlc3RCYXNpY0dldHRlcnMiKTsKICAgIGFkZFRlc3Qocm9vdCwgJlRlc3REaXNwbGF5TmFtZXMsICJ0c3V0aWwvY2xvY3RzdC9UZXN0RGlzcGxheU5hbWVzIik7CiAgICBhZGRUZXN0KHJvb3QsICZUZXN0R2V0QXZhaWxhYmxlTG9jYWxlcywgInRzdXRpbC9jbG9jdHN0L1Rlc3RHZXRBdmFpbGFibGVMb2NhbGVzIik7CiAgICBhZGRUZXN0KHJvb3QsICZUZXN0RGF0YURpcmVjdG9yeSwgInRzdXRpbC9jbG9jdHN0L1Rlc3REYXRhRGlyZWN0b3J5Iik7CiAgICBhZGRUZXN0KHJvb3QsICZUZXN0SVNPRnVuY3Rpb25zLCAidHN1dGlsL2Nsb2N0c3QvVGVzdElTT0Z1bmN0aW9ucyIpOwp9CiAgICAgICAgCgovKiB0ZXN0aW5nIHVsb2MoKSwgdWxvY19nZXROYW1lKCksIHVsb2NfZ2V0TGFuZ3VhZ2UoKSwgdWxvY19nZXRWYXJpYW50KCksIHVsb2NfZ2V0Q291bnRyeSgpICovCnZvaWQgVGVzdEJhc2ljR2V0dGVycygpIHsKICAgIGludDMyX3QgaTsKICAgIGludDMyX3QgY2FwOwogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBaRVJPX0VSUk9SOwogICAgY2hhciAqdGVzdExvY2FsZSA9IDA7CiAgICBjaGFyICp0ZW1wID0gMCwgKm5hbWUgPSAwOwogICAgbG9nX3ZlcmJvc2UoIlRlc3RpbmcgQmFzaWMgR2V0dGVyc1xuIik7CiAgICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT0NBTEVTOyBpKyspIHsKICAgICAgICB0ZXN0TG9jYWxlPShjaGFyKiltYWxsb2Moc2l6ZW9mKGNoYXIpICogKHN0cmxlbihyYXdEYXRhMltOQU1FXVtpXSkrMSkpOwogICAgICAgIHN0cmNweSh0ZXN0TG9jYWxlLHJhd0RhdGEyW05BTUVdW2ldKTsKICAgICAgICAKICAgICAgICBsb2dfdmVyYm9zZSgiVGVzdGluZyAgICVzICAuLi4uLlxuIiwgdGVzdExvY2FsZSk7CiAgICAgICAgY2FwPXVsb2NfZ2V0TGFuZ3VhZ2UodGVzdExvY2FsZSwgTlVMTCwgMCwgJnN0YXR1cyk7CiAgICAgICAgaWYoc3RhdHVzPT1CVUZGRVJfT1ZFUkZMT1dfRVJST1IpewogICAgICAgICAgICBzdGF0dXM9WkVST19FUlJPUjsKICAgICAgICAgICAgdGVtcD0oY2hhciopbWFsbG9jKHNpemVvZihjaGFyKSAqIChjYXArMSkpOwogICAgICAgICAgICB1bG9jX2dldExhbmd1YWdlKHRlc3RMb2NhbGUsIHRlbXAsIGNhcCwgJnN0YXR1cyk7CiAgICAgICAgfQogICAgICAgIGlmKEZBSUxVUkUoc3RhdHVzKSl7CiAgICAgICAgICAgIGxvZ19lcnIoIkVSUk9SOiBpbiB1bG9jX2dldExhbmd1YWdlICAlc1xuIiwgbXlFcnJvck5hbWUoc3RhdHVzKSk7CiAgICAgICAgfQogICAgICAgIGlmICgwICE9c3RyY21wKHRlbXAscmF3RGF0YTJbTEFOR11baV0pKSAgICB7CiAgICAgICAgICAgIGxvZ19lcnIoIiAgTGFuZ3VhZ2UgY29kZSBtaXNtYXRjaDogJXMgdmVyc3VzICAlc1xuIiwgdGVtcCwgcmF3RGF0YTJbTEFOR11baV0pOyAKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIAogICAgICAgIGNhcD11bG9jX2dldENvdW50cnkodGVzdExvY2FsZSwgdGVtcCwgY2FwLCAmc3RhdHVzKTsKICAgICAgICBpZihzdGF0dXM9PUJVRkZFUl9PVkVSRkxPV19FUlJPUil7CiAgICAgICAgICAgIHN0YXR1cz1aRVJPX0VSUk9SOwogICAgICAgICAgICB0ZW1wPShjaGFyKilyZWFsbG9jKHRlbXAsIHNpemVvZihjaGFyKSAqIChjYXArMSkpOwogICAgICAgICAgICB1bG9jX2dldENvdW50cnkodGVzdExvY2FsZSwgdGVtcCwgY2FwLCAmc3RhdHVzKTsKICAgICAgICB9CiAgICAgICAgaWYoRkFJTFVSRShzdGF0dXMpKXsKICAgICAgICAgICAgbG9nX2VycigiRVJST1I6IGluIHVsb2NfZ2V0Q291bnRyeSAgJXNcbiIsIG15RXJyb3JOYW1lKHN0YXR1cykpOwogICAgICAgIH0KICAgICAgICBpZiAoMCAhPSBzdHJjbXAodGVtcCwgcmF3RGF0YTJbQ1RSWV1baV0pKSB7CiAgICAgICAgICAgIGxvZ19lcnIoIiBDb3VudHJ5IGNvZGUgbWlzbWF0Y2g6ICAlcyAgdmVyc3VzICAgJXNcbiIsIHRlbXAsIHJhd0RhdGEyW0NUUlldW2ldKTsKICAgICAgICAgICAgCiAgICAgICAgICB9CgogICAgICAgIGNhcD11bG9jX2dldFZhcmlhbnQodGVzdExvY2FsZSwgdGVtcCwgY2FwLCAmc3RhdHVzKTsKICAgICAgICBpZihzdGF0dXM9PUJVRkZFUl9PVkVSRkxPV19FUlJPUil7CiAgICAgICAgICAgIHN0YXR1cz1aRVJPX0VSUk9SOwogICAgICAgICAgICB0ZW1wPShjaGFyKilyZWFsbG9jKHRlbXAsIHNpemVvZihjaGFyKSAqIChjYXArMSkpOwogICAgICAgICAgICB1bG9jX2dldFZhcmlhbnQodGVzdExvY2FsZSwgdGVtcCwgY2FwLCAmc3RhdHVzKTsKICAgICAgICB9CiAgICAgICAgaWYoRkFJTFVSRShzdGF0dXMpKXsKICAgICAgICAgICAgbG9nX2VycigiRVJST1I6IGluIHVsb2NfZ2V0VmFyaWFudCAgJXNcbiIsIG15RXJyb3JOYW1lKHN0YXR1cykpOwogICAgICAgIH0KICAgICAgICBpZiAoMCAhPSBzdHJjbXAodGVtcCwgcmF3RGF0YTJbVkFSXVtpXSkpIHsKICAgICAgICAgICAgCiAgICAgICAgICAgIGxvZ19lcnIoIlZhcmlhbnQgY29kZSBtaXNtYXRjaDogICVzICB2ZXJzdXMgICAlc1xuIiwgdGVtcCwgcmF3RGF0YTJbVkFSXVtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgfQogICAgICAgIAogICAgICAgICAgIAogICAgICAgIGNhcD11bG9jX2dldE5hbWUodGVzdExvY2FsZSwgTlVMTCwgMCwgJnN0YXR1cyk7CiAgICAgICAgaWYoc3RhdHVzPT1CVUZGRVJfT1ZFUkZMT1dfRVJST1IpewogICAgICAgICAgICBzdGF0dXM9WkVST19FUlJPUjsKICAgICAgICAgICAgbmFtZT0oY2hhciopbWFsbG9jKHNpemVvZihjaGFyKSAqIChjYXArMSkpOwogICAgICAgICAgICB1bG9jX2dldE5hbWUodGVzdExvY2FsZSwgbmFtZSwgY2FwLCAmc3RhdHVzKTsKICAgICAgICB9CiAgICAgICAgaWYoRkFJTFVSRShzdGF0dXMpKXsKICAgICAgICAgICAgbG9nX2VycigiRVJST1I6IGluIHVsb2NfZ2V0TmFtZSAgICVzXG4iLCBteUVycm9yTmFtZShzdGF0dXMpKTsKICAgICAgICB9CiAgICAgICAgaWYgKDAgIT0gc3RyY21wKG5hbWUsIHJhd0RhdGEyW05BTUVdW2ldKSl7CiAgICAgICAgICAgIGxvZ19lcnIoIiBNaXNtYXRjaCBpbiBnZXROYW1lOiAgJXMgIHZlcnN1cyAgICVzXG4iLCBuYW1lLCByYXdEYXRhMltOQU1FXVtpXSk7CiAgICAgICAgfQoKICAgIAogICAgICAgIGZyZWUodGVtcCk7CiAgICAgICAgZnJlZShuYW1lKTsKICAgICAgICAKICAgIGZyZWUodGVzdExvY2FsZSk7CiAgICB9CiAgCn0KLyogdGVzdGluZyB1bG9jX2dldElTTzNMYW5ndWFnZSgpLCB1bG9jX2dldElTTzNDb3VudHJ5KCksICAqLwp2b2lkIFRlc3RTaW1wbGVSZXNvdXJjZUluZm8oKSB7CgogICAgaW50MzJfdCBpOwogICAgY2hhciogdGVzdExvY2FsZSA9IDA7CiAgICBVQ2hhciogZXhwZWN0ZWQgPSAwOwogICAgCiAgICBjb25zdCBjaGFyKiB0ZW1wOwogICAgdGVzdExvY2FsZT0oY2hhciopbWFsbG9jKHNpemVvZihjaGFyKSAqIDEpOwogICAgZXhwZWN0ZWQ9KFVDaGFyKiltYWxsb2Moc2l6ZW9mKFVDaGFyKSAqIDEpOwogICAgCiAgICBsb2dfdmVyYm9zZSgiVGVzdGluZyBnZXRJU08zTGFuZ3VhZ2UgYW5kIGdldElTTzNDb3VudHJ5XG4iKTsKICAgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xPQ0FMRVM7IGkrKykgewogICAgICAgIAogICAgICAgIHRlc3RMb2NhbGU9KGNoYXIqKXJlYWxsb2ModGVzdExvY2FsZSwgc2l6ZW9mKGNoYXIpICogKHVfc3RybGVuKGRhdGFUYWJsZVtOQU1FXVtpXSkrMSkpOwogICAgICAgIHVfYXVzdHJjcHkodGVzdExvY2FsZSwgZGF0YVRhYmxlW05BTUVdW2ldKTsKICAgICAgICAgICAgIAogICAgICAgIGxvZ192ZXJib3NlKCJUZXN0aW5nICAgJXMgLi4uLi4uXG4iLCB0ZXN0TG9jYWxlKTsKICAgICAgICAgICAgCiAgICAgICAgdGVtcD11bG9jX2dldElTTzNMYW5ndWFnZSh0ZXN0TG9jYWxlKTsKICAgICAgICBleHBlY3RlZD0oVUNoYXIqKXJlYWxsb2MoZXhwZWN0ZWQsIHNpemVvZihVQ2hhcikgKiAoc3RybGVuKHRlbXApICsgMSkpOwogICAgICAgIHVfdWFzdHJjcHkoZXhwZWN0ZWQsdGVtcCk7CiAgICAgICAgaWYgKDAgIT0gdV9zdHJjbXAoZXhwZWN0ZWQsIGRhdGFUYWJsZVtMQU5HM11baV0pKSB7CiAgICAgICAgICAgICBsb2dfZXJyKCIgIElTTy0zIGxhbmd1YWdlIGNvZGUgbWlzbWF0Y2g6ICAlcyB2ZXJzdXMgICVzXG4iLCAgYXVzdHJkdXAoZXhwZWN0ZWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXN0cmR1cChkYXRhVGFibGVbTEFORzNdW2ldKSk7CiAgICAgICAgIH0gCiAgICAgICAgCiAgICAgICAgdGVtcD11bG9jX2dldElTTzNDb3VudHJ5KHRlc3RMb2NhbGUpOwogICAgICAgIGV4cGVjdGVkPShVQ2hhciopcmVhbGxvYyhleHBlY3RlZCwgc2l6ZW9mKFVDaGFyKSAqIChzdHJsZW4odGVtcCkgKyAxKSk7CiAgICAgICAgdV91YXN0cmNweShleHBlY3RlZCx0ZW1wKTsKICAgICAgICBpZiAoMCAhPSB1X3N0cmNtcChleHBlY3RlZCwgZGF0YVRhYmxlW0NUUlkzXVtpXSkpIHsKICAgICAgICAgICAgbG9nX2VycigiICBJU08tMyBDb3VudHJ5IGNvZGUgbWlzbWF0Y2g6ICAlcyB2ZXJzdXMgICVzXG4iLCAgYXVzdHJkdXAoZXhwZWN0ZWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXN0cmR1cChkYXRhVGFibGVbQ1RSWTNdW2ldKSk7CiAgICAgICAgfSAKICAgICAgICAgIAogICAgfQogICAgCiBmcmVlKGV4cGVjdGVkKTsKIGZyZWUodGVzdExvY2FsZSk7Cn0Kdm9pZCBUZXN0RGlzcGxheU5hbWVzKCkgCnsKICAvKiBzZmIgOTkwNzIxIAogICAgIENhbid0IGp1c3Qgc2F2ZSBhIHBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgbG9jYWxlLiAgCiAgICAgQWx0aG91Z2ggdGhlIHBvaW50ZXIgd29uJ3QgY2hhbmdlLCB0aGUgY29udGVudHMgd2lsbCwgc28gdGhlCiAgICAgcmVzdG9yZSBhdCB0aGUgZW5kIGRvZXNuJ3QgYWN0dWFsbHkgcmVzdG9yZSB0aGUgb3JpZ2luYWwuCiAgKi8KICAgIGNvbnN0IGNoYXIgKnNhdmVEZWZhdWx0OwogICAgY2hhciAqZGVmYXVsdExvY2FsZTsKICAgIAogICAgVUVycm9yQ29kZSBlcnIgPSBaRVJPX0VSUk9SOwogICAgCgogICAgc2F2ZURlZmF1bHQgPSB1bG9jX2dldERlZmF1bHQoKTsKICAgIGRlZmF1bHRMb2NhbGUgPSAoY2hhciopIG1hbGxvYyhzdHJsZW4oc2F2ZURlZmF1bHQpICsgMSk7CiAgICBpZihkZWZhdWx0TG9jYWxlID09IDApIHsKICAgICAgbG9nX2Vycigib3V0IG9mIG1lbW9yeSIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBzdHJjcHkoZGVmYXVsdExvY2FsZSwgc2F2ZURlZmF1bHQpOwoKICAgIHVsb2Nfc2V0RGVmYXVsdCgiZW5fVVMiLCAmZXJyKTsKICAgIGlmIChGQUlMVVJFKGVycikpIHsKICAgICAgICBsb2dfZXJyKCJ1bG9jX3NldERlZmF1bHQgcmV0dXJuZWQgZXJyb3IgY29kZSAiKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAKICAgIAogICAgbG9nX3ZlcmJvc2UoIlRlc3RpbmcgZ2V0RGlzcGxheU5hbWUgZm9yIGRpZmZlcmVudCBsb2NhbGVzXG4iKTsKICAgIGxvZ192ZXJib3NlKCJXaXRoIGRlZmF1bHQgPSBlbl9VUy4uLlxuIik7CiAgIAogICAgbG9nX3ZlcmJvc2UoIiAgSW4gZGVmYXVsdCBsb2NhbGUuLi5cbiIpOwogICAgZG9UZXN0RGlzcGxheU5hbWVzKCIgIiwgRExBTkdfRU4sIEZBTFNFKTsKICAgIGxvZ192ZXJib3NlKCIgIEluIGxvY2FsZSA9IGVuX1VTLi4uXG4iKTsKICAgIGRvVGVzdERpc3BsYXlOYW1lcygiZW5fVVMiLCBETEFOR19FTiwgRkFMU0UpOwogICAgbG9nX3ZlcmJvc2UoIiAgSW4gbG9jYWxlID0gZnJfRlIuLi4uXG4iKTsKICAgIGRvVGVzdERpc3BsYXlOYW1lcygiZnJfRlIiLCBETEFOR19GUiwgRkFMU0UpOwogICAgbG9nX3ZlcmJvc2UoIiAgSW4gbG9jYWxlID0gaHJfSFIuLi5cbiIpOwogICAgZG9UZXN0RGlzcGxheU5hbWVzKCJocl9IUiIsIERMQU5HX0hSLCBGQUxTRSk7CiAgICBsb2dfdmVyYm9zZSgiICBJbiBsb2NhbGUgPSBncl9FTC4uXG4iKTsKICAgIGRvVGVzdERpc3BsYXlOYW1lcygiZWxfR1IiLCBETEFOR19FTCwgRkFMU0UpOwoKICAgdWxvY19zZXREZWZhdWx0KCJmcl9GUiIsICZlcnIpOwogICAgaWYgKEZBSUxVUkUoZXJyKSkgewogICAgICAgIGxvZ19lcnIoIkxvY2FsZTo6c2V0RGVmYXVsdCByZXR1cm5lZCBlcnJvciBjb2RlICAlc1xuIiwgbXlFcnJvck5hbWUoZXJyKSk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgCiAgICBsb2dfdmVyYm9zZSgiV2l0aCBkZWZhdWx0ID0gZnJfRlIuLi5cbiIpOwogICAgCiAgICBsb2dfdmVyYm9zZSgiICBJbiBkZWZhdWx0IGxvY2FsZS4uLlxuIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoIiAiLCBETEFOR19GUiwgVFJVRSk7CiAgICBsb2dfdmVyYm9zZSgiICBJbiBsb2NhbGUgPSBlbl9VUy4uLlxuIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoImVuX1VTIiwgRExBTkdfRU4sIFRSVUUpOwogICAgbG9nX3ZlcmJvc2UoIiAgSW4gbG9jYWxlID0gZnJfRlIuLi4uXG4iKTsKICAgIGRvVGVzdERpc3BsYXlOYW1lcygiZnJfRlIiLCBETEFOR19GUiwgVFJVRSk7CiAgICBsb2dfdmVyYm9zZSgiICBJbiBsb2NhbGUgPSBocl9IUi4uLlxuIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoImhyX0hSIiwgRExBTkdfSFIsIFRSVUUpOwogICAgbG9nX3ZlcmJvc2UoIiAgSW4gbG9jYWxlID0gZWxfR1IuLi5cbiIpOwogICAgZG9UZXN0RGlzcGxheU5hbWVzKCJlbF9HUiIsIERMQU5HX0VMLCBUUlVFKTsKCiAgICB1bG9jX3NldERlZmF1bHQoZGVmYXVsdExvY2FsZSwgJmVycik7CiAgICBpZiAoRkFJTFVSRShlcnIpKSB7CiAgICAgICAgbG9nX2VycigiTG9jYWxlOjpzZXREZWZhdWx0IHJldHVybmVkIGVycm9yIGNvZGUgICVzXG4iLCBteUVycm9yTmFtZShlcnIpKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZnJlZShkZWZhdWx0TG9jYWxlKTsKCn0KCgovKiB0ZXN0IGZvciB1bG9jX2dldEF2aWFsYWJsZSgpICBhbmQgdWxvY19jb3VudEF2aWxhYmxlKCkqLwp2b2lkIFRlc3RHZXRBdmFpbGFibGVMb2NhbGVzKCkKewoKICAgIGNvbnN0IGNoYXIgKmxvY0xpc3Q7CiAgICBpbnQzMl90IGxvY0NvdW50LGk7CiAgICAKICAgIGxvZ192ZXJib3NlKCJUZXN0aW5nIHRoZSBubyBvZiBhdmlhbGFibGUgbG9jYWxlc1xuIik7CiAgICBsb2NDb3VudD11bG9jX2NvdW50QXZhaWxhYmxlKCk7CiAgICBpZiAobG9jQ291bnQgPT0gMCkKICAgICAgICBsb2dfZXJyKCJjb3VudEF2YWlsYWJsZSgpIHJldHVybmVkIGFuIGVtcHR5IGxpc3QhXG4iKTsKICAgIAogICAgLyogdXNlIHNvbWV0aGluZyBzZW5zaWJsZSB3L28gaGFyZGNvZGluZyB0aGUgY291bnQgKi8KICAgIGVsc2UgaWYobG9jQ291bnQgPCAwKXsgCiAgICAgICAgbG9nX2VycigiY291bnRBdmFpbGFibGUoKSByZXR1cm5lZCBhIHdyb25nIHZhbHVlIT0gJWRcbiIsIGxvY0NvdW50KTsKICAgIH0KICAgIGVsc2V7CiAgICAgICAgbG9nX2luZm8oIk51bWJlciBvZiBsb2NhbGVzIHJldHVybmVkID0gJWRcbiIsIGxvY0NvdW50KTsKICAgICAgICAKICAgIH0KICAgIGZvcihpPTA7aTxsb2NDb3VudDtpKyspewogICAgICAgIGxvY0xpc3Q9dWxvY19nZXRBdmFpbGFibGUoaSk7CiAgICAgICAgCiAgICAgICAgbG9nX3ZlcmJvc2UoIiAlc1xuIiwgbG9jTGlzdCk7CiAgICB9Cn0KCi8qIHRlc3QgZm9yIHVsb2NfZ2V0RGF0YURpcmVjdG9yeSwgdWxvY19zZXREYXRhRGlyZWN0b3J5LCB1bG9jX2dldElTTzNMYW5ndWFnZSAqLwp2b2lkIFRlc3REYXRhRGlyZWN0b3J5KCkKewoKICAgIGNoYXIgICAgICAgICAgICBvbGREaXJlY3RvcnlbODBdOwogICAgY29uc3QgY2hhciAgICAgKnRlbXAsKnRlc3RWYWx1ZTEsKnRlc3RWYWx1ZTIsKnRlc3RWYWx1ZTM7CiAgICBVRXJyb3JDb2RlICAgICAgIGVyciA9IFpFUk9fRVJST1I7CiAgICBjb25zdCBjaGFyIHBhdGhbNDBdID0iZDpcXGljdVxcc291cmNlXFx0ZXN0XFxpbnRsdGVzdFxcIiA7IC8qZ2l2ZSB0aGUgcmVxdWlyZWQgcGF0aCAqLwoKICAgIAogICAgbG9nX3ZlcmJvc2UoIlRlc3RpbmcgZ2V0RGF0YURpcmVjdG9yeSgpXG4iKTsKICAgIHRlbXAgPSB1bG9jX2dldERhdGFEaXJlY3RvcnkoKTsKICAgIHN0cmNweShvbGREaXJlY3RvcnksIHRlbXApOwogICAgICAgIAogICAgdGVzdFZhbHVlMT11bG9jX2dldElTTzNMYW5ndWFnZSgiZW5fVVMiKTsKICAgIGxvZ192ZXJib3NlKCJmaXJzdCBmZXRjaCBvZiBsYW5ndWFnZSByZXRyaWV2ZWQgICVzXG4iLCB0ZXN0VmFsdWUxKTsKICAgIAogICAgaWYgKDAgIT0gc3RyY21wKHRlc3RWYWx1ZTEsImVuZyIpKXsKICAgICAgICBsb2dfZXJyKCJJbml0aWFsIGNoZWNrIG9mIElTTzMgbGFuZ3VhZ2UgZmFpbGVkOiBleHBlY3RlZCBcImVuZ1wiLCBnb3QgICVzIFxuIiwgdGVzdFZhbHVlMSk7CiAgICAgICAgCiAgICB9CgogICAgLypkZWZpbmluZyB0aGUgcGF0aCBmb3IgRGF0YURpcmVjdG9yeSAqLwogICAgbG9nX3ZlcmJvc2UoIlRlc3Rpbmcgc2V0RGF0YURpcmVjdG9yeVxuIik7CiAgICB1bG9jX3NldERhdGFEaXJlY3RvcnkoIHBhdGggKTsKICAgIGlmKHN0cmNtcChwYXRoLCB1bG9jX2dldERhdGFEaXJlY3RvcnkoKSk9PTApCiAgICAgICAgbG9nX3ZlcmJvc2UoInNldERhdGFEaXJlY3Rvcnkgd29ya2luZyBmaW5lXG4iKTsKICAgIGVsc2UKICAgICAgICBsb2dfZXJyKCJFcnJvciBpbiBzZXREYXRhRGlyZWN0b3J5LiBEaXJlY3Rvcnkgbm90IHNldCBjb3JyZWN0bHkiKTsKICAgICAgICAKICAgIHRlc3RWYWx1ZTI9dWxvY19nZXRJU08zTGFuZ3VhZ2UoImVuX1VTIik7CiAgICBsb2dfdmVyYm9zZSgic2Vjb25kIGZldGNoIG9mIGxhbmd1YWdlIHJldHJpZXZlZCAgJXMgXG4iLCB0ZXN0VmFsdWUyKTsKICAgICAgICAKICAgIHVsb2Nfc2V0RGF0YURpcmVjdG9yeShvbGREaXJlY3RvcnkpOwogICAgdGVzdFZhbHVlMz11bG9jX2dldElTTzNMYW5ndWFnZSgiZW5fVVMiKTsKICAgIGxvZ192ZXJib3NlKCJ0aGlyZCBmZXRjaCBvZiBsYW5ndWFnZSByZXRyaWV2ZWQgICVzIFxuIiwgdGVzdFZhbHVlMyk7CiAgICAgICAgCiAgICBpZiAoMCAhPSBzdHJjbXAodGVzdFZhbHVlMywiZW5nIikpIHsKICAgICAgIGxvZ19lcnIoImdldC9zZXREYXRhRGlyZWN0b3J5KCkgZmFpbGVkOiBleHBlY3RlZCBcImVuZ1wiLCBnb3QgXCIgJXMgIFwiIFxuIiwgdGVzdFZhbHVlMyk7CiAgICAgICAKICAgICAgIH0KCiAgICAKfQoKCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgp2b2lkIGRvVGVzdERpc3BsYXlOYW1lcyhjb25zdCBjaGFyKiBpbkxvY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb21wYXJlSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGVmYXVsdElzRnJlbmNoKQp7CiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFpFUk9fRVJST1I7CiAgICBpbnQzMl90IGk7CiAgICBpbnQzMl90IG1heHJlc3VsdHNpemU7CiAgICAKICAgIGNoYXIqIHRlc3RMb2NhbGU7CiAgIAogICAgCiAgICBVQ2hhciAgKnRlc3RMYW5nICA9IDA7CiAgICBVQ2hhciAgKnRlc3RDdHJ5ID0gMDsKICAgIFVDaGFyICAqdGVzdFZhciA9IDA7CiAgICBVQ2hhciAgKnRlc3ROYW1lID0gMDsKICAgCgogICAgVUNoYXIqICBleHBlY3RlZExhbmcgPSAwOwogICAgVUNoYXIqICBleHBlY3RlZEN0cnkgPSAwOwogICAgVUNoYXIqICBleHBlY3RlZFZhciA9IDA7CiAgICBVQ2hhciogIGV4cGVjdGVkTmFtZSA9IDA7CiAgICBjaGFyIHRlbXBbNV07CiAgICBjb25zdCBjaGFyKiBkZWZhdWx0RGVmYXVsdExvY2FsZT0iICI7CiAgICAKICAgIAogICAgICAgCiAgICB1bG9jX2dldExhbmd1YWdlKHVsb2NfZ2V0RGVmYXVsdCgpLCB0ZW1wLCA1LCAmc3RhdHVzKTsKICAgIGlmKEZBSUxVUkUoc3RhdHVzKSl7CiAgICAgICAgbG9nX2VycigiRVJST1I6IGluIGdldERlZmF1bHQgICVzIFxuIiwgbXlFcnJvck5hbWUoc3RhdHVzKSk7CiAgICB9CiAgICBpZiAoZGVmYXVsdElzRnJlbmNoICYmIDAgIT0gc3RyY21wKHRlbXAsICJmciIpKSAgICB7CiAgICAgICAgbG9nX2VycigiRGVmYXVsdCBsb2NhbGUgc2hvdWxkIGJlIEZyZW5jaCwgYnV0IGl0J3MgcmVhbGx5ICAlc1xuIiwgdGVtcCk7CiAgICAgICAgCiAgICB9CiAgICBlbHNlIGlmICghZGVmYXVsdElzRnJlbmNoICYmIDAgIT0gc3RyY21wKHRlbXAsICJlbiIpKXsgIAogICAgCiAgICAgICAgbG9nX2VycigiRGVmYXVsdCBsb2NhbGUgc2hvdWxkIGJlIEVuZ2xpc2gsIGJ1dCBpdCdzIHJlYWxseSAgJXNcbiIsIHRlbXApOwogICAgICAgIAogICAgfQoKICAgdGVzdExvY2FsZSA9IChjaGFyKiltYWxsb2Moc2l6ZW9mKGNoYXIpICAgKiAxKTsKICAKICAgCiAgIGZvcihpPTA7aTxNQVhfTE9DQUxFUzsgKytpKQogICB7CiAgICAgICB0ZXN0TG9jYWxlPShjaGFyKilyZWFsbG9jKHRlc3RMb2NhbGUsIHNpemVvZihjaGFyKSAqICh1X3N0cmxlbihkYXRhVGFibGVbTkFNRV1baV0pKzEpKTsKICAgICAgIHVfYXVzdHJjcHkodGVzdExvY2FsZSxkYXRhVGFibGVbTkFNRV1baV0pOwogICAgCiAgICAgICAgbG9nX3ZlcmJvc2UoIlRlc3RpbmcuLi4uLiAgJXNcbiIsIHRlc3RMb2NhbGUpOwogICAgICAgICAgICAgICAgCiAgICAgICAgaWYgKHN0cmNtcChpbkxvY2FsZSwgZGVmYXVsdERlZmF1bHRMb2NhbGUpPT0wKSB7CiAgICAgICAgICAgIG1heHJlc3VsdHNpemU9MDsKICAgICAgICAgICAgbWF4cmVzdWx0c2l6ZT11bG9jX2dldERpc3BsYXlMYW5ndWFnZSh0ZXN0TG9jYWxlLCBOVUxMLCBOVUxMLCBtYXhyZXN1bHRzaXplLCAmc3RhdHVzKTsKICAgICAgICAgICAgaWYoc3RhdHVzPT1CVUZGRVJfT1ZFUkZMT1dfRVJST1IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0YXR1cz1aRVJPX0VSUk9SOwogICAgICAgICAgICAgICAgdGVzdExhbmc9KFVDaGFyKiltYWxsb2Moc2l6ZW9mKFVDaGFyKSAqIChtYXhyZXN1bHRzaXplICsgMSkpOwogICAgICAgICAgICAgICAgdWxvY19nZXREaXNwbGF5TGFuZ3VhZ2UodGVzdExvY2FsZSwgTlVMTCwgdGVzdExhbmcsIG1heHJlc3VsdHNpemUsICZzdGF0dXMpOwoKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoRkFJTFVSRShzdGF0dXMpKXsKICAgICAgICAgICAgICAgICAgICBsb2dfZXJyKCJFcnJvciBpbiBnZXREaXNwbGF5TGFuZ3VhZ2UoKSAgJXNcbiIsIG15RXJyb3JOYW1lKHN0YXR1cykpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIG1heHJlc3VsdHNpemU9MDsKICAgICAgICAgICAgbWF4cmVzdWx0c2l6ZT11bG9jX2dldERpc3BsYXlDb3VudHJ5KHRlc3RMb2NhbGUsIE5VTEwsIE5VTEwsIG1heHJlc3VsdHNpemUsICZzdGF0dXMpOwogICAgICAgICAgICBpZihzdGF0dXM9PUJVRkZFUl9PVkVSRkxPV19FUlJPUikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RhdHVzPVpFUk9fRVJST1I7CiAgICAgICAgICAgICAgICB0ZXN0Q3RyeT0oVUNoYXIqKW1hbGxvYyhzaXplb2YoVUNoYXIpICogKG1heHJlc3VsdHNpemUgKyAxKSk7CiAgICAgICAgICAgICAgICB1bG9jX2dldERpc3BsYXlDb3VudHJ5KHRlc3RMb2NhbGUsIE5VTEwsIHRlc3RDdHJ5LCBtYXhyZXN1bHRzaXplLCAmc3RhdHVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihGQUlMVVJFKHN0YXR1cykpewogICAgICAgICAgICAgICAgICAgIGxvZ19lcnIoIkVycm9yIGluIGdldERpc3BsYXlDb3VudHJ5KCkgICVzXG4iLCBteUVycm9yTmFtZShzdGF0dXMpKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgbWF4cmVzdWx0c2l6ZT0wOwogICAgICAgICAgICBtYXhyZXN1bHRzaXplPXVsb2NfZ2V0RGlzcGxheVZhcmlhbnQodGVzdExvY2FsZSwgTlVMTCwgTlVMTCwgbWF4cmVzdWx0c2l6ZSwgJnN0YXR1cyk7CiAgICAgICAgICAgIGlmKHN0YXR1cz09QlVGRkVSX09WRVJGTE9XX0VSUk9SKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGF0dXM9WkVST19FUlJPUjsKICAgICAgICAgICAgICAgIHRlc3RWYXI9KFVDaGFyKiltYWxsb2Moc2l6ZW9mKFVDaGFyKSAqIChtYXhyZXN1bHRzaXplKzEpKTsKICAgICAgICAgICAgICAgIHVsb2NfZ2V0RGlzcGxheVZhcmlhbnQodGVzdExvY2FsZSwgTlVMTCwgdGVzdFZhciwgbWF4cmVzdWx0c2l6ZSwgJnN0YXR1cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoRkFJTFVSRShzdGF0dXMpKXsKICAgICAgICAgICAgICAgICAgICBsb2dfZXJyKCJFcnJvciBpbiBnZXREaXNwbGF5VmFyaWFudCgpICAlc1xuIiwgbXlFcnJvck5hbWUoc3RhdHVzKSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgICAgICBtYXhyZXN1bHRzaXplPTA7CiAgICAgICAgICAgIG1heHJlc3VsdHNpemU9dWxvY19nZXREaXNwbGF5TmFtZSh0ZXN0TG9jYWxlLCBOVUxMLCBOVUxMLCBtYXhyZXN1bHRzaXplLCAmc3RhdHVzKTsKICAgICAgICAgICAgaWYoc3RhdHVzPT1CVUZGRVJfT1ZFUkZMT1dfRVJST1IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0YXR1cz1aRVJPX0VSUk9SOwogICAgICAgICAgICAgICAgdGVzdE5hbWU9KFVDaGFyKiltYWxsb2Moc2l6ZW9mKFVDaGFyKSAqIChtYXhyZXN1bHRzaXplKzEpKTsKICAgICAgICAgICAgICAgIHVsb2NfZ2V0RGlzcGxheU5hbWUodGVzdExvY2FsZSwgTlVMTCwgdGVzdE5hbWUsIG1heHJlc3VsdHNpemUsICZzdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKEZBSUxVUkUoc3RhdHVzKSl7CiAgICAgICAgICAgICAgICAgICAgbG9nX2VycigiRXJyb3IgaW4gZ2V0RGlzcGxheU5hbWUoKSAgJXNcbiIsIG15RXJyb3JOYW1lKHN0YXR1cykpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG1heHJlc3VsdHNpemU9MDsKICAgICAgICAgICAgbWF4cmVzdWx0c2l6ZT11bG9jX2dldERpc3BsYXlMYW5ndWFnZSh0ZXN0TG9jYWxlLCBpbkxvY2FsZSwgTlVMTCwgbWF4cmVzdWx0c2l6ZSwgJnN0YXR1cyk7CiAgICAgICAgICAgIGlmKHN0YXR1cz09QlVGRkVSX09WRVJGTE9XX0VSUk9SKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGF0dXM9WkVST19FUlJPUjsKICAgICAgICAgICAgICAgIHRlc3RMYW5nPShVQ2hhciopbWFsbG9jKHNpemVvZihVQ2hhcikgKiAobWF4cmVzdWx0c2l6ZSsxKSk7CiAgICAgICAgICAgICAgICB1bG9jX2dldERpc3BsYXlMYW5ndWFnZSh0ZXN0TG9jYWxlLCBpbkxvY2FsZSwgdGVzdExhbmcsIG1heHJlc3VsdHNpemUsICZzdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKEZBSUxVUkUoc3RhdHVzKSl7CiAgICAgICAgICAgICAgICBsb2dfZXJyKCJFcnJvciBpbiBnZXREaXNwbGF5TGFuZ3VhZ2UoKSAgJXNcbiIsIG15RXJyb3JOYW1lKHN0YXR1cykpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBtYXhyZXN1bHRzaXplPTA7CiAgICAgICAgICAgIG1heHJlc3VsdHNpemU9dWxvY19nZXREaXNwbGF5Q291bnRyeSh0ZXN0TG9jYWxlLCBpbkxvY2FsZSwgTlVMTCwgbWF4cmVzdWx0c2l6ZSwgJnN0YXR1cyk7CiAgICAgICAgICAgIGlmKHN0YXR1cz09QlVGRkVSX09WRVJGTE9XX0VSUk9SKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGF0dXM9WkVST19FUlJPUjsKICAgICAgICAgICAgICAgIHRlc3RDdHJ5PShVQ2hhciopbWFsbG9jKHNpemVvZihVQ2hhcikgKiAobWF4cmVzdWx0c2l6ZSsxKSk7CiAgICAgICAgICAgICAgICB1bG9jX2dldERpc3BsYXlDb3VudHJ5KHRlc3RMb2NhbGUsIGluTG9jYWxlLCB0ZXN0Q3RyeSwgbWF4cmVzdWx0c2l6ZSwgJnN0YXR1cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoRkFJTFVSRShzdGF0dXMpKXsKICAgICAgICAgICAgICAgIGxvZ19lcnIoIkVycm9yIGluIGdldERpc3BsYXlDb3VudHJ5KCkgICVzXG4iLCBteUVycm9yTmFtZShzdGF0dXMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgbWF4cmVzdWx0c2l6ZT0wOwogICAgICAgICAgICBtYXhyZXN1bHRzaXplPXVsb2NfZ2V0RGlzcGxheVZhcmlhbnQodGVzdExvY2FsZSwgaW5Mb2NhbGUsIE5VTEwsIG1heHJlc3VsdHNpemUsICZzdGF0dXMpOwogICAgICAgICAgICBpZihzdGF0dXM9PUJVRkZFUl9PVkVSRkxPV19FUlJPUikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RhdHVzPVpFUk9fRVJST1I7CiAgICAgICAgICAgICAgICB0ZXN0VmFyPShVQ2hhciopbWFsbG9jKHNpemVvZihVQ2hhcikgKiAobWF4cmVzdWx0c2l6ZSsxKSk7CiAgICAgICAgICAgICAgICB1bG9jX2dldERpc3BsYXlWYXJpYW50KHRlc3RMb2NhbGUsIGluTG9jYWxlLCB0ZXN0VmFyLCBtYXhyZXN1bHRzaXplLCAmc3RhdHVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihGQUlMVVJFKHN0YXR1cykpewogICAgICAgICAgICAgICAgICAgIGxvZ19lcnIoIkVycm9yIGluIGdldERpc3BsYXlWYXJpYW50KCkgICVzXG4iLCBteUVycm9yTmFtZShzdGF0dXMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgbWF4cmVzdWx0c2l6ZT0wOwogICAgICAgICAgICBtYXhyZXN1bHRzaXplPXVsb2NfZ2V0RGlzcGxheU5hbWUodGVzdExvY2FsZSwgaW5Mb2NhbGUsIE5VTEwsIG1heHJlc3VsdHNpemUsICZzdGF0dXMpOwogICAgICAgICAgICBpZihzdGF0dXM9PUJVRkZFUl9PVkVSRkxPV19FUlJPUikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RhdHVzPVpFUk9fRVJST1I7CiAgICAgICAgICAgICAgICB0ZXN0TmFtZT0oVUNoYXIqKW1hbGxvYyhzaXplb2YoVUNoYXIpICogKG1heHJlc3VsdHNpemUrMSkpOwogICAgICAgICAgICAgICAgdWxvY19nZXREaXNwbGF5TmFtZSh0ZXN0TG9jYWxlLCBpbkxvY2FsZSwgdGVzdE5hbWUsIG1heHJlc3VsdHNpemUsICZzdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKEZBSUxVUkUoc3RhdHVzKSl7CiAgICAgICAgICAgICAgICBsb2dfZXJyKCJFcnJvciBpbiBnZXREaXNwbGF5TmFtZSgpICAlc1xuIiwgbXlFcnJvck5hbWUoc3RhdHVzKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgCiAgICAgICAgZXhwZWN0ZWRMYW5nPWRhdGFUYWJsZVtjb21wYXJlSW5kZXhdW2ldOwogICAgICAgIGlmKHVfc3RybGVuKGV4cGVjdGVkTGFuZykgPT0gMCAmJiBkZWZhdWx0SXNGcmVuY2gpICAKICAgICAgICAgICAgZXhwZWN0ZWRMYW5nPWRhdGFUYWJsZVtETEFOR19GUl1baV07CiAgICAgICAgaWYodV9zdHJsZW4oZXhwZWN0ZWRMYW5nKT09IDApCiAgICAgICAgICAgIGV4cGVjdGVkTGFuZz1kYXRhVGFibGVbRExBTkdfRU5dW2ldOwoKICAgIAogICAgICAgIGV4cGVjdGVkQ3RyeT1kYXRhVGFibGVbY29tcGFyZUluZGV4ICsgMV1baV07CiAgICAgICAgaWYodV9zdHJsZW4oZXhwZWN0ZWRDdHJ5KSA9PSAwICYmIGRlZmF1bHRJc0ZyZW5jaCkKICAgICAgICAgICAgZXhwZWN0ZWRDdHJ5PWRhdGFUYWJsZVtEQ1RSWV9GUl1baV07CiAgICAgICAgaWYodV9zdHJsZW4oZXhwZWN0ZWRDdHJ5KT09IDApCiAgICAgICAgICAgIGV4cGVjdGVkQ3RyeT1kYXRhVGFibGVbRENUUllfRU5dW2ldOyAgICAKICAgCiAgICAgICAgZXhwZWN0ZWRWYXI9ZGF0YVRhYmxlW2NvbXBhcmVJbmRleCArIDJdW2ldOwogICAgICAgIGlmKHVfc3RybGVuKGV4cGVjdGVkVmFyKSA9PSAwICYmIGRlZmF1bHRJc0ZyZW5jaCkKICAgICAgICAgICAgZXhwZWN0ZWRWYXI9ZGF0YVRhYmxlW0RWQVJfRlJdW2ldOwogICAgICAgIGlmKHVfc3RybGVuKGV4cGVjdGVkQ3RyeSk9PSAwKQogICAgICAgICAgICBleHBlY3RlZFZhcj1kYXRhVGFibGVbRFZBUl9FTl1baV07CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgZXhwZWN0ZWROYW1lPWRhdGFUYWJsZVtjb21wYXJlSW5kZXggKyAzXVtpXTsKICAgICAgICBpZih1X3N0cmxlbihleHBlY3RlZE5hbWUpID09MCAmJiBkZWZhdWx0SXNGcmVuY2gpCiAgICAgICAgICAgIGV4cGVjdGVkTmFtZT1kYXRhVGFibGVbRE5BTUVfRlJdW2ldOwogICAgICAgIGlmKHVfc3RybGVuKGV4cGVjdGVkTmFtZSkgPT0gMCkKICAgICAgICAgICAgZXhwZWN0ZWROYW1lPWRhdGFUYWJsZVtETkFNRV9FTl1baV07CiAgICAgICAKICAgICAgICAKICAgICBpZiAoMCAhPXVfc3RyY21wKHRlc3RMYW5nLGV4cGVjdGVkTGFuZykpICB7CiAgICAgICAgICAgIGxvZ19lcnIoIiBEaXNwbGF5IExhbmd1YWdlIG1pc21hdGNoOiAlcyAgdmVyc3VzICAlc1xuIiwgYXVzdHJkdXAodGVzdExhbmcpLCBhdXN0cmR1cChleHBlY3RlZExhbmcpKTsKICAgICAgICAgICAgCiAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKDAgIT0gdV9zdHJjbXAodGVzdEN0cnksZXhwZWN0ZWRDdHJ5KSkgICB7CiAgICAgICAgICAgIGxvZ19lcnIoIiBEaXNwbGF5IENvdW50cnkgbWlzbWF0Y2g6ICVzICB2ZXJzdXMgICVzXG4iLCBhdXN0cmR1cCh0ZXN0Q3RyeSksIGF1c3RyZHVwKGV4cGVjdGVkQ3RyeSkpOwogICAgICAgICAgICAKICAgICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoMCAhPSB1X3N0cmNtcCh0ZXN0VmFyLGV4cGVjdGVkVmFyKSkgICAgewogICAgICAgICAgICBsb2dfZXJyKCIgRGlzcGxheSBWYXJpYW50IG1pc21hdGNoOiAlcyAgdmVyc3VzICAlc1xuIiwgYXVzdHJkdXAodGVzdFZhciksIGF1c3RyZHVwKGV4cGVjdGVkVmFyKSk7CiAgICAgICAgICAgIAogICAgICAgICAgfQogICAgICAgCiAgICAgICAgaWYoMCAhPSB1X3N0cmNtcCh0ZXN0TmFtZSwgZXhwZWN0ZWROYW1lKSkgICAgeyAgICAKICAgICAgICAgICAgbG9nX2VycigiIERpc3BsYXkgTmFtZSBtaXNtYXRjaDogJXMgIHZlcnN1cyAgJXNcbiIsIGF1c3RyZHVwKHRlc3ROYW1lKSwgYXVzdHJkdXAoZXhwZWN0ZWROYW1lKSk7CiAgICAgICAgfQogICAgICAgCiAgICBmcmVlKHRlc3ROYW1lKTsKICAgIGZyZWUodGVzdExhbmcpOwogICAgZnJlZSh0ZXN0Q3RyeSk7CiAgICBmcmVlKHRlc3RWYXIpOwoKICAgIH0KICAgIGZyZWUodGVzdExvY2FsZSk7Cn0KLyogdGVzdCBmb3IgdWxvY19nZXRJU09MYW5ndWFnZXMsIHVsb2NfZ2V0SVNPQ291bnRyaWVzICovCnZvaWQgVGVzdElTT0Z1bmN0aW9ucygpCnsKCgoKICAgIGludDMyX3QgY291bnQgID0gMDsKICAgIAogICAgYm9vbF90IGRvbmUgPSBGQUxTRTsKICAgIAogICAgY29uc3QgY2hhciogY29uc3QqIHN0cj11bG9jX2dldElTT0xhbmd1YWdlcygpOwogICAgY29uc3QgY2hhciogY29uc3QqIHN0cjE9dWxvY19nZXRJU09Db3VudHJpZXMoKTsKICAgIC8qICB0ZXN0IGdldElTT0xhbmd1YWdlcyovCiAgICBjb3VudCA9IDA7CiAgICBkb25lID0gRkFMU0U7CiAgICAvKnN0cj11bG9jX2dldElTT0xhbmd1YWdlcygpOyAqLwogICAgbG9nX3ZlcmJvc2UoIlRlc3RpbmcgSVNPIExhbmd1YWdlczogXG4iKTsKICAgIAogICAgd2hpbGUoIWRvbmUpewogICAgICAgIAogICAgICAgIGlmKCooc3RyK2NvdW50KyspID09IDApCiAgICAKICAgICAgICAgICAgZG9uZSA9IFRSVUU7CiAgICAgICAgICAgICAgICAKICAgICAgICAKICAgIH0KICAgIGNvdW50LS07CiAgICBpZihjb3VudCE9MTQyKQogICAgICAgIAogICAgICAgIGxvZ19lcnIoIlRoZXJlIGlzIGFuIGVycm9yIGluIGdldElTT0xhbmd1YWdlcyAlZFxuIiwgY291bnQpOwogICAgCiAgICBsb2dfdmVyYm9zZSgiVGVzdGluZyBJU08gQ291bnRyaWVzIik7CiAgICBjb3VudD0wOwogICAgZG9uZT1GQUxTRTsKICAgIHdoaWxlKCFkb25lKQogICAgewogICAgICAgIGlmKCooc3RyMSArIGNvdW50KyspPT0wKQogICAgICAgICAgICBkb25lPVRSVUU7CiAgICAgICAgICAgIAogICAgCiAgICB9CiAgICBjb3VudC0tOwogICAgaWYoY291bnQhPTIzOSkKICAgICAgICBsb2dfZXJyKCJUaGVyZSBpcyBhbiBlcnJvciBpbiBnZXRJU09Db3VudHJpZXMgJWQgXG4iLCBjb3VudCk7CiAgICAKICAKfQoKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHRhYmxlIG9mIHZhbGlkIGRhdGEKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCnN0YXRpYyAgY2hhciogcmF3RGF0YTJbMjNdWzVdID0gewogICAgLyogbGFuZ3VhZ2UgY29kZSAqLwogICAgeyAgICJlbiIsICAgImZyIiwgICAiaHIiLCAgICJlbCIsICAgIm5vIiAgICB9LAogICAgLyogY291bnRyeSBjb2RlICovCiAgICB7ICAgIlVTIiwgICAiRlIiLCAgICJIUiIsICAgIkdSIiwgICAiTk8iICAgIH0sCiAgICAvKiB2YXJpYW50IGNvZGUgKi8KICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOWSIgICAgfSwKICAgIC8qIGZ1bGwgbmFtZSAqLwogICAgeyAgICJlbl9VUyIsICAgICJmcl9GUiIsICAgICJocl9IUiIsICAgICJlbF9HUiIsICAgICJub19OT19OWSIgIH0sCiAgICAvKiBJU08tMyBsYW5ndWFnZSAqLwogICAgeyAgICJlbmciLCAgImZyYSIsICAiaHJ2IiwgICJlbGwiLCAgIm5vciIgICB9LAogICAgLyogSVNPLTMgY291bnRyeSAqLwogICAgeyAgICJVU0EiLCAgIkZSQSIsICAiSFJWIiwgICJHUkMiLCAgIk5PUiIgICB9LAogICAgLyogTENJRCAobm90IGN1cnJlbnRseSBwdWJsaWMpICovCiAgICB7ICAgIjQwOSIsICI0MGMiLCAiNDFhIiwgIjQwOCIsICI4MTQiICB9LAoKICAgIC8qIGRpc3BsYXkgbGFuZ2FnZSAoRW5nbGlzaCkgKi8KICAgIHsgICAiRW5nbGlzaCIsICAiRnJlbmNoIiwgICAiQ3JvYXRpYW4iLCAiR3JlZWsiLCAgICAiTm9yd2VnaWFuIiB9LAogICAgLyogZGlzcGxheSBjb3VudHJ5IChFbmdsaXNoKSAqLwogICAgeyAgICJVbml0ZWQgU3RhdGVzIiwgICAgIkZyYW5jZSIsICAgIkNyb2F0aWEiLCAgIkdyZWVjZSIsICAgIk5vcndheSIgICAgfSwKICAgIC8qIGRpc3BsYXkgdmFyaWFudCAoRW5nbGlzaCkgKi8KICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOeW5vcnNrIiAgICB9LAogICAgLyogZGlzcGxheSBuYW1lIChFbmdsaXNoKSAqLwogICAgeyAgICJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSIsICJGcmVuY2ggKEZyYW5jZSkiLCAiQ3JvYXRpYW4gKENyb2F0aWEpIiwgIkdyZWVrIChHcmVlY2UpIiwgIk5vcndlZ2lhbiAoTm9yd2F5LCBOeW5vcnNrKSIgfSwKCiAgICAvKiBkaXNwbGF5IGxhbmdhZ2UgKEZyZW5jaCkgKi8KICAgIHsgICAiYW5nbGFpcyIsICAiZnJhbudhaXMiLCAgICIiLCAiZ3JlYyIsICAgICJub3J26WdpZW4iIH0sCiAgICAvKiBkaXNwbGF5IGNvdW50cnkgKEZyZW5jaCkgKi8KICAgIHsgICAiyXRhdHMtVW5pcyIsICAgICJGcmFuY2UiLCAgICIiLCAgIkdy6GNlIiwgICAiTm9yduhnZSIgICAgfSwKICAgIC8qIGRpc3BsYXkgdmFyaWFudCAoRnJlbmNoKSAqLwogICAgeyAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIk55bm9yc2siICAgIH0sCiAgICAvKiBkaXNwbGF5IG5hbWUgKEZyZW5jaCkgKi8KICAgIHsgICAiYW5nbGFpcyAoyXRhdHMtVW5pcykiLCAiZnJhbudhaXMgKEZyYW5jZSkiLCAiIiwgImdyZWMgKEdy6GNlKSIsICJub3J26WdpZW4gKE5vcnboZ2UsIE55bm9yc2spIiB9LAoKICAgIC8qIGRpc3BsYXkgbGFuZ2FnZSAoQ3JvYXRpYW4pICovCiAgICB7ICAgIiIsICAiIiwgImhydmF0c2tpIiwgIiIsICAgICIiIH0sCiAgICAvKiBkaXNwbGF5IGNvdW50cnkgKENyb2F0aWFuKSAgKi8KICAgIHsgICAiIiwgICAgIiIsICAgIkhydmF0c2thIiwgICIiLCAgICIiICAgIH0sCiAgICAvKiBkaXNwbGF5IHZhcmlhbnQgKENyb2F0aWFuKSAqLwogICAgeyAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIgICAgfSwKICAgIC8qIGRpc3BsYXkgbmFtZSAoQ3JvYXRpYW4pICovCiAgICB7ICAgIiIsICIiLCAiaHJ2YXRza2kgKEhydmF0c2thKSIsICIiLCAiIiB9LAoKICAgIC8qIGRpc3BsYXkgbGFuZ2FnZSAoR3JlZWspIFthY3R1YWwgdmFsdWVzIGxpc3RlZCBiZWxvd10gKi8KICAgIHsgICAiIiwgICIiLCAiIiwgIiIsICAgICIiIH0sCiAgICAvKiBkaXNwbGF5IGNvdW50cnkgKEdyZWVrKSBbYWN0dWFsIHZhbHVlcyBsaXN0ZWQgYmVsb3ddICovCiAgICB7ICAgIiIsICAgICIiLCAgICIiLCAgIiIsICAgIiIgICAgfSwKICAgIC8qIGRpc3BsYXkgdmFyaWFudCAoR3JlZWspICovCiAgICB7ICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiAgICB9LAogICAgLyogZGlzcGxheSBuYW1lIChHcmVlaykgW2FjdHVhbCB2YWx1ZXMgbGlzdGVkIGJlbG93XSAqLwogICAgeyAgICIiLCAiIiwgIiIsICIiLCAiIiB9Cn07CgpzdGF0aWMgVUNoYXIgZ3JlZWtEaXNwbGF5TGFuZ3VhZ2VbXSA9IHsgMHgwM2I1LCAweDAzYmIsIDB4MDNiYiwgMHgwM2I3LCAweDAzYmQsIDB4MDNiOSwgMHgwM2JhLCAweDAzYWMsIDAgfTsKc3RhdGljIFVDaGFyIGdyZWVrRGlzcGxheUNvdW50cnlbXSA9IHsgMHgwMzk1LCAweDAzYmIsIDB4MDNiYiwgMHgwM2FjLCAweDAzYjQsIDB4MDNiMSwgMCB9OwpzdGF0aWMgVUNoYXIgZ3JlZWtEaXNwbGF5TmFtZVtdID0geyAweDAzYjUsIDB4MDNiYiwgMHgwM2JiLCAweDAzYjcsIDB4MDNiZCwgMHgwM2I5LCAweDAzYmEsCiAgICAweDAzYWMsICcgJywgJygnLCAweDAzOTUsIDB4MDNiYiwgMHgwM2JiLCAweDAzYWMsIDB4MDNiNCwgMHgwM2IxLCAnKScsIDAgfTsKICAgIAoKdm9pZCBzZXRVcERhdGFUYWJsZSgpCnsKICAgIGludDMyX3QgaSxqOwogICAgZGF0YVRhYmxlID0gY2FsbG9jKHNpemVvZihVQ2hhcioqKSwyMyk7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMzsgaSsrKSB7CiAgICAgICAgICBkYXRhVGFibGVbaV0gPSBjYWxsb2Moc2l6ZW9mKFVDaGFyKiksNSk7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA1OyBqKyspewogICAgICAgICAgICAgICAgZGF0YVRhYmxlW2ldW2pdID0gKFVDaGFyKikgbWFsbG9jKHNpemVvZihVQ2hhcikqKHN0cmxlbihyYXdEYXRhMltpXVtqXSkrMSkpOwogICAgICAgICAgICAgICAgdV91YXN0cmNweShkYXRhVGFibGVbaV1bal0scmF3RGF0YTJbaV1bal0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRhdGFUYWJsZVtETEFOR19FTF1bR1JFRUtTXT0oVUNoYXIqKXJlYWxsb2MoZGF0YVRhYmxlW0RMQU5HX0VMXVtHUkVFS1NdLHNpemVvZihVQ2hhcikqKHVfc3RybGVuKGdyZWVrRGlzcGxheUxhbmd1YWdlKSsxKSk7IAogICAgdV9zdHJuY3B5KGRhdGFUYWJsZVtETEFOR19FTF1bR1JFRUtTXSxncmVla0Rpc3BsYXlMYW5ndWFnZSw4KTsKICAgICAgICBkYXRhVGFibGVbRENUUllfRUxdW0dSRUVLU109KFVDaGFyKilyZWFsbG9jKGRhdGFUYWJsZVtEQ1RSWV9FTF1bR1JFRUtTXSxzaXplb2YoVUNoYXIpKih1X3N0cmxlbihncmVla0Rpc3BsYXlDb3VudHJ5KSsxKSk7CiAgICB1X3N0cm5jcHkoZGF0YVRhYmxlW0RDVFJZX0VMXVtHUkVFS1NdLGdyZWVrRGlzcGxheUNvdW50cnksNik7CiAgICAgICAgZGF0YVRhYmxlW0ROQU1FX0VMXVtHUkVFS1NdPShVQ2hhciopcmVhbGxvYyhkYXRhVGFibGVbRE5BTUVfRUxdW0dSRUVLU10sc2l6ZW9mKFVDaGFyKSoodV9zdHJsZW4oZ3JlZWtEaXNwbGF5TmFtZSkrMSkpOyAgICAgICAgCiAgICB1X3N0cm5jcHkoZGF0YVRhYmxlW0ROQU1FX0VMXVtHUkVFS1NdLGdyZWVrRGlzcGxheU5hbWUsMTcpOwogICAgCn0K