Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gRGVzY3JpcHRpb246Ci8vCi8vIFRoaXMgZmlsZSBpcyBmb3IgODE5MmUxYW50IENvLWV4aXN0IG1lY2hhbmlzbQovLwovLyBIaXN0b3J5Ci8vIDIwMTIvMTEvMTUgQ29zYSBmaXJzdCBjaGVjayBpbi4KLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIGluY2x1ZGUgZmlsZXMKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KI2luY2x1ZGUgIk1wX1ByZWNvbXAuaCIKI2lmKEJUXzMwX1NVUFBPUlQgPT0gMSkKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gR2xvYmFsIHZhcmlhYmxlcywgdGhlc2UgYXJlIHN0YXRpYyB2YXJpYWJsZXMKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0Kc3RhdGljIENPRVhfRE1fODE5MkVfMUFOVAkJR0xDb2V4RG04MTkyZTFBbnQ7CnN0YXRpYyBQQ09FWF9ETV84MTkyRV8xQU5UIAlwQ29leERtPSZHTENvZXhEbTgxOTJlMUFudDsKc3RhdGljIENPRVhfU1RBXzgxOTJFXzFBTlQJCUdMQ29leFN0YTgxOTJlMUFudDsKc3RhdGljIFBDT0VYX1NUQV84MTkyRV8xQU5UCXBDb2V4U3RhPSZHTENvZXhTdGE4MTkyZTFBbnQ7Cgpjb25zdCBjaGFyICpjb25zdCBHTEJ0SW5mb1NyYzgxOTJlMUFudFtdPXsKCSJCVCBJbmZvW3dpZmkgZnddIiwKCSJCVCBJbmZvW2J0IHJzcF0iLAoJIkJUIEluZm9bYnQgYXV0byByZXBvcnRdIiwKfTsKCnU0Qnl0ZQlHTENvZXhWZXJEYXRlODE5MmUxQW50PTIwMTMwNzI5Owp1NEJ5dGUJR0xDb2V4VmVyODE5MmUxQW50PTB4MTA7CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBsb2NhbCBmdW5jdGlvbiBwcm90byB0eXBlIGlmIG5lZWRlZAovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBsb2NhbCBmdW5jdGlvbiBzdGFydCB3aXRoIGhhbGJ0YzgxOTJlMWFudF8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KdTFCeXRlCmhhbGJ0YzgxOTJlMWFudF9CdFJzc2lTdGF0ZSgKCXUxQnl0ZQkJCWxldmVsTnVtLAoJdTFCeXRlCQkJcnNzaVRocmVzaCwKCXUxQnl0ZQkJCXJzc2lUaHJlc2gxCgkpCnsKCXM0Qnl0ZQkJCWJ0UnNzaT0wOwoJdTFCeXRlCQkJYnRSc3NpU3RhdGU9cENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlOwoKCWJ0UnNzaSA9IHBDb2V4U3RhLT5idFJzc2k7CgoJaWYobGV2ZWxOdW0gPT0gMikKCXsJCQkKCQlpZiggKHBDb2V4U3RhLT5wcmVCdFJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CgkJCShwQ29leFN0YS0+cHJlQnRSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKQoJCXsKCQkJaWYoYnRSc3NpID49IChyc3NpVGhyZXNoK0JUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84MTkyRV8xQU5UKSkKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9ISUdIOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIEhpZ2hcbiIpKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKGJ0UnNzaSA8IHJzc2lUaHJlc2gpCgkJCXsKCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTE9XOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0g7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKCQkJfQoJCX0KCX0KCWVsc2UgaWYobGV2ZWxOdW0gPT0gMykKCXsKCQlpZihyc3NpVGhyZXNoID4gcnNzaVRocmVzaDEpCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSB0aHJlc2ggZXJyb3IhIVxuIikpOwoJCQlyZXR1cm4gcENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlOwoJCX0KCQkKCQlpZiggKHBDb2V4U3RhLT5wcmVCdFJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CgkJCShwQ29leFN0YS0+cHJlQnRSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKQoJCXsKCQkJaWYoYnRSc3NpID49IChyc3NpVGhyZXNoK0JUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84MTkyRV8xQU5UKSkKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9NRURJVU07CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKCQkJfQoJCX0KCQllbHNlIGlmKCAocENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX01FRElVTSkgfHwKCQkJKHBDb2V4U3RhLT5wcmVCdFJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTSkpCgkJewoJCQlpZihidFJzc2kgPj0gKHJzc2lUaHJlc2gxK0JUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84MTkyRV8xQU5UKSkKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9ISUdIOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIEhpZ2hcbiIpKTsKCQkJfQoJCQllbHNlIGlmKGJ0UnNzaSA8IHJzc2lUaHJlc2gpCgkJCXsKCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTE9XOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTTsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN0YXkgYXQgTWVkaXVtXG4iKSk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJaWYoYnRSc3NpIDwgcnNzaVRocmVzaDEpCgkJCXsKCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTUVESVVNOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0g7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKCQkJfQoJCX0KCX0KCQkKCXBDb2V4U3RhLT5wcmVCdFJzc2lTdGF0ZSA9IGJ0UnNzaVN0YXRlOwoKCXJldHVybiBidFJzc2lTdGF0ZTsKfQoKdTFCeXRlCmhhbGJ0YzgxOTJlMWFudF9XaWZpUnNzaVN0YXRlKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJaW5kZXgsCglJTgl1MUJ5dGUJCQlsZXZlbE51bSwKCUlOCXUxQnl0ZQkJCXJzc2lUaHJlc2gsCglJTgl1MUJ5dGUJCQlyc3NpVGhyZXNoMQoJKQp7CglzNEJ5dGUJCQl3aWZpUnNzaT0wOwoJdTFCeXRlCQkJd2lmaVJzc2lTdGF0ZT1wQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF07CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1M0X1dJRklfUlNTSSwgJndpZmlSc3NpKTsKCQoJaWYobGV2ZWxOdW0gPT0gMikKCXsKCQlpZiggKHBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CgkJCShwQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKQoJCXsKCQkJaWYod2lmaVJzc2kgPj0gKHJzc2lUaHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzgxOTJFXzFBTlQpKQoJCQl7CgkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJaWYod2lmaVJzc2kgPCByc3NpVGhyZXNoKQoJCQl7CgkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTE9XOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBMb3dcbiIpKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0g7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7CgkJCX0KCQl9Cgl9CgllbHNlIGlmKGxldmVsTnVtID09IDMpCgl7CgkJaWYocnNzaVRocmVzaCA+IHJzc2lUaHJlc2gxKQoJCXsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHRocmVzaCBlcnJvciEhXG4iKSk7CgkJCXJldHVybiBwQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF07CgkJfQoJCQoJCWlmKCAocENvZXhTdGEtPnByZVdpZmlSc3NpU3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKCQkJKHBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpCgkJewoJCQlpZih3aWZpUnNzaSA+PSAocnNzaVRocmVzaCtCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODE5MkVfMUFOVCkpCgkJCXsKCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9NRURJVU07CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7CgkJCX0KCQl9CgkJZWxzZSBpZiggKHBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9NRURJVU0pIHx8CgkJCShwQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0pKQoJCXsKCQkJaWYod2lmaVJzc2kgPj0gKHJzc2lUaHJlc2gxK0JUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84MTkyRV8xQU5UKSkKCQkJewoJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIEhpZ2hcbiIpKTsKCQkJfQoJCQllbHNlIGlmKHdpZmlSc3NpIDwgcnNzaVRocmVzaCkKCQkJewoJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0xPVzsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU07CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBNZWRpdW1cbiIpKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlpZih3aWZpUnNzaSA8IHJzc2lUaHJlc2gxKQoJCQl7CgkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTUVESVVNOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBNZWRpdW1cbiIpKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0g7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7CgkJCX0KCQl9Cgl9CgkJCglwQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF0gPSB3aWZpUnNzaVN0YXRlOwoKCXJldHVybiB3aWZpUnNzaVN0YXRlOwp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9VcGRhdGVyYV9tYXNrKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCQliRm9yY2VFeGVjLAoJSU4JdTFCeXRlCQkJCXR5cGUsCglJTgl1NEJ5dGUJCQkJcmF0ZU1hc2sKCSkKewoJaWYoQlRDX1JBVEVfRElTQUJMRSA9PSB0eXBlKQoJewoJCXBDb2V4RG0tPmN1cnJhX21hc2sgfD0gcmF0ZU1hc2s7CQkvLyBkaXNhYmxlIHJhdGUKCX0KCWVsc2UgaWYoQlRDX1JBVEVfRU5BQkxFID09IHR5cGUpCgl7CgkJcENvZXhEbS0+Y3VycmFfbWFzayAmPSB+cmF0ZU1hc2s7CS8vIGVuYWJsZSByYXRlCgl9CgkKCWlmKCBiRm9yY2VFeGVjIHx8IChwQ29leERtLT5wcmVyYV9tYXNrICE9IHBDb2V4RG0tPmN1cnJhX21hc2spKQoJewoJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9BQ1RfVVBEQVRFX3JhX21hc2ssICZwQ29leERtLT5jdXJyYV9tYXNrKTsKCX0KCXBDb2V4RG0tPnByZXJhX21hc2sgPSBwQ29leERtLT5jdXJyYV9tYXNrOwp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9Nb25pdG9yQnRDdHIoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTRCeXRlIAkJCXJlZ0hQVHhSeCwgcmVnTFBUeFJ4LCB1NFRtcDsKCXU0Qnl0ZQkJCXJlZ0hQVHg9MCwgcmVnSFBSeD0wLCByZWdMUFR4PTAsIHJlZ0xQUng9MDsKCXUxQnl0ZQkJCXUxVG1wOwoJCglyZWdIUFR4UnggPSAweDc3MDsKCXJlZ0xQVHhSeCA9IDB4Nzc0OwoKCXU0VG1wID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgcmVnSFBUeFJ4KTsKCXJlZ0hQVHggPSB1NFRtcCAmIE1BU0tMV09SRDsKCXJlZ0hQUnggPSAodTRUbXAgJiBNQVNLSFdPUkQpPj4xNjsKCgl1NFRtcCA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIHJlZ0xQVHhSeCk7CglyZWdMUFR4ID0gdTRUbXAgJiBNQVNLTFdPUkQ7CglyZWdMUFJ4ID0gKHU0VG1wICYgTUFTS0hXT1JEKT4+MTY7CgkJCglwQ29leFN0YS0+aGlnaFByaW9yaXR5VHggPSByZWdIUFR4OwoJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVJ4ID0gcmVnSFBSeDsKCXBDb2V4U3RhLT5sb3dQcmlvcml0eVR4ID0gcmVnTFBUeDsKCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4ID0gcmVnTFBSeDsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgSGlnaCBQcmlvcml0eSBUeC9SeCAocmVnIDB4JXgpPTB4JXgoJWQpLzB4JXgoJWQpXG4iLCAKCQlyZWdIUFR4UngsIHJlZ0hQVHgsIHJlZ0hQVHgsIHJlZ0hQUngsIHJlZ0hQUngpKTsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLCAoIltCVENvZXhdLCBMb3cgUHJpb3JpdHkgVHgvUnggKHJlZyAweCV4KT0weCV4KCVkKS8weCV4KCVkKVxuIiwgCgkJcmVnTFBUeFJ4LCByZWdMUFR4LCByZWdMUFR4LCByZWdMUFJ4LCByZWdMUFJ4KSk7CgoJLy8gcmVzZXQgY291bnRlcgoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NzZlLCAweGMpOwp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9RdWVyeUJ0SW5mbygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzFdID17MH07CgoJcENvZXhTdGEtPmJDMmhCdEluZm9SZXFTZW50ID0gdHJ1ZTsKCglIMkNfUGFyYW1ldGVyWzBdIHw9IEJJVDA7CS8vIHRyaWdnZXIKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgUXVlcnkgQnQgSW5mbywgRlcgd3JpdGUgMHg2MT0weCV4XG4iLCAKCQlIMkNfUGFyYW1ldGVyWzBdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4NjEsIDEsIEgyQ19QYXJhbWV0ZXIpOwp9CgpCT09MRUFOCmhhbGJ0YzgxOTJlMWFudF9Jc1dpZmlTdGF0dXNDaGFuZ2VkKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXN0YXRpYyBCT09MRUFOCWJQcmVXaWZpQnVzeT1GQUxTRSwgYlByZVVuZGVyNHdheT1GQUxTRSwgYlByZUJ0SHNPbj1GQUxTRTsKCUJPT0xFQU4JYldpZmlCdXN5PUZBTFNFLCBiVW5kZXI0d2F5PUZBTFNFLCBiQnRIc09uPUZBTFNFOwoJQk9PTEVBTgliV2lmaUNvbm5lY3RlZD1GQUxTRTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZiV2lmaUNvbm5lY3RlZCk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9CVVNZLCAmYldpZmlCdXN5KTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZiQnRIc09uKTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJXzRfV0FZX1BST0dSRVNTLCAmYlVuZGVyNHdheSk7CgoJaWYoYldpZmlDb25uZWN0ZWQpCgl7CgkJaWYoYldpZmlCdXN5ICE9IGJQcmVXaWZpQnVzeSkKCQl7CgkJCWJQcmVXaWZpQnVzeSA9IGJXaWZpQnVzeTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWlmKGJVbmRlcjR3YXkgIT0gYlByZVVuZGVyNHdheSkKCQl7CgkJCWJQcmVVbmRlcjR3YXkgPSBiVW5kZXI0d2F5OwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJaWYoYkJ0SHNPbiAhPSBiUHJlQnRIc09uKQoJCXsKCQkJYlByZUJ0SHNPbiA9IGJCdEhzT247CgkJCXJldHVybiB0cnVlOwoJCX0KCX0KCglyZXR1cm4gRkFMU0U7Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1VwZGF0ZUJ0TGlua0luZm8oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJUEJUQ19CVF9MSU5LX0lORk8JcEJ0TGlua0luZm89JnBCdENvZXhpc3QtPmJ0X2xpbmtfaW5mbzsKCglwQnRMaW5rSW5mby0+YkJ0TGlua0V4aXN0ID0gcENvZXhTdGEtPmJCdExpbmtFeGlzdDsKCXBCdExpbmtJbmZvLT5iU2NvRXhpc3QgPSBwQ29leFN0YS0+YlNjb0V4aXN0OwoJcEJ0TGlua0luZm8tPmJBMmRwRXhpc3QgPSBwQ29leFN0YS0+YkEyZHBFeGlzdDsKCXBCdExpbmtJbmZvLT5iUGFuRXhpc3QgPSBwQ29leFN0YS0+YlBhbkV4aXN0OwoJcEJ0TGlua0luZm8tPmJIaWRFeGlzdCA9IHBDb2V4U3RhLT5iSGlkRXhpc3Q7CgoJLy8gY2hlY2sgaWYgU2NvIG9ubHkKCWlmKCBwQnRMaW5rSW5mby0+YlNjb0V4aXN0ICYmCgkJIXBCdExpbmtJbmZvLT5iQTJkcEV4aXN0ICYmCgkJIXBCdExpbmtJbmZvLT5iUGFuRXhpc3QgJiYKCQkhcEJ0TGlua0luZm8tPmJIaWRFeGlzdCApCgkJcEJ0TGlua0luZm8tPmJTY29Pbmx5ID0gdHJ1ZTsKCWVsc2UKCQlwQnRMaW5rSW5mby0+YlNjb09ubHkgPSBGQUxTRTsKCgkvLyBjaGVjayBpZiBBMmRwIG9ubHkKCWlmKCAhcEJ0TGlua0luZm8tPmJTY29FeGlzdCAmJgoJCXBCdExpbmtJbmZvLT5iQTJkcEV4aXN0ICYmCgkJIXBCdExpbmtJbmZvLT5iUGFuRXhpc3QgJiYKCQkhcEJ0TGlua0luZm8tPmJIaWRFeGlzdCApCgkJcEJ0TGlua0luZm8tPmJBMmRwT25seSA9IHRydWU7CgllbHNlCgkJcEJ0TGlua0luZm8tPmJBMmRwT25seSA9IEZBTFNFOwoKCS8vIGNoZWNrIGlmIFBhbiBvbmx5CglpZiggIXBCdExpbmtJbmZvLT5iU2NvRXhpc3QgJiYKCQkhcEJ0TGlua0luZm8tPmJBMmRwRXhpc3QgJiYKCQlwQnRMaW5rSW5mby0+YlBhbkV4aXN0ICYmCgkJIXBCdExpbmtJbmZvLT5iSGlkRXhpc3QgKQoJCXBCdExpbmtJbmZvLT5iUGFuT25seSA9IHRydWU7CgllbHNlCgkJcEJ0TGlua0luZm8tPmJQYW5Pbmx5ID0gRkFMU0U7CgkKCS8vIGNoZWNrIGlmIEhpZCBvbmx5CglpZiggIXBCdExpbmtJbmZvLT5iU2NvRXhpc3QgJiYKCQkhcEJ0TGlua0luZm8tPmJBMmRwRXhpc3QgJiYKCQkhcEJ0TGlua0luZm8tPmJQYW5FeGlzdCAmJgoJCXBCdExpbmtJbmZvLT5iSGlkRXhpc3QgKQoJCXBCdExpbmtJbmZvLT5iSGlkT25seSA9IHRydWU7CgllbHNlCgkJcEJ0TGlua0luZm8tPmJIaWRPbmx5ID0gRkFMU0U7Cn0KCnUxQnl0ZQpoYWxidGM4MTkyZTFhbnRfQWN0aW9uQWxnb3JpdGhtKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCVBCVENfQlRfTElOS19JTkZPCXBCdExpbmtJbmZvPSZwQnRDb2V4aXN0LT5idF9saW5rX2luZm87CglCT09MRUFOCQkJCWJCdEhzT249RkFMU0U7Cgl1MUJ5dGUJCQkJYWxnb3JpdGhtPUJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX1VOREVGSU5FRDsKCXUxQnl0ZQkJCQludW1PZkRpZmZQcm9maWxlPTA7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJCdEhzT24pOwoJCQoJaWYoIXBCdExpbmtJbmZvLT5iQnRMaW5rRXhpc3QpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBObyBCVCBsaW5rIGV4aXN0cyEhIVxuIikpOwoJCXJldHVybiBhbGdvcml0aG07Cgl9CgoJaWYocEJ0TGlua0luZm8tPmJTY29FeGlzdCkKCQludW1PZkRpZmZQcm9maWxlKys7CglpZihwQnRMaW5rSW5mby0+YkhpZEV4aXN0KQoJCW51bU9mRGlmZlByb2ZpbGUrKzsKCWlmKHBCdExpbmtJbmZvLT5iUGFuRXhpc3QpCgkJbnVtT2ZEaWZmUHJvZmlsZSsrOwoJaWYocEJ0TGlua0luZm8tPmJBMmRwRXhpc3QpCgkJbnVtT2ZEaWZmUHJvZmlsZSsrOwoJCglpZihudW1PZkRpZmZQcm9maWxlID09IDEpCgl7CgkJaWYocEJ0TGlua0luZm8tPmJTY29FeGlzdCkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPIG9ubHlcbiIpKTsKCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fU0NPOwoJCX0KCQllbHNlCgkJewoJCQlpZihwQnRMaW5rSW5mby0+YkhpZEV4aXN0KQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCBvbmx5XG4iKSk7CgkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19ISUQ7CgkJCX0KCQkJZWxzZSBpZihwQnRMaW5rSW5mby0+YkEyZHBFeGlzdCkKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBMkRQIG9ubHlcbiIpKTsKCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX0EyRFA7CgkJCX0KCQkJZWxzZSBpZihwQnRMaW5rSW5mby0+YlBhbkV4aXN0KQoJCQl7CgkJCQlpZihiQnRIc09uKQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUEFOKEhTKSBvbmx5XG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFOSFM7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBQQU4oRURSKSBvbmx5XG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFORURSOwoJCQkJfQoJCQl9CgkJfQoJfQoJZWxzZSBpZihudW1PZkRpZmZQcm9maWxlID09IDIpCgl7CgkJaWYocEJ0TGlua0luZm8tPmJTY29FeGlzdCkKCQl7CgkJCWlmKHBCdExpbmtJbmZvLT5iSGlkRXhpc3QpCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgSElEXG4iKSk7CgkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19ISUQ7CgkJCX0KCQkJZWxzZSBpZihwQnRMaW5rSW5mby0+YkEyZHBFeGlzdCkKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBBMkRQID09PiBTQ09cbiIpKTsKCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX1NDTzsKCQkJfQoJCQllbHNlIGlmKHBCdExpbmtJbmZvLT5iUGFuRXhpc3QpCgkJCXsKCQkJCWlmKGJCdEhzT24pCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBQQU4oSFMpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fU0NPOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgUEFOKEVEUilcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwoJCQkJfQoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKCBwQnRMaW5rSW5mby0+YkhpZEV4aXN0ICYmCgkJCQlwQnRMaW5rSW5mby0+YkEyZHBFeGlzdCApCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUFxuIikpOwoJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fSElEX0EyRFA7CgkJCX0KCQkJZWxzZSBpZiggcEJ0TGlua0luZm8tPmJIaWRFeGlzdCAmJgoJCQkJcEJ0TGlua0luZm8tPmJQYW5FeGlzdCApCgkJCXsKCQkJCWlmKGJCdEhzT24pCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBQQU4oSFMpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fSElEX0EyRFA7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBQQU4oRURSKVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CgkJCQl9CgkJCX0KCQkJZWxzZSBpZiggcEJ0TGlua0luZm8tPmJQYW5FeGlzdCAmJgoJCQkJcEJ0TGlua0luZm8tPmJBMmRwRXhpc3QgKQoJCQl7CgkJCQlpZihiQnRIc09uKQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19BMkRQX1BBTkhTOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihFRFIpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFORURSX0EyRFA7CgkJCQl9CgkJCX0KCQl9Cgl9CgllbHNlIGlmKG51bU9mRGlmZlByb2ZpbGUgPT0gMykKCXsKCQlpZihwQnRMaW5rSW5mby0+YlNjb0V4aXN0KQoJCXsKCQkJaWYoIHBCdExpbmtJbmZvLT5iSGlkRXhpc3QgJiYKCQkJCXBCdExpbmtJbmZvLT5iQTJkcEV4aXN0ICkKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBBMkRQID09PiBISURcbiIpKTsKCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX0hJRDsKCQkJfQoJCQllbHNlIGlmKCBwQnRMaW5rSW5mby0+YkhpZEV4aXN0ICYmCgkJCQlwQnRMaW5rSW5mby0+YlBhbkV4aXN0ICkKCQkJewoJCQkJaWYoYkJ0SHNPbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRCArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRCArIFBBTihFRFIpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKCQkJCX0KCQkJfQoJCQllbHNlIGlmKCBwQnRMaW5rSW5mby0+YlBhbkV4aXN0ICYmCgkJCQlwQnRMaW5rSW5mby0+YkEyZHBFeGlzdCApCgkJCXsKCQkJCWlmKGJCdEhzT24pCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBBMkRQICsgUEFOKEhTKVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX1NDTzsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEEyRFAgKyBQQU4oRURSKSA9PT4gSElEXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKCQkJCX0KCQkJfQoJCX0KCQllbHNlCgkJewoJCQlpZiggcEJ0TGlua0luZm8tPmJIaWRFeGlzdCAmJgoJCQkJcEJ0TGlua0luZm8tPmJQYW5FeGlzdCAmJgoJCQkJcEJ0TGlua0luZm8tPmJBMmRwRXhpc3QgKQoJCQl7CgkJCQlpZihiQnRIc09uKQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUCArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFAgKyBQQU4oRURSKVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX0hJRF9BMkRQX1BBTkVEUjsKCQkJCX0KCQkJfQoJCX0KCX0KCWVsc2UgaWYobnVtT2ZEaWZmUHJvZmlsZSA+PSAzKQoJewoJCWlmKHBCdExpbmtJbmZvLT5iU2NvRXhpc3QpCgkJewoJCQlpZiggcEJ0TGlua0luZm8tPmJIaWRFeGlzdCAmJgoJCQkJcEJ0TGlua0luZm8tPmJQYW5FeGlzdCAmJgoJCQkJcEJ0TGlua0luZm8tPmJBMmRwRXhpc3QgKQoJCQl7CgkJCQlpZihiQnRIc09uKQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgU0NPICsgSElEICsgQTJEUCArIFBBTihIUylcbiIpKTsKCgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBBMkRQICsgUEFOKEVEUik9PT5QQU4oRURSKStISURcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiBhbGdvcml0aG07Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1NldEZ3RGFjU3dpbmdMZXZlbCgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCWRhY1N3aW5nTHZsCgkpCnsKCXUxQnl0ZQkJCUgyQ19QYXJhbWV0ZXJbMV0gPXswfTsKCgkvLyBUaGVyZSBhcmUgc2V2ZXJhbCB0eXBlIG9mIGRhY3N3aW5nCgkvLyAweDE4LyAweDEwLyAweGMvIDB4OC8gMHg0LyAweDYKCUgyQ19QYXJhbWV0ZXJbMF0gPSBkYWNTd2luZ0x2bDsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgU2V0IERhYyBTd2luZyBMZXZlbD0weCV4XG4iLCBkYWNTd2luZ0x2bCkpOwoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIEZXIHdyaXRlIDB4NjQ9MHgleFxuIiwgSDJDX1BhcmFtZXRlclswXSkpOwoKCXBCdENvZXhpc3QtPmJ0Y19maWxsX2gyYyhwQnRDb2V4aXN0LCAweDY0LCAxLCBIMkNfUGFyYW1ldGVyKTsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfU2V0RndEZWNCdFB3cigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCQlkZWNCdFB3ckx2bAoJKQp7Cgl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzFdID17MH07CgkKCUgyQ19QYXJhbWV0ZXJbMF0gPSBkZWNCdFB3ckx2bDsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgZGVjcmVhc2UgQnQgUG93ZXIgbGV2ZWwgPSAlZCwgRlcgd3JpdGUgMHg2Mj0weCV4XG4iLCAKCQlkZWNCdFB3ckx2bCwgSDJDX1BhcmFtZXRlclswXSkpOwoKCXBCdENvZXhpc3QtPmJ0Y19maWxsX2gyYyhwQnRDb2V4aXN0LCAweDYyLCAxLCBIMkNfUGFyYW1ldGVyKTsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJCWJGb3JjZUV4ZWMsCglJTgl1MUJ5dGUJCQkJZGVjQnRQd3JMdmwKCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyBEZWMgQlQgcG93ZXIgbGV2ZWwgPSAlZFxuIiwgIAoJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgZGVjQnRQd3JMdmwpKTsKCXBDb2V4RG0tPmN1ckJ0RGVjUHdyTHZsID0gZGVjQnRQd3JMdmw7CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgQnREZWNQd3JMdmw9JWQsIGN1ckJ0RGVjUHdyTHZsPSVkXG4iLCAKCQkJcENvZXhEbS0+cHJlQnREZWNQd3JMdmwsIHBDb2V4RG0tPmN1ckJ0RGVjUHdyTHZsKSk7CgoJCWlmKHBDb2V4RG0tPnByZUJ0RGVjUHdyTHZsID09IHBDb2V4RG0tPmN1ckJ0RGVjUHdyTHZsKSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODE5MmUxYW50X1NldEZ3RGVjQnRQd3IocEJ0Q29leGlzdCwgcENvZXhEbS0+Y3VyQnREZWNQd3JMdmwpOwoKCXBDb2V4RG0tPnByZUJ0RGVjUHdyTHZsID0gcENvZXhEbS0+Y3VyQnREZWNQd3JMdmw7Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1NldEZ3QnRMbmFDb25zdHJhaW4oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJYkJ0TG5hQ29uc09uCgkpCnsKCXUxQnl0ZQkJCUgyQ19QYXJhbWV0ZXJbMl0gPXswfTsKCQoJSDJDX1BhcmFtZXRlclswXSA9IDB4MzsJLy8gb3BDb2RlLCAweDM9QlRfU0VUX0xOQV9DT05TVFJBSU4KCglpZihiQnRMbmFDb25zT24pCgl7CgkJSDJDX1BhcmFtZXRlclsxXSB8PSBCSVQwOwoJfQoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBzZXQgQlQgTE5BIENvbnN0cmFpbjogJXMsIEZXIHdyaXRlIDB4Njk9MHgleFxuIiwgCgkJKGJCdExuYUNvbnNPbj8gIk9OISEiOiJPRkYhISIpLCAKCQlIMkNfUGFyYW1ldGVyWzBdPDw4fEgyQ19QYXJhbWV0ZXJbMV0pKTsKCglwQnRDb2V4aXN0LT5idGNfZmlsbF9oMmMocEJ0Q29leGlzdCwgMHg2OSwgMiwgSDJDX1BhcmFtZXRlcik7CQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9TZXRCdExuYUNvbnN0cmFpbigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJCdExuYUNvbnNPbgoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIEJUIENvbnN0cmFpbiA9ICVzXG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSI6IiIpLCAoKGJCdExuYUNvbnNPbik/ICJPTiI6Ik9GRiIpKSk7CglwQ29leERtLT5iQ3VyQnRMbmFDb25zdHJhaW4gPSBiQnRMbmFDb25zT247CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZUJ0TG5hQ29uc3RyYWluPSVkLCBiQ3VyQnRMbmFDb25zdHJhaW49JWRcbiIsIAoJCQlwQ29leERtLT5iUHJlQnRMbmFDb25zdHJhaW4sIHBDb2V4RG0tPmJDdXJCdExuYUNvbnN0cmFpbikpOwoKCQlpZihwQ29leERtLT5iUHJlQnRMbmFDb25zdHJhaW4gPT0gcENvZXhEbS0+YkN1ckJ0TG5hQ29uc3RyYWluKSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODE5MmUxYW50X1NldEZ3QnRMbmFDb25zdHJhaW4ocEJ0Q29leGlzdCwgcENvZXhEbS0+YkN1ckJ0TG5hQ29uc3RyYWluKTsKCglwQ29leERtLT5iUHJlQnRMbmFDb25zdHJhaW4gPSBwQ29leERtLT5iQ3VyQnRMbmFDb25zdHJhaW47Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1NldEZ3QnRQc2RNb2RlKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJYnRQc2RNb2RlCgkpCnsKCXUxQnl0ZQkJCUgyQ19QYXJhbWV0ZXJbMl0gPXswfTsKCQoJSDJDX1BhcmFtZXRlclswXSA9IDB4MjsJLy8gb3BDb2RlLCAweDI9QlRfU0VUX1BTRF9NT0RFCgoJSDJDX1BhcmFtZXRlclsxXSA9IGJ0UHNkTW9kZTsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgc2V0IEJUIFBTRCBtb2RlPTB4JXgsIEZXIHdyaXRlIDB4Njk9MHgleFxuIiwgCgkJSDJDX1BhcmFtZXRlclsxXSwgCgkJSDJDX1BhcmFtZXRlclswXTw8OHxIMkNfUGFyYW1ldGVyWzFdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4NjksIDIsIEgyQ19QYXJhbWV0ZXIpOwkKfQoKClZPSUQKaGFsYnRjODE5MmUxYW50X1NldEJ0UHNkTW9kZSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JdTFCeXRlCQkJYnRQc2RNb2RlCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgQlQgUFNEIG1vZGUgPSAweCV4XG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSI6IiIpLCBidFBzZE1vZGUpKTsKCXBDb2V4RG0tPmJDdXJCdFBzZE1vZGUgPSBidFBzZE1vZGU7CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZUJ0UHNkTW9kZT0weCV4LCBiQ3VyQnRQc2RNb2RlPTB4JXhcbiIsIAoJCQlwQ29leERtLT5iUHJlQnRQc2RNb2RlLCBwQ29leERtLT5iQ3VyQnRQc2RNb2RlKSk7CgoJCWlmKHBDb2V4RG0tPmJQcmVCdFBzZE1vZGUgPT0gcENvZXhEbS0+YkN1ckJ0UHNkTW9kZSkgCgkJCXJldHVybjsKCX0KCWhhbGJ0YzgxOTJlMWFudF9TZXRGd0J0UHNkTW9kZShwQnRDb2V4aXN0LCBwQ29leERtLT5iQ3VyQnRQc2RNb2RlKTsKCglwQ29leERtLT5iUHJlQnRQc2RNb2RlID0gcENvZXhEbS0+YkN1ckJ0UHNkTW9kZTsKfQoKClZPSUQKaGFsYnRjODE5MmUxYW50X1NldEJ0QXV0b1JlcG9ydCgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRW5hYmxlQXV0b1JlcG9ydAoJKQp7Cgl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzFdID17MH07CgkKCUgyQ19QYXJhbWV0ZXJbMF0gPSAwOwoKCWlmKGJFbmFibGVBdXRvUmVwb3J0KQoJewoJCUgyQ19QYXJhbWV0ZXJbMF0gfD0gQklUMDsKCX0KCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgQlQgRlcgYXV0byByZXBvcnQgOiAlcywgRlcgd3JpdGUgMHg2OD0weCV4XG4iLCAKCQkoYkVuYWJsZUF1dG9SZXBvcnQ/ICJFbmFibGVkISEiOiJEaXNhYmxlZCEhIiksIEgyQ19QYXJhbWV0ZXJbMF0pKTsKCglwQnRDb2V4aXN0LT5idGNfZmlsbF9oMmMocEJ0Q29leGlzdCwgMHg2OCwgMSwgSDJDX1BhcmFtZXRlcik7CQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9CdEF1dG9SZXBvcnQoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJYkZvcmNlRXhlYywKCUlOCUJPT0xFQU4JCQliRW5hYmxlQXV0b1JlcG9ydAoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIEJUIEF1dG8gcmVwb3J0ID0gJXNcbiIsICAKCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYkVuYWJsZUF1dG9SZXBvcnQpPyAiRW5hYmxlZCI6IkRpc2FibGVkIikpKTsKCXBDb2V4RG0tPmJDdXJCdEF1dG9SZXBvcnQgPSBiRW5hYmxlQXV0b1JlcG9ydDsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlQnRBdXRvUmVwb3J0PSVkLCBiQ3VyQnRBdXRvUmVwb3J0PSVkXG4iLCAKCQkJcENvZXhEbS0+YlByZUJ0QXV0b1JlcG9ydCwgcENvZXhEbS0+YkN1ckJ0QXV0b1JlcG9ydCkpOwoKCQlpZihwQ29leERtLT5iUHJlQnRBdXRvUmVwb3J0ID09IHBDb2V4RG0tPmJDdXJCdEF1dG9SZXBvcnQpIAoJCQlyZXR1cm47Cgl9CgloYWxidGM4MTkyZTFhbnRfU2V0QnRBdXRvUmVwb3J0KHBCdENvZXhpc3QsIHBDb2V4RG0tPmJDdXJCdEF1dG9SZXBvcnQpOwoKCXBDb2V4RG0tPmJQcmVCdEF1dG9SZXBvcnQgPSBwQ29leERtLT5iQ3VyQnRBdXRvUmVwb3J0Owp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9Gd0RhY1N3aW5nTHZsKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTgl1MUJ5dGUJCQlmd0RhY1N3aW5nTHZsCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgc2V0IEZXIERhYyBTd2luZyBsZXZlbCA9ICVkXG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCBmd0RhY1N3aW5nTHZsKSk7CglwQ29leERtLT5jdXJGd0RhY1N3aW5nTHZsID0gZndEYWNTd2luZ0x2bDsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBwcmVGd0RhY1N3aW5nTHZsPSVkLCBjdXJGd0RhY1N3aW5nTHZsPSVkXG4iLCAKCQkJcENvZXhEbS0+cHJlRndEYWNTd2luZ0x2bCwgcENvZXhEbS0+Y3VyRndEYWNTd2luZ0x2bCkpOwoKCQlpZihwQ29leERtLT5wcmVGd0RhY1N3aW5nTHZsID09IHBDb2V4RG0tPmN1ckZ3RGFjU3dpbmdMdmwpIAoJCQlyZXR1cm47Cgl9CgoJaGFsYnRjODE5MmUxYW50X1NldEZ3RGFjU3dpbmdMZXZlbChwQnRDb2V4aXN0LCBwQ29leERtLT5jdXJGd0RhY1N3aW5nTHZsKTsKCglwQ29leERtLT5wcmVGd0RhY1N3aW5nTHZsID0gcENvZXhEbS0+Y3VyRndEYWNTd2luZ0x2bDsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfU2V0U3dSZlJ4THBmQ29ybmVyKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJSeFJmU2hyaW5rT24KCSkKewoJaWYoYlJ4UmZTaHJpbmtPbikKCXsKCQkvL1NocmluayBSRiBSeCBMUEYgY29ybmVyCgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFNocmluayBSRiBSeCBMUEYgY29ybmVyISFcbiIpKTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxZSwgMHhmZmZmZiwgMHhmMGZmNyk7Cgl9CgllbHNlCgl7CgkJLy9SZXN1bWUgUkYgUnggTFBGIGNvcm5lcgoJCS8vIEFmdGVyIGluaXRpYWxpemVkLCB3ZSBjYW4gdXNlIHBDb2V4RG0tPmJ0UmYweDFlQmFja3VwCgkJaWYocEJ0Q29leGlzdC0+aW5pdGlsaXplZCkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBSZXN1bWUgUkYgUnggTFBGIGNvcm5lciEhXG4iKSk7CgkJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDFlLCAweGZmZmZmLCBwQ29leERtLT5idFJmMHgxZUJhY2t1cCk7CgkJfQoJfQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9SZlNocmluaygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJSeFJmU2hyaW5rT24KCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyB0dXJuIFJ4IFJGIFNocmluayA9ICVzXG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGJSeFJmU2hyaW5rT24pPyAiT04iOiJPRkYiKSkpOwoJcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbmsgPSBiUnhSZlNocmlua09uOwoKCWlmKCFiRm9yY2VFeGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVSZlJ4THBmU2hyaW5rPSVkLCBiQ3VyUmZSeExwZlNocmluaz0lZFxuIiwgCgkJCXBDb2V4RG0tPmJQcmVSZlJ4THBmU2hyaW5rLCBwQ29leERtLT5iQ3VyUmZSeExwZlNocmluaykpOwoKCQlpZihwQ29leERtLT5iUHJlUmZSeExwZlNocmluayA9PSBwQ29leERtLT5iQ3VyUmZSeExwZlNocmluaykgCgkJCXJldHVybjsKCX0KCWhhbGJ0YzgxOTJlMWFudF9TZXRTd1JmUnhMcGZDb3JuZXIocEJ0Q29leGlzdCwgcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbmspOwoKCXBDb2V4RG0tPmJQcmVSZlJ4THBmU2hyaW5rID0gcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbms7Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1NldFN3UGVuYWx0eVR4UmF0ZUFkYXB0aXZlKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJMb3dQZW5hbHR5UmEKCSkKewoJdTFCeXRlCXRtcFUxOwoKCXRtcFUxID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg0ZmQpOwoJdG1wVTEgfD0gQklUMDsKCWlmKGJMb3dQZW5hbHR5UmEpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFR4IHJhdGUgYWRhcHRpdmUsIHNldCBsb3cgcGVuYWx0eSEhXG4iKSk7CgkJdG1wVTEgJj0gfkJJVDI7Cgl9CgllbHNlCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFR4IHJhdGUgYWRhcHRpdmUsIHNldCBub3JtYWwhIVxuIikpOwoJCXRtcFUxIHw9IEJJVDI7Cgl9CgoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NGZkLCB0bXBVMSk7Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X0xvd1BlbmFsdHlSYSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJMb3dQZW5hbHR5UmEKCSkKewoJcmV0dXJuOwoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyB0dXJuIExvd1BlbmFsdHlSQSA9ICVzXG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGJMb3dQZW5hbHR5UmEpPyAiT04iOiJPRkYiKSkpOwoJcENvZXhEbS0+YkN1ckxvd1BlbmFsdHlSYSA9IGJMb3dQZW5hbHR5UmE7CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZUxvd1BlbmFsdHlSYT0lZCwgYkN1ckxvd1BlbmFsdHlSYT0lZFxuIiwgCgkJCXBDb2V4RG0tPmJQcmVMb3dQZW5hbHR5UmEsIHBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmEpKTsKCgkJaWYocENvZXhEbS0+YlByZUxvd1BlbmFsdHlSYSA9PSBwQ29leERtLT5iQ3VyTG93UGVuYWx0eVJhKSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODE5MmUxYW50X1NldFN3UGVuYWx0eVR4UmF0ZUFkYXB0aXZlKHBCdENvZXhpc3QsIHBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmEpOwoKCXBDb2V4RG0tPmJQcmVMb3dQZW5hbHR5UmEgPSBwQ29leERtLT5iQ3VyTG93UGVuYWx0eVJhOwp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9TZXREYWNTd2luZ1JlZygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXU0Qnl0ZQkJCWxldmVsCgkpCnsKCXUxQnl0ZQl2YWw9KHUxQnl0ZSlsZXZlbDsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgV3JpdGUgU3dEYWNTd2luZyA9IDB4JXhcbiIsIGxldmVsKSk7CglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhwQnRDb2V4aXN0LCAweDg4MywgMHgzZSwgdmFsKTsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfU2V0U3dGdWxsVGltZURhY1N3aW5nKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJTd0RhY1N3aW5nT24sCglJTgl1NEJ5dGUJCQlzd0RhY1N3aW5nTHZsCgkpCnsKCWlmKGJTd0RhY1N3aW5nT24pCgl7CgkJaGFsYnRjODE5MmUxYW50X1NldERhY1N3aW5nUmVnKHBCdENvZXhpc3QsIHN3RGFjU3dpbmdMdmwpOwoJfQoJZWxzZQoJewoJCWhhbGJ0YzgxOTJlMWFudF9TZXREYWNTd2luZ1JlZyhwQnRDb2V4aXN0LCAweDE4KTsKCX0KfQoKClZPSUQKaGFsYnRjODE5MmUxYW50X0RhY1N3aW5nKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTglCT09MRUFOCQkJYkRhY1N3aW5nT24sCglJTgl1NEJ5dGUJCQlkYWNTd2luZ0x2bAoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHR1cm4gRGFjU3dpbmc9JXMsIGRhY1N3aW5nTHZsPTB4JXhcbiIsICAKCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYkRhY1N3aW5nT24pPyAiT04iOiJPRkYiKSwgZGFjU3dpbmdMdmwpKTsKCXBDb2V4RG0tPmJDdXJEYWNTd2luZ09uID0gYkRhY1N3aW5nT247CglwQ29leERtLT5jdXJEYWNTd2luZ0x2bCA9IGRhY1N3aW5nTHZsOwoKCWlmKCFiRm9yY2VFeGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVEYWNTd2luZ09uPSVkLCBwcmVEYWNTd2luZ0x2bD0weCV4LCBiQ3VyRGFjU3dpbmdPbj0lZCwgY3VyRGFjU3dpbmdMdmw9MHgleFxuIiwgCgkJCXBDb2V4RG0tPmJQcmVEYWNTd2luZ09uLCBwQ29leERtLT5wcmVEYWNTd2luZ0x2bCwKCQkJcENvZXhEbS0+YkN1ckRhY1N3aW5nT24sIHBDb2V4RG0tPmN1ckRhY1N3aW5nTHZsKSk7CgoJCWlmKCAocENvZXhEbS0+YlByZURhY1N3aW5nT24gPT0gcENvZXhEbS0+YkN1ckRhY1N3aW5nT24pICYmCgkJCShwQ29leERtLT5wcmVEYWNTd2luZ0x2bCA9PSBwQ29leERtLT5jdXJEYWNTd2luZ0x2bCkgKQoJCQlyZXR1cm47Cgl9CgltZGVsYXkoMzApOwoJaGFsYnRjODE5MmUxYW50X1NldFN3RnVsbFRpbWVEYWNTd2luZyhwQnRDb2V4aXN0LCBiRGFjU3dpbmdPbiwgZGFjU3dpbmdMdmwpOwoKCXBDb2V4RG0tPmJQcmVEYWNTd2luZ09uID0gcENvZXhEbS0+YkN1ckRhY1N3aW5nT247CglwQ29leERtLT5wcmVEYWNTd2luZ0x2bCA9IHBDb2V4RG0tPmN1ckRhY1N3aW5nTHZsOwp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9TZXRBZGNCYWNrT2ZmKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJBZGNCYWNrT2ZmCgkpCnsKCWlmKGJBZGNCYWNrT2ZmKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBCQiBCYWNrT2ZmIExldmVsIE9uIVxuIikpOwoJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKHBCdENvZXhpc3QsIDB4OGRiLCAweDYwLCAweDMpOwoJfQoJZWxzZQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBCQiBCYWNrT2ZmIExldmVsIE9mZiFcbiIpKTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhwQnRDb2V4aXN0LCAweDhkYiwgMHg2MCwgMHgxKTsKCX0KfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfQWRjQmFja09mZigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJBZGNCYWNrT2ZmCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgdHVybiBBZGNCYWNrT2ZmID0gJXNcbiIsICAKCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYkFkY0JhY2tPZmYpPyAiT04iOiJPRkYiKSkpOwoJcENvZXhEbS0+YkN1ckFkY0JhY2tPZmYgPSBiQWRjQmFja09mZjsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlQWRjQmFja09mZj0lZCwgYkN1ckFkY0JhY2tPZmY9JWRcbiIsIAoJCQlwQ29leERtLT5iUHJlQWRjQmFja09mZiwgcENvZXhEbS0+YkN1ckFkY0JhY2tPZmYpKTsKCgkJaWYocENvZXhEbS0+YlByZUFkY0JhY2tPZmYgPT0gcENvZXhEbS0+YkN1ckFkY0JhY2tPZmYpIAoJCQlyZXR1cm47Cgl9CgloYWxidGM4MTkyZTFhbnRfU2V0QWRjQmFja09mZihwQnRDb2V4aXN0LCBwQ29leERtLT5iQ3VyQWRjQmFja09mZik7CgoJcENvZXhEbS0+YlByZUFkY0JhY2tPZmYgPSBwQ29leERtLT5iQ3VyQWRjQmFja09mZjsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfU2V0QWdjVGFibGUoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJYkFnY1RhYmxlRW4KCSkKewoJdTFCeXRlCQlyc3NpQWRqdXN0VmFsPTA7CgkKCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweGVmLCAweGZmZmZmLCAweDAyMDAwKTsKCWlmKGJBZ2NUYWJsZUVuKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBBZ2MgVGFibGUgT24hXG4iKSk7CgkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4M2IsIDB4ZmZmZmYsIDB4M2ZhNTgpOwoJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDNiLCAweGZmZmZmLCAweDM3YTU4KTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgzYiwgMHhmZmZmZiwgMHgyZmE1OCk7CgkJcnNzaUFkanVzdFZhbCA9IDg7Cgl9CgllbHNlCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIEFnYyBUYWJsZSBPZmYhXG4iKSk7CgkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4M2IsIDB4ZmZmZmYsIDB4MzkyNTgpOwoJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDNiLCAweGZmZmZmLCAweDMxMjU4KTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgzYiwgMHhmZmZmZiwgMHgyOTI1OCk7Cgl9CglwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHhlZiwgMHhmZmZmZiwgMHgwKTsKCgkvLyBzZXQgcnNzaUFkanVzdFZhbCBmb3Igd2lmaSBtb2R1bGUuCglwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfVTFfUlNTSV9BREpfVkFMX0ZPUl9BR0NfVEFCTEVfT04sICZyc3NpQWRqdXN0VmFsKTsKfQoKClZPSUQKaGFsYnRjODE5MmUxYW50X0FnY1RhYmxlKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTglCT09MRUFOCQkJYkFnY1RhYmxlRW4KCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyAlcyBBZ2MgVGFibGVcbiIsICAKCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYkFnY1RhYmxlRW4pPyAiRW5hYmxlIjoiRGlzYWJsZSIpKSk7CglwQ29leERtLT5iQ3VyQWdjVGFibGVFbiA9IGJBZ2NUYWJsZUVuOwoKCWlmKCFiRm9yY2VFeGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVBZ2NUYWJsZUVuPSVkLCBiQ3VyQWdjVGFibGVFbj0lZFxuIiwgCgkJCXBDb2V4RG0tPmJQcmVBZ2NUYWJsZUVuLCBwQ29leERtLT5iQ3VyQWdjVGFibGVFbikpOwoKCQlpZihwQ29leERtLT5iUHJlQWdjVGFibGVFbiA9PSBwQ29leERtLT5iQ3VyQWdjVGFibGVFbikgCgkJCXJldHVybjsKCX0KCWhhbGJ0YzgxOTJlMWFudF9TZXRBZ2NUYWJsZShwQnRDb2V4aXN0LCBiQWdjVGFibGVFbik7CgoJcENvZXhEbS0+YlByZUFnY1RhYmxlRW4gPSBwQ29leERtLT5iQ3VyQWdjVGFibGVFbjsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfU2V0Q29leFRhYmxlKAoJSU4JUEJUQ19DT0VYSVNUCXBCdENvZXhpc3QsCglJTgl1NEJ5dGUJCXZhbDB4NmMwLAoJSU4JdTRCeXRlCQl2YWwweDZjNCwKCUlOCXU0Qnl0ZQkJdmFsMHg2YzgsCglJTgl1MUJ5dGUJCXZhbDB4NmNjCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmMwPTB4JXhcbiIsIHZhbDB4NmMwKSk7CglwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg2YzAsIHZhbDB4NmMwKTsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgc2V0IGNvZXggdGFibGUsIHNldCAweDZjND0weCV4XG4iLCB2YWwweDZjNCkpOwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4NmM0LCB2YWwweDZjNCk7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIHNldCBjb2V4IHRhYmxlLCBzZXQgMHg2Yzg9MHgleFxuIiwgdmFsMHg2YzgpKTsKCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweDZjOCwgdmFsMHg2YzgpOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmNjPTB4JXhcbiIsIHZhbDB4NmNjKSk7CglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg2Y2MsIHZhbDB4NmNjKTsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTgl1NEJ5dGUJCQl2YWwweDZjMCwKCUlOCXU0Qnl0ZQkJCXZhbDB4NmM0LAoJSU4JdTRCeXRlCQkJdmFsMHg2YzgsCglJTgl1MUJ5dGUJCQl2YWwweDZjYwoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHdyaXRlIENvZXggVGFibGUgMHg2YzA9MHgleCwgMHg2YzQ9MHgleCwgMHg2Yzg9MHgleCwgMHg2Y2M9MHgleFxuIiwgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCB2YWwweDZjMCwgdmFsMHg2YzQsIHZhbDB4NmM4LCB2YWwweDZjYykpOwoJcENvZXhEbS0+Y3VyVmFsMHg2YzAgPSB2YWwweDZjMDsKCXBDb2V4RG0tPmN1clZhbDB4NmM0ID0gdmFsMHg2YzQ7CglwQ29leERtLT5jdXJWYWwweDZjOCA9IHZhbDB4NmM4OwoJcENvZXhEbS0+Y3VyVmFsMHg2Y2MgPSB2YWwweDZjYzsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBwcmVWYWwweDZjMD0weCV4LCBwcmVWYWwweDZjND0weCV4LCBwcmVWYWwweDZjOD0weCV4LCBwcmVWYWwweDZjYz0weCV4ICEhXG4iLCAKCQkJcENvZXhEbS0+cHJlVmFsMHg2YzAsIHBDb2V4RG0tPnByZVZhbDB4NmM0LCBwQ29leERtLT5wcmVWYWwweDZjOCwgcENvZXhEbS0+cHJlVmFsMHg2Y2MpKTsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBjdXJWYWwweDZjMD0weCV4LCBjdXJWYWwweDZjND0weCV4LCBjdXJWYWwweDZjOD0weCV4LCBjdXJWYWwweDZjYz0weCV4ICEhXG4iLCAKCQkJcENvZXhEbS0+Y3VyVmFsMHg2YzAsIHBDb2V4RG0tPmN1clZhbDB4NmM0LCBwQ29leERtLT5jdXJWYWwweDZjOCwgcENvZXhEbS0+Y3VyVmFsMHg2Y2MpKTsKCQoJCWlmKCAocENvZXhEbS0+cHJlVmFsMHg2YzAgPT0gcENvZXhEbS0+Y3VyVmFsMHg2YzApICYmCgkJCShwQ29leERtLT5wcmVWYWwweDZjNCA9PSBwQ29leERtLT5jdXJWYWwweDZjNCkgJiYKCQkJKHBDb2V4RG0tPnByZVZhbDB4NmM4ID09IHBDb2V4RG0tPmN1clZhbDB4NmM4KSAmJgoJCQkocENvZXhEbS0+cHJlVmFsMHg2Y2MgPT0gcENvZXhEbS0+Y3VyVmFsMHg2Y2MpICkKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODE5MmUxYW50X1NldENvZXhUYWJsZShwQnRDb2V4aXN0LCB2YWwweDZjMCwgdmFsMHg2YzQsIHZhbDB4NmM4LCB2YWwweDZjYyk7CgoJcENvZXhEbS0+cHJlVmFsMHg2YzAgPSBwQ29leERtLT5jdXJWYWwweDZjMDsKCXBDb2V4RG0tPnByZVZhbDB4NmM0ID0gcENvZXhEbS0+Y3VyVmFsMHg2YzQ7CglwQ29leERtLT5wcmVWYWwweDZjOCA9IHBDb2V4RG0tPmN1clZhbDB4NmM4OwoJcENvZXhEbS0+cHJlVmFsMHg2Y2MgPSBwQ29leERtLT5jdXJWYWwweDZjYzsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJCWJGb3JjZUV4ZWMsCglJTgl1MUJ5dGUJCQkJdHlwZQoJKQp7Cglzd2l0Y2godHlwZSkKCXsKCQljYXNlIDA6CgkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgYkZvcmNlRXhlYywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmZmYsIDB4Myk7CgkJCWJyZWFrOwoJCWNhc2UgMToKCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBiRm9yY2VFeGVjLCAweDU1NTU1NTU1LCAweDVhNWE1YTVhLCAweGZmZmZmZiwgMHgzKTsKCQkJYnJlYWs7CgkJY2FzZSAyOgoJCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIGJGb3JjZUV4ZWMsIDB4NWE1YTVhNWEsIDB4NWE1YTVhNWEsIDB4ZmZmZmZmLCAweDMpOwoJCQlicmVhazsKCQljYXNlIDM6CgkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgYkZvcmNlRXhlYywgMHhhYWFhYWFhYSwgMHhhYWFhYWFhYSwgMHhmZmZmZmYsIDB4Myk7CgkJCWJyZWFrOwoJCWNhc2UgNDoKCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBiRm9yY2VFeGVjLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZiwgMHgzKTsKCQkJYnJlYWs7CgkJY2FzZSA1OgoJCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIGJGb3JjZUV4ZWMsIDB4NWZmZjVmZmYsIDB4NWZmZjVmZmYsIDB4ZmZmZmZmLCAweDMpOwoJCQlicmVhazsKCQljYXNlIDY6CgkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgYkZvcmNlRXhlYywgMHg1NWZmNTVmZiwgMHg1YTVhNWE1YSwgMHhmZmZmZmYsIDB4Myk7CgkJCWJyZWFrOwoJCWNhc2UgNzoKCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBiRm9yY2VFeGVjLCAweGRkZmZkZGZmLCAweGRkZmZkZGZmLCAweGZmZmZmZiwgMHgzKTsKCQkJYnJlYWs7CgkJY2FzZSA4OgoJCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIGJGb3JjZUV4ZWMsIDB4NTVmZjU1ZmYsIDB4NWFmYTVhZmEsIDB4ZmZmZmZmLCAweDMpOwoJCQlicmVhazsJCQoJCWNhc2UgOToKCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBiRm9yY2VFeGVjLCAweDVmNWY1ZjVmLCAweDVmNWY1ZjVmLCAweGZmZmZmZiwgMHgzKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJYnJlYWs7Cgl9Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1NldEZ3SWdub3JlV2xhbkFjdCgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRW5hYmxlCgkpCnsKCXUxQnl0ZQkJCUgyQ19QYXJhbWV0ZXJbMV0gPXswfTsKCQkKCWlmKGJFbmFibGUpCgl7CgkJSDJDX1BhcmFtZXRlclswXSB8PSBCSVQwOwkJLy8gZnVuY3Rpb24gZW5hYmxlCgl9CgkKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBzZXQgRlcgZm9yIEJUIElnbm9yZSBXbGFuX0FjdCwgRlcgd3JpdGUgMHg2Mz0weCV4XG4iLCAKCQlIMkNfUGFyYW1ldGVyWzBdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4NjMsIDEsIEgyQ19QYXJhbWV0ZXIpOwp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9JZ25vcmVXbGFuQWN0KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTglCT09MRUFOCQkJYkVuYWJsZQoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIHR1cm4gSWdub3JlIFdsYW5BY3QgJXNcbiIsIAoJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgKGJFbmFibGU/ICJPTiI6Ik9GRiIpKSk7CglwQ29leERtLT5iQ3VySWdub3JlV2xhbkFjdCA9IGJFbmFibGU7CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZUlnbm9yZVdsYW5BY3QgPSAlZCwgYkN1cklnbm9yZVdsYW5BY3QgPSAlZCEhXG4iLCAKCQkJcENvZXhEbS0+YlByZUlnbm9yZVdsYW5BY3QsIHBDb2V4RG0tPmJDdXJJZ25vcmVXbGFuQWN0KSk7CgoJCWlmKHBDb2V4RG0tPmJQcmVJZ25vcmVXbGFuQWN0ID09IHBDb2V4RG0tPmJDdXJJZ25vcmVXbGFuQWN0KQoJCQlyZXR1cm47Cgl9CgloYWxidGM4MTkyZTFhbnRfU2V0RndJZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIGJFbmFibGUpOwoKCXBDb2V4RG0tPmJQcmVJZ25vcmVXbGFuQWN0ID0gcENvZXhEbS0+YkN1cklnbm9yZVdsYW5BY3Q7Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJYnl0ZTEsCglJTgl1MUJ5dGUJCQlieXRlMiwKCUlOCXUxQnl0ZQkJCWJ5dGUzLAoJSU4JdTFCeXRlCQkJYnl0ZTQsCglJTgl1MUJ5dGUJCQlieXRlNQoJKQp7Cgl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzVdID17MH07CgoJSDJDX1BhcmFtZXRlclswXSA9IGJ5dGUxOwkKCUgyQ19QYXJhbWV0ZXJbMV0gPSBieXRlMjsJCglIMkNfUGFyYW1ldGVyWzJdID0gYnl0ZTM7CglIMkNfUGFyYW1ldGVyWzNdID0gYnl0ZTQ7CglIMkNfUGFyYW1ldGVyWzRdID0gYnl0ZTU7CgoJcENvZXhEbS0+cHNUZG1hUGFyYVswXSA9IGJ5dGUxOwoJcENvZXhEbS0+cHNUZG1hUGFyYVsxXSA9IGJ5dGUyOwoJcENvZXhEbS0+cHNUZG1hUGFyYVsyXSA9IGJ5dGUzOwoJcENvZXhEbS0+cHNUZG1hUGFyYVszXSA9IGJ5dGU0OwoJcENvZXhEbS0+cHNUZG1hUGFyYVs0XSA9IGJ5dGU1OwoJCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgRlcgd3JpdGUgMHg2MCg1Ynl0ZXMpPTB4JXglMDh4XG4iLCAKCQlIMkNfUGFyYW1ldGVyWzBdLCAKCQlIMkNfUGFyYW1ldGVyWzFdPDwyNHxIMkNfUGFyYW1ldGVyWzJdPDwxNnxIMkNfUGFyYW1ldGVyWzNdPDw4fEgyQ19QYXJhbWV0ZXJbNF0pKTsKCglwQnRDb2V4aXN0LT5idGNfZmlsbF9oMmMocEJ0Q29leGlzdCwgMHg2MCwgNSwgSDJDX1BhcmFtZXRlcik7Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1NldExwc1Jwd20oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQlscHNWYWwsCglJTgl1MUJ5dGUJCQlycHdtVmFsCgkpCnsKCXUxQnl0ZQlscHM9bHBzVmFsOwoJdTFCeXRlCXJwd209cnB3bVZhbDsKCQoJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX1UxXzFBTlRfTFBTLCAmbHBzKTsKCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9VMV8xQU5UX1JQV00sICZycHdtKTsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfTHBzUnB3bSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JdTFCeXRlCQkJbHBzVmFsLAoJSU4JdTFCeXRlCQkJcnB3bVZhbAoJKQp7CglCT09MRUFOCWJGb3JjZUV4ZWNQd3JDbWQ9RkFMU0U7CgkKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgc2V0IGxwcy9ycHdtPTB4JXgvMHgleCBcbiIsIAoJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgbHBzVmFsLCBycHdtVmFsKSk7CglwQ29leERtLT5jdXJMcHMgPSBscHNWYWw7CglwQ29leERtLT5jdXJScHdtID0gcnB3bVZhbDsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBwcmVMcHMvY3VyTHBzPTB4JXgvMHgleCwgcHJlUnB3bS9jdXJScHdtPTB4JXgvMHgleCEhXG4iLCAKCQkJcENvZXhEbS0+cHJlTHBzLCBwQ29leERtLT5jdXJMcHMsIHBDb2V4RG0tPnByZVJwd20sIHBDb2V4RG0tPmN1clJwd20pKTsKCgkJaWYoIChwQ29leERtLT5wcmVMcHMgPT0gcENvZXhEbS0+Y3VyTHBzKSAmJgoJCQkocENvZXhEbS0+cHJlUnB3bSA9PSBwQ29leERtLT5jdXJScHdtKSApCgkJewoJCQlyZXR1cm47CgkJfQoJfQoJaGFsYnRjODE5MmUxYW50X1NldExwc1Jwd20ocEJ0Q29leGlzdCwgbHBzVmFsLCBycHdtVmFsKTsKCglwQ29leERtLT5wcmVMcHMgPSBwQ29leERtLT5jdXJMcHM7CglwQ29leERtLT5wcmVScHdtID0gcENvZXhEbS0+Y3VyUnB3bTsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20xKAoJSU4JUEJUQ19DT0VYSVNUCXBCdENvZXhpc3QsCQoJSU4JQk9PTEVBTgkJYlNocmlua1J4TFBGLAoJSU4JQk9PTEVBTiAJYkxvd1BlbmFsdHlSQSwKCUlOCUJPT0xFQU4JCWxpbWl0ZWRfZGlnLCAKCUlOCUJPT0xFQU4JCWJCVExOQUNvbnN0cmFpbgoJKSAKewoJLy9oYWxidGM4MTkyZTFhbnRfUmZTaHJpbmsocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIGJTaHJpbmtSeExQRik7CgkvL2hhbGJ0YzgxOTJlMWFudF9Mb3dQZW5hbHR5UmEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIGJMb3dQZW5hbHR5UkEpOwoKCS8vbm8gbGltaXRlZCBESUcKCS8vaGFsYnRjODE5MmUxYW50X1NldEJ0TG5hQ29uc3RyYWluKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBiQlRMTkFDb25zdHJhaW4pOwp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIoCglJTglQQlRDX0NPRVhJU1QJcEJ0Q29leGlzdCwJCglJTglCT09MRUFOCQliQUdDVGFibGVTaGlmdCwKCUlOCUJPT0xFQU4gCWJBRENCYWNrT2ZmLAoJSU4JQk9PTEVBTgkJYlNXREFDU3dpbmcsCglJTgl1NEJ5dGUJCWRhY1N3aW5nTHZsCgkpCnsKCS8vaGFsYnRjODE5MmUxYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBiQUdDVGFibGVTaGlmdCk7CgkvL2hhbGJ0YzgxOTJlMWFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBiQURDQmFja09mZik7CgkvL2hhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgYlNXREFDU3dpbmcsIGRhY1N3aW5nTHZsKTsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfUHNUZG1hKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTglCT09MRUFOCQkJYlR1cm5PbiwKCUlOCXUxQnl0ZQkJCXR5cGUKCSkKewoJQk9PTEVBTgkJCWJUdXJuT25CeUNudD1GQUxTRTsKCXUxQnl0ZQkJCXBzVGRtYVR5cGVCeUNudD0wLCByc3NpQWRqdXN0VmFsPTA7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyB0dXJuICVzIFBTIFRETUEsIHR5cGU9JWRcbiIsIAoJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgKGJUdXJuT24/ICJPTiI6Ik9GRiIpLCB0eXBlKSk7CglwQ29leERtLT5iQ3VyUHNUZG1hT24gPSBiVHVybk9uOwoJcENvZXhEbS0+Y3VyUHNUZG1hID0gdHlwZTsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlUHNUZG1hT24gPSAlZCwgYkN1clBzVGRtYU9uID0gJWQhIVxuIiwgCgkJCXBDb2V4RG0tPmJQcmVQc1RkbWFPbiwgcENvZXhEbS0+YkN1clBzVGRtYU9uKSk7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlUHNUZG1hID0gJWQsIGN1clBzVGRtYSA9ICVkISFcbiIsIAoJCQlwQ29leERtLT5wcmVQc1RkbWEsIHBDb2V4RG0tPmN1clBzVGRtYSkpOwoKCQlpZiggKHBDb2V4RG0tPmJQcmVQc1RkbWFPbiA9PSBwQ29leERtLT5iQ3VyUHNUZG1hT24pICYmCgkJCShwQ29leERtLT5wcmVQc1RkbWEgPT0gcENvZXhEbS0+Y3VyUHNUZG1hKSApCgkJCXJldHVybjsKCX0KCWlmKGJUdXJuT24pCgl7CgkJc3dpdGNoKHR5cGUpCgkJewoJCQlkZWZhdWx0OgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4NTMsIDB4MmMsIDB4MDMsIDB4MTAsIDB4NTApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMToKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDUzLCAweDJjLCAweDAzLCAweDEwLCAweDUwKTsKCQkJCXJzc2lBZGp1c3RWYWwgPSAxMTsKCQkJCWJyZWFrOwoJCQljYXNlIDI6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHg1MywgMHgyNSwgMHgwMywgMHgxMCwgMHg1MCk7CgkJCQlyc3NpQWRqdXN0VmFsID0gMTQ7CgkJCQlicmVhazsKCQkJY2FzZSAzOgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4OTMsIDB4MjUsIDB4MywgMHgxMCwgMHg0MCk7CgkJCQlicmVhazsKCQkJY2FzZSA0OgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4OTMsIDB4MTUsIDB4MywgMHgxNCwgMHgwKTsKCQkJCXJzc2lBZGp1c3RWYWwgPSAxNzsKCQkJCWJyZWFrOwoJCQljYXNlIDU6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHg2MSwgMHgxNSwgMHgzLCAweDMxLCAweDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgNjoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDEzLCAweGEsIDB4MywgMHgwLCAweDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgNzoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDEzLCAweGMsIDB4NSwgMHgwLCAweDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgODoJCgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHg5MywgMHgyNSwgMHgzLCAweDEwLCAweDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgOToJCgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHg1MywgMHgxZSwgMHgwMywgMHgxMCwgMHg1MCk7CgkJCQlyc3NpQWRqdXN0VmFsID0gMTg7CgkJCQlicmVhazsKCQkJY2FzZSAxMDoJCgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHgxMywgMHhhLCAweGEsIDB4MCwgMHg0MCk7CgkJCQlicmVhazsKCQkJY2FzZSAxMToJCgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHg1MywgMHgxMiwgMHgwMywgMHgxMCwgMHg1MCk7CgkJCQlyc3NpQWRqdXN0VmFsID0gMjA7CgkJCQlicmVhazsKCQkJY2FzZSAxMjoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGViLCAweGEsIDB4MywgMHgzMSwgMHgxOCk7CgkJCQlicmVhazsKCgkJCWNhc2UgMTU6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHgxMywgMHhhLCAweDMsIDB4OCwgMHgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDE2OgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4OTMsIDB4MTUsIDB4MywgMHgxMCwgMHgwKTsKCQkJCXJzc2lBZGp1c3RWYWwgPSAxODsKCQkJCWJyZWFrOwoKCQkJY2FzZSAxODoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDkzLCAweDI1LCAweDMsIDB4MTAsIDB4MCk7CgkJCQlyc3NpQWRqdXN0VmFsID0gMTQ7CgkJCQlicmVhazsJCQkKCQkJCQoJCQljYXNlIDIwOgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4MTMsIDB4MjUsIDB4MjUsIDB4MCwgMHgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDIxOgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4OTMsIDB4MjAsIDB4MywgMHgxMCwgMHg0MCk7CgkJCQlicmVhazsKCQkJY2FzZSAyMjoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDEzLCAweDgsIDB4OCwgMHgwLCAweDQwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDIzOgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZTMsIDB4MjUsIDB4MywgMHgzMSwgMHgxOCk7CgkJCQlyc3NpQWRqdXN0VmFsID0gMjI7CgkJCQlicmVhazsKCQkJY2FzZSAyNDoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDE1LCAweDMsIDB4MzEsIDB4MTgpOwoJCQkJcnNzaUFkanVzdFZhbCA9IDIyOwoJCQkJYnJlYWs7CgkJCWNhc2UgMjU6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHhhLCAweDMsIDB4MzEsIDB4MTgpOwoJCQkJcnNzaUFkanVzdFZhbCA9IDIyOwoJCQkJYnJlYWs7CgkJCWNhc2UgMjY6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHhhLCAweDMsIDB4MzEsIDB4MTgpOwoJCQkJcnNzaUFkanVzdFZhbCA9IDIyOwoJCQkJYnJlYWs7CgkJCWNhc2UgMjc6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHgyNSwgMHgzLCAweDMxLCAweDk4KTsKCQkJCXJzc2lBZGp1c3RWYWwgPSAyMjsKCQkJCWJyZWFrOwoJCQljYXNlIDI4OgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4NjksIDB4MjUsIDB4MywgMHgzMSwgMHgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDI5OgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4YWIsIDB4MWEsIDB4MWEsIDB4MSwgMHgxMCk7CgkJCQlicmVhazsKCQkJY2FzZSAzMDoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDkzLCAweDE1LCAweDMsIDB4MTQsIDB4MCk7CgkJCQlicmVhazsKCQkJY2FzZSAzMToKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGQzLCAweDFhLCAweDFhLCAwLCAweDU4KTsKCQkJCWJyZWFrOwoJCQljYXNlIDMyOgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4YWIsIDB4YSwgMHgzLCAweDMxLCAweDkwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDMzOgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4YTMsIDB4MjUsIDB4MywgMHgzMCwgMHg5MCk7CgkJCQlicmVhazsKCQkJY2FzZSAzNDoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGQzLCAweDFhLCAweDFhLCAweDAsIDB4MTApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMzU6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHgxYSwgMHgxYSwgMHgwLCAweDEwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDM2OgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZDMsIDB4MTIsIDB4MywgMHgxNCwgMHg1MCk7CgkJCQlicmVhazsKCQkJY2FzZSAzNzoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDUzLCAweDI1LCAweDMsIDB4MTAsIDB4NTApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMzg6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHgxMiwgMHgxMiwgMHhlMSwgMHg5MCk7CgkJCQlicmVhazsKCQl9Cgl9CgllbHNlCgl7CgkJLy8gZGlzYWJsZSBQUyB0ZG1hCgkJc3dpdGNoKHR5cGUpCgkJewoJCQljYXNlIDg6CQkvLzB4Nzc4ID0gMSwgYW50MlBUQQoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4OCwgMHgwLCAweDAsIDB4MCwgMHgwKTsKCQkJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDkyYywgMHg0KTsKCQkJCWJyZWFrOwoJCQljYXNlIDA6CQkvLzB4Nzc4ID0gMSwgYW50MkJUCgkJCWRlZmF1bHQ6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDApOwoJCQkJbWRlbGF5KDUpOwoJCQkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4OTJjLCAweDIwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDk6CQkvLzB4Nzc4ID0gMSwgYW50MldJRkkKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCk7CgkJCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg5MmMsIDB4NCk7CgkJCQlicmVhazsKCQkJY2FzZSAxMDoJLy8weDc3OCA9IDMsIGFudDJCVAoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4MCwgMHgwLCAweDAsIDB4OCwgMHgwKTsKCQkJCW1kZWxheSg1KTsKCQkJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDkyYywgMHgyMCk7CgkJCQlicmVhazsKCQl9Cgl9Cglyc3NpQWRqdXN0VmFsID0wOwoJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX1UxX1JTU0lfQURKX1ZBTF9GT1JfMUFOVF9DT0VYX1RZUEUsICZyc3NpQWRqdXN0VmFsKTsKCgkvLyB1cGRhdGUgcHJlIHN0YXRlCglwQ29leERtLT5iUHJlUHNUZG1hT24gPSBwQ29leERtLT5iQ3VyUHNUZG1hT247CglwQ29leERtLT5wcmVQc1RkbWEgPSBwQ29leERtLT5jdXJQc1RkbWE7Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1NldFN3aXRjaFNzVHlwZSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCQlzc1R5cGUKCSkKewoJdTFCeXRlCW1pbW9Qcz1CVENfTUlNT19QU19EWU5BTUlDOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUkVBTCBzZXQgU1MgVHlwZSA9ICVkXG4iLCBzc1R5cGUpKTsKCglpZihzc1R5cGUgPT0gMSkKCXsKCQloYWxidGM4MTkyZTFhbnRfVXBkYXRlcmFfbWFzayhwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBCVENfUkFURV9ESVNBQkxFLCAweGZmZjAwMDAwKTsJLy8gZGlzYWJsZSAyc3MKCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFLCAwKTsKCQkvLyBzd2l0Y2ggb2ZkbSBwYXRoCgkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4YzA0LCAweDExKTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHhkMDQsIDB4MSk7CgkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4OTBjLCAweDgxMTExMTExKTsKCQkvLyBzd2l0Y2ggY2NrIHBhdGNoCgkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2socEJ0Q29leGlzdCwgMHhlNzcsIDB4NCwgMHgxKTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHhhMDcsIDB4ODEpOwoJCW1pbW9Qcz1CVENfTUlNT19QU19TVEFUSUM7Cgl9CgllbHNlIGlmKHNzVHlwZSA9PSAyKQoJewoJCWhhbGJ0YzgxOTJlMWFudF9VcGRhdGVyYV9tYXNrKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEJUQ19SQVRFX0VOQUJMRSwgMHhmZmYwMDAwMCk7CS8vIGVuYWJsZSAyc3MKCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFLCA4KTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHhjMDQsIDB4MzMpOwoJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweGQwNCwgMHgzKTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg5MGMsIDB4ODExMjEzMTMpOwoJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKHBCdENvZXhpc3QsIDB4ZTc3LCAweDQsIDB4MCk7CgkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4YTA3LCAweDQxKTsKCQltaW1vUHM9QlRDX01JTU9fUFNfRFlOQU1JQzsKCX0KCQoJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0FDVF9TRU5EX01JTU9fUFMsICZtaW1vUHMpOwkvLyBzZXQgcnggMXNzIG9yIDJzcwp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9Td2l0Y2hTc1R5cGUoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJCWJGb3JjZUV4ZWMsCglJTgl1MUJ5dGUJCQkJbmV3U3NUeXBlCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgJXMgU3dpdGNoIFNTIFR5cGUgPSAlZFxuIiwgIAoJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgbmV3U3NUeXBlKSk7CglwQ29leERtLT5jdXJTc1R5cGUgPSBuZXdTc1R5cGU7CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJaWYocENvZXhEbS0+cHJlU3NUeXBlID09IHBDb2V4RG0tPmN1clNzVHlwZSkgCgkJCXJldHVybjsKCX0KCWhhbGJ0YzgxOTJlMWFudF9TZXRTd2l0Y2hTc1R5cGUocEJ0Q29leGlzdCwgcENvZXhEbS0+Y3VyU3NUeXBlKTsKCglwQ29leERtLT5wcmVTc1R5cGUgPSBwQ29leERtLT5jdXJTc1R5cGU7Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X0NvZXhBbGxPZmYoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKCgkvLyBzdyBhbGwgb2ZmCgloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20xKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsRkFMU0UpOwoJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLDB4MTgpOwoKCgkvLyBodyBhbGwgb2ZmCgloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwp9CgpCT09MRUFOCmhhbGJ0YzgxOTJlMWFudF9Jc0NvbW1vbkFjdGlvbigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CglCT09MRUFOCQkJYkNvbW1vbj1GQUxTRSwgYldpZmlDb25uZWN0ZWQ9RkFMU0UsIGJXaWZpQnVzeT1GQUxTRTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZiV2lmaUNvbm5lY3RlZCk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9CVVNZLCAmYldpZmlCdXN5KTsKCglpZighYldpZmlDb25uZWN0ZWQgJiYgCgkJQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBub24gY29ubmVjdGVkLWlkbGUgKyBCVCBub24gY29ubmVjdGVkLWlkbGUhIVxuIikpOwkJCiAJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTEocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSxGQUxTRSk7CgkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLDB4MTgpOwoKCQliQ29tbW9uID0gdHJ1ZTsKCX0KCWVsc2UgaWYoYldpZmlDb25uZWN0ZWQgJiYgCgkJKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cykgKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBjb25uZWN0ZWQgKyBCVCBub24gY29ubmVjdGVkLWlkbGUhIVxuIikpOwogICAgICAJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMShwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLEZBTFNFKTsKCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CgoJCWJDb21tb24gPSB0cnVlOwoJfQoJZWxzZSBpZighYldpZmlDb25uZWN0ZWQgJiYgCgkJKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKSApCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBXaWZpIG5vbiBjb25uZWN0ZWQtaWRsZSArIEJUIGNvbm5lY3RlZC1pZGxlISFcbiIpKTsKCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20xKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsRkFMU0UpOwoJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKCgkJYkNvbW1vbiA9IHRydWU7Cgl9CgllbHNlIGlmKGJXaWZpQ29ubmVjdGVkICYmIAoJCShCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cykgKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBjb25uZWN0ZWQgKyBCVCBjb25uZWN0ZWQtaWRsZSEhXG4iKSk7CgkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMShwQnRDb2V4aXN0LHRydWUsdHJ1ZSx0cnVlLHRydWUpOwoJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKCgkJYkNvbW1vbiA9IHRydWU7Cgl9CgllbHNlIGlmKCFiV2lmaUNvbm5lY3RlZCAmJiAKCQkoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgIT0gcENvZXhEbS0+YnRTdGF0dXMpICkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFdpZmkgbm9uIGNvbm5lY3RlZC1pZGxlICsgQlQgQnVzeSEhXG4iKSk7CgkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMShwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLEZBTFNFKTsKCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CgkJCgkJYkNvbW1vbiA9IHRydWU7Cgl9CgllbHNlCgl7CgkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMShwQnRDb2V4aXN0LHRydWUsdHJ1ZSx0cnVlLHRydWUpOwoJCQoJCWJDb21tb24gPSBGQUxTRTsKCX0KCQoJcmV0dXJuIGJDb21tb247Cn0KCgpWT0lECmhhbGJ0YzgxOTJlMWFudF9UZG1hRHVyYXRpb25BZGp1c3RGb3JBY2woCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQkJd2lmaVN0YXR1cwoJKQp7CglzdGF0aWMgczRCeXRlCQl1cCxkbixtLG4sV2FpdENvdW50OwoJczRCeXRlCQkJcmVzdWx0OyAgIC8vMDogbm8gY2hhbmdlLCArMTogaW5jcmVhc2UgV2lGaSBkdXJhdGlvbiwgLTE6IGRlY3JlYXNlIFdpRmkgZHVyYXRpb24KCXUxQnl0ZQkJCXJldHJ5Q291bnQ9MCwgYnRJbmZvRXh0OwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgVGRtYUR1cmF0aW9uQWRqdXN0Rm9yQWNsKClcbiIpKTsKCglpZiggKEJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9BU1NPX0FVVEhfU0NBTiA9PSB3aWZpU3RhdHVzKSB8fAoJCShCVF84MTkyRV8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9TQ0FOID09IHdpZmlTdGF0dXMpIHx8CgkJKEJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfQ09OTkVDVEVEX1NQRUNJQUxfUEtUID09IHdpZmlTdGF0dXMpICkKCXsKCQlpZiggcENvZXhEbS0+Y3VyUHNUZG1hICE9IDEgJiYKCQkJcENvZXhEbS0+Y3VyUHNUZG1hICE9IDIgJiYKCQkJcENvZXhEbS0+Y3VyUHNUZG1hICE9IDMgJiYKCQkJcENvZXhEbS0+Y3VyUHNUZG1hICE9IDkgKQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CgkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDk7CgoJCQl1cCA9IDA7CgkJCWRuID0gMDsKCQkJbSA9IDE7CgkJCW49IDM7CgkJCXJlc3VsdCA9IDA7CgkJCVdhaXRDb3VudCA9IDA7CgkJfQkJCgkJcmV0dXJuOwoJfQoKCWlmKCFwQ29leERtLT5iQXV0b1RkbWFBZGp1c3QpCgl7CgkJcENvZXhEbS0+YkF1dG9UZG1hQWRqdXN0ID0gdHJ1ZTsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBmaXJzdCBydW4gVGRtYUR1cmF0aW9uQWRqdXN0KCkhIVxuIikpOwoKCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOwoJCS8vPT09PT09PT09PT09CgkJdXAgPSAwOwoJCWRuID0gMDsKCQltID0gMTsKCQluPSAzOwoJCXJlc3VsdCA9IDA7CgkJV2FpdENvdW50ID0gMDsKCX0KCWVsc2UKCXsKCQkvL2FjY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyCgkJcmV0cnlDb3VudCA9IHBDb2V4U3RhLT5idFJldHJ5Q250OwoJCWJ0SW5mb0V4dCA9IHBDb2V4U3RhLT5idEluZm9FeHQ7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcmV0cnlDb3VudCA9ICVkXG4iLCByZXRyeUNvdW50KSk7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgdXA9JWQsIGRuPSVkLCBtPSVkLCBuPSVkLCBXYWl0Q291bnQ9JWRcbiIsIAoJCQl1cCwgZG4sIG0sIG4sIFdhaXRDb3VudCkpOwoJCXJlc3VsdCA9IDA7CgkJV2FpdENvdW50Kys7IAoJCSAgCgkJaWYocmV0cnlDb3VudCA9PSAwKSAgLy8gbm8gcmV0cnkgaW4gdGhlIGxhc3QgMi1zZWNvbmQgZHVyYXRpb24KCQl7CgkJCXVwKys7CgkJCWRuLS07CgoJCQlpZiAoZG4gPD0gMCkKCQkJCWRuID0gMDsJCQkJIAoKCQkJaWYodXAgPj0gbikJLy8gaWYgs3PE8iBuIK3TMqztIHJldHJ5IGNvdW50rLAwLCCraL3VvGVXaUZpIGR1cmF0aW9uCgkJCXsKCQkJCVdhaXRDb3VudCA9IDA7IAoJCQkJbiA9IDM7CgkJCQl1cCA9IDA7CgkJCQlkbiA9IDA7CgkJCQlyZXN1bHQgPSAxOyAKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIEluY3JlYXNlIHdpZmkgZHVyYXRpb24hIVxuIikpOwoJCQl9CgkJfQoJCWVsc2UgaWYgKHJldHJ5Q291bnQgPD0gMykJLy8gPD0zIHJldHJ5IGluIHRoZSBsYXN0IDItc2Vjb25kIGR1cmF0aW9uCgkJewoJCQl1cC0tOyAKCQkJZG4rKzsKCgkJCWlmICh1cCA8PSAwKQoJCQkJdXAgPSAwOwoKCQkJaWYgKGRuID09IDIpCS8vIGlmILNzxPIgMiCt0zKs7SByZXRyeSBjb3VudDwgMywgq2i91a+2V2lGaSBkdXJhdGlvbgoJCQl7CgkJCQlpZiAoV2FpdENvdW50IDw9IDIpCgkJCQkJbSsrOyAvLyDB16dLpECqvaZiqOKt02xldmVspKSo06ZeCgkJCQllbHNlCgkJCQkJbSA9IDE7CgoJCQkJaWYgKCBtID49IDIwKSAvL20gs8ykaq3IID0gMjAgJyCzzKRqMTIwrO0gcmVjaGVja6xPp1+91b7jIFdpRmkgZHVyYXRpb24uCgkJCQkJbSA9IDIwOwoKCQkJCW4gPSAzKm07CgkJCQl1cCA9IDA7CgkJCQlkbiA9IDA7CgkJCQlXYWl0Q291bnQgPSAwOwoJCQkJcmVzdWx0ID0gLTE7IAoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgRGVjcmVhc2Ugd2lmaSBkdXJhdGlvbiBmb3IgcmV0cnlDb3VudGVyPDMhIVxuIikpOwoJCQl9CgkJfQoJCWVsc2UgIC8vcmV0cnkgY291bnQgPiAzLCClda1uMaa4IHJldHJ5IGNvdW50ID4gMywgq2i91a+2V2lGaSBkdXJhdGlvbgoJCXsKCQkJaWYgKFdhaXRDb3VudCA9PSAxKQoJCQkJbSsrOyAvLyDB16dLpECqvaZiqOKt02xldmVspKSo06ZeCgkJCWVsc2UKCQkJCW0gPSAxOwoKCQkJaWYgKCBtID49IDIwKSAvL20gs8ykaq3IID0gMjAgJyCzzKRqMTIwrO0gcmVjaGVja6xPp1+91b7jIFdpRmkgZHVyYXRpb24uCgkJCQltID0gMjA7CgoJCQluID0gMyptOwoJCQl1cCA9IDA7CgkJCWRuID0gMDsKCQkJV2FpdENvdW50ID0gMDsgCgkJCXJlc3VsdCA9IC0xOwoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBEZWNyZWFzZSB3aWZpIGR1cmF0aW9uIGZvciByZXRyeUNvdW50ZXI+MyEhXG4iKSk7CgkJfQoKCQlpZihyZXN1bHQgPT0gLTEpCgkJewoJCQlpZiggKEJUX0lORk9fODE5MkVfMUFOVF9BMkRQX0JBU0lDX1JBVEUoYnRJbmZvRXh0KSkgJiYKCQkJCSgocENvZXhEbS0+Y3VyUHNUZG1hID09IDEpIHx8KHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyKSkgKQoJCQl7CgkJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA5KTsKCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDk7CgkJCX0KCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMSkKCQkJewoJCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOwoJCQl9CgkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDIpCgkJCXsKCQkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOwoJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gOTsKCQkJfQoJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA5KQoJCQl7CgkJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CgkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKCQkJfQoJCX0KCQllbHNlIGlmKHJlc3VsdCA9PSAxKQoJCXsKCQkJaWYoIChCVF9JTkZPXzgxOTJFXzFBTlRfQTJEUF9CQVNJQ19SQVRFKGJ0SW5mb0V4dCkpICYmCgkJCQkoKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxKSB8fChwQ29leERtLT5jdXJQc1RkbWEgPT0gMikpICkKCQkJewoJCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CgkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA5OwoJCQl9CgkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDExKQoJCQl7CgkJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA5KTsKCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDk7CgkJCX0KCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOSkKCQkJewoJCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOwoJCQl9CgkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDIpCgkJCXsKCQkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEpOwoJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTsKCQkJfQoJCX0KCgkJaWYoIHBDb2V4RG0tPmN1clBzVGRtYSAhPSAxICYmCgkJCXBDb2V4RG0tPmN1clBzVGRtYSAhPSAyICYmCgkJCXBDb2V4RG0tPmN1clBzVGRtYSAhPSA5ICYmCgkJCXBDb2V4RG0tPmN1clBzVGRtYSAhPSAxMSApCgkJewoJCQkvLyByZWNvdmVyIHRvIHByZXZpb3VzIGFkanVzdCB0eXBlCgkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIHBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSk7CgkJfQoJfQp9Cgp1MUJ5dGUKaGFsYnRjODE5MmUxYW50X1BzVGRtYVR5cGVCeVdpZmlSc3NpKAoJSU4JczRCeXRlCXdpZmlSc3NpLAoJSU4JczRCeXRlCXByZVdpZmlSc3NpLAoJSU4JdTFCeXRlCXdpZmlSc3NpVGhyZXNoCgkpCnsKCXUxQnl0ZQlwc1RkbWFUeXBlPTA7CgkKCWlmKHdpZmlSc3NpID4gcHJlV2lmaVJzc2kpCgl7CgkJaWYod2lmaVJzc2kgPiAod2lmaVJzc2lUaHJlc2grNSkpCgkJewoJCQlwc1RkbWFUeXBlID0gMjY7CgkJfQoJCWVsc2UKCQl7CgkJCXBzVGRtYVR5cGUgPSAyNTsKCQl9Cgl9CgllbHNlCgl7CgkJaWYod2lmaVJzc2kgPiB3aWZpUnNzaVRocmVzaCkKCQl7CgkJCXBzVGRtYVR5cGUgPSAyNjsKCQl9CgkJZWxzZQoJCXsKCQkJcHNUZG1hVHlwZSA9IDI1OwoJCX0KCX0KCglyZXR1cm4gcHNUZG1hVHlwZTsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliTmV3UHNTdGF0ZQoJKQp7Cgl1MUJ5dGUJbHBzTW9kZT0weDA7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1UxX0xQU19NT0RFLCAmbHBzTW9kZSk7CgkKCWlmKGxwc01vZGUpCS8vIGFscmVhZHkgdW5kZXIgTFBTIHN0YXRlCgl7CgkJaWYoYk5ld1BzU3RhdGUpCQkKCQl7CgkJCS8vIGtlZXAgc3RhdGUgdW5kZXIgTFBTLCBkbyBub3RoaW5nLgoJCX0KCQllbHNlCgkJewoJCQkvLyB3aWxsIGxlYXZlIExQUyBzdGF0ZSwgdHVybiBvZmYgcHNUZG1hIGZpcnN0CgkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsKCQl9Cgl9CgllbHNlCQkJCQkJLy8gTk8gUFMgc3RhdGUKCXsKCQlpZihiTmV3UHNTdGF0ZSkKCQl7CgkJCS8vIHdpbGwgZW50ZXIgTFBTIHN0YXRlLCB0dXJuIG9mZiBwc1RkbWEgZmlyc3QKCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoJCX0KCQllbHNlCgkJewoJCQkvLyBrZWVwIHN0YXRlIHVuZGVyIE5PIFBTIHN0YXRlLCBkbyBub3RoaW5nLgoJCX0KCX0KfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQkJcHNUeXBlLAoJSU4JdTFCeXRlCQkJCWxwc1ZhbCwKCUlOCXUxQnl0ZQkJCQlycHdtVmFsCgkpCnsKCUJPT0xFQU4JCWJMb3dQd3JEaXNhYmxlPUZBTFNFOwoKCXN3aXRjaChwc1R5cGUpCgl7CgkJY2FzZSBCVENfUFNfV0lGSV9OQVRJVkU6CgkJCS8vIHJlY292ZXIgdG8gb3JpZ2luYWwgMzJrIGxvdyBwb3dlciBzZXR0aW5nCgkJCWJMb3dQd3JEaXNhYmxlID0gRkFMU0U7CgkJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9BQ1RfRElTQUJMRV9MT1dfUE9XRVIsICZiTG93UHdyRGlzYWJsZSk7CgkJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9BQ1RfTk9STUFMX0xQUywgTlVMTCk7CgkJCWJyZWFrOwoJCWNhc2UgQlRDX1BTX0xQU19PTjoKCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYUNoZWNrRm9yUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgdHJ1ZSk7CgkJCWhhbGJ0YzgxOTJlMWFudF9McHNScHdtKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBscHNWYWwsIHJwd21WYWwpOwoJCQkvLyB3aGVuIGNvZXggZm9yY2UgdG8gZW50ZXIgTFBTLCBkbyBub3QgZW50ZXIgMzJrIGxvdyBwb3dlci4KCQkJYkxvd1B3ckRpc2FibGUgPSB0cnVlOwoJCQlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQUNUX0RJU0FCTEVfTE9XX1BPV0VSLCAmYkxvd1B3ckRpc2FibGUpOwoJCQkvLyBwb3dlciBzYXZlIG11c3QgZXhlY3V0ZWQgYmVmb3JlIHBzVGRtYS4KCQkJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0FDVF9FTlRFUl9MUFMsIE5VTEwpOwoJCQlicmVhazsKCQljYXNlIEJUQ19QU19MUFNfT0ZGOgoJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShwQnRDb2V4aXN0LCBGQUxTRSk7CgkJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJYnJlYWs7Cgl9Cn0KCgpWT0lECmhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpT25seSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CgloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwoJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDkpOwkKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfTW9uaXRvckJ0RW5hYmxlRGlzYWJsZSgKCUlOIAlQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJc3RhdGljIEJPT0xFQU4JYlByZUJ0RGlzYWJsZWQ9RkFMU0U7CglzdGF0aWMgdTRCeXRlCQlidERpc2FibGVDbnQ9MDsKCUJPT0xFQU4JCQliQnRBY3RpdmU9dHJ1ZSwgYkJ0RGlzYWJsZWQ9RkFMU0U7CgoJLy8gVGhpcyBmdW5jdGlvbiBjaGVjayBpZiBidCBpcyBkaXNhYmxlZAoKCWlmKAlwQ29leFN0YS0+aGlnaFByaW9yaXR5VHggPT0gMCAmJgoJCXBDb2V4U3RhLT5oaWdoUHJpb3JpdHlSeCA9PSAwICYmCgkJcENvZXhTdGEtPmxvd1ByaW9yaXR5VHggPT0gMCAmJgoJCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4ID09IDApCgl7CgkJYkJ0QWN0aXZlID0gRkFMU0U7Cgl9CglpZigJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVR4ID09IDB4ZmZmZiAmJgoJCXBDb2V4U3RhLT5oaWdoUHJpb3JpdHlSeCA9PSAweGZmZmYgJiYKCQlwQ29leFN0YS0+bG93UHJpb3JpdHlUeCA9PSAweGZmZmYgJiYKCQlwQ29leFN0YS0+bG93UHJpb3JpdHlSeCA9PSAweGZmZmYpCgl7CgkJYkJ0QWN0aXZlID0gRkFMU0U7Cgl9CglpZihiQnRBY3RpdmUpCgl7CgkJYnREaXNhYmxlQ250ID0gMDsKCQliQnREaXNhYmxlZCA9IEZBTFNFOwoJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9CVF9ESVNBQkxFLCAmYkJ0RGlzYWJsZWQpOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLCAoIltCVENvZXhdLCBCVCBpcyBlbmFibGVkICEhXG4iKSk7Cgl9CgllbHNlCgl7CgkJYnREaXNhYmxlQ250Kys7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIGJ0IGFsbCBjb3VudGVycz0wLCAlZCB0aW1lcyEhXG4iLCAKCQkJCWJ0RGlzYWJsZUNudCkpOwoJCWlmKGJ0RGlzYWJsZUNudCA+PSAyKQoJCXsKCQkJYkJ0RGlzYWJsZWQgPSB0cnVlOwoJCQlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQkxfQlRfRElTQUJMRSwgJmJCdERpc2FibGVkKTsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEJUIGlzIGRpc2FibGVkICEhXG4iKSk7CgkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpT25seShwQnRDb2V4aXN0KTsKCQl9Cgl9CglpZihiUHJlQnREaXNhYmxlZCAhPSBiQnREaXNhYmxlZCkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgQlQgaXMgZnJvbSAlcyB0byAlcyEhXG4iLCAKCQkJKGJQcmVCdERpc2FibGVkID8gImRpc2FibGVkIjoiZW5hYmxlZCIpLCAKCQkJKGJCdERpc2FibGVkID8gImRpc2FibGVkIjoiZW5hYmxlZCIpKSk7CgkJYlByZUJ0RGlzYWJsZWQgPSBiQnREaXNhYmxlZDsKCQlpZighYkJ0RGlzYWJsZWQpCgkJewoJCX0KCQllbHNlCgkJewoJCQlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQUNUX0xFQVZFX0xQUywgTlVMTCk7CgkJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9BQ1RfTk9STUFMX0xQUywgTlVMTCk7CgkJfQoJfQp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLwlTb2Z0d2FyZSBDb2V4IE1lY2hhbmlzbSBzdGFydAovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy8gU0NPIG9ubHkgb3IgU0NPK1BBTihIUykKVk9JRApoYWxidGM4MTkyZTFhbnRfQWN0aW9uU2NvKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXUxQnl0ZQl3aWZpUnNzaVN0YXRlOwoJdTRCeXRlCXdpZmlCdzsKCgl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODE5MmUxYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjUsIDApOwoJCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CgoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJICBoYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQkgIGhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCX0KCWVsc2UKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CgkJfQkJCgl9Cn0KCgpWT0lECmhhbGJ0YzgxOTJlMWFudF9BY3Rpb25IaWQoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTFCeXRlCXdpZmlSc3NpU3RhdGU7CQoJdTRCeXRlCXdpZmlCdzsKCgl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODE5MmUxYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjUsIDApOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKCglpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSxGQUxTRSxGQUxTRSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLDB4MTgpOwoJCX0KCX0KCWVsc2UKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CgkJfQkJCgl9Cn0KCi8vQTJEUCBvbmx5IC8gUEFOKEVEUikgb25seS8gQTJEUCtQQU4oSFMpClZPSUQKaGFsYnRjODE5MmUxYW50X0FjdGlvbkEyZHAoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpUnNzaVN0YXRlOwoJdTRCeXRlCQl3aWZpQnc7CgoJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0YzgxOTJlMWFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDI1LCAwKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CgoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LHRydWUsdHJ1ZSxGQUxTRSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJfQoJZWxzZQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKCQl9CQkKCX0KfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfQWN0aW9uQTJkcFBhbkhzKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXUxQnl0ZQkJd2lmaVJzc2lTdGF0ZSwgYnRJbmZvRXh0OwoJdTRCeXRlCQl3aWZpQnc7CgoJYnRJbmZvRXh0ID0gcENvZXhTdGEtPmJ0SW5mb0V4dDsKCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4MTkyZTFhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNSwgMCk7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCX0KCWVsc2UKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CgkJfQkJCgl9Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X0FjdGlvblBhbkVkcigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1MUJ5dGUJCXdpZmlSc3NpU3RhdGU7Cgl1NEJ5dGUJCXdpZmlCdzsKCgl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODE5MmUxYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjUsIDApOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKCglpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsdHJ1ZSxGQUxTRSwweDE4KTsKCQl9Cgl9CgllbHNlCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LHRydWUsdHJ1ZSxGQUxTRSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLDB4MTgpOwoJCX0KCX0KfQoKCi8vUEFOKEhTKSBvbmx5ClZPSUQKaGFsYnRjODE5MmUxYW50X0FjdGlvblBhbkhzKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXUxQnl0ZQkJd2lmaVJzc2lTdGF0ZTsKCXU0Qnl0ZQkJd2lmaUJ3OwoKCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4MTkyZTFhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNSwgMCk7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCX0KCWVsc2UKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CgkJfQoJfQp9CgovL1BBTihFRFIpK0EyRFAKVk9JRApoYWxidGM4MTkyZTFhbnRfQWN0aW9uUGFuRWRyQTJkcCgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1MUJ5dGUJCXdpZmlSc3NpU3RhdGUsIGJ0SW5mb0V4dDsKCXU0Qnl0ZQkJd2lmaUJ3OwoKCWJ0SW5mb0V4dCA9IHBDb2V4U3RhLT5idEluZm9FeHQ7Cgl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODE5MmUxYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjUsIDApOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKCglpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsdHJ1ZSxGQUxTRSwweDE4KTsKCQl9Cgl9CgllbHNlCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LHRydWUsdHJ1ZSxGQUxTRSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLDB4MTgpOwoJCX0KCX0KfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfQWN0aW9uUGFuRWRySGlkKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXUxQnl0ZQkJd2lmaVJzc2lTdGF0ZTsKCXU0Qnl0ZQkJd2lmaUJ3OwoKCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4MTkyZTFhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNSwgMCk7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCX0KCWVsc2UKCXsJCQoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKCQl9Cgl9Cn0KCi8vIEhJRCtBMkRQK1BBTihFRFIpClZPSUQKaGFsYnRjODE5MmUxYW50X0FjdGlvbkhpZEEyZHBQYW5FZHIoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpUnNzaVN0YXRlLCBidEluZm9FeHQ7Cgl1NEJ5dGUJCXdpZmlCdzsKCglidEluZm9FeHQgPSBwQ29leFN0YS0+YnRJbmZvRXh0OwoJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0YzgxOTJlMWFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDI1LCAwKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CgoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCgl7CQoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCX0KCWVsc2UKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CgkJfQoJfQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9BY3Rpb25IaWRBMmRwKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXUxQnl0ZQkJd2lmaVJzc2lTdGF0ZSwgYnRJbmZvRXh0OwoJdTRCeXRlCQl3aWZpQnc7CgoJYnRJbmZvRXh0ID0gcENvZXhTdGEtPmJ0SW5mb0V4dDsKCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4MTkyZTFhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNSwgMCk7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQoJewkJCgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LHRydWUsdHJ1ZSxGQUxTRSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJfQoJZWxzZQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKCQl9Cgl9Cn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vCi8vCU5vbi1Tb2Z0d2FyZSBDb2V4IE1lY2hhbmlzbSBzdGFydAovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpWT0lECmhhbGJ0YzgxOTJlMWFudF9BY3Rpb25CdElucXVpcnkoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJUEJUQ19CVF9MSU5LX0lORk8JcEJ0TGlua0luZm89JnBCdENvZXhpc3QtPmJ0X2xpbmtfaW5mbzsKCUJPT0xFQU4JCQkJYldpZmlDb25uZWN0ZWQ9RkFMU0UsIGJCdEhzT249RkFMU0U7CgkKCS8vIE5vdGU6CgkvLyBEbyBub3QgZG8gRGFjU3dpbmcgaGVyZSwgdXNlIG9yaWdpbmFsIHNldHRpbmcuCgkKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJmJXaWZpQ29ubmVjdGVkKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYkJ0SHNPbik7CglpZihiQnRIc09uKQoJCXJldHVybjsKCglpZighYldpZmlDb25uZWN0ZWQpCgl7CgkJaGFsYnRjODE5MmUxYW50X1Bvd2VyU2F2ZVN0YXRlKHBCdENvZXhpc3QsIEJUQ19QU19XSUZJX05BVElWRSwgMHgwLCAweDApOwoJCQoJCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CgoJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCA4KTsKCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwoJfQoJZWxzZSBpZiggKHBCdExpbmtJbmZvLT5iU2NvRXhpc3QpIHx8CgkJCShwQnRMaW5rSW5mby0+YkhpZE9ubHkpICkKCXsKCQkvLyBTQ08vSElELW9ubHkgYnVzeQoJCWhhbGJ0YzgxOTJlMWFudF9Qb3dlclNhdmVTdGF0ZShwQnRDb2V4aXN0LCBCVENfUFNfV0lGSV9OQVRJVkUsIDB4MCwgMHgwKTsKCQkKCQloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwoKCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzMik7CgkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAxKTsKCX0KCWVsc2UKCXsKCQloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX0xQU19PTiwgMHg1MCwgMHgwKTsKCgkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKCgkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMzApOwoJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7Cgl9Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X0FjdGlvbkJ0U2NvSGlkT25seUJ1c3koCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQkJd2lmaVN0YXR1cwoJKQp7CglQQlRDX0JUX0xJTktfSU5GTyBwQnRMaW5rSW5mbz0mcEJ0Q29leGlzdC0+YnRfbGlua19pbmZvOwoJdTFCeXRlCQlidFJzc2lTdGF0ZT1CVENfUlNTSV9TVEFURV9ISUdIOwoKCWlmKEJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9BU1NPX0FVVEhfU0NBTiA9PSB3aWZpU3RhdHVzKQoJewkJCgkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKCQloYWxidGM4MTkyZTFhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsKCQoJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCA4KTsKCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwoJfQoJZWxzZQoJewoJCWlmKHBCdExpbmtJbmZvLT5iSGlkT25seSkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CgkJCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoJCQoJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgOCk7CgkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CgkJfQoJCWVsc2UKCQl7CgkJCS8vIGRlYyBidCBwb3dlciBmb3IgZGlmZiBsZXZlbAoJCQlidFJzc2lTdGF0ZSA9IGhhbGJ0YzgxOTJlMWFudF9CdFJzc2lTdGF0ZSgzLCAzNCwgNDIpOwoJCQlpZiggKGJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKCQkJCShidFJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykgKQoJCQl7CgkJCQloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwoJCQl9CgkJCWVsc2UgaWYoIChidFJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9NRURJVU0pIHx8CgkJCQkJKGJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNKSApCgkJCXsKCQkJCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CgkJCX0KCQkJZWxzZSBpZiggKGJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCQkJKGJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCQl7CgkJCQloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDYpOwoJCQl9CgoJCQkvLyBzdyBkYWNTd2luZwoJCQloYWxidGM4MTkyZTFhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDB4Yyk7CgoJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CgkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgNyk7CQkJCgkJfQoJfQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9BY3Rpb25IcygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CglQQlRDX0JUX0xJTktfSU5GTyBwQnRMaW5rSW5mbz0mcEJ0Q29leGlzdC0+YnRfbGlua19pbmZvOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGZvciBIUyEhIVxuIikpOwoKCWhhbGJ0YzgxOTJlMWFudF9Qb3dlclNhdmVTdGF0ZShwQnRDb2V4aXN0LCBCVENfUFNfV0lGSV9OQVRJVkUsIDB4MCwgMHgwKTsKCglpZihCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19OT05fQ09OTkVDVEVEX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpCgl7CgkJLy8gZXJyb3IsIHNob3VsZCBub3QgYmUgaGVyZQoJCXBDb2V4RG0tPmVycm9yQ29uZGl0aW9uID0gMTsKCX0KCWVsc2UgaWYoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpCgl7CgkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKCQloYWxidGM4MTkyZTFhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDYpOwoKCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMTApOwoJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7Cgl9CgllbHNlIGlmKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZID09IHBDb2V4RG0tPmJ0U3RhdHVzICYmIAoJCQkhcEJ0Q29leGlzdC0+YnRfbGlua19pbmZvLmJIaWRPbmx5KQoJewoJCWlmKHBDb2V4RG0tPmN1clNzVHlwZSA9PSAxKQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKCQkJaGFsYnRjODE5MmUxYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA2KTsKCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDEwKTsKCQkJLy9oYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzOCk7CgkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CgkJfQoJfQoJZWxzZQoJewoJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25CdFNjb0hpZE9ubHlCdXN5KHBCdENvZXhpc3QsCgkJCUJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfQ09OTkVDVEVEX0JVU1kpOwoJfQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkQnRBY2xCdXN5KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJCXdpZmlTdGF0dXMKCSkKewoJUEJUQ19CVF9MSU5LX0lORk8gcEJ0TGlua0luZm89JnBCdENvZXhpc3QtPmJ0X2xpbmtfaW5mbzsKCglpZihwQnRMaW5rSW5mby0+YkhpZE9ubHkpCgl7CgkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkJ0U2NvSGlkT25seUJ1c3kocEJ0Q29leGlzdCwgd2lmaVN0YXR1cyk7CgkJcENvZXhEbS0+YkF1dG9UZG1hQWRqdXN0ID0gRkFMU0U7CgkJcmV0dXJuOwoJfQoJCgloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwoJaGFsYnRjODE5MmUxYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CgoJaWYoIChwQnRMaW5rSW5mby0+YkEyZHBPbmx5KSB8fAoJCShwQnRMaW5rSW5mby0+YkhpZEV4aXN0JiZwQnRMaW5rSW5mby0+YkEyZHBFeGlzdCkgKQoJewoJCWhhbGJ0YzgxOTJlMWFudF9UZG1hRHVyYXRpb25BZGp1c3RGb3JBY2wocEJ0Q29leGlzdCwgd2lmaVN0YXR1cyk7Cgl9CgllbHNlIGlmKCAocEJ0TGlua0luZm8tPmJQYW5Pbmx5KSB8fAoJCQkocEJ0TGlua0luZm8tPmJIaWRFeGlzdCYmcEJ0TGlua0luZm8tPmJQYW5FeGlzdCkgKQoJewoJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMpOwoJCXBDb2V4RG0tPmJBdXRvVGRtYUFkanVzdCA9IEZBTFNFOwoJfQoJZWxzZQoJewoJCWlmKCAoQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19OT05fQ09OTkVDVEVEX0FTU09fQVVUSF9TQ0FOID09IHdpZmlTdGF0dXMpIHx8CgkJCShCVF84MTkyRV8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9TQ0FOID09IHdpZmlTdGF0dXMpIHx8CgkJCShCVF84MTkyRV8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9TUEVDSUFMX1BLVCA9PSB3aWZpU3RhdHVzKSApCgkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOwoJCWVsc2UKCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOwoJCXBDb2V4RG0tPmJBdXRvVGRtYUFkanVzdCA9IEZBTFNFOwoJfQoJCQoJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAxKTsKfQoKClZPSUQKaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWQoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJLy8gcG93ZXIgc2F2ZSBzdGF0ZQoJaGFsYnRjODE5MmUxYW50X1Bvd2VyU2F2ZVN0YXRlKHBCdENvZXhpc3QsIEJUQ19QU19XSUZJX05BVElWRSwgMHgwLCAweDApOwoKCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CgloYWxidGM4MTkyZTFhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsKCgloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgOCk7CgloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwkKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZEFzc29BdXRoU2NhbigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CgloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX1dJRklfTkFUSVZFLCAweDAsIDB4MCk7CgoJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoKCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCA4KTsKCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlDb25uZWN0ZWRTY2FuKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCS8vIHBvd2VyIHNhdmUgc3RhdGUKCWlmKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZID09IHBDb2V4RG0tPmJ0U3RhdHVzICYmICFwQnRDb2V4aXN0LT5idF9saW5rX2luZm8uYkhpZE9ubHkpCgkJaGFsYnRjODE5MmUxYW50X1Bvd2VyU2F2ZVN0YXRlKHBCdENvZXhpc3QsIEJUQ19QU19MUFNfT04sIDB4NTAsIDB4MCk7CgllbHNlCgkJaGFsYnRjODE5MmUxYW50X1Bvd2VyU2F2ZVN0YXRlKHBCdENvZXhpc3QsIEJUQ19QU19XSUZJX05BVElWRSwgMHgwLCAweDApOwoKCWlmKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZID09IHBDb2V4RG0tPmJ0U3RhdHVzKQoJewoJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkQnRBY2xCdXN5KHBCdENvZXhpc3QsCgkJCUJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfQ09OTkVDVEVEX1NDQU4pOwoJfQoJZWxzZSBpZiggKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX1NDT19CVVNZID09IHBDb2V4RG0tPmJ0U3RhdHVzKSB8fAoJCQkoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQUNMX1NDT19CVVNZID09IHBDb2V4RG0tPmJ0U3RhdHVzKSApCgl7CgkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkJ0U2NvSGlkT25seUJ1c3kocEJ0Q29leGlzdCwKCQkJQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfU0NBTik7Cgl9CgllbHNlCgl7CQkKCQloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwoJCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCA4KTsKCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDIpOwoJfQp9CgoKVk9JRApoYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZFNwZWNpYWxQYWNrZXQoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJLy8gcG93ZXIgc2F2ZSBzdGF0ZQoJaWYoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMgJiYgIXBCdENvZXhpc3QtPmJ0X2xpbmtfaW5mby5iSGlkT25seSkKCQloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX0xQU19PTiwgMHg1MCwgMHgwKTsKCWVsc2UKCQloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX1dJRklfTkFUSVZFLCAweDAsIDB4MCk7CgoJaWYoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpCgl7CgkJaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlDb25uZWN0ZWRCdEFjbEJ1c3kocEJ0Q29leGlzdCwKCQkJQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfU1BFQ0lBTF9QS1QpOwoJfQoJZWxzZQoJewkJCgkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKCQloYWxidGM4MTkyZTFhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsKCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgOCk7CgkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAyKTsKCX0KfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZCgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CglCT09MRUFOIAliV2lmaUNvbm5lY3RlZD1GQUxTRSwgYldpZmlCdXN5PUZBTFNFOwoJQk9PTEVBTiAJYlNjYW49RkFMU0UsIGJMaW5rPUZBTFNFLCBiUm9hbT1GQUxTRTsKCUJPT0xFQU4gCWJVbmRlcjR3YXk9RkFMU0U7Cgl1NEJ5dGUJCXdpZmlCdzsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIENvZXhGb3JXaWZpQ29ubmVjdCgpPT09PlxuIikpOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJmJXaWZpQ29ubmVjdGVkKTsKCWlmKCFiV2lmaUNvbm5lY3RlZCkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIENvZXhGb3JXaWZpQ29ubmVjdCgpLCByZXR1cm4gZm9yIHdpZmkgbm90IGNvbm5lY3RlZDw9PT1cbiIpKTsKCQlyZXR1cm47Cgl9CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfNF9XQVlfUFJPR1JFU1MsICZiVW5kZXI0d2F5KTsKCWlmKGJVbmRlcjR3YXkpCgl7CgkJaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlDb25uZWN0ZWRTcGVjaWFsUGFja2V0KHBCdENvZXhpc3QpOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQ29leEZvcldpZmlDb25uZWN0KCksIHJldHVybiBmb3Igd2lmaSBpcyB1bmRlciA0d2F5PD09PVxuIikpOwoJCXJldHVybjsKCX0KCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9TQ0FOLCAmYlNjYW4pOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfTElOSywgJmJMaW5rKTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1JPQU0sICZiUm9hbSk7CglpZihiU2NhbiB8fCBiTGluayB8fCBiUm9hbSkKCXsKCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZFNjYW4ocEJ0Q29leGlzdCk7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBDb2V4Rm9yV2lmaUNvbm5lY3QoKSwgcmV0dXJuIGZvciB3aWZpIGlzIHVuZGVyIHNjYW48PT09XG4iKSk7CgkJcmV0dXJuOwoJfQoKCS8vIHBvd2VyIHNhdmUgc3RhdGUKCWlmKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZID09IHBDb2V4RG0tPmJ0U3RhdHVzICYmICFwQnRDb2V4aXN0LT5idF9saW5rX2luZm8uYkhpZE9ubHkpCgkJaGFsYnRjODE5MmUxYW50X1Bvd2VyU2F2ZVN0YXRlKHBCdENvZXhpc3QsIEJUQ19QU19MUFNfT04sIDB4NTAsIDB4MCk7CgllbHNlCgkJaGFsYnRjODE5MmUxYW50X1Bvd2VyU2F2ZVN0YXRlKHBCdENvZXhpc3QsIEJUQ19QU19XSUZJX05BVElWRSwgMHgwLCAweDApOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0JVU1ksICZiV2lmaUJ1c3kpOwkKCWlmKCFiV2lmaUJ1c3kpCgl7CgkJaWYoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpCgkJewoJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZEJ0QWNsQnVzeShwQnRDb2V4aXN0LCAKCQkJCUJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfQ09OTkVDVEVEX0lETEUpOwoJCX0KCQllbHNlIGlmKCAoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfU0NPX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpIHx8CgkJCShCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpICkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25CdFNjb0hpZE9ubHlCdXN5KHBCdENvZXhpc3QsCgkJCQlCVF84MTkyRV8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9JRExFKTsKCQl9CgkJZWxzZQoJCXsJCQkJCgkJCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CgkJCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgOCk7CgkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CgkJfQoJfQoJZWxzZQoJewoJCWlmKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cykKCQl7CQkJCQoJCQloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwoJCQloYWxidGM4MTkyZTFhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsKCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNSk7CgkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CgkJfQoJCWVsc2UgaWYoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpCgkJewkJCQkKCQkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKCQkJaGFsYnRjODE5MmUxYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CQkJCgkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDUpOwoJCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDIpOwoJCX0KCQllbHNlIGlmKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZID09IHBDb2V4RG0tPmJ0U3RhdHVzKQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlDb25uZWN0ZWRCdEFjbEJ1c3kocEJ0Q29leGlzdCwKCQkJCUJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfQ09OTkVDVEVEX0JVU1kpOwoJCX0KCQllbHNlIGlmKCAoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfU0NPX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpIHx8CgkJCShCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpICkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25CdFNjb0hpZE9ubHlCdXN5KHBCdENvZXhpc3QsCgkJCQlCVF84MTkyRV8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9CVVNZKTsKCQl9CgkJZWxzZSAKCQl7CQkJCQoJCQloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwoJCQloYWxidGM4MTkyZTFhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsKCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDgpOwoJCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDIpOwoJCX0KCX0KfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfUnVuU3dDb2V4aXN0TWVjaGFuaXNtKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCUJPT0xFQU4JCQkJYldpZmlVbmRlcjVHPUZBTFNFLCBiV2lmaUJ1c3k9RkFMU0UsIGJXaWZpQ29ubmVjdGVkPUZBTFNFOwoJdTFCeXRlCQkJCWJ0SW5mb09yaWdpbmFsPTAsIGJ0UmV0cnlDbnQ9MDsKCXUxQnl0ZQkJCQlhbGdvcml0aG09MDsKCglyZXR1cm47CgoJYWxnb3JpdGhtID0gaGFsYnRjODE5MmUxYW50X0FjdGlvbkFsZ29yaXRobShwQnRDb2V4aXN0KTsKCXBDb2V4RG0tPmN1ckFsZ29yaXRobSA9IGFsZ29yaXRobTsKCglpZihoYWxidGM4MTkyZTFhbnRfSXNDb21tb25BY3Rpb24ocEJ0Q29leGlzdCkpCgl7Cgl9CgllbHNlCgl7CgkJc3dpdGNoKHBDb2V4RG0tPmN1ckFsZ29yaXRobSkKCQl7CgkJCWNhc2UgQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fU0NPOgoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gU0NPLlxuIikpOwoJCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvblNjbyhwQnRDb2V4aXN0KTsKCQkJCWJyZWFrOwoJCQljYXNlIEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX0hJRDoKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IEhJRC5cbiIpKTsKCQkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25IaWQocEJ0Q29leGlzdCk7CgkJCQlicmVhazsKCQkJY2FzZSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19BMkRQOgoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gQTJEUC5cbiIpKTsKCQkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25BMmRwKHBCdENvZXhpc3QpOwoJCQkJYnJlYWs7CgkJCWNhc2UgQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fQTJEUF9QQU5IUzoKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IEEyRFArUEFOKEhTKS5cbiIpKTsKCQkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25BMmRwUGFuSHMocEJ0Q29leGlzdCk7CgkJCQlicmVhazsKCQkJY2FzZSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19QQU5FRFI6CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBQQU4oRURSKS5cbiIpKTsKCQkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25QYW5FZHIocEJ0Q29leGlzdCk7CgkJCQlicmVhazsKCQkJY2FzZSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19QQU5IUzoKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IEhTIG1vZGUuXG4iKSk7CgkJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uUGFuSHMocEJ0Q29leGlzdCk7CgkJCQlicmVhazsKCQkJY2FzZSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUDoKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IFBBTitBMkRQLlxuIikpOwoJCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvblBhbkVkckEyZHAocEJ0Q29leGlzdCk7CgkJCQlicmVhazsKCQkJY2FzZSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOgoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gUEFOKEVEUikrSElELlxuIikpOwoJCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvblBhbkVkckhpZChwQnRDb2V4aXN0KTsKCQkJCWJyZWFrOwoJCQljYXNlIEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX0hJRF9BMkRQX1BBTkVEUjoKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IEhJRCtBMkRQK1BBTi5cbiIpKTsKCQkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25IaWRBMmRwUGFuRWRyKHBCdENvZXhpc3QpOwoJCQkJYnJlYWs7CgkJCWNhc2UgQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fSElEX0EyRFA6CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBISUQrQTJEUC5cbiIpKTsKCQkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25IaWRBMmRwKHBCdENvZXhpc3QpOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBjb2V4aXN0IEFsbCBPZmYhIVxuIikpOwoJCQkJaGFsYnRjODE5MmUxYW50X0NvZXhBbGxPZmYocEJ0Q29leGlzdCk7CgkJCQlicmVhazsKCQl9CgkJcENvZXhEbS0+cHJlQWxnb3JpdGhtID0gcENvZXhEbS0+Y3VyQWxnb3JpdGhtOwoJfQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9SdW5Db2V4aXN0TWVjaGFuaXNtKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCVBCVENfQlRfTElOS19JTkZPCXBCdExpbmtJbmZvPSZwQnRDb2V4aXN0LT5idF9saW5rX2luZm87CglCT09MRUFOCWJXaWZpQ29ubmVjdGVkPUZBTFNFLCBiQnRIc09uPUZBTFNFOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUnVuQ29leGlzdE1lY2hhbmlzbSgpPT09PlxuIikpOwoKCWlmKHBCdENvZXhpc3QtPm1hbnVhbF9jb250cm9sKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUnVuQ29leGlzdE1lY2hhbmlzbSgpLCByZXR1cm4gZm9yIE1hbnVhbCBDVFJMIDw9PT1cbiIpKTsKCQlyZXR1cm47Cgl9CgoJaWYocEJ0Q29leGlzdC0+YlN0b3BDb2V4RG0pCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBSdW5Db2V4aXN0TWVjaGFuaXNtKCksIHJldHVybiBmb3IgU3RvcCBDb2V4IERNIDw9PT1cbiIpKTsKCQlyZXR1cm47Cgl9CgoJaWYocENvZXhTdGEtPmJVbmRlcklwcykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIHdpZmkgaXMgdW5kZXIgSVBTICEhIVxuIikpOwoJCXJldHVybjsKCX0KCQoJaGFsYnRjODE5MmUxYW50X1J1blN3Q29leGlzdE1lY2hhbmlzbShwQnRDb2V4aXN0KTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYkJ0SHNPbik7CglpZihwQ29leFN0YS0+YkMyaEJ0SW5xdWlyeVBhZ2UpCgl7CgkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkJ0SW5xdWlyeShwQnRDb2V4aXN0KTsKCQlyZXR1cm47Cgl9CgoJLy8gMXNzIG9yIDJzcwoJaWYocEJ0TGlua0luZm8tPmJTY29FeGlzdCkKCXsKCQloYWxidGM4MTkyZTFhbnRfU3dpdGNoU3NUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAxKTsKCX0KCWVsc2UgaWYoYkJ0SHNPbikKCXsKCQlpZihwQnRMaW5rSW5mby0+YkhpZE9ubHkpCgkJCWhhbGJ0YzgxOTJlMWFudF9Td2l0Y2hTc1R5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDIpOwoJCWVsc2UKCQkJaGFsYnRjODE5MmUxYW50X1N3aXRjaFNzVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMSk7Cgl9CgllbHNlCgkJaGFsYnRjODE5MmUxYW50X1N3aXRjaFNzVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CgkKCWlmKGJCdEhzT24pCgl7CgkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkhzKHBCdENvZXhpc3QpOwoJCXJldHVybjsKCX0KCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZiV2lmaUNvbm5lY3RlZCk7CglpZighYldpZmlDb25uZWN0ZWQpCgl7CgkJQk9PTEVBTgliU2Nhbj1GQUxTRSwgYkxpbms9RkFMU0UsIGJSb2FtPUZBTFNFOwoJCQoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgd2lmaSBpcyBub24gY29ubmVjdGVkLWlkbGUgISEhXG4iKSk7CgoJCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1NDQU4sICZiU2Nhbik7CgkJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfTElOSywgJmJMaW5rKTsKCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9ST0FNLCAmYlJvYW0pOwoKCQlpZihiU2NhbiB8fCBiTGluayB8fCBiUm9hbSkKCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWRBc3NvQXV0aFNjYW4ocEJ0Q29leGlzdCk7CgkJZWxzZQoJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZChwQnRDb2V4aXN0KTsKCX0KCWVsc2UKCXsKCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZChwQnRDb2V4aXN0KTsKCX0KfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfSW5pdENvZXhEbSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CQoJLy8gZm9yY2UgdG8gcmVzZXQgY29leCBtZWNoYW5pc20KCWhhbGJ0YzgxOTJlMWFudF9Gd0RhY1N3aW5nTHZsKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIDYpOwoJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIDApOwoKCS8vIHN3IGFsbCBvZmYKCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTEocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSxGQUxTRSk7CgloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CgoJaGFsYnRjODE5MmUxYW50X1N3aXRjaFNzVHlwZShwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCAyKTsKCgloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFLCA4KTsKCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCAwKTsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gd29yayBhcm91bmQgZnVuY3Rpb24gc3RhcnQgd2l0aCB3YV9oYWxidGM4MTkyZTFhbnRfCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIGV4dGVybiBmdW5jdGlvbiBzdGFydCB3aXRoIEVYaGFsYnRjODE5MmUxYW50XwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpWT0lECkVYaGFsYnRjODE5MmUxYW50X0luaXRId0NvbmZpZygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1NEJ5dGUJdTRUbXA9MDsKCXUxNgl1MlRtcD0wOwoJdTFCeXRlCXUxVG1wPTA7CgoJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsICgiW0JUQ29leF0sIDFBbnQgSW5pdCBIVyBDb25maWchIVxuIikpOwoKCS8vIGJhY2t1cCByZiAweDFlIHZhbHVlCglwQ29leERtLT5idFJmMHgxZUJhY2t1cCA9IAoJCXBCdENvZXhpc3QtPmJ0Y19nZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDFlLCAweGZmZmZmKTsKCgkvLyBhbnRlbm5hIHN3IGN0cmwgdG8gYnQKCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDRmLCAweDYpOwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4OTQ0LCAweDI0KTsKCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweDkzMCwgMHg3MDA3MDApOwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4OTJjLCAweDIwKTsKCWlmKHBCdENvZXhpc3QtPmNoaXBJbnRlcmZhY2UgPT0gQlRDX0lOVEZfVVNCKQoJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweDY0LCAweDMwNDMwMDA0KTsKCWVsc2UKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg2NCwgMHgzMDAzMDAwNCk7CgoJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIDApOwoKCS8vIGFudGVubmEgc3dpdGNoIGNvbnRyb2wgcGFyYW1ldGVyCglwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg4NTgsIDB4NTU1NTU1NTUpOwoKCS8vIGNvZXggcGFyYW1ldGVycwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4Nzc4LCAweDEpOwoJLy8gMHg3OTBbNTowXT0weDUKCXUxVG1wID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg3OTApOwoJdTFUbXAgJj0gMHhjMDsKCXUxVG1wIHw9IDB4NTsKCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDc5MCwgdTFUbXApOwoKCS8vIGVuYWJsZSBjb3VudGVyIHN0YXRpc3RpY3MKCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDc2ZSwgMHg0KTsKCgkvLyBlbmFibGUgUFRBCglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg0MCwgMHgyMCk7CgkvLyBlbmFibGUgbWFpbGJveCBpbnRlcmZhY2UKCXUyVG1wID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMmJ5dGUocEJ0Q29leGlzdCwgMHg0MCk7Cgl1MlRtcCB8PSBCSVQ5OwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzJieXRlKHBCdENvZXhpc3QsIDB4NDAsIHUyVG1wKTsKCgkvLyBlbmFibGUgUFRBIEkyQyBtYWlsYm94IAoJdTFUbXAgPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDEwMSk7Cgl1MVRtcCB8PSBCSVQ0OwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4MTAxLCB1MVRtcCk7CgoJLy8gZW5hYmxlIGJ0IGNsb2NrIHdoZW4gd2lmaSBpcyBkaXNhYmxlZC4KCXUxVG1wID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg5Myk7Cgl1MVRtcCB8PSBCSVQwOwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4OTMsIHUxVG1wKTsKCS8vIGVuYWJsZSBidCBjbG9jayB3aGVuIHN1c3BlbmQuCgl1MVRtcCA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4Nyk7Cgl1MVRtcCB8PSBCSVQwOwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NywgdTFUbXApOwp9CgpWT0lECkVYaGFsYnRjODE5MmUxYW50X0luaXRDb2V4RG0oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsICgiW0JUQ29leF0sIENvZXggTWVjaGFuaXNtIEluaXQhIVxuIikpOwoKCXBCdENvZXhpc3QtPmJTdG9wQ29leERtID0gRkFMU0U7CgkKCWhhbGJ0YzgxOTJlMWFudF9Jbml0Q29leERtKHBCdENvZXhpc3QpOwp9CgpWT0lECkVYaGFsYnRjODE5MmUxYW50X0Rpc3BsYXlDb2V4SW5mbygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CglzdHJ1Y3QgYnRjX2JvYXJkX2luZm8gKgkJcEJvYXJkSW5mbz0mcEJ0Q29leGlzdC0+Ym9hcmRfaW5mbzsKCVBCVENfU1RBQ0tfSU5GTwkJcFN0YWNrSW5mbz0mcEJ0Q29leGlzdC0+c3RhY2tfaW5mbzsKCVBCVENfQlRfTElOS19JTkZPCXBCdExpbmtJbmZvPSZwQnRDb2V4aXN0LT5idF9saW5rX2luZm87CglwdTFCeXRlCQkJCWNsaUJ1Zj1wQnRDb2V4aXN0LT5jbGlfYnVmOwoJdTFCeXRlCQkJCXUxVG1wWzRdLCBpLCBidEluZm9FeHQsIHBzVGRtYUNhc2U9MDsKCXU0Qnl0ZQkJCQl1NFRtcFs0XTsKCUJPT0xFQU4JCQkJYlJvYW09RkFMU0UsIGJTY2FuPUZBTFNFLCBiTGluaz1GQUxTRSwgYldpZmlVbmRlcjVHPUZBTFNFOwoJQk9PTEVBTgkJCQliQnRIc09uPUZBTFNFLCBiV2lmaUJ1c3k9RkFMU0U7CglzNEJ5dGUJCQkJd2lmaVJzc2k9MCwgYnRIc1Jzc2k9MDsKCXU0Qnl0ZQkJCQl3aWZpQncsIHdpZmlUcmFmZmljRGlyOwoJdTFCeXRlCQkJCXdpZmlEb3QxMUNobmwsIHdpZmlIc0Nobmw7Cgl1NEJ5dGUJCQkJZndWZXI9MCwgYnRQYXRjaFZlcj0wOwoKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuID09PT09PT09PT09PVtCVCBDb2V4aXN0IGluZm9dPT09PT09PT09PT09Iik7CglDTF9QUklOVEYoY2xpQnVmKTsKCglpZihwQnRDb2V4aXN0LT5tYW51YWxfY29udHJvbCkKCXsKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiA9PT09PT09PT09PT1bVW5kZXIgTWFudWFsIENvbnRyb2xdPT09PT09PT09PT09Iik7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7CgkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7Cgl9CQoJaWYocEJ0Q29leGlzdC0+YlN0b3BDb2V4RG0pCgl7CgkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gPT09PT09PT09PT09W0NvZXggaXMgU1RPUFBFRF09PT09PT09PT09PT0iKTsKCQlDTF9QUklOVEYoY2xpQnVmKTsKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKCQlDTF9QUklOVEYoY2xpQnVmKTsKCX0KCglpZighcEJvYXJkSW5mby0+YnRfZXhpc3QpCgl7CgkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gQlQgbm90IGV4aXN0cyAhISEiKTsKCQlDTF9QUklOVEYoY2xpQnVmKTsKCQlyZXR1cm47Cgl9CgoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQgIiwgIkFudCBQRyBudW1iZXIvIEFudCBtZWNoYW5pc206IiwgXAoJCXBCb2FyZEluZm8tPnBnX2FudF9udW0sIHBCb2FyZEluZm8tPmJ0ZG1fYW50X251bSk7CglDTF9QUklOVEYoY2xpQnVmKTsJCgkKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMgLyAlZCIsICJCVCBzdGFjay8gaGNpIGV4dCB2ZXIiLCBcCgkJKChwU3RhY2tJbmZvLT5iUHJvZmlsZU5vdGlmaWVkKT8gIlllcyI6Ik5vIiksIHBTdGFja0luZm8tPmhjaVZlcnNpb24pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X0JUX1BBVENIX1ZFUiwgJmJ0UGF0Y2hWZXIpOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfRldfVkVSLCAmZndWZXIpOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZF8lZC8gMHgleC8gMHgleCglZCkiLCAiQ29leFZlci8gRndWZXIvIFBhdGNoVmVyIiwgXAoJCUdMQ29leFZlckRhdGU4MTkyZTFBbnQsIEdMQ29leFZlcjgxOTJlMUFudCwgZndWZXIsIGJ0UGF0Y2hWZXIsIGJ0UGF0Y2hWZXIpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJCdEhzT24pOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1UxX1dJRklfRE9UMTFfQ0hOTCwgJndpZmlEb3QxMUNobmwpOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1UxX1dJRklfSFNfQ0hOTCwgJndpZmlIc0NobmwpOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAvICVkKCVkKSIsICJEb3QxMSBjaGFubmVsIC8gSHNDaG5sKEhzTW9kZSkiLCBcCgkJd2lmaURvdDExQ2hubCwgd2lmaUhzQ2hubCwgYkJ0SHNPbik7CglDTF9QUklOVEYoY2xpQnVmKTsKCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICUwMnggJTAyeCAlMDJ4ICIsICJIMkMgV2lmaSBpbmZvcm0gYnQgY2hubCBJbmZvIiwgXAoJCXBDb2V4RG0tPndpZmlDaG5sSW5mb1swXSwgcENvZXhEbS0+d2lmaUNobmxJbmZvWzFdLAoJCXBDb2V4RG0tPndpZmlDaG5sSW5mb1syXSk7CglDTF9QUklOVEYoY2xpQnVmKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfUzRfV0lGSV9SU1NJLCAmd2lmaVJzc2kpOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1M0X0hTX1JTU0ksICZidEhzUnNzaSk7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCIsICJXaWZpIHJzc2kvIEhTIHJzc2kiLCBcCgkJd2lmaVJzc2ksIGJ0SHNSc3NpKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1NDQU4sICZiU2Nhbik7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9MSU5LLCAmYkxpbmspOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfUk9BTSwgJmJSb2FtKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkLyAlZCAiLCAiV2lmaSBiTGluay8gYlJvYW0vIGJTY2FuIiwgXAoJCWJMaW5rLCBiUm9hbSwgYlNjYW4pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfVU5ERVJfNUcsICZiV2lmaVVuZGVyNUcpOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQlVTWSwgJmJXaWZpQnVzeSk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9UUkFGRklDX0RJUkVDVElPTiwgJndpZmlUcmFmZmljRGlyKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMgLyAlcy8gJXMgIiwgIldpZmkgc3RhdHVzIiwgXAoJCShiV2lmaVVuZGVyNUc/ICI1RyI6IjIuNEciKSwKCQkoKEJUQ19XSUZJX0JXX0xFR0FDWT09d2lmaUJ3KT8gIkxlZ2FjeSI6ICgoKEJUQ19XSUZJX0JXX0hUNDA9PXdpZmlCdyk/ICJIVDQwIjoiSFQyMCIpKSksCgkJKCghYldpZmlCdXN5KT8gImlkbGUiOiAoKEJUQ19XSUZJX1RSQUZGSUNfVFg9PXdpZmlUcmFmZmljRGlyKT8gInVwbGluayI6ImRvd25saW5rIikpKTsKCUNMX1BSSU5URihjbGlCdWYpOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSBbJXMvICVkLyAlZF0gIiwgIkJUIFtzdGF0dXMvIHJzc2kvIHJldHJ5Q250XSIsIFwKCQkoKHBCdENvZXhpc3QtPmJ0SW5mby5iQnREaXNhYmxlZCk/ICgiZGlzYWJsZWQiKToJKChwQ29leFN0YS0+YkMyaEJ0SW5xdWlyeVBhZ2UpPygiaW5xdWlyeS9wYWdlIHNjYW4iKTooKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cyk/ICJub24tY29ubmVjdGVkIGlkbGUiOgoJCSggIChCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cyk/ICJjb25uZWN0ZWQtaWRsZSI6ImJ1c3kiKSkpKSwKCQlwQ29leFN0YS0+YnRSc3NpLCBwQ29leFN0YS0+YnRSZXRyeUNudCk7CglDTF9QUklOVEYoY2xpQnVmKTsKCQoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAvICVkIC8gJWQgLyAlZCIsICJTQ08vSElEL1BBTi9BMkRQIiwgXAoJCXBCdExpbmtJbmZvLT5iU2NvRXhpc3QsIHBCdExpbmtJbmZvLT5iSGlkRXhpc3QsIHBCdExpbmtJbmZvLT5iUGFuRXhpc3QsIHBCdExpbmtJbmZvLT5iQTJkcEV4aXN0KTsKCUNMX1BSSU5URihjbGlCdWYpOwoJcEJ0Q29leGlzdC0+YnRjX2Rpc3BfZGJnX21zZyhwQnRDb2V4aXN0LCBCVENfREJHX0RJU1BfQlRfTElOS19JTkZPKTsJCgoJYnRJbmZvRXh0ID0gcENvZXhTdGEtPmJ0SW5mb0V4dDsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMiLCAiQlQgSW5mbyBBMkRQIHJhdGUiLCBcCgkJKGJ0SW5mb0V4dCZCSVQwKT8gIkJhc2ljIHJhdGUiOiJFRFIgcmF0ZSIpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CQoKCWZvcihpPTA7IGk8QlRfSU5GT19TUkNfODE5MkVfMUFOVF9NQVg7IGkrKykKCXsKCQlpZihwQ29leFN0YS0+YnRJbmZvQzJoQ250W2ldKQoJCXsJCQkJCgkJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCglZCkiLCBHTEJ0SW5mb1NyYzgxOTJlMUFudFtpXSwgXAoJCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVswXSwgcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVsxXSwKCQkJCXBDb2V4U3RhLT5idEluZm9DMmhbaV1bMl0sIHBDb2V4U3RhLT5idEluZm9DMmhbaV1bM10sCgkJCQlwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzRdLCBwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzVdLAoJCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVs2XSwgcENvZXhTdGEtPmJ0SW5mb0MyaENudFtpXSk7CgkJCUNMX1BSSU5URihjbGlCdWYpOwoJCX0KCX0KCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMvJXMsICgweCV4LzB4JXgpIiwgIlBTIHN0YXRlLCBJUFMvTFBTLCAobHBzL3Jwd20pIiwgXAoJCSgocENvZXhTdGEtPmJVbmRlcklwcz8gIklQUyBPTiI6IklQUyBPRkYiKSksCgkJKChwQ29leFN0YS0+YlVuZGVyTHBzPyAiTFBTIE9OIjoiTFBTIE9GRiIpKSwgCgkJcEJ0Q29leGlzdC0+YnRJbmZvLmxwczFBbnQsIAoJCXBCdENvZXhpc3QtPmJ0SW5mby5ycHdtXzFhbnQpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CglwQnRDb2V4aXN0LT5idGNfZGlzcF9kYmdfbXNnKHBCdENvZXhpc3QsIEJUQ19EQkdfRElTUF9GV19QV1JfTU9ERV9DTUQpOwoKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCAiLCAiU1MgVHlwZSIsIFwKCQlwQ29leERtLT5jdXJTc1R5cGUpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJaWYoIXBCdENvZXhpc3QtPm1hbnVhbF9jb250cm9sKQoJewoJCS8vIFN3IG1lY2hhbmlzbQkKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsICI9PT09PT09PT09PT1bU3cgbWVjaGFuaXNtXT09PT09PT09PT09PSIpOwoJCUNMX1BSSU5URihjbGlCdWYpOwoJCgkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkLyAlZCAiLCAiU00xW1NoUmYvIExwUkEvIExpbURpZy8gYnRMbmFdIiwgXAoJCQlwQ29leERtLT5iQ3VyUmZSeExwZlNocmluaywgcENvZXhEbS0+YkN1ckxvd1BlbmFsdHlSYSwgcENvZXhEbS0+bGltaXRlZF9kaWcsIHBDb2V4RG0tPmJDdXJCdExuYUNvbnN0cmFpbik7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7CgkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkKDB4JXgpICIsICJTTTJbQWdjVC8gQWRjQi8gU3dEYWNTd2luZyhsdmwpXSIsIFwKCQkJcENvZXhEbS0+YkN1ckFnY1RhYmxlRW4sIHBDb2V4RG0tPmJDdXJBZGNCYWNrT2ZmLCBwQ29leERtLT5iQ3VyRGFjU3dpbmdPbiwgcENvZXhEbS0+Y3VyRGFjU3dpbmdMdmwpOwoJCUNMX1BSSU5URihjbGlCdWYpOwoKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzLyAlcy8gJWQgIiwgIkRlbEJBLyBCdEN0cmxBZ2cvIEFnZ1NpemUiLCBcCgkJCShwQnRDb2V4aXN0LT5idEluZm8ucmVqZWN0X2FnZ19wa3Q/ICJZZXMiOiJObyIpLCAocEJ0Q29leGlzdC0+YnRJbmZvLmJfYnRfY3RybF9hZ2dfYnVmX3NpemU/ICJZZXMiOiJObyIpLAoJCQkJcEJ0Q29leGlzdC0+YnRJbmZvLmFnZ0J1ZlNpemUpOwoJCUNMX1BSSU5URihjbGlCdWYpOwoJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCAiLCAiUmF0ZSBNYXNrIiwgXAoJCQkJcEJ0Q29leGlzdC0+YnRJbmZvLnJhX21hc2spOwoJCUNMX1BSSU5URihjbGlCdWYpOwoJCgkJLy8gRncgbWVjaGFuaXNtCQkKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsICI9PT09PT09PT09PT1bRncgbWVjaGFuaXNtXT09PT09PT09PT09PSIpOwoJCUNMX1BSSU5URihjbGlCdWYpOwkKCgkJcHNUZG1hQ2FzZSA9IHBDb2V4RG0tPmN1clBzVGRtYTsKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCBjYXNlLSVkIChhdXRvOiVkKSIsICJQUyBURE1BIiwgXAoJCQlwQ29leERtLT5wc1RkbWFQYXJhWzBdLCBwQ29leERtLT5wc1RkbWFQYXJhWzFdLAoJCQlwQ29leERtLT5wc1RkbWFQYXJhWzJdLCBwQ29leERtLT5wc1RkbWFQYXJhWzNdLAoJCQlwQ29leERtLT5wc1RkbWFQYXJhWzRdLCBwc1RkbWFDYXNlLCBwQ29leERtLT5iQXV0b1RkbWFBZGp1c3QpOwoJCUNMX1BSSU5URihjbGlCdWYpOwoKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXggIiwgIkxhdGVzdCBlcnJvciBjb25kaXRpb24oc2hvdWxkIGJlIDApIiwgXAoJCQlwQ29leERtLT5lcnJvckNvbmRpdGlvbik7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7CgkJCgkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQgIiwgIkRlY0J0UHdyTHZsLyBJZ25XbGFuQWN0IiwgXAoJCQlwQ29leERtLT5jdXJCdERlY1B3ckx2bCwgcENvZXhEbS0+YkN1cklnbm9yZVdsYW5BY3QpOwoJCUNMX1BSSU5URihjbGlCdWYpOwoJfQoKCS8vIEh3IHNldHRpbmcJCQoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiPT09PT09PT09PT09W0h3IHNldHRpbmddPT09PT09PT09PT09Iik7CglDTF9QUklOVEYoY2xpQnVmKTsJCgoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4IiwgIlJGLUEsIDB4MWUgaW5pdFZhbCIsIFwKCQlwQ29leERtLT5idFJmMHgxZUJhY2t1cCk7CglDTF9QUklOVEYoY2xpQnVmKTsKCgl1NFRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4YzA0KTsKCXU0VG1wWzFdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHhkMDQpOwoJdTRUbXBbMl0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweDkwYyk7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgiLCAiMHhjMDQvIDB4ZDA0LyAweDkwYyIsIFwKCQl1NFRtcFswXSwgdTRUbXBbMV0sIHU0VG1wWzJdKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXUxVG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg3NzgpOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4IiwgIjB4Nzc4IiwgXAoJCXUxVG1wWzBdKTsKCUNMX1BSSU5URihjbGlCdWYpOwoJCgl1MVRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4OTJjKTsKCXU0VG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHg5MzApOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4IiwgIjB4OTJjLyAweDkzMCIsIFwKCQkodTFUbXBbMF0pLCB1NFRtcFswXSk7CglDTF9QUklOVEYoY2xpQnVmKTsKCgl1MVRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4NDApOwoJdTFUbXBbMV0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDRmKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleCIsICIweDQwLyAweDRmIiwgXAoJCXUxVG1wWzBdLCB1MVRtcFsxXSk7CglDTF9QUklOVEYoY2xpQnVmKTsKCgl1NFRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4NTUwKTsKCXUxVG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg1MjIpOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4IiwgIjB4NTUwKGJjbiBjdHJsKS8weDUyMiIsIFwKCQl1NFRtcFswXSwgdTFUbXBbMF0pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJdTRUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweGM1MCk7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHhjNTAoZGlnKSIsIFwKCQl1NFRtcFswXSk7CglDTF9QUklOVEYoY2xpQnVmKTsKCgl1NFRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4NmMwKTsKCXU0VG1wWzFdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHg2YzQpOwoJdTRUbXBbMl0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweDZjOCk7Cgl1MVRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4NmNjKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleC8gMHgleC8gMHgleCIsICIweDZjMC8weDZjNC8weDZjOC8weDZjYyhjb2V4VGFibGUpIiwgXAoJCXU0VG1wWzBdLCB1NFRtcFsxXSwgdTRUbXBbMl0sIHUxVG1wWzBdKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkIiwgIjB4NzcwKGhwIHJ4WzMxOjE2XS90eFsxNTowXSkiLCBcCgkJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVJ4LCBwQ29leFN0YS0+aGlnaFByaW9yaXR5VHgpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCIsICIweDc3NChscCByeFszMToxNl0vdHhbMTU6MF0pIiwgXAoJCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4LCBwQ29leFN0YS0+bG93UHJpb3JpdHlUeCk7CglDTF9QUklOVEYoY2xpQnVmKTsKI2lmKEJUX0FVVE9fUkVQT1JUX09OTFlfODE5MkVfMUFOVCA9PSAxKQoJaGFsYnRjODE5MmUxYW50X01vbml0b3JCdEN0cihwQnRDb2V4aXN0KTsKI2VuZGlmCgkKCXBCdENvZXhpc3QtPmJ0Y19kaXNwX2RiZ19tc2cocEJ0Q29leGlzdCwgQlRDX0RCR19ESVNQX0NPRVhfU1RBVElTVElDUyk7Cn0KCgpWT0lECkVYaGFsYnRjODE5MmUxYW50X0lwc05vdGlmeSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCXR5cGUKCSkKewoJdTRCeXRlCXU0VG1wPTA7CgoJaWYocEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wgfHwJcEJ0Q29leGlzdC0+YlN0b3BDb2V4RG0pCgkJcmV0dXJuOwoKCWlmKEJUQ19JUFNfRU5URVIgPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBJUFMgRU5URVIgbm90aWZ5XG4iKSk7CgkJcENvZXhTdGEtPmJVbmRlcklwcyA9IHRydWU7CgkJaGFsYnRjODE5MmUxYW50X0NvZXhBbGxPZmYocEJ0Q29leGlzdCk7Cgl9CgllbHNlIGlmKEJUQ19JUFNfTEVBVkUgPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBJUFMgTEVBVkUgbm90aWZ5XG4iKSk7CgkJcENvZXhTdGEtPmJVbmRlcklwcyA9IEZBTFNFOwoJfQp9CgpWT0lECkVYaGFsYnRjODE5MmUxYW50X0xwc05vdGlmeSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCXR5cGUKCSkKewoJaWYocEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wgfHwgcEJ0Q29leGlzdC0+YlN0b3BDb2V4RG0pCgkJcmV0dXJuOwoKCWlmKEJUQ19MUFNfRU5BQkxFID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgTFBTIEVOQUJMRSBub3RpZnlcbiIpKTsKCQlwQ29leFN0YS0+YlVuZGVyTHBzID0gdHJ1ZTsKCX0KCWVsc2UgaWYoQlRDX0xQU19ESVNBQkxFID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgTFBTIERJU0FCTEUgbm90aWZ5XG4iKSk7CgkJcENvZXhTdGEtPmJVbmRlckxwcyA9IEZBTFNFOwoJfQp9CgpWT0lECkVYaGFsYnRjODE5MmUxYW50X1NjYW5Ob3RpZnkoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQl0eXBlCgkpCnsKCUJPT0xFQU4gCQliV2lmaUNvbm5lY3RlZD1GQUxTRSwgYkJ0SHNPbj1GQUxTRTsJCgoJaWYocEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wgfHwKCQlwQnRDb2V4aXN0LT5iU3RvcENvZXhEbSB8fAoJCXBCdENvZXhpc3QtPmJ0SW5mby5iQnREaXNhYmxlZCApCgkJcmV0dXJuOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZiQnRIc09uKTsKCWlmKHBDb2V4U3RhLT5iQzJoQnRJbnF1aXJ5UGFnZSkKCXsKCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uQnRJbnF1aXJ5KHBCdENvZXhpc3QpOwoJCXJldHVybjsKCX0KCWVsc2UgaWYoYkJ0SHNPbikKCXsKCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uSHMocEJ0Q29leGlzdCk7CgkJcmV0dXJuOwoJfQoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJmJXaWZpQ29ubmVjdGVkKTsKCWlmKEJUQ19TQ0FOX1NUQVJUID09IHR5cGUpCgl7CQoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFNDQU4gU1RBUlQgbm90aWZ5XG4iKSk7CgkJaWYoIWJXaWZpQ29ubmVjdGVkKQkvLyBub24tY29ubmVjdGVkIHNjYW4KCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpTm90Q29ubmVjdGVkQXNzb0F1dGhTY2FuKHBCdENvZXhpc3QpOwoJCX0KCQllbHNlCS8vIHdpZmkgaXMgY29ubmVjdGVkCgkJewoJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZFNjYW4ocEJ0Q29leGlzdCk7CgkJfQoJfQoJZWxzZSBpZihCVENfU0NBTl9GSU5JU0ggPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBTQ0FOIEZJTklTSCBub3RpZnlcbiIpKTsKCQlpZighYldpZmlDb25uZWN0ZWQpCS8vIG5vbi1jb25uZWN0ZWQgc2NhbgoJCXsKCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWQocEJ0Q29leGlzdCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkKHBCdENvZXhpc3QpOwoJCX0KCX0KfQoKVk9JRApFWGhhbGJ0YzgxOTJlMWFudF9Db25uZWN0Tm90aWZ5KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJdHlwZQoJKQp7CglCT09MRUFOCWJXaWZpQ29ubmVjdGVkPUZBTFNFLCBiQnRIc09uPUZBTFNFOwoKCWlmKHBCdENvZXhpc3QtPm1hbnVhbF9jb250cm9sIHx8CgkJcEJ0Q29leGlzdC0+YlN0b3BDb2V4RG0gfHwKCQlwQnRDb2V4aXN0LT5idEluZm8uYkJ0RGlzYWJsZWQgKQoJCXJldHVybjsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYkJ0SHNPbik7CglpZihwQ29leFN0YS0+YkMyaEJ0SW5xdWlyeVBhZ2UpCgl7CgkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkJ0SW5xdWlyeShwQnRDb2V4aXN0KTsKCQlyZXR1cm47Cgl9CgllbHNlIGlmKGJCdEhzT24pCgl7CgkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkhzKHBCdENvZXhpc3QpOwoJCXJldHVybjsKCX0KCglpZihCVENfQVNTT0NJQVRFX1NUQVJUID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgQ09OTkVDVCBTVEFSVCBub3RpZnlcbiIpKTsKCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZEFzc29BdXRoU2NhbihwQnRDb2V4aXN0KTsKCX0KCWVsc2UgaWYoQlRDX0FTU09DSUFURV9GSU5JU0ggPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBDT05ORUNUIEZJTklTSCBub3RpZnlcbiIpKTsKCQkKCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZiV2lmaUNvbm5lY3RlZCk7CgkJaWYoIWJXaWZpQ29ubmVjdGVkKSAvLyBub24tY29ubmVjdGVkIHNjYW4KCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpTm90Q29ubmVjdGVkKHBCdENvZXhpc3QpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZChwQnRDb2V4aXN0KTsKCQl9Cgl9Cn0KClZPSUQKRVhoYWxidGM4MTkyZTFhbnRfTWVkaWFTdGF0dXNOb3RpZnkoCglJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJCXR5cGUKCSkKewoJdTFCeXRlCQkJSDJDX1BhcmFtZXRlclszXSA9ezB9OwoJdTRCeXRlCQkJd2lmaUJ3OwoJdTFCeXRlCQkJd2lmaUNlbnRyYWxDaG5sOwoKCWlmKHBCdENvZXhpc3QtPm1hbnVhbF9jb250cm9sIHx8CgkJcEJ0Q29leGlzdC0+YlN0b3BDb2V4RG0gfHwKCQlwQnRDb2V4aXN0LT5idEluZm8uYkJ0RGlzYWJsZWQgKQoJCXJldHVybjsKCglpZihCVENfTUVESUFfQ09OTkVDVCA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIE1FRElBIGNvbm5lY3Qgbm90aWZ5XG4iKSk7Cgl9CgllbHNlCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgTUVESUEgZGlzY29ubmVjdCBub3RpZnlcbiIpKTsKCX0KCgkvLyBvbmx5IDIuNEcgd2UgbmVlZCB0byBpbmZvcm0gYnQgdGhlIGNobmwgbWFzawoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1UxX1dJRklfQ0VOVFJBTF9DSE5MLCAmd2lmaUNlbnRyYWxDaG5sKTsKCWlmKCAoQlRDX01FRElBX0NPTk5FQ1QgPT0gdHlwZSkgJiYKCQkod2lmaUNlbnRyYWxDaG5sIDw9IDE0KSApCgl7CgkJSDJDX1BhcmFtZXRlclswXSA9IDB4MTsKCQlIMkNfUGFyYW1ldGVyWzFdID0gd2lmaUNlbnRyYWxDaG5sOwoJCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKCQlpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKCQkJSDJDX1BhcmFtZXRlclsyXSA9IDB4MzA7CgkJZWxzZQoJCQlIMkNfUGFyYW1ldGVyWzJdID0gMHgyMDsKCX0KCQkKCXBDb2V4RG0tPndpZmlDaG5sSW5mb1swXSA9IEgyQ19QYXJhbWV0ZXJbMF07CglwQ29leERtLT53aWZpQ2hubEluZm9bMV0gPSBIMkNfUGFyYW1ldGVyWzFdOwoJcENvZXhEbS0+d2lmaUNobmxJbmZvWzJdID0gSDJDX1BhcmFtZXRlclsyXTsKCQoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIEZXIHdyaXRlIDB4NjY9MHgleFxuIiwgCgkJSDJDX1BhcmFtZXRlclswXTw8MTZ8SDJDX1BhcmFtZXRlclsxXTw8OHxIMkNfUGFyYW1ldGVyWzJdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4NjYsIDMsIEgyQ19QYXJhbWV0ZXIpOwp9CgpWT0lECkVYaGFsYnRjODE5MmUxYW50X1NwZWNpYWxQYWNrZXROb3RpZnkoCglJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJCXR5cGUKCSkKewoJQk9PTEVBTgliQnRIc09uPUZBTFNFOwoKCWlmKHBCdENvZXhpc3QtPm1hbnVhbF9jb250cm9sIHx8CgkJcEJ0Q29leGlzdC0+YlN0b3BDb2V4RG0gfHwKCQlwQnRDb2V4aXN0LT5idEluZm8uYkJ0RGlzYWJsZWQgKQoJCXJldHVybjsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYkJ0SHNPbik7CglpZihwQ29leFN0YS0+YkMyaEJ0SW5xdWlyeVBhZ2UpCgl7CgkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkJ0SW5xdWlyeShwQnRDb2V4aXN0KTsKCQlyZXR1cm47Cgl9CgllbHNlIGlmKGJCdEhzT24pCgl7CgkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkhzKHBCdENvZXhpc3QpOwoJCXJldHVybjsKCX0KCglpZiggQlRDX1BBQ0tFVF9ESENQID09IHR5cGUgfHwKCQlCVENfUEFDS0VUX0VBUE9MID09IHR5cGUgKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIHNwZWNpYWwgUGFja2V0KCVkKSBub3RpZnlcbiIsIHR5cGUpKTsKCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZFNwZWNpYWxQYWNrZXQocEJ0Q29leGlzdCk7Cgl9Cn0KClZPSUQKRVhoYWxidGM4MTkyZTFhbnRfQnRJbmZvTm90aWZ5KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JcHUxQnl0ZQkJCXRtcEJ1ZiwKCUlOCXUxQnl0ZQkJCWxlbmd0aAoJKQp7CglQQlRDX0JUX0xJTktfSU5GTwlwQnRMaW5rSW5mbz0mcEJ0Q29leGlzdC0+YnRfbGlua19pbmZvOwoJdTFCeXRlCQkJCWJ0SW5mbz0wOwoJdTFCeXRlCQkJCWksIHJzcFNvdXJjZT0wOwoJc3RhdGljIHU0Qnl0ZQkJc2V0QnRQc2RNb2RlPTA7CglCT09MRUFOCQkJCWJCdEJ1c3k9RkFMU0UsIGxpbWl0ZWRfZGlnPUZBTFNFOwoJQk9PTEVBTgkJCQliV2lmaUNvbm5lY3RlZD1GQUxTRTsKCUJPT0xFQU4JCQkJYl9idF9jdHJsX2FnZ19idWZfc2l6ZT1GQUxTRTsKCglwQ29leFN0YS0+YkMyaEJ0SW5mb1JlcVNlbnQgPSBGQUxTRTsKCglyc3BTb3VyY2UgPSB0bXBCdWZbMF0mMHhmOwoJaWYocnNwU291cmNlID49IEJUX0lORk9fU1JDXzgxOTJFXzFBTlRfTUFYKQoJCXJzcFNvdXJjZSA9IEJUX0lORk9fU1JDXzgxOTJFXzFBTlRfV0lGSV9GVzsKCXBDb2V4U3RhLT5idEluZm9DMmhDbnRbcnNwU291cmNlXSsrOwoKCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIEJ0IGluZm9bJWRdLCBsZW5ndGg9JWQsIGhleCBkYXRhPVsiLCByc3BTb3VyY2UsIGxlbmd0aCkpOwoJZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKCXsKCQlwQ29leFN0YS0+YnRJbmZvQzJoW3JzcFNvdXJjZV1baV0gPSB0bXBCdWZbaV07CgkJaWYoaSA9PSAxKQoJCQlidEluZm8gPSB0bXBCdWZbaV07CgkJaWYoaSA9PSBsZW5ndGgtMSkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiMHglMDJ4XVxuIiwgdG1wQnVmW2ldKSk7CgkJfQoJCWVsc2UKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiMHglMDJ4LCAiLCB0bXBCdWZbaV0pKTsKCQl9Cgl9CgoJaWYocEJ0Q29leGlzdC0+YnRJbmZvLmJCdERpc2FibGVkKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIHJldHVybiBmb3IgQlQgaXMgZGlzYWJsZWQgPD09PVxuIikpOwoJCXJldHVybjsKCX0JCgoJaWYocEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgcmV0dXJuIGZvciBNYW51YWwgQ1RSTDw9PT1cbiIpKTsKCQlyZXR1cm47Cgl9CglpZihwQnRDb2V4aXN0LT5iU3RvcENvZXhEbSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCByZXR1cm4gZm9yIENvZXggU1RPUFBFRCEhPD09PVxuIikpOwoJCXJldHVybjsKCX0KCglpZihCVF9JTkZPX1NSQ184MTkyRV8xQU5UX1dJRklfRlcgIT0gcnNwU291cmNlKQoJewoJCXBDb2V4U3RhLT5idFJldHJ5Q250ID0JLy8gWzM6MF0KCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtyc3BTb3VyY2VdWzJdJjB4ZjsKCgkJcENvZXhTdGEtPmJ0UnNzaSA9CgkJCXBDb2V4U3RhLT5idEluZm9DMmhbcnNwU291cmNlXVszXSoyKzEwOwoKCQlwQ29leFN0YS0+YnRJbmZvRXh0ID0gCgkJCXBDb2V4U3RhLT5idEluZm9DMmhbcnNwU291cmNlXVs0XTsKCgkJLy8gSGVyZSB3ZSBuZWVkIHRvIHJlc2VuZCBzb21lIHdpZmkgaW5mbyB0byBCVAoJCS8vIGJlY2F1c2UgYnQgaXMgcmVzZXQgYW5kIGxvc3Mgb2YgdGhlIGluZm8uCgkJaWYoIChwQ29leFN0YS0+YnRJbmZvRXh0ICYgQklUMSkgKQoJCXsJCQkKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCVCBleHQgaW5mbyBiaXQxIGNoZWNrLCBzZW5kIHdpZmkgQlcmQ2hubCB0byBCVCEhXG4iKSk7CgkJCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJmJXaWZpQ29ubmVjdGVkKTsKCQkJaWYoYldpZmlDb25uZWN0ZWQpCgkJCXsKCQkJCUVYaGFsYnRjODE5MmUxYW50X01lZGlhU3RhdHVzTm90aWZ5KHBCdENvZXhpc3QsIEJUQ19NRURJQV9DT05ORUNUKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCUVYaGFsYnRjODE5MmUxYW50X01lZGlhU3RhdHVzTm90aWZ5KHBCdENvZXhpc3QsIEJUQ19NRURJQV9ESVNDT05ORUNUKTsKCQkJfQoKCQkJc2V0QnRQc2RNb2RlID0gMDsKCQl9CgoJCS8vIHRlc3QtY2hpcCBidCBwYXRjaCBvbmx5IHJzcCB0aGUgc3RhdHVzIGZvciBCVF9SU1AsIAoJCS8vIHNvIHRlbXBvcmFyeSB3ZSBjb25zaWRlciB0aGUgZm9sbG93aW5nIG9ubHkgdW5kZXIgQlRfUlNQCgkJaWYoQlRfSU5GT19TUkNfODE5MkVfMUFOVF9CVF9SU1AgPT0gcnNwU291cmNlKQoJCXsKCQkJaWYoIChwQ29leFN0YS0+YnRJbmZvRXh0ICYgQklUMykgKQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJUIGV4dCBpbmZvIGJpdDMgY2hlY2ssIHNldCBCVCBOT1QgdG8gaWdub3JlIFdsYW4gYWN0aXZlISFcbiIpKTsKCQkJCWhhbGJ0YzgxOTJlMWFudF9JZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCS8vIEJUIGFscmVhZHkgTk9UIGlnbm9yZSBXbGFuIGFjdGl2ZSwgZG8gbm90aGluZyBoZXJlLgoJCQl9CiNpZihCVF9BVVRPX1JFUE9SVF9PTkxZXzgxOTJFXzFBTlQgPT0gMCkKCQkJaWYoIChwQ29leFN0YS0+YnRJbmZvRXh0ICYgQklUNCkgKQoJCQl7CgkJCQkvLyBCVCBhdXRvIHJlcG9ydCBhbHJlYWR5IGVuYWJsZWQsIGRvIG5vdGhpbmcKCQkJfQoJCQllbHNlCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQlQgZXh0IGluZm8gYml0NCBjaGVjaywgc2V0IEJUIHRvIGVuYWJsZSBBdXRvIFJlcG9ydCEhXG4iKSk7CgkJCQloYWxidGM4MTkyZTFhbnRfQnRBdXRvUmVwb3J0KHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIHRydWUpOwoJCQl9CiNlbmRpZgoJCX0KCX0KCQkKCS8vIGNoZWNrIEJJVDIgZmlyc3QgPT0+IGNoZWNrIGlmIGJ0IGlzIHVuZGVyIGlucXVpcnkgb3IgcGFnZSBzY2FuCglpZihidEluZm8gJiBCVF9JTkZPXzgxOTJFXzFBTlRfQl9JTlFfUEFHRSkKCQlwQ29leFN0YS0+YkMyaEJ0SW5xdWlyeVBhZ2UgPSB0cnVlOwoJZWxzZQoJCXBDb2V4U3RhLT5iQzJoQnRJbnF1aXJ5UGFnZSA9IEZBTFNFOwoKCS8vIHNldCBsaW5rIGV4aXN0IHN0YXR1cwoJaWYoIShidEluZm8mQlRfSU5GT184MTkyRV8xQU5UX0JfQ09OTkVDVElPTikpCgl7CgkJcENvZXhTdGEtPmJCdExpbmtFeGlzdCA9IEZBTFNFOwoJCXBDb2V4U3RhLT5iUGFuRXhpc3QgPSBGQUxTRTsKCQlwQ29leFN0YS0+YkEyZHBFeGlzdCA9IEZBTFNFOwoJCXBDb2V4U3RhLT5iSGlkRXhpc3QgPSBGQUxTRTsKCQlwQ29leFN0YS0+YlNjb0V4aXN0ID0gRkFMU0U7Cgl9CgllbHNlIC8vIGNvbm5lY3Rpb24gZXhpc3RzIAoJewoJCXBDb2V4U3RhLT5iQnRMaW5rRXhpc3QgPSB0cnVlOwoJCWlmKGJ0SW5mbyAmIEJUX0lORk9fODE5MkVfMUFOVF9CX0ZUUCkKCQkJcENvZXhTdGEtPmJQYW5FeGlzdCA9IHRydWU7CgkJZWxzZQoJCQlwQ29leFN0YS0+YlBhbkV4aXN0ID0gRkFMU0U7CgkJaWYoYnRJbmZvICYgQlRfSU5GT184MTkyRV8xQU5UX0JfQTJEUCkKCQkJcENvZXhTdGEtPmJBMmRwRXhpc3QgPSB0cnVlOwoJCWVsc2UKCQkJcENvZXhTdGEtPmJBMmRwRXhpc3QgPSBGQUxTRTsKCQlpZihidEluZm8gJiBCVF9JTkZPXzgxOTJFXzFBTlRfQl9ISUQpCgkJCXBDb2V4U3RhLT5iSGlkRXhpc3QgPSB0cnVlOwoJCWVsc2UKCQkJcENvZXhTdGEtPmJIaWRFeGlzdCA9IEZBTFNFOwoJCWlmKGJ0SW5mbyAmIEJUX0lORk9fODE5MkVfMUFOVF9CX1NDT19FU0NPKQoJCQlwQ29leFN0YS0+YlNjb0V4aXN0ID0gdHJ1ZTsKCQllbHNlCgkJCXBDb2V4U3RhLT5iU2NvRXhpc3QgPSBGQUxTRTsKCX0KCgloYWxidGM4MTkyZTFhbnRfVXBkYXRlQnRMaW5rSW5mbyhwQnRDb2V4aXN0KTsKCglpZighKGJ0SW5mbyZCVF9JTkZPXzgxOTJFXzFBTlRfQl9DT05ORUNUSU9OKSkKCXsKCQlwQ29leERtLT5idFN0YXR1cyA9IEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRTsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCBidCBub24tY29ubmVjdGVkIGlkbGUhISFcbiIpKTsKCX0KCWVsc2UgaWYoYnRJbmZvID09IEJUX0lORk9fODE5MkVfMUFOVF9CX0NPTk5FQ1RJT04pCS8vIGNvbm5lY3Rpb24gZXhpc3RzIGJ1dCBubyBidXN5Cgl7CgkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCBidCBjb25uZWN0ZWQtaWRsZSEhIVxuIikpOwoJfQkJCgllbHNlIGlmKChidEluZm8mQlRfSU5GT184MTkyRV8xQU5UX0JfU0NPX0VTQ08pIHx8CgkJKGJ0SW5mbyZCVF9JTkZPXzgxOTJFXzFBTlRfQl9TQ09fQlVTWSkpCgl7CgkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWTsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCBidCBzY28gYnVzeSEhIVxuIikpOwoJfQoJZWxzZSBpZiggKGJ0SW5mbyZCVF9JTkZPXzgxOTJFXzFBTlRfQl9BQ0xfQlVTWSkgfHwKCQkJKGJ0SW5mbyZCVF9JTkZPXzgxOTJFXzFBTlRfQl9BMkRQKSB8fAoJCQkoYnRJbmZvJkJUX0lORk9fODE5MkVfMUFOVF9CX0ZUUCkgKQoJewoJCWlmKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZICE9IHBDb2V4RG0tPmJ0U3RhdHVzKQoJCQlwQ29leERtLT5iQXV0b1RkbWFBZGp1c3QgPSBGQUxTRTsKCQlwQ29leERtLT5idFN0YXR1cyA9IEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0FDTF9CVVNZOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIGJ0IGFjbCBidXN5ISEhXG4iKSk7Cgl9CgllbHNlCgl7CgkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19NQVg7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgYnQgbm9uLWRlZmluZWQgc3RhdGUhISFcbiIpKTsKCX0KCgkvLyByYSBtYXNrIGNoZWNrCglpZihwQnRMaW5rSW5mby0+YlNjb0V4aXN0IHx8IHBCdExpbmtJbmZvLT5iSGlkRXhpc3QpCgl7CgkJaGFsYnRjODE5MmUxYW50X1VwZGF0ZXJhX21hc2socEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEJUQ19SQVRFX0RJU0FCTEUsIDB4MDAwMDAwMDMpOwkvLyBkaXNhYmxlIHR4IGNjayAxTS8yTQoJfQoJZWxzZQoJewoJCWhhbGJ0YzgxOTJlMWFudF9VcGRhdGVyYV9tYXNrKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBCVENfUkFURV9FTkFCTEUsIDB4MDAwMDAwMDMpOwkvLyBlbmFibGUgdHggY2NrIDFNLzJNCgl9CgkKCWlmKCAoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpIHx8CgkJKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX1NDT19CVVNZID09IHBDb2V4RG0tPmJ0U3RhdHVzKSB8fAoJCShCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpICkKCXsKCQliQnRCdXN5ID0gdHJ1ZTsKCQlsaW1pdGVkX2RpZyA9IHRydWU7CgkJaWYocEJ0TGlua0luZm8tPmJIaWRFeGlzdCkKCQkJYl9idF9jdHJsX2FnZ19idWZfc2l6ZSA9IHRydWU7Cgl9CgllbHNlCgl7CgkJYkJ0QnVzeSA9IEZBTFNFOwoJCWxpbWl0ZWRfZGlnID0gRkFMU0U7Cgl9CglwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQkxfQlRfVFJBRkZJQ19CVVNZLCAmYkJ0QnVzeSk7CgoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoJLy8JQWdncmVnYXRpb24gcmVsYXRlZCBzZXR0aW5nCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkvLyBpZiBzY28sIHJlamVjdCBBZGRCQQoJLy9wQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQkxfVE9fUkVKX0FQX0FHR19QS1QsICZiUmVqQXBBZ2dQa3QpOwoKCS8vIGRlY2lkZSBCVCBjb250cm9sIGFnZ3JlZ2F0aW9uIGJ1ZiBzaXplIG9yIG5vdAoJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0JMX0JUX0NUUkxfQUdHX1NJWkUsICZiX2J0X2N0cmxfYWdnX2J1Zl9zaXplKTsKCS8vIHJlYWwgdXBkYXRlIGFnZ3JlZ2F0aW9uIHNldHRpbmcKCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9BQ1RfQUdHUkVHQVRFX0NUUkwsIE5VTEwpOwoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKCXBDb2V4RG0tPmxpbWl0ZWRfZGlnID0gbGltaXRlZF9kaWc7CglwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQkxfQlRfTElNSVRFRF9ESUcsICZsaW1pdGVkX2RpZyk7CgoJaGFsYnRjODE5MmUxYW50X1J1bkNvZXhpc3RNZWNoYW5pc20ocEJ0Q29leGlzdCk7Cn0KClZPSUQKRVhoYWxidGM4MTkyZTFhbnRfU3RhY2tPcGVyYXRpb25Ob3RpZnkoCglJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJCXR5cGUKCSkKewoJaWYoQlRDX1NUQUNLX09QX0lOUV9QQUdFX1BBSVJfU1RBUlQgPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBTdGFja09QIElucXVpcnkvcGFnZS9wYWlyIHN0YXJ0IG5vdGlmeVxuIikpOwoJfQoJZWxzZSBpZihCVENfU1RBQ0tfT1BfSU5RX1BBR0VfUEFJUl9GSU5JU0ggPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBTdGFja09QIElucXVpcnkvcGFnZS9wYWlyIGZpbmlzaCBub3RpZnlcbiIpKTsKCX0KfQoKVk9JRApFWGhhbGJ0YzgxOTJlMWFudF9IYWx0Tm90aWZ5KAoJSU4JUEJUQ19DT0VYSVNUCQkJcEJ0Q29leGlzdAoJKQp7CglCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBIYWx0IG5vdGlmeVxuIikpOwoKCXBCdENvZXhpc3QtPmJTdG9wQ29leERtID0gdHJ1ZTsKCWhhbGJ0YzgxOTJlMWFudF9JZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIHRydWUpOwoKCWhhbGJ0YzgxOTJlMWFudF9Qb3dlclNhdmVTdGF0ZShwQnRDb2V4aXN0LCBCVENfUFNfV0lGSV9OQVRJVkUsIDB4MCwgMHgwKTsKCQoJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSwgMCk7CglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg0ZiwgMHhmKTsKCglFWGhhbGJ0YzgxOTJlMWFudF9NZWRpYVN0YXR1c05vdGlmeShwQnRDb2V4aXN0LCBCVENfTUVESUFfRElTQ09OTkVDVCk7Cn0KClZPSUQKRVhoYWxidGM4MTkyZTFhbnRfUG5wTm90aWZ5KAoJSU4JUEJUQ19DT0VYSVNUCQkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCQlwbnBTdGF0ZQoJKQp7CglCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBQbnAgbm90aWZ5XG4iKSk7CgoJaWYoQlRDX1dJRklfUE5QX1NMRUVQID09IHBucFN0YXRlKQoJewoJCXBCdENvZXhpc3QtPmJTdG9wQ29leERtID0gdHJ1ZTsKCQloYWxidGM4MTkyZTFhbnRfSWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCB0cnVlKTsKCQloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX1dJRklfTkFUSVZFLCAweDAsIDB4MCk7CgkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDkpOwkKCX0KCWVsc2UgaWYoQlRDX1dJRklfUE5QX1dBS0VfVVAgPT0gcG5wU3RhdGUpCgl7CgkJCgl9Cn0KClZPSUQKRVhoYWxidGM4MTkyZTFhbnRfUGVyaW9kaWNhbCgKCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QKCSkKewoJc3RhdGljIHUxQnl0ZQkJZGlzVmVySW5mb0NudD0wOwoJdTRCeXRlCQkJCWZ3VmVyPTAsIGJ0UGF0Y2hWZXI9MDsKCXN0cnVjdCBidGNfYm9hcmRfaW5mbyAqCQlwQm9hcmRJbmZvPSZwQnRDb2V4aXN0LT5ib2FyZF9pbmZvOwoJUEJUQ19TVEFDS19JTkZPCQlwU3RhY2tJbmZvPSZwQnRDb2V4aXN0LT5zdGFja19pbmZvOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgPT09PT09PT09PT09PT09PT09PT09PT09PT1QZXJpb2RpY2FsPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKSk7CgoJaWYoZGlzVmVySW5mb0NudCA8PSA1KQoJewoJCWRpc1ZlckluZm9DbnQgKz0gMTsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwgKCJbQlRDb2V4XSwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIikpOwoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULCAoIltCVENvZXhdLCBBbnQgUEcgTnVtLyBBbnQgTWVjaC8gQW50IFBvcyA9ICVkLyAlZC8gJWRcbiIsIFwKCQkJcEJvYXJkSW5mby0+cGdfYW50X251bSwgcEJvYXJkSW5mby0+YnRkbV9hbnRfbnVtLCBwQm9hcmRJbmZvLT5idGRtX2FudF9wb3MpKTsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwgKCJbQlRDb2V4XSwgQlQgc3RhY2svIGhjaSBleHQgdmVyID0gJXMgLyAlZFxuIiwgXAoJCQkoKHBTdGFja0luZm8tPmJQcm9maWxlTm90aWZpZWQpPyAiWWVzIjoiTm8iKSwgcFN0YWNrSW5mby0+aGNpVmVyc2lvbikpOwoJCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9CVF9QQVRDSF9WRVIsICZidFBhdGNoVmVyKTsKCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9GV19WRVIsICZmd1Zlcik7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsICgiW0JUQ29leF0sIENvZXhWZXIvIEZ3VmVyLyBQYXRjaFZlciA9ICVkXyV4LyAweCV4LyAweCV4KCVkKVxuIiwgXAoJCQlHTENvZXhWZXJEYXRlODE5MmUxQW50LCBHTENvZXhWZXI4MTkyZTFBbnQsIGZ3VmVyLCBidFBhdGNoVmVyLCBidFBhdGNoVmVyKSk7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsICgiW0JUQ29leF0sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpKTsKCX0KI2lmKEJUX0FVVE9fUkVQT1JUX09OTFlfODE5MkVfMUFOVCA9PSAwKQoJaGFsYnRjODE5MmUxYW50X1F1ZXJ5QnRJbmZvKHBCdENvZXhpc3QpOwoJaGFsYnRjODE5MmUxYW50X01vbml0b3JCdEN0cihwQnRDb2V4aXN0KTsKCWhhbGJ0YzgxOTJlMWFudF9Nb25pdG9yQnRFbmFibGVEaXNhYmxlKHBCdENvZXhpc3QpOwojZWxzZQoJaWYoIGhhbGJ0YzgxOTJlMWFudF9Jc1dpZmlTdGF0dXNDaGFuZ2VkKHBCdENvZXhpc3QpIHx8CgkJcENvZXhEbS0+YkF1dG9UZG1hQWRqdXN0KQoJewoJCWhhbGJ0YzgxOTJlMWFudF9SdW5Db2V4aXN0TWVjaGFuaXNtKHBCdENvZXhpc3QpOwoJfQojZW5kaWYKfQoKVk9JRApFWGhhbGJ0YzgxOTJlMWFudF9EYmdDb250cm9sKAoJSU4JUEJUQ19DT0VYSVNUCQkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCQlvcENvZGUsCglJTgl1MUJ5dGUJCQkJb3BMZW4sCglJTglwdTFCeXRlCQkJCXBEYXRhCgkpCnsKCXN3aXRjaChvcENvZGUpCgl7CgkJY2FzZSBCVENfREJHX1NFVF9DT0VYX05PUk1BTDoKCQkJcEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wgPSBGQUxTRTsKCQkJaGFsYnRjODE5MmUxYW50X0luaXRDb2V4RG0ocEJ0Q29leGlzdCk7CgkJCWJyZWFrOwoJCWNhc2UgQlRDX0RCR19TRVRfQ09FWF9XSUZJX09OTFk6CgkJCXBCdENvZXhpc3QtPm1hbnVhbF9jb250cm9sID0gdHJ1ZTsKCQkJaGFsYnRjODE5MmUxYW50X1Bvd2VyU2F2ZVN0YXRlKHBCdENvZXhpc3QsIEJUQ19QU19XSUZJX05BVElWRSwgMHgwLCAweDApOwoJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgOSk7CQoJCQlicmVhazsKCQljYXNlIEJUQ19EQkdfU0VUX0NPRVhfQlRfT05MWToKCQkJLy8gdG9kbwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlicmVhazsKCX0KfQojZW5kaWYKCg==