LyoKICogQ29weXJpZ2h0IChDKSAxOTk4LTE5OTkgRnJhbudvaXMgR291Z2V0CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpbmNsdWRlICJycGMuaCIKI2luY2x1ZGUgInJwY25kci5oIgoKI2lmbmRlZiBfT0JKQkFTRV9IXwojZGVmaW5lIF9PQkpCQVNFX0hfCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogZGVmaW5lIElDT01fTVNWVEFCTEVfQ09NUEFUCiAqIHRvIGltcGxlbWVudCB0aGUgbWljcm9zb2Z0IGNvbSB2dGFibGUgY29tcGF0aWJpbGl0eSB3b3JrYXJvdW5kIGZvciBnKysuCiAqCiAqIE5PVEU6IFR1cm5pbmcgdGhpcyBvcHRpb24gb24gd2lsbCBwcm9kdWNlIGEgd2luZWxpYiB0aGF0IGlzIGluY29tcGF0aWJsZQogKiB3aXRoIHRoZSBiaW5hcnkgZW11bGF0b3IuCiAqCiAqIElmIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgY29tX2ludGVyZmFjZSBhdHRyaWJ1dGUsIGxlYXZlIHRoaXMgb2ZmLCBhbmQKICogZGVmaW5lIHRoZSBJQ09NX1VTRV9DT01fSU5URVJGQUNFX0FUVFJJQlVURSBtYWNybyBiZWxvdy4gVGhpcyBtYXkgYWxzbwogKiByZXF1aXJlIHRoZSBhZGRpdGlvbiBvZiB0aGUgLXZ0YWJsZS10aHVua3Mgb3B0aW9uIGZvciBnKysuCiAqCiAqIElmIHlvdSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiBXaW5lbGliIEMrKyBjb21wYXRpYmlsaXR5IGF0IGFsbCwgbGVhdmUgYm90aAogKiBvcHRpb25zIG9mZi4KICoKICogVGhlIHByZWZlcmFibGUgbWV0aG9kIGZvciB1c2luZyBJQ09NX1VTRV9DT01fSU5URVJGQUNFX0FUVFJJQlVURSBtYWNybwogKiB3b3VsZCBiZSB0byBkZWZpbmUgaXQgb25seSBmb3IgeW91ciBXaW5lbGliIGFwcGxpY2F0aW9uLiBUaGlzIGFsbG93cyB5b3UKICogdG8gaGF2ZSBib3RoIGJpbmFyeSBhbmQgV2luZWxpYiBjb21wYXRpYmlsaXR5IGZvciBDIGFuZCBDKysgYXQgdGhlIHNhbWUKICogdGltZSA6KQogKi8KLyogI2RlZmluZSBJQ09NX01TVlRBQkxFX0NPTVBBVCAxICovCi8qICNkZWZpbmUgSUNPTV9VU0VfQ09NX0lOVEVSRkFDRV9BVFRSSUJVVEUgMSAqLwoKI2luY2x1ZGUgIm9iamlkbC5oIgoKI2lmbmRlZiBSQ19JTlZPS0VECi8qIEZvciBjb21wYXRpYmlsaXR5IG9ubHksIGF0IGxlYXN0IGZvciBub3cgKi8KI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKCiNpZm5kZWYgSU5JVEdVSUQKI2luY2x1ZGUgImNndWlkLmgiCiNlbmRpZgoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYKCiNpZm5kZWYgTk9OQU1FTEVTU1NUUlVDVAojZGVmaW5lIExJU2V0MzIobGksIHYpICAgKChsaSkuSGlnaFBhcnQgPSAodikgPCAwID8gLTEgOiAwLCAobGkpLkxvd1BhcnQgPSAodikpCiNkZWZpbmUgVUxJU2V0MzIobGksIHYpICAoKGxpKS5IaWdoUGFydCA9IDAsIChsaSkuTG93UGFydCA9ICh2KSkKI2Vsc2UKI2RlZmluZSBMSVNldDMyKGxpLCB2KSAgICgobGkpLnMuSGlnaFBhcnQgPSAodikgPCAwID8gLTEgOiAwLCAobGkpLnMuTG93UGFydCA9ICh2KSkKI2RlZmluZSBVTElTZXQzMihsaSwgdikgICgobGkpLnMuSGlnaFBhcnQgPSAwLCAobGkpLnMuTG93UGFydCA9ICh2KSkKI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU3RhbmRhcmQgQVBJCiAqLwpEV09SRCBXSU5BUEkgQ29CdWlsZFZlcnNpb24odm9pZCk7Cgp0eXBlZGVmIGVudW0gdGFnQ09JTklUCnsKICAgIENPSU5JVF9BUEFSVE1FTlRUSFJFQURFRCAgPSAweDIsIC8qIEFwYXJ0bWVudCBtb2RlbCAqLwogICAgQ09JTklUX01VTFRJVEhSRUFERUQgICAgICA9IDB4MCwgLyogT0xFIGNhbGxzIG9iamVjdHMgb24gYW55IHRocmVhZCAqLwogICAgQ09JTklUX0RJU0FCTEVfT0xFMURERSAgICA9IDB4NCwgLyogRG9uJ3QgdXNlIERERSBmb3IgT2xlMSBzdXBwb3J0ICovCiAgICBDT0lOSVRfU1BFRURfT1ZFUl9NRU1PUlkgID0gMHg4ICAvKiBUcmFkZSBtZW1vcnkgZm9yIHNwZWVkICovCn0gQ09JTklUOwoKSFJFU1VMVCBXSU5BUEkgQ29Jbml0aWFsaXplKExQVk9JRCBscFJlc2VydmVkKTsKSFJFU1VMVCBXSU5BUEkgQ29Jbml0aWFsaXplRXgoTFBWT0lEIGxwUmVzZXJ2ZWQsIERXT1JEIGR3Q29Jbml0KTsKdm9pZCBXSU5BUEkgQ29VbmluaXRpYWxpemUodm9pZCk7CkRXT1JEIFdJTkFQSSBDb0dldEN1cnJlbnRQcm9jZXNzKHZvaWQpOwoKSElOU1RBTkNFIFdJTkFQSSBDb0xvYWRMaWJyYXJ5KExQT0xFU1RSIGxwc3pMaWJOYW1lLCBCT09MIGJBdXRvRnJlZSk7CnZvaWQgV0lOQVBJIENvRnJlZUFsbExpYnJhcmllcyh2b2lkKTsKdm9pZCBXSU5BUEkgQ29GcmVlTGlicmFyeShISU5TVEFOQ0UgaExpYnJhcnkpOwp2b2lkIFdJTkFQSSBDb0ZyZWVVbnVzZWRMaWJyYXJpZXModm9pZCk7CgpIUkVTVUxUIFdJTkFQSSBDb0NyZWF0ZUluc3RhbmNlKFJFRkNMU0lEIHJjbHNpZCwgTFBVTktOT1dOIHBVbmtPdXRlciwgRFdPUkQgZHdDbHNDb250ZXh0LCBSRUZJSUQgaWlkLCBMUFZPSUQgKnBwdik7CkhSRVNVTFQgV0lOQVBJIENvQ3JlYXRlSW5zdGFuY2VFeChSRUZDTFNJRCAgICAgIHJjbHNpZCwKCQkJCSAgTFBVTktOT1dOICAgICBwVW5rT3V0ZXIsCgkJCQkgIERXT1JEICAgICAgICAgZHdDbHNDb250ZXh0LAoJCQkJICBDT1NFUlZFUklORk8qIHBTZXJ2ZXJJbmZvLAoJCQkJICBVTE9ORyAgICAgICAgIGNtcSwKCQkJCSAgTVVMVElfUUkqICAgICBwUmVzdWx0cyk7CgpIUkVTVUxUIFdJTkFQSSBDb0dldEluc3RhbmNlRnJvbUZpbGUoQ09TRVJWRVJJTkZPKiBwU2VydmVySW5mbywgQ0xTSUQqIHBDbHNpZCwgSVVua25vd24qIHB1bmtPdXRlciwgRFdPUkQgZHdDbHNDdHgsIERXT1JEIGdyZk1vZGUsIE9MRUNIQVIqIHB3c3pOYW1lLCBEV09SRCBkd0NvdW50LCBNVUxUSV9RSSogcFJlc3VsdHMpOwpIUkVTVUxUIFdJTkFQSSBDb0dldEluc3RhbmNlRnJvbUlTdG9yYWdlKENPU0VSVkVSSU5GTyogcFNlcnZlckluZm8sIENMU0lEKiBwQ2xzaWQsIElVbmtub3duKiBwdW5rT3V0ZXIsIERXT1JEIGR3Q2xzQ3R4LCBJU3RvcmFnZSogcHN0ZywgRFdPUkQgZHdDb3VudCwgTVVMVElfUUkqIHBSZXN1bHRzKTsKCkhSRVNVTFQgV0lOQVBJIENvR2V0TWFsbG9jKERXT1JEIGR3TWVtQ29udGV4dCwgTFBNQUxMT0MqIGxwTWFsbG9jKTsKTFBWT0lEIFdJTkFQSSBDb1Rhc2tNZW1BbGxvYyhVTE9ORyBzaXplKTsKdm9pZCBXSU5BUEkgQ29UYXNrTWVtRnJlZShMUFZPSUQgcHRyKTsKTFBWT0lEIFdJTkFQSSBDb1Rhc2tNZW1SZWFsbG9jKExQVk9JRCBwdHIsIFVMT05HIHNpemUpOwoKSFJFU1VMVCBXSU5BUEkgQ29SZWdpc3Rlck1hbGxvY1NweShMUE1BTExPQ1NQWSBwTWFsbG9jU3B5KTsKSFJFU1VMVCBXSU5BUEkgQ29SZXZva2VNYWxsb2NTcHkodm9pZCk7CgovKiBjbGFzcyByZWdpc3RyYXRpb24gZmxhZ3M7IHBhc3NlZCB0byBDb1JlZ2lzdGVyQ2xhc3NPYmplY3QgKi8KdHlwZWRlZiBlbnVtIHRhZ1JFR0NMUwp7CiAgICBSRUdDTFNfU0lOR0xFVVNFID0gMCwKICAgIFJFR0NMU19NVUxUSVBMRVVTRSA9IDEsCiAgICBSRUdDTFNfTVVMVElfU0VQQVJBVEUgPSAyLAogICAgUkVHQ0xTX1NVU1BFTkRFRCA9IDQKfSBSRUdDTFM7CgpIUkVTVUxUIFdJTkFQSSBDb0dldENsYXNzT2JqZWN0KFJFRkNMU0lEIHJjbHNpZCwgRFdPUkQgZHdDbHNDb250ZXh0LCBDT1NFUlZFUklORk8gKnBTZXJ2ZXJJbmZvLCBSRUZJSUQgaWlkLCBMUFZPSUQgKnBwdik7CkhSRVNVTFQgV0lOQVBJIENvUmVnaXN0ZXJDbGFzc09iamVjdChSRUZDTFNJRCByY2xzaWQsTFBVTktOT1dOIHBVbmssRFdPUkQgZHdDbHNDb250ZXh0LERXT1JEIGZsYWdzLExQRFdPUkQgbHBkd1JlZ2lzdGVyKTsKSFJFU1VMVCBXSU5BUEkgQ29SZXZva2VDbGFzc09iamVjdChEV09SRCBkd1JlZ2lzdGVyKTsKSFJFU1VMVCBXSU5BUEkgQ29HZXRQU0Nsc2lkKFJFRklJRCByaWlkLENMU0lEICpwY2xzaWQpOwpIUkVTVUxUIFdJTkFQSSBDb1JlZ2lzdGVyUFNDbHNpZChSRUZJSUQgcmlpZCwgUkVGQ0xTSUQgcmNsc2lkKTsKSFJFU1VMVCBXSU5BUEkgQ29TdXNwZW5kQ2xhc3NPYmplY3RzKHZvaWQpOwpIUkVTVUxUIFdJTkFQSSBDb1Jlc3VtZUNsYXNzT2JqZWN0cyh2b2lkKTsKVUxPTkcgV0lOQVBJIENvQWRkUmVmU2VydmVyUHJvY2Vzcyh2b2lkKTsKSFJFU1VMVCBXSU5BUEkgQ29SZWxlYXNlU2VydmVyUHJvY2Vzcyh2b2lkKTsKCi8qIG1hcnNoYWxsaW5nICovCkhSRVNVTFQgV0lOQVBJIENvQ3JlYXRlRnJlZVRocmVhZGVkTWFyc2hhbGVyKExQVU5LTk9XTiBwdW5rT3V0ZXIsIExQVU5LTk9XTiogcHB1bmtNYXJzaGFsKTsKSFJFU1VMVCBXSU5BUEkgQ29HZXRJbnRlcmZhY2VBbmRSZWxlYXNlU3RyZWFtKExQU1RSRUFNIHBTdG0sIFJFRklJRCBpaWQsIExQVk9JRCogcHB2KTsKSFJFU1VMVCBXSU5BUEkgQ29HZXRNYXJzaGFsU2l6ZU1heChVTE9ORyogcHVsU2l6ZSwgUkVGSUlEIHJpaWQsIExQVU5LTk9XTiBwVW5rLCBEV09SRCBkd0Rlc3RDb250ZXh0LCBMUFZPSUQgcHZEZXN0Q29udGV4dCwgRFdPUkQgbXNobGZsYWdzKTsKSFJFU1VMVCBXSU5BUEkgQ29HZXRTdGFuZGFyZE1hcnNoYWwoUkVGSUlEIHJpaWQsIExQVU5LTk9XTiBwVW5rLCBEV09SRCBkd0Rlc3RDb250ZXh0LCBMUFZPSUQgcHZEZXN0Q29udGV4dCwgRFdPUkQgbXNobGZsYWdzLCBMUE1BUlNIQUwqIHBwTWFyc2hhbCk7CkhSRVNVTFQgV0lOQVBJIENvTWFyc2hhbEhyZXN1bHQoTFBTVFJFQU0gcHN0bSwgSFJFU1VMVCBocmVzdWx0KTsKSFJFU1VMVCBXSU5BUEkgQ29NYXJzaGFsSW50ZXJmYWNlKExQU1RSRUFNIHBTdG0sIFJFRklJRCByaWlkLCBMUFVOS05PV04gcFVuaywgRFdPUkQgZHdEZXN0Q29udGV4dCwgTFBWT0lEIHB2RGVzdENvbnRleHQsIERXT1JEIG1zaGxmbGFncyk7CkhSRVNVTFQgV0lOQVBJIENvTWFyc2hhbEludGVyVGhyZWFkSW50ZXJmYWNlSW5TdHJlYW0oUkVGSUlEIHJpaWQsIExQVU5LTk9XTiBwVW5rLCBMUFNUUkVBTSogcHBTdG0pOwpIUkVTVUxUIFdJTkFQSSBDb1JlbGVhc2VNYXJzaGFsRGF0YShMUFNUUkVBTSBwU3RtKTsKSFJFU1VMVCBXSU5BUEkgQ29Vbm1hcnNoYWxIcmVzdWx0KExQU1RSRUFNIHBzdG0sIEhSRVNVTFQqIHBocmVzdWx0KTsKSFJFU1VMVCBXSU5BUEkgQ29Vbm1hcnNoYWxJbnRlcmZhY2UoTFBTVFJFQU0gcFN0bSwgUkVGSUlEIHJpaWQsIExQVk9JRCogcHB2KTsKSFJFU1VMVCBXSU5BUEkgQ29Mb2NrT2JqZWN0RXh0ZXJuYWwoTFBVTktOT1dOIHBVbmssIEJPT0wgZkxvY2ssIEJPT0wgZkxhc3RVbmxvY2tSZWxlYXNlcyk7CkJPT0wgV0lOQVBJIENvSXNIYW5kbGVyQ29ubmVjdGVkKExQVU5LTk9XTiBwVW5rKTsKCi8qIHNlY3VyaXR5ICovCkhSRVNVTFQgV0lOQVBJIENvSW5pdGlhbGl6ZVNlY3VyaXR5KFBTRUNVUklUWV9ERVNDUklQVE9SIHBTZWNEZXNjLCBMT05HIGNBdXRoU3ZjLCBTT0xFX0FVVEhFTlRJQ0FUSU9OX1NFUlZJQ0UqIGFzQXV0aFN2Yywgdm9pZCogcFJlc2VydmVkMSwgRFdPUkQgZHdBdXRobkxldmVsLCBEV09SRCBkd0ltcExldmVsLCB2b2lkKiBwUmVzZXJ2ZWQyLCBEV09SRCBkd0NhcGFiaWxpdGllcywgdm9pZCogcFJlc2VydmVkMyk7CkhSRVNVTFQgV0lOQVBJIENvR2V0Q2FsbENvbnRleHQoUkVGSUlEIHJpaWQsIHZvaWQqKiBwcEludGVyZmFjZSk7CkhSRVNVTFQgV0lOQVBJIENvUXVlcnlBdXRoZW50aWNhdGlvblNlcnZpY2VzKERXT1JEKiBwY0F1dGhTdmMsIFNPTEVfQVVUSEVOVElDQVRJT05fU0VSVklDRSoqIGFzQXV0aFN2Yyk7CgpIUkVTVUxUIFdJTkFQSSBDb1F1ZXJ5UHJveHlCbGFua2V0KElVbmtub3duKiBwUHJveHksIERXT1JEKiBwd0F1dGhuU3ZjLCBEV09SRCogcEF1dGh6U3ZjLCBPTEVDSEFSKiogcFNlcnZlclByaW5jTmFtZSwgRFdPUkQqIHBBdXRobkxldmVsLCBEV09SRCogcEltcExldmVsLCBSUENfQVVUSF9JREVOVElUWV9IQU5ETEUqIHBBdXRoSW5mbywgRFdPUkQqIHBDYXBhYmlsaXRlcyk7CkhSRVNVTFQgV0lOQVBJIENvU2V0UHJveHlCbGFua2V0KElVbmtub3duKiBwUHJveHksIERXT1JEIGR3QXV0aG5TdmMsIERXT1JEIGR3QXV0aHpTdmMsIE9MRUNIQVIqIHBTZXJ2ZXJQcmluY05hbWUsIERXT1JEIGR3QXV0aG5MZXZlbCwgRFdPUkQgZHdJbXBMZXZlbCwgUlBDX0FVVEhfSURFTlRJVFlfSEFORExFIHBBdXRoSW5mbywgRFdPUkQgZHdDYXBhYmlsaXRpZXMpOwpIUkVTVUxUIFdJTkFQSSBDb0NvcHlQcm94eShJVW5rbm93biogcFByb3h5LCBJVW5rbm93bioqIHBwQ29weSk7CgpIUkVTVUxUIFdJTkFQSSBDb0ltcGVyc29uYXRlQ2xpZW50KHZvaWQpOwpIUkVTVUxUIFdJTkFQSSBDb1F1ZXJ5Q2xpZW50QmxhbmtldChEV09SRCogcEF1dGhuU3ZjLCBEV09SRCogcEF1dGh6U3ZjLCBPTEVDSEFSMTYqKiBwU2VydmVyUHJpbmNOYW1lLCBEV09SRCogcEF1dGhuTGV2ZWwsIERXT1JEKiBwSW1wTGV2ZWwsIFJQQ19BVVRIWl9IQU5ETEUqIHBQcml2cywgRFdPUkQqIHBDYXBhYmlsaXRpZXMpOwpIUkVTVUxUIFdJTkFQSSBDb1JldmVydFRvU2VsZih2b2lkKTsKCi8qIG1pc2MgKi8KSFJFU1VMVCBXSU5BUEkgQ29HZXRUcmVhdEFzQ2xhc3MoUkVGQ0xTSUQgY2xzaWRPbGQsIExQQ0xTSUQgcENsc2lkTmV3KTsKSFJFU1VMVCBXSU5BUEkgQ29UcmVhdEFzQ2xhc3MoUkVGQ0xTSUQgY2xzaWRPbGQsIFJFRkNMU0lEIGNsc2lkTmV3KTsKCkhSRVNVTFQgV0lOQVBJIENvQ3JlYXRlR3VpZChHVUlEKiBwZ3VpZCk7CkJPT0wgV0lOQVBJIENvSXNPbGUxQ2xhc3MoUkVGQ0xTSUQgcmNsc2lkKTsKCkJPT0wgV0lOQVBJIENvRG9zRGF0ZVRpbWVUb0ZpbGVUaW1lKFdPUkQgbkRvc0RhdGUsIFdPUkQgbkRvc1RpbWUsIEZJTEVUSU1FKiBscEZpbGVUaW1lKTsKQk9PTCBXSU5BUEkgQ29GaWxlVGltZVRvRG9zRGF0ZVRpbWUoRklMRVRJTUUqIGxwRmlsZVRpbWUsIFdPUkQqIGxwRG9zRGF0ZSwgV09SRCogbHBEb3NUaW1lKTsKSFJFU1VMVCBXSU5BUEkgQ29GaWxlVGltZU5vdyhGSUxFVElNRSogbHBGaWxlVGltZSk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR1VJRCBBUEkKICovCkhSRVNVTFQgV0lOQVBJIFN0cmluZ0Zyb21DTFNJRDE2KFJFRkNMU0lEIGlkLCBMUE9MRVNUUjE2Kik7CkhSRVNVTFQgV0lOQVBJIFN0cmluZ0Zyb21DTFNJRChSRUZDTFNJRCBpZCwgTFBPTEVTVFIqKTsKCkhSRVNVTFQgV0lOQVBJIENMU0lERnJvbVN0cmluZzE2KExQQ09MRVNUUjE2LCBDTFNJRCAqKTsKSFJFU1VMVCBXSU5BUEkgQ0xTSURGcm9tU3RyaW5nKExQQ09MRVNUUiwgQ0xTSUQgKik7CgpIUkVTVUxUIFdJTkFQSSBDTFNJREZyb21Qcm9nSUQxNihMUENPTEVTVFIxNiBwcm9naWQsIExQQ0xTSUQgcmlpZCk7CkhSRVNVTFQgV0lOQVBJIENMU0lERnJvbVByb2dJRChMUENPTEVTVFIgcHJvZ2lkLCBMUENMU0lEIHJpaWQpOwoKSFJFU1VMVCBXSU5BUEkgUHJvZ0lERnJvbUNMU0lEKFJFRkNMU0lEIGNsc2lkLCBMUE9MRVNUUiAqbHBscHN6UHJvZ0lEKTsKCklOVCBXSU5BUEkgU3RyaW5nRnJvbUdVSUQyKFJFRkdVSUQgaWQsIExQT0xFU1RSIHN0ciwgSU5UIGNtYXgpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUNPTSBTZXJ2ZXIgZGxsIC0gZXhwb3J0cwogKi8KSFJFU1VMVCBXSU5BUEkgRGxsR2V0Q2xhc3NPYmplY3QoUkVGQ0xTSUQgcmNsc2lkLCBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2KTsKSFJFU1VMVCBXSU5BUEkgRGxsQ2FuVW5sb2FkTm93KHZvaWQpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCURhdGEgT2JqZWN0CiAqLwpIUkVTVUxUIFdJTkFQSSBDcmVhdGVEYXRhQWR2aXNlSG9sZGVyKExQREFUQUFEVklTRUhPTERFUiogcHBEQUhvbGRlcik7CkhSRVNVTFQgV0lOQVBJIENyZWF0ZURhdGFDYWNoZShMUFVOS05PV04gcFVua091dGVyLCBSRUZDTFNJRCByY2xzaWQsIFJFRklJRCBpaWQsIExQVk9JRCogcHB2KTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglNb25pa2VyIEFQSQogKi8KSFJFU1VMVCBXSU5BUEkgR2V0Q2xhc3NGaWxlKExQQ09MRVNUUiBmaWxlUGF0aE5hbWUsQ0xTSUQgKnBjbHNpZCk7CgpIUkVTVUxUIFdJTkFQSSBDcmVhdGVCaW5kQ3R4MTYoRFdPUkQgcmVzZXJ2ZWQsIExQQkMqIHBwYmMpOwpIUkVTVUxUIFdJTkFQSSBDcmVhdGVCaW5kQ3R4KERXT1JEIHJlc2VydmVkLCBMUEJDKiBwcGJjKTsKCkhSRVNVTFQgV0lOQVBJIENyZWF0ZUZpbGVNb25pa2VyMTYoTFBDT0xFU1RSMTYgbHBzelBhdGhOYW1lLCBMUE1PTklLRVIqIHBwbWspOwpIUkVTVUxUIFdJTkFQSSBDcmVhdGVGaWxlTW9uaWtlcihMUENPTEVTVFIgbHBzelBhdGhOYW1lLCBMUE1PTklLRVIqIHBwbWspOwoKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlSXRlbU1vbmlrZXIxNihMUENPTEVTVFIxNiBscHN6RGVsaW0sIExQQ09MRVNUUiAgbHBzekl0ZW0sIExQTU9OSUtFUiogcHBtayk7CkhSRVNVTFQgV0lOQVBJIENyZWF0ZUl0ZW1Nb25pa2VyKExQQ09MRVNUUiBscHN6RGVsaW0sIExQQ09MRVNUUiAgbHBzekl0ZW0sIExQTU9OSUtFUiogcHBtayk7CgpIUkVTVUxUIFdJTkFQSSBDcmVhdGVBbnRpTW9uaWtlcihMUE1PTklLRVIgKiBwcG1rKTsKCkhSRVNVTFQgV0lOQVBJIENyZWF0ZUdlbmVyaWNDb21wb3NpdGUoTFBNT05JS0VSIHBta0ZpcnN0LCBMUE1PTklLRVIgcG1rUmVzdCwgTFBNT05JS0VSKiBwcG1rQ29tcG9zaXRlKTsKCkhSRVNVTFQgV0lOQVBJIEJpbmRNb25pa2VyKExQTU9OSUtFUiBwbWssIERXT1JEIGdyZk9wdCwgUkVGSUlEIGlpZFJlc3VsdCwgTFBWT0lEKiBwcHZSZXN1bHQpOwoKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlQ2xhc3NNb25pa2VyKFJFRkNMU0lEIHJjbHNpZCwgTFBNT05JS0VSKiBwcG1rKTsKCkhSRVNVTFQgV0lOQVBJIENyZWF0ZVBvaW50ZXJNb25pa2VyKExQVU5LTk9XTiBwdW5rLCBMUE1PTklLRVIqIHBwbWspOwoKSFJFU1VMVCBXSU5BUEkgTW9uaWtlckNvbW1vblByZWZpeFdpdGgoSU1vbmlrZXIqIHBta1RoaXMsSU1vbmlrZXIqIHBta090aGVyLElNb25pa2VyKiogcHBta0NvbW1vbik7CgpIUkVTVUxUIFdJTkFQSSBHZXRSdW5uaW5nT2JqZWN0VGFibGUoRFdPUkQgcmVzZXJ2ZWQsIExQUlVOTklOR09CSkVDVFRBQkxFICpwcHJvdCk7CkhSRVNVTFQgV0lOQVBJIEdldFJ1bm5pbmdPYmplY3RUYWJsZTE2KERXT1JEIHJlc2VydmVkLCBMUFJVTk5JTkdPQkpFQ1RUQUJMRSAqcHByb3QpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVN0b3JhZ2UgQVBJCiAqLwojZGVmaW5lIFNUR01fRElSRUNUCQkweDAwMDAwMDAwCiNkZWZpbmUgU1RHTV9UUkFOU0FDVEVECQkweDAwMDEwMDAwCiNkZWZpbmUgU1RHTV9TSU1QTEUJCTB4MDgwMDAwMDAKI2RlZmluZSBTVEdNX1JFQUQJCTB4MDAwMDAwMDAKI2RlZmluZSBTVEdNX1dSSVRFCQkweDAwMDAwMDAxCiNkZWZpbmUgU1RHTV9SRUFEV1JJVEUJCTB4MDAwMDAwMDIKI2RlZmluZSBTVEdNX1NIQVJFX0RFTllfTk9ORQkweDAwMDAwMDQwCiNkZWZpbmUgU1RHTV9TSEFSRV9ERU5ZX1JFQUQJMHgwMDAwMDAzMAojZGVmaW5lIFNUR01fU0hBUkVfREVOWV9XUklURQkweDAwMDAwMDIwCiNkZWZpbmUgU1RHTV9TSEFSRV9FWENMVVNJVkUJMHgwMDAwMDAxMAojZGVmaW5lIFNUR01fUFJJT1JJVFkJCTB4MDAwNDAwMDAKI2RlZmluZSBTVEdNX0RFTEVURU9OUkVMRUFTRQkweDA0MDAwMDAwCiNkZWZpbmUgU1RHTV9DUkVBVEUJCTB4MDAwMDEwMDAKI2RlZmluZSBTVEdNX0NPTlZFUlQJCTB4MDAwMjAwMDAKI2RlZmluZSBTVEdNX0ZBSUxJRlRIRVJFCTB4MDAwMDAwMDAKI2RlZmluZSBTVEdNX05PU0NSQVRDSAkJMHgwMDEwMDAwMAojZGVmaW5lIFNUR01fTk9TTkFQU0hPVAkJMHgwMDIwMDAwMAoKSFJFU1VMVCBXSU5BUEkgU3RnQ3JlYXRlRG9jRmlsZTE2KExQQ09MRVNUUjE2IHB3Y3NOYW1lLERXT1JEIGdyZk1vZGUsRFdPUkQgcmVzZXJ2ZWQsSVN0b3JhZ2UxNiAqKnBwc3RnT3Blbik7CkhSRVNVTFQgV0lOQVBJIFN0Z0NyZWF0ZURvY2ZpbGUoTFBDT0xFU1RSIHB3Y3NOYW1lLERXT1JEIGdyZk1vZGUsRFdPUkQgcmVzZXJ2ZWQsSVN0b3JhZ2UgKipwcHN0Z09wZW4pOwoKSFJFU1VMVCBXSU5BUEkgU3RnSXNTdG9yYWdlRmlsZTE2KExQQ09MRVNUUjE2IGZuKTsKSFJFU1VMVCBXSU5BUEkgU3RnSXNTdG9yYWdlRmlsZShMUENPTEVTVFIgZm4pOwpIUkVTVUxUIFdJTkFQSSBTdGdJc1N0b3JhZ2VJTG9ja0J5dGVzKElMb2NrQnl0ZXMgKnBsa2J5dCk7CgpIUkVTVUxUIFdJTkFQSSBTdGdPcGVuU3RvcmFnZTE2KGNvbnN0IE9MRUNIQVIxNiogcHdjc05hbWUsSVN0b3JhZ2UxNiogcHN0Z1ByaW9yaXR5LERXT1JEIGdyZk1vZGUsU05CMTYgc25iRXhjbHVkZSxEV09SRCByZXNlcnZlZCxJU3RvcmFnZTE2KipwcHN0Z09wZW4pOwpIUkVTVUxUIFdJTkFQSSBTdGdPcGVuU3RvcmFnZShjb25zdCBPTEVDSEFSKiBwd2NzTmFtZSxJU3RvcmFnZSogcHN0Z1ByaW9yaXR5LERXT1JEIGdyZk1vZGUsU05CIHNuYkV4Y2x1ZGUsRFdPUkQgcmVzZXJ2ZWQsSVN0b3JhZ2UqKnBwc3RnT3Blbik7CgpIUkVTVUxUIFdJTkFQSSBXcml0ZUNsYXNzU3RnKElTdG9yYWdlKiBwU3RnLCBSRUZDTFNJRCByY2xzaWQpOwpIUkVTVUxUIFdJTkFQSSBSZWFkQ2xhc3NTdGcoSVN0b3JhZ2UgKnBzdGcsQ0xTSUQgKnBjbHNpZCk7CgpIUkVTVUxUIFdJTkFQSSBTdGdDcmVhdGVEb2NmaWxlT25JTG9ja0J5dGVzKElMb2NrQnl0ZXMgKnBsa2J5dCxEV09SRCBncmZNb2RlLCBEV09SRCByZXNlcnZlZCwgSVN0b3JhZ2UqKiBwcHN0Z09wZW4pOwpIUkVTVUxUIFdJTkFQSSBTdGdPcGVuU3RvcmFnZU9uSUxvY2tCeXRlcyhJTG9ja0J5dGVzICpwbGtieXQsIElTdG9yYWdlICpwc3RnUHJpb3JpdHksIERXT1JEIGdyZk1vZGUsIFNOQiBzbmJFeGNsdWRlLCBEV09SRCByZXNlcnZlZCwgSVN0b3JhZ2UgKipwcHN0Z09wZW4pOwoKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTWFjcm9zIHRvIGRlZmluZSBhIENPTSBpbnRlcmZhY2UKICovCi8qCiAqIFRoZSBnb2FsIG9mIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGRlZmluaXRpb25zIGlzIHRvIHByb3ZpZGUgYSB3YXkgdG8gdXNlIHRoZSBzYW1lCiAqIGhlYWRlciBmaWxlIGRlZmluaXRpb25zIHRvIHByb3ZpZGUgYm90aCBhIEMgaW50ZXJmYWNlIGFuZCBhIEMrKyBvYmplY3Qgb3JpZW50ZWQKICogaW50ZXJmYWNlIHRvIENPTSBpbnRlcmZhY2VzLiBUaGUgdHlwZSBvZiBpbnRlcmZhY2UgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseQogKiBkZXBlbmRpbmcgb24gdGhlIGxhbmd1YWdlIGJ1dCBpdCBpcyBhbHdheXMgcG9zc2libGUgdG8gZ2V0IHRoZSBDIGludGVyZmFjZSBpbiBDKysKICogYnkgZGVmaW5pbmcgQ0lOVEVSRkFDRS4KICoKICogSXQgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBhc3N1bXB0aW9uczoKICogIC0gYWxsIENPTSBpbnRlcmZhY2VzIGRlcml2ZSBmcm9tIElVbmtub3duLCB0aGlzIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtLgogKiAgLSB0aGUgaGVhZGVyIGZpbGUgb25seSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UsIHRoZSBhY3R1YWwgZmllbGRzIGFyZSBkZWZpbmVkCiAqICAgIHNlcGFyYXRlbHkgaW4gdGhlIEMgZmlsZSBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZS4KICoKICogVGhlIG5hdHVyYWwgYXBwcm9hY2ggdG8gdGhpcyBwcm9ibGVtIHdvdWxkIGJlIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgYSBDKysgY2xhc3MgYW5kCiAqIHZpcnR1YWwgbWV0aG9kcyBpbiBDKysgYW5kIGEgc3RydWN0dXJlIHdpdGggYSB0YWJsZSBvZiBwb2ludGVyIHRvIGZ1bmN0aW9ucyBpbiBDLgogKiBVbmZvcnR1bmF0ZWx5IHRoZSBsYXlvdXQgb2YgdGhlIHZpcnR1YWwgdGFibGUgaXMgY29tcGlsZXIgc3BlY2lmaWMsIHRoZSBsYXlvdXQgb2YKICogZysrIHZpcnR1YWwgdGFibGVzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGF0IG9mIGFuIGVnY3MgdmlydHVhbCB0YWJsZSB3aGljaCBpcyBub3QgdGhlCiAqIHNhbWUgYXMgdGhhdCBnZW5lcmF0ZWQgYnkgVmlzdWFsIEMrLiBUaGVyZSBhcmUgd29ya2Fyb3VuZHMgdG8gbWFrZSB0aGUgdmlydHVhbCB0YWJsZXMKICogY29tcGF0aWJsZSB2aWEgcGFkZGluZyBidXQgdW5mb3J0dW5hdGVseSB0aGUgb25lIHdoaWNoIGlzIGltcG9zZWQgdG8gdGhlIFdJTkUgZW11bGF0b3IKICogYnkgdGhlIFdpbmRvd3MgYmluYXJpZXMsIGkuZS4gdGhlIFZpc3VhbCBDKysgb25lLCBpcyB0aGUgbW9zdCBjb21wYWN0IG9mIGFsbC4KICoKICogU28gdGhlIHNvbHV0aW9uIEkgZmluYWxseSBhZG9wdGVkIGRvZXMgbm90IHVzZSB2aXJ0dWFsIHRhYmxlcy4gSW5zdGVhZCBJIHVzZSBpbmxpbmUKICogbm9uIHZpcnR1YWwgbWV0aG9kcyB0aGF0IGRlcmVmZXJlbmNlIHRoZSBtZXRob2QgcG9pbnRlciB0aGVtc2VsdmVzIGFuZCBwZXJmb3JtIHRoZSBjYWxsLgogKgogKiBMZXQncyB0YWtlIERpcmVjdDNEIGFzIGFuIGV4YW1wbGU6CiAqCiAqICAgICNkZWZpbmUgSUNPTV9JTlRFUkZBQ0UgSURpcmVjdDNECiAqICAgICNkZWZpbmUgSURpcmVjdDNEX01FVEhPRFMgXAogKiAgICAgICAgSUNPTV9NRVRIT0QxKEhSRVNVTFQsSW5pdGlhbGl6ZSwgICAgUkVGSUlELCkgXAogKiAgICAgICAgSUNPTV9NRVRIT0QyKEhSRVNVTFQsRW51bURldmljZXMsICAgTFBEM0RFTlVNREVWSUNFU0NBTExCQUNLLCwgTFBWT0lELCkgXAogKiAgICAgICAgSUNPTV9NRVRIT0QyKEhSRVNVTFQsQ3JlYXRlTGlnaHQsICAgTFBESVJFQ1QzRExJR0hUKiwsIElVbmtub3duKiwpIFwKICogICAgICAgIElDT01fTUVUSE9EMihIUkVTVUxULENyZWF0ZU1hdGVyaWFsLExQRElSRUNUM0RNQVRFUklBTCosLCBJVW5rbm93biosKSBcCiAqICAgICAgICBJQ09NX01FVEhPRDIoSFJFU1VMVCxDcmVhdGVWaWV3cG9ydCxMUERJUkVDVDNEVklFV1BPUlQqLCwgSVVua25vd24qLCkgXAogKiAgICAgICAgSUNPTV9NRVRIT0QyKEhSRVNVTFQsRmluZERldmljZSwgICAgTFBEM0RGSU5EREVWSUNFU0VBUkNILCwgTFBEM0RGSU5EREVWSUNFUkVTVUxULCkKICogICAgI2RlZmluZSBJRGlyZWN0M0RfSU1FVEhPRFMgXAogKiAgICAgICAgSVVua25vd25fSU1FVEhPRFMgXAogKiAgICAgICAgSURpcmVjdDNEX01FVEhPRFMKICogICAgSUNPTV9ERUZJTkUoSURpcmVjdDNELElVbmtub3duKQogKiAgICAjdW5kZWYgSUNPTV9JTlRFUkZBQ0UKICoKICogICAgI2lmZGVmIElDT01fQ0lOVEVSRkFDRQogKiAgICAvLyAqKiogSVVua25vd24gbWV0aG9kcyAqKiogLy8KICogICAgI2RlZmluZSBJRGlyZWN0M0RfUXVlcnlJbnRlcmZhY2UocCxhLGIpIElDT01fQ0FMTDIoUXVlcnlJbnRlcmZhY2UscCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0FkZFJlZihwKSAgICAgICAgICAgICBJQ09NX0NBTEwgKEFkZFJlZixwKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9SZWxlYXNlKHApICAgICAgICAgICAgSUNPTV9DQUxMIChSZWxlYXNlLHApCiAqICAgIC8vICoqKiBJRGlyZWN0M0QgbWV0aG9kcyAqKiogLy8KICogICAgI2RlZmluZSBJRGlyZWN0M0RfSW5pdGlhbGl6ZShwLGEpICAgICAgIElDT01fQ0FMTDEoSW5pdGlhbGl6ZSxwLGEpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0VudW1EZXZpY2VzKHAsYSxiKSAgICBJQ09NX0NBTEwyKEVudW1EZXZpY2UscCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0NyZWF0ZUxpZ2h0KHAsYSxiKSAgICBJQ09NX0NBTEwyKENyZWF0ZUxpZ2h0LHAsYSxiKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9DcmVhdGVNYXRlcmlhbChwLGEsYikgSUNPTV9DQUxMMihDcmVhdGVNYXRlcmlhbCxwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfQ3JlYXRlVmlld3BvcnQocCxhLGIpIElDT01fQ0FMTDIoQ3JlYXRlVmlld3BvcnQscCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0ZpbmREZXZpY2UocCxhLGIpICAgICBJQ09NX0NBTEwyKEZpbmREZXZpY2UscCxhLGIpCiAqICAgICNlbmRpZgogKgogKiBDb21tZW50czoKICogIC0gVGhlIElDT01fSU5URVJGQUNFIG1hY3JvIGlzIHVzZWQgaW4gdGhlIElDT01fTUVUSE9EIG1hY3JvcyB0byBkZWZpbmUgdGhlIHR5cGUgb2YgdGhlICd0aGlzJwogKiAgICBwb2ludGVyLiBEZWZpbmluZyB0aGlzIG1hY3JvIGhlcmUgc2F2ZXMgdXMgdGhlIHRyb3VibGUgb2YgaGF2aW5nIHRvIHJlcGVhdCB0aGUgaW50ZXJmYWNlCiAqICAgIG5hbWUgZXZlcnl3aGVyZS4gTm90ZSBob3dldmVyIHRoYXQgYmVjYXVzZSBvZiB0aGUgd2F5IG1hY3JvcyB3b3JrLCBhIG1hY3JvIGxpa2UgSUNPTV9NRVRIT0QxCiAqICAgIGNhbm5vdCB1c2UgJ0lDT01fSU5URVJGQUNFIyNfVlRBQkxFJyBiZWNhdXNlIHRoaXMgd291bGQgZ2l2ZSAnSUNPTV9JTlRFUkZBQ0VfVlRBQkxFJyBhbmQgbm90CiAqICAgICdJRGlyZWN0M0RfVlRBQkxFJy4KICogIC0gSUNPTV9NRVRIT0RTIGRlZmluZXMgdGhlIG1ldGhvZHMgc3BlY2lmaWMgdG8gdGhpcyBpbnRlcmZhY2UuIEl0IGlzIHRoZW4gYWdncmVnYXRlZCB3aXRoIHRoZQogKiAgICBpbmhlcml0ZWQgbWV0aG9kcyB0byBmb3JtIElDT01fSU1FVEhPRFMuCiAqICAtIElDT01fSU1FVEhPRFMgZGVmaW5lcyB0aGUgbGlzdCBvZiBtZXRob2RzIHRoYXQgYXJlIGluaGVyaXRhYmxlIGZyb20gdGhpcyBpbnRlcmZhY2UuIEl0IG11c3QKICogICAgYmUgd3JpdHRlbiBtYW51YWxseSAocmF0aGVyIHRoYW4gdXNpbmcgYSBtYWNybyB0byBnZW5lcmF0ZSB0aGUgZXF1aXZhbGVudCBjb2RlKSB0byBhdm9pZAogKiAgICBtYWNybyByZWN1cnNpb24gKHdoaWNoIGNvbXBpbGVycyBkb24ndCBsaWtlKS4KICogIC0gVGhlIElDT01fREVGSU5FIGZpbmFsbHkgZGVjbGFyZXMgYWxsIHRoZSBzdHJ1Y3R1cmVzIG5lY2Vzc2FyeSBmb3IgdGhlIGludGVyZmFjZS4gV2UgaGF2ZSB0bwogKiAgICBleHBsaWNpdGx5IHVzZSB0aGUgaW50ZXJmYWNlIG5hbWUgZm9yIG1hY3JvIGV4cGFuc2lvbiByZWFzb25zIGFnYWluLgogKiAgICBJbmhlcml0ZWQgbWV0aG9kcyBhcmUgaW5oZXJpdGVkIGluIEMgYnkgdXNpbmcgdGhlIElEaXJlY3QzRF9NRVRIT0RTIG1hY3JvIGFuZCB0aGUgcGFyZW50J3MKICogICAgWHh4X0lNRVRIT0RTIG1hY3JvLiBJbiBDKysgd2UgbmVlZCBvbmx5IHVzZSB0aGUgSURpcmVjdDNEX01FVEhPRFMgc2luY2UgbWV0aG9kIGluaGVyaXRhbmNlCiAqICAgIGlzIHRha2VuIGNhcmUgb2YgYnkgdGhlIGxhbmd1YWdlLgogKiAgLSBJbiBDKysgdGhlIElDT01fTUVUSE9EIG1hY3JvcyBnZW5lcmF0ZSBhIGZ1bmN0aW9uIHByb3RvdHlwZSBhbmQgYSBjYWxsIHRvIGEgZnVuY3Rpb24gcG9pbnRlcgogKiAgICBtZXRob2QuIFRoaXMgbWVhbnMgdXNpbmcgb25jZSAndDEgcDEsIHQyIHAyLCAuLi4nIGFuZCBvbmNlICdwMSwgcDInIHdpdGhvdXQgdGhlIHR5cGVzLiBUaGUKICogICAgb25seSB3YXkgSSBmb3VuZCB0byBoYW5kbGUgdGhpcyBpcyB0byBoYXZlIG9uZSBJQ09NX01FVEhPRCBtYWNybyBwZXIgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYW5kCiAqICAgIHRvIGhhdmUgaXQgdGFrZSBvbmx5IHRoZSB0eXBlIGluZm9ybWF0aW9uICh3aXRoIGNvbnN0IGlmIG5lY2Vzc2FyeSkgYXMgcGFyYW1ldGVycy4KICogICAgVGhlICd1bmRlZiBJQ09NX0lOVEVSRkFDRScgaXMgaGVyZSB0byByZW1pbmQgeW91IHRoYXQgdXNpbmcgSUNPTV9JTlRFUkZBQ0UgaW4gdGhlIGZvbGxvd2luZwogKiAgICBtYWNyb3Mgd2lsbCBub3Qgd29yay4gVGhpcyB0aW1lIGl0J3MgYmVjYXVzZSB0aGUgSUNPTV9DQUxMIG1hY3JvIGV4cGFuc2lvbiBpcyBkb25lIG9ubHkgb25jZQogKiAgICB0aGUgJ0lEaXJlY3QzRF9YeHgnIG1hY3JvIGlzIGV4cGFuZGVkLiBBbmQgYnkgdGhhdCB0aW1lIElDT01fSU5URVJGQUNFIHdpbGwgYmUgbG9uZyBnb25lCiAqICAgIGFueXdheS4KICogIC0gWW91IG1heSBoYXZlIG5vdGljZWQgdGhlIGRvdWJsZSBjb21tYXMgYWZ0ZXIgZWFjaCBwYXJhbWV0ZXIgdHlwZS4gVGhpcyBhbGxvd3MgeW91IHRvIHB1dCB0aGUKICogICAgbmFtZSBvZiB0aGF0IHBhcmFtZXRlciB3aGljaCBJIHRoaW5rIGlzIGdvb2QgZm9yIGRvY3VtZW50YXRpb24uIEl0IGlzIG5vdCByZXF1aXJlZCBhbmQgc2luY2UKICogICAgSSBkaWQgbm90IGtub3cgd2hhdCB0byBwdXQgdGhlcmUgZm9yIHRoaXMgZXhhbXBsZSAoSSBjb3VsZCBvbmx5IGZpbmQgZG9jIGFib3V0IElEaXJlY3QzRDIpLAogKiAgICBJIGxlZnQgdGhlbSBibGFuay4KICogIC0gRmluYWxseSB0aGUgc2V0IG9mICdJRGlyZWN0M0RfWHh4JyBtYWNyb3MgaXMgYSBzdGFuZGFyZCBzZXQgb2YgbWFjcm9zIGRlZmluZWQgdG8gZWFzZSBhY2Nlc3MKICogICAgdG8gdGhlIGludGVyZmFjZSBtZXRob2RzIGluIEMuIFVuZm9ydHVuYXRlbHkgSSBkb24ndCBzZWUgYW55IHdheSB0byBhdm9pZCBoYXZpbmcgdG8gZHVwbGljYXRlCiAqICAgIHRoZSBpbmhlcml0ZWQgbWV0aG9kIGRlZmluaXRpb25zIHRoZXJlLiBUaGlzIHRpbWUgSSBjb3VsZCBoYXZlIHVzZWQgYSB0cmljayB0byB1c2Ugb25seSBvbmUKICogICAgbWFjcm8gd2hhdGV2ZXIgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGJ1dCBJIHByZWZlcmVkIHRvIGhhdmUgaXQgd29yayB0aGUgc2FtZSB3YXkgYXMgYWJvdmUuCiAqICAtIFlvdSBwcm9iYWJseSBoYXZlIG5vdGljZWQgdGhhdCB3ZSBkb24ndCBkZWZpbmUgdGhlIGZpZWxkcyB3ZSBuZWVkIHRvIGFjdHVhbGx5IGltcGxlbWVudCB0aGlzCiAqICAgIGludGVyZmFjZTogcmVmZXJlbmNlIGNvdW50LCBwb2ludGVyIHRvIG90aGVyIHJlc291cmNlcyBhbmQgbWlzY2VsbGFuZW91cyBmaWVsZHMuIFRoYXQncwogKiAgICBiZWNhdXNlIHRoZXNlIGludGVyZmFjZXMgYXJlIGp1c3QgdGhhdDogaW50ZXJmYWNlcy4gVGhleSBtYXkgYmUgaW1wbGVtZW50ZWQgbW9yZSB0aGFuIG9uY2UsIGluCiAqICAgIGRpZmZlcmVudCBjb250ZXh0cyBhbmQgc29tZXRpbWVzIG5vdCBldmVuIGluIFdpbmUuIFRodXMgaXQgd291bGQgbm90IG1ha2Ugc2Vuc2UgdG8gaW1wb3NlCiAqICAgIHRoYXQgdGhlIGludGVyZmFjZSBjb250YWlucyBzb21lIHNwZWNpZmljIGZpZWxkcy4KICoKICoKICogSW4gQyB0aGlzIGdpdmVzOgogKiAgICB0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RWdGJsIElEaXJlY3QzRFZ0Ymw7CiAqICAgIHN0cnVjdCBJRGlyZWN0M0QgewogKiAgICAgICAgSURpcmVjdDNEVnRibCogbHBWdGJsOwogKiAgICB9OwogKiAgICBzdHJ1Y3QgSURpcmVjdDNEVnRibCB7CiAqICAgICAgICBIUkVTVUxUICgqUXVlcnlJbnRlcmZhY2UpKElEaXJlY3QzRCogbWUsIFJFRklJRCByaWlkLCBMUFZPSUQqIHBwdk9iaik7CiAqICAgICAgICBVTE9ORyAoKlF1ZXJ5SW50ZXJmYWNlKShJRGlyZWN0M0QqIG1lKTsKICogICAgICAgIFVMT05HICgqUXVlcnlJbnRlcmZhY2UpKElEaXJlY3QzRCogbWUpOwogKiAgICAgICAgSFJFU1VMVCAoKkluaXRpYWxpemUpKElEaXJlY3QzRCogbWUsIFJFRklJRCBhKTsKICogICAgICAgIEhSRVNVTFQgKCpFbnVtRGV2aWNlcykoSURpcmVjdDNEKiBtZSwgTFBEM0RFTlVNREVWSUNFU0NBTExCQUNLIGEsIExQVk9JRCBiKTsKICogICAgICAgIEhSRVNVTFQgKCpDcmVhdGVMaWdodCkoSURpcmVjdDNEKiBtZSwgTFBESVJFQ1QzRExJR0hUKiBhLCBJVW5rbm93biogYik7CiAqICAgICAgICBIUkVTVUxUICgqQ3JlYXRlTWF0ZXJpYWwpKElEaXJlY3QzRCogbWUsIExQRElSRUNUM0RNQVRFUklBTCogYSwgSVVua25vd24qIGIpOwogKiAgICAgICAgSFJFU1VMVCAoKkNyZWF0ZVZpZXdwb3J0KShJRGlyZWN0M0QqIG1lLCBMUERJUkVDVDNEVklFV1BPUlQqIGEsIElVbmtub3duKiBiKTsKICogICAgICAgIEhSRVNVTFQgKCpGaW5kRGV2aWNlKShJRGlyZWN0M0QqIG1lLCBMUEQzREZJTkRERVZJQ0VTRUFSQ0ggYSwgTFBEM0RGSU5EREVWSUNFUkVTVUxUIGIpOwogKiAgICB9OwogKgogKiAgICAjaWZkZWYgSUNPTV9DSU5URVJGQUNFCiAqICAgIC8vICoqKiBJVW5rbm93biBtZXRob2RzICoqKiAvLwogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9BZGRSZWYocCkgICAgICAgICAgICAgKHApLT5scFZ0YmwtPkFkZFJlZihwKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9SZWxlYXNlKHApICAgICAgICAgICAgKHApLT5scFZ0YmwtPlJlbGVhc2UocCkKICogICAgLy8gKioqIElEaXJlY3QzRCBtZXRob2RzICoqKiAvLwogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9Jbml0aWFsaXplKHAsYSkgICAgICAgKHApLT5scFZ0YmwtPkluaXRpYWxpemUocCxhKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9FbnVtRGV2aWNlcyhwLGEsYikgICAgKHApLT5scFZ0YmwtPkVudW1EZXZpY2UocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0NyZWF0ZUxpZ2h0KHAsYSxiKSAgICAocCktPmxwVnRibC0+Q3JlYXRlTGlnaHQocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0NyZWF0ZU1hdGVyaWFsKHAsYSxiKSAocCktPmxwVnRibC0+Q3JlYXRlTWF0ZXJpYWwocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0NyZWF0ZVZpZXdwb3J0KHAsYSxiKSAocCktPmxwVnRibC0+Q3JlYXRlVmlld3BvcnQocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0ZpbmREZXZpY2UocCxhLGIpICAgICAocCktPmxwVnRibC0+RmluZERldmljZShwLGEsYikKICogICAgI2VuZGlmCiAqCiAqIENvbW1lbnRzOgogKiAgLSBJRGlyZWN0M0Qgb25seSBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIElEaXJlY3QzRCB2aXJ0dWFsL2p1bXAgdGFibGUuIFRoaXMgaXMgdGhlIG9ubHkgdGhpbmcKICogICAgdGhlIHVzZXIgbmVlZHMgdG8ga25vdyB0byB1c2UgdGhlIGludGVyZmFjZS4gT2YgY291cnNlIHRoZSBzdHJ1Y3R1cmUgd2Ugd2lsbCBkZWZpbmUgdG8KICogICAgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHdpbGwgaGF2ZSBtb3JlIGZpZWxkcyBidXQgdGhlIGZpcnN0IG9uZSB3aWxsIG1hdGNoIHRoaXMgcG9pbnRlci4KICogIC0gVGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IElDT01fREVGSU5FIGRlZmluZXMgYm90aCB0aGUgc3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgaW50ZXJmYWNlIGFuZAogKiAgICB0aGUgc3RydWN0dXJlIGZvciB0aGUganVtcCB0YWJsZS4gSUNPTV9ERUZJTkUgdXNlcyB0aGUgcGFyZW50J3MgWHh4X0lNRVRIT0RTIG1hY3JvIHRvCiAqICAgIGF1dG9tYXRpY2FsbHkgcmVwZWF0IHRoZSBwcm90b3R5cGVzIG9mIGFsbCB0aGUgaW5oZXJpdGVkIG1ldGhvZHMgYW5kIHRoZW4gdXNlcyBJRGlyZWN0M0RfTUVUSE9EUwogKiAgICB0byBkZWZpbmUgdGhlIElEaXJlY3QzRCBtZXRob2RzLgogKiAgLSBFYWNoIG1ldGhvZCBpcyBkZWNsYXJlZCBhcyBhIHBvaW50ZXIgdG8gZnVuY3Rpb24gZmllbGQgaW4gdGhlIGp1bXAgdGFibGUuIFRoZSBpbXBsZW1lbnRhdGlvbgogKiAgICB3aWxsIGZpbGwgdGhpcyBqdW1wIHRhYmxlIHdpdGggYXBwcm9wcmlhdGUgdmFsdWVzLCBwcm9iYWJseSB1c2luZyBhIHN0YXRpYyB2YXJpYWJsZSwgYW5kCiAqICAgIGluaXRpYWxpemUgdGhlIGxwVnRibCBmaWVsZCB0byBwb2ludCB0byB0aGlzIHZhcmlhYmxlLgogKiAgLSBUaGUgSURpcmVjdDNEX1h4eCBtYWNyb3MgdGhlbiBqdXN0IGRlcmVmZW5jZSB0aGUgbHBWdGJsIHBvaW50ZXIgYW5kIHVzZSB0aGUgZnVuY3Rpb24gcG9pbnRlcgogKiAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWNybyBuYW1lLiBUaGlzIGVtdWxhdGVzIHRoZSBiZWhhdmlvciBvZiBhIHZpcnR1YWwgdGFibGUgYW5kIHNob3VsZCBiZQogKiAgICBqdXN0IGFzIGZhc3QuCiAqICAtIFRoaXMgQyBjb2RlIHNob3VsZCBiZSBxdWl0ZSBjb21wYXRpYmxlIHdpdGggdGhlIFdpbmRvd3MgaGVhZGVycyBib3RoIGZvciBjb2RlIHRoYXQgdXNlcyBDT00KICogICAgaW50ZXJmYWNlcyBhbmQgZm9yIGNvZGUgaW1wbGVtZW50aW5nIGEgQ09NIGludGVyZmFjZS4KICoKICoKICogQW5kIGluIEMrKyAod2l0aCBnY2MncyBnKyspOgogKgogKiAgICB0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0Q6IHB1YmxpYyBJVW5rbm93biB7CiAqICAgICAgICBwcml2YXRlOiBIUkVTVUxUICgqSW5pdGlhbGl6ZSkoSURpcmVjdDNEKiBtZSwgUkVGSUlEIGEpOwogKiAgICAgICAgcHVibGljOiBpbmxpbmUgSFJFU1VMVCBJbml0aWFsaXplKFJFRklJRCBhKSB7IHJldHVybiAoKElEaXJlY3QzRCopdC5scFZ0YmwpLT5Jbml0aWFsaXplKHRoaXMsYSk7IH07CiAqICAgICAgICBwcml2YXRlOiBIUkVTVUxUICgqRW51bURldmljZXMpKElEaXJlY3QzRCogbWUsIExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBhLCBMUFZPSUQgYik7CiAqICAgICAgICBwdWJsaWM6IGlubGluZSBIUkVTVUxUIEVudW1EZXZpY2VzKExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBhLCBMUFZPSUQgYikKICogICAgICAgICAgICB7IHJldHVybiAoKElEaXJlY3QzRCopdC5scFZ0YmwpLT5FbnVtRGV2aWNlcyh0aGlzLGEsYik7IH07CiAqICAgICAgICBwcml2YXRlOiBIUkVTVUxUICgqZnJlYXRlTGlnaHQpKElEaXJlY3QzRCogbWUsIExQRElSRUNUM0RMSUdIVCogYSwgSVVua25vd24qIGIpOwogKiAgICAgICAgcHVibGljOiBpbmxpbmUgSFJFU1VMVCBDcmVhdGVMaWdodChMUERJUkVDVDNETElHSFQqIGEsIElVbmtub3duKiBiKQogKiAgICAgICAgICAgIHsgcmV0dXJuICgoSURpcmVjdDNEKil0LmxwVnRibCktPkNyZWF0ZUxpZ2h0KHRoaXMsYSxiKTsgfTsKICogICAgICAgIHByaXZhdGU6IEhSRVNVTFQgKCpDcmVhdGVNYXRlcmlhbCkoSURpcmVjdDNEKiBtZSwgTFBESVJFQ1QzRE1BVEVSSUFMKiBhLCBJVW5rbm93biogYik7CiAqICAgICAgICBwdWJsaWM6IGlubGluZSBIUkVTVUxUIENyZWF0ZU1hdGVyaWFsKExQRElSRUNUM0RNQVRFUklBTCogYSwgSVVua25vd24qIGIpCiAqICAgICAgICAgICAgeyByZXR1cm4gKChJRGlyZWN0M0QqKXQubHBWdGJsKS0+Q3JlYXRlTWF0ZXJpYWwodGhpcyxhLGIpOyB9OwogKiAgICAgICAgcHJpdmF0ZTogSFJFU1VMVCAoKkNyZWF0ZVZpZXdwb3J0KShJRGlyZWN0M0QqIG1lLCBMUERJUkVDVDNEVklFV1BPUlQqIGEsIElVbmtub3duKiBiKTsKICogICAgICAgIHB1YmxpYzogaW5saW5lIEhSRVNVTFQgQ3JlYXRlVmlld3BvcnQoTFBESVJFQ1QzRFZJRVdQT1JUKiBhLCBJVW5rbm93biogYikKICogICAgICAgICAgICB7IHJldHVybiAoKElEaXJlY3QzRCopdC5scFZ0YmwpLT5DcmVhdGVWaWV3cG9ydCh0aGlzLGEsYik7IH07CiAqICAgICAgICBwcml2YXRlOiAgSFJFU1VMVCAoKkZpbmREZXZpY2UpKElEaXJlY3QzRCogbWUsIExQRDNERklORERFVklDRVNFQVJDSCBhLCBMUEQzREZJTkRERVZJQ0VSRVNVTFQgYik7CiAqICAgICAgICBwdWJsaWM6IGlubGluZSBIUkVTVUxUIEZpbmREZXZpY2UoTFBEM0RGSU5EREVWSUNFU0VBUkNIIGEsIExQRDNERklORERFVklDRVJFU1VMVCBiKQogKiAgICAgICAgICAgIHsgcmV0dXJuICgoSURpcmVjdDNEKil0LmxwVnRibCktPkZpbmREZXZpY2UodGhpcyxhLGIpOyB9OwogKiAgICB9OwogKgogKiBDb21tZW50czoKICogIC0gSW4gQysrIElEaXJlY3QzRCBkb2VzIGRvdWJsZSBkdXR5IGFzIGJvdGggdGhlIHZpcnR1YWwvanVtcCB0YWJsZSBhbmQgYXMgdGhlIGludGVyZmFjZQogKiAgICBkZWZpbml0aW9uLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRvIGF2b2lkIGhhdmluZyB0byBkdXBsaWNhdGUgdGhlIG1laG9kIGRlZmluaXRpb25zOiBvbmNlCiAqICAgIHRvIGhhdmUgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIGluIHRoZSBqdW1wIHRhYmxlIGFuZCBvbmNlIHRvIGhhdmUgdGhlIG1ldGhvZHMgaW4gdGhlIGludGVyZmFjZQogKiAgICBjbGFzcy4gSGVyZSBvbmUgbWFjcm8gY2FuIGdlbmVyYXRlIGJvdGguIFRoaXMgbWVhbnMgdGhvdWdoIHRoYXQgdGhlIGZpcnN0IHBvaW50ZXIsIHQubHBWdGJsCiAqICAgIGRlZmluZWQgaW4gSVVua25vd24sICBtdXN0IGJlIGludGVycHJldGVkIGFzIHRoZSBqdW1wIHRhYmxlIHBvaW50ZXIgaWYgd2UgaW50ZXJwcmV0IHRoZQogKiAgICBzdHJ1Y3R1cmUgYXMgdGhlIHRoZSBpbnRlcmZhY2UgY2xhc3MsIGFuZCBhcyB0aGUgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgUXVlcnlJbnRlcmZhY2UKICogICAgbWV0aG9kLCB0LlF1ZXJ5SW50ZXJmYWNlLCBpZiB3ZSBpbnRlcnByZXQgdGhlIHN0cnVjdHVyZSBhcyB0aGUganVtcCB0YWJsZS4gRm9ydHVuYXRlbHkgdGhpcwogKiAgICBneW1uYXN0aWMgaXMgZW50aXJlbHkgdGFrZW4gY2FyZSBvZiBpbiB0aGUgaGVhZGVyIG9mIElVbmtub3duLgogKiAgLSBPZiBjb3Vyc2UgaW4gQysrIHdlIHVzZSBpbmhlcml0YW5jZSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZHVwbGljYXRlIHRoZSBtZXRob2QgZGVmaW5pdGlvbnMuCiAqICAtIFNpbmNlIElEaXJlY3QzRCBkb2VzIGRvdWJsZSBkdXR5LCBlYWNoIElDT01fTUVUSE9EIG1hY3JvIGRlZmluZXMgYm90aCBhIGZ1bmN0aW9uIHBvaW50ZXIgYW5kCiAqICAgIGEgbm9uLXZyaXR1YWwgaW5saW5lIG1ldGhvZCB3aGljaCBkZXJlZmVyZW5jZXMgaXQgYW5kIGNhbGxzIGl0LiBUaGlzIHdheSB0aGlzIG1ldGhvZCBiZWhhdmVzCiAqICAgIGp1c3QgbGlrZSBhIHZpcnR1YWwgbWV0aG9kIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYSB0cnVlIEMrKyB2aXJ0dWFsIHRhYmxlIHdoaWNoIHdvdWxkIGJyZWFrIHRoZQogKiAgICBzdHJ1Y3R1cmUgbGF5b3V0LiBJZiB5b3UgbG9vayBhdCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgbWV0aG9kcyB5b3UnbGwgbm90aWNlIHRoYXQgdGhleQogKiAgICB3b3VsZCBub3Qgd29yayBmb3Igdm9pZCBmdW5jdGlvbnMuIFdlIGhhdmUgdG8gcmV0dXJuIHNvbWV0aGluZyBhbmQgZm9ydHVuYXRlbHkgdGhpcyBzZWVtcyB0bwogKiAgICBiZSB3aGF0IGFsbCB0aGUgQ09NIG1ldGhvZHMgZG8gKG90aGVyd2lzZSB3ZSB3b3VsZCBuZWVkIGFub3RoZXIgc2V0IG9mIG1hY3JvcykuCiAqICAtIE5vdGUgaG93IHRoZSBJQ09NX01FVEhPRCBnZW5lcmF0ZXMgYm90aCBmdW5jdGlvbiBwcm90b3R5cGVzIG1peGluZyB0eXBlcyBhbmQgZm9ybWFsIHBhcmFtZXRlcgogKiAgICBuYW1lcyBhbmQgdGhlIG1ldGhvZCBpbnZvY2F0aW9uIHVzaW5nIG9ubHkgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgbmFtZS4gVGhpcyBpcyB0aGUgcmVhc29uIHdoeQogKiAgICB3ZSBuZWVkIGRpZmZlcmVudCBtYWNyb3MgdG8gaGFuZGxlIGRpZmZlcmVudCBudW1iZXJzIG9mIHBhcmFtZXRlcnMuCiAqICAtIEZpbmFsbHkgdGhlcmUgaXMgbm8gSURpcmVjdDNEX1h4eCBtYWNyby4gVGhlc2UgYXJlIG5vdCBuZWVkZWQgaW4gQysrIHVubGVzcyB0aGUgQ0lOVEVSRkFDRQogKiAgICBtYWNybyBpcyBkZWZpbmVkIGluIHdoaWNoIGNhc2Ugd2Ugd291bGQgbm90IGJlIGhlcmUuCiAqICAtIFRoaXMgQysrIGNvZGUgd29ya3Mgd2VsbCBmb3IgY29kZSB0aGF0IGp1c3QgdXNlcyBDT00gaW50ZXJmYWNlcy4gQnV0IGl0IHdpbGwgbm90IHdvcmsgd2l0aAogKiAgICBDKysgY29kZSBpbXBsZW1lbnQgYSBDT00gaW50ZXJmYWNlLiBUaGF0J3MgYmVjYXVzZSBzdWNoIGNvZGUgYXNzdW1lcyB0aGUgaW50ZXJmYWNlIG1ldGhvZHMKICogICAgYXJlIGRlY2xhcmVkIGFzIHZpcnR1YWwgQysrIG1ldGhvZHMgd2hpY2ggaXMgbm90IHRoZSBjYXNlIGhlcmUuCiAqCiAqCiAqIEltcGxlbWVudGluZyBhIENPTSBpbnRlcmZhY2UuCiAqCiAqIFRoaXMgY29udGludWVzIHRoZSBhYm92ZSBleGFtcGxlLiBUaGlzIGV4YW1wbGUgYXNzdW1lcyB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBpbiBDLgogKgogKiAgICB0eXBlZGVmIHN0cnVjdCBfSURpcmVjdDNEIHsKICogICAgICAgIHZvaWQqIGxwVnRibDsKICogICAgICAgIC8vIC4uLgogKgogKiAgICB9IF9JRGlyZWN0M0Q7CiAqCiAqICAgIHN0YXRpYyBJQ09NX1ZUQUJMRShJRGlyZWN0M0QpIGQzZHZ0OwogKgogKiAgICAvLyBpbXBsZW1lbnQgdGhlIElEaXJlY3QzRCBtZXRob2RzIGhlcmUKICoKICogICAgaW50IElEaXJlY3QzRF9RdWVyeUludGVyZmFjZShJRGlyZWN0M0QqIG1lKQogKiAgICB7CiAqICAgICAgICBJQ09NX1RISVMoSURpcmVjdDNELG1lKTsKICogICAgICAgIC8vIC4uLgogKiAgICB9CiAqCiAqICAgIC8vIC4uLgogKgogKiAgICBzdGF0aWMgSUNPTV9WVEFCTEUoSURpcmVjdDNEKSBkM2R2dCA9IHsKICogICAgICAgIElDT01fTVNWVEFCTEVfQ09NUEFUX0R1bW15UlRUSVZBTFVFCiAqICAgICAgICBJRGlyZWN0M0RfUXVlcnlJbnRlcmZhY2UsCiAqICAgICAgICBJRGlyZWN0M0RfQWRkLAogKiAgICAgICAgSURpcmVjdDNEX0FkZDIsCiAqICAgICAgICBJRGlyZWN0M0RfSW5pdGlhbGl6ZSwKICogICAgICAgIElEaXJlY3QzRF9TZXRXaWR0aAogKiAgICB9OwogKgogKiBDb21tZW50czoKICogIC0gV2UgZmlyc3QgZGVmaW5lIHdoYXQgdGhlIGludGVyZmFjZSByZWFsbHkgY29udGFpbnMuIFRoaXMgaXMgdGggZV9JRGlyZWN0M0Qgc3RydWN0dXJlLiBUaGUKICogICAgZmlyc3QgZmllbGQgbXVzdCBvZiBjb3Vyc2UgYmUgdGhlIHZpcnR1YWwgdGFibGUgcG9pbnRlci4gRXZlcnl0aGluZyBlbHNlIGlzIGZyZWUuCiAqICAtIFRoZW4gd2UgcHJlZGVjbGFyZSBvdXIgc3RhdGljIHZpcnR1YWwgdGFibGUgdmFyaWFibGUsIHdlIHdpbGwgbmVlZCBpdHMgYWRkcmVzcyBpbiBzb21lCiAqICAgIG1ldGhvZHMgdG8gaW5pdGlhbGl6ZSB0aGUgdmlydHVhbCB0YWJsZSBwb2ludGVyIG9mIHRoZSByZXR1cm5lZCBpbnRlcmZhY2Ugb2JqZWN0cy4KICogIC0gVGhlbiB3ZSBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSBtZXRob2RzLiBUbyBtYXRjaCB3aGF0IGhhcyBiZWVuIGRlY2xhcmVkIGluIHRoZSBoZWFkZXIgZmlsZQogKiAgICB0aGV5IG11c3QgdGFrZSBhIHBvaW50ZXIgdG8gYSBJRGlyZWN0M0Qgc3RydWN0dXJlIGFuZCB3ZSBtdXN0IGNhc3QgaXQgdG8gYW4gX0lEaXJlY3QzRCBzbyB0aGF0CiAqICAgIHdlIGNhbiBtYW5pcHVsYXRlIHRoZSBmaWVsZHMuIFRoaXMgaXMgcGVyZm9ybWVkIGJ5IHRoZSBJQ09NX1RISVMgbWFjcm8uCiAqICAtIEZpbmFsbHkgd2UgaW5pdGlhbGl6ZSB0aGUgdmlydHVhbCB0YWJsZS4KICovCgoKCiNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChDSU5URVJGQUNFKQojZGVmaW5lIElDT01fQ0lOVEVSRkFDRSAxCiNlbmRpZgoKI2lmbmRlZiBJQ09NX0NJTlRFUkZBQ0UKLyogQysrIGludGVyZmFjZSAqLwoKI2RlZmluZSBJQ09NX01FVEhPRChyZXQseGZuKSBcCiAgICAgcHVibGljOiB2aXJ0dWFsIHJldCBDQUxMQkFDSyAoeGZuKSh2b2lkKSA9IDA7CiNkZWZpbmUgSUNPTV9NRVRIT0QxKHJldCx4Zm4sdGEsbmEpIFwKICAgICBwdWJsaWM6IHZpcnR1YWwgcmV0IENBTExCQUNLICh4Zm4pKHRhIGEpID0gMDsKI2RlZmluZSBJQ09NX01FVEhPRDIocmV0LHhmbix0YSxuYSx0YixuYikgXAogICAgIHB1YmxpYzogdmlydHVhbCByZXQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiKSA9IDA7CiNkZWZpbmUgSUNPTV9NRVRIT0QzKHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMpIFwKICAgICBwdWJsaWM6IHZpcnR1YWwgcmV0IENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjKSA9IDA7CiNkZWZpbmUgSUNPTV9NRVRIT0Q0KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQpIFwKICAgICBwdWJsaWM6IHZpcnR1YWwgcmV0IENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjLHRkIGQpID0gMDsKI2RlZmluZSBJQ09NX01FVEhPRDUocmV0LHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSkgXAogICAgIHB1YmxpYzogdmlydHVhbCByZXQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlKSA9IDA7CiNkZWZpbmUgSUNPTV9NRVRIT0Q2KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYpIFwKICAgICBwdWJsaWM6IHZpcnR1YWwgcmV0IENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmKSA9IDA7CiNkZWZpbmUgSUNPTV9NRVRIT0Q3KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcpIFwKICAgICBwdWJsaWM6IHZpcnR1YWwgcmV0IENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcpID0gMDsKI2RlZmluZSBJQ09NX01FVEhPRDgocmV0LHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCkgXAogICAgIHB1YmxpYzogdmlydHVhbCByZXQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoKSA9IDA7CiNkZWZpbmUgSUNPTV9NRVRIT0Q5KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmkpIFwKICAgICBwdWJsaWM6IHZpcnR1YWwgcmV0IENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpKSA9IDA7CiNkZWZpbmUgSUNPTV9NRVRIT0QxMChyZXQseGZuLHRhLG5hLHRiLG5iLHRjLG5jLHRkLG5kLHRlLG5lLHRmLG5mLHRnLG5nLHRoLG5oLHRpLG5pLHRqLG5qKSBcCiAgICAgcHVibGljOiB2aXJ0dWFsIHJldCBDQUxMQkFDSyAoeGZuKSh0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqKSA9IDA7CiNkZWZpbmUgSUNPTV9NRVRIT0QxMShyZXQseGZuLHRhLG5hLHRiLG5iLHRjLG5jLHRkLG5kLHRlLG5lLHRmLG5mLHRnLG5nLHRoLG5oLHRpLG5pLHRqLG5qLHRrLG5rKSBcCiAgICAgcHVibGljOiB2aXJ0dWFsIHJldCBDQUxMQkFDSyAoeGZuKSh0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqLHRrIGspID0gMDsKI2RlZmluZSBJQ09NX01FVEhPRDEyKHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwpIFwKICAgIHB1YmxpYzogdmlydHVhbCByZXQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwpID0gMDsKI2RlZmluZSBJQ09NX01FVEhPRDEzKHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0pIFwKICAgIHB1YmxpYzogdmlydHVhbCByZXQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSkgPSAwOwojZGVmaW5lIElDT01fTUVUSE9EMTQocmV0LHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubikgXAogICAgcHVibGljOiB2aXJ0dWFsIHJldCBDQUxMQkFDSyAoeGZuKSh0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqLHRrIGssdGwgbCx0bSBtLHRuIG4pID0gMDsKI2RlZmluZSBJQ09NX01FVEhPRDE1KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8pIFwKICAgIHB1YmxpYzogdmlydHVhbCByZXQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSx0biBuLHRvIG8pID0gMDsKI2RlZmluZSBJQ09NX01FVEhPRDE2KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnApIFwKICAgIHB1YmxpYzogdmlydHVhbCByZXQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSx0biBuLHRvIG8sdHAgcCkgPSAwOwojZGVmaW5lIElDT01fTUVUSE9EMTcocmV0LHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubix0byxubyx0cCxucCx0cSxucSkgXAogICAgcHVibGljOiB2aXJ0dWFsIHJldCBDQUxMQkFDSyAoeGZuKSh0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqLHRrIGssdGwgbCx0bSBtLHRuIG4sdG8gbyx0cCBwLHRxIHEpID0gMDsKI2RlZmluZSBJQ09NX01FVEhPRDE4KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIpIFwKICAgIHB1YmxpYzogdmlydHVhbCByZXQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSx0biBuLHRvIG8sdHAgcCx0cSBxLHRyIHIpID0gMDsKI2RlZmluZSBJQ09NX01FVEhPRDE5KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMpIFwKICAgIHB1YmxpYzogdmlydHVhbCByZXQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSx0biBuLHRvIG8sdHAgcCx0cSBxLHRyIHIsdHMgcykgPSAwOwojZGVmaW5lIElDT01fTUVUSE9EMjAocmV0LHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubix0byxubyx0cCxucCx0cSxucSx0cixucix0cyxucyx0dCxudCkgXAogICAgcHVibGljOiB2aXJ0dWFsIHJldCBDQUxMQkFDSyAoeGZuKSh0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqLHRrIGssdGwgbCx0bSBtLHRuIG4sdG8gbyx0cCBwLHRxIHEsdHIgcix0cyBzLHR0IHQpID0gMDsKI2RlZmluZSBJQ09NX01FVEhPRDIxKHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQsdHUsbnUpIFwKICAgIHB1YmxpYzogdmlydHVhbCByZXQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSx0biBuLHRvIG8sdHAgcCx0cSBxLHRyIHIsdHMgcyx0dCB0LHR1IHUpID0gMDsKI2RlZmluZSBJQ09NX01FVEhPRDIyKHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQsdHUsbnUsdHYsbnYpIFwKICAgIHB1YmxpYzogdmlydHVhbCByZXQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSx0biBuLHRvIG8sdHAgcCx0cSBxLHRyIHIsdHMgcyx0dCB0LHR1IHUsdHYgdikgPSAwOwojZGVmaW5lIElDT01fTUVUSE9EMjMocmV0LHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubix0byxubyx0cCxucCx0cSxucSx0cixucix0cyxucyx0dCxudCx0dSxudSx0dixudix0dyxudykgXAogICAgcHVibGljOiB2aXJ0dWFsIHJldCBDQUxMQkFDSyAoeGZuKSh0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqLHRrIGssdGwgbCx0bSBtLHRuIG4sdG8gbyx0cCBwLHRxIHEsdHIgcix0cyBzLHR0IHQsdHUgdSx0diB2LHR3IHcpID0gMDsKI2RlZmluZSBJQ09NX01FVEhPRDI0KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQsdHUsbnUsdHYsbnYsdHcsbncsdHgsbngpIFwKICAgIHB1YmxpYzogdmlydHVhbCByZXQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSx0biBuLHRvIG8sdHAgcCx0cSBxLHRyIHIsdHMgcyx0dCB0LHR1IHUsdHYgdix0dyB3LHR4IHgpID0gMDsKI2RlZmluZSBJQ09NX01FVEhPRDI1KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQsdHUsbnUsdHYsbnYsdHcsbncsdHgsbngsdHksbnkpIFwKICAgIHB1YmxpYzogdmlydHVhbCByZXQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSx0biBuLHRvIG8sdHAgcCx0cSBxLHRyIHIsdHMgcyx0dCB0LHR1IHUsdHYgdix0dyB3LHR4IHgsdHkgeSkgPSAwOwojZGVmaW5lIElDT01fTUVUSE9EMjYocmV0LHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubix0byxubyx0cCxucCx0cSxucSx0cixucix0cyxucyx0dCxudCx0dSxudSx0dixudix0dyxudyx0eCxueCx0eSxueSx0eixueikgXAogICAgcHVibGljOiB2aXJ0dWFsIHJldCBDQUxMQkFDSyAoeGZuKSh0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqLHRrIGssdGwgbCx0bSBtLHRuIG4sdG8gbyx0cCBwLHRxIHEsdHIgcix0cyBzLHR0IHQsdHUgdSx0diB2LHR3IHcsdHggeCx0eSB5LHR6IHopID0gMDsKCgojZGVmaW5lIElDT01fVk1FVEhPRCh4Zm4pIFwKICAgICBwdWJsaWM6IHZpcnR1YWwgdm9pZCBDQUxMQkFDSyAoeGZuKSh2b2lkKSA9IDA7CiNkZWZpbmUgSUNPTV9WTUVUSE9EMSh4Zm4sdGEsbmEpIFwKICAgICBwdWJsaWM6IHZpcnR1YWwgdm9pZCBDQUxMQkFDSyAoeGZuKSh0YSBhKSA9IDA7CiNkZWZpbmUgSUNPTV9WTUVUSE9EMih4Zm4sdGEsbmEsdGIsbmIpIFwKICAgICBwdWJsaWM6IHZpcnR1YWwgdm9pZCBDQUxMQkFDSyAoeGZuKSh0YSBhLHRiIGIpID0gMDsKI2RlZmluZSBJQ09NX1ZNRVRIT0QzKHhmbix0YSxuYSx0YixuYix0YyxuYykgXAogICAgIHB1YmxpYzogdmlydHVhbCB2b2lkIENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjKSA9IDA7CiNkZWZpbmUgSUNPTV9WTUVUSE9ENCh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQpIFwKICAgICBwdWJsaWM6IHZpcnR1YWwgdm9pZCBDQUxMQkFDSyAoeGZuKSh0YSBhLHRiIGIsdGMgYyx0ZCBkKSA9IDA7CiNkZWZpbmUgSUNPTV9WTUVUSE9ENSh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUpIFwKICAgICBwdWJsaWM6IHZpcnR1YWwgdm9pZCBDQUxMQkFDSyAoeGZuKSh0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUpID0gMDsKI2RlZmluZSBJQ09NX1ZNRVRIT0Q2KHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZikgXAogICAgIHB1YmxpYzogdmlydHVhbCB2b2lkIENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmKSA9IDA7CiNkZWZpbmUgSUNPTV9WTUVUSE9ENyh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcpIFwKICAgICBwdWJsaWM6IHZpcnR1YWwgdm9pZCBDQUxMQkFDSyAoeGZuKSh0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnKSA9IDA7CiNkZWZpbmUgSUNPTV9WTUVUSE9EOCh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgpIFwKICAgICBwdWJsaWM6IHZpcnR1YWwgdm9pZCBDQUxMQkFDSyAoeGZuKSh0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgpID0gMDsKI2RlZmluZSBJQ09NX1ZNRVRIT0Q5KHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSkgXAogICAgIHB1YmxpYzogdmlydHVhbCB2b2lkIENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpKSA9IDA7CiNkZWZpbmUgSUNPTV9WTUVUSE9EMTAoeGZuLHRhLG5hLHRiLG5iLHRjLG5jLHRkLG5kLHRlLG5lLHRmLG5mLHRnLG5nLHRoLG5oLHRpLG5pLHRqLG5qKSBcCiAgICAgcHVibGljOiB2aXJ0dWFsIHZvaWQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksIHRqIGopID0gMDsKI2RlZmluZSBJQ09NX1ZNRVRIT0QxMSh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmspIFwKICAgICBwdWJsaWM6IHZpcnR1YWwgdm9pZCBDQUxMQkFDSyAoeGZuKSh0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSwgdGogaiwgdGsgaykgPSAwOwojZGVmaW5lIElDT01fVk1FVEhPRDEyKHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCkgXAogICAgcHVibGljOiB2aXJ0dWFsIHZvaWQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwpID0gMDsKI2RlZmluZSBJQ09NX1ZNRVRIT0QxMyh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0pIFwKICAgIHB1YmxpYzogdmlydHVhbCB2b2lkIENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0pID0gMDsKI2RlZmluZSBJQ09NX1ZNRVRIT0QxNCh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4pIFwKICAgIHB1YmxpYzogdmlydHVhbCB2b2lkIENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbikgPSAwOwojZGVmaW5lIElDT01fVk1FVEhPRDE1KHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubix0byxubykgXAogICAgcHVibGljOiB2aXJ0dWFsIHZvaWQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSx0biBuLHRvIG8pID0gMDsKI2RlZmluZSBJQ09NX1ZNRVRIT0QxNih4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnApIFwKICAgIHB1YmxpYzogdmlydHVhbCB2b2lkIENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHApID0gMDsKI2RlZmluZSBJQ09NX1ZNRVRIT0QxNyh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEpIFwKICAgIHB1YmxpYzogdmlydHVhbCB2b2lkIENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHAsdHEgcSkgPSAwOwojZGVmaW5lIElDT01fVk1FVEhPRDE4KHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubix0byxubyx0cCxucCx0cSxucSx0cixucikgXAogICAgcHVibGljOiB2aXJ0dWFsIHZvaWQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSx0biBuLHRvIG8sdHAgcCx0cSBxLHRyIHIpID0gMDsKI2RlZmluZSBJQ09NX1ZNRVRIT0QxOSh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMpIFwKICAgIHB1YmxpYzogdmlydHVhbCB2b2lkIENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHAsdHEgcSx0ciByLHRzIHMpID0gMDsKI2RlZmluZSBJQ09NX1ZNRVRIT0QyMCh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQpIFwKICAgIHB1YmxpYzogdmlydHVhbCB2b2lkIENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHAsdHEgcSx0ciByLHRzIHMsdHQgdCkgPSAwOwojZGVmaW5lIElDT01fVk1FVEhPRDIxKHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubix0byxubyx0cCxucCx0cSxucSx0cixucix0cyxucyx0dCxudCx0dSxudSkgXAogICAgcHVibGljOiB2aXJ0dWFsIHZvaWQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSx0biBuLHRvIG8sdHAgcCx0cSBxLHRyIHIsdHMgcyx0dCB0LHR1IHUpID0gMDsKI2RlZmluZSBJQ09NX1ZNRVRIT0QyMih4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQsdHUsbnUsdHYsbnYpIFwKICAgIHB1YmxpYzogdmlydHVhbCB2b2lkIENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHAsdHEgcSx0ciByLHRzIHMsdHQgdCx0dSB1LHR2IHYpID0gMDsKI2RlZmluZSBJQ09NX1ZNRVRIT0QyMyh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQsdHUsbnUsdHYsbnYsdHcsbncpIFwKICAgIHB1YmxpYzogdmlydHVhbCB2b2lkIENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHAsdHEgcSx0ciByLHRzIHMsdHQgdCx0dSB1LHR2IHYsdHcgdykgPSAwOwojZGVmaW5lIElDT01fVk1FVEhPRDI0KHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubix0byxubyx0cCxucCx0cSxucSx0cixucix0cyxucyx0dCxudCx0dSxudSx0dixudix0dyxudyx0eCxueCkgXAogICAgcHVibGljOiB2aXJ0dWFsIHZvaWQgQ0FMTEJBQ0sgKHhmbikodGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSx0biBuLHRvIG8sdHAgcCx0cSBxLHRyIHIsdHMgcyx0dCB0LHR1IHUsdHYgdix0dyB3LHR4IHgpID0gMDsKI2RlZmluZSBJQ09NX1ZNRVRIT0QyNSh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQsdHUsbnUsdHYsbnYsdHcsbncsdHgsbngsdHksbnkpIFwKICAgIHB1YmxpYzogdmlydHVhbCB2b2lkIENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHAsdHEgcSx0ciByLHRzIHMsdHQgdCx0dSB1LHR2IHYsdHcgdyx0eCB4LHR5IHkpID0gMDsKI2RlZmluZSBJQ09NX1ZNRVRIT0QyNih4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQsdHUsbnUsdHYsbnYsdHcsbncsdHgsbngsdHksbnksdHosbnopIFwKICAgIHB1YmxpYzogdmlydHVhbCB2b2lkIENBTExCQUNLICh4Zm4pKHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHAsdHEgcSx0ciByLHRzIHMsdHQgdCx0dSB1LHR2IHYsdHcgdyx0eCB4LHR5IHksdHogeikgPSAwOwoKCiNkZWZpbmUgSUNPTV9ERUZJTkUoaWZhY2UsaWJhc2UpIFwKICAgIHN0cnVjdCBpZmFjZTogcHVibGljIGliYXNlIHsgXAogICAgICAgIGlmYWNlIyNfTUVUSE9EUyBcCiAgICB9IElDT01fQ09NX0lOVEVSRkFDRV9BVFRSSUJVVEU7CiNkZWZpbmUgSUNPTV9ERUZJTkUxKGlmYWNlKSBcCiAgICBzdHJ1Y3QgaWZhY2UgeyBcCiAgICAgICAgaWZhY2UjI19NRVRIT0RTIFwKICAgIH0gSUNPTV9DT01fSU5URVJGQUNFX0FUVFJJQlVURTsKCiNkZWZpbmUgSUNPTV9WVEJMKGlmYWNlKSAgICAgICAgIChpZmFjZSkKCiNlbHNlCi8qIEMgaW50ZXJmYWNlICovCgojZGVmaW5lIElDT01fTUVUSE9EKHJldCx4Zm4pIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lKTsKI2RlZmluZSBJQ09NX01FVEhPRDEocmV0LHhmbix0YSxuYSkgXAogICAgcmV0IChDQUxMQkFDSyAqeGZuKShJQ09NX0lOVEVSRkFDRSogbWUsdGEgYSk7CiNkZWZpbmUgSUNPTV9NRVRIT0QyKHJldCx4Zm4sdGEsbmEsdGIsbmIpIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYik7CiNkZWZpbmUgSUNPTV9NRVRIT0QzKHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMpIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjKTsKI2RlZmluZSBJQ09NX01FVEhPRDQocmV0LHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCkgXAogICAgcmV0IChDQUxMQkFDSyAqeGZuKShJQ09NX0lOVEVSRkFDRSogbWUsdGEgYSx0YiBiLHRjIGMsdGQgZCk7CiNkZWZpbmUgSUNPTV9NRVRIT0Q1KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUpIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSk7CiNkZWZpbmUgSUNPTV9NRVRIT0Q2KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYpIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmKTsKI2RlZmluZSBJQ09NX01FVEhPRDcocmV0LHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZykgXAogICAgcmV0IChDQUxMQkFDSyAqeGZuKShJQ09NX0lOVEVSRkFDRSogbWUsdGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyk7CiNkZWZpbmUgSUNPTV9NRVRIT0Q4KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgpIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCk7CiNkZWZpbmUgSUNPTV9NRVRIT0Q5KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmkpIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpKTsKI2RlZmluZSBJQ09NX01FVEhPRDEwKHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmopIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGopOwojZGVmaW5lIElDT01fTUVUSE9EMTEocmV0LHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuaykgXAogICAgcmV0IChDQUxMQkFDSyAqeGZuKShJQ09NX0lOVEVSRkFDRSogbWUsdGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrKTsKI2RlZmluZSBJQ09NX01FVEhPRDEyKHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwpIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsKTsKI2RlZmluZSBJQ09NX01FVEhPRDEzKHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0pIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0pOwojZGVmaW5lIElDT01fTUVUSE9EMTQocmV0LHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubikgXAogICAgcmV0IChDQUxMQkFDSyAqeGZuKShJQ09NX0lOVEVSRkFDRSogbWUsdGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSx0biBuKTsKI2RlZmluZSBJQ09NX01FVEhPRDE1KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8pIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvKTsKI2RlZmluZSBJQ09NX01FVEhPRDE2KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnApIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHApOwojZGVmaW5lIElDT01fTUVUSE9EMTcocmV0LHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubix0byxubyx0cCxucCx0cSxucSkgXAogICAgcmV0IChDQUxMQkFDSyAqeGZuKShJQ09NX0lOVEVSRkFDRSogbWUsdGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSx0biBuLHRvIG8sdHAgcCx0cSBxKTsKI2RlZmluZSBJQ09NX01FVEhPRDE4KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIpIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHAsdHEgcSx0ciByKTsKI2RlZmluZSBJQ09NX01FVEhPRDE5KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMpIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHAsdHEgcSx0ciByLHRzIHMpOwojZGVmaW5lIElDT01fTUVUSE9EMjAocmV0LHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubix0byxubyx0cCxucCx0cSxucSx0cixucix0cyxucyx0dCxudCkgXAogICAgcmV0IChDQUxMQkFDSyAqeGZuKShJQ09NX0lOVEVSRkFDRSogbWUsdGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSx0biBuLHRvIG8sdHAgcCx0cSBxLHRyIHIsdHMgcyx0dCB0KTsKI2RlZmluZSBJQ09NX01FVEhPRDIxKHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQsdHUsbnUpIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHAsdHEgcSx0ciByLHRzIHMsdHQgdCx0dSB1KTsKI2RlZmluZSBJQ09NX01FVEhPRDIyKHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQsdHUsbnUsdHYsbnYpIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHAsdHEgcSx0ciByLHRzIHMsdHQgdCx0dSB1LHR2IHYpOwojZGVmaW5lIElDT01fTUVUSE9EMjMocmV0LHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubix0byxubyx0cCxucCx0cSxucSx0cixucix0cyxucyx0dCxudCx0dSxudSx0dixudix0dyxudykgXAogICAgcmV0IChDQUxMQkFDSyAqeGZuKShJQ09NX0lOVEVSRkFDRSogbWUsdGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSx0biBuLHRvIG8sdHAgcCx0cSBxLHRyIHIsdHMgcyx0dCB0LHR1IHUsdHYgdix0dyB3KTsKI2RlZmluZSBJQ09NX01FVEhPRDI0KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQsdHUsbnUsdHYsbnYsdHcsbncsdHgsbngpIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHAsdHEgcSx0ciByLHRzIHMsdHQgdCx0dSB1LHR2IHYsdHcgdyx0eCB4KTsKI2RlZmluZSBJQ09NX01FVEhPRDI1KHJldCx4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQsdHUsbnUsdHYsbnYsdHcsbncsdHgsbngsdHksbnkpIFwKICAgIHJldCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHAsdHEgcSx0ciByLHRzIHMsdHQgdCx0dSB1LHR2IHYsdHcgdyx0eCB4LHR5IHkpOwojZGVmaW5lIElDT01fTUVUSE9EMjYocmV0LHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubix0byxubyx0cCxucCx0cSxucSx0cixucix0cyxucyx0dCxudCx0dSxudSx0dixudix0dyxudyx0eCxueCx0eSxueSx0eixueikgXAogICAgcmV0IChDQUxMQkFDSyAqeGZuKShJQ09NX0lOVEVSRkFDRSogbWUsdGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoLHRpIGksdGogaix0ayBrLHRsIGwsdG0gbSx0biBuLHRvIG8sdHAgcCx0cSBxLHRyIHIsdHMgcyx0dCB0LHR1IHUsdHYgdix0dyB3LHR4IHgsdHkgeSx0eiB6KTsKCiNkZWZpbmUgSUNPTV9WTUVUSE9EKHhmbikgXAogICAgdm9pZCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lKTsKI2RlZmluZSBJQ09NX1ZNRVRIT0QxKHhmbix0YSxuYSkgXAogICAgdm9pZCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEpOwojZGVmaW5lIElDT01fVk1FVEhPRDIoeGZuLHRhLG5hLHRiLG5iKSBcCiAgICB2b2lkIChDQUxMQkFDSyAqeGZuKShJQ09NX0lOVEVSRkFDRSogbWUsdGEgYSx0YiBiKTsKI2RlZmluZSBJQ09NX1ZNRVRIT0QzKHhmbix0YSxuYSx0YixuYix0YyxuYykgXAogICAgdm9pZCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjKTsKI2RlZmluZSBJQ09NX1ZNRVRIT0Q0KHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCkgXAogICAgdm9pZCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQpOwojZGVmaW5lIElDT01fVk1FVEhPRDUoeGZuLHRhLG5hLHRiLG5iLHRjLG5jLHRkLG5kLHRlLG5lKSBcCiAgICB2b2lkIChDQUxMQkFDSyAqeGZuKShJQ09NX0lOVEVSRkFDRSogbWUsdGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlKTsKI2RlZmluZSBJQ09NX1ZNRVRIT0Q2KHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZikgXAogICAgdm9pZCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmKTsKI2RlZmluZSBJQ09NX1ZNRVRIT0Q3KHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZykgXAogICAgdm9pZCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcpOwojZGVmaW5lIElDT01fVk1FVEhPRDgoeGZuLHRhLG5hLHRiLG5iLHRjLG5jLHRkLG5kLHRlLG5lLHRmLG5mLHRnLG5nLG5oKSBcCiAgICB2b2lkIChDQUxMQkFDSyAqeGZuKShJQ09NX0lOVEVSRkFDRSogbWUsdGEgYSx0YiBiLHRjIGMsdGQgZCx0ZSBlLHRmIGYsdGcgZyx0aCBoKTsKI2RlZmluZSBJQ09NX1ZNRVRIT0Q5KHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCxuaSkgXAogICAgdm9pZCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpKTsKI2RlZmluZSBJQ09NX1ZNRVRIT0QxMCh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksbmopIFwKICAgIHZvaWQgKENBTExCQUNLICp4Zm4pKElDT01fSU5URVJGQUNFKiBtZSx0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqKTsKI2RlZmluZSBJQ09NX1ZNRVRIT0QxMSh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosbmspIFwKICAgIHZvaWQgKENBTExCQUNLICp4Zm4pKElDT01fSU5URVJGQUNFKiBtZSx0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqLHRrIGspOwojZGVmaW5lIElDT01fVk1FVEhPRDEyKHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCkgXAogICAgdm9pZCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsKTsKI2RlZmluZSBJQ09NX1ZNRVRIT0QxMyh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0pIFwKICAgIHZvaWQgKENBTExCQUNLICp4Zm4pKElDT01fSU5URVJGQUNFKiBtZSx0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqLHRrIGssdGwgbCx0bSBtKTsKI2RlZmluZSBJQ09NX1ZNRVRIT0QxNCh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4pIFwKICAgIHZvaWQgKENBTExCQUNLICp4Zm4pKElDT01fSU5URVJGQUNFKiBtZSx0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqLHRrIGssdGwgbCx0bSBtLHRuIG4pOwojZGVmaW5lIElDT01fVk1FVEhPRDE1KHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubix0byxubykgXAogICAgdm9pZCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvKTsKI2RlZmluZSBJQ09NX1ZNRVRIT0QxNih4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnApIFwKICAgIHZvaWQgKENBTExCQUNLICp4Zm4pKElDT01fSU5URVJGQUNFKiBtZSx0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqLHRrIGssdGwgbCx0bSBtLHRuIG4sdG8gbyx0cCBwKTsKI2RlZmluZSBJQ09NX1ZNRVRIT0QxNyh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEpIFwKICAgIHZvaWQgKENBTExCQUNLICp4Zm4pKElDT01fSU5URVJGQUNFKiBtZSx0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqLHRrIGssdGwgbCx0bSBtLHRuIG4sdG8gbyx0cCBwLHRxIHEpOwojZGVmaW5lIElDT01fVk1FVEhPRDE4KHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubix0byxubyx0cCxucCx0cSxucSx0cixucikgXAogICAgdm9pZCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHAsdHEgcSx0ciByKTsKI2RlZmluZSBJQ09NX1ZNRVRIT0QxOSh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMpIFwKICAgIHZvaWQgKENBTExCQUNLICp4Zm4pKElDT01fSU5URVJGQUNFKiBtZSx0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqLHRrIGssdGwgbCx0bSBtLHRuIG4sdG8gbyx0cCBwLHRxIHEsdHIgcix0cyBzKTsKI2RlZmluZSBJQ09NX1ZNRVRIT0QyMCh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQpIFwKICAgIHZvaWQgKENBTExCQUNLICp4Zm4pKElDT01fSU5URVJGQUNFKiBtZSx0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqLHRrIGssdGwgbCx0bSBtLHRuIG4sdG8gbyx0cCBwLHRxIHEsdHIgcix0cyBzLHR0IHQpOwojZGVmaW5lIElDT01fVk1FVEhPRDIxKHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubix0byxubyx0cCxucCx0cSxucSx0cixucix0cyxucyx0dCxudCx0dSxudSkgXAogICAgdm9pZCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHAsdHEgcSx0ciByLHRzIHMsdHQgdCx0dSB1KTsKI2RlZmluZSBJQ09NX1ZNRVRIT0QyMih4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQsdHUsbnUsdHYsbnYpIFwKICAgIHZvaWQgKENBTExCQUNLICp4Zm4pKElDT01fSU5URVJGQUNFKiBtZSx0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqLHRrIGssdGwgbCx0bSBtLHRuIG4sdG8gbyx0cCBwLHRxIHEsdHIgcix0cyBzLHR0IHQsdHUgdSx0diB2KTsKI2RlZmluZSBJQ09NX1ZNRVRIT0QyMyh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQsdHUsbnUsdHYsbnYsdHcsbncpIFwKICAgIHZvaWQgKENBTExCQUNLICp4Zm4pKElDT01fSU5URVJGQUNFKiBtZSx0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqLHRrIGssdGwgbCx0bSBtLHRuIG4sdG8gbyx0cCBwLHRxIHEsdHIgcix0cyBzLHR0IHQsdHUgdSx0diB2LHR3IHcpOwojZGVmaW5lIElDT01fVk1FVEhPRDI0KHhmbix0YSxuYSx0YixuYix0YyxuYyx0ZCxuZCx0ZSxuZSx0ZixuZix0ZyxuZyx0aCxuaCx0aSxuaSx0aixuaix0ayxuayx0bCxubCx0bSxubSx0bixubix0byxubyx0cCxucCx0cSxucSx0cixucix0cyxucyx0dCxudCx0dSxudSx0dixudix0dyxudyx0eCxueCkgXAogICAgdm9pZCAoQ0FMTEJBQ0sgKnhmbikoSUNPTV9JTlRFUkZBQ0UqIG1lLHRhIGEsdGIgYix0YyBjLHRkIGQsdGUgZSx0ZiBmLHRnIGcsdGggaCx0aSBpLHRqIGosdGsgayx0bCBsLHRtIG0sdG4gbix0byBvLHRwIHAsdHEgcSx0ciByLHRzIHMsdHQgdCx0dSB1LHR2IHYsdHcgdyx0eCB4KTsKI2RlZmluZSBJQ09NX1ZNRVRIT0QyNSh4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQsdHUsbnUsdHYsbnYsdHcsbncsdHgsbngsdHksbnkpIFwKICAgIHZvaWQgKENBTExCQUNLICp4Zm4pKElDT01fSU5URVJGQUNFKiBtZSx0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqLHRrIGssdGwgbCx0bSBtLHRuIG4sdG8gbyx0cCBwLHRxIHEsdHIgcix0cyBzLHR0IHQsdHUgdSx0diB2LHR3IHcsdHggeCx0eSB5KTsKI2RlZmluZSBJQ09NX1ZNRVRIT0QyNih4Zm4sdGEsbmEsdGIsbmIsdGMsbmMsdGQsbmQsdGUsbmUsdGYsbmYsdGcsbmcsdGgsbmgsdGksbmksdGosbmosdGssbmssdGwsbmwsdG0sbm0sdG4sbm4sdG8sbm8sdHAsbnAsdHEsbnEsdHIsbnIsdHMsbnMsdHQsbnQsdHUsbnUsdHYsbnYsdHcsbncsdHgsbngsdHksbnksdHosbnopIFwKICAgIHZvaWQgKENBTExCQUNLICp4Zm4pKElDT01fSU5URVJGQUNFKiBtZSx0YSBhLHRiIGIsdGMgYyx0ZCBkLHRlIGUsdGYgZix0ZyBnLHRoIGgsdGkgaSx0aiBqLHRrIGssdGwgbCx0bSBtLHRuIG4sdG8gbyx0cCBwLHRxIHEsdHIgcix0cyBzLHR0IHQsdHUgdSx0diB2LHR3IHcsdHggeCx0eSB5LHR6IHopOwoKCiNkZWZpbmUgSUNPTV9WVEFCTEUoaWZhY2UpICAgICAgIGlmYWNlIyNWdGJsCiNkZWZpbmUgSUNPTV9WRklFTEQoaWZhY2UpICAgICAgIElDT01fVlRBQkxFKGlmYWNlKSogbHBWdGJsCiNkZWZpbmUgSUNPTV9WVEJMKGlmYWNlKSAgICAgICAgIChpZmFjZSktPmxwVnRibAoKI2RlZmluZSBJQ09NX0RFRklORShpZmFjZSxpYmFzZSkgXAogICAgdHlwZWRlZiBzdHJ1Y3QgSUNPTV9WVEFCTEUoaWZhY2UpIElDT01fVlRBQkxFKGlmYWNlKTsgXAogICAgc3RydWN0IGlmYWNlIHsgXAogICAgICAgIGNvbnN0IElDT01fVkZJRUxEKGlmYWNlKTsgXAogICAgfTsgXAogICAgc3RydWN0IElDT01fVlRBQkxFKGlmYWNlKSB7IFwKICAgICAgICBJQ09NX01TVlRBQkxFX0NPTVBBVF9GSUVMRFMgXAogICAgICAgIGliYXNlIyNfSU1FVEhPRFMgXAogICAgICAgIGlmYWNlIyNfTUVUSE9EUyBcCiAgICB9OwojZGVmaW5lIElDT01fREVGSU5FMShpZmFjZSkgXAogICAgdHlwZWRlZiBzdHJ1Y3QgSUNPTV9WVEFCTEUoaWZhY2UpIElDT01fVlRBQkxFKGlmYWNlKTsgXAogICAgc3RydWN0IGlmYWNlIHsgXAogICAgICAgIGNvbnN0IElDT01fVkZJRUxEKGlmYWNlKTsgXAogICAgfTsgXAogICAgc3RydWN0IElDT01fVlRBQkxFKGlmYWNlKSB7IFwKICAgICAgICBJQ09NX01TVlRBQkxFX0NPTVBBVF9GSUVMRFMgXAogICAgICAgIGlmYWNlIyNfTUVUSE9EUyBcCiAgICB9OwoKI2RlZmluZSBJQ09NX1RISVMoaW1wbCxpZmFjZSkgICAgICAgICAgaW1wbCogY29uc3QgVGhpcz0oaW1wbCopKGlmYWNlKQojZGVmaW5lIElDT01fQ1RISVMoaW1wbCxpZmFjZSkgICAgICAgICBjb25zdCBpbXBsKiBjb25zdCBUaGlzPShjb25zdCBpbXBsKikoaWZhY2UpCgojZGVmaW5lIElDT01fVEhJU19NVUxUSShpbXBsLGZpZWxkLGlmYWNlKSAgaW1wbCogY29uc3QgVGhpcz0oaW1wbCopKChjaGFyKikoaWZhY2UpIC0gb2Zmc2V0b2YoaW1wbCxmaWVsZCkpCiNkZWZpbmUgSUNPTV9DVEhJU19NVUxUSShpbXBsLGZpZWxkLGlmYWNlKSBjb25zdCBpbXBsKiBjb25zdCBUaGlzPShjb25zdCBpbXBsKikoKGNoYXIqKShpZmFjZSkgLSBvZmZzZXRvZihpbXBsLGZpZWxkKSkKCiNlbmRpZiAvKklDT01fQ0lOVEVSRkFDRSAgKi8KCiNkZWZpbmUgSUNPTV9DQUxMKHhmbiwgcHRyKSAgICAgICAgICAgICAgICAgICAgICAgICBJQ09NX1ZUQkwocHRyKS0+eGZuKHB0cikKI2RlZmluZSBJQ09NX0NBTEwxKHhmbiwgcHRyLGEpICAgICAgICAgICAgICAgICAgICAgIElDT01fVlRCTChwdHIpLT54Zm4ocHRyLGEpCiNkZWZpbmUgSUNPTV9DQUxMMih4Zm4sIHB0cixhLGIpICAgICAgICAgICAgICAgICAgICBJQ09NX1ZUQkwocHRyKS0+eGZuKHB0cixhLGIpCiNkZWZpbmUgSUNPTV9DQUxMMyh4Zm4sIHB0cixhLGIsYykgICAgICAgICAgICAgICAgICBJQ09NX1ZUQkwocHRyKS0+eGZuKHB0cixhLGIsYykKI2RlZmluZSBJQ09NX0NBTEw0KHhmbiwgcHRyLGEsYixjLGQpICAgICAgICAgICAgICAgIElDT01fVlRCTChwdHIpLT54Zm4ocHRyLGEsYixjLGQpCiNkZWZpbmUgSUNPTV9DQUxMNSh4Zm4sIHB0cixhLGIsYyxkLGUpICAgICAgICAgICAgICBJQ09NX1ZUQkwocHRyKS0+eGZuKHB0cixhLGIsYyxkLGUpCiNkZWZpbmUgSUNPTV9DQUxMNih4Zm4sIHB0cixhLGIsYyxkLGUsZikgICAgICAgICAgICBJQ09NX1ZUQkwocHRyKS0+eGZuKHB0cixhLGIsYyxkLGUsZikKI2RlZmluZSBJQ09NX0NBTEw3KHhmbiwgcHRyLGEsYixjLGQsZSxmLGcpICAgICAgICAgIElDT01fVlRCTChwdHIpLT54Zm4ocHRyLGEsYixjLGQsZSxmLGcpCiNkZWZpbmUgSUNPTV9DQUxMOCh4Zm4sIHB0cixhLGIsYyxkLGUsZixnLGgpICAgICAgICBJQ09NX1ZUQkwocHRyKS0+eGZuKHB0cixhLGIsYyxkLGUsZixnLGgpCiNkZWZpbmUgSUNPTV9DQUxMOSh4Zm4sIHB0cixhLGIsYyxkLGUsZixnLGgsaSkgICAgICBJQ09NX1ZUQkwocHRyKS0+eGZuKHB0cixhLGIsYyxkLGUsZixnLGgsaSkKI2RlZmluZSBJQ09NX0NBTEwxMCh4Zm4sIHB0cixhLGIsYyxkLGUsZixnLGgsaSxqKSAgIElDT01fVlRCTChwdHIpLT54Zm4ocHRyLGEsYixjLGQsZSxmLGcsaCxpLGopCiNkZWZpbmUgSUNPTV9DQUxMMTEoeGZuLCBwdHIsYSxiLGMsZCxlLGYsZyxoLGksaixrKSBJQ09NX1ZUQkwocHRyKS0+eGZuKHB0cixhLGIsYyxkLGUsZixnLGgsaSxqLGspCiNkZWZpbmUgSUNPTV9DQUxMMTIoeGZuLCBwdHIsYSxiLGMsZCxlLGYsZyxoLGksaixrLGwpIElDT01fVlRCTChwdHIpLT54Zm4ocHRyLGEsYixjLGQsZSxmLGcsaCxpLGosayxsKQojZGVmaW5lIElDT01fQ0FMTDEzKHhmbiwgcHRyLGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0pIElDT01fVlRCTChwdHIpLT54Zm4ocHRyLGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0pCiNkZWZpbmUgSUNPTV9DQUxMMTQoeGZuLCBwdHIsYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuKSBJQ09NX1ZUQkwocHRyKS0+eGZuKHB0cixhLGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4pCiNkZWZpbmUgSUNPTV9DQUxMMTUoeGZuLCBwdHIsYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8pIElDT01fVlRCTChwdHIpLT54Zm4ocHRyLGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvKQojZGVmaW5lIElDT01fQ0FMTDE2KHhmbiwgcHRyLGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHApIElDT01fVlRCTChwdHIpLT54Zm4ocHRyLGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHApCiNkZWZpbmUgSUNPTV9DQUxMMTcoeGZuLCBwdHIsYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCxxKSBJQ09NX1ZUQkwocHRyKS0+eGZuKHB0cixhLGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEpCiNkZWZpbmUgSUNPTV9DQUxMMTgoeGZuLCBwdHIsYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCxxLHIpIElDT01fVlRCTChwdHIpLT54Zm4ocHRyLGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyKQojZGVmaW5lIElDT01fQ0FMTDE5KHhmbiwgcHRyLGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMpIElDT01fVlRCTChwdHIpLT54Zm4ocHRyLGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMpCiNkZWZpbmUgSUNPTV9DQUxMMjAoeGZuLCBwdHIsYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0KSBJQ09NX1ZUQkwocHRyKS0+eGZuKHB0cixhLGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQpCiNkZWZpbmUgSUNPTV9DQUxMMjEoeGZuLCBwdHIsYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHUpIElDT01fVlRCTChwdHIpLT54Zm4ocHRyLGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1KQojZGVmaW5lIElDT01fQ0FMTDIyKHhmbiwgcHRyLGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1LHYpIElDT01fVlRCTChwdHIpLT54Zm4ocHRyLGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1LHYpCiNkZWZpbmUgSUNPTV9DQUxMMjMoeGZuLCBwdHIsYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHUsdix3KSBJQ09NX1ZUQkwocHRyKS0+eGZuKHB0cixhLGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdSx2LHcpCiNkZWZpbmUgSUNPTV9DQUxMMjQoeGZuLCBwdHIsYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHUsdix3LHgpIElDT01fVlRCTChwdHIpLT54Zm4ocHRyLGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1LHYsdyx4KQojZGVmaW5lIElDT01fQ0FMTDI1KHhmbiwgcHRyLGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1LHYsdyx4LHkpIElDT01fVlRCTChwdHIpLT54Zm4ocHRyLGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1LHYsdyx4LHkpCiNkZWZpbmUgSUNPTV9DQUxMMjYoeGZuLCBwdHIsYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHUsdix3LHgseSx6KSBJQ09NX1ZUQkwocHRyKS0+eGZuKHB0cixhLGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdSx2LHcseCx5LHopCgoKI2lmbmRlZiBfX1dJTkVTUkNfXwovKiBUaGVzZSBtYWNyb3MgYXJlIG1zZGV2J3Mgd2F5IG9mIGRlZmluaW5nIENPTSBvYmplY3RzLgogKiBUaGV5IGFyZSBwcm92aWRlZCBoZXJlIGZvciB1c2UgYnkgV2luZWxpYiBkZXZlbG9wcGVycy4KICovCiNkZWZpbmUgRkFSU1RSVUNUCiNkZWZpbmUgSFVHRVAKCiNkZWZpbmUgV0lOT0xFQVBJICAgICAgICBTVERBUEkKI2RlZmluZSBXSU5PTEVBUElfKHR5cGUpIFNUREFQSV8odHlwZSkKCiNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAhZGVmaW5lZChDSU5URVJGQUNFKQojZGVmaW5lIGludGVyZmFjZSBzdHJ1Y3QKI2RlZmluZSBTVERNRVRIT0QobWV0aG9kKSAgICAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgbWV0aG9kCiNkZWZpbmUgU1RETUVUSE9EXyh0eXBlLG1ldGhvZCkgdmlydHVhbCB0eXBlIFNURE1FVEhPRENBTExUWVBFIG1ldGhvZAojZGVmaW5lIFBVUkUgICAgICAgICAgICAgICAgICAgID0gMAojZGVmaW5lIFRISVNfCiNkZWZpbmUgVEhJUyAgICAgICAgICAgICAgICAgICAgdm9pZAojZGVmaW5lIERFQ0xBUkVfSU5URVJGQUNFKGlmYWNlKSAgICBpbnRlcmZhY2UgaWZhY2UKI2RlZmluZSBERUNMQVJFX0lOVEVSRkFDRV8oaWZhY2UsIGJhc2VpZmFjZSkgICAgaW50ZXJmYWNlIGlmYWNlIDogcHVibGljIGJhc2VpZmFjZQoKI2RlZmluZSBCRUdJTl9JTlRFUkZBQ0UKI2RlZmluZSBFTkRfSU5URVJGQUNFCgojZWxzZQoKI2RlZmluZSBpbnRlcmZhY2UgICAgICAgICAgICAgICBzdHJ1Y3QKI2RlZmluZSBTVERNRVRIT0QobWV0aG9kKSAgICAgICBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFICgqbWV0aG9kKQojZGVmaW5lIFNURE1FVEhPRF8odHlwZSxtZXRob2QpIHR5cGUgU1RETUVUSE9EQ0FMTFRZUEUgKCptZXRob2QpCiNkZWZpbmUgUFVSRQojZGVmaW5lIFRISVNfICAgICAgICAgICAgICAgICAgIElOVEVSRkFDRSBGQVIqIFRoaXMsCiNkZWZpbmUgVEhJUyAgICAgICAgICAgICAgICAgICAgSU5URVJGQUNFIEZBUiogVGhpcwoKI2lmZGVmIENPTlNUX1ZUQUJMRQojdW5kZWYgQ09OU1RfVlRCTAojZGVmaW5lIENPTlNUX1ZUQkwgY29uc3QKI2RlZmluZSBERUNMQVJFX0lOVEVSRkFDRShpZmFjZSkgXAogICAgICAgICB0eXBlZGVmIGludGVyZmFjZSBpZmFjZSB7IGNvbnN0IHN0cnVjdCBpZmFjZSMjVnRibCBGQVIqIGxwVnRibDsgfSBpZmFjZTsgXAogICAgICAgICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBpZmFjZSMjVnRibCBpZmFjZSMjVnRibDsgXAogICAgICAgICBjb25zdCBzdHJ1Y3QgaWZhY2UjI1Z0YmwKI2Vsc2UKI3VuZGVmIENPTlNUX1ZUQkwKI2RlZmluZSBDT05TVF9WVEJMCiNkZWZpbmUgREVDTEFSRV9JTlRFUkZBQ0UoaWZhY2UpIFwKICAgICAgICAgdHlwZWRlZiBpbnRlcmZhY2UgaWZhY2UgeyBzdHJ1Y3QgaWZhY2UjI1Z0YmwgRkFSKiBscFZ0Ymw7IH0gaWZhY2U7IFwKICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgaWZhY2UjI1Z0YmwgaWZhY2UjI1Z0Ymw7IFwKICAgICAgICAgc3RydWN0IGlmYWNlIyNWdGJsCiNlbmRpZgojZGVmaW5lIERFQ0xBUkVfSU5URVJGQUNFXyhpZmFjZSwgYmFzZWlmYWNlKSAgICBERUNMQVJFX0lOVEVSRkFDRShpZmFjZSkKCiNkZWZpbmUgQkVHSU5fSU5URVJGQUNFCiNkZWZpbmUgRU5EX0lOVEVSRkFDRQoKI2VuZGlmIC8qIF9fY3BsdXNwbHVzICYmICFDSU5URVJGQUNFICovCgojZW5kaWYgLyogX19XSU5FU1JDX18gKi8KCiNlbmRpZiAvKiBfT0JKQkFTRV9IXyAqLwo=