LyoKICogTkRBIEFORCBORUVELVRPLUtOT1cgUkVRVUlSRUQKICoKICogQ29weXJpZ2h0IKkgMjAxMy0yMDE4IFN5bmFwdGljcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiB0aGF0IGlzIHByb3ByaWV0YXJ5IHRvIFN5bmFwdGljcwogKiBJbmNvcnBvcmF0ZWQgKCJTeW5hcHRpY3MiKS4gVGhlIGhvbGRlciBvZiB0aGlzIGZpbGUgc2hhbGwgdHJlYXQgYWxsCiAqIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gYXMgY29uZmlkZW50aWFsLCBzaGFsbCB1c2UgdGhlCiAqIGluZm9ybWF0aW9uIG9ubHkgZm9yIGl0cyBpbnRlbmRlZCBwdXJwb3NlLCBhbmQgc2hhbGwgbm90IGR1cGxpY2F0ZSwKICogZGlzY2xvc2UsIG9yIGRpc3NlbWluYXRlIGFueSBvZiB0aGlzIGluZm9ybWF0aW9uIGluIGFueSBtYW5uZXIKICogdW5sZXNzIFN5bmFwdGljcyBoYXMgb3RoZXJ3aXNlIHByb3ZpZGVkIGV4cHJlc3MsIHdyaXR0ZW4KICogcGVybWlzc2lvbi4KICoKICogVXNlIG9mIHRoZSBtYXRlcmlhbHMgbWF5IHJlcXVpcmUgYSBsaWNlbnNlIG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eQogKiBmcm9tIGEgdGhpcmQgcGFydHkgb3IgZnJvbSBTeW5hcHRpY3MuIFRoaXMgZmlsZSBjb252ZXlzIG5vIGV4cHJlc3MKICogb3IgaW1wbGllZCBsaWNlbnNlcyB0byBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBiZWxvbmdpbmcKICogdG8gU3luYXB0aWNzLgogKgogKiBJTkZPUk1BVElPTiBDT05UQUlORUQgSU4gVEhJUyBET0NVTUVOVCBJUyBQUk9WSURFRCAiQVMtSVMsIiBBTkQKICogU1lOQVBUSUNTIEVYUFJFU1NMWSBESVNDTEFJTVMgQUxMIEVYUFJFU1MgQU5EIElNUExJRUQgV0FSUkFOVElFUywKICogSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgogKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQU5EIEFOWSBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQgT0YgQU5ZCiAqIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMuIElOIE5PIEVWRU5UIFNIQUxMIFNZTkFQVElDUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBQVU5JVElWRSwgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFCiAqIE9GIFRIRSBJTkZPUk1BVElPTiBDT05UQUlORUQgSU4gVEhJUyBET0NVTUVOVCwgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIEJBU0VEIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKICogTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFORCBFVkVOIElGIFNZTkFQVElDUyBXQVMKICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIElGIEEgVFJJQlVOQUwgT0YKICogQ09NUEVURU5UIEpVUklTRElDVElPTiBET0VTIE5PVCBQRVJNSVQgVEhFIERJU0NMQUlNRVIgT0YgRElSRUNUCiAqIERBTUFHRVMgT1IgQU5ZIE9USEVSIERBTUFHRVMsIFNZTkFQVElDUycgVE9UQUwgQ1VNVUxBVElWRSBMSUFCSUxJVFkKICogVE8gQU5ZIFBBUlRZIFNIQUxMIE5PVCBFWENFRUQgT05FIEhVTkRSRUQgVS5TLiBET0xMQVJTLgogKi8KCi8qCiAqIFZlY3RvciBlbnRyeQogKi8KLm1hY3JvIHZlbnRyeSBsYWJlbAoJLmFsaWduIDcKCWIgXGxhYmVsCi5lbmRtCgovKgogKiBCcmFuY2ggYWNjb3JkaW5nIHRvIGV4Y2VwdGlvbiBsZXZlbAogKi8KLm1hY3JvICBzd2l0Y2hfZWwsIHhyZWcsIGVsM19sYWJlbCwgZWwyX2xhYmVsLCBlbDFfbGFiZWwKCW1ycyAgICAgXHhyZWcsIEN1cnJlbnRFTAoJY21wICAgICBceHJlZywgMHhjCgliLmVxICAgIFxlbDNfbGFiZWwKCWNtcCAgICAgXHhyZWcsIDB4OAoJYi5lcSAgICBcZWwyX2xhYmVsCgljbXAgICAgIFx4cmVnLCAweDQKCWIuZXEgICAgXGVsMV9sYWJlbAouZW5kbQoKLyoKICogRW50ZXIgRXhjZXB0aW9uLgogKiBUaGlzIHdpbGwgc2F2ZSB0aGUgcHJvY2Vzc29yIHN0YXRlIHRoYXQgaXMgRUxSL1gwflgzMAogKiB0byB0aGUgc3RhY2sgZnJhbWUuCiAqLwoubWFjcm8JZXhjZXB0aW9uX2VudHJ5CglzdHAJeDI5LCB4MzAsIFtzcCwgIy0xNl0hCglzdHAJeDI3LCB4MjgsIFtzcCwgIy0xNl0hCglzdHAJeDI1LCB4MjYsIFtzcCwgIy0xNl0hCglzdHAJeDIzLCB4MjQsIFtzcCwgIy0xNl0hCglzdHAJeDIxLCB4MjIsIFtzcCwgIy0xNl0hCglzdHAJeDE5LCB4MjAsIFtzcCwgIy0xNl0hCglzdHAJeDE3LCB4MTgsIFtzcCwgIy0xNl0hCglzdHAJeDE1LCB4MTYsIFtzcCwgIy0xNl0hCglzdHAJeDEzLCB4MTQsIFtzcCwgIy0xNl0hCglzdHAJeDExLCB4MTIsIFtzcCwgIy0xNl0hCglzdHAJeDksIHgxMCwgW3NwLCAjLTE2XSEKCXN0cAl4NywgeDgsIFtzcCwgIy0xNl0hCglzdHAJeDUsIHg2LCBbc3AsICMtMTZdIQoJc3RwCXgzLCB4NCwgW3NwLCAjLTE2XSEKCXN0cAl4MSwgeDIsIFtzcCwgIy0xNl0hCgoJLyogQ291bGQgYmUgcnVubmluZyBhdCBFTDMvRUwyL0VMMSAqLwoJc3dpdGNoX2VsIHgxMSwgM2YsIDJmLCAxZgozOgltcnMJeDEsIGVzcl9lbDMKCW1ycwl4MiwgZWxyX2VsMwoJYgkwZgoyOgltcnMJeDEsIGVzcl9lbDIKCW1ycwl4MiwgZWxyX2VsMgoJYgkwZgoxOgltcnMJeDEsIGVzcl9lbDEKCW1ycwl4MiwgZWxyX2VsMQowOgoJc3RwCXgyLCB4MCwgW3NwLCAjLTE2XSEKCW1vdgl4MCwgc3AKLmVuZG0KCgoubWFjcm8JZXhjZXB0aW9uX2V4aXQKCWxkcAl4MiwgeDAsIFtzcF0sICMxNgoKCS8qIENvdWxkIGJlIHJ1bm5pbmcgYXQgRUwzL0VMMi9FTDEgKi8KCXN3aXRjaF9lbCB4MTEsIDNmLCAyZiwgMWYKMzoJbXNyCWVscl9lbDMsIHgyCgliCTBmCjI6CW1zcgllbHJfZWwyLCB4MgoJYgkwZgoxOgltc3IJZWxyX2VsMSwgeDIKMDoKCWxkcCAgICAgeDEsIHgyLCBbc3BdLCAjMTYKCWxkcCAgICAgeDMsIHg0LCBbc3BdLCAjMTYKCWxkcCAgICAgeDUsIHg2LCBbc3BdLCAjMTYKCWxkcCAgICAgeDcsIHg4LCBbc3BdLCAjMTYKCWxkcCAgICAgeDksIHgxMCwgW3NwXSwgIzE2CglsZHAgICAgIHgxMSwgeDEyLCBbc3BdLCAjMTYKCWxkcCAgICAgeDEzLCB4MTQsIFtzcF0sICMxNgoJbGRwICAgICB4MTUsIHgxNiwgW3NwXSwgIzE2CglsZHAgICAgIHgxNywgeDE4LCBbc3BdLCAjMTYKCWxkcCAgICAgeDE5LCB4MjAsIFtzcF0sICMxNgoJbGRwICAgICB4MjEsIHgyMiwgW3NwXSwgIzE2CglsZHAgICAgIHgyMywgeDI0LCBbc3BdLCAjMTYKCWxkcCAgICAgeDI1LCB4MjYsIFtzcF0sICMxNgoJbGRwICAgICB4MjcsIHgyOCwgW3NwXSwgIzE2CglsZHAgICAgIHgyOSwgeDMwLCBbc3BdLCAjMTYKCWVyZXQKLmVuZG0KCgoKLmdsb2JhbAlleGNlcHRpb25faGFuZGxlcgoJLnNlY3Rpb24JLnZlY3RvcnMsICJheCI7IC5hbGlnbiAxMQpleGNlcHRpb25faGFuZGxlcjoKCXZlbnRyeSBzcDBfc3luYwoJdmVudHJ5IHNwMF9pcnEKCXZlbnRyeSBzcDBfZmlxCgl2ZW50cnkgc3AwX3NlcnJvcgoKCXZlbnRyeSBzcHhfc3luYwoJdmVudHJ5IHNweF9pcnEKCXZlbnRyeSBzcHhfZmlxCgl2ZW50cnkgc3B4X3NlcnJvcgoKCXZlbnRyeSBhNjRfc3luYwoJdmVudHJ5IGE2NF9pcnEKCXZlbnRyeSBhNjRfZmlxCgl2ZW50cnkgYTY0X3NlcnJvcgoKCXZlbnRyeSBhMzJfc3luYwoJdmVudHJ5IGEzMl9pcnEKCXZlbnRyeSBhMzJfZmlxCgl2ZW50cnkgYTMyX3NlcnJvcgoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgKiBDdXJyZW50IEVMIHdpdGggU1AwIDogMHgwIC0gMHgyMDAKCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgKi8Kc3AwX3N5bmM6CgliCXBhbmljCgpzcDBfaXJxOgoJYglwYW5pYwoKc3AwX2ZpcToKCWIJcGFuaWMKCnNwMF9zZXJyb3I6CgliCXBhbmljCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAqIEN1cnJlbnQgRUwgd2l0aCBTUHg6IDB4MjAwIC0gMHg0MDAKCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgKi8Kc3B4X3N5bmM6CgliCXN5bmNfaGFuZGxlCgpzcHhfaXJxOgoJZXhjZXB0aW9uX2VudHJ5CglibAlkb19pcnEKCWV4Y2VwdGlvbl9leGl0CgpzcHhfZmlxOgoJYglwYW5pYwoKc3B4X3NlcnJvcjoKCWIJcGFuaWMKCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICogTG93ZXIgRUwgdXNpbmcgQUFyY2g2NCA6IDB4NDAwIC0gMHg2MDAKCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgKi8KYTY0X3N5bmM6CgliCXN5bmNfaGFuZGxlCgphNjRfaXJxOgoJYglwYW5pYwoKYTY0X2ZpcToKCWIJcGFuaWMKCmE2NF9zZXJyb3I6CgliCXBhbmljCgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAqIExvd2VyIEVMIHVzaW5nIEFBcmNoMzIgOiAweDYwMCAtIDB4ODAwCgkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICovCmEzMl9zeW5jOgoJYglwYW5pYwoKYTMyX2lycToKCWIJcGFuaWMKCmEzMl9maXE6CgliCXBhbmljCgphMzJfc2Vycm9yOgoJYglwYW5pYwoKcGFuaWM6CgliCXBhbmljCgpzeW5jX2hhbmRsZToJCS8vIDB4NDAwOiBTeW5jaHJvbm91cwoJZXhjZXB0aW9uX2VudHJ5Cglzd2l0Y2hfZWwgeDExLCBlbDNfc3luYywgZWwyX3N5bmMsIHBhbmljCglleGNlcHRpb25fZXhpdAoKZWwzX3N5bmM6CgltcnMJeDEsIGVzcl9lbDMKCXViZngJeDIsIHgxLCAyNiwgNgkvLyBFQywgYml0cyBbMzE6MjZdCgljbXAJeDIsICMweDEzCgliZXEJX3NtY19oYW5kbGUJLy8gU01DIGZyb20gQUFyY2gzMgoJY21wCXgyLCAjMHgxNwoJYmVxCV9zbWNfaGFuZGxlCgliCWRvX3N5bmMKCl9zbWNfaGFuZGxlOgoJTERQCXgyLCB4MCwgW3NwXQkvLyBTTUMgcGFyYW1ldGVyIGZyb20geDAKCgkvLyBzZXQgTlMKCW1ycwl4MSwgc2NyX2VsMwoJYmljCXgxLCB4MSwgIzEKCXViZngJeDIsIHgwLCAjNSwgIzEKCW9ycgl4MSwgeDEsIHgyCgltc3IJc2NyX2VsMywgeDEKCgkvLyBzZXQgTVs0OjBdCgltcnMJeDEsIHNwc3JfZWwzCgliaWMJeDEsIHgxLCAjMHgxZgoJYW5kCXgyLCB4MCwgIzB4MWYKCW9ycgl4MSwgeDEsIHgyCgltc3IJc3Bzcl9lbDMsIHgxCgoJZXhjZXB0aW9uX2V4aXQKCmVsMl9zeW5jOgoJbXJzCXgxLCBlc3JfZWwyCmxvb3AxOgoJYglsb29wMQoJLy9iCWRvX3N5bmMK