Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gRGVzY3JpcHRpb246Ci8vCi8vIFRoaXMgZmlsZSBpcyBmb3IgODgxMmExYW50IENvLWV4aXN0IG1lY2hhbmlzbQovLwovLyBIaXN0b3J5Ci8vIDIwMTIvMTEvMTUgQ29zYSBmaXJzdCBjaGVjayBpbi4KLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIGluY2x1ZGUgZmlsZXMKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KI2luY2x1ZGUgImhhbGJ0X3ByZWNvbXAuaCIKI2lmIDEKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gR2xvYmFsIHZhcmlhYmxlcywgdGhlc2UgYXJlIHN0YXRpYyB2YXJpYWJsZXMKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0Kc3RhdGljIENPRVhfRE1fODgxMkFfMUFOVAkJR0xDb2V4RG04ODEyYTFBbnQ7CnN0YXRpYyBQQ09FWF9ETV84ODEyQV8xQU5UIAljb2V4X2RtPSZHTENvZXhEbTg4MTJhMUFudDsKc3RhdGljIENPRVhfU1RBXzg4MTJBXzFBTlQJCUdMQ29leFN0YTg4MTJhMUFudDsKc3RhdGljIFBDT0VYX1NUQV84ODEyQV8xQU5UCWNvZXhfc3RhPSZHTENvZXhTdGE4ODEyYTFBbnQ7Cgpjb25zdCBjaGFyICpjb25zdCBHTEJ0SW5mb1NyYzg4MTJhMUFudFtdPXsKCSJCVCBJbmZvW3dpZmkgZnddIiwKCSJCVCBJbmZvW2J0IHJzcF0iLAoJIkJUIEluZm9bYnQgYXV0byByZXBvcnRdIiwKfTsKCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvIHR5cGUgaWYgbmVlZGVkCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIGxvY2FsIGZ1bmN0aW9uIHN0YXJ0IHdpdGggaGFsYnRjODgxMmExYW50XwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojaWYgMAp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9SZWcweDU1MEJpdDMoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAlCT09MRUFOCQkJYlNldAoJKQp7Cgl1MUJ5dGUJdTF0bXA9MDsKCQoJdTF0bXAgPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg1NTApOwoJaWYoYlNldCkKCXsKCQl1MXRtcCB8PSBCSVQzOwoJfQoJZWxzZQoJewoJCXUxdG1wICY9IH5CSVQzOwoJfQoJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDU1MCwgdTF0bXApOwoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBzZXQgMHg1NTBbM109JWRcbiIsIChiU2V0PyAxOjApKSk7Cn0KI2VuZGlmCnUxQnl0ZQpoYWxidGM4ODEyYTFhbnRfQnRSc3NpU3RhdGUoCgl1MUJ5dGUJCQlsZXZlbF9udW0sCgl1MUJ5dGUJCQlyc3NpX3RocmVzaCwKCXUxQnl0ZQkJCXJzc2lfdGhyZXNoMQoJKQp7CglzNEJ5dGUJCQlidF9yc3NpPTA7Cgl1MUJ5dGUJCQlidF9yc3NpX3N0YXRlOwoKCWJ0X3Jzc2kgPSBjb2V4X3N0YS0+YnRfcnNzaTsKCglpZihsZXZlbF9udW0gPT0gMikKCXsJCQkKCQlpZiggKGNvZXhfc3RhLT5wcmVfYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CgkJCShjb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKQoJCXsKCQkJaWYoYnRfcnNzaSA+PSAocnNzaV90aHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg4MTJBXzFBTlQpKQoJCQl7CgkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKGJ0X3Jzc2kgPCByc3NpX3RocmVzaCkKCQkJewoJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0xPVzsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN3aXRjaCB0byBMb3dcbiIpKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0g7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKCQkJfQoJCX0KCX0KCWVsc2UgaWYobGV2ZWxfbnVtID09IDMpCgl7CgkJaWYocnNzaV90aHJlc2ggPiByc3NpX3RocmVzaDEpCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSB0aHJlc2ggZXJyb3IhIVxuIikpOwoJCQlyZXR1cm4gY29leF9zdGEtPnByZV9idF9yc3NpX3N0YXRlOwoJCX0KCQkKCQlpZiggKGNvZXhfc3RhLT5wcmVfYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CgkJCShjb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKQoJCXsKCQkJaWYoYnRfcnNzaSA+PSAocnNzaV90aHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg4MTJBXzFBTlQpKQoJCQl7CgkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfTUVESVVNOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJYnRfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKCQkJfQoJCX0KCQllbHNlIGlmKCAoY29leF9zdGEtPnByZV9idF9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX01FRElVTSkgfHwKCQkJKGNvZXhfc3RhLT5wcmVfYnRfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTSkpCgkJewoJCQlpZihidF9yc3NpID49IChyc3NpX3RocmVzaDErQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg4MTJBXzFBTlQpKQoJCQl7CgkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7CgkJCX0KCQkJZWxzZSBpZihidF9yc3NpIDwgcnNzaV90aHJlc2gpCgkJCXsKCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU07CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IE1lZGl1bVxuIikpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKGJ0X3Jzc2kgPCByc3NpX3RocmVzaDEpCgkJCXsKCQkJCWJ0X3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9NRURJVU07CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlidF9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7CgkJCX0KCQl9Cgl9CgkJCgljb2V4X3N0YS0+cHJlX2J0X3Jzc2lfc3RhdGUgPSBidF9yc3NpX3N0YXRlOwoKCXJldHVybiBidF9yc3NpX3N0YXRlOwp9Cgp1MUJ5dGUKaGFsYnRjODgxMmExYW50X1dpZmlSc3NpU3RhdGUoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAl1MUJ5dGUJCQlpbmRleCwKCSAJdTFCeXRlCQkJbGV2ZWxfbnVtLAoJIAl1MUJ5dGUJCQlyc3NpX3RocmVzaCwKCSAJdTFCeXRlCQkJcnNzaV90aHJlc2gxCgkpCnsKCXM0Qnl0ZQkJCXdpZmlfcnNzaT0wOwoJdTFCeXRlCQkJd2lmaV9yc3NpX3N0YXRlOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfUzRfV0lGSV9SU1NJLCAmd2lmaV9yc3NpKTsKCQoJaWYobGV2ZWxfbnVtID09IDIpCgl7CgkJaWYoIChjb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfTE9XKSB8fAoJCQkoY29leF9zdGEtPnByZV93aWZpX3Jzc2lfc3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkKCQl7CgkJCWlmKHdpZmlfcnNzaSA+PSAocnNzaV90aHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg4MTJBXzFBTlQpKQoJCQl7CgkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9ISUdIOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVzsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKHdpZmlfcnNzaSA8IHJzc2lfdGhyZXNoKQoJCQl7CgkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJd2lmaV9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOwoJCQl9CgkJfQoJfQoJZWxzZSBpZihsZXZlbF9udW0gPT0gMykKCXsKCQlpZihyc3NpX3RocmVzaCA+IHJzc2lfdGhyZXNoMSkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSB0aHJlc2ggZXJyb3IhIVxuIikpOwoJCQlyZXR1cm4gY29leF9zdGEtPnByZV93aWZpX3Jzc2lfc3RhdGVbaW5kZXhdOwoJCX0KCQkKCQlpZiggKGNvZXhfc3RhLT5wcmVfd2lmaV9yc3NpX3N0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CgkJCShjb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKQoJCXsKCQkJaWYod2lmaV9yc3NpID49IChyc3NpX3RocmVzaCtCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODgxMkFfMUFOVCkpCgkJCXsKCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX01FRElVTTsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVzsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOwoJCQl9CgkJfQoJCWVsc2UgaWYoIChjb2V4X3N0YS0+cHJlX3dpZmlfcnNzaV9zdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfTUVESVVNKSB8fAoJCQkoY29leF9zdGEtPnByZV93aWZpX3Jzc2lfc3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNKSkKCQl7CgkJCWlmKHdpZmlfcnNzaSA+PSAocnNzaV90aHJlc2gxK0JUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84ODEyQV8xQU5UKSkKCQkJewoJCQkJd2lmaV9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOwoJCQl9CgkJCWVsc2UgaWYod2lmaV9yc3NpIDwgcnNzaV90aHJlc2gpCgkJCXsKCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0xPVzsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQl3aWZpX3Jzc2lfc3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTTsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IE1lZGl1bVxuIikpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKHdpZmlfcnNzaSA8IHJzc2lfdGhyZXNoMSkKCQkJewoJCQkJd2lmaV9yc3NpX3N0YXRlID0gQlRDX1JTU0lfU1RBVEVfTUVESVVNOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBNZWRpdW1cbiIpKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXdpZmlfcnNzaV9zdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKCQkJfQoJCX0KCX0KCQkKCWNvZXhfc3RhLT5wcmVfd2lmaV9yc3NpX3N0YXRlW2luZGV4XSA9IHdpZmlfcnNzaV9zdGF0ZTsKCglyZXR1cm4gd2lmaV9yc3NpX3N0YXRlOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9Nb25pdG9yQnRFbmFibGVEaXNhYmxlKAoJICAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJc3RhdGljIEJPT0xFQU4JcHJlX2J0X2Rpc2FibGVkPWZhbHNlOwoJc3RhdGljIHU0Qnl0ZQkJYnRfZGlzYWJsZV9jbnQ9MDsKCUJPT0xFQU4JCQlidF9hY3RpdmU9dHJ1ZSwgYnRfZGlzYWJsZV9ieTY4PWZhbHNlLCBidF9kaXNhYmxlZD1mYWxzZTsKCXU0Qnl0ZQkJCXU0X3RtcD0wOwoKCS8vIFRoaXMgZnVuY3Rpb24gY2hlY2sgaWYgYnQgaXMgZGlzYWJsZWQKCglpZigJY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfdHggPT0gMCAmJgoJCWNvZXhfc3RhLT5oaWdoX3ByaW9yaXR5X3J4ID09IDAgJiYKCQljb2V4X3N0YS0+bG93X3ByaW9yaXR5X3R4ID09IDAgJiYKCQljb2V4X3N0YS0+bG93X3ByaW9yaXR5X3J4ID09IDApCgl7CgkJYnRfYWN0aXZlID0gZmFsc2U7Cgl9CglpZigJY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfdHggPT0gMHhmZmZmICYmCgkJY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfcnggPT0gMHhmZmZmICYmCgkJY29leF9zdGEtPmxvd19wcmlvcml0eV90eCA9PSAweGZmZmYgJiYKCQljb2V4X3N0YS0+bG93X3ByaW9yaXR5X3J4ID09IDB4ZmZmZikKCXsKCQlidF9hY3RpdmUgPSBmYWxzZTsKCX0KCWlmKGJ0X2FjdGl2ZSkKCXsKCQlidF9kaXNhYmxlX2NudCA9IDA7CgkJYnRfZGlzYWJsZWQgPSBmYWxzZTsKCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0JMX0JUX0RJU0FCTEUsICZidF9kaXNhYmxlZCk7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEJUIGlzIGVuYWJsZWQgISFcbiIpKTsKCX0KCWVsc2UKCXsKCQlidF9kaXNhYmxlX2NudCsrOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLCAoIltCVENvZXhdLCBidCBhbGwgY291bnRlcnM9MCwgJWQgdGltZXMhIVxuIiwgCgkJCQlidF9kaXNhYmxlX2NudCkpOwoJCWlmKGJ0X2Rpc2FibGVfY250ID49IDIgfHxidF9kaXNhYmxlX2J5NjgpCgkJewoJCQlidF9kaXNhYmxlZCA9IHRydWU7CgkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQkxfQlRfRElTQUJMRSwgJmJ0X2Rpc2FibGVkKTsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEJUIGlzIGRpc2FibGVkICEhXG4iKSk7CgkJfQoJfQoJaWYocHJlX2J0X2Rpc2FibGVkICE9IGJ0X2Rpc2FibGVkKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLCAoIltCVENvZXhdLCBCVCBpcyBmcm9tICVzIHRvICVzISFcbiIsIAoJCQkocHJlX2J0X2Rpc2FibGVkID8gImRpc2FibGVkIjoiZW5hYmxlZCIpLCAKCQkJKGJ0X2Rpc2FibGVkID8gImRpc2FibGVkIjoiZW5hYmxlZCIpKSk7CgkJcHJlX2J0X2Rpc2FibGVkID0gYnRfZGlzYWJsZWQ7CgkJaWYoIWJ0X2Rpc2FibGVkKQoJCXsKCQl9CgkJZWxzZQoJCXsKCQl9Cgl9Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X01vbml0b3JCdEN0cigKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJdTRCeXRlIAkJCXJlZ19ocF90eF9yeCwgcmVnX2xwX3R4X3J4LCB1NF90bXA7Cgl1NEJ5dGUJCQlyZWdfaHBfdHg9MCwgcmVnX2hwX3J4PTAsIHJlZ19scF90eD0wLCByZWdfbHBfcng9MDsKCXUxQnl0ZQkJCXUxX3RtcDsKCQoJcmVnX2hwX3R4X3J4ID0gMHg3NzA7CglyZWdfbHBfdHhfcnggPSAweDc3NDsKCgl1NF90bXAgPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgcmVnX2hwX3R4X3J4KTsKCXJlZ19ocF90eCA9IHU0X3RtcCAmIGJNYXNrTFdvcmQ7CglyZWdfaHBfcnggPSAodTRfdG1wICYgYk1hc2tIV29yZCk+PjE2OwoKCXU0X3RtcCA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCByZWdfbHBfdHhfcngpOwoJcmVnX2xwX3R4ID0gdTRfdG1wICYgYk1hc2tMV29yZDsKCXJlZ19scF9yeCA9ICh1NF90bXAgJiBiTWFza0hXb3JkKT4+MTY7CgkJCgljb2V4X3N0YS0+aGlnaF9wcmlvcml0eV90eCA9IHJlZ19ocF90eDsKCWNvZXhfc3RhLT5oaWdoX3ByaW9yaXR5X3J4ID0gcmVnX2hwX3J4OwoJY29leF9zdGEtPmxvd19wcmlvcml0eV90eCA9IHJlZ19scF90eDsKCWNvZXhfc3RhLT5sb3dfcHJpb3JpdHlfcnggPSByZWdfbHBfcng7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEhpZ2ggUHJpb3JpdHkgVHgvUnggKHJlZyAweCV4KT0leCglZCkvJXgoJWQpXG4iLCAKCQlyZWdfaHBfdHhfcngsIHJlZ19ocF90eCwgcmVnX2hwX3R4LCByZWdfaHBfcngsIHJlZ19ocF9yeCkpOwoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIExvdyBQcmlvcml0eSBUeC9SeCAocmVnIDB4JXgpPSV4KCVkKS8leCglZClcbiIsIAoJCXJlZ19scF90eF9yeCwgcmVnX2xwX3R4LCByZWdfbHBfdHgsIHJlZ19scF9yeCwgcmVnX2xwX3J4KSk7CgoJLy8gcmVzZXQgY291bnRlcgoJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDc2ZSwgMHhjKTsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfUXVlcnlCdEluZm8oCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsJCgl1MUJ5dGUJZGF0YUxlbj0zOwoJdTFCeXRlCWJ1Zls1XSA9IHswfTsKCXN0YXRpYwl1NEJ5dGUJYnRJbmZvQ250PTA7CgoJaWYoIWJ0SW5mb0NudCB8fAoJCShjb2V4X3N0YS0+YnRfaW5mb19jMmhfY250W0JUX0lORk9fU1JDXzg4MTJBXzFBTlRfQlRfUlNQXS1idEluZm9DbnQpPjIpCgl7CgkJYnVmWzBdID0gZGF0YUxlbjsKCQlidWZbMV0gPSAweDE7CS8vIHBvbGxpbmcgZW5hYmxlLCAxPWVuYWJsZSwgMD1kaXNhYmxlCgkJYnVmWzJdID0gMHgyOwkvLyBwb2xsaW5nIHRpbWUgaW4gc2Vjb25kcwoJCWJ1ZlszXSA9IDB4MTsJLy8gYXV0byByZXBvcnQgZW5hYmxlLCAxPWVuYWJsZSwgMD1kaXNhYmxlCgkJCQoJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0NUUkxfQlRfSU5GTywgKFBWT0lEKSZidWZbMF0pOwoJfQoJYnRJbmZvQ250ID0gY29leF9zdGEtPmJ0X2luZm9fYzJoX2NudFtCVF9JTkZPX1NSQ184ODEyQV8xQU5UX0JUX1JTUF07Cn0KdTFCeXRlCmhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25BbGdvcml0aG0oCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsKCVBCVENfU1RBQ0tfSU5GTwkJc3RhY2tfaW5mbz0mYnRjb2V4aXN0LT5zdGFja19pbmZvOwoJQk9PTEVBTgkJCQlidF9oc19vbj1mYWxzZTsKCXUxQnl0ZQkJCQlhbGdvcml0aG09QlRfODgxMkFfMUFOVF9DT0VYX0FMR09fVU5ERUZJTkVEOwoJdTFCeXRlCQkJCW51bV9vZl9kaWZmX3Byb2ZpbGU9MDsKCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJ0X2hzX29uKTsKCQoJaWYoIXN0YWNrX2luZm8tPmJ0X2xpbmtfZXhpc3QpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBObyBwcm9maWxlIGV4aXN0cyEhIVxuIikpOwoJCXJldHVybiBhbGdvcml0aG07Cgl9CgoJaWYoc3RhY2tfaW5mby0+c2NvX2V4aXN0KQoJCW51bV9vZl9kaWZmX3Byb2ZpbGUrKzsKCWlmKHN0YWNrX2luZm8tPmhpZF9leGlzdCkKCQludW1fb2ZfZGlmZl9wcm9maWxlKys7CglpZihzdGFja19pbmZvLT5wYW5fZXhpc3QpCgkJbnVtX29mX2RpZmZfcHJvZmlsZSsrOwoJaWYoc3RhY2tfaW5mby0+YTJkcF9leGlzdCkKCQludW1fb2ZfZGlmZl9wcm9maWxlKys7CgkKCWlmKG51bV9vZl9kaWZmX3Byb2ZpbGUgPT0gMSkKCXsKCQlpZihzdGFja19pbmZvLT5zY29fZXhpc3QpCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyBvbmx5XG4iKSk7CgkJCWFsZ29yaXRobSA9IEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX1NDTzsKCQl9CgkJZWxzZQoJCXsKCQkJaWYoc3RhY2tfaW5mby0+aGlkX2V4aXN0KQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCBvbmx5XG4iKSk7CgkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISUQ7CgkJCX0KCQkJZWxzZSBpZihzdGFja19pbmZvLT5hMmRwX2V4aXN0KQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAgb25seVxuIikpOwoJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fQTJEUDsKCQkJfQoJCQllbHNlIGlmKHN0YWNrX2luZm8tPnBhbl9leGlzdCkKCQkJewoJCQkJaWYoYnRfaHNfb24pCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBQQU4oSFMpIG9ubHlcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5IUzsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFBBTihFRFIpIG9ubHlcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5FRFI7CgkJCQl9CgkJCX0KCQl9Cgl9CgllbHNlIGlmKG51bV9vZl9kaWZmX3Byb2ZpbGUgPT0gMikKCXsKCQlpZihzdGFja19pbmZvLT5zY29fZXhpc3QpCgkJewoJCQlpZihzdGFja19pbmZvLT5oaWRfZXhpc3QpCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgSElEXG4iKSk7CgkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISUQ7CgkJCX0KCQkJZWxzZSBpZihzdGFja19pbmZvLT5hMmRwX2V4aXN0KQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEEyRFAgPT0+IFNDT1xuIikpOwoJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fU0NPOwoJCQl9CgkJCWVsc2UgaWYoc3RhY2tfaW5mby0+cGFuX2V4aXN0KQoJCQl7CgkJCQlpZihidF9oc19vbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19TQ087CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBQQU4oRURSKVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CgkJCQl9CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJaWYoIHN0YWNrX2luZm8tPmhpZF9leGlzdCAmJgoJCQkJc3RhY2tfaW5mby0+YTJkcF9leGlzdCApCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUFxuIikpOwoJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fSElEX0EyRFA7CgkJCX0KCQkJZWxzZSBpZiggc3RhY2tfaW5mby0+aGlkX2V4aXN0ICYmCgkJCQlzdGFja19pbmZvLT5wYW5fZXhpc3QgKQoJCQl7CgkJCQlpZihidF9oc19vbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihFRFIpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKCQkJCX0KCQkJfQoJCQllbHNlIGlmKCBzdGFja19pbmZvLT5wYW5fZXhpc3QgJiYKCQkJCXN0YWNrX2luZm8tPmEyZHBfZXhpc3QgKQoJCQl7CgkJCQlpZihidF9oc19vbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAgKyBQQU4oSFMpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fQTJEUF9QQU5IUzsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAgKyBQQU4oRURSKVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX1BBTkVEUl9BMkRQOwoJCQkJfQoJCQl9CgkJfQoJfQoJZWxzZSBpZihudW1fb2ZfZGlmZl9wcm9maWxlID09IDMpCgl7CgkJaWYoc3RhY2tfaW5mby0+c2NvX2V4aXN0KQoJCXsKCQkJaWYoIHN0YWNrX2luZm8tPmhpZF9leGlzdCAmJgoJCQkJc3RhY2tfaW5mby0+YTJkcF9leGlzdCApCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgSElEICsgQTJEUCA9PT4gSElEXG4iKSk7CgkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISUQ7CgkJCX0KCQkJZWxzZSBpZiggc3RhY2tfaW5mby0+aGlkX2V4aXN0ICYmCgkJCQlzdGFja19pbmZvLT5wYW5fZXhpc3QgKQoJCQl7CgkJCQlpZihidF9oc19vbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRCArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRCArIFBBTihFRFIpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKCQkJCX0KCQkJfQoJCQllbHNlIGlmKCBzdGFja19pbmZvLT5wYW5fZXhpc3QgJiYKCQkJCXN0YWNrX2luZm8tPmEyZHBfZXhpc3QgKQoJCQl7CgkJCQlpZihidF9oc19vbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEEyRFAgKyBQQU4oSFMpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fU0NPOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgQTJEUCArIFBBTihFRFIpID09PiBISURcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwoJCQkJfQoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKCBzdGFja19pbmZvLT5oaWRfZXhpc3QgJiYKCQkJCXN0YWNrX2luZm8tPnBhbl9leGlzdCAmJgoJCQkJc3RhY2tfaW5mby0+YTJkcF9leGlzdCApCgkJCXsKCQkJCWlmKGJ0X2hzX29uKQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUCArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFAgKyBQQU4oRURSKVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX0hJRF9BMkRQX1BBTkVEUjsKCQkJCX0KCQkJfQoJCX0KCX0KCWVsc2UgaWYobnVtX29mX2RpZmZfcHJvZmlsZSA+PSAzKQoJewoJCWlmKHN0YWNrX2luZm8tPnNjb19leGlzdCkKCQl7CgkJCWlmKCBzdGFja19pbmZvLT5oaWRfZXhpc3QgJiYKCQkJCXN0YWNrX2luZm8tPnBhbl9leGlzdCAmJgoJCQkJc3RhY2tfaW5mby0+YTJkcF9leGlzdCApCgkJCXsKCQkJCWlmKGJ0X2hzX29uKQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgU0NPICsgSElEICsgQTJEUCArIFBBTihIUylcbiIpKTsKCgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBBMkRQICsgUEFOKEVEUik9PT5QQU4oRURSKStISURcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiBhbGdvcml0aG07Cn0KCkJPT0xFQU4KaGFsYnRjODgxMmExYW50X05lZWRUb0RlY0J0UHdyKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7CglCT09MRUFOCQlyZXQ9ZmFsc2U7CglCT09MRUFOCQlidF9oc19vbj1mYWxzZSwgd2lmaV9jb25uZWN0ZWQ9ZmFsc2U7CglzNEJ5dGUJCWJ0X2hzX3Jzc2k9MDsKCglpZighYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZidF9oc19vbikpCgkJcmV0dXJuIGZhbHNlOwoJaWYoIWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZ3aWZpX2Nvbm5lY3RlZCkpCgkJcmV0dXJuIGZhbHNlOwoJaWYoIWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfUzRfSFNfUlNTSSwgJmJ0X2hzX3Jzc2kpKQoJCXJldHVybiBmYWxzZTsKCglpZih3aWZpX2Nvbm5lY3RlZCkKCXsKCQlpZihidF9oc19vbikKCQl7CgkJCWlmKGJ0X2hzX3Jzc2kgPiAzNykKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCBOZWVkIHRvIGRlY3JlYXNlIGJ0IHBvd2VyIGZvciBIUyBtb2RlISFcbiIpKTsKCQkJCXJldCA9IHRydWU7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCBOZWVkIHRvIGRlY3JlYXNlIGJ0IHBvd2VyIGZvciBXaWZpIGlzIGNvbm5lY3RlZCEhXG4iKSk7CgkJCXJldCA9IHRydWU7CgkJfQoJfQoJCglyZXR1cm4gcmV0Owp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9TZXRGd0RhY1N3aW5nTGV2ZWwoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAl1MUJ5dGUJCQlkYWNfc3dpbmdfbHZsCgkpCnsKCXUxQnl0ZQkJCWgyY19wYXJhbWV0ZXJbMV0gPXswfTsKCgkvLyBUaGVyZSBhcmUgc2V2ZXJhbCB0eXBlIG9mIGRhY3N3aW5nCgkvLyAweDE4LyAweDEwLyAweGMvIDB4OC8gMHg0LyAweDYKCWgyY19wYXJhbWV0ZXJbMF0gPSBkYWNfc3dpbmdfbHZsOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBTZXQgRGFjIFN3aW5nIExldmVsPTB4JXhcbiIsIGRhY19zd2luZ19sdmwpKTsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBGVyB3cml0ZSAweDY0PTB4JXhcbiIsIGgyY19wYXJhbWV0ZXJbMF0pKTsKCglidGNvZXhpc3QtPmJ0Y19maWxsX2gyYyhidGNvZXhpc3QsIDB4NjQsIDEsIGgyY19wYXJhbWV0ZXIpOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9TZXRGd0RlY0J0UHdyKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKCSAJQk9PTEVBTgkJCWRlY19idF9wd3IKCSkKewoJdTFCeXRlCWRhdGFMZW49MzsKCXUxQnl0ZQlidWZbNV0gPSB7MH07CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIGRlY3JlYXNlIEJ0IFBvd2VyIDogJXNcbiIsIAoJCQkoZGVjX2J0X3B3cj8gIlllcyEhIjoiTm8hISIpKSk7CgoJYnVmWzBdID0gZGF0YUxlbjsKCWJ1ZlsxXSA9IDB4MzsJCS8vIE9QX0NvZGUKCWJ1ZlsyXSA9IDB4MTsJCS8vIE9QX0NvZGVfTGVuZ3RoCglpZihkZWNfYnRfcHdyKQoJCWJ1ZlszXSA9IDB4MTsJLy8gT1BfQ29kZV9Db250ZW50CgllbHNlCgkJYnVmWzNdID0gMHgwOwoJCQoJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfQ1RSTF9CVF9DT0VYLCAoUFZPSUQpJmJ1ZlswXSk7CQp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cigKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAlCT09MRUFOCQkJZGVjX2J0X3B3cgoJKQp7CglyZXR1cm47CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIERlYyBCVCBwb3dlciA9ICVzXG4iLCAgCgkJKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGRlY19idF9wd3IpPyAiT04iOiJPRkYiKSkpOwoJY29leF9kbS0+Y3VyX2RlY19idF9wd3IgPSBkZWNfYnRfcHdyOwoKCWlmKCFmb3JjZV9leGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIHByZV9kZWNfYnRfcHdyPSVkLCBjdXJfZGVjX2J0X3B3cj0lZFxuIiwgCgkJCWNvZXhfZG0tPnByZV9kZWNfYnRfcHdyLCBjb2V4X2RtLT5jdXJfZGVjX2J0X3B3cikpOwoKCQlpZihjb2V4X2RtLT5wcmVfZGVjX2J0X3B3ciA9PSBjb2V4X2RtLT5jdXJfZGVjX2J0X3B3cikgCgkJCXJldHVybjsKCX0KCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd0RlY0J0UHdyKGJ0Y29leGlzdCwgY29leF9kbS0+Y3VyX2RlY19idF9wd3IpOwoKCWNvZXhfZG0tPnByZV9kZWNfYnRfcHdyID0gY29leF9kbS0+Y3VyX2RlY19idF9wd3I7Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X1NldEZ3QnRMbmFDb25zdHJhaW4oCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAlCT09MRUFOCQkJYnRfbG5hX2NvbnNfb24KCSkKewoJdTFCeXRlCWRhdGFMZW49MzsKCXUxQnl0ZQlidWZbNV0gPSB7MH07CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIHNldCBCVCBMTkEgQ29uc3RyYWluOiAlc1xuIiwgCgkJKGJ0X2xuYV9jb25zX29uPyAiT04hISI6Ik9GRiEhIikpKTsKCglidWZbMF0gPSBkYXRhTGVuOwoJYnVmWzFdID0gMHgyOwkJLy8gT1BfQ29kZQoJYnVmWzJdID0gMHgxOwkJLy8gT1BfQ29kZV9MZW5ndGgKCWlmKGJ0X2xuYV9jb25zX29uKQoJCWJ1ZlszXSA9IDB4MTsJLy8gT1BfQ29kZV9Db250ZW50CgllbHNlCgkJYnVmWzNdID0gMHgwOwoJCQoJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfQ1RSTF9CVF9DT0VYLCAoUFZPSUQpJmJ1ZlswXSk7CQp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9TZXRCdExuYUNvbnN0cmFpbigKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAlCT09MRUFOCQkJYnRfbG5hX2NvbnNfb24KCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyBCVCBDb25zdHJhaW4gPSAlc1xuIiwgIAoJCShmb3JjZV9leGVjPyAiZm9yY2UiOiIiKSwgKChidF9sbmFfY29uc19vbik/ICJPTiI6Ik9GRiIpKSk7Cgljb2V4X2RtLT5iQ3VyQnRMbmFDb25zdHJhaW4gPSBidF9sbmFfY29uc19vbjsKCglpZighZm9yY2VfZXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlQnRMbmFDb25zdHJhaW49JWQsIGJDdXJCdExuYUNvbnN0cmFpbj0lZFxuIiwgCgkJCWNvZXhfZG0tPmJQcmVCdExuYUNvbnN0cmFpbiwgY29leF9kbS0+YkN1ckJ0TG5hQ29uc3RyYWluKSk7CgoJCWlmKGNvZXhfZG0tPmJQcmVCdExuYUNvbnN0cmFpbiA9PSBjb2V4X2RtLT5iQ3VyQnRMbmFDb25zdHJhaW4pIAoJCQlyZXR1cm47Cgl9CgloYWxidGM4ODEyYTFhbnRfU2V0RndCdExuYUNvbnN0cmFpbihidGNvZXhpc3QsIGNvZXhfZG0tPmJDdXJCdExuYUNvbnN0cmFpbik7CgoJY29leF9kbS0+YlByZUJ0TG5hQ29uc3RyYWluID0gY29leF9kbS0+YkN1ckJ0TG5hQ29uc3RyYWluOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9TZXRGd0J0UHNkTW9kZSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCXUxQnl0ZQkJCWJ0X3BzZF9tb2RlCgkpCnsKCXUxQnl0ZQlkYXRhTGVuPTM7Cgl1MUJ5dGUJYnVmWzVdID0gezB9OwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBzZXQgQlQgUFNEIG1vZGU9MHgleFxuIiwgCgkJYnRfcHNkX21vZGUpKTsKCglidWZbMF0gPSBkYXRhTGVuOwoJYnVmWzFdID0gMHg0OwkJCS8vIE9QX0NvZGUKCWJ1ZlsyXSA9IDB4MTsJCQkvLyBPUF9Db2RlX0xlbmd0aAoJYnVmWzNdID0gYnRfcHNkX21vZGU7CS8vIE9QX0NvZGVfQ29udGVudAoJCQoJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfQ1RSTF9CVF9DT0VYLCAoUFZPSUQpJmJ1ZlswXSk7CQp9CgoKdm9pZApoYWxidGM4ODEyYTFhbnRfU2V0QnRQc2RNb2RlKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKCSAJQk9PTEVBTgkJCWZvcmNlX2V4ZWMsCgkgCXUxQnl0ZQkJCWJ0X3BzZF9tb2RlCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgQlQgUFNEIG1vZGUgPSAweCV4XG4iLCAgCgkJKGZvcmNlX2V4ZWM/ICJmb3JjZSI6IiIpLCBidF9wc2RfbW9kZSkpOwoJY29leF9kbS0+YkN1ckJ0UHNkTW9kZSA9IGJ0X3BzZF9tb2RlOwoKCWlmKCFmb3JjZV9leGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVCdFBzZE1vZGU9MHgleCwgYkN1ckJ0UHNkTW9kZT0weCV4XG4iLCAKCQkJY29leF9kbS0+YlByZUJ0UHNkTW9kZSwgY29leF9kbS0+YkN1ckJ0UHNkTW9kZSkpOwoKCQlpZihjb2V4X2RtLT5iUHJlQnRQc2RNb2RlID09IGNvZXhfZG0tPmJDdXJCdFBzZE1vZGUpIAoJCQlyZXR1cm47Cgl9CgloYWxidGM4ODEyYTFhbnRfU2V0RndCdFBzZE1vZGUoYnRjb2V4aXN0LCBjb2V4X2RtLT5iQ3VyQnRQc2RNb2RlKTsKCgljb2V4X2RtLT5iUHJlQnRQc2RNb2RlID0gY29leF9kbS0+YkN1ckJ0UHNkTW9kZTsKfQoKCnZvaWQKaGFsYnRjODgxMmExYW50X1NldEJ0QXV0b1JlcG9ydCgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQllbmFibGVfYXV0b19yZXBvcnQKCSkKewojaWYgMAoJdTFCeXRlCQkJaDJjX3BhcmFtZXRlclsxXSA9ezB9OwoJCgloMmNfcGFyYW1ldGVyWzBdID0gMDsKCglpZihlbmFibGVfYXV0b19yZXBvcnQpCgl7CgkJaDJjX3BhcmFtZXRlclswXSB8PSBCSVQwOwoJfQoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBCVCBGVyBhdXRvIHJlcG9ydCA6ICVzLCBGVyB3cml0ZSAweDY4PTB4JXhcbiIsIAoJCShlbmFibGVfYXV0b19yZXBvcnQ/ICJFbmFibGVkISEiOiJEaXNhYmxlZCEhIiksIGgyY19wYXJhbWV0ZXJbMF0pKTsKCglidGNvZXhpc3QtPmJ0Y19maWxsX2gyYyhidGNvZXhpc3QsIDB4NjgsIDEsIGgyY19wYXJhbWV0ZXIpOwkKI2Vsc2UKCiNlbmRpZgp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9CdEF1dG9SZXBvcnQoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAlCT09MRUFOCQkJZm9yY2VfZXhlYywKCSAJQk9PTEVBTgkJCWVuYWJsZV9hdXRvX3JlcG9ydAoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIEJUIEF1dG8gcmVwb3J0ID0gJXNcbiIsICAKCQkoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksICgoZW5hYmxlX2F1dG9fcmVwb3J0KT8gIkVuYWJsZWQiOiJEaXNhYmxlZCIpKSk7Cgljb2V4X2RtLT5jdXJfYnRfYXV0b19yZXBvcnQgPSBlbmFibGVfYXV0b19yZXBvcnQ7CgoJaWYoIWZvcmNlX2V4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlX2J0X2F1dG9fcmVwb3J0PSVkLCBjdXJfYnRfYXV0b19yZXBvcnQ9JWRcbiIsIAoJCQljb2V4X2RtLT5wcmVfYnRfYXV0b19yZXBvcnQsIGNvZXhfZG0tPmN1cl9idF9hdXRvX3JlcG9ydCkpOwoKCQlpZihjb2V4X2RtLT5wcmVfYnRfYXV0b19yZXBvcnQgPT0gY29leF9kbS0+Y3VyX2J0X2F1dG9fcmVwb3J0KSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODgxMmExYW50X1NldEJ0QXV0b1JlcG9ydChidGNvZXhpc3QsIGNvZXhfZG0tPmN1cl9idF9hdXRvX3JlcG9ydCk7CgoJY29leF9kbS0+cHJlX2J0X2F1dG9fcmVwb3J0ID0gY29leF9kbS0+Y3VyX2J0X2F1dG9fcmVwb3J0Owp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKCSAJQk9PTEVBTgkJCWZvcmNlX2V4ZWMsCgkgCXUxQnl0ZQkJCWZ3X2RhY19zd2luZ19sdmwKCSkKewoJcmV0dXJuOwoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyBzZXQgRlcgRGFjIFN3aW5nIGxldmVsID0gJWRcbiIsICAKCQkoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksIGZ3X2RhY19zd2luZ19sdmwpKTsKCWNvZXhfZG0tPmN1cl9md19kYWNfc3dpbmdfbHZsID0gZndfZGFjX3N3aW5nX2x2bDsKCglpZighZm9yY2VfZXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBwcmVfZndfZGFjX3N3aW5nX2x2bD0lZCwgY3VyX2Z3X2RhY19zd2luZ19sdmw9JWRcbiIsIAoJCQljb2V4X2RtLT5wcmVfZndfZGFjX3N3aW5nX2x2bCwgY29leF9kbS0+Y3VyX2Z3X2RhY19zd2luZ19sdmwpKTsKCgkJaWYoY29leF9kbS0+cHJlX2Z3X2RhY19zd2luZ19sdmwgPT0gY29leF9kbS0+Y3VyX2Z3X2RhY19zd2luZ19sdmwpIAoJCQlyZXR1cm47Cgl9CgoJaGFsYnRjODgxMmExYW50X1NldEZ3RGFjU3dpbmdMZXZlbChidGNvZXhpc3QsIGNvZXhfZG0tPmN1cl9md19kYWNfc3dpbmdfbHZsKTsKCgljb2V4X2RtLT5wcmVfZndfZGFjX3N3aW5nX2x2bCA9IGNvZXhfZG0tPmN1cl9md19kYWNfc3dpbmdfbHZsOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9TZXRTd1JmUnhMcGZDb3JuZXIoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAlCT09MRUFOCQkJcnhfcmZfc2hyaW5rX29uCgkpCnsKCWlmKHJ4X3JmX3Nocmlua19vbikKCXsKCQkvL1NocmluayBSRiBSeCBMUEYgY29ybmVyCgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFNocmluayBSRiBSeCBMUEYgY29ybmVyISFcbiIpKTsKCQlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4MWUsIDB4ZmZmZmYsIDB4ZjBmZjcpOwoJfQoJZWxzZQoJewoJCS8vUmVzdW1lIFJGIFJ4IExQRiBjb3JuZXIKCQkvLyBBZnRlciBpbml0aWFsaXplZCwgd2UgY2FuIHVzZSBjb2V4X2RtLT5idF9yZjB4MWVfYmFja3VwCgkJaWYoYnRjb2V4aXN0LT5iSW5pdGlsaXplZCkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBSZXN1bWUgUkYgUnggTFBGIGNvcm5lciEhXG4iKSk7CgkJCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgxZSwgMHhmZmZmZiwgY29leF9kbS0+YnRfcmYweDFlX2JhY2t1cCk7CgkJfQoJfQp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9SZlNocmluaygKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAlCT09MRUFOCQkJcnhfcmZfc2hyaW5rX29uCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgdHVybiBSeCBSRiBTaHJpbmsgPSAlc1xuIiwgIAoJCShmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwgKChyeF9yZl9zaHJpbmtfb24pPyAiT04iOiJPRkYiKSkpOwoJY29leF9kbS0+Y3VyX3JmX3J4X2xwZl9zaHJpbmsgPSByeF9yZl9zaHJpbmtfb247CgoJaWYoIWZvcmNlX2V4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlX3JmX3J4X2xwZl9zaHJpbms9JWQsIGN1cl9yZl9yeF9scGZfc2hyaW5rPSVkXG4iLCAKCQkJY29leF9kbS0+cHJlX3JmX3J4X2xwZl9zaHJpbmssIGNvZXhfZG0tPmN1cl9yZl9yeF9scGZfc2hyaW5rKSk7CgoJCWlmKGNvZXhfZG0tPnByZV9yZl9yeF9scGZfc2hyaW5rID09IGNvZXhfZG0tPmN1cl9yZl9yeF9scGZfc2hyaW5rKSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODgxMmExYW50X1NldFN3UmZSeExwZkNvcm5lcihidGNvZXhpc3QsIGNvZXhfZG0tPmN1cl9yZl9yeF9scGZfc2hyaW5rKTsKCgljb2V4X2RtLT5wcmVfcmZfcnhfbHBmX3NocmluayA9IGNvZXhfZG0tPmN1cl9yZl9yeF9scGZfc2hyaW5rOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9TZXRTd1BlbmFsdHlUeFJhdGVBZGFwdGl2ZSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlsb3dfcGVuYWx0eV9yYQoJKQp7Cgl1MUJ5dGUJdTFfdG1wOwoKCXUxX3RtcCA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDRmZCk7Cgl1MV90bXAgfD0gQklUMDsKCWlmKGxvd19wZW5hbHR5X3JhKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBUeCByYXRlIGFkYXB0aXZlLCBzZXQgbG93IHBlbmFsdHkhIVxuIikpOwoJCXUxX3RtcCAmPSB+QklUMjsKCX0KCWVsc2UKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgVHggcmF0ZSBhZGFwdGl2ZSwgc2V0IG5vcm1hbCEhXG4iKSk7CgkJdTFfdG1wIHw9IEJJVDI7Cgl9CgoJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDRmZCwgdTFfdG1wKTsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfTG93UGVuYWx0eVJhKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKCSAJQk9PTEVBTgkJCWZvcmNlX2V4ZWMsCgkgCUJPT0xFQU4JCQlsb3dfcGVuYWx0eV9yYQoJKQp7CglyZXR1cm47CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHR1cm4gTG93UGVuYWx0eVJBID0gJXNcbiIsICAKCQkoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksICgobG93X3BlbmFsdHlfcmEpPyAiT04iOiJPRkYiKSkpOwoJY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhID0gbG93X3BlbmFsdHlfcmE7CgoJaWYoIWZvcmNlX2V4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlX2xvd19wZW5hbHR5X3JhPSVkLCBjdXJfbG93X3BlbmFsdHlfcmE9JWRcbiIsIAoJCQljb2V4X2RtLT5wcmVfbG93X3BlbmFsdHlfcmEsIGNvZXhfZG0tPmN1cl9sb3dfcGVuYWx0eV9yYSkpOwoKCQlpZihjb2V4X2RtLT5wcmVfbG93X3BlbmFsdHlfcmEgPT0gY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhKSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODgxMmExYW50X1NldFN3UGVuYWx0eVR4UmF0ZUFkYXB0aXZlKGJ0Y29leGlzdCwgY29leF9kbS0+Y3VyX2xvd19wZW5hbHR5X3JhKTsKCgljb2V4X2RtLT5wcmVfbG93X3BlbmFsdHlfcmEgPSBjb2V4X2RtLT5jdXJfbG93X3BlbmFsdHlfcmE7Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X1NldERhY1N3aW5nUmVnKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKCSAJdTRCeXRlCQkJbGV2ZWwKCSkKewoJdTFCeXRlCXZhbD0odTFCeXRlKWxldmVsOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBXcml0ZSBTd0RhY1N3aW5nID0gMHgleFxuIiwgbGV2ZWwpKTsKCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2soYnRjb2V4aXN0LCAweGM1YiwgMHgzZSwgdmFsKTsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfU2V0U3dGdWxsVGltZURhY1N3aW5nKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKCSAJQk9PTEVBTgkJCXN3X2RhY19zd2luZ19vbiwKCSAJdTRCeXRlCQkJc3dfZGFjX3N3aW5nX2x2bAoJKQp7CglpZihzd19kYWNfc3dpbmdfb24pCgl7CgkJaGFsYnRjODgxMmExYW50X1NldERhY1N3aW5nUmVnKGJ0Y29leGlzdCwgc3dfZGFjX3N3aW5nX2x2bCk7Cgl9CgllbHNlCgl7CgkJaGFsYnRjODgxMmExYW50X1NldERhY1N3aW5nUmVnKGJ0Y29leGlzdCwgMHgxOCk7Cgl9Cn0KCgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9EYWNTd2luZygKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAlCT09MRUFOCQkJZGFjX3N3aW5nX29uLAoJIAl1NEJ5dGUJCQlkYWNfc3dpbmdfbHZsCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgdHVybiBEYWNTd2luZz0lcywgZGFjX3N3aW5nX2x2bD0weCV4XG4iLCAgCgkJKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGRhY19zd2luZ19vbik/ICJPTiI6Ik9GRiIpLCBkYWNfc3dpbmdfbHZsKSk7Cgljb2V4X2RtLT5jdXJfZGFjX3N3aW5nX29uID0gZGFjX3N3aW5nX29uOwoJY29leF9kbS0+Y3VyX2RhY19zd2luZ19sdmwgPSBkYWNfc3dpbmdfbHZsOwoKCWlmKCFmb3JjZV9leGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIHByZV9kYWNfc3dpbmdfb249JWQsIHByZV9kYWNfc3dpbmdfbHZsPTB4JXgsIGN1cl9kYWNfc3dpbmdfb249JWQsIGN1cl9kYWNfc3dpbmdfbHZsPTB4JXhcbiIsIAoJCQljb2V4X2RtLT5wcmVfZGFjX3N3aW5nX29uLCBjb2V4X2RtLT5wcmVfZGFjX3N3aW5nX2x2bCwKCQkJY29leF9kbS0+Y3VyX2RhY19zd2luZ19vbiwgY29leF9kbS0+Y3VyX2RhY19zd2luZ19sdmwpKTsKCgkJaWYoIChjb2V4X2RtLT5wcmVfZGFjX3N3aW5nX29uID09IGNvZXhfZG0tPmN1cl9kYWNfc3dpbmdfb24pICYmCgkJCShjb2V4X2RtLT5wcmVfZGFjX3N3aW5nX2x2bCA9PSBjb2V4X2RtLT5jdXJfZGFjX3N3aW5nX2x2bCkgKQoJCQlyZXR1cm47Cgl9CglkZWxheV9tcygzMCk7CgloYWxidGM4ODEyYTFhbnRfU2V0U3dGdWxsVGltZURhY1N3aW5nKGJ0Y29leGlzdCwgZGFjX3N3aW5nX29uLCBkYWNfc3dpbmdfbHZsKTsKCgljb2V4X2RtLT5wcmVfZGFjX3N3aW5nX29uID0gY29leF9kbS0+Y3VyX2RhY19zd2luZ19vbjsKCWNvZXhfZG0tPnByZV9kYWNfc3dpbmdfbHZsID0gY29leF9kbS0+Y3VyX2RhY19zd2luZ19sdmw7Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X1NldEFkY0JhY2tPZmYoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAlCT09MRUFOCQkJYWRjX2JhY2tfb2ZmCgkpCnsKCWlmKGFkY19iYWNrX29mZikKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgQkIgQmFja09mZiBMZXZlbCBPbiFcbiIpKTsKCQlidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKGJ0Y29leGlzdCwgMHg4ZGIsIDB4NjAsIDB4Myk7Cgl9CgllbHNlCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIEJCIEJhY2tPZmYgTGV2ZWwgT2ZmIVxuIikpOwoJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2soYnRjb2V4aXN0LCAweDhkYiwgMHg2MCwgMHgxKTsKCX0KfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfQWRjQmFja09mZigKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAlCT09MRUFOCQkJYWRjX2JhY2tfb2ZmCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgdHVybiBBZGNCYWNrT2ZmID0gJXNcbiIsICAKCQkoZm9yY2VfZXhlYz8gImZvcmNlIHRvIjoiIiksICgoYWRjX2JhY2tfb2ZmKT8gIk9OIjoiT0ZGIikpKTsKCWNvZXhfZG0tPmN1cl9hZGNfYmFja19vZmYgPSBhZGNfYmFja19vZmY7CgoJaWYoIWZvcmNlX2V4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlX2FkY19iYWNrX29mZj0lZCwgY3VyX2FkY19iYWNrX29mZj0lZFxuIiwgCgkJCWNvZXhfZG0tPnByZV9hZGNfYmFja19vZmYsIGNvZXhfZG0tPmN1cl9hZGNfYmFja19vZmYpKTsKCgkJaWYoY29leF9kbS0+cHJlX2FkY19iYWNrX29mZiA9PSBjb2V4X2RtLT5jdXJfYWRjX2JhY2tfb2ZmKSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODgxMmExYW50X1NldEFkY0JhY2tPZmYoYnRjb2V4aXN0LCBjb2V4X2RtLT5jdXJfYWRjX2JhY2tfb2ZmKTsKCgljb2V4X2RtLT5wcmVfYWRjX2JhY2tfb2ZmID0gY29leF9kbS0+Y3VyX2FkY19iYWNrX29mZjsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfU2V0QWdjVGFibGUoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAlCT09MRUFOCQkJYWdjX3RhYmxlX2VuCgkpCnsKCXUxQnl0ZQkJcnNzaV9hZGp1c3RfdmFsPTA7CgkKCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHhlZiwgMHhmZmZmZiwgMHgwMjAwMCk7CglpZihhZ2NfdGFibGVfZW4pCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIEFnYyBUYWJsZSBPbiFcbiIpKTsKCQlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4M2IsIDB4ZmZmZmYsIDB4M2ZhNTgpOwoJCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgzYiwgMHhmZmZmZiwgMHgzN2E1OCk7CgkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDNiLCAweGZmZmZmLCAweDJmYTU4KTsKCQlyc3NpX2FkanVzdF92YWwgPSA4OwoJfQoJZWxzZQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBBZ2MgVGFibGUgT2ZmIVxuIikpOwoJCWJ0Y29leGlzdC0+YnRjX3NldF9yZl9yZWcoYnRjb2V4aXN0LCBCVENfUkZfQSwgMHgzYiwgMHhmZmZmZiwgMHgzOTI1OCk7CgkJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDNiLCAweGZmZmZmLCAweDMxMjU4KTsKCQlidGNvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKGJ0Y29leGlzdCwgQlRDX1JGX0EsIDB4M2IsIDB4ZmZmZmYsIDB4MjkyNTgpOwoJfQoJYnRjb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweGVmLCAweGZmZmZmLCAweDApOwoKCS8vIHNldCByc3NpX2FkanVzdF92YWwgZm9yIHdpZmkgbW9kdWxlLgoJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9VMV9SU1NJX0FESl9WQUxfRk9SX0FHQ19UQUJMRV9PTiwgJnJzc2lfYWRqdXN0X3ZhbCk7Cn0KCgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9BZ2NUYWJsZSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAlCT09MRUFOCQkJYWdjX3RhYmxlX2VuCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgJXMgQWdjIFRhYmxlXG4iLCAgCgkJKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGFnY190YWJsZV9lbik/ICJFbmFibGUiOiJEaXNhYmxlIikpKTsKCWNvZXhfZG0tPmN1cl9hZ2NfdGFibGVfZW4gPSBhZ2NfdGFibGVfZW47CgoJaWYoIWZvcmNlX2V4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlX2FnY190YWJsZV9lbj0lZCwgY3VyX2FnY190YWJsZV9lbj0lZFxuIiwgCgkJCWNvZXhfZG0tPnByZV9hZ2NfdGFibGVfZW4sIGNvZXhfZG0tPmN1cl9hZ2NfdGFibGVfZW4pKTsKCgkJaWYoY29leF9kbS0+cHJlX2FnY190YWJsZV9lbiA9PSBjb2V4X2RtLT5jdXJfYWdjX3RhYmxlX2VuKSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODgxMmExYW50X1NldEFnY1RhYmxlKGJ0Y29leGlzdCwgYWdjX3RhYmxlX2VuKTsKCgljb2V4X2RtLT5wcmVfYWdjX3RhYmxlX2VuID0gY29leF9kbS0+Y3VyX2FnY190YWJsZV9lbjsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfU2V0Q29leFRhYmxlKAoJIAlQQlRDX0NPRVhJU1QJYnRjb2V4aXN0LAoJIAl1NEJ5dGUJCXZhbDB4NmMwLAoJIAl1NEJ5dGUJCXZhbDB4NmM0LAoJIAl1NEJ5dGUJCXZhbDB4NmM4LAoJIAl1MUJ5dGUJCXZhbDB4NmNjCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmMwPTB4JXhcbiIsIHZhbDB4NmMwKSk7CglidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4NmMwLCB2YWwweDZjMCk7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIHNldCBjb2V4IHRhYmxlLCBzZXQgMHg2YzQ9MHgleFxuIiwgdmFsMHg2YzQpKTsKCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHg2YzQsIHZhbDB4NmM0KTsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgc2V0IGNvZXggdGFibGUsIHNldCAweDZjOD0weCV4XG4iLCB2YWwweDZjOCkpOwoJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweDZjOCwgdmFsMHg2YzgpOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmNjPTB4JXhcbiIsIHZhbDB4NmNjKSk7CglidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NmNjLCB2YWwweDZjYyk7Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAl1NEJ5dGUJCQl2YWwweDZjMCwKCSAJdTRCeXRlCQkJdmFsMHg2YzQsCgkgCXU0Qnl0ZQkJCXZhbDB4NmM4LAoJIAl1MUJ5dGUJCQl2YWwweDZjYwoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHdyaXRlIENvZXggVGFibGUgMHg2YzA9MHgleCwgMHg2YzQ9MHgleCwgMHg2Yzg9MHgleCwgMHg2Y2M9MHgleFxuIiwgCgkJKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCB2YWwweDZjMCwgdmFsMHg2YzQsIHZhbDB4NmM4LCB2YWwweDZjYykpOwoJY29leF9kbS0+Y3VyX3ZhbDB4NmMwID0gdmFsMHg2YzA7Cgljb2V4X2RtLT5jdXJfdmFsMHg2YzQgPSB2YWwweDZjNDsKCWNvZXhfZG0tPmN1cl92YWwweDZjOCA9IHZhbDB4NmM4OwoJY29leF9kbS0+Y3VyX3ZhbDB4NmNjID0gdmFsMHg2Y2M7CgoJaWYoIWZvcmNlX2V4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlX3ZhbDB4NmMwPTB4JXgsIHByZV92YWwweDZjND0weCV4LCBwcmVfdmFsMHg2Yzg9MHgleCwgcHJlX3ZhbDB4NmNjPTB4JXggISFcbiIsIAoJCQljb2V4X2RtLT5wcmVfdmFsMHg2YzAsIGNvZXhfZG0tPnByZV92YWwweDZjNCwgY29leF9kbS0+cHJlX3ZhbDB4NmM4LCBjb2V4X2RtLT5wcmVfdmFsMHg2Y2MpKTsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBjdXJfdmFsMHg2YzA9MHgleCwgY3VyX3ZhbDB4NmM0PTB4JXgsIGN1cl92YWwweDZjOD0weCV4LCBjdXJfdmFsMHg2Y2M9MHgleCAhIVxuIiwgCgkJCWNvZXhfZG0tPmN1cl92YWwweDZjMCwgY29leF9kbS0+Y3VyX3ZhbDB4NmM0LCBjb2V4X2RtLT5jdXJfdmFsMHg2YzgsIGNvZXhfZG0tPmN1cl92YWwweDZjYykpOwoJCgkJaWYoIChjb2V4X2RtLT5wcmVfdmFsMHg2YzAgPT0gY29leF9kbS0+Y3VyX3ZhbDB4NmMwKSAmJgoJCQkoY29leF9kbS0+cHJlX3ZhbDB4NmM0ID09IGNvZXhfZG0tPmN1cl92YWwweDZjNCkgJiYKCQkJKGNvZXhfZG0tPnByZV92YWwweDZjOCA9PSBjb2V4X2RtLT5jdXJfdmFsMHg2YzgpICYmCgkJCShjb2V4X2RtLT5wcmVfdmFsMHg2Y2MgPT0gY29leF9kbS0+Y3VyX3ZhbDB4NmNjKSApCgkJCXJldHVybjsKCX0KCWhhbGJ0Yzg4MTJhMWFudF9TZXRDb2V4VGFibGUoYnRjb2V4aXN0LCB2YWwweDZjMCwgdmFsMHg2YzQsIHZhbDB4NmM4LCB2YWwweDZjYyk7CgoJY29leF9kbS0+cHJlX3ZhbDB4NmMwID0gY29leF9kbS0+Y3VyX3ZhbDB4NmMwOwoJY29leF9kbS0+cHJlX3ZhbDB4NmM0ID0gY29leF9kbS0+Y3VyX3ZhbDB4NmM0OwoJY29leF9kbS0+cHJlX3ZhbDB4NmM4ID0gY29leF9kbS0+Y3VyX3ZhbDB4NmM4OwoJY29leF9kbS0+cHJlX3ZhbDB4NmNjID0gY29leF9kbS0+Y3VyX3ZhbDB4NmNjOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9TZXRGd0lnbm9yZVdsYW5BY3QoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAlCT09MRUFOCQkJZW5hYmxlCgkpCnsKCXUxQnl0ZQlkYXRhTGVuPTM7Cgl1MUJ5dGUJYnVmWzVdID0gezB9OwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCAlcyBCVCBJZ25vcmUgV2xhbl9BY3RcbiIsCgkJKGVuYWJsZT8gIkVuYWJsZSI6IkRpc2FibGUiKSkpOwoKCWJ1ZlswXSA9IGRhdGFMZW47CglidWZbMV0gPSAweDE7CQkJLy8gT1BfQ29kZQoJYnVmWzJdID0gMHgxOwkJCS8vIE9QX0NvZGVfTGVuZ3RoCglpZihlbmFibGUpCgkJYnVmWzNdID0gMHgxOyAJCS8vIE9QX0NvZGVfQ29udGVudAoJZWxzZQoJCWJ1ZlszXSA9IDB4MDsKCQkKCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0NUUkxfQlRfQ09FWCwgKFBWT0lEKSZidWZbMF0pOwkKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfSWdub3JlV2xhbkFjdCgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAlCT09MRUFOCQkJZW5hYmxlCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgdHVybiBJZ25vcmUgV2xhbkFjdCAlc1xuIiwgCgkJKGZvcmNlX2V4ZWM/ICJmb3JjZSB0byI6IiIpLCAoZW5hYmxlPyAiT04iOiJPRkYiKSkpOwoJY29leF9kbS0+Y3VyX2lnbm9yZV93bGFuX2FjdCA9IGVuYWJsZTsKCglpZighZm9yY2VfZXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBwcmVfaWdub3JlX3dsYW5fYWN0ID0gJWQsIGN1cl9pZ25vcmVfd2xhbl9hY3QgPSAlZCEhXG4iLCAKCQkJY29leF9kbS0+cHJlX2lnbm9yZV93bGFuX2FjdCwgY29leF9kbS0+Y3VyX2lnbm9yZV93bGFuX2FjdCkpOwoKCQlpZihjb2V4X2RtLT5wcmVfaWdub3JlX3dsYW5fYWN0ID09IGNvZXhfZG0tPmN1cl9pZ25vcmVfd2xhbl9hY3QpCgkJCXJldHVybjsKCX0KCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd0lnbm9yZVdsYW5BY3QoYnRjb2V4aXN0LCBlbmFibGUpOwoKCWNvZXhfZG0tPnByZV9pZ25vcmVfd2xhbl9hY3QgPSBjb2V4X2RtLT5jdXJfaWdub3JlX3dsYW5fYWN0Owp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCXUxQnl0ZQkJCWJ5dGUxLAoJIAl1MUJ5dGUJCQlieXRlMiwKCSAJdTFCeXRlCQkJYnl0ZTMsCgkgCXUxQnl0ZQkJCWJ5dGU0LAoJIAl1MUJ5dGUJCQlieXRlNQoJKQp7Cgl1MUJ5dGUJCQloMmNfcGFyYW1ldGVyWzVdID17MH07CgoJaDJjX3BhcmFtZXRlclswXSA9IGJ5dGUxOwkKCWgyY19wYXJhbWV0ZXJbMV0gPSBieXRlMjsJCgloMmNfcGFyYW1ldGVyWzJdID0gYnl0ZTM7CgloMmNfcGFyYW1ldGVyWzNdID0gYnl0ZTQ7CgloMmNfcGFyYW1ldGVyWzRdID0gYnl0ZTU7CgoJY29leF9kbS0+cHNfdGRtYV9wYXJhWzBdID0gYnl0ZTE7Cgljb2V4X2RtLT5wc190ZG1hX3BhcmFbMV0gPSBieXRlMjsKCWNvZXhfZG0tPnBzX3RkbWFfcGFyYVsyXSA9IGJ5dGUzOwoJY29leF9kbS0+cHNfdGRtYV9wYXJhWzNdID0gYnl0ZTQ7Cgljb2V4X2RtLT5wc190ZG1hX3BhcmFbNF0gPSBieXRlNTsKCQoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIEZXIHdyaXRlIDB4NjAoNWJ5dGVzKT0weCV4JTA4eFxuIiwgCgkJaDJjX3BhcmFtZXRlclswXSwgCgkJaDJjX3BhcmFtZXRlclsxXTw8MjR8aDJjX3BhcmFtZXRlclsyXTw8MTZ8aDJjX3BhcmFtZXRlclszXTw8OHxoMmNfcGFyYW1ldGVyWzRdKSk7CgoJYnRjb2V4aXN0LT5idGNfZmlsbF9oMmMoYnRjb2V4aXN0LCAweDYwLCA1LCBoMmNfcGFyYW1ldGVyKTsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfU2V0THBzUnB3bSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCXUxQnl0ZQkJCWxwc192YWwsCgkgCXUxQnl0ZQkJCXJwd21fdmFsCgkpCnsKCXUxQnl0ZQlscHM9bHBzX3ZhbDsKCXUxQnl0ZQlycHdtPXJwd21fdmFsOwoJCglidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX1UxXzFBTlRfTFBTLCAmbHBzKTsKCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfVTFfMUFOVF9SUFdNLCAmcnB3bSk7CgkKCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0lOQ19GT1JDRV9FWEVDX1BXUl9DTURfQ05ULCBOVUxMKTsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfTHBzUnB3bSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQlmb3JjZV9leGVjLAoJIAl1MUJ5dGUJCQlscHNfdmFsLAoJIAl1MUJ5dGUJCQlycHdtX3ZhbAoJKQp7CglCT09MRUFOCWJGb3JjZUV4ZWNQd3JDbWQ9ZmFsc2U7CgkKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgc2V0IGxwcy9ycHdtPTB4JXgvMHgleCBcbiIsIAoJCShmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwgbHBzX3ZhbCwgcnB3bV92YWwpKTsKCWNvZXhfZG0tPmN1cl9scHMgPSBscHNfdmFsOwoJY29leF9kbS0+Y3VyX3Jwd20gPSBycHdtX3ZhbDsKCglpZighZm9yY2VfZXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBwcmVfbHBzL2N1cl9scHM9MHgleC8weCV4LCBwcmVfcnB3bS9jdXJfcnB3bT0weCV4LzB4JXghIVxuIiwgCgkJCWNvZXhfZG0tPnByZV9scHMsIGNvZXhfZG0tPmN1cl9scHMsIGNvZXhfZG0tPnByZV9ycHdtLCBjb2V4X2RtLT5jdXJfcnB3bSkpOwoKCQlpZiggKGNvZXhfZG0tPnByZV9scHMgPT0gY29leF9kbS0+Y3VyX2xwcykgJiYKCQkJKGNvZXhfZG0tPnByZV9ycHdtID09IGNvZXhfZG0tPmN1cl9ycHdtKSApCgkJewoJCQlyZXR1cm47CgkJfQoJfQoJaGFsYnRjODgxMmExYW50X1NldExwc1Jwd20oYnRjb2V4aXN0LCBscHNfdmFsLCBycHdtX3ZhbCk7CgoJY29leF9kbS0+cHJlX2xwcyA9IGNvZXhfZG0tPmN1cl9scHM7Cgljb2V4X2RtLT5wcmVfcnB3bSA9IGNvZXhfZG0tPmN1cl9ycHdtOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTEoCgkgCVBCVENfQ09FWElTVAlidGNvZXhpc3QsCQoJIAlCT09MRUFOCQlzaHJpbmtfcnhfbHBmLAoJIAlCT09MRUFOIAlsb3dfcGVuYWx0eV9yYSwKCSAJQk9PTEVBTgkJbGltaXRlZF9kaWcsIAoJIAlCT09MRUFOCQlidF9sbmFfY29uc3RyYWluCgkpIAp7CgkvL2hhbGJ0Yzg4MTJhMWFudF9SZlNocmluayhidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBzaHJpbmtfcnhfbHBmKTsKCS8vaGFsYnRjODgxMmExYW50X0xvd1BlbmFsdHlSYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBsb3dfcGVuYWx0eV9yYSk7CgoJLy9ubyBsaW1pdGVkIERJRwoJLy9oYWxidGM4ODEyYTFhbnRfU2V0QnRMbmFDb25zdHJhaW4oYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgYnRfbG5hX2NvbnN0cmFpbik7Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMigKCSAJUEJUQ19DT0VYSVNUCWJ0Y29leGlzdCwJCgkgCUJPT0xFQU4JCWFnY190YWJsZV9zaGlmdCwKCSAJQk9PTEVBTiAJYWRjX2JhY2tfb2ZmLAoJIAlCT09MRUFOCQlzd19kYWNfc3dpbmcsCgkgCXU0Qnl0ZQkJZGFjX3N3aW5nX2x2bAoJKQp7CgkvL2hhbGJ0Yzg4MTJhMWFudF9BZ2NUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBhZ2NfdGFibGVfc2hpZnQpOwoJLy9oYWxidGM4ODEyYTFhbnRfQWRjQmFja09mZihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBhZGNfYmFja19vZmYpOwoJLy9oYWxidGM4ODEyYTFhbnRfRGFjU3dpbmcoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgc3dfZGFjX3N3aW5nLCBkYWNfc3dpbmdfbHZsKTsKfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfUHNUZG1hKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKCSAJQk9PTEVBTgkJCWZvcmNlX2V4ZWMsCgkgCUJPT0xFQU4JCQl0dXJuX29uLAoJIAl1MUJ5dGUJCQl0eXBlCgkpCnsKCUJPT0xFQU4JCQliVHVybk9uQnlDbnQ9ZmFsc2U7Cgl1MUJ5dGUJCQlwc1RkbWFUeXBlQnlDbnQ9MCwgcnNzaV9hZGp1c3RfdmFsPTA7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyB0dXJuICVzIFBTIFRETUEsIHR5cGU9JWRcbiIsIAoJCShmb3JjZV9leGVjPyAiZm9yY2UgdG8iOiIiKSwgKHR1cm5fb24/ICJPTiI6Ik9GRiIpLCB0eXBlKSk7Cgljb2V4X2RtLT5jdXJfcHNfdGRtYV9vbiA9IHR1cm5fb247Cgljb2V4X2RtLT5jdXJfcHNfdGRtYSA9IHR5cGU7CgoJaWYoIWZvcmNlX2V4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlX3BzX3RkbWFfb24gPSAlZCwgY3VyX3BzX3RkbWFfb24gPSAlZCEhXG4iLCAKCQkJY29leF9kbS0+cHJlX3BzX3RkbWFfb24sIGNvZXhfZG0tPmN1cl9wc190ZG1hX29uKSk7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlX3BzX3RkbWEgPSAlZCwgY3VyX3BzX3RkbWEgPSAlZCEhXG4iLCAKCQkJY29leF9kbS0+cHJlX3BzX3RkbWEsIGNvZXhfZG0tPmN1cl9wc190ZG1hKSk7CgoJCWlmKCAoY29leF9kbS0+cHJlX3BzX3RkbWFfb24gPT0gY29leF9kbS0+Y3VyX3BzX3RkbWFfb24pICYmCgkJCShjb2V4X2RtLT5wcmVfcHNfdGRtYSA9PSBjb2V4X2RtLT5jdXJfcHNfdGRtYSkgKQoJCQlyZXR1cm47Cgl9CglpZih0dXJuX29uKQoJewoJCXN3aXRjaCh0eXBlKQoJCXsKCQkJZGVmYXVsdDoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZDMsIDB4MWEsIDB4MWEsIDB4MCwgMHg1OCk7CgkJCQlicmVhazsKCQkJY2FzZSAxOgoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhkMywgMHgxYSwgMHgxYSwgMHgwLCAweDQ4KTsKCQkJCXJzc2lfYWRqdXN0X3ZhbCA9IDExOwoJCQkJYnJlYWs7CgkJCWNhc2UgMjoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZDMsIDB4MTIsIDB4MTIsIDB4MCwgMHg0OCk7CgkJCQlyc3NpX2FkanVzdF92YWwgPSAxNDsKCQkJCWJyZWFrOwoJCQljYXNlIDM6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDkzLCAweDI1LCAweDMsIDB4MTAsIDB4NDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgNDoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4OTMsIDB4MTUsIDB4MywgMHgxNCwgMHgwKTsKCQkJCXJzc2lfYWRqdXN0X3ZhbCA9IDE3OwoJCQkJYnJlYWs7CgkJCWNhc2UgNToKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4NjEsIDB4MTUsIDB4MywgMHgzMSwgMHgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDY6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDEzLCAweGEsIDB4MywgMHgwLCAweDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgNzoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4MTMsIDB4YywgMHg1LCAweDAsIDB4MCk7CgkJCQlicmVhazsKCQkJY2FzZSA4OgkKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4OTMsIDB4MjUsIDB4MywgMHgxMCwgMHgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDk6CQoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhkMywgMHhhLCAweGEsIDB4MCwgMHg0OCk7CgkJCQlyc3NpX2FkanVzdF92YWwgPSAxODsKCQkJCWJyZWFrOwoJCQljYXNlIDEwOgkKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4MTMsIDB4YSwgMHhhLCAweDAsIDB4NDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMTE6CQoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhkMywgMHg1LCAweDUsIDB4MCwgMHg0OCk7CgkJCQlyc3NpX2FkanVzdF92YWwgPSAyMDsKCQkJCWJyZWFrOwoJCQljYXNlIDEyOgoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhlYiwgMHhhLCAweDMsIDB4MzEsIDB4MTgpOwoJCQkJYnJlYWs7CgoJCQljYXNlIDE1OgoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHgxMywgMHhhLCAweDMsIDB4OCwgMHgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDE2OgoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHg5MywgMHgxNSwgMHgzLCAweDEwLCAweDApOwoJCQkJcnNzaV9hZGp1c3RfdmFsID0gMTg7CgkJCQlicmVhazsKCgkJCWNhc2UgMTg6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDkzLCAweDI1LCAweDMsIDB4MTAsIDB4MCk7CgkJCQlyc3NpX2FkanVzdF92YWwgPSAxNDsKCQkJCWJyZWFrOwkJCQoJCQkJCgkJCWNhc2UgMjA6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDEzLCAweDI1LCAweDI1LCAweDAsIDB4MCk7CgkJCQlicmVhazsKCQkJY2FzZSAyMToKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4OTMsIDB4MjAsIDB4MywgMHgxMCwgMHg0MCk7CgkJCQlicmVhazsKCQkJY2FzZSAyMjoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4MTMsIDB4OCwgMHg4LCAweDAsIDB4NDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMjM6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDI1LCAweDMsIDB4MzEsIDB4MTgpOwoJCQkJcnNzaV9hZGp1c3RfdmFsID0gMjI7CgkJCQlicmVhazsKCQkJY2FzZSAyNDoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4MTUsIDB4MywgMHgzMSwgMHgxOCk7CgkJCQlyc3NpX2FkanVzdF92YWwgPSAyMjsKCQkJCWJyZWFrOwoJCQljYXNlIDI1OgoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHhhLCAweDMsIDB4MzEsIDB4MTgpOwoJCQkJcnNzaV9hZGp1c3RfdmFsID0gMjI7CgkJCQlicmVhazsKCQkJY2FzZSAyNjoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZTMsIDB4YSwgMHgzLCAweDMxLCAweDE4KTsKCQkJCXJzc2lfYWRqdXN0X3ZhbCA9IDIyOwoJCQkJYnJlYWs7CgkJCWNhc2UgMjc6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGUzLCAweDI1LCAweDMsIDB4MzEsIDB4OTgpOwoJCQkJcnNzaV9hZGp1c3RfdmFsID0gMjI7CgkJCQlicmVhazsKCQkJY2FzZSAyODoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4NjksIDB4MjUsIDB4MywgMHgzMSwgMHgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDI5OgoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhhYiwgMHgxYSwgMHgxYSwgMHgxLCAweDgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgMzA6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDkzLCAweDE1LCAweDMsIDB4MTQsIDB4MCk7CgkJCQlicmVhazsKCQkJY2FzZSAzMToKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZDMsIDB4MWEsIDB4MWEsIDAsIDB4NTgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgMzI6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGFiLCAweGEsIDB4MywgMHgzMSwgMHg4OCk7CgkJCQlicmVhazsKCQkJY2FzZSAzMzoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4YTMsIDB4MjUsIDB4MywgMHgzMCwgMHg4OCk7CgkJCQlicmVhazsKCQkJY2FzZSAzNDoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4ZDMsIDB4MWEsIDB4MWEsIDB4MCwgMHg4KTsKCQkJCWJyZWFrOwoJCQljYXNlIDM1OgoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHhlMywgMHgxYSwgMHgxYSwgMHgwLCAweDgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgMzY6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweGQzLCAweDEyLCAweDMsIDB4MTQsIDB4NTgpOwoJCQkJYnJlYWs7CgkJfQoJfQoJZWxzZQoJewoJCS8vIGRpc2FibGUgUFMgdGRtYQoJCXN3aXRjaCh0eXBlKQoJCXsKCQkJY2FzZSA4OgoJCQkJaGFsYnRjODgxMmExYW50X1NldEZ3UHN0ZG1hKGJ0Y29leGlzdCwgMHg4LCAweDAsIDB4MCwgMHgwLCAweDApOwoJCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDkyYywgMHg0KTsKCQkJCWJyZWFrOwoJCQljYXNlIDA6CgkJCWRlZmF1bHQ6CgkJCQloYWxidGM4ODEyYTFhbnRfU2V0RndQc3RkbWEoYnRjb2V4aXN0LCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCk7CgkJCQlkZWxheV9tcyg1KTsKCQkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg5MmMsIDB4MjApOwoJCQkJYnJlYWs7CgkJCWNhc2UgOToKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwKTsKCQkJCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg5MmMsIDB4NCk7CgkJCQlicmVhazsKCQkJY2FzZSAxMDoKCQkJCWhhbGJ0Yzg4MTJhMWFudF9TZXRGd1BzdGRtYShidGNvZXhpc3QsIDB4MCwgMHgwLCAweDAsIDB4OCwgMHgwKTsKCQkJCWRlbGF5X21zKDUpOwoJCQkJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDkyYywgMHgyMCk7CgkJCQlicmVhazsKCQl9Cgl9Cglyc3NpX2FkanVzdF92YWwgPTA7CglidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX1UxX1JTU0lfQURKX1ZBTF9GT1JfMUFOVF9DT0VYX1RZUEUsICZyc3NpX2FkanVzdF92YWwpOwoKCS8vIHVwZGF0ZSBwcmUgc3RhdGUKCWNvZXhfZG0tPnByZV9wc190ZG1hX29uID0gY29leF9kbS0+Y3VyX3BzX3RkbWFfb247Cgljb2V4X2RtLT5wcmVfcHNfdGRtYSA9IGNvZXhfZG0tPmN1cl9wc190ZG1hOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9Db2V4QWxsT2ZmKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7CgkvLyBmdyBhbGwgb2ZmCgloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CgoJLy8gc3cgYWxsIG9mZgoJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMShidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsZmFsc2UpOwoJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgoKCS8vIGh3IGFsbCBvZmYKCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9XaWZpUGFyYUFkanVzdCgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCUJPT0xFQU4JCQllbmFibGUKCSkKewoJaWYoZW5hYmxlKQoJewoJCWhhbGJ0Yzg4MTJhMWFudF9Mb3dQZW5hbHR5UmEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7Cgl9CgllbHNlCgl7CgkJaGFsYnRjODgxMmExYW50X0xvd1BlbmFsdHlSYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7Cgl9Cn0KCkJPT0xFQU4KaGFsYnRjODgxMmExYW50X0lzQ29tbW9uQWN0aW9uKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7CglCT09MRUFOCQkJY29tbW9uPWZhbHNlLCB3aWZpX2Nvbm5lY3RlZD1mYWxzZSwgd2lmaV9idXN5PWZhbHNlOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZ3aWZpX2Nvbm5lY3RlZCk7CglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQlVTWSwgJndpZmlfYnVzeSk7CgoJLy9oYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCglpZighd2lmaV9jb25uZWN0ZWQgJiYgCgkJQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFdpZmkgbm9uIGNvbm5lY3RlZC1pZGxlICsgQlQgbm9uIGNvbm5lY3RlZC1pZGxlISFcbiIpKTsKCQloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOwoJCQogCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20xKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSxmYWxzZSk7CgkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgoJCWNvbW1vbiA9IHRydWU7Cgl9CgllbHNlIGlmKHdpZmlfY29ubmVjdGVkICYmIAoJCShCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEUgPT0gY29leF9kbS0+YnRfc3RhdHVzKSApCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBXaWZpIGNvbm5lY3RlZCArIEJUIG5vbiBjb25uZWN0ZWQtaWRsZSEhXG4iKSk7CgkJaGFsYnRjODgxMmExYW50X0Z3RGFjU3dpbmdMdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CgkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoKICAgICAgCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20xKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSxmYWxzZSk7CgkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgoJCWNvbW1vbiA9IHRydWU7Cgl9CgllbHNlIGlmKCF3aWZpX2Nvbm5lY3RlZCAmJiAKCQkoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gY29leF9kbS0+YnRfc3RhdHVzKSApCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBXaWZpIG5vbiBjb25uZWN0ZWQtaWRsZSArIEJUIGNvbm5lY3RlZC1pZGxlISFcbiIpKTsKCQloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOwoKCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20xKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSxmYWxzZSk7CgkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgoJCWNvbW1vbiA9IHRydWU7Cgl9CgllbHNlIGlmKHdpZmlfY29ubmVjdGVkICYmIAoJCShCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpICkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFdpZmkgY29ubmVjdGVkICsgQlQgY29ubmVjdGVkLWlkbGUhIVxuIikpOwoJCWhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOwoJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CgoJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTEoYnRjb2V4aXN0LHRydWUsdHJ1ZSx0cnVlLHRydWUpOwoJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLDB4MTgpOwoKCQljb21tb24gPSB0cnVlOwoJfQoJZWxzZSBpZighd2lmaV9jb25uZWN0ZWQgJiYgCgkJKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFICE9IGNvZXhfZG0tPmJ0X3N0YXR1cykgKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBub24gY29ubmVjdGVkLWlkbGUgKyBCVCBCdXN5ISFcbiIpKTsKCQloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOwoKCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20xKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSxmYWxzZSk7CgkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgkJCgkJY29tbW9uID0gdHJ1ZTsKCX0KCWVsc2UKCXsKCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20xKGJ0Y29leGlzdCx0cnVlLHRydWUsdHJ1ZSx0cnVlKTsKCQkKCQljb21tb24gPSBmYWxzZTsKCX0KCQoJcmV0dXJuIGNvbW1vbjsKfQoKCnZvaWQKaGFsYnRjODgxMmExYW50X1RkbWFEdXJhdGlvbkFkanVzdEZvckFjbCgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJc3RhdGljIHM0Qnl0ZQkJdXAsZG4sbSxuLHdhaXRfY291bnQ7CglzNEJ5dGUJCQlyZXN1bHQ7ICAgLy8wOiBubyBjaGFuZ2UsICsxOiBpbmNyZWFzZSBXaUZpIGR1cmF0aW9uLCAtMTogZGVjcmVhc2UgV2lGaSBkdXJhdGlvbgoJdTFCeXRlCQkJcmV0cnlfY291bnQ9MCwgYnRfaW5mb19leHQ7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCBoYWxidGM4ODEyYTFhbnRfVGRtYUR1cmF0aW9uQWRqdXN0Rm9yQWNsKClcbiIpKTsKCWlmKGNvZXhfZG0tPnJlc2V0X3RkbWFfYWRqdXN0KQoJewoJCWNvZXhfZG0tPnJlc2V0X3RkbWFfYWRqdXN0ID0gZmFsc2U7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgZmlyc3QgcnVuIFRkbWFEdXJhdGlvbkFkanVzdCgpISFcbiIpKTsKCgkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMjsKCQkvLz09PT09PT09PT09PQoJCXVwID0gMDsKCQlkbiA9IDA7CgkJbSA9IDE7CgkJbj0gMzsKCQlyZXN1bHQgPSAwOwoJCXdhaXRfY291bnQgPSAwOwoJfQoJZWxzZQoJewoJCS8vYWNjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIKCQlyZXRyeV9jb3VudCA9IGNvZXhfc3RhLT5idF9yZXRyeV9jbnQ7CgkJYnRfaW5mb19leHQgPSBjb2V4X3N0YS0+YnRfaW5mb19leHQ7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcmV0cnlfY291bnQgPSAlZFxuIiwgcmV0cnlfY291bnQpKTsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCB1cD0lZCwgZG49JWQsIG09JWQsIG49JWQsIHdhaXRfY291bnQ9JWRcbiIsIAoJCQl1cCwgZG4sIG0sIG4sIHdhaXRfY291bnQpKTsKCQlyZXN1bHQgPSAwOwoJCXdhaXRfY291bnQrKzsgCgkJICAKCQlpZihyZXRyeV9jb3VudCA9PSAwKSAgLy8gbm8gcmV0cnkgaW4gdGhlIGxhc3QgMi1zZWNvbmQgZHVyYXRpb24KCQl7CgkJCXVwKys7CgkJCWRuLS07CgoJCQlpZiAoZG4gPD0gMCkKCQkJCWRuID0gMDsJCQkJIAoKCQkJaWYodXAgPj0gbikJLy8gaWYgs3PE8iBuIK3TMqztIHJldHJ5IGNvdW50rLAwLCCraL3VvGVXaUZpIGR1cmF0aW9uCgkJCXsKCQkJCXdhaXRfY291bnQgPSAwOyAKCQkJCW4gPSAzOwoJCQkJdXAgPSAwOwoJCQkJZG4gPSAwOwoJCQkJcmVzdWx0ID0gMTsgCgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBJbmNyZWFzZSB3aWZpIGR1cmF0aW9uISFcbiIpKTsKCQkJfQoJCX0KCQllbHNlIGlmIChyZXRyeV9jb3VudCA8PSAzKQkvLyA8PTMgcmV0cnkgaW4gdGhlIGxhc3QgMi1zZWNvbmQgZHVyYXRpb24KCQl7CgkJCXVwLS07IAoJCQlkbisrOwoKCQkJaWYgKHVwIDw9IDApCgkJCQl1cCA9IDA7CgoJCQlpZiAoZG4gPT0gMikJLy8gaWYgs3PE8iAyIK3TMqztIHJldHJ5IGNvdW50PCAzLCCraL3Vr7ZXaUZpIGR1cmF0aW9uCgkJCXsKCQkJCWlmICh3YWl0X2NvdW50IDw9IDIpCgkJCQkJbSsrOyAvLyDB16dLpECqvaZiqOKt02xldmVspKSo06ZeCgkJCQllbHNlCgkJCQkJbSA9IDE7CgoJCQkJaWYgKCBtID49IDIwKSAvL20gs8ykaq3IID0gMjAgJyCzzKRqMTIwrO0gcmVjaGVja6xPp1+91b7jIFdpRmkgZHVyYXRpb24uCgkJCQkJbSA9IDIwOwoKCQkJCW4gPSAzKm07CgkJCQl1cCA9IDA7CgkJCQlkbiA9IDA7CgkJCQl3YWl0X2NvdW50ID0gMDsKCQkJCXJlc3VsdCA9IC0xOyAKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIERlY3JlYXNlIHdpZmkgZHVyYXRpb24gZm9yIHJldHJ5Q291bnRlcjwzISFcbiIpKTsKCQkJfQoJCX0KCQllbHNlICAvL3JldHJ5IGNvdW50ID4gMywgpXWtbjGmuCByZXRyeSBjb3VudCA+IDMsIKtovdWvtldpRmkgZHVyYXRpb24KCQl7CgkJCWlmICh3YWl0X2NvdW50ID09IDEpCgkJCQltKys7IC8vIMHXp0ukQKq9pmKo4q3TbGV2ZWykpKjTpl4KCQkJZWxzZQoJCQkJbSA9IDE7CgoJCQlpZiAoIG0gPj0gMjApIC8vbSCzzKRqrcggPSAyMCAnILPMpGoxMjCs7SByZWNoZWNrrE+nX73VvuMgV2lGaSBkdXJhdGlvbi4KCQkJCW0gPSAyMDsKCgkJCW4gPSAzKm07CgkJCXVwID0gMDsKCQkJZG4gPSAwOwoJCQl3YWl0X2NvdW50ID0gMDsgCgkJCXJlc3VsdCA9IC0xOwoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBEZWNyZWFzZSB3aWZpIGR1cmF0aW9uIGZvciByZXRyeUNvdW50ZXI+MyEhXG4iKSk7CgkJfQoKCQlpZihyZXN1bHQgPT0gLTEpCgkJewoJCQlpZiggKEJUX0lORk9fODgxMkFfMUFOVF9BMkRQX0JBU0lDX1JBVEUoYnRfaW5mb19leHQpKSAmJgoJCQkJKChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxKSB8fChjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAyKSkgKQoJCQl7CgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOwoJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDk7CgkJCX0KCQkJZWxzZSBpZihjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAxKQoJCQl7CgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOwoJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDI7CgkJCX0KCQkJZWxzZSBpZihjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSAyKQoJCQl7CgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOwoJCQkJY29leF9kbS0+cHNfdGRtYV9kdV9hZGpfdHlwZSA9IDk7CgkJCX0KCQkJZWxzZSBpZihjb2V4X2RtLT5jdXJfcHNfdGRtYSA9PSA5KQoJCQl7CgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSAxMTsKCQkJfQoJCX0KCQllbHNlIGlmKHJlc3VsdCA9PSAxKQoJCXsKCQkJaWYoIChCVF9JTkZPXzg4MTJBXzFBTlRfQTJEUF9CQVNJQ19SQVRFKGJ0X2luZm9fZXh0KSkgJiYKCQkJCSgoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMSkgfHwoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMikpICkKCQkJewoJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA5KTsKCQkJCWNvZXhfZG0tPnBzX3RkbWFfZHVfYWRqX3R5cGUgPSA5OwoJCQl9CgkJCWVsc2UgaWYoY29leF9kbS0+Y3VyX3BzX3RkbWEgPT0gMTEpCgkJCXsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CgkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gOTsKCQkJfQoJCQllbHNlIGlmKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDkpCgkJCXsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMjsKCQkJfQoJCQllbHNlIGlmKGNvZXhfZG0tPmN1cl9wc190ZG1hID09IDIpCgkJCXsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMSk7CgkJCQljb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlID0gMTsKCQkJfQoJCX0KCgkJaWYoIGNvZXhfZG0tPmN1cl9wc190ZG1hICE9IDEgJiYKCQkJY29leF9kbS0+Y3VyX3BzX3RkbWEgIT0gMiAmJgoJCQljb2V4X2RtLT5jdXJfcHNfdGRtYSAhPSA5ICYmCgkJCWNvZXhfZG0tPmN1cl9wc190ZG1hICE9IDExICkKCQl7CgkJCS8vIHJlY292ZXIgdG8gcHJldmlvdXMgYWRqdXN0IHR5cGUKCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCBjb2V4X2RtLT5wc190ZG1hX2R1X2Fkal90eXBlKTsKCQl9Cgl9Cn0KCnUxQnl0ZQpoYWxidGM4ODEyYTFhbnRfUHNUZG1hVHlwZUJ5V2lmaVJzc2koCgkgCXM0Qnl0ZQl3aWZpX3Jzc2ksCgkgCXM0Qnl0ZQlwcmVfd2lmaV9yc3NpLAoJIAl1MUJ5dGUJd2lmaV9yc3NpX3RocmVzaAoJKQp7Cgl1MUJ5dGUJcHNfdGRtYV90eXBlPTA7CgkKCWlmKHdpZmlfcnNzaSA+IHByZV93aWZpX3Jzc2kpCgl7CgkJaWYod2lmaV9yc3NpID4gKHdpZmlfcnNzaV90aHJlc2grNSkpCgkJewoJCQlwc190ZG1hX3R5cGUgPSAyNjsKCQl9CgkJZWxzZQoJCXsKCQkJcHNfdGRtYV90eXBlID0gMjU7CgkJfQoJfQoJZWxzZQoJewoJCWlmKHdpZmlfcnNzaSA+IHdpZmlfcnNzaV90aHJlc2gpCgkJewoJCQlwc190ZG1hX3R5cGUgPSAyNjsKCQl9CgkJZWxzZQoJCXsKCQkJcHNfdGRtYV90eXBlID0gMjU7CgkJfQoJfQoKCXJldHVybiBwc190ZG1hX3R5cGU7Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAlCT09MRUFOCQkJbmV3X3BzX3N0YXRlCgkpCnsKCXUxQnl0ZQlscHNfbW9kZT0weDA7CgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VMV9MUFNfTU9ERSwgJmxwc19tb2RlKTsKCQoJaWYobHBzX21vZGUpCS8vIGFscmVhZHkgdW5kZXIgTFBTIHN0YXRlCgl7CgkJaWYobmV3X3BzX3N0YXRlKQkJCgkJewoJCQkvLyBrZWVwIHN0YXRlIHVuZGVyIExQUywgZG8gbm90aGluZy4KCQl9CgkJZWxzZQoJCXsKCQkJLy8gd2lsbCBsZWF2ZSBMUFMgc3RhdGUsIHR1cm4gb2ZmIHBzVGRtYSBmaXJzdAoJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCAwKTsKCQl9Cgl9CgllbHNlCQkJCQkJLy8gTk8gUFMgc3RhdGUKCXsKCQlpZihuZXdfcHNfc3RhdGUpCgkJewoJCQkvLyB3aWxsIGVudGVyIExQUyBzdGF0ZSwgdHVybiBvZmYgcHNUZG1hIGZpcnN0CgkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDApOwoJCX0KCQllbHNlCgkJewoJCQkvLyBrZWVwIHN0YXRlIHVuZGVyIE5PIFBTIHN0YXRlLCBkbyBub3RoaW5nLgoJCX0KCX0KfQoKLy8gU0NPIG9ubHkgb3IgU0NPK1BBTihIUykKdm9pZApoYWxidGM4ODEyYTFhbnRfQWN0aW9uU2NvKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7Cgl1MUJ5dGUJd2lmaV9yc3NpX3N0YXRlOwoJdTRCeXRlCXdpZmlfYnc7CgoJd2lmaV9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X1dpZmlSc3NpU3RhdGUoYnRjb2V4aXN0LCAwLCAyLCAyNSwgMCk7CgoJaGFsYnRjODgxMmExYW50X0Z3RGFjU3dpbmdMdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNCk7CgoJaWYoaGFsYnRjODgxMmExYW50X05lZWRUb0RlY0J0UHdyKGJ0Y29leGlzdCkpCgkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJZWxzZQkKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOwoJCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKCglpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCSAgaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQkgIGhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJfQoJZWxzZQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLDB4MTgpOwoJCX0JCQoJfQp9CgoKdm9pZApoYWxidGM4ODEyYTFhbnRfQWN0aW9uSGlkKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7Cgl1MUJ5dGUJd2lmaV9yc3NpX3N0YXRlLCBidF9yc3NpX3N0YXRlOwkKCXU0Qnl0ZQl3aWZpX2J3OwoKCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9XaWZpUnNzaVN0YXRlKGJ0Y29leGlzdCwgMCwgMiwgMjUsIDApOwoJYnRfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9CdFJzc2lTdGF0ZSgyLCA1MCwgMCk7CgoJaGFsYnRjODgxMmExYW50X0Z3RGFjU3dpbmdMdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CgoJaWYoaGFsYnRjODgxMmExYW50X05lZWRUb0RlY0J0UHdyKGJ0Y29leGlzdCkpCgkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJZWxzZQkKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOwoKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSxmYWxzZSxmYWxzZSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgkJfQoJfQoJZWxzZQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLDB4MTgpOwoJCX0JCQoJfQp9CgovL0EyRFAgb25seSAvIFBBTihFRFIpIG9ubHkvIEEyRFArUEFOKEhTKQp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25BMmRwKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7Cgl1MUJ5dGUJCXdpZmlfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZTsKCXU0Qnl0ZQkJd2lmaV9idzsKCgl3aWZpX3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfV2lmaVJzc2lTdGF0ZShidGNvZXhpc3QsIDAsIDIsIDI1LCAwKTsKCWJ0X3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfQnRSc3NpU3RhdGUoMiwgNTAsIDApOwoKCWhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOwoKCWlmKGhhbGJ0Yzg4MTJhMWFudF9OZWVkVG9EZWNCdFB3cihidGNvZXhpc3QpKQoJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCWVsc2UJCgkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKCglpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9Cgl9CgllbHNlCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgkJfQkJCgl9Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X0FjdGlvbkEyZHBQYW5IcygKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpX3Jzc2lfc3RhdGUsIGJ0X3Jzc2lfc3RhdGUsIGJ0X2luZm9fZXh0OwoJdTRCeXRlCQl3aWZpX2J3OwoKCWJ0X2luZm9fZXh0ID0gY29leF9zdGEtPmJ0X2luZm9fZXh0OwoJd2lmaV9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X1dpZmlSc3NpU3RhdGUoYnRjb2V4aXN0LCAwLCAyLCAyNSwgMCk7CglidF9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X0J0UnNzaVN0YXRlKDIsIDUwLCAwKTsKCgloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKCglpZihoYWxidGM4ODEyYTFhbnRfTmVlZFRvRGVjQnRQd3IoYnRjb2V4aXN0KSkKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgllbHNlCQoJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CgoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJfQoJZWxzZQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLDB4MTgpOwoJCX0JCQoJfQp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25QYW5FZHIoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsKCXUxQnl0ZQkJd2lmaV9yc3NpX3N0YXRlLCBidF9yc3NpX3N0YXRlOwoJdTRCeXRlCQl3aWZpX2J3OwoKCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9XaWZpUnNzaVN0YXRlKGJ0Y29leGlzdCwgMCwgMiwgMjUsIDApOwoJYnRfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9CdFJzc2lTdGF0ZSgyLCA1MCwgMCk7CgoJaGFsYnRjODgxMmExYW50X0Z3RGFjU3dpbmdMdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CgoJaWYoaGFsYnRjODgxMmExYW50X05lZWRUb0RlY0J0UHdyKGJ0Y29leGlzdCkpCgkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJZWxzZQkKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOwoKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSx0cnVlLGZhbHNlLDB4MTgpOwoJCX0KCX0KCWVsc2UKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSwweDE4KTsKCQl9Cgl9Cn0KCgovL1BBTihIUykgb25seQp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25QYW5IcygKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpX3Jzc2lfc3RhdGUsIGJ0X3Jzc2lfc3RhdGU7Cgl1NEJ5dGUJCXdpZmlfYnc7CgoJd2lmaV9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X1dpZmlSc3NpU3RhdGUoYnRjb2V4aXN0LCAwLCAyLCAyNSwgMCk7CglidF9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X0J0UnNzaVN0YXRlKDIsIDUwLCAwKTsKCgloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKCglpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpCgl7CgkJLy8gZncgbWVjaGFuaXNtCgkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKCQl9CgoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJfQoJZWxzZQoJewoJCS8vIGZ3IG1lY2hhbmlzbQoJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CgkJfQoKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSwweDE4KTsKCQl9Cgl9Cn0KCi8vUEFOKEVEUikrQTJEUAp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25QYW5FZHJBMmRwKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7Cgl1MUJ5dGUJCXdpZmlfcnNzaV9zdGF0ZSwgYnRfcnNzaV9zdGF0ZSwgYnRfaW5mb19leHQ7Cgl1NEJ5dGUJCXdpZmlfYnc7CgoJYnRfaW5mb19leHQgPSBjb2V4X3N0YS0+YnRfaW5mb19leHQ7Cgl3aWZpX3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfV2lmaVJzc2lTdGF0ZShidGNvZXhpc3QsIDAsIDIsIDI1LCAwKTsKCWJ0X3Jzc2lfc3RhdGUgPSBoYWxidGM4ODEyYTFhbnRfQnRSc3NpU3RhdGUoMiwgNTAsIDApOwoKCWhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDYpOwoKCWlmKGhhbGJ0Yzg4MTJhMWFudF9OZWVkVG9EZWNCdFB3cihidGNvZXhpc3QpKQoJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCWVsc2UJCgkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlKTsKCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKCglpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9Cgl9CgllbHNlCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LHRydWUsdHJ1ZSxmYWxzZSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgkJfQoJfQp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25QYW5FZHJIaWQoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsKCXUxQnl0ZQkJd2lmaV9yc3NpX3N0YXRlLCBidF9yc3NpX3N0YXRlOwoJdTRCeXRlCQl3aWZpX2J3OwoKCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9XaWZpUnNzaVN0YXRlKGJ0Y29leGlzdCwgMCwgMiwgMjUsIDApOwoJYnRfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9CdFJzc2lTdGF0ZSgyLCA1MCwgMCk7CgoJaGFsYnRjODgxMmExYW50X0Z3RGFjU3dpbmdMdmwoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CgoJaWYoaGFsYnRjODgxMmExYW50X05lZWRUb0RlY0J0UHdyKGJ0Y29leGlzdCkpCgkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJZWxzZQkKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOwoKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSx0cnVlLGZhbHNlLDB4MTgpOwoJCX0KCX0KCWVsc2UKCXsJCQoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLDB4MTgpOwoJCX0KCX0KfQoKLy8gSElEK0EyRFArUEFOKEVEUikKdm9pZApoYWxidGM4ODEyYTFhbnRfQWN0aW9uSGlkQTJkcFBhbkVkcigKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpX3Jzc2lfc3RhdGUsIGJ0X3Jzc2lfc3RhdGUsIGJ0X2luZm9fZXh0OwoJdTRCeXRlCQl3aWZpX2J3OwoKCWJ0X2luZm9fZXh0ID0gY29leF9zdGEtPmJ0X2luZm9fZXh0OwoJd2lmaV9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X1dpZmlSc3NpU3RhdGUoYnRjb2V4aXN0LCAwLCAyLCAyNSwgMCk7CglidF9yc3NpX3N0YXRlID0gaGFsYnRjODgxMmExYW50X0J0UnNzaVN0YXRlKDIsIDUwLCAwKTsKCgloYWxidGM4ODEyYTFhbnRfRndEYWNTd2luZ0x2bChidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCA2KTsKCglpZihoYWxidGM4ODEyYTFhbnRfTmVlZFRvRGVjQnRQd3IoYnRjb2V4aXN0KSkKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgllbHNlCQoJCWhhbGJ0Yzg4MTJhMWFudF9EZWNCdFB3cihidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSk7CgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CgoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpX2J3KQoJewkKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSx0cnVlLGZhbHNlLDB4MTgpOwoJCX0KCX0KCWVsc2UKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlfcnNzaV9zdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsdHJ1ZSx0cnVlLGZhbHNlLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCxmYWxzZSxmYWxzZSxmYWxzZSwweDE4KTsKCQl9Cgl9Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X0FjdGlvbkhpZEEyZHAoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsKCXUxQnl0ZQkJd2lmaV9yc3NpX3N0YXRlLCBidF9yc3NpX3N0YXRlLCBidF9pbmZvX2V4dDsKCXU0Qnl0ZQkJd2lmaV9idzsKCglidF9pbmZvX2V4dCA9IGNvZXhfc3RhLT5idF9pbmZvX2V4dDsKCXdpZmlfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9XaWZpUnNzaVN0YXRlKGJ0Y29leGlzdCwgMCwgMiwgMjUsIDApOwoJYnRfcnNzaV9zdGF0ZSA9IGhhbGJ0Yzg4MTJhMWFudF9CdFJzc2lTdGF0ZSgyLCA1MCwgMCk7CgoJaWYoaGFsYnRjODgxMmExYW50X05lZWRUb0RlY0J0UHdyKGJ0Y29leGlzdCkpCgkJaGFsYnRjODgxMmExYW50X0RlY0J0UHdyKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJZWxzZQkKCQloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UpOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlfYncpOwoKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaV9idykKCXsJCQoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJfQoJZWxzZQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaV9yc3NpX3N0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpX3Jzc2lfc3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfU3dNZWNoYW5pc20yKGJ0Y29leGlzdCx0cnVlLHRydWUsZmFsc2UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Td01lY2hhbmlzbTIoYnRjb2V4aXN0LGZhbHNlLGZhbHNlLGZhbHNlLDB4MTgpOwoJCX0KCX0KfQoKdm9pZApoYWxidGM4ODEyYTFhbnRfQWN0aW9uSHMoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAlCT09MRUFOCQkJaHNfY29ubmVjdGluZwoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBmb3IgSFMsIGhzX2Nvbm5lY3Rpbmc9JWQhISFcbiIsIGhzX2Nvbm5lY3RpbmcpKTsKCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDgpOwoKCWlmKGhzX2Nvbm5lY3RpbmcpCgl7CgkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIEZPUkNFX0VYRUMsIDB4YWFhYWFhYWEsIDB4YWFhYWFhYWEsIDB4ZmZmZiwgMHgzKTsKCX0KCWVsc2UKCXsKCQlpZigoY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfdHgrY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfcngrCgkJCWNvZXhfc3RhLT5sb3dfcHJpb3JpdHlfdHgrY29leF9zdGEtPmxvd19wcmlvcml0eV9yeCk8PTEyMDApCgkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCAweGFhYWFhYWFhLCAweGFhYWFhYWFhLCAweGZmZmYsIDB4Myk7CgkJZWxzZQoJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmLCAweDMpOwkKCX0KfQoKCnZvaWQKaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWQoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsKCUJPT0xFQU4JCWhzX2Nvbm5lY3Rpbmc9ZmFsc2U7CgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9IU19DT05ORUNUSU5HLCAmaHNfY29ubmVjdGluZyk7CgkKCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOwoJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKCglpZihoc19jb25uZWN0aW5nKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSFMgaXMgY29ubmVjdGluZyEhIVxuIikpOwoJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25IcyhidGNvZXhpc3QsIGhzX2Nvbm5lY3RpbmcpOwoJfQoJZWxzZQoJewoJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDgpOwoJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJfQp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpTm90Q29ubmVjdGVkQXNzb0F1dGhTY2FuKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7CglQQlRDX1NUQUNLX0lORk8Jc3RhY2tfaW5mbz0mYnRjb2V4aXN0LT5zdGFja19pbmZvOwoJQk9PTEVBTgkJCWhzX2Nvbm5lY3Rpbmc9ZmFsc2U7CgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9IU19DT05ORUNUSU5HLCAmaHNfY29ubmVjdGluZyk7CgloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIGZhbHNlKTsKCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0xFQVZFX0xQUywgTlVMTCk7CgoJaWYoaHNfY29ubmVjdGluZykKCXsKCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uSHMoYnRjb2V4aXN0LCBoc19jb25uZWN0aW5nKTsKCX0KCWVsc2UgaWYoYnRjb2V4aXN0LT5idF9pbmZvLmJ0X2Rpc2FibGVkKQoJewoJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDkpOwoJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJfQoJZWxzZSBpZihCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19JTlFfUEFHRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpCnsKCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMwKTsKCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCX0KCWVsc2UgaWYoIChCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEUgPT0gY29leF9kbS0+YnRfc3RhdHVzKSB8fAoJCShCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpICkKCXsKCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDI4KTsKCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCX0KCWVsc2UgaWYoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKQoJewoJCWlmKHN0YWNrX2luZm8tPmhpZF9leGlzdCkKCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzNSk7CgkJZWxzZQoJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDI5KTsKCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKCX0KCWVsc2UgaWYoIChCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CgkJKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0FDTF9TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpICkKCQl7CgkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOCk7CgkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDVhZWE1YWVhLCAweDVhZWE1YWVhLCAweGZmZmYsIDB4Myk7Cgl9CgllbHNlIAoJewoJCS8vZXJyb3IgY29uZGl0aW9uLCBzaG91bGQgbm90IHJlYWNoIGhlcmUsIHJlY29yZCBlcnJvciBudW1iZXIgZm9yIGRlYnVnZ2luZy4KCQljb2V4X2RtLT5lcnJvcl9jb25kaXRpb24gPSAxOwoJfQp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkU2NhbigKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJUEJUQ19TVEFDS19JTkZPCXN0YWNrX2luZm89JmJ0Y29leGlzdC0+c3RhY2tfaW5mbzsKCQoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb25Db25uZWN0ZWRTY2FuKCk9PT0+XG4iKSk7CgoJaWYoYnRjb2V4aXN0LT5idF9pbmZvLmJ0X2Rpc2FibGVkKQoJewoJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOwoJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0xFQVZFX0xQUywgTlVMTCk7CgkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOSk7CgkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Cgl9CgllbHNlCgl7CgkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCB0cnVlKTsKCQloYWxidGM4ODEyYTFhbnRfTHBzUnB3bShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDAsIDB4NCk7CgkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCgkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfRU5URVJfTFBTLCBOVUxMKTsKCgkJLy8gcHNUZG1hCgkJaWYoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfSU5RX1BBR0UgPT0gY29leF9kbS0+YnRfc3RhdHVzKQoJCXsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb25Db25uZWN0ZWRTY2FuKCksIGJ0IGlzIHVuZGVyIGlucXVpcnkvcGFnZSBzY2FuXG4iKSk7CgkJCWlmKHN0YWNrX2luZm8tPnNjb19leGlzdCkKCQkJewoJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzMik7CgkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMzApOwoJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgkJCX0KCQl9CgkJZWxzZSBpZiggKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CgkJCShCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpICkKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNSk7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJCX0KCQllbHNlIGlmKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykKCQl7CgkJCWlmKHN0YWNrX2luZm8tPmhpZF9leGlzdCkKCQl7CgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDM0KTsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1YWZhNWFmYSwgMHhmZmZmLCAweDMpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA0KTsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJCQl9CgkJfQoJCWVsc2UgaWYoIChCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CgkJCShCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMzKTsKCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CgkJfQoJCWVsc2UgCgkJewoJCQkvL2Vycm9yIGNvbmRpdGlvbiwgc2hvdWxkIG5vdCByZWFjaCBoZXJlCgkJCWNvZXhfZG0tPmVycm9yX2NvbmRpdGlvbiA9IDI7CgkJfQoJfQoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb25Db25uZWN0ZWRTY2FuKCk8PT09XG4iKSk7Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlDb25uZWN0ZWRTcGVjaWFsUGFja2V0KAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7CglQQlRDX1NUQUNLX0lORk8Jc3RhY2tfaW5mbz0mYnRjb2V4aXN0LT5zdGFja19pbmZvOwoKCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOwoJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKCglpZihidGNvZXhpc3QtPmJ0X2luZm8uYnRfZGlzYWJsZWQpCgl7CQoJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDkpOwoJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJfQoJZWxzZQoJewoJCWlmKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0lOUV9QQUdFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykKCQl7CgkJCWlmKHN0YWNrX2luZm8tPnNjb19leGlzdCkKCQl7CgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMyKTsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1YWZhNWFmYSwgMHhmZmZmLCAweDMpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzMCk7CgkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCQkJfQoJCX0KCQllbHNlIGlmKCAoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgfHwKCQkJKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgKQoJCXsKCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyOCk7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJCX0KCQllbHNlIGlmKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykKCQl7CgkJCWlmKHN0YWNrX2luZm8tPmhpZF9leGlzdCkKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMzUpOwoJCQllbHNlCgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDI5KTsKCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CgkJfQoJCWVsc2UgaWYoIChCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CgkJCShCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKSApCgkJewoJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA4KTsKCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDVhZWE1YWVhLCAweDVhZWE1YWVhLCAweGZmZmYsIDB4Myk7CgkJfQoJCWVsc2UgCgkJewoJCQkvL2Vycm9yIGNvbmRpdGlvbiwgc2hvdWxkIG5vdCByZWFjaCBoZXJlCgkJCWNvZXhfZG0tPmVycm9yX2NvbmRpdGlvbiA9IDM7CgkJfQoJfQp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7CglQQlRDX1NUQUNLX0lORk8Jc3RhY2tfaW5mbz0mYnRjb2V4aXN0LT5zdGFja19pbmZvOwoJQk9PTEVBTiAJd2lmaV9jb25uZWN0ZWQ9ZmFsc2UsIHdpZmlfYnVzeT1mYWxzZSwgYnRfaHNfb249ZmFsc2U7CglCT09MRUFOCQlzY2FuPWZhbHNlLCBsaW5rPWZhbHNlLCByb2FtPWZhbHNlOwoJQk9PTEVBTgkJaHNfY29ubmVjdGluZz1mYWxzZSwgdW5kZXI0d2F5PWZhbHNlOwoJdTRCeXRlCQl3aWZpX2J3OwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQ29leEZvcldpZmlDb25uZWN0KCk9PT0+XG4iKSk7CgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJndpZmlfY29ubmVjdGVkKTsKCWlmKCF3aWZpX2Nvbm5lY3RlZCkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIENvZXhGb3JXaWZpQ29ubmVjdCgpLCByZXR1cm4gZm9yIHdpZmkgbm90IGNvbm5lY3RlZDw9PT1cbiIpKTsKCQlyZXR1cm47Cgl9CgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJXzRfV0FZX1BST0dSRVNTLCAmdW5kZXI0d2F5KTsKCWlmKHVuZGVyNHdheSkKCXsKCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZFNwZWNpYWxQYWNrZXQoYnRjb2V4aXN0KTsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIENvZXhGb3JXaWZpQ29ubmVjdCgpLCByZXR1cm4gZm9yIHdpZmkgaXMgdW5kZXIgNHdheTw9PT1cbiIpKTsKCQlyZXR1cm47Cgl9CgkKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfSFNfQ09OTkVDVElORywgJmhzX2Nvbm5lY3RpbmcpOwoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZidF9oc19vbik7CglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfU0NBTiwgJnNjYW4pOwoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0xJTkssICZsaW5rKTsKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9ST0FNLCAmcm9hbSk7CglpZihzY2FuIHx8IGxpbmsgfHwgcm9hbSkKCXsKCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZFNjYW4oYnRjb2V4aXN0KTsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIENvZXhGb3JXaWZpQ29ubmVjdCgpLCByZXR1cm4gZm9yIHdpZmkgaXMgdW5kZXIgc2Nhbjw9PT1cbiIpKTsKCQlyZXR1cm47Cgl9CgkKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9CVVNZLCAmd2lmaV9idXN5KTsJCglpZighd2lmaV9idXN5KQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgd2lmaSBhc3NvY2lhdGVkLWlkbGUhISFcbiIpKTsKCQlpZihidGNvZXhpc3QtPmJ0X2luZm8uYnRfZGlzYWJsZWQpCgkJewoJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIHRydWUpOwoJCQloYWxidGM4ODEyYTFhbnRfTHBzUnB3bShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDAsIDB4NCk7CgkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0VOVEVSX0xQUywgTlVMTCk7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDkpOwoJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCQl9CgkJZWxzZQoJCXsKCQkJaWYoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfSU5RX1BBR0UgPT0gY29leF9kbS0+YnRfc3RhdHVzKQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIGJ0IGlzIHVuZGVyIGlucXVpcnkvcGFnZSBzY2FuISEhXG4iKSk7CgkJCQlpZihzdGFja19pbmZvLT5zY29fZXhpc3QpCgkJCQl7CgkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzMik7CgkJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCB0cnVlKTsKCQkJCQloYWxidGM4ODEyYTFhbnRfTHBzUnB3bShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDAsIDB4NCk7CgkJCQkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCgkJCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfRU5URVJfTFBTLCBOVUxMKTsKCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMwKTsKCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCQkJCX0KCQkJfQoJCQllbHNlIGlmKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpCgkJCXsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgdHJ1ZSk7CgkJCQloYWxidGM4ODEyYTFhbnRfTHBzUnB3bShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDI2LCAweDApOwoJCQkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCgkJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9FTlRFUl9MUFMsIE5VTEwpOwoJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOSk7CgkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCQkJfQoJCQllbHNlIGlmKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09IGNvZXhfZG0tPmJ0X3N0YXR1cykKCQkJewoJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCB0cnVlKTsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9McHNScHdtKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4MjYsIDB4MCk7CgkJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KCQkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0VOVEVSX0xQUywgTlVMTCk7CgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCAwKTsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJCQl9CgkJCWVsc2UgaWYoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKQoJCQl7CgkJCQlpZihzdGFja19pbmZvLT5oaWRfZXhpc3QgJiYgc3RhY2tfaW5mby0+bnVtT2ZMaW5rPT0xKQoJCQkJewoJCQkJCS8vIGhpZCBvbmx5CgkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCBmYWxzZSk7CgkJCQkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCgkJCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKCQkJCQkKCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA4KTsKCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NWZmZjVmZmYsIDB4NWZmZjVmZmYsIDB4ZmZmZiwgMHgzKTsKCQkJCQljb2V4X2RtLT5yZXNldF90ZG1hX2FkanVzdCA9IHRydWU7CgkJCQl9CgkJCQllbHNlCgkJCQl7CQkJCQoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgdHJ1ZSk7CgkJCQkJaGFsYnRjODgxMmExYW50X0xwc1Jwd20oYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHgwLCAweDQpOwoJCQkJCS8vIHBvd2VyIHNhdmUgbXVzdCBleGVjdXRlZCBiZWZvcmUgcHNUZG1hLgoJCQkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0VOVEVSX0xQUywgTlVMTCk7CgoJCQkJCWlmKHN0YWNrX2luZm8tPmhpZF9leGlzdCkKCQkJCQl7CgkJCQkJCWlmKHN0YWNrX2luZm8tPmEyZHBfZXhpc3QpCgkJCQkJCXsKCQkJCQkJCS8vIGhpZCthMmRwCgkJCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOwoJCQkJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CgkJCQkJCX0KCQkJCQkJZWxzZSBpZihzdGFja19pbmZvLT5wYW5fZXhpc3QpCgkJCQkJCXsKCQkJCQkJCWlmKGJ0X2hzX29uKQoJCQkJCQkJewoJCQkJCQkJCS8vIGhpZCtocwoJCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJLy8gaGlkK3BhbgoJCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQkJCQl9CgkJCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWNvZXhfZG0tPmVycm9yX2NvbmRpdGlvbiA9IDQ7CgkJCQkJCX0KCQkJCQkJY29leF9kbS0+cmVzZXRfdGRtYV9hZGp1c3QgPSB0cnVlOwoJCQkJCX0KCQkJCQllbHNlIGlmKHN0YWNrX2luZm8tPmEyZHBfZXhpc3QpCgkJCQkJewoJCQkJCQlpZihzdGFja19pbmZvLT5wYW5fZXhpc3QpCgkJCQkJCXsKCQkJCQkJCWlmKGJ0X2hzX29uKQoJCQkJCQkJewoJCQkJCQkJCS8vIGEyZHAraHMKCQkJCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCS8vIGEyZHArcGFuCgkJCQkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzNik7CgkJCQkJCQl9CgkJCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKCQkJCQkJCWNvZXhfZG0tPnJlc2V0X3RkbWFfYWRqdXN0ID0gdHJ1ZTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCS8vIGEyZHAgb25seQoJCQkJCQkJaGFsYnRjODgxMmExYW50X1RkbWFEdXJhdGlvbkFkanVzdEZvckFjbChidGNvZXhpc3QpOwoJCQkJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZSBpZihzdGFja19pbmZvLT5wYW5fZXhpc3QpCgkJCQkJewoJCQkJCQkvLyBwYW4gb25seQoJCQkJCQlpZihidF9oc19vbikKCQkJCQkJewoJCQkJCQkJY29leF9kbS0+ZXJyb3JfY29uZGl0aW9uID0gNTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKCQkJCQkJfQoJCQkJCQljb2V4X2RtLT5yZXNldF90ZG1hX2FkanVzdCA9IHRydWU7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCS8vIHRlbXAgc3RhdGUsIGRvIG5vdGhpbmchISEKCQkJCQkJLy9EYmdQcmludCgiZXJyb3IgNiwgY29leF9kbS0+YnRfc3RhdHVzPSVkXG4iLCBjb2V4X2RtLT5idF9zdGF0dXMpOwoJCQkJCQkvL0RiZ1ByaW50KCJlcnJvciA2LCBzdGFja19pbmZvLT5udW1PZkxpbms9JWQsIHN0YWNrX2luZm8tPmhpZF9leGlzdD0lZCwgc3RhY2tfaW5mby0+YTJkcF9leGlzdD0lZCwgc3RhY2tfaW5mby0+cGFuX2V4aXN0PSVkLCBzdGFja19pbmZvLT5zY29fZXhpc3Q9JWRcbiIsIAoJCQkJCQkJLy9zdGFja19pbmZvLT5udW1PZkxpbmssIHN0YWNrX2luZm8tPmhpZF9leGlzdCwgc3RhY2tfaW5mby0+YTJkcF9leGlzdCwgc3RhY2tfaW5mby0+cGFuX2V4aXN0LCBzdGFja19pbmZvLT5zY29fZXhpc3QpOwoJCQkJCQkvL2NvZXhfZG0tPmVycm9yX2NvbmRpdGlvbiA9IDY7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVsc2UgaWYoIChCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CgkJCQkoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX1NDT19CVVNZID09IGNvZXhfZG0tPmJ0X3N0YXR1cykgKQoJCQl7CgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIGZhbHNlKTsKCQkJCS8vIHBvd2VyIHNhdmUgbXVzdCBleGVjdXRlZCBiZWZvcmUgcHNUZG1hLgoJCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKCgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA4KTsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1YWVhNWFlYSwgMHg1YWVhNWFlYSwgMHhmZmZmLCAweDMpOwoJCQl9CgkJCWVsc2UgCgkJCXsKCQkJCS8vZXJyb3IgY29uZGl0aW9uLCBzaG91bGQgbm90IHJlYWNoIGhlcmUKCQkJCWNvZXhfZG0tPmVycm9yX2NvbmRpdGlvbiA9IDc7CgkJCX0KCQl9Cgl9CgllbHNlCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCB3aWZpIGJ1c3khISFcbiIpKTsKCQlpZihidGNvZXhpc3QtPmJ0X2luZm8uYnRfZGlzYWJsZWQpCgkJewoJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIGZhbHNlKTsKCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOSk7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJCX0KCQllbHNlCgkJewoJCQlpZihidF9oc19vbikKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBIUyBpcyB1bmRlciBwcm9ncmVzcyEhIVxuIikpOwoJCQkJLy9EYmdQcmludCgiY29leF9kbS0+YnRfc3RhdHVzID0gMHgleFxuIiwgY29leF9kbS0+YnRfc3RhdHVzKTsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25IcyhidGNvZXhpc3QsIGhzX2Nvbm5lY3RpbmcpOwoJCQl9CgkJCWVsc2UgaWYoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfSU5RX1BBR0UgPT0gY29leF9kbS0+YnRfc3RhdHVzKQoJCQl7CgkJCQlpZihzdGFja19pbmZvLT5zY29fZXhpc3QpCgkJCQl7CgkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzMik7CgkJCQkJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweDVhZmE1YWZhLCAweGZmZmYsIDB4Myk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCB0cnVlKTsKCQkJCQloYWxidGM4ODEyYTFhbnRfTHBzUnB3bShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDAsIDB4NCk7CgkJCQkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCgkJCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfRU5URVJfTFBTLCBOVUxMKTsKCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMwKTsKCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCQkJCX0KCQkJfQoJCQllbHNlIGlmKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpCgkJCXsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgZmFsc2UpOwoJCQkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCgkJCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9MRUFWRV9MUFMsIE5VTEwpOwoJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA1KTsKCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1YTVhNWE1YSwgMHg1YTVhNWE1YSwgMHhmZmZmLCAweDMpOwoJCQl9CgkJCWVsc2UgaWYoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gY29leF9kbS0+YnRfc3RhdHVzKQoJCQl7CgkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIGZhbHNlKTsKCQkJCS8vIHBvd2VyIHNhdmUgbXVzdCBleGVjdXRlZCBiZWZvcmUgcHNUZG1hLgoJCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKCQkJCWlmKGJ0X2hzX29uKQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSFMgaXMgdW5kZXIgcHJvZ3Jlc3MhISFcbiIpKTsKCQkJCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uSHMoYnRjb2V4aXN0LCBoc19jb25uZWN0aW5nKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDUpOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1YTVhNWE1YSwgMHg1YTVhNWE1YSwgMHhmZmZmLCAweDMpOwoJCQkJfQoJCQl9CgkJCWVsc2UgaWYoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKQoJCQl7CgkJCQlpZihzdGFja19pbmZvLT5oaWRfZXhpc3QgJiYgc3RhY2tfaW5mby0+bnVtT2ZMaW5rPT0xKQoJCQkJewoJCQkJCS8vIGhpZCBvbmx5CgkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCBmYWxzZSk7CgkJCQkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCgkJCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKCQkJCQkKCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIGZhbHNlLCA4KTsKCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NWZmZjVmZmYsIDB4NWZmZjVmZmYsIDB4ZmZmZiwgMHgzKTsKCQkJCQljb2V4X2RtLT5yZXNldF90ZG1hX2FkanVzdCA9IHRydWU7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCB0cnVlKTsKCQkJCQloYWxidGM4ODEyYTFhbnRfTHBzUnB3bShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDAsIDB4NCk7CgkJCQkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCgkJCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfRU5URVJfTFBTLCBOVUxMKTsKCgkJCQkJaWYoc3RhY2tfaW5mby0+aGlkX2V4aXN0KQoJCQkJCXsKCQkJCQkJaWYoc3RhY2tfaW5mby0+YTJkcF9leGlzdCkKCQkJCQkJewoJCQkJCQkJLy8gaGlkK2EyZHAKCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKCQkJCQkJfQoJCQkJCQllbHNlIGlmKHN0YWNrX2luZm8tPnBhbl9leGlzdCkKCQkJCQkJewoJCQkJCQkJaWYoYnRfaHNfb24pCgkJCQkJCQl7CgkJCQkJCQkJLy8gaGlkK2hzCgkJCQkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQkvLyBoaWQrcGFuCgkJCQkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCQkJCX0KCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1YWZhNWFmYSwgMHhmZmZmLCAweDMpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJY29leF9kbS0+ZXJyb3JfY29uZGl0aW9uID0gODsKCQkJCQkJfQoJCQkJCQljb2V4X2RtLT5yZXNldF90ZG1hX2FkanVzdCA9IHRydWU7CgkJCQkJfQoJCQkJCWVsc2UgaWYoc3RhY2tfaW5mby0+YTJkcF9leGlzdCkKCQkJCQl7CgkJCQkJCWlmKHN0YWNrX2luZm8tPnBhbl9leGlzdCkKCQkJCQkJewoJCQkJCQkJaWYoYnRfaHNfb24pCgkJCQkJCQl7CgkJCQkJCQkJLy8gYTJkcCtocwoJCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJLy8gYTJkcCtwYW4KCQkJCQkJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDM2KTsKCQkJCQkJCX0KCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1YWZhNWFmYSwgMHhmZmZmLCAweDMpOwoJCQkJCQkJY29leF9kbS0+cmVzZXRfdGRtYV9hZGp1c3QgPSB0cnVlOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJLy8gYTJkcCBvbmx5CgkJCQkJCQloYWxidGM4ODEyYTFhbnRfVGRtYUR1cmF0aW9uQWRqdXN0Rm9yQWNsKGJ0Y29leGlzdCk7CgkJCQkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NWFmYTVhZmEsIDB4ZmZmZiwgMHgzKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQllbHNlIGlmKHN0YWNrX2luZm8tPnBhbl9leGlzdCkKCQkJCQl7CgkJCQkJCS8vIHBhbiBvbmx5CgkJCQkJCWlmKGJ0X2hzX29uKQoJCQkJCQl7CgkJCQkJCQljb2V4X2RtLT5lcnJvcl9jb25kaXRpb24gPSA5OwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCQkJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1YWZhNWFmYSwgMHhmZmZmLCAweDMpOwoJCQkJCQl9CgkJCQkJCWNvZXhfZG0tPnJlc2V0X3RkbWFfYWRqdXN0ID0gdHJ1ZTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJLy9EYmdQcmludCgiZXJyb3IgMTAsIHN0YWNrX2luZm8tPm51bU9mTGluaz0lZCwgc3RhY2tfaW5mby0+aGlkX2V4aXN0PSVkLCBzdGFja19pbmZvLT5hMmRwX2V4aXN0PSVkLCBzdGFja19pbmZvLT5wYW5fZXhpc3Q9JWQsIHN0YWNrX2luZm8tPnNjb19leGlzdD0lZFxuIiwgCgkJCQkJCQkvL3N0YWNrX2luZm8tPm51bU9mTGluaywgc3RhY2tfaW5mby0+aGlkX2V4aXN0LCBzdGFja19pbmZvLT5hMmRwX2V4aXN0LCBzdGFja19pbmZvLT5wYW5fZXhpc3QsIHN0YWNrX2luZm8tPnNjb19leGlzdCk7CgkJCQkJCWNvZXhfZG0tPmVycm9yX2NvbmRpdGlvbiA9IDEwOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlIGlmKCAoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfU0NPX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKSB8fAoJCQkJKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0FDTF9TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpICkKCQkJewoJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCBmYWxzZSk7CgkJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KCQkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0xFQVZFX0xQUywgTlVMTCk7CgoJCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOCk7CgkJCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NWFlYTVhZWEsIDB4NWFlYTVhZWEsIDB4ZmZmZiwgMHgzKTsKCQkJfQoJCQllbHNlIAoJCQl7CgkJCQkvL0RiZ1ByaW50KCJlcnJvciAxMSwgY29leF9kbS0+YnRfc3RhdHVzPSVkXG4iLCBjb2V4X2RtLT5idF9zdGF0dXMpOwoJCQkJLy9EYmdQcmludCgiZXJyb3IgMTEsIHN0YWNrX2luZm8tPm51bU9mTGluaz0lZCwgc3RhY2tfaW5mby0+aGlkX2V4aXN0PSVkLCBzdGFja19pbmZvLT5hMmRwX2V4aXN0PSVkLCBzdGFja19pbmZvLT5wYW5fZXhpc3Q9JWQsIHN0YWNrX2luZm8tPnNjb19leGlzdD0lZFxuIiwgCgkJCQkJLy9zdGFja19pbmZvLT5udW1PZkxpbmssIHN0YWNrX2luZm8tPmhpZF9leGlzdCwgc3RhY2tfaW5mby0+YTJkcF9leGlzdCwgc3RhY2tfaW5mby0+cGFuX2V4aXN0LCBzdGFja19pbmZvLT5zY29fZXhpc3QpOwoJCQkJLy9lcnJvciBjb25kaXRpb24sIHNob3VsZCBub3QgcmVhY2ggaGVyZQoJCQkJY29leF9kbS0+ZXJyb3JfY29uZGl0aW9uID0gMTE7CgkJCX0KCQl9Cgl9CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIENvZXhGb3JXaWZpQ29ubmVjdCgpPD09PVxuIikpOwp9Cgp2b2lkCmhhbGJ0Yzg4MTJhMWFudF9SdW5Td0NvZXhpc3RNZWNoYW5pc20oCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsKCVBCVENfU1RBQ0tfSU5GTwkJc3RhY2tfaW5mbz0mYnRjb2V4aXN0LT5zdGFja19pbmZvOwoJQk9PTEVBTgkJCQl3aWZpX3VuZGVyNWc9ZmFsc2UsIHdpZmlfYnVzeT1mYWxzZSwgd2lmaV9jb25uZWN0ZWQ9ZmFsc2U7Cgl1MUJ5dGUJCQkJYnRfaW5mb19vcmlnaW5hbD0wLCBidF9yZXRyeV9jbnQ9MDsKCXUxQnl0ZQkJCQlhbGdvcml0aG09MDsKCglyZXR1cm47CglpZihzdGFja19pbmZvLT5iUHJvZmlsZU5vdGlmaWVkKQoJewoJCWFsZ29yaXRobSA9IGhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25BbGdvcml0aG0oYnRjb2V4aXN0KTsKCQljb2V4X2RtLT5jdXJfYWxnb3JpdGhtID0gYWxnb3JpdGhtOwkJCgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBbGdvcml0aG0gPSAlZCBcbiIsIGNvZXhfZG0tPmN1cl9hbGdvcml0aG0pKTsKCgkJaWYoaGFsYnRjODgxMmExYW50X0lzQ29tbW9uQWN0aW9uKGJ0Y29leGlzdCkpCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBjb21tb24uXG4iKSk7CgkJfQoJCWVsc2UKCQl7CgkJCXN3aXRjaChjb2V4X2RtLT5jdXJfYWxnb3JpdGhtKQoJCQl7CgkJCQljYXNlIEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX1NDTzoKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBTQ08uXG4iKSk7CgkJCQkJaGFsYnRjODgxMmExYW50X0FjdGlvblNjbyhidGNvZXhpc3QpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISUQ6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gSElELlxuIikpOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25IaWQoYnRjb2V4aXN0KTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fQTJEUDoKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBBMkRQLlxuIikpOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25BMmRwKGJ0Y29leGlzdCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX0EyRFBfUEFOSFM6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gQTJEUCtQQU4oSFMpLlxuIikpOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25BMmRwUGFuSHMoYnRjb2V4aXN0KTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fUEFORURSOgoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IFBBTihFRFIpLlxuIikpOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25QYW5FZHIoYnRjb2V4aXN0KTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fUEFOSFM6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gSFMgbW9kZS5cbiIpKTsKCQkJCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uUGFuSHMoYnRjb2V4aXN0KTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fUEFORURSX0EyRFA6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gUEFOK0EyRFAuXG4iKSk7CgkJCQkJaGFsYnRjODgxMmExYW50X0FjdGlvblBhbkVkckEyZHAoYnRjb2V4aXN0KTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlRfODgxMkFfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRDoKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBQQU4oRURSKStISUQuXG4iKSk7CgkJCQkJaGFsYnRjODgxMmExYW50X0FjdGlvblBhbkVkckhpZChidGNvZXhpc3QpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCVF84ODEyQV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFI6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gSElEK0EyRFArUEFOLlxuIikpOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25IaWRBMmRwUGFuRWRyKGJ0Y29leGlzdCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEJUXzg4MTJBXzFBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOgoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IEhJRCtBMkRQLlxuIikpOwoJCQkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25IaWRBMmRwKGJ0Y29leGlzdCk7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IGNvZXhpc3QgQWxsIE9mZiEhXG4iKSk7CgkJCQkJaGFsYnRjODgxMmExYW50X0NvZXhBbGxPZmYoYnRjb2V4aXN0KTsKCQkJCQlicmVhazsKCQkJfQoJCQljb2V4X2RtLT5wcmVfYWxnb3JpdGhtID0gY29leF9kbS0+Y3VyX2FsZ29yaXRobTsKCQl9Cgl9Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X1J1bkNvZXhpc3RNZWNoYW5pc20oCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsKCVBCVENfU1RBQ0tfSU5GTwkJc3RhY2tfaW5mbz0mYnRjb2V4aXN0LT5zdGFja19pbmZvOwoJQk9PTEVBTgkJCQl3aWZpX3VuZGVyNWc9ZmFsc2UsIHdpZmlfYnVzeT1mYWxzZSwgd2lmaV9jb25uZWN0ZWQ9ZmFsc2U7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBSdW5Db2V4aXN0TWVjaGFuaXNtKCk9PT0+XG4iKSk7CgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1VOREVSXzVHLCAmd2lmaV91bmRlcjVnKTsKCglpZih3aWZpX3VuZGVyNWcpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBSdW5Db2V4aXN0TWVjaGFuaXNtKCksIHJldHVybiBmb3IgNUcgPD09PVxuIikpOwoJCXJldHVybjsKCX0KCglpZihidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUnVuQ29leGlzdE1lY2hhbmlzbSgpLCByZXR1cm4gZm9yIE1hbnVhbCBDVFJMIDw9PT1cbiIpKTsKCQlyZXR1cm47Cgl9CgoJaWYoYnRjb2V4aXN0LT5zdG9wX2NvZXhfZG0pCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBSdW5Db2V4aXN0TWVjaGFuaXNtKCksIHJldHVybiBmb3IgU3RvcCBDb2V4IERNIDw9PT1cbiIpKTsKCQlyZXR1cm47Cgl9CgoJaGFsYnRjODgxMmExYW50X1J1blN3Q29leGlzdE1lY2hhbmlzbShidGNvZXhpc3QpOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZ3aWZpX2Nvbm5lY3RlZCk7CglpZihidGNvZXhpc3QtPmJ0X2luZm8uYnRfZGlzYWJsZWQpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBidCBpcyBkaXNhYmxlZCEhIVxuIikpOwoJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9CVVNZLCAmd2lmaV9idXN5KTsKCQlpZih3aWZpX2J1c3kpCgkJewkJCQoJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIGZhbHNlKTsKCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOSk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKGJ0Y29leGlzdCwgdHJ1ZSk7CgkJCWhhbGJ0Yzg4MTJhMWFudF9McHNScHdtKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4MCwgMHg0KTsKCQkJLy8gcG93ZXIgc2F2ZSBtdXN0IGV4ZWN1dGVkIGJlZm9yZSBwc1RkbWEuCgkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0VOVEVSX0xQUywgTlVMTCk7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDkpOwoJCX0KCQloYWxidGM4ODEyYTFhbnRfQ29leFRhYmxlKGJ0Y29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCX0KCWVsc2UgaWYoY29leF9zdGEtPnVuZGVyX2lwcykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIHdpZmkgaXMgdW5kZXIgSVBTICEhIVxuIikpOwoJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDApOwoJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4VGFibGUoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJCWhhbGJ0Yzg4MTJhMWFudF9XaWZpUGFyYUFkanVzdChidGNvZXhpc3QsIGZhbHNlKTsKCX0KCWVsc2UgaWYoIXdpZmlfY29ubmVjdGVkKQoJewoJCUJPT0xFQU4Jc2Nhbj1mYWxzZSwgbGluaz1mYWxzZSwgcm9hbT1mYWxzZTsKCQkKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIHdpZmkgaXMgbm9uIGNvbm5lY3RlZC1pZGxlICEhIVxuIikpOwoKCQlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfU0NBTiwgJnNjYW4pOwoJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9MSU5LLCAmbGluayk7CgkJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1JPQU0sICZyb2FtKTsKCgkJaWYoc2NhbiB8fCBsaW5rIHx8IHJvYW0pCgkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpTm90Q29ubmVjdGVkQXNzb0F1dGhTY2FuKGJ0Y29leGlzdCk7CgkJZWxzZQoJCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZChidGNvZXhpc3QpOwoJfQoJZWxzZQkvLyB3aWZpIExQUy9CdXN5Cgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCB3aWZpIGlzIE5PVCB1bmRlciBJUFMhISFcbiIpKTsKCQloYWxidGM4ODEyYTFhbnRfV2lmaVBhcmFBZGp1c3QoYnRjb2V4aXN0LCB0cnVlKTsKCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZChidGNvZXhpc3QpOwoJfQoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBSdW5Db2V4aXN0TWVjaGFuaXNtKCk8PT09XG4iKSk7Cn0KCnZvaWQKaGFsYnRjODgxMmExYW50X0luaXRDb2V4RG0oCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsJCglCT09MRUFOCQl3aWZpX2Nvbm5lY3RlZD1mYWxzZTsKCS8vIGZvcmNlIHRvIHJlc2V0IGNvZXggbWVjaGFuaXNtCgoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJndpZmlfY29ubmVjdGVkKTsKCWlmKCF3aWZpX2Nvbm5lY3RlZCkgLy8gbm9uLWNvbm5lY3RlZCBzY2FuCgl7CgkJaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWQoYnRjb2V4aXN0KTsKCX0KCWVsc2UJLy8gd2lmaSBpcyBjb25uZWN0ZWQKCXsKCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZChidGNvZXhpc3QpOwoJfQoKCWhhbGJ0Yzg4MTJhMWFudF9Gd0RhY1N3aW5nTHZsKGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgNik7CgloYWxidGM4ODEyYTFhbnRfRGVjQnRQd3IoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCBmYWxzZSk7CgoJLy8gc3cgYWxsIG9mZgoJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMShidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsZmFsc2UpOwoJaGFsYnRjODgxMmExYW50X1N3TWVjaGFuaXNtMihidGNvZXhpc3QsZmFsc2UsZmFsc2UsZmFsc2UsMHgxOCk7CgoJaGFsYnRjODgxMmExYW50X0NvZXhUYWJsZShidGNvZXhpc3QsIEZPUkNFX0VYRUMsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gd29yayBhcm91bmQgZnVuY3Rpb24gc3RhcnQgd2l0aCB3YV9oYWxidGM4ODEyYTFhbnRfCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIGV4dGVybiBmdW5jdGlvbiBzdGFydCB3aXRoIEVYaGFsYnRjODgxMmExYW50XwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQp2b2lkCkVYaGFsYnRjODgxMmExYW50X0luaXRId0NvbmZpZygKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QKCSkKewoJdTRCeXRlCXU0X3RtcD0wOwoJdTJCeXRlCXUyVG1wPTA7Cgl1MUJ5dGUJdTFfdG1wPTA7CgoJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsICgiW0JUQ29leF0sIDFBbnQgSW5pdCBIVyBDb25maWchIVxuIikpOwoKCS8vIGJhY2t1cCByZiAweDFlIHZhbHVlCgljb2V4X2RtLT5idF9yZjB4MWVfYmFja3VwID0gCgkJYnRjb2V4aXN0LT5idGNfZ2V0X3JmX3JlZyhidGNvZXhpc3QsIEJUQ19SRl9BLCAweDFlLCAweGZmZmZmKTsKCQoJLy9hbnQgc3cgY29udHJvbCB0byBCVAoJIGJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHg5MDAsIDB4MDAwMDA0MDApOwoJIGJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg3NmQsIDB4MSk7CgkgYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweGNiMywgMHg3Nyk7CgkgYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweGNiNywgMHg0MCk7CQoKCS8vIDB4NzkwWzU6MF09MHg1Cgl1MV90bXAgPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg3OTApOwoJdTFfdG1wICY9IDB4YzA7Cgl1MV90bXAgfD0gMHg1OwoJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDc5MCwgdTFfdG1wKTsKCgkvLyBQVEEgcGFyYW1ldGVyCglidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4NmNjLCAweDApOwoJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweDZjOCwgMHhmZmZmKTsKCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzRieXRlKGJ0Y29leGlzdCwgMHg2YzQsIDB4NTU1NTU1NTUpOwoJYnRjb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUoYnRjb2V4aXN0LCAweDZjMCwgMHg1NTU1NTU1NSk7CgoJLy8gY29leCBwYXJhbWV0ZXJzCglidGNvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShidGNvZXhpc3QsIDB4Nzc4LCAweDEpOwoKCS8vIGVuYWJsZSBjb3VudGVyIHN0YXRpc3RpY3MKCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg3NmUsIDB4NCk7CgoJLy8gZW5hYmxlIFBUQQoJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDQwLCAweDIwKTsKCgkvLyBidCBjbG9jayByZWxhdGVkCgl1MV90bXAgPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKGJ0Y29leGlzdCwgMHg0KTsKCXUxX3RtcCB8PSBCSVQ3OwoJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDQsIHUxX3RtcCk7CgoJLy8gYnQgY2xvY2sgcmVsYXRlZAoJdTFfdG1wID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4Nyk7Cgl1MV90bXAgfD0gQklUMTsKCWJ0Y29leGlzdC0+YnRjX3dyaXRlXzFieXRlKGJ0Y29leGlzdCwgMHg3LCB1MV90bXApOwp9Cgp2b2lkCkVYaGFsYnRjODgxMmExYW50X0luaXRDb2V4RG0oCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0CgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULCAoIltCVENvZXhdLCBDb2V4IE1lY2hhbmlzbSBJbml0ISFcbiIpKTsKCglidGNvZXhpc3QtPnN0b3BfY29leF9kbSA9IGZhbHNlOwoKCWhhbGJ0Yzg4MTJhMWFudF9Jbml0Q29leERtKGJ0Y29leGlzdCk7Cn0KCnZvaWQKRVhoYWxidGM4ODEyYTFhbnRfRGlzcGxheUNvZXhJbmZvKAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdAoJKQp7CglQQlRDX0JPQVJEX0lORk8JCWJvYXJkX2luZm89JmJ0Y29leGlzdC0+Ym9hcmRJbmZvOwoJUEJUQ19TVEFDS19JTkZPCQlzdGFja19pbmZvPSZidGNvZXhpc3QtPnN0YWNrX2luZm87CglwdTFCeXRlCQkJCWNsaV9idWY9YnRjb2V4aXN0LT5jbGlfYnVmOwoJdTFCeXRlCQkJCXUxX3RtcFs0XSwgaSwgYnRfaW5mb19leHQsIHBzVGRtYUNhc2U9MDsKCXU0Qnl0ZQkJCQl1NF90bXBbNF07CglCT09MRUFOCQkJCXJvYW09ZmFsc2UsIHNjYW49ZmFsc2UsIGxpbms9ZmFsc2UsIHdpZmlfdW5kZXI1Zz1mYWxzZTsKCUJPT0xFQU4JCQkJYnRfaHNfb249ZmFsc2UsIHdpZmlfYnVzeT1mYWxzZTsKCXM0Qnl0ZQkJCQl3aWZpX3Jzc2k9MCwgYnRfaHNfcnNzaT0wOwoJdTRCeXRlCQkJCXdpZmlfYncsIHdpZmlUcmFmZmljRGlyOwoJdTFCeXRlCQkJCXdpZmlEb3QxMUNobmwsIHdpZmlIc0Nobmw7CgoJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuID09PT09PT09PT09PVtCVCBDb2V4aXN0IGluZm9dPT09PT09PT09PT09Iik7CglDTF9QUklOVEYoY2xpX2J1Zik7CgoJaWYoYnRjb2V4aXN0LT5tYW51YWxfY29udHJvbCkKCXsKCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gPT09PT09PT09PT09W1VuZGVyIE1hbnVhbCBDb250cm9sXT09PT09PT09PT09PSIpOwoJCUNMX1BSSU5URihjbGlfYnVmKTsKCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CgkJQ0xfUFJJTlRGKGNsaV9idWYpOwoJfQoJaWYoYnRjb2V4aXN0LT5zdG9wX2NvZXhfZG0pCgl7CgkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuID09PT09PT09PT09PVtDb2V4IGlzIFNUT1BQRURdPT09PT09PT09PT09Iik7CgkJQ0xfUFJJTlRGKGNsaV9idWYpOwoJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKCQlDTF9QUklOVEYoY2xpX2J1Zik7Cgl9CgoJaWYoIWJvYXJkX2luZm8tPmJCdEV4aXN0KQoJewoJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiBCVCBub3QgZXhpc3RzICEhISIpOwoJCUNMX1BSSU5URihjbGlfYnVmKTsKCQlyZXR1cm47Cgl9CgoJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkICIsICJBbnQgUEcgbnVtYmVyLyBBbnQgbWVjaGFuaXNtOiIsIFwKCQlib2FyZF9pbmZvLT5wZ0FudE51bSwgYm9hcmRfaW5mby0+YnRkbUFudE51bSk7CglDTF9QUklOVEYoY2xpX2J1Zik7CQoJCglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcyAvICVkIiwgIkJUIHN0YWNrLyBoY2kgZXh0IHZlciIsIFwKCQkoKHN0YWNrX2luZm8tPmJQcm9maWxlTm90aWZpZWQpPyAiWWVzIjoiTm8iKSwgc3RhY2tfaW5mby0+aGNpVmVyc2lvbik7CglDTF9QUklOVEYoY2xpX2J1Zik7CglidGNvZXhpc3QtPmJ0Y19kaXNwX2RiZ19tc2coYnRjb2V4aXN0LCBCVENfREJHX0RJU1BfQlRfRldfVkVSKTsKCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJ0X2hzX29uKTsKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfVTFfV0lGSV9ET1QxMV9DSE5MLCAmd2lmaURvdDExQ2hubCk7CglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1UxX1dJRklfSFNfQ0hOTCwgJndpZmlIc0NobmwpOwoJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgLyAlZCglZCkiLCAiRG90MTEgY2hhbm5lbCAvIEhzQ2hubChIc01vZGUpIiwgXAoJCXdpZmlEb3QxMUNobmwsIHdpZmlIc0NobmwsIGJ0X2hzX29uKTsKCUNMX1BSSU5URihjbGlfYnVmKTsKCglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlMDJ4ICUwMnggJTAyeCAiLCAiSDJDIFdpZmkgaW5mb3JtIGJ0IGNobmwgSW5mbyIsIFwKCQljb2V4X2RtLT53aWZpX2NobmxfaW5mb1swXSwgY29leF9kbS0+d2lmaV9jaG5sX2luZm9bMV0sCgkJY29leF9kbS0+d2lmaV9jaG5sX2luZm9bMl0pOwoJQ0xfUFJJTlRGKGNsaV9idWYpOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfUzRfV0lGSV9SU1NJLCAmd2lmaV9yc3NpKTsKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfUzRfSFNfUlNTSSwgJmJ0X2hzX3Jzc2kpOwoJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkIiwgIldpZmkgcnNzaS8gSFMgcnNzaSIsIFwKCQl3aWZpX3Jzc2ksIGJ0X2hzX3Jzc2kpOwoJQ0xfUFJJTlRGKGNsaV9idWYpOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9TQ0FOLCAmc2Nhbik7CglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfTElOSywgJmxpbmspOwoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1JPQU0sICZyb2FtKTsKCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZC8gJWQgIiwgIldpZmkgbGluay8gcm9hbS8gc2NhbiIsIFwKCQlsaW5rLCByb2FtLCBzY2FuKTsKCUNMX1BSSU5URihjbGlfYnVmKTsKCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfVU5ERVJfNUcsICZ3aWZpX3VuZGVyNWcpOwoJYnRjb2V4aXN0LT5idGNfZ2V0KGJ0Y29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaV9idyk7CglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQlVTWSwgJndpZmlfYnVzeSk7CglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfVFJBRkZJQ19ESVJFQ1RJT04sICZ3aWZpVHJhZmZpY0Rpcik7CglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcyAvICVzLyAlcyAiLCAiV2lmaSBzdGF0dXMiLCBcCgkJKHdpZmlfdW5kZXI1Zz8gIjVHIjoiMi40RyIpLAoJCSgoQlRDX1dJRklfQldfTEVHQUNZPT13aWZpX2J3KT8gIkxlZ2FjeSI6ICgoKEJUQ19XSUZJX0JXX0hUNDA9PXdpZmlfYncpPyAiSFQ0MCI6IkhUMjAiKSkpLAoJCSgoIXdpZmlfYnVzeSk/ICJpZGxlIjogKChCVENfV0lGSV9UUkFGRklDX1RYPT13aWZpVHJhZmZpY0Rpcik/ICJ1cGxpbmsiOiJkb3dubGluayIpKSk7CglDTF9QUklOVEYoY2xpX2J1Zik7CglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSBbJXMvICVkLyAlZF0gIiwgIkJUIFtzdGF0dXMvIHJzc2kvIHJldHJ5Q250XSIsIFwKCQkoKGNvZXhfc3RhLT5jMmhfYnRfaW5xdWlyeV9wYWdlKT8oImlucXVpcnkvcGFnZSBzY2FuIik6KChCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEUgPT0gY29leF9kbS0+YnRfc3RhdHVzKT8gIm5vbi1jb25uZWN0ZWQgaWRsZSI6CgkJKCAgKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09IGNvZXhfZG0tPmJ0X3N0YXR1cyk/ICJjb25uZWN0ZWQtaWRsZSI6ImJ1c3kiKSkpLAoJCWNvZXhfc3RhLT5idF9yc3NpLCBjb2V4X3N0YS0+YnRfcmV0cnlfY250KTsKCUNMX1BSSU5URihjbGlfYnVmKTsKCQoJaWYoc3RhY2tfaW5mby0+YlByb2ZpbGVOb3RpZmllZCkKCXsJCQkKCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAvICVkIC8gJWQgLyAlZCIsICJTQ08vSElEL1BBTi9BMkRQIiwgXAoJCQlzdGFja19pbmZvLT5zY29fZXhpc3QsIHN0YWNrX2luZm8tPmhpZF9leGlzdCwgc3RhY2tfaW5mby0+cGFuX2V4aXN0LCBzdGFja19pbmZvLT5hMmRwX2V4aXN0KTsKCQlDTF9QUklOVEYoY2xpX2J1Zik7CQoKCQlidGNvZXhpc3QtPmJ0Y19kaXNwX2RiZ19tc2coYnRjb2V4aXN0LCBCVENfREJHX0RJU1BfQlRfTElOS19JTkZPKTsKCX0KCglidF9pbmZvX2V4dCA9IGNvZXhfc3RhLT5idF9pbmZvX2V4dDsKCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzIiwgIkJUIEluZm8gQTJEUCByYXRlIiwgXAoJCShidF9pbmZvX2V4dCZCSVQwKT8gIkJhc2ljIHJhdGUiOiJFRFIgcmF0ZSIpOwoJQ0xfUFJJTlRGKGNsaV9idWYpOwkKCglmb3IoaT0wOyBpPEJUX0lORk9fU1JDXzg4MTJBXzFBTlRfTUFYOyBpKyspCgl7CgkJaWYoY29leF9zdGEtPmJ0X2luZm9fYzJoX2NudFtpXSkKCQl7CQkJCQoJCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4KCVkKSIsIEdMQnRJbmZvU3JjODgxMmExQW50W2ldLCBcCgkJCQljb2V4X3N0YS0+YnRfaW5mb19jMmhbaV1bMF0sIGNvZXhfc3RhLT5idF9pbmZvX2MyaFtpXVsxXSwKCQkJCWNvZXhfc3RhLT5idF9pbmZvX2MyaFtpXVsyXSwgY29leF9zdGEtPmJ0X2luZm9fYzJoW2ldWzNdLAoJCQkJY29leF9zdGEtPmJ0X2luZm9fYzJoW2ldWzRdLCBjb2V4X3N0YS0+YnRfaW5mb19jMmhbaV1bNV0sCgkJCQljb2V4X3N0YS0+YnRfaW5mb19jMmhbaV1bNl0sIGNvZXhfc3RhLT5idF9pbmZvX2MyaF9jbnRbaV0pOwoJCQlDTF9QUklOVEYoY2xpX2J1Zik7CgkJfQoJfQoJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMvJXMsICgweCV4LzB4JXgpIiwgIlBTIHN0YXRlLCBJUFMvTFBTLCAobHBzL3Jwd20pIiwgXAoJCSgoY29leF9zdGEtPnVuZGVyX2lwcz8gIklQUyBPTiI6IklQUyBPRkYiKSksCgkJKChjb2V4X3N0YS0+dW5kZXJfbHBzPyAiTFBTIE9OIjoiTFBTIE9GRiIpKSwgCgkJYnRjb2V4aXN0LT5idF9pbmZvLmxwczFBbnQsIAoJCWJ0Y29leGlzdC0+YnRfaW5mby5ycHdtMUFudCk7CglDTF9QUklOVEYoY2xpX2J1Zik7CglidGNvZXhpc3QtPmJ0Y19kaXNwX2RiZ19tc2coYnRjb2V4aXN0LCBCVENfREJHX0RJU1BfRldfUFdSX01PREVfQ01EKTsKCglpZighYnRjb2V4aXN0LT5tYW51YWxfY29udHJvbCkKCXsKCQkvLyBTdyBtZWNoYW5pc20JCgkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwgIj09PT09PT09PT09PVtTdyBtZWNoYW5pc21dPT09PT09PT09PT09Iik7CgkJQ0xfUFJJTlRGKGNsaV9idWYpOwoJCgkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkLyAlZC8gJWQgIiwgIlNNMVtTaFJmLyBMcFJBLyBMaW1EaWcvIGJ0TG5hXSIsIFwKCQkJY29leF9kbS0+Y3VyX3JmX3J4X2xwZl9zaHJpbmssIGNvZXhfZG0tPmN1cl9sb3dfcGVuYWx0eV9yYSwgY29leF9kbS0+bGltaXRlZF9kaWcsIGNvZXhfZG0tPmJDdXJCdExuYUNvbnN0cmFpbik7CgkJQ0xfUFJJTlRGKGNsaV9idWYpOwoJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZC8gJWQoMHgleCkgIiwgIlNNMltBZ2NULyBBZGNCLyBTd0RhY1N3aW5nKGx2bCldIiwgXAoJCQljb2V4X2RtLT5jdXJfYWdjX3RhYmxlX2VuLCBjb2V4X2RtLT5jdXJfYWRjX2JhY2tfb2ZmLCBjb2V4X2RtLT5jdXJfZGFjX3N3aW5nX29uLCBjb2V4X2RtLT5jdXJfZGFjX3N3aW5nX2x2bCk7CgkJQ0xfUFJJTlRGKGNsaV9idWYpOwoJCgkJLy8gRncgbWVjaGFuaXNtCQkKCQlDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiPT09PT09PT09PT09W0Z3IG1lY2hhbmlzbV09PT09PT09PT09PT0iKTsKCQlDTF9QUklOVEYoY2xpX2J1Zik7CQoKCQlwc1RkbWFDYXNlID0gY29leF9kbS0+Y3VyX3BzX3RkbWE7CgkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IGNhc2UtJWQiLCAiUFMgVERNQSIsIFwKCQkJY29leF9kbS0+cHNfdGRtYV9wYXJhWzBdLCBjb2V4X2RtLT5wc190ZG1hX3BhcmFbMV0sCgkJCWNvZXhfZG0tPnBzX3RkbWFfcGFyYVsyXSwgY29leF9kbS0+cHNfdGRtYV9wYXJhWzNdLAoJCQljb2V4X2RtLT5wc190ZG1hX3BhcmFbNF0sIHBzVGRtYUNhc2UpOwoJCUNMX1BSSU5URihjbGlfYnVmKTsKCgkJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCAiLCAiTGF0ZXN0IGVycm9yIGNvbmRpdGlvbihzaG91bGQgYmUgMCkiLCBcCgkJCWNvZXhfZG0tPmVycm9yX2NvbmRpdGlvbik7CgkJQ0xfUFJJTlRGKGNsaV9idWYpOwoJCQoJCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCAiLCAiRGVjQnRQd3IvIElnbldsYW5BY3QiLCBcCgkJCWNvZXhfZG0tPmN1cl9kZWNfYnRfcHdyLCBjb2V4X2RtLT5jdXJfaWdub3JlX3dsYW5fYWN0KTsKCQlDTF9QUklOVEYoY2xpX2J1Zik7Cgl9CgoJLy8gSHcgc2V0dGluZwkJCglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiPT09PT09PT09PT09W0h3IHNldHRpbmddPT09PT09PT09PT09Iik7CglDTF9QUklOVEYoY2xpX2J1Zik7CQoKCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiUkYtQSwgMHgxZSBpbml0VmFsIiwgXAoJCWNvZXhfZG0tPmJ0X3JmMHgxZV9iYWNrdXApOwoJQ0xfUFJJTlRGKGNsaV9idWYpOwoKCXUxX3RtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDc3OCk7CglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4IiwgIjB4Nzc4IiwgXAoJCXUxX3RtcFswXSk7CglDTF9QUklOVEYoY2xpX2J1Zik7CgkKCXUxX3RtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDkyYyk7Cgl1NF90bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg5MzApOwoJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleCIsICIweDkyYy8gMHg5MzAiLCBcCgkJKHUxX3RtcFswXSksIHU0X3RtcFswXSk7CglDTF9QUklOVEYoY2xpX2J1Zik7CgoJdTFfdG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NDApOwoJdTFfdG1wWzFdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NGYpOwoJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleCIsICIweDQwLyAweDRmIiwgXAoJCXUxX3RtcFswXSwgdTFfdG1wWzFdKTsKCUNMX1BSSU5URihjbGlfYnVmKTsKCgl1NF90bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg1NTApOwoJdTFfdG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShidGNvZXhpc3QsIDB4NTIyKTsKCUNMX1NQUklOVEYoY2xpX2J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgiLCAiMHg1NTAoYmNuIGN0cmwpLzB4NTIyIiwgXAoJCXU0X3RtcFswXSwgdTFfdG1wWzBdKTsKCUNMX1BSSU5URihjbGlfYnVmKTsKCgl1NF90bXBbMF0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHhjNTApOwoJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweGM1MChkaWcpIiwgXAoJCXU0X3RtcFswXSk7CglDTF9QUklOVEYoY2xpX2J1Zik7CgojaWYgMAoJdTRfdG1wWzBdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4ZjQ4KTsKCXU0X3RtcFsxXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweGY0Yyk7CglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4IiwgIjB4ZjQ4LyAweGY0YyAoRkEgY250KSIsIFwKCQl1NF90bXBbMF0sIHU0X3RtcFsxXSk7CglDTF9QUklOVEYoY2xpX2J1Zik7CiNlbmRpZgoKCXU0X3RtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfNGJ5dGUoYnRjb2V4aXN0LCAweDZjMCk7Cgl1NF90bXBbMV0gPSBidGNvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKGJ0Y29leGlzdCwgMHg2YzQpOwoJdTRfdG1wWzJdID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4NmM4KTsKCXUxX3RtcFswXSA9IGJ0Y29leGlzdC0+YnRjX3JlYWRfMWJ5dGUoYnRjb2V4aXN0LCAweDZjYyk7CglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4LyAweCV4LyAweCV4IiwgIjB4NmMwLzB4NmM0LzB4NmM4LzB4NmNjKGNvZXhUYWJsZSkiLCBcCgkJdTRfdG1wWzBdLCB1NF90bXBbMV0sIHU0X3RtcFsyXSwgdTFfdG1wWzBdKTsKCUNMX1BSSU5URihjbGlfYnVmKTsKCglDTF9TUFJJTlRGKGNsaV9idWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQiLCAiMHg3NzAoaHAgcnhbMzE6MTZdL3R4WzE1OjBdKSIsIFwKCQljb2V4X3N0YS0+aGlnaF9wcmlvcml0eV9yeCwgY29leF9zdGEtPmhpZ2hfcHJpb3JpdHlfdHgpOwoJQ0xfUFJJTlRGKGNsaV9idWYpOwoJQ0xfU1BSSU5URihjbGlfYnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkIiwgIjB4Nzc0KGxwIHJ4WzMxOjE2XS90eFsxNTowXSkiLCBcCgkJY29leF9zdGEtPmxvd19wcmlvcml0eV9yeCwgY29leF9zdGEtPmxvd19wcmlvcml0eV90eCk7CglDTF9QUklOVEYoY2xpX2J1Zik7CgkKCWJ0Y29leGlzdC0+YnRjX2Rpc3BfZGJnX21zZyhidGNvZXhpc3QsIEJUQ19EQkdfRElTUF9DT0VYX1NUQVRJU1RJQ1MpOwp9CgoKdm9pZApFWGhhbGJ0Yzg4MTJhMWFudF9JcHNOb3RpZnkoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAl1MUJ5dGUJCQl0eXBlCgkpCnsKCXU0Qnl0ZQl1NF90bXA9MDsKCglpZihidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sIHx8CWJ0Y29leGlzdC0+c3RvcF9jb2V4X2RtKQoJCXJldHVybjsKCglpZihCVENfSVBTX0VOVEVSID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgSVBTIEVOVEVSIG5vdGlmeVxuIikpOwoJCWNvZXhfc3RhLT51bmRlcl9pcHMgPSB0cnVlOwoKCQkvLyAweDRjWzIzXT0xCgkJdTRfdG1wID0gYnRjb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShidGNvZXhpc3QsIDB4NGMpOwoJCXU0X3RtcCB8PSBCSVQyMzsKCQlidGNvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShidGNvZXhpc3QsIDB4NGMsIHU0X3RtcCk7CgkJCgkJaGFsYnRjODgxMmExYW50X0NvZXhBbGxPZmYoYnRjb2V4aXN0KTsKCX0KCWVsc2UgaWYoQlRDX0lQU19MRUFWRSA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIElQUyBMRUFWRSBub3RpZnlcbiIpKTsKCQljb2V4X3N0YS0+dW5kZXJfaXBzID0gZmFsc2U7CgkJLy9oYWxidGM4ODEyYTFhbnRfSW5pdENvZXhEbShidGNvZXhpc3QpOwoJfQp9Cgp2b2lkCkVYaGFsYnRjODgxMmExYW50X0xwc05vdGlmeSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCXUxQnl0ZQkJCXR5cGUKCSkKewoJaWYoYnRjb2V4aXN0LT5tYW51YWxfY29udHJvbCB8fCBidGNvZXhpc3QtPnN0b3BfY29leF9kbSkKCQlyZXR1cm47CgoJaWYoQlRDX0xQU19FTkFCTEUgPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBMUFMgRU5BQkxFIG5vdGlmeVxuIikpOwoJCWNvZXhfc3RhLT51bmRlcl9scHMgPSB0cnVlOwoJfQoJZWxzZSBpZihCVENfSVBTX0xFQVZFID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgTFBTIERJU0FCTEUgbm90aWZ5XG4iKSk7CgkJY29leF9zdGEtPnVuZGVyX2xwcyA9IGZhbHNlOwoJfQp9Cgp2b2lkCkVYaGFsYnRjODgxMmExYW50X1NjYW5Ob3RpZnkoCgkgCVBCVENfQ09FWElTVAkJYnRjb2V4aXN0LAoJIAl1MUJ5dGUJCQl0eXBlCgkpCnsKCVBCVENfU1RBQ0tfSU5GTyAJc3RhY2tfaW5mbz0mYnRjb2V4aXN0LT5zdGFja19pbmZvOwoJQk9PTEVBTiAJCXdpZmlfY29ubmVjdGVkPWZhbHNlOwkKCglpZihidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sIHx8YnRjb2V4aXN0LT5zdG9wX2NvZXhfZG0pCgkJcmV0dXJuOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZ3aWZpX2Nvbm5lY3RlZCk7CglpZihCVENfU0NBTl9TVEFSVCA9PSB0eXBlKQoJewkKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBTQ0FOIFNUQVJUIG5vdGlmeVxuIikpOwoJCWlmKCF3aWZpX2Nvbm5lY3RlZCkJLy8gbm9uLWNvbm5lY3RlZCBzY2FuCgkJewoJCQkvL3NldCAweDU1MFszXT0xIGJlZm9yZSBQc1RkbWEKCQkJLy9oYWxidGM4ODEyYTFhbnRfUmVnMHg1NTBCaXQzKGJ0Y29leGlzdCwgdHJ1ZSk7CgkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpTm90Q29ubmVjdGVkQXNzb0F1dGhTY2FuKGJ0Y29leGlzdCk7CgkJfQoJCWVsc2UJLy8gd2lmaSBpcyBjb25uZWN0ZWQKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkU2NhbihidGNvZXhpc3QpOwoJCX0KCX0KCWVsc2UgaWYoQlRDX1NDQU5fRklOSVNIID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgU0NBTiBGSU5JU0ggbm90aWZ5XG4iKSk7CgkJaWYoIXdpZmlfY29ubmVjdGVkKQkvLyBub24tY29ubmVjdGVkIHNjYW4KCQl7CgkJCS8vaGFsYnRjODgxMmExYW50X1JlZzB4NTUwQml0MyhidGNvZXhpc3QsIGZhbHNlKTsKCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWQoYnRjb2V4aXN0KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODgxMmExYW50X0FjdGlvbldpZmlDb25uZWN0ZWQoYnRjb2V4aXN0KTsKCQl9Cgl9Cn0KCnZvaWQKRVhoYWxidGM4ODEyYTFhbnRfQ29ubmVjdE5vdGlmeSgKCSAJUEJUQ19DT0VYSVNUCQlidGNvZXhpc3QsCgkgCXUxQnl0ZQkJCXR5cGUKCSkKewoJUEJUQ19TVEFDS19JTkZPIAlzdGFja19pbmZvPSZidGNvZXhpc3QtPnN0YWNrX2luZm87CglCT09MRUFOCQkJd2lmaV9jb25uZWN0ZWQ9ZmFsc2U7CQoKCWlmKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wgfHxidGNvZXhpc3QtPnN0b3BfY29leF9kbSkKCQlyZXR1cm47CgoJaWYoQlRDX0FTU09DSUFURV9TVEFSVCA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIENPTk5FQ1QgU1RBUlQgbm90aWZ5XG4iKSk7CgkJaWYoYnRjb2V4aXN0LT5idF9pbmZvLmJ0X2Rpc2FibGVkKQoJCXsJCQkKCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCBmYWxzZSk7CgkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0xFQVZFX0xQUywgTlVMTCk7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDkpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZEFzc29BdXRoU2NhbihidGNvZXhpc3QpOwoJCX0KCX0KCWVsc2UgaWYoQlRDX0FTU09DSUFURV9GSU5JU0ggPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBDT05ORUNUIEZJTklTSCBub3RpZnlcbiIpKTsKCQkKCQlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmd2lmaV9jb25uZWN0ZWQpOwoJCWlmKCF3aWZpX2Nvbm5lY3RlZCkgLy8gbm9uLWNvbm5lY3RlZCBzY2FuCgkJewoJCQkvL2hhbGJ0Yzg4MTJhMWFudF9SZWcweDU1MEJpdDMoYnRjb2V4aXN0LCBmYWxzZSk7CgkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpTm90Q29ubmVjdGVkKGJ0Y29leGlzdCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg4MTJhMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkKGJ0Y29leGlzdCk7CgkJfQoJfQp9Cgp2b2lkCkVYaGFsYnRjODgxMmExYW50X01lZGlhU3RhdHVzTm90aWZ5KAoJIAlQQlRDX0NPRVhJU1QJCQlidGNvZXhpc3QsCgkgCXUxQnl0ZQkJCQl0eXBlCgkpCnsKCXUxQnl0ZQkJCWRhdGFMZW49NTsKCXUxQnl0ZQkJCWJ1Zls2XSA9IHswfTsKCXUxQnl0ZQkJCWgyY19wYXJhbWV0ZXJbM10gPXswfTsKCUJPT0xFQU4JCQl3aWZpX3VuZGVyNWc9ZmFsc2U7Cgl1NEJ5dGUJCQl3aWZpX2J3OwoJdTFCeXRlCQkJd2lmaV9jZW50cmFsX2Nobmw7CgoJaWYoYnRjb2V4aXN0LT5tYW51YWxfY29udHJvbCB8fGJ0Y29leGlzdC0+c3RvcF9jb2V4X2RtKQoJCXJldHVybjsKCglidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfVU5ERVJfNUcsICZ3aWZpX3VuZGVyNWcpOwoKCS8vIG9ubHkgMi40RyB3ZSBuZWVkIHRvIGluZm9ybSBidCB0aGUgY2hubCBtYXNrCglpZighd2lmaV91bmRlcjVnKQoJewoJCWlmKEJUQ19NRURJQV9DT05ORUNUID09IHR5cGUpCgkJewoJCQloMmNfcGFyYW1ldGVyWzBdID0gMHgxOwoJCX0KCQlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpX2J3KTsKCQlidGNvZXhpc3QtPmJ0Y19nZXQoYnRjb2V4aXN0LCBCVENfR0VUX1UxX1dJRklfQ0VOVFJBTF9DSE5MLCAmd2lmaV9jZW50cmFsX2NobmwpOwoJCWgyY19wYXJhbWV0ZXJbMV0gPSB3aWZpX2NlbnRyYWxfY2hubDsKCQlpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlfYncpCgkJCWgyY19wYXJhbWV0ZXJbMl0gPSAweDMwOwoJCWVsc2UKCQkJaDJjX3BhcmFtZXRlclsyXSA9IDB4MjA7Cgl9CgkJCgljb2V4X2RtLT53aWZpX2NobmxfaW5mb1swXSA9IGgyY19wYXJhbWV0ZXJbMF07Cgljb2V4X2RtLT53aWZpX2NobmxfaW5mb1sxXSA9IGgyY19wYXJhbWV0ZXJbMV07Cgljb2V4X2RtLT53aWZpX2NobmxfaW5mb1syXSA9IGgyY19wYXJhbWV0ZXJbMl07CgkKCWJ1ZlswXSA9IGRhdGFMZW47CglidWZbMV0gPSAweDU7CQkJCS8vIE9QX0NvZGUKCWJ1ZlsyXSA9IDB4MzsJCQkJLy8gT1BfQ29kZV9MZW5ndGgKCWJ1ZlszXSA9IGgyY19wYXJhbWV0ZXJbMF07IAkvLyBPUF9Db2RlX0NvbnRlbnQKCWJ1Zls0XSA9IGgyY19wYXJhbWV0ZXJbMV07CglidWZbNV0gPSBoMmNfcGFyYW1ldGVyWzJdOwoJCQoJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfQ1RSTF9CVF9DT0VYLCAoUFZPSUQpJmJ1ZlswXSk7CQkKfQoKdm9pZApFWGhhbGJ0Yzg4MTJhMWFudF9TcGVjaWFsUGFja2V0Tm90aWZ5KAoJIAlQQlRDX0NPRVhJU1QJCQlidGNvZXhpc3QsCgkgCXUxQnl0ZQkJCQl0eXBlCgkpCnsKCUJPT0xFQU4gCWJTZWN1cml0eUxpbms9ZmFsc2U7CgoJaWYoYnRjb2V4aXN0LT5tYW51YWxfY29udHJvbCB8fGJ0Y29leGlzdC0+c3RvcF9jb2V4X2RtKQoJCXJldHVybjsKCgkvL2lmKHR5cGUgPT0gQlRDX1BBQ0tFVF9ESENQKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIHNwZWNpYWwgUGFja2V0KCVkKSBub3RpZnlcbiIsIHR5cGUpKTsKCQlpZihidGNvZXhpc3QtPmJ0X2luZm8uYnRfZGlzYWJsZWQpCgkJewoJCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIGZhbHNlKTsKCQkJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYShidGNvZXhpc3QsIE5PUk1BTF9FWEVDLCBmYWxzZSwgOSk7CQoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4ODEyYTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZFNwZWNpYWxQYWNrZXQoYnRjb2V4aXN0KTsKCQl9Cgl9Cn0KCnZvaWQKRVhoYWxidGM4ODEyYTFhbnRfQnRJbmZvTm90aWZ5KAoJIAlQQlRDX0NPRVhJU1QJCWJ0Y29leGlzdCwKCSAJcHUxQnl0ZQkJCXRtcF9idWYsCgkgCXUxQnl0ZQkJCWxlbmd0aAoJKQp7Cgl1MUJ5dGUJCQlidF9pbmZvPTA7Cgl1MUJ5dGUJCQlpLCByc3Bfc291cmNlPTA7CglzdGF0aWMgdTRCeXRlCQlzZXRfYnRfbG5hX2NudD0wLCBzZXRfYnRfcHNkX21vZGU9MDsKCUJPT0xFQU4JCQlidF9idXN5PWZhbHNlLCBsaW1pdGVkX2RpZz1mYWxzZTsKCUJPT0xFQU4JCQl3aWZpX2Nvbm5lY3RlZD1mYWxzZTsKCUJPT0xFQU4JCQliUmVqQXBBZ2dQa3Q9ZmFsc2U7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKT09PT5cbiIpKTsKCgoJcnNwX3NvdXJjZSA9IHRtcF9idWZbMF0mMHhmOwoJaWYocnNwX3NvdXJjZSA+PSBCVF9JTkZPX1NSQ184ODEyQV8xQU5UX01BWCkKCQlyc3Bfc291cmNlID0gQlRfSU5GT19TUkNfODgxMkFfMUFOVF9XSUZJX0ZXOwoJY29leF9zdGEtPmJ0X2luZm9fYzJoX2NudFtyc3Bfc291cmNlXSsrOwoKCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIEJ0IGluZm9bJWRdLCBsZW5ndGg9JWQsIGhleCBkYXRhPVsiLCByc3Bfc291cmNlLCBsZW5ndGgpKTsKCWZvcihpPTA7IGk8bGVuZ3RoOyBpKyspCgl7CgkJY29leF9zdGEtPmJ0X2luZm9fYzJoW3JzcF9zb3VyY2VdW2ldID0gdG1wX2J1ZltpXTsKCQlpZihpID09IDEpCgkJCWJ0X2luZm8gPSB0bXBfYnVmW2ldOwoJCWlmKGkgPT0gbGVuZ3RoLTEpCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIjB4JTJ4XVxuIiwgdG1wX2J1ZltpXSkpOwoJCX0KCQllbHNlCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIjB4JTJ4LCAiLCB0bXBfYnVmW2ldKSk7CgkJfQoJfQoKCWlmKGJ0Y29leGlzdC0+bWFudWFsX2NvbnRyb2wpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgcmV0dXJuIGZvciBNYW51YWwgQ1RSTDw9PT1cbiIpKTsKCQlyZXR1cm47Cgl9CglpZihidGNvZXhpc3QtPnN0b3BfY29leF9kbSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCByZXR1cm4gZm9yIENvZXggU1RPUFBFRCEhPD09PVxuIikpOwoJCXJldHVybjsKCX0KCglpZihCVF9JTkZPX1NSQ184ODEyQV8xQU5UX1dJRklfRlcgIT0gcnNwX3NvdXJjZSkKCXsKCQljb2V4X3N0YS0+YnRfcmV0cnlfY250ID0KCQkJY29leF9zdGEtPmJ0X2luZm9fYzJoW3JzcF9zb3VyY2VdWzJdOwoKCQljb2V4X3N0YS0+YnRfcnNzaSA9CgkJCWNvZXhfc3RhLT5idF9pbmZvX2MyaFtyc3Bfc291cmNlXVszXSoyKzEwOwoKCQljb2V4X3N0YS0+YnRfaW5mb19leHQgPSAKCQkJY29leF9zdGEtPmJ0X2luZm9fYzJoW3JzcF9zb3VyY2VdWzRdOwoKCQkvLyBIZXJlIHdlIG5lZWQgdG8gcmVzZW5kIHNvbWUgd2lmaSBpbmZvIHRvIEJUCgkJLy8gYmVjYXVzZSBidCBpcyByZXNldCBhbmQgbG9zcyBvZiB0aGUgaW5mby4KCQlpZiggKGNvZXhfc3RhLT5idF9pbmZvX2V4dCAmIEJJVDEpICkKCQl7CQkJCgkJCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZ3aWZpX2Nvbm5lY3RlZCk7CgkJCWlmKHdpZmlfY29ubmVjdGVkKQoJCQl7CgkJCQlFWGhhbGJ0Yzg4MTJhMWFudF9NZWRpYVN0YXR1c05vdGlmeShidGNvZXhpc3QsIEJUQ19NRURJQV9DT05ORUNUKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCUVYaGFsYnRjODgxMmExYW50X01lZGlhU3RhdHVzTm90aWZ5KGJ0Y29leGlzdCwgQlRDX01FRElBX0RJU0NPTk5FQ1QpOwoJCQl9CgoJCQlzZXRfYnRfcHNkX21vZGUgPSAwOwoJCX0KCgkJLy8gdGVzdC1jaGlwIGJ0IHBhdGNoIGRvZXNuJ3Qgc3VwcG9ydCwgdGVtcG9yYXJ5IHJlbW92ZS4KCQkvLyBuZWVkIHRvIGFkZCBiYWNrIHdoZW4gbXAtY2hpcC4gMTIvMjAvMjAxMgojaWYgMAkJCgkJaWYoc2V0X2J0X3BzZF9tb2RlIDw9IDMpCgkJew0KCQkJaGFsYnRjODgxMmExYW50X1NldEJ0UHNkTW9kZShidGNvZXhpc3QsIEZPUkNFX0VYRUMsIDB4ZCk7CgkJCXNldF9idF9wc2RfbW9kZSsrOwoJCX0KCQkKCQlpZihjb2V4X2RtLT5iQ3VyQnRMbmFDb25zdHJhaW4pCgkJewoJCQlpZiggKGNvZXhfc3RhLT5idF9pbmZvX2V4dCAmIEJJVDIpICkKCQkJewoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaWYoc2V0X2J0X2xuYV9jbnQgPD0gMykKCQkJCXsKCQkJCQloYWxidGM4ODEyYTFhbnRfU2V0QnRMbmFDb25zdHJhaW4oYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCB0cnVlKTsKCQkJCQlzZXRfYnRfbG5hX2NudCsrOwoJCQkJfQoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCXNldF9idF9sbmFfY250ID0gMDsKCQl9CiNlbmRpZgoJCS8vIHRlc3QtY2hpcCBidCBwYXRjaCBvbmx5IHJzcCB0aGUgc3RhdHVzIGZvciBCVF9SU1AsIAoJCS8vIHNvIHRlbXBvcmFyeSB3ZSBjb25zaWRlciB0aGUgZm9sbG93aW5nIG9ubHkgdW5kZXIgQlRfUlNQCgkJaWYoQlRfSU5GT19TUkNfODgxMkFfMUFOVF9CVF9SU1AgPT0gcnNwX3NvdXJjZSkKCQl7CgkJCWlmKCAoY29leF9zdGEtPmJ0X2luZm9fZXh0ICYgQklUMykgKQoJCQl7CgkJCSNpZiAwLy8gdGVtcCBkaXNhYmxlIGJlY2F1c2UgYnQgcGF0Y2ggcmVwb3J0IHRoZSB3cm9uZyB2YWx1ZS4KCQkJCWhhbGJ0Yzg4MTJhMWFudF9JZ25vcmVXbGFuQWN0KGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgZmFsc2UpOwoJCQkjZW5kaWYKCQkJfQoJCQllbHNlCgkJCXsKCQkJCS8vIEJUIGFscmVhZHkgTk9UIGlnbm9yZSBXbGFuIGFjdGl2ZSwgZG8gbm90aGluZyBoZXJlLgoJCQl9CgoJCQlpZiggKGNvZXhfc3RhLT5idF9pbmZvX2V4dCAmIEJJVDQpICkKCQkJewoJCQkJLy8gQlQgYXV0byByZXBvcnQgYWxyZWFkeSBlbmFibGVkLCBkbyBub3RoaW5nCgkJCX0KCQkJZWxzZQoJCQl7CgkJCQloYWxidGM4ODEyYTFhbnRfQnRBdXRvUmVwb3J0KGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgdHJ1ZSk7CgkJCX0KCQl9Cgl9CgkJCgkvLyBjaGVjayBCSVQyIGZpcnN0ID09PiBjaGVjayBpZiBidCBpcyB1bmRlciBpbnF1aXJ5IG9yIHBhZ2Ugc2NhbgoJaWYoYnRfaW5mbyAmIEJUX0lORk9fODgxMkFfMUFOVF9CX0lOUV9QQUdFKQoJewoJCWNvZXhfc3RhLT5jMmhfYnRfaW5xdWlyeV9wYWdlID0gdHJ1ZTsKCQljb2V4X2RtLT5idF9zdGF0dXMgPSBCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19JTlFfUEFHRTsKCX0KCWVsc2UKCXsKCQljb2V4X3N0YS0+YzJoX2J0X2lucXVpcnlfcGFnZSA9IGZhbHNlOwoJCWlmKCEoYnRfaW5mbyZCVF9JTkZPXzg4MTJBXzFBTlRfQl9DT05ORUNUSU9OKSkKCQl7CgkJCWNvZXhfZG0tPmJ0X3N0YXR1cyA9IEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRTsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgYnQgbm9uLWNvbm5lY3RlZCBpZGxlISEhXG4iKSk7CgkJfQoJCWVsc2UgaWYoYnRfaW5mbyA9PSBCVF9JTkZPXzg4MTJBXzFBTlRfQl9DT05ORUNUSU9OKQkvLyBjb25uZWN0aW9uIGV4aXN0cyBidXQgbm8gYnVzeQoJCXsKCQkJY29leF9kbS0+YnRfc3RhdHVzID0gQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEU7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIGJ0IGNvbm5lY3RlZC1pZGxlISEhXG4iKSk7CgkJfQkJCgkJZWxzZSBpZigoYnRfaW5mbyZCVF9JTkZPXzg4MTJBXzFBTlRfQl9TQ09fRVNDTykgfHwKCQkJKGJ0X2luZm8mQlRfSU5GT184ODEyQV8xQU5UX0JfU0NPX0JVU1kpKQoJCXsKCQkJY29leF9kbS0+YnRfc3RhdHVzID0gQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfU0NPX0JVU1k7CgkJCWJSZWpBcEFnZ1BrdCA9IHRydWU7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIGJ0IHNjbyBidXN5ISEhXG4iKSk7CgkJfQoJCWVsc2UgaWYoYnRfaW5mbyZCVF9JTkZPXzg4MTJBXzFBTlRfQl9BQ0xfQlVTWSkKCQl7CgkJCWlmKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZICE9IGNvZXhfZG0tPmJ0X3N0YXR1cykKCQkJCWNvZXhfZG0tPnJlc2V0X3RkbWFfYWRqdXN0ID0gdHJ1ZTsKCQkJY29leF9kbS0+YnRfc3RhdHVzID0gQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1k7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIGJ0IGFjbCBidXN5ISEhXG4iKSk7CgkJfQojaWYgMAoJCWVsc2UgaWYoYnRfaW5mbyZCVF9JTkZPXzg4MTJBXzFBTlRfQl9TQ09fRVNDTykKCQl7CgkJCWNvZXhfZG0tPmJ0X3N0YXR1cyA9IEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0FDTF9TQ09fQlVTWTsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgYnQgYWNsL3NjbyBidXN5ISEhXG4iKSk7CgkJfQojZW5kaWYKCQllbHNlCgkJewoJCQkvL0RiZ1ByaW50KCJlcnJvciwgdW5kZWZpbmVkIGJ0X2luZm89MHgleFxuIiwgYnRfaW5mbyk7CgkJCWNvZXhfZG0tPmJ0X3N0YXR1cyA9IEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX01BWDsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgYnQgbm9uLWRlZmluZWQgc3RhdGUhISFcbiIpKTsKCQl9CgoJCS8vIHNlbmQgZGVsZXRlIEJBIHRvIGRpc2FibGUgYWdncmVnYXRpb24KCQkvL2J0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQkxfVE9fUkVKX0FQX0FHR19QS1QsICZiUmVqQXBBZ2dQa3QpOwoJfQoKCWlmKCAoQlRfODgxMkFfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gY29leF9kbS0+YnRfc3RhdHVzKSB8fAoJCShCVF84ODEyQV8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpIHx8CgkJKEJUXzg4MTJBXzFBTlRfQlRfU1RBVFVTX0FDTF9TQ09fQlVTWSA9PSBjb2V4X2RtLT5idF9zdGF0dXMpICkKCXsKCQlidF9idXN5ID0gdHJ1ZTsKCX0KCWVsc2UKCXsKCQlidF9idXN5ID0gZmFsc2U7Cgl9CglidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0JMX0JUX1RSQUZGSUNfQlVTWSwgJmJ0X2J1c3kpOwoKCWlmKGJ0X2J1c3kpCgl7CgkJbGltaXRlZF9kaWcgPSB0cnVlOwoJfQoJZWxzZQoJewoJCWxpbWl0ZWRfZGlnID0gZmFsc2U7Cgl9Cgljb2V4X2RtLT5saW1pdGVkX2RpZyA9IGxpbWl0ZWRfZGlnOwoJYnRjb2V4aXN0LT5idGNfc2V0KGJ0Y29leGlzdCwgQlRDX1NFVF9CTF9CVF9MSU1JVEVEX0RJRywgJmxpbWl0ZWRfZGlnKTsKCgloYWxidGM4ODEyYTFhbnRfUnVuQ29leGlzdE1lY2hhbmlzbShidGNvZXhpc3QpOwoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKTw9PT1cbiIpKTsKfQoKdm9pZApFWGhhbGJ0Yzg4MTJhMWFudF9TdGFja09wZXJhdGlvbk5vdGlmeSgKCSAJUEJUQ19DT0VYSVNUCQkJYnRjb2V4aXN0LAoJIAl1MUJ5dGUJCQkJdHlwZQoJKQp7CglpZihCVENfU1RBQ0tfT1BfSU5RX1BBR0VfUEFJUl9TVEFSVCA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFN0YWNrT1AgSW5xdWlyeS9wYWdlL3BhaXIgc3RhcnQgbm90aWZ5XG4iKSk7Cgl9CgllbHNlIGlmKEJUQ19TVEFDS19PUF9JTlFfUEFHRV9QQUlSX0ZJTklTSCA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFN0YWNrT1AgSW5xdWlyeS9wYWdlL3BhaXIgZmluaXNoIG5vdGlmeVxuIikpOwoJfQp9Cgp2b2lkCkVYaGFsYnRjODgxMmExYW50X0hhbHROb3RpZnkoCgkgCVBCVENfQ09FWElTVAkJCWJ0Y29leGlzdAoJKQp7CglCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBIYWx0IG5vdGlmeVxuIikpOwoKCWhhbGJ0Yzg4MTJhMWFudF9JZ25vcmVXbGFuQWN0KGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgdHJ1ZSk7CgloYWxidGM4ODEyYTFhbnRfUHNUZG1hKGJ0Y29leGlzdCwgRk9SQ0VfRVhFQywgZmFsc2UsIDApOwoJYnRjb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUoYnRjb2V4aXN0LCAweDRmLCAweGYpOwoJaGFsYnRjODgxMmExYW50X1dpZmlQYXJhQWRqdXN0KGJ0Y29leGlzdCwgZmFsc2UpOwp9Cgp2b2lkCkVYaGFsYnRjODgxMmExYW50X1BucE5vdGlmeSgKCSAJUEJUQ19DT0VYSVNUCQkJYnRjb2V4aXN0LAoJIAl1MUJ5dGUJCQkJcG5wU3RhdGUKCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgUG5wIG5vdGlmeVxuIikpOwoKCWlmKEJUQ19XSUZJX1BOUF9TTEVFUCA9PSBwbnBTdGF0ZSkKCXsKCQlidGNvZXhpc3QtPnN0b3BfY29leF9kbSA9IHRydWU7CgkJaGFsYnRjODgxMmExYW50X0lnbm9yZVdsYW5BY3QoYnRjb2V4aXN0LCBGT1JDRV9FWEVDLCB0cnVlKTsKCQloYWxidGM4ODEyYTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShidGNvZXhpc3QsIGZhbHNlKTsKCQlidGNvZXhpc3QtPmJ0Y19zZXQoYnRjb2V4aXN0LCBCVENfU0VUX0FDVF9MRUFWRV9MUFMsIE5VTEwpOwoJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDkpOwkKCX0KCWVsc2UgaWYoQlRDX1dJRklfUE5QX1dBS0VfVVAgPT0gcG5wU3RhdGUpCgl7CgkJCgl9Cn0KCnZvaWQKRVhoYWxidGM4ODEyYTFhbnRfUGVyaW9kaWNhbCgKCSAJUEJUQ19DT0VYSVNUCQkJYnRjb2V4aXN0CgkpCnsKCUJPT0xFQU4JCQl3aWZpX3VuZGVyNWc9ZmFsc2U7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBQZXJpb2RpY2FsKCk9PT0+XG4iKSk7CglCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCAxQW50IFBlcmlvZGljYWwhIVxuIikpOwoKCWJ0Y29leGlzdC0+YnRjX2dldChidGNvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9VTkRFUl81RywgJndpZmlfdW5kZXI1Zyk7CgoJaWYod2lmaV91bmRlcjVnKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUGVyaW9kaWNhbCgpLCByZXR1cm4gZm9yIDVHPD09PVxuIikpOwoJCWhhbGJ0Yzg4MTJhMWFudF9Db2V4QWxsT2ZmKGJ0Y29leGlzdCk7CgkJcmV0dXJuOwoJfQoKCWhhbGJ0Yzg4MTJhMWFudF9RdWVyeUJ0SW5mbyhidGNvZXhpc3QpOwoJaGFsYnRjODgxMmExYW50X01vbml0b3JCdEN0cihidGNvZXhpc3QpOwoJaGFsYnRjODgxMmExYW50X01vbml0b3JCdEVuYWJsZURpc2FibGUoYnRjb2V4aXN0KTsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUGVyaW9kaWNhbCgpPD09PVxuIikpOwp9Cgp2b2lkCkVYaGFsYnRjODgxMmExYW50X0RiZ0NvbnRyb2woCgkgCVBCVENfQ09FWElTVAkJCWJ0Y29leGlzdCwKCSAJdTFCeXRlCQkJCW9wQ29kZSwKCSAJdTFCeXRlCQkJCW9wTGVuLAoJIAlwdTFCeXRlCQkJCXBEYXRhCgkpCnsKCXN3aXRjaChvcENvZGUpCgl7CgkJY2FzZSBCVENfREJHX1NFVF9DT0VYX05PUk1BTDoKCQkJYnRjb2V4aXN0LT5tYW51YWxfY29udHJvbCA9IGZhbHNlOwoJCQloYWxidGM4ODEyYTFhbnRfSW5pdENvZXhEbShidGNvZXhpc3QpOwoJCQlicmVhazsKCQljYXNlIEJUQ19EQkdfU0VUX0NPRVhfV0lGSV9PTkxZOgoJCQlidGNvZXhpc3QtPm1hbnVhbF9jb250cm9sID0gdHJ1ZTsKCQkJaGFsYnRjODgxMmExYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUoYnRjb2V4aXN0LCBmYWxzZSk7CgkJCWJ0Y29leGlzdC0+YnRjX3NldChidGNvZXhpc3QsIEJUQ19TRVRfQUNUX0xFQVZFX0xQUywgTlVMTCk7CgkJCWhhbGJ0Yzg4MTJhMWFudF9Qc1RkbWEoYnRjb2V4aXN0LCBOT1JNQUxfRVhFQywgZmFsc2UsIDkpOwkKCQkJYnJlYWs7CgkJY2FzZSBCVENfREJHX1NFVF9DT0VYX0JUX09OTFk6CgkJCS8vIHRvZG8KCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJYnJlYWs7Cgl9Cn0KI2VuZGlmCgo=