Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gRGVzY3JpcHRpb246Ci8vCi8vIFRoaXMgZmlsZSBpcyBmb3IgUlRMODcyM0EgQ28tZXhpc3QgbWVjaGFuaXNtCi8vCi8vIEhpc3RvcnkKLy8gMjAxMi8wOC8yMiBDb3NhIGZpcnN0IGNoZWNrIGluLgovLyAyMDEyLzExLzE0IENvc2EgUmV2aXNlIGZvciA4NzIzQSAyQW50IG91dCBzb3VyY2luZy4KLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIGluY2x1ZGUgZmlsZXMKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KI2luY2x1ZGUgIk1wX1ByZWNvbXAuaCIKI2lmKEJUXzMwX1NVUFBPUlQgPT0gMSkKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gR2xvYmFsIHZhcmlhYmxlcywgdGhlc2UgYXJlIHN0YXRpYyB2YXJpYWJsZXMKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0Kc3RhdGljIENPRVhfRE1fODcyM0FfMkFOVAlHTENvZXhEbTg3MjNhMkFudDsKc3RhdGljIFBDT0VYX0RNXzg3MjNBXzJBTlQgCXBDb2V4RG09JkdMQ29leERtODcyM2EyQW50OwpzdGF0aWMgQ09FWF9TVEFfODcyM0FfMkFOVAlHTENvZXhTdGE4NzIzYTJBbnQ7CnN0YXRpYyBQQ09FWF9TVEFfODcyM0FfMkFOVAlwQ29leFN0YT0mR0xDb2V4U3RhODcyM2EyQW50OwoKY29uc3QgY2hhciAqY29uc3QgR0xCdEluZm9TcmM4NzIzYTJBbnRbXT17CgkiQlQgSW5mb1t3aWZpIGZ3XSIsCgkiQlQgSW5mb1tidCByc3BdIiwKCSJCVCBJbmZvW2J0IGF1dG8gcmVwb3J0XSIsCn07CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBsb2NhbCBmdW5jdGlvbiBwcm90byB0eXBlIGlmIG5lZWRlZAovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBsb2NhbCBmdW5jdGlvbiBzdGFydCB3aXRoIGhhbGJ0Yzg3MjNhMmFudF8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQk9PTEVBTgpoYWxidGM4NzIzYTJhbnRfSXNXaWZpSWRsZSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CglCT09MRUFOCQliV2lmaUNvbm5lY3RlZD1GQUxTRSwgYlNjYW49RkFMU0UsIGJMaW5rPUZBTFNFLCBiUm9hbT1GQUxTRTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZiV2lmaUNvbm5lY3RlZCk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9TQ0FOLCAmYlNjYW4pOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfTElOSywgJmJMaW5rKTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1JPQU0sICZiUm9hbSk7CgoJaWYoYldpZmlDb25uZWN0ZWQpCgkJcmV0dXJuIEZBTFNFOwoJaWYoYlNjYW4pCgkJcmV0dXJuIEZBTFNFOwoJaWYoYkxpbmspCgkJcmV0dXJuIEZBTFNFOwoJaWYoYlJvYW0pCgkJcmV0dXJuIEZBTFNFOwoKCXJldHVybiB0cnVlOwp9Cgp1MUJ5dGUKaGFsYnRjODcyM2EyYW50X0J0UnNzaVN0YXRlKAoJdTFCeXRlCQkJbGV2ZWxOdW0sCgl1MUJ5dGUJCQlyc3NpVGhyZXNoLAoJdTFCeXRlCQkJcnNzaVRocmVzaDEKCSkKewoJczRCeXRlCQkJYnRSc3NpPTA7Cgl1MUJ5dGUJCQlidFJzc2lTdGF0ZT1wQ29leFN0YS0+cHJlQnRSc3NpU3RhdGU7CgoJYnRSc3NpID0gcENvZXhTdGEtPmJ0UnNzaTsKCglpZihsZXZlbE51bSA9PSAyKQoJewkJCQoJCWlmKCAocENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKCQkJKHBDb2V4U3RhLT5wcmVCdFJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpCgkJewoJCQlpZihidFJzc2kgPj0gKHJzc2lUaHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNBXzJBTlQpKQoJCQl7CgkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVzsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJaWYoYnRSc3NpIDwgcnNzaVRocmVzaCkKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOwoJCQl9CgkJfQoJfQoJZWxzZSBpZihsZXZlbE51bSA9PSAzKQoJewoJCWlmKHJzc2lUaHJlc2ggPiByc3NpVGhyZXNoMSkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHRocmVzaCBlcnJvciEhXG4iKSk7CgkJCXJldHVybiBwQ29leFN0YS0+cHJlQnRSc3NpU3RhdGU7CgkJfQoJCQoJCWlmKCAocENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKCQkJKHBDb2V4U3RhLT5wcmVCdFJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpCgkJewoJCQlpZihidFJzc2kgPj0gKHJzc2lUaHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNBXzJBTlQpKQoJCQl7CgkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX01FRElVTTsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN3aXRjaCB0byBNZWRpdW1cbiIpKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOwoJCQl9CgkJfQoJCWVsc2UgaWYoIChwQ29leFN0YS0+cHJlQnRSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTUVESVVNKSB8fAoJCQkocENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNKSkKCQl7CgkJCWlmKGJ0UnNzaSA+PSAocnNzaVRocmVzaDErQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNBXzJBTlQpKQoJCQl7CgkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOwoJCQl9CgkJCWVsc2UgaWYoYnRSc3NpIDwgcnNzaVRocmVzaCkKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTUVESVVNOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3RheSBhdCBNZWRpdW1cbiIpKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlpZihidFJzc2kgPCByc3NpVGhyZXNoMSkKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9NRURJVU07CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOwoJCQl9CgkJfQoJfQoJCQoJcENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlID0gYnRSc3NpU3RhdGU7CgoJcmV0dXJuIGJ0UnNzaVN0YXRlOwp9Cgp1MUJ5dGUKaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQlpbmRleCwKCUlOCXUxQnl0ZQkJCWxldmVsTnVtLAoJSU4JdTFCeXRlCQkJcnNzaVRocmVzaCwKCUlOCXUxQnl0ZQkJCXJzc2lUaHJlc2gxCgkpCnsKCXM0Qnl0ZQkJCXdpZmlSc3NpPTA7Cgl1MUJ5dGUJCQl3aWZpUnNzaVN0YXRlPXBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfUzRfV0lGSV9SU1NJLCAmd2lmaVJzc2kpOwoJCglpZihsZXZlbE51bSA9PSAyKQoJewoJCWlmKCAocENvZXhTdGEtPnByZVdpZmlSc3NpU3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKCQkJKHBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpCgkJewoJCQlpZih3aWZpUnNzaSA+PSAocnNzaVRocmVzaCtCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODcyM0FfMkFOVCkpCgkJCXsKCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9ISUdIOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlpZih3aWZpUnNzaSA8IHJzc2lUaHJlc2gpCgkJCXsKCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKCQkJfQoJCX0KCX0KCWVsc2UgaWYobGV2ZWxOdW0gPT0gMykKCXsKCQlpZihyc3NpVGhyZXNoID4gcnNzaVRocmVzaDEpCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgdGhyZXNoIGVycm9yISFcbiIpKTsKCQkJcmV0dXJuIHBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XTsKCQl9CgkJCgkJaWYoIChwQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfTE9XKSB8fAoJCQkocENvZXhTdGEtPnByZVdpZmlSc3NpU3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSkKCQl7CgkJCWlmKHdpZmlSc3NpID49IChyc3NpVGhyZXNoK0JUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84NzIzQV8yQU5UKSkKCQkJewoJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX01FRElVTTsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKCQkJfQoJCX0KCQllbHNlIGlmKCAocENvZXhTdGEtPnByZVdpZmlSc3NpU3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX01FRElVTSkgfHwKCQkJKHBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTSkpCgkJewoJCQlpZih3aWZpUnNzaSA+PSAocnNzaVRocmVzaDErQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzg3MjNBXzJBTlQpKQoJCQl7CgkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOwoJCQl9CgkJCWVsc2UgaWYod2lmaVJzc2kgPCByc3NpVGhyZXNoKQoJCQl7CgkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTE9XOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBMb3dcbiIpKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTTsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IE1lZGl1bVxuIikpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKHdpZmlSc3NpIDwgcnNzaVRocmVzaDEpCgkJCXsKCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9NRURJVU07CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKCQkJfQoJCX0KCX0KCQkKCXBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XSA9IHdpZmlSc3NpU3RhdGU7CgoJcmV0dXJuIHdpZmlSc3NpU3RhdGU7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X0luZGljYXRlV2lmaUNobmxCd0luZm8oCglJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJCXR5cGUKCSkKewoJdTFCeXRlCQkJSDJDX1BhcmFtZXRlclszXSA9ezB9OwoJdTRCeXRlCQkJd2lmaUJ3OwoJdTFCeXRlCQkJd2lmaUNlbnRyYWxDaG5sOwoJCgkvLyBvbmx5IDIuNEcgd2UgbmVlZCB0byBpbmZvcm0gYnQgdGhlIGNobmwgbWFzawoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1UxX1dJRklfQ0VOVFJBTF9DSE5MLCAmd2lmaUNlbnRyYWxDaG5sKTsKCWlmKCAoQlRDX01FRElBX0NPTk5FQ1QgPT0gdHlwZSkgJiYKCQkod2lmaUNlbnRyYWxDaG5sIDw9IDE0KSApCgl7CgkJSDJDX1BhcmFtZXRlclswXSA9IDB4MTsKCQlIMkNfUGFyYW1ldGVyWzFdID0gd2lmaUNlbnRyYWxDaG5sOwoJCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKCQlpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKCQkJSDJDX1BhcmFtZXRlclsyXSA9IDB4MzA7CgkJZWxzZQoJCQlIMkNfUGFyYW1ldGVyWzJdID0gMHgyMDsKCX0KCQkKCXBDb2V4RG0tPndpZmlDaG5sSW5mb1swXSA9IEgyQ19QYXJhbWV0ZXJbMF07CglwQ29leERtLT53aWZpQ2hubEluZm9bMV0gPSBIMkNfUGFyYW1ldGVyWzFdOwoJcENvZXhEbS0+d2lmaUNobmxJbmZvWzJdID0gSDJDX1BhcmFtZXRlclsyXTsKCQoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIEZXIHdyaXRlIDB4MTk9MHgleFxuIiwgCgkJSDJDX1BhcmFtZXRlclswXTw8MTZ8SDJDX1BhcmFtZXRlclsxXTw8OHxIMkNfUGFyYW1ldGVyWzJdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4MTksIDMsIEgyQ19QYXJhbWV0ZXIpOwp9CgpWT0lECmhhbGJ0Yzg3MjNhMmFudF9RdWVyeUJ0SW5mbygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzFdID17MH07CgoJcENvZXhTdGEtPmJDMmhCdEluZm9SZXFTZW50ID0gdHJ1ZTsKCglIMkNfUGFyYW1ldGVyWzBdIHw9IEJJVDA7CS8vIHRyaWdnZXIKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgUXVlcnkgQnQgSW5mbywgRlcgd3JpdGUgMHgzOD0weCV4XG4iLCAKCQlIMkNfUGFyYW1ldGVyWzBdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4MzgsIDEsIEgyQ19QYXJhbWV0ZXIpOwp9CnUxQnl0ZQpoYWxidGM4NzIzYTJhbnRfQWN0aW9uQWxnb3JpdGhtKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCVBCVENfU1RBQ0tfSU5GTwkJcFN0YWNrSW5mbz0mcEJ0Q29leGlzdC0+c3RhY2tfaW5mbzsKCUJPT0xFQU4JCQkJYkJ0SHNPbj1GQUxTRSwgYkJ0QnVzeT1GQUxTRSwgbGltaXRlZF9kaWc9RkFMU0U7Cgl1MUJ5dGUJCQkJYWxnb3JpdGhtPUJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1VOREVGSU5FRDsKCXUxQnl0ZQkJCQludW1PZkRpZmZQcm9maWxlPTA7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJCdEhzT24pOwoKCS8vPT09PT09PT09PT09PT09PT09PT09PQoJLy8gaGVyZSB3ZSBnZXQgQlQgc3RhdHVzIGZpcnN0CgkvLz09PT09PT09PT09PT09PT09PT09PT0KCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfSURMRTsKCQoJaWYoKHBTdGFja0luZm8tPmJTY29FeGlzdCkgfHwoYkJ0SHNPbikgfHwocFN0YWNrSW5mby0+YkhpZEV4aXN0KSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyBvciBISUQgb3IgSFMgZXhpc3RzLCBzZXQgQlQgbm9uLWlkbGUgISEhXG4iKSk7CgkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19OT05fSURMRTsKCX0KCWVsc2UKCXsKCQkvLyBBMmRwIHByb2ZpbGUKCQlpZiggKHBCdENvZXhpc3QtPnN0YWNrX2luZm8ubnVtT2ZMaW5rID09IDEpICYmCgkJCShwU3RhY2tJbmZvLT5iQTJkcEV4aXN0KSApCgkJewkJCgkJCWlmKCAocENvZXhTdGEtPmxvd1ByaW9yaXR5VHgrCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4KSA8IDEwMCkKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBMkRQLCBsb3cgcHJpb3JpdHkgdHgrcnggPCAxMDAsIHNldCBCVCBjb25uZWN0ZWQtaWRsZSEhIVxuIikpOwoJCQkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCwgbG93IHByaW9yaXR5IHR4K3J4ID49IDEwMCwgc2V0IEJUIG5vbi1pZGxlISEhXG4iKSk7CgkJCQlwQ29leERtLT5idFN0YXR1cyA9IEJUXzg3MjNBXzJBTlRfQlRfU1RBVFVTX05PTl9JRExFOwoJCQl9CgkJfQoJCS8vIFBhbiBwcm9maWxlCgkJaWYoIChwQnRDb2V4aXN0LT5zdGFja19pbmZvLm51bU9mTGluayA9PSAxKSAmJgoJCQkocFN0YWNrSW5mby0+YlBhbkV4aXN0KSApCgkJewkJCgkJCWlmKChwQ29leFN0YS0+bG93UHJpb3JpdHlUeCsJcENvZXhTdGEtPmxvd1ByaW9yaXR5UngpIDwgNjAwKQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFBBTiwgbG93IHByaW9yaXR5IHR4K3J4IDwgNjAwLCBzZXQgQlQgY29ubmVjdGVkLWlkbGUhISFcbiIpKTsKCQkJCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlpZihwQ29leFN0YS0+bG93UHJpb3JpdHlUeCkKCQkJCXsKCQkJCQlpZigocENvZXhTdGEtPmxvd1ByaW9yaXR5UnggL3BDb2V4U3RhLT5sb3dQcmlvcml0eVR4KT45ICkKCQkJCQl7CgkJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUEFOLCBsb3cgcHJpb3JpdHkgcngvdHggPiA5LCBzZXQgQlQgY29ubmVjdGVkLWlkbGUhISFcbiIpKTsKCQkJCQkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYoQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgIT0gcENvZXhEbS0+YnRTdGF0dXMpCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUEFOLCBzZXQgQlQgbm9uLWlkbGUhISFcbiIpKTsKCQkJCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfTk9OX0lETEU7CgkJCX0KCQl9CgkJLy8gUGFuK0EyZHAgcHJvZmlsZQoJCWlmKCAocEJ0Q29leGlzdC0+c3RhY2tfaW5mby5udW1PZkxpbmsgPT0gMikgJiYKCQkJKHBTdGFja0luZm8tPmJBMmRwRXhpc3QpICYmCgkJCShwU3RhY2tJbmZvLT5iUGFuRXhpc3QpICkKCQl7CgkJCWlmKChwQ29leFN0YS0+bG93UHJpb3JpdHlUeCsJcENvZXhTdGEtPmxvd1ByaW9yaXR5UngpIDwgNjAwKQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFBBTitBMkRQLCBsb3cgcHJpb3JpdHkgdHgrcnggPCA2MDAsIHNldCBCVCBjb25uZWN0ZWQtaWRsZSEhIVxuIikpOwoJCQkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWlmKHBDb2V4U3RhLT5sb3dQcmlvcml0eVR4KQoJCQkJewoJCQkJCWlmKChwQ29leFN0YS0+bG93UHJpb3JpdHlSeCAvcENvZXhTdGEtPmxvd1ByaW9yaXR5VHgpPjkgKQoJCQkJCXsKCQkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBQQU4rQTJEUCwgbG93IHByaW9yaXR5IHJ4L3R4ID4gOSwgc2V0IEJUIGNvbm5lY3RlZC1pZGxlISEhXG4iKSk7CgkJCQkJCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEU7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWlmKEJUXzg3MjNBXzJBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFICE9IHBDb2V4RG0tPmJ0U3RhdHVzKQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFBBTitBMkRQLCBzZXQgQlQgbm9uLWlkbGUhISFcbiIpKTsKCQkJCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfTk9OX0lETEU7CgkJCX0KCQl9Cgl9CglpZihCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19JRExFICE9IHBDb2V4RG0tPmJ0U3RhdHVzKQoJewoJCWJCdEJ1c3kgPSB0cnVlOwoJCWxpbWl0ZWRfZGlnID0gdHJ1ZTsKCX0KCWVsc2UKCXsKCQliQnRCdXN5ID0gRkFMU0U7CgkJbGltaXRlZF9kaWcgPSBGQUxTRTsKCX0KCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9CVF9UUkFGRklDX0JVU1ksICZiQnRCdXN5KTsKCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9CVF9MSU1JVEVEX0RJRywgJmxpbWl0ZWRfZGlnKTsKCS8vPT09PT09PT09PT09PT09PT09PT09PQoKCWlmKCFwU3RhY2tJbmZvLT5iQnRMaW5rRXhpc3QpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBObyBwcm9maWxlIGV4aXN0cyEhIVxuIikpOwoJCXJldHVybiBhbGdvcml0aG07Cgl9CgoJaWYocFN0YWNrSW5mby0+YlNjb0V4aXN0KQoJCW51bU9mRGlmZlByb2ZpbGUrKzsKCWlmKHBTdGFja0luZm8tPmJIaWRFeGlzdCkKCQludW1PZkRpZmZQcm9maWxlKys7CglpZihwU3RhY2tJbmZvLT5iUGFuRXhpc3QpCgkJbnVtT2ZEaWZmUHJvZmlsZSsrOwoJaWYocFN0YWNrSW5mby0+YkEyZHBFeGlzdCkKCQludW1PZkRpZmZQcm9maWxlKys7CgkKCWlmKG51bU9mRGlmZlByb2ZpbGUgPT0gMSkKCXsKCQlpZihwU3RhY2tJbmZvLT5iU2NvRXhpc3QpCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyBvbmx5XG4iKSk7CgkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1NDTzsKCQl9CgkJZWxzZQoJCXsKCQkJaWYocFN0YWNrSW5mby0+YkhpZEV4aXN0KQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCBvbmx5XG4iKSk7CgkJCQlhbGdvcml0aG0gPSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19ISUQ7CgkJCX0KCQkJZWxzZSBpZihwU3RhY2tJbmZvLT5iQTJkcEV4aXN0KQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAgb25seVxuIikpOwoJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fQTJEUDsKCQkJfQoJCQllbHNlIGlmKHBTdGFja0luZm8tPmJQYW5FeGlzdCkKCQkJewoJCQkJaWYoYkJ0SHNPbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFBBTihIUykgb25seVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkhTOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUEFOKEVEUikgb25seVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkVEUjsKCQkJCX0KCQkJfQoJCX0KCX0KCWVsc2UgaWYobnVtT2ZEaWZmUHJvZmlsZSA9PSAyKQoJewoJCWlmKHBTdGFja0luZm8tPmJTY29FeGlzdCkKCQl7CgkJCWlmKHBTdGFja0luZm8tPmJIaWRFeGlzdCkKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISURcbiIpKTsKCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX0hJRDsKCQkJfQoJCQllbHNlIGlmKHBTdGFja0luZm8tPmJBMmRwRXhpc3QpCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgQTJEUCA9PT4gU0NPXG4iKSk7CgkJCQlhbGdvcml0aG0gPSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19TQ087CgkJCX0KCQkJZWxzZSBpZihwU3RhY2tJbmZvLT5iUGFuRXhpc3QpCgkJCXsKCQkJCWlmKGJCdEhzT24pCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBQQU4oSFMpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fU0NPOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgUEFOKEVEUilcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwoJCQkJfQoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKCBwU3RhY2tJbmZvLT5iSGlkRXhpc3QgJiYKCQkJCXBTdGFja0luZm8tPmJBMmRwRXhpc3QgKQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFBcbiIpKTsKCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOwoJCQl9CgkJCWVsc2UgaWYoIHBTdGFja0luZm8tPmJIaWRFeGlzdCAmJgoJCQkJcFN0YWNrSW5mby0+YlBhbkV4aXN0ICkKCQkJewoJCQkJaWYoYkJ0SHNPbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihFRFIpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKCQkJCX0KCQkJfQoJCQllbHNlIGlmKCBwU3RhY2tJbmZvLT5iUGFuRXhpc3QgJiYKCQkJCXBTdGFja0luZm8tPmJBMmRwRXhpc3QgKQoJCQl7CgkJCQlpZihiQnRIc09uKQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19BMkRQOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihFRFIpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fUEFORURSX0EyRFA7CgkJCQl9CgkJCX0KCQl9Cgl9CgllbHNlIGlmKG51bU9mRGlmZlByb2ZpbGUgPT0gMykKCXsKCQlpZihwU3RhY2tJbmZvLT5iU2NvRXhpc3QpCgkJewoJCQlpZiggcFN0YWNrSW5mby0+YkhpZEV4aXN0ICYmCgkJCQlwU3RhY2tJbmZvLT5iQTJkcEV4aXN0ICkKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBBMkRQID09PiBISURcbiIpKTsKCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX0hJRDsKCQkJfQoJCQllbHNlIGlmKCBwU3RhY2tJbmZvLT5iSGlkRXhpc3QgJiYKCQkJCXBTdGFja0luZm8tPmJQYW5FeGlzdCApCgkJCXsKCQkJCWlmKGJCdEhzT24pCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBQQU4oSFMpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fSElEX0EyRFA7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBQQU4oRURSKVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CgkJCQl9CgkJCX0KCQkJZWxzZSBpZiggcFN0YWNrSW5mby0+YlBhbkV4aXN0ICYmCgkJCQlwU3RhY2tJbmZvLT5iQTJkcEV4aXN0ICkKCQkJewoJCQkJaWYoYkJ0SHNPbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEEyRFAgKyBQQU4oSFMpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fU0NPOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgQTJEUCArIFBBTihFRFIpID09PiBISURcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwoJCQkJfQoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKCBwU3RhY2tJbmZvLT5iSGlkRXhpc3QgJiYKCQkJCXBTdGFja0luZm8tPmJQYW5FeGlzdCAmJgoJCQkJcFN0YWNrSW5mby0+YkEyZHBFeGlzdCApCgkJCXsKCQkJCWlmKGJCdEhzT24pCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBBMkRQICsgUEFOKEhTKVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUCArIFBBTihFRFIpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFORURSOwoJCQkJfQoJCQl9CgkJfQoJfQoJZWxzZSBpZihudW1PZkRpZmZQcm9maWxlID49IDMpCgl7CgkJaWYocFN0YWNrSW5mby0+YlNjb0V4aXN0KQoJCXsKCQkJaWYoIHBTdGFja0luZm8tPmJIaWRFeGlzdCAmJgoJCQkJcFN0YWNrSW5mby0+YlBhbkV4aXN0ICYmCgkJCQlwU3RhY2tJbmZvLT5iQTJkcEV4aXN0ICkKCQkJewoJCQkJaWYoYkJ0SHNPbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIFNDTyArIEhJRCArIEEyRFAgKyBQQU4oSFMpXG4iKSk7CgoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgSElEICsgQTJEUCArIFBBTihFRFIpPT0+UEFOKEVEUikrSElEXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4gYWxnb3JpdGhtOwp9CgpCT09MRUFOCmhhbGJ0Yzg3MjNhMmFudF9OZWVkVG9EZWNCdFB3cigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CglCT09MRUFOCQliUmV0PUZBTFNFOwoJQk9PTEVBTgkJYkJ0SHNPbj1GQUxTRSwgYldpZmlDb25uZWN0ZWQ9RkFMU0U7CglzNEJ5dGUJCWJ0SHNSc3NpPTA7CgoJaWYoIXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZiQnRIc09uKSkKCQlyZXR1cm4gRkFMU0U7CglpZighcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmYldpZmlDb25uZWN0ZWQpKQoJCXJldHVybiBGQUxTRTsKCWlmKCFwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfUzRfSFNfUlNTSSwgJmJ0SHNSc3NpKSkKCQlyZXR1cm4gRkFMU0U7CgoJaWYoYldpZmlDb25uZWN0ZWQpCgl7CgkJaWYoYkJ0SHNPbikKCQl7CgkJCWlmKGJ0SHNSc3NpID4gMzcpCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgTmVlZCB0byBkZWNyZWFzZSBidCBwb3dlciBmb3IgSFMgbW9kZSEhXG4iKSk7CgkJCQliUmV0ID0gdHJ1ZTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sIE5lZWQgdG8gZGVjcmVhc2UgYnQgcG93ZXIgZm9yIFdpZmkgaXMgY29ubmVjdGVkISFcbiIpKTsKCQkJYlJldCA9IHRydWU7CgkJfQoJfQoJCglyZXR1cm4gYlJldDsKfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfU2V0RndEYWNTd2luZ0xldmVsKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJZGFjU3dpbmdMdmwKCSkKewoJdTFCeXRlCQkJSDJDX1BhcmFtZXRlclsxXSA9ezB9OwoKCS8vIFRoZXJlIGFyZSBzZXZlcmFsIHR5cGUgb2YgZGFjc3dpbmcKCS8vIDB4MTgvIDB4MTAvIDB4Yy8gMHg4LyAweDQvIDB4NgoJSDJDX1BhcmFtZXRlclswXSA9IGRhY1N3aW5nTHZsOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBTZXQgRGFjIFN3aW5nIExldmVsPTB4JXhcbiIsIGRhY1N3aW5nTHZsKSk7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgRlcgd3JpdGUgMHgyOT0weCV4XG4iLCBIMkNfUGFyYW1ldGVyWzBdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4MjksIDEsIEgyQ19QYXJhbWV0ZXIpOwp9CgpWT0lECmhhbGJ0Yzg3MjNhMmFudF9TZXRGd0RlY0J0UHdyKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJEZWNCdFB3cgoJKQp7Cgl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzFdID17MH07CgkKCUgyQ19QYXJhbWV0ZXJbMF0gPSAwOwoKCWlmKGJEZWNCdFB3cikKCXsKCQlIMkNfUGFyYW1ldGVyWzBdIHw9IEJJVDE7Cgl9CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIGRlY3JlYXNlIEJ0IFBvd2VyIDogJXMsIEZXIHdyaXRlIDB4MjE9MHgleFxuIiwgCgkJKGJEZWNCdFB3cj8gIlllcyEhIjoiTm8hISIpLCBIMkNfUGFyYW1ldGVyWzBdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4MjEsIDEsIEgyQ19QYXJhbWV0ZXIpOwkKfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJYkZvcmNlRXhlYywKCUlOCUJPT0xFQU4JCQliRGVjQnRQd3IKCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyBEZWMgQlQgcG93ZXIgPSAlc1xuIiwgIAoJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgKChiRGVjQnRQd3IpPyAiT04iOiJPRkYiKSkpOwoJcENvZXhEbS0+YkN1ckRlY0J0UHdyID0gYkRlY0J0UHdyOwoKCWlmKCFiRm9yY2VFeGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVEZWNCdFB3cj0lZCwgYkN1ckRlY0J0UHdyPSVkXG4iLCAKCQkJcENvZXhEbS0+YlByZURlY0J0UHdyLCBwQ29leERtLT5iQ3VyRGVjQnRQd3IpKTsKCgkJaWYocENvZXhEbS0+YlByZURlY0J0UHdyID09IHBDb2V4RG0tPmJDdXJEZWNCdFB3cikgCgkJCXJldHVybjsKCX0KCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd0RlY0J0UHdyKHBCdENvZXhpc3QsIHBDb2V4RG0tPmJDdXJEZWNCdFB3cik7CgoJcENvZXhEbS0+YlByZURlY0J0UHdyID0gcENvZXhEbS0+YkN1ckRlY0J0UHdyOwp9CgpWT0lECmhhbGJ0Yzg3MjNhMmFudF9Gd0RhY1N3aW5nTHZsKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTgl1MUJ5dGUJCQlmd0RhY1N3aW5nTHZsCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgc2V0IEZXIERhYyBTd2luZyBsZXZlbCA9ICVkXG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCBmd0RhY1N3aW5nTHZsKSk7CglwQ29leERtLT5jdXJGd0RhY1N3aW5nTHZsID0gZndEYWNTd2luZ0x2bDsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBwcmVGd0RhY1N3aW5nTHZsPSVkLCBjdXJGd0RhY1N3aW5nTHZsPSVkXG4iLCAKCQkJcENvZXhEbS0+cHJlRndEYWNTd2luZ0x2bCwgcENvZXhEbS0+Y3VyRndEYWNTd2luZ0x2bCkpOwoKCQlpZihwQ29leERtLT5wcmVGd0RhY1N3aW5nTHZsID09IHBDb2V4RG0tPmN1ckZ3RGFjU3dpbmdMdmwpIAoJCQlyZXR1cm47Cgl9CgoJaGFsYnRjODcyM2EyYW50X1NldEZ3RGFjU3dpbmdMZXZlbChwQnRDb2V4aXN0LCBwQ29leERtLT5jdXJGd0RhY1N3aW5nTHZsKTsKCglwQ29leERtLT5wcmVGd0RhY1N3aW5nTHZsID0gcENvZXhEbS0+Y3VyRndEYWNTd2luZ0x2bDsKfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfU2V0U3dSZlJ4THBmQ29ybmVyKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJSeFJmU2hyaW5rT24KCSkKewoJaWYoYlJ4UmZTaHJpbmtPbikKCXsKCQkvL1NocmluayBSRiBSeCBMUEYgY29ybmVyCgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFNocmluayBSRiBSeCBMUEYgY29ybmVyISFcbiIpKTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxZSwgMHhmZmZmZiwgMHhmMGZmNyk7Cgl9CgllbHNlCgl7CgkJLy9SZXN1bWUgUkYgUnggTFBGIGNvcm5lcgoJCS8vIEFmdGVyIGluaXRpYWxpemVkLCB3ZSBjYW4gdXNlIHBDb2V4RG0tPmJ0UmYweDFlQmFja3VwCgkJaWYocEJ0Q29leGlzdC0+aW5pdGlsaXplZCkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBSZXN1bWUgUkYgUnggTFBGIGNvcm5lciEhXG4iKSk7CgkJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDFlLCAweGZmZmZmLCBwQ29leERtLT5idFJmMHgxZUJhY2t1cCk7CgkJfQoJfQp9CgpWT0lECmhhbGJ0Yzg3MjNhMmFudF9SZlNocmluaygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJSeFJmU2hyaW5rT24KCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyB0dXJuIFJ4IFJGIFNocmluayA9ICVzXG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGJSeFJmU2hyaW5rT24pPyAiT04iOiJPRkYiKSkpOwoJcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbmsgPSBiUnhSZlNocmlua09uOwoKCWlmKCFiRm9yY2VFeGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVSZlJ4THBmU2hyaW5rPSVkLCBiQ3VyUmZSeExwZlNocmluaz0lZFxuIiwgCgkJCXBDb2V4RG0tPmJQcmVSZlJ4THBmU2hyaW5rLCBwQ29leERtLT5iQ3VyUmZSeExwZlNocmluaykpOwoKCQlpZihwQ29leERtLT5iUHJlUmZSeExwZlNocmluayA9PSBwQ29leERtLT5iQ3VyUmZSeExwZlNocmluaykgCgkJCXJldHVybjsKCX0KCWhhbGJ0Yzg3MjNhMmFudF9TZXRTd1JmUnhMcGZDb3JuZXIocEJ0Q29leGlzdCwgcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbmspOwoKCXBDb2V4RG0tPmJQcmVSZlJ4THBmU2hyaW5rID0gcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbms7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X1NldFN3UGVuYWx0eVR4UmF0ZUFkYXB0aXZlKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJMb3dQZW5hbHR5UmEKCSkKewoJdTFCeXRlCXRtcFUxOwoKCXRtcFUxID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg0ZmQpOwoJdG1wVTEgfD0gQklUMDsKCWlmKGJMb3dQZW5hbHR5UmEpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFR4IHJhdGUgYWRhcHRpdmUsIHNldCBsb3cgcGVuYWx0eSEhXG4iKSk7CgkJdG1wVTEgJj0gfkJJVDI7Cgl9CgllbHNlCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFR4IHJhdGUgYWRhcHRpdmUsIHNldCBub3JtYWwhIVxuIikpOwoJCXRtcFUxIHw9IEJJVDI7Cgl9CgoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NGZkLCB0bXBVMSk7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X0xvd1BlbmFsdHlSYSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJMb3dQZW5hbHR5UmEKCSkKewoJcmV0dXJuOwoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyB0dXJuIExvd1BlbmFsdHlSQSA9ICVzXG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGJMb3dQZW5hbHR5UmEpPyAiT04iOiJPRkYiKSkpOwoJcENvZXhEbS0+YkN1ckxvd1BlbmFsdHlSYSA9IGJMb3dQZW5hbHR5UmE7CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZUxvd1BlbmFsdHlSYT0lZCwgYkN1ckxvd1BlbmFsdHlSYT0lZFxuIiwgCgkJCXBDb2V4RG0tPmJQcmVMb3dQZW5hbHR5UmEsIHBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmEpKTsKCgkJaWYocENvZXhEbS0+YlByZUxvd1BlbmFsdHlSYSA9PSBwQ29leERtLT5iQ3VyTG93UGVuYWx0eVJhKSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODcyM2EyYW50X1NldFN3UGVuYWx0eVR4UmF0ZUFkYXB0aXZlKHBCdENvZXhpc3QsIHBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmEpOwoKCXBDb2V4RG0tPmJQcmVMb3dQZW5hbHR5UmEgPSBwQ29leERtLT5iQ3VyTG93UGVuYWx0eVJhOwp9CgpWT0lECmhhbGJ0Yzg3MjNhMmFudF9TZXRTd0Z1bGxUaW1lRGFjU3dpbmcoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJYlN3RGFjU3dpbmdPbiwKCUlOCXU0Qnl0ZQkJCXN3RGFjU3dpbmdMdmwKCSkKewoJaWYoYlN3RGFjU3dpbmdPbikKCXsKCQlwQnRDb2V4aXN0LT5idGNfc2V0QmJSZWcocEJ0Q29leGlzdCwgMHg4ODAsIDB4ZmYwMDAwMDAsIHN3RGFjU3dpbmdMdmwpOwoJfQoJZWxzZQoJewoJCXBCdENvZXhpc3QtPmJ0Y19zZXRCYlJlZyhwQnRDb2V4aXN0LCAweDg4MCwgMHhmZjAwMDAwMCwgMHhjMCk7Cgl9Cn0KCgpWT0lECmhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJEYWNTd2luZ09uLAoJSU4JdTRCeXRlCQkJZGFjU3dpbmdMdmwKCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyB0dXJuIERhY1N3aW5nPSVzLCBkYWNTd2luZ0x2bD0weCV4XG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGJEYWNTd2luZ09uKT8gIk9OIjoiT0ZGIiksIGRhY1N3aW5nTHZsKSk7CglwQ29leERtLT5iQ3VyRGFjU3dpbmdPbiA9IGJEYWNTd2luZ09uOwoJcENvZXhEbS0+Y3VyRGFjU3dpbmdMdmwgPSBkYWNTd2luZ0x2bDsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlRGFjU3dpbmdPbj0lZCwgcHJlRGFjU3dpbmdMdmw9MHgleCwgYkN1ckRhY1N3aW5nT249JWQsIGN1ckRhY1N3aW5nTHZsPTB4JXhcbiIsIAoJCQlwQ29leERtLT5iUHJlRGFjU3dpbmdPbiwgcENvZXhEbS0+cHJlRGFjU3dpbmdMdmwsCgkJCXBDb2V4RG0tPmJDdXJEYWNTd2luZ09uLCBwQ29leERtLT5jdXJEYWNTd2luZ0x2bCkpOwoKCQlpZiggKHBDb2V4RG0tPmJQcmVEYWNTd2luZ09uID09IHBDb2V4RG0tPmJDdXJEYWNTd2luZ09uKSAmJgoJCQkocENvZXhEbS0+cHJlRGFjU3dpbmdMdmwgPT0gcENvZXhEbS0+Y3VyRGFjU3dpbmdMdmwpICkKCQkJcmV0dXJuOwoJfQoJbWRlbGF5KDMwKTsKCWhhbGJ0Yzg3MjNhMmFudF9TZXRTd0Z1bGxUaW1lRGFjU3dpbmcocEJ0Q29leGlzdCwgYkRhY1N3aW5nT24sIGRhY1N3aW5nTHZsKTsKCglwQ29leERtLT5iUHJlRGFjU3dpbmdPbiA9IHBDb2V4RG0tPmJDdXJEYWNTd2luZ09uOwoJcENvZXhEbS0+cHJlRGFjU3dpbmdMdmwgPSBwQ29leERtLT5jdXJEYWNTd2luZ0x2bDsKfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfU2V0QWRjQmFja09mZigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliQWRjQmFja09mZgoJKQp7CglpZihiQWRjQmFja09mZikKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgQkIgQmFja09mZiBMZXZlbCBPbiFcbiIpKTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHhjMDQsMHgzYTA3NjExKTsKCX0KCWVsc2UKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgQkIgQmFja09mZiBMZXZlbCBPZmYhXG4iKSk7CQkKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHhjMDQsMHgzYTA1NjExKTsKCX0KfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJBZGNCYWNrT2ZmCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgdHVybiBBZGNCYWNrT2ZmID0gJXNcbiIsICAKCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYkFkY0JhY2tPZmYpPyAiT04iOiJPRkYiKSkpOwoJcENvZXhEbS0+YkN1ckFkY0JhY2tPZmYgPSBiQWRjQmFja09mZjsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlQWRjQmFja09mZj0lZCwgYkN1ckFkY0JhY2tPZmY9JWRcbiIsIAoJCQlwQ29leERtLT5iUHJlQWRjQmFja09mZiwgcENvZXhEbS0+YkN1ckFkY0JhY2tPZmYpKTsKCgkJaWYocENvZXhEbS0+YlByZUFkY0JhY2tPZmYgPT0gcENvZXhEbS0+YkN1ckFkY0JhY2tPZmYpIAoJCQlyZXR1cm47Cgl9CgloYWxidGM4NzIzYTJhbnRfU2V0QWRjQmFja09mZihwQnRDb2V4aXN0LCBwQ29leERtLT5iQ3VyQWRjQmFja09mZik7CgoJcENvZXhEbS0+YlByZUFkY0JhY2tPZmYgPSBwQ29leERtLT5iQ3VyQWRjQmFja09mZjsKfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfU2V0QWdjVGFibGUoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJYkFnY1RhYmxlRW4KCSkKewoJdTFCeXRlCQlyc3NpQWRqdXN0VmFsPTA7CgoJaWYoYkFnY1RhYmxlRW4pCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIEFnYyBUYWJsZSBPbiFcbiIpKTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHhjNzgsMHg0ZTFjMDAwMSk7CgkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4Yzc4LDB4NGQxZDAwMDEpOwoJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweGM3OCwweDRjMWUwMDAxKTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHhjNzgsMHg0YjFmMDAwMSk7CgkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4Yzc4LDB4NGEyMDAwMDEpOwoJCQoJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDEyLCAweGZmZmZmLCAweGRjMDAwKTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxMiwgMHhmZmZmZiwgMHg5MDAwMCk7CgkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4MTIsIDB4ZmZmZmYsIDB4NTEwMDApOwoJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDEyLCAweGZmZmZmLCAweDEyMDAwKTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxYSwgMHhmZmZmZiwgMHgwMDM1NSk7CgkJCgkJcnNzaUFkanVzdFZhbCA9IDY7Cgl9CgllbHNlCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIEFnYyBUYWJsZSBPZmYhXG4iKSk7CgkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4Yzc4LDB4NjQxYzAwMDEpOwoJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweGM3OCwweDYzMWQwMDAxKTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHhjNzgsMHg2MjFlMDAwMSk7CgkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4Yzc4LDB4NjExZjAwMDEpOwoJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweGM3OCwweDYwMjAwMDAxKTsKCgkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4MTIsIDB4ZmZmZmYsIDB4MzIwMDApOwoJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDEyLCAweGZmZmZmLCAweDcxMDAwKTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxMiwgMHhmZmZmZiwgMHhiMDAwMCk7CgkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4MTIsIDB4ZmZmZmYsIDB4ZmMwMDApOwoJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDFhLCAweGZmZmZmLCAweDMwMzU1KTsKCX0KCgkvLyBzZXQgcnNzaUFkanVzdFZhbCBmb3Igd2lmaSBtb2R1bGUuCglwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfVTFfUlNTSV9BREpfVkFMX0ZPUl9BR0NfVEFCTEVfT04sICZyc3NpQWRqdXN0VmFsKTsKfQoKClZPSUQKaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTglCT09MRUFOCQkJYkFnY1RhYmxlRW4KCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyAlcyBBZ2MgVGFibGVcbiIsICAKCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYkFnY1RhYmxlRW4pPyAiRW5hYmxlIjoiRGlzYWJsZSIpKSk7CglwQ29leERtLT5iQ3VyQWdjVGFibGVFbiA9IGJBZ2NUYWJsZUVuOwoKCWlmKCFiRm9yY2VFeGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVBZ2NUYWJsZUVuPSVkLCBiQ3VyQWdjVGFibGVFbj0lZFxuIiwgCgkJCXBDb2V4RG0tPmJQcmVBZ2NUYWJsZUVuLCBwQ29leERtLT5iQ3VyQWdjVGFibGVFbikpOwoKCQlpZihwQ29leERtLT5iUHJlQWdjVGFibGVFbiA9PSBwQ29leERtLT5iQ3VyQWdjVGFibGVFbikgCgkJCXJldHVybjsKCX0KCWhhbGJ0Yzg3MjNhMmFudF9TZXRBZ2NUYWJsZShwQnRDb2V4aXN0LCBiQWdjVGFibGVFbik7CgoJcENvZXhEbS0+YlByZUFnY1RhYmxlRW4gPSBwQ29leERtLT5iQ3VyQWdjVGFibGVFbjsKfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfU2V0Q29leFRhYmxlKAoJSU4JUEJUQ19DT0VYSVNUCXBCdENvZXhpc3QsCglJTgl1NEJ5dGUJCXZhbDB4NmMwLAoJSU4JdTRCeXRlCQl2YWwweDZjOCwKCUlOCXUxQnl0ZQkJdmFsMHg2Y2MKCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIHNldCBjb2V4IHRhYmxlLCBzZXQgMHg2YzA9MHgleFxuIiwgdmFsMHg2YzApKTsKCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweDZjMCwgdmFsMHg2YzApOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmM4PTB4JXhcbiIsIHZhbDB4NmM4KSk7CglwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg2YzgsIHZhbDB4NmM4KTsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgc2V0IGNvZXggdGFibGUsIHNldCAweDZjYz0weCV4XG4iLCB2YWwweDZjYykpOwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NmNjLCB2YWwweDZjYyk7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X0NvZXhUYWJsZSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JdTRCeXRlCQkJdmFsMHg2YzAsCglJTgl1NEJ5dGUJCQl2YWwweDZjOCwKCUlOCXUxQnl0ZQkJCXZhbDB4NmNjCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgd3JpdGUgQ29leCBUYWJsZSAweDZjMD0weCV4LCAweDZjOD0weCV4LCAweDZjYz0weCV4XG4iLCAKCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksIHZhbDB4NmMwLCB2YWwweDZjOCwgdmFsMHg2Y2MpKTsKCXBDb2V4RG0tPmN1clZhbDB4NmMwID0gdmFsMHg2YzA7CglwQ29leERtLT5jdXJWYWwweDZjOCA9IHZhbDB4NmM4OwoJcENvZXhEbS0+Y3VyVmFsMHg2Y2MgPSB2YWwweDZjYzsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBwcmVWYWwweDZjMD0weCV4LCBwcmVWYWwweDZjOD0weCV4LCBwcmVWYWwweDZjYz0weCV4ICEhXG4iLCAKCQkJcENvZXhEbS0+cHJlVmFsMHg2YzAsIHBDb2V4RG0tPnByZVZhbDB4NmM4LCBwQ29leERtLT5wcmVWYWwweDZjYykpOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIGN1clZhbDB4NmMwPTB4JXgsIGN1clZhbDB4NmM4PTB4JXgsIGN1clZhbDB4NmNjPTB4JXggISFcbiIsIAoJCQlwQ29leERtLT5jdXJWYWwweDZjMCwgcENvZXhEbS0+Y3VyVmFsMHg2YzgsIHBDb2V4RG0tPmN1clZhbDB4NmNjKSk7CgkKCQlpZiggKHBDb2V4RG0tPnByZVZhbDB4NmMwID09IHBDb2V4RG0tPmN1clZhbDB4NmMwKSAmJgoJCQkocENvZXhEbS0+cHJlVmFsMHg2YzggPT0gcENvZXhEbS0+Y3VyVmFsMHg2YzgpICYmCgkJCShwQ29leERtLT5wcmVWYWwweDZjYyA9PSBwQ29leERtLT5jdXJWYWwweDZjYykgKQoJCQlyZXR1cm47Cgl9CgloYWxidGM4NzIzYTJhbnRfU2V0Q29leFRhYmxlKHBCdENvZXhpc3QsIHZhbDB4NmMwLCB2YWwweDZjOCwgdmFsMHg2Y2MpOwoKCXBDb2V4RG0tPnByZVZhbDB4NmMwID0gcENvZXhEbS0+Y3VyVmFsMHg2YzA7CglwQ29leERtLT5wcmVWYWwweDZjOCA9IHBDb2V4RG0tPmN1clZhbDB4NmM4OwoJcENvZXhEbS0+cHJlVmFsMHg2Y2MgPSBwQ29leERtLT5jdXJWYWwweDZjYzsKfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfU2V0RndJZ25vcmVXbGFuQWN0KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJFbmFibGUKCSkKewoJdTFCeXRlCQkJSDJDX1BhcmFtZXRlclsxXSA9ezB9OwoJCQoJaWYoYkVuYWJsZSkKCXsKCQlIMkNfUGFyYW1ldGVyWzBdIHw9IEJJVDA7CQkvLyBmdW5jdGlvbiBlbmFibGUKCX0KCQoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIHNldCBGVyBmb3IgQlQgSWdub3JlIFdsYW5fQWN0LCBGVyB3cml0ZSAweDI1PTB4JXhcbiIsIAoJCUgyQ19QYXJhbWV0ZXJbMF0pKTsKCglwQnRDb2V4aXN0LT5idGNfZmlsbF9oMmMocEJ0Q29leGlzdCwgMHgyNSwgMSwgSDJDX1BhcmFtZXRlcik7CQp9CgpWT0lECmhhbGJ0Yzg3MjNhMmFudF9JZ25vcmVXbGFuQWN0KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTglCT09MRUFOCQkJYkVuYWJsZQoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIHR1cm4gSWdub3JlIFdsYW5BY3QgJXNcbiIsIAoJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgKGJFbmFibGU/ICJPTiI6Ik9GRiIpKSk7CglwQ29leERtLT5iQ3VySWdub3JlV2xhbkFjdCA9IGJFbmFibGU7CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZUlnbm9yZVdsYW5BY3QgPSAlZCwgYkN1cklnbm9yZVdsYW5BY3QgPSAlZCEhXG4iLCAKCQkJcENvZXhEbS0+YlByZUlnbm9yZVdsYW5BY3QsIHBDb2V4RG0tPmJDdXJJZ25vcmVXbGFuQWN0KSk7CgoJCWlmKHBDb2V4RG0tPmJQcmVJZ25vcmVXbGFuQWN0ID09IHBDb2V4RG0tPmJDdXJJZ25vcmVXbGFuQWN0KQoJCQlyZXR1cm47Cgl9CgloYWxidGM4NzIzYTJhbnRfU2V0RndJZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIGJFbmFibGUpOwoKCXBDb2V4RG0tPmJQcmVJZ25vcmVXbGFuQWN0ID0gcENvZXhEbS0+YkN1cklnbm9yZVdsYW5BY3Q7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJYnl0ZTEsCglJTgl1MUJ5dGUJCQlieXRlMiwKCUlOCXUxQnl0ZQkJCWJ5dGUzLAoJSU4JdTFCeXRlCQkJYnl0ZTQsCglJTgl1MUJ5dGUJCQlieXRlNQoJKQp7Cgl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzVdID17MH07CgoJSDJDX1BhcmFtZXRlclswXSA9IGJ5dGUxOwkKCUgyQ19QYXJhbWV0ZXJbMV0gPSBieXRlMjsJCglIMkNfUGFyYW1ldGVyWzJdID0gYnl0ZTM7CglIMkNfUGFyYW1ldGVyWzNdID0gYnl0ZTQ7CglIMkNfUGFyYW1ldGVyWzRdID0gYnl0ZTU7CgoJcENvZXhEbS0+cHNUZG1hUGFyYVswXSA9IGJ5dGUxOwoJcENvZXhEbS0+cHNUZG1hUGFyYVsxXSA9IGJ5dGUyOwoJcENvZXhEbS0+cHNUZG1hUGFyYVsyXSA9IGJ5dGUzOwoJcENvZXhEbS0+cHNUZG1hUGFyYVszXSA9IGJ5dGU0OwoJcENvZXhEbS0+cHNUZG1hUGFyYVs0XSA9IGJ5dGU1OwoJCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgRlcgd3JpdGUgMHgzYSg1Ynl0ZXMpPTB4JXglMDh4XG4iLCAKCQlIMkNfUGFyYW1ldGVyWzBdLCAKCQlIMkNfUGFyYW1ldGVyWzFdPDwyNHxIMkNfUGFyYW1ldGVyWzJdPDwxNnxIMkNfUGFyYW1ldGVyWzNdPDw4fEgyQ19QYXJhbWV0ZXJbNF0pKTsKCglwQnRDb2V4aXN0LT5idGNfZmlsbF9oMmMocEJ0Q29leGlzdCwgMHgzYSwgNSwgSDJDX1BhcmFtZXRlcik7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X1BzVGRtYSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJUdXJuT24sCglJTgl1MUJ5dGUJCQl0eXBlCgkpCnsKCXU0Qnl0ZQlidFR4UnhDbnQ9MDsKCglidFR4UnhDbnQgPSBwQ29leFN0YS0+aGlnaFByaW9yaXR5VHgrcENvZXhTdGEtPmhpZ2hQcmlvcml0eVJ4KwoJCQkJcENvZXhTdGEtPmxvd1ByaW9yaXR5VHgrcENvZXhTdGEtPmxvd1ByaW9yaXR5Ung7CgoJaWYoYnRUeFJ4Q250ID4gMzAwMCkKCXsJCQoJCXBDb2V4RG0tPmJDdXJQc1RkbWFPbiA9IHRydWU7CgkJcENvZXhEbS0+Y3VyUHNUZG1hID0gODsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sIHR1cm4gT04gUFMgVERNQSwgdHlwZT0lZCBmb3IgQlQgdHgvcnggY291bnRlcnM9JWQoPjMwMDApXG4iLCAKCQkJcENvZXhEbS0+Y3VyUHNUZG1hLCBidFR4UnhDbnQpKTsKCX0KCWVsc2UKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIHR1cm4gJXMgUFMgVERNQSwgdHlwZT0lZFxuIiwgCgkJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgKGJUdXJuT24/ICJPTiI6Ik9GRiIpLCB0eXBlKSk7CQkKCQlwQ29leERtLT5iQ3VyUHNUZG1hT24gPSBiVHVybk9uOwoJCXBDb2V4RG0tPmN1clBzVGRtYSA9IHR5cGU7Cgl9CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZVBzVGRtYU9uID0gJWQsIGJDdXJQc1RkbWFPbiA9ICVkISFcbiIsIAoJCQlwQ29leERtLT5iUHJlUHNUZG1hT24sIHBDb2V4RG0tPmJDdXJQc1RkbWFPbikpOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIHByZVBzVGRtYSA9ICVkLCBjdXJQc1RkbWEgPSAlZCEhXG4iLCAKCQkJcENvZXhEbS0+cHJlUHNUZG1hLCBwQ29leERtLT5jdXJQc1RkbWEpKTsKCgkJaWYoIChwQ29leERtLT5iUHJlUHNUZG1hT24gPT0gcENvZXhEbS0+YkN1clBzVGRtYU9uKSAmJgoJCQkocENvZXhEbS0+cHJlUHNUZG1hID09IHBDb2V4RG0tPmN1clBzVGRtYSkgKQoJCQlyZXR1cm47Cgl9CQoJaWYocENvZXhEbS0+YkN1clBzVGRtYU9uKQoJewoJCXN3aXRjaChwQ29leERtLT5jdXJQc1RkbWEpCgkJewoJCQljYXNlIDE6CgkJCWRlZmF1bHQ6CgkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHgxYSwgMHgxYSwgMHhlMSwgMHg5OCk7CgkJCQlicmVhazsKCQkJY2FzZSAyOgoJCQkJaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZTMsIDB4MTIsIDB4MTIsIDB4ZTEsIDB4OTgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgMzoKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweGEsIDB4YSwgMHhlMSwgMHg5OCk7CgkJCQlicmVhazsKCQkJY2FzZSA0OgoJCQkJaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4YTMsIDB4NSwgMHg1LCAweGUxLCAweDgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDU6CgkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHgxYSwgMHgxYSwgMHg2MCwgMHg5OCk7CgkJCQlicmVhazsKCQkJY2FzZSA2OgoJCQkJaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZTMsIDB4MTIsIDB4MTIsIDB4NjAsIDB4OTgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgNzoKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweGEsIDB4YSwgMHg2MCwgMHg5OCk7CgkJCQlicmVhazsKCQkJY2FzZSA4OiAKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGEzLCAweDUsIDB4NSwgMHg2MCwgMHg4MCk7CgkJCQlicmVhazsKCQkJY2FzZSA5OiAKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDFhLCAweDFhLCAweGUxLCAweDk4KTsKCQkJCWJyZWFrOwoJCQljYXNlIDEwOgkKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDEyLCAweDEyLCAweGUxLCAweDk4KTsKCQkJCWJyZWFrOwoJCQljYXNlIDExOgkKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweGEsIDB4YSwgMHhlMSwgMHg5OCk7CgkJCQlicmVhazsKCQkJY2FzZSAxMjoKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDUsIDB4NSwgMHhlMSwgMHg5OCk7CgkJCQlicmVhazsKCQkJY2FzZSAxMzoKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDFhLCAweDFhLCAweDYwLCAweDk4KTsKCQkJCWJyZWFrOwoJCQljYXNlIDE0OgoJCQkJaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZTMsIDB4MTIsIDB4MTIsIDB4NjAsIDB4OTgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgMTU6CgkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHhhLCAweGEsIDB4NjAsIDB4OTgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgMTY6CgkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHg1LCAweDUsIDB4NjAsIDB4OTgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgMTc6CgkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhhMywgMHgyZiwgMHgyZiwgMHg2MCwgMHg4MCk7CgkJCQlicmVhazsKCQkJY2FzZSAxODoKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDUsIDB4NSwgMHhlMSwgMHg5OCk7CgkJCQlicmVhazsJCQkKCQkJY2FzZSAxOToKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDI1LCAweDI1LCAweGUxLCAweDk4KTsKCQkJCWJyZWFrOwoJCQljYXNlIDIwOgoJCQkJaGFsYnRjODcyM2EyYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZTMsIDB4MjUsIDB4MjUsIDB4NjAsIDB4OTgpOwoJCQkJYnJlYWs7CgkJfQoJfQoJZWxzZQoJewoJCS8vIGRpc2FibGUgUFMgdGRtYQoJCXN3aXRjaChwQ29leERtLT5jdXJQc1RkbWEpCgkJewoJCQljYXNlIDA6CgkJCQloYWxidGM4NzIzYTJhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHgwLCAweDAsIDB4MCwgMHg4LCAweDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMToKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCk7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWhhbGJ0Yzg3MjNhMmFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDAsIDB4MCwgMHgwLCAweDgsIDB4MCk7CgkJCQlicmVhazsKCQl9Cgl9CgoJLy8gdXBkYXRlIHByZSBzdGF0ZQoJcENvZXhEbS0+YlByZVBzVGRtYU9uID0gcENvZXhEbS0+YkN1clBzVGRtYU9uOwoJcENvZXhEbS0+cHJlUHNUZG1hID0gcENvZXhEbS0+Y3VyUHNUZG1hOwp9CgoKVk9JRApoYWxidGM4NzIzYTJhbnRfQ29leEFsbE9mZigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CgkvLyBmdyBhbGwgb2ZmCgloYWxidGM4NzIzYTJhbnRfSWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoJaGFsYnRjODcyM2EyYW50X0Z3RGFjU3dpbmdMdmwocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4MjApOwoJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgoJLy8gc3cgYWxsIG9mZgoJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJaGFsYnRjODcyM2EyYW50X0xvd1BlbmFsdHlSYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJaGFsYnRjODcyM2EyYW50X1JmU2hyaW5rKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCgkvLyBodyBhbGwgb2ZmCgloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X0luaXRDb2V4RG0oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJLy8gZm9yY2UgdG8gcmVzZXQgY29leCBtZWNoYW5pc20KCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwoJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSwgMCk7CgloYWxidGM4NzIzYTJhbnRfRndEYWNTd2luZ0x2bChwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCAweDIwKTsKCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSk7CgloYWxidGM4NzIzYTJhbnRfSWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSk7CgoJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFKTsKCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFKTsKCWhhbGJ0Yzg3MjNhMmFudF9Mb3dQZW5hbHR5UmEocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgRkFMU0UpOwoJaGFsYnRjODcyM2EyYW50X1JmU2hyaW5rKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFKTsKCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSwgMHhjMCk7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X0J0SW5xdWlyeVBhZ2UoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJQk9PTEVBTgliTG93UHdyRGlzYWJsZT10cnVlOwoJCglwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQUNUX0RJU0FCTEVfTE9XX1BPV0VSLCAmYkxvd1B3ckRpc2FibGUpOwoKCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCWhhbGJ0Yzg3MjNhMmFudF9JZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA4KTsKfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfQnRFbmFibGVBY3Rpb24oCglJTiAJUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCUJPT0xFQU4JCWJXaWZpQ29ubmVjdGVkPUZBTFNFOwoJCgkvLyBIZXJlIHdlIG5lZWQgdG8gcmVzZW5kIHNvbWUgd2lmaSBpbmZvIHRvIEJUCgkvLyBiZWNhdXNlIGJ0IGlzIHJlc2V0IGFuZCBsb3NzIG9mIHRoZSBpbmZvLgkJCQkJCQoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmYldpZmlDb25uZWN0ZWQpOwoJaWYoYldpZmlDb25uZWN0ZWQpCgl7CgkJaGFsYnRjODcyM2EyYW50X0luZGljYXRlV2lmaUNobmxCd0luZm8ocEJ0Q29leGlzdCwgQlRDX01FRElBX0NPTk5FQ1QpOwoJfQoJZWxzZQoJewoJCWhhbGJ0Yzg3MjNhMmFudF9JbmRpY2F0ZVdpZmlDaG5sQndJbmZvKHBCdENvZXhpc3QsIEJUQ19NRURJQV9ESVNDT05ORUNUKTsKCX0KCgloYWxidGM4NzIzYTJhbnRfSWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSk7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X01vbml0b3JCdEN0cigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1NEJ5dGUgCQkJcmVnSFBUeFJ4LCByZWdMUFR4UngsIHU0VG1wOwoJdTRCeXRlCQkJcmVnSFBUeD0wLCByZWdIUFJ4PTAsIHJlZ0xQVHg9MCwgcmVnTFBSeD0wOwoJdTFCeXRlCQkJdTFUbXA7CgkKCXJlZ0hQVHhSeCA9IDB4NzcwOwoJcmVnTFBUeFJ4ID0gMHg3NzQ7CgoJdTRUbXAgPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCByZWdIUFR4UngpOwoJcmVnSFBUeCA9IHU0VG1wICYgTUFTS0xXT1JEOwoJcmVnSFBSeCA9ICh1NFRtcCAmIE1BU0tIV09SRCk+PjE2OwoKCXU0VG1wID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgcmVnTFBUeFJ4KTsKCXJlZ0xQVHggPSB1NFRtcCAmIE1BU0tMV09SRDsKCXJlZ0xQUnggPSAodTRUbXAgJiBNQVNLSFdPUkQpPj4xNjsKCQkKCXBDb2V4U3RhLT5oaWdoUHJpb3JpdHlUeCA9IHJlZ0hQVHg7CglwQ29leFN0YS0+aGlnaFByaW9yaXR5UnggPSByZWdIUFJ4OwoJcENvZXhTdGEtPmxvd1ByaW9yaXR5VHggPSByZWdMUFR4OwoJcENvZXhTdGEtPmxvd1ByaW9yaXR5UnggPSByZWdMUFJ4OwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLCAoIltCVENvZXhdLCBIaWdoIFByaW9yaXR5IFR4L1J4IChyZWcgMHgleCk9MHgleCglZCkvMHgleCglZClcbiIsIAoJCXJlZ0hQVHhSeCwgcmVnSFBUeCwgcmVnSFBUeCwgcmVnSFBSeCwgcmVnSFBSeCkpOwoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIExvdyBQcmlvcml0eSBUeC9SeCAocmVnIDB4JXgpPTB4JXgoJWQpLzB4JXgoJWQpXG4iLCAKCQlyZWdMUFR4UngsIHJlZ0xQVHgsIHJlZ0xQVHgsIHJlZ0xQUngsIHJlZ0xQUngpKTsKCgkvLyByZXNldCBjb3VudGVyCglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg3NmUsIDB4Yyk7Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X01vbml0b3JCdEVuYWJsZURpc2FibGUoCglJTiAJUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXN0YXRpYyBCT09MRUFOCWJQcmVCdERpc2FibGVkPUZBTFNFOwoJc3RhdGljIHU0Qnl0ZQlidERpc2FibGVDbnQ9MDsKCUJPT0xFQU4JCQliQnRBY3RpdmU9dHJ1ZSwgYkJ0RGlzYWJsZWQ9RkFMU0U7CgoJLy8gVGhpcyBmdW5jdGlvbiBjaGVjayBpZiBidCBpcyBkaXNhYmxlZAoKCWlmKAlwQ29leFN0YS0+aGlnaFByaW9yaXR5VHggPT0gMCAmJgoJCXBDb2V4U3RhLT5oaWdoUHJpb3JpdHlSeCA9PSAwICYmCgkJcENvZXhTdGEtPmxvd1ByaW9yaXR5VHggPT0gMCAmJgoJCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4ID09IDApCgl7CgkJYkJ0QWN0aXZlID0gRkFMU0U7Cgl9CglpZigJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVR4ID09IDB4ZmZmZiAmJgoJCXBDb2V4U3RhLT5oaWdoUHJpb3JpdHlSeCA9PSAweGZmZmYgJiYKCQlwQ29leFN0YS0+bG93UHJpb3JpdHlUeCA9PSAweGZmZmYgJiYKCQlwQ29leFN0YS0+bG93UHJpb3JpdHlSeCA9PSAweGZmZmYpCgl7CgkJYkJ0QWN0aXZlID0gRkFMU0U7Cgl9CglpZihiQnRBY3RpdmUpCgl7CgkJYnREaXNhYmxlQ250ID0gMDsKCQliQnREaXNhYmxlZCA9IEZBTFNFOwoJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9CVF9ESVNBQkxFLCAmYkJ0RGlzYWJsZWQpOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLCAoIltCVENvZXhdLCBCVCBpcyBlbmFibGVkICEhXG4iKSk7Cgl9CgllbHNlCgl7CgkJYnREaXNhYmxlQ250Kys7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIGJ0IGFsbCBjb3VudGVycz0wLCAlZCB0aW1lcyEhXG4iLCAKCQkJCWJ0RGlzYWJsZUNudCkpOwoJCWlmKGJ0RGlzYWJsZUNudCA+PSAyKQoJCXsKCQkJYkJ0RGlzYWJsZWQgPSB0cnVlOwoJCQlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQkxfQlRfRElTQUJMRSwgJmJCdERpc2FibGVkKTsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEJUIGlzIGRpc2FibGVkICEhXG4iKSk7CgkJfQoJfQoJaWYoYlByZUJ0RGlzYWJsZWQgIT0gYkJ0RGlzYWJsZWQpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEJUIGlzIGZyb20gJXMgdG8gJXMhIVxuIiwgCgkJCShiUHJlQnREaXNhYmxlZCA/ICJkaXNhYmxlZCI6ImVuYWJsZWQiKSwgCgkJCShiQnREaXNhYmxlZCA/ICJkaXNhYmxlZCI6ImVuYWJsZWQiKSkpOwoJCWJQcmVCdERpc2FibGVkID0gYkJ0RGlzYWJsZWQ7CgkJaWYoIWJCdERpc2FibGVkKQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X0J0RW5hYmxlQWN0aW9uKHBCdENvZXhpc3QpOwoJCX0KCX0KfQoKQk9PTEVBTgpoYWxidGM4NzIzYTJhbnRfSXNDb21tb25BY3Rpb24oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJUEJUQ19TVEFDS19JTkZPCQlwU3RhY2tJbmZvPSZwQnRDb2V4aXN0LT5zdGFja19pbmZvOwoJQk9PTEVBTgkJCWJDb21tb249RkFMU0UsIGJXaWZpQ29ubmVjdGVkPUZBTFNFOwoJQk9PTEVBTgkJCWJMb3dQd3JEaXNhYmxlPUZBTFNFOwoKCWlmKCFwU3RhY2tJbmZvLT5iQnRMaW5rRXhpc3QpCgl7CgkJYkxvd1B3ckRpc2FibGUgPSBGQUxTRTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQUNUX0RJU0FCTEVfTE9XX1BPV0VSLCAmYkxvd1B3ckRpc2FibGUpOwoJfQoJZWxzZQoJewoJCWJMb3dQd3JEaXNhYmxlID0gdHJ1ZTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQUNUX0RJU0FCTEVfTE9XX1BPV0VSLCAmYkxvd1B3ckRpc2FibGUpOwoJfQoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJmJXaWZpQ29ubmVjdGVkKTsKCglpZihoYWxidGM4NzIzYTJhbnRfSXNXaWZpSWRsZShwQnRDb2V4aXN0KSAmJiAKCQlCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBpZGxlICsgQnQgaWRsZSEhXG4iKSk7CgkJCQoJCWhhbGJ0Yzg3MjNhMmFudF9Mb3dQZW5hbHR5UmEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfUmZTaHJpbmsocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgoJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsKCQloYWxidGM4NzIzYTJhbnRfRndEYWNTd2luZ0x2bChwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMHgyMCk7CgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgoJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgoJCWJDb21tb24gPSB0cnVlOwoJfQoJZWxzZSBpZighaGFsYnRjODcyM2EyYW50X0lzV2lmaUlkbGUocEJ0Q29leGlzdCkgJiYgCgkJCShCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKSApCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBXaWZpIG5vbi1pZGxlICsgQlQgaWRsZSEhXG4iKSk7CgoJCWhhbGJ0Yzg3MjNhMmFudF9Mb3dQZW5hbHR5UmEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCWhhbGJ0Yzg3MjNhMmFudF9SZlNocmluayhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCgkJaGFsYnRjODcyM2EyYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CgkJaGFsYnRjODcyM2EyYW50X0Z3RGFjU3dpbmdMdmwocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4MjApOwoJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgoJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgoJCWJDb21tb24gPSB0cnVlOwoJfQoJZWxzZSBpZihoYWxidGM4NzIzYTJhbnRfSXNXaWZpSWRsZShwQnRDb2V4aXN0KSAmJiAKCQkoQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpICkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFdpZmkgaWRsZSArIEJ0IGNvbm5lY3RlZCBpZGxlISFcbiIpKTsKCQkKCQloYWxidGM4NzIzYTJhbnRfTG93UGVuYWx0eVJhKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQloYWxidGM4NzIzYTJhbnRfUmZTaHJpbmsocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCgkJaGFsYnRjODcyM2EyYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CgkJaGFsYnRjODcyM2EyYW50X0Z3RGFjU3dpbmdMdmwocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4MjApOwoJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoKCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoKCQliQ29tbW9uID0gdHJ1ZTsKCX0KCWVsc2UgaWYoIWhhbGJ0Yzg3MjNhMmFudF9Jc1dpZmlJZGxlKHBCdENvZXhpc3QpICYmIAoJCShCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cykgKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBub24taWRsZSArIEJ0IGNvbm5lY3RlZCBpZGxlISFcbiIpKTsKCgkJaGFsYnRjODcyM2EyYW50X0xvd1BlbmFsdHlSYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJaGFsYnRjODcyM2EyYW50X1JmU2hyaW5rKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgoJCWhhbGJ0Yzg3MjNhMmFudF9JZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoJCWhhbGJ0Yzg3MjNhMmFudF9Gd0RhY1N3aW5nTHZsKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDIwKTsKCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCgkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCgkJYkNvbW1vbiA9IHRydWU7Cgl9CgllbHNlIGlmKGhhbGJ0Yzg3MjNhMmFudF9Jc1dpZmlJZGxlKHBCdENvZXhpc3QpICYmIAoJCQkoQlRfODcyM0FfMkFOVF9CVF9TVEFUVVNfTk9OX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpICkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFdpZmkgaWRsZSArIEJUIG5vbi1pZGxlISFcbiIpKTsKCQkKCQloYWxidGM4NzIzYTJhbnRfTG93UGVuYWx0eVJhKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQloYWxidGM4NzIzYTJhbnRfUmZTaHJpbmsocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCgkJaGFsYnRjODcyM2EyYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CgkJaGFsYnRjODcyM2EyYW50X0Z3RGFjU3dpbmdMdmwocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4MjApOwoJCWhhbGJ0Yzg3MjNhMmFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoKCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJCQoJCWJDb21tb24gPSB0cnVlOwoJfQoJZWxzZQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBub24taWRsZSArIEJUIG5vbi1pZGxlISFcbiIpKTsKCQloYWxidGM4NzIzYTJhbnRfTG93UGVuYWx0eVJhKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQloYWxidGM4NzIzYTJhbnRfUmZTaHJpbmsocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCWhhbGJ0Yzg3MjNhMmFudF9JZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJaGFsYnRjODcyM2EyYW50X0Z3RGFjU3dpbmdMdmwocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4MjApOwoJCQoJCWJDb21tb24gPSBGQUxTRTsKCX0KCQoJcmV0dXJuIGJDb21tb247Cn0KVk9JRApoYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJTY29IaWQsCglJTglCT09MRUFOCQkJYlR4UGF1c2UsCglJTgl1MUJ5dGUJCQltYXhJbnRlcnZhbAoJKQp7CglzdGF0aWMgczRCeXRlCQl1cCxkbixtLG4sV2FpdENvdW50OwoJczRCeXRlCQkJcmVzdWx0OyAgIC8vMDogbm8gY2hhbmdlLCArMTogaW5jcmVhc2UgV2lGaSBkdXJhdGlvbiwgLTE6IGRlY3JlYXNlIFdpRmkgZHVyYXRpb24KCXUxQnl0ZQkJCXJldHJ5Q291bnQ9MDsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sIFRkbWFEdXJhdGlvbkFkanVzdCgpXG4iKSk7CgoJaWYocENvZXhEbS0+YlJlc2V0VGRtYUFkanVzdCkKCXsKCQlwQ29leERtLT5iUmVzZXRUZG1hQWRqdXN0ID0gRkFMU0U7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgZmlyc3QgcnVuIFRkbWFEdXJhdGlvbkFkanVzdCgpISFcbiIpKTsKCQl7CgkJCWlmKGJTY29IaWQpCgkJCXsKCQkJCWlmKGJUeFBhdXNlKQoJCQkJewoJCQkJCWlmKG1heEludGVydmFsID09IDEpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEzOwkKCQkJCQl9CgkJCQkJZWxzZSBpZihtYXhJbnRlcnZhbCA9PSAyKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsJCgkJCQkJfQoJCQkJCWVsc2UgaWYobWF4SW50ZXJ2YWwgPT0gMykKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE1KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CQoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwoJCQkJCX0KCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlpZihtYXhJbnRlcnZhbCA9PSAxKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDk7CQoJCQkJCX0KCQkJCQllbHNlIGlmKG1heEludGVydmFsID09IDIpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMCk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEwOwkKCQkJCQl9CgkJCQkJZWxzZSBpZihtYXhJbnRlcnZhbCA9PSAzKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlpZihiVHhQYXVzZSkKCQkJCXsKCQkJCQlpZihtYXhJbnRlcnZhbCA9PSAxKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDU7CQoJCQkJCX0KCQkJCQllbHNlIGlmKG1heEludGVydmFsID09IDIpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA2KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNjsJCgkJCQkJfQoJCQkJCWVsc2UgaWYobWF4SW50ZXJ2YWwgPT0gMykKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA3OwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA3KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNzsKCQkJCQl9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJaWYobWF4SW50ZXJ2YWwgPT0gMSkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxOwkKCQkJCQl9CgkJCQkJZWxzZSBpZihtYXhJbnRlcnZhbCA9PSAyKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI7CQoJCQkJCX0KCQkJCQllbHNlIGlmKG1heEludGVydmFsID09IDMpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDM7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCS8vPT09PT09PT09PT09CgkJdXAgPSAwOwoJCWRuID0gMDsKCQltID0gMTsKCQluPSAzOwoJCXJlc3VsdCA9IDA7CgkJV2FpdENvdW50ID0gMDsKCX0KCWVsc2UKCXsKCQkvL2FjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIKCQlyZXRyeUNvdW50ID0gcENvZXhTdGEtPmJ0UmV0cnlDbnQ7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcmV0cnlDb3VudCA9ICVkXG4iLCByZXRyeUNvdW50KSk7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgdXA9JWQsIGRuPSVkLCBtPSVkLCBuPSVkLCBXYWl0Q291bnQ9JWRcbiIsIAoJCQl1cCwgZG4sIG0sIG4sIFdhaXRDb3VudCkpOwoJCXJlc3VsdCA9IDA7CgkJV2FpdENvdW50Kys7IAoJCSAgCgkJaWYocmV0cnlDb3VudCA9PSAwKSAgLy8gbm8gcmV0cnkgaW4gdGhlIGxhc3QgMi1zZWNvbmQgZHVyYXRpb24KCQl7CgkJCXVwKys7CgkJCWRuLS07CgoJCQlpZiAoZG4gPD0gMCkKCQkJCWRuID0gMDsJCQkJIAoKCQkJaWYodXAgPj0gbikJLy8gaWYgs3PE8iBuIK3TMqztIHJldHJ5IGNvdW50rLAwLCCraL3VvGVXaUZpIGR1cmF0aW9uCgkJCXsKCQkJCVdhaXRDb3VudCA9IDA7IAoJCQkJbiA9IDM7CgkJCQl1cCA9IDA7CgkJCQlkbiA9IDA7CgkJCQlyZXN1bHQgPSAxOyAKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIEluY3JlYXNlIHdpZmkgZHVyYXRpb24hIVxuIikpOwoJCQl9CgkJfQoJCWVsc2UgaWYgKHJldHJ5Q291bnQgPD0gMykJLy8gPD0zIHJldHJ5IGluIHRoZSBsYXN0IDItc2Vjb25kIGR1cmF0aW9uCgkJewoJCQl1cC0tOyAKCQkJZG4rKzsKCgkJCWlmICh1cCA8PSAwKQoJCQkJdXAgPSAwOwoKCQkJaWYgKGRuID09IDIpCS8vIGlmILNzxPIgMiCt0zKs7SByZXRyeSBjb3VudDwgMywgq2i91a+2V2lGaSBkdXJhdGlvbgoJCQl7CgkJCQlpZiAoV2FpdENvdW50IDw9IDIpCgkJCQkJbSsrOyAvLyDB16dLpECqvaZiqOKt02xldmVspKSo06ZeCgkJCQllbHNlCgkJCQkJbSA9IDE7CgoJCQkJaWYgKCBtID49IDIwKSAvL20gs8ykaq3IID0gMjAgJyCzzKRqMTIwrO0gcmVjaGVja6xPp1+91b7jIFdpRmkgZHVyYXRpb24uCgkJCQkJbSA9IDIwOwoKCQkJCW4gPSAzKm07CgkJCQl1cCA9IDA7CgkJCQlkbiA9IDA7CgkJCQlXYWl0Q291bnQgPSAwOwoJCQkJcmVzdWx0ID0gLTE7IAoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgRGVjcmVhc2Ugd2lmaSBkdXJhdGlvbiBmb3IgcmV0cnlDb3VudGVyPDMhIVxuIikpOwoJCQl9CgkJfQoJCWVsc2UgIC8vcmV0cnkgY291bnQgPiAzLCClda1uMaa4IHJldHJ5IGNvdW50ID4gMywgq2i91a+2V2lGaSBkdXJhdGlvbgoJCXsKCQkJaWYgKFdhaXRDb3VudCA9PSAxKQoJCQkJbSsrOyAvLyDB16dLpECqvaZiqOKt02xldmVspKSo06ZeCgkJCWVsc2UKCQkJCW0gPSAxOwoKCQkJaWYgKCBtID49IDIwKSAvL20gs8ykaq3IID0gMjAgJyCzzKRqMTIwrO0gcmVjaGVja6xPp1+91b7jIFdpRmkgZHVyYXRpb24uCgkJCQltID0gMjA7CgoJCQluID0gMyptOwoJCQl1cCA9IDA7CgkJCWRuID0gMDsKCQkJV2FpdENvdW50ID0gMDsgCgkJCXJlc3VsdCA9IC0xOwoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBEZWNyZWFzZSB3aWZpIGR1cmF0aW9uIGZvciByZXRyeUNvdW50ZXI+MyEhXG4iKSk7CgkJfQoKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBtYXggSW50ZXJ2YWwgPSAlZFxuIiwgbWF4SW50ZXJ2YWwpKTsKCQlpZihtYXhJbnRlcnZhbCA9PSAxKQoJCXsKCQkJaWYoYlR4UGF1c2UpCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIFR4UGF1c2UgPSAxXG4iKSk7CgoJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNSk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNTsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDIpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNjsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDMpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNyk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNzsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDQpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOCk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gODsKCQkJCX0KCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA5KQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEzKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMzsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEwKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE0KTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDExKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE1KTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEyKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE2KTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNjsKCQkJCX0KCQkJCQoJCQkJaWYocmVzdWx0ID09IC0xKQoJCQkJewkJCQkJCgkJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDUpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA2KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNjsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNikKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA3OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA3KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOCk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDg7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEzKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTQpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNSkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE2KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTY7CgkJCQkJfQoJCQkJfSAKCQkJCWVsc2UgaWYgKHJlc3VsdCA9PSAxKQoJCQkJewoJCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA4KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDc7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDcpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA2KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNjsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNikKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDUpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA1OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNikKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE1KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE1KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTQpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEzOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIFR4UGF1c2UgPSAwXG4iKSk7CgkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNSkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxOwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNikKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNykKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOCkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA0KTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA0OwoJCQkJfQoJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEzKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDk7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNCkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMCk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTA7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNSkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTE7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNikKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMik7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTI7CgkJCQl9CgkJCQkKCQkJCWlmKHJlc3VsdCA9PSAtMSkKCQkJCXsKCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMSkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDM7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDMpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA0KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNDsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOSkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEwKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTA7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEwKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTEpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMik7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEyOwoJCQkJCX0KCQkJCX0gCgkJCQllbHNlIGlmIChyZXN1bHQgPT0gMSkKCQkJCXsKCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNCkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAzKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDIpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTIpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDExOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMSkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEwKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTA7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEwKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCWVsc2UgaWYobWF4SW50ZXJ2YWwgPT0gMikKCQl7CgkJCWlmKGJUeFBhdXNlKQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBUeFBhdXNlID0gMVxuIikpOwoJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNjsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDIpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNjsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDMpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNyk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNzsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDQpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOCk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gODsKCQkJCX0KCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA5KQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE0KTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEwKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE0KTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDExKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE1KTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEyKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE2KTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNjsKCQkJCX0KCQkJCWlmKHJlc3VsdCA9PSAtMSkKCQkJCXsKCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNSkgCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA2KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNjsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNikKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA3OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA3KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOCk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDg7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEzKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTQpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTQpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNSkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE2KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTY7CgkJCQkJfQoJCQkJfSAKCQkJCWVsc2UgaWYgKHJlc3VsdCA9PSAxKQoJCQkJewoJCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA4KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDc7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDcpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA2KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNjsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNikKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDYpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA2OwoJCQkJCX0JCQkJCQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE2KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTUpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNCk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE0OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNCkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE0KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTQ7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgVHhQYXVzZSA9IDBcbiIpKTsKCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA1KQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA2KQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA3KQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDM7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA4KQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDQpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDQ7CgkJCQl9CgkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTMpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTApOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEwOwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTQpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTApOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEwOwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTUpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDExOwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTYpCgkJCQl7CgkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTIpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEyOwoJCQkJfQoJCQkJaWYocmVzdWx0ID09IC0xKQoJCQkJewoJCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDIpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMykKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDQpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA0OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA5KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTApOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMDsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTApCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDExOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMSkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEyKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTI7CgkJCQkJfQoJCQkJfSAKCQkJCWVsc2UgaWYgKHJlc3VsdCA9PSAxKQoJCQkJewoJCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA0KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDM7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDMpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMikKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMikKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTE7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDExKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTApOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMDsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTApCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMCk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEwOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQllbHNlIGlmKG1heEludGVydmFsID09IDMpCgkJewoJCQlpZihiVHhQYXVzZSkKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgVHhQYXVzZSA9IDFcbiIpKTsKCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDc7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDc7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAzKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDc7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA0KQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDgpOwoJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDg7CgkJCQl9CgkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOSkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMCkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMSkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CgkJCQl9CgkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMikKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNik7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTY7CgkJCQl9CgkJCQlpZihyZXN1bHQgPT0gLTEpCgkJCQl7CgkJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDUpIAoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDc7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDYpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA3KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNzsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNykKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDgpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA4OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMykKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE1KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE0KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTUpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNik7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE2OwoJCQkJCX0KCQkJCX0gCgkJCQllbHNlIGlmIChyZXN1bHQgPT0gMSkKCQkJCXsKCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOCkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDcpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA3OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA3KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDc7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDYpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA3KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNzsKCQkJCQl9CQkJCQkKCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxNikKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE1KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTU7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE1KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTQpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIFR4UGF1c2UgPSAwXG4iKSk7CgkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNSkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNikKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNykKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOwoJCQkJfQoJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOCkKCQkJCXsKCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA0KTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA0OwoJCQkJfQoJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEzKQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE0KQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE1KQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKCQkJCX0KCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDE2KQoJCQkJewoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEyKTsKCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMjsKCQkJCX0KCQkJCWlmKHJlc3VsdCA9PSAtMSkKCQkJCXsKCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMSkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDM7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDMpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA0KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gNDsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOSkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTE7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEwKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTEpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMik7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDEyOwoJCQkJCX0KCQkJCX0gCgkJCQllbHNlIGlmIChyZXN1bHQgPT0gMSkKCQkJCXsKCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gNCkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAzOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAzKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDM7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDIpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMzsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTIpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDExOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxMSkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMTE7CgkJCQkJfQoJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEwKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gaWYgY3VycmVudCBQc1RkbWEgbm90IG1hdGNoIHdpdGggdGhlIHJlY29yZGVkIG9uZSAod2hlbiBzY2FuLCBkaGNwLi4uKSwgCgkvLyB0aGVuIHdlIGhhdmUgdG8gYWRqdXN0IGl0IGJhY2sgdG8gdGhlIHByZXZpb3VzIHJlY29yZCBvbmUuCglpZihwQ29leERtLT5jdXJQc1RkbWEgIT0gcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlKQoJewoJCUJPT0xFQU4JYlNjYW49RkFMU0UsIGJMaW5rPUZBTFNFLCBiUm9hbT1GQUxTRTsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBQc1RkbWEgdHlwZSBkaXNtYXRjaCEhISwgY3VyUHNUZG1hPSVkLCByZWNvcmRQc1RkbWE9JWRcbiIsIAoJCQlwQ29leERtLT5jdXJQc1RkbWEsIHBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSkpOwoKCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9TQ0FOLCAmYlNjYW4pOwoJCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0xJTkssICZiTGluayk7CgkJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfUk9BTSwgJmJSb2FtKTsKCQkKCQlpZiggIWJTY2FuICYmICFiTGluayAmJiAhYlJvYW0pCgkJewoJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCBwQ29leERtLT5wc1RkbWFEdUFkalR5cGUpOwoJCX0KCQllbHNlCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCByb2FtaW5nL2xpbmsvc2NhbiBpcyB1bmRlciBwcm9ncmVzcywgd2lsbCBhZGp1c3QgbmV4dCB0aW1lISEhXG4iKSk7CgkJfQoJfQp9CgovLyBTQ08gb25seSBvciBTQ08rUEFOKEhTKQpWT0lECmhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25TY28oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTFCeXRlCXdpZmlSc3NpU3RhdGUsIHdpZmlSc3NpU3RhdGUxOwoJdTRCeXRlCXdpZmlCdzsKCglpZihoYWxidGM4NzIzYTJhbnRfTmVlZFRvRGVjQnRQd3IocEJ0Q29leGlzdCkpCgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCWVsc2UJCgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgkKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQoJewoJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAzNywgMCk7CgkJLy8gZncgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNSk7CgkJfQoKCQkvLyBzdyBtZWNoYW5pc20JCQoJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCX0KCWVsc2UKCXsKCQl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjcsIDApOwoJCXdpZmlSc3NpU3RhdGUxID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMSwgMiwgNDcsIDApOwoJCQoJCS8vIGZ3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTUpOwoJCX0KCQkKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUxID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlMSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCQl9CQkKCX0KfQoKClZPSUQKaGFsYnRjODcyM2EyYW50X0FjdGlvbkhpZCgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1MUJ5dGUJd2lmaVJzc2lTdGF0ZSwgd2lmaVJzc2lTdGF0ZTE7Cgl1NEJ5dGUJd2lmaUJ3OwoKCWlmKGhhbGJ0Yzg3MjNhMmFudF9OZWVkVG9EZWNCdFB3cihwQnRDb2V4aXN0KSkKCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJZWxzZQkKCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CglpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKCXsKCQl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMzcsIDApOwoJCS8vIGZ3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMyk7CgkJfQoKCQkvLyBzdyBtZWNoYW5pc20KCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJfQoJZWxzZQoJewoJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNywgMCk7CgkJd2lmaVJzc2lTdGF0ZTEgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAxLCAyLCA0NywgMCk7CgoJCS8vIGZ3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMyk7CgkJfQoKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUxID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlMSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCQl9CQkKCX0KfQoKLy9BMkRQIG9ubHkgLyBQQU4oRURSKSBvbmx5LyBBMkRQK1BBTihIUykKVk9JRApoYWxidGM4NzIzYTJhbnRfQWN0aW9uQTJkcCgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1MUJ5dGUJCXdpZmlSc3NpU3RhdGUsIHdpZmlSc3NpU3RhdGUxLCBidEluZm9FeHQ7Cgl1NEJ5dGUJCXdpZmlCdzsKCglidEluZm9FeHQgPSBwQ29leFN0YS0+YnRJbmZvRXh0OwoKCWlmKGhhbGJ0Yzg3MjNhMmFudF9OZWVkVG9EZWNCdFB3cihwQnRDb2V4aXN0KSkKCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJZWxzZQkKCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCQoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCgl7CgkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDM3LCAwKTsKCgkJLy8gZncgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaWYoYnRJbmZvRXh0JkJJVDApCS8vYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkcgoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QsIEZBTFNFLCBGQUxTRSwgMyk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QsIEZBTFNFLCBGQUxTRSwgMSk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJaWYoYnRJbmZvRXh0JkJJVDApCS8vYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkcgoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QsIEZBTFNFLCB0cnVlLCAzKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWhhbGJ0Yzg3MjNhMmFudF9UZG1hRHVyYXRpb25BZGp1c3QocEJ0Q29leGlzdCwgRkFMU0UsIHRydWUsIDEpOwoJCQl9CgkJfQoKCQkvLyBzdyBtZWNoYW5pc20JCQoJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCX0KCWVsc2UKCXsKCQl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjcsIDApOwoJCXdpZmlSc3NpU3RhdGUxID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMSwgMiwgNDcsIDApOwoJCQoJCS8vIGZ3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCBGQUxTRSwgRkFMU0UsIDMpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCBGQUxTRSwgRkFMU0UsIDEpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCBGQUxTRSwgdHJ1ZSwgMyk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QsIEZBTFNFLCB0cnVlLCAxKTsKCQkJfQoJCX0KCQkKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUxID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlMSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCQl9CQkKCX0KfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfQWN0aW9uUGFuRWRyKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXUxQnl0ZQkJd2lmaVJzc2lTdGF0ZSwgd2lmaVJzc2lTdGF0ZTEsIGJ0SW5mb0V4dDsKCXU0Qnl0ZQkJd2lmaUJ3OwoJCglidEluZm9FeHQgPSBwQ29leFN0YS0+YnRJbmZvRXh0OwoKCWlmKGhhbGJ0Yzg3MjNhMmFudF9OZWVkVG9EZWNCdFB3cihwQnRDb2V4aXN0KSkKCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJZWxzZQkKCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CglpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKCXsKCQl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMzcsIDApOwoJCQkKCQkvLyBmdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CgkJfQoKCQkvLyBzdyBtZWNoYW5pc20KCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7Cgl9CgllbHNlCgl7CgkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDI3LCAwKTsKCQl3aWZpUnNzaVN0YXRlMSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDEsIDIsIDQ3LCAwKTsKCQkKCQkvLyBmdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CgkJfQoKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUxID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlMSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCQl9Cgl9Cn0KCgovL1BBTihIUykgb25seQpWT0lECmhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25QYW5IcygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1MUJ5dGUJCXdpZmlSc3NpU3RhdGU7Cgl1NEJ5dGUJCXdpZmlCdzsKCgloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCgl7CgkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDM3LCAwKTsKCgkJLy8gZncgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJfQoJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsKCgkJLy8gc3cgbWVjaGFuaXNtCQkKCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7Cgl9CgllbHNlCgl7CgkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDM3LCAwKTsKCgkJLy8gZncgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoJCX0KCgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJCX0KCX0KfQoKLy9QQU4oRURSKStBMkRQClZPSUQKaGFsYnRjODcyM2EyYW50X0FjdGlvblBhbkVkckEyZHAoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpUnNzaVN0YXRlLCB3aWZpUnNzaVN0YXRlMSwgYnRJbmZvRXh0OwoJdTRCeXRlCQl3aWZpQnc7CgoJYnRJbmZvRXh0ID0gcENvZXhTdGEtPmJ0SW5mb0V4dDsKCglpZihoYWxidGM4NzIzYTJhbnRfTmVlZFRvRGVjQnRQd3IocEJ0Q29leGlzdCkpCgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCWVsc2UJCgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCgl7CgkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDM3LCAwKTsKCgkJLy8gZncgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaWYoYnRJbmZvRXh0JkJJVDApCS8vYTJkcCBiYXNpYyByYXRlCgkJCXsKCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDQpOwoJCQl9CgkJCWVsc2UJCQkJLy9hMmRwIGVkciByYXRlCgkJCXsKCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgYmFzaWMgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA4KTsKCQkJfQoJCQllbHNlCQkJCS8vYTJkcCBlZHIgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA2KTsKCQkJfQoJCX0KCgkJLy8gc3cgbWVjaGFuaXNtCgkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJfQoJZWxzZQoJewoJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNywgMCk7CgkJd2lmaVJzc2lTdGF0ZTEgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCA0NywgMCk7CgkJCgkJLy8gZncgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaWYoYnRJbmZvRXh0JkJJVDApCS8vYTJkcCBiYXNpYyByYXRlCgkJCXsKCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDQpOwoJCQl9CgkJCWVsc2UJCQkJLy9hMmRwIGVkciByYXRlCgkJCXsKCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgYmFzaWMgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA4KTsKCQkJfQoJCQllbHNlCQkJCS8vYTJkcCBlZHIgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA2KTsKCQkJfQoJCX0KCgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlMSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZTEgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4NzIzYTJhbnRfQWdjVGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgkJfQoJfQp9CgpWT0lECmhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25QYW5FZHJIaWQoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpUnNzaVN0YXRlLCB3aWZpUnNzaVN0YXRlMTsKCXU0Qnl0ZQkJd2lmaUJ3OwoKCWlmKGhhbGJ0Yzg3MjNhMmFudF9OZWVkVG9EZWNCdFB3cihwQnRDb2V4aXN0KSkKCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJZWxzZQkKCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CglpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKCXsKCQl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMzcsIDApOwoKCQkvLyBmdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMCk7IAoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNCk7IAoJCX0KCgkJLy8gc3cgbWVjaGFuaXNtCgkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJfQoJZWxzZQoJewoJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNywgMCk7CgkJd2lmaVJzc2lTdGF0ZTEgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAxLCAyLCA0NywgMCk7CgkJCgkJLy8gZncgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTApOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNCk7CgkJfQoJCQoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCQl9Cgl9Cn0KCi8vIEhJRCtBMkRQK1BBTihFRFIpClZPSUQKaGFsYnRjODcyM2EyYW50X0FjdGlvbkhpZEEyZHBQYW5FZHIoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpUnNzaVN0YXRlLCB3aWZpUnNzaVN0YXRlMSwgYnRJbmZvRXh0OwoJdTRCeXRlCQl3aWZpQnc7CgoJYnRJbmZvRXh0ID0gcENvZXhTdGEtPmJ0SW5mb0V4dDsKCglpZihoYWxidGM4NzIzYTJhbnRfTmVlZFRvRGVjQnRQd3IocEJ0Q29leGlzdCkpCgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCWVsc2UJCgkJaGFsYnRjODcyM2EyYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgloYWxidGM4NzIzYTJhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCgl7CgkJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0Yzg3MjNhMmFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDM3LCAwKTsKCQkJCgkJLy8gZncgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaWYoYnRJbmZvRXh0JkJJVDApCS8vYTJkcCBiYXNpYyByYXRlCgkJCXsKCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEyKTsKCQkJfQoJCQllbHNlCQkJCS8vYTJkcCBlZHIgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMCk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJaWYoYnRJbmZvRXh0JkJJVDApCS8vYTJkcCBiYXNpYyByYXRlCgkJCXsKCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE2KTsKCQkJfQoJCQllbHNlCQkJCS8vYTJkcCBlZHIgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNCk7CgkJCX0KCQl9CgkJCgkJLy8gc3cgbWVjaGFuaXNtCgkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJfQoJZWxzZQoJewoJCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNywgMCk7CgkJd2lmaVJzc2lTdGF0ZTEgPSBoYWxidGM4NzIzYTJhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAxLCAyLCA0NywgMCk7CgkJCgkJLy8gZncgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaWYoYnRJbmZvRXh0JkJJVDApCS8vYTJkcCBiYXNpYyByYXRlCgkJCXsKCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEyKTsKCQkJfQoJCQllbHNlCQkJCS8vYTJkcCBlZHIgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMCk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJaWYoYnRJbmZvRXh0JkJJVDApCS8vYTJkcCBiYXNpYyByYXRlCgkJCXsKCQkJCWhhbGJ0Yzg3MjNhMmFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDE2KTsKCQkJfQoJCQllbHNlCQkJCS8vYTJkcCBlZHIgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxNCk7CgkJCX0KCQl9CgoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZTEgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUxID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQkJaGFsYnRjODcyM2EyYW50X0FkY0JhY2tPZmYocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODcyM2EyYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDB4YzApOwoJCX0KCX0KfQoKVk9JRApoYWxidGM4NzIzYTJhbnRfQWN0aW9uSGlkQTJkcCgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1MUJ5dGUJCXdpZmlSc3NpU3RhdGUsIHdpZmlSc3NpU3RhdGUxLCBidEluZm9FeHQ7Cgl1NEJ5dGUJCXdpZmlCdzsKCglidEluZm9FeHQgPSBwQ29leFN0YS0+YnRJbmZvRXh0OwoKCWlmKGhhbGJ0Yzg3MjNhMmFudF9OZWVkVG9EZWNCdFB3cihwQnRDb2V4aXN0KSkKCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUpOwoJZWxzZQkKCQloYWxidGM4NzIzYTJhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCWhhbGJ0Yzg3MjNhMmFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CglpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKCXsKCQl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMzcsIDApOwoJCQoJCS8vIGZ3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgYmFzaWMgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QsIHRydWUsIEZBTFNFLCAzKTsKCQkJfQoJCQllbHNlCQkJCS8vYTJkcCBlZHIgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QsIHRydWUsIEZBTFNFLCAxKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlpZihidEluZm9FeHQmQklUMCkJLy9hMmRwIGJhc2ljIHJhdGUKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCB0cnVlLCB0cnVlLCAzKTsKCQkJfQoJCQllbHNlCQkJCS8vYTJkcCBlZHIgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QsIHRydWUsIHRydWUsIDEpOwoJCQl9CgkJfQoJCQoJCS8vIHN3IG1lY2hhbmlzbQoJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCX0KCWVsc2UKCXsKCQl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjcsIDApOwoJCXdpZmlSc3NpU3RhdGUxID0gaGFsYnRjODcyM2EyYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMSwgMiwgNDcsIDApOwoJCQoJCS8vIGZ3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWlmKGJ0SW5mb0V4dCZCSVQwKQkvL2EyZHAgYmFzaWMgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QsIHRydWUsIEZBTFNFLCAzKTsKCQkJfQoJCQllbHNlCQkJCS8vYTJkcCBlZHIgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QsIHRydWUsIEZBTFNFLCAxKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlpZihidEluZm9FeHQmQklUMCkJLy9hMmRwIGJhc2ljIHJhdGUKCQkJewoJCQkJaGFsYnRjODcyM2EyYW50X1RkbWFEdXJhdGlvbkFkanVzdChwQnRDb2V4aXN0LCB0cnVlLCB0cnVlLCAzKTsKCQkJfQoJCQllbHNlCQkJCS8vYTJkcCBlZHIgcmF0ZQoJCQl7CgkJCQloYWxidGM4NzIzYTJhbnRfVGRtYUR1cmF0aW9uQWRqdXN0KHBCdENvZXhpc3QsIHRydWUsIHRydWUsIDEpOwoJCQl9CgkJfQoKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUxID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlMSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlKTsKCQkJaGFsYnRjODcyM2EyYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMHhjMCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg3MjNhMmFudF9BZ2NUYWJsZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTJhbnRfQWRjQmFja09mZihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTJhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAweGMwKTsKCQl9Cgl9Cn0KClZPSUQKaGFsYnRjODcyM2EyYW50X1J1bkNvZXhpc3RNZWNoYW5pc20oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJUEJUQ19TVEFDS19JTkZPCQlwU3RhY2tJbmZvPSZwQnRDb2V4aXN0LT5zdGFja19pbmZvOwoJdTFCeXRlCQkJCWJ0SW5mb09yaWdpbmFsPTAsIGJ0UmV0cnlDbnQ9MDsKCXUxQnl0ZQkJCQlhbGdvcml0aG09MDsKCglpZihwQnRDb2V4aXN0LT5tYW51YWxfY29udHJvbCkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIE1hbnVhbCBjb250cm9sISEhXG4iKSk7CgkJcmV0dXJuOwoJfQoKCWlmKHBTdGFja0luZm8tPmJQcm9maWxlTm90aWZpZWQpCgl7CgkJaWYocENvZXhTdGEtPmJIb2xkRm9yU3RhY2tPcGVyYXRpb24pCgkJewoJCQkvLyBpZiBidCBpbnF1aXJ5L3BhZ2UvcGFpciwgZG8gbm90IGV4ZWN1dGUuCgkJCXJldHVybjsKCQl9CgkJCgkJYWxnb3JpdGhtID0gaGFsYnRjODcyM2EyYW50X0FjdGlvbkFsZ29yaXRobShwQnRDb2V4aXN0KTsKCQlpZihwQ29leFN0YS0+YkhvbGRQZXJpb2RDbnQgJiYgKEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkhTIT1hbGdvcml0aG0pKQoJCXsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLEhvbGQgQlQgaW5xdWlyeS9wYWdlIHNjYW4gc2V0dGluZyAoY250ID0gJWQpISFcbiIsIAoJCQkJcENvZXhTdGEtPmJIb2xkUGVyaW9kQ250KSk7CgkJCWlmKHBDb2V4U3RhLT5iSG9sZFBlcmlvZENudCA+PSA2KQoJCQl7CgkJCQlwQ29leFN0YS0+YkhvbGRQZXJpb2RDbnQgPSAwOwoJCQkJLy8gbmV4dCB0aW1lIHRoZSBjb2V4aXN0IHBhcmFtZXRlcnMgc2hvdWxkIGJlIHJlc2V0IGFnYWluLgoJCQl9CgkJCWVsc2UKCQkJCXBDb2V4U3RhLT5iSG9sZFBlcmlvZENudCsrOwoJCQlyZXR1cm47CgkJfQoKCQlwQ29leERtLT5jdXJBbGdvcml0aG0gPSBhbGdvcml0aG07CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBbGdvcml0aG0gPSAlZCBcbiIsIHBDb2V4RG0tPmN1ckFsZ29yaXRobSkpOwoJCWlmKGhhbGJ0Yzg3MjNhMmFudF9Jc0NvbW1vbkFjdGlvbihwQnRDb2V4aXN0KSkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIDItQW50IGNvbW1vbi5cbiIpKTsKCQkJcENvZXhEbS0+YlJlc2V0VGRtYUFkanVzdCA9IHRydWU7CgkJfQoJCWVsc2UKCQl7CgkJCWlmKHBDb2V4RG0tPmN1ckFsZ29yaXRobSAhPSBwQ29leERtLT5wcmVBbGdvcml0aG0pCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgcHJlQWxnb3JpdGhtPSVkLCBjdXJBbGdvcml0aG09JWRcbiIsIAoJCQkJCXBDb2V4RG0tPnByZUFsZ29yaXRobSwgcENvZXhEbS0+Y3VyQWxnb3JpdGhtKSk7CgkJCQlwQ29leERtLT5iUmVzZXRUZG1hQWRqdXN0ID0gdHJ1ZTsKCQkJfQoJCQlzd2l0Y2gocENvZXhEbS0+Y3VyQWxnb3JpdGhtKQoJCQl7CgkJCQljYXNlIEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1NDTzoKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gU0NPLlxuIikpOwoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25TY28ocEJ0Q29leGlzdCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX0hJRDoKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gSElELlxuIikpOwoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25IaWQocEJ0Q29leGlzdCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX0EyRFA6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEEyRFAuXG4iKSk7CgkJCQkJaGFsYnRjODcyM2EyYW50X0FjdGlvbkEyZHAocEJ0Q29leGlzdCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkVEUjoKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gUEFOKEVEUikuXG4iKSk7CgkJCQkJaGFsYnRjODcyM2EyYW50X0FjdGlvblBhbkVkcihwQnRDb2V4aXN0KTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fUEFOSFM6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEhTIG1vZGUuXG4iKSk7CgkJCQkJaGFsYnRjODcyM2EyYW50X0FjdGlvblBhbkhzKHBCdENvZXhpc3QpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUDoKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gUEFOK0EyRFAuXG4iKSk7CgkJCQkJaGFsYnRjODcyM2EyYW50X0FjdGlvblBhbkVkckEyZHAocEJ0Q29leGlzdCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEJUXzg3MjNBXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFBBTihFRFIpK0hJRC5cbiIpKTsKCQkJCQloYWxidGM4NzIzYTJhbnRfQWN0aW9uUGFuRWRySGlkKHBCdENvZXhpc3QpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCVF84NzIzQV8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFI6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEhJRCtBMkRQK1BBTi5cbiIpKTsKCQkJCQloYWxidGM4NzIzYTJhbnRfQWN0aW9uSGlkQTJkcFBhbkVkcihwQnRDb2V4aXN0KTsKCQkJCQlicmVhazsKCQkJCWNhc2UgQlRfODcyM0FfMkFOVF9DT0VYX0FMR09fSElEX0EyRFA6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEhJRCtBMkRQLlxuIikpOwoJCQkJCWhhbGJ0Yzg3MjNhMmFudF9BY3Rpb25IaWRBMmRwKHBCdENvZXhpc3QpOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gY29leGlzdCBBbGwgT2ZmISFcbiIpKTsKCQkJCQloYWxidGM4NzIzYTJhbnRfQ29leEFsbE9mZihwQnRDb2V4aXN0KTsKCQkJCQlicmVhazsKCQkJfQoJCQlwQ29leERtLT5wcmVBbGdvcml0aG0gPSBwQ29leERtLT5jdXJBbGdvcml0aG07CgkJfQoJfQp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyB3b3JrIGFyb3VuZCBmdW5jdGlvbiBzdGFydCB3aXRoIHdhX2hhbGJ0Yzg3MjNhMmFudF8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVk9JRAp3YV9oYWxidGM4NzIzYTJhbnRfTW9uaXRvckMyaCgKCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QKCSkKewoJdTFCeXRlCXRtcDFiPTB4MDsKCXU0Qnl0ZQljdXJDMmhUb3RhbENudD0weDA7CglzdGF0aWMgdTRCeXRlCXByZUMyaFRvdGFsQ250PTB4MCwgc2FtZUNudFBvbGxpbmdUaW1lPTB4MDsKCgljdXJDMmhUb3RhbENudCs9cENvZXhTdGEtPmJ0SW5mb0MyaENudFtCVF9JTkZPX1NSQ184NzIzQV8yQU5UX0JUX1JTUF07CgoJaWYoY3VyQzJoVG90YWxDbnQgPT0gcHJlQzJoVG90YWxDbnQpCgl7CgkJc2FtZUNudFBvbGxpbmdUaW1lKys7Cgl9CgllbHNlCgl7CgkJcHJlQzJoVG90YWxDbnQgPSBjdXJDMmhUb3RhbENudDsKCQlzYW1lQ250UG9sbGluZ1RpbWUgPSAwOwoJfQoKCWlmKHNhbWVDbnRQb2xsaW5nVGltZSA+PSAyKQoJewoJCXRtcDFiID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHgxYWYpOwoJCWlmKHRtcDFiICE9IDB4MCkKCQl7CgkJCXBDb2V4U3RhLT5jMmhIYW5nRGV0ZWN0Q250Kys7CgkJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDFhZiwgMHgwKTsKCQl9Cgl9Cn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIGV4dGVybiBmdW5jdGlvbiBzdGFydCB3aXRoIEVYaGFsYnRjODcyM2EyYW50XwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpWT0lECkVYaGFsYnRjODcyM2EyYW50X0luaXRId0NvbmZpZygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1NEJ5dGUJdTRUbXA9MDsKCXUxQnl0ZQl1MVRtcD0wOwoKCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULCAoIltCVENvZXhdLCAyQW50IEluaXQgSFcgQ29uZmlnISFcbiIpKTsKCgkvLyBiYWNrdXAgcmYgMHgxZSB2YWx1ZQoJcENvZXhEbS0+YnRSZjB4MWVCYWNrdXAgPSAKCQlwQnRDb2V4aXN0LT5idGNfZ2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxZSwgMHhmZmZmZik7CgoJLy8gRW5hYmxlIGNvdW50ZXIgc3RhdGlzdGljcwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NzZlLCAweDQpOwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4Nzc4LCAweDMpOwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NDAsIDB4MjApOwp9CgpWT0lECkVYaGFsYnRjODcyM2EyYW50X0luaXRDb2V4RG0oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsICgiW0JUQ29leF0sIENvZXggTWVjaGFuaXNtIEluaXQhIVxuIikpOwoJCgloYWxidGM4NzIzYTJhbnRfSW5pdENvZXhEbShwQnRDb2V4aXN0KTsKfQoKVk9JRApFWGhhbGJ0Yzg3MjNhMmFudF9EaXNwbGF5Q29leEluZm8oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJc3RydWN0IGJ0Y19ib2FyZF9pbmZvICoJCXBCb2FyZEluZm89JnBCdENvZXhpc3QtPmJvYXJkX2luZm87CglQQlRDX1NUQUNLX0lORk8JCXBTdGFja0luZm89JnBCdENvZXhpc3QtPnN0YWNrX2luZm87CglwdTFCeXRlCQkJCWNsaUJ1Zj1wQnRDb2V4aXN0LT5jbGlfYnVmOwoJdTFCeXRlCQkJCXUxVG1wWzRdLCBpLCBidEluZm9FeHQsIHBzVGRtYUNhc2U9MDsKCXU0Qnl0ZQkJCQl1NFRtcFs0XTsKCUJPT0xFQU4JCQkJYlJvYW09RkFMU0UsIGJTY2FuPUZBTFNFLCBiTGluaz1GQUxTRSwgYldpZmlVbmRlcjVHPUZBTFNFOwoJQk9PTEVBTgkJCQliQnRIc09uPUZBTFNFLCBiV2lmaUJ1c3k9RkFMU0U7CglzNEJ5dGUJCQkJd2lmaVJzc2k9MCwgYnRIc1Jzc2k9MDsKCXU0Qnl0ZQkJCQl3aWZpQncsIHdpZmlUcmFmZmljRGlyOwoJdTFCeXRlCQkJCXdpZmlEb3QxMUNobmwsIHdpZmlIc0Nobmw7CgoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gPT09PT09PT09PT09W0JUIENvZXhpc3QgaW5mb109PT09PT09PT09PT0iKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCWlmKCFwQm9hcmRJbmZvLT5idF9leGlzdCkKCXsKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiBCVCBub3QgZXhpc3RzICEhISIpOwoJCUNMX1BSSU5URihjbGlCdWYpOwoJCXJldHVybjsKCX0KCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCAiLCAiQW50IFBHIG51bWJlci8gQW50IG1lY2hhbmlzbToiLCBcCgkJcEJvYXJkSW5mby0+cGdfYW50X251bSwgcEJvYXJkSW5mby0+YnRkbV9hbnRfbnVtKTsKCUNMX1BSSU5URihjbGlCdWYpOwkKCQoJaWYocEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wpCgl7CgkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiW0FjdGlvbiBNYW51YWwgY29udHJvbF0hISIpOwoJCUNMX1BSSU5URihjbGlCdWYpOwoJfQoJCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzIC8gJWQiLCAiQlQgc3RhY2svIGhjaSBleHQgdmVyIiwgXAoJCSgocFN0YWNrSW5mby0+YlByb2ZpbGVOb3RpZmllZCk/ICJZZXMiOiJObyIpLCBwU3RhY2tJbmZvLT5oY2lWZXJzaW9uKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZiQnRIc09uKTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VMV9XSUZJX0RPVDExX0NITkwsICZ3aWZpRG90MTFDaG5sKTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VMV9XSUZJX0hTX0NITkwsICZ3aWZpSHNDaG5sKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgLyAlZCglZCkiLCAiRG90MTEgY2hhbm5lbCAvIEhzQ2hubChIc01vZGUpIiwgXAoJCXdpZmlEb3QxMUNobmwsIHdpZmlIc0NobmwsIGJCdEhzT24pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlMDJ4ICUwMnggJTAyeCAiLCAiSDJDIFdpZmkgaW5mb3JtIGJ0IGNobmwgSW5mbyIsIFwKCQlwQ29leERtLT53aWZpQ2hubEluZm9bMF0sIHBDb2V4RG0tPndpZmlDaG5sSW5mb1sxXSwKCQlwQ29leERtLT53aWZpQ2hubEluZm9bMl0pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1M0X1dJRklfUlNTSSwgJndpZmlSc3NpKTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9TNF9IU19SU1NJLCAmYnRIc1Jzc2kpOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQiLCAiV2lmaSByc3NpLyBIUyByc3NpIiwgXAoJCXdpZmlSc3NpLCBidEhzUnNzaSk7CglDTF9QUklOVEYoY2xpQnVmKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9TQ0FOLCAmYlNjYW4pOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfTElOSywgJmJMaW5rKTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1JPQU0sICZiUm9hbSk7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZC8gJWQgIiwgIldpZmkgYkxpbmsvIGJSb2FtLyBiU2NhbiIsIFwKCQliTGluaywgYlJvYW0sIGJTY2FuKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1VOREVSXzVHLCAmYldpZmlVbmRlcjVHKTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0JVU1ksICZiV2lmaUJ1c3kpOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfVFJBRkZJQ19ESVJFQ1RJT04sICZ3aWZpVHJhZmZpY0Rpcik7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzIC8gJXMvICVzICIsICJXaWZpIHN0YXR1cyIsIFwKCQkoYldpZmlVbmRlcjVHPyAiNUciOiIyLjRHIiksCgkJKChCVENfV0lGSV9CV19MRUdBQ1k9PXdpZmlCdyk/ICJMZWdhY3kiOiAoKChCVENfV0lGSV9CV19IVDQwPT13aWZpQncpPyAiSFQ0MCI6IkhUMjAiKSkpLAoJCSgoIWJXaWZpQnVzeSk/ICJpZGxlIjogKChCVENfV0lGSV9UUkFGRklDX1RYPT13aWZpVHJhZmZpY0Rpcik/ICJ1cGxpbmsiOiJkb3dubGluayIpKSk7CglDTF9QUklOVEYoY2xpQnVmKTsKCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IFslcy8gJWQvICVkXSAiLCAiQlQgW3N0YXR1cy8gcnNzaS8gcmV0cnlDbnRdIiwgXAoJCSgocENvZXhTdGEtPmJDMmhCdElucXVpcnlQYWdlKT8oImlucXVpcnkvcGFnZSBzY2FuIik6KChCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKT8gImlkbGUiOiggIChCVF84NzIzQV8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cyk/ICJjb25uZWN0ZWQtaWRsZSI6ImJ1c3kiKSkpLAoJCXBDb2V4U3RhLT5idFJzc2ksIHBDb2V4U3RhLT5idFJldHJ5Q250KTsKCUNMX1BSSU5URihjbGlCdWYpOwoJCglpZihwU3RhY2tJbmZvLT5iUHJvZmlsZU5vdGlmaWVkKQoJewkJCQoJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgLyAlZCAvICVkIC8gJWQiLCAiU0NPL0hJRC9QQU4vQTJEUCIsIFwKCQkJcFN0YWNrSW5mby0+YlNjb0V4aXN0LCBwU3RhY2tJbmZvLT5iSGlkRXhpc3QsIHBTdGFja0luZm8tPmJQYW5FeGlzdCwgcFN0YWNrSW5mby0+YkEyZHBFeGlzdCk7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7CQoKCQlwQnRDb2V4aXN0LT5idGNfZGlzcF9kYmdfbXNnKHBCdENvZXhpc3QsIEJUQ19EQkdfRElTUF9CVF9MSU5LX0lORk8pOwoJfQoKCWJ0SW5mb0V4dCA9IHBDb2V4U3RhLT5idEluZm9FeHQ7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzIiwgIkJUIEluZm8gQTJEUCByYXRlIiwgXAoJCShidEluZm9FeHQmQklUMCk/ICJCYXNpYyByYXRlIjoiRURSIHJhdGUiKTsKCUNMX1BSSU5URihjbGlCdWYpOwkKCglmb3IoaT0wOyBpPEJUX0lORk9fU1JDXzg3MjNBXzJBTlRfTUFYOyBpKyspCgl7CgkJaWYocENvZXhTdGEtPmJ0SW5mb0MyaENudFtpXSkKCQl7CQkJCQoJCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMngoJWQpIiwgR0xCdEluZm9TcmM4NzIzYTJBbnRbaV0sIFwKCQkJCXBDb2V4U3RhLT5idEluZm9DMmhbaV1bMF0sIHBDb2V4U3RhLT5idEluZm9DMmhbaV1bMV0sCgkJCQlwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzJdLCBwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzNdLAoJCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVs0XSwgcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVs1XSwKCQkJCXBDb2V4U3RhLT5idEluZm9DMmhbaV1bNl0sIHBDb2V4U3RhLT5idEluZm9DMmhDbnRbaV0pOwoJCQlDTF9QUklOVEYoY2xpQnVmKTsKCQl9Cgl9CgoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCIsICJ3cml0ZSAweDFhZj0weDAgbnVtIiwgXAoJCXBDb2V4U3RhLT5jMmhIYW5nRGV0ZWN0Q250KTsKCUNMX1BSSU5URihjbGlCdWYpOwoJCgkvLyBTdyBtZWNoYW5pc20JCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsICI9PT09PT09PT09PT1bU3cgbWVjaGFuaXNtXT09PT09PT09PT09PSIpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZC8gJWQiLCAiU00xW1NoUmYvIExwUkEvIExpbURpZ10iLCBcCgkJcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbmssIHBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmEsIHBDb2V4RG0tPmxpbWl0ZWRfZGlnKTsKCUNMX1BSSU5URihjbGlCdWYpOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkKDB4JXgpICIsICJTTTJbQWdjVC8gQWRjQi8gU3dEYWNTd2luZyhsdmwpXSIsIFwKCQlwQ29leERtLT5iQ3VyQWdjVGFibGVFbiwgcENvZXhEbS0+YkN1ckFkY0JhY2tPZmYsIHBDb2V4RG0tPmJDdXJEYWNTd2luZ09uLCBwQ29leERtLT5jdXJEYWNTd2luZ0x2bCk7CglDTF9QUklOVEYoY2xpQnVmKTsKCgkvLyBGdyBtZWNoYW5pc20JCQoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiPT09PT09PT09PT09W0Z3IG1lY2hhbmlzbV09PT09PT09PT09PT0iKTsKCUNMX1BSSU5URihjbGlCdWYpOwkKCQoJaWYoIXBCdENvZXhpc3QtPm1hbnVhbF9jb250cm9sKQoJewoJCXBzVGRtYUNhc2UgPSBwQ29leERtLT5jdXJQc1RkbWE7CgkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggY2FzZS0lZCIsICJQUyBURE1BIiwgXAoJCQlwQ29leERtLT5wc1RkbWFQYXJhWzBdLCBwQ29leERtLT5wc1RkbWFQYXJhWzFdLAoJCQlwQ29leERtLT5wc1RkbWFQYXJhWzJdLCBwQ29leERtLT5wc1RkbWFQYXJhWzNdLAoJCQlwQ29leERtLT5wc1RkbWFQYXJhWzRdLCBwc1RkbWFDYXNlKTsKCQlDTF9QUklOVEYoY2xpQnVmKTsKCQoJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkICIsICJEZWNCdFB3ci8gSWduV2xhbkFjdCIsIFwKCQkJcENvZXhEbS0+YkN1ckRlY0J0UHdyLCBwQ29leERtLT5iQ3VySWdub3JlV2xhbkFjdCk7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7Cgl9CgoJLy8gSHcgc2V0dGluZwkJCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsICI9PT09PT09PT09PT1bSHcgc2V0dGluZ109PT09PT09PT09PT0iKTsKCUNMX1BSSU5URihjbGlCdWYpOwkKCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiUkYtQSwgMHgxZSBpbml0VmFsIiwgXAoJCXBDb2V4RG0tPmJ0UmYweDFlQmFja3VwKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXUxVG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg3NzgpOwoJdTFUbXBbMV0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDc4Myk7Cgl1MVRtcFsyXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4Nzk2KTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleC8gMHgleCIsICIweDc3OC8gMHg3ODMvIDB4Nzk2IiwgXAoJCXUxVG1wWzBdLCB1MVRtcFsxXSwgdTFUbXBbMl0pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJdTRUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweDg4MCk7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHg4ODAiLCBcCgkJdTRUbXBbMF0pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJdTFUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDQwKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDQwIiwgXAoJCXUxVG1wWzBdKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXU0VG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHg1NTApOwoJdTFUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDUyMik7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgiLCAiMHg1NTAoYmNuIGN0cmwpLzB4NTIyIiwgXAoJCXU0VG1wWzBdLCB1MVRtcFswXSk7CglDTF9QUklOVEYoY2xpQnVmKTsKCgl1NFRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4NDg0KTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDQ4NChyYXRlIGFkYXB0aXZlKSIsIFwKCQl1NFRtcFswXSk7CglDTF9QUklOVEYoY2xpQnVmKTsKCgl1NFRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4YzUwKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweGM1MChkaWcpIiwgXAoJCXU0VG1wWzBdKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXU0VG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHhkYTApOwoJdTRUbXBbMV0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweGRhNCk7Cgl1NFRtcFsyXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4ZGE4KTsKCXU0VG1wWzNdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHhkYWMpOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4LyAweCV4LyAweCV4IiwgIjB4ZGEwLzB4ZGE0LzB4ZGE4LzB4ZGFjKEZBIGNudCkiLCBcCgkJdTRUbXBbMF0sIHU0VG1wWzFdLCB1NFRtcFsyXSwgdTRUbXBbM10pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJdTRUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweDZjMCk7Cgl1NFRtcFsxXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4NmM0KTsKCXU0VG1wWzJdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHg2YzgpOwoJdTFUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDZjYyk7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgvIDB4JXgiLCAiMHg2YzAvMHg2YzQvMHg2YzgvMHg2Y2MoY29leFRhYmxlKSIsIFwKCQl1NFRtcFswXSwgdTRUbXBbMV0sIHU0VG1wWzJdLCB1MVRtcFswXSk7CglDTF9QUklOVEYoY2xpQnVmKTsKCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCIsICIweDc3MCAoaHAgcnhbMzE6MTZdL3R4WzE1OjBdKSIsIFwKCQlwQ29leFN0YS0+aGlnaFByaW9yaXR5UngsIHBDb2V4U3RhLT5oaWdoUHJpb3JpdHlUeCk7CglDTF9QUklOVEYoY2xpQnVmKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkIiwgIjB4Nzc0KGxwIHJ4WzMxOjE2XS90eFsxNTowXSkiLCBcCgkJcENvZXhTdGEtPmxvd1ByaW9yaXR5UngsIHBDb2V4U3RhLT5sb3dQcmlvcml0eVR4KTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCS8vIFR4IG1nbnQgcXVldWUgaGFuZyBvciBub3QsIDB4NDFiIHNob3VsZCA9IDB4ZiwgZXg6IDB4ZCA9PT5oYW5nCgl1MVRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4NDFiKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDQxYiAobWdudFEgaGFuZyBjaGsgPT0gMHhmKSIsIFwKCQl1MVRtcFswXSk7CglDTF9QUklOVEYoY2xpQnVmKTsJCgoJcEJ0Q29leGlzdC0+YnRjX2Rpc3BfZGJnX21zZyhwQnRDb2V4aXN0LCBCVENfREJHX0RJU1BfQ09FWF9TVEFUSVNUSUNTKTsKfQoKClZPSUQKRVhoYWxidGM4NzIzYTJhbnRfSXBzTm90aWZ5KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJdHlwZQoJKQp7CglpZihCVENfSVBTX0VOVEVSID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgSVBTIEVOVEVSIG5vdGlmeVxuIikpOwoJCWhhbGJ0Yzg3MjNhMmFudF9Db2V4QWxsT2ZmKHBCdENvZXhpc3QpOwoJfQoJZWxzZSBpZihCVENfSVBTX0xFQVZFID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgSVBTIExFQVZFIG5vdGlmeVxuIikpOwoJCS8vaGFsYnRjODcyM2EyYW50X0luaXRDb2V4RG0ocEJ0Q29leGlzdCk7Cgl9Cn0KClZPSUQKRVhoYWxidGM4NzIzYTJhbnRfTHBzTm90aWZ5KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJdHlwZQoJKQp7CglpZihCVENfTFBTX0VOQUJMRSA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIExQUyBFTkFCTEUgbm90aWZ5XG4iKSk7Cgl9CgllbHNlIGlmKEJUQ19MUFNfRElTQUJMRSA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIExQUyBESVNBQkxFIG5vdGlmeVxuIikpOwoJfQp9CgpWT0lECkVYaGFsYnRjODcyM2EyYW50X1NjYW5Ob3RpZnkoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQl0eXBlCgkpCnsKCWlmKEJUQ19TQ0FOX1NUQVJUID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgU0NBTiBTVEFSVCBub3RpZnlcbiIpKTsKCX0KCWVsc2UgaWYoQlRDX1NDQU5fRklOSVNIID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgU0NBTiBGSU5JU0ggbm90aWZ5XG4iKSk7Cgl9Cn0KClZPSUQKRVhoYWxidGM4NzIzYTJhbnRfQ29ubmVjdE5vdGlmeSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCXR5cGUKCSkKewoJaWYoQlRDX0FTU09DSUFURV9TVEFSVCA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIENPTk5FQ1QgU1RBUlQgbm90aWZ5XG4iKSk7Cgl9CgllbHNlIGlmKEJUQ19BU1NPQ0lBVEVfRklOSVNIID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgQ09OTkVDVCBGSU5JU0ggbm90aWZ5XG4iKSk7Cgl9Cn0KClZPSUQKRVhoYWxidGM4NzIzYTJhbnRfTWVkaWFTdGF0dXNOb3RpZnkoCglJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJCXR5cGUKCSkKewoJaWYoQlRDX01FRElBX0NPTk5FQ1QgPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBNRURJQSBjb25uZWN0IG5vdGlmeVxuIikpOwoJfQoJZWxzZQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIE1FRElBIGRpc2Nvbm5lY3Qgbm90aWZ5XG4iKSk7Cgl9CgoJaGFsYnRjODcyM2EyYW50X0luZGljYXRlV2lmaUNobmxCd0luZm8ocEJ0Q29leGlzdCwgdHlwZSk7Cn0KClZPSUQKRVhoYWxidGM4NzIzYTJhbnRfU3BlY2lhbFBhY2tldE5vdGlmeSgKCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQkJdHlwZQoJKQp7CglpZih0eXBlID09IEJUQ19QQUNLRVRfREhDUCkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBESENQIFBhY2tldCBub3RpZnlcbiIpKTsKCX0KfQoKVk9JRApFWGhhbGJ0Yzg3MjNhMmFudF9CdEluZm9Ob3RpZnkoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglwdTFCeXRlCQkJdG1wQnVmLAoJSU4JdTFCeXRlCQkJbGVuZ3RoCgkpCnsKCXUxQnl0ZQkJCWJ0SW5mbz0wOwoJdTFCeXRlCQkJaSwgcnNwU291cmNlPTA7CglCT09MRUFOCQkJYkJ0QnVzeT1GQUxTRSwgbGltaXRlZF9kaWc9RkFMU0U7CglCT09MRUFOCQkJYldpZmlDb25uZWN0ZWQ9RkFMU0UsIGJCdEhzT249RkFMU0U7CgoJcENvZXhTdGEtPmJDMmhCdEluZm9SZXFTZW50ID0gRkFMU0U7CgkKCXJzcFNvdXJjZSA9IEJUX0lORk9fU1JDXzg3MjNBXzJBTlRfQlRfUlNQOwoJcENvZXhTdGEtPmJ0SW5mb0MyaENudFtyc3BTb3VyY2VdKys7CgoJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgQnQgaW5mb1slZF0sIGxlbmd0aD0lZCwgaGV4IGRhdGE9WyIsIHJzcFNvdXJjZSwgbGVuZ3RoKSk7Cglmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQoJewoJCXBDb2V4U3RhLT5idEluZm9DMmhbcnNwU291cmNlXVtpXSA9IHRtcEJ1ZltpXTsKCQlpZihpID09IDApCgkJCWJ0SW5mbyA9IHRtcEJ1ZltpXTsKCQlpZihpID09IGxlbmd0aC0xKQoJCXsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCIweCUwMnhdXG4iLCB0bXBCdWZbaV0pKTsKCQl9CgkJZWxzZQoJCXsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCIweCUwMngsICIsIHRtcEJ1ZltpXSkpOwoJCX0KCX0KCglpZihCVF9JTkZPX1NSQ184NzIzQV8yQU5UX1dJRklfRlcgIT0gcnNwU291cmNlKQoJewoJCXBDb2V4U3RhLT5idFJldHJ5Q250ID0KCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtyc3BTb3VyY2VdWzFdOwoKCQlwQ29leFN0YS0+YnRSc3NpID0KCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtyc3BTb3VyY2VdWzJdKjIrMTA7CgoJCXBDb2V4U3RhLT5idEluZm9FeHQgPSAKCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtyc3BTb3VyY2VdWzNdOwoJfQoJCQoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJCdEhzT24pOwoJLy8gY2hlY2sgQklUMiBmaXJzdCA9PT4gY2hlY2sgaWYgYnQgaXMgdW5kZXIgaW5xdWlyeSBvciBwYWdlIHNjYW4KCWlmKGJ0SW5mbyAmIEJUX0lORk9fODcyM0FfMkFOVF9CX0lOUV9QQUdFKQoJewoJCXBDb2V4U3RhLT5iQzJoQnRJbnF1aXJ5UGFnZSA9IHRydWU7Cgl9CgllbHNlCgl7CgkJcENvZXhTdGEtPmJDMmhCdElucXVpcnlQYWdlID0gRkFMU0U7Cgl9Cn0KClZPSUQKRVhoYWxidGM4NzIzYTJhbnRfU3RhY2tPcGVyYXRpb25Ob3RpZnkoCglJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJCXR5cGUKCSkKewoJaWYoQlRDX1NUQUNLX09QX0lOUV9QQUdFX1BBSVJfU1RBUlQgPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBTdGFja09QIElucXVpcnkvcGFnZS9wYWlyIHN0YXJ0IG5vdGlmeVxuIikpOwoJCXBDb2V4U3RhLT5iSG9sZEZvclN0YWNrT3BlcmF0aW9uID0gdHJ1ZTsKCQlwQ29leFN0YS0+YkhvbGRQZXJpb2RDbnQgPSAxOwoJCWhhbGJ0Yzg3MjNhMmFudF9CdElucXVpcnlQYWdlKHBCdENvZXhpc3QpOwoJfQoJZWxzZSBpZihCVENfU1RBQ0tfT1BfSU5RX1BBR0VfUEFJUl9GSU5JU0ggPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBTdGFja09QIElucXVpcnkvcGFnZS9wYWlyIGZpbmlzaCBub3RpZnlcbiIpKTsKCQlwQ29leFN0YS0+YkhvbGRGb3JTdGFja09wZXJhdGlvbiA9IEZBTFNFOwoJfQp9CgpWT0lECkVYaGFsYnRjODcyM2EyYW50X0hhbHROb3RpZnkoCglJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0CgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIEhhbHQgbm90aWZ5XG4iKSk7CgoJaGFsYnRjODcyM2EyYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgdHJ1ZSk7CglFWGhhbGJ0Yzg3MjNhMmFudF9NZWRpYVN0YXR1c05vdGlmeShwQnRDb2V4aXN0LCBCVENfTUVESUFfRElTQ09OTkVDVCk7Cn0KClZPSUQKRVhoYWxidGM4NzIzYTJhbnRfUGVyaW9kaWNhbCgKCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QKCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgMkFudCBQZXJpb2RpY2FsISFcbiIpKTsKCgkvLyB3b3JrIGFyb3VuZCBmb3IgYzJoIGhhbmcKCXdhX2hhbGJ0Yzg3MjNhMmFudF9Nb25pdG9yQzJoKHBCdENvZXhpc3QpOwoJCgloYWxidGM4NzIzYTJhbnRfUXVlcnlCdEluZm8ocEJ0Q29leGlzdCk7CgloYWxidGM4NzIzYTJhbnRfTW9uaXRvckJ0Q3RyKHBCdENvZXhpc3QpOwoJaGFsYnRjODcyM2EyYW50X01vbml0b3JCdEVuYWJsZURpc2FibGUocEJ0Q29leGlzdCk7CgoJaGFsYnRjODcyM2EyYW50X1J1bkNvZXhpc3RNZWNoYW5pc20ocEJ0Q29leGlzdCk7Cn0KCgojZW5kaWYKCg==