cGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5sZXhlcjsKCmltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKCmltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5Ub2tlbjsKCnB1YmxpYyBjbGFzcyBMZXhlclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CgogICAgcHVibGljIHZvaWQgdGVzdE5vdGhpbmcoKQogICAgewogICAgfQoKLyoKCiAgICBwcml2YXRlIExleGVyIGxleGVyOwoKICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRPZlN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIG5ld0xleGVyKCIiKTsKCiAgICAgICAgYXNzZXJ0RW5kKCk7CgogICAgICAgIGFzc2VydEVuZCgpOwoKICAgICAgICBhc3NlcnRFbmQoKTsKCiAgICAgICAgYXNzZXJ0RW5kKCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUxpbmVDb21tZW50X05ld2xpbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBuZXdMZXhlcigiLy8gSSBsaWtlIGNoZWVzZVxuY2hlZXNlIik7CgogICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5ORVdMSU5FLCAiPG5ld2xpbmU+Iik7CiAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLklERU5USUZJRVIsICJjaGVlc2UiKTsKCiAgICAgICAgYXNzZXJ0RW5kKCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUxpbmVDb21tZW50X0NhcnJpYWdlUmV0dXJuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgbmV3TGV4ZXIoIi8vIEkgbGlrZSBjaGVlc2VccmNoZWVzZSIpOwoKICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uTkVXTElORSwgIjxuZXdsaW5lPiIpOwogICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5JREVOVElGSUVSLCAiY2hlZXNlIik7CgogICAgICAgIGFzc2VydEVuZCgpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVMaW5lQ29tbWVudF9DYXJyaWFnZVJldHVybl9OZXdsaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgbmV3TGV4ZXIoIi8vIEkgbGlrZSBjaGVlc2VcclxuY2hlZXNlIik7CgogICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5ORVdMSU5FLCAiPG5ld2xpbmU+Iik7CiAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLklERU5USUZJRVIsICJjaGVlc2UiKTsKCiAgICAgICAgYXNzZXJ0RW5kKCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUxpbmVIYXNoQ29tbWVudF9DYXJyaWFnZVJldHVybigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIG5ld0xleGVyKCIjIEkgbGlrZSBjaGVlc2VccmNoZWVzZSIpOwoKICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uTkVXTElORSwgIjxuZXdsaW5lPiIpOwogICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5JREVOVElGSUVSLCAiY2hlZXNlIik7CgogICAgICAgIGFzc2VydEVuZCgpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aWxpbmVDb21tZW50X01pZGRsZU9mTGluZSgpIHRocm93cyBFeGNlcHRpb24gewoqLyAvLyAgICAgICAgbmV3TGV4ZXIoImNoZWVzZSAvKiBpcyAqLyB0b2FzdHkiKTsKLyoKCiAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLklERU5USUZJRVIsICJjaGVlc2UiKTsKCiAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLklERU5USUZJRVIsICJ0b2FzdHkiKTsKCiAgICAgICAgYXNzZXJ0RW5kKCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdE11bHRpbGluZUNvbW1lbnRfU3Bhbm5pbmdMaW5lcygpIHRocm93cyBFeGNlcHRpb24gewoqLyAvLyAgICAgICAgbmV3TGV4ZXIoImNoZWVzZSAvKiBpcyBcbiByZWFsbHkgKi8gdG9hc3R5Iik7Ci8qCgogICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5JREVOVElGSUVSLCAiY2hlZXNlIik7CgogICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5JREVOVElGSUVSLCAidG9hc3R5Iik7CgogICAgICAgIGFzc2VydEVuZCgpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aWxpbmVDb21tZW50X0VtYmVkZGVkU3RhcnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiovIC8vICAgICAgICBuZXdMZXhlcigiY2hlZXNlIC8qICogKiAqIC8gKiAvICovIHRvYXN0eSIpOwovKgoKICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uSURFTlRJRklFUiwgImNoZWVzZSIpOwoKICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uSURFTlRJRklFUiwgInRvYXN0eSIpOwoKICAgICAgICBhc3NlcnRFbmQoKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0SWdub3JlZFdoaXRlc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBuZXdMZXhlcigiIFxyIFxuIFxyXG4gXG5cciAgICBcdCAgIFx0Iik7CgogICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5ORVdMSU5FLCAiPG5ld2xpbmU+Iik7CiAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLk5FV0xJTkUsICI8bmV3bGluZT4iKTsKICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uTkVXTElORSwgIjxuZXdsaW5lPiIpOwoKICAgICAgICBhc3NlcnRFbmQoKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0TGVmdEN1cmx5QnJhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoInsiLCBUb2tlbi5MRUZUX0NVUkxZX0JSQUNFKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0UmlnaHRDdXJseUJyYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCJ9IiwgVG9rZW4uUklHSFRfQ1VSTFlfQlJBQ0UpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RMZWZ0U3F1YXJlQnJhY2tldCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgiWyIsIFRva2VuLkxFRlRfU1FVQVJFX0JSQUNLRVQpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RSaWdodFNxdWFyZUJyYWNrZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoIl0iLCBUb2tlbi5SSUdIVF9TUVVBUkVfQlJBQ0tFVCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdExlZnRQYXJlbnRoZXNpcygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgiKCIsIFRva2VuLkxFRlRfUEFSRU5USEVTSVMpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RSaWdodFBhcmVudGhlc2lzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCIpIiwgVG9rZW4uUklHSFRfUEFSRU5USEVTSVMpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3REb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoIi4iLCBUb2tlbi5ET1QpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3REb3REb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoIi4uIiwgVG9rZW4uRE9UX0RPVCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdE5vdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgiISIsIFRva2VuLk5PVCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVOb3RFcXVhbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgiIT0iLCBUb2tlbi5DT01QQVJFX05PVF9FUVVBTCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdEVxdWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCI9IiwgVG9rZW4uRVFVQUwpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlRXF1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoIj09IiwgVG9rZW4uQ09NUEFSRV9FUVVBTCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVJZGVudGljYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoIj09PSIsIFRva2VuLkNPTVBBUkVfSURFTlRJQ0FMKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUxlc3NUaGFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCI8IiwgVG9rZW4uQ09NUEFSRV9MRVNTX1RIQU4pOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlTGVzc1RoYW5FcXVhbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgiPD0iLCBUb2tlbi5DT01QQVJFX0xFU1NfVEhBTl9FUVVBTCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmVHcmVhdGVyVGhhbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgiPiIsIFRva2VuLkNPTVBBUkVfR1JFQVRFUl9USEFOKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUdyZWF0ZXJUaGFuRXF1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoIj49IiwgVG9rZW4uQ09NUEFSRV9HUkVBVEVSX1RIQU5fRVFVQUwpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlVG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoIjw9PiIsIFRva2VuLkNPTVBBUkVfVE8pOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3ROYXZpZ2F0ZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgiLT4iLCBUb2tlbi5OQVZJR0FURSk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdExvZ2ljYWxPcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgifHwiLCBUb2tlbi5MT0dJQ0FMX09SKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0UGlwZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgifCIsIFRva2VuLlBJUEUpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dpY2FsQW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCImJiIsIFRva2VuLkxPR0lDQUxfQU5EKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0QW1wZXJzYW5kX1VuZXhwZWN0ZWRDaGFyYWN0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBuZXdMZXhlcigiJmEiKTsKCiAgICAgICAgY2hhcltdIGV4cGVjdGVkID0gYXNzZXJ0VW5leHBlY3RlZENoYXJhY3RlcignYScsIDEsIDIpOwoKICAgICAgICBhc3NlcnRMZW5ndGgoMSwgZXhwZWN0ZWQpOwoKICAgICAgICBhc3NlcnRDb250YWlucygnJicsIGV4cGVjdGVkKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0UGx1cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgiKyIsIFRva2VuLlBMVVMpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RQbHVzUGx1cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgiKysiLCBUb2tlbi5QTFVTX1BMVVMpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RQbHVzRXF1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoIis9IiwgVG9rZW4uUExVU19FUVVBTCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdE1pbnVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCItIiwgVG9rZW4uTUlOVVMpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RNaW51c01pbnVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCItLSIsIFRva2VuLk1JTlVTX01JTlVTKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0TWludXNFcXVhbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgiLT0iLCBUb2tlbi5NSU5VU19FUVVBTCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdERpdmlkZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgiLyIsIFRva2VuLkRJVklERSk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdERpdmlkZUVxdWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCIvPSIsIFRva2VuLkRJVklERV9FUVVBTCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdE1vZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgiJSIsIFRva2VuLk1PRCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdE1vZEVxdWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCIlPSIsIFRva2VuLk1PRF9FUVVBTCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCIqIiwgVG9rZW4uTVVMVElQTFkpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBseUVxdWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCIqPSIsIFRva2VuLk1VTFRJUExZX0VRVUFMKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0Q29sb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoIjoiLCBUb2tlbi5DT0xPTik7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdFNlbWljb2xvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgiOyIsIFRva2VuLlNFTUlDT0xPTik7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdFF1ZXN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCI/IiwgVG9rZW4uUVVFU1RJT04pOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVRdW90ZVN0cmluZ19TaW1wbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBuZXdMZXhlcigiXCJjaGVlc2VcIiIpOwoKICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uRE9VQkxFX1FVT1RFX1NUUklORywgImNoZWVzZSIpOwoKICAgICAgICBhc3NlcnRFbmQoKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUXVvdGVTdHJpbmdfRXNjYXBlZERvbGxhcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIG5ld0xleGVyKCJcImZvbyAkJHtiYXJ9XCIiKTsKCiAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLkRPVUJMRV9RVU9URV9TVFJJTkcsICJmb28gJCR7YmFyfSIpOwoKICAgICAgICBhc3NlcnRFbmQoKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUXVvdGVTdHJpbmdfRXNjYXBlZFRhYigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIG5ld0xleGVyKCJcImNoZVxcdGVzZVwiIik7CgogICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5ET1VCTEVfUVVPVEVfU1RSSU5HLCAiY2hlXHRlc2UiKTsKCiAgICAgICAgYXNzZXJ0RW5kKCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVF1b3RlU3RyaW5nX0VzY2FwZWROZXdsaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgbmV3TGV4ZXIoIlwiY2hlXFxuZXNlXCIiKTsKCiAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLkRPVUJMRV9RVU9URV9TVFJJTkcsICJjaGVcbmVzZSIpOwoKICAgICAgICBhc3NlcnRFbmQoKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUXVvdGVTdHJpbmdfRXNjYXBlZENhcnJpYWdlUmV0dXJuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgbmV3TGV4ZXIoIlwiY2hlXFxyZXNlXCIiKTsKCiAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLkRPVUJMRV9RVU9URV9TVFJJTkcsICJjaGVccmVzZSIpOwoKICAgICAgICBhc3NlcnRFbmQoKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUXVvdGVTdHJpbmdfRXNjYXBlZE90aGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgbmV3TGV4ZXIoIlwiY2hlXFxiZXNlXCIiKTsKCiAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLkRPVUJMRV9RVU9URV9TVFJJTkcsICJjaGViZXNlIik7CgogICAgICAgIGFzc2VydEVuZCgpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVRdW90ZVN0cmluZ19TaW1wbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBuZXdMZXhlcigiJ2NoZWVzZSciKTsKCiAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLlNJTkdMRV9RVU9URV9TVFJJTkcsICJjaGVlc2UiKTsKCiAgICAgICAgYXNzZXJ0RW5kKCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZVF1b3RlU3RyaW5nX0VzY2FwZWRUYWIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBuZXdMZXhlcigiJ2NoZVxcdGVzZSciKTsKCiAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLlNJTkdMRV9RVU9URV9TVFJJTkcsICJjaGVcdGVzZSIpOwoKICAgICAgICBhc3NlcnRFbmQoKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlUXVvdGVTdHJpbmdfRXNjYXBlZE5ld2xpbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBuZXdMZXhlcigiJ2NoZVxcbmVzZSciKTsKCiAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLlNJTkdMRV9RVU9URV9TVFJJTkcsICJjaGVcbmVzZSIpOwoKICAgICAgICBhc3NlcnRFbmQoKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlUXVvdGVTdHJpbmdfRXNjYXBlZENhcnJpYWdlUmV0dXJuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgbmV3TGV4ZXIoIidjaGVcXHJlc2UnIik7CgogICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5TSU5HTEVfUVVPVEVfU1RSSU5HLCAiY2hlXHJlc2UiKTsKCiAgICAgICAgYXNzZXJ0RW5kKCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZVF1b3RlU3RyaW5nX0VzY2FwZWRPdGhlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIG5ld0xleGVyKCInY2hlXFxiZXNlJyIpOwoKICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uU0lOR0xFX1FVT1RFX1NUUklORywgImNoZWJlc2UiKTsKCiAgICAgICAgYXNzZXJ0RW5kKCk7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdFVudGVybWluYXRlZFN0cmluZ0xpdGVyYWxfRG91YmxlUXVvdGVfTmV3bGluZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIG5ld0xleGVyKCJcImNoZWVzZVxuIik7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIG5leHRUb2tlbigpOwogICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gVW50ZXJtaW5hdGVkU3RyaW5nTGl0ZXJhbEV4Y2VwdGlvbiIpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoVW50ZXJtaW5hdGVkU3RyaW5nTGl0ZXJhbEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIC8vIGV4cGVjdGVkIGFuZCBjb3JyZWN0CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsX0RvdWJsZVF1b3RlX0NhcnJpYWdlUmV0dXJuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgbmV3TGV4ZXIoIlwiY2hlZXNlXHIiKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbmV4dFRva2VuKCk7CiAgICAgICAgICAgIGZhaWwoInNob3VsZCBoYXZlIHRocm93biBVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uIik7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgLy8gZXhwZWN0ZWQgYW5kIGNvcnJlY3QKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdFVudGVybWluYXRlZFN0cmluZ0xpdGVyYWxfRG91YmxlUXVvdGVfRW5kT2ZTdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBuZXdMZXhlcigiXCJjaGVlc2UiKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbmV4dFRva2VuKCk7CiAgICAgICAgICAgIGZhaWwoInNob3VsZCBoYXZlIHRocm93biBVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uIik7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgLy8gZXhwZWN0ZWQgYW5kIGNvcnJlY3QKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdFVudGVybWluYXRlZFN0cmluZ0xpdGVyYWxfU2luZ2xlUXVvdGVfTmV3bGluZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIG5ld0xleGVyKCInY2hlZXNlXG4nIik7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIG5leHRUb2tlbigpOwogICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gVW50ZXJtaW5hdGVkU3RyaW5nTGl0ZXJhbEV4Y2VwdGlvbiIpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoVW50ZXJtaW5hdGVkU3RyaW5nTGl0ZXJhbEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIC8vIGV4cGVjdGVkIGFuZCBjb3JyZWN0CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsX1NpbmdsZVF1b3RlX0NhcnJpYWdlUmV0dXJuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgbmV3TGV4ZXIoIidjaGVlc2VcciciKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbmV4dFRva2VuKCk7CiAgICAgICAgICAgIGZhaWwoInNob3VsZCBoYXZlIHRocm93biBVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uIik7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChVbnRlcm1pbmF0ZWRTdHJpbmdMaXRlcmFsRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgLy8gZXhwZWN0ZWQgYW5kIGNvcnJlY3QKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdFVudGVybWluYXRlZFN0cmluZ0xpdGVyYWxfU2luZ2xlUXVvdGVfRW5kT2ZTdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBuZXdMZXhlcigiJ2NoZWVzZSIpOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBuZXh0VG9rZW4oKTsKICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIFVudGVybWluYXRlZFN0cmluZ0xpdGVyYWxFeGNlcHRpb24iKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKFVudGVybWluYXRlZFN0cmluZ0xpdGVyYWxFeGNlcHRpb24gZSkgewogICAgICAgICAgICAvLyBleHBlY3RlZCBhbmQgY29ycmVjdAogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpZmllcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgiY2hlZXNlIiwgVG9rZW4uSURFTlRJRklFUik7CiAgICB9CgogICAgcHVibGljIHZvaWQgdGVzdE51bWJlcl9JbnRlZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCI0MiIsIFRva2VuLklOVEVHRVJfTlVNQkVSKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0TnVtYmVyX0Zsb2F0aW5nUG9pbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoIjQyLjg0IiwgVG9rZW4uRkxPQVRfTlVNQkVSKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0TnVtYmVyX0ludGVnZXJDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgbmV3TGV4ZXIoIjQyLmNoZWVzZSIpOwoKICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uSU5URUdFUl9OVU1CRVIsICI0MiIpOwogICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5ET1QsICIuIik7CiAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLklERU5USUZJRVIsICJjaGVlc2UiKTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCB0ZXN0TnVtYmVyX0Zsb2F0Q2FsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIG5ld0xleGVyKCI0Mi4wLmNoZWVzZSIpOwoKICAgICAgICBhc3NlcnROZXh0VG9rZW4oVG9rZW4uRkxPQVRfTlVNQkVSLCAiNDIuMCIpOwogICAgICAgIGFzc2VydE5leHRUb2tlbihUb2tlbi5ET1QsICIuIik7CiAgICAgICAgYXNzZXJ0TmV4dFRva2VuKFRva2VuLklERU5USUZJRVIsICJjaGVlc2UiKTsKICAgIH0KCiovICAgIC8qCiAgICBwdWJsaWMgdm9pZCB0ZXN0TnVtYmVyX1VuZXhwZWN0ZWRDaGFyYWN0ZXIoKQogICAgICAgIHRocm93cyBFeGNlcHRpb24KICAgIHsKICAgICAgICBuZXdMZXhlciggIjQuMGNoZWVzZSIgKTsKICAgIAogICAgICAgIGNoYXJbXSBleHBlY3RlZCA9IGFzc2VydFVuZXhwZWN0ZWRDaGFyYWN0ZXIoICdjJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKTsKICAgIAogICAgICAgIGFzc2VydExlbmd0aCggMTAsCiAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCApOwogICAgCiAgICAgICAgYXNzZXJ0Q29udGFpbnMoICcwJywKICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgKTsKICAgICAgICBhc3NlcnRDb250YWlucyggJzEnLAogICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCApOwogICAgICAgIGFzc2VydENvbnRhaW5zKCAnMicsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkICk7CiAgICAgICAgYXNzZXJ0Q29udGFpbnMoICczJywKICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgKTsKICAgICAgICBhc3NlcnRDb250YWlucyggJzQnLAogICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCApOwogICAgICAgIGFzc2VydENvbnRhaW5zKCAnNScsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkICk7CiAgICAgICAgYXNzZXJ0Q29udGFpbnMoICc2JywKICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgKTsKICAgICAgICBhc3NlcnRDb250YWlucyggJzcnLAogICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCApOwogICAgICAgIGFzc2VydENvbnRhaW5zKCAnOCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkICk7CiAgICAgICAgYXNzZXJ0Q29udGFpbnMoICc5JywKICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgKTsKICAgIH0KICAgICovCi8qCgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0Fic3RyYWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCJhYnN0cmFjdCIsIFRva2VuLktFWVdPUkRfQUJTVFJBQ1QpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0FzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCJhcyIsIFRva2VuLktFWVdPUkRfQVMpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0JyZWFrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCJicmVhayIsIFRva2VuLktFWVdPUkRfQlJFQUspOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0Nhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoImNhc2UiLCBUb2tlbi5LRVlXT1JEX0NBU0UpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0NhdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCJjYXRjaCIsIFRva2VuLktFWVdPUkRfQ0FUQ0gpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0NsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCJjbGFzcyIsIFRva2VuLktFWVdPUkRfQ0xBU1MpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0NvbnN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCJjb25zdCIsIFRva2VuLktFWVdPUkRfQ09OU1QpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0NvbnRpbnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCJjb250aW51ZSIsIFRva2VuLktFWVdPUkRfQ09OVElOVUUpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoImRlZmF1bHQiLCBUb2tlbi5LRVlXT1JEX0RFRkFVTFQpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0RvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCJkbyIsIFRva2VuLktFWVdPUkRfRE8pOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0Vsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoImVsc2UiLCBUb2tlbi5LRVlXT1JEX0VMU0UpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0V4dGVuZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoImV4dGVuZHMiLCBUb2tlbi5LRVlXT1JEX0VYVEVORFMpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0ZpbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCJmaW5hbCIsIFRva2VuLktFWVdPUkRfRklOQUwpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0ZpbmFsbHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoImZpbmFsbHkiLCBUb2tlbi5LRVlXT1JEX0ZJTkFMTFkpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0ZvcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgiZm9yIiwgVG9rZW4uS0VZV09SRF9GT1IpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0dvdG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoImdvdG8iLCBUb2tlbi5LRVlXT1JEX0dPVE8pOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0lmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCJpZiIsIFRva2VuLktFWVdPUkRfSUYpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0ltcGxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoImltcGxlbWVudHMiLCBUb2tlbi5LRVlXT1JEX0lNUExFTUVOVFMpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0ltcG9ydCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgiaW1wb3J0IiwgVG9rZW4uS0VZV09SRF9JTVBPUlQpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0luc3RhbmNlb2YoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoImluc3RhbmNlb2YiLCBUb2tlbi5LRVlXT1JEX0lOU1RBTkNFT0YpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0ludGVyZmFjZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgiaW50ZXJmYWNlIiwgVG9rZW4uS0VZV09SRF9JTlRFUkZBQ0UpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX05hdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgibmF0aXZlIiwgVG9rZW4uS0VZV09SRF9OQVRJVkUpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX05ldygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgibmV3IiwgVG9rZW4uS0VZV09SRF9ORVcpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1BhY2thZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoInBhY2thZ2UiLCBUb2tlbi5LRVlXT1JEX1BBQ0tBR0UpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1ByaXZhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoInByaXZhdGUiLCBUb2tlbi5LRVlXT1JEX1BSSVZBVEUpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1Byb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCJwcm9wZXJ0eSIsIFRva2VuLktFWVdPUkRfUFJPUEVSVFkpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1Byb3RlY3RlZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgicHJvdGVjdGVkIiwgVG9rZW4uS0VZV09SRF9QUk9URUNURUQpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1B1YmxpYygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgicHVibGljIiwgVG9rZW4uS0VZV09SRF9QVUJMSUMpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1JldHVybigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgicmV0dXJuIiwgVG9rZW4uS0VZV09SRF9SRVRVUk4pOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1N0YXRpYygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgic3RhdGljIiwgVG9rZW4uS0VZV09SRF9TVEFUSUMpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1N1cGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCJzdXBlciIsIFRva2VuLktFWVdPUkRfU1VQRVIpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1N3aXRjaCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgic3dpdGNoIiwgVG9rZW4uS0VZV09SRF9TV0lUQ0gpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1N5bmNocm9uaXplZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgic3luY2hyb25pemVkIiwgVG9rZW4uS0VZV09SRF9TWU5DSFJPTklaRUQpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1RoaXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBhc3NlcnRTaW1wbGUoInRoaXMiLCBUb2tlbi5LRVlXT1JEX1RISVMpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1Rocm93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCJ0aHJvdyIsIFRva2VuLktFWVdPUkRfVEhST1cpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1Rocm93cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgidGhyb3dzIiwgVG9rZW4uS0VZV09SRF9USFJPV1MpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1RyeSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydFNpbXBsZSgidHJ5IiwgVG9rZW4uS0VZV09SRF9UUlkpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1doaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgYXNzZXJ0U2ltcGxlKCJ3aGlsZSIsIFRva2VuLktFWVdPUkRfV0hJTEUpOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHRlc3RVbmV4cGVjdGVDaGFyYWN0ZXJFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBuZXdMZXhlcigisSIpOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBuZXh0VG9rZW4oKTsKICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIFVuZXhwZWN0ZWRDaGFyYWN0ZXJFeGNlcHRpb24iKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKFVuZXhwZWN0ZWRDaGFyYWN0ZXJFeGNlcHRpb24gZSkgewogICAgICAgICAgICAvLyBleHBlY3RlZCBhbmQgY29ycmVjdAogICAgICAgICAgICBhc3NlcnRFcXVhbHMoJ7EnLCBlLmdldENoYXJhY3RlcigpKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFNpbXBsZShTdHJpbmcgdGV4dCwgaW50IHR5cGUpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIG5ld0xleGVyKHRleHQpOwoKICAgICAgICBhc3NlcnROZXh0VG9rZW4odHlwZSwgdGV4dCk7CgogICAgICAgIGFzc2VydEVuZCgpOwogICAgfQoKICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydE5leHRUb2tlbihpbnQgdHlwZSwgU3RyaW5nIHRleHQpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIFRva2VuIHRva2VuID0gdGhpcy5sZXhlci5uZXh0VG9rZW4oKTsKCiAgICAgICAgYXNzZXJ0Tm90TnVsbCh0b2tlbik7CgogICAgICAgIGFzc2VydEVxdWFscyh0eXBlLCB0b2tlbi5nZXRUeXBlKCkpOwoKICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0ZWQ6ICIgKyB0ZXh0ICsgIiBidXQgZ290OiAiICsgdG9rZW4uZ2V0VGV4dCgpKTsKICAgICAgICAKICAgICAgICBhc3NlcnRFcXVhbHModGV4dCwgdG9rZW4uZ2V0VGV4dCgpKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgdm9pZCBuZXh0VG9rZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICB0aGlzLmxleGVyLm5leHRUb2tlbigpOwogICAgfQoKICAgIHByb3RlY3RlZCBjaGFyW10gYXNzZXJ0VW5leHBlY3RlZENoYXJhY3RlcihjaGFyIGMsIGludCBsaW5lLCBpbnQgY29sdW1uKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLmxleGVyLm5leHRUb2tlbigpOwogICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gVW5leHBlY3RlZENoYXJhY3RlckV4Y2VwdGlvbiIpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoVW5leHBlY3RlZENoYXJhY3RlckV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIC8vIGV4cGVjdGVkIGFuZCBjb3JyZWN0CiAgICAgICAgICAgIGFzc2VydEVxdWFscyhjLCBlLmdldENoYXJhY3RlcigpKTsKCiAgICAgICAgICAgIGFzc2VydEVxdWFscyhsaW5lLCBlLmdldExpbmUoKSk7CgogICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29sdW1uLCBlLmdldFN0YXJ0Q29sdW1uKCkpOwoKICAgICAgICAgICAgcmV0dXJuIGUuZ2V0RXhwZWN0ZWQoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgY2hhcltdIHsKICAgICAgICB9OwogICAgfQoKICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEVuZCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGFzc2VydE51bGwodGhpcy5sZXhlci5uZXh0VG9rZW4oKSk7CiAgICB9CgogICAgcHJvdGVjdGVkIHZvaWQgbmV3TGV4ZXIoU3RyaW5nIHRleHQpIHsKICAgICAgICBTdHJpbmdDaGFyU3RyZWFtIGluID0gbmV3IFN0cmluZ0NoYXJTdHJlYW0odGV4dCk7CgogICAgICAgIHRoaXMubGV4ZXIgPSBuZXcgTGV4ZXIoaW4pOwogICAgfQoqLwp9Cg==